Browse Source

视频社区

hsun 2 years ago
parent
commit
8a9f33c191

+ 71 - 0
controller/community/video.go

@@ -0,0 +1,71 @@
+package community
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request"
+	"hongze/hongze_yb/services/community"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+)
+
+// VideoList 视频列表
+// @Tags 视频社区模块
+// @Description 获取视频社区列表
+// @Param page_index	query int false "页码"
+// @Param page_size		query int false "每页数量"
+// @Param Keywords		query string false "只看我的"
+// @Param video_id		query int false "视频ID"
+// @Success 200 {object}
+// @failure 400 {string} string "获取失败"
+// @Router /video/list [get]
+func VideoList(c *gin.Context) {
+	var req request.VideoListReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.PageIndex == 0 {
+		req.PageIndex = 1
+	}
+	if req.PageSize == 0 {
+		req.PageSize = utils.PageSize20
+	}
+	list, err := community.GetVideoList(req.PageIndex, req.PageSize, req.VideoId, req.Keywords)
+	if err != nil {
+		response.FailMsg("获取失败", "VideoList ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", list, c)
+}
+
+// VideoPlayLog 记录视频播放日志
+// @Tags 视频社区模块
+// @Description 记录视频播放日志
+// @Param video_id		query  int  true  "音频ID"
+// @Param source_agent	query  int  true  "操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc"
+// @Success 200 {string} string "操作成功"
+// @failure 400 {string} string "操作失败"
+// @Router /video/play_log [post]
+func VideoPlayLog(c *gin.Context) {
+	var req request.VideoPlayLogReq
+	if err := c.ShouldBind(&req); err != nil {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.VideoId == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	if req.SourceAgent == 0 {
+		response.Fail("参数有误", c)
+		return
+	}
+	userinfo := user.GetInfoByClaims(c)
+	errMsg, err := community.SaveVideoPlayLog(userinfo, req.VideoId, req.SourceAgent)
+	if err != nil {
+		response.FailMsg(errMsg, "VideoPlayLog ErrMsg:"+err.Error(), c)
+		return
+	}
+	response.Ok("操作成功", c)
+}

+ 12 - 0
models/request/community.go

@@ -40,4 +40,16 @@ type ReplyListTotalReq struct {
 type CommunityAudioListenLogReq struct {
 	CommunityQuestionAudioID int `json:"community_question_audio_id"` //音频ID
 	SourceAgent              int `json:"source_agent"`                //操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
+}
+
+type VideoListReq struct {
+	PageIndex int    `json:"page_index" form:"page_index"`
+	PageSize  int    `json:"page_size" form:"page_size"`
+	Keywords  string `json:"keywords" form:"keywords"`
+	VideoId   int    `json:"video_id" form:"video_id"`
+}
+
+type VideoPlayLogReq struct {
+	VideoId     int `json:"video_id" description:"视频ID"`
+	SourceAgent int `json:"source_agent" description:"来源:1-小程序 2-小程序PC 3-公众号 4-Web官网"`
 }

+ 32 - 17
models/response/community.go

@@ -1,25 +1,25 @@
 package response
 
 type CommunityQuestionItem struct {
-	CommunityQuestionID     int                           `json:"community_question_id"`
-	UserId                  int                           `json:"user_id"`
-	QuestionContent         string                        `json:"question_content"`
-	ReplierRealName         string                        `json:"replier_real_name"`
-	ReplierRank             string                        `json:"replier_rank"`
-	ReplierAvatar           string                        `json:"replier_avatar"`
-	ChartPermissionID       int                           `json:"chart_permission_id"`
-	ChartPermissionName     string                        `json:"chart_permission_name"`
-	ResearchGroupSecondId   int                           `json:"research_group_second_id"`
-	ResearchGroupSecondName string                        `json:"research_group_second_name"`
-	IsRead                  int                           `json:"is_read"`
-	ReplierIsRead           int                           `json:"replier_is_read"`
-	CreateTime              string                        `json:"create_time"`
-	ReplyTime               string                        `json:"reply_time"`
-	IsTop                   int                           `json:"is_top"`
-	ReplyStatus             int                           `json:"reply_status" description:"回复状态 1-待分配 2-待回答 3-已回答"`
+	CommunityQuestionID     int    `json:"community_question_id"`
+	UserId                  int    `json:"user_id"`
+	QuestionContent         string `json:"question_content"`
+	ReplierRealName         string `json:"replier_real_name"`
+	ReplierRank             string `json:"replier_rank"`
+	ReplierAvatar           string `json:"replier_avatar"`
+	ChartPermissionID       int    `json:"chart_permission_id"`
+	ChartPermissionName     string `json:"chart_permission_name"`
+	ResearchGroupSecondId   int    `json:"research_group_second_id"`
+	ResearchGroupSecondName string `json:"research_group_second_name"`
+	IsRead                  int    `json:"is_read"`
+	ReplierIsRead           int    `json:"replier_is_read"`
+	CreateTime              string `json:"create_time"`
+	ReplyTime               string `json:"reply_time"`
+	IsTop                   int    `json:"is_top"`
+	ReplyStatus             int    `json:"reply_status" description:"回复状态 1-待分配 2-待回答 3-已回答"`
 	//AuthOk                  bool                          `json:"auth_ok" description:"是否有权限"`
 	//PermissionInfo          PermissionCheckInfo           `json:"permission_info"`
-	AudioList               []*CommunityQuestionAudioItem `json:"audio_list"`
+	AudioList []*CommunityQuestionAudioItem `json:"audio_list"`
 }
 
 type CommunityQuestionAudioItem struct {
@@ -59,3 +59,18 @@ type ResearchGroupMember struct {
 	AdminId   int    `json:"admin_id"`
 	AdminName string `json:"admin_name"`
 }
+
+// CommunityVideoItem 视频社区
+type CommunityVideoItem struct {
+	CommunityVideoID    int    `json:"community_video_id"`
+	Title               string `json:"title"`
+	ChartPermissionID   int    `json:"chart_permission_id"`
+	ChartPermissionName string `json:"chart_permission_name"`
+	CoverImgUrl         string `json:"cover_img_url"`
+	VideoUrl            string `json:"video_url"`
+	VideoSeconds        string `json:"video_seconds"`
+	PublishState        int    `json:"publish_state"`
+	PublishTime         string `json:"publish_time"`
+	CreateTime          string `json:"create_time"`
+	ModifyTime          string `json:"modify_time"`
+}

+ 62 - 0
models/tables/yb_community_video/entity.go

@@ -0,0 +1,62 @@
+package yb_community_video
+
+import "time"
+
+// YbCommunityVideo 研报-视频社区表
+type YbCommunityVideo struct {
+	CommunityVideoID    int       `gorm:"primaryKey;column:community_video_id;type:int(10) unsigned;not null" json:"-"`
+	Title               string    `gorm:"column:title;type:varchar(255);not null;default:''" json:"title"`                                                            // 视频标题
+	ChartPermissionID   int       `gorm:"index:idx_chart_permission_id;column:chart_permission_id;type:int(10) unsigned;not null;default:0" json:"chartPermissionId"` // 品种权限ID
+	ChartPermissionName string    `gorm:"column:chart_permission_name;type:varchar(30);not null;default:''" json:"chartPermissionName"`                               // 品种权限名称
+	CoverImgURL         string    `gorm:"column:cover_img_url;type:varchar(255);not null;default:''" json:"coverImgUrl"`                                              // 封面图地址
+	VideoURL            string    `gorm:"column:video_url;type:varchar(255);not null;default:''" json:"videoUrl"`                                                     // 视频地址
+	VideoSeconds        string    `gorm:"column:video_seconds;type:varchar(30);not null;default:''" json:"videoSeconds"`                                              // 视频时长
+	PublishState        int       `gorm:"column:publish_state;type:tinyint(4) unsigned;not null;default:0" json:"publishState"`                                       // 发布状态:0-未发布 1-已发布
+	SendThsState        int       `gorm:"column:send_ths_state;type:tinyint(4) unsigned;not null;default:0" json:"sendThsState"`                                      // 推送客群状态:0-未推送 1-已推送
+	IsDeleted           int       `gorm:"column:is_deleted;type:tinyint(4) unsigned;not null;default:0" json:"isDeleted"`                                             // 是否已删除:0-未删除 1-已删除
+	PublishTime         time.Time `gorm:"column:publish_time;type:datetime" json:"publishTime"`                                                                       // 发布时间
+	SendThsTime         time.Time `gorm:"column:send_ths_time;type:datetime" json:"sendThsTime"`                                                                      // 推送客群时间
+	CreateTime          time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                               // 创建时间
+	ModifyTime          time.Time `gorm:"column:modify_time;type:datetime;default:CURRENT_TIMESTAMP" json:"modifyTime"`                                               // 更新时间
+	DeleteTime          time.Time `gorm:"column:delete_time;type:datetime" json:"deleteTime"`
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityVideo) TableName() string {
+	return "yb_community_video"
+}
+
+// YbCommunityVideoColumns get sql column name.获取数据库列名
+var YbCommunityVideoColumns = struct {
+	CommunityVideoID    string
+	Title               string
+	ChartPermissionID   string
+	ChartPermissionName string
+	CoverImgURL         string
+	VideoURL            string
+	VideoSeconds        string
+	PublishState        string
+	SendThsState        string
+	IsDeleted           string
+	PublishTime         string
+	SendThsTime         string
+	CreateTime          string
+	ModifyTime          string
+	DeleteTime          string
+}{
+	CommunityVideoID:    "community_video_id",
+	Title:               "title",
+	ChartPermissionID:   "chart_permission_id",
+	ChartPermissionName: "chart_permission_name",
+	CoverImgURL:         "cover_img_url",
+	VideoURL:            "video_url",
+	VideoSeconds:        "video_seconds",
+	PublishState:        "publish_state",
+	SendThsState:        "send_ths_state",
+	IsDeleted:           "is_deleted",
+	PublishTime:         "publish_time",
+	SendThsTime:         "send_ths_time",
+	CreateTime:          "create_time",
+	ModifyTime:          "modify_time",
+	DeleteTime:          "delete_time",
+}

+ 41 - 0
models/tables/yb_community_video/model.go

@@ -0,0 +1,41 @@
+package yb_community_video
+
+import (
+	"errors"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+func (item *YbCommunityVideo) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}
+
+func (item *YbCommunityVideo) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(item).Select(updateCols).Updates(*item).Error
+	return
+}
+
+// GetPageListByCondition 分页获取视频列表
+func GetPageListByCondition(where map[string]interface{}, pageIndex, pageSize int) (list []*YbCommunityVideo, err error) {
+	cond, vals, e := utils.WhereBuild(where)
+	if e != nil {
+		err = errors.New("系统异常,生成查询语句失败")
+		return
+	}
+	offset := (pageIndex - 1) * pageSize
+	err = global.DEFAULT_MYSQL.Model(YbCommunityVideo{}).
+		Where(cond, vals...).
+		Where("is_deleted = 0 AND publish_state = 1").
+		Offset(offset).Limit(pageSize).
+		Order("publish_time DESC").Scan(&list).Error
+	return
+}
+
+// GetItemById 主键获取已发布的视频
+func GetItemById(videoId int) (item *YbCommunityVideo, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbCommunityVideo{}).
+		Where("community_video_id = ? AND is_deleted = 0 AND publish_state = 1", videoId).
+		First(&item).Error
+	return
+}

+ 32 - 0
models/tables/yb_community_video_play_log/entity.go

@@ -0,0 +1,32 @@
+package yb_community_video_play_log
+
+import "time"
+
+// YbCommunityVideoPlayLog 研报视频社区播放记录表
+type YbCommunityVideoPlayLog struct {
+	ID               int       `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null" json:"-"`
+	CommunityVideoID int       `gorm:"index:idx_community_video_id;column:community_video_id;type:int(10) unsigned;not null" json:"communityVideoId"` // 回答音频ID
+	UserID           int       `gorm:"column:user_id;type:int(10) unsigned;not null;default:0" json:"userId"`                                         // 点击音频的用户ID
+	SourceAgent      int       `gorm:"column:source_agent;type:tinyint(4) unsigned;not null;default:1" json:"sourceAgent"`                            // 操作来源,1:小程序,2:小程序 pc 3:弘则研究公众号,4:web pc
+	CreateTime       time.Time `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP" json:"createTime"`                                  // 创建时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *YbCommunityVideoPlayLog) TableName() string {
+	return "yb_community_video_play_log"
+}
+
+// YbCommunityVideoPlayLogColumns get sql column name.获取数据库列名
+var YbCommunityVideoPlayLogColumns = struct {
+	ID               string
+	CommunityVideoID string
+	UserID           string
+	SourceAgent      string
+	CreateTime       string
+}{
+	ID:               "id",
+	CommunityVideoID: "community_video_id",
+	UserID:           "user_id",
+	SourceAgent:      "source_agent",
+	CreateTime:       "create_time",
+}

+ 8 - 0
models/tables/yb_community_video_play_log/model.go

@@ -0,0 +1,8 @@
+package yb_community_video_play_log
+
+import "hongze/hongze_yb/global"
+
+func (item *YbCommunityVideoPlayLog) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 5 - 0
routers/community.go

@@ -8,6 +8,7 @@ import (
 
 func InitCommunity(r *gin.Engine)  {
 	rGroup := r.Group("api/community").Use(middleware.Token(), middleware.CheckBaseAuth())
+	// 问答社区
 	rGroup.GET("/question/list", community.QuestionList)
 	rGroup.GET("/question/detail", community.QuestionDetail)
 	rGroup.POST("/question/ask", community.QuestionAsk)
@@ -18,4 +19,8 @@ func InitCommunity(r *gin.Engine)  {
 	rGroup.GET("/question/unread", community.QuestionUnread)
 	rGroup.GET("/question/research_group", community.ResearchGroupList)
 	rGroup.POST("/question/audio/log", community.AddAudioLog)
+	// 视频社区
+	noAuthGroup := r.Group("api/community").Use(middleware.Token())
+	noAuthGroup.GET("/video/list", community.VideoList)
+	noAuthGroup.POST("/video/play_log", community.VideoPlayLog)
 }

+ 72 - 0
services/community/video.go

@@ -0,0 +1,72 @@
+package community
+
+import (
+	"errors"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/yb_community_video"
+	"hongze/hongze_yb/models/tables/yb_community_video_play_log"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"time"
+)
+
+// GetVideoList 获取视频列表
+func GetVideoList(pageIndex, pageSize, videoId int, keywords string) (resp []*response.CommunityVideoItem, err error) {
+	condition := make(map[string]interface{})
+	// 分享点进来的直接定位到具体视频
+	if videoId > 0 {
+		condition["community_video_id ="] = videoId
+	} else {
+		if keywords != "" {
+			condition["title like"] = "%" + keywords + "%"
+		}
+	}
+	resp = make([]*response.CommunityVideoItem, 0)
+	list, e := yb_community_video.GetPageListByCondition(condition, pageIndex, pageSize)
+	if e != nil {
+		err = errors.New("获取视频列表失败, Err:" + e.Error())
+		return
+	}
+	if len(list) <= 0 {
+		return
+	}
+	for _, v := range list {
+		item := &response.CommunityVideoItem{
+			CommunityVideoID:    v.CommunityVideoID,
+			Title:               v.Title,
+			ChartPermissionID:   v.ChartPermissionID,
+			ChartPermissionName: v.ChartPermissionName,
+			CoverImgUrl:         v.CoverImgURL,
+			VideoUrl:            v.VideoURL,
+			VideoSeconds:        v.VideoSeconds,
+			PublishState:        v.PublishState,
+			PublishTime:         v.PublishTime.Format(utils.FormatDateTime),
+			CreateTime:          v.CreateTime.Format(utils.FormatDateTime),
+			ModifyTime:          v.ModifyTime.Format(utils.FormatDateTime),
+		}
+		resp = append(resp, item)
+	}
+	return
+}
+
+// SaveVideoPlayLog 记录用户播放视频日志
+func SaveVideoPlayLog(userInfo user.UserInfo, videoId, sourceAgent int) (errMsg string, err error) {
+	video, e := yb_community_video.GetItemById(videoId)
+	if e != nil {
+		errMsg = "视频不存在或未发布"
+		err = errors.New("获取视频信息失败, Err: " + e.Error())
+		return
+	}
+	item := &yb_community_video_play_log.YbCommunityVideoPlayLog{
+		CommunityVideoID: video.CommunityVideoID,
+		UserID:           int(userInfo.UserID),
+		SourceAgent:      sourceAgent,
+		CreateTime:       time.Now().Local(),
+	}
+	if e = item.Create(); e != nil {
+		errMsg = "操作失败"
+		err = errors.New("新增播放视频日志失败, Err:" + e.Error())
+		return
+	}
+	return
+}