menu.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package common
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "mtp2_if/global/app"
  6. "mtp2_if/global/e"
  7. "mtp2_if/logger"
  8. "mtp2_if/models"
  9. "net/http"
  10. "os"
  11. "github.com/gin-gonic/gin"
  12. )
  13. // ClientMenu 客户端菜单
  14. type ClientMenu struct {
  15. Code string `json:"code"` // ID
  16. Title string `json:"title"` // 标题
  17. Sort int `json:"sort"` // 排序
  18. Type int `json:"type"` // 类型,1:菜单 2:按钮
  19. RuleKey string `json:"rulekey"` // 对应权限主键,对应FUNCMENULIST表RESOURCECODE
  20. IsShow bool `json:"isshow"` // 是否显示
  21. URL string `json:"url"` // URL
  22. Remark string `json:"remark"` // 备注
  23. Children []ClientMenu `json:"children"` // 子菜单列表
  24. }
  25. // GetClientMenusReq 获取PC交易端菜单请求参数
  26. type GetClientMenusReq struct {
  27. LoginID int `form:"loginID" binding:"required"`
  28. ClientType int `form:"clientType"`
  29. Name string `form:"name"`
  30. }
  31. // GetClientMenus 获取交易端菜单
  32. // @Summary 获取交易端菜单
  33. // @Produce json
  34. // @Security ApiKeyAuth
  35. // @Param loginID query int true "登录账号"
  36. // @Param clientType query int false "终端类型,0:PCWEB 1:Mobile,不传默认返回PC端数据"
  37. // @Param name query string false "分支名称,ermcp:风管云平台 pingan:平安期货,不传默认返回风管云平台"
  38. // @Success 200 {array} ClientMenu
  39. // @Failure 500 {object} app.Response
  40. // @Router /Common/GetClientMenus [get]
  41. // @Tags 通用服务
  42. func GetClientMenus(c *gin.Context) {
  43. appG := app.Gin{C: c}
  44. // 获取请求参数
  45. var req GetClientMenusReq
  46. if err := c.ShouldBind(&req); err != nil {
  47. logger.GetLogger().Errorf("GetClientMenus parse query req: %v", err)
  48. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  49. return
  50. }
  51. // 获取菜单数据
  52. jsonFile := "pc_menu.json"
  53. if req.ClientType == 1 {
  54. // Mobile
  55. jsonFile = "mobile_menu.json"
  56. }
  57. // 获取分支名称
  58. if len(req.Name) > 0 {
  59. if req.ClientType == 0 {
  60. // 目前只支持PCWEB
  61. jsonFile = fmt.Sprintf("pcweb_menu/pcweb_menu_%s.json", req.Name)
  62. }
  63. }
  64. // 读取json文件
  65. // 21-08-15 增加OEM菜单文件支持功能
  66. filePtr, err := os.Open(fmt.Sprintf("config/%s", jsonFile))
  67. if err != nil {
  68. // 读取文件失败
  69. logger.GetLogger().Errorf("GetClientMenus failed: %s", err.Error())
  70. appG.Response(http.StatusBadRequest, e.ERROR_CFG_FILE_FAIL, nil)
  71. return
  72. }
  73. defer filePtr.Close()
  74. var datas []interface{}
  75. // 创建Json编码器
  76. decoder := json.NewDecoder(filePtr)
  77. if err = decoder.Decode(&datas); err != nil {
  78. // Json解码失败
  79. logger.GetLogger().Errorf("GetClientMenus failed: %s", err.Error())
  80. appG.Response(http.StatusBadRequest, e.ERROR_CFG_JSON_FAIL, nil)
  81. return
  82. }
  83. rst := createMenu(datas, req.LoginID)
  84. r := make([]ClientMenu, 0)
  85. if req.ClientType == 0 {
  86. // PC 去掉第一层没有子项的
  87. for _, v := range rst {
  88. if len(v.Children) > 0 {
  89. r = append(r, v)
  90. }
  91. }
  92. } else {
  93. r = rst
  94. }
  95. // 查询成功
  96. logger.GetLogger().Debugln("GetPCMenus successed: %v", r)
  97. appG.Response(http.StatusOK, e.SUCCESS, r)
  98. }
  99. // createMenu 创建菜单数据
  100. func createMenu(datas []interface{}, loginID int) []ClientMenu {
  101. clientMenus := make([]ClientMenu, 0)
  102. for _, v := range datas {
  103. data := v.(map[string]interface{})
  104. if data["isshow"].(bool) {
  105. rulekey := data["rulekey"].(string)
  106. if len(rulekey) != 0 {
  107. // 判断是否有权限
  108. funcMenuList, err := models.GetErmcpRoleFuncMenuLists(loginID, rulekey)
  109. if err != nil {
  110. continue
  111. }
  112. if len(funcMenuList) == 0 {
  113. continue
  114. }
  115. }
  116. item := ClientMenu{
  117. Code: data["code"].(string),
  118. Title: data["title"].(string),
  119. Sort: int(data["sort"].(float64)),
  120. Type: int(data["type"].(float64)),
  121. RuleKey: data["rulekey"].(string),
  122. IsShow: data["isshow"].(bool),
  123. Children: createMenu(data["children"].([]interface{}), loginID), // TODO: - 这里为什么可以这样转?
  124. }
  125. if data["url"] != nil {
  126. item.URL = data["url"].(string)
  127. }
  128. if data["remark"] != nil {
  129. item.Remark = data["remark"].(string)
  130. }
  131. clientMenus = append(clientMenus, item)
  132. }
  133. }
  134. return clientMenus
  135. }