fix(education): align Flyway delivery review

This commit is contained in:
2026-07-30 14:10:52 +08:00
parent 2d97858680
commit 191811b643
59 changed files with 19 additions and 23736 deletions

View File

@@ -1,21 +0,0 @@
-- =============================================
-- Education 模块 — 题库目录表回滚 DDL
-- Ticket #20 rollback
-- =============================================
-- WARNING: This is an explicit data-destruction script.
-- It is NOT part of application version rollback.
-- Application version rollback preserves these tables and their data;
-- this script is only used when permanently removing the catalog module.
-- =============================================
DROP TABLE IF EXISTS `education_question_collection_question`;
DROP TABLE IF EXISTS `education_practice_blueprint`;
DROP TABLE IF EXISTS `education_question`;
DROP TABLE IF EXISTS `education_question_collection`;
DROP TABLE IF EXISTS `education_content_node`;
DROP TABLE IF EXISTS `education_content_entry`;
DROP TABLE IF EXISTS `education_category`;
DROP TABLE IF EXISTS `education_subject`;
DROP TABLE IF EXISTS `education_major`;
DROP TABLE IF EXISTS `education_school`;
DROP TABLE IF EXISTS `education_region`;

View File

@@ -1,349 +0,0 @@
-- =============================================
-- Education 模块 — 题库目录原生表 DDL
-- Ticket #20: 原生实现题库目录浏览,替换 Scalar adapter
-- Migration: 008
-- Prerequisites: 000-education-schema.sql (database creation)
-- 001-education-tenant-seed.sql (tenant seed data)
-- =============================================
-- =============================================
-- Preconditions
-- =============================================
-- Verify none of these tables already exist:
-- SELECT TABLE_NAME FROM information_schema.tables
-- WHERE table_schema = DATABASE()
-- AND TABLE_NAME IN (
-- 'education_region', 'education_school', 'education_major',
-- 'education_subject', 'education_category',
-- 'education_content_entry', 'education_content_node',
-- 'education_question_collection', 'education_question',
-- 'education_practice_blueprint', 'education_question_collection_question'
-- );
-- Result MUST be 0 before executing this migration.
-- =============================================
-- 1. 地区表
-- =============================================
-- Indexes:
-- idx_tenant — tenant-scoped queries (tenant-aware interceptor default)
-- idx_tenant_active_order — active region listing ordered by display order
CREATE TABLE `education_region` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统地区 ID',
`name` VARCHAR(100) NOT NULL COMMENT '地区名称',
`code` VARCHAR(32) DEFAULT NULL COMMENT '地区编码',
`short_name` VARCHAR(50) DEFAULT NULL COMMENT '地区简称',
`full_name` VARCHAR(200) DEFAULT NULL COMMENT '地区全称',
`icon` VARCHAR(500) DEFAULT NULL COMMENT '地区图标 URL',
`pinyin` VARCHAR(200) DEFAULT NULL COMMENT '地区拼音',
`is_hot` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否热门地区',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_active_order` (`tenant_id`, `is_active`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-地区';
-- =============================================
-- 2. 院校表
-- =============================================
CREATE TABLE `education_school` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统院校 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`module_id` BIGINT DEFAULT NULL COMMENT '地区模块 ID',
`name` VARCHAR(200) NOT NULL COMMENT '院校名称',
`professional_exam_date` VARCHAR(200) DEFAULT NULL COMMENT '专业考试日期说明',
`metadata` JSON DEFAULT NULL COMMENT '院校扩展数据',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_region` (`tenant_id`, `region_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-院校';
-- =============================================
-- 3. 专业表
-- =============================================
CREATE TABLE `education_major` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统专业 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`school_id` BIGINT DEFAULT NULL COMMENT '院校 ID',
`name` VARCHAR(200) NOT NULL COMMENT '专业名称',
`description` VARCHAR(500) DEFAULT NULL COMMENT '专业说明',
`study_tips` VARCHAR(500) DEFAULT NULL COMMENT '学习建议',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_school` (`tenant_id`, `school_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-专业';
-- =============================================
-- 4. 科目表
-- =============================================
CREATE TABLE `education_subject` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`school_id` BIGINT DEFAULT NULL COMMENT '院校 ID',
`major_id` BIGINT DEFAULT NULL COMMENT '专业 ID',
`module_id` BIGINT DEFAULT NULL COMMENT '地区模块 ID',
`name` VARCHAR(200) NOT NULL COMMENT '科目名称',
`type` VARCHAR(50) DEFAULT NULL COMMENT '科目类型',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_major` (`tenant_id`, `major_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-科目';
-- =============================================
-- 5. 题目分类表
-- =============================================
CREATE TABLE `education_category` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`subject_id` BIGINT DEFAULT NULL COMMENT '科目 ID',
`legacy_node_id` VARCHAR(64) DEFAULT NULL COMMENT '旧导航节点 ID',
`name` VARCHAR(200) NOT NULL COMMENT '分类名称',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_subject` (`tenant_id`, `subject_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题目分类';
-- =============================================
-- 6. 内容入口表
-- =============================================
-- Indexes:
-- uk_tenant_entry_key — per-tenant uniqueness for entry key
CREATE TABLE `education_content_entry` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`legacy_id` VARCHAR(64) DEFAULT NULL COMMENT '旧系统内容入口 ID',
`region_id` BIGINT DEFAULT NULL COMMENT '地区 ID',
`entry_key` VARCHAR(100) NOT NULL COMMENT '内容入口唯一键',
`name` VARCHAR(200) NOT NULL COMMENT '内容入口名称',
`entry_type` VARCHAR(50) NOT NULL COMMENT '内容入口类型',
`icon` VARCHAR(500) DEFAULT NULL COMMENT '图标',
`route` VARCHAR(200) DEFAULT NULL COMMENT '前端路由',
`description` VARCHAR(500) DEFAULT NULL COMMENT '入口说明',
`visibility` VARCHAR(50) NOT NULL DEFAULT 'PUBLIC' COMMENT '可见性',
`access_rules` JSON DEFAULT NULL COMMENT '访问规则 JSON',
`layout_config` JSON DEFAULT NULL COMMENT '布局配置 JSON',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
UNIQUE KEY `uk_tenant_entry_key` (`tenant_id`, `entry_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-内容入口';
-- =============================================
-- 7. 内容节点表(树形结构)
-- =============================================
-- Indexes:
-- idx_entry_parent — supports tree navigation: find children of a parent within an entry
-- idx_tenant_entry — tenant-scoped queries by entry
CREATE TABLE `education_content_node` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`entry_id` BIGINT NOT NULL COMMENT '内容入口 ID',
`parent_id` BIGINT DEFAULT NULL COMMENT '父节点 IDNULL=根节点)',
`name` VARCHAR(200) NOT NULL COMMENT '节点名称',
`title` VARCHAR(200) DEFAULT NULL COMMENT '节点标题',
`node_type` VARCHAR(50) NOT NULL COMMENT '节点类型',
`marker_type` VARCHAR(50) DEFAULT NULL COMMENT '节点标记类型',
`depth` INT NOT NULL DEFAULT 0 COMMENT '树深度',
`is_leaf` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否叶子节点',
`is_selectable` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否可被选择',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_entry_parent` (`entry_id`, `parent_id`),
KEY `idx_tenant_entry` (`tenant_id`, `entry_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-内容节点';
-- =============================================
-- 8. 题集表
-- =============================================
CREATE TABLE `education_question_collection` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`entry_id` BIGINT DEFAULT NULL COMMENT '内容入口 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '内容节点 ID',
`name` VARCHAR(200) NOT NULL COMMENT '题集名称',
`title` VARCHAR(200) DEFAULT NULL COMMENT '题集标题',
`collection_type` VARCHAR(50) NOT NULL COMMENT '题集类型',
`question_count` INT NOT NULL DEFAULT 0 COMMENT '题目数量',
`duration_minutes` INT DEFAULT NULL COMMENT '建议作答时长(分钟)',
`access_rules` JSON DEFAULT NULL COMMENT '访问规则 JSON',
`is_active` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_entry` (`tenant_id`, `entry_id`),
KEY `idx_tenant_node` (`tenant_id`, `node_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题集';
-- =============================================
-- 9. 题目表(核心表)
-- =============================================
-- Indexes:
-- idx_tenant_published — 查询已发布题目(主查询路径)
-- idx_tenant_collection — 按题集筛选
-- idx_tenant_subject — 按科目筛选
-- idx_tenant_node — 按内容节点筛选
-- idx_tenant_type_diff — 按题型和难度筛选
-- Security note: correct_answer 和 explanation 列存在但需在 service 层过滤;
-- 学生端 DTO 绝不得包含这两列。
-- Options JSON: 存储 label, content, isCorrect, order — 完整选项数据。
-- Service 层在学生端返回前剥离 isCorrect。
CREATE TABLE `education_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`content_version` INT NOT NULL DEFAULT 1 COMMENT '内容版本号(递增,保证历史报告稳定性)',
`stem` TEXT NOT NULL COMMENT '题干',
`type` VARCHAR(32) NOT NULL COMMENT '题型',
`type_label` VARCHAR(50) DEFAULT NULL COMMENT '题型显示名称',
`difficulty` VARCHAR(32) DEFAULT NULL COMMENT '难度',
`question_content` JSON DEFAULT NULL COMMENT '题干结构化内容(兼容复杂题型)',
`options` JSON NOT NULL COMMENT '选项 JSON [{label, content, isCorrect, order}]',
`correct_answer` VARCHAR(500) DEFAULT NULL COMMENT '正确答案(敏感字段,学生端不可返回)',
`explanation` TEXT DEFAULT NULL COMMENT '答案解析(敏感字段,学生端不可返回)',
`analysis` TEXT DEFAULT NULL COMMENT '深度解析(敏感字段)',
`status` VARCHAR(20) NOT NULL DEFAULT 'PUBLISHED' COMMENT '题目状态PUBLISHED-已发布, HIDDEN-已隐藏, DRAFT-草稿, INACTIVE-停用',
`is_published` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否已发布',
`collection_id` BIGINT DEFAULT NULL COMMENT '所属题集 ID',
`subject_id` BIGINT DEFAULT NULL COMMENT '所属科目 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '所属内容节点 ID',
`tags` JSON DEFAULT NULL COMMENT '标签 JSON 数组',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '显示排序值',
`metadata` JSON DEFAULT NULL COMMENT '扩展元数据',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_published` (`tenant_id`, `is_published`, `status`),
KEY `idx_tenant_collection` (`tenant_id`, `collection_id`),
KEY `idx_tenant_subject` (`tenant_id`, `subject_id`),
KEY `idx_tenant_node` (`tenant_id`, `node_id`),
KEY `idx_tenant_type_diff` (`tenant_id`, `type`, `difficulty`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题目';
-- =============================================
-- 10. 练习蓝图表
-- =============================================
CREATE TABLE `education_practice_blueprint` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户编号',
`mode` VARCHAR(50) NOT NULL COMMENT '练习模式',
`entry_id` BIGINT DEFAULT NULL COMMENT '内容入口 ID',
`node_id` BIGINT DEFAULT NULL COMMENT '内容节点 ID',
`collection_id` BIGINT DEFAULT NULL COMMENT '题集 ID',
`question_limit` INT DEFAULT NULL COMMENT '题目数量限制',
`duration_minutes` INT DEFAULT NULL COMMENT '建议作答时长(分钟)',
`eligible_count` INT NOT NULL DEFAULT 0 COMMENT '符合条件的题目数',
`total_count` INT NOT NULL DEFAULT 0 COMMENT '题库总数',
`available_types` JSON DEFAULT NULL COMMENT '可用题型列表 JSON',
`available_difficulties` JSON DEFAULT NULL COMMENT '可用难度列表 JSON',
`min_questions` INT NOT NULL DEFAULT 1 COMMENT '最少题目数',
`max_questions` INT NOT NULL DEFAULT 200 COMMENT '最多题目数',
`suggested_count` INT NOT NULL DEFAULT 20 COMMENT '建议题目数',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_tenant` (`tenant_id`),
KEY `idx_tenant_collection` (`tenant_id`, `collection_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-练习蓝图';
-- =============================================
-- 11. 题集-题目关联表(多对多)
-- =============================================
CREATE TABLE `education_question_collection_question` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
`collection_id` BIGINT NOT NULL COMMENT '题集 ID',
`question_id` BIGINT NOT NULL COMMENT '题目 ID',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序值',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_collection_question` (`collection_id`, `question_id`),
KEY `idx_question` (`question_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教育-题集题目关联';
-- =============================================
-- Post-migration verification queries
-- =============================================
-- Verify all tables exist:
-- SELECT TABLE_NAME FROM information_schema.tables
-- WHERE table_schema = DATABASE()
-- AND TABLE_NAME LIKE 'education_%'
-- ORDER BY TABLE_NAME;
-- Verify indexes (sample):
-- SHOW INDEX FROM education_question WHERE Key_name IN ('idx_tenant_published', 'idx_tenant_collection');
-- SHOW INDEX FROM education_content_node WHERE Key_name = 'idx_entry_parent';
-- Verify no orphan data (should be 0 after fresh migration for catalog tables):
-- SELECT 'region', COUNT(*) FROM education_region
-- UNION ALL SELECT 'school', COUNT(*) FROM education_school
-- UNION ALL SELECT 'major', COUNT(*) FROM education_major
-- UNION ALL SELECT 'subject', COUNT(*) FROM education_subject
-- UNION ALL SELECT 'category', COUNT(*) FROM education_category
-- UNION ALL SELECT 'content_entry', COUNT(*) FROM education_content_entry
-- UNION ALL SELECT 'content_node', COUNT(*) FROM education_content_node
-- UNION ALL SELECT 'question_collection', COUNT(*) FROM education_question_collection
-- UNION ALL SELECT 'question', COUNT(*) FROM education_question
-- UNION ALL SELECT 'practice_blueprint', COUNT(*) FROM education_practice_blueprint
-- UNION ALL SELECT 'collection_question', COUNT(*) FROM education_question_collection_question;

View File

@@ -1,174 +0,0 @@
-- =============================================
-- Member 模块建表 — 从 PostgreSQL 测试 SQL 转换为 MySQL
-- 用于本地开发环境补全 member 表
-- =============================================
-- 1. 会员配置表
CREATE TABLE IF NOT EXISTS member_config (
id bigint NOT NULL AUTO_INCREMENT,
group_id bigint NULL DEFAULT NULL COMMENT '用户分组编号',
level_id bigint NULL DEFAULT NULL COMMENT '等级编号',
tenant_id bigint NOT NULL DEFAULT 0,
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员配置表';
-- 2. 会员标签表
CREATE TABLE IF NOT EXISTS member_tag (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL COMMENT '标签名称',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员标签';
-- 3. 用户分组表
CREATE TABLE IF NOT EXISTS member_group (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL COMMENT '分组名称',
remark varchar(255) DEFAULT '' COMMENT '备注',
status tinyint NOT NULL DEFAULT 0 COMMENT '状态',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员分组';
-- 4. 会员等级表(完整版,覆盖之前创建的简化版)
CREATE TABLE IF NOT EXISTS member_level (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL COMMENT '等级名称',
experience int NOT NULL DEFAULT 0 COMMENT '所需经验',
level int NOT NULL DEFAULT 1 COMMENT '等级',
discount_percent int NOT NULL DEFAULT 100 COMMENT '折扣百分比',
icon varchar(255) DEFAULT '' COMMENT '图标',
background_url varchar(255) DEFAULT '' COMMENT '背景图',
status tinyint NOT NULL DEFAULT 0 COMMENT '状态',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员等级';
-- 5. 会员等级记录表
CREATE TABLE IF NOT EXISTS member_level_record (
id bigint NOT NULL AUTO_INCREMENT,
user_id bigint NOT NULL COMMENT '用户编号',
level_id bigint NOT NULL COMMENT '等级编号',
level_name varchar(50) DEFAULT '' COMMENT '等级名称',
experience int NOT NULL DEFAULT 0 COMMENT '当前经验',
remark varchar(255) DEFAULT '' COMMENT '备注',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员等级记录';
-- 6. 会员经验记录表
CREATE TABLE IF NOT EXISTS member_experience_record (
id bigint NOT NULL AUTO_INCREMENT,
user_id bigint NOT NULL COMMENT '用户编号',
biz_type varchar(50) NOT NULL COMMENT '业务类型',
biz_id varchar(100) NOT NULL COMMENT '业务编号',
title varchar(100) NOT NULL COMMENT '标题',
experience int NOT NULL COMMENT '经验',
total_experience int NOT NULL DEFAULT 0 COMMENT '累计经验',
description varchar(255) DEFAULT '' COMMENT '描述',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员经验记录';
-- 7. 会员积分记录表
CREATE TABLE IF NOT EXISTS member_point_record (
id bigint NOT NULL AUTO_INCREMENT,
user_id bigint NOT NULL COMMENT '用户编号',
biz_type varchar(50) NOT NULL COMMENT '业务类型',
biz_id varchar(100) NOT NULL COMMENT '业务编号',
title varchar(100) NOT NULL COMMENT '标题',
point int NOT NULL COMMENT '积分',
total_point int NOT NULL DEFAULT 0 COMMENT '累计积分',
description varchar(255) DEFAULT '' COMMENT '描述',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员积分记录';
-- 8. 会员签到配置表
CREATE TABLE IF NOT EXISTS member_sign_in_config (
id bigint NOT NULL AUTO_INCREMENT,
day int NOT NULL COMMENT '签到天数',
point int NOT NULL DEFAULT 0 COMMENT '奖励积分',
experience int NOT NULL DEFAULT 0 COMMENT '奖励经验',
status tinyint NOT NULL DEFAULT 0 COMMENT '状态',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员签到配置';
-- 9. 会员签到记录表
CREATE TABLE IF NOT EXISTS member_sign_in_record (
id bigint NOT NULL AUTO_INCREMENT,
user_id bigint NOT NULL COMMENT '用户编号',
day int NOT NULL COMMENT '签到天数',
point int NOT NULL DEFAULT 0 COMMENT '获得积分',
experience int NOT NULL DEFAULT 0 COMMENT '获得经验',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
tenant_id bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员签到记录';
-- 10. 会员地址表
CREATE TABLE IF NOT EXISTS member_address (
id bigint NOT NULL AUTO_INCREMENT,
user_id bigint NOT NULL COMMENT '用户编号',
name varchar(20) NOT NULL COMMENT '收件人姓名',
mobile varchar(20) NOT NULL COMMENT '手机号',
area_id bigint NOT NULL COMMENT '地区编号',
detail_address varchar(250) NOT NULL COMMENT '详细地址',
default_status bit(1) NOT NULL DEFAULT b'0' COMMENT '是否默认',
creator varchar(64) DEFAULT '' COMMENT '创建者',
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updater varchar(64) DEFAULT '' COMMENT '更新者',
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员地址';
-- =============================================
-- 种子数据
-- =============================================
INSERT IGNORE INTO member_level (id, name, level, experience, status, tenant_id) VALUES (1, '普通会员', 1, 0, 0, 1);