增加注册功能
This commit is contained in:
@@ -28,3 +28,35 @@ export async function findSubordinates(managerId: number): Promise<UserRow[]> {
|
||||
);
|
||||
return rows as UserRow[];
|
||||
}
|
||||
|
||||
export interface CreateUserInput {
|
||||
username: string;
|
||||
password: string;
|
||||
name: string;
|
||||
role?: UserRole;
|
||||
department: string;
|
||||
position: string;
|
||||
manager_id?: number | null;
|
||||
status?: 'active' | 'inactive';
|
||||
}
|
||||
|
||||
export async function createUser(userData: CreateUserInput): Promise<number> {
|
||||
const {
|
||||
username,
|
||||
password,
|
||||
name,
|
||||
role = 'employee',
|
||||
department,
|
||||
position,
|
||||
manager_id = null,
|
||||
status = 'active'
|
||||
} = userData;
|
||||
|
||||
const [result] = await pool.query<any>(
|
||||
`INSERT INTO user (username, password, name, role, department, position, manager_id, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[username, password, name, role, department, position, manager_id, status]
|
||||
);
|
||||
|
||||
return result.insertId;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Router, Request, Response } from 'express';
|
||||
import { login } from '../services/AuthService';
|
||||
import { login, register } from '../services/AuthService';
|
||||
|
||||
const router = Router();
|
||||
|
||||
@@ -24,4 +24,25 @@ router.post('/login', async (req: Request, res: Response) => {
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/user/register
|
||||
router.post('/register', async (req: Request, res: Response) => {
|
||||
console.log('收到注册请求:', req.body);
|
||||
const { username, password, name, department, position, role } = req.body;
|
||||
|
||||
if (!username || !password || !name || !department || !position) {
|
||||
console.log('参数验证失败');
|
||||
return res.status(400).json({ code: 400, message: '用户名、密码、姓名、部门和岗位均为必填' });
|
||||
}
|
||||
|
||||
try {
|
||||
console.log('调用注册服务...');
|
||||
const result = await register({ username, password, name, department, position, role });
|
||||
console.log('注册成功:', result.userInfo);
|
||||
return res.json({ code: 200, message: '注册成功', data: result });
|
||||
} catch (err: any) {
|
||||
console.error('注册失败:', err.message);
|
||||
return res.status(400).json({ code: 400, message: err.message || '注册失败' });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// 注意:此版本使用明文密码验证,所有用户密码均为123456(仅用于测试环境)
|
||||
// 生产环境必须使用加密密码存储和验证
|
||||
import jwt from 'jsonwebtoken';
|
||||
import { findByUsername } from '../dao/UserDAO';
|
||||
import { findByUsername, createUser, CreateUserInput } from '../dao/UserDAO';
|
||||
import { JWT_SECRET, JWT_EXPIRES_IN } from '../config/jwt';
|
||||
import { LoginResult, UserInfo, UserRole } from '../types';
|
||||
|
||||
@@ -38,3 +38,53 @@ export async function login(
|
||||
|
||||
return { token, userInfo };
|
||||
}
|
||||
|
||||
export interface RegisterInput {
|
||||
username: string;
|
||||
password: string;
|
||||
name: string;
|
||||
department: string;
|
||||
position: string;
|
||||
role?: UserRole;
|
||||
}
|
||||
|
||||
export async function register(userData: RegisterInput): Promise<LoginResult> {
|
||||
const { username, password, name, department, position, role = 'employee' } = userData;
|
||||
|
||||
// 检查必填字段
|
||||
if (!username || !password || !name || !department || !position) {
|
||||
throw new Error('用户名、密码、姓名、部门和岗位均为必填');
|
||||
}
|
||||
|
||||
// 检查用户名是否已存在
|
||||
const existingUser = await findByUsername(username);
|
||||
if (existingUser) {
|
||||
throw new Error('用户名已存在');
|
||||
}
|
||||
|
||||
// 创建用户 - 所有用户密码固定为123456(明文存储)
|
||||
const userId = await createUser({
|
||||
username,
|
||||
password: '123456', // 固定密码,忽略用户输入的密码
|
||||
name,
|
||||
role,
|
||||
department,
|
||||
position,
|
||||
manager_id: null, // 新注册用户没有直属领导
|
||||
status: 'active'
|
||||
});
|
||||
|
||||
// 注册成功后自动登录,返回token和用户信息
|
||||
const userInfo: UserInfo = {
|
||||
userId,
|
||||
name,
|
||||
role,
|
||||
department,
|
||||
position,
|
||||
managerId: null
|
||||
};
|
||||
|
||||
const token = jwt.sign(userInfo, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });
|
||||
|
||||
return { token, userInfo };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user