system_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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.Find(&systemRoles, roleIds).Error; err != nil {
  179. return nil, xerr.WithStack(err)
  180. }
  181. systemUserMenuPermissions := &operationPb.SystemUserMenuPermissions{
  182. PastureList: make([]*operationPb.AddPastureRequest, 0),
  183. MenuList: make([]*operationPb.AddMenuRequest, 0),
  184. MobileList: make([]*operationPb.AddMobileRequest, 0),
  185. }
  186. for _, role := range systemRoles {
  187. mobileIds := role.RoleForMobileToSlice()
  188. pastureIds := role.RoleForPastureToSlice()
  189. menuIds := role.RoleForMenuToSlice()
  190. item := s.GetPermissionsPastureList(ctx, mobileIds, pastureIds, menuIds)
  191. systemUserMenuPermissions.PastureList = append(systemUserMenuPermissions.PastureList, item.PastureList...)
  192. systemUserMenuPermissions.MenuList = append(systemUserMenuPermissions.MenuList, item.MenuList...)
  193. systemUserMenuPermissions.MobileList = append(systemUserMenuPermissions.MobileList, item.MobileList...)
  194. }
  195. return systemUserMenuPermissions, nil
  196. }
  197. // CreateSystemRole 添加角色
  198. func (s *StoreEntry) CreateSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  199. role := model.NewSystemRole(req)
  200. if err := s.DB.Create(role).Debug().Error; err != nil {
  201. return xerr.WithStack(err)
  202. }
  203. return nil
  204. }
  205. // EditSystemRole 编辑角色
  206. func (s *StoreEntry) EditSystemRole(ctx context.Context, req *operationPb.AddRoleRequest) error {
  207. role := &model.SystemRole{Id: req.Id}
  208. if err := s.DB.First(role).Error; err != nil {
  209. if errors.Is(err, gorm.ErrRecordNotFound) {
  210. return xerr.Custom("该数据不存在")
  211. }
  212. return xerr.WithStack(err)
  213. }
  214. updateSystemUser := &model.SystemRole{
  215. Id: req.Id,
  216. Name: req.Name,
  217. Remarks: req.Remarks,
  218. CreateUser: req.CreateUser,
  219. }
  220. updateSystemUser.RolePermissionsFormat(req)
  221. if err := s.DB.Omit("is_show").
  222. Where("id = ?", role.Id).
  223. Updates(updateSystemUser).Error; err != nil {
  224. return xerr.WithStack(err)
  225. }
  226. return nil
  227. }
  228. // DeleteSystemRole 删除系统角色
  229. func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
  230. systemRole := &model.SystemRole{
  231. Id: roleId,
  232. }
  233. if err := s.DB.First(systemRole).Error; err != nil {
  234. if errors.Is(err, gorm.ErrRecordNotFound) {
  235. return xerr.Custom("该数据不存在")
  236. }
  237. return xerr.WithStack(err)
  238. }
  239. if err := s.DB.Model(systemRole).Update("is_show", operationPb.IsShow_NO).Error; err != nil {
  240. return xerr.WithStack(err)
  241. }
  242. return nil
  243. }
  244. // SearchSystemRoleList 查询系统角色
  245. func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *operationPb.SearchRoleRequest) (*model.SystemRoleResponse, error) {
  246. systemRole := make([]*model.SystemRole, 0)
  247. var count int64 = 0
  248. pref := s.DB.Model(new(model.SystemRole)).Where("is_show = ?", operationPb.IsShow_OK)
  249. if req.Name != "" {
  250. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  251. }
  252. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  253. Find(&systemRole).Debug().Error; err != nil {
  254. return nil, xerr.WithStack(err)
  255. }
  256. return &model.SystemRoleResponse{
  257. Page: req.Pagination.Page,
  258. Total: int32(count),
  259. List: model.SystemRoleSlice(systemRole).ToPB(),
  260. }, nil
  261. }
  262. // CreateSystemMenu 添加系统菜单权限
  263. func (s *StoreEntry) CreateSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  264. systemMenu := &model.SystemMenu{
  265. Name: req.Name,
  266. MenuType: req.MenuType,
  267. Title: req.Title,
  268. Path: req.Path,
  269. Component: req.Component,
  270. Icon: req.Icon,
  271. Sort: req.Sort,
  272. Redirect: req.Redirect,
  273. ParentId: req.ParentId,
  274. IsShow: operationPb.IsShow_OK,
  275. IsDelete: operationPb.IsShow_OK,
  276. }
  277. if err := s.DB.Create(systemMenu).Error; err != nil {
  278. return xerr.WithStack(err)
  279. }
  280. return nil
  281. }
  282. // EditSystemMenu 编辑系统菜单权限
  283. func (s *StoreEntry) EditSystemMenu(ctx context.Context, req *operationPb.AddMenuRequest) error {
  284. systemMenu := &model.SystemMenu{Id: req.Id}
  285. if err := s.DB.First(systemMenu).Error; err != nil {
  286. if errors.Is(err, gorm.ErrRecordNotFound) {
  287. return xerr.Custom("该数据不存在!")
  288. }
  289. return xerr.WithStack(err)
  290. }
  291. updateData := &model.SystemMenu{
  292. Name: req.Name,
  293. MenuType: req.MenuType,
  294. Title: req.Title,
  295. Path: req.Path,
  296. Component: req.Component,
  297. Icon: req.Icon,
  298. Sort: req.Sort,
  299. Redirect: req.Redirect,
  300. ParentId: req.ParentId,
  301. }
  302. if err := s.DB.Model(new(model.SystemMenu)).Omit("is_show").
  303. Where("id = ?", systemMenu.Id).
  304. Updates(updateData).Error; err != nil {
  305. return xerr.WithStack(err)
  306. }
  307. return nil
  308. }
  309. // IsShowSystemMenu 菜单是否启用
  310. func (s *StoreEntry) IsShowSystemMenu(ctx context.Context, req *operationPb.IsShowSystemMenuRequest) error {
  311. systemMenu := &model.SystemMenu{Id: req.MenuId}
  312. if err := s.DB.First(systemMenu).Error; err != nil {
  313. if errors.Is(err, gorm.ErrRecordNotFound) {
  314. return xerr.Custom("该数据不存在")
  315. }
  316. return xerr.WithStack(err)
  317. }
  318. if err := s.DB.Model(systemMenu).Update("is_show", req.IsShow).Error; err != nil {
  319. return xerr.WithStack(err)
  320. }
  321. return nil
  322. }
  323. // SearchSystemMenuList 菜单列表查询
  324. func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *operationPb.SearchMenuRequest) (*model.SystemMenuResponse, error) {
  325. systemMenu := make([]*model.SystemMenu, 0)
  326. var count int64 = 0
  327. pref := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", operationPb.IsShow_OK)
  328. if req.Name != "" {
  329. pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
  330. }
  331. if err := pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
  332. Find(&systemMenu).Debug().Error; err != nil {
  333. return nil, xerr.WithStack(err)
  334. }
  335. return &model.SystemMenuResponse{
  336. Page: req.Pagination.Page,
  337. Total: int32(count),
  338. List: model.SystemMenuSlice(systemMenu).ToPB(),
  339. }, nil
  340. }
  341. // DeleteSystemMenu 删除系统菜单
  342. func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
  343. systemMenu := &model.SystemMenu{Id: menuId}
  344. if err := s.DB.First(systemMenu).Error; err != nil {
  345. if errors.Is(err, gorm.ErrRecordNotFound) {
  346. return xerr.Custom("该数据不存在")
  347. }
  348. return xerr.WithStack(err)
  349. }
  350. if err := s.DB.Model(systemMenu).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
  351. return xerr.WithStack(err)
  352. }
  353. return nil
  354. }