Menu.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package Account
  2. import (
  3. "Cold_Api/conf"
  4. "Cold_Api/logs"
  5. "Cold_Api/models"
  6. "encoding/json"
  7. "fmt"
  8. "github.com/astaxie/beego/cache"
  9. _ "github.com/astaxie/beego/cache/redis"
  10. "github.com/beego/beego/v2/adapter/orm"
  11. orm2 "github.com/beego/beego/v2/client/orm"
  12. "strconv"
  13. "time"
  14. )
  15. type Menu struct {
  16. Id int `orm:"column(ID);size(11);auto;pk"`
  17. T_mid int `orm:"size(200);null"` // 上一级 ID
  18. T_name string `orm:"size(256);null"` // 菜单标题
  19. T_permission string `orm:"size(256);null"` // 权限表示
  20. T_icon string `orm:"size(256);null"` // 图标
  21. T_sort int `orm:"size(11);default(0)"` // 排序 越小的越靠前,可以为负数
  22. T_pid int `orm:"size(2);default(0)"` // 1 进入公司后才能访问的菜单 0 公共菜单
  23. T_State int `orm:"size(2);default(1)"` // 0删除 1正常 2共有菜单
  24. Children []Menu `orm:"-"`
  25. }
  26. func (t *Menu) TableName() string {
  27. return "menu" // 数据库名称 // ************** 替换 FormulaList **************
  28. }
  29. type API struct {
  30. Id int `orm:"column(ID);size(11);auto;pk"`
  31. T_Menu_Id int `orm:"size(11);null"` // 所属菜单id 0 第一级菜单
  32. T_name string `orm:"size(256);null"` // 接口名称
  33. T_uri string `orm:"size(256);null"` // 接口路径
  34. T_method string `orm:"size(256);null"` // http请求类型 GET,POST,PUT,DELETE 等
  35. T_enable int `orm:"size(2);default(1)"` // 是否启用 0-禁用 1-启用
  36. }
  37. func (t *API) TableName() string {
  38. return "api" // 数据库名称 // ************** 替换 FormulaList **************
  39. }
  40. // var redisCache_Menu cache.Cache
  41. var redisCache_API cache.Cache
  42. var redisCache_Menu cache.Cache
  43. func init() {
  44. //注册模型
  45. orm.RegisterModel(new(Menu))
  46. orm.RegisterModel(new(API))
  47. var err error
  48. menuConfig := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  49. "redis_User_Menu", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  50. fmt.Println(menuConfig)
  51. redisCache_Menu, err = cache.NewCache("redis", menuConfig)
  52. if err != nil || redisCache_Menu == nil {
  53. logs.Error("Redis Menu init err", err)
  54. }
  55. apiConfig := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  56. "redis_User_API", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  57. fmt.Println(apiConfig)
  58. redisCache_API, err = cache.NewCache("redis", apiConfig)
  59. if err != nil || redisCache_API == nil {
  60. logs.Error("Redis API init err", err)
  61. }
  62. }
  63. // ---------------- Redis -------------------
  64. func Redis_API_Set(Power_Id int, r []API) (err error) {
  65. //json序列化
  66. str, err := json.Marshal(r)
  67. if err != nil {
  68. logs.Error("json Marshal err", err)
  69. return
  70. }
  71. err = redisCache_API.Put(strconv.Itoa(Power_Id), str, 24*time.Hour)
  72. if err != nil {
  73. logs.Error("Redis_API_Set", "set key:", strconv.Itoa(Power_Id), ",value:", str, err)
  74. }
  75. return
  76. }
  77. func Redis_API_Get(key string) (r []API, is bool) {
  78. if redisCache_API.IsExist(key) {
  79. //println("找到key:",key)
  80. v := redisCache_API.Get(key)
  81. err := json.Unmarshal(v.([]byte), &r)
  82. if err != nil {
  83. logs.Error("json Unmarshal err", err)
  84. return []API{}, false
  85. }
  86. return r, true
  87. }
  88. //println("没有 找到key:",key)
  89. return []API{}, false
  90. }
  91. func Redis_API_DelK(key string) (err error) {
  92. err = redisCache_API.Delete(key)
  93. if err != nil {
  94. logs.Error("Redis_API_DelK", err)
  95. }
  96. return
  97. }
  98. func Redis_Munu_Set(Power_Id, T_pid int, r []Menu) (err error) {
  99. //json序列化
  100. str, err := json.Marshal(r)
  101. if err != nil {
  102. fmt.Println(err)
  103. return
  104. }
  105. keys := strconv.Itoa(Power_Id) + "-Pid"
  106. if T_pid == 0 {
  107. keys = strconv.Itoa(Power_Id)
  108. }
  109. err = redisCache_Menu.Put(keys, str, 30*24*time.Hour)
  110. if err != nil {
  111. logs.Error("set key:", strconv.Itoa(Power_Id)+"|"+strconv.Itoa(T_pid), ",value:", str, err)
  112. }
  113. return
  114. }
  115. func Redis_Menu_Get(Power_Id, T_pid int) (r []Menu, is bool) {
  116. key := strconv.Itoa(Power_Id) + "-Pid"
  117. if T_pid == 0 {
  118. key = strconv.Itoa(Power_Id)
  119. }
  120. if redisCache_Menu.IsExist(key) {
  121. //println("找到key:",key)
  122. v := redisCache_Menu.Get(key)
  123. err := json.Unmarshal(v.([]byte), &r)
  124. if err != nil {
  125. logs.Error("json Unmarshal err", err)
  126. return []Menu{}, false
  127. }
  128. return r, true
  129. }
  130. //println("没有 找到key:",key)
  131. return []Menu{}, false
  132. }
  133. func Redis_Menu_DelK(Power_Id int) (err error) {
  134. err = redisCache_Menu.Delete(strconv.Itoa(Power_Id))
  135. if err != nil {
  136. logs.Error("Redis_Menu_DelK", err)
  137. return
  138. }
  139. err = redisCache_Menu.Delete(strconv.Itoa(Power_Id) + "-Pid")
  140. if err != nil {
  141. logs.Error("Redis_Menu_DelK Pid", err)
  142. }
  143. return
  144. }
  145. // ---------------- 特殊方法 -------------------
  146. // 添加
  147. func Add_Menu(m Menu) (id int64, err error) {
  148. o := orm.NewOrm()
  149. // 插入菜单信息
  150. id, err = o.Insert(&m)
  151. if err != nil {
  152. fmt.Println(err)
  153. }
  154. return id, err
  155. }
  156. // 修改
  157. func Update_Menu(m Menu, cols ...string) bool {
  158. o := orm.NewOrm()
  159. if num, err := o.Update(&m, cols...); err == nil {
  160. fmt.Println("Number of records updated in database:", num)
  161. return true
  162. }
  163. return false
  164. }
  165. // 删除
  166. func Delete_Menu(m Menu) bool {
  167. o := orm.NewOrm()
  168. if num, err := o.Delete(&m); err == nil {
  169. fmt.Println("Number of records updated in database:", num)
  170. } else {
  171. return false
  172. }
  173. return true
  174. }
  175. // 获取 ById
  176. func Read_Menu_ById(Id int) (r Menu, e error) {
  177. o := orm.NewOrm()
  178. qs := o.QueryTable(new(Menu))
  179. e = qs.Filter("Id", Id).One(&r)
  180. return r, e
  181. }
  182. // 获取列表
  183. func Read_Menu_Bind_List(Power_Id int, Bind_Menu string, T_pid int) (maps []Menu) {
  184. if r, is := Redis_Menu_Get(Power_Id, T_pid); is {
  185. return r
  186. }
  187. o := orm.NewOrm()
  188. // 也可以直接使用 Model 结构体作为表名
  189. qs := o.QueryTable(new(Menu))
  190. cond := orm.NewCondition()
  191. cond = cond.And("T_State__gt", 0)
  192. if T_pid == 0 {
  193. cond = cond.And("T_pid", 0)
  194. }
  195. if Bind_Menu == "*" {
  196. _, err := qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort", "Id").All(&maps)
  197. if err != nil {
  198. logs.Error("Read_Menu_Bind_List", err)
  199. return
  200. }
  201. m := Menu_Call(maps, 0)
  202. Redis_Munu_Set(Power_Id, T_pid, m)
  203. return m
  204. }
  205. list := models.SplitStringToIntIds(Bind_Menu, "M")
  206. AllIds := list
  207. if err := recursiveMenu(T_pid, list, &AllIds); err != nil {
  208. return maps
  209. }
  210. cond = cond.And("Id__in", models.IntIdsDistinct(AllIds)).Or("T_State", 2)
  211. _, err := qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort", "Id").All(&maps)
  212. if err != nil {
  213. logs.Error("Read_Menu_Bind_List", err)
  214. return
  215. }
  216. m := Menu_Call(maps, 0)
  217. Redis_Munu_Set(Power_Id, T_pid, m)
  218. return m
  219. }
  220. // 获取MenuIds下父id
  221. func recursiveMenu(T_pid int, MenuIds []int, AllIds *[]int) error {
  222. if len(MenuIds) == 0 {
  223. return nil
  224. }
  225. var subMenus []Menu
  226. o := orm.NewOrm()
  227. qs := o.QueryTable(new(Menu))
  228. cond := orm.NewCondition()
  229. if T_pid == 0 {
  230. cond = cond.And("T_pid", 0)
  231. }
  232. cond = cond.And("Id__in", MenuIds)
  233. _, err := qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort", "Id").All(&subMenus)
  234. if err != nil {
  235. logs.Error("recursiveMenu", err)
  236. return err
  237. }
  238. subIds := make([]int, 0)
  239. for _, menu := range subMenus {
  240. if menu.T_mid != 0 {
  241. subIds = append(subIds, menu.T_mid)
  242. *AllIds = append(*AllIds, menu.T_mid)
  243. }
  244. }
  245. return recursiveMenu(T_pid, subIds, AllIds)
  246. }
  247. func Read_Menu_List_All() (maps []Menu, menu_ids []int) {
  248. o := orm.NewOrm()
  249. // 也可以直接使用 Model 结构体作为表名
  250. qs := o.QueryTable(new(Menu))
  251. _, err := qs.Filter("T_State", 1).OrderBy("Id", "-T_sort").All(&maps)
  252. if err != nil {
  253. logs.Error("Read_Menu_List_All", err)
  254. return
  255. }
  256. for _, v := range maps {
  257. menu_ids = append(menu_ids, v.Id)
  258. }
  259. m := Menu_Call(maps, 0)
  260. return m, menu_ids
  261. }
  262. // Menu_Call 构建菜单树
  263. // [{"Id":70,"T_mid":0,"T_name":"工单管理","T_permission":"workorder","T_sort":0,"T_pid":1,"T_bind":false,"Children":[{"Id":71,"T_mid":70,"T_name":"工单列表","T_permission":"workorder:list","T_sort":0,"T_pid":1,"T_bind":false,"Children":[]}]}]
  264. func Menu_Call(list []Menu, parentId int) []Menu {
  265. res := make([]Menu, 0)
  266. for _, v := range list {
  267. if v.T_mid == parentId {
  268. v.Children = Menu_Call(list, v.Id)
  269. res = append(res, v)
  270. }
  271. }
  272. return res
  273. }
  274. // 添加
  275. func Add_API(m API) (id int64, err error) {
  276. o := orm.NewOrm()
  277. id, err = o.Insert(&m)
  278. if err != nil {
  279. fmt.Println(err)
  280. }
  281. m.Id = int(id)
  282. return id, err
  283. }
  284. // 批量添加
  285. func Add_Multi_API(m []API) (id int64, err error) {
  286. o := orm.NewOrm()
  287. id, err = o.InsertMulti(len(m), &m)
  288. if err != nil {
  289. fmt.Println(err)
  290. }
  291. return id, err
  292. }
  293. // 修改
  294. func Update_API(m API, cols ...string) bool {
  295. o := orm.NewOrm()
  296. if num, err := o.Update(&m, cols...); err == nil {
  297. fmt.Println("Number of records updated in database:", num)
  298. return true
  299. }
  300. return false
  301. }
  302. // 删除
  303. func Delete_API(m API) bool {
  304. o := orm.NewOrm()
  305. if num, err := o.Delete(&m); err == nil {
  306. fmt.Println("Number of records updated in database:", num)
  307. } else {
  308. return false
  309. }
  310. return true
  311. }
  312. // 批量删除
  313. func Delete_Multi_API(m []API) bool {
  314. o := orm.NewOrm()
  315. if num, err := o.Delete(&m); err == nil {
  316. fmt.Println("Number of records updated in database:", num)
  317. } else {
  318. return false
  319. }
  320. return true
  321. }
  322. // 获取 ById
  323. func Read_API_ById(Id int) (r API, e error) {
  324. o := orm.NewOrm()
  325. qs := o.QueryTable(new(API))
  326. e = qs.Filter("Id", Id).Filter("T_State", 1).One(&r)
  327. return r, e
  328. }
  329. // 获取列表
  330. func Read_API_List_ByPower_Id(Power_Id int, Menu_Bind string) (maps []API) {
  331. if r, is := Redis_API_Get(strconv.Itoa(Power_Id)); is {
  332. //println("Redis_Get OK")
  333. return r
  334. }
  335. o := orm.NewOrm()
  336. // 也可以直接使用 Model 结构体作为表名
  337. qs := o.QueryTable(new(API))
  338. list := models.SplitStringIds(Menu_Bind, "M")
  339. _, err := qs.Filter("T_Menu_Id__in", list).All(&maps)
  340. if err != nil {
  341. logs.Error("Read_API_List_ByPower_Id", err)
  342. return
  343. }
  344. Redis_API_Set(Power_Id, maps)
  345. return maps
  346. }
  347. func Read_API_List_By_Menu_Bind(Menu_Bind string) (maps []API) {
  348. o := orm.NewOrm()
  349. // 也可以直接使用 Model 结构体作为表名
  350. qs := o.QueryTable(new(API))
  351. list := models.SplitStringIds(Menu_Bind, "M")
  352. _, err := qs.Filter("T_Menu_Id__in", list).All(&maps)
  353. if err != nil {
  354. logs.Error("Read_API_List_By_Menu_Bind", err)
  355. }
  356. return maps
  357. }