b254606003
避免 parent_id 懒加载把节点自身混入子级导致无限嵌套,并补充 department 回归用例与文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
152 lines
5.1 KiB
Go
152 lines
5.1 KiB
Go
package app
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
. "code.hoteas.com/golang/hotime/db"
|
||
)
|
||
|
||
// SetupMySQLDatabase 为 MySQL 数据库创建测试表并灌入测试数据
|
||
func SetupMySQLDatabase(db *HoTimeDB) {
|
||
if db.Type != "mysql" {
|
||
return
|
||
}
|
||
|
||
fmt.Println("[MySQL Setup] 开始初始化 MySQL 数据库测试环境...")
|
||
|
||
prefix := db.GetPrefix()
|
||
createMySQLTables(db, prefix)
|
||
seedTestData(db, "MySQL")
|
||
|
||
fmt.Println("[MySQL Setup] MySQL 数据库测试环境初始化完成")
|
||
}
|
||
|
||
func mysqlTableExists(db *HoTimeDB, tableName string) bool {
|
||
rows := db.Query("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?", tableName)
|
||
return len(rows) > 0
|
||
}
|
||
|
||
func createMySQLTables(db *HoTimeDB, prefix string) {
|
||
// admin 表
|
||
tbl := prefix + "admin"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`name` varchar(100) DEFAULT NULL," +
|
||
"`phone` varchar(20) DEFAULT NULL," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`password` varchar(100) DEFAULT NULL," +
|
||
"`role_id` int(11) DEFAULT '0'," +
|
||
"`title` varchar(100) DEFAULT NULL," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"`modify_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)," +
|
||
"UNIQUE KEY `uk_phone` (`phone`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
|
||
// ctg 分类表
|
||
tbl = prefix + "ctg"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`name` varchar(100) DEFAULT NULL," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"`modify_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
|
||
// article 文章表
|
||
tbl = prefix + "article"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`title` varchar(200) DEFAULT NULL," +
|
||
"`author` varchar(100) DEFAULT NULL," +
|
||
"`content` text," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`click_num` int(11) DEFAULT '0'," +
|
||
"`sort` int(11) DEFAULT '0'," +
|
||
"`img` varchar(500) DEFAULT NULL," +
|
||
"`ctg_id` int(11) DEFAULT '0'," +
|
||
"`admin_id` int(11) DEFAULT '0'," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"`modify_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)," +
|
||
"KEY `idx_state` (`state`)," +
|
||
"KEY `idx_ctg_id` (`ctg_id`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
|
||
// department 部门表(树形结构,供通用 CRUD 树查询测试使用;
|
||
// 不叫 org 是因为 config/admin.json 遗留 flow 会给 org 注入 admin_id 过滤)
|
||
// 注意:MakeCode 路由在 Init 时按库中已有表生成,
|
||
// 全新空库首次运行建表晚于 Init,/admin/department/search 需第二次运行才可用
|
||
tbl = prefix + "department"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`name` varchar(100) DEFAULT NULL COMMENT '部门名称'," +
|
||
"`parent_id` int(11) DEFAULT NULL COMMENT '父级ID'," +
|
||
"`parent_ids` varchar(255) DEFAULT NULL COMMENT '层级路径'," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"`modify_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)," +
|
||
"KEY `idx_parent_id` (`parent_id`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表'")
|
||
}
|
||
|
||
// test_batch 测试批量表
|
||
tbl = prefix + "test_batch"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`name` varchar(100) DEFAULT NULL," +
|
||
"`title` varchar(200) DEFAULT NULL," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
|
||
// cached 老版本缓存表(兼容模式测试需要)
|
||
tbl = prefix + "cached"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`key` varchar(64) DEFAULT NULL," +
|
||
"`value` text," +
|
||
"`endtime` bigint(20) DEFAULT NULL," +
|
||
"`time` bigint(20) DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
|
||
// hotime_cache 新版缓存表
|
||
tbl = prefix + "hotime_cache"
|
||
if !mysqlTableExists(db, tbl) {
|
||
fmt.Println("[MySQL Setup] 创建表:", tbl)
|
||
db.Exec("CREATE TABLE `" + tbl + "` (" +
|
||
"`id` int(11) unsigned NOT NULL AUTO_INCREMENT," +
|
||
"`key` varchar(64) NOT NULL," +
|
||
"`value` text," +
|
||
"`end_time` datetime DEFAULT NULL," +
|
||
"`state` int(2) DEFAULT '0'," +
|
||
"`create_time` datetime DEFAULT NULL," +
|
||
"`modify_time` datetime DEFAULT NULL," +
|
||
"PRIMARY KEY (`id`)," +
|
||
"UNIQUE KEY `uk_key` (`key`)," +
|
||
"KEY `idx_end_time` (`end_time`)" +
|
||
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4")
|
||
}
|
||
}
|