system_service.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-tmr-group/model"
  7. "kpt-tmr-group/pkg/jwt"
  8. "kpt-tmr-group/pkg/tool"
  9. "kpt-tmr-group/pkg/xerr"
  10. operationPb "kpt-tmr-group/proto/go/backend/operation"
  11. "strconv"
  12. "strings"
  13. "gorm.io/gorm"
  14. )
  15. // Auth 用户登录
  16. func (s *StoreEntry) Auth(ctx context.Context, auth *operationPb.UserAuth) (*operationPb.SystemToken, error) {
  17. systemUser := &model.SystemUser{}
  18. if err := s.DB.Where("name = ?", auth.UserName).Find(systemUser).Error; err != nil {
  19. return nil, xerr.WithStack(err)
  20. }
  21. if systemUser.Password != auth.Password {
  22. return nil, xerr.Customf("密码错误,来自用户:%s", auth.UserName)
  23. }
  24. token, err := jwt.GenerateToken(systemUser.Name, systemUser.Password)
  25. if err != nil {
  26. return nil, xerr.WithStack(err)
  27. }
  28. if token == "" {
  29. return nil, xerr.Custom("获取token错误")
  30. }
  31. return &operationPb.SystemToken{
  32. Token: token,
  33. }, nil
  34. }
  35. // GetUserInfo 获取用户信息
  36. func (s *StoreEntry) GetUserInfo(ctx context.Context, token string) (*operationPb.UserAuth, error) {
  37. systemUser := &model.SystemUser{}
  38. claims, err := jwt.ParseToken(token)
  39. if err != nil {
  40. return nil, xerr.WithStack(err)
  41. }
  42. if claims.Username == "" {
  43. return nil, xerr.Custom("token解析失败")
  44. }
  45. if err = s.DB.Where("name = ?", claims.Username).First(systemUser).Error; err != nil {
  46. return nil, xerr.WithStack(err)
  47. }
  48. systemRole := make([]*model.SystemRole, 0)
  49. roleIdStr := strings.Split(systemUser.RoleIds, ",")
  50. if len(roleIdStr) > 0 {
  51. roleIds := make([]int, 0)
  52. for _, v := range roleIdStr {
  53. roleId, _ := strconv.Atoi(v)
  54. roleIds = append(roleIds, roleId)
  55. }
  56. if err = s.DB.Find(&systemRole, roleIds).Error; err != nil {
  57. return nil, xerr.WithStack(err)
  58. }
  59. }
  60. return systemUser.SystemUserFormat(systemRole), nil
  61. }
  62. // CreateSystemUser 创建系统用户
  63. func (s *StoreEntry) CreateSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error {
  64. systemUsers := &model.SystemUser{
  65. Name: req.Name,
  66. EmployeeName: req.EmployeeName,
  67. Phone: req.Phone,
  68. Password: tool.Md5String(model.InitManagerPassword),
  69. CreateUser: req.CreateUser,
  70. IsShow: req.IsShow,
  71. }
  72. systemUsers.SystemUserRoleFormat(req)
  73. if err := s.DB.Create(systemUsers).Error; err != nil {
  74. return xerr.WithStack(err)
  75. }
  76. return nil
  77. }
  78. // SearchSystemUserList 查询系统用户
  79. func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *operationPb.SearchUserRequest) (*model.SystemUserResponse, error) {
  80. systemUser := make([]*model.SystemUser, 0)
  81. var count int64 = 0
  82. pref := s.DB.Model(new(model.SystemUser)).Where("is_delete = ?", operationPb.IsShow_OK)
  83. if req.Name != "" {
  84. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  85. }
  86. if req.EmployeeName != "" {
  87. pref.Where("employee_name like ?", fmt.Sprintf("%s%s%s", "%", req.EmployeeName, "%"))
  88. }
  89. if req.IsShow > 0 {
  90. pref.Where("is_show = ?", req.IsShow)
  91. }
  92. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  93. Find(&systemUser).Debug().Error; err != nil {
  94. return nil, xerr.WithStack(err)
  95. }
  96. return &model.SystemUserResponse{
  97. Page: req.Pagination.Page,
  98. Total: int32(count),
  99. List: model.SystemUserSlice(systemUser).ToPB(),
  100. }, nil
  101. }
  102. // EditSystemUser 编辑用户
  103. func (s *StoreEntry) EditSystemUser(ctx context.Context, req *operationPb.AddSystemUser) error {
  104. systemUser := &model.SystemUser{Id: req.Id}
  105. if err := s.DB.First(systemUser).Error; err != nil {
  106. if errors.Is(err, gorm.ErrRecordNotFound) {
  107. return xerr.Custom("该数据不存在!")
  108. }
  109. return xerr.WithStack(err)
  110. }
  111. updateData := &model.SystemUser{
  112. Name: req.Name,
  113. EmployeeName: req.EmployeeName,
  114. Phone: req.Phone,
  115. CreateUser: req.CreateUser,
  116. }
  117. updateData.SystemUserRoleFormat(req)
  118. if err := s.DB.Model(new(model.SystemUser)).Omit("is_show", "password", "is_delete").
  119. Where("id = ?", systemUser.Id).
  120. Updates(updateData).Error; err != nil {
  121. return xerr.WithStack(err)
  122. }
  123. return nil
  124. }
  125. // DeleteSystemUser 删除系统用户
  126. func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
  127. systemUser := &model.SystemUser{
  128. Id: userId,
  129. }
  130. if err := s.DB.First(systemUser).Error; err != nil {
  131. if errors.Is(err, gorm.ErrRecordNotFound) {
  132. return xerr.Custom("该用户不存在")
  133. }
  134. return xerr.WithStack(err)
  135. }
  136. if err := s.DB.Model(systemUser).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  137. return xerr.WithStack(err)
  138. }
  139. return nil
  140. }
  141. // IsShowSystemUser 用户是否启用
  142. func (s *StoreEntry) IsShowSystemUser(ctx context.Context, req *operationPb.IsShowSystemUserRequest) error {
  143. systemUser := &model.SystemUser{
  144. Id: req.UserId,
  145. }
  146. if err := s.DB.First(systemUser).Error; err != nil {
  147. if errors.Is(err, gorm.ErrRecordNotFound) {
  148. return xerr.Custom("该用户不存在")
  149. }
  150. return xerr.WithStack(err)
  151. }
  152. if err := s.DB.Model(systemUser).Update("is_show", req.IsShow).Error; err != nil {
  153. return xerr.WithStack(err)
  154. }
  155. return nil
  156. }
  157. // GetSystemUserPermissions 返回系统用户相关菜单权限
  158. func (s *StoreEntry) GetSystemUserPermissions(ctx context.Context, token string) (*operationPb.SystemUserMenuPermissions, error) {
  159. // 解析token
  160. claims, err := jwt.ParseToken(token)
  161. if err != nil {
  162. return nil, xerr.WithStack(err)
  163. }
  164. if err = claims.Valid(); err != nil {
  165. return nil, xerr.WithStack(err)
  166. }
  167. // 根据用户token获取用户数据
  168. systemUser := &model.SystemUser{Name: claims.Username}
  169. if err = s.DB.Where("name = ?", claims.Username).First(systemUser).Error; err != nil {
  170. if errors.Is(err, gorm.ErrRecordNotFound) {
  171. return nil, xerr.Custom("该用户数据不存在")
  172. }
  173. return nil, xerr.WithStack(err)
  174. }
  175. roleIds := systemUser.SystemUserRoleToSlice()
  176. // 获取用户角色数据
  177. systemRoles := make([]*model.SystemRole, 0)
  178. if err = s.DB.Where("is_show = ?", operationPb.IsShow_OK).Find(&systemRoles, roleIds).Error; err != nil {
  179. return nil, xerr.WithStack(err)
  180. }
  181. systemAllPermissionsList := &SystemAllPermissionsList{
  182. PastureList: make([]*model.SystemGroupPasturePermissions, 0),
  183. MenuList: make([]*model.SystemMenuPermissions, 0),
  184. MobileList: make([]*model.SystemMobilePermissions, 0),
  185. }
  186. for _, role := range systemRoles {
  187. item := s.GetSystemAllPermissionsList(ctx, role.Id)
  188. systemAllPermissionsList.PastureList = append(systemAllPermissionsList.PastureList, item.PastureList...)
  189. systemAllPermissionsList.MenuList = append(systemAllPermissionsList.MenuList, item.MenuList...)
  190. systemAllPermissionsList.MobileList = append(systemAllPermissionsList.MobileList, item.MobileList...)
  191. }
  192. systemAllPermissionsList.SystemUserMenuPermissionsUnDuplicate()
  193. groupPastureList, err := s.GetPastureList(ctx, systemAllPermissionsList.PastureList)
  194. if err != nil {
  195. return nil, xerr.WithStack(err)
  196. }
  197. menuList, err := s.GetMenuList(ctx, systemAllPermissionsList.MenuList)
  198. if err != nil {
  199. return nil, xerr.WithStack(err)
  200. }
  201. mobileList, err := s.GetMobileList(ctx, systemAllPermissionsList.MobileList)
  202. if err != nil {
  203. return nil, xerr.WithStack(err)
  204. }
  205. return s.SystemPermissionsFormatPb(groupPastureList, mobileList, menuList), nil
  206. }
  207. // CreateSystemRole 添加角色
  208. func (s *StoreEntry) CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  209. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  210. // 创建角色数据
  211. role := model.NewSystemRole(req)
  212. if err := tx.Create(role).Error; err != nil {
  213. return xerr.WithStack(err)
  214. }
  215. // 创建角色菜单权限数据
  216. if len(req.MenuId) > 0 {
  217. menuPermissions := model.NewSystemMenuPermissions(role.Id, req.MenuId)
  218. if err := tx.Create(menuPermissions).Error; err != nil {
  219. return xerr.WithStack(err)
  220. }
  221. }
  222. // 创建角色移动端权限数据
  223. if len(req.MobileId) > 0 {
  224. mobilePermissions := model.NewSystemMobilePermissions(role.Id, req.MobileId)
  225. if err := tx.Create(mobilePermissions).Error; err != nil {
  226. return xerr.WithStack(err)
  227. }
  228. }
  229. // 创建角色牧场端权限数据
  230. if len(req.PastureId) > 0 {
  231. pasturePermissions := model.NewSystemGroupPasturePermissions(role.Id, req.PastureId)
  232. if err := tx.Create(pasturePermissions).Error; err != nil {
  233. return xerr.WithStack(err)
  234. }
  235. }
  236. return nil
  237. }); err != nil {
  238. return xerr.WithStack(err)
  239. }
  240. return nil
  241. }
  242. // EditSystemRole 编辑角色
  243. func (s *StoreEntry) EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  244. role := &model.SystemRole{Id: req.Id}
  245. if err := s.DB.First(role).Error; err != nil {
  246. if errors.Is(err, gorm.ErrRecordNotFound) {
  247. return xerr.Custom("该数据不存在")
  248. }
  249. return xerr.WithStack(err)
  250. }
  251. updateSystemRole := model.NewSystemRole(req)
  252. if err := s.DB.Omit("is_show").
  253. Where("id = ?", role.Id).
  254. Updates(updateSystemRole).Error; err != nil {
  255. return xerr.WithStack(err)
  256. }
  257. return nil
  258. }
  259. // DeleteSystemRole 删除系统角色
  260. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  261. systemRole := &model.SystemRole{
  262. Id: roleId,
  263. }
  264. if err := s.DB.First(systemRole).Error; err != nil {
  265. if errors.Is(err, gorm.ErrRecordNotFound) {
  266. return xerr.Custom("该数据不存在")
  267. }
  268. return xerr.WithStack(err)
  269. }
  270. if err := s.DB.Model(systemRole).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
  271. return xerr.WithStack(err)
  272. }
  273. return nil
  274. }
  275. // SearchSystemRoleList 查询系统角色
  276. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*model.SystemRoleResponse, error) {
  277. systemRole := make([]*model.SystemRole, 0)
  278. var count int64 = 0
  279. pref := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK)
  280. if req.Name != "" {
  281. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  282. }
  283. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  284. Find(&systemRole).Debug().Error; err != nil {
  285. return nil, xerr.WithStack(err)
  286. }
  287. return &model.SystemRoleResponse{
  288. Page: req.Pagination.Page,
  289. Total: int32(count),
  290. List: model.SystemRoleSlice(systemRole).ToPB(),
  291. }, nil
  292. }
  293. // CreateSystemMenu 添加系统菜单权限
  294. func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  295. systemMenu := model.NewSystemMenu(req)
  296. if err := s.DB.Create(systemMenu).Error; err != nil {
  297. return xerr.WithStack(err)
  298. }
  299. return nil
  300. }
  301. // EditSystemMenu 编辑系统菜单权限
  302. func (s *StoreEntry) EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  303. systemMenu := &model.SystemMenu{Id: req.Id}
  304. if err := s.DB.First(systemMenu).Error; err != nil {
  305. if errors.Is(err, gorm.ErrRecordNotFound) {
  306. return xerr.Custom("该数据不存在!")
  307. }
  308. return xerr.WithStack(err)
  309. }
  310. updateData := &model.SystemMenu{
  311. Name: req.Name,
  312. MenuType: req.MenuType,
  313. Title: req.Title,
  314. Path: req.Path,
  315. Component: req.Component,
  316. Icon: req.Icon,
  317. Sort: req.Sort,
  318. Redirect: req.Redirect,
  319. ParentId: req.ParentId,
  320. }
  321. if err := s.DB.Model(new(model.SystemMenu)).Omit("is_show").
  322. Where("id = ?", systemMenu.Id).
  323. Updates(updateData).Error; err != nil {
  324. return xerr.WithStack(err)
  325. }
  326. return nil
  327. }
  328. // IsShowSystemMenu 菜单是否启用
  329. func (s *StoreEntry) IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error {
  330. systemMenu := &model.SystemMenu{Id: req.MenuId}
  331. if err := s.DB.First(systemMenu).Error; err != nil {
  332. if errors.Is(err, gorm.ErrRecordNotFound) {
  333. return xerr.Custom("该数据不存在")
  334. }
  335. return xerr.WithStack(err)
  336. }
  337. if err := s.DB.Model(systemMenu).Update("is_show", req.IsShow).Error; err != nil {
  338. return xerr.WithStack(err)
  339. }
  340. return nil
  341. }
  342. // SearchSystemMenuList 菜单列表查询
  343. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*model.SystemMenuResponse, error) {
  344. systemMenu := make([]*model.SystemMenu, 0)
  345. var count int64 = 0
  346. pref := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", operationPb.IsShow_OK)
  347. if req.Name != "" {
  348. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  349. }
  350. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  351. Find(&systemMenu).Debug().Error; err != nil {
  352. return nil, xerr.WithStack(err)
  353. }
  354. return &model.SystemMenuResponse{
  355. Page: req.Pagination.Page,
  356. Total: int32(count),
  357. List: model.SystemMenuSlice(systemMenu).ToPB(),
  358. }, nil
  359. }
  360. // DeleteSystemMenu 删除系统菜单
  361. func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
  362. systemMenu := &model.SystemMenu{Id: menuId}
  363. if err := s.DB.First(systemMenu).Error; err != nil {
  364. if errors.Is(err, gorm.ErrRecordNotFound) {
  365. return xerr.Custom("该数据不存在")
  366. }
  367. return xerr.WithStack(err)
  368. }
  369. if err := s.DB.Model(systemMenu).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  370. return xerr.WithStack(err)
  371. }
  372. return nil
  373. }