report.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "hongze/hongze_api/cache"
  5. "hongze/hongze_api/models"
  6. "hongze/hongze_api/services"
  7. "hongze/hongze_api/utils"
  8. "html"
  9. "strconv"
  10. "time"
  11. )
  12. //报告
  13. type ReportController struct {
  14. BaseAuthController
  15. }
  16. //报告
  17. type ReportCommonController struct {
  18. BaseCommonController
  19. }
  20. // @Title 日评详情
  21. // @Description 日评详情接口
  22. // @Param ReportId query int true "报告id"
  23. // @Success 200 {object} models.ReportDetailResp
  24. // @router /detail [get]
  25. func (this *ReportController) Detail() {
  26. br := new(models.BaseResponse).Init()
  27. defer func() {
  28. this.Data["json"] = br
  29. this.ServeJSON()
  30. }()
  31. user := this.User
  32. if user == nil {
  33. br.Msg = "请登录"
  34. br.ErrMsg = "请登录,用户信息为空"
  35. br.Ret = 408
  36. return
  37. }
  38. var status int
  39. var msg string
  40. reportId, err := this.GetInt("ReportId")
  41. if err != nil {
  42. br.Msg = "参数获取失败"
  43. br.ErrMsg = "参数获取失败,Err:" + err.Error()
  44. return
  45. }
  46. if reportId <= 0 {
  47. br.Msg = "参数错误"
  48. br.ErrMsg = "参数错误,报告id小于等于0"
  49. return
  50. }
  51. report, err := models.GetReportById(reportId)
  52. if err != nil {
  53. br.Msg = "该报告已删除"
  54. br.ErrMsg = "获取报告详情失败,Err:" + err.Error()
  55. return
  56. }
  57. if report == nil {
  58. status = 1
  59. msg = "报告不存在"
  60. }
  61. report.ContentSub = html.UnescapeString(report.ContentSub)
  62. report.Content = html.UnescapeString(report.Content)
  63. productId := 1
  64. maxPermissionCount := 0
  65. maxPermissionCount, err = models.GetDefaultChartPermissionCountByCache(productId)
  66. if err != nil {
  67. br.Msg = "获取报告详情失败"
  68. br.ErrMsg = "获取产品默认最大权限数量失败,Err:" + err.Error()
  69. return
  70. }
  71. utils.FileLog.Info("report.detail %d,%d", user.CompanyId, productId)
  72. status, checkInfo, company, msg, brMsg, brErrMsg := services.CheckUserReportPermission(user, productId, report, maxPermissionCount)
  73. if brMsg != "" {
  74. br.Msg = brMsg
  75. br.ErrMsg = brErrMsg
  76. return
  77. }
  78. /*company, err := models.GetCompanyProductById(user.CompanyId, productId)
  79. if err != nil {
  80. if err.Error() != utils.ErrNoRow() {
  81. br.Msg = "获取报告详情失败"
  82. br.ErrMsg = "获取用户管理企业信息失败,Err:" + err.Error()
  83. return
  84. } else {
  85. status = 2
  86. msg = "您还未开通权限,如有需要请联系对口销售"
  87. }
  88. }
  89. if company == nil {
  90. status = 2
  91. msg = "您还未开通权限,如有需要请联系对口销售"
  92. } else {
  93. if company.Status == utils.COMPANY_STATUS_LOSE ||
  94. company.Status == utils.COMPANY_STATUS_FREEZE {
  95. status = 2
  96. msg = "您还未开通权限,如有需要请联系对口销售"
  97. }
  98. }
  99. if productId == 1 {
  100. reportType := "rddp"
  101. reportPermissionList, err := models.GetReportVarietyListByUserIdExt(user.UserId, reportType) //获取客户拥有权限的报告id
  102. if err != nil {
  103. if err.Error() != utils.ErrNoRow() {
  104. br.Msg = "获取报告详情失败"
  105. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  106. return
  107. } else {
  108. status = 2
  109. msg = "您还未开通权限,如有需要请联系对口销售"
  110. }
  111. }
  112. if len(reportPermissionList) == 0 {
  113. status = 2
  114. msg = "您还未开通权限,如有需要请联系对口销售"
  115. }
  116. permissionMap := make(map[int]int)
  117. for _, v := range reportPermissionList {
  118. if _, ok := permissionMap[v.ReportChapterTypeId]; !ok {
  119. permissionMap[v.ReportChapterTypeId] = v.ReportChapterTypeId
  120. }
  121. }
  122. if _, ok := permissionMap[reportId]; !ok {
  123. tips := ""
  124. status = 2
  125. classifyNameSecond := report.ClassifyNameSecond
  126. if strings.Contains(classifyNameSecond, "宏观商品复盘") ||
  127. strings.Contains(classifyNameSecond, "股债日评") ||
  128. strings.Contains(classifyNameSecond, "每日经济数据备忘录") {
  129. tips = "宏观"
  130. } else if strings.Contains(classifyNameSecond, "知白守黑日评") ||
  131. strings.Contains(classifyNameSecond, "动力煤数据点评") {
  132. tips = "黑色"
  133. } else if strings.Contains(classifyNameSecond, "化里化外日评") ||
  134. strings.Contains(classifyNameSecond, "EIA原油库存点评") ||
  135. strings.Contains(classifyNameSecond, "苯乙烯数据点评") ||
  136. strings.Contains(classifyNameSecond, "聚酯数据点评") {
  137. tips = "化工"
  138. } else if strings.Contains(classifyNameSecond, "有声有色日度闲篇") {
  139. tips = "有色"
  140. }
  141. msg = "您还未开通" + tips + "权限,如有需要请联系对口销售"
  142. }
  143. }*/
  144. if report.ClassifyNameFirst == "权益研报" {
  145. if report.ClassifyNameSecond == "近期路演精华" {
  146. report.TitleType = "路演精华"
  147. } else {
  148. report.TitleType = "权益"
  149. }
  150. } else {
  151. report.TitleType = "FICC"
  152. }
  153. //判断大小权限
  154. /*{
  155. if status == 2 {
  156. if company != nil {
  157. permissionCount, err := models.GetCompanyProductPermissionCount(company.CompanyId, productId)
  158. if err != nil {
  159. br.Msg = "获取信息失败"
  160. br.ErrMsg = "获取权限信息失败,Err:" + err.Error()
  161. return
  162. }
  163. if permissionCount >= maxPermissionCount {
  164. status = 0
  165. msg = ""
  166. }
  167. }
  168. }
  169. }
  170. //如果客户产品被禁用了,只有在试用状态下,才不允许查看报告,那么没有权限
  171. if company != nil && company.IsSuspend > 0 && company.Status == "试用" {
  172. status = 2
  173. msg = "您还未开通权限,如有需要请联系对口销售"
  174. }*/
  175. if status == 2 {
  176. report.Content = report.ContentSub
  177. report.VideoUrl = ""
  178. report.VideoSize = ""
  179. report.VideoPlaySeconds = ""
  180. report.VideoName = ""
  181. }
  182. resp := new(models.ReportDetailResp)
  183. resp.Status = status
  184. resp.Msg = msg
  185. resp.Report = report
  186. //新增阅读记录
  187. if status == 0 {
  188. record := new(models.ReportViewRecord)
  189. record.UserId = user.UserId
  190. record.ReportId = reportId
  191. record.Mobile = user.Mobile
  192. record.Email = user.Email
  193. record.RealName = user.RealName
  194. record.CompanyName = company.CompanyName
  195. record.CreateTime = time.Now()
  196. err = models.AddReportViewRecord(record)
  197. if err != nil {
  198. go utils.SendEmail(utils.APPNAME+"失败提醒", "新增报告阅读记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
  199. }
  200. // 添加阅读日志的数据加入到redis
  201. go cache.PushViewRecordNewRedisData(record, user.CompanyId)
  202. //修改联系人最后一次阅读报告时间
  203. go models.SetWxUserReportLastViewTime(user.UserId)
  204. }
  205. reportType := 0
  206. if report.ClassifyNameFirst == "权益研报" {
  207. reportType = 1
  208. } else {
  209. reportType = 2
  210. }
  211. recommendList, err := models.GetRecommendList(reportId, reportType)
  212. if err != nil {
  213. br.Msg = "获取报告详情失败"
  214. br.ErrMsg = "获取报告推荐列表信息失败,Err:" + err.Error()
  215. return
  216. }
  217. recommendListLen := len(recommendList)
  218. for i := 0; i < recommendListLen; i++ {
  219. item := recommendList[i]
  220. recommendList[i].Content = html.UnescapeString(item.Content)
  221. recommendList[i].ContentSub = html.UnescapeString(item.ContentSub)
  222. count, err := models.GetReportPermission(user.UserId, item.ClassifyNameSecond)
  223. if err != nil {
  224. br.Msg = "获取报告详情失败"
  225. br.ErrMsg = "判断报告权限信息失败,Err:" + err.Error()
  226. return
  227. }
  228. if count > 0 {
  229. recommendList[i].HasPermission = 1
  230. }
  231. if item.ClassifyNameFirst == "权益研报" {
  232. if recommendList[i].ClassifyNameSecond == "近期路演精华" {
  233. recommendList[i].TitleType = "路演精华"
  234. } else {
  235. recommendList[i].TitleType = "权益"
  236. }
  237. } else {
  238. recommendList[i].TitleType = "FICC"
  239. }
  240. }
  241. resp.RecommendList = recommendList
  242. item, err := models.GetClassifyDetailById(report.ClassifyIdSecond)
  243. if err != nil {
  244. br.Msg = "获取信息失败"
  245. br.ErrMsg = "获取详情专栏失败,Err:" + err.Error()
  246. return
  247. }
  248. //新增访问日志
  249. {
  250. record := new(models.UserAccessRecord)
  251. record.Uid = user.UserId
  252. record.Token = this.Token
  253. record.CreateTime = time.Now()
  254. record.Remark = strconv.Itoa(status)
  255. record.ReportId = reportId
  256. go models.AddUserAccessRecord(record)
  257. }
  258. resp.Classify = item
  259. resp.PermissionCheckInfo = checkInfo
  260. br.Ret = 200
  261. br.Success = true
  262. br.Msg = "获取成功"
  263. br.Data = resp
  264. }
  265. // @Title 日评列表
  266. // @Description 日评列表接口
  267. // @Param PageSize query int true "每页数据条数"
  268. // @Param CurrentIndex query int true "当前页页码,从1开始"
  269. // @Param ClassifyId query int true "分类id"
  270. // @Success 200 {object} models.ReportListResp
  271. // @router /list [get]
  272. func (this *ReportController) ListReport() {
  273. br := new(models.BaseResponse).Init()
  274. defer func() {
  275. this.Data["json"] = br
  276. this.ServeJSON()
  277. }()
  278. user := this.User
  279. if user == nil {
  280. br.Msg = "请登录"
  281. br.ErrMsg = "请登录,用户信息为空"
  282. br.Ret = 408
  283. return
  284. }
  285. pageSize, _ := this.GetInt("PageSize")
  286. currentIndex, _ := this.GetInt("CurrentIndex")
  287. classifyId, _ := this.GetInt("ClassifyId")
  288. if classifyId <= 0 {
  289. br.Msg = "参数错误"
  290. br.ErrMsg = "参数错误,分类id小于等于0"
  291. return
  292. }
  293. var startSize int
  294. if pageSize <= 0 {
  295. pageSize = utils.PageSize20
  296. }
  297. if currentIndex <= 0 {
  298. currentIndex = 1
  299. }
  300. startSize = utils.StartIndex(currentIndex, pageSize)
  301. total, err := models.GetReportListCount(classifyId)
  302. if err != nil {
  303. br.Msg = "获取数据失败"
  304. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  305. return
  306. }
  307. list, err := models.GetReportList(classifyId, startSize, pageSize)
  308. if err != nil {
  309. br.Msg = "获取失败"
  310. br.ErrMsg = "获取失败,Err:" + err.Error()
  311. return
  312. }
  313. var hasPermission bool
  314. userPermission, err := services.CheckUserPermission(this.User.UserId)
  315. if err != nil {
  316. br.Msg = "绑定失败"
  317. br.ErrMsg = "绑定失败,判断权限失败:" + err.Error()
  318. return
  319. }
  320. if userPermission == 0 {
  321. hasPermission = true
  322. }
  323. reportType := "rddp"
  324. reportPermissionList, err := models.GetReportVarietyListByUserIdExt(user.UserId, reportType) //获取客户拥有权限的报告id
  325. if err != nil {
  326. if err.Error() != utils.ErrNoRow() {
  327. br.Msg = "获取报告详情失败"
  328. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  329. return
  330. } else {
  331. hasPermission = false
  332. }
  333. }
  334. if len(reportPermissionList) == 0 {
  335. hasPermission = false
  336. }
  337. permissionMap := make(map[int]int)
  338. for _, v := range reportPermissionList {
  339. if _, ok := permissionMap[v.ReportChapterTypeId]; !ok {
  340. permissionMap[v.ReportChapterTypeId] = v.ReportChapterTypeId
  341. }
  342. }
  343. listLen := len(list)
  344. for i := 0; i < listLen; i++ {
  345. item := list[i]
  346. count, err := models.GetReportPermission(user.UserId, item.ClassifyNameSecond)
  347. if err != nil {
  348. br.Msg = "获取失败"
  349. br.ErrMsg = "判断报告是否拥有权限失败,Err:" + err.Error()
  350. return
  351. }
  352. if count > 0 {
  353. list[i].HasPermission = 1
  354. }
  355. if item.ClassifyNameFirst == "权益研报" {
  356. if list[i].ClassifyNameSecond == "近期路演精华" {
  357. list[i].TitleType = "路演精华"
  358. } else {
  359. list[i].TitleType = "权益"
  360. }
  361. } else {
  362. list[i].TitleType = "FICC"
  363. }
  364. if _, ok := permissionMap[item.Id]; !ok {
  365. list[i].VideoUrl = ""
  366. list[i].VideoName = ""
  367. list[i].VideoName = ""
  368. list[i].VideoPlaySeconds = ""
  369. }
  370. if hasPermission == false {
  371. list[i].VideoUrl = ""
  372. list[i].VideoName = ""
  373. list[i].VideoName = ""
  374. list[i].VideoPlaySeconds = ""
  375. }
  376. }
  377. page := models.GetPaging(currentIndex, pageSize, total)
  378. resp := new(models.ReportListResp)
  379. resp.Paging = page
  380. resp.List = list
  381. br.Ret = 200
  382. br.Success = true
  383. br.Msg = "获取成功"
  384. br.Data = resp
  385. }
  386. // @Title 新增报告浏览记录
  387. // @Description 新增报告浏览记录接口
  388. // @Param request body models.ReportRecordReq true "type json string"
  389. // @Success 200 新增成功
  390. // @router /addUpdateLabel [post]
  391. func (this *ReportController) AddUpdateLabelReport() {
  392. br := new(models.BaseResponse).Init()
  393. defer func() {
  394. this.Data["json"] = br
  395. this.ServeJSON()
  396. }()
  397. user := this.User
  398. if user == nil {
  399. br.Msg = "请登录"
  400. br.ErrMsg = "请登录,用户信息为空"
  401. br.Ret = 408
  402. return
  403. }
  404. var req models.ReportRecordReq
  405. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  406. if err != nil {
  407. br.Msg = "参数解析异常!"
  408. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  409. return
  410. }
  411. if req.ReportId <= 0 {
  412. br.Msg = "参数错误"
  413. br.ErrMsg = "参数错误,报告id小于等于0"
  414. return
  415. }
  416. record := new(models.ReportViewLog)
  417. record.UserId = user.UserId
  418. record.ReportId = req.ReportId
  419. record.CreateTime = time.Now()
  420. err = models.AddReportViewLog(record)
  421. if err != nil {
  422. br.Msg = "获取数据失败"
  423. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  424. return
  425. }
  426. br.Ret = 200
  427. br.Success = true
  428. br.Msg = "新增成功"
  429. }
  430. // @Title 新增报告浏览记录
  431. // @Description 新增报告浏览记录接口
  432. // @Param request body models.ReportRecordReq true "type json string"
  433. // @Success 200 新增成功
  434. // @router /addViewRecord [post]
  435. func (this *ReportController) AddViewRecordReport() {
  436. br := new(models.BaseResponse).Init()
  437. defer func() {
  438. this.Data["json"] = br
  439. this.ServeJSON()
  440. }()
  441. user := this.User
  442. if user == nil {
  443. br.Msg = "请登录"
  444. br.ErrMsg = "请登录,用户信息为空"
  445. br.Ret = 408
  446. return
  447. }
  448. var req models.ReportRecordReq
  449. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  450. if err != nil {
  451. br.Msg = "参数解析异常!"
  452. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  453. return
  454. }
  455. if req.ReportId <= 0 {
  456. br.Msg = "参数错误"
  457. br.ErrMsg = "参数错误,报告id小于等于0"
  458. return
  459. }
  460. //查询企业信息
  461. company, err := models.GetCompanyInfoById(user.CompanyId)
  462. if err != nil {
  463. if err.Error() != utils.ErrNoRow() {
  464. br.Msg = "获取用户管理企业信息失败"
  465. br.ErrMsg = "获取用户管理企业信息失败,Err:" + err.Error()
  466. return
  467. } else {
  468. br.Msg = "获取用户管理企业信息失败"
  469. br.ErrMsg = "您还未开通权限,如有需要请联系对口销售"
  470. return
  471. }
  472. }
  473. record := new(models.ReportViewRecord)
  474. record.UserId = user.UserId
  475. record.ReportId = req.ReportId
  476. record.Mobile = user.Mobile
  477. record.Email = user.Email
  478. record.RealName = user.RealName
  479. record.CompanyName = company.CompanyName
  480. record.CreateTime = time.Now()
  481. err = models.AddReportViewRecord(record)
  482. if err != nil {
  483. br.Msg = "获取数据失败"
  484. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  485. return
  486. }
  487. // 添加阅读日志的数据加入到redis
  488. go cache.PushViewRecordNewRedisData(record, user.CompanyId)
  489. //修改联系人最后一次阅读报告时间
  490. go models.SetWxUserReportLastViewTime(user.UserId)
  491. br.Ret = 200
  492. br.Success = true
  493. br.Msg = "新增成功"
  494. }
  495. // @Title 新增音频阅读记录
  496. // @Description 新增音频阅读记录接口
  497. // @Param request body models.ReportRecordReq true "type json string"
  498. // @Success 200 新增成功
  499. // @router /addAudioRecord [post]
  500. func (this *ReportController) AddAudioRecord() {
  501. br := new(models.BaseResponse).Init()
  502. defer func() {
  503. this.Data["json"] = br
  504. this.ServeJSON()
  505. }()
  506. user := this.User
  507. if user == nil {
  508. br.Msg = "请登录"
  509. br.ErrMsg = "请登录,用户信息为空"
  510. br.Ret = 408
  511. return
  512. }
  513. var req models.ReportRecordReq
  514. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  515. if err != nil {
  516. br.Msg = "参数解析异常!"
  517. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  518. return
  519. }
  520. if req.ReportId <= 0 {
  521. br.Msg = "参数错误"
  522. br.ErrMsg = "参数错误,报告id小于等于0"
  523. return
  524. }
  525. record := new(models.ReportAudioRecord)
  526. record.UserId = user.UserId
  527. record.ReportId = req.ReportId
  528. record.CreateTime = time.Now()
  529. err = models.AddReportAudioRecord(record)
  530. if err != nil {
  531. br.Msg = "获取数据失败"
  532. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  533. return
  534. }
  535. br.Ret = 200
  536. br.Success = true
  537. br.Msg = "新增成功"
  538. }
  539. //func init() {
  540. // fmt.Println("start")
  541. // content:=`&lt;p&gt;&lt;strong&gt;&lt;u&gt;需要开始观察和警惕全球库存周期回摆对资产价格的压力&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;从经济惊喜指数上看,8月以来欧美和新兴市场的走势出现了显著的背离,美国和欧洲的经济惊喜指数都在8月见顶,9月开始回落,而新兴市场的经济惊喜指数却在一路上行。新兴市场的走强不是中国带动的,因为中国的经济惊喜指数从8月开始就基本保持稳定。新兴市场的强势更多是由于自身的原因。&lt;/p&gt;&lt;p&gt;&lt;iframe src=&#34;https://vmp.hzinsights.com/element/750/citibank_economic_surprise_index/%7C%7C%7C%7C%7C/&#34; width=&#34;100%&#34; height=&#34;350&#34; border=&#34;none&#34; style=&#34;border-width:0px; min-height:350px;&#34;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;新兴市场经济强势的根本原因是什么?是因为疫情之后自身的经济比欧美恢复得更好么?显然不是。我们以巴西为例,看巴西的制造业PMI,已经到达突破历史的“逆天水平”。&lt;/p&gt;&lt;p&gt;&lt;iframe src=&#34;https://vmp.hzinsights.com/element/762/brazil_pmi_stock_market/%7C%7C%7C%7C%7C/&#34; width=&#34;100%&#34; height=&#34;350&#34; border=&#34;none&#34; style=&#34;border-width:0px; min-height:350px;&#34;&gt;&lt;/iframe&gt;&lt;/p&gt;`
  542. // newContent:=html.UnescapeString(content)
  543. // utils.FileLog.Info("%s",newContent)
  544. // fmt.Println("end")
  545. //}
  546. // @Title 获取报告作者详情
  547. // @Description 获取报告作者详情
  548. // @Param ReportAuthor query string true "作者名称"
  549. // @Success 200 {object} models.ReportDetailResp
  550. // @router /author/detail [get]
  551. func (this *ReportController) AuthorDetail() {
  552. br := new(models.BaseResponse).Init()
  553. defer func() {
  554. this.Data["json"] = br
  555. this.ServeJSON()
  556. }()
  557. user := this.User
  558. if user == nil {
  559. br.Msg = "请登录"
  560. br.ErrMsg = "请登录,用户信息为空"
  561. br.Ret = 408
  562. return
  563. }
  564. reportAuthor := this.GetString("ReportAuthor")
  565. if reportAuthor == "" {
  566. br.Msg = "参数错误"
  567. br.ErrMsg = "作者名称不能为空"
  568. return
  569. }
  570. author, err := models.GetReportAuthor(reportAuthor)
  571. if err != nil {
  572. br.Msg = "获取作者详情失败"
  573. br.ErrMsg = "获取作者详情失败,Err:" + err.Error()
  574. return
  575. }
  576. br.Ret = 200
  577. br.Success = true
  578. br.Msg = "获取成功"
  579. br.Data = author
  580. }