# mgt - 系统管理 一个基于 Go 语言开发的企业级 Mgt(Role-Based Access Control)权限管理系统,提供完整的用户、角色、权限、应用和部门管理功能。 [![Go Version](https://img.shields.io/badge/Go-1.25.1-blue.svg)](https://golang.org/) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) ## 📋 目录 - [功能特性](#-功能特性) - [技术栈](#-技术栈) - [项目结构](#-项目结构) - [快速开始](#-快速开始) - [配置说明](#-配置说明) - [API 文档](#-api-文档) - [测试](#-测试) - [开发说明](#-开发说明) - [贡献指南](#-贡献指南) --- ## ✨ 功能特性 ### 核心功能 - 👥 **用户管理** - 完整的用户CRUD操作,支持用户角色和权限分配 - 🎭 **角色管理** - 灵活的角色定义,支持角色权限批量设置 - 🔐 **权限管理** - 多层级权限体系,支持菜单和按钮权限 - 📱 **应用管理** - 多应用支持,应用级别的权限隔离 - 🏢 **部门管理** - 组织架构管理,支持树形结构 ### 安全特性 - 🔒 **密码加密** - 使用 bcrypt 加密存储,支持 MD5 向后兼容 - 🎫 **JWT认证** - 基于 JWT 的 Token 认证机制 - ✅ **参数验证** - 统一的参数验证框架,支持自定义验证规则 - 📝 **统一日志** - 结构化的日志记录,支持多级别日志 - 🛡️ **错误处理** - 统一的错误处理和响应格式 ### 技术特性 - 🚀 **高性能** - 基于 Gin 框架,支持高并发 - 💾 **多数据库支持** - 支持 PostgreSQL 和 MySQL - 🔄 **数据库连接池** - 优化的连接池配置 - 📦 **事务支持** - 完整的事务管理,保证数据一致性 - 🔍 **灵活查询** - 支持复杂的关联查询和数据过滤 --- ## 🛠 技术栈 ### 核心框架 - **Go 1.26.5** - 编程语言 - **Gin** - Web 框架 - **GORM** - ORM 框架 - **PostgreSQL/MySQL** - 数据库 - **Redis** - 缓存和会话存储 ### 主要依赖 - `git.apinb.com/bsm-sdk/core` - 内部 SDK - `github.com/gin-gonic/gin` - HTTP Web 框架 - `gorm.io/gorm` - ORM 框架 - `golang.org/x/crypto` - 加密库(bcrypt) - `go-playground/validator` - 参数验证 ### 开发工具 - VS Code REST Client - API 测试 - Go Testing - 单元测试框架 --- ## 📁 项目结构 ``` mgt/ ├── cmd/ # 应用程序入口 │ └── main/ # 主程序 │ └── main.go ├── internal/ # 内部代码(不对外暴露) │ ├── config/ # 配置管理 │ ├── define/ # 数据结构定义 │ ├── errcode/ # 错误码定义 │ ├── impl/ # 实现层(数据库、Redis等) │ ├── logic/ # 业务逻辑层 │ │ ├── user/ # 用户模块 │ │ ├── role/ # 角色模块 │ │ ├── permission/ # 权限模块 │ │ ├── application/ # 应用模块 │ │ ├── department/ # 部门模块 │ │ └── pub/ # 公共接口(登录等) │ ├── models/ # 数据模型 │ ├── routers/ # 路由注册 │ └── utils/ # 工具函数 │ ├── validator.go # 参数验证 │ ├── handler.go # 错误处理 │ └── logger.go # 日志记录 ├── etc/ # 配置文件 │ ├── mgt_dev.yaml # 开发环境配置 │ ├── mgt_test.yaml # 测试环境配置 │ └── mgt_prod.yaml # 生产环境配置 ├── test/ # API 测试文件 │ ├── *.http # REST Client 测试文件 │ └── ... ├── scripts/ # 脚本工具 │ ├── init_ops_monitor_app.go # 初始化运维监控平台应用脚本 │ ├── cleanup_invalid_links.go # 清理无效关联数据脚本 │ ├── parse_menu_excel.py # Excel菜单解析脚本(Python) │ └── ... ├── other/ # 其他资源文件 │ ├── menu_structure.json # 菜单结构JSON文件 │ └── ... ├── pkg/ # 可复用包 ├── go.mod # Go 模块定义 ├── go.sum # 依赖校验 ├── README.md # 项目说明 └── TEST_EXECUTION_GUIDE.md # 测试执行指南 ``` --- ## 🚀 快速开始 ### 环境要求 - **Go 1.26.5** - [安装指南](https://golang.org/doc/install) - **PostgreSQL 12+** 或 **MySQL 8.0+** - **Redis 6.0+** ### 安装步骤 #### 1. 克隆项目 ```bash git clone cd mgt ``` #### 2. 安装依赖 ```bash go mod download ``` #### 3. 配置数据库 编辑 `etc/mgt_dev.yaml`,配置数据库连接信息: ```yaml Databases: Driver: postgres # 或 mysql Source: - host=localhost user=postgres password=your_password dbname=mgt port=5432 sslmode=disable Cache: redis://:your_password@localhost:6379/0 ``` #### 4. 初始化数据库 系统会在首次启动时自动创建数据表。如果需要初始化管理员用户,设置: ```yaml InitRootUser: true ``` 默认管理员账号: - **账号**: `root` - **密码**: `123456` > ⚠️ **安全提示**: 生产环境请务必修改默认密码! #### 4.1 初始化运维监控平台应用(可选) 如果需要初始化运维监控平台应用及其菜单权限,可以运行: ```bash go run scripts/init_ops_monitor_app.go ``` 此脚本会: - 创建"运维监控平台"应用 - 根据 `other/menu_structure.json` 创建所有菜单权限 - 自动关联超级管理员角色和 root 用户 详细说明请参考 [脚本工具](#脚本工具) 章节。 #### 5. 编译项目 ```bash go build -o mgt.exe bsm/full/module/base/mgt/cmd/main ``` #### 6. 启动服务 ```bash # Windows .\mgt.exe # Linux/Mac ./mgt ``` 或使用启动脚本: ```powershell # Windows PowerShell .\START_TEST.ps1 ``` #### 7. 验证服务 访问健康检查接口: ```bash curl http://rest.apinb.com/mgt/ping ``` --- ## ⚙️ 配置说明 ### 配置文件位置 配置文件位于 `etc/` 目录,支持多环境: - `mgt_dev.yaml` - 开发环境 - `mgt_test.yaml` - 测试环境 - `mgt_prod.yaml` - 生产环境 ### 配置项说明 ```yaml Service: mgt # 服务名称 Port: 10001 # 服务端口 Databases: # 数据库配置 Driver: postgres # 数据库驱动 (postgres/mysql) Source: # 数据库连接字符串 - host=localhost user=postgres password=xxx dbname=mgt port=5432 Cache: redis://:password@localhost:6379/0 # Redis 连接 InitRootUser: false # 是否初始化管理员用户(默认false) SecretKey: xxx # JWT 密钥 OnMicroService: false # 是否启用微服务模式 ``` ### 环境变量 可以通过环境变量 `ENV` 指定配置环境: ```bash export ENV=dev # 使用 mgt_dev.yaml export ENV=test # 使用 mgt_test.yaml export ENV=prod # 使用 mgt_prod.yaml ``` --- ## 📚 API 文档 ### API 基础路径 所有 API 的基础路径格式为:`http://host:port/mgt/v1/` ### 认证说明 大部分接口需要 JWT Token 认证,在请求头中添加: ``` Authorization: Bearer ``` ### API 模块 #### 公共接口(无需认证) | 方法 | 路径 | 说明 | |------|------|------| | GET | `/mgt/v1/ping` | 健康检查 | | POST | `/mgt/v1/login` | 用户登录 | | POST | `/mgt/v1/refresh` | 刷新Token | | POST | `/mgt/v1/reset` | 重置密码 | #### 用户管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mgt/v1/user/create` | 创建用户 | | POST | `/mgt/v1/user/del` | 删除用户 | | POST | `/mgt/v1/user/detail` | 用户详情 | | POST | `/mgt/v1/user/modify` | 修改用户 | | POST | `/mgt/v1/user/fetch` | 用户列表 | | POST | `/mgt/v1/user/set_role` | 设置用户角色 | | POST | `/mgt/v1/user/set_pmn` | 设置用户权限 | | POST | `/mgt/v1/user/role` | 获取用户角色 | | POST | `/mgt/v1/user/pmn` | 获取用户权限 | #### 角色管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mgt/v1/role/create` | 创建角色 | | POST | `/mgt/v1/role/del` | 删除角色 | | POST | `/mgt/v1/role/detail` | 角色详情 | | POST | `/mgt/v1/role/modify` | 修改角色 | | POST | `/mgt/v1/role/fetch` | 角色列表 | | POST | `/mgt/v1/role/set_pmn` | 设置角色权限 | | POST | `/mgt/v1/role/pmn` | 获取角色权限 | #### 权限管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mgt/v1/pmn/create` | 创建权限 | | POST | `/mgt/v1/pmn/del` | 删除权限 | | POST | `/mgt/v1/pmn/detail` | 权限详情 | | POST | `/mgt/v1/pmn/modify` | 修改权限 | | POST | `/mgt/v1/pmn/fetch` | 权限列表 | | POST | `/mgt/v1/pmn/sort` | 权限排序 | #### 应用管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mgt/v1/app/create` | 创建应用 | | POST | `/mgt/v1/app/del` | 删除应用 | | POST | `/mgt/v1/app/detail` | 应用详情 | | POST | `/mgt/v1/app/modify` | 修改应用 | | POST | `/mgt/v1/app/fetch` | 应用列表 | #### 部门管理 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/mgt/v1/dpt/create` | 创建部门 | | POST | `/mgt/v1/dpt/del` | 删除部门 | | POST | `/mgt/v1/dpt/detail` | 部门详情 | | POST | `/mgt/v1/dpt/modify` | 修改部门 | | POST | `/mgt/v1/dpt/fetch` | 部门列表 | | POST | `/mgt/v1/dpt/fetch_tree` | 部门树 | ### API 测试 项目提供了完整的 API 测试文件,位于 `test/` 目录,包含 54 个 `.http` 测试文件。 **推荐使用 VS Code REST Client 插件:** 1. 安装插件:`REST Client` (humao.rest-client) 2. 打开 `test/*.http` 文件 3. 点击 "Send Request" 执行测试 更多测试说明请参考:[测试执行指南](TEST_EXECUTION_GUIDE.md) --- ## 🧪 测试 ### 单元测试 运行参数验证工具函数的单元测试: ```bash go test -v bsm/full/module/base/mgt/internal/utils ``` **测试结果:** ✅ 19个测试用例全部通过 ### API 测试 使用 `test/` 目录下的 HTTP 测试文件进行 API 测试,详细步骤请参考 [测试执行指南](TEST_EXECUTION_GUIDE.md)。 ### 测试覆盖 - ✅ 参数验证测试(手机号、邮箱、密码长度等) - ✅ 错误处理测试 - ✅ 日志格式测试 - ✅ 数据库事务测试 --- ## 👨‍💻 开发说明 ### 代码规范 - 遵循 Go 官方代码规范 - 使用统一的错误处理机制 - 使用统一的日志记录格式 - 所有接口参数需要验证 ### 新增接口流程 1. 在 `internal/define/req.go` 中定义请求结构体 2. 在 `internal/logic/` 对应模块中实现业务逻辑 3. 在 `internal/routers/register.go` 中注册路由 4. 在 `test/` 目录中创建测试文件 ### 工具函数使用 #### 参数验证 ```go import "bsm/full/module/base/mgt/internal/utils" // 验证结构体 if err := libs.ValidateStruct(&request); err != nil { infra.Response.Error(c, errcode.ErrInvalidArgument) return } ``` #### 错误处理 ```go // JSON解析错误 if err := c.ShouldBindJSON(&request); err != nil { infra.Response.Error(c, errcode.ErrJsonUnmarshal) return } // 数据库错误 if err := models.DBService.Create(&user).Error; err != nil { utils.HandleDBError(c, err, "创建用户") return } ``` #### 日志记录 ```go // 信息日志 printer.Info("用户创建成功: ID=%d, account=%s", user.ID, user.Account) // 错误日志 printer.Error("创建用户失败: %v", err) // 警告日志 printer.Info("用户已存在: account=%s", account) ``` ### 数据库模型 所有模型位于 `internal/models/` 目录,使用 GORM 标签定义: ```go type MgtUser struct { coreTypes.Std_IICUDS // 标准字段(ID、创建时间等) Account string `gorm:"column:account;uniqueIndex"` Name string `gorm:"column:name"` Password string `gorm:"column:password"` // ... } ``` ### 脚本工具 项目提供了多个实用脚本,位于 `scripts/` 目录: #### 初始化运维监控平台应用 `init_ops_monitor_app.go` - 根据 `menu_structure.json` 自动创建运维监控平台应用及其菜单权限。 **功能:** - 创建"运维监控平台"应用(workspace: `ops-monitor`) - 根据 JSON 文件自动创建一级和二级菜单权限(17个一级菜单 + 48个二级菜单) - 自动生成权限标识码(Code)、英文标题(TitleEn)、图标等 - 自动关联超级管理员角色和 root 用户 - 自动建立所有关联关系(用户-应用、用户-角色、角色-应用、角色-权限、用户-权限) **前置条件:** - 确保数据库中已存在超级管理员角色(名称:`超级管理员`) - 确保数据库中已存在 root 用户(账号:`root`) - 确保 `other/menu_structure.json` 文件存在且格式正确 **JSON 文件格式:** ```json { "menus": [ { "level1": "首页", "level1_path": "/", "children": [] }, { "level1": "可视化大屏管理", "level1_path": "/visual", "children": [ { "level2": "我的组件", "path": "/visual/component" } ] } ], "total_level1": 17, "total_level2": 48 } ``` **使用方法:** ```bash # 确保 menu_structure.json 文件存在于 other/ 目录 go run scripts/init_ops_monitor_app.go ``` **输出示例:** ``` ✅ 应用创建成功: 运维监控平台 (ID: 15, Workspace: ops-monitor) ✅ 获取超级管理员角色成功: 超级管理员 (ID: 1) ✅ 获取root用户成功: root (ID: 1) ✅ 创建一级菜单: 首页 (Code: ops:首页) ✅ 创建二级菜单: 可视化大屏管理 - 我的组件 (Code: ops:可视化大屏管理:我的组件) ... ✅ 菜单创建完成,共创建/获取 65 个权限(一级菜单: 17, 二级菜单: 48) ✅ 关联root用户和应用成功 ✅ 关联root用户和超级管理员角色成功 ✅ 关联超级管理员角色和应用成功 ✅ 关联超级管理员角色和权限成功,共 65 个权限 ✅ 关联root用户和权限成功,共 65 个权限 ✅ 运维监控平台应用初始化完成! ``` **注意事项:** - 脚本使用事务执行,确保数据一致性,失败时自动回滚 - 如果应用或菜单已存在(通过 code 和 app_id 判断),会跳过创建并使用现有记录 - 脚本会自动重置 PostgreSQL 序列号,避免主键冲突 - 脚本是幂等的,可以安全地多次运行 - 权限标识码(Code)格式:一级菜单为 `ops:菜单名`,二级菜单为 `ops:一级菜单名:二级菜单名` #### 清理无效关联数据 `cleanup_invalid_links.go` - 清理数据库中无效的关联记录。 **功能:** - 清理 `mgt_link_user_role` 中引用了不存在用户或角色的记录 - 清理 `mgt_link_user_dpt` 中引用了不存在用户或部门的记录 - 清理 `mgt_link_user_app` 中引用了不存在用户或应用的记录 - 清理 `mgt_link_user_pmn` 中引用了不存在用户、应用或权限的记录 - 清理 `mgt_link_role_app` 中引用了不存在角色或应用的记录 - 清理 `mgt_link_role_pmn` 中引用了不存在角色、应用或权限的记录 **使用方法:** ```bash go run scripts/cleanup_invalid_links.go ``` **输出示例:** ``` 开始清理无效的关联数据... ✅ 清理 mgt_link_user_role: 删除 5 条无效记录 ✅ 清理 mgt_link_user_dpt: 删除 2 条无效记录 ✅ 清理 mgt_link_user_app: 删除 1 条无效记录 ✅ 清理 mgt_link_user_pmn: 删除 3 条无效记录 ✅ 清理 mgt_link_role_app: 删除 0 条无效记录 ✅ 清理 mgt_link_role_pmn: 删除 0 条无效记录 ✅ 清理完成!共删除 11 条无效记录 ✅ 所有无效关联数据已清理完成! ``` **注意事项:** - 脚本使用事务执行,确保数据一致性 - 只清理软删除的记录(deleted_at IS NULL) - 建议定期运行此脚本,保持数据库数据一致性 --- ## 📝 更新日志 ### 最新特性 - ✅ 统一的参数验证框架 - ✅ 统一的错误处理机制 - ✅ 结构化的日志记录 - ✅ 完整的测试覆盖 - ✅ 支持 bcrypt 密码加密(向后兼容 MD5) - ✅ 运维监控平台应用初始化脚本 ### 优化改进 - 🔧 数据库连接池优化 - 🔧 事务处理优化 - 🔧 代码质量提升 - 🔧 接口迁移完成(38个接口) 详细更新记录请参考: - [P0修复总结](P0_FIXES_SUMMARY.md) - [P1修复总结](P1_FIXES_SUMMARY.md) - [P2修复总结](P2_FIXES_SUMMARY.md) - [优化建议](OPTIMIZATION_SUGGESTIONS.md) --- ## 🤝 贡献指南 欢迎贡献代码!请遵循以下步骤: 1. Fork 本项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ### 提交规范 - 代码必须通过 linter 检查 - 新增功能需要添加测试 - 更新相关文档 --- ## 📄 许可证 本项目采用 MIT 许可证。详情请查看 [LICENSE](LICENSE) 文件。 --- ## 👥 联系方式 如有问题或建议,请通过以下方式联系: - 提交 Issue - 发送 Pull Request --- **⭐ 如果这个项目对你有帮助,欢迎 Star!**