public.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package controller
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "hongze/hongze_yb/controller/response"
  7. "hongze/hongze_yb/global"
  8. "hongze/hongze_yb/logic"
  9. "hongze/hongze_yb/models/request"
  10. respond "hongze/hongze_yb/models/response"
  11. "hongze/hongze_yb/models/tables/yb_resource"
  12. "hongze/hongze_yb/models/tables/yb_suncode_pars"
  13. "hongze/hongze_yb/services"
  14. "hongze/hongze_yb/services/alarm_msg"
  15. "hongze/hongze_yb/services/user"
  16. "hongze/hongze_yb/utils"
  17. "io/ioutil"
  18. "os"
  19. "path"
  20. "strconv"
  21. "time"
  22. )
  23. // GetApplyVarietyList
  24. // @Tags 公共模块
  25. // @Summary 获取所有可以申请的品种权限列表
  26. // @Description 获取所有可以申请的品种权限列表
  27. // @Security ApiKeyAuth
  28. // @securityDefinitions.basic BasicAuth
  29. // @Param Authorization header string true "微信登录后获取到的token"
  30. // @Accept json
  31. // @Product json
  32. // @Success 200 {object} []logic.ApplyVariety "获取成功"
  33. // @failure 400 {string} string "获取失败"
  34. // @Router /public/get_apply_variety_list [get]
  35. func GetApplyVarietyList(c *gin.Context) {
  36. list := logic.GetApplyVarietyList()
  37. response.OkData("获取成功", list, c)
  38. }
  39. // Upload
  40. // @Tags 公共模块
  41. // @Summary 文件上传
  42. // @Description 文件上传
  43. // @Security ApiKeyAuth
  44. // @securityDefinitions.basic BasicAuth
  45. // @Param Authorization header string true "微信登录后获取到的token"
  46. // @Param file formData file false "操作描述"
  47. // @Accept multipart/form-data
  48. // @Product json
  49. // @Success 200 {object} string "上传成功"
  50. // @failure 400 {string} string "上传失败,存储目录创建失败"
  51. // @Router /public/upload [post]
  52. func Upload(c *gin.Context) {
  53. // 单文件
  54. file, err := c.FormFile("file")
  55. fmt.Println("file", file)
  56. if err != nil {
  57. response.FailData("获取资源失败", "获取资源失败,Err:"+err.Error(), c)
  58. return
  59. }
  60. ext := path.Ext(file.Filename)
  61. dateDir := time.Now().Format("20060102")
  62. uploadDir := global.CONFIG.Serve.StaticDir + "hongze/" + dateDir
  63. err = os.MkdirAll(uploadDir, 0766)
  64. if err != nil {
  65. response.FailData("存储目录创建失败", "存储目录创建失败,Err:"+err.Error(), c)
  66. return
  67. }
  68. randStr := utils.GetRandStringNoSpecialChar(28)
  69. fileName := randStr + ext
  70. fpath := uploadDir + "/" + fileName
  71. // 上传文件至指定目录
  72. err = c.SaveUploadedFile(file, fpath)
  73. if err != nil {
  74. response.FailData("文件上传失败", "文件上传失败,Err:"+err.Error(), c)
  75. return
  76. }
  77. defer func() {
  78. os.Remove(fpath)
  79. }()
  80. //上传到阿里云
  81. resourceUrl, err := services.UploadAliyun(fileName, fpath)
  82. if err != nil {
  83. response.FailData("文件上传失败", "文件上传失败,Err:"+err.Error(), c)
  84. return
  85. }
  86. response.OkData("文件上传成功", resourceUrl, c)
  87. }
  88. // GetSharePoster
  89. // @Tags 公共模块
  90. // @Summary 获取分享海报
  91. // @Description 获取分享海报
  92. // @Security ApiKeyAuth
  93. // @securityDefinitions.basic BasicAuth
  94. // @Param request body services.SharePosterReq true "type json string"
  95. // @Accept application/json
  96. // @Success 200 {object} string "获取成功"
  97. // @failure 400 {string} string "获取失败"
  98. // @Router /public/get_share_poster [post]
  99. func GetSharePoster(c *gin.Context) {
  100. // 是否为备用小程序
  101. copyYb := c.Request.Header.Get("CopyYb")
  102. var req services.SharePosterReq
  103. if c.ShouldBind(&req) != nil {
  104. response.Fail("参数异常", c)
  105. return
  106. }
  107. if req.Source == "" {
  108. response.Fail("来源有误", c)
  109. return
  110. }
  111. imgUrl, err := services.CreatePosterFromSourceV2(req.CodePage, req.CodeScene, req.Source, req.Version, req.Pars, copyYb)
  112. if err != nil {
  113. response.FailData("获取分享海报失败", "获取分享海报失败, Err: "+err.Error(), c)
  114. return
  115. }
  116. response.OkData("获取成功", imgUrl, c)
  117. }
  118. // GetSuncodeScene 获取小程序太阳码scene值
  119. // @Tags 公共模块
  120. // @Summary 获取小程序太阳码scene值
  121. // @Description 获取小程序太阳码scene值
  122. // @Security ApiKeyAuth
  123. // @Param Authorization header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
  124. // @Param scene_key query string true "scene_key值"
  125. // @Success 200 {string} string "获取成功"
  126. // @failure 400 {string} string "获取失败"
  127. // @Router /public/get_suncode_scene [get]
  128. func GetSuncodeScene(c *gin.Context) {
  129. reqKey := c.DefaultQuery("scene_key", "")
  130. if reqKey == "" {
  131. response.Fail("参数有误", c)
  132. }
  133. pars, err := yb_suncode_pars.GetSceneByKey(reqKey)
  134. if err != nil && err != utils.ErrNoRow {
  135. response.FailMsg("获取失败", "GetSuncodeScene获取失败, Err: "+err.Error(), c)
  136. return
  137. }
  138. scene := ""
  139. if pars != nil {
  140. scene = pars.Scene
  141. }
  142. response.OkData("获取成功", scene, c)
  143. }
  144. // GetVarietyTagTree 标签树
  145. // @Tags 公共模块
  146. // @Summary 标签树
  147. // @Description 标签树
  148. // @Security ApiKeyAuth
  149. // @Param Authorization header string true "Bearer 31a165baebe6dec616b1f8f3207b4273"
  150. // @Param scene_key query string true "scene_key值"
  151. // @Success 200 {string} string "获取成功"
  152. // @failure 400 {string} string "获取失败"
  153. // @Router /public/get_variety_tag_tree [get]
  154. func GetVarietyTagTree(c *gin.Context) {
  155. questionId, _ := strconv.Atoi(c.Query("community_question_id"))
  156. list, err := services.GetTagTree(questionId)
  157. if err != nil {
  158. response.FailMsg("获取标签树失败", "获取标签树失败, Err: "+err.Error(), c)
  159. return
  160. }
  161. response.OkData("获取成功", list, c)
  162. }
  163. // WechatWarning 小程序前端预警提示
  164. // @Tags 公共模块
  165. // @Description 小程序前端预警提示
  166. // @Param content query string true "预警信息"
  167. // @Success 200 {string} string "操作成功"
  168. // @failure 400 {string} string "操作失败"
  169. // @Router /public/wechat_warning [post]
  170. func WechatWarning(c *gin.Context) {
  171. var req request.WechatWarningReq
  172. if err := c.Bind(&req); err != nil {
  173. response.Fail("参数有误", c)
  174. return
  175. }
  176. if req.Content != "" {
  177. tips := fmt.Sprintf("研报小程序前端报错预警-ErrMsg: %s", req.Content)
  178. global.LOG.Warning(tips)
  179. go alarm_msg.SendAlarmMsg(tips, 2)
  180. }
  181. response.Ok("操作成功", c)
  182. }
  183. // UploadAudio 上传音频文件
  184. // @Tags 公共模块
  185. // @Description 上传音频文件
  186. // @Param file query string true "音频文件"
  187. // @Success 200 {string} string "上传成功"
  188. // @failure 400 {string} string "上传失败"
  189. // @Router /public/upload_audio [post]
  190. func UploadAudio(c *gin.Context) {
  191. file, err := c.FormFile("file")
  192. if err != nil {
  193. response.FailMsg("获取资源失败", "获取资源失败, Err:"+err.Error(), c)
  194. return
  195. }
  196. ext := path.Ext(file.Filename)
  197. if ext != ".mp3" {
  198. response.Fail("暂仅支持mp3格式", c)
  199. return
  200. }
  201. dateDir := time.Now().Format("20060102")
  202. localDir := global.CONFIG.Serve.StaticDir + "hongze/" + dateDir
  203. if err := os.MkdirAll(localDir, 0766); err != nil {
  204. response.FailMsg("存储目录创建失败", "UploadAudio 存储目录创建失败, Err:"+err.Error(), c)
  205. return
  206. }
  207. randStr := utils.GetRandStringNoSpecialChar(28)
  208. filtName := randStr + ext
  209. fpath := localDir + "/" + filtName
  210. defer func() {
  211. _ = os.Remove(fpath)
  212. }()
  213. // 生成文件至指定目录
  214. if err := c.SaveUploadedFile(file, fpath); err != nil {
  215. response.FailMsg("文件生成失败", "UploadAudio 文件生成失败, Err:"+err.Error(), c)
  216. return
  217. }
  218. // 获取音频文件时长
  219. fByte, err := ioutil.ReadFile(fpath)
  220. if err != nil {
  221. response.FailMsg("读取本地文件失败", "UploadAudio 读取本地文件失败", c)
  222. return
  223. }
  224. if len(fByte) <= 0 {
  225. response.FailMsg("文件大小有误", "UploadAudio 文件大小有误", c)
  226. return
  227. }
  228. seconds, err := services.GetMP3PlayDuration(fByte)
  229. if err != nil {
  230. response.FailMsg("读取文件时长失败", "UploadAudio 读取文件时长失败", c)
  231. return
  232. }
  233. // 音频大小MB
  234. fi, err := os.Stat(fpath)
  235. if err != nil {
  236. response.FailMsg("读取文件大小失败", "UploadAudio 读取文件大小失败", c)
  237. return
  238. }
  239. mb := utils.Bit2MB(fi.Size(), 2)
  240. // 上传文件至阿里云
  241. ossDir := "yb_wx/audio/"
  242. resourceUrl, err := services.UploadAliyunToDir(filtName, fpath, ossDir)
  243. if err != nil {
  244. response.FailMsg("文件上传失败", "UploadAudio 文件上传失败, Err:"+err.Error(), c)
  245. return
  246. }
  247. resp := &respond.CommunityQuestionAudioUpload{
  248. AudioURL: resourceUrl,
  249. AudioPlaySeconds: fmt.Sprint(seconds),
  250. AudioSize: fmt.Sprint(mb),
  251. }
  252. // 记录文件
  253. go func() {
  254. extendData := struct {
  255. FileName string
  256. AudioURL string
  257. AudioPlaySeconds string
  258. AudioSize string
  259. }{
  260. file.Filename,
  261. resourceUrl,
  262. fmt.Sprint(seconds),
  263. fmt.Sprint(mb),
  264. }
  265. dataByte, e := json.Marshal(extendData)
  266. if e != nil {
  267. return
  268. }
  269. re := new(yb_resource.YbResource)
  270. re.ResourceUrl = resourceUrl
  271. re.ResourceType = yb_resource.ResourceTypeAudio
  272. re.ExtendData = string(dataByte)
  273. re.CreateTime = time.Now().Local()
  274. if e = re.Create(); e != nil {
  275. return
  276. }
  277. }()
  278. response.OkData("上传成功", resp, c)
  279. }
  280. // UpdateViewLog
  281. // @Description 更新各模块访问/点击日志(有时间的话统一改版做一个入口,统一访问日志)
  282. // @Success 200 {string} string "更新成功"
  283. // @Router /public/view_log/update [post]
  284. func UpdateViewLog(c *gin.Context) {
  285. var req request.ViewLogUpdateReq
  286. if err := c.Bind(&req); err != nil {
  287. response.Fail("参数有误:"+err.Error(), c)
  288. return
  289. }
  290. if req.Id <= 0 {
  291. response.Fail("参数有误", c)
  292. return
  293. }
  294. if req.Source <= 0 {
  295. response.Fail("来源有误", c)
  296. return
  297. }
  298. userInfo := user.GetInfoByClaims(c)
  299. err := services.UpdateViewLogBySource(int(userInfo.UserID), req.Id, req.StopSeconds, req.Source)
  300. if err != nil {
  301. fmt.Println(err.Error())
  302. response.FailMsg("更新日志失败", err.Error(), c)
  303. return
  304. }
  305. response.Ok("更新成功", c)
  306. }