diff --git a/.env b/.env index b12a3cd..25563b5 100644 --- a/.env +++ b/.env @@ -1,3 +1,5 @@ + +LOG_FILE_ENABLE=1 # Nacos配置 NACOS_HOST=127.0.0.1 NACOS_PORT=8848 diff --git a/client/mysql.go b/client/mysql.go index 2dfae2f..097cd14 100644 --- a/client/mysql.go +++ b/client/mysql.go @@ -13,11 +13,21 @@ var MySQL *gorm.DB func InitMySQLClient() { // 创建连接对象 - conn, err := gorm.Open(mysql.Open(config.Scd.MySQL.GetDSN()), &gorm.Config{Logger: logger.DefaultGormLogger()}) + mysqlConfig := mysql.Config{ + DSN: config.Scd.MySQL.GetDSN(), + DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式 + DontSupportRenameColumn: true, // 用 `change` 重命名列 + } + conn, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{Logger: logger.DefaultGormLogger()}) if err != nil { log.Panic("初始化MySQL连接失败, 错误信息: %v", err) } else { log.Debug("MySQL连接成功") } MySQL = conn + + //db, err := conn.DB() + //db.SetMaxIdleConns(10) // 用于设置连接池中空闲连接的最大数量 + //db.SetMaxOpenConns(100) // 用于设置数据库连接的最大打开数量 + //db.SetConnMaxLifetime(time.Hour) // 设置连接的最大存活时间 } diff --git a/common/types/model.go b/common/types/model.go index 8982a85..b4f7093 100644 --- a/common/types/model.go +++ b/common/types/model.go @@ -1,20 +1,20 @@ package types import ( - "github.com/google/uuid" "gorm.io/gorm" + "time" ) // BaseDbModel 数据库通用字段 type BaseDbModel struct { - Id string `json:"id" gorm:"type:varchar(50);primarykey"` - CreatedAt DateTime `json:"createdAt"` - UpdatedAt DateTime `json:"updatedAt"` + ID uint `gorm:"type:int(11);primarykey;" json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index:deleted"` } -// BeforeCreate 创建数据库对象之前生成UUID +/*// BeforeCreate 创建数据库对象之前生成UUID func (m *BaseDbModel) BeforeCreate(*gorm.DB) (err error) { m.Id = uuid.New().String() return -} +}*/ diff --git a/config.yaml b/config.yaml index ce2cfc9..6877542 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -app: +api: port: 8083 name: online_code version: v1 @@ -15,5 +15,5 @@ mysql: redis: host: 127.0.0.1 port: 6379 - password: loser123 + password: loser7659 db: 0 \ No newline at end of file diff --git a/initialize/db_table.go b/initialize/db_table.go index cdd1529..038f1bf 100644 --- a/initialize/db_table.go +++ b/initialize/db_table.go @@ -9,12 +9,12 @@ import ( // 初始化数据库表 func databaseTable() { dbs := []any{ - new(entity.User), - new(entity.Category), - new(entity.Problem), - new(entity.ProblemCategory), - new(entity.Submit), + new(entity.UserBasic), new(entity.TestCase), + new(entity.CategoryBasic), + new(entity.ProblemCategory), + //new(entity.ProblemBasic), + //new(entity.SubmitBasic), } if err := client.MySQL.AutoMigrate(dbs...); err != nil { diff --git a/main.go b/main.go index ea5b90f..0925705 100644 --- a/main.go +++ b/main.go @@ -2,18 +2,25 @@ package main import ( "fmt" + "git.echol.cn/loser/logger" "git.echol.cn/loser/logger/log" "github.com/gin-gonic/gin" "golang.org/x/sync/errgroup" "net/http" "online_code/config" "online_code/core" + "online_code/initialize" "online_code/route" "time" ) var g errgroup.Group +func init() { + logger.InitLogger(logger.LogConfig{Mode: logger.Dev, LokiEnable: false, FileEnable: true}) + initialize.InitSystem() // 初始化系统配置 +} + // 启动入口 func main() { // 强制日志颜色化 diff --git a/models/entity/category_basic.go b/models/entity/category_basic.go index 2104de5..eed7990 100644 --- a/models/entity/category_basic.go +++ b/models/entity/category_basic.go @@ -2,10 +2,10 @@ package entity import "online_code/common/types" -// Category 分类表 +// CategoryBasic 分类表 type CategoryBasic struct { types.BaseDbModel - Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'分类的唯一标识'"` + Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'问题表的唯一标识'"` Name string `json:"name" gorm:"column:name;type:varchar(100);comment:'分类名称'" ` ParentId int `json:"parent_id" gorm:"column:parent_id;type:int(11);comment:'父级ID'" ` } diff --git a/models/entity/problem_basic.go b/models/entity/problem_basic.go index 9a8b66d..a19fee6 100644 --- a/models/entity/problem_basic.go +++ b/models/entity/problem_basic.go @@ -2,18 +2,18 @@ package entity import "online_code/common/types" -// Problem 问题表 +// ProblemBasic 问题基础表 type ProblemBasic struct { types.BaseDbModel - Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'问题表的唯一标识'" ` // 问题表的唯一标识 - ProblemCategories []*ProblemCategory `json:"problem_categories" gorm:"foreignKey:problem_id;references:id;comment:'关联问题分类表'" ` // 关联问题分类表 - Title string `json:"title" gorm:"column:title;type:varchar(255);comment:'文章标题'" ` // 文章标题 - Content string `json:"content" gorm:"column:content;type:text;comment:'文章正文'" ` // 文章正文 - MaxRuntime int `json:"max_runtime" gorm:"column:max_runtime;type:int(11);comment:'最大运行时长'" ` // 最大运行时长 - MaxMem int `json:"max_mem" gorm:"column:max_mem;type:int(11);comment:'最大运行内存'" ` // 最大运行内存 - TestCases []*TestCase `json:"test_cases" gorm:"foreignKey:problem_identity;references:identity;comment:'关联测试用例表'" ` // 关联测试用例表 - PassNum int64 `json:"pass_num" gorm:"column:pass_num;type:int(11);comment:'通过次数'" ` // 通过次数 - SubmitNum int64 `json:"submit_num" gorm:"column:submit_num;type:int(11);comment:'提交次数'" ` // 提交次数 + Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'问题表的唯一标识'"` // 问题表的唯一标识 + ProblemCategories []ProblemCategory `json:"problem_categories" gorm:"ForeignKey:ProblemId;comment:'关联问题分类表'"` // 关联问题分类表 + Title string `json:"title" gorm:"column:title;type:varchar(255);comment:'文章标题'"` // 文章标题 + Content string `json:"content" gorm:"column:content;type:text;comment:'文章正文'"` // 文章正文 + MaxRuntime int `json:"max_runtime" gorm:"column:max_runtime;type:int(11);comment:'最大运行时长'"` // 最大运行时长 + MaxMem int `json:"max_mem" gorm:"column:max_mem;type:int(11);comment:'最大运行内存'"` // 最大运行内存 + TestCases []TestCase `json:"test_cases" gorm:"foreignKey:ProblemIdentity;comment:'关联测试用例表'"` // 关联测试用例表 + PassNum int64 `json:"pass_num" gorm:"column:pass_num;type:int(11);comment:'通过次数'"` // 通过次数 + SubmitNum int64 `json:"submit_num" gorm:"column:submit_num;type:int(11);comment:'提交次数'"` // 提交次数 } func (table *ProblemBasic) TableName() string { diff --git a/models/entity/problem_category.go b/models/entity/problem_category.go index 78173d8..7c804a9 100644 --- a/models/entity/problem_category.go +++ b/models/entity/problem_category.go @@ -7,9 +7,9 @@ import ( // ProblemCategory 问题分类关联表 type ProblemCategory struct { types.BaseDbModel - ProblemId uint `json:"problem_id" gorm:"column:problem_id;type:int(11);comment:'问题的ID'" ` // 问题的ID - CategoryId uint `json:"category_id" gorm:"column:category_id;type:int(11);comment:'分类的ID'" ` // 分类的ID - CategoryBasic *CategoryBasic `json:"category_basic" gorm:"foreignKey:id;references:category_id;comment:'关联分类的基础信息表'" ` // 关联分类的基础信息表 + ProblemId uint `json:"problem_id" gorm:"column:problem_id;type:int(11);comment:'问题的ID'" ` // 问题的ID + CategoryId uint `json:"category_id" gorm:"column:category_id;type:int(11);comment:'分类的ID'" ` // 分类的ID + CategoryBasic *CategoryBasic `json:"category_basic" gorm:"foreignKey:CategoryId;comment:'关联分类的基础信息表'" ` // 关联分类的基础信息表 } func (table *ProblemCategory) TableName() string { diff --git a/models/entity/submit_basic.go b/models/entity/submit_basic.go index 7e053a1..18b1072 100644 --- a/models/entity/submit_basic.go +++ b/models/entity/submit_basic.go @@ -1,14 +1,17 @@ package entity -// Submit 提交表 +import "online_code/common/types" + +// SubmitBasic 提交表 type SubmitBasic struct { - Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'用户唯一标识'" ` // 唯一标识 - ProblemIdentity string `json:"problem_identity" gorm:"column:problem_identity;type:varchar(36);comment:'问题表的唯一标识'" ` // 问题表的唯一标识 - ProblemBasic *ProblemBasic `json:"problem_basic" gorm:"foreignKey:identity;references:problem_identity;comment:'关联问题基础表'" ` // 关联问题基础表 - UserIdentity string `json:"user_identity" gorm:"column:user_identity;type:varchar(36);comment:'用户表的唯一标识'" ` // 用户表的唯一标识 - UserBasic *UserBasic `json:"user_basic" gorm:"foreignKey:identity;references:user_identity;comment:'联用户基础表'" ` // 关联用户基础表 - Path string `json:"path" gorm:"column:path;type:varchar(255);comment:'代码存放路径'" ` // 代码存放路径 - Status int `json:"status" gorm:"column:status;type:tinyint(1);comment:'状态'" ` // 【-1-待判断,1-答案正确,2-答案错误,3-运行超时,4-运行超内存, 5-编译错误】 + types.BaseDbModel + Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'用户唯一标识'" ` // 唯一标识 + ProblemIdentity string `json:"problem_identity" gorm:"column:problem_identity;type:varchar(36);comment:'问题表的唯一标识'" ` // 问题表的唯一标识 + ProblemBasic *ProblemBasic `json:"problem_basic" gorm:"foreignKey:ProblemIdentity;comment:'关联问题基础表'" ` // 关联问题基础表 + UserIdentity string `json:"user_identity" gorm:"column:user_identity;type:varchar(36);comment:'用户表的唯一标识'" ` // 用户表的唯一标识 + UserBasic *UserBasic `json:"user_basic" gorm:"foreignKey:UserIdentity;comment:'联用户基础表'" ` // 关联用户基础表 + Path string `json:"path" gorm:"column:path;type:varchar(255);comment:'代码存放路径'" ` // 代码存放路径 + Status int `json:"status" gorm:"column:status;type:tinyint(1);comment:'状态'" ` // 【-1-待判断,1-答案正确,2-答案错误,3-运行超时,4-运行超内存, 5-编译错误】 } func (table *SubmitBasic) TableName() string { diff --git a/models/entity/test_case.go b/models/entity/test_case.go index 0076d8f..4053884 100644 --- a/models/entity/test_case.go +++ b/models/entity/test_case.go @@ -5,8 +5,8 @@ import "online_code/common/types" // TestCase 测试用例 type TestCase struct { types.BaseDbModel - Identity string `json:"identity" gorm:"column:identity;type:varchar(255);comment:'用户唯一标识''" ` - ProblemIdentity string `json:"problem_identity" gorm:"column:problem_identity;type:varchar(255);comment:'问题'" ` + Identity string `json:"identity" gorm:"column:identity;type:varchar(36);comment:'测试用例唯一标识''" ` + ProblemIdentity string `json:"problem_identity" gorm:"column:problem_identity;type:varchar(36);comment:'问题'" ` Input string `json:"input" gorm:"column:input;type:text;" ` Output string `json:"output" gorm:"column:output;type:text;" ` } diff --git a/repository/problem.go b/repository/problem.go index f4bffd1..e02fa0c 100644 --- a/repository/problem.go +++ b/repository/problem.go @@ -13,8 +13,8 @@ func ProblemService() *problemService { } // GetList 获取题目列表 -func (problemService) GetList(p param.GetProblemList) (records entity.Problem, count int64, err error) { - sel := client.MySQL.Scopes(page(p.Current, p.Size)) +func (problemService) GetList(p param.GetProblemList) (records entity.ProblemBasic, count int64, err error) { + sel := client.MySQL.Scopes(page(p.Current, p.Size)).Preload("ProblemCategories").Preload("ProblemCategories.CategoryBasic") if p.Keyword != "" { sel.Where("title LIKE ? OR content like ?", "%"+p.Keyword+"%", "%"+p.Keyword+"%") @@ -29,7 +29,7 @@ func (problemService) GetList(p param.GetProblemList) (records entity.Problem, c } // GetProblemInfo 获取题目详情 -func (problemService) GetProblemInfo(id int) (problem entity.Problem, err error) { +func (problemService) GetProblemInfo(id int) (problem entity.ProblemBasic, err error) { err = client.MySQL.Where("id = ?", id).Find(&problem).Error return } diff --git a/route/router.go b/route/router.go index 06e3117..9cbf193 100644 --- a/route/router.go +++ b/route/router.go @@ -3,6 +3,5 @@ package route import "github.com/gin-gonic/gin" func InitRoute(g *gin.RouterGroup) { - api := g.Group("/api") - problem(api.Group("/problem")) + problem(g.Group("/problem")) }