Files
gva/server/source/system/authorities_menus.go
PiexlMax(奇淼 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
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}