const crypto = require('crypto') const readline = require('readline') const { query } = require('../config/database') require('dotenv').config() const DEFAULT_PASSWORD = process.env.DEFAULT_PASSWORD || '123456' const DEFAULT_PHONE = process.env.ADMIN_PHONE || '13800000000' const DEFAULT_NAME = process.env.ADMIN_NAME || '系统管理员' function md5(str) { return crypto.createHash('md5').update(str).digest('hex') } function ask(question) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans) })) } async function run() { try { const phoneArg = process.argv[2] const passwordArg = process.argv[3] let phone = phoneArg let password = passwordArg if (!phone) { phone = (await ask(`管理员手机号 [${DEFAULT_PHONE}]: `)) || DEFAULT_PHONE } if (!password) { password = (await ask(`管理员密码 [${DEFAULT_PASSWORD}]: `)) || DEFAULT_PASSWORD } if (!/^1\d{10}$/.test(phone)) { console.error('手机号格式错误') process.exit(1) } if (password.length < 8) { console.error('密码至少 8 位') process.exit(1) } const existing = await query('SELECT id, role FROM users WHERE phone = ?', [phone]) if (existing.length > 0) { if (existing[0].role === 2) { console.log(`该手机号已是管理员 (id=${existing[0].id})`) process.exit(0) } await query('UPDATE users SET role = 2, password = ? WHERE id = ?', [md5(password), existing[0].id]) console.log(`已将用户 ${phone} 提升为管理员,密码已重置`) process.exit(0) } const result = await query( 'INSERT INTO users (phone, password, name, avatar, points, role, status) VALUES (?, ?, ?, ?, ?, ?, ?)', [phone, md5(password), DEFAULT_NAME, '', 0, 2, 1] ) console.log(`\n✅ 管理员创建成功`) console.log(` id : ${result.insertId}`) console.log(` phone : ${phone}`) console.log(` name : ${DEFAULT_NAME}`) console.log(` role : 2 (管理员)`) console.log(` password: ${password} (首次登录后请尽快修改)\n`) process.exit(0) } catch (error) { console.error('创建管理员失败:', error) process.exit(1) } } run()