初始化项目,复制原投票系统后台代码

This commit is contained in:
2024-12-05 14:21:48 +08:00
parent 92a1a77bc1
commit 22cb271ff1
130 changed files with 10106 additions and 4 deletions
+431
View File
@@ -0,0 +1,431 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-video-api/api/dao"
"vote-admin-video-api/api/dto"
"vote-admin-video-api/api/model"
"vote-admin-video-api/api/requests"
"vote-admin-video-api/api/responses"
"vote-admin-video-api/global"
"vote-admin-video-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
}
if req.VoteNum != nil {
if *req.VoteNum < 0 {
responses.FailWithMessage("票数需大于0", 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 req.VoteNum != nil {
if article.VoteNum != *req.VoteNum {
articleData["vote_num"] = *req.VoteNum
}
}
// 修改
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
}
if req.VoteNum != nil {
if *req.VoteNum < 0 {
responses.FailWithMessage("票数需大于0", c)
return
}
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}()
articleDao := dao.ArticleDao{}
article := &model.Article{
ArticleTitle: req.ArticleTitle,
ArticleStatus: req.ArticleStatus,
ArticleContent: req.ArticleContent,
}
if req.VoteNum != nil {
article.VoteNum = *req.VoteNum
}
// 生成文章编号
maps := make(map[string]interface{})
total, err := articleDao.GetArticleCount(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
article.ArticleNumber = fmt.Sprintf("%d", 1000+total+1)
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)
}
// PutArticleStatus 操作图文状态
func (r *Article) PutArticleStatus(c *gin.Context) {
articleRequest := requests.ArticleRequest{}
req := articleRequest.PutArticleStatus
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("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()
}
}()
articleData := make(map[string]interface{})
if req.ArticleStatus != article.ArticleStatus {
articleData["article_status"] = req.ArticleStatus
}
if len(articleData) > 0 {
err = articleDao.EditArticleById(tx, articleId, articleData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
}
tx.Commit()
responses.Ok(c)
}
+14
View File
@@ -0,0 +1,14 @@
package controller
// Api api接口
type Api struct {
Public // 公共方法
Article // 图文
Video // 视频
BaseAgreement // 基础数据-协议
User // 用户
UserVoteDay // 投票记录
System // 配置
BaseHospital // 基础数据-医院
Editor // 配置-编辑器
}
+198
View File
@@ -0,0 +1,198 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-video-api/api/dao"
"vote-admin-video-api/api/dto"
"vote-admin-video-api/api/model"
"vote-admin-video-api/api/requests"
"vote-admin-video-api/api/responses"
"vote-admin-video-api/global"
"vote-admin-video-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-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/global"
"vote-admin-video-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)
}
+139
View File
@@ -0,0 +1,139 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"io"
"math/rand"
"mime/multipart"
"net/http"
"time"
"vote-admin-video-api/api/responses"
e "vote-admin-video-api/extend/Editor"
"vote-admin-video-api/extend/aliyun"
"vote-admin-video-api/utils"
)
type Editor struct{}
// GetEditorConfig 编辑器-获取配置
func (b *Editor) GetEditorConfig(c *gin.Context) {
action := c.Query("action")
if action == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 获取配置 config
if action == "config" {
config := e.GetConfig()
c.JSON(http.StatusOK, config)
return
}
// 图片列表 listImage
if action == "listImage" {
responses.Ok(c)
return
}
// 文件列表 listFile
if action == "listFile" {
responses.Ok(c)
return
}
responses.Ok(c)
return
}
// EditorUpload 编辑器-上传
func (b *Editor) EditorUpload(c *gin.Context) {
action := c.Query("action")
if action == "" {
responses.FailWithMessage("缺少参数", c)
return
}
file, err := c.FormFile("file")
if err != nil {
responses.FailWithMessage("文件错误", c)
return
}
f, err := file.Open()
if err != nil {
responses.FailWithMessage("文件错误", c)
return
}
defer func(f multipart.File) {
err := f.Close()
if err != nil {
fmt.Println(err)
}
}(f)
// 读取文件内容到字节切片
fileBytes, err := io.ReadAll(f)
if err != nil {
responses.FailWithMessage("文件错误", c)
return
}
// 添加图片水印
fileBytes, err = utils.AddWatermarkToImage(fileBytes, "./resource/3061726102564.png")
if err != nil {
return
}
fileType := "jpg"
if file.Filename != "" {
fileType = utils.GetExtension(file.Filename)
if fileType == "" {
fileType = "jpg"
}
}
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
var ossPath string
// 上传图片 image
if action == "image" {
ossPath = "static/images/" + fmt.Sprintf("%d", rand.Intn(9000)+1000) + dateTimeString + "." + fileType
}
// 上传视频 video
if action == "video" {
ossPath = "static/video/" + fmt.Sprintf("%d", rand.Intn(9000)+1000) + dateTimeString + "." + fileType
}
// 上传文件 file
if action == "file" {
ossPath = "static/file/" + fmt.Sprintf("%d", rand.Intn(9000)+1000) + dateTimeString + "." + fileType
}
if ossPath == "" {
responses.FailWithMessage("上传失败", c)
return
}
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, fileBytes)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
var g e.UploadDto
g.Url = utils.AddOssDomain("/" + ossPath)
g.State = "SUCCESS"
g.Title = dateTimeString + "." + fileType
g.Original = dateTimeString + "." + fileType
g.Type = fileType
c.JSON(http.StatusOK, g)
return
}
+226
View File
@@ -0,0 +1,226 @@
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)
}
+153
View File
@@ -0,0 +1,153 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"time"
"vote-admin-video-api/api/dao"
"vote-admin-video-api/api/dto"
"vote-admin-video-api/api/model"
"vote-admin-video-api/api/requests"
"vote-admin-video-api/api/responses"
"vote-admin-video-api/global"
"vote-admin-video-api/utils"
)
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)
}
// PutSystemTime 修改投票时间
func (b *System) PutSystemTime(c *gin.Context) {
systemRequest := requests.SystemRequest{}
req := systemRequest.PutSystemTime
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("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
}
// 修改值
systemTimeData := make(map[string]interface{})
// 获取本地时区
location, err := time.LoadLocation("Local")
if err != nil {
responses.FailWithMessage("修改失败", c)
return
}
startTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.StartTime, location)
if err != nil {
responses.FailWithMessage("修改失败", c)
return
}
if model.LocalTime(startTime) != *systemTime.StartTime {
systemTimeData["start_time"] = req.StartTime
}
endTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.EndTime, location)
if err != nil {
responses.FailWithMessage("修改失败", c)
return
}
if model.LocalTime(endTime) != *systemTime.EndTime {
systemTimeData["end_time"] = req.EndTime
}
if len(systemTimeData) > 0 {
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err = systemTimeDao.EditSystemTimeById(tx, systemTimeId, systemTimeData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 增加过期时间缓存
redisKey := "VoteSystemTime"
// 当前时间
now := time.Now()
duration := endTime.Sub(now)
if duration < 0 {
tx.Rollback()
responses.FailWithMessage("结束时间错误", c)
return
}
// 添加缓存
_, err = global.Redis.Set(c, redisKey, "1", duration).Result()
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
tx.Commit()
}
responses.Ok(c)
}
+147
View File
@@ -0,0 +1,147 @@
package controller
import (
"github.com/gin-gonic/gin"
"strconv"
"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/global"
"vote-admin-video-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)
}
+262
View File
@@ -0,0 +1,262 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"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/global"
"vote-admin-video-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,
OpenId: v.User.OpenId,
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,
OpenId: v.User.OpenId,
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)
}
+437
View File
@@ -0,0 +1,437 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"vote-admin-video-api/api/dao"
"vote-admin-video-api/api/dto"
"vote-admin-video-api/api/model"
"vote-admin-video-api/api/requests"
"vote-admin-video-api/api/responses"
"vote-admin-video-api/global"
"vote-admin-video-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
}
if req.VoteNum != nil {
if *req.VoteNum < 0 {
responses.FailWithMessage("票数需大于0", 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 req.VoteNum != nil {
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
}
if req.VoteNum != nil {
if *req.VoteNum < 0 {
responses.FailWithMessage("票数需大于0", c)
return
}
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}()
videoDao := dao.VideoDao{}
video := &model.Video{
VideoTitle: req.VideoTitle,
VideoStatus: req.VideoStatus,
VideoNo: req.VideoNo,
VideoContent: req.VideoContent,
}
if req.VoteNum != nil {
video.VoteNum = *req.VoteNum
}
// 获取总数量
maps := make(map[string]interface{})
total, err := videoDao.GetVideoCount(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 生成视频编号
video.VideoNumber = fmt.Sprintf("%d", 2000+total+1)
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)
}
// PutVideoStatus 操作视频状态
func (r *Video) PutVideoStatus(c *gin.Context) {
videoRequest := requests.VideoRequest{}
req := videoRequest.PutVideoStatus
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("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()
}
}()
videoData := make(map[string]interface{})
if req.VideoStatus != video.VideoStatus {
videoData["video_status"] = req.VideoStatus
}
if len(videoData) > 0 {
err = videoDao.EditVideoById(tx, videoId, videoData)
if err != nil {
tx.Rollback()
responses.FailWithMessage("修改失败", c)
return
}
}
tx.Commit()
responses.Ok(c)
}