修复参数
online-builder / Explore-Gitea-Actions (push) Failing after 33s Details
Goreleaser / goreleaser (push) Failing after 58s Details

This commit is contained in:
skong 2024-01-19 20:49:10 +08:00
parent 1009d706a6
commit 0ed44a09d7
23 changed files with 273 additions and 320 deletions

View File

@ -81,3 +81,8 @@ docker build -t <your-docker-image-name> .
# run
docker run --rm -p 8000:8000 -p 9000:9000 -v </path/to/your/configs>:/data/conf <your-docker-image-name>
```
---
```shell
swag init -g cmd/manage/main.go
```

View File

@ -54,7 +54,7 @@ func (s *ClassUsecase) Delete(ctx context.Context, req *pb.DeleteClassRequest) (
if err := s.repo.DeleteClass(req.ClassId); err != nil {
reply.Code = 400
reply.Msg = fmt.Sprintf("删除失败(%v)", err)
reply.Msg = fmt.Sprintf("删除失败:%v", err)
}
return reply, nil
@ -74,7 +74,7 @@ func (s *ClassUsecase) Update(ctx context.Context, req *pb.UpdateClassRequest) (
TeacherID: req.TeacherId,
}, req.ClassId); err != nil {
reply.Code = 400
reply.Msg = fmt.Sprintf("更新失败(%v)", err)
reply.Msg = fmt.Sprintf("更新失败:%v", err)
}
return reply, nil
@ -91,7 +91,7 @@ func (s *ClassUsecase) Get(ctx context.Context, req *pb.GetClassRequest) (*pb.Ge
if info, err := s.repo.GetClassInfo(req.ClassId); err != nil {
reply.Code = 400
reply.Msg = fmt.Sprintf("查询失败(%v)", err)
reply.Msg = fmt.Sprintf("查询失败:%v", err)
} else {
reply.ClassInfo = &pb.ClassInfo{
TeacherId: info.TeacherID,

View File

@ -48,7 +48,7 @@ func (repo *classRepo) CreateClass(request *biz.CreateClassRequest) (*biz.Create
result := repo.data.Mysql.Where("class_name = ?", request.ClassName).First(existingClass)
if result.Error == nil {
return nil, fmt.Errorf("班级名称 '%s' 已经存在", request.ClassName)
return nil, fmt.Errorf("班级%s已经存在", request.ClassName)
} else if result.Error != gorm.ErrRecordNotFound {
return nil, result.Error
}
@ -74,10 +74,10 @@ func (repo *classRepo) CreateClass(request *biz.CreateClassRequest) (*biz.Create
func (repo *classRepo) DeleteClass(classID string) error {
result := repo.data.Mysql.Where("class_id = ?", classID).Delete(&biz.Class{})
if result.Error != nil {
return fmt.Errorf("删除班级 '%s' 失败:%v", classID, result.Error)
return fmt.Errorf("删除失败:%s-%v", classID, result.Error)
}
if result.RowsAffected == 0 {
return fmt.Errorf("班级 '%s' 不存在", classID)
return fmt.Errorf("班级不存在")
}
return nil
}
@ -91,10 +91,10 @@ func (repo *classRepo) UpdateClass(request *biz.CreateClassRequest, classID stri
result := repo.data.Mysql.Model(tmp).Where("class_id = ?", classID).Updates(tmp)
if result.Error != nil {
return fmt.Errorf("更新班级 '%s' 失败:%v", classID, result.Error)
return fmt.Errorf("更新班级失败-%v", result.Error)
}
if result.RowsAffected == 0 {
return fmt.Errorf("班级 '%s' 不存在", classID)
return fmt.Errorf("班级不存在")
}
return nil
}
@ -110,7 +110,7 @@ func (repo *classRepo) GetClassInfo(classID string) (*biz.GetClassResponse, erro
if result.RowsAffected == 0 {
return nil, fmt.Errorf("班级不存在")
}
return &biz.GetClassResponse{
ClassID: classInfo.ClassId,
ClassName: classInfo.ClassName,

View File

@ -14,7 +14,7 @@ func NewCourseUse(repo CourseRepo, logger log.Logger) *CourseCase {
func (c *CourseCase) Create(ctx context.Context, req *pb.CreateCourseRequest) (*pb.CreateCourseResponse, error) {
// 初始化
reply := &pb.CreateCourseResponse{Code: 200, Msg: "创建成功"}
reply := &pb.CreateCourseResponse{Code: 200, Msg: "考试创建成功"}
// 构造
resp, err := c.repo.CreateCourse(&CreateCourseRequest{
CourseName: req.CourseName,
@ -31,7 +31,7 @@ func (c *CourseCase) Create(ctx context.Context, req *pb.CreateCourseRequest) (*
func (c *CourseCase) Delete(ctx context.Context, req *pb.DeleteCourseRequest) (*pb.DeleteCourseResponse, error) {
// 初始化
reply := &pb.DeleteCourseResponse{Code: 200, Msg: "删除成功"}
reply := &pb.DeleteCourseResponse{Code: 200, Msg: "考试删除成功"}
// 构造
err := c.repo.DeleteCourse(req.CourseId)
if err != nil {
@ -43,7 +43,7 @@ func (c *CourseCase) Delete(ctx context.Context, req *pb.DeleteCourseRequest) (*
func (c *CourseCase) Update(ctx context.Context, req *pb.UpdateCourseRequest) (*pb.UpdateCourseResponse, error) {
// 初始化
reply := &pb.UpdateCourseResponse{Code: 200, Msg: "更新成功"}
reply := &pb.UpdateCourseResponse{Code: 200, Msg: "考试更新成功"}
// 构造
err := c.repo.UpdateCourse(&CreateCourseRequest{
CourseName: req.CourseName,

View File

@ -8,7 +8,7 @@ import (
// Exam 定义考试结构体
type Exam struct {
ExamID string `json:"exam_id" gorm:"type:string(11);not null;primaryKey;comment:考试ID"`
ExamID string `gorm:"type:string(11);not null;primaryKey;column:exam_id;comment:考试ID" json:"exam_id"`
ExamName string `json:"exam_name" gorm:"comment:考试名称"`
ExamTime string `json:"exam_time" gorm:"comment:考试时间"`
ExamContent string `json:"exam_content" gorm:"comment:考试内容"`

View File

@ -28,7 +28,7 @@ func (s *ExamUsecase) Create(ctx context.Context, req *pb.CreateExamRequest) (*p
if err != nil {
reply.Code = 400
reply.Msg = err.Error()
echo.Warnf("创建错误: %v", err)
echo.Warnf("创建错误:%v", err)
} else {
reply.ExamId = resp.ExamID
reply.Msg = resp.Message

View File

@ -28,7 +28,7 @@ data:
min_idle_conns: 10
max_retries: 3
jwt:
expiration: 20
expiration: 120
secretKey: 'online-ceremony'
# 服务发现

View File

@ -51,7 +51,7 @@ const docTemplate = `{
"post": {
"description": "用户注册接口",
"consumes": [
"application/json"
"application/x-www-form-urlencoded"
],
"produces": [
"application/json"

View File

@ -45,7 +45,7 @@
"post": {
"description": "用户注册接口",
"consumes": [
"application/json"
"application/x-www-form-urlencoded"
],
"produces": [
"application/json"

View File

@ -31,7 +31,7 @@ paths:
/register:
post:
consumes:
- application/json
- application/x-www-form-urlencoded
description: 用户注册接口
parameters:
- description: 用户名

19
go.mod
View File

@ -3,7 +3,7 @@ module manage
go 1.21
require (
github.com/Fromsko/gouitls v1.2.2
github.com/Fromsko/gouitls v1.2.7
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/duke-git/lancet v1.4.2
github.com/gin-contrib/static v0.0.1
@ -16,6 +16,9 @@ require (
github.com/panjf2000/ants/v2 v2.9.0
github.com/shirou/gopsutil v3.21.11+incompatible
github.com/sirupsen/logrus v1.9.3
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.2
go.opentelemetry.io/otel v1.22.0
go.uber.org/automaxprocs v1.5.3
google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac
@ -27,18 +30,14 @@ require (
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.2.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/bytedance/sonic v1.10.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/gzip v0.0.6 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-kratos/aegis v0.2.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
@ -71,18 +70,10 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/swaggo/files v1.0.1 // indirect
github.com/swaggo/gin-swagger v1.6.0 // indirect
github.com/swaggo/swag v1.16.2 // indirect
github.com/tklauser/go-sysconf v0.3.13 // indirect
github.com/tklauser/numcpus v0.7.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
github.com/urfave/cli/v2 v2.27.1 // indirect
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.opentelemetry.io/otel/metric v1.22.0 // indirect
go.opentelemetry.io/otel/trace v1.22.0 // indirect
@ -95,7 +86,5 @@ require (
golang.org/x/tools v0.17.0 // indirect
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
)

102
go.sum
View File

@ -1,16 +1,8 @@
github.com/Fromsko/gouitls v1.2.1 h1:daH5eur5NsDoG00NpuLXr38EhUT9DvH2mjiyZnvHWKI=
github.com/Fromsko/gouitls v1.2.1/go.mod h1:pnx9wA17MZUcP8T93DL+CH++RPCVX/SVByCJjW5mJO0=
github.com/Fromsko/gouitls v1.2.2 h1:YE9k2D1RrJckPd9UPX/wF/OwRqqFySYir2fRFArIl8E=
github.com/Fromsko/gouitls v1.2.2/go.mod h1:pnx9wA17MZUcP8T93DL+CH++RPCVX/SVByCJjW5mJO0=
github.com/Fromsko/gouitls v1.2.7 h1:clBl9mvELvV0ls6mxhqFPLDhJb5J3Db4+beR5TL93UY=
github.com/Fromsko/gouitls v1.2.7/go.mod h1:pnx9wA17MZUcP8T93DL+CH++RPCVX/SVByCJjW5mJO0=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/PuerkitoBio/purell v1.2.1 h1:QsZ4TjvwiMpat6gBCBxEQI0rcS9ehtkKtSpiUnd9N28=
github.com/PuerkitoBio/purell v1.2.1/go.mod h1:ZwHcC/82TOaovDi//J/804umJFFmbOHPngi8iYYv/Eo=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=
github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
@ -20,7 +12,6 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
@ -32,9 +23,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -54,8 +42,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
@ -65,7 +51,6 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
github.com/gin-contrib/static v0.0.1 h1:JVxuvHPuUfkoul12N7dtQw7KRn/pSMq7Ue1Va9Swm1U=
github.com/gin-contrib/static v0.0.1/go.mod h1:CSxeF+wep05e0kCOsqWdAWbSszmc31zTIbD8TvWl7Hs=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-kratos/aegis v0.2.0 h1:dObzCDWn3XVjUkgxyBp6ZeWtx/do0DPZ7LY3yNSJLUQ=
@ -73,13 +58,10 @@ github.com/go-kratos/aegis v0.2.0/go.mod h1:v0R2m73WgEEYB3XYu6aE2WcMwsZkJ/Rzuf5e
github.com/go-kratos/kratos/v2 v2.7.2 h1:WVPGFNLKpv+0odMnCPxM4ZHa2hy9I5FOnwpG3Vv4w5c=
github.com/go-kratos/kratos/v2 v2.7.2/go.mod h1:rppuc8+pGL2UtXA29bgFHWKqaaF6b6GB2XIYiDvFBRk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
@ -97,17 +79,12 @@ github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvSc
github.com/go-playground/form/v4 v4.2.1 h1:HjdRDKO0fftVMU5epjPW2SOREcZ6/wLUzEobqUGJuPw=
github.com/go-playground/form/v4 v4.2.1/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-playground/validator/v10 v10.17.0 h1:SmVVlfAOtlZncTxRuinDPomC2DkXJ4E5T9gDA0AIH74=
github.com/go-playground/validator/v10 v10.17.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-redis/redis/extra/rediscmd/v8 v8.11.5 h1:ftG8tp8SG81xyuL2woNEx5t2RZ8mOJuC2+tumi+/NR8=
@ -120,7 +97,6 @@ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@ -141,14 +117,11 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
@ -171,22 +144,14 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
@ -194,7 +159,6 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@ -220,26 +184,16 @@ github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/panjf2000/ants/v2 v2.9.0 h1:SztCLkVxBRigbg+vt0S5QvF5vxAbxbKt09/YfAJ0tEo=
github.com/panjf2000/ants/v2 v2.9.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shirou/gopsutil v2.21.11+incompatible h1:lOGOyCG67a5dv2hq5Z1BLDUqqKp3HkbjPcz5j6XMS0U=
github.com/shirou/gopsutil v2.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@ -248,7 +202,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@ -262,41 +215,24 @@ github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+z
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04=
github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E=
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4=
go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=
go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=
go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=
go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=
go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE=
@ -304,28 +240,23 @@ go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiM
go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4=
go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc=
go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=
go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@ -336,8 +267,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -345,8 +274,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -365,21 +292,14 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@ -405,20 +325,12 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 h1:W12Pwm4urIbRdGhMEg2NM9O3TWKjNcxQhs46V0ypf/k=
google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic=
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg=
google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k=
google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 h1:ZcOkrmX74HbKFYnpPY8Qsw93fC29TbJXspYKaBkSXDQ=
google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg=
google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac h1:OZkkudMUu9LVQMCoRUbI/1p5VCo9BOrlvkqMvWtqa6s=
google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA=
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU=
google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@ -429,14 +341,11 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
@ -447,7 +356,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs=
@ -457,5 +365,3 @@ gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls=
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

View File

@ -1,12 +1,10 @@
package biz
import (
"github.com/Fromsko/gouitls/logs"
"github.com/google/wire"
)
// ProviderSet is biz providers.
var (
ProviderSet = wire.NewSet(NewAPIUseCase)
log = logs.InitLogger()
)

View File

@ -21,6 +21,14 @@ func (u *APIUseCase) Class() *Method {
classId := c.Param("class_id")
getStudents := func() []StudentClass {
resp, err := u.Repo.GetStudentByClassID(classId)
if err != nil {
return nil
}
return resp
}
remoteClass(func(ctx context.Context, csc class.ClassServiceClient) {
resp, err := csc.GetClass(ctx, &class.GetClassRequest{
ClassId: classId,
@ -29,7 +37,10 @@ func (u *APIUseCase) Class() *Method {
c.JSON(http.StatusOK, &errors.StandardResponse{
Code: resp.Code,
Msg: resp.Msg,
Data: resp.ClassInfo,
Data: gin.H{
"class_info": resp.ClassInfo,
"student_list": getStudents(),
},
})
}
})
@ -87,6 +98,9 @@ func (u *APIUseCase) Class() *Method {
ClassId: classId,
})
if errors.CheckErr(c, err, remoteName, resp.Code, resp.Msg) {
_ = u.Repo.RemoveStudentsFromClass(classId) // 移除学生
c.JSON(http.StatusOK, &errors.StandardResponse{
Code: resp.Code,
Msg: resp.Msg,

View File

@ -48,11 +48,13 @@ type APIUseRepo interface {
type StudentClassService interface {
// 获取学生班级信息
GetStudentClass(classID, studentID string) (*StudentClass, error)
GetStudentByClassID(classID string) ([]StudentClass, error)
// JoinClass 学生加入班级
JoinClass(request *JoinClassRequest) (*JoinClassResponse, error)
// LeaveClass 学生退出班级
LeaveClass(request *LeaveClassRequest) (*LeaveClassResponse, error)
// RemoveStudentsFromClass 将学生从学生班级中移除
RemoveStudentsFromClass(classID string) error
}
type Operater interface {

View File

@ -0,0 +1,29 @@
package biz
import "time"
// Score 定义成绩
type Score struct {
ExamID string `gorm:"primaryKey;column:exam_id" json:"exam_id"`
StudentID string `gorm:"primaryKey;column:student_id" json:"student_id"`
ScoreCalculation float64 `gorm:"column:score_calculation" json:"score_calculation"`
Exam Exam `gorm:"foreignKey:ExamID;references:ExamID" json:"exam"`
}
// ExamQuestion 定义试题结构体
type ExamQuestion struct {
Question string `json:"question"`
Options []string `json:"options"`
Answer string `json:"answer"`
}
// Exam 定义考试结构体
type Exam struct {
ExamID string `gorm:"type:string(11);not null;primaryKey;column:exam_id;comment:考试ID" json:"exam_id"`
ExamName string `json:"exam_name" gorm:"comment:考试名称"`
ExamTime string `json:"exam_time" gorm:"comment:考试时间"`
ExamContent string `json:"exam_content" gorm:"comment:考试内容"`
CreatedAt time.Time `json:"created_at" gorm:"comment:创建时间"`
UpdatedAt time.Time `json:"updated_at" gorm:"comment:更新时间"`
TeacherID string `json:"teacher_id" gorm:"comment:教师ID"`
}

View File

@ -1,19 +1,28 @@
package biz
import (
"context"
"fmt"
"manage/api/class"
"manage/api/user"
"strings"
rp "github.com/Fromsko/gouitls/reply"
"github.com/gin-gonic/gin"
)
// StudentClass 定义学生班级关联结构体
type StudentClass struct {
StudentID string `gorm:"constraint:OnUpdate:CASCADE,OnDelete:RESTRICT;"` // 学生ID级联更新和删除约束
ClassID string `gorm:"constraint:OnUpdate:CASCADE,OnDelete:RESTRICT;"` // 班级ID级联更新和删除约束
StudentID string `gorm:"column:student_id" json:"student_id"`
ClassID string `gorm:"column:class_id" json:"class_id"`
UserName string `gorm:"column:username" json:"username"`
}
// JoinClassRequest 请求格式
type JoinClassRequest struct {
StudentID string `json:"student_id"`
ClassID string `json:"class_id"`
UserName string `gorm:"column:username" json:"username"`
}
// JoinClassResponse 响应格式
@ -32,61 +41,68 @@ type LeaveClassResponse struct {
Message string `json:"message"`
}
func badMsg(err, msg string) gin.H {
return gin.H{
"err": err,
"msg": msg,
}
}
func sucdMsg(msg string, data any) gin.H {
return gin.H{
"code": 200,
"msg": msg,
"data": data,
}
}
func (u *APIUseCase) Student() *Method {
return &Method{
Get: func(c *gin.Context) {
classId := c.Param("class_id")
studentId := c.PostForm("student_id")
if studentId == "" {
c.JSON(400, badMsg("获取失败", "参数不正确"))
return
}
reply, err := u.Repo.GetStudentClass(classId, studentId)
if err != nil {
c.JSON(500, badMsg("获取失败", err.Error()))
return
}
c.JSON(200, sucdMsg("获取成功", reply))
},
Post: func(c *gin.Context) {
classId := c.Param("class_id")
studentId := c.PostForm("student_id")
hasUser := ""
username := ""
if studentId == "" {
c.JSON(400, badMsg("加入失败", "参数不正确"))
rp.Failed(c, "加入失败", "参数不正确")
return
}
reply, err := u.Repo.JoinClass(&JoinClassRequest{
StudentID: studentId,
ClassID: classId,
})
checkExistence := func(classId, studentId string, hasUser *string) bool {
flag := true
if err != nil {
c.JSON(400, badMsg("加入失败", err.Error()))
u.Repo.User(func(ctx context.Context, usc user.UserServiceClient) {
req := &user.GetUserRequest{UserId: studentId}
if resp, _ := usc.GetUser(ctx, req); resp.Code == 400 {
flag = false
*hasUser = strings.Split(resp.Msg, ":")[1]
} else {
username = resp.Data.Username
}
})
if !flag {
return false
}
u.Repo.Class(func(ctx context.Context, csc class.ClassServiceClient) {
req := &class.GetClassRequest{ClassId: classId}
if resp, _ := csc.GetClass(ctx, req); resp.Code == 400 {
flag = false
fmt.Println(resp.Msg, resp.Code, resp.ClassInfo)
*hasUser = strings.Split(resp.Msg, ":")[1]
}
})
return flag
}
if !checkExistence(classId, studentId, &hasUser) && hasUser != "" {
rp.Failed(c, "加入失败", hasUser)
return
}
c.JSON(200, sucdMsg(reply.Message, ""))
// 加入班级
{
reply, err := u.Repo.JoinClass(&JoinClassRequest{
StudentID: studentId,
ClassID: classId,
UserName: username,
})
if err != nil {
rp.Failed(c, "加入失败", err.Error())
return
}
rp.Succeed(c, reply.Message)
}
},
Delete: func(c *gin.Context) {
@ -95,7 +111,7 @@ func (u *APIUseCase) Student() *Method {
studentId := c.PostForm("student_id")
if studentId == "" {
c.JSON(400, badMsg("删除失败", "参数不正确"))
rp.Failed(c, "删除失败", "参数不正确")
return
}
@ -105,11 +121,11 @@ func (u *APIUseCase) Student() *Method {
})
if err != nil {
c.JSON(400, badMsg("离开失败", err.Error()))
rp.Failed(c, "离开失败", err.Error())
return
}
c.JSON(200, sucdMsg(reply.Message, ""))
rp.Succeed(c, reply.Message)
},
}
}

View File

@ -31,9 +31,23 @@ func NewAPIRepo(Data *Data, logger log.Logger) biz.APIUseRepo {
func (repo *apiRepo) setup() {
// 自动迁移数据库表
if err := repo.Data.Mysql.AutoMigrate(&biz.StudentClass{}); err != nil {
if err := repo.Data.Mysql.AutoMigrate(&biz.StudentClass{}, &biz.Score{}); err != nil {
log.Fatal(err)
}
/*
// 查询特定成绩及其关联的考试信息
var score biz.Score
result := repo.Data.Mysql.Preload("Exam").First(&score, "exam_id = ?", "fde39fdd0f60")
if result.Error != nil {
// 处理查询错误
fmt.Println(result.Error)
}
// 打印成绩及其关联的考试信息
fmt.Println("Score:", score)
fmt.Println("Exam:", score.Exam)
*/
}
func (repo *apiRepo) User(CallBack biz.UserCallBack) {
@ -74,6 +88,7 @@ func (repo *apiRepo) JoinClass(request *biz.JoinClassRequest) (*biz.JoinClassRes
studentClass := biz.StudentClass{
StudentID: request.StudentID,
ClassID: request.ClassID,
UserName: request.UserName,
}
result := repo.Data.Mysql.Create(&studentClass)
if result.Error != nil {
@ -118,16 +133,39 @@ func (repo *apiRepo) LeaveClass(request *biz.LeaveClassRequest) (*biz.LeaveClass
return &response, nil
}
func (repo *apiRepo) GetStudentClass(classID, studentID string) (*biz.StudentClass, error) {
var studentClass biz.StudentClass
result := repo.Data.Mysql.Where("class_id = ? AND student_id = ?", classID, studentID).First(&studentClass)
// GetStudentByClassID 查询学生信息通过ID
func (repo *apiRepo) GetStudentByClassID(classID string) ([]biz.StudentClass, error) {
var studentClass []biz.StudentClass
result := repo.Data.Mysql.Where("class_id = ?", classID).Find(&studentClass)
if result.Error != nil {
if result.Error == gorm.ErrRecordNotFound {
return nil, nil
}
return nil, result.Error
}
return &studentClass, nil
return studentClass, nil
}
// RemoveStudentsFromClass 将学生从学生班级中移除
func (repo *apiRepo) RemoveStudentsFromClass(classID string) error {
// 查询班级中的所有学生
studentClassList, err := repo.GetStudentByClassID(classID)
if err != nil {
return err
}
// 逐个移除学生
for _, studentClass := range studentClassList {
_, err := repo.LeaveClass(&biz.LeaveClassRequest{
StudentID: studentClass.StudentID,
ClassID: studentClass.ClassID,
})
if err != nil {
return err
}
}
return nil
}
type Operat struct {

View File

@ -1,21 +0,0 @@
package common
type StatusCPU struct {
Type string `json:"type"`
Usage float64 `json:"useage"`
}
type StatusService struct {
Type string `json:"type"`
ServiceList Service `json:"server"`
}
type Service struct {
Name string `json:"name"` // IP 地址
Status string `josn:"status"` // 状态
}
type StatusNotify struct {
Type string `json:"type"`
NotifyInfo string `json:"info"`
}

View File

@ -1,59 +0,0 @@
package guard
import (
"context"
"fmt"
"manage/api/user"
"manage/internal/biz"
"manage/internal/service"
"github.com/gin-gonic/gin"
)
var AuthType = struct {
Teacher string
Student string
Admin string
}{
Teacher: "老师",
Student: "学生",
Admin: "管理员",
}
func ClassPermission(srv *service.GatewayService) gin.HandlerFunc {
return func(ctx *gin.Context) {
id := ctx.PostForm("teacher_id")
if id == "" {
ctx.JSON(400, gin.H{"msg": "鉴权失败", "err": "参数不正确"})
ctx.Abort()
return
}
searchAuth := func(_ context.Context, usc user.UserServiceClient) {
reply, err := usc.GetUser(ctx, &user.GetUserRequest{UserId: id})
if err != nil || reply.Code != 200 || reply.Data == nil || reply.Data.Role == "" {
ctx.JSON(400, gin.H{
"msg": "鉴权失败",
"err": fmt.Sprintf("参数不正确(%s)", err),
})
ctx.Abort()
return
}
role := reply.Data.Role
if role != AuthType.Teacher && role != AuthType.Admin {
ctx.JSON(400, gin.H{"msg": "无权操作", "err": role})
ctx.Abort()
return
}
}
srv.Remote.CallGrpc(func(call *biz.APIUseCase) {
call.Repo.User(searchAuth)
})
ctx.Next()
}
}

View File

@ -2,22 +2,22 @@ package handler
import (
"context"
"fmt"
"manage/api/user"
"manage/internal/biz"
"manage/internal/routes/middleware"
"manage/internal/routes/middleware/guard"
"manage/internal/routes/model"
"manage/internal/service"
"strings"
"github.com/Fromsko/gouitls/auth"
rp "github.com/Fromsko/gouitls/reply"
"github.com/gin-gonic/gin"
)
// @Summary 用户注册
// @Description 用户注册接口
// @Tags Auth
// @Accept json
// @Accept x-www-form-urlencoded
// @Produce json
// @Param username formData string true "用户名"
// @Param password formData string true "密码"
@ -74,9 +74,9 @@ func Login(srv *service.GatewayService) gin.HandlerFunc {
return func(ctx *gin.Context) {
us := ctx.PostForm("username")
pwd := ctx.PostForm("password")
if us == "" || pwd == "" {
ctx.JSON(400, gin.H{"msg": "登录失败", "err": "参数不正确"})
rp.Failed(ctx, "登录失败", "参数不正确")
ctx.Abort()
return
}
@ -86,19 +86,13 @@ func Login(srv *service.GatewayService) gin.HandlerFunc {
UserId: strings.Split(auth.GenUUID(us), "-")[0],
})
if err != nil || reply.Code != 200 || reply.Data == nil || reply.Data.Role == "" {
ctx.JSON(400, gin.H{
"msg": "登录失败",
"err": fmt.Sprintf("参数不正确(%s)", err),
})
rp.Failed(ctx, "登录失败", "账号密码错误")
ctx.Abort()
return
}
if reply.Data.Password != auth.HashString(pwd) {
ctx.JSON(400, gin.H{
"msg": "登录失败",
"err": "账号密码错误",
})
rp.Failed(ctx, "登录失败", "账号密码错误")
ctx.Abort()
return
} else {
@ -106,10 +100,11 @@ func Login(srv *service.GatewayService) gin.HandlerFunc {
if err != nil {
middleware.Log.Errorf("Token 生成失败(%s)", err)
}
ctx.JSON(200, gin.H{
"msg": "登录成功",
"token": token,
})
rp.Succeed(ctx, "登陆成功",
gin.H{
"token": token,
},
)
ctx.Next()
return
}
@ -121,11 +116,15 @@ func Login(srv *service.GatewayService) gin.HandlerFunc {
}
}
func ProxyAuth(srv *service.GatewayService, cRole ...string) gin.HandlerFunc {
func ProxyAuth(srv *service.GatewayService, cRole ...model.AuthType) gin.HandlerFunc {
return func(ctx *gin.Context) {
token := ctx.GetHeader("Authorization")
if token == "" {
ctx.JSON(403, gin.H{"msg": "鉴权失败", "err": "未携带Token"})
rp.Failed(ctx, "鉴权失败", "未携带Token",
gin.H{
"code": 403,
},
)
ctx.Abort()
return
}
@ -133,7 +132,11 @@ func ProxyAuth(srv *service.GatewayService, cRole ...string) gin.HandlerFunc {
token = strings.Replace(token, "Bearer ", "", 1)
userId, ok := srv.Remote.Repo.TokenOperat().CheckTokenInfo(token)
if !ok {
ctx.JSON(403, gin.H{"msg": "鉴权失败", "err": "Token已过期"})
rp.Failed(ctx, "鉴权失败", "Token已过期",
gin.H{
"code": 403,
},
)
ctx.Abort()
return
}
@ -141,30 +144,35 @@ func ProxyAuth(srv *service.GatewayService, cRole ...string) gin.HandlerFunc {
searchAuth := func(_ context.Context, usc user.UserServiceClient) {
reply, err := usc.GetUser(ctx, &user.GetUserRequest{UserId: userId})
if err != nil || reply.Code != 200 || reply.Data == nil || reply.Data.Role == "" {
ctx.JSON(400, gin.H{
"msg": "鉴权失败",
"err": "用户不存在",
})
rp.Failed(ctx, "鉴权失败", "用户不存在",
gin.H{
"code": 403,
},
)
ctx.Abort()
return
}
isRole := false
role := reply.Data.Role
roleFlag := false
switch len(cRole) {
case 1:
roleFlag = role != cRole[0]
case 2:
if len(cRole) != 0 {
for _, r := range cRole {
roleFlag = role != r
if r.String() == role {
isRole = true
break
}
}
default:
roleFlag = role != guard.AuthType.Admin
} else {
isRole = (model.Admin.String() == role)
}
if roleFlag {
ctx.JSON(400, gin.H{"msg": "无权操作", "err": role})
if !isRole {
rp.Failed(ctx, "无权操作", "当前角色: "+role,
gin.H{
"code": 400,
},
)
ctx.Abort()
return
}

View File

@ -0,0 +1,23 @@
package model
type AuthType int
const (
Teacher AuthType = iota
Student
Admin
)
var authTypeNames = [...]string{
"老师",
"学生",
"管理员",
}
// String 用户鉴权
func (at AuthType) String() string {
if at < 0 || int(at) >= len(authTypeNames) {
return "未知角色"
}
return authTypeNames[at]
}

View File

@ -1,9 +1,8 @@
package routes
import (
"manage/internal/routes/common"
"manage/internal/routes/middleware"
"manage/internal/routes/middleware/handler"
"manage/internal/routes/model"
"manage/internal/service"
"github.com/gin-gonic/gin"
@ -19,7 +18,7 @@ import (
func RegisterHttpServer(s *khttp.Server, srv *service.GatewayService) {
router := gin.New()
InitConfig(router)
common.TaskRuner(common.CpuTask)
// common.TaskRuner(common.CpuTask)
// 添加Swagger路由
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
@ -33,44 +32,50 @@ func RegisterHttpServer(s *khttp.Server, srv *service.GatewayService) {
// 用户组
userGrp := rootGrp.Group("/user")
{
userGrp.Use(handler.ProxyAuth(srv))
userGrp.POST("/", srv.Remote.User().Post)
userGrp.Use(handler.ProxyAuth(srv, model.Admin, model.Teacher)) // [管理员|老师]
userGrp.POST("/", handler.ProxyAuth(srv, model.Admin), srv.Remote.User().Post)
userGrp.GET("/user_list", srv.Remote.User().Get)
userGrp.GET("/:user_id", srv.Remote.User().Get)
userGrp.PUT("/:user_id", srv.Remote.User().Put)
userGrp.DELETE("/:user_id", srv.Remote.User().Delete)
userGrp.DELETE("/:user_id", handler.ProxyAuth(srv, model.Admin), srv.Remote.User().Delete)
}
// 考试组
examGrp := rootGrp.Group("/exam")
{
examGrp.POST("/", srv.Remote.Exam().Post)
examGrp.GET("/:exam_id", handler.ProxyAuth(srv), srv.Remote.Exam().Get)
examGrp.DELETE("/:exam_id", srv.Remote.Exam().Delete)
examGrp.PUT("/:exam_id", srv.Remote.Exam().Put)
examGrp.POST("/", handler.ProxyAuth(srv, model.Admin, model.Teacher), srv.Remote.Exam().Post)
examGrp.GET("/:exam_id", srv.Remote.Exam().Get)
examGrp.DELETE("/:exam_id", handler.ProxyAuth(srv, model.Admin, model.Teacher), srv.Remote.Exam().Delete)
examGrp.PUT("/:exam_id", handler.ProxyAuth(srv, model.Admin, model.Teacher), srv.Remote.Exam().Put)
}
// 课程组
// 课程组 [管理员]
courseGrp := rootGrp.Group("/course")
{
courseGrp.Use(handler.ProxyAuth(srv, model.Admin)) // [管理员]
courseGrp.POST("/", srv.Remote.Course().Post)
courseGrp.GET("/:course_id", srv.Remote.Course().Get)
courseGrp.DELETE("/:course_id", srv.Remote.Course().Delete)
courseGrp.PUT("/:course_id", srv.Remote.Course().Put)
}
// 班级组
// 班级组 [管理员]
classGrp := rootGrp.Group("/class")
{
classGrp.POST("/", srv.Remote.Class().Post)
classGrp.GET("/:class_id", srv.Remote.Class().Get)
classGrp.DELETE("/:class_id", srv.Remote.Class().Delete)
classGrp.PUT("/:class_id", srv.Remote.Class().Put)
// 学生班级
classGrp.POST("/", handler.ProxyAuth(srv, model.Admin), srv.Remote.Class().Post)
classGrp.GET("/:class_id", handler.ProxyAuth(srv, model.Admin), srv.Remote.Class().Get)
classGrp.DELETE("/:class_id", handler.ProxyAuth(srv, model.Admin), srv.Remote.Class().Delete)
classGrp.PUT("/:class_id", handler.ProxyAuth(srv, model.Admin), srv.Remote.Class().Put)
// 学生班级 [老师 | 管理员]
classJLGrp := classGrp.Group("/:class_id")
{
classGrp.POST("/:class_id/join", srv.Remote.Student().Post)
classGrp.DELETE("/:class_id/leave", srv.Remote.Student().Delete)
classJLGrp.Use(handler.ProxyAuth(
srv,
model.Admin, model.Teacher,
))
classJLGrp.POST("/join", srv.Remote.Student().Post)
classJLGrp.DELETE("/leave", srv.Remote.Student().Delete)
}
}
// 服务状态
rootGrp.GET("/ws", middleware.MonitorWS)
// rootGrp.GET("/ws", middleware.MonitorWS)
}
s.HandlePrefix("/", router)
}