Files
gin-vue-admin/server/source/system/authorities_menus.go
T
6323688fca 发布dev2.8.2版本 (#2025)
* refactor(server): 重构服务器启动和重载逻辑

将服务器启动和重载逻辑进行重构,提取初始化系统为单独函数,优化代码结构。删除冗余的服务器初始化文件,统一使用新的 `server_run.go` 实现优雅关闭和重载功能。同时,将“重启服务”改为“重载服务”以更准确地描述功能。

* refactor: 重构系统事件处理、JWT和Casbin相关逻辑

- 将系统重载逻辑提取到独立的`system_events.go`文件中,并引入全局事件管理器
- 将JWT相关操作从`service`层移动到`utils`层,减少服务层依赖
- 将Casbin实例管理逻辑提取到`utils`层,统一管理Casbin实例的初始化和获取
- 删除冗余的`CreateSysOperationRecord`方法,优化操作记录中间件逻辑

* refactor(server): 重构服务初始化和关闭逻辑

将 `RunServer` 函数重命名为 `initServer`,并调整其调用方式以简化代码。同时,在系统初始化时添加 `SetupHandlers` 函数以注册全局处理函数,提升代码可维护性。

* fix: 修复自动化代码enum查询条件的bug

* fix: 修复组合模式下,顶部菜单重复bug

* refactor: 修改名称 RunWindowsServer ==> RunServer

* 新增mcp

* feat: 支持mcp服务

* feat:调整mcp结构,增加客户端和测试用例

* feat:更换mcp基础包和结构

* feat:提交客户端工具测试用例

* feat: 增加自动创建 mcp Tool模板 功能

* fix: 增加默认值属性

* feat: 调整初始化menu的逻辑

* feat: 调整初始config.yaml

* feat: 增加全局GVA_MCP_SERVER属性,方便灵活化开发。

* feat: 优化自动化mcp逻辑和成功展示

* feat: 优化mcp tool nickname工具

* feat: 发布2.8.2 Beta版本

---------

Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>
Co-authored-by: Gor-c <creup@outlook.com>
Co-authored-by: QIN xiansheng <sjjlnaps@163.com>
2025-05-13 19:24:54 +08:00

122 lines
3.5 KiB
Go

package system
import (
"context"
sysModel "github.com/flipped-aurora/gin-vue-admin/server/model/system"
"github.com/flipped-aurora/gin-vue-admin/server/service/system"
"github.com/pkg/errors"
"gorm.io/gorm"
)
const initOrderMenuAuthority = initOrderMenu + initOrderAuthority
type initMenuAuthority struct{}
// auto run
func init() {
system.RegisterInit(initOrderMenuAuthority, &initMenuAuthority{})
}
func (i *initMenuAuthority) MigrateTable(ctx context.Context) (context.Context, error) {
return ctx, nil // do nothing
}
func (i *initMenuAuthority) TableCreated(ctx context.Context) bool {
return false // always replace
}
func (i *initMenuAuthority) InitializerName() string {
return "sys_menu_authorities"
}
func (i *initMenuAuthority) InitializeData(ctx context.Context) (next context.Context, err error) {
db, ok := ctx.Value("db").(*gorm.DB)
if !ok {
return ctx, system.ErrMissingDBContext
}
initAuth := &initAuthority{}
authorities, ok := ctx.Value(initAuth.InitializerName()).([]sysModel.SysAuthority)
if !ok {
return ctx, errors.Wrap(system.ErrMissingDependentContext, "创建 [菜单-权限] 关联失败, 未找到权限表初始化数据")
}
allMenus, ok := ctx.Value(new(initMenu).InitializerName()).([]sysModel.SysBaseMenu)
if !ok {
return next, errors.Wrap(errors.New(""), "创建 [菜单-权限] 关联失败, 未找到菜单表初始化数据")
}
next = ctx
// 构建菜单ID映射,方便快速查找
menuMap := make(map[uint]sysModel.SysBaseMenu)
for _, menu := range allMenus {
menuMap[menu.ID] = menu
}
// 为不同角色分配不同权限
// 1. 超级管理员角色(888) - 拥有所有菜单权限
if err = db.Model(&authorities[0]).Association("SysBaseMenus").Replace(allMenus); err != nil {
return next, errors.Wrap(err, "为超级管理员分配菜单失败")
}
// 2. 普通用户角色(8881) - 仅拥有基础功能菜单
// 仅选择部分父级菜单及其子菜单
var menu8881 []sysModel.SysBaseMenu
// 添加仪表盘、关于我们和个人信息菜单
for _, menu := range allMenus {
if menu.ParentId == 0 && (menu.Name == "dashboard" || menu.Name == "about" || menu.Name == "person" || menu.Name == "state") {
menu8881 = append(menu8881, menu)
}
}
if err = db.Model(&authorities[1]).Association("SysBaseMenus").Replace(menu8881); err != nil {
return next, errors.Wrap(err, "为普通用户分配菜单失败")
}
// 3. 测试角色(9528) - 拥有部分菜单权限
var menu9528 []sysModel.SysBaseMenu
// 添加所有父级菜单
for _, menu := range allMenus {
if menu.ParentId == 0 {
menu9528 = append(menu9528, menu)
}
}
// 添加部分子菜单 - 系统工具、示例文件等模块的子菜单
for _, menu := range allMenus {
parentName := ""
if menu.ParentId > 0 && menuMap[menu.ParentId].Name != "" {
parentName = menuMap[menu.ParentId].Name
}
if menu.ParentId > 0 && (parentName == "systemTools" || parentName == "example") {
menu9528 = append(menu9528, menu)
}
}
if err = db.Model(&authorities[2]).Association("SysBaseMenus").Replace(menu9528); err != nil {
return next, errors.Wrap(err, "为测试角色分配菜单失败")
}
return next, nil
}
func (i *initMenuAuthority) DataInserted(ctx context.Context) bool {
db, ok := ctx.Value("db").(*gorm.DB)
if !ok {
return false
}
auth := &sysModel.SysAuthority{}
if ret := db.Model(auth).
Where("authority_id = ?", 9528).Preload("SysBaseMenus").Find(auth); ret != nil {
if ret.Error != nil {
return false
}
return len(auth.SysBaseMenus) > 0
}
return false
}