import { dashboardSummary, menuRoutes, USER_STATUS, users } from './data' export interface MockContext { url: string params: string[] query: Record body: Record } export interface MockRule { method: 'GET' | 'POST' | 'PUT' | 'DELETE' pattern: RegExp handler: (ctx: MockContext) => unknown } const toNumber = (value: unknown, fallback = 0) => { const n = Number(value) return Number.isFinite(n) ? n : fallback } export const mockRules: MockRule[] = [ { method: 'POST', pattern: /^\/api\/v1\/auth\/login$/, handler: (ctx) => { const { username, password } = ctx.body if (!username || !password) { return { code: 'A0120', msg: '用户名和密码不能为空' } } return { accessToken: 'mock-access-token', refreshToken: 'mock-refresh-token', tokenType: 'Bearer', expiresIn: 7200, } }, }, { method: 'POST', pattern: /^\/api\/v1\/auth\/logout$/, handler: () => true, }, { method: 'GET', pattern: /^\/api\/v1\/auth\/me$/, handler: () => ({ userId: 1, username: 'admin', nickname: '超级管理员', avatar: '', roles: ['ADMIN'], permissions: ['sys:user:add', 'sys:user:edit', 'sys:user:delete', 'sys:user:query'], }), }, { method: 'GET', pattern: /^\/api\/v1\/auth\/routes$/, handler: () => menuRoutes, }, { method: 'GET', pattern: /^\/api\/v1\/users\/page$/, handler: (ctx) => { const { username, status, pageNum = '1', pageSize = '10' } = ctx.query const filtered = users.filter((item) => { const matchName = !username || item.username.includes(username) const matchStatus = !status || String(item.status) === status return matchName && matchStatus }) const start = (toNumber(pageNum, 1) - 1) * toNumber(pageSize, 10) return { list: filtered.slice(start, start + toNumber(pageSize, 10)), total: filtered.length, } }, }, { method: 'GET', pattern: /^\/api\/v1\/users\/(\d+)$/, handler: (ctx) => users.find((item) => item.id === toNumber(ctx.params[0])) ?? null, }, { method: 'POST', pattern: /^\/api\/v1\/users$/, handler: (ctx) => { const id = users.length + 1 users.unshift({ id, username: ctx.body.username ?? `user${id}`, nickname: ctx.body.nickname ?? '', mobile: ctx.body.mobile ?? '', email: ctx.body.email ?? '', status: ctx.body.status ?? USER_STATUS.ENABLED, deptName: ctx.body.deptName ?? '技术部', roleNames: ctx.body.roleNames ?? ['普通用户'], createTime: new Date().toISOString(), }) return id }, }, { method: 'PUT', pattern: /^\/api\/v1\/users\/(\d+)$/, handler: (ctx) => { const target = users.find((item) => item.id === toNumber(ctx.params[0])) if (!target) return false Object.assign(target, ctx.body) return true }, }, { method: 'DELETE', pattern: /^\/api\/v1\/users\/([\d,]+)$/, handler: (ctx) => { const ids = ctx.params[0].split(',').map((id) => toNumber(id)) ids.forEach((id) => { const index = users.findIndex((item) => item.id === id) if (index > -1) users.splice(index, 1) }) return true }, }, { method: 'GET', pattern: /^\/api\/v1\/dashboard\/summary$/, handler: () => dashboardSummary, }, ]