新增了排名计算

This commit is contained in:
wucongxing8150 2024-09-19 11:40:24 +08:00
parent ade641dddf
commit e83b15b03a
4 changed files with 237 additions and 8 deletions

View File

@ -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)
}

View File

@ -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)
}

99
api/dao/SystemConfig.go Normal file
View File

@ -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
}

32
api/model/SystemConfig.go Normal file
View File

@ -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
}