CzRger 1 місяць тому
батько
коміт
9cbb24bb23

+ 1 - 1
src/api/interceptors.ts

@@ -31,7 +31,7 @@ export class Interceptors {
             (import.meta as any).env.VITE_TOKEN,
           )
           if (token) {
-            config.headers.Authorization = 'Bearer ' + token
+            config.headers.Authorization = token
           } else {
             // @ts-ignore
             delete config.headers.Authorization

+ 0 - 3
src/api/modules/center/user.ts

@@ -10,6 +10,3 @@ export const userEdit = (params) => put(`/user`, params, {})
 export const userDetail = (id) => get(`/user/${id}`, {}, {})
 // 用户管理-删除
 export const userDel = (id) => del(`/user/${id}`, {}, {})
-// 用户管理-生成邀请链接
-export const accountGenerateFriendlyCode = (params) =>
-  get(`/account/generateFriendlyCode`, params, {})

+ 11 - 0
src/api/modules/global/invite.ts

@@ -0,0 +1,11 @@
+import { get, post } from '@/api/request'
+
+// 用户管理-生成邀请链接
+export const accountGenerateFriendlyCode = (params) =>
+  get(`/account/generateFriendlyCode`, params, {})
+// 获取邀请信息
+export const accountOpenLink = (inviteCode) =>
+  get(`/account/openLink/${inviteCode}`, {}, {})
+// 接受邀请
+export const accountLinkAccess = (params) =>
+  get(`/account/linkAccess`, params, {})

+ 15 - 0
src/api/modules/workflow/meta.ts

@@ -0,0 +1,15 @@
+import { get, post, put, del } from '@/api/request'
+
+// 用户管理-分页
+export const userPage = (params) => get(`/user`, params, {})
+// 用户管理-新增
+export const userAdd = (params) => post(`/user`, params, {})
+// 用户管理-编辑
+export const userEdit = (params) => put(`/user`, params, {})
+// 用户管理-详情
+export const userDetail = (id) => get(`/user/${id}`, {}, {})
+// 用户管理-删除
+export const userDel = (id) => del(`/user/${id}`, {}, {})
+// 用户管理-生成邀请链接
+export const accountGenerateFriendlyCode = (params) =>
+  get(`/account/generateFriendlyCode`, params, {})

+ 20 - 0
src/api/request.ts

@@ -84,6 +84,26 @@ export const put = (
       })
   })
 }
+export const patch = (
+  url = '',
+  params: any = {},
+  config: any = {},
+  proxy = '',
+) => {
+  return new Promise((resolve, reject) => {
+    const rUrl = (proxy || (import.meta as any).env.VITE_BASE_API_PROXY) + url
+    request
+      .patch(rUrl, params, {
+        ...config,
+      })
+      .then((res: any) => {
+        resolve(res)
+      })
+      .catch((res: any) => {
+        reject(res)
+      })
+  })
+}
 export const upload = (
   url = '',
   params: any = {},

+ 40 - 7
src/views/global/invite/index.vue

@@ -10,8 +10,12 @@
       class="absolute top-0 right-0 flex h-full w-[42.5rem] items-center justify-center bg-[var(--czr-dialog-bg)]"
     >
       <div class="flex w-[26.5rem] flex-col">
-        <div class="text-[1.88rem] font-bold text-[#373D4C]">xxx邀请您加入</div>
-        <div class="mt-4 text-[1.88rem] font-bold text-[#3363DE]">xxx组织</div>
+        <div class="text-[1.88rem] font-bold text-[#373D4C]">
+          {{ state.detail.userName }}邀请您加入
+        </div>
+        <div class="mt-4 text-[1.88rem] font-bold text-[#3363DE]">
+          {{ state.detail.tenantName }}组织
+        </div>
         <div
           class="__hover mt-2 mt-12 flex h-[2.5rem] w-full items-center justify-center bg-[#3363DE] text-sm text-[#ffffff]"
           @click="onSubmit"
@@ -20,7 +24,9 @@
           加入组织
         </div>
         <div class="mt-3 text-sm text-[#576275]">
-          链接将在 <span class="text-[#3363DE]">2025-07-31 12:22:33</span> 失效
+          链接将在
+          <span class="text-[#3363DE]">{{ state.detail.validateTime }}</span>
+          失效
         </div>
       </div>
     </div>
@@ -31,25 +37,52 @@
 import { computed, getCurrentInstance, reactive, ref, onMounted } from 'vue'
 import { User, Lock, Clock } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
-import { useRouter } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 import { useAppStore } from '@/stores'
+import { accountLinkAccess, accountOpenLink } from '@/api/modules/global/invite'
 
 const AppStore = useAppStore()
 const router = useRouter()
+const route = useRoute()
 const emit = defineEmits([])
 const props = defineProps({})
 const { proxy }: any = getCurrentInstance()
 const state: any = reactive({
+  inviteCode: route.query.inviteCode,
   loading: false,
+  detail: {},
 })
 const onSubmit = () => {
   if (!state.loading) {
     state.loading = true
-    ElMessage.success('加入组织成功!')
-    router.replace({ name: 'root' })
+    accountLinkAccess({
+      tenantId: state.detail.tenantId,
+      userId: AppStore.userInfo?.id,
+    })
+      .then(({ data }: any) => {
+        ElMessage.success('加入组织成功!')
+        router.replace({ name: 'root' })
+      })
+      .catch(() => {})
+      .finally(() => {})
+  }
+}
+const errorMsg = () => {}
+onMounted(() => {
+  initDetail()
+})
+const initDetail = () => {
+  if (state.inviteCode) {
+    accountOpenLink(state.inviteCode)
+      .then(({ data }: any) => {
+        state.detail = data
+      })
+      .catch(() => {})
+      .finally(() => {})
+  } else {
+    errorMsg()
   }
 }
-onMounted(() => {})
 </script>
 
 <style lang="scss" scoped></style>

+ 8 - 2
src/views/global/login/index.vue

@@ -34,6 +34,7 @@
               width="100%"
               v-model:param="state.form.password"
               type="password"
+              show-password
               placeholder="请输入您的密码"
               default-error-msg="请输入您的密码"
               :prefix-icon="Lock"
@@ -79,11 +80,12 @@ import { computed, getCurrentInstance, reactive, ref, onMounted } from 'vue'
 import { User, Lock, Clock } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
 import { loginSubmit } from '@/api/modules/global/login'
-import { useRouter } from 'vue-router'
+import { useRouter, useRoute } from 'vue-router'
 import { useAppStore } from '@/stores'
 
 const AppStore = useAppStore()
 const router = useRouter()
+const route = useRoute()
 const emit = defineEmits([])
 const props = defineProps({})
 const { proxy }: any = getCurrentInstance()
@@ -108,7 +110,11 @@ const onLogin = () => {
           .then(({ data }: any) => {
             ElMessage.success('登录成功!')
             localStorage.setItem((import.meta as any).env.VITE_TOKEN, data)
-            router.replace({ name: 'root' })
+            if (route.query.inviteCode) {
+              router.replace({ name: 'invite', query: route.query })
+            } else {
+              router.replace({ name: 'root' })
+            }
             state.loading = false
           })
           .catch(() => {})

+ 1 - 1
src/views/manage/center/tenant/index.vue

@@ -113,7 +113,7 @@ const state: any = reactive({
       { value: 'code', label: '租户编号', show: true },
       { value: 'userQuota', label: '用户配额', show: true },
       { value: 'enabled', label: '租户状态', show: true },
-      { value: 'name', label: '用户数量', show: true, sort: true },
+      { value: 'userCounts', label: '用户数量', show: true, sort: true },
       {
         value: 'createTime',
         label: '租户启用时间',

+ 2 - 17
src/views/manage/center/user/detail.vue

@@ -47,7 +47,7 @@
               <el-tooltip placement="top" content="重新设置密码">
                 <Edit
                   class="w-4 cursor-pointer"
-                  @click="(state.form.pass, (state.editPassword = true))"
+                  @click="((state.form.pass = ''), (state.editPassword = true))"
                 />
               </el-tooltip>
             </template>
@@ -107,13 +107,7 @@ import {
 } from '@/stores'
 import { useRouter } from 'vue-router'
 import { Edit } from '@element-plus/icons-vue'
-import { copy } from '@/utils/czr-util'
-import {
-  accountGenerateFriendlyCode,
-  userAdd,
-  userDetail,
-  userEdit,
-} from '@/api/modules/center/user'
+import { userAdd, userDetail, userEdit } from '@/api/modules/center/user'
 
 const router = useRouter()
 const AppStore = useAppStore()
@@ -224,15 +218,6 @@ const onSubmit = () => {
       })
     })
 }
-const onInvite = () => {
-  // accountGenerateFriendlyCode()
-  state.invite.url = 'https://cn.element-plus.org/zh-CN/component/input.html'
-  state.invite.show = true
-}
-const onCopy = (str) => {
-  copy(str)
-  ElMessage.success('复制成功!')
-}
 </script>
 
 <style lang="scss" scoped></style>

+ 21 - 4
src/views/manage/center/user/index.vue

@@ -104,7 +104,7 @@
     :show="state.invite.show"
     title="新增用户"
     @onClose="state.invite.show = false"
-    width="40rem"
+    width="62.5rem"
     :show-submit="false"
     :show-close="false"
   >
@@ -156,10 +156,13 @@ import { ElMessage } from 'element-plus'
 import detailCom from './detail.vue'
 import { userDel, userPage } from '@/api/modules/center/user'
 import { copy } from '@/utils/czr-util'
+import { useRouter } from 'vue-router'
+import { accountGenerateFriendlyCode } from '@/api/modules/global/invite'
 
 const AppStore = useAppStore()
 const DialogStore = useDialogStore()
 const DictionaryStore = useDictionaryStore()
+const router = useRouter()
 const emit = defineEmits([])
 const props = defineProps({})
 const { proxy }: any = getCurrentInstance()
@@ -330,9 +333,23 @@ const onDel = (row: any) => {
 }
 
 const onInvite = () => {
-  state.invite.url = 'https://cn.element-plus.org/zh-CN/component/input.html'
-  state.invite.roles = []
-  state.invite.show = true
+  accountGenerateFriendlyCode({
+    userId: AppStore.userInfo?.id,
+    tenantId: AppStore.tenantInfo?.id,
+  })
+    .then(({ data }: any) => {
+      const routerUrl = router.resolve({
+        name: 'invite',
+        query: {
+          inviteCode: data,
+        },
+      })
+      state.invite.url = location.origin + routerUrl.href
+      state.invite.roles = []
+      state.invite.show = true
+    })
+    .catch(() => {})
+    .finally(() => {})
 }
 const onCopy = (str) => {
   copy(str)

+ 0 - 1
src/views/manage/knowledge/documents/index.vue

@@ -85,7 +85,6 @@ const state: any = reactive({
 })
 provide('ID', state.ID)
 const initDetail = () => {
-  console.log(123)
   if (state.ID) {
     const m = route.query.menu
     if (m && menus.some((v) => v.value === m)) {