|
|
@@ -4584,30 +4584,36 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
|
|
|
// 4张新表 (CREATE TABLE IF NOT EXISTS)
|
|
|
String[] ddl = {
|
|
|
- "CREATE TABLE IF NOT EXISTS foods ("
|
|
|
- + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
|
|
|
- + "name VARCHAR(100) NOT NULL COMMENT '食材名称', "
|
|
|
- + "category VARCHAR(50) COMMENT '分类: 蔬菜/水果/肉禽/水产/蛋奶/豆类/谷物/调味/其他', "
|
|
|
- + "unit VARCHAR(20) DEFAULT 'g' COMMENT '计量单位', "
|
|
|
- + "calories DECIMAL(8,2) COMMENT '热量(kcal/100g)', "
|
|
|
- + "protein DECIMAL(8,2) COMMENT '蛋白质(g/100g)', "
|
|
|
- + "fat DECIMAL(8,2) COMMENT '脂肪(g/100g)', "
|
|
|
- + "carbs DECIMAL(8,2) COMMENT '碳水(g/100g)', "
|
|
|
- + "fiber DECIMAL(8,2) COMMENT '膳食纤维(g/100g)', "
|
|
|
- + "price_level TINYINT COMMENT '价格等级 1-5', "
|
|
|
- + "nutrition_tags VARCHAR(500) COMMENT '营养标签JSON', "
|
|
|
- + "suitable_for VARCHAR(200) COMMENT '适宜人群JSON', "
|
|
|
- + "allergens VARCHAR(200) COMMENT '过敏原JSON', "
|
|
|
- + "external_source VARCHAR(100) COMMENT '数据来源', "
|
|
|
- + "external_id VARCHAR(100) COMMENT '外部ID', "
|
|
|
- + "cover_image VARCHAR(500) COMMENT '食材图片', "
|
|
|
- + "status VARCHAR(20) DEFAULT 'active', "
|
|
|
- + "sort_order INT DEFAULT 0, "
|
|
|
- + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
|
|
|
- + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
|
|
|
- + "INDEX idx_category (category), "
|
|
|
- + "INDEX idx_price (price_level)"
|
|
|
- + ");",
|
|
|
+"CREATE TABLE IF NOT EXISTS foods ("
|
|
|
+ + "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
|
|
|
+ + "name VARCHAR(100) NOT NULL COMMENT '食材名称', "
|
|
|
+ + "category VARCHAR(50) COMMENT '分类: 蔬菜/水果/肉禽/水产/蛋奶/豆类/谷物/调味/其他', "
|
|
|
+ + "unit VARCHAR(20) DEFAULT 'g' COMMENT '计量单位', "
|
|
|
+ + "calories DECIMAL(8,2) COMMENT '热量(kcal/100g)', "
|
|
|
+ + "protein DECIMAL(8,2) COMMENT '蛋白质(g/100g)', "
|
|
|
+ + "fat DECIMAL(8,2) COMMENT '脂肪(g/100g)', "
|
|
|
+ + "carbs DECIMAL(8,2) COMMENT '碳水(g/100g)', "
|
|
|
+ + "fiber DECIMAL(8,2) COMMENT '膳食纤维(g/100g)', "
|
|
|
+ + "energy_kj DECIMAL(8,2) COMMENT '能量(kJ/100g)', "
|
|
|
+ + "starch DECIMAL(8,2) COMMENT '淀粉(g/100g)', "
|
|
|
+ + "cholesterol DECIMAL(8,2) COMMENT '胆固醇(mg/100g)', "
|
|
|
+ + "price_level TINYINT COMMENT '价格等级 1-5', "
|
|
|
+ + "nutrition_tags VARCHAR(500) COMMENT '营养标签JSON', "
|
|
|
+ + "suitable_for VARCHAR(200) COMMENT '适宜人群JSON', "
|
|
|
+ + "allergens VARCHAR(200) COMMENT '过敏原JSON', "
|
|
|
+ + "external_source VARCHAR(100) COMMENT '数据来源', "
|
|
|
+ + "external_id VARCHAR(100) COMMENT '外部ID', "
|
|
|
+ + "cover_image VARCHAR(500) COMMENT '食材图片', "
|
|
|
+ + "report_id BIGINT COMMENT '关联报告ID(从PDF解析的食物推荐)', "
|
|
|
+ + "score INT COMMENT '食物评分', "
|
|
|
+ + "diet_type VARCHAR(50) COMMENT '饮食类型', "
|
|
|
+ + "status VARCHAR(20) DEFAULT 'active', "
|
|
|
+ + "sort_order INT DEFAULT 0, "
|
|
|
+ + "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, "
|
|
|
+ + "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "
|
|
|
+ + "INDEX idx_category (category), "
|
|
|
+ + "INDEX idx_price (price_level)"
|
|
|
+ + ");",
|
|
|
|
|
|
"CREATE TABLE IF NOT EXISTS recipes ("
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, "
|
|
|
@@ -8456,13 +8462,20 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
ensureColumn("foods", "report_id", "BIGINT DEFAULT NULL COMMENT '关联报告ID(从PDF解析的食物推荐)'");
|
|
|
ensureColumn("foods", "score", "INT DEFAULT NULL COMMENT '食物评分'");
|
|
|
|
|
|
- // 迁移192: verification_codes.type 添加默认值(旧版插入未携带 type 字段,DB 列 NOT NULL 无默认值导致报错)
|
|
|
- try {
|
|
|
- jdbcTemplate.execute("ALTER TABLE verification_codes MODIFY COLUMN `type` VARCHAR(20) NOT NULL DEFAULT 'login' COMMENT '验证码类型: login/register/reset'");
|
|
|
- log.info("已为verification_codes.type添加默认值");
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("verification_codes.type 默认值修改失败(可能已修改): " + e.getMessage());
|
|
|
- }
|
|
|
+ // 迁移263: foods 补齐 energy_kj/starch/cholesterol/diet_type 列(前三列原迁移在文件重组时丢失、生产靠历史执行残留;
|
|
|
+ // dietType 为实体孤立字段从未建列,MyBatis-Plus 全字段 SELECT 报 Unknown column)
|
|
|
+ ensureColumn("foods", "energy_kj", "DECIMAL(8,2) DEFAULT NULL COMMENT '能量(kJ/100g)'");
|
|
|
+ ensureColumn("foods", "starch", "DECIMAL(8,2) DEFAULT NULL COMMENT '淀粉(g/100g)'");
|
|
|
+ ensureColumn("foods", "cholesterol", "DECIMAL(8,2) DEFAULT NULL COMMENT '胆固醇(mg/100g)'");
|
|
|
+ ensureColumn("foods", "diet_type", "VARCHAR(50) DEFAULT NULL COMMENT '饮食类型'");
|
|
|
+
|
|
|
+ // 迁移192: verification_codes.type 添加默认值(旧版插入未携带 type 字段,DB 列 NOT NULL 无默认值导致报错)
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE verification_codes MODIFY COLUMN `type` VARCHAR(20) NOT NULL DEFAULT 'login' COMMENT '验证码类型: login/register/reset'");
|
|
|
+ log.info("已为verification_codes.type添加默认值");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("verification_codes.type 默认值修改失败(可能已修改): " + e.getMessage());
|
|
|
+ }
|
|
|
|
|
|
// 迁移193: family_relationships表添加关系质量评分三列(关系条展示增强)
|
|
|
ensureColumn("family_relationships", "trust_score", "DECIMAL(5,2) DEFAULT 0 COMMENT '信任度(答卷人视角)'");
|