This commit is contained in:
liangqing xia 2024-10-12 21:38:51 +08:00
commit ebb884fc19
8 changed files with 45 additions and 16 deletions

View File

@ -222,5 +222,7 @@
"vitest.disableWorkspaceWarning": true, "vitest.disableWorkspaceWarning": true,
"cSpell.words": ["tinymce"], "cSpell.words": ["tinymce"],
"typescript.tsdk": "node_modules/typescript/lib", "typescript.tsdk": "node_modules/typescript/lib",
"editor.linkedEditing": true // html "editor.linkedEditing": true, // html,
"vscodeCustomCodeColor.highlightValue": "v-access", // v-access
"vscodeCustomCodeColor.highlightValueColor": "#CCFFFF"
} }

View File

@ -4,12 +4,14 @@
- 用户管理 新增从参数取默认密码 - 用户管理 新增从参数取默认密码
- 全局表格加上id 方便进行缓存列排序的操作 - 全局表格加上id 方便进行缓存列排序的操作
- 支持菜单名称i18n
**BUG FIXES** **BUG FIXES**
- 登录页面 关闭租户后下拉框没有正常隐藏 - 登录页面 关闭租户后下拉框没有正常隐藏
- 字典管理 关闭租户不应显示`同步租户字典`按钮 - 字典管理 关闭租户不应显示`同步租户字典`按钮
- 登录日志 漏掉了登录日志日期查询 - 登录日志 漏掉了登录日志日期查询
- 登出相关逻辑在并发(非await)情况下重复执行的问题
**OTHERS** **OTHERS**

View File

@ -34,8 +34,11 @@ const { apiURL, clientId, enableEncrypt } = useAppConfig(
import.meta.env.PROD, import.meta.env.PROD,
); );
/** 控制是否弹窗 防止登录超时请求多个api会弹窗多次 */ /**
let showTimeoutToast = true; *
* api 401
*/
let isLogoutProcessing = false;
function createRequestClient(baseURL: string) { function createRequestClient(baseURL: string) {
const client = new RequestClient({ const client = new RequestClient({
@ -234,18 +237,16 @@ function createRequestClient(baseURL: string) {
let timeoutMsg = ''; let timeoutMsg = '';
switch (code) { switch (code) {
case 401: { case 401: {
// 已经在登出过程中 不再执行
if (isLogoutProcessing) {
return;
}
isLogoutProcessing = true;
const _msg = '登录超时, 请重新登录'; const _msg = '登录超时, 请重新登录';
const userStore = useAuthStore(); const userStore = useAuthStore();
userStore.logout().then(() => { userStore.logout().finally(() => {
/** 只弹窗一次 */ message.error(_msg);
if (showTimeoutToast) { isLogoutProcessing = false;
showTimeoutToast = false;
message.error(_msg);
/** 定时器 3s后再开启弹窗 */
setTimeout(() => {
showTimeoutToast = true;
}, 3000);
}
}); });
// 不再执行下面逻辑 // 不再执行下面逻辑
return; return;

View File

@ -84,6 +84,7 @@
} }
}, },
"menu": { "menu": {
"root": "Root",
"system": { "system": {
"root": "System", "root": "System",
"user": "User", "user": "User",

View File

@ -84,6 +84,7 @@
} }
}, },
"menu": { "menu": {
"root": "根目录",
"system": { "system": {
"root": "系统管理", "root": "系统管理",
"user": "用户管理", "user": "用户管理",

View File

@ -43,12 +43,16 @@ const [BasicForm, formApi] = useVbenForm({
async function setupMenuSelect() { async function setupMenuSelect() {
// menu // menu
const menuArray = await menuList(); const menuArray = await menuList();
// support i18n
menuArray.forEach((item) => {
item.menuName = $t(item.menuName);
});
// const folderArray = menuArray.filter((item) => item.menuType === 'M'); // const folderArray = menuArray.filter((item) => item.menuType === 'M');
const menuTree = listToTree(menuArray, { id: 'menuId', pid: 'parentId' }); const menuTree = listToTree(menuArray, { id: 'menuId', pid: 'parentId' });
const fullMenuTree = [ const fullMenuTree = [
{ {
menuId: 0, menuId: 0,
menuName: '根目录', menuName: $t('menu.root'),
children: menuTree, children: menuTree,
}, },
]; ];

View File

@ -4,6 +4,7 @@ import type { Column, GenInfo } from '#/api/tool/gen/model';
import { inject, onMounted, type Ref } from 'vue'; import { inject, onMounted, type Ref } from 'vue';
import { useVbenForm } from '@vben/common-ui'; import { useVbenForm } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { addFullName, listToTree } from '@vben/utils'; import { addFullName, listToTree } from '@vben/utils';
import { Col, Row } from 'ant-design-vue'; import { Col, Row } from 'ant-design-vue';
@ -66,12 +67,16 @@ async function initTreeSelect(columns: Column[]) {
*/ */
async function initMenuSelect() { async function initMenuSelect() {
const list = await menuList(); const list = await menuList();
// support i18n
list.forEach((item) => {
item.menuName = $t(item.menuName);
});
const tree = listToTree(list, { id: 'menuId', pid: 'parentId' }); const tree = listToTree(list, { id: 'menuId', pid: 'parentId' });
const treeData = [ const treeData = [
{ {
fullName: '根目录', fullName: $t('menu.root'),
menuId: 0, menuId: 0,
menuName: '根目录', menuName: $t('menu.root'),
children: tree, children: tree,
}, },
]; ];

13
apps/web-antd/types/directive.d.ts vendored Normal file
View File

@ -0,0 +1,13 @@
import type { Directive } from 'vue';
declare module 'vue' {
export interface ComponentCustomProperties {
/**
* 判断权限: v-access:code=""
* v-access:role=""
* VueOfficial插件暂时不支持判断modifer/arg
* @see https://github.com/vuejs/language-tools/issues/4810
*/
vAccess: Directive<Element, string | string[]>;
}
}