Spaces:
Sleeping
Sleeping
import { injectable } from "inversify"; | |
import bcrypt from "bcrypt"; | |
import jwt from "jsonwebtoken"; | |
import { config } from "../config"; | |
import User from "../models/User"; | |
import GlobalSetting from "../models/GlobalSetting"; | |
() | |
export class UserService { | |
private isValidInput(input: string): boolean { | |
// 检查是否包含空格或汉字 | |
const regex = /^[^\s\u4e00-\u9fa5]+$/; | |
return regex.test(input); | |
} | |
async register(username: string, password: string, registerCode: string) { | |
const globalSetting = await GlobalSetting.findOne(); | |
const registerCodeList = [ | |
globalSetting?.dataValues.CommonUserCode, | |
globalSetting?.dataValues.AdminUserCode, | |
]; | |
if (!registerCode || !registerCodeList.includes(Number(registerCode))) { | |
throw new Error("注册码错误"); | |
} | |
// 验证输入 | |
if (!this.isValidInput(username) || !this.isValidInput(password)) { | |
throw new Error("用户名、密码或注册码不能包含空格或汉字"); | |
} | |
// 检查用户名是否已存在 | |
const existingUser = await User.findOne({ where: { username } }); | |
if (existingUser) { | |
throw new Error("用户名已存在"); | |
} | |
const hashedPassword = await bcrypt.hash(password, 10); | |
const role = registerCodeList.findIndex((x) => x === Number(registerCode)); | |
const user = await User.create({ username, password: hashedPassword, role }); | |
return { | |
data: user, | |
message: "用户注册成功", | |
}; | |
} | |
async login(username: string, password: string) { | |
const user = await User.findOne({ where: { username } }); | |
if (!user || !(await bcrypt.compare(password, user.password))) { | |
throw new Error("用户名或密码错误"); | |
} | |
const token = jwt.sign({ userId: user.userId, role: user.role }, config.jwtSecret, { | |
expiresIn: "6h", | |
}); | |
return { | |
data: { | |
token, | |
}, | |
}; | |
} | |
} | |