后台权限组详情/授权菜单接口等等

This commit is contained in:
momo
2023-11-22 10:16:47 +08:00
parent ca1c10382a
commit 1a9d4eca2e
20 changed files with 195 additions and 265 deletions

View File

@@ -11,22 +11,22 @@ import (
"fusenapi/server/ldap-admin/internal/types"
)
func SetLdapGroupMenusHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
func GetLdapGroupDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SetLdapGroupMenusReq
var req types.GetLdapGroupDetailReq
userinfo, err := basic.RequestParse(w, r, svcCtx, &req)
if err != nil {
return
}
// 创建一个业务逻辑层实例
l := logic.NewSetLdapGroupMenusLogic(r.Context(), svcCtx)
l := logic.NewGetLdapGroupDetailLogic(r.Context(), svcCtx)
rl := reflect.ValueOf(l)
basic.BeforeLogic(w, r, rl)
resp := l.SetLdapGroupMenus(&req, userinfo)
resp := l.GetLdapGroupDetail(&req, userinfo)
if !basic.AfterLogic(w, r, rl, resp) {
basic.NormalAfterLogic(w, r, resp)

View File

@@ -17,6 +17,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/api/ldap-admin/get_ldap_group",
Handler: GetLdapGroupsHandler(serverCtx),
},
{
Method: http.MethodGet,
Path: "/api/ldap-admin/get_ldap_group_detail",
Handler: GetLdapGroupDetailHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/api/ldap-admin/save_ldap_group",
@@ -29,13 +34,8 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
},
{
Method: http.MethodPost,
Path: "/api/ldap-admin/set_ldap_group_menus",
Handler: SetLdapGroupMenusHandler(serverCtx),
},
{
Method: http.MethodPost,
Path: "/api/ldap-admin/set_ldap_casbin_rule",
Handler: SetLdapCasbinRuleHandler(serverCtx),
Path: "/api/ldap-admin/set_ldap_group_auth",
Handler: SetLdapGroupAuthHandler(serverCtx),
},
{
Method: http.MethodPost,

View File

@@ -11,22 +11,22 @@ import (
"fusenapi/server/ldap-admin/internal/types"
)
func SetLdapCasbinRuleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
func SetLdapGroupAuthHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.SetLdapCasbinRuleReq
var req types.SetLdapGroupAuthReq
userinfo, err := basic.RequestParse(w, r, svcCtx, &req)
if err != nil {
return
}
// 创建一个业务逻辑层实例
l := logic.NewSetLdapCasbinRuleLogic(r.Context(), svcCtx)
l := logic.NewSetLdapGroupAuthLogic(r.Context(), svcCtx)
rl := reflect.ValueOf(l)
basic.BeforeLogic(w, r, rl)
resp := l.SetLdapCasbinRule(&req, userinfo)
resp := l.SetLdapGroupAuth(&req, userinfo)
if !basic.AfterLogic(w, r, rl, resp) {
basic.NormalAfterLogic(w, r, resp)

View File

@@ -50,10 +50,6 @@ func (l *DeleteApiLogic) DeleteApi(req *types.DeleteApiReq, userinfo *auth.UserI
if resLdapApiDel.Error != nil {
return resLdapApiDel.Error
}
resLdapCasbinRulesDel := tx.Where("v3 IN ?", req.Ids).Delete(&gmodel.LdapCasbinRule{})
if resLdapCasbinRulesDel.Error != nil {
return resLdapCasbinRulesDel.Error
}
return nil
})
if txErr != nil {

View File

@@ -55,14 +55,6 @@ func (l *DeleteLdapGroupLogic) DeleteLdapGroup(req *types.DeleteLdapGroupReq, us
if resLdapUserGroupDel.Error != nil {
return resLdapUserGroupDel.Error
}
resLdapGroupMenusDel := tx.Where("group_id IN ?", req.Ids).Delete(&gmodel.LdapGroupMenus{})
if resLdapGroupMenusDel.Error != nil {
return resLdapGroupMenusDel.Error
}
resLdapCasbinRulesDel := tx.Where("v0 IN ?", req.Ids).Delete(&gmodel.LdapCasbinRule{})
if resLdapCasbinRulesDel.Error != nil {
return resLdapCasbinRulesDel.Error
}
return nil
})
if txErr != nil {

View File

@@ -4,9 +4,10 @@ import (
"fusenapi/model/gmodel"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
"gorm.io/gorm"
"time"
"gorm.io/gorm"
"context"
"fusenapi/server/ldap-admin/internal/svc"
@@ -48,9 +49,7 @@ func (l *DeleteMenuLogic) DeleteMenu(req *types.DeleteMenuReq, userinfo *auth.Us
if err != nil {
return err
}
//删除分组绑定的菜单
groupMenusModel := gmodel.NewLdapGroupMenusModel(tx)
return groupMenusModel.DeleteByMenuId(l.ctx, req.Id)
return nil
})
if err != nil {
logx.Error(err)

View File

@@ -0,0 +1,77 @@
package logic
import (
"encoding/json"
"errors"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
"context"
"fusenapi/server/ldap-admin/internal/svc"
"fusenapi/server/ldap-admin/internal/types"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type GetLdapGroupDetailLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetLdapGroupDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLdapGroupDetailLogic {
return &GetLdapGroupDetailLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// 处理进入前逻辑w,r
// func (l *GetLdapGroupDetailLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
func (l *GetLdapGroupDetailLogic) GetLdapGroupDetail(req *types.GetLdapGroupDetailReq, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null
resOne, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.Id)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
basic.CodeServiceErr.Message = "记录不存在"
} else {
basic.CodeServiceErr.Message = "系统出错"
}
return resp.SetStatus(basic.CodeServiceErr)
}
var metadata []GroupAuth
if resOne.Metadata != nil {
err := json.Unmarshal(*resOne.Metadata, &metadata)
if err != nil {
basic.CodeServiceErr.Message = "系统出错"
return resp.SetStatus(basic.CodeServiceErr)
}
}
return resp.SetStatus(basic.CodeOK, map[string]interface{}{
"id": resOne.Id,
"name": resOne.Name,
"keyword": resOne.Keyword,
"remark": resOne.Remark,
"status": resOne.Status,
"sort": resOne.Sort,
"metadata": metadata,
})
}
type GroupAuth struct {
Id int64 `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Metadata *GroupAuth `json:"metadata"`
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *GetLdapGroupDetailLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }

View File

@@ -37,8 +37,9 @@ func (l *GetLdapGroupsLogic) GetLdapGroups(req *types.GetLdapGroupsReq, userinfo
// userinfo 传入值时, 一定不为null
resList, resCount, err := l.svcCtx.AllModels.LdapGroup.FindPage(l.ctx, gmodel.FindPageReq{
Page: req.CurrentPage,
Limit: req.PerPage,
Page: req.CurrentPage,
Limit: req.PerPage,
Fields: "id,name,keyword,remark,status,sort",
})
if err != nil {
return resp.SetStatus(basic.CodeServiceErr)

View File

@@ -1,78 +0,0 @@
package logic
import (
"errors"
"fusenapi/model/gmodel"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
"strconv"
"context"
"fusenapi/server/ldap-admin/internal/svc"
"fusenapi/server/ldap-admin/internal/types"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type SetLdapCasbinRuleLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewSetLdapCasbinRuleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetLdapCasbinRuleLogic {
return &SetLdapCasbinRuleLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// 处理进入前逻辑w,r
// func (l *SetLdapCasbinRuleLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
func (l *SetLdapCasbinRuleLogic) SetLdapCasbinRule(req *types.SetLdapCasbinRuleReq, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null
resLdapGroupInfo, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.GroupId)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
basic.CodeServiceErr.Message = "权限组记录不存在"
} else {
basic.CodeServiceErr.Message = "系统出错"
}
return resp.SetStatus(basic.CodeServiceErr)
}
resLdapApiList, err := l.svcCtx.AllModels.LdapApis.FindAll(l.ctx, l.svcCtx.MysqlConn.Where("id IN ?", req.ApIds))
if err != nil {
return resp.SetStatus(basic.CodeServiceErr)
}
if len(resLdapApiList) > 0 {
var groupIdStr = strconv.Itoa(int(resLdapGroupInfo.Id))
var ldapCasbinRules []gmodel.LdapCasbinRule
for _, ldapApi := range resLdapApiList {
var apiIdStr = strconv.Itoa(int(ldapApi.Id))
ldapCasbinRules = append(ldapCasbinRules, gmodel.LdapCasbinRule{
V0: &groupIdStr,
V1: ldapApi.Path,
V2: ldapApi.Method,
V3: &apiIdStr,
})
}
resCreateInBatches := l.svcCtx.MysqlConn.WithContext(l.ctx).CreateInBatches(ldapCasbinRules, 100)
if resCreateInBatches.Error != nil {
basic.CodeServiceErr.Message = "系统出错"
return resp.SetStatus(basic.CodeServiceErr)
}
}
return resp.SetStatus(basic.CodeOK)
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *SetLdapCasbinRuleLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }

View File

@@ -0,0 +1,43 @@
package logic
import (
"fusenapi/utils/auth"
"fusenapi/utils/basic"
"context"
"fusenapi/server/ldap-admin/internal/svc"
"fusenapi/server/ldap-admin/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type SetLdapGroupAuthLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewSetLdapGroupAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetLdapGroupAuthLogic {
return &SetLdapGroupAuthLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// 处理进入前逻辑w,r
// func (l *SetLdapGroupAuthLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
func (l *SetLdapGroupAuthLogic) SetLdapGroupAuth(req *types.SetLdapGroupAuthReq, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null
return resp.SetStatus(basic.CodeOK)
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *SetLdapGroupAuthLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }

View File

@@ -1,66 +0,0 @@
package logic
import (
"errors"
"fusenapi/model/gmodel"
"fusenapi/utils/auth"
"fusenapi/utils/basic"
"context"
"fusenapi/server/ldap-admin/internal/svc"
"fusenapi/server/ldap-admin/internal/types"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type SetLdapGroupMenusLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewSetLdapGroupMenusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SetLdapGroupMenusLogic {
return &SetLdapGroupMenusLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// 处理进入前逻辑w,r
// func (l *SetLdapGroupMenusLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) {
// }
func (l *SetLdapGroupMenusLogic) SetLdapGroupMenus(req *types.SetLdapGroupMenusReq, userinfo *auth.UserInfo) (resp *basic.Response) {
// 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data)
// userinfo 传入值时, 一定不为null
resLdapGroupInfo, err := l.svcCtx.AllModels.LdapGroup.FindOneById(l.ctx, req.GroupId)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
basic.CodeServiceErr.Message = "权限组记录不存在"
} else {
basic.CodeServiceErr.Message = "系统出错"
}
return resp.SetStatus(basic.CodeServiceErr)
}
var groupMenus []gmodel.LdapGroupMenus
for _, menuId := range req.MenuIds {
groupMenus = append(groupMenus, gmodel.LdapGroupMenus{
GroupId: &resLdapGroupInfo.Id,
MenuId: &menuId,
})
}
resCreateInBatches := l.svcCtx.MysqlConn.WithContext(l.ctx).CreateInBatches(groupMenus, 100)
if resCreateInBatches.Error != nil {
basic.CodeServiceErr.Message = "系统出错"
return resp.SetStatus(basic.CodeServiceErr)
}
return resp.SetStatus(basic.CodeOK)
}
// 处理逻辑后 w,r 如:重定向, resp 必须重新处理
// func (l *SetLdapGroupMenusLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) {
// // httpx.OkJsonCtx(r.Context(), w, resp)
// }

View File

@@ -5,6 +5,22 @@ import (
"fusenapi/utils/basic"
)
type GetLdapGroupDetailReq struct {
Id int64 `json:"id"`
}
type SetLdapGroupAuthReq struct {
GroupId int64 `json:"group_id"`
GroupAuth GroupAuth `json:"group_auth"`
}
type GroupAuth struct {
Id int64 `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Metadata string `json:"metadata,optional"`
}
type GetLdapGroupsReq struct {
Id int64 `form:"id,optional"` //id
Name string `form:"name,optional"` //名称