引入基于 Basic Auth 的用户认证系统,包括用户管理、登录界面和 API 鉴权 - 新增用户实体和管理功能 - 实现前端登录界面和凭证管理 - 重构 API 鉴权为 Basic Auth 模式 - 添加用户管理脚本工具
101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
import 'dotenv/config';
|
|
import { DataSource, DataSourceOptions } from 'typeorm';
|
|
import { User } from '../users/entities/user.entity';
|
|
import * as bcrypt from 'bcrypt';
|
|
|
|
// 数据库配置
|
|
const dbConfig: DataSourceOptions = {
|
|
type: (process.env.DATABASE_TYPE as any) || 'mysql',
|
|
host: process.env.DATABASE_HOST || 'localhost',
|
|
port: parseInt(process.env.DATABASE_PORT || '3306'),
|
|
username: process.env.DATABASE_USERNAME || 'root',
|
|
password: process.env.DATABASE_PASSWORD || 'root',
|
|
database: process.env.DATABASE_NAME || 'bidding',
|
|
entities: [User],
|
|
synchronize: false,
|
|
};
|
|
|
|
// 日志工具
|
|
const logger = {
|
|
log: (message: string, ...args: any[]) => {
|
|
console.log(`[INFO] ${new Date().toISOString()} - ${message}`, ...args);
|
|
},
|
|
error: (message: string, ...args: any[]) => {
|
|
console.error(`[ERROR] ${new Date().toISOString()} - ${message}`, ...args);
|
|
},
|
|
};
|
|
|
|
// 主函数
|
|
async function createUser() {
|
|
let dataSource: DataSource | null = null;
|
|
|
|
try {
|
|
// 从命令行参数获取用户名和密码
|
|
const args = process.argv.slice(2);
|
|
|
|
if (args.length < 2) {
|
|
console.log('用法: npm run user:create <用户名> <密码>');
|
|
console.log('示例: npm run user:create admin password123');
|
|
process.exit(1);
|
|
}
|
|
|
|
const username = args[0];
|
|
const password = args[1];
|
|
|
|
if (!username || username.trim().length === 0) {
|
|
logger.error('用户名不能为空');
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!password || password.length === 0) {
|
|
logger.error('密码不能为空');
|
|
process.exit(1);
|
|
}
|
|
|
|
logger.log('开始创建用户...');
|
|
|
|
// 创建数据库连接
|
|
dataSource = new DataSource(dbConfig);
|
|
await dataSource.initialize();
|
|
logger.log('数据库连接成功');
|
|
|
|
// 检查用户名是否已存在
|
|
const userRepository = dataSource.getRepository(User);
|
|
const existingUser = await userRepository.findOne({
|
|
where: { username },
|
|
});
|
|
|
|
if (existingUser) {
|
|
logger.error(`用户名 ${username} 已存在`);
|
|
process.exit(1);
|
|
}
|
|
|
|
// 加密密码
|
|
const hashedPassword = await bcrypt.hash(password, 10);
|
|
|
|
// 创建用户
|
|
const user = userRepository.create({
|
|
username,
|
|
password: hashedPassword,
|
|
});
|
|
|
|
await userRepository.save(user);
|
|
|
|
logger.log(`用户 ${username} 创建成功!`);
|
|
logger.log(`用户 ID: ${user.id}`);
|
|
logger.log(`创建时间: ${user.createdAt}`);
|
|
|
|
await dataSource.destroy();
|
|
process.exit(0);
|
|
} catch (error) {
|
|
logger.error('创建用户失败:', error);
|
|
if (dataSource && dataSource.isInitialized) {
|
|
await dataSource.destroy();
|
|
}
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// 执行创建用户
|
|
createUser();
|