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 = { "如何管理系统用户?": "系统用户管理在「用户管理」菜单中,您可以进行以下操作:\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 = { "如何管理系统用户?": "系统用户管理在「用户管理」菜单中,您可以进行以下操作:\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[];