v2_system

This commit is contained in:
2025-03-31 15:06:32 +08:00
parent 6fb06c456c
commit 490630d4c9
17 changed files with 972 additions and 206 deletions

View File

@@ -0,0 +1,174 @@
package system
import (
"context"
"encoding/json"
"strconv"
"time"
"management/internal/db/model/dto"
db "management/internal/db/sqlc"
"management/internal/erpserver/model/view"
"management/internal/global/keys"
"management/internal/pkg/redis"
)
type CategoryBiz interface {
Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error)
Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error)
All(ctx context.Context) ([]*db.Category, error)
List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error)
Get(ctx context.Context, id int32) (*db.Category, error)
Refresh(ctx context.Context) ([]*db.Category, error)
RebuildParentPath(ctx context.Context) error
Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error)
XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error)
}
type categoryBiz struct {
store db.Store
redis redis.IRedis
}
var _ CategoryBiz = (*categoryBiz)(nil)
func NewCategory(store db.Store, redis redis.IRedis) *categoryBiz {
return &categoryBiz{
store: store,
redis: redis,
}
}
func (b *categoryBiz) All(ctx context.Context) ([]*db.Category, error) {
key := keys.GetManageKey(ctx, keys.AllCategories)
bs, err := redis.GetBytes(ctx, key)
if err == nil {
var res []*db.Category
if err := json.Unmarshal(bs, &res); err == nil {
return res, nil
}
}
return b.Refresh(ctx)
}
func (b *categoryBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.Category, int64, error) {
countArg := &db.CountCategoriesConditionParams{
IsStatus: q.SearchStatus != 9999,
Status: int16(q.SearchStatus),
IsID: q.SearchID != 0,
ID: int32(q.SearchID),
IsParentID: q.SearchParentID != 0,
ParentID: int32(q.SearchParentID),
Name: q.SearchName,
}
dataArg := &db.ListCategoriesConditionParams{
IsStatus: q.SearchStatus != 9999,
Status: int16(q.SearchStatus),
IsID: q.SearchID != 0,
ID: int32(q.SearchID),
IsParentID: q.SearchParentID != 0,
ParentID: int32(q.SearchParentID),
Name: q.SearchName,
Skip: (int32(q.Page) - 1) * int32(q.Rows),
Size: int32(q.Rows),
}
count, err := b.store.CountCategoriesCondition(ctx, countArg)
if err != nil {
return nil, 0, err
}
departs, err := b.store.ListCategoriesCondition(ctx, dataArg)
if err != nil {
return nil, 0, err
}
return departs, count, nil
}
func (b *categoryBiz) Get(ctx context.Context, id int32) (*db.Category, error) {
return b.store.GetCategory(ctx, id)
}
func (b *categoryBiz) Create(ctx context.Context, arg *db.CreateCategoryParams) (*db.Category, error) {
return b.store.CreateCategory(ctx, arg)
}
func (b *categoryBiz) Update(ctx context.Context, arg *db.UpdateCategoryParams) (*db.Category, error) {
return b.store.UpdateCategory(ctx, arg)
}
func (b *categoryBiz) Refresh(ctx context.Context) ([]*db.Category, error) {
all, err := b.store.AllCategories(ctx)
if err != nil {
return nil, err
}
bs, err := json.Marshal(all)
if err != nil {
return nil, err
}
redis.Del(ctx, keys.GetManageKey(ctx, keys.AllCategorySimple))
key := keys.GetManageKey(ctx, keys.AllCategories)
err = redis.Set(ctx, key, bs, time.Hour*6)
return all, err
}
func (b *categoryBiz) RebuildParentPath(ctx context.Context) error {
return b.store.CategoryRebuildPath(ctx)
}
func (b *categoryBiz) Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error) {
all, err := b.All(ctx)
if err != nil {
return nil, err
}
return b.toTree(id, all), nil
}
func (b *categoryBiz) XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error) {
all, err := b.All(ctx)
if err != nil {
return nil, err
}
return b.toXmSelectTree(id, all), nil
}
func (b *categoryBiz) toTree(parentId int32, data []*db.Category) []*view.LayuiTree {
var res []*view.LayuiTree
for _, v := range data {
if v.ParentID == parentId {
item := view.LayuiTree{}
item.ID = strconv.FormatInt(int64(v.ID), 10)
item.Title = v.Name
item.Children = b.toTree(v.ID, data)
if v.ParentID == 0 {
item.Spread = true
}
res = append(res, &item)
}
}
return res
}
func (b *categoryBiz) toXmSelectTree(parentId int32, data []*db.Category) []*view.XmSelectTree {
var res []*view.XmSelectTree
for _, v := range data {
if v.ParentID == parentId {
item := view.XmSelectTree{
Name: v.Name,
Value: strconv.FormatInt(int64(v.ID), 10),
Children: b.toXmSelectTree(v.ID, data),
}
res = append(res, &item)
}
}
return res
}

View File

@@ -13,6 +13,11 @@ import (
)
type ConfigBiz interface {
Create(ctx context.Context, arg *db.CreateSysConfigParams) error
Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error
Get(ctx context.Context, id int32) (*db.SysConfig, error)
List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error)
ConfigExpansion
}
@@ -34,6 +39,36 @@ func NewConfig(store db.Store, redis redis.IRedis) *configBiz {
}
}
func (b *configBiz) Create(ctx context.Context, arg *db.CreateSysConfigParams) error {
return b.store.CreateSysConfig(ctx, arg)
}
func (b *configBiz) Update(ctx context.Context, arg *db.UpdateSysConfigByKeyParams) error {
return b.store.UpdateSysConfigByKey(ctx, arg)
}
func (b *configBiz) Get(ctx context.Context, id int32) (*db.SysConfig, error) {
return b.store.GetSysConfig(ctx, id)
}
func (b *configBiz) List(ctx context.Context, q dto.SearchDto) ([]*db.SysConfig, int64, error) {
count, err := b.store.CountSysConfigCondition(ctx, q.SearchKey)
if err != nil {
return nil, 0, err
}
configs, err := b.store.ListSysConfigCondition(ctx, &db.ListSysConfigConditionParams{
Key: q.SearchName,
Skip: (int32(q.Page) - 1) * int32(q.Rows),
Size: int32(q.Rows),
})
if err != nil {
return nil, 0, err
}
return configs, count, nil
}
func (b *configBiz) Pear(ctx context.Context) (*dto.PearConfig, error) {
// 判断redis是否存储
key := keys.GetManageKey(ctx, keys.PearAdmin)

View File

@@ -3,6 +3,7 @@ package system
import (
"context"
"encoding/json"
"slices"
"strconv"
"strings"
"time"
@@ -32,9 +33,11 @@ type MenuExpansion interface {
MapOwnerMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error)
SetOwnerMapMenuByRoleID(ctx context.Context, roleID int32) (map[string]*dto.OwnerMenuDto, error)
RefreshMenus(ctx context.Context) error
SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error)
Tree(ctx context.Context, id int32) ([]*view.LayuiTree, error)
XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree, error)
SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error
}
type menuBiz struct {
@@ -274,6 +277,42 @@ func (b *menuBiz) XmSelect(ctx context.Context, id int32) ([]*view.XmSelectTree,
return b.toXmSelectTree(id, all), nil
}
func (b *menuBiz) SetMenu(ctx context.Context, roleID int32, menus []*db.SysMenu) error {
return b.store.ExecTx(ctx, func(q *db.Queries) error {
err := q.DeleteRoleMneuByRoleID(ctx, roleID)
if err != nil {
return err
}
for _, m := range menus {
err := q.CreateRoleMenu(ctx, &db.CreateRoleMenuParams{
RoleID: roleID,
MenuID: m.ID,
})
if err != nil {
return err
}
}
return nil
})
}
func (b *menuBiz) SetMenuViewData(ctx context.Context, roleID int32) ([]*dto.SetMenuDto, error) {
// 获取该用户已经有的权限
hs, err := b.store.ListSysMenuIDByRoleID(ctx, roleID)
if err != nil {
return nil, err
}
all, err := b.AllMenusCache(ctx)
if err != nil {
return nil, err
}
return toSetMenuTree(all, hs, 0), nil
}
func (b *menuBiz) ownerMenusByRoleID(ctx context.Context, roleID int32) ([]*db.SysMenu, error) {
// 判断当前用户是否有vip角色
role, err := b.store.GetSysRole(ctx, roleID)
@@ -458,3 +497,49 @@ func uniqueSysMenus(sm []*db.SysMenu) []*db.SysMenu {
}
return res
}
func toSetMenuTree(data []*db.SysMenu, ids []int32, parentID int32) []*dto.SetMenuDto {
var res []*dto.SetMenuDto
for _, v := range data {
if v.ParentID == parentID {
isSelect := hasValueInArray(ids, v.ID)
if v.IsList {
item := dto.SetMenuDto{
ID: v.ID,
Name: v.DisplayName,
Link: v.Type,
IsList: v.IsList,
IsSelect: isSelect,
}
item.Items = []*dto.SetMenuDto{
{
ID: v.ID,
Name: "列表",
Link: "btn",
IsList: false,
IsSelect: isSelect,
Items: toSetMenuTree(data, ids, v.ID),
},
}
item.Items = append(item.Items, toSetMenuTree(data, ids, v.ID)...)
res = append(res, &item)
} else {
item := dto.SetMenuDto{
ID: v.ID,
Name: v.DisplayName,
Link: v.Type,
IsList: v.IsList,
IsSelect: isSelect,
Items: toSetMenuTree(data, ids, v.ID),
}
res = append(res, &item)
}
}
}
return res
}
func hasValueInArray(data []int32, id int32) bool {
return slices.Contains(data, id)
}

View File

@@ -14,6 +14,7 @@ type SystemBiz interface {
ConfigBiz() ConfigBiz
AuditBiz() AuditBiz
LoginLogBiz() LoginLogBiz
CategoryBiz() CategoryBiz
}
type systemBiz struct {
@@ -59,3 +60,7 @@ func (b *systemBiz) AuditBiz() AuditBiz {
func (b *systemBiz) LoginLogBiz() LoginLogBiz {
return NewLoginLog(b.store)
}
func (b *systemBiz) CategoryBiz() CategoryBiz {
return NewCategory(b.store, b.redis)
}