feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
* Mock数据生成器
|
||||
* 基于API文档定义生成符合规范的模拟数据
|
||||
*/
|
||||
|
||||
import type { Result, User, Role, Menu, OperationLog } from '@/types';
|
||||
|
||||
// 生成模拟用户数据
|
||||
export const generateMockUser = (id?: number): User => {
|
||||
const userId = id || Math.floor(Math.random() * 10000) + 1;
|
||||
return {
|
||||
id: userId,
|
||||
username: `user${userId}`,
|
||||
email: `user${userId}@example.com`,
|
||||
phone: `138${Math.random().toString().substring(2, 11).padEnd(11, '0').substring(0, 9)}`,
|
||||
nickname: `昵称${userId}`,
|
||||
status: Math.random() > 0.5 ? 'ENABLED' : 'DISABLED',
|
||||
remark: `用户${userId}的备注`,
|
||||
createBy: 'admin',
|
||||
updateBy: 'admin',
|
||||
createdAt: new Date(Date.now() - Math.random() * 10000000000).toISOString(),
|
||||
updatedAt: new Date().toISOString(),
|
||||
permissions: ['user:view', 'user:edit'],
|
||||
roles: []
|
||||
};
|
||||
};
|
||||
|
||||
// 生成模拟角色数据
|
||||
export const generateMockRole = (id?: number): Role => {
|
||||
const roleId = id || Math.floor(Math.random() * 1000) + 1;
|
||||
return {
|
||||
id: roleId,
|
||||
name: `角色${roleId}`,
|
||||
roleKey: `role${roleId}`,
|
||||
description: `角色${roleId}的描述`,
|
||||
status: Math.random() > 0.5 ? 'ENABLED' : 'DISABLED',
|
||||
sortOrder: Math.floor(Math.random() * 100),
|
||||
remark: `角色${roleId}的备注`,
|
||||
menuIds: [],
|
||||
createdAt: new Date(Date.now() - Math.random() * 10000000000).toISOString(),
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
};
|
||||
|
||||
// 生成模拟菜单数据
|
||||
export const generateMockMenu = (id?: number, parentId?: number): Menu => {
|
||||
const menuId = id || Math.floor(Math.random() * 1000) + 1;
|
||||
return {
|
||||
id: menuId,
|
||||
name: `菜单${menuId}`,
|
||||
code: `menu${menuId}`,
|
||||
path: `/menu${menuId}`,
|
||||
icon: 'MenuOutlined',
|
||||
parentId: parentId || 0,
|
||||
sortOrder: Math.floor(Math.random() * 100),
|
||||
status: Math.random() > 0.5 ? 'ENABLED' : 'DISABLED',
|
||||
component: `views/Menu${menuId}.vue`,
|
||||
redirect: '',
|
||||
description: `菜单${menuId}的描述`,
|
||||
children: [],
|
||||
createdAt: new Date(Date.now() - Math.random() * 10000000000).toISOString(),
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
};
|
||||
|
||||
// 生成模拟操作日志数据
|
||||
export const generateMockOperationLog = (id?: number): OperationLog => {
|
||||
const logId = id || Math.floor(Math.random() * 10000) + 1;
|
||||
const modules = ['用户管理', '角色管理', '菜单管理', '权限管理', '操作日志', '系统设置'];
|
||||
const operations = ['查询', '新增', '修改', '删除', '导出', '导入', '登录', '登出'];
|
||||
const methods = ['GET', 'POST', 'PUT', 'DELETE'];
|
||||
const paths = ['/sys/user/query', '/sys/user/create', '/sys/user/update', '/sys/user/delete', '/sys/role/query', '/sys/role/create', '/sys/menu/query', '/sys/operationLog/query'];
|
||||
const statuses = ['success', 'error'];
|
||||
const status = statuses[Math.floor(Math.random() * statuses.length)];
|
||||
const isError = status === 'error';
|
||||
|
||||
return {
|
||||
id: logId,
|
||||
userId: Math.floor(Math.random() * 10) + 1,
|
||||
username: `user${Math.floor(Math.random() * 10) + 1}`,
|
||||
module: modules[Math.floor(Math.random() * modules.length)],
|
||||
operation: operations[Math.floor(Math.random() * operations.length)],
|
||||
method: methods[Math.floor(Math.random() * methods.length)],
|
||||
path: paths[Math.floor(Math.random() * paths.length)],
|
||||
params: JSON.stringify({
|
||||
page: Math.floor(Math.random() * 10) + 1,
|
||||
pageSize: 10,
|
||||
username: `user${Math.floor(Math.random() * 10) + 1}`
|
||||
}),
|
||||
ip: `192.168.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`,
|
||||
status,
|
||||
errorMsg: isError ? '操作失败:权限不足或参数错误' : undefined,
|
||||
duration: Math.floor(Math.random() * 1000) + 10,
|
||||
createdAt: new Date(Date.now() - Math.random() * 10000000000).toISOString()
|
||||
};
|
||||
};
|
||||
|
||||
// 生成分页结果
|
||||
export const generatePageResult = <T>(data: T[], current: number = 1, pageSize: number = 10) => {
|
||||
const start = (current - 1) * pageSize;
|
||||
const end = start + pageSize;
|
||||
const records = data.slice(start, end);
|
||||
|
||||
return {
|
||||
records,
|
||||
total: data.length,
|
||||
current,
|
||||
size: pageSize
|
||||
};
|
||||
};
|
||||
|
||||
// 模拟成功响应
|
||||
export const successResponse = <T>(data: T, message: string = 'Success'): Result<T> => {
|
||||
return {
|
||||
code: '200',
|
||||
message,
|
||||
data
|
||||
};
|
||||
};
|
||||
|
||||
// 模拟错误响应
|
||||
export const errorResponse = <T = any>(code: string = '500', message: string = 'Error'): Result<T> => {
|
||||
return {
|
||||
code,
|
||||
message,
|
||||
data: null as unknown as T
|
||||
};
|
||||
};
|
||||
|
||||
// 生成随机延迟
|
||||
export const randomDelay = (min: number = 200, max: number = 800) => {
|
||||
const delay = Math.random() * (max - min) + min;
|
||||
return new Promise(resolve => setTimeout(resolve, delay));
|
||||
};
|
||||
Reference in New Issue
Block a user