48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
#!/usr/bin/env node
|
|
import readline from 'node:readline/promises';
|
|
import { stdin as input, stdout as output } from 'node:process';
|
|
import { createDbPool, isDatabaseConfigured } from '../server/db.mjs';
|
|
import { createLocalUserAuth } from '../server/local-auth.mjs';
|
|
|
|
if (!isDatabaseConfigured()) {
|
|
console.error('MySQL 未配置,请先设置 DATABASE_URL 或 MYSQL_*');
|
|
process.exit(1);
|
|
}
|
|
|
|
const [usernameArg, passwordArg, confirmArg] = process.argv.slice(2);
|
|
let username = (usernameArg ?? '').trim();
|
|
let password = passwordArg ?? '';
|
|
let confirm = confirmArg ?? '';
|
|
|
|
if (!username || !password || !confirm) {
|
|
const rl = readline.createInterface({ input, output });
|
|
username = username || (await rl.question('admin username [admin]: ')).trim() || 'admin';
|
|
password = password || (await rl.question('admin password: '));
|
|
confirm = confirm || (await rl.question('confirm password: '));
|
|
rl.close();
|
|
} else {
|
|
username = username.trim() || 'admin';
|
|
}
|
|
|
|
if (!password || password !== confirm) {
|
|
console.error('密码为空或两次输入不一致');
|
|
process.exit(1);
|
|
}
|
|
|
|
const pool = createDbPool();
|
|
const auth = createLocalUserAuth(pool);
|
|
await auth.ensureAdminUser().catch(() => {});
|
|
await pool.execute(
|
|
`INSERT INTO auth_users (username, display_name, role, status, password_hash, balance_cents)
|
|
VALUES (?, ?, 'admin', 'active', ?, 0)
|
|
ON DUPLICATE KEY UPDATE
|
|
display_name = VALUES(display_name),
|
|
role = VALUES(role),
|
|
status = VALUES(status),
|
|
password_hash = VALUES(password_hash)`,
|
|
[username, username, auth.hashPassword(password)],
|
|
);
|
|
|
|
console.log(`admin 账号已写入数据库: ${username}`);
|
|
await pool.end();
|