手动初始化数据库
数据库初始化由用户在数据库客户端或命令行中手动执行 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 仅跳过已存在的表,不会自动迁移已有列或约束。
管理员表
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
);
系统配置表
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 尚未被占用;已有账号时不要为了重跑脚本而重置其密码。
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。可在数据库客户端逐段执行,或者使用:
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 时选用的路径,不是框架自动发现并执行的文件。
执行后检查
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 语句。
管理员表
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
);
系统配置表
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、用户名未被占用,再手动执行:
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。
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 可用后手动执行:
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. 初始化与程序启动的边界
- SQL 文件放在
sql/或资源目录,不代表框架会自动执行;本指南约定由用户手动执行。 - 框架的数据源初始化和数据库 schema 初始化是两件事,不能混用“初始化”这个词而省略执行主体。
- 不需要为默认鉴权创建旧 Sa-Token 表,也不需要额外的持久化管理员会话表。
- 更新结构、补充管理员或重置密码都应通过用户明确执行的 SQL 完成,不加入每次启动流程。
- 后续文件上传、应用用户等功能所需的表,参照对应章节手动创建。旧 Token 存储资料已移至 16.md,不是本章的必做后续步骤。
