link.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <!-- 发起邀请 -->
  2. <template>
  3. <div style="font-size: 14px;">
  4. <div class="mt-5 color-777">将下面的公共邀请链接通过微信、QQ等任何方式发给同事,即可点击加入公司。请注意,用户同意后将自动加入到团队中,您需确保添加到的同事为同一公司招聘人员</div>
  5. <div class="mt-5 d-flex align-center">
  6. <div class="mr-5 shareUrlTxtBox">
  7. <span v-if="code">{{ shareUrlTxt }}</span>
  8. <span v-else class="color-666">点击刷新生成邀请链接</span>
  9. </div>
  10. <v-btn color="primary" class="mr-3" @click="copy()">{{ $t('common.copy') }}</v-btn>
  11. <v-btn color="green" variant="outlined" @click="refresh()">{{ $t('common.refresh') }}</v-btn>
  12. </div>
  13. <div class="mt-5 color-777">链接{{ day }}天内有效</div>
  14. </div>
  15. </template>
  16. <script setup>
  17. import Snackbar from '@/plugins/snackbar'
  18. import {
  19. enterpriseInviteGenerateCode,
  20. enterpriseInviteGetCode,
  21. enterpriseInviteRefresh,
  22. } from '@/api/recruit/enterprise/enterpriseInvite.js'
  23. import { computed, ref } from 'vue'
  24. defineOptions({name: 'groupAccount-component-invite'})
  25. const props = defineProps({
  26. inviteType: {
  27. type: [Number, String],
  28. default: 0 // 类型 (0 邀请同事 | 1 邀请子公司),示例值(2)
  29. }
  30. })
  31. const inviteType = props.inviteType - 0
  32. const day = 30
  33. const code = ref('')
  34. const accessUrl = import.meta.env.VITE_ACCESS_BASE_URL
  35. const shareUrlTxt = computed(() => {
  36. const url = inviteType ? 'enterpriseInvite' : 'invite'
  37. return accessUrl + `/${url}?code=${code.value}`
  38. })
  39. // 基本逻辑:是否已有邀请码?->
  40. // 有:直接调用获取邀请码
  41. // 没有:有生成邀请码标识->获取邀请码
  42. // 刷新: 先调用刷新邀请码接口再执行上面逻辑
  43. // 获取邀请码
  44. const getCode = async (type) => {
  45. try {
  46. const data = await enterpriseInviteGetCode({ type: props.inviteType })
  47. if (!data) getGenerateCode()
  48. code.value = data
  49. if (type === 'refresh') Snackbar.success('刷新成功')
  50. } catch (err) {
  51. console.err(err)
  52. }
  53. }
  54. getCode()
  55. // 生成邀请码标识
  56. const getGenerateCode = async (type) => {
  57. try {
  58. const data = await enterpriseInviteGenerateCode({ type: props.inviteType, expireDay: 30 })
  59. if (!data) Snackbar.error('生成邀请码标识失败')
  60. getCode(type)
  61. } catch (err) {
  62. console.err(err)
  63. }
  64. }
  65. // 刷新邀请码
  66. const refresh = async () => {
  67. try {
  68. await enterpriseInviteRefresh(code.value)
  69. getCode('refresh')
  70. } catch (err) {
  71. console.err(err)
  72. }
  73. }
  74. const copy = async () => {
  75. try {
  76. await navigator.clipboard.writeText(shareUrlTxt.value)
  77. Snackbar.success('复制成功')
  78. } catch (err) {
  79. Snackbar.error('复制失败,请手动复制。')
  80. }
  81. }
  82. </script>
  83. <style lang="scss" scoped>
  84. .shareUrlTxtBox {
  85. line-height: 30px;
  86. background-color: #f0f0f0;
  87. // border-radius: 5px;
  88. padding: 6px 16px;
  89. min-width: 600px;
  90. }
  91. </style>