From e83b15b03a4cd915c22ad4ca510aa10dbe2acb70 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 19 Sep 2024 11:40:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E6=8E=92=E5=90=8D?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/Article.go | 57 ++++++++++++++++++++-- api/controller/Video.go | 57 ++++++++++++++++++++-- api/dao/SystemConfig.go | 99 +++++++++++++++++++++++++++++++++++++++ api/model/SystemConfig.go | 32 +++++++++++++ 4 files changed, 237 insertions(+), 8 deletions(-) create mode 100644 api/dao/SystemConfig.go create mode 100644 api/model/SystemConfig.go diff --git a/api/controller/Article.go b/api/controller/Article.go index 029db48..1ab7600 100644 --- a/api/controller/Article.go +++ b/api/controller/Article.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "net/http" + "sort" "strconv" "time" "vote-api/api/dao" @@ -135,10 +136,15 @@ func (r *Article) GetArticle(c *gin.Context) { // GetArticleRankList 获取文章排名列表 func (r *Article) GetArticleRankList(c *gin.Context) { - // 检测投票有效期 - systemTimeService := service.SystemTimeService{} - isValid := systemTimeService.CheckVoteValidStatus() - if isValid == false { + // 获取排名开关限制 + systemConfigDao := dao.SystemConfigDao{} + systemConfig, err := systemConfigDao.GetSystemConfigById(1) + if err != nil { + responses.OkWithData(nil, c) + return + } + + if systemConfig.IsDisplayRank == 0 { responses.OkWithData(nil, c) return } @@ -153,6 +159,29 @@ func (r *Article) GetArticleRankList(c *gin.Context) { return } + // 处理数据 + for i, article := range articles { + // 判断最后两位票数是否相同 + if i == 14 { + maps = make(map[string]interface{}) + maps["article_status"] = 1 + maps["vote_num"] = article.VoteNum + results, err := articleDao.GetArticleList(maps) + if err != nil { + responses.OkWithData(nil, c) + return + } + + for _, result := range results { + if result.ArticleId == article.ArticleId { + continue + } + + articles = append(articles, result) + } + } + } + // 处理返回值 g := dto.GetArticleListDto(articles) @@ -170,6 +199,26 @@ func (r *Article) GetArticleRankList(c *gin.Context) { } } + // 根据 VoteNum 降序排序 + sort.SliceStable(g, func(i, j int) bool { + return g[i].VoteNum > g[j].VoteNum + }) + + // 计算排名 + var currentRank int + for k, v := range g { + if k == 0 { + // 第一个元素,排名设为1 + currentRank = 1 + } else if g[k].VoteNum < g[k-1].VoteNum { + currentRank = k + 1 + } + + // 为当前元素设置 Rank + rank := currentRank // 创建一个新的变量来保存排名 + v.Rank = &rank // 将新的变量的地址赋给 Rank + } + responses.OkWithData(g, c) } diff --git a/api/controller/Video.go b/api/controller/Video.go index c553c4e..33a0238 100644 --- a/api/controller/Video.go +++ b/api/controller/Video.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "net/http" + "sort" "strconv" "time" "vote-api/api/dao" @@ -135,10 +136,15 @@ func (r *Video) GetVideo(c *gin.Context) { // GetVideoRankList 获取视频排名列表 func (r *Video) GetVideoRankList(c *gin.Context) { - // 检测投票状态 - systemTimeService := service.SystemTimeService{} - isValid := systemTimeService.CheckVoteValidStatus() - if isValid == false { + // 获取排名开关限制 + systemConfigDao := dao.SystemConfigDao{} + systemConfig, err := systemConfigDao.GetSystemConfigById(1) + if err != nil { + responses.OkWithData(nil, c) + return + } + + if systemConfig.IsDisplayRank == 0 { responses.OkWithData(nil, c) return } @@ -153,6 +159,29 @@ func (r *Video) GetVideoRankList(c *gin.Context) { return } + // 处理数据 + for i, video := range videos { + // 判断最后两位票数是否相同 + if i == 14 { + maps = make(map[string]interface{}) + maps["article_status"] = 1 + maps["vote_num"] = video.VoteNum + results, err := videoDao.GetVideoList(maps) + if err != nil { + responses.OkWithData(nil, c) + return + } + + for _, result := range results { + if result.VideoId == video.VideoId { + continue + } + + videos = append(videos, result) + } + } + } + // 处理返回值 g := dto.GetVideoListDto(videos) @@ -170,6 +199,26 @@ func (r *Video) GetVideoRankList(c *gin.Context) { } } + // 根据 VoteNum 降序排序 + sort.SliceStable(g, func(i, j int) bool { + return g[i].VoteNum > g[j].VoteNum + }) + + // 计算排名 + var currentRank int + for k, v := range g { + if k == 0 { + // 第一个元素,排名设为1 + currentRank = 1 + } else if g[k].VoteNum < g[k-1].VoteNum { + currentRank = k + 1 + } + + // 为当前元素设置 Rank + rank := currentRank // 创建一个新的变量来保存排名 + v.Rank = &rank // 将新的变量的地址赋给 Rank + } + responses.OkWithData(g, c) } diff --git a/api/dao/SystemConfig.go b/api/dao/SystemConfig.go new file mode 100644 index 0000000..359386c --- /dev/null +++ b/api/dao/SystemConfig.go @@ -0,0 +1,99 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "vote-api/api/model" + "vote-api/global" +) + +type SystemConfigDao struct { +} + +// GetSystemConfigById 获取数据-id +func (r *SystemConfigDao) GetSystemConfigById(ConfigId int64) (m *model.SystemConfig, err error) { + err = global.Db.First(&m, ConfigId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetSystemConfigPreloadById 获取数据-加载全部关联-id +func (r *SystemConfigDao) GetSystemConfigPreloadById(ConfigId int64) (m *model.SystemConfig, err error) { + err = global.Db.Preload(clause.Associations).First(&m, ConfigId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteSystemConfig 删除 +func (r *SystemConfigDao) DeleteSystemConfig(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.SystemConfig{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteSystemConfigById 删除-id +func (r *SystemConfigDao) DeleteSystemConfigById(tx *gorm.DB, ConfigId int64) error { + if err := tx.Delete(&model.SystemConfig{}, ConfigId).Error; err != nil { + return err + } + return nil +} + +// EditSystemConfig 修改 +func (r *SystemConfigDao) EditSystemConfig(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.SystemConfig{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditSystemConfigById 修改-id +func (r *SystemConfigDao) EditSystemConfigById(tx *gorm.DB, ConfigId int64, data interface{}) error { + err := tx.Model(&model.SystemConfig{}).Where("config_id = ?", ConfigId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetSystemConfigList 获取列表 +func (r *SystemConfigDao) GetSystemConfigList(maps interface{}) (m []*model.SystemConfig, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetSystemConfigCount 获取数量 +func (r *SystemConfigDao) GetSystemConfigCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.SystemConfig{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetSystemConfigListRand 获取列表-随机 +func (r *SystemConfigDao) GetSystemConfigListRand(maps interface{}, limit int) (m []*model.SystemConfig, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddSystemConfig 新增 +func (r *SystemConfigDao) AddSystemConfig(tx *gorm.DB, model *model.SystemConfig) (*model.SystemConfig, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/model/SystemConfig.go b/api/model/SystemConfig.go new file mode 100644 index 0000000..7636638 --- /dev/null +++ b/api/model/SystemConfig.go @@ -0,0 +1,32 @@ +package model + +import ( + "gorm.io/gorm" + "time" + "vote-api/global" +) + +// SystemConfig 配置-系统配置 +type SystemConfig struct { + ConfigId int64 `gorm:"column:config_id;type:bigint(19);primary_key;comment:主键id" json:"config_id"` + IsDisplayRank int `gorm:"column:is_display_rank;type:tinyint(1);default:1;comment:是否展示排名(0:否 1:是)" json:"is_display_rank"` + Model +} + +func (m *SystemConfig) TableName() string { + return "system_config" +} + +func (m *SystemConfig) BeforeCreate(tx *gorm.DB) error { + if m.ConfigId == 0 { + m.ConfigId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +}