一个基于 FastAPI 构建的现代化配置管理数据库系统,提供完整的资产管理、用户认证和企业级菜单权限控制功能。
- JWT Token 认证 - 安全的无状态认证
- 完整的RBAC权限控制 - 用户↔角色↔权限的多对多关系
- 层级菜单权限管理 - 支持无限级菜单嵌套和权限控制
- 细粒度权限控制 - 页面级+按钮级双重权限验证
- 动态路由生成 - 根据用户权限自动生成前端路由
- 三种菜单类型 - 目录(1)、菜单(2)、按钮(3)
- 层级结构支持 - 无限级菜单嵌套,自动层级计算
- 权限映射 - 菜单与权限代码的精确关联
- 循环引用检测 - 防止菜单层级形成循环
- 可视化管理 - 树形结构的菜单管理界面
- 资产信息管理
- 资产状态追踪
- 资产关系管理
- FastAPI - 高性能异步Web框架
- MySQL - 关系型数据库
- Redis - 高性能缓存
- SQLAlchemy (异步) - 现代化ORM
- Pydantic - 数据验证和序列化
- Alembic - 数据库迁移管理
- 自动生成的 Swagger UI
- ReDoc 文档
- 清晰的权限分级说明
- Docker 容器化支持
- 环境隔离
- 健康检查
- 日志管理
/health # 健康检查
/docs, /redoc # API文档
/auth/login # 用户登录
/auth/register # 用户注册
/auth/logout # 用户登出
# 用户管理
/api/v1/users/* # 用户CRUD操作
# 用户菜单获取
/api/v1/menus/user # 获取用户菜单和路由配置
/api/v1/menus/tree # 获取用户菜单树
# 角色权限管理
/api/v1/admin/roles/* # 角色管理
/api/v1/admin/permissions/* # 权限管理
/api/v1/admin/roles/{id}/permissions/{id} # 角色权限关联
/api/v1/admin/users/{id}/roles/{id} # 用户角色关联
# 菜单管理
/api/v1/admin/menus # 获取所有菜单列表
/api/v1/admin/menus/tree # 获取菜单树结构
/api/v1/admin/menus/* # 菜单CRUD操作
- 401 Unauthorized - 未登录或token无效
- 403 Forbidden - 权限不足(友好错误提示)
- 404 Not Found - 资源不存在
- 400 Bad Request - 数据验证失败
- Python 3.11+ - 现代Python版本
- FastAPI - 高性能异步Web框架
- FastAPI-Users - 企业级用户认证管理
- SQLAlchemy 2.0 - 现代异步ORM
- Alembic - 数据库迁移工具
- Pydantic - 数据验证和序列化
- MySQL - 主数据库 (支持异步aiomysql)
- Redis - 缓存和会话存储
- JWT - JSON Web Token认证
- Argon2/Bcrypt - 密码哈希算法
- CORS - 跨域资源共享
- Docker - 容器化部署
- uvicorn - ASGI服务器
- Python 3.11 或更高版本
- MySQL 数据库
- Redis 服务器
- Docker (可选)
- 克隆仓库:
git clone https://github.com/himku/python-cmdb.git
cd python-cmdb
- 安装依赖(推荐用 uv):
# 安装 uv(如果还没有安装)
pip install uv
# 创建虚拟环境并安装依赖
uv venv
source .venv/bin/activate # Linux/Mac
# 或 .\.venv\Scripts\activate # Windows
uv sync
# 或使用 pip
# pip install -r requirements.txt
- 配置环境变量:
cp .env.example .env
# 编辑 .env 文件,设置必要的环境变量:
# - MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB
# - REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DB
# - SECRET_KEY
- 准备数据库和 Redis:
# 创建 MySQL 数据库
mysql -u root -p -e "CREATE DATABASE cmdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 确保 Redis 服务正在运行
redis-server
- 初始化数据库结构:
# 运行数据库迁移
alembic upgrade head
# 初始化角色权限数据
python app/database/init_roles_permissions.py
# 初始化菜单数据
python app/database/init_menus.py
python run.py
# 或
uvicorn app.main:app --reload
uvicorn app.main:app --host 0.0.0.0 --port 8000
# 构建镜像
docker build -t cmdb .
# 运行容器
docker run -p 8000:8000 cmdb
{
"menu_type": 1, // 目录 - 用于分组,无具体页面
"menu_type": 2, // 菜单 - 实际页面,有路由路径
"menu_type": 3 // 按钮 - 页面内操作权限
}
工作台 (菜单)
├── path: /dashboard
└── permission_code: dashboard:view
系统管理 (目录)
├── path: /system
├── permission_code: system:manage
├── 用户管理 (菜单)
│ ├── path: /system/user
│ ├── permission_code: user:manage
│ ├── 新增用户 (按钮)
│ │ └── permission_code: user:add
│ ├── 编辑用户 (按钮)
│ │ └── permission_code: user:edit
│ └── 删除用户 (按钮)
│ └── permission_code: user:delete
├── 角色管理 (菜单)
├── 权限管理 (菜单)
└── 菜单管理 (菜单)
curl -X GET 'http://localhost:8000/api/v1/menus/user' \
-H 'Authorization: Bearer {user_token}'
响应示例:
{
"menus": [
{
"id": 1,
"name": "dashboard",
"title": "工作台",
"path": "/dashboard",
"icon": "mdi:monitor-dashboard",
"menu_type": 2,
"children": []
}
],
"routes": [
{
"name": "dashboard",
"path": "/dashboard",
"component": "views/dashboard/index.vue",
"meta": {
"title": "工作台",
"icon": "mdi:monitor-dashboard",
"keepAlive": true
}
}
],
"permissions": ["dashboard:view", "user:manage"]
}
curl -X POST 'http://localhost:8000/api/v1/admin/menus' \
-H 'Authorization: Bearer {admin_token}' \
-H 'Content-Type: application/json' \
-d '{
"name": "reports",
"title": "报表管理",
"path": "/reports",
"component": "views/reports/index.vue",
"menu_type": 2,
"icon": "mdi:chart-line",
"permission_code": "reports:view",
"sort": 10
}'
python-cmdb/
├── app/ # 应用主目录
│ ├── main.py # 🚀 FastAPI应用入口
│ ├── core/ # 🔧 核心功能模块
│ │ ├── config.py # ⚙️ 配置管理
│ │ ├── security.py # 🔐 JWT和密码加密
│ │ └── logging.py # 📝 日志配置
│ ├── api/ # 🌐 API路由层
│ │ ├── deps.py # 💉 依赖注入
│ │ └── v1/ # 📋 API版本控制
│ │ ├── api.py # 🔗 路由聚合器
│ │ └── endpoints/ # 🎯 具体API端点
│ │ ├── users.py # 👤 用户管理API
│ │ ├── roles.py # 🛡️ 角色权限管理API
│ │ └── menus.py # 🗂️ 菜单管理API
│ ├── schemas/ # 📐 Pydantic数据模式
│ │ ├── user.py # 👤 用户数据模式
│ │ ├── auth.py # 🔐 认证数据模式
│ │ ├── role.py # 👥 角色权限模式
│ │ ├── menu.py # 🗂️ 菜单数据模式
│ │ └── asset.py # 💻 资产管理模式
│ ├── services/ # 🔧 业务逻辑层
│ │ ├── user.py # 👤 用户业务逻辑
│ │ ├── role.py # 🛡️ 角色业务逻辑
│ │ ├── permission.py # 🔑 权限业务逻辑
│ │ └── menu.py # 🗂️ 菜单业务逻辑
│ ├── users/ # 👥 用户认证模块
│ │ ├── models.py # 🏛️ 用户、角色、权限、菜单模型
│ │ └── manager.py # 👤 FastAPI-Users管理器
│ ├── database/ # 🗄️ 数据库层
│ │ ├── session.py # 🔗 数据库会话管理
│ │ ├── redis.py # 🔴 Redis连接管理
│ │ ├── init_db.py # 🚀 数据库初始化
│ │ ├── init_roles_permissions.py # 🛡️ 角色权限初始化
│ │ ├── init_menus.py # 🗂️ 菜单数据初始化
│ │ └── migrations/ # 📈 Alembic数据库迁移
│ └── crud/ # 📝 数据访问层
│ └── crud.py # 🔧 通用CRUD操作
├── alembic.ini # 🔄 数据库迁移配置
├── pyproject.toml # 📦 项目依赖和配置
├── uv.lock # 🔒 依赖锁定文件
├── Dockerfile # 🐳 容器化配置
├── run.py # 🏃 应用启动脚本
└── README.md # 📖 项目文档
Users ←→ user_role ←→ Roles ←→ role_permission ←→ Permissions
↓
Menus (permission_code)
- 用户登录 → 获取JWT Token
- 访问接口 → Token验证 → 获取用户角色
- 权限检查 → 角色权限查询 → 访问控制决策
- 菜单生成 → 根据权限过滤菜单 → 返回可访问菜单树
menus表:
CREATE TABLE menus (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL COMMENT '菜单名称',
title VARCHAR(100) NOT NULL COMMENT '菜单标题',
path VARCHAR(255) COMMENT '路由路径',
component VARCHAR(255) COMMENT '组件路径',
parent_id INT COMMENT '父菜单ID',
sort INT DEFAULT 0 COMMENT '排序序号',
level INT DEFAULT 1 COMMENT '菜单层级',
menu_type INT DEFAULT 1 COMMENT '菜单类型',
is_visible BOOLEAN DEFAULT TRUE COMMENT '是否显示',
is_enabled BOOLEAN DEFAULT TRUE COMMENT '是否启用',
icon VARCHAR(100) COMMENT '图标',
permission_code VARCHAR(100) COMMENT '权限代码',
meta TEXT COMMENT '元数据配置',
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
FOREIGN KEY (parent_id) REFERENCES menus(id)
);
- 层级管理: 自引用外键实现无限级嵌套
- 权限映射: permission_code字段关联权限系统
- 元数据支持: meta字段存储自定义配置
- 排序控制: sort字段控制菜单显示顺序
- 类型区分: menu_type区分目录、菜单、按钮
- 全异步I/O: 数据库、Redis、HTTP请求全异步
- 连接池管理: 高效的连接复用
- 依赖注入: FastAPI的依赖注入系统
- 会话管理: 异步数据库会话生命周期管理
- 高并发: 支持大量并发请求
- 低延迟: 异步操作避免阻塞
- 资源高效: 连接池和会话复用
启动应用后,可以通过以下地址访问 API 文档:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
# 1. 未认证访问admin接口 → 401
curl http://localhost:8000/api/v1/admin/menus
# 2. 普通用户访问admin接口 → 403 + 友好提示
curl -H "Authorization: Bearer user_token" \
http://localhost:8000/api/v1/admin/menus
# 响应: {"detail": "只有admin角色可以执行此操作"}
# 3. 普通用户访问用户菜单 → 200
curl -H "Authorization: Bearer user_token" \
http://localhost:8000/api/v1/menus/user
- 完整的企业级RBAC - 用户→角色→权限→菜单的完整链路
- 动态菜单系统 - 基于权限的菜单动态生成
- 异步优先架构 - 现代Python异步技术栈
- 细粒度权限控制 - 页面级+按钮级双重权限
- 智能权限检查 - 友好的错误提示和权限验证
- 高性能: 异步I/O + 连接池 + 缓存
- 高安全: 多层权限验证 + JWT认证
- 高可维护: 清晰的分层架构和文档
- 高扩展: 模块化设计支持功能扩展
- 完整的初始化脚本 - 一键初始化角色权限和菜单
- Docker容器化 - 生产环境部署支持
- 健康检查 - 应用状态监控
- 错误处理 - 完善的异常处理和日志
- API文档 - 自动生成的完整文档
- ✅ 完整的用户认证系统 (FastAPI-Users)
- ✅ 企业级RBAC权限控制
- ✅ 智能菜单权限管理系统
- ✅ 动态路由生成
- ✅ 细粒度权限控制 (页面+按钮)
- ✅ 异步数据库架构
- ✅ Redis缓存集成
- ✅ API文档自动生成
- ✅ 容器化部署支持
- ✅ 完整的初始化脚本
- 🔄 资产管理功能
- 🔄 审计日志系统
- 🔄 数据备份恢复
这个CMDB系统采用现代化的企业级架构设计,特别是完整的菜单权限管理系统,适合中大型企业的IT资产管理和权限控制需求,具备优秀的性能、安全性和可扩展性。
- 遵循 PEP 8 规范
- 使用 Black 进行代码格式化
- 使用 isort 进行导入排序
提交信息格式:
<type>(<scope>): <subject>
<body>
<footer>
类型(type):
- feat: 新功能
- fix: 修复
- docs: 文档
- style: 格式
- refactor: 重构
- test: 测试
- chore: 构建
- main: 主分支
- develop: 开发分支
- feature/*: 功能分支
- bugfix/*: 修复分支
- release/*: 发布分支
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/AmazingFeature
) - 提交更改 (
git commit -m 'Add some AmazingFeature'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 创建 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- 项目维护者:himku
- 邮箱:baemawu@gmail.com
- 项目链接:https://github.com/himku/python-cmdb