Sfoglia il codice sorgente

Merge branch 'master' of https://e.coding.net/jiaolongcloud/link/things-ui

lvkun996 2 anni fa
parent
commit
39689a399f

+ 1 - 3
src/layout/navbar.vue

@@ -77,9 +77,7 @@ const headerBgColor = computed(() => designStore.theme ? '#141414' : '#fff')
 
 const isMobile = useDeviceType()
 
-const changeTheme = () => {
-  designStore.changeModeltheme()
-}
+const changeTheme = () => designStore.changeModeltheme()
 
 const changeRouter = (route: ROUTER.RoutesProps) => {
   if (route.link) {

+ 4 - 1
src/layout/user.vue

@@ -4,7 +4,7 @@
         <a-badge :count="0">
           <a-space>
             <a-avatar shape="round" :src="ava"  style="cursor: pointer;" />
-            <div class="user-name" >蛟龙云</div>
+            <div class="user-name" >{{userStore.userInfo.label || '蛟龙云'}}</div>
           </a-space>
         </a-badge>
     <template #overlay>
@@ -23,11 +23,14 @@
 
 <script lang="ts" setup >
 import { useUserStore } from '@/store'
+import { storeToRefs } from 'pinia'
 
 const ava = require('@/assets/logo/logo-blue.png')
 
 const userStore = useUserStore()
 
+console.log('userStore.userInfo:', userStore)
+
 </script>
 
 <style lang="less" scoped >

+ 9 - 5
src/pages/user/manage/index.vue

@@ -44,7 +44,7 @@
     <a-form-item name="account" label="用户账号" v-bind="validateInfos.account" v-if="state.opraState === 'add'">
       <a-input allowClear v-model:value="modelRef.account"  />
     </a-form-item>
-    <a-form-item name="sourcePassword" label="原始密码" v-bind="validateInfos.password" v-if="state.opraState === 'update'">
+    <a-form-item name="sourcePassword" label="原始密码" required v-if="state.opraState === 'update'">
       <a-input-password  v-model:value="modelRef.sourcePassword"  />
     </a-form-item>
     <a-form-item name="password" :label="state.opraState === 'add' ? '用户密码' : '新密码'" v-bind="validateInfos.password">
@@ -61,6 +61,7 @@
 import { computed, nextTick, onMounted, reactive } from 'vue'
 import { UserController } from '@/controller'
 import { Form, useCacheToken } from 'ant-design-vue'
+import { useUserStore } from '@/store'
 
 const columns = [
   {
@@ -95,6 +96,7 @@ const columns = [
 const modalTitle = computed(() => state.opraState === 'add' ? '新增用户' : '修改密码')
 
 const useForm = Form.useForm
+const userStore = useUserStore()
 
 const queryState = reactive({
   page: 1,
@@ -139,21 +141,23 @@ const openModal = (key: 'add' | 'update', record: Partial<USER.User.Detail> = {}
 const { resetFields, validate, validateInfos } = useForm(modelRef, reactive({
   account: [{ required: true, message: '请填写用户账户' }],
   email: [{ required: true, message: '请填写用邮箱', name: 'email' }],
-  password: [{ required: true, message: '请填写用户密码', name: 'password' }],
-  sourcePassword: [{ required: true, message: '请填写原始密码' }]
+  password: [{ required: true, message: '请填写用户密码', name: 'password' }]
 }))
 
 const submit = async () => {
   if (state.opraState === 'add') {
     validate().then(async () => {
-      await UserController.add(modelRef)
+      await UserController.add({
+        ...modelRef,
+        password: userStore.encryptPassWord(modelRef.password)
+      })
       closeModal()
       getUserList()
       resetFields()
     })
   } else {
     if (modelRef.id && modelRef.password && modelRef.sourcePassword) {
-      await UserController.updatePassword({ id: modelRef.id, sourcePassword: modelRef.sourcePassword, newPassword: modelRef.password })
+      await UserController.updatePassword({ id: modelRef.id, sourcePassword: userStore.encryptPassWord(modelRef.sourcePassword), newPassword: userStore.encryptPassWord(modelRef.password) })
       closeModal()
       getUserList()
       resetFields()

+ 11 - 1
src/router/before.ts

@@ -1,8 +1,18 @@
 import router from './index'
-import { setBaseUrl } from '@/service/request'
 import { usePort } from '@/hooks/index'
+import { useUserStore } from '@/store'
+import { message } from 'ant-design-vue'
+import { useRouter } from 'vue-router'
 
 router.beforeEach((to, from, next) => {
+  // if (to.path === '/login') {
+  //   next()
+  // } else if (useUserStore().userInfo.token) {
+  //   next()
+  // } else {
+  //   message.error('登录失效,请重新登录')
+  //   router.replace({ path: '/login', query: { redirectUrl: to.fullPath } })
+  // }
   usePort(to.meta.title as string)
   next()
 })

+ 2 - 2
src/router/index.ts

@@ -300,13 +300,13 @@ const user = {
     {
       path: '/manage',
       name: '用户管理',
-      icon: 'PlayCircleOutlined',
+      icon: 'TeamOutlined',
       component: () => import('@/pages/user/manage/index.vue')
     },
     {
       path: '/resource',
       name: '资源管理',
-      icon: 'PlayCircleOutlined',
+      icon: 'FolderOpenOutlined',
       component: () => import('@/pages/user/resource/index.vue')
     }
   ]

+ 3 - 8
src/service/request.ts

@@ -2,6 +2,7 @@ import { message } from 'ant-design-vue'
 import axios, { AxiosInstance, AxiosResponse } from 'axios'
 import defaultSetting from '../../config/defaultSetting'
 import { useModule } from '@/hooks'
+import { useUserStore } from '@/store'
 
 const instance = axios.create({
   baseURL: '',
@@ -17,10 +18,8 @@ const catchErr = (response: AxiosResponse) => {
   const { data } = response
   if (data.code === 500) {
     message.error(data.msg)
-    throw new Error(data.msg)
   } else if (data.code === 400) {
     message.error(data.msg)
-    throw new Error(data.msg)
   }
 }
 
@@ -32,7 +31,7 @@ const redirectUrl = () => {
 }
 
 instance.interceptors.request.use(config => {
-  config.headers.Authentication = JSON.parse(window.localStorage.getItem('userInfo') as string).token
+  config.headers.Authentication = useUserStore().userInfo.token
   return config
 }, function (error) {
   return Promise.reject(error)
@@ -47,11 +46,7 @@ instance.interceptors.response.use(function (response) {
   return response.data
 }, error => Promise.reject(error))
 
-export const setBaseUrl = (baseURL: string) => {
-  console.log('baseURL:', baseURL)
-
-  instance.defaults.baseURL = baseURL
-}
+export const setBaseUrl = (baseURL: string) => instance.defaults.baseURL = baseURL
 
 export default function request <T> (config: any) {
   return instance.request<AxiosInstance, SERVICE.Response<T>>(config)

+ 25 - 13
src/store/modules/user/index.ts

@@ -1,22 +1,34 @@
 import { Modal, message } from 'ant-design-vue'
 import { defineStore } from 'pinia'
-import { reactive, h } from 'vue'
+import { reactive, h, onMounted, computed, toRefs } from 'vue'
 import { useSchedulerOnce } from 'flicker-vue-hooks'
 import { UserController } from '@/controller'
 import { useRouter, useRoute } from 'vue-router'
+import { routes } from '@/router'
+
+const initState: USER.Tenant.Detail = {
+  id: '',
+  tenantId: '',
+  token: '',
+  email: '',
+  account: '',
+  label: '蛟龙云'
+}
 
 export const useUserStore = defineStore('userStore', () => {
   const router = useRouter()
   const route = useRoute()
 
-  const userInfo = reactive({})
+  let userInfo = reactive<USER.Tenant.Detail>(JSON.parse(window.localStorage.getItem('userInfo') as string) || initState)
 
   const clearUserInfo = () => {
     return new Promise((resolve) => {
       // 做些什么
-      message.loading('清除用户信息中......')
+      message.loading('清除用户信息中......', 0.5)
       window.localStorage.removeItem('userInfo')
-      useSchedulerOnce(() => resolve(true), 500)
+      setTimeout(() => {
+        resolve(true)
+      }, 500)
     })
   }
 
@@ -28,26 +40,26 @@ export const useUserStore = defineStore('userStore', () => {
     })
     if (code === 200) {
       window.localStorage.setItem('userInfo', JSON.stringify(tenant))
-      message.success('登录成功, 正在为您跳转页面...')
+      const userInfoLocal = JSON.parse(window.localStorage.getItem('userInfo') as string)
+      userInfo = reactive(userInfoLocal) || initState
+      message.success('登录成功')
+
       if (route.query.redirectUrl) {
         router.push({ path: route.query.redirectUrl as string })
       } else {
-        router.push({ path: router.getRoutes()[0].path })
+        router.push({ path: routes[0].path })
       }
     }
   }
 
   const openUserInfoModal = () => {
-    Modal.confirm({
-      title: '您确定要退出吗?',
-      content: h('a-form', null, [h('a-form-item', { label: '任务名称' }, [h('a-input', null, 2233)])]),
+    Modal.success({
+      title: userInfo.label + '的信息',
+      content: '需要想到优雅的方式来打开个人信息弹窗',
       cancelText: '取消',
       okText: '确定',
       onCancel: () => {},
-      onOk: async () => {
-        await clearUserInfo()
-        // 退出
-      }
+      onOk: () => {}
     })
   }
 

+ 1 - 1
src/store/router.ts

@@ -26,7 +26,7 @@ export const useAppRouter = defineStore(ConstantStore.ROUTER, () => {
         link: !!route.link,
         redirect: route.redirect || ''
       }
-    })
+    }).filter(_ => _.path !== '/login')
 
     appRouter.sider.route = RootRouter.options.routes[1].children!
   }

+ 6 - 6
src/type/user.d.ts

@@ -16,12 +16,12 @@ declare namespace USER {
 
   namespace Tenant {
     interface Detail {
-      'id':'' // 用户id
-      'account':'' // 用户账号
-      'email':'' // 用户邮箱
-      'label':'' // 用户名称
-      'tenantId':'' // 租户id
-      'token':'' // 用户token
+      'id': string // 用户id
+      'account': string // 用户账号
+      'email': string // 用户邮箱
+      'label': string // 用户名称
+      'tenantId': string // 租户id
+      'token': string // 用户token
     }
   }