Browse Source

用户详情,首页接口

xingzai 2 years ago
parent
commit
3cc04d3307
15 changed files with 769 additions and 121 deletions
  1. 137 0
      controllers/base_auth_mobile.go
  2. 122 114
      controllers/home.go
  3. 32 0
      controllers/user.go
  4. 1 0
      go.mod
  5. 6 0
      go.sum
  6. 23 0
      models/chart_permission.go
  7. 194 0
      models/company.go
  8. 65 0
      models/config.go
  9. 31 6
      models/home.go
  10. 8 0
      models/user.go
  11. 10 1
      routers/commentsRouter.go
  12. 5 0
      routers/router.go
  13. 71 0
      services/article.go
  14. 61 0
      services/user.go
  15. 3 0
      utils/constants.go

+ 137 - 0
controllers/base_auth_mobile.go

@@ -0,0 +1,137 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	beego "github.com/beego/beego/v2/adapter"
+	"hongze/hongze_clpt/services"
+	"net/http"
+	"net/url"
+	"strconv"
+
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+
+	"github.com/rdlucklib/rdluck_tools/log"
+)
+
+func init() {
+	if utils.RunMode == "release" {
+		logDir := `/data/rdlucklog/hongze_cygx`
+		apiLog = log.Init("20060102.api", logDir)
+	} else {
+		apiLog = log.Init("20060102.api")
+	}
+}
+
+type BaseAuthMobileController struct {
+	beego.Controller
+	User  *models.WxUserItem
+	Token string
+}
+
+func (this *BaseAuthMobileController) Prepare() {
+	fmt.Println("enter prepare")
+	method := this.Ctx.Input.Method()
+	uri := this.Ctx.Input.URI()
+	fmt.Println("Url:", uri)
+	if method != "HEAD" {
+		if method == "POST" || method == "GET" {
+			authorization := this.Ctx.Input.Header("Authorization")
+			if authorization == "" {
+				authorization = this.GetString("Authorization")
+			}
+			this.Token = authorization
+			if authorization == "" {
+				nilWxUser := new(models.WxUserItem)
+				this.User = nilWxUser
+			} else {
+				session, err := models.GetSessionByToken(authorization)
+				if err != nil {
+					if err.Error() == utils.ErrNoRow() {
+						this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + authorization}, false, false)
+						this.StopRun()
+						return
+					}
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()}, false, false)
+					this.StopRun()
+					return
+				}
+				if session == nil {
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sesson is empty "}, false, false)
+					this.StopRun()
+					return
+				}
+				//wxUser, err := models.GetWxUserItemByUserId(session.UserId)
+				wxUser, err := models.GetWxUserItemByMobile(session.Mobile)
+				if err != nil && err != services.ERR_USER_NOT_BIND {
+					if err.Error() == utils.ErrNoRow() {
+						this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取信息失败 " + strconv.Itoa(session.UserId)}, false, false)
+						this.StopRun()
+						return
+					}
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取wx_user信息异常,Eerr:" + err.Error()}, false, false)
+					this.StopRun()
+					return
+				}
+				if wxUser == nil {
+					this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "admin is empty "}, false, false)
+					this.StopRun()
+					return
+				}
+				this.User = wxUser
+			}
+		} else {
+			this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
+			this.StopRun()
+			return
+		}
+	}
+}
+
+func (c *BaseAuthMobileController) ServeJSON(encoding ...bool) {
+	var (
+		hasIndent   = false
+		hasEncoding = false
+	)
+	if beego.BConfig.RunMode == beego.PROD {
+		hasIndent = false
+	}
+	if len(encoding) > 0 && encoding[0] == true {
+		hasEncoding = true
+	}
+	if c.Data["json"] == nil {
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "接口:"+"URI:"+c.Ctx.Input.URI()+";无返回值", utils.EmailSendToUsers)
+		return
+	}
+	baseRes := c.Data["json"].(*models.BaseResponse)
+	if baseRes != nil && baseRes.Ret != 200 && baseRes.Ret != 408 && baseRes.IsSendEmail {
+		body, _ := json.Marshal(baseRes)
+		msgBody := "URI:" + c.Ctx.Input.URI() + "<br/> ErrMsg:" + baseRes.ErrMsg + ";<br/>Msg:" + baseRes.Msg + ";<br/> Body:" + string(body) + ";<br/>" + c.Token
+		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+" 失败提醒", msgBody, utils.EmailSendToUsers)
+	}
+
+	c.JSON(c.Data["json"], hasIndent, hasEncoding)
+}
+
+func (c *BaseAuthMobileController) JSON(data interface{}, hasIndent bool, coding bool) error {
+	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	var content []byte
+	var err error
+	if hasIndent {
+		content, err = json.MarshalIndent(data, "", "  ")
+	} else {
+		content, err = json.Marshal(data)
+	}
+	if err != nil {
+		http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+		return err
+	}
+	ip := c.Ctx.Input.IP()
+	requestBody, _ := url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+	apiLog.Println("请求地址:", c.Ctx.Input.URI(), "Authorization:", c.Ctx.Input.Header("Authorization"), "RequestBody:", requestBody, "ResponseBody", string(content), "IP:", ip)
+	if coding {
+		content = []byte(utils.StringsToJSON(string(content)))
+	}
+	return c.Ctx.Output.Body(content)
+}

+ 122 - 114
controllers/home.go

@@ -1,9 +1,12 @@
 package controllers
 
 import (
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/services"
 	"hongze/hongze_clpt/utils"
-	"github.com/rdlucklib/rdluck_tools/paging"
+	"html"
 	"strconv"
 	"strings"
 )
@@ -16,9 +19,12 @@ type BaseHomeController struct {
 	BaseCommonController
 }
 
+type MobileHomeController struct {
+	BaseAuthMobileController
+}
 
-// @Title 首页列表接口v6版本
-// @Description 首页列表接口v6版本
+// @Title 首页列表接口
+// @Description 首页列表接口
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   ChartPermissionId   query   int  true       "品类id,最新传0"
@@ -26,7 +32,7 @@ type BaseHomeController struct {
 // @Param   ListType   query   int  true       "列表类型,1最新,2 纪要 ,3图表 默认1"
 // @Success 200 {object} models.HomeArtAndChartListResp
 // @router /list [get]
-func (this *HomeController) List() {
+func (this *MobileHomeController) List() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
@@ -39,6 +45,7 @@ func (this *HomeController) List() {
 		br.Ret = 408
 		return
 	}
+	fmt.Println(user)
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	chartPermissionId, _ := this.GetInt("ChartPermissionId")
@@ -130,116 +137,117 @@ func (this *HomeController) List() {
 	resp.ChartList = chartList
 
 	if listType != 3 {
-		//userType, _, err := services.GetUserType(user.CompanyId)
-		//if err != nil {
-		//	br.Msg = "获取信息失败"
-		//	br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//condition = ` AND is_summary = 1  `
-		//if chartPermissionId > 0 {
-		//	categoryId, err := models.GetCategoryId(chartPermissionId)
-		//	if err != nil && err.Error() != utils.ErrNoRow() {
-		//		br.Msg = "获取信息失败"
-		//		br.ErrMsg = "获取分类权限信息失败,Err:" + err.Error()
-		//		return
-		//	}
-		//	categoryinfo, err := models.GetChartPermissionById(chartPermissionId)
-		//	if err != nil {
-		//		br.Msg = "获取信息失败"
-		//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-		//		return
-		//	}
-		//	if userType == 1 && strings.Contains(categoryinfo.PermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		//		resp.HaveResearch = false
-		//		resp.Paging = page
-		//		br.Ret = 200
-		//		br.Success = true
-		//		br.Msg = "获取成功"
-		//		br.Data = resp
-		//		return
-		//	}
-		//	page = paging.GetPaging(currentIndex, pageSize, total)
-		//	if categoryId != "" {
-		//		condition += ` AND category_id IN(` + categoryId + `)`
-		//		//condition += ` OR ( category_name  LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%' AND publish_status = 1 AND is_summary = 1 )`
-		//	} else {
-		//		condition += ` AND  category_name   LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%'`
-		//	}
-		//}
-		////永续客户无法查看研选分类的内容
-		//if userType == 1 {
-		//	condition += ` AND  category_name  NOT LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%'`
-		//}
-		//total, err = models.GetHomeCount(condition, pars)
-		//if err != nil {
-		//	br.Msg = "获取信息失败"
-		//	br.Msg = "获取帖子总数失败,Err:" + err.Error()
-		//	return
-		//}
-		//
-		//list, err := models.GetHomeList(condition, pars, startSize, pageSize)
-		//if err != nil {
-		//	br.Msg = "获取信息失败"
-		//	br.Msg = "获取帖子数据失败,Err:" + err.Error()
-		//	return
-		//}
-		////研选的五张图片
-		//detailResearch, err := models.GetConfigByCode("category_research_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "获取数据研选分类图片失败,Err:" + err.Error()
-		//	return
-		//}
-		//researchList := strings.Split(detailResearch.ConfigValue, "{|}")
-		////对应分类的所图片
-		//detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
-		//if err != nil {
-		//	br.Msg = "获取数据失败"
-		//	br.ErrMsg = "行业配置信息失败,Err:" + err.Error()
-		//	return
-		//}
-		//categoryUrlList := strings.Split(detailCategoryUrl.ConfigValue, "{|}")
-		//mapCategoryUrl := make(map[string]string)
-		//var categoryId string
-		//var imgUrlChart string
-		//for _, v := range categoryUrlList {
-		//	vslice := strings.Split(v, "_")
-		//	categoryId = vslice[0]
-		//	imgUrlChart = vslice[len(vslice)-1]
-		//	mapCategoryUrl[categoryId] = imgUrlChart
-		//}
-		//
-		//for k, v := range list {
-		//	item := list[k]
-		//	//如果文章一开始的内容是图片,优先展示第一张图片
-		//	imgurl, _ := services.FixArticleImgUrl(html.UnescapeString(list[k].Body))
-		//	newBody, _ := services.GetReportContentTextSubByarticle(item.Body, item.Abstract, item.ArticleId)
-		//	list[k].Body = newBody
-		//	if imgurl != "" {
-		//		list[k].BodyHtml = imgurl
-		//	}
-		//	list[k].PublishDate = utils.StrTimeToTime(item.PublishDate).Format(utils.FormatDateTimeNoSecond) //时间字符串格式转时间格式
-		//	if strings.Contains(item.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		//		list[k].IsResearch = true
-		//	}
-		//	if item.Pv > 999 {
-		//		list[k].Pv = 999
-		//	}
-		//	//如果是研选系列的任意取五张图片的中的一张
-		//	if v.CategoryId == "0" {
-		//		knum := v.ArticleId % 5
-		//		list[k].ImgUrlPc = researchList[knum]
-		//	} else {
-		//		list[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
-		//	}
-		//	if list[k].ArticleId < utils.SummaryArticleId {
-		//		list[k].HttpUrl = utils.StrategyPlatform + strconv.Itoa(v.ArticleId)
-		//		list[k].IsNeedJump = true
-		//	}
-		//	list[k].Source = 1
-		//}
-		//resp.List = list
+		userType, _, err := services.GetUserType(user.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
+			return
+		}
+		condition = ` AND is_summary = 1  `
+		if chartPermissionId > 0 {
+			categoryId, err := models.GetCategoryId(chartPermissionId)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取分类权限信息失败,Err:" + err.Error()
+				return
+			}
+			categoryinfo, err := models.GetChartPermissionById(chartPermissionId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败,Err:" + err.Error()
+				return
+			}
+			if userType == 1 && strings.Contains(categoryinfo.PermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				resp.Paging = page
+				br.Ret = 200
+				br.Success = true
+				br.Msg = "获取成功"
+				br.Data = resp
+				return
+			}
+			page = paging.GetPaging(currentIndex, pageSize, total)
+			if categoryId != "" {
+				condition += ` AND category_id IN(` + categoryId + `)`
+				//condition += ` OR ( category_name  LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%' AND publish_status = 1 AND is_summary = 1 )`
+			} else {
+				condition += ` AND  category_name   LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%'`
+			}
+		}
+		//永续客户无法查看研选分类的内容
+		if userType == 1 {
+			condition += ` AND  category_name  NOT LIKE '%` + utils.CHART_PERMISSION_NAME_YANXUAN + `%'`
+		}
+		total, err = models.GetHomeCount(condition, pars)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.Msg = "获取帖子总数失败,Err:" + err.Error()
+			return
+		}
+
+		list, err := models.GetHomeList(condition, pars, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.Msg = "获取帖子数据失败,Err:" + err.Error()
+			return
+		}
+		//研选的五张图片
+		detailResearch, err := models.GetConfigByCode("category_research_img_url")
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据研选分类图片失败,Err:" + err.Error()
+			return
+		}
+		researchList := strings.Split(detailResearch.ConfigValue, "{|}")
+		//对应分类的所图片
+		detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
+		if err != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "行业配置信息失败,Err:" + err.Error()
+			return
+		}
+		categoryUrlList := strings.Split(detailCategoryUrl.ConfigValue, "{|}")
+		mapCategoryUrl := make(map[string]string)
+		var categoryId string
+		var imgUrlChart string
+		for _, v := range categoryUrlList {
+			vslice := strings.Split(v, "_")
+			categoryId = vslice[0]
+			imgUrlChart = vslice[len(vslice)-1]
+			mapCategoryUrl[categoryId] = imgUrlChart
+		}
+
+		for k, v := range list {
+			item := list[k]
+			//如果文章一开始的内容是图片,优先展示第一张图片
+			imgurl, _ := services.FixArticleImgUrl(html.UnescapeString(list[k].Body))
+			fmt.Println(item.Annotation)
+			newBody, _ := services.GetReportContentTextSubByarticle(item.Body, item.Annotation, item.ArticleId)
+			list[k].Annotation = newBody
+			list[k].Body = ""
+			if imgurl != "" {
+				list[k].BodyHtml = imgurl
+			}
+			list[k].PublishDate = utils.StrTimeToTime(item.PublishDate).Format(utils.FormatDateTimeNoSecond) //时间字符串格式转时间格式
+			if strings.Contains(item.CategoryName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				list[k].IsResearch = true
+			}
+			if item.Pv > 999 {
+				list[k].Pv = 999
+			}
+			//如果是研选系列的任意取五张图片的中的一张
+			if v.CategoryId == "0" {
+				knum := v.ArticleId % 5
+				list[k].ImgUrlPc = researchList[knum]
+			} else {
+				list[k].ImgUrlPc = mapCategoryUrl[v.CategoryId]
+			}
+			if list[k].ArticleId < utils.SummaryArticleId {
+				list[k].HttpUrl = utils.StrategyPlatform + strconv.Itoa(v.ArticleId)
+				list[k].IsNeedJump = true
+			}
+			list[k].Source = 1
+		}
+		resp.List = list
 	}
 	if chartTotal > total {
 		total = chartTotal

+ 32 - 0
controllers/user.go

@@ -99,3 +99,35 @@ func (this *UserCommonController) Login() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// @Title 获取用户详情
+// @Description 获取用户详情接口
+// @Success 200 {object} models.UserDetailResp
+// @router /detail [get]
+func (this *UserController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	resp := new(models.UserDetailResp)
+	resp.UserId = user.UserId
+	resp.Headimgurl = user.Headimgurl
+	resp.Mobile = user.Mobile
+	resp.Email = user.Email
+	resp.CompanyName = user.CompanyName
+	if resp.Headimgurl == "" {
+		resp.Headimgurl = utils.DefaultHeadimgurl
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 0
go.mod

@@ -3,6 +3,7 @@ module hongze/hongze_clpt
 go 1.16
 
 require (
+	github.com/PuerkitoBio/goquery v1.8.0 // indirect
 	github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible
 	github.com/beego/beego/v2 v2.0.5
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible

+ 6 - 0
go.sum

@@ -35,6 +35,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
@@ -48,6 +50,8 @@ github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGn
 github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
 github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible h1:QoRMR0TCctLDqBCMyOu1eXdZyMw3F7uGA9qPn2J4+R8=
 github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
@@ -557,6 +561,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
 golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8 h1:/6y1LfuqNuQdHAm0jjtPtgRcxIxjVZgm5OTu8/QhZvk=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

+ 23 - 0
models/chart_permission.go

@@ -9,6 +9,12 @@ type ChartPermissionResp struct {
 	PermissionName    string `description:"权限名称"`
 }
 
+type ChartPermission struct {
+	ChartPermissionId int    `description:"权限id"`
+	PermissionName    string `description:"权限名称"`
+	IsShowSustainable bool   `description:"是否展示限免标签"`
+}
+
 type ChartPermissionListResp struct {
 	List []*ChartPermissionResp
 }
@@ -19,3 +25,20 @@ func GetChartPermissionReportAll(condition string) (items []*ChartPermissionResp
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+func GetCategoryId(chartPermissionId int) (category_id string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT GROUP_CONCAT(a.category_id) AS category_id 
+			FROM cygx_permission_mapping AS a
+			WHERE a.chart_permission_id=? 
+			GROUP BY a.chart_permission_id `
+	err = o.Raw(sql, chartPermissionId).QueryRow(&category_id)
+	return
+}
+
+func GetChartPermissionById(chartPermissionId int) (item *ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM chart_permission WHERE chart_permission_id = ? `
+	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
+	return
+}

+ 194 - 0
models/company.go

@@ -0,0 +1,194 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type CompanyDetail struct {
+	CompanyId   int    `orm:"column(company_id);pk"`
+	CompanyName string `description:"客户名称"`
+	Status      string `description:"客户状态"`
+	SellerId    int    `description:"销售id"`
+	SellerName  string `description:"销售名称"`
+	Mobile      string `description:"销售手机号"`
+	ProductId   int    `description:"1,FICC,2权益"`
+	IsSuspend   int    `description:"1:暂停,0:启用"`
+}
+
+func GetCompanyDetailById(companyId int) (item *CompanyDetail, err error) {
+	//sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile
+	//        FROM company AS a
+	//		INNER JOIN company_product AS b ON a.company_id=b.company_id
+	//		LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+	//		WHERE a.company_id=? AND  b.product_id=2 `
+
+	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile,p.product_id
+            FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+			INNER JOIN chart_permission AS cp ON cp.chart_permission_id=p.chart_permission_id
+			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+			WHERE a.company_id=? AND cp.cygx_auth=1
+			OR (a.company_id = ? AND  cp.permission_name = '策略' ) ORDER BY  b.product_id  DESC LIMIT 1` // 兼容永续状态
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId, companyId).QueryRow(&item)
+	return
+}
+
+func GetCompanyDetailByIdGroup(companyId int) (item *CompanyDetail, err error) {
+	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile ,b.is_suspend
+            FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+			INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
+			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+			WHERE a.company_id=? AND b.product_id = 2 
+			OR (a.company_id = ? AND  cp.permission_name = '策略' ) 
+			ORDER BY b.product_id DESC  LIMIT 0,1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId, companyId).QueryRow(&item)
+	return
+}
+
+func GetCountCompanyDetailByIdGroup(companyId int) (count int, err error) {
+	sql := ` SELECT COUNT(1) AS count
+            FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+			INNER JOIN chart_permission AS cp ON cp.chart_permission_id = p.chart_permission_id
+			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+			WHERE a.company_id=? AND b.product_id = 2    OR (a.company_id = ? AND  cp.permission_name = '策略' )   `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId, companyId).QueryRow(&count)
+	return
+}
+
+//原有权限叫校验,下方更改与2021-5.18
+//func GetCompanyPermission(companyId int) (permission string, err error) {
+//	sql := ` SELECT GROUP_CONCAT(DISTINCT b.chart_permission_name  ORDER BY b.sort ASC SEPARATOR ',') AS permission
+//			FROM company_report_permission AS a
+//			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+//			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+//			WHERE  a.company_id=?
+//			AND a.product_id=2
+//            AND b.show_type=1
+//			AND c.status IN('正式','试用','永续') `
+//	o := orm.NewOrm()
+//	err = o.Raw(sql, companyId).QueryRow(&permission)
+//	return
+//}
+
+func GetCompanyPermissionByUser(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1
+			AND c.status IN('正式','试用','永续')
+			AND a.status IN('正式','试用','永续') `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
+//获取用户权限不限制状态
+func GetCompanyPermissionByUserNoStatus(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
+//获取正式权限
+func GetCompanyPermissionByUserZhengShi(companyId int) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.remark  ORDER BY b.sort ASC  SEPARATOR ',') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			WHERE  a.company_id=?
+			AND c.is_suspend=0
+            AND b.cygx_auth=1
+			AND c.status IN('正式')
+			AND a.status IN('正式') `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&permission)
+	return
+}
+
+func GetCompanyPermissionByName(name string) (permission string, err error) {
+	sql := ` SELECT GROUP_CONCAT(DISTINCT b.chart_permission_name  ORDER BY b.sort ASC SEPARATOR '/') AS permission
+			FROM company_report_permission AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			INNER JOIN company_product AS c ON a.company_id=c.company_id AND a.product_id=c.product_id
+			INNER JOIN company AS cm ON cm.company_id=c.company_id 
+			WHERE  cm.company_name=?
+			AND b.product_id = 2 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, name).QueryRow(&permission)
+	return
+}
+
+func GetCompanyDetailAllById(companyId int) (item *CompanyDetail, err error) {
+	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile 
+            FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_report_permission AS p ON p.company_id = a.company_id
+			INNER JOIN chart_permission AS cp ON cp.chart_permission_id=p.chart_permission_id
+			LEFT JOIN admin AS c ON b.seller_id=c.admin_id
+			WHERE a.company_id=? AND cp.cygx_auth=1
+			OR (a.company_id = ? AND  cp.permission_name = '策略' )` // 兼容永续状态
+	//WHERE a.company_id=?  AND b.status IN('正式','试用','永续')`
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId, companyId).QueryRow(&item)
+	return
+}
+
+//获取对应销售以及销售的手机号
+func GetSellerDetailAllByCompanyId(companyId int) (item *CompanyDetail, err error) {
+	sql := ` SELECT c.mobile ,c.real_name as seller_name
+			FROM
+			company AS a
+			INNER JOIN company_product AS b ON a.company_id = b.company_id
+			INNER JOIN admin AS c ON b.seller_id = c.admin_id 
+			WHERE
+			b.product_id = 2 
+			AND a.company_id = ? LIMIT 1`
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&item)
+	return
+}
+
+func GetCompanySellerName(companyId int) (sellerName string, err error) {
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS sellerName 
+		FROM
+			company_product AS p
+		WHERE
+			p.company_id = ? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId).QueryRow(&sellerName)
+	return
+}
+
+type CompanyProductStatus struct {
+	IsSuspend int `description:"1:暂停,0:启用"`
+}
+
+type CompanyProductDetial struct {
+	IsSuspend int    `description:"1:暂停,0:启用"`
+	Scale     string `description:"管理规模,空不填,1::50亿以下,2:50~100亿,3:100亿以上。多个用, 隔开"`
+}
+
+//获取对应销售以及销售的手机号
+func GetCompanyProductDetail(companyId, productId int) (item *CompanyProductDetial, err error) {
+	sql := ` SELECT * FROM company_product WHERE company_id = ? AND product_id = ?; `
+	o := orm.NewOrm()
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	return
+}

+ 65 - 0
models/config.go

@@ -0,0 +1,65 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxConfig struct {
+	ConfigId    int    `json:"-" orm:"column(config_id);pk"`
+	ConfigCode  string `json:"-"`
+	ConfigValue string
+	Remark      string    `json:"-"`
+	CreateTime  time.Time `json:"-"`
+}
+
+type KeyWord struct {
+	KeyWord string `description:"关键词"`
+}
+
+func GetConfigByCode(configCode string) (item *CygxConfig, err error) {
+	sql := `SELECT * FROM cygx_config WHERE config_code=? `
+	err = orm.NewOrm().Raw(sql, configCode).QueryRow(&item)
+	return
+}
+
+//更改配置信息
+func UpdateConfigByCode(configValue, countryCode string) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_config SET  config_value= ? WHERE config_code=? `
+	_, err = o.Raw(sql, configValue, countryCode).Exec()
+	return
+}
+
+type ConfigResp struct {
+	Item    *CygxConfig
+	List    []*KeyWord `description:"图表搜索推荐"`
+	ListHot []*KeyWord `description:"热搜关键词"`
+}
+
+//获取是否展示限免标签
+func GetShowSustainable() (count int, err error) {
+	o := orm.NewOrm()
+	sqlCount := ` SELECT COUNT(1) FROM cygx_config WHERE config_code= 'is_show_sustainable' AND config_value = 1 `
+	err = o.Raw(sqlCount).QueryRow(&count)
+	return
+}
+
+// 通过报告精选来获取最新的推荐搜索词
+func GetHotSearch() (permission string, err error) {
+	sql := `SELECT
+			GROUP_CONCAT( DISTINCT rl.subject_name ORDER BY rl.article_sun_id ASC SEPARATOR ',' ) AS subject_name 
+		FROM
+			cygx_report_selection_log AS rl 
+		WHERE
+			rl.article_id = (
+			SELECT
+				MAX( article_id ) 
+			FROM
+				cygx_report_selection 
+		WHERE
+			publish_status = 1)`
+	o := orm.NewOrm()
+	err = o.Raw(sql).QueryRow(&permission)
+	return
+}

+ 31 - 6
models/home.go

@@ -1,17 +1,16 @@
 package models
 
 import (
-	//"github.com/beego/beego/v2/client/orm"
+	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 type HomeArtAndChartListResp struct {
-	Paging       *paging.PagingItem
-	List         []*HomeArticle       `description:"文章列表"`
-	ChartList    []*HomeChartListResp `description:"图表列表"`
+	Paging    *paging.PagingItem
+	List      []*HomeArticle       `description:"文章列表"`
+	ChartList []*HomeChartListResp `description:"图表列表"`
 }
 
-
 type HomeArticle struct {
 	ArticleId        int    `description:"文章id"`
 	Title            string `description:"标题"`
@@ -32,6 +31,7 @@ type HomeArticle struct {
 	HttpUrl          string `description:"文章链接跳转地址"`
 	IsNeedJump       bool   `description:"是否需要跳转链接地址"`
 	Source           int    `description:"来源  1:文章, 2:图表"`
+	Annotation       string `description:"核心观点"`
 }
 
 type HomeChartListResp struct {
@@ -50,4 +50,29 @@ type HomeChartListResp struct {
 	IsTop       bool   `description:"是否置顶"`
 	NumTop      int    `description:"置顶数量"`
 	Source      int    `description:"来源  1:文章, 2:图表"`
-}
+}
+
+func GetHomeCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count
+                FROM cygx_article AS a
+                WHERE a.publish_status=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetHomeList(condition string, pars []interface{}, startSize, pageSize int) (items []*HomeArticle, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * ,(SELECT count(1) FROM cygx_article_history_record_newpv as h WHERE h.article_id = a.article_id ) as pv
+                 FROM cygx_article AS a
+                WHERE a.publish_status=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY publish_date DESC,article_id DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 8 - 0
models/user.go

@@ -128,6 +128,14 @@ type LoginResp struct {
 	CompanyName   string `description:"客户名称"`
 }
 
+type UserDetailResp struct {
+	UserId      int    `description:"用户id"`
+	Headimgurl  string `description:"用户头像"`
+	Mobile      string `description:"手机号"`
+	Email       string `description:"邮箱"`
+	CompanyName string `description:"客户名称"`
+}
+
 type CheckStatusResp struct {
 	IsBind         bool   `description:"true:需要绑定手机号或邮箱,false:不需要绑定手机号或邮箱"`
 	IsAuth         bool   `description:"true:需要授权,false:不需要授权"`

+ 10 - 1
routers/commentsRouter.go

@@ -25,7 +25,7 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:HomeController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:HomeController"],
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:MobileHomeController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:MobileHomeController"],
         beego.ControllerComments{
             Method: "List",
             Router: `/list`,
@@ -43,4 +43,13 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:UserController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:UserController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
 }

+ 5 - 0
routers/router.go

@@ -46,6 +46,11 @@ func init() {
 				&controllers.BaseResourceController{},
 			),
 		),
+		web.NSNamespace("/home",
+			web.NSInclude(
+				&controllers.MobileHomeController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 71 - 0
services/article.go

@@ -0,0 +1,71 @@
+package services
+
+import (
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"hongze/hongze_clpt/utils"
+	"html"
+	"strings"
+	"unicode/utf8"
+)
+
+func FixArticleImgUrl(body string) (contentSub string, err error) {
+	r := strings.NewReader(string(body))
+	doc, err := goquery.NewDocumentFromReader(r)
+	if err != nil {
+		fmt.Println(err)
+	}
+	doc.Find("img").Each(func(i int, s *goquery.Selection) {
+
+		src, _ := s.Attr("src")
+		if i == 0 && src != "" {
+			contentSub = src
+		}
+	})
+	return
+}
+
+//GetReportContentTextSubByarticle 解析文章内容
+func GetReportContentTextSubByarticle(content, abstract string, articleId int) (contentSub string, err error) {
+	var lenabstract int
+	//如果不是研选就这么展示
+	if articleId < utils.SummaryArticleId {
+		abstract = html.UnescapeString(abstract)
+		doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(abstract))
+		if errdoc != nil {
+			err = errdoc
+			return
+		}
+		docabstract := doc.Text()
+		lenabstract = utf8.RuneCountInString(docabstract)
+		if lenabstract >= 20 {
+			contentSub = docabstract
+			return
+		} else {
+			contentSub, err = GetReportContentTextSubNew(content)
+		}
+	} else {
+		contentSub, err = GetReportContentTextSubNew(content)
+	}
+
+	return
+
+}
+
+func GetReportContentTextSubNew(content string) (contentSub string, err error) {
+	content = html.UnescapeString(content)
+	doc, errdoc := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if errdoc != nil {
+		err = errdoc
+		return
+	}
+	docText := doc.Text()
+	bodyRune := []rune(docText)
+	bodyRuneLen := len(bodyRune)
+	body := string(bodyRune[:bodyRuneLen])
+	contentSub = body
+	contentSub = strings.Replace(body, "Powered by Froala Editor", "", -1)
+	contentSub = strings.Replace(body, "PoweredbyFroalaEditor", "", -1)
+	contentSub = strings.Replace(body, " ", "", -1)
+	return
+}

+ 61 - 0
services/user.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/utils"
+	"strings"
 )
 
 var ERR_NO_USER_RECORD = errors.New("用户关系没有入库")
@@ -44,3 +45,63 @@ func GetWxUserItemByOpenId(unionId string) (item *models.WxUserItem, err error)
 	}
 	return
 }
+
+//获取 用户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户
+func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
+
+	var permissionStr, permissionZhegnshiStr string
+	if companyId <= 1 {
+		userType = 0
+	} else {
+		total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
+		if errs != nil {
+			err = errs
+			return
+		}
+		if total == 0 {
+			userType = 0
+		} else {
+			companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+			permissionStr, errs = models.GetCompanyPermissionByUserNoStatus(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+			permissionZhegnshiStr, errs = models.GetCompanyPermissionByUserZhengShi(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+
+			//1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
+			if companyDetail.Status == "永续" {
+				userType = 1
+			} else if companyDetail.Status == "试用" {
+				userType = 5
+			} else if companyDetail.Status == "正式" {
+				if permissionStr == "专家" {
+					userType = 4
+				} else if strings.Count(permissionZhegnshiStr, "医药") == 2 && strings.Count(permissionZhegnshiStr, "消费") == 2 && strings.Count(permissionZhegnshiStr, "科技") == 2 && strings.Count(permissionZhegnshiStr, "智造") == 2 {
+					userType = 2
+				} else {
+					userType = 3
+				}
+				if userType == 3 {
+					if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
+						userType = 4
+					}
+				}
+			} else if companyDetail.Status == "冻结" {
+				userType = 6
+			} else if companyDetail.Status == "流失" {
+				userType = 7
+			}
+		}
+	}
+	permissionStrnew = permissionStr
+	return
+}

+ 3 - 0
utils/constants.go

@@ -68,4 +68,7 @@ const (
 	KE_JI_ID                         int    = 20
 	ZHI_ZAO_NAME                     string = "智造"
 	ZHI_ZAO_ID                       int    = 19
+	SummaryArticleId                 int    = 1000000
+	StrategyPlatform                 string = "https://vmp.hzinsights.com/v2/articles/"
+	DefaultHeadimgurl                string = "https://hzstatic.hzinsights.com/static/temp/20220426202204/20220426/P5qLR2zzfBdKItp3eX2Du1tvq9Ba.jpg"
 )