123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- package service
- import (
- "context"
- "encoding/json"
- "errors"
- "gadmin/config"
- "gadmin/internal/admin/consts"
- "gadmin/internal/admin/forms"
- "gadmin/internal/gorm/model"
- "gadmin/internal/gorm/query"
- "gadmin/utility/serializer"
- "github.com/gin-gonic/gin"
- "github.com/sirupsen/logrus"
- "github.com/spf13/cast"
- "gorm.io/gorm"
- "time"
- )
- // AdminRole 后台角色
- var AdminRole = new(sAdminRole)
- type sAdminRole struct{}
- func (s *sAdminRole) List(ctx *gin.Context, req forms.AdminRoleListReq) serializer.Response {
- var (
- q = query.Use(config.AdminDB).AdminRole
- m = q.WithContext(ctx)
- offset int64 = 0
- models forms.UserAccountListRes
- lists []*forms.AdminRoleListModel
- )
- m = m.Order(q.Sort).Order(q.ID.Desc())
- req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
- count, err := m.Count()
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
- }
- if count > 0 {
- if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
- }
- }
- for _, v := range lists {
- systemIds := make([]int32, 0)
- if err := json.Unmarshal([]byte(cast.ToString(v.Systems)), &systemIds); err != nil {
- return serializer.Err(consts.CodeParamErr, "格式化出错 Systems", err)
- }
- v.Systems = systemIds
- permissionsMap := make(map[int32][]int32)
- pagesMap := make(map[int32][]int32)
- for _, sid := range systemIds {
- if _, ok := config.LogDBGroup[sid]; !ok {
- continue
- }
- logDB := query.Use(config.LogDBGroup[sid])
- pq := logDB.AdminRolePermission
- mq := logDB.AdminRoleMenu
- // 查询该角色各系统下的权限
- permissionIds := make([]int32, 0)
- if err := pq.Where(pq.RoleID.Eq(int32(v.ID))).Pluck(pq.PermissionID, &permissionIds); err != nil {
- return serializer.Err(consts.CodeParamErr, "查询出错 permissionsModels", err)
- }
- if _, ok := permissionsMap[sid]; ok {
- permissionsMap[sid] = append(permissionsMap[sid], permissionIds...)
- } else {
- permissionsMap[sid] = permissionIds
- }
- // 查询该角色各系统下的页面
- pageIds := make([]int32, 0)
- if err := mq.Where(mq.RoleID.Eq(int32(v.ID))).Pluck(mq.PageID, &pageIds); err != nil {
- return serializer.Response{}
- }
- if _, ok := pagesMap[sid]; ok {
- pagesMap[sid] = append(pagesMap[sid], pageIds...)
- } else {
- pagesMap[sid] = pageIds
- }
- }
- v.Permissions = permissionsMap
- v.Pages = pagesMap
- }
- models.List = lists
- models.Page = req.Page
- models.PerPage = req.PerPage
- models.PageCount = (count + req.PerPage - 1) / req.PerPage
- return serializer.Suc(models)
- }
- func (s *sAdminRole) Edit(ctx *gin.Context, req forms.AdminRoleEditReq) serializer.Response {
- q := query.Use(config.AdminDB).AdminRole
- uq := query.Use(config.AdminDB).AdminUser
- logrus.Warnf("req:%+v", req)
- type systemOperation struct {
- Permissions []*model.AdminRolePermission
- Pages []*model.AdminRoleMenu
- }
- systemOperations := make(map[int32]*systemOperation)
- for sysId, menus := range req.Pages {
- if _, ok := systemOperations[sysId]; !ok {
- systemOperations[sysId] = &systemOperation{
- Permissions: make([]*model.AdminRolePermission, 0),
- Pages: make([]*model.AdminRoleMenu, 0),
- }
- }
- for _, menu := range menus {
- systemOperations[sysId].Pages = append(systemOperations[sysId].Pages, &model.AdminRoleMenu{
- SystemID: sysId,
- RoleID: int32(req.ID),
- PageID: menu,
- })
- }
- }
- for sysId, permissions := range req.Permissions {
- if _, ok := systemOperations[sysId]; !ok {
- systemOperations[sysId] = &systemOperation{
- Permissions: make([]*model.AdminRolePermission, 0),
- Pages: make([]*model.AdminRoleMenu, 0),
- }
- }
- for _, id := range permissions {
- systemOperations[sysId].Permissions = append(systemOperations[sysId].Permissions, &model.AdminRolePermission{
- SystemID: sysId,
- RoleID: int32(req.ID),
- PermissionID: id,
- })
- }
- }
- systems, err := json.Marshal(req.Systems)
- if err != nil {
- return serializer.Err(consts.CodeParamErr, "格式化出错 Systems:", err)
- }
- // 修改
- if req.ID > 0 {
- update := &model.AdminRole{
- Name: req.Name,
- Key: req.Key,
- Sort: req.Sort,
- Remark: req.Remark,
- Status: req.Status,
- Systems: string(systems),
- UpdatedAt: time.Now(),
- }
- // 修改角色基本信息
- _, err := q.Where(q.ID.Eq(req.ID)).Updates(update)
- if err != nil {
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 各系统权限、页面处理
- for sysId, it := range systemOperations {
- if _, ok := config.LogDBGroup[sysId]; !ok {
- continue
- }
- logDB := query.Use(config.LogDBGroup[sysId])
- mq := logDB.AdminRoleMenu
- pq := logDB.AdminRolePermission
- queryTx := logDB.Begin()
- // 删除旧的菜单权限
- if _, err := queryTx.AdminRoleMenu.Where(mq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 插入新的菜单权限
- if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 删除旧的操作权限
- if _, err := queryTx.AdminRolePermission.Where(pq.RoleID.Eq(int32(req.ID))).Delete(); err != nil {
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 插入新的操作权限
- if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- queryTx.Commit()
- }
- // 查询该角色下的用户,清空token
- users, _ := query.Use(config.AdminDB).AdminUser.Where(uq.RoleID.Eq(int32(req.ID))).Find()
- for _, user := range users {
- config.TokenRedis.Del(config.GetUserTokenKey(user.ID))
- }
- return serializer.Suc(nil)
- }
- // 新增
- create := &model.AdminRole{
- Name: req.Name,
- Key: req.Key,
- Sort: req.Sort,
- Systems: string(systems),
- Remark: req.Remark,
- Status: req.Status,
- UpdatedAt: time.Now(),
- CreatedAt: time.Now(),
- }
- if err := q.WithContext(ctx).Create(create); err != nil {
- logrus.Error(err)
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 插入新的菜单权限
- for sysId, it := range systemOperations {
- if _, ok := config.LogDBGroup[sysId]; !ok {
- continue
- }
- logDB := query.Use(config.LogDBGroup[sysId])
- queryTx := logDB.Begin()
- for i := range it.Pages {
- it.Pages[i].RoleID = int32(create.ID)
- }
- for i := range it.Permissions {
- it.Permissions[i].RoleID = int32(create.ID)
- }
- // 插入页面权限
- if err := queryTx.AdminRoleMenu.Create(it.Pages...); err != nil {
- logrus.Error(err)
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- // 插入操作权限
- if err := queryTx.AdminRolePermission.Create(it.Permissions...); err != nil {
- logrus.Error(err)
- queryTx.Rollback()
- return serializer.Err(consts.CodeDBError, "更新出错", err)
- }
- queryTx.Commit()
- }
- return serializer.Suc(nil)
- }
- func (s *sAdminRole) GetRole(ctx *gin.Context, req forms.AdminRoleReq) (*model.AdminRole, error) {
- var (
- q = query.Use(config.AdminDB).AdminRole
- m = q.WithContext(ctx)
- )
- result, err := m.Where(q.ID.Eq(req.ID)).First()
- if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
- return nil, err
- }
- return result, nil
- }
- func (s *sAdminRole) GetAllSystem() ([]*model.AdminSystem, error) {
- var (
- q = query.Use(config.AdminDB).AdminSystem
- )
- systems, err := q.Find()
- if err != nil {
- logrus.Error(err)
- }
- return systems, nil
- }
- func (s *sAdminRole) GetOperation(systemId int32) ([]*model.AdminOperation, error) {
- if _, ok := config.LogDBGroup[systemId]; !ok {
- logrus.Warnf("系统不存在systemId:%v", systemId)
- return []*model.AdminOperation{}, nil
- }
- q := query.Use(config.LogDBGroup[systemId]).AdminOperation
- //q := query.Use(config.AdminDB).AdminMenu
- m := q.WithContext(context.Background())
- operations, err := m.Find()
- if err != nil {
- logrus.Error(err)
- return nil, err
- }
- //retMenus := handleMenus(operations)
- return operations, nil
- }
|