227 lines
5.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"crypto/md5"
"encoding/hex"
"fmt"
"github.com/gin-gonic/gin"
"time"
"vote-admin-video-api/api/dao"
"vote-admin-video-api/api/dto"
"vote-admin-video-api/api/requests"
"vote-admin-video-api/api/responses"
"vote-admin-video-api/config"
"vote-admin-video-api/global"
"vote-admin-video-api/utils"
)
type Public struct{}
// Login 登陆
func (b *Public) Login(c *gin.Context) {
publicRequest := requests.PublicRequest{}
req := publicRequest.Login
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 验证验证码
if config.C.Env == "prod" {
isValid := utils.VerifyCaptcha(req.CaptchaId, req.Captcha)
if !isValid {
// 验证码错误
responses.FailWithMessage("验证码错误", c)
return
}
}
// 获取用户信息
AdminUserDao := dao.AdminUserDao{}
maps := make(map[string]interface{})
maps["access"] = req.Access
adminUser, err := AdminUserDao.GetAdminUser(maps)
if err != nil || adminUser == nil {
responses.FailWithMessage("用户名或密码错误", c)
return
}
// 检测用户密码
password := md5.Sum([]byte(req.Password + adminUser.Salt))
// 将哈希值转换为16进制字符串
passwordString := hex.EncodeToString(password[:])
fmt.Println(passwordString)
if passwordString != adminUser.Password {
responses.FailWithMessage("用户名或密码错误", c)
return
}
// 检测用户状态
if adminUser.IsDeleted == 1 {
responses.FailWithMessage("非法用户", c)
return
}
if adminUser.IsDisabled == 1 {
responses.FailWithMessage("您的账号已被禁用,请联系管理员处理", c)
return
}
// 下发token
token := &utils.Token{
UserId: fmt.Sprintf("%d", adminUser.UserId),
}
// 生成jwt
jwt, err := token.NewJWT()
if err != nil || jwt == "" {
responses.FailWithMessage("登陆失败", c)
return
}
g := dto.AdminLoginDto(adminUser)
g.LoadToken(jwt)
responses.OkWithData(g, c)
}
// GetCaptcha 获取验证码
func (b *Public) GetCaptcha(c *gin.Context) {
id, b64s, err := utils.GenerateCaptcha()
if err != nil {
responses.FailWithMessage("验证码获取失败", c)
return
}
responses.OkWithData(gin.H{
"id": id,
"b64s": b64s,
}, c)
}
// GetIndex 首页
func (b *Public) GetIndex(c *gin.Context) {
dataDao := dao.DataDao{}
data, err := dataDao.GetDataById(1)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
g := dto.IndexDto{
ViewNum: data.ViewNum,
VoteNum: data.VoteNum,
}
responses.OkWithData(g, c)
}
// GetIndexData 首页动态统计数据
func (b *Public) GetIndexData(c *gin.Context) {
publicRequest := requests.PublicRequest{}
req := publicRequest.GetIndexData
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 返回值
var g []*dto.IndexDataDto
results := make(map[string]int64)
// 分类1:新增用户数 2:图文投票数 3:视频投票数)
if req.Type == 1 {
// 新增用户数
endTime, _ := time.Parse("2006-01-02", req.EndTime)
req.EndTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second).Format("2006-01-02 15:04:05")
userDao := dao.UserDao{}
maps := make(map[string]interface{})
users, err := userDao.GetUserListByTime(maps, req.StartTime, req.EndTime, "created_at")
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
for _, user := range users {
date := time.Time(user.CreatedAt).Format("2006-01-02")
results[date]++
}
}
// 图文投票数
if req.Type == 2 {
endTime, _ := time.Parse("2006-01-02", req.EndTime)
req.EndTime = endTime.Format("2006-01-02")
articleVoteDayDao := dao.ArticleVoteDayDao{}
maps := make(map[string]interface{})
articleVoteDays, err := articleVoteDayDao.GetArticleVoteDayListByTime(maps, req.StartTime, req.EndTime, "voted_at")
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
for _, articleVoteDay := range articleVoteDays {
votedAt := time.Time(*articleVoteDay.VotedAt)
date := votedAt.Format("2006-01-02")
results[date]++
}
}
// 视频投票数
if req.Type == 3 {
endTime, _ := time.Parse("2006-01-02", req.EndTime)
req.EndTime = endTime.Format("2006-01-02")
videoVoteDayDao := dao.VideoVoteDayDao{}
maps := make(map[string]interface{})
videoVoteDays, err := videoVoteDayDao.GetVideoVoteDayListByTime(maps, req.StartTime, req.EndTime, "voted_at")
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
for _, videoVoteDay := range videoVoteDays {
votedAt := time.Time(*videoVoteDay.VotedAt)
date := votedAt.Format("2006-01-02")
results[date]++
}
}
for k, v := range results {
response := &dto.IndexDataDto{
Date: k,
Count: v,
}
g = append(g, response)
}
responses.OkWithData(g, c)
}