Files
web_hgdjc_server/app/api/home/home.go
T
2026-11-07 10:46:18 +08:00

306 lines
8.7 KiB
Go

package home
import (
"fmt"
"net/http"
"strconv"
"videoweb/app/api/proto"
"videoweb/app/service/commentser"
"videoweb/app/service/configser"
"videoweb/app/service/translationser"
"videoweb/app/service/videoser"
"videoweb/pub/common"
"videoweb/pub/common/enum/consts"
"videoweb/pub/common/ipaddr"
"videoweb/pub/common/srvdef"
v10 "videoweb/pub/common/v10"
"videoweb/pub/models/videoinformationmod"
"videoweb/pub/pubdef"
"github.com/gin-gonic/gin"
)
// VideoTagApi 标签搜索
// @Tags 标签搜索
// @Summary 标签搜索
// @Description 标签搜索
// @Accept json
// @Produce json
// @Param param body string true "参数列表"
// @Success 200 {object} proto.HomeHtmlData "成功"
// @Failure 400 {string} string "获取失败的返回结果"
// @Security ApiKeyAuth
// @Router /richtext/:id [get]
func RichtextApi(c *gin.Context) {
data := proto.RichTextHtmlData{
Path: c.Request.URL.Path,
Translations: translationser.GetTranslationData(),
BottonTranslations: translationser.GetTranslationBottomList(),
Config: configser.GetConfigInfo(),
Advitise: configser.GetAdvitise(),
}
richtextStr := c.Param("id")
richtextId, err := strconv.ParseInt(richtextStr, 10, 64)
if err != nil || richtextId < 1 {
common.ServerJSON(c, srvdef.NotFound, "")
return
}
richtextDate, serr := videoser.RichtextData(c, richtextId)
if serr != nil {
common.ServerJSON(c, serr.Code, "richtext param error")
return
}
data.CompletePath = fmt.Sprintf("/richtext/%d", richtextId)
data.RichTextInfo = richtextDate
common.JSONWriterCache(c, srvdef.Success, data)
}
// PageNotFound 404
// @Tags 404
// @Summary 404
// @Description 404
// @Accept json
// @Produce json
// @Param param body string true "参数列表"
// @Success 200 {string} string "成功"
// @Failure 400 {string} string "获取失败的返回结果"
// @Security ApiKeyAuth
func PageNotFound(c *gin.Context) {
data := proto.NotFoundHtmlData{
Path: c.Request.URL.Path,
Translations: translationser.GetTranslationData(),
BottonTranslations: translationser.GetTranslationBottomList(),
Config: configser.GetConfigInfo(),
Advitise: configser.GetAdvitise(),
}
data.CompletePath = c.Request.URL.Path
c.JSON(http.StatusOK, data)
//common.ServerJSON(c, srvdef.Success, data)
//c.HTML(404, "404", gin.H{
// "data": data,
//})
}
func UrlRedirect(c *gin.Context) {
data := proto.UrlRedirectData{
Path: c.Request.URL.Path,
CompletePath: c.Request.URL.Path,
Translations: translationser.GetTranslationData(),
BottonTranslations: translationser.GetTranslationBottomList(),
Config: configser.GetConfigInfo(),
Advitise: configser.GetAdvitise(),
}
url := c.Query("url")
data.UrlRedirect = url
common.ServerJSON(c, srvdef.Success, data)
}
func GetTagCategoryCache(ctx *gin.Context) {
data := configser.GetVideoTagCategoryDataList()
common.ServerJSON(ctx, srvdef.Success, data)
}
// VideoDetailInfo 新版视频详情页
func VideoDetailInfo(c *gin.Context) {
data := proto.VideoDetailsHtmlData{
Path: c.Request.URL.Path,
Translations: translationser.GetTranslationData(),
BottonTranslations: translationser.GetTranslationBottomList(),
Config: configser.GetConfigInfo(),
Advitise: configser.GetAdvitise(),
}
ua := ""
if v, b := c.Get(consts.CtxUAH5); b {
ua = v.(string)
}
ip := ipaddr.ResolveClientIP(c)
idStr := c.Param("id")
videoId, err := strconv.ParseInt(idStr, 10, 64)
if err != nil || videoId < 1 {
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
renderVideoDetailPage(c, data, videoId, ip, ua)
}
func renderVideoDetailPage(c *gin.Context, data proto.VideoDetailsHtmlData, videoId int64, ip, ua string) {
videoDate, serr := videoser.VideoDetails(c, videoId, common.GetUserId(c), ip, ua)
if serr != nil {
if c.Query("format") == "json" {
common.ServerJSON(c, srvdef.ErrNoData, data)
return
}
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
data.Video = videoDate
data.Path = fmt.Sprintf("/videodetail/%d/", videoId)
data.Breadcrumbs = []proto.BreadcrumbItem{
{Name: "首页", Url: "/"},
{Name: "视频", Url: "/videoList"},
}
if len(videoDate.Categorys) > 0 {
cat := videoDate.Categorys[0]
data.Breadcrumbs = append(data.Breadcrumbs, proto.BreadcrumbItem{
Name: cat.Name,
Url: fmt.Sprintf("/category/%d/", cat.Id),
})
}
data.Breadcrumbs = append(data.Breadcrumbs, proto.BreadcrumbItem{
Name: videoDate.Title,
Url: "",
})
switch videoDate.Type {
case proto.VideoTypeVideo, proto.VideoTypeVideoV2:
comment, commentErr := commentser.GetCommentList(c, videoId, commentser.ObjectTypeVideo, 1)
data.CommentList = proto.GetCommentListResp{
ObjectId: videoId,
TotalCount: 0,
PageSize: 20,
PageNum: 1,
List: make([]proto.CommentInfo, 0),
}
if commentErr == nil {
data.CommentList = *comment
}
if c.Query("format") == "json" {
common.ServerJSON(c, srvdef.Success, data)
return
}
c.HTML(http.StatusOK, "videoDetail", gin.H{
"data": data,
})
default:
if c.Query("format") == "json" {
common.ServerJSON(c, srvdef.ErrNoData, data)
return
}
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
}
}
// VideoDetailPage 视频详情预览入口(不走模板缓存)
func VideoDetailPage(c *gin.Context) {
id := c.DefaultQuery("id", "")
if id == "" {
c.HTML(http.StatusBadRequest, "404", gin.H{"data": proto.VideoDetailsHtmlData{}})
return
}
c.Params = gin.Params{{Key: "id", Value: id}}
c.Request.URL.Path = fmt.Sprintf("/videoDetail?id=%s", id)
VideoDetailInfo(c)
}
// VideoListPage 视频列表预览入口(不走模板缓存)
func VideoListPage(c *gin.Context) {
id := c.DefaultQuery("id", "0")
sort := c.DefaultQuery("sort", "1")
page := c.DefaultQuery("page", "1")
c.Params = gin.Params{
{Key: "id", Value: id},
{Key: "sortType", Value: sort},
{Key: "page", Value: page},
}
c.Request.URL.Path = fmt.Sprintf("/videoList?id=%s&sort=%s&page=%s", id, sort, page)
VideoCategoryInfo(c)
}
// VideoCategoryInfo 新版视频列表页
func VideoCategoryInfo(c *gin.Context) {
data := proto.VideoTopicHtmlData{
Path: c.Request.URL.Path,
Translations: translationser.GetTranslationData(),
BottonTranslations: translationser.GetTranslationBottomList(),
Config: configser.GetConfigInfo(),
Advitise: configser.GetAdvitise(),
}
topicStr := c.Param("id")
sortTypeStr := c.Param("sortType")
pageStr := c.Param("page")
pageNum, err := strconv.ParseInt(pageStr, 10, 64)
if err != nil || pageNum < 1 {
pageNum = 1
}
sortType, err := strconv.ParseInt(sortTypeStr, 10, 64)
if err != nil || sortType < 1 {
sortType = 0
}
if topicStr == "" {
renderVideoListPage(c, data, "0", 0, sortType, pageNum)
return
}
matche := v10.ParamIsNumber(topicStr)
if matche {
publish, err := strconv.ParseInt(topicStr, 10, 64)
if err != nil {
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
if publish == 0 {
renderVideoListPage(c, data, "0", 0, sortType, pageNum)
return
}
if publish < 1 {
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
sort := videoTopicSortType(sortType)
newPath := fmt.Sprintf("/videocategory/%d/%d/%d/", publish, sort, pageNum)
c.Redirect(http.StatusMovedPermanently, newPath)
return
}
topicId, err2 := strconv.ParseInt(topicStr, 10, 64)
if err2 != nil || topicId < 1 {
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
topicSegment := topicStr
if topicSegment == "" {
topicSegment = "0"
}
renderVideoListPage(c, data, topicSegment, topicId, sortType, pageNum)
}
func videoTopicSortType(sortType int64) int64 {
if sortType < 1 {
return int64(videoinformationmod.VideoSortType_New)
}
return sortType
}
func renderVideoListPage(c *gin.Context, data proto.VideoTopicHtmlData, topicSegment string, topicId, sortType, pageNum int64) {
sort := videoTopicSortType(sortType)
data.CompletePath = fmt.Sprintf("/videocategory/%s/%d/%d/", topicSegment, sort, pageNum)
totalSize, videoInfos, _, serr := videoser.VideoTopicData(c, false, topicId, sortType, pageNum)
data.VideoInfos = videoInfos
data.PageNum = pageNum
data.PageSize = pubdef.PageSize
data.TotalSize = pubdef.GetTotalPage(totalSize, pubdef.PageSize)
if data.VideoInfos == nil {
data.VideoInfos = []proto.VideoInfoData{}
}
if serr != nil {
if c.Query("format") == "json" {
common.ServerJSON(c, srvdef.ErrNoData, data)
return
}
c.HTML(http.StatusNotFound, "404", gin.H{"data": data})
return
}
if c.Query("format") == "json" {
common.ServerJSON(c, srvdef.Success, data)
return
}
c.HTML(http.StatusOK, "videoList", gin.H{
"data": data,
})
}