system_service.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "kpt-pasture/util"
  8. "net/http"
  9. "time"
  10. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
  13. "gitee.com/xuyiping_admin/pkg/jwt"
  14. "gitee.com/xuyiping_admin/pkg/xerr"
  15. "gorm.io/gorm"
  16. )
  17. const CurrentUserName = "userName"
  18. // Login 用户登录
  19. func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest) (*pasturePb.SystemUserResponse, error) {
  20. systemUser := &model.SystemUser{}
  21. if err := s.DB.Where("name = ?", req.Name).Find(systemUser).Error; err != nil {
  22. return nil, xerr.WithStack(err)
  23. }
  24. if systemUser.Password != req.Password {
  25. return nil, xerr.Customf("密码错误,来自用户:%s", req.Name)
  26. }
  27. if systemUser.IsShow == pasturePb.IsShow_No {
  28. return nil, xerr.Customf("该账号已被禁用,请联系管理员")
  29. }
  30. jwtToken := jwt.NewJWTTokenGen(s.Cfg.AppName, s.Cfg.JwtTokenKeyConfig.PrivateKey)
  31. token, err := jwtToken.GenerateToken(systemUser.Name, s.Cfg.JwtExpireTime)
  32. if err != nil {
  33. return nil, xerr.WithStack(err)
  34. }
  35. if token == "" {
  36. return nil, xerr.Custom("获取token错误")
  37. }
  38. expires := time.Now().Add(time.Duration(s.Cfg.JwtExpireTime) * time.Second).Format(util.LayoutTime)
  39. return &pasturePb.SystemUserResponse{
  40. Code: http.StatusOK,
  41. Message: "ok",
  42. Data: &pasturePb.SystemUserData{
  43. AccessToken: token,
  44. Expires: expires,
  45. RefreshToken: expires,
  46. Username: systemUser.Name,
  47. Roles: []string{"admin"},
  48. Avatar: systemUser.Avatar,
  49. },
  50. }, nil
  51. }
  52. // SearchSystemUserList 查询系统用户
  53. func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.SearchUserRequest) (*pasturePb.SearchUserResponse, error) {
  54. systemUserList := make([]*model.SystemUser, 0)
  55. var count int64 = 0
  56. pref := s.DB.Model(new(model.SystemUser)).Where("is_delete = ?", operationPb.IsShow_OK)
  57. if req.Name != "" {
  58. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  59. }
  60. if req.Mobile != "" {
  61. pref.Where("mobile = ?", req.Mobile)
  62. }
  63. if req.DeptId > 0 {
  64. pref.Where("dept_id = ?", req.DeptId)
  65. }
  66. if req.IsShow > 0 {
  67. pref.Where("is_show = ?", req.IsShow)
  68. }
  69. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  70. Find(&systemUserList).Debug().Error; err != nil {
  71. return nil, xerr.WithStack(err)
  72. }
  73. roleList, err := s.SearchSystemRoleListByIds(ctx, []int64{})
  74. if err != nil {
  75. return nil, xerr.WithStack(err)
  76. }
  77. deptList, err := s.SearchSystemDeptListByIds(ctx, []int64{})
  78. if err != nil {
  79. return nil, xerr.WithStack(err)
  80. }
  81. return &pasturePb.SearchUserResponse{
  82. Code: http.StatusOK,
  83. Message: "ok",
  84. Data: &pasturePb.SearchUserData{
  85. List: model.SystemUserSlice(systemUserList).ToPB(deptList, roleList),
  86. Total: int32(count),
  87. PageSize: req.Pagination.PageSize,
  88. Page: req.Pagination.Page,
  89. },
  90. }, nil
  91. }
  92. // DeleteSystemUser 删除系统用户
  93. func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
  94. systemUser := &model.SystemUser{
  95. Id: userId,
  96. }
  97. if err := s.DB.First(systemUser).Error; err != nil {
  98. if errors.Is(err, gorm.ErrRecordNotFound) {
  99. return xerr.Custom("该用户不存在")
  100. }
  101. return xerr.WithStack(err)
  102. }
  103. if err := s.DB.Model(systemUser).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  104. return xerr.WithStack(err)
  105. }
  106. return nil
  107. }
  108. // IsShowSystemUser 用户是否启用
  109. func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
  110. systemUser := &model.SystemUser{
  111. Id: userId,
  112. }
  113. if err := s.DB.First(systemUser).Error; err != nil {
  114. if errors.Is(err, gorm.ErrRecordNotFound) {
  115. return xerr.Custom("该用户不存在")
  116. }
  117. return xerr.WithStack(err)
  118. }
  119. isShow := pasturePb.IsShow_No
  120. if systemUser.IsShow == pasturePb.IsShow_No {
  121. isShow = pasturePb.IsShow_Ok
  122. }
  123. if err := s.DB.Model(systemUser).Update("is_show", isShow).Error; err != nil {
  124. return xerr.WithStack(err)
  125. }
  126. return nil
  127. }
  128. // SystemUserCreateOrUpdate 创建或者更新系统用户
  129. func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pasturePb.SearchUserRequest) error {
  130. if req.Id > 0 {
  131. systemUser := &model.SystemUser{}
  132. if err := s.DB.First(systemUser).Error; err != nil {
  133. return xerr.WithStack(err)
  134. }
  135. req.Password = systemUser.Password
  136. }
  137. if err := s.DB.Model(&model.SystemUser{}).Where(map[string]interface{}{
  138. "id": req.Id,
  139. }).Assign(map[string]interface{}{
  140. "name": req.Name,
  141. "nick_name": req.NickName,
  142. "mobile": req.Mobile,
  143. "gender": req.Gender,
  144. "password": req.Password,
  145. "dept_id": req.DeptId,
  146. "remarks": req.Remarks,
  147. "is_delete": operationPb.IsShow_OK,
  148. "is_show": req.IsShow,
  149. }).FirstOrCreate(&model.SystemUser{}).Error; err != nil {
  150. return xerr.WithStack(err)
  151. }
  152. return nil
  153. }
  154. // ResetPasswordSystemUser 重置系统用户密码
  155. func (s *StoreEntry) ResetPasswordSystemUser(ctx context.Context, req *pasturePb.ResetUserPasswordRequest) error {
  156. systemUser := &model.SystemUser{
  157. Id: int64(req.Id),
  158. }
  159. if err := s.DB.First(systemUser).Error; err != nil {
  160. if errors.Is(err, gorm.ErrRecordNotFound) {
  161. return xerr.Custom("该用户不存在")
  162. }
  163. return xerr.WithStack(err)
  164. }
  165. if err := s.DB.Model(systemUser).Update("password", req.Password).Error; err != nil {
  166. return xerr.WithStack(err)
  167. }
  168. return nil
  169. }
  170. func (s *StoreEntry) SystemUserRole(ctx context.Context, userId int64) (*pasturePb.SystemUserRoleResponse, error) {
  171. systemUser := &model.SystemUser{Id: userId}
  172. if err := s.DB.First(systemUser).Error; err != nil {
  173. if errors.Is(err, gorm.ErrRecordNotFound) {
  174. return nil, xerr.Custom("该用户不存在")
  175. }
  176. return nil, xerr.WithStack(err)
  177. }
  178. return &pasturePb.SystemUserRoleResponse{
  179. Code: http.StatusOK,
  180. Message: "ok",
  181. Data: int32(systemUser.RoleId),
  182. }, nil
  183. }
  184. func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.SystemUserRoleRequest) error {
  185. systemUser := &model.SystemUser{Id: int64(req.UserId)}
  186. if err := s.DB.First(systemUser).Error; err != nil {
  187. if errors.Is(err, gorm.ErrRecordNotFound) {
  188. return xerr.Custom("该用户不存在")
  189. }
  190. return xerr.WithStack(err)
  191. }
  192. systemRole := &model.SystemRole{Id: int64(req.RoleId)}
  193. if err := s.DB.First(systemRole).Error; err != nil {
  194. if errors.Is(err, gorm.ErrRecordNotFound) {
  195. return xerr.Custom("该角色不存在")
  196. }
  197. return xerr.WithStack(err)
  198. }
  199. if err := s.DB.Model(systemUser).Update("role_id", systemRole.Id).Error; err != nil {
  200. return xerr.WithStack(err)
  201. }
  202. return nil
  203. }
  204. // GetCurrentUserName 获取当前用户名
  205. func (s *StoreEntry) GetCurrentUserName(ctx context.Context) (string, error) {
  206. userNameInter := ctx.Value(CurrentUserName)
  207. if userNameInter == nil {
  208. return "", xerr.Customf("cannot userName")
  209. }
  210. if userName, ok := userNameInter.(string); ok {
  211. return userName, nil
  212. } else {
  213. return "", xerr.Customf("waring userName")
  214. }
  215. }
  216. // GetUserInfo 获取用户信息
  217. func (s *StoreEntry) GetUserInfo(ctx context.Context, token string) (*operationPb.UserAuth, error) {
  218. systemUser := &model.SystemUser{}
  219. userName, err := s.GetCurrentUserName(ctx)
  220. if err != nil {
  221. return nil, xerr.WithStack(err)
  222. }
  223. if err = s.DB.Where("name = ?", userName).First(systemUser).Error; err != nil {
  224. return nil, xerr.WithStack(err)
  225. }
  226. systemRole := make([]*model.SystemRole, 0)
  227. return systemUser.SystemUserFormat(systemRole, nil), nil
  228. }
  229. // DetailsSystemUser 系统用户详情
  230. func (s *StoreEntry) DetailsSystemUser(ctx context.Context, userId int64) (*operationPb.UserDetails, error) {
  231. systemUser := &model.SystemUser{
  232. Id: userId,
  233. }
  234. if err := s.DB.First(systemUser).Error; err != nil {
  235. if errors.Is(err, gorm.ErrRecordNotFound) {
  236. return nil, xerr.Custom("该用户不存在")
  237. }
  238. return nil, xerr.WithStack(err)
  239. }
  240. return &operationPb.UserDetails{
  241. Code: http.StatusOK,
  242. Msg: "ok",
  243. Data: systemUser.ToPb(),
  244. }, nil
  245. }
  246. // GetSystemUserPermissions 返回系统用户相关菜单权限
  247. func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error) {
  248. // 解析token
  249. userName, err := s.GetCurrentUserName(ctx)
  250. if err != nil {
  251. return nil, xerr.WithStack(err)
  252. }
  253. // 根据用户token获取用户数据
  254. systemUser := &model.SystemUser{Name: userName}
  255. if err = s.DB.Where("name = ?", userName).First(systemUser).Error; err != nil {
  256. if errors.Is(err, gorm.ErrRecordNotFound) {
  257. return nil, xerr.Custom("该用户数据不存在")
  258. }
  259. return nil, xerr.WithStack(err)
  260. }
  261. /*roleIds := systemUser.SystemUserRoleToSlice()*/
  262. roleIds := []int64{1}
  263. // 获取用户角色数据
  264. systemRoles := make([]*model.SystemRole, 0)
  265. if err = s.DB.Where("is_show = ?", operationPb.IsShow_OK).Find(&systemRoles, roleIds).Error; err != nil {
  266. return nil, xerr.WithStack(err)
  267. }
  268. systemAllPermissionsList := &SystemAllPermissionsList{
  269. MenuList: make([]*model.SystemRoleMenu, 0),
  270. }
  271. for _, role := range systemRoles {
  272. zaplog.Info(role.Name)
  273. /*item := s.GetSystemRoleMenuList(ctx, role.Id)
  274. systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)*/
  275. }
  276. systemAllPermissionsList.SystemUserMenuPermissionsUnDuplicate()
  277. menuList, err := s.GetMenuList(ctx, systemAllPermissionsList.MenuList)
  278. if err != nil {
  279. return nil, xerr.WithStack(err)
  280. }
  281. return s.SystemPermissionsFormatPb(menuList), nil
  282. }
  283. func (s *StoreEntry) SystemPermissionsFormatPb(menuList []*model.SystemMenu) *operationPb.SystemUserMenuPermissions {
  284. systemUserMenuPermissions := &operationPb.SystemUserMenuPermissions{
  285. Code: http.StatusOK,
  286. Msg: "ok",
  287. Data: &operationPb.SystemUserMenuData{
  288. PastureList: make([]*operationPb.AddPastureRequest, 0),
  289. MenuList: make([]*operationPb.AddMenuRequest, 0),
  290. MobileList: make([]*operationPb.AddMobileRequest, 0),
  291. MenuButtonsPath: make([]*operationPb.MenuButtonsPath, 0),
  292. },
  293. }
  294. /*level := make(map[int32][]*operationPb.AddMenuRequest, 0)
  295. for _, menu := range menuList {
  296. if _, ok := level[menu.Level]; !ok {
  297. level[menu.Level] = make([]*operationPb.AddMenuRequest, 0)
  298. }
  299. level[menu.Level] = append(level[menu.Level], &operationPb.AddMenuRequest{
  300. Id: int32(menu.Id),
  301. Name: menu.Name,
  302. ParentId: int32(menu.ParentId),
  303. MenuType: menu.MenuType,
  304. Title: menu.Title,
  305. Path: menu.Path,
  306. IsShow: menu.IsShow,
  307. Component: menu.Component,
  308. Icon: menu.Icon,
  309. Sort: menu.Sort,
  310. Redirect: menu.Redirect,
  311. CreatedAt: int32(menu.CreatedAt),
  312. CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Format(model.LayoutTime),
  313. Level: menu.Level,
  314. Affix: true,
  315. KeepAlive: true,
  316. Children: make([]*operationPb.AddMenuRequest, 0),
  317. })
  318. if menu.Level == model.Level3 {
  319. systemUserMenuPermissions.Data.MenuButtonsPath = append(systemUserMenuPermissions.Data.MenuButtonsPath, &operationPb.MenuButtonsPath{
  320. Path: menu.Path,
  321. MenuId: int32(menu.Id),
  322. })
  323. }
  324. }
  325. level2IsShow := make([]int32, 0)
  326. for _, leve2Data := range level[model.Level2] {
  327. for _, leve3Data := range level[model.Level3] {
  328. if leve3Data.ParentId == leve2Data.Id && strings.Contains(leve3Data.Path, ":page") {
  329. level2IsShow = append(level2IsShow, leve2Data.Id)
  330. }
  331. if leve3Data.ParentId == leve2Data.Id {
  332. if leve2Data.Children == nil {
  333. leve2Data.Children = make([]*operationPb.AddMenuRequest, 0)
  334. }
  335. leve2Data.Children = append(leve2Data.Children, leve3Data)
  336. }
  337. }
  338. }
  339. sort.SliceStable(level[model.Level2], func(i, j int) bool {
  340. return level[model.Level2][i].Sort > level[model.Level2][j].Sort
  341. })
  342. for _, leve2Data := range level[model.Level2] {
  343. var info bool
  344. for _, v := range level2IsShow {
  345. if v == leve2Data.Id {
  346. info = true
  347. }
  348. }
  349. if !info {
  350. continue
  351. }
  352. for _, leve1Data := range level[model.Level1] {
  353. if leve2Data.ParentId == leve1Data.Id {
  354. if leve1Data.Children == nil {
  355. leve1Data.Children = make([]*operationPb.AddMenuRequest, 0)
  356. }
  357. leve1Data.Children = append(leve1Data.Children, leve2Data)
  358. }
  359. }
  360. }
  361. sort.SliceStable(level[model.Level1], func(i, j int) bool {
  362. return level[model.Level1][i].Sort > level[model.Level1][j].Sort
  363. })
  364. systemUserMenuPermissions.Data.MenuList = level[model.Level1]*/
  365. return systemUserMenuPermissions
  366. }
  367. // SystemRoleCreateOrUpdate 添加角色
  368. func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
  369. isShow := pasturePb.IsShow_Ok
  370. if req.Id > 0 {
  371. isShow = req.IsShow
  372. }
  373. if err := s.DB.Model(&model.SystemRole{}).Where(map[string]interface{}{
  374. "id": req.Id,
  375. }).Assign(map[string]interface{}{
  376. "name": req.Name,
  377. "remarks": req.Remarks,
  378. "is_delete": operationPb.IsShow_OK,
  379. "is_show": isShow,
  380. }).FirstOrCreate(&model.SystemRole{}).Error; err != nil {
  381. return xerr.WithStack(err)
  382. }
  383. return nil
  384. }
  385. // DeleteSystemRole 删除系统角色
  386. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  387. systemRole := &model.SystemRole{
  388. Id: roleId,
  389. }
  390. if err := s.DB.First(systemRole).Error; err != nil {
  391. if errors.Is(err, gorm.ErrRecordNotFound) {
  392. return xerr.Custom("该数据不存在")
  393. }
  394. return xerr.WithStack(err)
  395. }
  396. if err := s.DB.Model(systemRole).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
  397. return xerr.WithStack(err)
  398. }
  399. return nil
  400. }
  401. // IsShowSystemRole 角色是否启用
  402. func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
  403. systemRole := &model.SystemRole{
  404. Id: roleId,
  405. }
  406. if err := s.DB.First(systemRole).Error; err != nil {
  407. if errors.Is(err, gorm.ErrRecordNotFound) {
  408. return xerr.Custom("该角色不存在")
  409. }
  410. return xerr.WithStack(err)
  411. }
  412. isShow := pasturePb.IsShow_No
  413. if systemRole.IsShow == pasturePb.IsShow_No {
  414. isShow = pasturePb.IsShow_Ok
  415. }
  416. if err := s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
  417. return xerr.WithStack(err)
  418. }
  419. return nil
  420. }
  421. // SearchSystemRoleList 查询系统角色
  422. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest) (*pasturePb.SearchRoleResponse, error) {
  423. systemRoleList := make([]*model.SystemRole, 0)
  424. var count int64 = 0
  425. pref := s.DB.Model(new(model.SystemRole)).Where("is_delete = ?", operationPb.IsShow_OK)
  426. if req.Name != "" {
  427. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  428. }
  429. if req.IsShow > 0 {
  430. pref.Where("is_show = ?", req.IsShow)
  431. }
  432. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).
  433. Offset(int(req.Pagination.PageOffset)).Find(&systemRoleList).Error; err != nil {
  434. return nil, xerr.WithStack(err)
  435. }
  436. return &pasturePb.SearchRoleResponse{
  437. Code: http.StatusOK,
  438. Message: "ok",
  439. Data: &pasturePb.SearchRoleData{
  440. Page: req.Pagination.Page,
  441. Total: int32(count),
  442. PageSize: req.Pagination.PageSize,
  443. List: model.SystemRoleSlice(systemRoleList).ToPB(),
  444. },
  445. }, nil
  446. }
  447. // SearchSystemRoleListByIds 根据id查询角色列表
  448. func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, ids []int64) ([]*model.SystemRole, error) {
  449. systemRoleList := make([]*model.SystemRole, 0)
  450. if err := s.DB.Model(new(model.SystemRole)).
  451. Where("is_show = ?", operationPb.IsShow_OK).
  452. Find(&systemRoleList, ids).Error; err != nil {
  453. return nil, xerr.WithStack(err)
  454. }
  455. return systemRoleList, nil
  456. }
  457. // GetRoleMenuList 查询系统角色对应的菜单数据
  458. func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pasturePb.SystemRoleMenuResponse, error) {
  459. systemRole := &model.SystemRole{
  460. Id: roleId,
  461. }
  462. if err := s.DB.First(systemRole).Error; err != nil {
  463. if errors.Is(err, gorm.ErrRecordNotFound) {
  464. return nil, xerr.Custom("该数据不存在")
  465. }
  466. return nil, xerr.WithStack(err)
  467. }
  468. if systemRole.IsDelete == pasturePb.IsShow_No {
  469. return nil, xerr.Custom("该数据已被删除")
  470. }
  471. item := s.GetSystemRoleMenuList(ctx, systemRole.Id)
  472. return &pasturePb.SystemRoleMenuResponse{
  473. Code: http.StatusOK,
  474. Message: "ok",
  475. Data: model.SystemRoleMenuSlice(item).ToPB(),
  476. }, nil
  477. }
  478. // RoleMenuSave 保存系统角色对应的菜单数据
  479. func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error {
  480. if len(res.MenuIds) <= 0 {
  481. return xerr.Custom("请选择菜单")
  482. }
  483. systemRole := &model.SystemRole{
  484. Id: int64(res.RoleId),
  485. }
  486. if err := s.DB.First(systemRole).Error; err != nil {
  487. if errors.Is(err, gorm.ErrRecordNotFound) {
  488. return xerr.Custom("该数据不存在")
  489. }
  490. return xerr.WithStack(err)
  491. }
  492. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  493. if err := tx.Model(new(model.SystemRoleMenu)).Where("role_id = ?", systemRole.Id).Delete(&model.SystemRoleMenu{}).Error; err != nil {
  494. return xerr.WithStack(err)
  495. }
  496. for _, menuId := range res.MenuIds {
  497. if err := tx.Create(&model.SystemRoleMenu{
  498. RoleId: systemRole.Id,
  499. MenuId: int64(menuId),
  500. }).Error; err != nil {
  501. return xerr.WithStack(err)
  502. }
  503. }
  504. return nil
  505. }); err != nil {
  506. return xerr.WithStack(err)
  507. }
  508. return nil
  509. }
  510. func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) {
  511. systemRoleList := make([]*model.SystemRole, 0)
  512. if err := s.DB.Model(new(model.SystemRole)).
  513. Where("is_delete = ? and is_show = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
  514. Find(&systemRoleList).Error; err != nil {
  515. return nil, xerr.WithStack(err)
  516. }
  517. return &pasturePb.GetRoleListResponse{
  518. Code: http.StatusOK,
  519. Message: "ok",
  520. Data: model.SystemRoleSlice(systemRoleList).ToPB(),
  521. }, nil
  522. }
  523. // CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
  524. func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
  525. if req.Id > 0 {
  526. }
  527. if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
  528. "id": req.Id,
  529. }).Assign(map[string]interface{}{
  530. "name": req.Name,
  531. "path": req.Path,
  532. "title": req.Title,
  533. "menu_type": req.MenuType,
  534. "parent_id": req.ParentId,
  535. "frame_src": req.FrameSrc,
  536. "frame_loading": model.BooleanToIsShow(req.FrameLoading),
  537. "keepalive": model.BooleanToIsShow(req.Keepalive),
  538. "hidden_tag": model.BooleanToIsShow(req.HiddenTag),
  539. "show_link": model.BooleanToIsShow(req.ShowLink),
  540. "show_parent": model.BooleanToIsShow(req.ShowParent),
  541. "icon": req.Icon,
  542. "component": req.Component,
  543. "redirect": req.Redirect,
  544. "auths": req.Auths,
  545. "rank": req.Rank,
  546. "extra_icon": req.ExtraIcon,
  547. "enter_transition": req.EnterTransition,
  548. "leave_transition": req.LeaveTransition,
  549. "active_path": req.ActivePath,
  550. "is_delete": pasturePb.IsShow_Ok,
  551. "is_show": pasturePb.IsShow_Ok,
  552. }).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
  553. return xerr.WithStack(err)
  554. }
  555. return nil
  556. }
  557. func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error) {
  558. systemMenuList := make([]*model.SystemMenu, 0)
  559. if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", pasturePb.IsShow_Ok).
  560. Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemMenuList).Error; err != nil {
  561. return nil, xerr.WithStack(err)
  562. }
  563. return &pasturePb.SystemMenuTreeResponse{
  564. Code: http.StatusOK,
  565. Message: "ok",
  566. Data: model.SystemMenuSlice(systemMenuList).ToPB(),
  567. }, nil
  568. }
  569. // SearchSystemMenuList 菜单列表查询
  570. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest) (*pasturePb.SearchMenuResponse, error) {
  571. systemMenuList := make([]*model.SystemMenu, 0)
  572. var count int64 = 0
  573. if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ? ", operationPb.IsShow_OK).Order("parent_id").Count(&count).Find(&systemMenuList).Error; err != nil {
  574. return nil, xerr.WithStack(err)
  575. }
  576. return &pasturePb.SearchMenuResponse{
  577. Code: http.StatusOK,
  578. Message: "ok",
  579. Data: &pasturePb.SearchMenuData{
  580. Page: req.Pagination.Page,
  581. Total: int32(count),
  582. PageSize: req.Pagination.PageSize,
  583. List: model.SystemMenuSlice(systemMenuList).ToPB(),
  584. },
  585. }, nil
  586. }
  587. // DeleteSystemMenu 删除系统菜单
  588. func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
  589. systemMenu := &model.SystemMenu{Id: menuId}
  590. if err := s.DB.First(systemMenu).Error; err != nil {
  591. if errors.Is(err, gorm.ErrRecordNotFound) {
  592. return xerr.Custom("该数据不存在")
  593. }
  594. return xerr.WithStack(err)
  595. }
  596. if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
  597. return xerr.WithStack(err)
  598. }
  599. return nil
  600. }
  601. func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest) (*pasturePb.SearchDeptResponse, error) {
  602. deptList := make([]*model.SystemDept, 0)
  603. var count int64 = 0
  604. pref := s.DB.Model(new(model.SystemDept)).Where("is_delete = ?", operationPb.IsShow_OK)
  605. if req.Name != "" {
  606. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  607. }
  608. if req.IsShow > 0 {
  609. pref.Where("is_show = ?", req.IsShow)
  610. }
  611. if err := pref.Order("sort desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  612. Find(&deptList).Error; err != nil {
  613. return nil, xerr.WithStack(err)
  614. }
  615. return &pasturePb.SearchDeptResponse{
  616. Code: http.StatusOK,
  617. Message: "ok",
  618. Data: model.SystemDeptSlice(deptList).ToPB(),
  619. }, nil
  620. }
  621. func (s *StoreEntry) SystemDepDelete(ctx context.Context, id int64) error {
  622. dept := &model.SystemDept{Id: id}
  623. if err := s.DB.First(dept).Error; err != nil {
  624. return xerr.WithStack(err)
  625. }
  626. if dept.IsShow == pasturePb.IsShow_No {
  627. return nil
  628. }
  629. if err := s.DB.Model(dept).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  630. return xerr.WithStack(err)
  631. }
  632. return nil
  633. }
  634. func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
  635. if err := s.DB.Model(&model.SystemDept{}).Where(map[string]interface{}{
  636. "id": req.Id,
  637. }).Assign(map[string]interface{}{
  638. "name": req.Name,
  639. "sort": req.Sort,
  640. "parent_id": req.ParentId,
  641. "remarks": req.Remarks,
  642. "is_delete": operationPb.IsShow_OK,
  643. "is_show": req.IsShow,
  644. "dept_type": pasturePb.Depth_Department,
  645. "leader_id": req.LeaderId,
  646. }).FirstOrCreate(&model.SystemDept{}).Error; err != nil {
  647. return xerr.WithStack(err)
  648. }
  649. return nil
  650. }
  651. // SearchSystemDeptListByIds 根据id查询部门列表
  652. func (s *StoreEntry) SearchSystemDeptListByIds(ctx context.Context, ids []int64) ([]*model.SystemDept, error) {
  653. systemDeptList := make([]*model.SystemDept, 0)
  654. if err := s.DB.Model(new(model.SystemDept)).
  655. Where("is_show = ?", operationPb.IsShow_OK).
  656. Find(&systemDeptList, ids).Error; err != nil {
  657. return nil, xerr.WithStack(err)
  658. }
  659. return systemDeptList, nil
  660. }