Ver código fonte

fix(@six/smart-pharmacy): 智慧药事系统第一版后端路径修改以及退出登录后动态路由和权限状态重置

cmj 1 mês atrás
pai
commit
b42a20da34

+ 1 - 3
apps/smart-pharmacy/.env.development

@@ -3,10 +3,8 @@ VITE_PORT=5666
 
 VITE_BASE=/
 
-# 接口地址
+# 接口地址(与后端同域,直接请求 /manager/...,无需 /wf 前缀)
 VITE_GLOB_API_URL=
-# 智能辅诊接口地址
-VITE_GLOB_API_SMART-PHARMACY=/wf
 
 # 是否打开 devtools,true 为打开,false 为关闭
 VITE_DEVTOOLS=true

+ 2 - 4
apps/smart-pharmacy/.env.production

@@ -1,9 +1,7 @@
-VITE_BASE=/wf/p/
+VITE_BASE=/zhys/
 
-# 接口地址
+# 接口地址(与后端同域,直接请求 /manager/...,无需 /wf 前缀)
 VITE_GLOB_API_URL=
-# 智能辅诊接口地址
-VITE_GLOB_API_SMART-PHARMACY=/wf
 
 # 是否开启压缩,可以设置为 none, brotli, gzip
 VITE_COMPRESS=brotli,gzip

+ 1 - 3
apps/smart-pharmacy/src/api/index.ts

@@ -15,9 +15,7 @@ export * from './method/prescription';
 export * from './method/system';
 
 export const http = createRequestClient({
-  id: import.meta.env.VITE_APP_NAMESPACE?.split('/').pop() ?? 'health-remedy',
-  // 本地的开发地址
-  // baseURL: 'http://192.168.1.16:8039',
+  id: import.meta.env.VITE_APP_NAMESPACE?.split('/').pop() ?? 'smart-pharmacy',
   transform(body, method) {
     /* prettier-ignore */
     if (body === null || typeof body !== 'object') return { code: 0, data: body, message: 'ok' };

+ 2 - 0
apps/smart-pharmacy/src/api/method/access.ts

@@ -34,6 +34,7 @@ export function getAccessMenuMethod(permissions?: string[]) {
   return http.get<SystemModel.Menu[], TreeSelectMenuNode[]>(
     `/manager/system/menu/treeselect`,
     {
+      cacheFor: 0,
       transform(data) {
         const menus = fromTreeSelectMenus(data);
         if (!permissions?.length) return menus;
@@ -47,6 +48,7 @@ export function getUserInfoMethod(token?: string) {
   return http.get<UserInfo & { roles: SystemModel.Role[] }, TransformData>(
     `/manager/system/user/getInfo`,
     {
+      cacheFor: 0,
       headers: { Authorization: token },
       transform(data, headers) {
         return {

+ 14 - 32
apps/smart-pharmacy/src/layouts/basic.vue

@@ -1,5 +1,6 @@
 <script lang="ts" setup>
 import type { NotificationItem } from '@vben/layouts';
+import type { MenuRecordRaw } from '@vben/types';
 
 import { computed, ref, watch } from 'vue';
 import { useRouter } from 'vue-router';
@@ -39,38 +40,19 @@ async function handleLogout() {
   await authStore.logout(false);
 }
 
-const dropdownMenus = computed(() => [
-  {
-    text: $t('system.medicalInstitution._'),
-    icon: 'mdi:hospital-building',
-    handler: () => router.push('/system/organization'),
-  },
-  {
-    text: $t('system.enterprise.title'),
-    icon: 'mdi:account-group',
-    handler: () => router.push('/system/enterprise'),
-  },
-  {
-    text: $t('system.tisane.title'),
-    icon: 'mdi:pill-multiple',
-    handler: () => router.push('/system/tisane'),
-  },
-  {
-    text: $t('system.role.title'),
-    icon: 'charm:organisation',
-    handler: () => router.push('/system/role'),
-  },
-  {
-    text: $t('system.user.title'),
-    icon: 'mdi:account-group',
-    handler: () => router.push('/system/user'),
-  },
-  {
-    text: $t('prescription.title'),
-    icon: 'ion:settings-outline',
-    handler: () => router.push('/prescription/management'),
-  },
-]);
+function collectLeafMenus(menus: MenuRecordRaw[]): MenuRecordRaw[] {
+  return menus.flatMap((menu) =>
+    menu.children?.length ? collectLeafMenus(menu.children) : [menu],
+  );
+}
+
+const dropdownMenus = computed(() =>
+  collectLeafMenus(accessStore.accessMenus).map((menu) => ({
+    text: $t(menu.name),
+    icon: menu.icon ?? 'mdi:circle-small',
+    handler: () => router.push(menu.path),
+  })),
+);
 
 watch(
   () => preferences.app.watermark,

+ 1 - 1
apps/smart-pharmacy/src/preferences.ts

@@ -14,7 +14,7 @@ export const overridesPreferences = defineOverridesPreferences({
     authPageLayout: 'panel-center',
     layout: 'header-nav',
     enablePreferences: false,
-    defaultHomePath: '/system/user',
+    defaultHomePath: '/prescription/management',
   },
   header: {
     menuAlign: 'center',

+ 14 - 0
apps/smart-pharmacy/src/router/access-session.ts

@@ -0,0 +1,14 @@
+/** 上次完成权限校验的用户,用于检测切换账号后是否需要重新生成路由 */
+let lastCheckedUserId: string | undefined;
+
+export function getLastCheckedUserId() {
+  return lastCheckedUserId;
+}
+
+export function setLastCheckedUserId(userId?: string) {
+  lastCheckedUserId = userId;
+}
+
+export function resetLastCheckedUserId() {
+  lastCheckedUserId = undefined;
+}

+ 21 - 0
apps/smart-pharmacy/src/router/guard.ts

@@ -6,6 +6,12 @@ import { useAccessStore, useUserStore } from '@vben/stores';
 import { startProgress, stopProgress } from '@vben/utils';
 
 import { accessRoutes, coreRouteNames } from '#/router/routes';
+import { resetRoutes } from '#/router';
+import {
+  getLastCheckedUserId,
+  resetLastCheckedUserId,
+  setLastCheckedUserId,
+} from '#/router/access-session';
 import { useAuthStore } from '#/store';
 
 import { generateAccess } from './access';
@@ -64,6 +70,7 @@ function setupAccessGuard(router: Router) {
 
     // accessToken 检查
     if (!accessStore.accessToken) {
+      resetLastCheckedUserId();
       // 明确声明忽略权限访问权限,则可以访问
       if (to.meta.ignoreAccess) {
         return true;
@@ -86,6 +93,19 @@ function setupAccessGuard(router: Router) {
     }
 
     // 是否已经生成过动态路由
+    const currentUserId = userStore.userInfo?.userId;
+    if (
+      accessStore.isAccessChecked &&
+      currentUserId &&
+      getLastCheckedUserId() &&
+      currentUserId !== getLastCheckedUserId()
+    ) {
+      resetRoutes();
+      accessStore.setAccessMenus([]);
+      accessStore.setAccessRoutes([]);
+      accessStore.setIsAccessChecked(false);
+    }
+
     if (accessStore.isAccessChecked) {
       return true;
     }
@@ -119,6 +139,7 @@ function setupAccessGuard(router: Router) {
     accessStore.setAccessMenus(accessibleMenus);
     accessStore.setAccessRoutes(accessibleRoutes);
     accessStore.setIsAccessChecked(true);
+    setLastCheckedUserId(userInfo.userId);
     const redirectPath = (redirect ??
       (path === preferences.app.defaultHomePath
         ? userInfo.homePath ||

+ 12 - 0
apps/smart-pharmacy/src/store/auth.ts

@@ -11,6 +11,14 @@ import { message, notification } from 'ant-design-vue';
 import { defineStore } from 'pinia';
 
 import { getUserInfoMethod, loginMethod } from '#/api/method/access';
+import { resetRoutes } from '#/router';
+import { resetLastCheckedUserId } from '#/router/access-session';
+
+function resetAccessState(accessStore: ReturnType<typeof useAccessStore>) {
+  accessStore.setAccessMenus([]);
+  accessStore.setAccessRoutes([]);
+  accessStore.setIsAccessChecked(false);
+}
 
 export const useAuthStore = defineStore('auth', () => {
   const accessStore = useAccessStore();
@@ -20,6 +28,8 @@ export const useAuthStore = defineStore('auth', () => {
   const login = useRequest(loginMethod, {
     immediate: false,
   }).onSuccess(async ({ data }) => {
+    resetRoutes();
+    resetAccessState(accessStore);
     const userInfo = await userinfo.send(data.accessToken);
 
     await router.push(
@@ -38,6 +48,8 @@ export const useAuthStore = defineStore('auth', () => {
 
   const logout = {
     async send(redirect: boolean = true) {
+      resetRoutes();
+      resetLastCheckedUserId();
       resetAllStores();
       accessStore.setLoginExpired(false);
       // 回登录页带上当前路由地址

+ 2 - 10
apps/smart-pharmacy/vite.config.mts

@@ -6,17 +6,9 @@ export default defineConfig(async () => {
     vite: {
       server: {
         proxy: {
-          '/wf': {
+          '/manager': {
             changeOrigin: true,
-            target: `https://wx.hzliuzhi.com:4433`,
-            rewrite: (path) => path.replace(/^\/wf/, ''),
-            ws: true,
-          },
-          '/api': {
-            changeOrigin: true,
-            rewrite: (path) => path.replace(/^\/api/, ''),
-            // mock代理目标地址
-            target: 'http://192.168.1.16:8039',
+            target: 'https://wx.hzliuzhi.com:4433',
             ws: true,
           },
         },