diff --git a/model/gmodel/ldap_apis_logic.go b/model/gmodel/ldap_apis_logic.go index b679da41..92aec596 100644 --- a/model/gmodel/ldap_apis_logic.go +++ b/model/gmodel/ldap_apis_logic.go @@ -33,7 +33,7 @@ func (s *LdapApisModel) FindPage(ctx context.Context, req FindPageReq) (resp []L } func (s *LdapApisModel) FindOneById(ctx context.Context, id int64) (resp LdapApis, err error) { - db := s.db.WithContext(ctx).Model(&LdapApis{}) + db := s.db.WithContext(ctx).Model(&LdapApis{}).Where("id = ?", id) err = db.Take(&resp).Error return resp, err diff --git a/model/gmodel/ldap_group_logic.go b/model/gmodel/ldap_group_logic.go index e68225aa..c37c2fcf 100644 --- a/model/gmodel/ldap_group_logic.go +++ b/model/gmodel/ldap_group_logic.go @@ -1,2 +1,51 @@ package gmodel -// TODO: 使用model的属性做你想做的 \ No newline at end of file + +import ( + "context" + "time" +) + +// TODO: 使用model的属性做你想做的 + +// FindPage 分页查询 +func (s *LdapGroupModel) FindPage(ctx context.Context, req FindPageReq) (resp []LdapGroup, total int64, err error) { + db := s.db.WithContext(ctx).Model(&LdapGroup{}) + if req.Fields != "" { + db = db.Select(req.Fields) + } + if req.Sort != "" { + db = db.Order(req.Sort) + } + //查询数量 + if err = db.Limit(1).Count(&total).Error; err != nil { + return nil, 0, err + } + offset := (req.Page - 1) * req.Limit + err = db.Offset(offset).Limit(req.Limit).Find(&resp).Error + return resp, total, err +} + +func (s *LdapGroupModel) FindOneById(ctx context.Context, id int64) (resp LdapGroup, err error) { + db := s.db.WithContext(ctx).Model(&LdapGroup{}).Where("id = ?", id) + + err = db.Take(&resp).Error + return resp, err +} + +// InsertOne 单个插入 +func (s *LdapGroupModel) InsertOne(ctx context.Context, insertData LdapGroup) error { + db := s.db.WithContext(ctx).Model(&LdapGroup{}) + var nowTime = time.Now().UTC() + insertData.Ctime = &nowTime + insertData.Utime = &nowTime + result := db.Create(&insertData) + return result.Error +} + +// UpdateOne 单个更新 +func (s *LdapGroupModel) UpdateOne(ctx context.Context, model LdapGroup, updateData map[string]interface{}) error { + db := s.db.WithContext(ctx).Model(&model) + updateData["utime"] = time.Now().UTC() + result := db.Updates(updateData) + return result.Error +} diff --git a/server/ldap-admin/internal/handler/deleteldapgrouphandler.go b/server/ldap-admin/internal/handler/deleteldapgrouphandler.go new file mode 100644 index 00000000..d6fb3eac --- /dev/null +++ b/server/ldap-admin/internal/handler/deleteldapgrouphandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/ldap-admin/internal/logic" + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" +) + +func DeleteLdapGroupHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.DeleteLdapGroupReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewDeleteLdapGroupLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.DeleteLdapGroup(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/ldap-admin/internal/handler/getldapgroupshandler.go b/server/ldap-admin/internal/handler/getldapgroupshandler.go new file mode 100644 index 00000000..3da4210e --- /dev/null +++ b/server/ldap-admin/internal/handler/getldapgroupshandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/ldap-admin/internal/logic" + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" +) + +func GetLdapGroupsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.GetLdapGroupsReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewGetLdapGroupsLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.GetLdapGroups(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/ldap-admin/internal/handler/routes.go b/server/ldap-admin/internal/handler/routes.go index cc2d93ae..9a931b06 100644 --- a/server/ldap-admin/internal/handler/routes.go +++ b/server/ldap-admin/internal/handler/routes.go @@ -12,6 +12,21 @@ import ( func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + Method: http.MethodGet, + Path: "/api/ldap-admin/get_ldap_group", + Handler: GetLdapGroupsHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/api/ldap-admin/save_ldap_group", + Handler: SaveLdapGroupHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/api/ldap-admin/delete_ldap_group", + Handler: DeleteLdapGroupHandler(serverCtx), + }, { Method: http.MethodGet, Path: "/api/ldap-admin/get_apis", diff --git a/server/ldap-admin/internal/handler/saveldapgrouphandler.go b/server/ldap-admin/internal/handler/saveldapgrouphandler.go new file mode 100644 index 00000000..54ed26e0 --- /dev/null +++ b/server/ldap-admin/internal/handler/saveldapgrouphandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/ldap-admin/internal/logic" + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" +) + +func SaveLdapGroupHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.SaveLdapGroupReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewSaveLdapGroupLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.SaveLdapGroup(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/ldap-admin/internal/logic/deleteldapgrouplogic.go b/server/ldap-admin/internal/logic/deleteldapgrouplogic.go new file mode 100644 index 00000000..68d8a916 --- /dev/null +++ b/server/ldap-admin/internal/logic/deleteldapgrouplogic.go @@ -0,0 +1,75 @@ +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 DeleteLdapGroupLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteLdapGroupLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteLdapGroupLogic { + return &DeleteLdapGroupLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *DeleteLdapGroupLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *DeleteLdapGroupLogic) DeleteLdapGroup(req *types.DeleteLdapGroupReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + resLdapGroup, 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) + } + txErr := l.svcCtx.MysqlConn.WithContext(l.ctx).Transaction(func(tx *gorm.DB) error { + //删除权限组、权限组相关 + resLdapGroupDel := tx.Delete(&resLdapGroup) + if resLdapGroupDel.Error != nil { + return resLdapGroupDel.Error + } + resLdapUserGroupDel := tx.Where("group_id = ?", resLdapGroup.Id).Delete(&gmodel.LdapUserGroup{}) + if resLdapUserGroupDel.Error != nil { + return resLdapUserGroupDel.Error + } + resLdapGroupMenusDel := tx.Where("group_id = ?", resLdapGroup.Id).Delete(&gmodel.LdapGroupMenus{}) + if resLdapGroupMenusDel.Error != nil { + return resLdapGroupMenusDel.Error + } + return nil + }) + if txErr != nil { + l.Logger.Errorf("delete ldap group error: %v", txErr) + basic.CodeServiceErr.Message = "删除失败" + return resp.SetStatus(basic.CodeServiceErr) + } + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *DeleteLdapGroupLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/ldap-admin/internal/logic/getldapgroupslogic.go b/server/ldap-admin/internal/logic/getldapgroupslogic.go new file mode 100644 index 00000000..14918fc1 --- /dev/null +++ b/server/ldap-admin/internal/logic/getldapgroupslogic.go @@ -0,0 +1,68 @@ +package logic + +import ( + "fusenapi/model/gmodel" + "fusenapi/utils/auth" + "fusenapi/utils/basic" + "math" + + "context" + + "fusenapi/server/ldap-admin/internal/svc" + "fusenapi/server/ldap-admin/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetLdapGroupsLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetLdapGroupsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLdapGroupsLogic { + return &GetLdapGroupsLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *GetLdapGroupsLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *GetLdapGroupsLogic) GetLdapGroups(req *types.GetLdapGroupsReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + resList, resCount, err := l.svcCtx.AllModels.LdapGroup.FindPage(l.ctx, gmodel.FindPageReq{ + Page: req.CurrentPage, + Limit: req.PerPage, + }) + if err != nil { + return resp.SetStatus(basic.CodeServiceErr) + } + var pageCount int = 1 + if resCount > int64(req.PerPage) { + var float64Count = float64(resCount) + var float64PerPage = float64(req.PerPage) + pageCountFloat := math.Ceil(float64Count / float64PerPage) + pageCount = int(pageCountFloat) + } + + return resp.SetStatus(basic.CodeOK, map[string]interface{}{ + "list": resList, + "meta": map[string]int{ + "total_count": int(resCount), + "page_count": pageCount, + "current_page": req.CurrentPage, + "per_page": req.PerPage, + }, + }) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *GetLdapGroupsLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/ldap-admin/internal/logic/saveldapgrouplogic.go b/server/ldap-admin/internal/logic/saveldapgrouplogic.go new file mode 100644 index 00000000..6edf9833 --- /dev/null +++ b/server/ldap-admin/internal/logic/saveldapgrouplogic.go @@ -0,0 +1,87 @@ +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 SaveLdapGroupLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewSaveLdapGroupLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveLdapGroupLogic { + return &SaveLdapGroupLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *SaveLdapGroupLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *SaveLdapGroupLogic) SaveLdapGroup(req *types.SaveLdapGroupReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + var err1 error + if req.Id > 0 { + 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 updateMap = make(map[string]interface{}) + if req.Name != "" { + updateMap["name"] = req.Name + } + if req.Keyword != "" { + updateMap["keyword"] = req.Keyword + } + if req.Remark != "" { + updateMap["remark"] = req.Remark + } + if req.Status != 0 { + updateMap["status"] = req.Status + } + if req.Sort != 0 { + updateMap["sort"] = req.Sort + } + err1 = l.svcCtx.AllModels.LdapGroup.UpdateOne(l.ctx, resOne, updateMap) + } else { + err1 = l.svcCtx.AllModels.LdapGroup.InsertOne(l.ctx, gmodel.LdapGroup{ + Name: &req.Name, + Keyword: &req.Keyword, + Remark: &req.Remark, + Status: &req.Status, + Sort: &req.Sort, + }) + } + if err1 != nil { + basic.CodeServiceErr.Message = "系统出错" + return resp.SetStatus(basic.CodeServiceErr) + } + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *SaveLdapGroupLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/ldap-admin/internal/types/types.go b/server/ldap-admin/internal/types/types.go index d92e6240..b7d98c82 100644 --- a/server/ldap-admin/internal/types/types.go +++ b/server/ldap-admin/internal/types/types.go @@ -5,6 +5,29 @@ import ( "fusenapi/utils/basic" ) +type GetLdapGroupsReq struct { + Id int64 `form:"id,optional"` //id + Name string `form:"name,optional"` //名称 + Keyword string `form:"keyword,optional"` //关键词 + Status int64 `form:"status,optional"` // 1正常, 2禁用 + Sort string `form:"sort,optional"` + CurrentPage int `form:"current_page,optional,default=1"` + PerPage int `form:"per_page,optional,default=10"` +} + +type SaveLdapGroupReq struct { + Id int64 `json:"id"` //id + Name string `json:"name"` //名称 + Keyword string `json:"keyword"` //关键词 + Remark string `json:"remark"` // 备注 + Status int64 `json:"status"` // 1正常, 2禁用 + Sort int64 `json:"sort"` // 排序 +} + +type DeleteLdapGroupReq struct { + Id int64 `json:"id"` //id +} + type GetApisReq struct { Sort string `form:"sort,optional"` CurrentPage int `form:"current_page,optional,default=1"` diff --git a/server_api/ldap-admin.api b/server_api/ldap-admin.api index a8d0c65c..9ad25e7e 100644 --- a/server_api/ldap-admin.api +++ b/server_api/ldap-admin.api @@ -26,7 +26,7 @@ service ldap-admin { //保存API @handler SaveApiHandler post /api/ldap-admin/save_api(SaveApiReq) returns (response); - + //保存菜单 @handler SaveMenuHandler post /api/ldap-admin/save_menu(SaveMenuReq) returns (response); @@ -70,10 +70,28 @@ service ldap-admin { @handler RemoveLdapOrganizationMemberHandler post /api/ldap-admin/remove_ldap_organization_member(RemoveLdapOrganizationMemberReq) returns (response); } + type ( - GetLdapGroupsReq {} - SaveLdapGroupReq {} - DeleteLdapGroupReq {} + GetLdapGroupsReq { + Id int64 `form:"id,optional"` //id + Name string `form:"name,optional"` //名称 + Keyword string `form:"keyword,optional"` //关键词 + Status int64 `form:"status,optional"` // 1正常, 2禁用 + Sort string `form:"sort,optional"` + CurrentPage int `form:"current_page,optional,default=1"` + PerPage int `form:"per_page,optional,default=10"` + } + SaveLdapGroupReq { + Id int64 `json:"id"` //id + Name string `json:"name"` //名称 + Keyword string `json:"keyword"` //关键词 + Remark string `json:"remark"` // 备注 + Status int64 `json:"status"` // 1正常, 2禁用 + Sort int64 `json:"sort"` // 排序 + } + DeleteLdapGroupReq { + Id int64 `json:"id"` //id + } ) type GetApisReq {