diff --git a/.gitignore b/.gitignore index eaefa03..0f0516b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea integrity-checkin +files diff --git a/dao/checkin.go b/dao/checkin.go index c69a7d0..6a11a01 100644 --- a/dao/checkin.go +++ b/dao/checkin.go @@ -23,7 +23,7 @@ func (c CheckinDAO) FindUserActivityByDay(userID int, activityID int, day string } return &userActivity } -func (c CheckinDAO) CreateCheckin(userID int, activityID int, image string) (*po.UserActivity, error) { +func (c CheckinDAO) CreateCheckin(userID int, activityID int, files string) (*po.UserActivity, error) { if activity := c.FindActivityByID(activityID); activity == nil { return nil, errors.New("activityID不存在") } @@ -31,7 +31,7 @@ func (c CheckinDAO) CreateCheckin(userID int, activityID int, image string) (*po UserID: userID, UserActivityForm: po.UserActivityForm{ ActivityID: activityID, - Image: image, + Files: files, }, Status: 1, Day: time.Now().Format("20060102"), @@ -86,7 +86,7 @@ func (c CheckinDAO) FindAllActivities(isTeacher bool) []po.Activity { } func getUserActivityExtendedSQL(where string) string { return "select ua.*,a.category activity_category," + - "a.name activity_name from user_activity ua left join activities a on a.id=ua.activity_id " + + "a.name activity_name,u.real_name,u.username from user_activity ua left join activities a on a.id=ua.activity_id " + "left join users u on u.id=ua.user_id " + where + " order by created_at desc" } diff --git a/data/dto/user.go b/data/dto/user.go index e14e358..9e52cd0 100644 --- a/data/dto/user.go +++ b/data/dto/user.go @@ -14,4 +14,6 @@ type UserActivityExtended struct { po.UserActivity ActivityCategory string `json:"activity_category"` ActivityName string `json:"activity_name"` + Username string `json:"username"` + RealName string `json:"real_name"` } diff --git a/data/po/checkin.go b/data/po/checkin.go index 644dc6a..175f3fe 100644 --- a/data/po/checkin.go +++ b/data/po/checkin.go @@ -1,7 +1,7 @@ package po import ( - "errors" + "integrity-checkin/pkg/util" "strings" "time" ) @@ -36,12 +36,14 @@ func (u UserActivity) TableName() string { type UserActivityForm struct { ActivityID int `json:"activity_id" form:"activity_id" binding:"required"` - Image string `json:"image" form:"image" binding:"required,url"` + Files string `json:"files" form:"files" binding:"required"` } func (u UserActivityForm) Validate() error { - if !strings.HasPrefix(u.Image, "https://") { - return errors.New("不是图床链接") + for _, filename := range strings.Split(u.Files, ",") { + if err := util.ValidateFilename(filename); err != nil { + return err + } } return nil } diff --git a/pkg/util/util.go b/pkg/util/util.go new file mode 100644 index 0000000..d6787ac --- /dev/null +++ b/pkg/util/util.go @@ -0,0 +1,16 @@ +package util + +import ( + "errors" + "path/filepath" +) + +func ValidateFilename(filename string) error { + switch filepath.Ext(filename) { + case ".pdf", ".doc", ".jpg", ".gif", ".png", ".jpeg", + ".docx", ".xls", ".xlsx", ".zip", ".rar", ".7z": + return nil + default: + return errors.New("扩展名不支持") + } +} diff --git a/router/router.go b/router/router.go index 654e0bd..b353d83 100644 --- a/router/router.go +++ b/router/router.go @@ -9,6 +9,7 @@ import ( func Setup(engine *gin.Engine) { engine.Use(middleware.Cors()) + engine.Static("/files", "files") user := engine.Group("/user") { hub := service.ExUserService @@ -25,6 +26,7 @@ func Setup(engine *gin.Engine) { checkin.GET("/list_activities", app.HandlerFunc(hub.ListActivities)) checkin.POST("/submit", app.HandlerFunc(hub.Submit)) checkin.GET("/get_my_activities_today", app.HandlerFunc(hub.GetMyActivitiesToday)) + checkin.POST("/upload_file", middleware.JWT(1), app.HandlerFunc(hub.UploadFile)) checkin.POST("/set_status", middleware.JWT(2), app.HandlerFunc(hub.SetStatus)) checkin.GET("/get_user_activity", middleware.JWT(2), app.HandlerFunc(hub.GetUserActivity)) checkin.GET("/list_user_activities", middleware.JWT(2), app.HandlerFunc(hub.ListUserActivities)) diff --git a/script/main.go b/script/main.go index 333724d..5a13b4a 100644 --- a/script/main.go +++ b/script/main.go @@ -35,7 +35,7 @@ func UserActivity() { io.WriteString(f, "姓名,学号,日期,活动,图片\n") for _, userActivity := range userActivities { io.WriteString(f, userActivity.RealName+","+userActivity.Username+","+ - userActivity.Day+","+userActivity.ActivityName+","+userActivity.Image+"\n") + userActivity.Day+","+userActivity.ActivityName+","+userActivity.Files+"\n") } } func Student() { diff --git a/service/checkin.go b/service/checkin.go index 645adc7..ae44869 100644 --- a/service/checkin.go +++ b/service/checkin.go @@ -1,8 +1,13 @@ package service import ( + "github.com/google/uuid" "integrity-checkin/data/po" "integrity-checkin/pkg/app" + "integrity-checkin/pkg/util" + "io" + "os" + "path/filepath" "strconv" "time" ) @@ -23,7 +28,7 @@ func (c CheckinService) Submit(aw *app.Wrapper) app.Result { if checkinDAO.FindUserActivityByDay(uc.UserID, req.ActivityID, today) != nil { return aw.Error("您今天已参加过该项目,请明天再来") } - userActivity, err := checkinDAO.CreateCheckin(uc.UserID, req.ActivityID, req.Image) + userActivity, err := checkinDAO.CreateCheckin(uc.UserID, req.ActivityID, req.Files) if err != nil { return aw.Error(err.Error()) } @@ -92,3 +97,33 @@ func (c CheckinService) GetUserActivity(aw *app.Wrapper) app.Result { func (c CheckinService) GetMyActivitiesToday(aw *app.Wrapper) app.Result { return aw.Success(checkinDAO.FindUserActivitiesToday(aw.ExtractUserClaims().UserID, time.Now().Format("20060102"))) } +func (c CheckinService) UploadFile(aw *app.Wrapper) app.Result { + formFile, err := aw.Ctx.FormFile("file") + if err != nil { + return aw.Error(err.Error()) + } + file, err := formFile.Open() + if err != nil { + return aw.Error(err.Error()) + } + if err = util.ValidateFilename(formFile.Filename); err != nil { + return aw.Error(err.Error()) + } + if _, err = os.Stat("files"); err != nil { + err = os.Mkdir("files", 0666) + if err != nil { + return aw.Error(err.Error()) + } + } + filename := uuid.New().String() + filepath.Ext(formFile.Filename) + out, err := os.OpenFile("files/"+filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) + if err != nil { + return aw.Error(err.Error()) + } + defer out.Close() + _, err = io.Copy(out, file) + if err != nil { + return aw.Error(err.Error()) + } + return aw.Success(filename) +}