Browse Source

新增用户和租户行禁用功能
升级依赖包
新增状态管理getToken方法
优化所有获取token的地方通过状态管理的getToken方法获取

zhontai 2 years ago
parent
commit
86e2e9a6d2

+ 1 - 1
gen/gen-api.js

@@ -17,7 +17,7 @@ apis?.forEach((api, index) => {
       url: api.url,
       httpClientType: 'axios',
       modular: true,
-      cleanOutput: true,
+      cleanOutput: false,
       moduleNameIndex: 2, // 0 api, 1 api htt-client data-contracts, 2 apis htt-client data-contracts
       moduleNameFirstTag: true, //apis htt-client data-contracts
       unwrapResponseData: true,

+ 51 - 51
package-lock.json

@@ -24,10 +24,10 @@
         "jsplumb": "^2.15.6",
         "mitt": "^3.0.0",
         "nprogress": "^0.2.0",
-        "pinia": "^2.0.32",
+        "pinia": "^2.0.33",
         "print-js": "^1.6.0",
         "qrcodejs2-fixes": "^0.0.2",
-        "qs": "^6.11.0",
+        "qs": "^6.11.1",
         "screenfull": "^6.0.2",
         "sortablejs": "^1.15.0",
         "splitpanes": "^3.1.5",
@@ -38,11 +38,11 @@
         "vue-router": "^4.1.6"
       },
       "devDependencies": {
-        "@types/node": "^18.14.6",
+        "@types/node": "^18.15.0",
         "@types/nprogress": "^0.2.0",
         "@types/sortablejs": "^1.15.0",
-        "@typescript-eslint/eslint-plugin": "^5.54.0",
-        "@typescript-eslint/parser": "^5.54.0",
+        "@typescript-eslint/eslint-plugin": "^5.54.1",
+        "@typescript-eslint/parser": "^5.54.1",
         "@vitejs/plugin-vue": "^4.0.0",
         "@vue/compiler-sfc": "^3.2.47",
         "dotenv": "16.0.3",
@@ -919,9 +919,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "18.14.6",
-      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.14.6.tgz",
-      "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==",
+      "version": "18.15.0",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.15.0.tgz",
+      "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==",
       "dev": true
     },
     "node_modules/@types/nprogress": {
@@ -960,14 +960,14 @@
       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz",
-      "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz",
+      "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.54.0",
-        "@typescript-eslint/type-utils": "5.54.0",
-        "@typescript-eslint/utils": "5.54.0",
+        "@typescript-eslint/scope-manager": "5.54.1",
+        "@typescript-eslint/type-utils": "5.54.1",
+        "@typescript-eslint/utils": "5.54.1",
         "debug": "^4.3.4",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
@@ -990,14 +990,14 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.54.0.tgz",
-      "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.54.1.tgz",
+      "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "5.54.0",
-        "@typescript-eslint/types": "5.54.0",
-        "@typescript-eslint/typescript-estree": "5.54.0",
+        "@typescript-eslint/scope-manager": "5.54.1",
+        "@typescript-eslint/types": "5.54.1",
+        "@typescript-eslint/typescript-estree": "5.54.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1013,26 +1013,26 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
-      "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz",
+      "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.54.0",
-        "@typescript-eslint/visitor-keys": "5.54.0"
+        "@typescript-eslint/types": "5.54.1",
+        "@typescript-eslint/visitor-keys": "5.54.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz",
-      "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz",
+      "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "5.54.0",
-        "@typescript-eslint/utils": "5.54.0",
+        "@typescript-eslint/typescript-estree": "5.54.1",
+        "@typescript-eslint/utils": "5.54.1",
         "debug": "^4.3.4",
         "tsutils": "^3.21.0"
       },
@@ -1049,22 +1049,22 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.54.0.tgz",
-      "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.54.1.tgz",
+      "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
-      "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz",
+      "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.54.0",
-        "@typescript-eslint/visitor-keys": "5.54.0",
+        "@typescript-eslint/types": "5.54.1",
+        "@typescript-eslint/visitor-keys": "5.54.1",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -1081,16 +1081,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.54.0.tgz",
-      "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.54.1.tgz",
+      "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==",
       "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.9",
         "@types/semver": "^7.3.12",
-        "@typescript-eslint/scope-manager": "5.54.0",
-        "@typescript-eslint/types": "5.54.0",
-        "@typescript-eslint/typescript-estree": "5.54.0",
+        "@typescript-eslint/scope-manager": "5.54.1",
+        "@typescript-eslint/types": "5.54.1",
+        "@typescript-eslint/typescript-estree": "5.54.1",
         "eslint-scope": "^5.1.1",
         "eslint-utils": "^3.0.0",
         "semver": "^7.3.7"
@@ -1103,12 +1103,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "5.54.0",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
-      "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
+      "version": "5.54.1",
+      "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz",
+      "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "5.54.0",
+        "@typescript-eslint/types": "5.54.1",
         "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
@@ -3629,9 +3629,9 @@
       "integrity": "sha512-wMUXYMOixAEJlLnjk5MbLiFaz0gQObWYm/TIFWB5+j7sTY5gPyr09Cx1EpcLYbsgfFdN3wHjrKAhZofTuCBGhg=="
     },
     "node_modules/qs": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
-      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "version": "6.11.1",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.1.tgz",
+      "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
       "dependencies": {
         "side-channel": "^1.0.4"
       },

+ 5 - 5
package.json

@@ -28,10 +28,10 @@
     "jsplumb": "^2.15.6",
     "mitt": "^3.0.0",
     "nprogress": "^0.2.0",
-    "pinia": "^2.0.32",
+    "pinia": "^2.0.33",
     "print-js": "^1.6.0",
     "qrcodejs2-fixes": "^0.0.2",
-    "qs": "^6.11.0",
+    "qs": "^6.11.1",
     "screenfull": "^6.0.2",
     "sortablejs": "^1.15.0",
     "splitpanes": "^3.1.5",
@@ -42,11 +42,11 @@
     "vue-router": "^4.1.6"
   },
   "devDependencies": {
-    "@types/node": "^18.14.6",
+    "@types/node": "^18.15.0",
     "@types/nprogress": "^0.2.0",
     "@types/sortablejs": "^1.15.0",
-    "@typescript-eslint/eslint-plugin": "^5.54.0",
-    "@typescript-eslint/parser": "^5.54.0",
+    "@typescript-eslint/eslint-plugin": "^5.54.1",
+    "@typescript-eslint/parser": "^5.54.1",
     "@vitejs/plugin-vue": "^4.0.0",
     "@vue/compiler-sfc": "^3.2.47",
     "dotenv": "16.0.3",

+ 19 - 0
src/api/admin/Tenant.ts

@@ -16,6 +16,7 @@ import {
   ResultOutputPageOutputTenantListOutput,
   ResultOutputTenantGetOutput,
   TenantAddInput,
+  TenantSetEnableInput,
   TenantUpdateInput,
 } from './data-contracts'
 import { ContentType, HttpClient, RequestParams } from './http-client'
@@ -165,4 +166,22 @@ export class TenantApi<SecurityDataType = unknown> extends HttpClient<SecurityDa
       type: ContentType.Json,
       ...params,
     })
+  /**
+   * No description
+   *
+   * @tags tenant
+   * @name SetEnable
+   * @summary 设置启用
+   * @request POST:/api/admin/tenant/set-enable
+   * @secure
+   */
+  setEnable = (data: TenantSetEnableInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/tenant/set-enable`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
 }

+ 19 - 0
src/api/admin/User.ts

@@ -22,6 +22,7 @@ import {
   UserAddMemberInput,
   UserChangePasswordInput,
   UserResetPasswordInput,
+  UserSetEnableInput,
   UserSetManagerInput,
   UserUpdateBasicInput,
   UserUpdateInput,
@@ -254,6 +255,24 @@ export class UserApi<SecurityDataType = unknown> extends HttpClient<SecurityData
       type: ContentType.Json,
       ...params,
     })
+  /**
+   * No description
+   *
+   * @tags user
+   * @name SetEnable
+   * @summary 设置启用
+   * @request POST:/api/admin/user/set-enable
+   * @secure
+   */
+  setEnable = (data: UserSetEnableInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/user/set-enable`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
   /**
    * No description
    *

+ 32 - 6
src/api/admin/data-contracts.ts

@@ -3234,6 +3234,17 @@ export interface TenantListOutput {
   createdTime?: string | null
 }
 
+/** 设置启用 */
+export interface TenantSetEnableInput {
+  /**
+   * 租户Id
+   * @format int64
+   */
+  tenantId?: number
+  /** 是否启用 */
+  enabled?: boolean
+}
+
 /**
  * 租户类型:Platform=1,Tenant=2
  * @format int32
@@ -3320,8 +3331,8 @@ export interface UserAddInput {
    * @minLength 1
    */
   password: string
-  /** 用户状态:Enabled=0,Disabled=1,WaitChangePasssword=2,WaitActive=3 */
-  status?: UserStatus
+  /** 用 */
+  enabled?: boolean
 }
 
 /** 添加会员 */
@@ -3342,7 +3353,7 @@ export interface UserAddMemberInput {
    * @minLength 1
    */
   password: string
-  /** 用户状态:Enabled=0,Disabled=1,WaitChangePasssword=2,WaitActive=3 */
+  /** 用户状态:WaitChangePasssword=2,WaitActive=3 */
   status?: UserStatus
 }
 
@@ -3441,10 +3452,12 @@ export interface UserEntity {
   nickName?: string | null
   /** 头像 */
   avatar?: string | null
-  /** 用户状态:Enabled=0,Disabled=1,WaitChangePasssword=2,WaitActive=3 */
+  /** 用户状态:WaitChangePasssword=2,WaitActive=3 */
   status?: UserStatus
   /** 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100 */
   type?: UserType
+  /** 启用 */
+  enabled?: boolean
   /** 角色列表 */
   roles?: RoleEntity[] | null
   /** 部门列表 */
@@ -3545,6 +3558,8 @@ export interface UserGetPageOutput {
   roleNames?: string[] | null
   /** 是否主管 */
   isManager?: boolean
+  /** 启用 */
+  enabled?: boolean
   roles?: RoleEntity[] | null
   /**
    * 创建时间
@@ -3587,6 +3602,17 @@ export interface UserResetPasswordInput {
   password?: string | null
 }
 
+/** 设置启用 */
+export interface UserSetEnableInput {
+  /**
+   * 用户Id
+   * @format int64
+   */
+  userId?: number
+  /** 是否启用 */
+  enabled?: boolean
+}
+
 /** 设置主管 */
 export interface UserSetManagerInput {
   /**
@@ -3663,10 +3689,10 @@ export interface UserStaffEntity {
 }
 
 /**
- * 用户状态:Enabled=0,Disabled=1,WaitChangePasssword=2,WaitActive=3
+ * 用户状态:WaitChangePasssword=2,WaitActive=3
  * @format int32
  */
-export type UserStatus = 0 | 1 | 2 | 3
+export type UserStatus = 2 | 3
 
 /**
  * 用户类型:Member=0,DefaultUser=1,TenantAdmin=10,PlatformAdmin=100

+ 1 - 2
src/layout/navBars/breadcrumb/setings.vue

@@ -736,8 +736,7 @@ const onCopyConfigClick = () => {
 // 一键恢复默认
 const onResetConfigClick = () => {
   const storesUseUserInfo = useUserInfo()
-  const { userInfos } = storeToRefs(storesUseUserInfo)
-  const token = userInfos.value.token
+  const token = storesUseUserInfo.getToken()
   Local.clear()
   storesUseUserInfo.setToken(token)
   window.location.reload()

+ 1 - 2
src/layout/upgrade/index.vue

@@ -65,8 +65,7 @@ const onUpgrade = () => {
   state.btnTxt = t('message.upgrade.btnTwoLoading')
   setTimeout(() => {
     const storesUseUserInfo = useUserInfo()
-    const { userInfos } = storeToRefs(storesUseUserInfo)
-    const token = userInfos.value.token
+    const token = storesUseUserInfo.getToken()
     Local.clear()
     storesUseUserInfo.setToken(token)
     window.location.reload()

+ 1 - 3
src/router/backEnd.ts

@@ -1,5 +1,4 @@
 import { RouteRecordRaw } from 'vue-router'
-import { storeToRefs } from 'pinia'
 import pinia from '/@/stores/index'
 import { useUserInfo } from '/@/stores/userInfo'
 import { useRequestOldRoutes } from '/@/stores/requestOldRoutes'
@@ -37,9 +36,8 @@ const dynamicViewsModules: Record<string, Function> = Object.assign({}, { ...lay
 export async function initBackEndControlRoutes() {
   // 界面 loading 动画开始执行
   if (window.nextLoading === undefined) NextLoading.start()
-  const { userInfos } = storeToRefs(useUserInfo())
   // 无 token 停止执行下一步
-  if (!userInfos.value.token) return false
+  if (!useUserInfo().getToken()) return false
   // 触发初始化用户信息 pinia
   await useUserInfo().setUserInfos()
   // 获取路由菜单数据

+ 2 - 3
src/router/frontEnd.ts

@@ -21,9 +21,8 @@ export async function initFrontEndControlRoutes() {
   // 界面 loading 动画开始执行
   if (window.nextLoading === undefined) NextLoading.start()
   // 无 token 停止执行下一步
-  const stores = useUserInfo(pinia)
-  const { userInfos } = storeToRefs(stores)
-  if (!userInfos.value.token) return false
+  const storeUseUserInfo = useUserInfo(pinia)
+  if (!storeUseUserInfo.getToken()) return false
   // 触发初始化用户信息 pinia
   await useUserInfo(pinia).setUserInfos()
   // 无登录权限时,添加判断

+ 1 - 2
src/router/index.ts

@@ -97,8 +97,7 @@ router.beforeEach(async (to, from, next) => {
   NProgress.configure({ showSpinner: false })
   if (to.meta.title) NProgress.start()
   const storesUseUserInfo = useUserInfo(pinia)
-  const { userInfos } = storeToRefs(storesUseUserInfo)
-  const token = userInfos.value.token
+  const token = storesUseUserInfo.getToken()
   if (to.path === '/login' && !token) {
     next()
     NProgress.done()

+ 5 - 0
src/stores/userInfo.ts

@@ -35,6 +35,11 @@ export const useUserInfo = defineStore('userInfo', {
       this.userInfos.token = token
       Local.set(adminTokenKey, token)
     },
+    getToken() {
+      const token = Local.get(adminTokenKey)
+      this.userInfos.token = token
+      return token
+    },
     removeToken() {
       this.userInfos.token = ''
       Local.remove(adminTokenKey)

+ 8 - 4
src/views/admin/file/components/file-upload.vue

@@ -24,6 +24,11 @@
           drag
           multiple
           :auto-upload="false"
+          :before-upload="
+            () => {
+              state.token = storesUserInfo.getToken()
+            }
+          "
           :on-success="onSuccess"
           :on-error="onError"
         >
@@ -50,11 +55,9 @@ import { ref, reactive, computed } from 'vue'
 import { ElMessage } from 'element-plus'
 import type { UploadInstance, UploadProps, UploadFile } from 'element-plus'
 import eventBus from '/@/utils/mitt'
-import { storeToRefs } from 'pinia'
 import { useUserInfo } from '/@/stores/userInfo'
 
-const stores = useUserInfo()
-const { userInfos } = storeToRefs(stores)
+const storesUserInfo = useUserInfo()
 
 const uploadRef = ref<UploadInstance>()
 
@@ -71,6 +74,7 @@ const state = reactive({
   fileDirectory: '',
   fileReName: true,
   fileList: [] as UploadFile[],
+  token: storesUserInfo.getToken(),
 })
 
 const uploadAction = computed(() => {
@@ -78,7 +82,7 @@ const uploadAction = computed(() => {
 })
 
 const uploadHeaders = computed(() => {
-  return { Authorization: 'Bearer ' + userInfos.value.token }
+  return { Authorization: 'Bearer ' + state.token }
 })
 
 // 打开对话框

+ 7 - 5
src/views/admin/personal/index.vue

@@ -14,6 +14,7 @@
                 :show-file-list="false"
                 :before-upload="
                   () => {
+                    state.token = storesUserInfo.getToken()
                     state.avatarLoading = true
                   }
                 "
@@ -149,6 +150,10 @@ import { AxiosResponse } from 'axios'
 const ChangePasswordForm = defineAsyncComponent(() => import('./components/change-password-form.vue'))
 
 const { proxy } = getCurrentInstance() as any
+const changePasswordFormRef = ref()
+const formRef = ref()
+const storesUserInfo = useUserInfo(pinia)
+const { userInfos } = storeToRefs(storesUserInfo)
 
 // 定义变量内容
 const state = reactive({
@@ -168,13 +173,10 @@ const state = reactive({
   },
   avatarLoading: false,
   updateLoading: false,
+  token: storesUserInfo.getToken(),
 })
 
-const changePasswordFormRef = ref()
-const formRef = ref()
 const { personalInfo, personalForm } = toRefs(state)
-const storesUserInfo = useUserInfo(pinia)
-const { userInfos } = storeToRefs(storesUserInfo)
 
 // 当前时间提示语
 const currentTime = computed(() => {
@@ -183,7 +185,7 @@ const currentTime = computed(() => {
 
 // 上传头像请求头部
 const avatarHeaders = computed(() => {
-  return { Authorization: 'Bearer ' + userInfos.value.token }
+  return { Authorization: 'Bearer ' + state.token }
 })
 
 // 头像地址

+ 37 - 0
src/views/admin/tenant/index.vue

@@ -19,6 +19,17 @@
         <el-table-column prop="realName" label="姓名" width="120" show-overflow-tooltip />
         <el-table-column prop="phone" label="手机号" width="120" show-overflow-tooltip />
         <el-table-column prop="email" label="邮箱" min-width="120" show-overflow-tooltip />
+        <el-table-column label="启用" width="70" align="center" show-overflow-tooltip>
+          <template #default="{ row }">
+            <el-switch
+              v-model="row.enabled"
+              :loading="row.loading"
+              :active-value="true"
+              :inactive-value="false"
+              :before-change="() => onSetEnable(row)"
+            />
+          </template>
+        </el-table-column>
         <el-table-column label="操作" width="160" fixed="right" header-align="center" align="center">
           <template #default="{ row }">
             <el-button v-auth="'api:admin:tenant:update'" icon="ele-EditPen" size="small" text type="primary" @click="onEdit(row)">编辑</el-button>
@@ -127,6 +138,32 @@ const onDelete = (row: TenantListOutput) => {
     .catch(() => {})
 }
 
+const onSetEnable = (row: TenantListOutput & { loading: boolean }) => {
+  return new Promise((resolve, reject) => {
+    proxy.$modal
+      .confirm(`确定要${row.enabled ? '禁用' : '启用'}【${row.name}】?`)
+      .then(async () => {
+        row.loading = true
+        const res = await new TenantApi()
+          .setEnable({ tenantId: row.id, enabled: !row.enabled }, { showSuccessMessage: true })
+          .catch(() => {
+            reject(new Error('Error'))
+          })
+          .finally(() => {
+            row.loading = false
+          })
+        if (res && res.success) {
+          resolve(true)
+        } else {
+          reject(new Error('Cancel'))
+        }
+      })
+      .catch(() => {
+        reject(new Error('Cancel'))
+      })
+  })
+}
+
 const onSizeChange = (val: number) => {
   state.pageInput.pageSize = val
   onQuery()

+ 37 - 0
src/views/admin/user/index.vue

@@ -37,6 +37,17 @@
                 {{ row.roleNames ? row.roleNames.join(',') : '' }}
               </template>
             </el-table-column>
+            <el-table-column label="启用" width="70" align="center" show-overflow-tooltip>
+              <template #default="{ row }">
+                <el-switch
+                  v-model="row.enabled"
+                  :loading="row.loading"
+                  :active-value="true"
+                  :inactive-value="false"
+                  :before-change="() => onSetEnable(row)"
+                />
+              </template>
+            </el-table-column>
             <el-table-column label="操作" width="160" fixed="right" header-align="center" align="center">
               <template #default="{ row }">
                 <el-button v-auth="'api:admin:user:update'" icon="ele-EditPen" size="small" text type="primary" @click="onEdit(row)">编辑</el-button>
@@ -205,6 +216,32 @@ const onSetManager = (row: UserGetPageOutput) => {
     .catch(() => {})
 }
 
+const onSetEnable = (row: UserGetPageOutput & { loading: boolean }) => {
+  return new Promise((resolve, reject) => {
+    proxy.$modal
+      .confirm(`确定要${row.enabled ? '禁用' : '启用'}【${row.name}】?`)
+      .then(async () => {
+        row.loading = true
+        const res = await new UserApi()
+          .setEnable({ userId: row.id, enabled: !row.enabled }, { showSuccessMessage: true })
+          .catch(() => {
+            reject(new Error('Error'))
+          })
+          .finally(() => {
+            row.loading = false
+          })
+        if (res && res.success) {
+          resolve(true)
+        } else {
+          reject(new Error('Cancel'))
+        }
+      })
+      .catch(() => {
+        reject(new Error('Cancel'))
+      })
+  })
+}
+
 const onSizeChange = (val: number) => {
   state.pageInput.pageSize = val
   onQuery()