Skip to content

手动初始化数据库 ​

数据库初始化由用户在数据库客户端或命令行中手动执行 SQL。TioAdminDbConfiguration 只初始化连接池和 ActiveRecord,不执行本章 SQL,不创建或重置管理员。

不要在应用启动入口、BootConfiguration、初始化注解或请求处理中增加自动建表、自动插入账号逻辑。把 SQL 保留为可审阅的文件,在部署前由用户执行即可。

1. 选择需要的表 ​

表用途是否需要
tio_boot_admin_system_users后台管理员登录及资料使用后台账号功能时需要
tio_boot_admin_system_constants_config系统配置管理,供前端 ApiTable 示例使用使用配置管理页面时需要
上传、应用用户等业务表对应功能的数据启用功能时按相关章节手动创建
Sa-Token 表、自定义会话表历史或项目定制方案默认接入不需要,见 03.md

下面先给出 PostgreSQL,再保留 MySQL、SQLite 适配示例。只执行所选数据库的脚本,不要把不同数据库的建表语句混在一起。

2. PostgreSQL ​

先确认数据库客户端连接的是应用 jdbc.url 指向的数据库和 schema。在已有数据库上先核对表结构;IF NOT EXISTS 仅跳过已存在的表,不会自动迁移已有列或约束。

管理员表 ​

sql
CREATE TABLE IF NOT EXISTS tio_boot_admin_system_users (
  id BIGINT NOT NULL PRIMARY KEY,
  username VARCHAR(30) NOT NULL UNIQUE,
  password VARCHAR(100) NOT NULL DEFAULT '',
  nickname VARCHAR(30) NOT NULL,
  signature VARCHAR(200),
  title VARCHAR(50),
  group_name VARCHAR(50),
  tags JSON,
  notify_count INT DEFAULT 0,
  unread_count INT DEFAULT 0,
  country VARCHAR(50),
  access VARCHAR(20),
  geographic JSON,
  address VARCHAR(200),
  remark VARCHAR(500),
  dept_id BIGINT,
  post_ids VARCHAR(255),
  email VARCHAR(50) DEFAULT '',
  phone VARCHAR(11) DEFAULT '',
  sex SMALLINT DEFAULT 0,
  avatar VARCHAR(512) DEFAULT '',
  status SMALLINT NOT NULL DEFAULT 0,
  login_ip VARCHAR(50) DEFAULT '',
  login_date TIMESTAMP WITHOUT TIME ZONE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

系统配置表 ​

sql

CREATE TABLE IF NOT EXISTS tio_boot_admin_system_constants_config  (
  id bigint primary key,
  key_name varchar(255) NOT NULL,
  key_value text NOT NULL,
  remark varchar(256) NULL DEFAULT NULL,
  login_date TIMESTAMP WITHOUT TIME ZONE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

手动创建管理员 ​

框架 LoginService 对提交的密码调用 Sha256Utils.digestToHex,因此数据库中应保存 SHA-256 十六进制摘要。HTTP 登录请求传入原始密码,不能再次把摘要作为登录密码提交。

以下语句适用于支持内置 sha256(bytea) 的 PostgreSQL。先将示例密码改为自己设置的初始密码,并确认 id=1 尚未被占用;已有账号时不要为了重跑脚本而重置其密码。

sql
INSERT INTO tio_boot_admin_system_users
  (id, username, password, nickname, access, status, deleted)
VALUES
  (1, 'admin',
   encode(sha256(convert_to('请替换为你设置的初始密码', 'UTF8')), 'hex'),
   '管理员', 'admin', 0, 0)
ON CONFLICT (username) DO NOTHING;

ON CONFLICT (username) DO NOTHING 保留同名管理员。若其他用户已占用 ID 1,请自行选择一个未使用的 BIGINT ID。不要在文档仓库中保存替换后的真实密码脚本。

也可在本地使用框架的 Sha256Utils.digestToHex 生成摘要,再将摘要手动填入 INSERT;应用启动时不执行这个动作。不要把旧示例中的 admin/admin 当作部署默认账号。

手动执行文件 ​

将已经检查和填写的 PostgreSQL 语句保存为 sql/init-postgresql.sql。可在数据库客户端逐段执行,或者使用:

shell
psql -h 127.0.0.1 -p 5432 -U postgres -d defaultdb -W -v ON_ERROR_STOP=1 -1 -f sql/init-postgresql.sql

-W 交互输入数据库密码,ON_ERROR_STOP=1 遇错停止,-1 将该文件放在一个事务中执行。这里的文件名是用户保存 SQL 时选用的路径,不是框架自动发现并执行的文件。

执行后检查 ​

sql
SELECT id, username, nickname, access, status, deleted
FROM tio_boot_admin_system_users
WHERE username = 'admin';

SELECT count(*) FROM tio_boot_admin_system_constants_config;

确认账号存在后,按 01.md 启动服务,再验证后台登录和 ApiTable 分页。基础表建好不等于所有可选功能的数据都已初始化。

3. MySQL ​

仅使用 MySQL 时执行本节,并将 Maven 驱动与 JDBC URL 改成相应配置。以下示例保留原有表字段,不包含 DROP 语句。

管理员表 ​

sql

CREATE TABLE IF NOT EXISTS `tio_boot_admin_system_users`  (
  `id` bigint(20) primary key,
  `username` varchar(30) NOT NULL,
  `password` varchar(100) NOT NULL DEFAULT '',
  `nickname` varchar(30) NOT NULL,
  `signature` varchar(200) NULL DEFAULT NULL,
  `title` varchar(50) NULL DEFAULT NULL,
  `group_name` varchar(50) NULL DEFAULT NULL,
  `tags` json NULL,
  `notify_count` int(11) NULL DEFAULT 0,
  `unread_count` int(11) NULL DEFAULT 0,
  `country` varchar(50) NULL DEFAULT NULL,
  `access` varchar(20) NULL DEFAULT NULL,
  `geographic` json NULL,
  `address` varchar(200) NULL DEFAULT NULL,
  `remark` varchar(500) NULL DEFAULT NULL,
  `dept_id` bigint(20) NULL DEFAULT NULL,
  `post_ids` varchar(255) NULL DEFAULT NULL,
  `email` varchar(50) NULL DEFAULT '',
  `phone` varchar(11) NULL DEFAULT '',
  `sex` smallint(6) NULL DEFAULT 0,
  `avatar` varchar(512) NULL DEFAULT '',
  `status` smallint(6) NOT NULL DEFAULT 0,
  `login_ip` varchar(50) NULL DEFAULT '',
  `login_date` datetime(0) NULL DEFAULT NULL,
  `creator` varchar(64) NULL DEFAULT '',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `updater` varchar(64) NULL DEFAULT '',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `deleted` smallint(6) NOT NULL DEFAULT 0,
  `tenant_id` bigint(20) NOT NULL DEFAULT 0,
  UNIQUE INDEX `unique_username`(`username`) USING BTREE
);

系统配置表 ​

sql

CREATE TABLE IF NOT EXISTS `tio_boot_admin_system_constants_config`  (
  `id` bigint(20) primary key,
  `key_name` varchar(255) NOT NULL,
  `key_value` text NOT NULL,
  `remark` varchar(256) NULL DEFAULT NULL,
  `creator` varchar(64) NULL DEFAULT '',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `updater` varchar(64) NULL DEFAULT '',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `deleted` smallint(6) NOT NULL DEFAULT 0,
  `tenant_id` bigint(20) NOT NULL DEFAULT 0,
  UNIQUE INDEX `unique_key_name`(`key_name`) USING BTREE
);

手动创建管理员 ​

先替换密码并确认 ID、用户名未被占用,再手动执行:

sql
INSERT INTO tio_boot_admin_system_users
  (id, username, password, nickname, access, status, deleted)
SELECT 1, 'admin', SHA2('请替换为你设置的初始密码', 256), '管理员', 'admin', 0, 0
WHERE NOT EXISTS (
  SELECT 1 FROM tio_boot_admin_system_users WHERE username = 'admin'
);

4. SQLite ​

仅使用 SQLite 时执行本节。管理员表保留同名字段,方便使用框架已有的查询 SQL。

sql
CREATE TABLE IF NOT EXISTS tio_boot_admin_system_users (
  id BIGINT NOT NULL PRIMARY KEY,
  username VARCHAR(30) NOT NULL UNIQUE,
  password VARCHAR(100) NOT NULL DEFAULT '',
  nickname VARCHAR(30) NOT NULL,
  signature VARCHAR(200),
  title VARCHAR(50),
  group_name VARCHAR(50),
  tags JSON,
  notify_count INT DEFAULT 0,
  unread_count INT DEFAULT 0,
  country VARCHAR(50),
  access VARCHAR(20),
  geographic JSON,
  address VARCHAR(200),
  remark VARCHAR(500),
  dept_id BIGINT,
  post_ids VARCHAR(255),
  email VARCHAR(50) DEFAULT '',
  phone VARCHAR(11) DEFAULT '',
  sex SMALLINT DEFAULT 0,
  avatar VARCHAR(512) DEFAULT '',
  status SMALLINT NOT NULL DEFAULT 0,
  login_ip VARCHAR(50) DEFAULT '',
  login_date TIMESTAMP WITHOUT TIME ZONE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

SQLite 核心没有本章可直接依赖的 SHA-256 SQL 函数。请先在本地使用 Sha256Utils.digestToHex 计算密码摘要,再把下列占位符替换为真实的 64 位十六进制摘要,并确认 ID 可用后手动执行:

sql
INSERT INTO tio_boot_admin_system_users
  (id, username, password, nickname, access, status, deleted)
SELECT 1, 'admin', '<替换为64位SHA256十六进制摘要>', '管理员', 'admin', 0, 0
WHERE NOT EXISTS (
  SELECT 1 FROM tio_boot_admin_system_users WHERE username = 'admin'
);

使用配置管理页面时,还需按 SQLite 类型规则手动创建系统配置表,字段可参照上面的 PostgreSQL 配置表。其他业务表按实际启用的功能准备。

5. 手动重置管理员密码 ​

如果需要将已有 admin 账号的密码重置为 123456,请在应用连接的数据库和 schema 中手动执行以下 SQL。该语句适用于本章的 PostgreSQL、MySQL 和 SQLite 表结构。

password 字段保存 SHA-256 十六进制摘要,不能直接写入明文 123456。下面的摘要对应原始密码 123456:

sql
UPDATE tio_boot_admin_system_users
SET password = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92',
    update_time = CURRENT_TIMESTAMP
WHERE username = 'admin'
  AND deleted = 0;

确认影响 1 行;如果数据库客户端关闭了自动提交,还需提交事务。随后使用用户名 admin、密码 123456 登录。登录页面或 HTTP 登录请求应传入原始密码 123456,不要提交摘要,后端会计算摘要后校验。

如果未匹配到记录,可查询账号是否存在、是否已删除,以及是否被禁用:

sql
SELECT id, username, status, deleted
FROM tio_boot_admin_system_users
WHERE username = 'admin';

重置语句只修改密码和更新时间,不会创建账号或解除禁用、删除状态。该操作由用户按需手动执行,不要加入应用启动流程。

6. 初始化与程序启动的边界 ​

  • SQL 文件放在 sql/ 或资源目录,不代表框架会自动执行;本指南约定由用户手动执行。
  • 框架的数据源初始化和数据库 schema 初始化是两件事,不能混用“初始化”这个词而省略执行主体。
  • 不需要为默认鉴权创建旧 Sa-Token 表,也不需要额外的持久化管理员会话表。
  • 更新结构、补充管理员或重置密码都应通过用户明确执行的 SQL 完成,不加入每次启动流程。
  • 后续文件上传、应用用户等功能所需的表,参照对应章节手动创建。旧 Token 存储资料已移至 17.md,不是本章的必做后续步骤。

MIT Licensed