seed-admin-user.js
2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env node
/**
* seed-admin-user.js — 建出登录用的默认种子账号
*
* 依据: docs/todo/system-design/38-auth-multi-tenant-isolation.md §3.4 / Phase 0
*
* 账号: admin / hex1234(登录标识存在 users.email 列,不要求真实邮箱格式——
* 直接走 userDb.createUser 建号,不经过 /api/auth/register 那道邮箱格式校验)。
*
* 幂等: admin 已存在就跳过,可重复执行。
*
* 用法:
* node scripts/seed-admin-user.js
*/
const path = require('path');
// bcryptjs 是 server/package.json 的依赖,只装在 server/node_modules 下(三个 workspace
// 各自独立 npm install,不是 pnpm 提升到根目录),scripts/ 在这层目录树里够不着它,
// 用 require.resolve 的 paths 选项显式指去 server/ 底下找。
const bcrypt = require(require.resolve('bcryptjs', { paths: [path.join(__dirname, '..', 'server')] }));
const userDb = require('../server/services/user-db');
const SEED_EMAIL = 'admin';
const SEED_PASSWORD = 'hex1234';
const SEED_DISPLAY_NAME = 'admin';
const SALT_ROUNDS = 10;
async function main() {
const existing = userDb.findByEmail(SEED_EMAIL);
if (existing) {
console.log(`[seed-admin-user] 账号 "${SEED_EMAIL}" 已存在(id=${existing.id}),跳过`);
return;
}
const passwordHash = await bcrypt.hash(SEED_PASSWORD, SALT_ROUNDS);
const user = userDb.createUser({
email: SEED_EMAIL,
passwordHash,
displayName: SEED_DISPLAY_NAME,
provider: 'local',
});
// role 列默认是 'user'(user-db.js 建表语句),种子账号需要 admin 权限
// 才能看到全部存量公司(38 号文档 §一.4 / §四 Phase 2)——createUser 不接收
// role 参数,直接改这一行。
userDb.getDb().prepare('UPDATE users SET role = ? WHERE id = ?').run('admin', user.id);
console.log(`[seed-admin-user] 已创建账号 "${SEED_EMAIL}"(id=${user.id}, role=admin)`);
}
main().catch((err) => {
console.error('[seed-admin-user] 失败:', err.message);
process.exit(1);
});