feat: 添加用户认证系统
引入基于 Basic Auth 的用户认证系统,包括用户管理、登录界面和 API 鉴权 - 新增用户实体和管理功能 - 实现前端登录界面和凭证管理 - 重构 API 鉴权为 Basic Auth 模式 - 添加用户管理脚本工具
This commit is contained in:
100
src/scripts/create-user.ts
Normal file
100
src/scripts/create-user.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user