system_service.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
  7. "gitee.com/xuyiping_admin/pkg/jwt"
  8. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  9. "gitee.com/xuyiping_admin/pkg/tool"
  10. "gitee.com/xuyiping_admin/pkg/xerr"
  11. "go.uber.org/zap"
  12. "kpt-calf-feed/model"
  13. "net/http"
  14. "sort"
  15. "strings"
  16. "time"
  17. "gorm.io/gorm"
  18. )
  19. const CurrentUserName = "userName"
  20. // Auth 用户登录
  21. func (s *StoreEntry) Auth(ctx context.Context, auth *operationPb.UserAuthData) (*operationPb.SystemToken, error) {
  22. systemUser := &model.SystemUser{}
  23. if err := s.DB.Where("name = ?", auth.UserName).Find(systemUser).Error; err != nil {
  24. return nil, xerr.WithStack(err)
  25. }
  26. if systemUser.Password != auth.Password {
  27. return nil, xerr.Customf("密码错误,来自用户:%s", auth.UserName)
  28. }
  29. if systemUser.IsShow == operationPb.IsShow_NO {
  30. return nil, xerr.Customf("该账号已被禁用,请联系管理员")
  31. }
  32. jwtToken := jwt.NewJWTTokenGen(s.Cfg.AppName, s.Cfg.JwtTokenKeyConfig.PrivateKey)
  33. token, err := jwtToken.GenerateToken(systemUser.Name, s.Cfg.JwtExpireTime)
  34. if err != nil {
  35. return nil, xerr.WithStack(err)
  36. }
  37. if token == "" {
  38. return nil, xerr.Custom("获取token错误")
  39. }
  40. return &operationPb.SystemToken{
  41. Code: http.StatusOK,
  42. Msg: "ok",
  43. Data: &operationPb.TokenData{Token: token},
  44. }, nil
  45. }
  46. func (s *StoreEntry) GetCurrentUserName(ctx context.Context) (string, error) {
  47. userNameInter := ctx.Value(CurrentUserName)
  48. if userNameInter == nil {
  49. return "", xerr.Customf("cannot userName")
  50. }
  51. if userName, ok := userNameInter.(string); ok {
  52. return userName, nil
  53. } else {
  54. return "", xerr.Customf("waring userName")
  55. }
  56. }
  57. // GetUserInfo 获取用户信息
  58. func (s *StoreEntry) GetUserInfo(ctx context.Context, token string) (*operationPb.UserAuth, error) {
  59. systemUser := &model.SystemUser{}
  60. userName, err := s.GetCurrentUserName(ctx)
  61. if err != nil {
  62. return nil, xerr.WithStack(err)
  63. }
  64. if err = s.DB.Where("name = ?", userName).First(systemUser).Error; err != nil {
  65. return nil, xerr.WithStack(err)
  66. }
  67. systemRole := make([]*model.SystemRole, 0)
  68. return systemUser.SystemUserFormat(systemRole, nil), nil
  69. }
  70. // CreateSystemUser 创建系统用户
  71. func (s *StoreEntry) CreateSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error {
  72. systemUsers := &model.SystemUser{
  73. Name: req.Name,
  74. EmployeeName: req.EmployeeName,
  75. Phone: req.Phone,
  76. Password: tool.Md5String(model.InitManagerPassword),
  77. CreateUser: req.CreateUser,
  78. IsShow: operationPb.IsShow_OK,
  79. IsDelete: operationPb.IsShow_OK,
  80. }
  81. systemUsers.SystemUserRoleFormat(req)
  82. if err := s.DB.Create(systemUsers).Error; err != nil {
  83. return xerr.WithStack(err)
  84. }
  85. return nil
  86. }
  87. // SearchSystemUserList 查询系统用户
  88. func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *operationPb.SearchUserRequest) (*operationPb.SearchUserResponse, error) {
  89. systemUserList := make([]*model.SystemUser, 0)
  90. var count int64 = 0
  91. pref := s.DB.Model(new(model.SystemUser)).Where("is_delete = ?", operationPb.IsShow_OK)
  92. if req.Name != "" {
  93. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  94. }
  95. if req.EmployeeName != "" {
  96. pref.Where("employee_name like ?", fmt.Sprintf("%s%s%s", "%", req.EmployeeName, "%"))
  97. }
  98. if req.IsShow > 0 {
  99. pref.Where("is_show = ?", req.IsShow)
  100. }
  101. if req.CreatedStartTime > 0 && req.CreatedEndTime > 0 && req.CreatedStartTime <= req.CreatedEndTime {
  102. pref.Where("created_at BETWEEN ? AND ?", req.CreatedStartTime, req.CreatedEndTime)
  103. }
  104. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  105. Find(&systemUserList).Debug().Error; err != nil {
  106. return nil, xerr.WithStack(err)
  107. }
  108. roleList, err := s.SearchSystemRoleListByIds(ctx, []int64{})
  109. if err != nil {
  110. return nil, xerr.WithStack(err)
  111. }
  112. return &operationPb.SearchUserResponse{
  113. Code: http.StatusOK,
  114. Msg: "ok",
  115. Data: &operationPb.SearchUserData{
  116. Page: req.Pagination.Page,
  117. Total: int32(count),
  118. PageSize: req.Pagination.PageSize,
  119. List: model.SystemUserSlice(systemUserList).ToPB(roleList),
  120. },
  121. }, nil
  122. }
  123. // EditSystemUser 编辑用户
  124. func (s *StoreEntry) EditSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error {
  125. systemUser := &model.SystemUser{Id: int64(req.Id)}
  126. if err := s.DB.First(systemUser).Error; err != nil {
  127. if errors.Is(err, gorm.ErrRecordNotFound) {
  128. return xerr.Custom("该数据不存在!")
  129. }
  130. return xerr.WithStack(err)
  131. }
  132. updateData := &model.SystemUser{
  133. Name: req.Name,
  134. EmployeeName: req.EmployeeName,
  135. Phone: req.Phone,
  136. }
  137. updateData.SystemUserRoleFormat(req)
  138. if err := s.DB.Model(new(model.SystemUser)).Omit("is_show", "password", "is_delete", "create_user").
  139. Where("id = ?", systemUser.Id).
  140. Updates(updateData).Error; err != nil {
  141. return xerr.WithStack(err)
  142. }
  143. return nil
  144. }
  145. // DeleteSystemUser 删除系统用户
  146. func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
  147. systemUser := &model.SystemUser{
  148. Id: userId,
  149. }
  150. if err := s.DB.First(systemUser).Error; err != nil {
  151. if errors.Is(err, gorm.ErrRecordNotFound) {
  152. return xerr.Custom("该用户不存在")
  153. }
  154. return xerr.WithStack(err)
  155. }
  156. if err := s.DB.Model(systemUser).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  157. return xerr.WithStack(err)
  158. }
  159. return nil
  160. }
  161. // ResetPasswordSystemUser 重置系统用户密码
  162. func (s *StoreEntry) ResetPasswordSystemUser(ctx context.Context, userId int64) error {
  163. systemUser := &model.SystemUser{
  164. Id: userId,
  165. }
  166. if err := s.DB.First(systemUser).Error; err != nil {
  167. if errors.Is(err, gorm.ErrRecordNotFound) {
  168. return xerr.Custom("该用户不存在")
  169. }
  170. return xerr.WithStack(err)
  171. }
  172. if err := s.DB.Model(systemUser).Update("password", tool.Md5String(model.InitManagerPassword)).Error; err != nil {
  173. return xerr.WithStack(err)
  174. }
  175. return nil
  176. }
  177. // DetailsSystemUser 系统用户详情
  178. func (s *StoreEntry) DetailsSystemUser(ctx context.Context, userId int64) (*operationPb.UserDetails, error) {
  179. systemUser := &model.SystemUser{
  180. Id: userId,
  181. }
  182. if err := s.DB.First(systemUser).Error; err != nil {
  183. if errors.Is(err, gorm.ErrRecordNotFound) {
  184. return nil, xerr.Custom("该用户不存在")
  185. }
  186. return nil, xerr.WithStack(err)
  187. }
  188. return &operationPb.UserDetails{
  189. Code: http.StatusOK,
  190. Msg: "ok",
  191. Data: systemUser.ToPb(),
  192. }, nil
  193. }
  194. // IsShowSystemUser 用户是否启用
  195. func (s *StoreEntry) IsShowSystemUser(ctx context.Context, req *operationPb.IsShowSystemUserRequest) error {
  196. systemUser := &model.SystemUser{
  197. Id: int64(req.UserId),
  198. }
  199. if err := s.DB.First(systemUser).Error; err != nil {
  200. if errors.Is(err, gorm.ErrRecordNotFound) {
  201. return xerr.Custom("该用户不存在")
  202. }
  203. return xerr.WithStack(err)
  204. }
  205. if err := s.DB.Model(systemUser).Update("is_show", req.IsShow).Error; err != nil {
  206. return xerr.WithStack(err)
  207. }
  208. return nil
  209. }
  210. // GetSystemUserPermissions 返回系统用户相关菜单权限
  211. func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error) {
  212. // 解析token
  213. userName, err := s.GetCurrentUserName(ctx)
  214. if err != nil {
  215. return nil, xerr.WithStack(err)
  216. }
  217. // 根据用户token获取用户数据
  218. systemUser := &model.SystemUser{Name: userName}
  219. if err = s.DB.Where("name = ?", userName).First(systemUser).Error; err != nil {
  220. if errors.Is(err, gorm.ErrRecordNotFound) {
  221. return nil, xerr.Custom("该用户数据不存在")
  222. }
  223. return nil, xerr.WithStack(err)
  224. }
  225. roleIds := systemUser.SystemUserRoleToSlice()
  226. // 获取用户角色数据
  227. systemRoles := make([]*model.SystemRole, 0)
  228. if err = s.DB.Where("is_show = ?", operationPb.IsShow_OK).Find(&systemRoles, roleIds).Error; err != nil {
  229. return nil, xerr.WithStack(err)
  230. }
  231. systemAllPermissionsList := &SystemAllPermissionsList{
  232. MenuList: make([]*model.SystemMenuPermissions, 0),
  233. }
  234. for _, role := range systemRoles {
  235. item := s.GetSystemAllPermissionsList(ctx, role.Id)
  236. systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)
  237. }
  238. systemAllPermissionsList.SystemUserMenuPermissionsUnDuplicate()
  239. menuList, err := s.GetMenuList(ctx, systemAllPermissionsList.MenuList)
  240. if err != nil {
  241. return nil, xerr.WithStack(err)
  242. }
  243. return s.SystemPermissionsFormatPb(menuList), nil
  244. }
  245. func (s *StoreEntry) SystemPermissionsFormatPb(menuList []*model.SystemMenu) *operationPb.SystemUserMenuPermissions {
  246. systemUserMenuPermissions := &operationPb.SystemUserMenuPermissions{
  247. Code: http.StatusOK,
  248. Msg: "ok",
  249. Data: &operationPb.SystemUserMenuData{
  250. PastureList: make([]*operationPb.AddPastureRequest, 0),
  251. MenuList: make([]*operationPb.AddMenuRequest, 0),
  252. MobileList: make([]*operationPb.AddMobileRequest, 0),
  253. MenuButtonsPath: make([]*operationPb.MenuButtonsPath, 0),
  254. },
  255. }
  256. // TODO 后面优化成递归算法
  257. level := make(map[int32][]*operationPb.AddMenuRequest, 0)
  258. for _, menu := range menuList {
  259. if _, ok := level[menu.Level]; !ok {
  260. level[menu.Level] = make([]*operationPb.AddMenuRequest, 0)
  261. }
  262. level[menu.Level] = append(level[menu.Level], &operationPb.AddMenuRequest{
  263. Id: int32(menu.Id),
  264. Name: menu.Name,
  265. ParentId: int32(menu.ParentId),
  266. MenuType: menu.MenuType,
  267. Title: menu.Title,
  268. Path: menu.Path,
  269. IsShow: menu.IsShow,
  270. Component: menu.Component,
  271. Icon: menu.Icon,
  272. Sort: menu.Sort,
  273. Redirect: menu.Redirect,
  274. CreatedAt: int32(menu.CreatedAt),
  275. CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Format(model.LayoutTime),
  276. Level: menu.Level,
  277. Affix: true,
  278. KeepAlive: true,
  279. Children: make([]*operationPb.AddMenuRequest, 0),
  280. })
  281. if menu.Level == model.Level3 {
  282. systemUserMenuPermissions.Data.MenuButtonsPath = append(systemUserMenuPermissions.Data.MenuButtonsPath, &operationPb.MenuButtonsPath{
  283. Path: menu.Path,
  284. MenuId: int32(menu.Id),
  285. })
  286. }
  287. }
  288. level2IsShow := make([]int32, 0)
  289. for _, leve2Data := range level[model.Level2] {
  290. for _, leve3Data := range level[model.Level3] {
  291. if leve3Data.ParentId == leve2Data.Id && strings.Contains(leve3Data.Path, ":page") {
  292. level2IsShow = append(level2IsShow, leve2Data.Id)
  293. }
  294. if leve3Data.ParentId == leve2Data.Id {
  295. if leve2Data.Children == nil {
  296. leve2Data.Children = make([]*operationPb.AddMenuRequest, 0)
  297. }
  298. leve2Data.Children = append(leve2Data.Children, leve3Data)
  299. }
  300. }
  301. }
  302. sort.SliceStable(level[model.Level2], func(i, j int) bool {
  303. return level[model.Level2][i].Sort > level[model.Level2][j].Sort
  304. })
  305. for _, leve2Data := range level[model.Level2] {
  306. var info bool
  307. for _, v := range level2IsShow {
  308. if v == leve2Data.Id {
  309. info = true
  310. }
  311. }
  312. if !info {
  313. continue
  314. }
  315. for _, leve1Data := range level[model.Level1] {
  316. if leve2Data.ParentId == leve1Data.Id {
  317. if leve1Data.Children == nil {
  318. leve1Data.Children = make([]*operationPb.AddMenuRequest, 0)
  319. }
  320. leve1Data.Children = append(leve1Data.Children, leve2Data)
  321. }
  322. }
  323. }
  324. sort.SliceStable(level[model.Level1], func(i, j int) bool {
  325. return level[model.Level1][i].Sort > level[model.Level1][j].Sort
  326. })
  327. systemUserMenuPermissions.Data.MenuList = level[model.Level1]
  328. return systemUserMenuPermissions
  329. }
  330. // CreateSystemRole 添加角色
  331. func (s *StoreEntry) CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  332. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  333. // 创建角色数据
  334. role := model.NewSystemRole(req)
  335. if err := tx.Create(role).Error; err != nil {
  336. return xerr.WithStack(err)
  337. }
  338. // 创建角色菜单权限数据
  339. if len(req.MenuId) > 0 {
  340. menuPermissions := model.NewSystemMenuPermissions(role.Id, req.MenuId)
  341. if err := tx.Create(menuPermissions).Error; err != nil {
  342. return xerr.WithStack(err)
  343. }
  344. }
  345. return nil
  346. }); err != nil {
  347. return xerr.WithStack(err)
  348. }
  349. return nil
  350. }
  351. // EditSystemRole 编辑角色
  352. func (s *StoreEntry) EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  353. role := &model.SystemRole{Id: int64(req.Id)}
  354. if err := s.DB.First(role).Error; err != nil {
  355. if errors.Is(err, gorm.ErrRecordNotFound) {
  356. return xerr.Custom("该数据不存在")
  357. }
  358. return xerr.WithStack(err)
  359. }
  360. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  361. updateSystemRole := model.NewSystemRole(req)
  362. if err := tx.Omit("is_show").
  363. Where("id = ?", role.Id).
  364. Updates(updateSystemRole).Error; err != nil {
  365. return xerr.WithStack(err)
  366. }
  367. // 更新菜单权限关系表
  368. menuIds := req.MenuId
  369. if err := tx.Model(new(model.SystemMenuPermissions)).
  370. Where("role_id = ?", req.Id).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
  371. return xerr.WithStack(err)
  372. }
  373. newSystemMenuPermissions := model.NewSystemMenuPermissions(int64(req.Id), menuIds)
  374. if err := tx.Create(newSystemMenuPermissions).Error; err != nil {
  375. return xerr.WithStack(err)
  376. }
  377. return nil
  378. }); err != nil {
  379. return xerr.WithStack(err)
  380. }
  381. return nil
  382. }
  383. // DeleteSystemRole 删除系统角色
  384. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  385. systemRole := &model.SystemRole{
  386. Id: roleId,
  387. }
  388. if err := s.DB.First(systemRole).Error; err != nil {
  389. if errors.Is(err, gorm.ErrRecordNotFound) {
  390. return xerr.Custom("该数据不存在")
  391. }
  392. return xerr.WithStack(err)
  393. }
  394. if err := s.DB.Model(systemRole).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
  395. return xerr.WithStack(err)
  396. }
  397. return nil
  398. }
  399. // SearchSystemRoleList 查询系统角色
  400. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*operationPb.SearchRoleResponse, error) {
  401. systemRoleList := make([]*model.SystemRole, 0)
  402. var count int64 = 0
  403. pref := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK)
  404. if req.Name != "" {
  405. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  406. }
  407. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).
  408. Offset(int(req.Pagination.PageOffset)).Find(&systemRoleList).Error; err != nil {
  409. return nil, xerr.WithStack(err)
  410. }
  411. permissionsMenuMap := make(map[int64][]*model.SystemMenu, 0)
  412. for _, role := range systemRoleList {
  413. systemMenuList := make([]*model.SystemMenu, 0)
  414. if err := s.DB.Table(new(model.SystemMenu).TableName()).Select(fmt.Sprintf("%s.*", new(model.SystemMenu).TableName())).
  415. Joins(fmt.Sprintf("left join %s on %s = %s and %s", new(model.SystemMenuPermissions).TableName(), fmt.Sprintf("%s.menu_id", new(model.SystemMenuPermissions).TableName()),
  416. fmt.Sprintf("%s.id", new(model.SystemMenu).TableName()), fmt.Sprintf("%s.is_show = %d", new(model.SystemMenuPermissions).TableName(), operationPb.IsShow_OK))).
  417. Where(fmt.Sprintf("%s.role_id = ?", new(model.SystemMenuPermissions).TableName()), role.Id).Where(fmt.Sprintf("%s.level = ?", new(model.SystemMenu).TableName()), model.Level2).
  418. Find(&systemMenuList).Error; err != nil {
  419. zaplog.Error("SearchSystemRoleList", zap.Any("SystemMenuPermissions", err))
  420. }
  421. permissionsMenuMap[role.Id] = systemMenuList
  422. }
  423. return &operationPb.SearchRoleResponse{
  424. Code: http.StatusOK,
  425. Msg: "ok",
  426. Data: &operationPb.SearchRoleData{
  427. Page: req.Pagination.Page,
  428. Total: int32(count),
  429. PageSize: req.Pagination.PageSize,
  430. List: model.SystemRoleSlice(systemRoleList).ToPB(permissionsMenuMap),
  431. },
  432. }, nil
  433. }
  434. // SearchSystemRoleListByIds 根据id查询角色列表
  435. func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, ids []int64) ([]*model.SystemRole, error) {
  436. systemRoleList := make([]*model.SystemRole, 0)
  437. if err := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK).Find(&systemRoleList, ids).Error; err != nil {
  438. return nil, xerr.WithStack(err)
  439. }
  440. return systemRoleList, nil
  441. }
  442. // GetRolePermissions 查询系统角色权限
  443. func (s *StoreEntry) GetRolePermissions(ctx context.Context, roleId int64) (*operationPb.RolePermissionsList, error) {
  444. systemRole := &model.SystemRole{
  445. Id: roleId,
  446. }
  447. if err := s.DB.First(systemRole).Error; err != nil {
  448. if errors.Is(err, gorm.ErrRecordNotFound) {
  449. return nil, xerr.Custom("该数据不存在")
  450. }
  451. return nil, xerr.WithStack(err)
  452. }
  453. systemAllPermissionsList := &SystemAllPermissionsList{
  454. MenuList: make([]*model.SystemMenuPermissions, 0),
  455. }
  456. item := s.GetSystemAllPermissionsList(ctx, systemRole.Id)
  457. systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)
  458. return s.AllPermissionsListToRolePermissions(systemAllPermissionsList), nil
  459. }
  460. // CreateSystemMenu 添加系统菜单权限
  461. func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  462. systemMenu := model.NewSystemMenu(req)
  463. if err := s.DB.Create(systemMenu).Error; err != nil {
  464. return xerr.WithStack(err)
  465. }
  466. return nil
  467. }
  468. // EditSystemMenu 编辑系统菜单权限
  469. func (s *StoreEntry) EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  470. systemMenu := &model.SystemMenu{Id: int64(req.Id)}
  471. if err := s.DB.First(systemMenu).Error; err != nil {
  472. if errors.Is(err, gorm.ErrRecordNotFound) {
  473. return xerr.Custom("该数据不存在!")
  474. }
  475. return xerr.WithStack(err)
  476. }
  477. updateData := &model.SystemMenu{
  478. Name: req.Name,
  479. MenuType: req.MenuType,
  480. Title: req.Title,
  481. Path: req.Path,
  482. Component: req.Component,
  483. Icon: req.Icon,
  484. Sort: req.Sort,
  485. Redirect: req.Redirect,
  486. ParentId: int64(req.ParentId),
  487. }
  488. if err := s.DB.Model(new(model.SystemMenu)).Omit("is_show").
  489. Where("id = ?", systemMenu.Id).
  490. Updates(updateData).Error; err != nil {
  491. return xerr.WithStack(err)
  492. }
  493. return nil
  494. }
  495. // IsShowSystemMenu 菜单是否启用
  496. func (s *StoreEntry) IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error {
  497. systemMenu := &model.SystemMenu{Id: int64(req.MenuId)}
  498. if err := s.DB.First(systemMenu).Error; err != nil {
  499. if errors.Is(err, gorm.ErrRecordNotFound) {
  500. return xerr.Custom("该数据不存在")
  501. }
  502. return xerr.WithStack(err)
  503. }
  504. if err := s.DB.Model(systemMenu).Update("is_show", req.IsShow).Error; err != nil {
  505. return xerr.WithStack(err)
  506. }
  507. return nil
  508. }
  509. // SearchSystemMenuList 菜单列表查询
  510. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*operationPb.SearchMenuResponse, error) {
  511. systemMenuLevel1 := make([]*model.SystemMenu, 0)
  512. var count int64 = 0
  513. pref := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level1)
  514. if req.Name != "" {
  515. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  516. }
  517. if err := pref.Order("sort desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  518. Find(&systemMenuLevel1).Debug().Error; err != nil {
  519. return nil, xerr.WithStack(err)
  520. }
  521. systemMenuLevel1 = append(systemMenuLevel1, s.searchMenuLevel23ByLevel1(ctx, systemMenuLevel1)...)
  522. return &operationPb.SearchMenuResponse{
  523. Code: http.StatusOK,
  524. Msg: "ok",
  525. Data: &operationPb.SearchMenuData{
  526. Page: req.Pagination.Page,
  527. Total: int32(count),
  528. List: model.SystemMenuSlice(systemMenuLevel1).ToPB(),
  529. },
  530. }, nil
  531. }
  532. // searchMenuLevel23ByLevel1 根据一级菜单返回对应二三级菜单
  533. func (s *StoreEntry) searchMenuLevel23ByLevel1(ctx context.Context, res []*model.SystemMenu) []*model.SystemMenu {
  534. systemMenuLevel23 := make([]*model.SystemMenu, 0)
  535. if len(res) <= 0 {
  536. return systemMenuLevel23
  537. }
  538. ids1 := make([]int64, 0)
  539. for _, v := range res {
  540. ids1 = append(ids1, v.Id)
  541. }
  542. if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level2).
  543. Where("parent_id IN ?", ids1).Order("sort desc").
  544. Find(&systemMenuLevel23).Error; err != nil {
  545. return systemMenuLevel23
  546. }
  547. ids2 := make([]int64, 0)
  548. for _, v := range systemMenuLevel23 {
  549. ids2 = append(ids2, v.Id)
  550. }
  551. systemMenuLevel3 := make([]*model.SystemMenu, 0)
  552. if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? and level = ?", operationPb.IsShow_OK, model.Level3).
  553. Where("parent_id IN ?", ids2).Order("sort desc").
  554. Find(&systemMenuLevel3).Error; err != nil {
  555. return systemMenuLevel23
  556. }
  557. if len(systemMenuLevel3) > 0 {
  558. systemMenuLevel23 = append(systemMenuLevel23, systemMenuLevel3...)
  559. }
  560. return systemMenuLevel23
  561. }
  562. // DeleteSystemMenu 删除系统菜单
  563. func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
  564. systemMenu := &model.SystemMenu{Id: menuId}
  565. if err := s.DB.First(systemMenu).Error; err != nil {
  566. if errors.Is(err, gorm.ErrRecordNotFound) {
  567. return xerr.Custom("该数据不存在")
  568. }
  569. return xerr.WithStack(err)
  570. }
  571. if err := s.DB.Model(systemMenu).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  572. return xerr.WithStack(err)
  573. }
  574. return nil
  575. }