feat(database): 迁移用户关联字段并优化打卡系统
- 修改数据库配置将MYSQL_DB从mys_info_v3改为mys_info_test - 新增auth_users表wechat_openid字段并建立唯一索引 - 为plan_checkins表添加计划性能索引(idx_plan_period_student) - 将checkin_records_old表关联方式从student_id改为user_id - 将plan_checkins表关联方式从student_id改为user_id并更新附件路径 - 移除routes/auth.py中的uuid导入使用安全token生成函数 - 重构routes/checkin.py打卡逻辑去除course_type字段并优化返回结构 - 添加打卡时间限制验证功能防止过期打卡操作 - 实现小组统计功能支持老师查看各组打卡情况 - 更新主页index.html界面适配新的打卡和计划功能 - 调整计划提交时间规则为周五至周四周期 - 添加月度和年度计划提交状态验证机制
This commit is contained in:
3
migrations/001_add_wechat_openid_column.sql
Normal file
3
migrations/001_add_wechat_openid_column.sql
Normal file
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE `auth_users`
|
||||
ADD COLUMN `wechat_openid` VARCHAR(64) NULL DEFAULT NULL,
|
||||
ADD UNIQUE KEY `uk_auth_users_wechat_openid` (`wechat_openid`);
|
||||
4
migrations/002_plan_perf_index.sql
Normal file
4
migrations/002_plan_perf_index.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
-- 002_plan_perf_index.sql
|
||||
-- 计划小组总览按 (plan_type, period_key, student_id) 扫描,补齐索引以加速聚合查询。
|
||||
ALTER TABLE `plan_checkins`
|
||||
ADD INDEX `idx_plan_period_student` (`plan_type`, `period_key`, `student_id`);
|
||||
35
migrations/003_checkin_records_user_id.sql
Normal file
35
migrations/003_checkin_records_user_id.sql
Normal file
@@ -0,0 +1,35 @@
|
||||
-- =========================================================
|
||||
-- 003: 打卡记录改为按 user_id 关联(user_id = auth_users.id)
|
||||
-- 目标库:mys_info_test(正式库:mys_info,如需可改)
|
||||
-- 前置:checkin_records_old 已有按 student_id 关联的旧数据
|
||||
-- 注意:执行前请先备份 checkin_records_old 表
|
||||
-- =========================================================
|
||||
|
||||
-- 1) 新增 user_id 列
|
||||
ALTER TABLE `checkin_records_old`
|
||||
ADD COLUMN `user_id` BIGINT NULL DEFAULT NULL AFTER `id`;
|
||||
|
||||
-- 2) 用 auth_users.id 按旧 student_id 回填历史记录的 user_id
|
||||
UPDATE `checkin_records_old` r
|
||||
LEFT JOIN `auth_users` u ON u.`student_id` = r.`student_id`
|
||||
SET r.`user_id` = u.`id`
|
||||
WHERE r.`user_id` IS NULL;
|
||||
|
||||
-- 3) 确认旧 student_id 允许为 NULL
|
||||
-- 新打卡代码只写 user_id,不再写 student_id
|
||||
-- ⚠ 若原 student_id 实际类型不是 VARCHAR(64),请改成与原列一致的类型
|
||||
ALTER TABLE `checkin_records_old`
|
||||
MODIFY COLUMN `student_id` VARCHAR(64) NULL DEFAULT NULL;
|
||||
|
||||
-- 4) 唯一键改为 (user_id, class_date),供同用户同一天 upsert 使用
|
||||
ALTER TABLE `checkin_records_old`
|
||||
ADD UNIQUE KEY `uk_checkin_user_date` (`user_id`, `class_date`);
|
||||
|
||||
|
||||
-- =========================================================
|
||||
-- 以下为可选清理(按实际索引名执行)
|
||||
-- 5) 旧版若存在 (student_id, class_date) 唯一键,确认不再需要后删除:
|
||||
-- ALTER TABLE `checkin_records_old` DROP INDEX `uk_checkin_student_date`;
|
||||
-- 6) 数据质量核查:检查是否有 student_id 无对应用户、user_id 仍为空的历史记录:
|
||||
-- SELECT * FROM checkin_records_old WHERE user_id IS NULL;
|
||||
-- =========================================================
|
||||
47
migrations/004_plan_checkins_user_id.sql
Normal file
47
migrations/004_plan_checkins_user_id.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- =========================================================
|
||||
-- 004: 计划记录改为按 user_id 关联(user_id = auth_users.id)
|
||||
-- 目标库:mys_info_test(正式库:mys_info,如需可改)
|
||||
-- 前置:plan_checkins 已有按 student_id 关联的旧数据
|
||||
-- 注意:执行前请先备份 plan_checkins 表
|
||||
-- =========================================================
|
||||
|
||||
-- 1) 新增 user_id 列
|
||||
ALTER TABLE `plan_checkins`
|
||||
ADD COLUMN `user_id` BIGINT NULL DEFAULT NULL AFTER `id`;
|
||||
|
||||
-- 2) 用 auth_users.id 按旧 student_id 回填历史记录的 user_id
|
||||
UPDATE `plan_checkins` r
|
||||
LEFT JOIN `auth_users` u ON u.`student_id` = r.`student_id`
|
||||
SET r.`user_id` = u.`id`
|
||||
WHERE r.`user_id` IS NULL;
|
||||
|
||||
-- 3) 重写历史附件相对路径:attachments/<student_id>/... -> attachments/<user_id>/...
|
||||
UPDATE `plan_checkins` r
|
||||
JOIN `auth_users` u ON u.`student_id` = r.`student_id`
|
||||
SET r.`attachments` = REPLACE(r.`attachments`,
|
||||
CONCAT('attachments/', r.`student_id`, '/'),
|
||||
CONCAT('attachments/', u.`id`, '/'))
|
||||
WHERE r.`student_id` IS NOT NULL AND r.`user_id` IS NOT NULL;
|
||||
|
||||
-- 4) 旧 student_id 允许为空;新代码只写 user_id
|
||||
ALTER TABLE `plan_checkins`
|
||||
MODIFY COLUMN `student_id` VARCHAR(64) NULL DEFAULT NULL;
|
||||
|
||||
-- 5) 新增唯一键 (user_id, plan_type, period_key):同用户同周期 upsert
|
||||
ALTER TABLE `plan_checkins`
|
||||
ADD UNIQUE KEY `uk_plan_user_period` (`user_id`, `plan_type`, `period_key`);
|
||||
|
||||
-- 6) 计划概览聚合索引改为按 user_id
|
||||
ALTER TABLE `plan_checkins`
|
||||
ADD INDEX `idx_plan_period_user` (`plan_type`, `period_key`, `user_id`);
|
||||
|
||||
|
||||
-- =========================================================
|
||||
-- 以下为可选清理(按实际索引名执行)
|
||||
-- 7) 旧版 (student_id, plan_type, period_key) 唯一键确认不再使用后:
|
||||
-- ALTER TABLE `plan_checkins` DROP INDEX `uk_plan_student_period`;
|
||||
-- 8) 旧版展平索引确认不再使用后:
|
||||
-- ALTER TABLE `plan_checkins` DROP INDEX `idx_plan_period_student`;
|
||||
-- 9) 数据质量核查:有无 student_id 无对应用户、user_id 仍为空的历史记录:
|
||||
-- SELECT * FROM plan_checkins WHERE user_id IS NULL;
|
||||
-- =========================================================
|
||||
Reference in New Issue
Block a user