本次提交重构了试卷分享功能,从"副本模式"改为"关联表模式",并修复了关键的类型不匹配问题。 ## 主要更新 ### 后端架构重构 - 新增 ExamShare 关联表模型,替代原有的试卷副本方式 - 修复 User.ID (int64) 与 ExamShare 外键的类型不匹配问题 - 更新所有相关 API 以使用新的关联表架构 - 添加 IsAccessibleBy 和 GetAccessibleExams 权限检查方法 ### 类型系统修复 - ExamShare.SharedByID/SharedToID: uint → int64 - IsAccessibleBy/GetAccessibleExams 参数: uint → int64 - 修复所有涉及用户ID类型转换的代码 ### 新增工具 - cmd/migrate_exam_shares.go: 数据迁移脚本(旧数据迁移) - cmd/cleanup/main.go: 数据库表清理工具 ### API 更新 - ShareExam: 创建分享关联记录而非复制试卷 - GetExamList: 返回分享人信息和参与人数统计 - GetExamRecord: 支持查看共享试卷的其他用户记录 - GetExamRecordList: 按试卷ID查询所有用户的考试记录 ### 前端更新 - 更新 TypeScript 类型定义以匹配新的 API 响应 - 添加分享人标签显示("来自 XXX") - 考试记录列表显示所有参与者信息 ## 技术细节 - 使用 GORM 外键关联和 Preload 优化查询 - 添加唯一索引防止重复分享 - 事务保护数据一致性 - 软删除支持数据恢复 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
39 lines
991 B
Go
39 lines
991 B
Go
package main
|
||
|
||
import (
|
||
"ankao/pkg/config"
|
||
"fmt"
|
||
"log"
|
||
|
||
"gorm.io/driver/postgres"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/logger"
|
||
)
|
||
|
||
func main() {
|
||
// 直接连接数据库,不使用 InitDB
|
||
cfg := config.GetDatabaseConfig()
|
||
dsn := cfg.GetDSN()
|
||
|
||
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
|
||
Logger: logger.Default.LogMode(logger.Info),
|
||
})
|
||
if err != nil {
|
||
log.Fatal("数据库连接失败:", err)
|
||
}
|
||
|
||
log.Println("开始清理 exam_shares 表...")
|
||
|
||
// 删除 exam_shares 表(如果存在)
|
||
if err := db.Exec("DROP TABLE IF EXISTS exam_shares CASCADE").Error; err != nil {
|
||
log.Fatal("删除 exam_shares 表失败:", err)
|
||
}
|
||
|
||
log.Println("✓ 已删除 exam_shares 表")
|
||
log.Println("\n清理完成!现在可以重新运行主程序。")
|
||
fmt.Println("\n执行步骤:")
|
||
fmt.Println("1. go run main.go # 这会自动创建正确的表结构")
|
||
fmt.Println("2. 如果有旧的分享数据需要迁移,运行:")
|
||
fmt.Println(" go run cmd/migrate_exam_shares.go")
|
||
}
|