阅读时间 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.sqlPostgreSQL 数据库初始化 SQL 文件
init-data-sqlite.sqlSQLite 数据库初始化 SQL 文件

init-database.ts - 数据库初始化汇总脚本

按照逻辑顺序执行所有子初始化脚本:

  1. seed-roles.ts - 初始化角色和权限
  2. seed-settings.ts - 初始化系统设置
  3. seed-plans.ts - 初始化订阅计划
  4. 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
seoSEO 设置(站点 URL、OG 图片、多语言 SEO 等)16
security安全设置(登录保护、指纹保护等)8

订阅计划(3个)

计划月费年费月积分特性
Free$0$0100基础功能、社区支持
Basic$9.90$99.001000所有免费功能 + 优先支持 + 高级分析
Pro$29.90$299.005000所有基础功能 + 24/7 支持 + 自定义品牌 + API 访问

Warning

订阅计划的支付网关价格 ID(Stripe/Creem)需要在管理后台手动配置。

积分套餐(3个)

名称积分价格赠送积分
Small Pack500$5.000
Medium Pack2000$15.00200
Large Pack5000$35.001000

Warning

积分套餐的支付网关价格 ID(Stripe/Creem)需要在管理后台手动配置。

设置超级管理员

前提条件

  1. 数据库已初始化(运行过 init-database.ts
  2. 用户已在系统中注册

使用方法

方式 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: 如何添加自定义权限?

  1. 编辑 seed-roles.ts 中的 permissions 数组
  2. 添加新权限定义
  3. 在相应角色的 permissions 数组中添加权限名称
  4. 重新运行脚本

示例:

// 添加新权限
{ 
  module: 'reports', 
  action: 'view', 
  name: 'reports:view', 
  displayName: '查看报表', 
  description: '查看系统报表' 
}

// 在角色中添加
{
  name: 'admin',
  permissions: [
    // ... 其他权限
    'reports:view'
  ]
}

Q5: 脚本执行失败怎么办?

常见错误及解决方案:

  1. 数据库连接失败

    • 检查 .env 文件中的数据库配置
    • 确保数据库服务正在运行
  2. 表不存在

    • 运行 pnpm drizzle-kit migrate 创建表
  3. 用户未找到

    • 确认用户已注册
    • 检查邮箱/用户名拼写
  4. 角色未找到

    • 先运行 init-database.ts 初始化角色

Q6: SQL 文件和 TypeScript 脚本有什么区别?

特性TypeScript 脚本SQL 文件
幂等性✅ 检查数据是否存在❌ 可能导致重复数据
灵活性✅ 可以添加业务逻辑❌ 仅支持 SQL 语句
跨数据库✅ 通过 Drizzle ORM❌ 需要不同的 SQL 文件
执行速度较慢较快
适用场景开发/生产环境数据库迁移/备份恢复

注意事项

  1. 生产环境:在生产环境运行前,请先在测试环境验证
  2. 备份数据:重要操作前建议备份数据库
  3. 权限管理:超级管理员拥有所有权限,请谨慎分配
  4. 支付配置:订阅计划和积分包的支付网关价格ID需要手动配置
  5. 多语言:如需支持多语言,需要在 public/locales 中添加相应翻译
  6. 环境变量:生产环境执行时需要使用 --env-file=.env.production.local 参数