feat: 完善平台总后台模块

This commit is contained in:
2026-07-27 00:18:42 +08:00
parent 073eb89762
commit 642980960e
197 changed files with 22356 additions and 1060 deletions

View File

@@ -0,0 +1,88 @@
import Mock from 'mockjs';
import setupMock, { successResponseWrap } from '@/mocks/setup';
const haveReadIds: number[] = [];
const getMessageList = () => {
return [
{
id: 1,
type: 'message',
title: '\u90d1\u6666\u6708',
subTitle: '\u7684\u79c1\u4fe1',
avatar:
'//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/8361eeb82904210b4f55fab888fe8416.png~tplv-uwbnlip3yd-webp.webp',
content: '\u5ba1\u6279\u8bf7\u6c42\u5df2\u53d1\u9001\uff0c\u8bf7\u67e5\u6536',
time: '\u4eca\u5929 12:30:01',
},
{
id: 2,
type: 'message',
title: '\u5b81\u6ce2',
subTitle: '\u7684\u56de\u590d',
avatar:
'//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp',
content: '\u6b64\u5904 bug \u5df2\u7ecf\u4fee\u590d',
time: '\u4eca\u5929 12:30:01',
},
{
id: 3,
type: 'message',
title: '\u5b81\u6ce2',
subTitle: '\u7684\u56de\u590d',
avatar:
'//p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp',
content: '\u6b64\u5904 bug \u5df2\u7ecf\u4fee\u590d',
time: '\u4eca\u5929 12:20:01',
},
{
id: 4,
type: 'notice',
title: '\u7eed\u8d39\u901a\u77e5',
subTitle: '',
avatar: '',
content:
'\u60a8\u7684\u4ea7\u54c1\u4f7f\u7528\u671f\u9650\u5373\u5c06\u622a\u6b62\uff0c\u5982\u9700\u7ee7\u7eed\u4f7f\u7528\u4ea7\u54c1\u8bf7\u524d\u5f80\u8d2d\u4e70',
time: '\u4eca\u5929 12:20:01',
messageType: 3,
},
{
id: 5,
type: 'notice',
title: '\u89c4\u5219\u5f00\u901a\u6210\u529f',
subTitle: '',
avatar: '',
content:
'\u5185\u5bb9\u5c4f\u853d\u89c4\u5219\u4e8e 2021-12-01 \u5f00\u901a\u6210\u529f\u5e76\u751f\u6548',
time: '\u4eca\u5929 12:20:01',
messageType: 1,
},
{
id: 6,
type: 'todo',
title: '\u8d28\u68c0\u961f\u5217\u53d8\u66f4',
subTitle: '',
avatar: '',
content:
'\u5185\u5bb9\u8d28\u68c0\u961f\u5217\u4e8e 2021-12-01 19:50:23 \u8fdb\u884c\u53d8\u66f4\uff0c\u8bf7\u91cd\u65b0\u63d0\u4ea4',
time: '\u4eca\u5929 12:20:01',
messageType: 0,
},
].map((item) => ({
...item,
status: haveReadIds.indexOf(item.id) === -1 ? 0 : 1,
}));
};
setupMock({
setup: () => {
Mock.mock(/\/api\/message\/list/, () => {
return successResponseWrap(getMessageList());
});
Mock.mock(/\/api\/message\/read/, (params: { body: string }) => {
const { ids } = JSON.parse(params.body);
haveReadIds.push(...(ids || []));
return successResponseWrap(true);
});
},
});

View File

@@ -0,0 +1,104 @@
import Mock from 'mockjs';
import { DEFAULT_USER_AVATAR } from '@/constants/avatar';
import { isLogin } from '@/utils/auth';
import setupMock, {
failResponseWrap,
successResponseWrap,
} from '@/mocks/setup';
export interface MockParams {
url: string;
type: string;
body: string;
}
setupMock({
setup() {
Mock.mock(/\/api\/user\/info/, () => {
if (isLogin()) {
const role = window.localStorage.getItem('userRole') || 'admin';
return successResponseWrap({
name: 'admin',
avatar: DEFAULT_USER_AVATAR,
email: 'wangliqun@email.com',
job: 'frontend',
jobName: '\u524d\u7aef\u827a\u672f\u5bb6',
organization: 'Frontend',
organizationName: '\u524d\u7aef',
location: 'beijing',
locationName: '\u5317\u4eac',
introduction: '\u4eba\u7206\u723d\uff0c\u6027\u6e29\u7eaf',
personalWebsite: 'https://www.arco.design',
phone: '150****0000',
registrationDate: '2013-05-10 12:10:00',
accountId: '15012312300',
certification: 1,
role,
});
}
return failResponseWrap(null, '\u672a\u767b\u5f55', 50008);
});
Mock.mock(/\/api\/user\/login/, (params: MockParams) => {
const { username, password } = JSON.parse(params.body);
if (!username) {
return failResponseWrap(
null,
'\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a',
50000,
);
}
if (!password) {
return failResponseWrap(null, '\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a', 50000);
}
if (username === 'admin' && password === 'admin') {
window.localStorage.setItem('userRole', 'admin');
return successResponseWrap({ token: '12345' });
}
if (username === 'user' && password === 'user') {
window.localStorage.setItem('userRole', 'user');
return successResponseWrap({ token: '54321' });
}
return failResponseWrap(
null,
'\u8d26\u53f7\u6216\u8005\u5bc6\u7801\u9519\u8bef',
50000,
);
});
Mock.mock(/\/api\/user\/logout/, () => successResponseWrap(null));
Mock.mock(/\/api\/user\/menu/, () => {
const menuList = [
{
path: '/dashboard',
name: 'dashboard',
meta: {
locale: 'menu.server.dashboard',
requiresAuth: true,
icon: 'icon-dashboard',
order: 1,
},
children: [
{
path: 'workplace',
name: 'Workplace',
meta: {
locale: 'menu.server.workplace',
requiresAuth: true,
},
},
{
path: 'https://arco.design',
name: 'arcoWebsite',
meta: {
locale: 'menu.arcoWebsite',
requiresAuth: true,
},
},
],
},
];
return successResponseWrap(menuList);
});
},
});

View File

@@ -0,0 +1,9 @@
import Mock from 'mockjs';
import './handlers/user';
import './handlers/message-box';
import.meta.glob('@/views/**/mock.ts', { eager: true });
Mock.setup({
timeout: '600-1000',
});

View File

@@ -0,0 +1,27 @@
import debug from '@/utils/env';
export default ({ mock, setup }: { mock?: boolean; setup: () => void }) => {
if (mock !== false && debug) setup();
};
export const successResponseWrap = (data: unknown) => {
return {
data,
status: 'ok',
msg: '请求成功',
code: 20000,
};
};
export const failResponseWrap = (
data: unknown,
msg: string,
code = 50000,
) => {
return {
data,
status: 'fail',
msg,
code,
};
};