
* 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>
126 lines
2.7 KiB
Go
126 lines
2.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common"
|
|
"math/rand"
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
//@author: [piexlmax](https://github.com/piexlmax)
|
|
//@function: StructToMap
|
|
//@description: 利用反射将结构体转化为map
|
|
//@param: obj interface{}
|
|
//@return: map[string]interface{}
|
|
|
|
func StructToMap(obj interface{}) map[string]interface{} {
|
|
obj1 := reflect.TypeOf(obj)
|
|
obj2 := reflect.ValueOf(obj)
|
|
|
|
data := make(map[string]interface{})
|
|
for i := 0; i < obj1.NumField(); i++ {
|
|
if obj1.Field(i).Tag.Get("mapstructure") != "" {
|
|
data[obj1.Field(i).Tag.Get("mapstructure")] = obj2.Field(i).Interface()
|
|
} else {
|
|
data[obj1.Field(i).Name] = obj2.Field(i).Interface()
|
|
}
|
|
}
|
|
return data
|
|
}
|
|
|
|
//@author: [piexlmax](https://github.com/piexlmax)
|
|
//@function: ArrayToString
|
|
//@description: 将数组格式化为字符串
|
|
//@param: array []interface{}
|
|
//@return: string
|
|
|
|
func ArrayToString(array []interface{}) string {
|
|
return strings.Replace(strings.Trim(fmt.Sprint(array), "[]"), " ", ",", -1)
|
|
}
|
|
|
|
func Pointer[T any](in T) (out *T) {
|
|
return &in
|
|
}
|
|
|
|
func FirstUpper(s string) string {
|
|
if s == "" {
|
|
return ""
|
|
}
|
|
return strings.ToUpper(s[:1]) + s[1:]
|
|
}
|
|
|
|
func FirstLower(s string) string {
|
|
if s == "" {
|
|
return ""
|
|
}
|
|
return strings.ToLower(s[:1]) + s[1:]
|
|
}
|
|
|
|
// MaheHump 将字符串转换为驼峰命名
|
|
func MaheHump(s string) string {
|
|
words := strings.Split(s, "-")
|
|
|
|
for i := 1; i < len(words); i++ {
|
|
words[i] = strings.Title(words[i])
|
|
}
|
|
|
|
return strings.Join(words, "")
|
|
}
|
|
|
|
// HumpToUnderscore 将驼峰命名转换为下划线分割模式
|
|
func HumpToUnderscore(s string) string {
|
|
var result strings.Builder
|
|
|
|
for i, char := range s {
|
|
if i > 0 && char >= 'A' && char <= 'Z' {
|
|
// 在大写字母前添加下划线
|
|
result.WriteRune('_')
|
|
result.WriteRune(char - 'A' + 'a') // 转小写
|
|
} else {
|
|
result.WriteRune(char)
|
|
}
|
|
}
|
|
|
|
return strings.ToLower(result.String())
|
|
}
|
|
|
|
// RandomString 随机字符串
|
|
func RandomString(n int) string {
|
|
var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
|
b := make([]rune, n)
|
|
for i := range b {
|
|
b[i] = letters[RandomInt(0, len(letters))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func RandomInt(min, max int) int {
|
|
return min + rand.Intn(max-min)
|
|
}
|
|
|
|
// BuildTree 用于构建一个树形结构
|
|
func BuildTree[T common.TreeNode[T]](nodes []T) []T {
|
|
nodeMap := make(map[int]T)
|
|
// 创建一个基本map
|
|
for i := range nodes {
|
|
nodeMap[nodes[i].GetID()] = nodes[i]
|
|
}
|
|
|
|
for i := range nodes {
|
|
if nodes[i].GetParentID() != 0 {
|
|
parent := nodeMap[nodes[i].GetParentID()]
|
|
parent.SetChildren(nodes[i])
|
|
}
|
|
}
|
|
|
|
var rootNodes []T
|
|
|
|
for i := range nodeMap {
|
|
if nodeMap[i].GetParentID() == 0 {
|
|
rootNodes = append(rootNodes, nodeMap[i])
|
|
}
|
|
}
|
|
return rootNodes
|
|
}
|