新增了后台

This commit is contained in:
2024-09-03 16:05:14 +08:00
parent c233e5d9b4
commit 383817a543
40 changed files with 2485 additions and 129 deletions
+333
View File
@@ -0,0 +1,333 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/model"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type Article struct{}
// GetArticlePage 获取图文列表-分页
func (r *Article) GetArticlePage(c *gin.Context) {
articleRequest := requests.ArticleRequest{}
req := articleRequest.GetArticlePage
if err := c.ShouldBindJSON(&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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
if req.Order != nil {
if req.Order.VoteNum != "" {
if req.Order.VoteNum != "desc" && req.Order.VoteNum != "asc" {
responses.FailWithMessage("排序字段错误", c)
return
}
}
}
// 获取数据
articleDao := dao.ArticleDao{}
articles, total, err := articleDao.GetArticlePageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetArticleListDto(articles)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetArticle 获取图文详情
func (r *Article) GetArticle(c *gin.Context) {
id := c.Param("article_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
articleId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取数据
articleDao := dao.ArticleDao{}
article, err := articleDao.GetArticleById(articleId)
if err != nil {
responses.FailWithMessage("文章错误", c)
return
}
// 获取作者数据
articleAuthorDao := dao.ArticleAuthorDao{}
maps := make(map[string]interface{})
maps["article_id"] = articleId
articleAuthors, err := articleAuthorDao.GetArticleAuthorPreloadList(maps)
if err != nil {
responses.FailWithMessage("文章错误", c)
return
}
// 获取排名
rank, _ := articleDao.GetArticleRank(article.ArticleId)
// 处理返回值
g := dto.GetArticleDto(article)
// 加载数据-作者
g.LoadArticleAuthor(articleAuthors)
// 加载数据-作者排名
g.LoadRank(rank)
responses.OkWithData(g, c)
}
// PutArticle 修改图文详情
func (r *Article) PutArticle(c *gin.Context) {
articleRequest := requests.ArticleRequest{}
req := articleRequest.PutArticle
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
id := c.Param("article_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
articleId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取订单数据
articleDao := dao.ArticleDao{}
article, err := articleDao.GetArticleById(articleId)
if err != nil {
responses.FailWithMessage("图文异常", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
fmt.Println(r)
}
}()
articleData := make(map[string]interface{})
// 文章标题
if article.ArticleTitle != req.ArticleTitle {
articleData["article_title"] = req.ArticleTitle
}
// 文章状态
if article.ArticleStatus != req.ArticleStatus {
articleData["article_status"] = req.ArticleStatus
}
// 文章内容
if article.ArticleContent != req.ArticleContent {
articleData["article_content"] = req.ArticleContent
}
// 修改
if len(articleData) > 0 {
err = articleDao.EditArticleById(tx, articleId, articleData)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
// 删除作者
articleAuthorDao := dao.ArticleAuthorDao{}
maps := make(map[string]interface{})
maps["article_id"] = articleId
err = articleAuthorDao.DeleteArticleAuthor(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospitalDao := dao.BaseHospitalDao{}
// 新增作者
for _, author := range req.ArticleAuthor {
if author.HospitalId == "" {
tx.Rollback()
responses.FailWithMessage("请选择作者所属医院", c)
return
}
if author.AuthorName == "" {
tx.Rollback()
responses.FailWithMessage("请输入作者名称", c)
return
}
// 检测医院
hospitalId, err := strconv.ParseInt(author.HospitalId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospital, err := baseHospitalDao.GetBaseHospitalById(hospitalId)
if err != nil || baseHospital == nil {
tx.Rollback()
responses.FailWithMessage("医院错误", c)
return
}
ArticleAuthor := &model.ArticleAuthor{
ArticleId: articleId,
AuthorName: author.AuthorName,
HospitalId: hospitalId,
}
ArticleAuthor, err = articleAuthorDao.AddArticleAuthor(tx, ArticleAuthor)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
tx.Commit()
responses.Ok(c)
}
// AddArticle 新增图文详情
func (r *Article) AddArticle(c *gin.Context) {
articleRequest := requests.ArticleRequest{}
req := articleRequest.AddArticle
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}()
article := &model.Article{
ArticleTitle: req.ArticleTitle,
ArticleStatus: req.ArticleStatus,
VoteNum: 0,
ArticleContent: req.ArticleContent,
}
articleDao := dao.ArticleDao{}
article, err := articleDao.AddArticle(tx, article)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增作者
baseHospitalDao := dao.BaseHospitalDao{}
articleAuthorDao := dao.ArticleAuthorDao{}
for _, author := range req.ArticleAuthor {
if author.HospitalId == "" {
tx.Rollback()
responses.FailWithMessage("请选择作者所属医院", c)
return
}
if author.AuthorName == "" {
tx.Rollback()
responses.FailWithMessage("请输入作者名称", c)
return
}
// 检测医院
hospitalId, err := strconv.ParseInt(author.HospitalId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospital, err := baseHospitalDao.GetBaseHospitalById(hospitalId)
if err != nil || baseHospital == nil {
tx.Rollback()
responses.FailWithMessage("医院错误", c)
return
}
ArticleAuthor := &model.ArticleAuthor{
ArticleId: article.ArticleId,
AuthorName: author.AuthorName,
HospitalId: hospitalId,
}
ArticleAuthor, err = articleAuthorDao.AddArticleAuthor(tx, ArticleAuthor)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
tx.Commit()
responses.Ok(c)
}
+8 -1
View File
@@ -2,5 +2,12 @@ package controller
// Api api接口
type Api struct {
Public // 公共方法
Public // 公共方法
Article // 图文
Video // 视频
BaseAgreement // 基础数据-协议
User // 用户
UserVoteDay // 投票记录
System // 配置
BaseHospital // 基础数据-医院
}
+198
View File
@@ -0,0 +1,198 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/model"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type BaseAgreement struct{}
// GetBaseAgreementPage 获取协议列表-分页
func (b *BaseAgreement) GetBaseAgreementPage(c *gin.Context) {
baseAgreementRequest := requests.BaseAgreementRequest{}
req := baseAgreementRequest.GetBaseAgreementPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
// 获取分类数据
baseAgreementDao := dao.BaseAgreementDao{}
baseAgreement, total, err := baseAgreementDao.GetBaseAgreementPageSearch(req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetBaseAgreementListDto(baseAgreement)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetBaseAgreement 获取协议详情
func (b *BaseAgreement) GetBaseAgreement(c *gin.Context) {
id := c.Param("agreement_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
agreementId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取协议数据
baseAgreementDao := dao.BaseAgreementDao{}
baseAgreement, err := baseAgreementDao.GetBaseAgreementById(agreementId)
if err != nil {
responses.FailWithMessage("分类异常", c)
return
}
// 处理返回值
g := dto.GetBaseAgreementDto(baseAgreement)
responses.OkWithData(g, c)
}
// PutBaseAgreement 修改协议
func (b *BaseAgreement) PutBaseAgreement(c *gin.Context) {
BaseAgreementRequest := requests.BaseAgreementRequest{}
req := BaseAgreementRequest.PutBaseAgreement
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
}
id := c.Param("agreement_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
agreementId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取协议数据
baseAgreementDao := dao.BaseAgreementDao{}
baseAgreement, err := baseAgreementDao.GetBaseAgreementById(agreementId)
if err != nil {
responses.FailWithMessage("分类异常", c)
return
}
// 修改值
baseAgreementData := make(map[string]interface{})
// 协议标题
if req.AgreementTitle != baseAgreement.AgreementTitle {
baseAgreementData["agreement_title"] = req.AgreementTitle
}
// 协议内容
if req.AgreementContent != baseAgreement.AgreementContent {
baseAgreementData["agreement_content"] = req.AgreementContent
}
if len(baseAgreementData) > 0 {
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err = baseAgreementDao.EditBaseAgreementById(tx, agreementId, baseAgreementData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
tx.Commit()
}
responses.Ok(c)
}
// AddBaseAgreement 新增协议
func (b *BaseAgreement) AddBaseAgreement(c *gin.Context) {
BaseAgreementRequest := requests.BaseAgreementRequest{}
req := BaseAgreementRequest.AddBaseAgreement
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
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
baseAgreement := &model.BaseAgreement{
AgreementTitle: req.AgreementTitle,
AgreementType: req.AgreementType,
AgreementContent: req.AgreementContent,
}
baseAgreementDao := dao.BaseAgreementDao{}
baseAgreement, err := baseAgreementDao.AddBaseAgreement(tx, baseAgreement)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
tx.Commit()
responses.Ok(c)
}
+41
View File
@@ -0,0 +1,41 @@
// Package controller 科室管理
package controller
import (
"github.com/gin-gonic/gin"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type BaseHospital struct{}
// GetHospitalList 获取医院列表
func (b *BaseHospital) GetHospitalList(c *gin.Context) {
baseHospitalRequest := requests.BaseHospitalRequest{}
req := baseHospitalRequest.GetBaseHospitalList
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
}
baseHospitalDao := dao.BaseHospitalDao{}
baseHospitals, err := baseHospitalDao.GetBaseHospitalLimitByMaps(req)
if err != nil {
responses.Ok(c)
return
}
// 处理返回值
getHospitalLimitResponse := dto.GetBaseHospitalListDto(baseHospitals)
responses.OkWithData(getHospitalLimitResponse, c)
}
+115
View File
@@ -5,6 +5,7 @@ import (
"encoding/hex"
"fmt"
"github.com/gin-gonic/gin"
"time"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/requests"
@@ -102,6 +103,7 @@ func (b *Public) GetCaptcha(c *gin.Context) {
id, b64s, err := utils.GenerateCaptcha()
if err != nil {
responses.FailWithMessage("验证码获取失败", c)
return
}
responses.OkWithData(gin.H{
@@ -109,3 +111,116 @@ func (b *Public) GetCaptcha(c *gin.Context) {
"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)
}
+40
View File
@@ -0,0 +1,40 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/responses"
)
type System struct{}
// GetSystemTime 获取投票时间详情
func (r *System) GetSystemTime(c *gin.Context) {
id := c.Param("system_time_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
systemTimeId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取数据
systemTimeDao := dao.SystemTimeDao{}
systemTime, err := systemTimeDao.GetSystemTimeById(systemTimeId)
if err != nil {
responses.FailWithMessage("数据异常", c)
return
}
// 处理返回值
g := dto.GetSystemTimeDto(systemTime)
responses.OkWithData(g, c)
}
+147
View File
@@ -0,0 +1,147 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type User struct{}
// GetUserPage 获取用户列表-分页
func (r *User) GetUserPage(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.GetUserPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
// 获取数据
userDao := dao.UserDao{}
user, total, err := userDao.GetUserPageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetUserListDto(user)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetUser 获取用户详情
func (r *User) GetUser(c *gin.Context) {
id := c.Param("user_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
userId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取数据
userDao := dao.UserDao{}
user, err := userDao.GetUserById(userId)
if err != nil {
responses.FailWithMessage("用户异常", c)
return
}
// 处理返回值
g := dto.GetUserDto(user)
responses.OkWithData(g, c)
}
// PutUserStatus 操作用户状态
func (r *User) PutUserStatus(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.PutUserStatus
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
}
id := c.Param("user_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
userId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取数据
userDao := dao.UserDao{}
user, err := userDao.GetUserById(userId)
if err != nil {
responses.FailWithMessage("用户异常", c)
return
}
if req.UserStatus == user.UserStatus {
responses.Ok(c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
userData := make(map[string]interface{})
userData["user_status"] = req.UserStatus
err = userDao.EditUserById(tx, userId, userData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
tx.Commit()
responses.Ok(c)
}
+260
View File
@@ -0,0 +1,260 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"time"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type UserVoteDay struct{}
// GetUserArticleVotePage 用户投票记录列表-图文-分页
func (r *UserVoteDay) GetUserArticleVotePage(c *gin.Context) {
userVoteDayRequest := requests.UserVoteDayRequest{}
req := userVoteDayRequest.GetArticleUserVoteDayPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
userId, err := strconv.ParseInt(req.UserId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
var total int64
articleVoteDayDao := dao.ArticleVoteDayDao{}
articleVoteDay, total, err := articleVoteDayDao.GetArticleVoteDayByUserIdPageSearch(userId, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.UserVoteDto, len(articleVoteDay))
for i, v := range articleVoteDay {
createdAt := time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
response := &dto.UserVoteDto{
Id: fmt.Sprintf("%d", v.ArticleId),
Title: v.Article.ArticleTitle,
VotedAt: createdAt,
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetUserVideoVotePage 用户投票记录列表-视频-分页
func (r *UserVoteDay) GetUserVideoVotePage(c *gin.Context) {
userVoteDayRequest := requests.UserVoteDayRequest{}
req := userVoteDayRequest.GetVideoUserVoteDayPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
userId, err := strconv.ParseInt(req.UserId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
var total int64
videoVoteDayDao := dao.VideoVoteDayDao{}
videoVoteDay, total, err := videoVoteDayDao.GetVideoVoteDayByUserIdPageSearch(userId, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.UserVoteDto, len(videoVoteDay))
for i, v := range videoVoteDay {
createdAt := time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
response := &dto.UserVoteDto{
Id: fmt.Sprintf("%d", v.VideoId),
Title: v.Video.VideoTitle,
VotedAt: createdAt,
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetArticleVotePage 投票记录列表-图文-分页
func (r *UserVoteDay) GetArticleVotePage(c *gin.Context) {
userVoteDayRequest := requests.UserVoteDayRequest{}
req := userVoteDayRequest.GetArticleVoteDayPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
articleId, err := strconv.ParseInt(req.ArticleId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
var total int64
articleVoteDayDao := dao.ArticleVoteDayDao{}
articleVoteDay, total, err := articleVoteDayDao.GetArticleVoteDayByArticleIdPageSearch(articleId, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.UserVoteDto, len(articleVoteDay))
for i, v := range articleVoteDay {
createdAt := time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
response := &dto.UserVoteDto{
Id: fmt.Sprintf("%d", v.ArticleId),
AppIden: v.User.AppIden,
VotedAt: createdAt,
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetVideoVotePage 投票记录列表-视频-分页
func (r *UserVoteDay) GetVideoVotePage(c *gin.Context) {
userVoteDayRequest := requests.UserVoteDayRequest{}
req := userVoteDayRequest.GetVideoVoteDayPage
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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
videoId, err := strconv.ParseInt(req.VideoId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
var total int64
videoVoteDayDao := dao.VideoVoteDayDao{}
videoVoteDay, total, err := videoVoteDayDao.GetVideoVoteDayByVideoIdPageSearch(videoId, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.UserVoteDto, len(videoVoteDay))
for i, v := range videoVoteDay {
createdAt := time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
response := &dto.UserVoteDto{
Id: fmt.Sprintf("%d", v.VideoId),
AppIden: v.User.AppIden,
VotedAt: createdAt,
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
+344
View File
@@ -0,0 +1,344 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-api/api/dao"
"vote-admin-api/api/dto"
"vote-admin-api/api/model"
"vote-admin-api/api/requests"
"vote-admin-api/api/responses"
"vote-admin-api/global"
"vote-admin-api/utils"
)
type Video struct{}
// GetVideoPage 获取视频列表-分页
func (r *Video) GetVideoPage(c *gin.Context) {
VideoRequest := requests.VideoRequest{}
req := VideoRequest.GetVideoPage
if err := c.ShouldBindJSON(&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 req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 20
}
if req.Order != nil {
if req.Order.VoteNum != "" {
if req.Order.VoteNum != "desc" && req.Order.VoteNum != "asc" {
responses.FailWithMessage("排序字段错误", c)
return
}
}
}
// 获取数据
VideoDao := dao.VideoDao{}
Videos, total, err := VideoDao.GetVideoPageSearch(req, req.Page, req.PageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetVideoListDto(Videos)
result := make(map[string]interface{})
result["page"] = req.Page
result["page_size"] = req.PageSize
result["total"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetVideo 获取视频详情
func (r *Video) GetVideo(c *gin.Context) {
id := c.Param("video_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
videoId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取数据
VideoDao := dao.VideoDao{}
video, err := VideoDao.GetVideoById(videoId)
if err != nil {
responses.FailWithMessage("视频错误", c)
return
}
// 获取作者数据
VideoAuthorDao := dao.VideoAuthorDao{}
maps := make(map[string]interface{})
maps["video_id"] = videoId
VideoAuthors, err := VideoAuthorDao.GetVideoAuthorPreloadList(maps)
if err != nil {
responses.FailWithMessage("视频错误", c)
return
}
// 获取排名
rank, _ := VideoDao.GetVideoRank(video.VideoId)
// 处理返回值
g := dto.GetVideoDto(video)
// 加载数据-作者
g.LoadVideoAuthor(VideoAuthors)
// 加载数据-作者排名
g.LoadRank(rank)
responses.OkWithData(g, c)
}
// PutVideo 修改视频详情
func (r *Video) PutVideo(c *gin.Context) {
VideoRequest := requests.VideoRequest{}
req := VideoRequest.PutVideo
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
id := c.Param("video_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
videoId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 获取订单数据
videoDao := dao.VideoDao{}
video, err := videoDao.GetVideoById(videoId)
if err != nil {
responses.FailWithMessage("视频异常", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
fmt.Println(r)
}
}()
videoData := make(map[string]interface{})
// 视频标题
if video.VideoTitle != req.VideoTitle {
videoData["video_title"] = req.VideoTitle
}
// 视频状态
if video.VideoStatus != req.VideoStatus {
videoData["video_status"] = req.VideoStatus
}
// 总票数
if video.VoteNum != req.VoteNum {
videoData["vote_num"] = req.VoteNum
}
// 视频编号
if video.VideoNo != req.VideoNo {
videoData["video_no"] = req.VideoNo
}
// 视频内容
if video.VideoContent != req.VideoContent {
videoData["video_content"] = req.VideoContent
}
// 修改
if len(videoData) > 0 {
err = videoDao.EditVideoById(tx, videoId, videoData)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
// 删除作者
VideoAuthorDao := dao.VideoAuthorDao{}
maps := make(map[string]interface{})
maps["video_id"] = videoId
err = VideoAuthorDao.DeleteVideoAuthor(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospitalDao := dao.BaseHospitalDao{}
// 新增作者
for _, author := range req.VideoAuthor {
if author.HospitalId == "" {
tx.Rollback()
responses.FailWithMessage("请选择作者所属医院", c)
return
}
if author.AuthorName == "" {
tx.Rollback()
responses.FailWithMessage("请输入作者名称", c)
return
}
// 检测医院
hospitalId, err := strconv.ParseInt(author.HospitalId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospital, err := baseHospitalDao.GetBaseHospitalById(hospitalId)
if err != nil || baseHospital == nil {
tx.Rollback()
responses.FailWithMessage("医院错误", c)
return
}
videoAuthor := &model.VideoAuthor{
VideoId: videoId,
AuthorName: author.AuthorName,
HospitalId: hospitalId,
}
videoAuthor, err = VideoAuthorDao.AddVideoAuthor(tx, videoAuthor)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
tx.Commit()
responses.Ok(c)
}
// AddVideo 新增视频详情
func (r *Video) AddVideo(c *gin.Context) {
videoRequest := requests.VideoRequest{}
req := videoRequest.AddVideo
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}()
video := &model.Video{
VideoTitle: req.VideoTitle,
VideoStatus: req.VideoStatus,
VideoNo: req.VideoNo,
VoteNum: req.VoteNum,
VideoContent: req.VideoContent,
}
videoDao := dao.VideoDao{}
video, err := videoDao.AddVideo(tx, video)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增作者
baseHospitalDao := dao.BaseHospitalDao{}
videoAuthorDao := dao.VideoAuthorDao{}
for _, author := range req.VideoAuthor {
if author.HospitalId == "" {
tx.Rollback()
responses.FailWithMessage("请选择作者所属医院", c)
return
}
if author.AuthorName == "" {
tx.Rollback()
responses.FailWithMessage("请输入作者名称", c)
return
}
// 检测医院
hospitalId, err := strconv.ParseInt(author.HospitalId, 10, 64)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
baseHospital, err := baseHospitalDao.GetBaseHospitalById(hospitalId)
if err != nil || baseHospital == nil {
tx.Rollback()
responses.FailWithMessage("医院错误", c)
return
}
videoAuthor := &model.VideoAuthor{
VideoId: video.VideoId,
AuthorName: author.AuthorName,
HospitalId: hospitalId,
}
videoAuthor, err = videoAuthorDao.AddVideoAuthor(tx, videoAuthor)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
tx.Commit()
responses.Ok(c)
}