Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+236
View File
@@ -0,0 +1,236 @@
package vidctrl
import (
"91porn-server/common"
"91porn-server/common/constant"
"91porn-server/common/stderr"
"91porn-server/models/l/operatorlgmod"
"91porn-server/models/v/discount_area_mod"
"91porn-server/web/service/discount_area_ser"
"encoding/json"
"github.com/gin-gonic/gin"
)
// DiscountAreaList doc
// @Summary 获取折扣专区列表
// @Description 获取折扣专区列表
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {object} discount_area_mod.WebDiscountAreaListResp "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/list [get]
func DiscountAreaList(ctx *gin.Context) {
list, err := discount_area_mod.GetAllNoDeleteDiscountArea()
if err != nil {
return
}
common.ServeJSON(ctx, stderr.Success, &discount_area_mod.WebDiscountAreaListResp{
List: list,
})
}
// DiscountAreaAdd doc
// @Summary 新增折扣专区
// @Description 新增折扣专区
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param title formData string true "标题"
// @Param desc formData string true "描述"
// @Param discount formData integer true "折扣,1折 101.5折 15"
// @Param status formData integer true "0-未开启 1-开启"
// @Param sortCode formData integer true "排序字段"
// @Param recommendNum formData integer true "推荐展示视频个数"
// @Success 200 {object} string "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/add [post]
func DiscountAreaAdd(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := discount_area_mod.WebDiscountAreaAddReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
if req.Discount < 0 || req.Discount > 100 {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
err = discount_area_ser.AddDiscountArea(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbInsertError, err.Error())
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoDiscountArea, constant.Add, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// DiscountAreaUpdate doc
// @Summary 修改折扣专区
// @Description 修改折扣专区
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param id formData string true "id"
// @Param title formData string false "标题"
// @Param desc formData string false "描述"
// @Param discount formData integer false "折扣,1折 101.5折 15"
// @Param status formData integer false "0-未开启 1-开启"
// @Param sortCode formData integer false "排序字段"
// @Param recommendNum formData integer true "推荐展示视频个数"
// @Success 200 {object} string "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/update [post]
func DiscountAreaUpdate(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := discount_area_mod.WebDiscountAreaUpdateReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
if req.Discount != nil && (*req.Discount < 0 || *req.Discount > 100) {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
err = discount_area_ser.UpdateDiscountArea(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbInsertError, err.Error())
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoDiscountArea, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// DiscountAreaDelete doc
// @Summary 删除折扣专区
// @Description 删除折扣专区
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param id formData integer true "id"
// @Success 200 {object} string "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/delete [post]
func DiscountAreaDelete(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := discount_area_mod.WebDiscountAreaDeleteReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
err = discount_area_ser.DeleteDiscountArea(req.ID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbDeleteError, nil)
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoDiscountArea, constant.Delete, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// DiscountAreaVids doc
// @Summary 折扣专区视频列表
// @Description 折扣专区视频列表
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData integer true "页码数"
// @Param pageSize formData integer true "页码数"
// @Param discountAreaId formData string true "折扣专区id"
// @Param vid formData string true "帖子id"
// @Success 200 {object} discount_area_mod.WebDiscountAreaVidsResp "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/vid/list [get]
func DiscountAreaVids(ctx *gin.Context) {
req := discount_area_mod.WebDiscountAreaVidsReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
list, total, err := discount_area_ser.GetDiscountAreaVids(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err.Error())
return
}
common.ServeJSON(ctx, stderr.Success, &discount_area_mod.WebDiscountAreaVidsResp{
List: list,
Total: total,
})
}
// DiscountAreaAddVid doc
// @Summary 折扣专区新增视频
// @Description 折扣专区新增视频
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param discountAreaId formData string true "折扣专区id"
// @Param vids formData []string true "帖子id"
// @Success 200 {object} string "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/vid/add [post]
func DiscountAreaAddVid(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := discount_area_mod.WebDiscountAreaAddVidReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code := discount_area_ser.DiscountAreaAddVid(&req)
if code != stderr.Success {
common.ServeJSON(ctx, code, code.Error())
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoDiscountAreaVideo, constant.Add, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, nil)
}
// DiscountAreaDeleteVid doc
// @Summary 折扣专区删除视频
// @Description 折扣专区删除视频
// @Tags discountArea
// @Accept mpfd,json
// @Produce json,html
// @Param vids formData []string true "视频id"
// @Success 200 {object} string "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/discount_area/vid/delete [post]
func DiscountAreaDeleteVid(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := discount_area_mod.WebDiscountAreaDeleteVidReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code := discount_area_ser.DiscountAreaDeleteVid(req.Ids)
if code != stderr.Success {
common.ServeJSON(ctx, code, code.Error())
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoDiscountAreaVideo, constant.Delete, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, nil)
}
+118
View File
@@ -0,0 +1,118 @@
package vidctrl
import (
"91porn-server/common"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/web/service/vidser"
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
"github.com/gin-gonic/gin"
)
// GetMediaList doc
// @Summary 获取媒体资源库资源
// @Description 获取媒体资源库资源
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData integer true "查询页码"
// @Param pageSize formData integer true "页码大小"
// @Router /api/web/admin/mediaResource/list [get]
func GetMediaList(ctx *gin.Context) {
var p struct {
Title string `form:"title" json:"title" `
TagText string `form:"tag_text" json:"tag_text"` //标签搜索
HashId string `form:"hash_id" json:"hash_id"`
MVia int `form:"mVia" json:"mVia"` //0 (defalut) from all;1 from uploader;2 from non-uploader
VideoType int `form:"videoType" json:"videoType"` //0 长视频 1短视频 2图文
VloggerUserId int `form:"vlogger_user_id" json:"vlogger_user_id"` //up主所在平台的uid
SyncType string `form:"syncType" json:"syncType"` //同步类型all 全量 incr
TerminalCdo string `form:"terminalCdo" json:"terminalCdo"` // 上传者
SortType int `form:"sortType" json:"sortType"` // 0-正序 1-倒序
StartTime time.Time `form:"start" json:"start"` // 开始时间
EndTime time.Time `form:"end" json:"end"` // 结束时间
MaxTotal int `json:"maxTotal" form:"maxTotal"` // 最大列表总数
commod.Page
}
if err := ctx.ShouldBind(&p); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
data, total, err := vidser.GetMediaList(ctx, int64(p.PageNumber), int64(p.PageSize), int64(p.VloggerUserId),
p.Title, p.TagText, p.HashId, p.MVia, p.VideoType, p.SyncType, p.TerminalCdo, p.StartTime, p.EndTime, p.SortType, p.MaxTotal)
if err != nil {
common.ServeJSON(ctx, stderr.Failure, err.Error())
return
}
common.ServeJSON(ctx, stderr.Success, gin.H{
"count": total,
"list": data,
})
}
// UseMedia doc
// @Summary 使用资源
// @Description 使用资源媒体资源库资源
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData integer true "查询页码"
// @Param pageSize formData integer true "页码大小"
// @Router /api/web/admin/mediaResource/use [post]
func UseMedia(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
return
}
var p struct {
IDs []int64 `json:"ids"`
AuthorID uint64 `json:"authorID"`
Tags []string `json:"tags"`
SectionID primitive.ObjectID `json:"sectionID"`
VideoType int `json:"videoType"` //0 长视频 1短视频 2图文
OnlineTime time.Time `json:"onlineTime" form:"onlineTime"` // 自动上架时间
Coins *int64 `json:"coins" form:"coins"`
}
if err = ctx.ShouldBind(&p); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
hits, err := vidser.UseMedias(ctx, p.IDs, p.AuthorID, p.SectionID, p.Tags, p.VideoType, manager, p.Coins, p.OnlineTime)
if err != nil {
common.ServeJSON(ctx, stderr.Failure, err.Error())
return
}
resp := gin.H{"sensitiveHits": hits}
if len(hits) > 0 {
resp["sensitiveTip"] = vidser.SensitiveForcedOfflineTip
}
common.ServeJSON(ctx, stderr.Success, resp)
}
// IgnoreMedia doc
// @Summary 忽略媒体资源
// @Description 忽略媒体资源库资源
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData integer true "查询页码"
// @Param pageSize formData integer true "页码大小"
// @Router /api/web/admin/mediaResource/ignore [post]
func IgnoreMedia(ctx *gin.Context) {
var p struct {
IDs []int64 `json:"ids"`
VideoType int `json:"videoType"`
}
if err := ctx.ShouldBind(&p); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
if err := vidser.IgnoreMedias(ctx, p.IDs, p.VideoType); err != nil {
common.ServeJSON(ctx, stderr.Failure, err.Error())
return
}
common.ServeJSON(ctx, stderr.Success, "")
}
+126
View File
@@ -0,0 +1,126 @@
package vidctrl
import (
"encoding/json"
"91porn-server/common"
"91porn-server/common/constant"
"91porn-server/common/stderr"
"91porn-server/models/l/operatorlgmod"
"91porn-server/models/v/rjctmpltmod"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// GetRejectTemplate doc
// @Summary 获取审核拒绝模版
// @Description 获取审核拒绝模版
// @Tags recharge
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/recharge/channel/list [get]
func GetRejectTemplate(ctx *gin.Context) {
rType := ctx.Query("type")
infos, err := rjctmpltmod.FindMany(rType)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err.Error())
return
}
common.ServeJSON(ctx, stderr.Success, gin.H{
"list": infos,
})
}
// RejectTemplateInsert doc
// @Summary 新增
// @Description 新增
// @Tags recharge
// @Accept mpfd,json
// @Produce json,html
// @Param reachargeDetails formData rjctmpltmod.RejectTemplate ture "product卡"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/rejectTemp/insert [post]
func RejectTemplateInsert(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
r := rjctmpltmod.RejectTemplate{}
if err = ctx.ShouldBind(&r); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err.Error())
return
}
if err = rjctmpltmod.InsertOne(r); err != nil {
common.ServeJSON(ctx, stderr.ErrDbInputExist, err.Error())
return
}
log, _ := json.Marshal(r)
_ = operatorlgmod.RecordOperation(manager, constant.RejectTemplate, constant.Add, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// RejectTemplateUpdate doc
// @Summary 编辑充值渠道
// @Description 编辑充值渠道
// @Tags recharge
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/recharge/channel/update [post]
func RejectTemplateUpdate(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
set := rjctmpltmod.Edit{}
if err = ctx.ShouldBind(&set); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err.Error())
return
}
if err = rjctmpltmod.Update(set); err != nil {
common.ServeJSON(ctx, stderr.ErrDbUpdateError, err.Error())
return
}
log, _ := json.Marshal(set)
_ = operatorlgmod.RecordOperation(manager, constant.RejectTemplate, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// RejectTemplateDelete doc
// @Summary 删除
// @Description 删除
// @Tags recharge
// @Accept mpfd,json
// @Produce json,html
// @Param id formData int true "product等级""
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/recharge/channel/delete [delete]
func RejectTemplateDelete(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
var p struct {
IDs []primitive.ObjectID `json:"ids"`
}
if err = ctx.ShouldBind(&p); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err.Error())
return
}
if err = rjctmpltmod.DeleteMany(p.IDs); err != nil {
common.ServeJSON(ctx, stderr.ErrDbDeleteError, err.Error())
return
}
log, _ := json.Marshal(p)
_ = operatorlgmod.RecordOperation(manager, constant.RejectTemplate, constant.Delete, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
+840
View File
@@ -0,0 +1,840 @@
package vidctrl
import (
"91porn-server/models/v/export_task_mod"
"91porn-server/models/v/vidtimeonlinemod"
"encoding/json"
"fmt"
"time"
"91porn-server/common"
"91porn-server/common/constant"
"91porn-server/common/constant/redisconst"
"91porn-server/common/stderr"
"91porn-server/models/l/operatorlgmod"
"91porn-server/models/s/statrecordmod"
"91porn-server/models/v/operationlogmod"
"91porn-server/models/v/pushmod"
"91porn-server/models/v/tagmod"
"91porn-server/models/v/vidmod"
"91porn-server/models/v/vidpopmod"
"91porn-server/web/service/vidser"
"91porn-server/web/webg"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// GetVidList doc
// @Summary 获取视频列表
// @Description 根据各种条件获取视频的列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param pageNumber formData integer true "查询页码"
// @Param pageSize formData integer true "页码大小"
// @Param status formData integer true "是否通过审核,0 未审核 1通过 2审核失败 3视为免费 4所有 5非零"
// @Param key formData string true "查询的排序条件,createdAtplayCount"
// @Param value formData integer true "正序反序,-11"
// @Param isFree formData integer true "是否付费视频,0, 付费,1,免费, 2, 所有"
// @Param isUserUp formData integer true "是否用户上传,0, 所有,1,是, 2,否"
// @Param chosen formData integer true "是否精选 1精选 2未精选"
// @Param title formData string true "过滤标题"
// @Param uid formData string true "上传用户uid过滤"
// @Param start formData integer true "上传时间,开始范围,时间戳"
// @Param end formData integer true "上传时间,结束范围,时间戳"
// @Param sectionID formData string false "专题ID"
// @Param isSortedUnderModule formData string false "视频在专题下是否设置了排序"
// @Param seedLinkUrl formData string false "种子下载链接"
// @Param seedSize formData int false "种子影片大小"
// @Param seedPlayTime formData int false "种子影片时长"
// @Success 200 {object} vidmod.ListResp "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/list [get]
func GetVidList(ctx *gin.Context) {
req := vidmod.ListReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
m, sort, err := assembleConditions(req)
if err != stderr.Success {
common.ServeJSON(ctx, err, err)
return
}
code, data := vidser.GetVidList(m, sort, req.PageNumber, req.PageSize, req.IsPush)
common.ServeJSON(ctx, code, data)
}
// GetVidList doc
// @Summary 导出视频列表
// @Description 根据各种条件导出视频的列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param status formData integer true "是否通过审核,0 未审核 1通过 2审核失败 3视为免费 4所有 5非零"
// @Param key formData string true "查询的排序条件,createdAtplayCount"
// @Param value formData integer true "正序反序,-11"
// @Param isFree formData integer true "是否付费视频,0, 付费,1,免费, 2, 所有"
// @Param isUserUp formData integer true "是否用户上传,0, 所有,1,是, 2,否"
// @Param chosen formData integer true "是否精选 1精选 2未精选"
// @Param title formData string true "过滤标题"
// @Param uid formData string true "上传用户uid过滤"
// @Param start formData integer true "上传时间,开始范围,时间戳"
// @Param end formData integer true "上传时间,结束范围,时间戳"
// @Param sectionID formData string false "专题ID"
// @Param isSortedUnderModule formData string false "视频在专题下是否设置了排序"
// @Success 200 {string} string "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/export [post]
func ExportVidList(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.ListReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
err = export_task_mod.CreateTask(export_task_mod.ExportVidTask, manager, req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrExportFileFail, err)
return
}
common.ServeJSON(ctx, stderr.Success, "success")
//m, sort, err := assembleConditions(req)
//if err != stderr.Success {
// common.ServeJSON(ctx, err, err)
// return
//}
//buff, err := vidser.ExportVidList(m, sort)
//if err != stderr.Success {
// common.ServeJSON(ctx, err, err)
// return
//}
//common.ServeFile(ctx, "video-list", common.FileExcel, &buff)
}
func assembleConditions(req vidmod.ListReq) (m map[string]interface{}, sort vidser.SortModeList, err stderr.Code) {
sort = vidser.SortModeList{{Field: "createdAt", Value: -1}}
m = make(map[string]interface{})
if req.ShowType != nil {
m["showType"] = *req.ShowType
}
if req.Status != 4 {
if req.Status == 7 {
m["status"] = map[string]int{"$gt": 0}
} else {
m["status"] = req.Status
}
}
if req.IsFree == 0 {
m["coins"] = map[string]int{"$gt": 0}
}
if req.IsFree == 1 {
m["coins"] = map[string]int{"$eq": 0}
}
if req.IsUserUp == 2 {
m["publisherID"] = map[string]int{"$lt": 115000}
}
if req.IsUserUp == 1 {
m["publisherID"] = map[string]int{"$gt": 115000}
}
if len(req.Title) != 0 {
m["title"] = map[string]string{"$regex": req.Title, "$options": "i"}
}
if req.UID > 0 {
m["publisherID"] = req.UID
}
if req.Chosen == 1 {
m["chosen"] = true
}
if req.Chosen == 2 {
m["chosen"] = false
}
if req.FreeArea == 1 {
m["freeArea"] = true
}
if req.FreeArea == 2 {
m["freeArea"] = false
}
if !req.End.IsZero() {
m["createdAt"] = map[string]time.Time{"$gte": req.Start, "$lt": req.End}
}
if req.ReviewAccount != "" {
m["reviewAccount"] = req.ReviewAccount
}
if len(req.Tag) != 0 {
id, err := tagmod.GetTagIDByName(req.Tag)
if err != nil {
return m, sort, stderr.ErrDbQueryError
}
m["tags"] = id
//sort = vidser.SortModeList{{Field: "tagSort." + id.Hex(), Value: -1}, {Field: "createdAt", Value: -1}}
}
if len(req.ID) != 0 {
oid, err := primitive.ObjectIDFromHex(req.ID)
if err != nil {
return m, sort, stderr.ErrParamError
}
m["_id"] = oid
}
//通过初始价格判断是否是马甲账号
if req.IsPretendAcc == 1 {
m["coins"] = vidmod.PretendAccInitCoins
}
if req.IsPretendAcc == 2 {
//i := make(map[string]int64)
//i["$ne"] = vidmod.PretendAccInitCoins
m["coins"] = map[string]int64{"$ne": vidmod.PretendAccInitCoins}
}
m["deleteAt"] = bson.M{"$exists": false}
if req.NewsType != "" {
m["newsType"] = req.NewsType
}
if req.LiaoBaTop != nil {
if *req.LiaoBaTop {
sort = vidser.LiaoBaTopSortModeList()
m["liaoBaTopSort"] = bson.M{"$gt": 0}
} else {
m["liaoBaTopSort"] = 0
}
}
if req.SectionID != "" {
m["sectionID"] = req.SectionID
}
m["isSortedUnderModule"] = req.IsSortedUnderModule
if req.IsSortedUnderModule {
sort = nil
}
if req.IsRecommended != nil {
if *req.IsRecommended {
m["recoWeight"] = bson.M{"$gte": 0}
} else {
m["recoWeight"] = bson.M{"$lt": 0}
}
}
if req.Key == "likeRate" || req.Key == "purchaseRate" {
m[req.Key] = req.Value
}
if req.IsHappinessPlazaTop != nil && *req.IsHappinessPlazaTop {
if *req.IsHappinessPlazaTop {
m["happinessPlazaTop"] = bson.M{"$gt": 0}
} else {
m["happinessPlazaTop"] = bson.M{"$lte": 0}
}
}
return m, sort, stderr.Success
}
// GetVidListByIds doc
// @Summary 根据Ids获取视频列表
// @Description 根据各种条件获取视频的列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData array true "id数组"
// @Param token formData string true "token"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/listDetail [POST]
func ListDetail(ctx *gin.Context) {
var args struct {
IDs []string `json:"ids" form:"ids" binding:"required"`
Token string `json:"token" form:"token" binding:"required"`
}
if err := ctx.ShouldBind(&args); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
if args.Token != "q7ydjHVIVBYiTqQ&" {
common.ServeJSON(ctx, stderr.ErrNoToken, nil)
return
}
m := make(map[string]interface{})
i := make(map[string][]primitive.ObjectID)
i["$in"] = common.String2ObjectID(args.IDs)
m["_id"] = i
code, data := vidser.GetVidList(m, vidser.SortModeList{{Field: "createdAt", Value: 1}}, 1, 100, false)
common.ServeJSON(ctx, code, data)
}
// UpdateVidInfo doc
// @Summary 编辑视频信息
// @Description 编辑视频信息
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param id formData integer true "id"
// @Param uid formData integer true "用户ID"
// @Param title formData string true "视频标题"
// @Param tags formData array true "视频标签数组"
// @Param playTime formData string false "视频时长"
// @Param cover formData string false "封面图"
// @Param coverThumb formData string false "小图"
// @Param via formData string false "视频来源"
// @Param coins formData integer false "观看金币"
// @Param size formData integer false "文件大小"
// @Param mimeType formData string false "影片类型"
// @Param sourceURL formData string true "资源url"
// @Param sourceID formData string true "上传视频成功后 返回的ID"
// @Param filename formData string true "文件名"
// @Param resolution formData string false "分辨率"
// @Param md5 formData string true "文件摘要"
// @Param freeTime formData integer false "免费观影时长"
// @Param seedLinkUrl formData string false "种子下载链接"
// @Param seedSize formData integer false "种子影片大小"
// @Param seedPlayTime formData integer false "种子影片时长"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/update [post]
func UpdateVidInfo(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.EditReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.UpdateVidInfo(req, manager)
if code == stderr.Success {
_, _ = webg.Redis.Del(fmt.Sprintf(redisconst.VideoInfoKey(), req.ID))
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, data)
}
// DeleteVids doc
// @Summary 删除视频资源
// @Description 删除视频资源
// @Tags follow
// @Accept mpfd,json
// @Produce json,html
// @Param vids formData []string true "视频id数组"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/del [delete]
func DeleteVids(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.DeleteReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
ids, err := common.IDArray(req.IDs)
if err != nil {
common.ServeJSON(ctx, stderr.Failure, "")
return
}
for _, id := range ids {
if err = operationlogmod.Insert(operationlogmod.OperationLog{
ID: primitive.NewObjectID(),
OperationType: constant.Media_Del,
AfterContent: fmt.Sprintf("%v", id),
CreatedUser: manager,
}); err != nil {
common.ServeJSON(ctx, stderr.Failure, "")
return
}
}
code, data := vidser.DeleteManyByTTL(ids...)
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Delete, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, data)
}
// UpdateVids doc
// @Summary 批量更新视频状态
// @Description 批量更新视频状态
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "批量更新的视频id"
// @Param reco formData bool true "是否推荐, true:推荐,false:不推荐"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/batch/reco [post]
func BatchUpdateReco(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.BatchUpdateRecoRequest{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
if err = vidser.BatchUpdateReco(req); err != nil {
common.ServeJSON(ctx, stderr.ErrDbInsertManyError, err)
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, stderr.Success, nil)
}
// UpdateVids doc
// @Summary 批量更新视频状态
// @Description 批量更新视频状态
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "批量更新的视频id"
// @Param field formData string true "更新的字段名"
// @Param status formData bool true "状态变更"
// @Param publisherID formData integer true "发布者id"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/batch/update [post]
func UpdateVids(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.EditManyReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.UpdateVids(req)
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, data)
}
// PassAndEditVids doc
// @Summary 批量更新视频状态
// @Description 批量更新视频状态
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "批量更新的视频id"
// @Param field formData string true "更新的字段名"
// @Param status formData bool true "状态变更"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/batch/edit [post]
func PassAndEditVids(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.PassManyReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.PassAndEditVids(req, manager)
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, data)
}
// PassVid doc
// @Summary 视频通过审核
// @Description 视频通过审核
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "通过审核的视频id"
// @Param pass formData integer true "是否通过审核"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/batch/pass [post]
func PassVid(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.BatchReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.PassVid(req, manager)
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, data)
}
// ViewVid doc
// @Summary 查看视频状态
// @Description 查看视频状态
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param id formData string true "查看视频id"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/view/:id [get]
func ViewVid(ctx *gin.Context) {
id := ctx.Param("id")
if id == "" {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.ViewVideoFromFs(id)
common.ServeJSON(ctx, code, data)
}
// PushVid doc
// @Summary 视频推送
// @Description 视频推送
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "通过审核的视频id"
// @Param pass formData integer true "是否通过审核"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/push [post]
func PushVid(ctx *gin.Context) {
req := pushmod.AddReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
//判断视频是否审核通过
status, err := vidmod.GetVidStatus(req.VideoID)
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, "")
return
}
if status != vidmod.CheckPass {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.PushVid(req)
common.ServeJSON(ctx, code, data)
}
// PushVidList doc
// @Summary 视频推送列表
// @Description 视频推送列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "通过审核的视频id"
// @Param pass formData integer true "是否通过审核"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/push/list [get]
func PushVidList(ctx *gin.Context) {
req := pushmod.ListReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.PushVidList(req)
common.ServeJSON(ctx, code, data)
}
// DeletePushVid doc
// @Summary 视频推送列表
// @Description 视频推送列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "通过审核的视频id"
// @Param pass formData integer true "是否通过审核"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/push/delete [delete]
func DeletePushVid(ctx *gin.Context) {
req := pushmod.DeleteReq{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.DeletePushVid(req.IDs)
common.ServeJSON(ctx, code, data)
}
// ConfigPopularity doc
// @Summary 配置视频热度计算方式
// @Description 配置视频热度计算方式
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param request body vidpopmod.VideoPopularityConfig true "request"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/popularity/config [POST]
func ConfigPopularity(ctx *gin.Context) {
req := vidpopmod.VideoPopularityConfig{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
for i := range req.PlayTimePercentage {
req.PlayTimePercentage[i].Max *= 60
req.PlayTimePercentage[i].Min *= 60
}
if err := vidpopmod.InsertOne(req); err != nil {
common.ServeJSON(ctx, stderr.ErrDbInsertError, err)
return
}
common.ServeJSON(ctx, stderr.Success, nil)
}
// GetPopularityConfig doc
// @Summary 获取视频热度计算方式
// @Description 获取视频热度计算方式
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Success 200 {object} vidpopmod.VideoPopularityConfig "Success"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/popularity/config [get]
func GetPopularityConfig(ctx *gin.Context) {
resp, err := vidpopmod.FindOne()
if err != nil {
common.ServeJSON(ctx, stderr.ErrDbQueryError, err)
return
}
common.ServeJSON(ctx, stderr.Success, resp)
}
func Reindex(ctx *gin.Context) {
if err := statrecordmod.DeleteStatRecordByName(statrecordmod.ElasticSyncVideoJob); err != nil {
common.ServeJSON(ctx, stderr.ErrDbDeleteError, err)
return
}
common.ServeJSON(ctx, stderr.Success, nil)
}
// Search doc
// @Summary 按照app搜索逻辑搜索视频
// @Description 按照app搜索逻辑搜索视频
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param request body vidmod.WebElasticSearchRequest true "request"
// @Success 200 {object} vidmod.WebElasticSearchResponse "Success"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/search [post]
func Search(ctx *gin.Context) {
req := vidmod.WebElasticSearchRequest{}
if err := ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, err)
return
}
res, err := vidmod.SearchWithTotal(req.Keyword, int64((req.PageNumber-1)*(req.PageSize)), int64(req.PageSize+1))
if err != nil {
common.ServeJSON(ctx, stderr.ErrInterServerError, err)
return
}
hasNext := false
if uint64(len(res.Hits)) > req.PageSize {
res.Hits = res.Hits[:req.PageSize]
hasNext = true
}
list := make([]vidmod.ESVideo, len(res.Hits))
for i := range res.Hits {
list[i] = res.Hits[i].Source
}
resp := vidmod.WebElasticSearchResponse{List: list, HasNext: hasNext, Total: res.Total.Value}
common.ServeJSON(ctx, stderr.Success, resp)
}
// BatchAudit doc
// @Summary 批量自动上架
// @Description 批量自动上架
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param vids formData []string true "帖子id"
// @Param sectionID formData string false "专题id"
// @Param onlineTime formData string false "上架时间"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/timeOnline/batchAudit [post]
func BatchAudit(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidtimeonlinemod.BatchAuditReq{}
err = ctx.ShouldBind(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.BatchAuditVidTimeOnlineInfo(req, -1, manager)
if code != stderr.Success {
common.ServeJSON(ctx, code, nil)
return
}
common.ServeJSON(ctx, code, data)
}
// GetTimeOnlineVidList doc
// @Summary 获取定时上线视频列表
// @Description 根据各种条件获取定时上线视频列表
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param uid formData string true "上传用户uid过滤"
// @Param pageNumber formData integer true "查询页码"
// @Param pageSize formData integer true "页码大小"
// @Success 200 {object} vidmod.ListResp "{"msg": "操作成功"}"
// @Failure 400 {string} string "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/timeOnline/list [get]
func GetTimeOnlineVidList(ctx *gin.Context) {
var req = vidtimeonlinemod.ListReq{}
err := ctx.ShouldBind(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.GetTimeOnlineVidList(&req)
common.ServeJSON(ctx, code, data)
}
// DeleteVids doc
// @Summary 删除准备自动上架视频
// @Description 删除准备自动上架视频
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "记录的id数组"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/timeOnline/del [post]
func DelVidTimeOnlines(ctx *gin.Context) {
req := vidtimeonlinemod.DeleteReq{}
err := ctx.ShouldBind(&req)
if err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
ids, err := common.IDArray(req.IDs)
if err != nil {
common.ServeJSON(ctx, stderr.Failure, "")
return
}
code := vidser.DeleteTimeOnlineVid(ids)
common.ServeJSON(ctx, code, nil)
}
// EditVidTimeOnlineInfo doc
// @Summary 修改自动上架视频信息
// @Description 修改自动上架视频信息
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param vidId formData string true "帖子id"
// @Param price formData int true "价格"
// @Param sectionID formData string false "专题id"
// @Param onlineTime formData string false "上架时间"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/timeOnline/edit [post]
func EditVidTimeOnlineInfo(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidtimeonlinemod.EditReq{}
err1 := ctx.ShouldBind(&req)
if err1 != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code, data := vidser.BatchAuditVidTimeOnlineInfo(vidtimeonlinemod.BatchAuditReq{
Vids: []primitive.ObjectID{req.VidId},
SectionID: req.SectionID,
OnlineTime: req.OnlineTime,
}, req.Price, manager)
if code != stderr.Success {
common.ServeJSON(ctx, code, nil)
return
}
common.ServeJSON(ctx, code, data)
}
// BatchUpdateVidNewsType doc
// @Summary 批量修改帖子类型
// @Description 批量修改帖子类型
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param q body vidmod.BatchUpdateVidNewsTypeReq false "请求参数"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/admin/vid/batch/newsType/update [post]
func BatchUpdateVidNewsType(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.BatchUpdateVidNewsTypeReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code := vidser.UpdateVidNewsType(req)
if code != stderr.Success {
common.ServeJSON(ctx, code, nil)
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, code.Msg())
}
// UpdateVidTags doc
// @Summary 批量修改视频标签
// @Description 批量修改视频标签
// @Tags vid
// @Accept mpfd,json
// @Produce json,html
// @Param ids formData []string true "批量修改的帖子id"
// @Param tags formData []string true "标签名称"
// @Param tagSort formData []string true "标签排序"
// @Success 200 {string} json "{"msg": "操作成功"}"
// @Failure 400 {string} json "{"msg": "操作失败"}"
// @Router /api/web/vid/batch/update/tags [post]
func UpdateVidTags(ctx *gin.Context) {
manager, err := common.GetAdminAct(ctx)
if err != nil {
common.ServeJSON(ctx, stderr.AdminIDErr, err.Error())
return
}
req := vidmod.EditVideTagsReq{}
if err = ctx.ShouldBind(&req); err != nil {
common.ServeJSON(ctx, stderr.ErrParamError, nil)
return
}
code := vidser.UpdateVidTags(req)
if code != stderr.Success {
common.ServeJSON(ctx, code, nil)
return
}
log, _ := json.Marshal(req)
_ = operatorlgmod.RecordOperation(manager, constant.VideoManageList, constant.Modify, string(log), ctx.Request.URL.RequestURI())
common.ServeJSON(ctx, code, code.Msg())
}