From e423d8afcf5b9666e166565d0509b621ebab17e7 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 13 一月 2025 14:11:00 +0800 Subject: [PATCH] !172 合并 warmflow 功能分支 * update 优化 流程定义页面 点击复制之后跳转到未发布列表 * update 优化 流程定义页面 增加加载loading层 * fix: v-model处理有延迟 需要手动处理 * update 调整流程定义查询 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 调整可驳回的节点 * update: 调整文案 * update: 激活/挂起改为switch操作 * update 优化 代码删除无用输出 * update 统一抄送人使用昵称展示 * update 调整分类接口 * update 统一业务id参数 * update 删除默认顶节点 * !168 优化流程分类 * update 恢复误删除代码 * update 优化流程分类 * update 修复 路由跳转未改全 * [update] * fix 修复一些问题 * update 重构流程分类表 * update 流程定义增加表单路径与编辑功能 修复一些其他bug * fix 修复 一些问题 * update 变量统一命名 * add 增加示例 * Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui… * update 调整办理人 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * add 增加示例 * update 调整审批记录 添加流程导出 * remove 删除无用代码 * remove 删除无用代码 * [update] * [fix] * 流程干预删除委托 * 增加附件 * 附件修改 * 申请人查询修改 * 1.修改查询条件 * !167 fix 修复 import路径修改不全问题 * fix 修复 import路径修改不全问题 * !166 update 清除 ProcessPreview 引用 * update 清除 ProcessPreview 引用 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * fix 修复 前端路径修改不全问题 * update 优化接口请求路径 * add 添加作废 * add 添加流程干预 * update 调整加签,减签 * update 调整加签,减签 * add 增加流程查看 * update 调整委托,转办 * update 调整流程变量显示 * update 调整办理人修改 * update 调整流程实例状态页面 * update 调整已办页面 * add 添加流程撤销 * update 调整任务,流程实例 ,流程定义页面 * Merge branch 'dev' into warm-flw-future * update 调整流程定义页面 * add 添加流程变量查看 * update 调整设计器路由名称 * update 调整办理人 * update 调整设计器uri * update 调整设计器请求uri 调整待办状态 * update 调整办理 驳回 终止等状态 * add 添加模型新增 * add 添加warm-ui设计器,删除无用代码 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * add 添加流程设计 * update 调整驳回 * update 调整视图类型错误 * Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui… * 添加已办,未办 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 调整流程实例,待办查询 * add 添加代办人,调整提交按钮校验 * update 调整流程定义查询 * add添加流程定义激活 挂起 * add 添加流程文件部署 调整流程发布 * update 优化 时间搜索组件统一 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * fix 修复 用户管理编辑安全权限错误问题 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 优化 类型报错问题 * update 优化 切换租户后刷新首页 * update 优化 实现表格行选中切换 * update 优化 使用 vueuse 重构 websocket 实现 * update 优化 使用 vueuse 重构 websocket 实现 * fix 修复 登出后重新登录 sse推送报错问题 * reset 回滚 代码修改 采用其他方案 * fix 修复 登出后重新登录 sse推送报错问题 * update 优化 删除无用代码 * update element-plus 2.7.5 => 2.7.8 * reset 回滚 错误修复 * update 优化 代码生成器编辑页禁用缓存 防止同步后页面不更新问题 * fix 修复 代码生成同步点击取消报错问题 * 初始化添加warm-flow --- src/store/modules/permission.ts | 147 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 110 insertions(+), 37 deletions(-) diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index ed64e46..43fcef8 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -2,35 +2,48 @@ import router, { constantRoutes, dynamicRoutes } from '@/router'; import store from '@/store'; import { getRouters } from '@/api/menu'; +import auth from '@/plugins/auth'; +import { RouteRecordRaw } from 'vue-router'; + import Layout from '@/layout/index.vue'; import ParentView from '@/components/ParentView/index.vue'; import InnerLink from '@/layout/components/InnerLink/index.vue'; -import auth from '@/plugins/auth'; -import { RouteOption } from 'vue-router'; + +import { createCustomNameComponent } from '@/utils/createCustomNameComponent'; + // 鍖归厤views閲岄潰鎵�鏈夌殑.vue鏂囦欢 const modules = import.meta.glob('./../../views/**/*.vue'); - export const usePermissionStore = defineStore('permission', () => { - const routes = ref<RouteOption[]>([]); - const addRoutes = ref<RouteOption[]>([]); - const defaultRoutes = ref<RouteOption[]>([]); - const topbarRouters = ref<RouteOption[]>([]); - const sidebarRouters = ref<RouteOption[]>([]); + const routes = ref<RouteRecordRaw[]>([]); + const addRoutes = ref<RouteRecordRaw[]>([]); + const defaultRoutes = ref<RouteRecordRaw[]>([]); + const topbarRouters = ref<RouteRecordRaw[]>([]); + const sidebarRouters = ref<RouteRecordRaw[]>([]); - const setRoutes = (newRoutes: RouteOption[]): void => { + const getRoutes = (): RouteRecordRaw[] => { + return routes.value as RouteRecordRaw[]; + }; + const getSidebarRoutes = (): RouteRecordRaw[] => { + return sidebarRouters.value as RouteRecordRaw[]; + }; + const getTopbarRoutes = (): RouteRecordRaw[] => { + return topbarRouters.value as RouteRecordRaw[]; + }; + + const setRoutes = (newRoutes: RouteRecordRaw[]): void => { addRoutes.value = newRoutes; routes.value = constantRoutes.concat(newRoutes); }; - const setDefaultRoutes = (routes: RouteOption[]): void => { + const setDefaultRoutes = (routes: RouteRecordRaw[]): void => { defaultRoutes.value = constantRoutes.concat(routes); }; - const setTopbarRoutes = (routes: RouteOption[]): void => { + const setTopbarRoutes = (routes: RouteRecordRaw[]): void => { topbarRouters.value = routes; }; - const setSidebarRouters = (routes: RouteOption[]): void => { + const setSidebarRouters = (routes: RouteRecordRaw[]): void => { sidebarRouters.value = routes; }; - const generateRoutes = async (): Promise<RouteOption[]> => { + const generateRoutes = async (): Promise<RouteRecordRaw[]> => { const res = await getRouters(); const { data } = res; const sdata = JSON.parse(JSON.stringify(data)); @@ -47,7 +60,9 @@ setSidebarRouters(constantRoutes.concat(sidebarRoutes)); setDefaultRoutes(sidebarRoutes); setTopbarRoutes(defaultRoutes); - return new Promise<RouteOption[]>((resolve) => resolve(rewriteRoutes)); + // 璺敱name閲嶅妫�鏌� + duplicateRouteChecker(asyncRoutes, sidebarRoutes); + return new Promise<RouteRecordRaw[]>((resolve) => resolve(rewriteRoutes)); }; /** @@ -56,22 +71,20 @@ * @param lastRouter 涓婁竴绾ц矾鐢� * @param type 鏄惁鏄噸鍐欒矾鐢� */ - const filterAsyncRouter = (asyncRouterMap: RouteOption[], lastRouter?: RouteOption, type = false): RouteOption[] => { + const filterAsyncRouter = (asyncRouterMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw, type = false): RouteRecordRaw[] => { return asyncRouterMap.filter((route) => { if (type && route.children) { route.children = filterChildren(route.children, undefined); } - if (route.component) { - // Layout ParentView 缁勪欢鐗规畩澶勭悊 - if (route.component === 'Layout') { - route.component = Layout; - } else if (route.component === 'ParentView') { - route.component = ParentView; - } else if (route.component === 'InnerLink') { - route.component = InnerLink; - } else { - route.component = loadView(route.component); - } + // Layout ParentView 缁勪欢鐗规畩澶勭悊 + if (route.component?.toString() === 'Layout') { + route.component = Layout; + } else if (route.component?.toString() === 'ParentView') { + route.component = ParentView; + } else if (route.component?.toString() === 'InnerLink') { + route.component = InnerLink; + } else { + route.component = loadView(route.component, route.name as string); } if (route.children != null && route.children && route.children.length) { route.children = filterAsyncRouter(route.children, route, type); @@ -82,11 +95,11 @@ return true; }); }; - const filterChildren = (childrenMap: RouteOption[], lastRouter?: RouteOption): RouteOption[] => { - let children: RouteOption[] = []; + const filterChildren = (childrenMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw): RouteRecordRaw[] => { + let children: RouteRecordRaw[] = []; childrenMap.forEach((el) => { if (el.children && el.children.length) { - if (el.component === 'ParentView' && !lastRouter) { + if (el.component?.toString() === 'ParentView' && !lastRouter) { el.children.forEach((c) => { c.path = el.path + '/' + c.path; if (c.children && c.children.length) { @@ -101,20 +114,33 @@ if (lastRouter) { el.path = lastRouter.path + '/' + el.path; if (el.children && el.children.length) { - children = children.concat(filterChildren(el.children, el)) - return + children = children.concat(filterChildren(el.children, el)); + return; } } children = children.concat(el); }); return children; }; - return { routes, setRoutes, generateRoutes, setSidebarRouters, topbarRouters, sidebarRouters, defaultRoutes }; + return { + routes, + topbarRouters, + sidebarRouters, + defaultRoutes, + + getRoutes, + getSidebarRoutes, + getTopbarRoutes, + + setRoutes, + generateRoutes, + setSidebarRouters + }; }); // 鍔ㄦ�佽矾鐢遍亶鍘嗭紝楠岃瘉鏄惁鍏峰鏉冮檺 -export const filterDynamicRoutes = (routes: RouteOption[]) => { - const res: RouteOption[] = []; +export const filterDynamicRoutes = (routes: RouteRecordRaw[]) => { + const res: RouteRecordRaw[] = []; routes.forEach((route) => { if (route.permissions) { if (auth.hasPermiOr(route.permissions)) { @@ -129,12 +155,15 @@ return res; }; -export const loadView = (view: any) => { +export const loadView = (view: any, name: string) => { let res; for (const path in modules) { - const dir = path.split('views/')[1].split('.vue')[0]; + const viewsIndex = path.indexOf('/views/'); + let dir = path.substring(viewsIndex + 7); + dir = dir.substring(0, dir.lastIndexOf('.vue')); if (dir === view) { - res = () => modules[path](); + res = createCustomNameComponent(modules[path], { name }); + return res; } } return res; @@ -145,4 +174,48 @@ return usePermissionStore(store); }; +interface Route { + name?: string | symbol; + path: string; + children?: Route[]; +} + +/** + * 妫�鏌ヨ矾鐢眓ame鏄惁閲嶅 + * @param localRoutes 鏈湴璺敱 + * @param routes 鍔ㄦ�佽矾鐢� + */ +function duplicateRouteChecker(localRoutes: Route[], routes: Route[]) { + // 灞曞钩 + function flatRoutes(routes: Route[]) { + const res: Route[] = []; + routes.forEach((route) => { + if (route.children) { + res.push(...flatRoutes(route.children)); + } else { + res.push(route); + } + }); + return res; + } + + const allRoutes = flatRoutes([...localRoutes, ...routes]); + + const nameList: string[] = []; + allRoutes.forEach((route) => { + const name = route.name.toString(); + if (name && nameList.includes(name)) { + const message = `璺敱鍚嶇О: [${name}] 閲嶅, 浼氶�犳垚 404`; + console.error(message); + ElNotification({ + title: '璺敱鍚嶇О閲嶅', + message, + type: 'error' + }); + return; + } + nameList.push(route.name.toString()); + }); +} + export default usePermissionStore; -- Gitblit v1.9.3