kobe6258 7 months ago
parent
commit
a5ac6d25e2

+ 325 - 0
controllers/audio.go

@@ -1,5 +1,330 @@
 package controllers
 
+import (
+	"encoding/json"
+	"eta/eta_mini_crm_ht/models"
+	"eta/eta_mini_crm_ht/models/request"
+	"eta/eta_mini_crm_ht/models/response"
+	"eta/eta_mini_crm_ht/services"
+	"eta/eta_mini_crm_ht/services/elastic"
+	"eta/eta_mini_crm_ht/utils"
+	"fmt"
+	"github.com/tcolgate/mp3"
+	"os"
+	"path"
+	"strconv"
+	"time"
+)
+
 type AudioController struct {
 	BaseAuthController
 }
+
+// UploadAudio @Title 上传视频
+// @Description 上传视频
+// @Param   File   query   file  true       "文件"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /uploadAudio [post]
+func (this *AudioController) UploadAudio() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	f, h, err := this.GetFile("File")
+	if err != nil {
+		br.Msg = "获取资源信息失败"
+		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
+		return
+	}
+	defer f.Close()
+	size, err := strconv.Atoi(utils.UPLOAD_AUDIO_SIZE)
+	if err != nil {
+		size = 100
+	}
+	if h.Size > 1024*1024*int64(size) {
+		br.Msg = fmt.Sprintf("音频大小不能超过%dM", size)
+		br.ErrMsg = "音频上传失败,Err:" + err.Error()
+		return
+	}
+	ext := path.Ext(h.Filename)
+	if ext != ".mp3" {
+		br.Msg = "音频格式不正确"
+		br.ErrMsg = "音频上传失败,Err:" + err.Error()
+		return
+	}
+	dateDir := time.Now().Format("20060102")
+	uploadDir := utils.STATIC_DIR + "ht/audio" + dateDir
+	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
+	if err != nil {
+		br.Msg = "存储目录创建失败"
+		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ext
+	fpath := uploadDir + "/" + fileName
+	err = this.SaveToFile("File", fpath)
+	if err != nil {
+		br.Msg = "音频上传失败"
+		br.ErrMsg = "音频上传失败,Err:" + err.Error()
+		return
+	}
+	mp3File := mp3.NewDecoder(f)
+	if err != nil {
+		br.Msg = "音频上传失败"
+		br.ErrMsg = "解析音频时常失败,Err:" + err.Error()
+		return
+	}
+	var totalDuration time.Duration
+	skipped := 0
+	for {
+		frame := mp3.Frame{}
+		if err = mp3File.Decode(&frame, &skipped); err != nil {
+			break
+		}
+		totalDuration += frame.Duration()
+	}
+	duration := int(totalDuration.Milliseconds())
+
+	audioUploadDir := utils.RESOURCE_DIR + "audio/"
+	savePdfToOssPath := audioUploadDir + time.Now().Format("200601/20060102/")
+	audioName := utils.GetRandStringNoSpecialChar(28)
+	savePdfToOssPath += audioName + ext
+
+	defer func() {
+		err = os.Remove(fpath)
+		fmt.Sprintf("删除文件失败:%v", err)
+	}()
+	ossClient := services.NewOssClient()
+	if ossClient == nil {
+		br.Msg = "音频上传失败"
+		br.ErrMsg = "初始化OSS服务失败"
+		return
+	}
+	mp3Url, err := ossClient.UploadFile("", fpath, savePdfToOssPath)
+	if err != nil {
+		br.Msg = "音频上传失败"
+		br.ErrMsg = "音频上传失败,Err:" + err.Error()
+		return
+	}
+	base := path.Base(h.Filename)
+	resp := new(response.MediaUploadResp)
+	resp.Url = mp3Url
+	resp.FileName = base
+	resp.DurationMillisecond = duration
+	br.Data = resp
+	br.Msg = "上传成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// AddAudio @Title 新增音频
+// @Description 新增音频
+// @Param   File   query   file  true       "文件"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /addAudio [post]
+func (this *AudioController) AddAudio() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.AudioName == "" {
+		br.Msg = "音频名称为空"
+		return
+	}
+	if req.AnalystId == 0 {
+		br.Msg = "研究员ID为空"
+		return
+	}
+	if req.AnalystName == "" {
+		br.Msg = "研究员名称为空"
+		return
+	}
+	if req.DurationMillisecond == 0 {
+		br.Msg = "音频时长为空"
+		return
+	}
+	if req.SrcUrl == "" {
+		br.Msg = "音频地址为空"
+		return
+	}
+	var err error
+
+	audioInsert := &models.Media{
+		AuthorId:              req.AnalystId,
+		AuthorName:            req.AnalystName,
+		MediaType:             models.Audio,
+		Src:                   req.SrcUrl,
+		MediaName:             req.AudioName,
+		SourceType:            "mp3",
+		MediaPlayMilliseconds: req.DurationMillisecond,
+		PermissionIds:         req.PermissionIds,
+		PublishedTime:         time.Now(),
+		Deleted:               0,
+		CreatedTime:           time.Now(),
+	}
+
+	insertId, err := models.InsertMedia(audioInsert)
+	if err != nil {
+		br.Msg = "添加失败"
+		br.ErrMsg = "音频新增失败,Err:" + err.Error()
+		return
+	}
+	audioInsert.Id = int(insertId)
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsAddOrEditMedia("media_index", docId, audio)
+		if err != nil {
+			utils.FileLog.Info("音频记录es新增失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("音频记录es新增成功, pdfId:" + docId)
+	}(audioInsert.ToView())
+	// 创建消息
+	_, _ = services.CreateMeta(audioInsert.AuthorName, audioInsert.AuthorId, audioInsert.Id, audioInsert.PublishedTime.Format(time.DateTime), models.AudioSourceType)
+	br.Msg = "添加成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+//	@Title 编辑音频
+//
+// @Description 编辑音频
+// @Success 200 {object} models.ReportAuthorResp
+// @router /editAudio [post]
+func (this *AudioController) EditAudio() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AudioId <= 0 {
+		br.Msg = "音频ID为空"
+		return
+	}
+	if req.AudioName == "" {
+		br.Msg = "音频名称为空"
+		return
+	}
+	if req.AnalystId == 0 {
+		br.Msg = "研究员ID为空"
+		return
+	}
+	if req.AnalystName == "" {
+		br.Msg = "研究员名称为空"
+		return
+	}
+	if req.DurationMillisecond == 0 {
+		br.Msg = "音频时长为空"
+		return
+	}
+	if req.SrcUrl == "" {
+		br.Msg = "音频地址为空"
+		return
+	}
+	var err error
+
+	audioEdit := &models.Media{
+		Id:                    req.AudioId,
+		AuthorId:              req.AnalystId,
+		AuthorName:            req.AnalystName,
+		MediaType:             models.Audio,
+		Src:                   req.SrcUrl,
+		MediaName:             req.AudioName,
+		SourceType:            "mp3",
+		MediaPlayMilliseconds: req.DurationMillisecond,
+		PermissionIds:         req.PermissionIds,
+		PublishedTime:         time.Now(),
+		Deleted:               0,
+		CreatedTime:           time.Now(),
+	}
+
+	_, err = models.UpdateMedia(audioEdit)
+	if err != nil {
+		br.Msg = "更新失败"
+		br.ErrMsg = "音频更新失败,Err:" + err.Error()
+		return
+	}
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsAddOrEditMedia("media_index", docId, audio)
+		if err != nil {
+			utils.FileLog.Info("音频记录es更新失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("音频记录es更新成功, pdfId:" + docId)
+	}(audioEdit.ToView())
+	br.Msg = "编辑成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// DeleteAudio
+// @Title 删除音频
+//
+// @Description 删除音频
+// @Success 200 {object} models.ReportAuthorResp
+// @router /deleteAudio [post]
+func (this *AudioController) DeleteAudio() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AudioId <= 0 {
+		br.Msg = "音频ID为空"
+		return
+	}
+	var err error
+
+	audioDelete := &models.Media{
+		Id:      req.AudioId,
+		Deleted: 1,
+	}
+
+	err = models.DeleteMedia(audioDelete)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "音频更新失败,Err:" + err.Error()
+		return
+	}
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsDeleteData("media_index", docId)
+		if err != nil {
+			utils.FileLog.Info("音频记录es删除失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("音频记录es删除成功, pdfId:" + docId)
+	}(audioDelete.ToView())
+	br.Msg = "删除成功"
+	br.Ret = 200
+	br.Success = true
+}

+ 12 - 87
controllers/media.go → controllers/image.go

@@ -18,7 +18,7 @@ import (
 	"time"
 )
 
-type MediaController struct {
+type ImageController struct {
 	BaseAuthController
 }
 
@@ -27,7 +27,7 @@ type MediaController struct {
 // @Description 获取报告作者
 // @Success 200 {object} models.ReportAuthorResp
 // @router /author [get]
-func (this *MediaController) Author() {
+func (this *ImageController) Author() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -52,7 +52,7 @@ func (this *MediaController) Author() {
 // @Param	request	body request.ReportPdfAddReq true "type json string"
 // @Success 200 {object} models.ReportAuthorResp
 // @router /add [post]
-func (this *MediaController) Add() {
+func (this *ImageController) Add() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -154,7 +154,7 @@ func (this *MediaController) Add() {
 // @Param   File   query   file  true       "文件"
 // @Success 200 {object} models.ReportAuthorResp
 // @router /uploadPdf [post]
-func (this *MediaController) UploadPdf() {
+func (this *ImageController) UploadPdf() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -248,7 +248,7 @@ func (this *MediaController) UploadPdf() {
 // @Param   SortType   query   string  true       "排序方式"
 // @Success 200 {object} models.ReportAuthorResp
 // @router /list [get]
-func (this *MediaController) List() {
+func (this *ImageController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -397,7 +397,7 @@ func (this *MediaController) List() {
 // @Param	request	body request.ReportPdfEditReq true "type json string"
 // @Success 200 {object} models.ReportAuthorResp
 // @router /edit [post]
-func (this *MediaController) Edit() {
+func (this *ImageController) Edit() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -489,7 +489,7 @@ func (this *MediaController) Edit() {
 // @Param   ReportPdfId   query   string  true       "pdf研报id"
 // @Success 200 {object} models.BaseResponse
 // @router /publish [get]
-func (this *MediaController) Publish() {
+func (this *ImageController) Publish() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -540,7 +540,7 @@ func (this *MediaController) Publish() {
 // @Param   ReportPdfId   query   string  true       "pdf研报id"
 // @Success 200 {object} models.BaseResponse
 // @router /publishCancel [get]
-func (this *MediaController) PublishCancel() {
+func (this *ImageController) PublishCancel() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -590,7 +590,7 @@ func (this *MediaController) PublishCancel() {
 // @Param   ReportPdfId   query   string  true       "pdf研报id"
 // @Success 200 {object} models.BaseResponse
 // @router /delete [get]
-func (this *MediaController) Delete() {
+func (this *ImageController) Delete() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -641,7 +641,7 @@ func (this *MediaController) Delete() {
 // @Param   ReportPdfId   query   string  true       "pdf研报id"
 // @Success 200 {object} models.BaseResponse
 // @router /detail [get]
-func (this *MediaController) Detail() {
+func (this *ImageController) Detail() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -677,7 +677,7 @@ const (
 // @Param   File   query   file  true       "文件"
 // @Success 200 {object} models.ReportAuthorResp
 // @router /uploadFile [post]
-func (this *MediaController) UploadImage() {
+func (this *ImageController) UploadImage() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -738,7 +738,7 @@ func (this *MediaController) UploadImage() {
 	}
 
 	base := path.Base(h.Filename)
-	resp := new(response.ReportPdfUploadResp)
+	resp := new(response.MediaUploadResp)
 	resp.Url = imgUrl
 	resp.FileName = base
 
@@ -747,78 +747,3 @@ func (this *MediaController) UploadImage() {
 	br.Ret = 200
 	br.Success = true
 }
-
-// @Title 上传图片
-// @Description 上传图片
-// @Param   File   query   file  true       "文件"
-// @Success 200 {object} models.ReportAuthorResp
-// @router /uploadFile [post]
-func (this *MediaController) UploadVideo(mediaType string) {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	f, h, err := this.GetFile("File")
-	if err != nil {
-		br.Msg = "获取资源信息失败"
-		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
-		return
-	}
-	defer f.Close()
-	size, err := strconv.Atoi(utils.UPLOAD_IMG_SIZE)
-	if err != nil {
-		size = 15
-	}
-	if h.Size > 1024*1024*int64(size) {
-		br.Msg = "文件大小不能超过15M"
-		return
-	}
-	dateDir := time.Now().Format("20060102")
-	uploadDir := utils.STATIC_DIR + "ht/img" + dateDir
-	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
-	if err != nil {
-		br.Msg = "存储目录创建失败"
-		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
-		return
-	}
-	randStr := utils.GetRandStringNoSpecialChar(28)
-	fileName := randStr
-	fpath := uploadDir + "/" + fileName
-	err = this.SaveToFile("File", fpath)
-	if err != nil {
-		br.Msg = "文件上传失败"
-		br.ErrMsg = "文件上传失败,Err:" + err.Error()
-		return
-	}
-	pdfUploadDir := utils.RESOURCE_DIR + "img/"
-	savePdfToOssPath := pdfUploadDir + time.Now().Format("200601/20060102/")
-	pptName := utils.GetRandStringNoSpecialChar(28)
-	savePdfToOssPath += pptName
-
-	defer func() {
-		_ = os.Remove(fpath)
-	}()
-
-	ossClient := services.NewOssClient()
-	if ossClient == nil {
-		br.Msg = "文件上传失败"
-		br.ErrMsg = "初始化OSS服务失败"
-		return
-	}
-	pdfUrl, err := ossClient.UploadFile("", fpath, savePdfToOssPath)
-	if err != nil {
-		br.Msg = "文件上传失败"
-		br.ErrMsg = "文件上传失败,Err:" + err.Error()
-		return
-	}
-	base := path.Base(h.Filename)
-	resp := new(response.ReportPdfUploadResp)
-	resp.Url = pdfUrl
-	resp.FileName = base
-
-	br.Data = resp
-	br.Msg = "上传成功"
-	br.Ret = 200
-	br.Success = true
-}

+ 294 - 0
controllers/video.go

@@ -1,5 +1,299 @@
 package controllers
 
+import (
+	"encoding/json"
+	"eta/eta_mini_crm_ht/models"
+	"eta/eta_mini_crm_ht/models/request"
+	"eta/eta_mini_crm_ht/models/response"
+	"eta/eta_mini_crm_ht/services"
+	"eta/eta_mini_crm_ht/services/elastic"
+	"eta/eta_mini_crm_ht/utils"
+	"fmt"
+	"os"
+	"path"
+	"strconv"
+	"time"
+)
+
 type VideoController struct {
 	BaseAuthController
 }
+
+// UploadVideo @Title 上传视频
+// @Description 上传视频
+// @Param   File   query   file  true       "文件"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /uploadVideo [post]
+func (this *VideoController) UploadVideo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	f, h, err := this.GetFile("File")
+	if err != nil {
+		br.Msg = "获取资源信息失败"
+		br.ErrMsg = "获取资源信息失败,Err:" + err.Error()
+		return
+	}
+	defer f.Close()
+	size, err := strconv.Atoi(utils.UPLOAD_VIDEO_SIZE)
+	if err != nil {
+		size = 1024
+	}
+	if h.Size > 1024*1024*int64(size) {
+		br.Msg = fmt.Sprintf("视频大小不能超过%dM", size)
+		br.ErrMsg = "视频上传失败,Err:" + err.Error()
+		return
+	}
+	ext := path.Ext(h.Filename)
+	if ext != ".mp4" {
+		br.Msg = "视频格式不正确"
+		br.ErrMsg = "视频上传失败,Err:" + err.Error()
+		return
+	}
+	dateDir := time.Now().Format("20060102")
+	uploadDir := utils.STATIC_DIR + "ht/audio" + dateDir
+	err = os.MkdirAll(uploadDir, utils.DIR_MOD)
+	if err != nil {
+		br.Msg = "存储目录创建失败"
+		br.ErrMsg = "存储目录创建失败,Err:" + err.Error()
+		return
+	}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ext
+	fpath := uploadDir + "/" + fileName
+	err = this.SaveToFile("File", fpath)
+	if err != nil {
+		br.Msg = "视频上传失败"
+		br.ErrMsg = "视频上传失败,Err:" + err.Error()
+		return
+	}
+	audioUploadDir := utils.RESOURCE_DIR + "video/"
+	savePdfToOssPath := audioUploadDir + time.Now().Format("200601/20060102/")
+	audioName := utils.GetRandStringNoSpecialChar(28)
+	savePdfToOssPath += audioName + ext
+
+	defer func() {
+		err = os.Remove(fpath)
+		fmt.Sprintf("删除文件失败:%v", err)
+	}()
+	ossClient := services.NewOssClient()
+	if ossClient == nil {
+		br.Msg = "视频上传失败"
+		br.ErrMsg = "初始化OSS服务失败"
+		return
+	}
+	mp3Url, err := ossClient.UploadFile("", fpath, savePdfToOssPath)
+	if err != nil {
+		br.Msg = "视频上传失败"
+		br.ErrMsg = "视频上传失败,Err:" + err.Error()
+		return
+	}
+	base := path.Base(h.Filename)
+	resp := new(response.MediaUploadResp)
+	resp.Url = mp3Url
+	resp.FileName = base
+	br.Data = resp
+	br.Msg = "上传成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// AddVideo @Title 新增音频
+// @Description 新增音频
+// @Param   File   query   file  true       "文件"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /addVideo [post]
+func (this *VideoController) AddVideo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.AudioName == "" {
+		br.Msg = "视频名称为空"
+		return
+	}
+	if req.AnalystId == 0 {
+		br.Msg = "研究员ID为空"
+		return
+	}
+	if req.AnalystName == "" {
+		br.Msg = "研究员名称为空"
+		return
+	}
+	if req.SrcUrl == "" {
+		br.Msg = "视频地址为空"
+		return
+	}
+	var err error
+
+	audioInsert := &models.Media{
+		AuthorId:              req.AnalystId,
+		AuthorName:            req.AnalystName,
+		MediaType:             models.Video,
+		Src:                   req.SrcUrl,
+		MediaName:             req.AudioName,
+		SourceType:            "mp4",
+		MediaPlayMilliseconds: req.DurationMillisecond,
+		PermissionIds:         req.PermissionIds,
+		PublishedTime:         time.Now(),
+		SendStatus:            models.UNSEND,
+		Deleted:               0,
+		CreatedTime:           time.Now(),
+	}
+
+	insertId, err := models.InsertMedia(audioInsert)
+	if err != nil {
+		br.Msg = "添加失败"
+		br.ErrMsg = "音频新增失败,Err:" + err.Error()
+		return
+	}
+	audioInsert.Id = int(insertId)
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsAddOrEditMedia("media_index", docId, audio)
+		if err != nil {
+			utils.FileLog.Info("音频记录es新增失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("音频记录es新增成功, pdfId:" + docId)
+	}(audioInsert.ToView())
+	// 创建消息
+	_, _ = services.CreateMeta(audioInsert.AuthorName, audioInsert.AuthorId, audioInsert.Id, audioInsert.PublishedTime.Format(time.DateTime), models.AudioSourceType)
+	br.Msg = "添加成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// EditVideo @Title 编辑音频
+//
+// @Description 编辑音频
+// @Success 200 {object} models.ReportAuthorResp
+// @router /editVideo [post]
+func (this *VideoController) EditVideo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AudioId <= 0 {
+		br.Msg = "视频ID为空"
+		return
+	}
+	if req.AudioName == "" {
+		br.Msg = "视频名称为空"
+		return
+	}
+	if req.AnalystId == 0 {
+		br.Msg = "研究员ID为空"
+		return
+	}
+	if req.AnalystName == "" {
+		br.Msg = "研究员名称为空"
+		return
+	}
+	if req.SrcUrl == "" {
+		br.Msg = "视频地址为空"
+		return
+	}
+	var err error
+
+	audioEdit := &models.Media{
+		Id:                    req.AudioId,
+		AuthorId:              req.AnalystId,
+		AuthorName:            req.AnalystName,
+		Src:                   req.SrcUrl,
+		MediaName:             req.AudioName,
+		MediaPlayMilliseconds: req.DurationMillisecond,
+		PermissionIds:         req.PermissionIds,
+	}
+	//coverSrc
+	_, err = models.UpdateMedia(audioEdit)
+	if err != nil {
+		br.Msg = "更新失败"
+		br.ErrMsg = "视频更新失败,Err:" + err.Error()
+		return
+	}
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsAddOrEditMedia("media_index", docId, audio)
+		if err != nil {
+			utils.FileLog.Info("视频记录es更新失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("视频记录es更新成功, pdfId:" + docId)
+	}(audioEdit.ToView())
+	br.Msg = "编辑成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// DeleteVideo
+// @Title 删除音频
+//
+// @Description 删除音频
+// @Success 200 {object} models.ReportAuthorResp
+// @router /deleteVideo [post]
+func (this *VideoController) DeleteVideo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req request.AudioReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.AudioId <= 0 {
+		br.Msg = "视频ID为空"
+		return
+	}
+	var err error
+
+	audioDelete := &models.Media{
+		Id:      req.AudioId,
+		Deleted: 1,
+	}
+
+	err = models.DeleteMedia(audioDelete)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "视频删除失败,Err:" + err.Error()
+		return
+	}
+	// 添加es
+	go func(audio *models.ESMedia) {
+		docId := strconv.Itoa(audio.MediaId)
+		err = elastic.EsDeleteData("media_index", docId)
+		if err != nil {
+			utils.FileLog.Info("视频记录es删除失败,Err:" + err.Error())
+			return
+		}
+		utils.FileLog.Info("视频记录es删除成功, pdfId:" + docId)
+	}(audioDelete.ToView())
+	br.Msg = "删除成功"
+	br.Ret = 200
+	br.Success = true
+}

+ 5 - 1
go.mod

@@ -7,6 +7,7 @@ require github.com/beego/beego/v2 v2.1.0
 require (
 	github.com/aliyun/alibaba-cloud-sdk-go v1.62.807
 	github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
+	github.com/astaxie/beego v1.12.3
 	github.com/beego/bee/v2 v2.1.0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/go-redis/redis/v8 v8.11.5
@@ -18,6 +19,7 @@ require (
 
 require (
 	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/bogem/id3v2 v1.2.0 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/dustin/go-humanize v1.0.1 // indirect
@@ -25,6 +27,7 @@ require (
 	github.com/goccy/go-json v0.10.3 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/google/uuid v1.6.0 // indirect
+	github.com/hajimehoshi/go-mp3 v0.3.4 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
@@ -45,10 +48,11 @@ require (
 	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/rs/xid v1.5.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
+	github.com/tcolgate/mp3 v0.0.0-20170426193717-e79c5a46d300 // indirect
 	golang.org/x/crypto v0.24.0 // indirect
 	golang.org/x/net v0.26.0 // indirect
 	golang.org/x/sys v0.21.0 // indirect
-	golang.org/x/text v0.16.0 // indirect
+	golang.org/x/text v0.17.0 // indirect
 	golang.org/x/time v0.6.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect

+ 4 - 0
models/db.go

@@ -42,5 +42,9 @@ func init() {
 		new(ReportPdf),
 		new(TemplateUsers),
 		new(CrmFinancialAnalyst),
+		new(Media),
+		new(MetaInfo),
+		new(FeedBack),
+		new(MediaPermissionMapping),
 	)
 }

+ 10 - 10
models/financial_analyst.go

@@ -14,16 +14,16 @@ const (
 )
 
 type CrmFinancialAnalyst struct {
-	Id           int           `orm:"pk"  gorm:"primaryKey;autoIncrement;column:id;comment:主键"`
-	ETAId        int           `gorm:"column:eta_id"`
-	HTId         int           `gorm:"column:ht_id"`
-	Name         string        `gorm:"column:name"`
-	HeadImgURL   string        `orm:"column(head_img_url)" gorm:"column:head_img_url"`
-	Introduction string        `gorm:"column:introduction"`
-	Status       AnalystStatus `gorm:"column:status"`
-	Deleted      bool          `gorm:"column:deleted"`
-	CreatedTime  time.Time     `gorm:"column:created_time;type:timestamps;comment:创建时间"`
-	UpdatedTime  time.Time     `gorm:"column:updated_time;type:timestamps;comment:更新时间"`
+	Id           int           `description:"主键"`
+	ETAId        int           `description:"eta_id"`
+	HTId         int           `description:"ht_id"`
+	Name         string        `description:"姓名"`
+	HeadImgURL   string        `description:"头像"`
+	Introduction string        `description:"介绍"`
+	Status       AnalystStatus `description:"状态"`
+	Deleted      bool          `description:"是否删除"`
+	CreatedTime  time.Time     `description:"创建时间"`
+	UpdatedTime  time.Time     `description:"更新时间"`
 }
 
 func (m *CrmFinancialAnalyst) TableName() string {

+ 179 - 0
models/media.go

@@ -0,0 +1,179 @@
+package models
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type MediaType string
+type SendStatus string
+
+const (
+	Video  MediaType  = "video"
+	Audio  MediaType  = "audio"
+	UNSEND SendStatus = "UNSEND"
+	SEND   SendStatus = "SEND"
+)
+
+func (m *Media) ToView() *ESMedia {
+	return &ESMedia{
+		MediaId:               m.Id,
+		AuthorId:              m.AuthorId,
+		AuthorName:            m.AuthorName,
+		MediaType:             m.MediaType,
+		Src:                   m.Src,
+		MediaName:             m.MediaName,
+		SourceType:            m.SourceType,
+		MediaPlayMilliseconds: m.MediaPlayMilliseconds,
+		PermissionIds:         m.PermissionIds,
+		PublishedTime:         m.PublishedTime.Format(time.DateTime),
+	}
+}
+
+type ESMedia struct {
+	MediaId               int       `json:"mediaId"`
+	AuthorId              int       `json:"authorId"`
+	AuthorName            string    `json:"authorName"`
+	CoverSrc              string    `json:"coverSrc"`
+	MediaType             MediaType `json:"mediaType"`
+	Src                   string    `json:"src"`
+	MediaName             string    `json:"mediaName"`
+	SourceType            string    `json:"sourceType"`
+	MediaPlayMilliseconds int       `json:"mediaPlayMilliseconds"`
+	PermissionIds         string    `json:"permissionIds"`
+	PublishedTime         string    `json:"publishedTime"`
+}
+
+type Media struct {
+	Id                    int        `orm:"pk;auto" description:"id"`
+	AuthorId              int        `description:"author_id"`
+	AuthorName            string     `description:"author_name"`
+	CoverSrc              string     `description:"cover_src"`
+	MediaType             MediaType  `description:"media_type"`
+	Src                   string     `description:"src"`
+	MediaName             string     `description:"media_name"`
+	SourceType            string     `description:"source_type"`
+	MediaPlayMilliseconds int        `description:"media_play_milliseconds"`
+	PermissionIds         string     `description:"permission_ids"`
+	PublishedTime         time.Time  `description:"published_time"`
+	SendStatus            SendStatus `json:"sendStatus"`
+	Deleted               int        `description:"deleted"`
+	CreatedTime           time.Time  `description:"created_time"`
+	UpdatedTime           time.Time  `description:"updated_time"`
+}
+
+func InsertMedia(m *Media) (insertId int64, err error) {
+	o := orm.NewOrm()
+	if err != nil {
+		return 0, err
+	}
+	tx, err := o.Begin()
+	if err != nil {
+		fmt.Printf("%v", err)
+		return
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			_ = tx.Rollback()
+			return
+		}
+	}()
+	insertId, err = o.Insert(m)
+	if err != nil {
+		_ = tx.Rollback()
+		return
+	}
+	ids := strings.Split(m.PermissionIds, ",")
+	for _, item := range ids {
+		x, _ := strconv.Atoi(item)
+		mapping := &MediaPermissionMapping{
+			MediaId:      m.Id,
+			MediaType:    m.MediaType,
+			PermissionId: x,
+			CreatedTime:  time.Now(),
+		}
+		_, err = o.Insert(mapping)
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+	}
+	_ = tx.Commit()
+	return
+}
+func DeleteMedia(m *Media) (err error) {
+	o := orm.NewOrm()
+	if err != nil {
+		return err
+	}
+	tx, err := o.Begin()
+	if err != nil {
+		fmt.Printf("%v", err)
+		return
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			_ = tx.Rollback()
+			return
+		}
+	}()
+	err = DeleteMappingsById(m.Id)
+	if err != nil {
+		_ = tx.Rollback()
+		return
+	}
+	_, err = o.Update(m, "deleted")
+	if err != nil {
+		_ = tx.Rollback()
+		return
+	}
+	_ = tx.Commit()
+	return
+}
+func UpdateMedia(m *Media) (updateId int64, err error) {
+	o := orm.NewOrm()
+	if err != nil {
+		return 0, err
+	}
+	tx, err := o.Begin()
+	if err != nil {
+		fmt.Printf("%v", err)
+		return
+	}
+	defer func() {
+		if r := recover(); r != nil {
+			_ = tx.Rollback()
+			return
+		}
+	}()
+	err = DeleteMappingsById(m.Id)
+	if err != nil {
+		_ = tx.Rollback()
+		return
+	}
+	updateId, err = o.Update(m, "author_id", "author_name", "")
+	if err != nil {
+		_ = tx.Rollback()
+		return
+	}
+	ids := strings.Split(m.PermissionIds, ",")
+	for _, item := range ids {
+		x, _ := strconv.Atoi(item)
+		mapping := &MediaPermissionMapping{
+			MediaId:      m.Id,
+			MediaType:    m.MediaType,
+			PermissionId: x,
+			CreatedTime:  time.Now(),
+		}
+		_, err = o.Insert(mapping)
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+	}
+	_ = tx.Commit()
+	return
+}

+ 27 - 0
models/media_permission_mapping.go

@@ -0,0 +1,27 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type MediaPermissionMapping struct {
+	Id           int       `orm:"pk" description:"id"` // 主键
+	PermissionId int       `description:"权限ID"`        // 权限 ID
+	MediaId      int       `description:"媒体ID"`        // 媒体 ID
+	MediaType    MediaType `description:"媒体类型"`        // 媒体类型
+	Deleted      int       `description:"是否删除"`
+	CreatedTime  time.Time `description:"创建时间"`
+	UpdatedTime  time.Time `description:"更新时间"`
+}
+
+// TableName returns the table name for this model.
+func (mp *MediaPermissionMapping) TableName() string {
+	return "media_permission_mappings"
+}
+
+func DeleteMappingsById(mediaId int) (err error) {
+	o := orm.NewOrm()
+	_, err = o.QueryTable(new(MediaPermissionMapping)).Filter("media_id", mediaId).Update(orm.Params{"deleted": 1})
+	return
+}

+ 52 - 0
models/meta_info.go

@@ -0,0 +1,52 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type StatusType string
+type SourceType string
+type MetaType string
+
+const (
+	UserNoticeType    MetaType   = "USER_NOTICE"
+	InitStatusType    StatusType = "INIT"
+	PendingStatusType StatusType = "PENDING"
+	FinishStatusType  StatusType = "FINISH"
+	FailedStatusType  StatusType = "FAILED"
+
+	ReportSourceType SourceType = "REPORT"
+	VideoSourceType  SourceType = "VIDEO"
+	AudioSourceType  SourceType = "AUDIO"
+)
+
+// MetaInfo 表示 meta_infos 表的模型
+type MetaInfo struct {
+	Id          int        `description:"id"`
+	Uid         string     `description:"uid"`
+	Meta        string     `description:"meta"`
+	From        string     `description:"from"`
+	To          string     `description:"column:to"`
+	SourceType  SourceType `description:"source_type"`
+	MetaType    MetaType   `gorm:"column:meta_type;type:enum('USER_NOTICE')"`
+	Status      StatusType `gorm:"column:status;type:enum('INIT','PENDING','FINISH','FAILED')"`
+	CreatedTime time.Time
+	UpdatedTime time.Time
+}
+
+type MetaData struct {
+	SourceId      int    `json:"reportId"`
+	AuthorId      int    `json:"AuthorId"`
+	AuthorName    string `json:"authorName"`
+	PublishedTime string `json:"publishedTime"`
+}
+
+func (m *MetaInfo) TableName() string {
+	return "meta_infos"
+}
+func (m *MetaInfo) Insert() (insert int64, err error) {
+	o := orm.NewOrm()
+	insert, err = o.Insert(m)
+	return
+}

+ 11 - 0
models/request/media.go

@@ -0,0 +1,11 @@
+package request
+
+type AudioReq struct {
+	AudioId             int
+	AudioName           string
+	AnalystId           int
+	AnalystName         string
+	SrcUrl              string
+	PermissionIds       string
+	DurationMillisecond int
+}

+ 17 - 0
models/response/media.go

@@ -0,0 +1,17 @@
+package response
+
+import (
+	"eta/eta_mini_crm_ht/models"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type MediaListResp struct {
+	List   []*models.ReportPdf
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type MediaUploadResp struct {
+	Url                 string `description:"文件URL"`
+	FileName            string `description:"文件名称"`
+	DurationMillisecond int    `description:"时长"`
+}

+ 35 - 0
models/user_analyst_follow_list.go

@@ -0,0 +1,35 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type FollowingType string
+
+const (
+	Following   FollowingType = "following"
+	Unfollowed  FollowingType = "unfollowed"
+	listColumns               = "user_id, financial_analyst_id,financial_analyst_name, followed,followed_time"
+
+	FollowingStatusColumns = "financial_analyst_id,financial_analyst_name, followed"
+)
+
+// UserAnalystFollowList 代表用户关注的研究员列表
+type UserAnalystFollowList struct {
+	ID                   int           `gorm:"primary_key;auto_increment;column:id"`
+	UserID               int           `gorm:"not null;index:user_id"`
+	FinancialAnalystID   int           `gorm:"not null;index:financial_analyst_id"`
+	FinancialAnalystName string        `gorm:"not null;size:100"`
+	Followed             FollowingType `gorm:"type:enum('following', 'unfollowed');not null"`
+	FollowedTime         time.Time     `gorm:"type:timestamp;not null;default:CURRENT_TIMESTAMP;onupdate:CURRENT_TIMESTAMP"`
+	CreatedTime          time.Time     `gorm:"type:timestamp;not null;default:0000-00-00 00:00:00"`
+	UpdatedTime          time.Time     `gorm:"type:timestamp;null;onupdate:CURRENT_TIMESTAMP"`
+}
+
+func GetPostUser(authorId int, PublishTime string) (ids []int, err error) {
+	o := orm.NewOrm()
+	sql := "select distinct user_id from user_analyst_follow_list where financial_analyst_id = ? and followed = ? and followed_time <=? order by id asc"
+	_, err = o.Raw(sql, authorId, Following, PublishTime).QueryRows(&ids)
+	return
+}

+ 84 - 25
routers/commentsRouter.go

@@ -45,6 +45,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"],
+        beego.ControllerComments{
+            Method: "AddAudio",
+            Router: `/addAudio`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"],
+        beego.ControllerComments{
+            Method: "DeleteAudio",
+            Router: `/deleteAudio`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"],
+        beego.ControllerComments{
+            Method: "EditAudio",
+            Router: `/editAudio`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:AudioController"],
+        beego.ControllerComments{
+            Method: "UploadAudio",
+            Router: `/uploadAudio`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ChartPermissionController"],
         beego.ControllerComments{
             Method: "List",
@@ -72,7 +108,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Add",
             Router: `/add`,
@@ -81,7 +117,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Author",
             Router: `/author`,
@@ -90,7 +126,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Delete",
             Router: `/delete`,
@@ -99,7 +135,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Detail",
             Router: `/detail`,
@@ -108,7 +144,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Edit",
             Router: `/edit`,
@@ -117,7 +153,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "List",
             Router: `/list`,
@@ -126,7 +162,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Publish",
             Router: `/publish`,
@@ -135,7 +171,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "PublishCancel",
             Router: `/publishCancel`,
@@ -144,29 +180,16 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
-        beego.ControllerComments{
-            Method: "UploadAudio",
-            Router: `/uploadFile`,
-            AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(
-				param.New("mediaType"),
-			),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
-            Method: "UploadVideo",
+            Method: "UploadImage",
             Router: `/uploadFile`,
             AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(
-				param.New("mediaType"),
-			),
+            MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:MediaController"],
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "UploadPdf",
             Router: `/uploadPdf`,
@@ -553,4 +576,40 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"],
+        beego.ControllerComments{
+            Method: "AddVideo",
+            Router: `/addVideo`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"],
+        beego.ControllerComments{
+            Method: "DeleteVideo",
+            Router: `/deleteVideo`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"],
+        beego.ControllerComments{
+            Method: "EditVideo",
+            Router: `/editVideo`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:VideoController"],
+        beego.ControllerComments{
+            Method: "UploadVideo",
+            Router: `/uploadVideo`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
 }

+ 1 - 1
routers/router.go

@@ -69,7 +69,7 @@ func init() {
 		),
 		beego.NSNamespace("/media",
 			beego.NSInclude(
-				&controllers.MediaController{},
+				&controllers.ImageController{},
 				&controllers.AudioController{},
 				&controllers.VideoController{},
 			),

+ 50 - 0
services/elastic/elastic.go

@@ -121,6 +121,56 @@ func EsAddOrEditReportPdf(indexName, docId string, item *models.ReportPdfView) (
 	return
 }
 
+// EsAddOrEditReport 新增编辑es报告
+func EsAddOrEditMedia(indexName, docId string, item *models.ESMedia) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditReport Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+	// docId为报告ID+章节ID
+	searchById, err := client.Get().Index(indexName).Id(docId).Do(context.Background())
+	if err != nil && !strings.Contains(err.Error(), "404") {
+		fmt.Println("Get Err" + err.Error())
+		return
+	}
+	if searchById != nil && searchById.Found {
+		resp, err := client.Update().Index(indexName).Id(docId).Doc(map[string]interface{}{
+			"authorId":              item.AuthorId,
+			"authorName":            item.AuthorName,
+			"src":                   item.Src,
+			"mediaName":             item.MediaName,
+			"mediaPlayMilliseconds": item.MediaPlayMilliseconds,
+			"permissionIDs":         item.PermissionIds,
+			"publishedTime":         item.PublishedTime,
+		}).Do(context.Background())
+		if err != nil {
+			return err
+		}
+		//fmt.Println(resp.Status, resp.Result)
+		if resp.Status == 0 {
+			fmt.Println("修改成功" + docId)
+			err = nil
+		} else {
+			fmt.Println("EditData", resp.Status, resp.Result)
+		}
+	} else {
+		resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+		if err != nil {
+			fmt.Println("新增失败:", err.Error())
+			return err
+		}
+		if resp.Status == 0 && resp.Result == "created" {
+			fmt.Println("新增成功" + docId)
+			return nil
+		} else {
+			fmt.Println("AddData", resp.Status, resp.Result)
+		}
+	}
+	return
+}
+
 // AnalyzeResp 分词接口返回结构体
 type AnalyzeResp struct {
 	Tokens []struct {

+ 41 - 0
services/meta.go

@@ -0,0 +1,41 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_mini_crm_ht/models"
+	"github.com/google/uuid"
+	"strconv"
+	"strings"
+)
+
+func CreateMeta(authorName string, authorId int, mediaId int, publishTime string, sourceType models.SourceType) (id int64, err error) {
+	ids, err := models.GetPostUser(authorId, publishTime)
+	if err != nil {
+		return
+	}
+	var idStrList []string
+	for _, id := range ids {
+		idStrList = append(idStrList, strconv.Itoa(id))
+	}
+	Meta := models.MetaData{
+		AuthorName:    authorName,
+		AuthorId:      authorId,
+		SourceId:      mediaId,
+		PublishedTime: publishTime,
+	}
+	metaStr, _ := json.Marshal(Meta)
+	toStr := strings.Join(idStrList, ",")
+	UUID := uuid.New()
+	uuidStr := UUID.String()
+	metaContent := models.MetaInfo{
+		From:       "ADMIN",
+		Uid:        "media:" + uuidStr,
+		Meta:       string(metaStr),
+		MetaType:   "USER_NOTICE",
+		SourceType: sourceType,
+		Status:     models.InitStatusType,
+		To:         toStr,
+	}
+	id, err = metaContent.Insert()
+	return
+}

BIN
static/ht/audio20240810/Xixu4FVvaqhNFLB5MfUohwN60hlN.mp3


+ 15 - 5
utils/config.go

@@ -55,10 +55,12 @@ var (
 
 // 基础配置
 var (
-	STATIC_DIR      string
-	RESOURCE_DIR    string
-	UPLOAD_PDF_SIZE string // 单位MB
-	UPLOAD_IMG_SIZE string
+	STATIC_DIR        string
+	RESOURCE_DIR      string
+	UPLOAD_PDF_SIZE   string // 单位MB
+	UPLOAD_IMG_SIZE   string
+	UPLOAD_AUDIO_SIZE string
+	UPLOAD_VIDEO_SIZE string
 )
 
 // ES配置
@@ -171,7 +173,7 @@ func init() {
 	}
 
 	// 初始化ES
-	//initEs()
+	initEs()
 
 	// 静态文件目录
 	STATIC_DIR = config["static_dir"]
@@ -190,6 +192,14 @@ func init() {
 	if UPLOAD_IMG_SIZE == "" {
 		UPLOAD_IMG_SIZE = "200"
 	}
+	UPLOAD_AUDIO_SIZE = config["upload_audio_size"]
+	if UPLOAD_AUDIO_SIZE == "" {
+		UPLOAD_AUDIO_SIZE = "100"
+	}
+	UPLOAD_VIDEO_SIZE = config["upload_video_size"]
+	if UPLOAD_VIDEO_SIZE == "" {
+		UPLOAD_VIDEO_SIZE = "1000"
+	}
 	// 初始化缓存
 	redisClient, err := initRedis(config["redis_type"], config["beego_cache"])
 	if err != nil {