From 3bd3e0aa235d564e73439ad43dc54ed6ad39f683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Wed, 19 Aug 2026 18:48:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=87=EE=86=BC=EE=98=B2=E9=8D=94?= =?UTF-8?q?=E3=84=A6=E2=82=AC=E4=BD=BD=E7=9F=BE=E9=90=A2=E5=8D=9E=E5=9F=9B?= =?UTF-8?q?=E9=8F=82=E6=9D=BF=E6=82=97=E9=8F=88=EE=81=85=E6=95=9E=E9=8D=90?= =?UTF-8?q?=E5=B1=BD=EE=87=B1=E9=91=B7=E7=A3=8B=E5=BD=8D=E9=8D=97=E6=9B=A1?= =?UTF-8?q?=E7=83=A6=E6=9D=9E=EE=84=81=E6=9A=A3=E6=A4=A4=E9=9D=9B=E5=9F=9B?= =?UTF-8?q?=E9=8F=82=3F=20=E6=B5=A0=EF=BD=87=E7=88=9C=E9=90=A2=E7=86=B8?= =?UTF-8?q?=E5=9E=9A=E9=8E=BA=E3=83=A5=E5=BD=9B=E7=92=BA=EE=88=9A=E7=B7=9E?= =?UTF-8?q?=E6=B6=93=E5=BA=A1=E6=82=97=E7=BB=94=EE=88=9A=EE=87=AE=E6=A6=BB?= =?UTF-8?q?=3F=20=E7=90=9B=E3=83=A5=E5=8E=96basic=20API=E5=A6=AF=E2=80=B3?= =?UTF-8?q?=E6=BD=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 ++++++++ src/api/basic/basic-config.js | 37 +++++++++++++++++++++++++++++++ src/api/basic/basic-dict-item.js | 26 ++++++++++++++++++++++ src/api/basic/basic-notice.js | 14 ++++++++++++ src/api/code/youth-generator.js | 6 ++--- src/libs/router-util.js | 9 ++++++-- src/router/index.js | 11 +++++++-- src/store/module/app.js | 7 ++++-- src/view/code/youth-generator.vue | 5 +++-- 9 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 src/api/basic/basic-config.js create mode 100644 src/api/basic/basic-dict-item.js create mode 100644 src/api/basic/basic-notice.js diff --git a/.gitignore b/.gitignore index ae34079..192b690 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,12 @@ debug.log ### Env ### .env.local .env.*.local + +### 测试/调试临时文件 ### +.playwright-cli/ +after-login.yaml +after2.yaml +cur.yaml +post.yaml +run-web.log +run-web-err.log diff --git a/src/api/basic/basic-config.js b/src/api/basic/basic-config.js new file mode 100644 index 0000000..23de40e --- /dev/null +++ b/src/api/basic/basic-config.js @@ -0,0 +1,37 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 查询配置(按 configType) **/ +export const findConfig = (data) => { + return axios.request({ + url: 'system/basic-config/findByConfigType', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 更新配置 **/ +export const update = (data) => { + return axios.request({ + url: 'system/basic-config/update', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 查询阿里云 OSS 配置 **/ +export const findAliyunOssConfig = () => { + return axios.request({ + url: 'system/basic-config/findAliyunOssConfig', + headers: { + "Authorization": getToken() + }, + method: 'post' + }) +} diff --git a/src/api/basic/basic-dict-item.js b/src/api/basic/basic-dict-item.js new file mode 100644 index 0000000..d686fb5 --- /dev/null +++ b/src/api/basic/basic-dict-item.js @@ -0,0 +1,26 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取字典下拉列表 **/ +export const getDictSelectList = (data) => { + return axios.request({ + url: 'system/basic-dict-item/getDictSelectList', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} + +/** 按字典编码数组批量获取下拉列表 **/ +export const getDictSelectListByArr = (data) => { + return axios.request({ + url: 'system/basic-dict-item/getDictSelectListByArr', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/basic/basic-notice.js b/src/api/basic/basic-notice.js new file mode 100644 index 0000000..60b66b2 --- /dev/null +++ b/src/api/basic/basic-notice.js @@ -0,0 +1,14 @@ +import axios from '@/libs/api.request' +import {getToken} from "@/libs/util" + +/** 获取通知列表 **/ +export const getDataList = (data) => { + return axios.request({ + url: 'system/basic-notice/findListWithPage', + headers: { + "Authorization": getToken() + }, + data: data, + method: 'post' + }) +} diff --git a/src/api/code/youth-generator.js b/src/api/code/youth-generator.js index fa452a5..b8159ae 100644 --- a/src/api/code/youth-generator.js +++ b/src/api/code/youth-generator.js @@ -4,7 +4,7 @@ import {getToken} from "@/libs/util" /** 获取列表 **/ export const getDataList = (data) => { return axios.request({ - url: 'system/youth-generator/findListWithPage', + url: 'generator/findListWithPage', headers: { "Authorization": getToken() }, @@ -16,7 +16,7 @@ export const getDataList = (data) => { /** 获取table下拉列表 **/ export const getTableSelectList = (data) => { return axios.request({ - url: 'system/youth-generator/getTableSelectList', + url: 'generator/getTableSelectList', headers: { "Authorization": getToken() }, @@ -27,7 +27,7 @@ export const getTableSelectList = (data) => { /** 提交代码生成规则 **/ export const executeGenerator = (data) => { return axios.request({ - url: 'system/youth-generator/executeGenerator', + url: 'generator/execute', headers: { "Authorization": getToken() }, diff --git a/src/libs/router-util.js b/src/libs/router-util.js index 336a49c..db96428 100644 --- a/src/libs/router-util.js +++ b/src/libs/router-util.js @@ -24,10 +24,14 @@ export const loadMenuList = () => { } export const formatMenuList = (list) => { - console.log(list) // 遍历格式化菜单 let resList = [] forEach(list, item => { + // 无 url 且无 component 的节点属于纯权限点(如按钮权限),不生成菜单路由 + if (!item.url && !item.component) { + if (!hasChild(item)) return + } + let object = { path: item.url, name: item.permissionCode, @@ -39,7 +43,8 @@ export const formatMenuList = (list) => { } } - if (item.level === 0 || item.component === 'Main') { + // 一级菜单(数据库 level=1)或显式指定 Main 的,使用 Main 布局组件 + if (item.level === 0 || item.level === 1 || item.component === 'Main') { // 一级菜单 object.component = Main } else { diff --git a/src/router/index.js b/src/router/index.js index 6829850..45ba77d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -5,7 +5,7 @@ import store from '@/store' import iView from 'view-design' import config from '@/config' import { setToken, getToken, canTurnTo, setTitle, localSave, localRead } from '@/libs/util' -import { loadMenuList, formatMenuList } from '@/libs/router-util' +import { formatMenuList } from '@/libs/router-util' import { getPermissionList } from '@/api/sys/sys-permission' const {homeName} = config @@ -41,6 +41,11 @@ router.beforeEach((to, from, next) => { name: homeName // 跳转到homeName页 }) } else { + // 已加载过菜单,避免重复 addRoutes 导致路由守卫死循环 + if (store.state.app.menuList && store.state.app.menuList.length > 0) { + next() + return + } store.dispatch('getUserInfo').then(user => { // 如果本地不存在路由数据则动态获取 if (menuListStr == null || menuListStr == '') { @@ -53,10 +58,12 @@ router.beforeEach((to, from, next) => { // 刷新界面菜单 store.commit('updateMenuList', list) + next() + }).catch(() => { + // 获取权限失败,直接放行(保留基础路由),避免卡死 next() }) } else { - console.log("2") let list = formatMenuList(JSON.parse(menuListStr)) store.commit('updateMenuList', list) next() diff --git a/src/store/module/app.js b/src/store/module/app.js index be9b6be..eab4a33 100644 --- a/src/store/module/app.js +++ b/src/store/module/app.js @@ -17,7 +17,7 @@ import router from '@/router' import routers from '@/router/routers' import config from '@/config' // ①引入路由数据读取方法 -import { loadMenuList, createRouter } from '@/libs/router-util' +import { createRouter } from '@/libs/router-util' const { homeName } = config @@ -37,7 +37,10 @@ export default { local: localRead('local'), errorList: [], hasReadErrorPage: false, - menuList: loadMenuList(), + // 初始为空,让路由守卫每次登录/刷新后都重新注册动态路由,避免刷新后 + // 因 localStore 缓存误判「已加载菜单」而跳过 addRoutes,导致点击菜单时 + // 路由名不存在 → vue-router 匹配失败 → 整页刷新(表现为页面闪一下) + menuList: [], }, getters: { //menuList: (state, getters, rootState) => getMenuByRouter(routers, rootState.user.access), diff --git a/src/view/code/youth-generator.vue b/src/view/code/youth-generator.vue index 97ebf2f..7a17ea0 100644 --- a/src/view/code/youth-generator.vue +++ b/src/view/code/youth-generator.vue @@ -240,7 +240,7 @@ let data = objectUtil.trimJoin(temp, this.search) this.tableLoading = true getDataList(data).then(res => { - let pageInfo = res.data.data.pageInfo + let pageInfo = res.data.data.pageInfo || res.data.data this.pageTotal = pageInfo.total this.dataList = pageInfo.list // 延迟300毫秒,给它更流畅的感觉 @@ -412,7 +412,8 @@ }, getTableSelectList() { getTableSelectList().then(res => { - this.yTableList = res.data.data.list + const data = res.data.data + this.yTableList = Array.isArray(data) ? data : ((data && data.list) || []) if (this.yTableList.length > 0) { this.search.yTableName = this.yTableList[0].value this.getDataList()