阅读时间 11 分钟最后更新: 2025-12-31 12:12
数据库初始化指南
本指南介绍如何使用数据库初始化脚本来设置系统的基础数据。
脚本概览
scripts/database/ 目录包含以下脚本:
| 脚本文件 | 说明 |
|---|---|
init-database.ts | 数据库初始化汇总脚本,按顺序执行所有子脚本 |
seed-roles.ts | 初始化角色和权限系统 |
seed-settings.ts | 初始化系统设置 |
seed-plans.ts | 初始化订阅计划 |
seed-packages.ts | 初始化积分套餐 |
set-super-admin.ts | 设置超级管理员 |
init-data-postgres.sql | PostgreSQL 数据库初始化 SQL 文件 |
init-data-sqlite.sql | SQLite 数据库初始化 SQL 文件 |
init-database.ts - 数据库初始化汇总脚本
按照逻辑顺序执行所有子初始化脚本:
seed-roles.ts- 初始化角色和权限seed-settings.ts- 初始化系统设置seed-plans.ts- 初始化订阅计划seed-packages.ts- 初始化积分套餐
set-super-admin.ts - 设置超级管理员脚本
将指定用户设置为超级管理员,支持:
- ✅ 通过用户ID设置
- ✅ 通过邮箱设置
- ✅ 通过用户名设置
- ✅ 自动启用被禁用的账号
- ✅ 自动创建管理员记录
初始化方式
方式一:使用 TypeScript 脚本(推荐)
步骤 1:运行数据库迁移
首先确保数据库表结构已创建:
# 生成迁移文件(如果有schema变更)
pnpm drizzle-kit generate
# 推送数据库 schema 到数据库(如果有变更)
pnpm drizzle-kit push
# 应用迁移
pnpm drizzle-kit migrate
步骤 2:初始化基础数据
开发环境:
pnpm tsx scripts/database/init-database.ts
生产环境:
pnpm tsx --env-file=.env.production.local scripts/database/init-database.ts
输出示例:
🚀 开始全量数据库初始化...
==================================================
执行脚本: seed-roles.ts...
开始初始化角色和权限...
插入权限...
✓ 创建权限: 查看用户 (users:view)
✓ 创建权限: 编辑用户 (users:update)
...
插入角色...
✓ 创建角色: 超级管理员 (super_admin) - 58个权限
✓ 创建角色: 管理员 (admin) - 42个权限
...
✅ 角色和权限初始化完成!
✅ seed-roles.ts 执行成功
执行脚本: seed-settings.ts...
开始初始化系统设置...
✓ 创建设置: dateFormat
✓ 创建设置: timeFormat
...
✅ 系统设置初始化完成!
✅ seed-settings.ts 执行成功
执行脚本: seed-plans.ts...
开始初始化订阅计划...
✓ 创建计划: Free (free)
✓ 创建计划: Basic (basic)
✓ 创建计划: Pro (pro)
✅ 订阅计划初始化完成!
✅ seed-plans.ts 执行成功
执行脚本: seed-packages.ts...
开始初始化积分套餐...
✓ 创建套餐: Small Pack (500 credits)
✓ 创建套餐: Medium Pack (2000 credits)
✓ 创建套餐: Large Pack (5000 credits)
✅ 积分套餐初始化完成!
✅ seed-packages.ts 执行成功
==================================================
🎉 数据库所有初始化任务已完成!
提示: 您现在可以使用 scripts/database/set-super-admin.ts 设置管理员账号。
单独运行子脚本
如果只需要初始化部分数据,可以单独运行子脚本:
# 仅初始化角色和权限
pnpm tsx scripts/database/seed-roles.ts
# 仅初始化系统设置
pnpm tsx scripts/database/seed-settings.ts
# 仅初始化订阅计划
pnpm tsx scripts/database/seed-plans.ts
# 仅初始化积分套餐
pnpm tsx scripts/database/seed-packages.ts
方式二:使用 SQL 文件
如果需要直接在数据库中执行 SQL,可以使用预生成的 SQL 文件:
PostgreSQL:
psql -U your_user -d your_database -f scripts/database/init-data-postgres.sql
SQLite:
sqlite3 your_database.db < scripts/database/init-data-sqlite.sql
Note
SQL 文件包含完整的初始化数据,包括权限、角色、角色权限关联、系统设置、订阅计划和积分套餐。
初始化的数据详情
权限列表(58个)
用户管理(8个)
| 权限名称 | 说明 |
|---|---|
| users:view | 查看用户 |
| users:update | 编辑用户 |
| users:delete | 删除用户 |
| users:export | 导出用户 |
| users:sendEmail | 发送邮件 |
| users:disable | 禁用用户 |
| users:enable | 启用用户 |
| users:setAsAdmin | 设为管理员 |
订阅管理(4个)
| 权限名称 | 说明 |
|---|---|
| subscriptions:view | 查看订阅 |
| subscriptions:update | 修改订阅 |
| subscriptions:delete | 取消订阅 |
| subscriptions:export | 导出订阅 |
订阅计划管理(4个)
| 权限名称 | 说明 |
|---|---|
| plans:view | 查看计划 |
| plans:create | 创建计划 |
| plans:update | 编辑计划 |
| plans:delete | 删除计划 |
订单管理(3个)
| 权限名称 | 说明 |
|---|---|
| orders:view | 查看订单 |
| orders:refund | 订单退款 |
| orders:export | 导出订单 |
积分管理(3个)
| 权限名称 | 说明 |
|---|---|
| credits:view | 查看积分 |
| credits:update | 调整积分 |
| credits:export | 导出积分 |
积分包管理(4个)
| 权限名称 | 说明 |
|---|---|
| packages:view | 查看积分包 |
| packages:create | 创建积分包 |
| packages:update | 编辑积分包 |
| packages:delete | 删除积分包 |
积分交易记录(2个)
| 权限名称 | 说明 |
|---|---|
| transactions:view | 查看交易记录 |
| transactions:export | 导出交易记录 |
仪表盘(1个)
| 权限名称 | 说明 |
|---|---|
| dashboard:view | 查看仪表盘 |
系统管理(22个)
| 权限名称 | 说明 |
|---|---|
| system:admins:view | 查看管理员 |
| system:admins:create | 添加管理员 |
| system:admins:update | 编辑管理员 |
| system:admins:delete | 删除管理员 |
| system:roles:view | 查看角色 |
| system:roles:create | 创建角色 |
| system:roles:update | 编辑角色 |
| system:roles:delete | 删除角色 |
| system:permissions:view | 查看权限 |
| system:permissions:create | 创建权限 |
| system:permissions:update | 编辑权限 |
| system:permissions:delete | 删除权限 |
| system:logs:view | 查看日志 |
| system:logs:export | 导出日志 |
| system:settings:view | 查看设置 |
| system:settings:update | 修改设置 |
| system:notifications:view | 查看通知 |
| system:notifications:create | 创建通知 |
| system:notifications:update | 编辑通知 |
| system:notifications:delete | 删除通知 |
| system:notifications:publish | 发布通知 |
邮件订阅管理(4个)
| 权限名称 | 说明 |
|---|---|
| newsletter:view | 查看订阅内容 |
| newsletter:create | 创建订阅内容 |
| newsletter:update | 编辑订阅内容 |
| newsletter:delete | 删除订阅内容 |
联系消息管理(4个)
| 权限名称 | 说明 |
|---|---|
| contact:view | 查看联系消息 |
| contact:update | 处理联系消息 |
| contact:delete | 删除联系消息 |
| contact:reply | 回复联系消息 |
角色列表(4个)
| 角色 | 权限数量 | 说明 |
|---|---|---|
| 超级管理员 (super_admin) | 58 | 拥有系统全部权限 |
| 管理员 (admin) | 42 | 拥有大部分管理权限,不包括管理员和角色管理 |
| 运营人员 (operator) | 32 | 负责日常运营工作 |
| 查看员 (viewer) | 18 | 只读权限 |
系统设置
系统设置分为以下几组:
| 分组 | 说明 | 设置项数量 |
|---|---|---|
| general | 通用设置(日期格式、时区、站点信息、维护模式等) | 13 |
| business | 业务设置(登录方式、支付网关、积分配置等) | 9 |
| company | 公司信息(公司名称、联系方式等) | 9 |
| seo | SEO 设置(站点 URL、OG 图片、多语言 SEO 等) | 16 |
| security | 安全设置(登录保护、指纹保护等) | 8 |
订阅计划(3个)
| 计划 | 月费 | 年费 | 月积分 | 特性 |
|---|---|---|---|---|
| Free | $0 | $0 | 100 | 基础功能、社区支持 |
| Basic | $9.90 | $99.00 | 1000 | 所有免费功能 + 优先支持 + 高级分析 |
| Pro | $29.90 | $299.00 | 5000 | 所有基础功能 + 24/7 支持 + 自定义品牌 + API 访问 |
Warning
订阅计划的支付网关价格 ID(Stripe/Creem)需要在管理后台手动配置。
积分套餐(3个)
| 名称 | 积分 | 价格 | 赠送积分 |
|---|---|---|---|
| Small Pack | 500 | $5.00 | 0 |
| Medium Pack | 2000 | $15.00 | 200 |
| Large Pack | 5000 | $35.00 | 1000 |
Warning
积分套餐的支付网关价格 ID(Stripe/Creem)需要在管理后台手动配置。
设置超级管理员
前提条件
- 数据库已初始化(运行过
init-database.ts) - 用户已在系统中注册
使用方法
方式 1:通过用户ID设置
pnpm tsx scripts/database/set-super-admin.ts --userId=<USER_ID>
方式 2:通过邮箱设置
pnpm tsx scripts/database/set-super-admin.ts --email=admin@example.com
方式 3:通过用户名设置
pnpm tsx scripts/database/set-super-admin.ts --username=admin
生产环境
pnpm tsx --env-file=.env.production.local scripts/database/set-super-admin.ts --email=admin@example.com
输出示例
🔧 开始设置超级管理员...
==================================================
🔍 通过邮箱查找: admin@example.com
✓ 找到用户:
ID: abc123def456
姓名: Admin User
邮箱: admin@example.com
用户名: admin
🔍 查找超级管理员角色...
✓ 找到角色: 超级管理员
🔍 检查管理员状态...
✓ 已创建管理员记录
🔍 检查角色分配...
✓ 已分配超级管理员角色
==================================================
✅ 超级管理员设置完成!
用户信息:
ID: abc123def456
姓名: Admin User
邮箱: admin@example.com
用户名: admin
拥有角色:
- 超级管理员 (super_admin)
提示:
- 该用户现在可以访问管理后台的所有功能
- 管理后台地址: /admin
常见问题
Q1: 如何获取用户ID?
方法 1:通过数据库查询
SELECT id, name, email, username FROM user WHERE email = 'user@example.com';
方法 2:通过管理后台
- 登录管理后台
- 进入用户管理页面
- 查看用户详情
方法 3:使用邮箱或用户名
- 直接使用
--email或--username参数,无需查询ID
Q2: 可以重复运行初始化脚本吗?
可以。脚本会检查数据是否已存在:
- 已存在的权限会跳过
- 已存在的角色会更新权限
- 已存在的系统设置会跳过
- 已存在的订阅计划和积分包会跳过
Q3: 如何修改订阅计划或积分包?
方法 1:通过管理后台
- 登录管理后台
- 进入相应的管理页面进行修改
方法 2:直接修改脚本
- 编辑
seed-plans.ts中的plans数组 - 编辑
seed-packages.ts中的packages数组 - 重新运行脚本
Q4: 如何添加自定义权限?
- 编辑
seed-roles.ts中的permissions数组 - 添加新权限定义
- 在相应角色的
permissions数组中添加权限名称 - 重新运行脚本
示例:
// 添加新权限
{
module: 'reports',
action: 'view',
name: 'reports:view',
displayName: '查看报表',
description: '查看系统报表'
}
// 在角色中添加
{
name: 'admin',
permissions: [
// ... 其他权限
'reports:view'
]
}
Q5: 脚本执行失败怎么办?
常见错误及解决方案:
-
数据库连接失败
- 检查
.env文件中的数据库配置 - 确保数据库服务正在运行
- 检查
-
表不存在
- 运行
pnpm drizzle-kit migrate创建表
- 运行
-
用户未找到
- 确认用户已注册
- 检查邮箱/用户名拼写
-
角色未找到
- 先运行
init-database.ts初始化角色
- 先运行
Q6: SQL 文件和 TypeScript 脚本有什么区别?
| 特性 | TypeScript 脚本 | SQL 文件 |
|---|---|---|
| 幂等性 | ✅ 检查数据是否存在 | ❌ 可能导致重复数据 |
| 灵活性 | ✅ 可以添加业务逻辑 | ❌ 仅支持 SQL 语句 |
| 跨数据库 | ✅ 通过 Drizzle ORM | ❌ 需要不同的 SQL 文件 |
| 执行速度 | 较慢 | 较快 |
| 适用场景 | 开发/生产环境 | 数据库迁移/备份恢复 |
注意事项
- 生产环境:在生产环境运行前,请先在测试环境验证
- 备份数据:重要操作前建议备份数据库
- 权限管理:超级管理员拥有所有权限,请谨慎分配
- 支付配置:订阅计划和积分包的支付网关价格ID需要手动配置
- 多语言:如需支持多语言,需要在
public/locales中添加相应翻译 - 环境变量:生产环境执行时需要使用
--env-file=.env.production.local参数