| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- import type { MockMethod } from "vite-plugin-mock";
- // 模拟聊天记录存储(内存中)
- interface ChatMessage {
- id: string;
- role: 'user' | 'assistant';
- content: string;
- time: string;
- }
- // 生成模拟历史聊天记录
- const generateMockChatHistory = (): ChatMessage[] => {
- const history: ChatMessage[] = [
- {
- id: '1',
- role: 'assistant',
- content: '您好!我是您的 AI 智能助手,有什么可以帮助您的吗?',
- time: new Date(Date.now() - 86400000 * 2).toLocaleString()
- },
- {
- id: '2',
- role: 'user',
- content: '如何管理系统用户?',
- time: new Date(Date.now() - 86400000 * 2 + 60000).toLocaleString()
- },
- {
- id: '3',
- role: 'assistant',
- content: '系统用户管理在「用户管理」菜单中,您可以进行以下操作:\n1. 查看用户列表\n2. 添加新用户\n3. 编辑用户信息\n4. 禁用/启用用户账号',
- time: new Date(Date.now() - 86400000 * 2 + 120000).toLocaleString()
- },
- {
- id: '4',
- role: 'user',
- content: '系统有哪些功能模块?',
- time: new Date(Date.now() - 86400000).toLocaleString()
- },
- {
- id: '5',
- role: 'assistant',
- content: '本系统包含以下功能模块:\n- 仪表盘:数据概览\n- 用户管理:系统用户管理\n- 系统管理:菜单、角色管理\n- 数据统计:报表分析\n- AI 助手:智能问答',
- time: new Date(Date.now() - 86400000 + 60000).toLocaleString()
- },
- {
- id: '6',
- role: 'user',
- content: '如何导出数据报表?',
- time: new Date(Date.now() - 43200000).toLocaleString()
- },
- {
- id: '7',
- role: 'assistant',
- content: '导出数据报表步骤:\n1. 进入「数据统计」页面\n2. 选择查询条件\n3. 点击「导出」按钮\n4. 选择导出格式(Excel/PDF)\n5. 下载生成的报表文件',
- time: new Date(Date.now() - 43200000 + 60000).toLocaleString()
- },
- {
- id: '8',
- role: 'user',
- content: '如何配置菜单权限?',
- time: new Date(Date.now() - 3600000).toLocaleString()
- },
- {
- id: '9',
- role: 'assistant',
- content: '菜单权限配置在「系统管理 > 菜单管理」中:\n1. 创建菜单项\n2. 设置菜单图标和路径\n3. 为角色分配菜单权限\n4. 保存后权限即时生效',
- time: new Date(Date.now() - 3600000 + 60000).toLocaleString()
- },
- {
- id: '10',
- role: 'user',
- content: '如何修改个人资料?',
- time: new Date(Date.now() - 1800000).toLocaleString()
- },
- {
- id: '11',
- role: 'assistant',
- content: '修改个人资料:\n1. 点击右上角用户名\n2. 选择「个人中心」\n3. 编辑个人信息\n4. 点击「保存」按钮',
- time: new Date(Date.now() - 1800000 + 60000).toLocaleString()
- },
- {
- id: '12',
- role: 'user',
- content: '帮助',
- time: new Date(Date.now() - 900000).toLocaleString()
- },
- {
- id: '13',
- role: 'assistant',
- content: '我可以帮您:\n- 解答系统使用问题\n- 提供操作指导\n- 解释功能说明\n请直接输入您的问题!',
- time: new Date(Date.now() - 900000 + 60000).toLocaleString()
- }
- ];
- return history;
- };
- const chatHistory: ChatMessage[] = generateMockChatHistory();
- export default [
- // 登录接口
- {
- url: "/api/upms/auth/login",
- method: "post",
- response: ({ body }) => {
- const { username, password } = body;
- if (username === "admin" && password === "123456") {
- return {
- code: 200,
- message: "登录成功",
- data: {
- token: "mock_token_" + Date.now(),
- userInfo: {
- id: "1",
- username: "admin",
- nickname: "管理员",
- avatar: "",
- roles: ["admin"],
- },
- },
- };
- }
- return {
- code: 401,
- message: "用户名或密码错误",
- data: null,
- };
- },
- },
- // 获取用户信息
- {
- url: "/api/upms/user/info",
- method: "get",
- response: () => {
- return {
- code: 200,
- message: "success",
- data: {
- id: "1",
- username: "admin",
- nickname: "管理员",
- avatar: "",
- roles: ["admin"],
- email: "admin@example.com",
- phone: "13800138000",
- },
- };
- },
- },
- // 获取菜单列表
- {
- url: "/api/upms/menu/list",
- method: "get",
- response: () => {
- return {
- code: 200,
- message: "success",
- data: [
- {
- id: "1",
- name: "仪表盘",
- path: "/dashboard",
- icon: "Odometer",
- },
- {
- id: "2",
- name: "用户管理",
- path: "/user",
- icon: "User",
- },
- {
- id: "3",
- name: "系统管理",
- path: "/system",
- icon: "Setting",
- children: [
- {
- id: "3-1",
- name: "菜单管理",
- path: "/system/menu",
- icon: "Menu",
- },
- {
- id: "3-2",
- name: "角色管理",
- path: "/system/role",
- icon: "UserFilled",
- },
- ],
- },
- {
- id: "4",
- name: "数据统计",
- path: "/statistics",
- icon: "TrendCharts",
- },
- {
- id: "5",
- name: "AI 助手",
- path: "/ai-chat",
- icon: "ChatDotRound",
- },
- {
- id: "6",
- name: "文件管理",
- path: "/file",
- icon: "Folder",
- },
- ],
- };
- },
- },
- // 用户列表
- {
- url: "/api/upms/user/list",
- method: "get",
- response: ({ query }) => {
- const { page = 1, size = 10 } = query;
- // 生成模拟数据
- const list = Array.from({ length: size }, (_, i) => ({
- id: String((page - 1) * size + i + 1),
- username: `user${(page - 1) * size + i + 1}`,
- nickname: `用户${(page - 1) * size + i + 1}`,
- email: `user${(page - 1) * size + i + 1}@example.com`,
- status: Math.random() > 0.3 ? 1 : 0,
- createTime: "2024-01-01 12:00:00",
- }));
- return {
- code: 200,
- message: "success",
- data: {
- list,
- total: 100,
- },
- };
- },
- },
- // 退出登录
- {
- url: "/api/upms/auth/logout",
- method: "post",
- response: () => {
- return {
- code: 200,
- message: "退出成功",
- data: null,
- };
- },
- },
- // 获取聊天记录列表(分页)
- {
- url: "/api/upms/ai/chat/history",
- method: "get",
- response: ({ query }) => {
- const page = parseInt(query.page as string) || 1;
- const size = parseInt(query.size as string) || 10;
- // 计算分页
- const total = chatHistory.length;
- const start = (page - 1) * size;
- const end = start + size;
- const list = chatHistory.slice(start, end);
- return {
- code: 200,
- message: "success",
- data: {
- list,
- total,
- page,
- size,
- hasMore: end < total
- }
- };
- },
- },
- // AI 对话接口 (POST - 返回 JSON,适用于代理模式)
- {
- url: "/api/upms/ai/chat",
- method: "post",
- response: ({ body }) => {
- const { question } = body;
- // AI 回复知识库
- const knowledgeBase: Record<string, string> = {
- "如何管理系统用户?": "系统用户管理在「用户管理」菜单中,您可以进行以下操作:\n1. 查看用户列表\n2. 添加新用户\n3. 编辑用户信息\n4. 禁用/启用用户账号",
- "如何配置菜单权限?": "菜单权限配置在「系统管理 > 菜单管理」中:\n1. 创建菜单项\n2. 设置菜单图标和路径\n3. 为角色分配菜单权限\n4. 保存后权限即时生效",
- "系统有哪些功能模块?": "本系统包含以下功能模块:\n- 仪表盘:数据概览\n- 用户管理:系统用户管理\n- 系统管理:菜单、角色管理\n- 数据统计:报表分析\n- AI 助手:智能问答",
- "如何导出数据报表?": "导出数据报表步骤:\n1. 进入「数据统计」页面\n2. 选择查询条件\n3. 点击「导出」按钮\n4. 选择导出格式(Excel/PDF)\n5. 下载生成的报表文件",
- "如何修改个人资料?": "修改个人资料:\n1. 点击右上角用户名\n2. 选择「个人中心」\n3. 编辑个人信息\n4. 点击「保存」按钮",
- "你好": "您好!很高兴为您服务,请问有什么可以帮助您的?",
- "帮助": "我可以帮您:\n- 解答系统使用问题\n- 提供操作指导\n- 解释功能说明\n请直接输入您的问题!"
- };
- // 查找回复
- let reply = '';
- for (const key in knowledgeBase) {
- if (question.includes(key) || key.includes(question)) {
- reply = knowledgeBase[key];
- break;
- }
- }
- // 默认回复
- if (!reply) {
- reply = `感谢您的提问!关于"${question}",我建议您:\n\n1. 查看相关功能模块的说明文档\n2. 联系系统管理员获取帮助\n3. 或者尝试在快捷问题中寻找类似问题\n\n如果您需要更详细的帮助,请联系技术支持。`;
- }
- return {
- code: 200,
- message: "success",
- data: { reply }
- };
- },
- },
- // AI 对话接口 (GET - SSE 流式输出,适用于 Mock 模式)
- {
- url: "/api/upms/ai/chat",
- method: "get",
- rawResponse: async (req, res) => {
- // 从 query 参数获取问题
- const url = new URL(req.url || '', `http://${req.headers.host}`);
- const question = url.searchParams.get('question') || '';
- // AI 回复知识库
- const knowledgeBase: Record<string, string> = {
- "如何管理系统用户?": "系统用户管理在「用户管理」菜单中,您可以进行以下操作:\n1. 查看用户列表\n2. 添加新用户\n3. 编辑用户信息\n4. 禁用/启用用户账号",
- "如何配置菜单权限?": "菜单权限配置在「系统管理 > 菜单管理」中:\n1. 创建菜单项\n2. 设置菜单图标和路径\n3. 为角色分配菜单权限\n4. 保存后权限即时生效",
- "系统有哪些功能模块?": "本系统包含以下功能模块:\n- 仪表盘:数据概览\n- 用户管理:系统用户管理\n- 系统管理:菜单、角色管理\n- 数据统计:报表分析\n- AI 助手:智能问答",
- "如何导出数据报表?": "导出数据报表步骤:\n1. 进入「数据统计」页面\n2. 选择查询条件\n3. 点击「导出」按钮\n4. 选择导出格式(Excel/PDF)\n5. 下载生成的报表文件",
- "如何修改个人资料?": "修改个人资料:\n1. 点击右上角用户名\n2. 选择「个人中心」\n3. 编辑个人信息\n4. 点击「保存」按钮",
- "你好": "您好!很高兴为您服务,请问有什么可以帮助您的?",
- "帮助": "我可以帮您:\n- 解答系统使用问题\n- 提供操作指导\n- 解释功能说明\n请直接输入您的问题!"
- };
- // 查找回复
- let reply = '';
- for (const key in knowledgeBase) {
- if (question.includes(key) || key.includes(question)) {
- reply = knowledgeBase[key];
- break;
- }
- }
- // 默认回复
- if (!reply) {
- reply = `感谢您的提问!关于"${question}",我建议您:\n\n1. 查看相关功能模块的说明文档\n2. 联系系统管理员获取帮助\n3. 或者尝试在快捷问题中寻找类似问题\n\n如果您需要更详细的帮助,请联系技术支持。`;
- }
- // 设置 SSE 响应头
- res.setHeader('Content-Type', 'text/event-stream');
- res.setHeader('Cache-Control', 'no-cache');
- res.setHeader('Connection', 'keep-alive');
- // 流式发送回复,每个字延迟 50ms
- const chars = reply.split('');
- for (let i = 0; i < chars.length; i++) {
- const data = {
- content: chars[i],
- index: i,
- total: chars.length,
- done: i === chars.length - 1
- };
- res.write(`data: ${JSON.stringify(data)}\n\n`);
- await new Promise(resolve => setTimeout(resolve, 50));
- }
- res.end();
- },
- },
- // ========== 文件管理接口 ==========
- // 获取文件列表
- {
- url: "/api/file/list",
- method: "get",
- response: ({ query }) => {
- const page = parseInt(query.page as string) || 1;
- const size = parseInt(query.size as string) || 10;
- const filename = (query.filename as string) || '';
- const fileType = (query.fileType as string) || '';
- // 模拟文件数据
- const allFiles = [
- { id: '1', filename: '项目需求文档.pdf', fileType: 'document', size: 2048576, uploader: '张三', uploadTime: '2026-03-15 10:30:00', url: '' },
- { id: '2', filename: '产品原型图.png', fileType: 'image', size: 512000, uploader: '李四', uploadTime: '2026-03-15 09:15:00', url: 'https://via.placeholder.com/800x600.png?text=Product+Prototype' },
- { id: '3', filename: '会议记录.docx', fileType: 'document', size: 102400, uploader: '王五', uploadTime: '2026-03-14 16:45:00', url: '' },
- { id: '4', filename: '演示视频.mp4', fileType: 'video', size: 52428800, uploader: '赵六', uploadTime: '2026-03-14 14:20:00', url: '' },
- { id: '5', filename: '背景音乐.mp3', fileType: 'audio', size: 3145728, uploader: '孙七', uploadTime: '2026-03-13 11:00:00', url: '' },
- { id: '6', filename: '数据库备份.sql', fileType: 'other', size: 10485760, uploader: '张三', uploadTime: '2026-03-13 09:30:00', url: '' },
- { id: '7', filename: '系统架构图.jpg', fileType: 'image', size: 1536000, uploader: '李四', uploadTime: '2026-03-12 15:20:00', url: 'https://via.placeholder.com/800x600.png?text=Architecture' },
- { id: '8', filename: 'API文档.pdf', fileType: 'document', size: 3145728, uploader: '王五', uploadTime: '2026-03-12 10:00:00', url: '' },
- { id: '9', filename: '测试报告.xlsx', fileType: 'document', size: 512000, uploader: '赵六', uploadTime: '2026-03-11 16:30:00', url: '' },
- { id: '10', filename: '部署脚本.sh', fileType: 'other', size: 10240, uploader: '孙七', uploadTime: '2026-03-11 09:00:00', url: '' },
- { id: '11', filename: '用户手册.pdf', fileType: 'document', size: 4194304, uploader: '张三', uploadTime: '2026-03-10 14:00:00', url: '' },
- { id: '12', filename: '团队合影.jpg', fileType: 'image', size: 2621440, uploader: '李四', uploadTime: '2026-03-10 10:30:00', url: 'https://via.placeholder.com/800x600.png?text=Team+Photo' },
- ];
- // 筛选
- let filteredFiles = allFiles.filter(file => {
- const matchName = filename ? file.filename.toLowerCase().includes(filename.toLowerCase()) : true;
- const matchType = fileType ? file.fileType === fileType : true;
- return matchName && matchType;
- });
- // 分页
- const total = filteredFiles.length;
- const start = (page - 1) * size;
- const end = start + size;
- const list = filteredFiles.slice(start, end);
- return {
- code: 200,
- message: "success",
- data: {
- list,
- total,
- page,
- size
- }
- };
- },
- },
- // 上传文件
- {
- url: "/api/file/upload",
- method: "post",
- response: () => {
- return {
- code: 200,
- message: "上传成功",
- data: {
- id: String(Date.now()),
- filename: '新上传文件.pdf',
- fileType: 'document',
- size: 1024000,
- uploader: 'admin',
- uploadTime: new Date().toLocaleString(),
- url: ''
- }
- };
- },
- },
- // 删除文件
- {
- url: "/api/file/delete",
- method: "delete",
- response: () => {
- return {
- code: 200,
- message: "删除成功",
- data: null
- };
- },
- },
- // 下载文件
- {
- url: "/api/file/download",
- method: "get",
- rawResponse: async (req, res) => {
- const url = new URL(req.url || '', `http://${req.headers.host}`);
- const id = url.searchParams.get('id') || 'unknown';
- const filename = `file_${id}.txt`;
- res.setHeader('Content-Type', 'application/octet-stream');
- res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
- res.write('This is a mock file content for download.');
- res.end();
- },
- },
- ] as MockMethod[];
|