article.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/PuerkitoBio/goquery"
  6. "hongze/hongze_clpt/models"
  7. "hongze/hongze_clpt/utils"
  8. "html"
  9. "strconv"
  10. "strings"
  11. "unicode/utf8"
  12. )
  13. func FixArticleImgUrl(body string) (contentSub string, err error) {
  14. r := strings.NewReader(string(body))
  15. doc, err := goquery.NewDocumentFromReader(r)
  16. if err != nil {
  17. fmt.Println(err)
  18. }
  19. doc.Find("img").Each(func(i int, s *goquery.Selection) {
  20. src, _ := s.Attr("src")
  21. if i == 0 && src != "" {
  22. contentSub = src
  23. }
  24. })
  25. return
  26. }
  27. //GetReportContentTextSubByarticle 解析文章内容
  28. func GetReportContentTextSubByarticle(content, abstract string, articleId int) (contentSub string, err error) {
  29. var lenabstract int
  30. //如果不是研选就这么展示
  31. if articleId < utils.SummaryArticleId {
  32. abstract = html.UnescapeString(abstract)
  33. doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(abstract))
  34. if errdoc != nil {
  35. err = errdoc
  36. return
  37. }
  38. docabstract := doc.Text()
  39. lenabstract = utf8.RuneCountInString(docabstract)
  40. if lenabstract >= 20 {
  41. contentSub = docabstract
  42. return
  43. } else {
  44. contentSub, err = GetReportContentTextSub(content)
  45. }
  46. } else {
  47. contentSub, err = GetReportContentTextSub(content)
  48. }
  49. return
  50. }
  51. func GetReportContentTextSub(content string) (contentSub string, err error) {
  52. content = html.UnescapeString(content)
  53. doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content))
  54. if errdoc != nil {
  55. err = errdoc
  56. return
  57. }
  58. docText := doc.Text()
  59. bodyRune := []rune(docText)
  60. bodyRuneLen := len(bodyRune)
  61. body := string(bodyRune[:bodyRuneLen])
  62. contentSub = body
  63. contentSub = strings.Replace(body, "Powered by Froala Editor", "", -1)
  64. contentSub = strings.Replace(body, "PoweredbyFroalaEditor", "", -1)
  65. contentSub = strings.Replace(body, " ", "", -1)
  66. return
  67. }
  68. func GetReportContentTextArticleBody(content string) (contentSub string) {
  69. contentSub = html.UnescapeString(content)
  70. contentSub = strings.Replace(contentSub, "<p data-f-id=\"pbf\" style=\"text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;\">Powered by <a href=\"https://www.froala.com/wysiwyg-editor?pb=1\" title=\"Froala Editor\">Froala Editor</a></p>", "", -1)
  71. contentSub = strings.Replace(contentSub, "pre", "div", -1)
  72. return
  73. }
  74. //HandleArticleCategoryImg 预处理文章的封面图片
  75. func HandleArticleCategoryImg(list []*models.ArticleListResp) (items []*models.ArticleListResp, err error) {
  76. //研选的五张图片
  77. detailResearch, e := models.GetConfigByCode("category_research_img_url")
  78. if e != nil {
  79. err = errors.New("获取研选的五张图片失败" + e.Error())
  80. return
  81. }
  82. researchList := strings.Split(detailResearch.ConfigValue, "{|}")
  83. //对应分类的所图片
  84. detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
  85. if err != nil {
  86. err = errors.New("获取对应分类的所图片失败" + err.Error())
  87. return
  88. }
  89. categoryUrlList := strings.Split(detailCategoryUrl.ConfigValue, "{|}")
  90. mapCategoryUrl := make(map[string]string)
  91. var categoryId string
  92. var imgUrlChart string
  93. for _, v := range categoryUrlList {
  94. vslice := strings.Split(v, "_")
  95. categoryId = vslice[0]
  96. imgUrlChart = vslice[len(vslice)-1]
  97. mapCategoryUrl[categoryId] = imgUrlChart
  98. }
  99. for k, v := range list {
  100. item := list[k]
  101. //如果文章一开始的内容是图片,优先展示第一张图片
  102. newBody, _ := GetReportContentTextSubByarticle(item.Body, item.Annotation, item.ArticleId)
  103. list[k].Annotation = newBody
  104. list[k].Body = ""
  105. list[k].PublishDate = utils.StrTimeToTime(item.PublishDate).Format(utils.FormatDate) //时间字符串格式转时间格式
  106. if item.Pv > 999 {
  107. list[k].Pv = 999
  108. }
  109. //如果是研选系列的任意取五张图片的中的一张
  110. if v.CategoryId == "0" || v.ArticleId > utils.SummaryArticleId {
  111. knum := v.ArticleId % 5
  112. list[k].ImgUrlPc = researchList[knum]
  113. } else {
  114. list[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
  115. }
  116. if list[k].ArticleId < utils.SummaryArticleId {
  117. list[k].HttpUrl = utils.StrategyPlatform + strconv.Itoa(v.ArticleId)
  118. list[k].IsNeedJump = true
  119. }
  120. list[k].Source = 1
  121. //添加行业默认图片
  122. if v.ImgUrlPc == "" {
  123. if v.ChartPermissionName == utils.YI_YAO_NAME {
  124. list[k].ImgUrlPc = utils.YI_YAO_OTHER_IMG
  125. } else if v.ChartPermissionName == utils.XIAO_FEI_NAME {
  126. list[k].ImgUrlPc = utils.XIAO_FEI_OTHER_IMG
  127. } else if v.ChartPermissionName == utils.KE_JI_NAME {
  128. list[k].ImgUrlPc = utils.KE_JI_OTHER_IMG
  129. } else if v.ChartPermissionName == utils.ZHI_ZAO_NAME {
  130. list[k].ImgUrlPc = utils.ZHI_ZAO_OTHER_IMG
  131. }
  132. }
  133. }
  134. if len(list) == 0 {
  135. list = make([]*models.ArticleListResp, 0)
  136. }
  137. items = list
  138. return
  139. }
  140. //HandleArticleStock 处理报告关联的个股标签
  141. func HandleArticleStock(stock string) (items []*models.ComapnyNameResp) {
  142. sliceSubjects := strings.Split(stock, "/")
  143. if len(sliceSubjects) > 0 {
  144. for _, vSubject := range sliceSubjects {
  145. sliceKuohao := strings.Split(vSubject, "(") //过滤括号
  146. sliceXiahuaxian := strings.Split(sliceKuohao[0], "-") //过滤下划线
  147. subject := sliceXiahuaxian[0]
  148. items = append(items, &models.ComapnyNameResp{ComapnyName: subject})
  149. }
  150. }
  151. return
  152. }