|
|
@@ -2,7 +2,7 @@ package com.zxyj.config;
|
|
|
|
|
|
import com.zxyj.mapper.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import javax.annotation.Resource;
|
|
|
import org.springframework.boot.CommandLineRunner;
|
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
@@ -14,7 +14,7 @@ import java.util.List;
|
|
|
@Component
|
|
|
public class DatabaseInitializer implements CommandLineRunner {
|
|
|
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
|
|
|
@Override
|
|
|
@@ -72,27 +72,27 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
"INDEX idx_family_id (family_id)" +
|
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
|
|
|
- // 孩子详情表
|
|
|
- "CREATE TABLE IF NOT EXISTS children (" +
|
|
|
- "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
- "user_id BIGINT NOT NULL, " +
|
|
|
- "family_id BIGINT NOT NULL, " +
|
|
|
- "nickname VARCHAR(50) NOT NULL, " +
|
|
|
- "age TINYINT NOT NULL, " +
|
|
|
- "dan_level VARCHAR(2), " +
|
|
|
- "penalty_enabled TINYINT DEFAULT 1, " +
|
|
|
- "theme VARCHAR(32) DEFAULT 'default', " +
|
|
|
- "total_points INT DEFAULT 0, " +
|
|
|
- "streak_days INT DEFAULT 0, " +
|
|
|
- "last_task_date DATE, " +
|
|
|
- "focus_max_daily TINYINT DEFAULT 3, " +
|
|
|
- "focus_remaining TINYINT DEFAULT 3, " +
|
|
|
- "focus_reset_date DATE DEFAULT (CURRENT_DATE), " +
|
|
|
- "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
- "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
- "INDEX idx_user_id (user_id), " +
|
|
|
- "INDEX idx_family_id (family_id)" +
|
|
|
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
+// 孩子详情表
|
|
|
+"CREATE TABLE IF NOT EXISTS children (" +
|
|
|
+"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+"user_id BIGINT NOT NULL, " +
|
|
|
+"family_id BIGINT NOT NULL, " +
|
|
|
+"nickname VARCHAR(50) NOT NULL, " +
|
|
|
+"age TINYINT NOT NULL, " +
|
|
|
+"dan_level VARCHAR(2), " +
|
|
|
+"penalty_enabled TINYINT DEFAULT 1, " +
|
|
|
+"theme VARCHAR(32) DEFAULT \'default\', " +
|
|
|
+"total_points INT DEFAULT 0, " +
|
|
|
+"streak_days INT DEFAULT 0, " +
|
|
|
+"last_task_date DATE, " +
|
|
|
+"focus_max_daily TINYINT DEFAULT 3, " +
|
|
|
+"focus_remaining TINYINT DEFAULT 3, " +
|
|
|
+"focus_reset_date DATE, " +
|
|
|
+"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
+"INDEX idx_user_id (user_id), " +
|
|
|
+"INDEX idx_family_id (family_id)" +
|
|
|
+") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
|
|
|
// 任务表
|
|
|
"CREATE TABLE IF NOT EXISTS tasks (" +
|
|
|
@@ -280,35 +280,55 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
"INDEX idx_is_default (is_default)" +
|
|
|
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
|
|
|
- // 管理员表
|
|
|
- "CREATE TABLE IF NOT EXISTS admins (" +
|
|
|
- "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
- "username VARCHAR(50) NOT NULL, " +
|
|
|
- "password VARCHAR(128) NOT NULL, " +
|
|
|
- "real_name VARCHAR(50), " +
|
|
|
- "phone VARCHAR(11), " +
|
|
|
- "email VARCHAR(100), " +
|
|
|
- "status TINYINT DEFAULT 1, " +
|
|
|
- "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
- "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
- "INDEX idx_phone (phone), " +
|
|
|
- "INDEX idx_username (username)" +
|
|
|
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
+// 管理员表
|
|
|
+"CREATE TABLE IF NOT EXISTS admins (" +
|
|
|
+"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+"username VARCHAR(50) NOT NULL, " +
|
|
|
+"password VARCHAR(128) NOT NULL, " +
|
|
|
+"real_name VARCHAR(50), " +
|
|
|
+"phone VARCHAR(11), " +
|
|
|
+"email VARCHAR(100), " +
|
|
|
+"role VARCHAR(20) DEFAULT 'admin', " +
|
|
|
+"status TINYINT DEFAULT 1, " +
|
|
|
+"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
+"INDEX idx_phone (phone), " +
|
|
|
+"INDEX idx_username (username)" +
|
|
|
+") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
|
|
|
- // 验证码表
|
|
|
- "CREATE TABLE IF NOT EXISTS verification_codes (" +
|
|
|
- "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
- "phone VARCHAR(11) NOT NULL, " +
|
|
|
- "code VARCHAR(6) NOT NULL, " +
|
|
|
- "type VARCHAR(20) NOT NULL, " +
|
|
|
- "expires_in INT DEFAULT 300, " +
|
|
|
- "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
- "expires_at DATETIME NOT NULL, " +
|
|
|
- "used TINYINT DEFAULT 0, " +
|
|
|
- "INDEX idx_phone_type (phone, type), " +
|
|
|
- "INDEX idx_expires_at (expires_at)" +
|
|
|
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
|
|
|
- );
|
|
|
+// 验证码表
|
|
|
+"CREATE TABLE IF NOT EXISTS verification_codes (" +
|
|
|
+"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+"phone VARCHAR(11) NOT NULL, " +
|
|
|
+"code VARCHAR(6) NOT NULL, " +
|
|
|
+"type VARCHAR(20) NOT NULL, " +
|
|
|
+"expires_in INT DEFAULT 300, " +
|
|
|
+"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+"expires_at DATETIME NOT NULL, " +
|
|
|
+"used TINYINT DEFAULT 0, " +
|
|
|
+"INDEX idx_phone_type (phone, type), " +
|
|
|
+"INDEX idx_expires_at (expires_at)" +
|
|
|
+") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
|
|
+
|
|
|
+// 管理后台任务模板表
|
|
|
+"CREATE TABLE IF NOT EXISTS admin_task_templates (" +
|
|
|
+"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+"title VARCHAR(200) NOT NULL, " +
|
|
|
+"description TEXT, " +
|
|
|
+"points INT DEFAULT 10, " +
|
|
|
+"category VARCHAR(32), " +
|
|
|
+"need_review TINYINT DEFAULT 0, " +
|
|
|
+"review_by_category TINYINT DEFAULT 0, " +
|
|
|
+"recommended_age INT, " +
|
|
|
+"difficulty ENUM('easy', 'medium', 'hard') DEFAULT 'medium', " +
|
|
|
+"is_active TINYINT DEFAULT 1, " +
|
|
|
+"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+"updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
+"INDEX idx_category (category), " +
|
|
|
+"INDEX idx_difficulty (difficulty), " +
|
|
|
+"INDEX idx_is_active (is_active)" +
|
|
|
+") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
|
|
|
+);
|
|
|
|
|
|
// 执行创建表SQL
|
|
|
for (String sql : createTableSQLs) {
|
|
|
@@ -392,20 +412,64 @@ public class DatabaseInitializer implements CommandLineRunner {
|
|
|
log.warn("初始化勋章定义失败: {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
- // 初始化默认管理员
|
|
|
- try {
|
|
|
- Integer count = jdbcTemplate.queryForObject(
|
|
|
- "SELECT COUNT(*) FROM admins", Integer.class);
|
|
|
-
|
|
|
- if (count == null || count == 0) {
|
|
|
- // 默认管理员: 手机号 13800138000, 密码 admin123
|
|
|
- String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
|
|
|
- jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, status) VALUES " +
|
|
|
- "('admin', '" + encryptedPassword + "', '系统管理员', '13800138000', 'admin@xzyj.com', 1)");
|
|
|
- log.info("默认管理员已初始化: 手机号 13800138000, 密码 admin123");
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.warn("初始化默认管理员失败: {}", e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
+// 初始化默认管理员
|
|
|
+try {
|
|
|
+ // 先检查并添加role列(如果不存在)
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE admins ADD COLUMN role VARCHAR(20) DEFAULT \'admin\' AFTER email");
|
|
|
+ log.info("已添加role列到admins表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 列已存在,忽略错误
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer count = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(*) FROM admins", Integer.class);
|
|
|
+
|
|
|
+ if (count == null || count == 0) {
|
|
|
+ // 默认管理员: 手机号 13800138000, 密码 admin123
|
|
|
+ String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
|
|
|
+ jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
|
|
|
+ "(\'admin\', \'" + encryptedPassword + "\', \'系统管理员\', \'13800138000\', \'admin@xzyj.com\', \'admin\', 1)");
|
|
|
+ log.info("默认管理员已初始化: 手机号 13800138000, 密码 admin123");
|
|
|
+ }
|
|
|
+} catch (Exception e) {
|
|
|
+ log.warn("初始化默认管理员失败: {}", e.getMessage());
|
|
|
+}
|
|
|
+
|
|
|
+// 初始化任务模板示例数据
|
|
|
+try {
|
|
|
+ Integer count = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(*) FROM admin_task_templates", Integer.class);
|
|
|
+
|
|
|
+ if (count == null || count == 0) {
|
|
|
+ jdbcTemplate.execute("INSERT INTO admin_task_templates (title, description, points, category, need_review, recommended_age, difficulty, is_active) VALUES " +
|
|
|
+ "('完成作业', '按时完成学校布置的家庭作业', 10, '学习', 1, 6, 'medium', 1), " +
|
|
|
+ "('阅读30分钟', '自主阅读课外书籍30分钟', 8, '阅读', 0, 5, 'easy', 1), " +
|
|
|
+ "('整理房间', '收拾整理自己的房间和书桌', 6, '家务', 0, 6, 'easy', 1), " +
|
|
|
+ "('洗碗', '饭后帮忙清洗餐具', 5, '家务', 1, 8, 'medium', 1), " +
|
|
|
+ "('户外运动1小时', '进行跑步、球类等户外运动', 12, '运动', 0, 7, 'hard', 1), " +
|
|
|
+ "('练习书法', '练习毛笔或硬笔书法20分钟', 7, '学习', 0, 7, 'medium', 1), " +
|
|
|
+ "('早睡早起', '晚上9点前睡觉,早上7点前起床', 5, '生活习惯', 0, 5, 'easy', 1), " +
|
|
|
+ "('背诵古诗', '背诵一首古诗词', 8, '学习', 1, 6, 'medium', 1)");
|
|
|
+ log.info("任务模板示例数据已初始化");
|
|
|
+ }
|
|
|
+} catch (Exception e) {
|
|
|
+ log.warn("初始化任务模板失败: {}", e.getMessage());
|
|
|
+}
|
|
|
+
|
|
|
+try {
|
|
|
+ Integer count = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(*) FROM admins", Integer.class);
|
|
|
+
|
|
|
+ if (count == null || count == 0) {
|
|
|
+ // 默认管理员: 手机号 13800138000, 密码 admin123
|
|
|
+ String encryptedPassword = org.springframework.util.DigestUtils.md5DigestAsHex("xzyj_admin_salt_admin123".getBytes());
|
|
|
+ jdbcTemplate.execute("INSERT INTO admins (username, password, real_name, phone, email, role, status) VALUES " +
|
|
|
+ "('admin', '" + encryptedPassword + "', '系统管理员', '13800138000', 'admin@xzyj.com', 'admin', 1)");
|
|
|
+ log.info("默认管理员已初始化: 手机号 13800138000, 密码 admin123");
|
|
|
+ }
|
|
|
+} catch (Exception e) {
|
|
|
+ log.warn("初始化任务模板失败: {}", e.getMessage());
|
|
|
+}
|
|
|
+}
|
|
|
}
|