Переглянути джерело

feat: 新增应用管理、认证、审核、首页统计 Mock API

Ryuiso 1 місяць тому
батько
коміт
0445b194cb

+ 21 - 5
jk-rag-platform/src/apis/api.ts

@@ -32,6 +32,10 @@ import {
     mockFetchChatHistoryList,
     mockExportChatHistory,
 } from '@/mock/knowledgeApi';
+import { applicationMockHandlers } from '@/mock/applicationApi';
+import { authMockHandlers } from '@/mock/authApi';
+import { auditMockHandlers } from '@/mock/auditApi';
+import { overviewMockHandlers } from '@/mock/overviewApi';
 
 const encryptHeader = 'encrypt-key';
 
@@ -53,7 +57,7 @@ const mockHandlerMap: Record<string, Function> = {
     'PUT /bigmodel/api/updateKnowledge': mockModifyKnowledgeLib,
     'DELETE /bigmodel/api/delKnowledge': mockDeleteKnowledgeLib,
     'GET /bigmodel/api/embedding': mockFetchEmbeddingList,
-    
+
     // 文档管理相关
     'POST /bigmodel/api/documentList': mockFetchDocumentLibList,
     'GET /bigmodel/api/documentDetail': mockFetchDocumentLibDetail,
@@ -62,30 +66,42 @@ const mockHandlerMap: Record<string, Function> = {
     'POST /bigmodel/api/uploadDocument': mockUploadDocument,
     'GET /bigmodel/api/documentSetting': mockFetchDocumentSetting,
     'PUT /bigmodel/api/updateDocumentSetting': mockModifyDocumentSetting,
-    
+
     // 切片管理相关
     'POST /bigmodel/api/getSliceList': mockFetchSliceList,
     'GET /bigmodel/api/getSliceDetail': mockFetchSliceDetail,
     'POST /bigmodel/api/add/slice': mockAddSlice,
     'PUT /bigmodel/api/updateSliceInfo': mockModifySlice,
     'DELETE /bigmodel/api/deleteSlice': mockDeleteSlice,
-    
+
     // 修订工具相关
     'GET /deepseek/revise/pageList': mockFetchReviseToolList,
     'GET /deepseek/revise/list': mockFetchReviseToolAllList,
     'GET /deepseek/revise/sliceList': mockFetchReviseToolSliceList,
     'PUT /deepseek/revise/reviseSlice': mockSubmitReviseSlice,
     'GET /deepseek/revise/reviseHistoryList': mockFetchReviseHistoryList,
-    
+
     // 字典数据相关
     'GET /deepseek/api/standard_classification': () => mockFetchTakaiAppTypeList('standard_classification'),
     'GET /deepseek/api/parsing_type': () => mockFetchTakaiAppTypeList('parsing_type'),
     'GET /deepseek/api/splitting_type': () => mockFetchTakaiAppTypeList('splitting_type'),
     'GET /deepseek/api/revision_status': () => mockFetchTakaiAppTypeList('revision_status'),
-    
+
     // 聊天记录相关
     'POST /bigmodel/api/chatHistory/list': mockFetchChatHistoryList,
     'POST /bigmodel/api/dialog/export': mockExportChatHistory,
+
+    // 应用管理相关
+    ...applicationMockHandlers,
+
+    // 认证与用户相关
+    ...authMockHandlers,
+
+    // 审核管理相关
+    ...auditMockHandlers,
+
+    // 首页统计相关
+    ...overviewMockHandlers,
 };
 
 // 请求拦截器

+ 416 - 0
jk-rag-platform/src/mock/applicationApi.ts

@@ -0,0 +1,416 @@
+import { MockRequest } from './index';
+
+// ==================== 应用管理 Mock 数据 ====================
+
+// 应用分类
+const appCategories = [
+    { value: 'professional', label: '专业知识' },
+    { value: 'functional', label: '职能管理' },
+    { value: 'project', label: '项目级应用' },
+];
+
+// 应用状态
+const appStatuses = [
+    { value: 'online', label: '已上线' },
+    { value: 'offline', label: '已下线' },
+    { value: 'auditing', label: '审核中' },
+    { value: 'rejected', label: '已拒绝' },
+];
+
+// 模拟应用数据
+const mockApplicationsData = [
+    {
+        id: 'app_001',
+        name: '合同审查助手',
+        description: '基于 RAG 技术的智能合同审查与风险提示工具',
+        category: 'professional',
+        status: 'online',
+        creatorId: 'user_001',
+        creator: '张三',
+        maintainers: ['张三', '李四'],
+        createdAt: '2025-12-15 10:30:00',
+        updatedAt: '2026-01-05 14:20:00',
+        icon: 'contract',
+        tags: ['合同管理', '风险提示', '法律'],
+        knowledgeBaseCount: 3,
+        conversationCount: 1250,
+        avatar: '',
+    },
+    {
+        id: 'app_002',
+        name: '人力资源问答机器人',
+        description: '员工自助服务平台,解答人事、考勤、福利等问题',
+        category: 'functional',
+        status: 'online',
+        creatorId: 'user_002',
+        creator: '李四',
+        maintainers: ['李四'],
+        createdAt: '2025-12-20 09:15:00',
+        updatedAt: '2026-01-08 11:45:00',
+        icon: 'hr',
+        tags: ['人力资源', '员工服务'],
+        knowledgeBaseCount: 2,
+        conversationCount: 890,
+        avatar: '',
+    },
+    {
+        id: 'app_003',
+        name: '项目管理智能助手',
+        description: '项目进度跟踪、风险预警、资源调配建议',
+        category: 'project',
+        status: 'online',
+        creatorId: 'user_003',
+        creator: '王五',
+        maintainers: ['王五', '赵六'],
+        createdAt: '2026-01-02 13:20:00',
+        updatedAt: '2026-01-10 16:30:00',
+        icon: 'project',
+        tags: ['项目管理', '进度跟踪'],
+        knowledgeBaseCount: 5,
+        conversationCount: 567,
+        avatar: '',
+    },
+    {
+        id: 'app_004',
+        name: '财务报销助手',
+        description: '智能解答财务报销流程、发票规范、费用标准等问题',
+        category: 'functional',
+        status: 'online',
+        creatorId: 'user_004',
+        creator: '赵六',
+        maintainers: ['赵六'],
+        createdAt: '2026-01-05 10:00:00',
+        updatedAt: '2026-01-12 09:15:00',
+        icon: 'finance',
+        tags: ['财务管理', '报销'],
+        knowledgeBaseCount: 2,
+        conversationCount: 432,
+        avatar: '',
+    },
+    {
+        id: 'app_005',
+        name: '技术培训知识库',
+        description: '技术人员在线学习平台,提供技术文档、培训资料查询',
+        category: 'professional',
+        status: 'online',
+        creatorId: 'user_005',
+        creator: '钱七',
+        maintainers: ['钱七', '孙八'],
+        createdAt: '2026-01-08 14:30:00',
+        updatedAt: '2026-01-15 10:20:00',
+        icon: 'tech',
+        tags: ['技术培训', '知识管理'],
+        knowledgeBaseCount: 8,
+        conversationCount: 1580,
+        avatar: '',
+    },
+    {
+        id: 'app_006',
+        name: '安全生产管理系统',
+        description: '安全生产规范、应急预案、事故案例分析',
+        category: 'project',
+        status: 'auditing',
+        creatorId: 'user_006',
+        creator: '孙八',
+        maintainers: ['孙八'],
+        createdAt: '2026-01-10 11:00:00',
+        updatedAt: '2026-01-16 15:45:00',
+        icon: 'safety',
+        tags: ['安全生产', '应急管理'],
+        knowledgeBaseCount: 4,
+        conversationCount: 0,
+        avatar: '',
+    },
+    {
+        id: 'app_007',
+        name: '市场营销支持平台',
+        description: '市场数据分析、竞品调研、营销策略建议',
+        category: 'functional',
+        status: 'offline',
+        creatorId: 'user_007',
+        creator: '周九',
+        maintainers: ['周九', '吴十'],
+        createdAt: '2025-11-20 09:30:00',
+        updatedAt: '2025-12-25 16:00:00',
+        icon: 'marketing',
+        tags: ['市场营销', '数据分析'],
+        knowledgeBaseCount: 3,
+        conversationCount: 2100,
+        avatar: '',
+    },
+    {
+        id: 'app_008',
+        name: 'IT 运维智能助手',
+        description: 'IT 故障排查、系统维护、常见问题解答',
+        category: 'professional',
+        status: 'online',
+        creatorId: 'user_008',
+        creator: '吴十',
+        maintainers: ['吴十'],
+        createdAt: '2026-01-12 10:15:00',
+        updatedAt: '2026-01-18 14:30:00',
+        icon: 'it',
+        tags: ['IT 运维', '故障排查'],
+        knowledgeBaseCount: 6,
+        conversationCount: 789,
+        avatar: '',
+    },
+    {
+        id: 'app_009',
+        name: '合规管理助手',
+        description: '企业合规政策、流程指引、风险预警',
+        category: 'functional',
+        status: 'rejected',
+        creatorId: 'user_009',
+        creator: '郑十一',
+        maintainers: ['郑十一'],
+        createdAt: '2026-01-14 13:45:00',
+        updatedAt: '2026-01-19 11:20:00',
+        icon: 'compliance',
+        tags: ['合规管理', '风险控制'],
+        knowledgeBaseCount: 2,
+        conversationCount: 0,
+        avatar: '',
+    },
+    {
+        id: 'app_010',
+        name: '客户服务知识库',
+        description: '客服常见问题解答、产品使用说明、售后服务流程',
+        category: 'professional',
+        status: 'online',
+        creatorId: 'user_010',
+        creator: '刘十二',
+        maintainers: ['刘十二', '陈十三'],
+        createdAt: '2026-01-15 08:30:00',
+        updatedAt: '2026-01-20 17:00:00',
+        icon: 'service',
+        tags: ['客户服务', '售后支持'],
+        knowledgeBaseCount: 4,
+        conversationCount: 3200,
+        avatar: '',
+    },
+];
+
+// ==================== Mock API 处理函数 ====================
+
+/**
+ * 获取应用列表
+ * POST /bigmodel/api/getApplicationList
+ */
+export const mockFetchApplicationList = async (request: MockRequest) => {
+    const { pageNum = 1, pageSize = 10, category, status, keyword } = request.data || {};
+
+    console.log('[Mock] 获取应用列表', { pageNum, pageSize, category, status, keyword });
+
+    // 筛选数据
+    let filteredData = [...mockApplicationsData];
+
+    if (category && category !== 'all') {
+        filteredData = filteredData.filter(app => app.category === category);
+    }
+
+    if (status && status !== 'all') {
+        filteredData = filteredData.filter(app => app.status === status);
+    }
+
+    if (keyword) {
+        filteredData = filteredData.filter(app =>
+            app.name.toLowerCase().includes(keyword.toLowerCase()) ||
+            app.description.toLowerCase().includes(keyword.toLowerCase())
+        );
+    }
+
+    // 分页
+    const total = filteredData.length;
+    const startIndex = (pageNum - 1) * pageSize;
+    const endIndex = startIndex + pageSize;
+    const list = filteredData.slice(startIndex, endIndex);
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            list,
+            total,
+            pageNum,
+            pageSize,
+        },
+    };
+};
+
+/**
+ * 获取应用详情
+ * GET /bigmodel/api/selectApplication/:id
+ */
+export const mockFetchApplicationDetail = async (request: MockRequest) => {
+    const appId = request.params?.id;
+
+    console.log('[Mock] 获取应用详情', { appId });
+
+    const app = mockApplicationsData.find(a => a.id === appId);
+
+    if (!app) {
+        return {
+            code: 404,
+            message: '应用不存在',
+            data: null,
+        };
+    }
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            ...app,
+            // 扩展详情信息
+            knowledgeBases: [
+                { id: `kb_${appId}_1`, name: `${app.name}核心知识库` },
+                { id: `kb_${appId}_2`, name: `${app.name}补充资料` },
+            ],
+            recentConversations: [
+                { id: `conv_001`, user: '用户 A', time: '2026-04-02 10:30:00', question: '如何...' },
+                { id: `conv_002`, user: '用户 B', time: '2026-04-02 09:15:00', question: '请问...' },
+            ],
+        },
+    };
+};
+
+/**
+ * 创建应用
+ * POST /bigmodel/api/createApplication
+ */
+export const mockCreateApplication = async (request: MockRequest) => {
+    const { name, description, category, knowledgeBaseIds } = request.data || {};
+
+    console.log('[Mock] 创建应用', { name, description, category, knowledgeBaseIds });
+
+    // 生成新 ID
+    const newId = `app_${String(mockApplicationsData.length + 1).padStart(3, '0')}`;
+
+    const newApp = {
+        id: newId,
+        name: name || '新应用',
+        description: description || '暂无描述',
+        category: category || 'professional',
+        status: 'auditing', // 新建应用默认进入审核状态
+        creatorId: 'current_user',
+        creator: '当前用户',
+        maintainers: ['当前用户'],
+        createdAt: new Date().toLocaleString('zh-CN'),
+        updatedAt: new Date().toLocaleString('zh-CN'),
+        icon: 'default',
+        tags: [],
+        knowledgeBaseCount: knowledgeBaseIds?.length || 0,
+        conversationCount: 0,
+        avatar: '',
+    };
+
+    mockApplicationsData.unshift(newApp);
+
+    return {
+        code: 200,
+        message: '创建成功',
+        data: {
+            id: newId,
+            ...newApp,
+        },
+    };
+};
+
+/**
+ * 更新应用
+ * PUT /bigmodel/api/updateApplication/:id
+ */
+export const mockUpdateApplication = async (request: MockRequest) => {
+    const appId = request.params?.id;
+    const { name, description, category, status, tags } = request.data || {};
+
+    console.log('[Mock] 更新应用', { appId, name, description, category, status, tags });
+
+    const appIndex = mockApplicationsData.findIndex(a => a.id === appId);
+
+    if (appIndex === -1) {
+        return {
+            code: 404,
+            message: '应用不存在',
+            data: null,
+        };
+    }
+
+    const app = mockApplicationsData[appIndex];
+    mockApplicationsData[appIndex] = {
+        ...app,
+        name: name || app.name,
+        description: description || app.description,
+        category: category || app.category,
+        status: status || app.status,
+        tags: tags !== undefined ? tags : app.tags,
+        updatedAt: new Date().toLocaleString('zh-CN'),
+    };
+
+    return {
+        code: 200,
+        message: '更新成功',
+        data: mockApplicationsData[appIndex],
+    };
+};
+
+/**
+ * 删除应用
+ * DELETE /bigmodel/api/delApplication/:id
+ */
+export const mockDeleteApplication = async (request: MockRequest) => {
+    const appId = request.params?.id;
+
+    console.log('[Mock] 删除应用', { appId });
+
+    const appIndex = mockApplicationsData.findIndex(a => a.id === appId);
+
+    if (appIndex === -1) {
+        return {
+            code: 404,
+            message: '应用不存在',
+            data: null,
+        };
+    }
+
+    mockApplicationsData.splice(appIndex, 1);
+
+    return {
+        code: 200,
+        message: '删除成功',
+        data: { id: appId },
+    };
+};
+
+/**
+ * 获取我的应用列表
+ * GET /bigmodel/api/myApplications
+ */
+export const mockFetchMyApplications = async (request: MockRequest) => {
+    const userId = 'current_user'; // 当前登录用户 ID
+
+    console.log('[Mock] 获取我的应用列表', { userId });
+
+    const myApps = mockApplicationsData.filter(app => app.creatorId === userId);
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            list: myApps,
+            total: myApps.length,
+        },
+    };
+};
+
+// ==================== 导出所有 Mock 处理函数 ====================
+
+export const applicationMockHandlers = {
+    'POST /bigmodel/api/getApplicationList': mockFetchApplicationList,
+    'GET /bigmodel/api/selectApplication/:id': mockFetchApplicationDetail,
+    'POST /bigmodel/api/createApplication': mockCreateApplication,
+    'PUT /bigmodel/api/updateApplication/:id': mockUpdateApplication,
+    'DELETE /bigmodel/api/delApplication/:id': mockDeleteApplication,
+    'GET /bigmodel/api/myApplications': mockFetchMyApplications,
+};

+ 385 - 0
jk-rag-platform/src/mock/auditApi.ts

@@ -0,0 +1,385 @@
+// ==================== 审核管理 Mock 数据 ====================
+
+// 审核状态
+const auditStatuses = [
+    { value: 'pending', label: '待审核' },
+    { value: 'approved', label: '已通过' },
+    { value: 'rejected', label: '已拒绝' },
+];
+
+// 模拟审核数据
+const mockAuditData = [
+    {
+        id: 'audit_001',
+        appId: 'app_006',
+        appName: '安全生产管理系统',
+        appDescription: '安全生产规范、应急预案、事故案例分析',
+        creatorId: 'user_006',
+        creator: '孙八',
+        department: '安全管理部',
+        submitTime: '2026-01-16 15:45:00',
+        auditStatus: 'pending',
+        auditor: null,
+        auditTime: null,
+        auditOpinion: null,
+        knowledgeBaseCount: 4,
+        documentCount: 28,
+        sliceCount: 156,
+    },
+    {
+        id: 'audit_002',
+        appId: 'app_009',
+        appName: '合规管理助手',
+        appDescription: '企业合规政策、流程指引、风险预警',
+        creatorId: 'user_009',
+        creator: '郑十一',
+        department: '法务合规部',
+        submitTime: '2026-01-19 11:20:00',
+        auditStatus: 'rejected',
+        auditor: '管理员',
+        auditTime: '2026-01-20 09:30:00',
+        auditOpinion: '知识库内容不够完善,建议补充相关法规文件',
+        knowledgeBaseCount: 2,
+        documentCount: 8,
+        sliceCount: 42,
+    },
+    {
+        id: 'audit_003',
+        appId: 'app_011',
+        appName: '质量管理助手',
+        appDescription: 'ISO 质量管理体系、质检流程、问题整改跟踪',
+        creatorId: 'user_011',
+        creator: '钱十三',
+        department: '质量管理部',
+        submitTime: '2026-01-18 10:00:00',
+        auditStatus: 'approved',
+        auditor: '管理员',
+        auditTime: '2026-01-19 14:20:00',
+        auditOpinion: '符合上线标准,予以通过',
+        knowledgeBaseCount: 3,
+        documentCount: 15,
+        sliceCount: 89,
+    },
+    {
+        id: 'audit_004',
+        appId: 'app_012',
+        appName: '采购管理助手',
+        appDescription: '供应商管理、采购流程、合同管理',
+        creatorId: 'user_012',
+        creator: '赵十四',
+        department: '采购部',
+        submitTime: '2026-01-20 11:30:00',
+        auditStatus: 'pending',
+        auditor: null,
+        auditTime: null,
+        auditOpinion: null,
+        knowledgeBaseCount: 2,
+        documentCount: 12,
+        sliceCount: 67,
+    },
+    {
+        id: 'audit_005',
+        appId: 'app_013',
+        appName: '档案管理助手',
+        appDescription: '电子档案管理、档案借阅、档案分类',
+        creatorId: 'user_013',
+        creator: '孙十五',
+        department: '综合办公室',
+        submitTime: '2026-01-15 09:00:00',
+        auditStatus: 'approved',
+        auditor: '管理员',
+        auditTime: '2026-01-16 10:15:00',
+        auditOpinion: '符合上线标准',
+        knowledgeBaseCount: 4,
+        documentCount: 32,
+        sliceCount: 198,
+    },
+    {
+        id: 'audit_006',
+        appId: 'app_014',
+        appName: '知识产权助手',
+        appDescription: '专利管理、商标管理、知识产权申请流程',
+        creatorId: 'user_014',
+        creator: '李十六',
+        department: '知识产权部',
+        submitTime: '2026-01-21 14:00:00',
+        auditStatus: 'pending',
+        auditor: null,
+        auditTime: null,
+        auditOpinion: null,
+        knowledgeBaseCount: 3,
+        documentCount: 18,
+        sliceCount: 95,
+    },
+];
+
+// 模拟审核历史记录
+const mockAuditHistoryData = [
+    {
+        id: 'history_001',
+        auditId: 'audit_002',
+        appId: 'app_009',
+        appName: '合规管理助手',
+        action: 'submit',
+        actionName: '提交审核',
+        operator: '郑十一',
+        operatorRole: 'creator',
+        time: '2026-01-19 11:20:00',
+        remark: '提交应用审核',
+    },
+    {
+        id: 'history_002',
+        auditId: 'audit_002',
+        appId: 'app_009',
+        appName: '合规管理助手',
+        action: 'assigned',
+        actionName: '分配审核员',
+        operator: '系统',
+        operatorRole: 'system',
+        time: '2026-01-19 11:25:00',
+        remark: '自动分配给审核员:管理员',
+    },
+    {
+        id: 'history_003',
+        auditId: 'audit_002',
+        appId: 'app_009',
+        appName: '合规管理助手',
+        action: 'reviewing',
+        actionName: '开始审核',
+        operator: '管理员',
+        operatorRole: 'auditor',
+        time: '2026-01-20 09:00:00',
+        remark: '审核员开始审核',
+    },
+    {
+        id: 'history_004',
+        auditId: 'audit_002',
+        appId: 'app_009',
+        appName: '合规管理助手',
+        action: 'rejected',
+        actionName: '拒绝',
+        operator: '管理员',
+        operatorRole: 'auditor',
+        time: '2026-01-20 09:30:00',
+        remark: '知识库内容不够完善,建议补充相关法规文件',
+    },
+    {
+        id: 'history_005',
+        auditId: 'audit_003',
+        appId: 'app_011',
+        appName: '质量管理助手',
+        action: 'submit',
+        actionName: '提交审核',
+        operator: '钱十三',
+        operatorRole: 'creator',
+        time: '2026-01-18 10:00:00',
+        remark: '提交应用审核',
+    },
+    {
+        id: 'history_006',
+        auditId: 'audit_003',
+        appId: 'app_011',
+        appName: '质量管理助手',
+        action: 'approved',
+        actionName: '通过',
+        operator: '管理员',
+        operatorRole: 'auditor',
+        time: '2026-01-19 14:20:00',
+        remark: '符合上线标准,予以通过',
+    },
+];
+
+import { MockRequest } from './index';
+
+/**
+ * 获取审核列表
+ * POST /deepseek/api/app/audit/list
+ */
+export const mockFetchAuditList = async (request: MockRequest) => {
+    const { pageNum = 1, pageSize = 10, status, keyword, department } = request.data || {};
+
+    console.log('[Mock] 获取审核列表', { pageNum, pageSize, status, keyword, department });
+
+    // 筛选数据
+    let filteredData = [...mockAuditData];
+
+    if (status && status !== 'all') {
+        filteredData = filteredData.filter(item => item.auditStatus === status);
+    }
+
+    if (department) {
+        filteredData = filteredData.filter(item => item.department === department);
+    }
+
+    if (keyword) {
+        filteredData = filteredData.filter(item =>
+            item.appName.toLowerCase().includes(keyword.toLowerCase()) ||
+            item.creator.toLowerCase().includes(keyword.toLowerCase())
+        );
+    }
+
+    // 分页
+    const total = filteredData.length;
+    const startIndex = (pageNum - 1) * pageSize;
+    const endIndex = startIndex + pageSize;
+    const list = filteredData.slice(startIndex, endIndex);
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            list,
+            total,
+            pageNum,
+            pageSize,
+        },
+    };
+};
+
+/**
+ * 获取审核详情
+ * GET /deepseek/api/app/audit/detail/:id
+ */
+export const mockFetchAuditDetail = async (request: MockRequest) => {
+    const auditId = request.params?.id;
+
+    console.log('[Mock] 获取审核详情', { auditId });
+
+    const audit = mockAuditData.find(a => a.id === auditId);
+
+    if (!audit) {
+        return {
+            code: 404,
+            message: '审核记录不存在',
+            data: null,
+        };
+    }
+
+    return {
+        code: 200,
+        message: 'success',
+        data: audit,
+    };
+};
+
+/**
+ * 审核操作(通过/拒绝)
+ * PUT /deepseek/api/app/audit/auditAction
+ */
+export const mockAuditAction = async (request: MockRequest) => {
+    const { auditId, action, opinion } = request.data || {};
+
+    console.log('[Mock] 审核操作', { auditId, action, opinion });
+
+    const auditIndex = mockAuditData.findIndex(a => a.id === auditId);
+
+    if (auditIndex === -1) {
+        return {
+            code: 404,
+            message: '审核记录不存在',
+            data: null,
+        };
+    }
+
+    const audit = mockAuditData[auditIndex];
+
+    // 更新审核状态
+    mockAuditData[auditIndex] = {
+        ...audit,
+        auditStatus: action === 'approve' ? 'approved' : 'rejected',
+        auditor: '当前审核员',
+        auditTime: new Date().toLocaleString('zh-CN'),
+        auditOpinion: opinion || null,
+    };
+
+    // 同时更新应用状态(模拟)
+    const appIndex = mockAuditData.findIndex(a => a.appId === audit.appId);
+    if (appIndex !== -1) {
+        // 这里只是模拟,实际应用列表在 applicationApi.ts 中
+        console.log(`[Mock] 应用 ${audit.appId} 状态已更新为 ${action === 'approve' ? 'online' : 'rejected'}`);
+    }
+
+    return {
+        code: 200,
+        message: action === 'approve' ? '审核通过' : '已拒绝',
+        data: {
+            auditId,
+            action,
+            auditTime: new Date().toLocaleString('zh-CN'),
+        },
+    };
+};
+
+/**
+ * 获取审核历史列表
+ * POST /deepseek/api/app/auditHistory/list
+ */
+export const mockFetchAuditHistoryList = async (request: MockRequest) => {
+    const { auditId, pageNum = 1, pageSize = 20 } = request.data || {};
+
+    console.log('[Mock] 获取审核历史列表', { auditId, pageNum, pageSize });
+
+    // 筛选数据
+    let filteredData = [...mockAuditHistoryData];
+
+    if (auditId) {
+        filteredData = filteredData.filter(item => item.auditId === auditId);
+    }
+
+    // 按时间排序
+    filteredData.sort((a, b) => new Date(b.time).getTime() - new Date(a.time).getTime());
+
+    // 分页
+    const total = filteredData.length;
+    const startIndex = (pageNum - 1) * pageSize;
+    const endIndex = startIndex + pageSize;
+    const list = filteredData.slice(startIndex, endIndex);
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            list,
+            total,
+            pageNum,
+            pageSize,
+        },
+    };
+};
+
+/**
+ * 获取审核统计
+ * GET /deepseek/api/app/audit/stats
+ */
+export const mockFetchAuditStats = async () => {
+    console.log('[Mock] 获取审核统计');
+
+    const total = mockAuditData.length;
+    const pending = mockAuditData.filter(a => a.auditStatus === 'pending').length;
+    const approved = mockAuditData.filter(a => a.auditStatus === 'approved').length;
+    const rejected = mockAuditData.filter(a => a.auditStatus === 'rejected').length;
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            total,
+            pending,
+            approved,
+            rejected,
+            pendingRate: total > 0 ? ((pending / total) * 100).toFixed(1) : '0',
+            approvedRate: total > 0 ? ((approved / total) * 100).toFixed(1) : '0',
+            rejectedRate: total > 0 ? ((rejected / total) * 100).toFixed(1) : '0',
+        },
+    };
+};
+
+// ==================== 导出所有 Mock 处理函数 ====================
+
+export const auditMockHandlers = {
+    'POST /deepseek/api/app/audit/list': mockFetchAuditList,
+    'GET /deepseek/api/app/audit/detail/:id': mockFetchAuditDetail,
+    'PUT /deepseek/api/app/audit/auditAction': mockAuditAction,
+    'POST /deepseek/api/app/auditHistory/list': mockFetchAuditHistoryList,
+    'GET /deepseek/api/app/audit/stats': mockFetchAuditStats,
+};

+ 200 - 0
jk-rag-platform/src/mock/authApi.ts

@@ -0,0 +1,200 @@
+// ==================== 认证与用户信息 Mock 数据 ====================
+
+// 模拟用户数据
+const mockUsers = [
+    {
+        id: 'current_user',
+        username: 'zhangsan',
+        realName: '张三',
+        email: 'zhangsan@jianke.com',
+        phone: '13800138000',
+        department: '技术研发部',
+        position: '高级开发工程师',
+        avatar: '',
+        roles: ['user', 'developer'],
+    },
+    {
+        id: 'user_001',
+        username: 'lisi',
+        realName: '李四',
+        email: 'lisi@jianke.com',
+        phone: '13800138001',
+        department: '人力资源部',
+        position: '人力资源经理',
+        avatar: '',
+        roles: ['user'],
+    },
+    {
+        id: 'user_002',
+        username: 'wangwu',
+        realName: '王五',
+        email: 'wangwu@jianke.com',
+        phone: '13800138002',
+        department: '项目管理部',
+        position: '项目总监',
+        avatar: '',
+        roles: ['user', 'manager'],
+    },
+];
+
+// 模拟验证码(实际场景应该发送到手机/邮箱)
+let verificationCodes: Record<string, { code: string; expiresAt: number }> = {};
+
+/**
+ * 生成随机验证码
+ */
+function generateVerificationCode(): string {
+    return String(Math.floor(Math.random() * 9000) + 1000);
+}
+
+/**
+ * 模拟登录请求
+ * POST /auth/login
+ */
+export const mockLogin = async (request: { data?: { username?: string; password?: string; code?: string } }) => {
+    const { username, password, code } = request.data || {};
+
+    console.log('[Mock] 登录请求', { username, code });
+
+    // 验证验证码(可选,简化流程)
+    if (code && verificationCodes[username || 'default']) {
+        const savedCode = verificationCodes[username || 'default'];
+        if (savedCode.code !== code) {
+            return {
+                code: 400,
+                message: '验证码错误',
+                data: null,
+            };
+        }
+        // 验证码使用后失效
+        delete verificationCodes[username || 'default'];
+    }
+
+    // 简化验证:只要用户名密码不为空即可
+    if (!username || !password) {
+        return {
+            code: 400,
+            message: '用户名或密码不能为空',
+            data: null,
+        };
+    }
+
+    // 查找用户
+    const user = mockUsers.find(u => u.username === username);
+
+    // 返回模拟 Token
+    const mockToken = `mock_token_${username}_${Date.now()}`;
+    const mockRefreshToken = `mock_refresh_token_${username}_${Date.now()}`;
+
+    return {
+        code: 200,
+        message: '登录成功',
+        data: {
+            token: mockToken,
+            refreshToken: mockRefreshToken,
+            expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000, // 7 天有效期
+            user: user || mockUsers[0], // 返回用户信息
+        },
+    };
+};
+
+/**
+ * 获取验证码
+ * GET /auth/code
+ */
+export const mockGetVerificationCode = async (request: { params?: { phone?: string; email?: string } }) => {
+    const { phone, email } = request.params || {};
+
+    console.log('[Mock] 获取验证码', { phone, email });
+
+    // 生成验证码
+    const code = generateVerificationCode();
+    const key = phone || email || 'default';
+
+    // 存储验证码(5 分钟有效期)
+    verificationCodes[key] = {
+        code,
+        expiresAt: Date.now() + 5 * 60 * 1000,
+    };
+
+    console.log('[Mock] 验证码(仅供调试):', code);
+
+    return {
+        code: 200,
+        message: '验证码已发送',
+        data: {
+            // 开发环境返回验证码,生产环境应隐藏
+            debugCode: code,
+            expiresInSeconds: 300,
+        },
+    };
+};
+
+/**
+ * 获取当前用户信息
+ * GET /system/user/getInfo
+ */
+export const mockGetUserInfo = async (request: { headers?: { Authorization?: string } }) => {
+    const token = request.headers?.Authorization || '';
+
+    console.log('[Mock] 获取用户信息', { token });
+
+    // 从 Token 中提取用户名(简化处理)
+    const username = token.replace('mock_token_', '').split('_')[0] || 'zhangsan';
+    const user = mockUsers.find(u => u.username === username) || mockUsers[0];
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            ...user,
+            permissions: ['app:create', 'app:edit', 'app:delete', 'knowledge:manage'],
+        },
+    };
+};
+
+/**
+ * 退出登录
+ * POST /auth/logout
+ */
+export const mockLogout = async () => {
+    console.log('[Mock] 退出登录');
+
+    return {
+        code: 200,
+        message: '退出成功',
+        data: null,
+    };
+};
+
+/**
+ * 刷新 Token
+ * POST /auth/refresh
+ */
+export const mockRefreshToken = async (request: { data?: { refreshToken?: string } }) => {
+    const { refreshToken } = request.data || {};
+
+    console.log('[Mock] 刷新 Token', { refreshToken });
+
+    const mockToken = `mock_token_refreshed_${Date.now()}`;
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            token: mockToken,
+            refreshToken: refreshToken || `mock_refresh_token_${Date.now()}`,
+            expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000,
+        },
+    };
+};
+
+// ==================== 导出所有 Mock 处理函数 ====================
+
+export const authMockHandlers = {
+    'POST /auth/login': mockLogin,
+    'GET /auth/code': mockGetVerificationCode,
+    'GET /system/user/getInfo': mockGetUserInfo,
+    'POST /auth/logout': mockLogout,
+    'POST /auth/refresh': mockRefreshToken,
+};

+ 166 - 0
jk-rag-platform/src/mock/overviewApi.ts

@@ -0,0 +1,166 @@
+// ==================== 首页统计 Mock 数据 ====================
+
+import { MockRequest } from './index';
+
+/**
+ * 获取首页统计数据
+ * GET /deepseek/overview/topData
+ */
+export const mockFetchOverviewData = async () => {
+    console.log('[Mock] 获取首页统计数据');
+
+    // 模拟统计数据
+    const stats = {
+        // 核心指标
+        totalApps: 18,           // 应用总数
+        onlineApps: 14,          // 已上线应用
+        auditingApps: 2,         // 审核中应用
+        offlineApps: 2,          // 已下线应用
+
+        // 知识库统计
+        totalKnowledgeBases: 45,      // 知识库总数
+        totalDocuments: 328,          // 文档总数
+        totalSlices: 2156,            // 切片总数
+
+        // 使用统计
+        totalConversations: 12580,    // 总会话数
+        todayConversations: 156,      // 今日会话数
+        activeUsers: 89,              // 活跃用户数
+
+        // 待办事项
+        pendingAudits: 3,             // 待审核应用数
+        pendingUpdates: 5,            // 待更新应用数
+
+        // 趋势数据(最近 7 天)
+        conversationTrend: [
+            { date: '2026-03-27', count: 142 },
+            { date: '2026-03-28', count: 158 },
+            { date: '2026-03-29', count: 134 },
+            { date: '2026-03-30', count: 189 },
+            { date: '2026-03-31', count: 167 },
+            { date: '2026-04-01', count: 201 },
+            { date: '2026-04-02', count: 156 },
+        ],
+
+        // 应用分类统计
+        categoryStats: [
+            { category: 'professional', name: '专业知识', count: 7, percentage: 38.9 },
+            { category: 'functional', name: '职能管理', count: 6, percentage: 33.3 },
+            { category: 'project', name: '项目级应用', count: 5, percentage: 27.8 },
+        ],
+
+        // 热门应用 TOP5
+        topApps: [
+            { id: 'app_010', name: '客户服务知识库', conversations: 3200, trend: '+12%' },
+            { id: 'app_007', name: '市场营销支持平台', conversations: 2100, trend: '+8%' },
+            { id: 'app_005', name: '技术培训知识库', conversations: 1580, trend: '+15%' },
+            { id: 'app_001', name: '合同审查助手', conversations: 1250, trend: '+5%' },
+            { id: 'app_002', name: '人力资源问答机器人', conversations: 890, trend: '+3%' },
+        ],
+
+        // 最新动态
+        recentActivities: [
+            { id: 1, type: 'app_created', content: '新创建应用「知识产权助手」', user: '李十六', time: '10 分钟前' },
+            { id: 2, type: 'app_updated', content: '更新应用「合同审查助手」知识库', user: '张三', time: '25 分钟前' },
+            { id: 3, type: 'audit_approved', content: '通过应用「质量管理助手」审核', user: '管理员', time: '1 小时前' },
+            { id: 4, type: 'app_published', content: '应用「档案管理助手」已上线', user: '孙十五', time: '2 小时前' },
+            { id: 5, type: 'audit_rejected', content: '拒绝应用「合规管理助手」审核', user: '管理员', time: '3 小时前' },
+        ],
+    };
+
+    return {
+        code: 200,
+        message: 'success',
+        data: stats,
+    };
+};
+
+/**
+ * 获取在线用户数据
+ * GET /deepseek/overview/onlineUserData
+ */
+export const mockFetchOnlineUserData = async () => {
+    console.log('[Mock] 获取在线用户数据');
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            onlineUsers: 89,
+            peakToday: 156,
+            peakTime: '14:30',
+            avgOnlineTime: '45 分钟',
+        },
+    };
+};
+
+/**
+ * 获取会话数据
+ * GET /deepseek/overview/conversationData
+ */
+export const mockFetchConversationData = async (request: MockRequest) => {
+    const { startDate, endDate } = request.params || {};
+
+    console.log('[Mock] 获取会话数据', { startDate, endDate });
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            total: 12580,
+            today: 156,
+            yesterday: 201,
+            thisWeek: 1047,
+            lastWeek: 892,
+            growthRate: '+17.4%',
+        },
+    };
+};
+
+/**
+ * 获取数据集列表
+ * GET /deepseek/dataset/pageList
+ */
+export const mockFetchDatasetList = async (request: MockRequest) => {
+    const { pageNum = 1, pageSize = 10, keyword } = request.data || {};
+
+    console.log('[Mock] 获取数据集列表', { pageNum, pageSize, keyword });
+
+    const datasets = [
+        { id: 'ds_001', name: '法律法规数据集', docCount: 156, sliceCount: 892, updatedAt: '2026-04-01' },
+        { id: 'ds_002', name: '技术规范数据集', docCount: 234, sliceCount: 1245, updatedAt: '2026-03-30' },
+        { id: 'ds_003', name: '企业制度数据集', docCount: 89, sliceCount: 456, updatedAt: '2026-03-28' },
+        { id: 'ds_004', name: '行业案例数据集', docCount: 312, sliceCount: 1678, updatedAt: '2026-03-25' },
+        { id: 'ds_005', name: '产品知识数据集', docCount: 178, sliceCount: 934, updatedAt: '2026-03-22' },
+    ];
+
+    let filteredData = datasets;
+    if (keyword) {
+        filteredData = datasets.filter(d => d.name.toLowerCase().includes(keyword.toLowerCase()));
+    }
+
+    const total = filteredData.length;
+    const startIndex = (pageNum - 1) * pageSize;
+    const endIndex = startIndex + pageSize;
+    const list = filteredData.slice(startIndex, endIndex);
+
+    return {
+        code: 200,
+        message: 'success',
+        data: {
+            list,
+            total,
+            pageNum,
+            pageSize,
+        },
+    };
+};
+
+// ==================== 导出所有 Mock 处理函数 ====================
+
+export const overviewMockHandlers = {
+    'GET /deepseek/overview/topData': mockFetchOverviewData,
+    'GET /deepseek/overview/onlineUserData': mockFetchOnlineUserData,
+    'GET /deepseek/overview/conversationData': mockFetchConversationData,
+    'GET /deepseek/dataset/pageList': mockFetchDatasetList,
+};