first commit

This commit is contained in:
2026-10-25 23:14:53 +08:00
commit 4e9f3dcb13
25 changed files with 932 additions and 0 deletions
+128
View File
@@ -0,0 +1,128 @@
import { dashboardSummary, menuRoutes, USER_STATUS, users } from './data'
export interface MockContext {
url: string
params: string[]
query: Record<string, string>
body: Record<string, any>
}
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,
},
]