133 lines
3.3 KiB
JavaScript
133 lines
3.3 KiB
JavaScript
|
|
/**
|
|||
|
|
* 用户相关Mock接口
|
|||
|
|
* @author 湖北新华业务中台研发团队
|
|||
|
|
*/
|
|||
|
|
import Mock from 'mockjs'
|
|||
|
|
|
|||
|
|
// 存储验证码,模拟服务端session
|
|||
|
|
const captchaStore = {}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成验证码图片(简单的SVG)
|
|||
|
|
*/
|
|||
|
|
const generateCaptcha = () => {
|
|||
|
|
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789'
|
|||
|
|
let code = ''
|
|||
|
|
for (let i = 0; i < 4; i++) {
|
|||
|
|
code += chars.charAt(Math.floor(Math.random() * chars.length))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成简单的SVG验证码
|
|||
|
|
const colors = ['#f56c6c', '#409eff', '#67c23a', '#e6a23c', '#909399']
|
|||
|
|
const randomColor = () => colors[Math.floor(Math.random() * colors.length)]
|
|||
|
|
|
|||
|
|
const svg = `
|
|||
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="40">
|
|||
|
|
<rect width="100%" height="100%" fill="#f5f5f5"/>
|
|||
|
|
${code.split('').map((char, i) => `
|
|||
|
|
<text x="${15 + i * 22}" y="${28 + Math.random() * 8 - 4}"
|
|||
|
|
fill="${randomColor()}"
|
|||
|
|
font-size="${18 + Math.random() * 6}"
|
|||
|
|
transform="rotate(${Math.random() * 20 - 10}, ${15 + i * 22}, 25)">
|
|||
|
|
${char}
|
|||
|
|
</text>
|
|||
|
|
`).join('')}
|
|||
|
|
${Array.from({ length: 3 }).map(() => `
|
|||
|
|
<line x1="${Math.random() * 100}" y1="${Math.random() * 40}"
|
|||
|
|
x2="${Math.random() * 100}" y2="${Math.random() * 40}"
|
|||
|
|
stroke="${randomColor()}" stroke-width="1"/>
|
|||
|
|
`).join('')}
|
|||
|
|
</svg>
|
|||
|
|
`.trim()
|
|||
|
|
|
|||
|
|
// 转为base64
|
|||
|
|
const base64 = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg)))
|
|||
|
|
|
|||
|
|
return { code, img: base64 }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取验证码
|
|||
|
|
Mock.mock(/\/api\/captchaImage/, 'get', () => {
|
|||
|
|
const uuid = Mock.Random.guid()
|
|||
|
|
const captcha = generateCaptcha()
|
|||
|
|
|
|||
|
|
// 存储验证码
|
|||
|
|
captchaStore[uuid] = captcha.code.toLowerCase()
|
|||
|
|
|
|||
|
|
// 5分钟后过期
|
|||
|
|
setTimeout(() => {
|
|||
|
|
delete captchaStore[uuid]
|
|||
|
|
}, 5 * 60 * 1000)
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
code: 200,
|
|||
|
|
msg: '操作成功',
|
|||
|
|
img: captcha.img,
|
|||
|
|
uuid: uuid
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 登录
|
|||
|
|
Mock.mock('/api/login', 'post', (options) => {
|
|||
|
|
const body = JSON.parse(options.body)
|
|||
|
|
const { username, password, code, uuid } = body
|
|||
|
|
|
|||
|
|
// 验证码校验(开发环境可以用1234绕过)
|
|||
|
|
const storedCode = captchaStore[uuid]
|
|||
|
|
if (code !== '1234' && (!storedCode || storedCode !== code.toLowerCase())) {
|
|||
|
|
return { code: 500, msg: '验证码错误' }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除已使用的验证码
|
|||
|
|
delete captchaStore[uuid]
|
|||
|
|
|
|||
|
|
// 账号密码校验
|
|||
|
|
if (username === 'admin' && password === 'admin123') {
|
|||
|
|
return {
|
|||
|
|
code: 200,
|
|||
|
|
msg: '登录成功',
|
|||
|
|
token: Mock.Random.guid()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return { code: 500, msg: '用户名或密码错误' }
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 获取用户信息
|
|||
|
|
Mock.mock(/\/api\/getInfo/, 'get', () => {
|
|||
|
|
return {
|
|||
|
|
code: 200,
|
|||
|
|
msg: '操作成功',
|
|||
|
|
data: {
|
|||
|
|
userId: 1,
|
|||
|
|
userName: 'admin',
|
|||
|
|
nickName: '超级管理员',
|
|||
|
|
avatar: '',
|
|||
|
|
roles: ['admin'],
|
|||
|
|
permissions: ['*:*:*']
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 退出登录
|
|||
|
|
Mock.mock('/api/logout', 'post', () => {
|
|||
|
|
return {
|
|||
|
|
code: 200,
|
|||
|
|
msg: '退出成功'
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 首页统计数据
|
|||
|
|
Mock.mock(/\/api\/dashboard\/stats/, 'get', () => {
|
|||
|
|
return {
|
|||
|
|
code: 200,
|
|||
|
|
msg: '操作成功',
|
|||
|
|
data: {
|
|||
|
|
schoolCount: Mock.Random.integer(50, 200),
|
|||
|
|
memberCount: Mock.Random.integer(10000, 50000),
|
|||
|
|
studentCount: Mock.Random.integer(50000, 200000),
|
|||
|
|
appCount: Mock.Random.integer(5, 20)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|