menu.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. Children []ClientMenu `json:"children"` // 子菜单列表
  22. }
  23. // GetClientMenusReq 获取PC交易端菜单请求参数
  24. type GetClientMenusReq struct {
  25. LoginID int `form:"loginID"`
  26. ClientType int `form:"clientType"`
  27. }
  28. // GetClientMenus 获取交易端菜单
  29. // @Summary 获取交易端菜单
  30. // @Produce json
  31. // @Security ApiKeyAuth
  32. // @Param loginID query int true "登录账号"
  33. // @Param clientType query int false "终端类型,0:PC 1:Mobile"
  34. // @Success 200 {array} ClientMenu
  35. // @Failure 500 {object} app.Response
  36. // @Router /Common/GetClientMenus [get]
  37. // @Tags 通用服务
  38. func GetClientMenus(c *gin.Context) {
  39. appG := app.Gin{C: c}
  40. // 获取请求参数
  41. var req GetClientMenusReq
  42. if err := c.ShouldBind(&req); err != nil {
  43. logger.GetLogger().Errorf("GetClientMenus parse query req: %v", err)
  44. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  45. return
  46. }
  47. // 获取菜单数据
  48. jsonFile := "pc_menu.json"
  49. if req.ClientType == 1 {
  50. // Mobile
  51. jsonFile = "mobile_menu.json"
  52. }
  53. // 读取json文件
  54. filePtr, err := os.Open(fmt.Sprintf("config/%s", jsonFile))
  55. if err != nil {
  56. // 读取文件失败
  57. logger.GetLogger().Errorf("GetClientMenus failed: %s", err.Error())
  58. appG.Response(http.StatusBadRequest, e.ERROR_CFG_FILE_FAIL, nil)
  59. return
  60. }
  61. defer filePtr.Close()
  62. var datas []interface{}
  63. // 创建Json编码器
  64. decoder := json.NewDecoder(filePtr)
  65. if err = decoder.Decode(&datas); err != nil {
  66. // Json解码失败
  67. logger.GetLogger().Errorf("GetClientMenus failed: %s", err.Error())
  68. appG.Response(http.StatusBadRequest, e.ERROR_CFG_JSON_FAIL, nil)
  69. return
  70. }
  71. rst := createMenu(datas, req.LoginID)
  72. // 查询成功
  73. logger.GetLogger().Debugln("GetPCMenus successed: %v", rst)
  74. appG.Response(http.StatusOK, e.SUCCESS, rst)
  75. }
  76. // createMenu 创建菜单数据
  77. func createMenu(datas []interface{}, loginID int) []ClientMenu {
  78. clientMenus := make([]ClientMenu, 0)
  79. for _, v := range datas {
  80. data := v.(map[string]interface{})
  81. if data["isshow"].(bool) {
  82. rulekey := data["rulekey"].(string)
  83. if len(rulekey) != 0 {
  84. // 判断是否有权限
  85. funcMenuList, err := models.GetRoleFuncMenuLists(loginID, rulekey)
  86. if err != nil {
  87. continue
  88. }
  89. if len(funcMenuList) == 0 {
  90. continue
  91. }
  92. }
  93. clientMenus = append(clientMenus, ClientMenu{
  94. Code: data["code"].(string),
  95. Title: data["title"].(string),
  96. Sort: int(data["sort"].(float64)),
  97. Type: int(data["type"].(float64)),
  98. RuleKey: data["rulekey"].(string),
  99. IsShow: data["isshow"].(bool),
  100. Children: createMenu(data["children"].([]interface{}), loginID), // 这里为什么可以这样转?
  101. })
  102. }
  103. }
  104. return clientMenus
  105. }