企业级需求管理工具(关注后续开源)
1. 项目概述
1.1 项目简介
需求管理工具是一个基于 Flask 的企业级需求管理系统,旨在帮助团队高效管理软件需求的全生命周期。系统提供需求创建、状态流转、依赖分析、追溯矩阵等核心功能,并支持 RBAC 角色权限控制和多项目管理。



1.2 版本信息
| 项目 | 版本 |
|---|---|
| Flask | 3.0.0 |
| Flask-SQLAlchemy | 3.0.x |
| 系统版本 | v0.3.2 |
2. 功能模块介绍
2.1 核心功能模块
| 模块 | 功能描述 | 状态 |
|---|---|---|
| 需求管理 | 需求的 CRUD、状态流转、版本历史 | 已完成 |
| 项目管理 | 多项目支持、项目切换、项目成员管理 | 已完成 |
| 目标管理 | 目标创建、层级关系、需求关联 | 已完成 |
| 场景管理 | 业务场景定义、与需求关联 | 已完成 |
| 依赖分析 | 需求间依赖关系、循环检测、影响分析 | 已完成 |
| 追溯矩阵 | 需求-测试用例追溯 | 已完成 |
| 导入导出 | CSV/JSON 格式数据导入导出 | 已完成 |
| RBAC权限 | 角色权限控制、项目级权限 | 已完成 |
2.2 需求状态机
草稿(draft) → 评审中(under_review) → 已批准(approved) → 实现中(implementing) → 已完成(done)
↑ ↓ ↑
└─────────────────────←─────────────────────┘
↑ ↓
已驳回(rejected) ←──────────┘
↓
退回修改 → 草稿
2.3 角色权限体系
| 角色 | 权限说明 |
|---|---|
admin |
超级管理员,拥有所有权限 |
pm |
项目经理,管理项目和成员 |
po |
产品经理,创建和编辑需求 |
developer |
开发人员,实现需求 |
tester |
测试人员,编写测试用例 |
viewer |
观察者,仅查看权限 |
3. 应用架构设计
3.1 架构概述
采用经典的 MVC 架构模式,结合 Flask Blueprint 进行模块化设计。
┌─────────────────────────────────────────────────────────────┐
│ 展示层 (View) │
│ templates/ (Jinja2模板) + static/ (CSS/JS/静态资源) │
├─────────────────────────────────────────────────────────────┤
│ 控制层 (Controller) │
│ app.py (主应用路由) + auth.py (认证蓝图) │
├─────────────────────────────────────────────────────────────┤
│ 业务层 (Service) │
│ rbac.py (权限服务) + graph_engine.py (图分析引擎) │
│ export_import.py (导入导出服务) │
├─────────────────────────────────────────────────────────────┤
│ 数据层 (Model) │
│ models.py (SQLAlchemy模型) + SQLite数据库 │
└─────────────────────────────────────────────────────────────┘
3.2 核心组件职责
| 组件 | 文件 | 职责描述 |
|---|---|---|
| 主应用 | app.py |
路由定义、请求处理、业务逻辑 |
| 认证模块 | auth.py |
用户登录/注册/管理、会话管理 |
| 权限控制 | rbac.py |
角色定义、权限检查、访问控制 |
| 图引擎 | graph_engine.py |
依赖分析、循环检测、关键路径 |
| 数据模型 | models.py |
数据库表定义、ORM操作 |
| 导入导出 | export_import.py |
数据格式转换、批量导入导出 |
3.3 请求处理流程
用户请求 → Flask路由 → 认证检查(login_required) → 权限检查(require_permission)
→ 业务逻辑处理 → 数据库操作 → 模板渲染 → HTTP响应
4. 数据架构设计
4.1 数据库表结构
4.1.1 用户表 (users)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id |
INTEGER | PRIMARY KEY | 用户ID |
username |
VARCHAR(80) | UNIQUE, NOT NULL | 用户名 |
password_hash |
VARCHAR(255) | NOT NULL | 密码哈希 |
email |
VARCHAR(120) | UNIQUE | 邮箱(可选) |
role |
VARCHAR(20) | DEFAULT 'viewer' | RBAC角色 |
is_active |
BOOLEAN | DEFAULT TRUE | 是否激活 |
created_at |
DATETIME | DEFAULT NOW | 创建时间 |
4.1.2 项目表 (projects)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id |
INTEGER | PRIMARY KEY | 项目ID |
code |
VARCHAR(20) | UNIQUE, NOT NULL | 项目编码(如 PROJ-001) |
name |
VARCHAR(200) | NOT NULL | 项目名称 |
description |
TEXT | 项目描述 | |
color |
VARCHAR(7) | DEFAULT '#0d6efd' | 项目颜色标识 |
is_active |
BOOLEAN | DEFAULT TRUE | 是否激活 |
created_at |
DATETIME | DEFAULT NOW | 创建时间 |
4.1.3 需求表 (requirements)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id |
INTEGER | PRIMARY KEY | 需求ID |
req_id |
VARCHAR(20) | UNIQUE, NOT NULL | 需求编码(如 REQ-001) |
title |
VARCHAR(200) | NOT NULL | 需求标题 |
description |
TEXT | 需求描述 | |
req_type |
VARCHAR(20) | DEFAULT 'functional' | 类型 |
priority |
VARCHAR(10) | DEFAULT 'medium' | 优先级 |
status |
VARCHAR(20) | DEFAULT 'draft' | 状态 |
complexity |
VARCHAR(5) | DEFAULT 'M' | 复杂度 |
source |
VARCHAR(100) | 需求来源 | |
goal_id |
INTEGER | FOREIGN KEY | 关联目标 |
project_id |
INTEGER | FOREIGN KEY | 所属项目 |
created_at |
DATETIME | DEFAULT NOW | 创建时间 |
updated_at |
DATETIME | ON UPDATE NOW | 更新时间 |
4.1.4 依赖关系表 (dependencies)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id |
INTEGER | PRIMARY KEY | 依赖ID |
from_req_id |
INTEGER | FOREIGN KEY, NOT NULL | 源需求 |
to_req_id |
INTEGER | FOREIGN KEY, NOT NULL | 目标需求 |
relation_type |
VARCHAR(20) | DEFAULT 'depends_on' | 关系类型 |
description |
VARCHAR(200) | 描述 |
4.1.5 关联表
| 表名 | 用途 |
|---|---|
requirement_tags |
需求与标签的多对多关系 |
project_members |
项目成员关联(用户-项目) |
4.2 ER关系图
User 1 ─── * ProjectMember * ─── 1 Project
│ │
│ ├─ * Requirement
│ └─ * Goal
│
└─ * ReviewComment
Requirement 1 ─── * Scenario
Requirement 1 ─── * TestCase
Requirement 1 ─── * RequirementHistory
Requirement * ─── * Tag (多对多)
Requirement * ─── * Dependency * ─── * Requirement
Goal 1 ─── * Requirement
Goal * ─── * Goal (自引用层级)
4.3 核心数据模型关系
# 项目包含需求
class Project(db.Model):
requirements = db.relationship('Requirement', backref='project')
goals = db.relationship('Goal', backref='project')
# 需求关联目标
class Requirement(db.Model):
goal_id = db.Column(db.Integer, db.ForeignKey('goals.id'))
goal = db.relationship('Goal', backref='requirements')
# 需求间依赖
class Dependency(db.Model):
from_req_id = db.Column(db.Integer, db.ForeignKey('requirements.id'))
to_req_id = db.Column(db.Integer, db.ForeignKey('requirements.id'))
5. 开发技术栈
5.1 技术选型
| 分类 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 语言 | Python | 3.10+ | 开发语言 |
| 框架 | Flask | 3.0.0 | Web应用框架 |
| ORM | Flask-SQLAlchemy | 3.0.x | 数据库ORM |
| 数据库 | SQLite | 3.x | 轻量级数据库 |
| 模板 | Jinja2 | 3.1.x | 模板引擎 |
| 前端 | Bootstrap | 5.3.x | UI框架 |
| 图标 | Bootstrap Icons | 1.10.x | 图标库 |
| 图分析 | NetworkX | 3.1 | 图算法库 |
5.2 关键依赖说明
# requirements.txt 核心依赖
Flask==3.0.0
Flask-SQLAlchemy==3.1.1
networkx==3.1
5.3 项目目录结构
project/
├── app.py # 主应用入口
├── auth.py # 认证蓝图
├── rbac.py # RBAC权限控制
├── models.py # 数据模型
├── graph_engine.py # 图分析引擎
├── export_import.py # 导入导出模块
├── init_db.py # 数据库初始化
├── init_rbac.py # RBAC初始化
├── init_project_members.py# 项目成员初始化
├── .venv/ # 虚拟环境
├── docs/ # 文档目录
├── static/ # 静态资源
│ ├── style.css # 自定义样式
│ └── js/ # JavaScript文件
└── templates/ # Jinja2模板
├── base.html # 基础模板
├── dashboard.html # 仪表盘
├── auth/ # 认证相关模板
├── requirements/ # 需求管理模板
├── projects/ # 项目管理模板
├── goals/ # 目标管理模板
├── scenarios/ # 场景管理模板
├── tags/ # 标签管理模板
├── graph/ # 图视图模板
└── users/ # 用户管理模板
6. 概要设计
6.1 核心业务流程
6.1.1 需求创建流程
sequenceDiagram
participant User as 用户
participant App as app.py
participant Model as models.py
participant DB as SQLite
User->>App: POST /requirements/create
App->>App: 生成唯一 req_id
App->>Model: 创建 Requirement 对象
Model->>DB: INSERT INTO requirements
Model->>Model: 记录变更历史
Model->>DB: INSERT INTO requirement_history
DB-->>Model: 返回成功
Model-->>App: 返回需求对象
App-->>User: 重定向到详情页
6.1.2 状态流转流程
sequenceDiagram
participant User as 用户
participant App as app.py
participant Model as models.py
participant DB as SQLite
User->>App: POST /requirements/{id}/transition
App->>Model: 验证状态转换合法性
alt 合法转换
Model->>Model: 更新状态
Model->>Model: 记录状态变更历史
Model->>DB: UPDATE requirements SET status=?
DB-->>Model: 返回成功
App-->>User: 成功消息
else 非法转换
App-->>User: 错误消息
end
6.1.3 依赖分析流程
用户请求 → graph_engine.py → 构建图 → 执行分析 → 返回结果
├─ 循环检测 (detect_cycles)
├─ 影响分析 (impact_analysis)
├─ 优先级一致性检查 (check_priority_consistency)
└─ 关键路径分析 (calculate_critical_path)
6.2 API 接口设计
6.2.1 需求管理接口
| 接口 | 方法 | 权限 | 描述 |
|---|---|---|---|
/requirements |
GET | 登录用户 | 获取需求列表 |
/requirements/create |
POST | REQ_CREATE | 创建需求 |
/requirements/<int:id> |
GET | 登录用户 | 获取需求详情 |
/requirements/<int:id>/edit |
POST | REQ_EDIT | 编辑需求 |
/requirements/<int:id>/delete |
POST | REQ_DELETE | 删除需求 |
6.2.2 图分析接口
| 接口 | 方法 | 权限 | 描述 |
|---|---|---|---|
/api/graph/data |
GET | 登录用户 | 获取图数据 |
/api/graph/impact/<int:req_id> |
GET | 登录用户 | 影响分析 |
/api/graph/priority-check |
GET | 登录用户 | 优先级检查 |
/api/graph/critical-path |
GET | 登录用户 | 关键路径 |
6.2.3 导入导出接口
| 接口 | 方法 | 权限 | 描述 |
|---|---|---|---|
/export/csv |
GET | EXPORT | 导出CSV |
/export/json |
GET | EXPORT | 导出JSON |
/import/upload |
POST | IMPORT | 上传文件 |
/import/confirm |
POST | IMPORT | 确认导入 |
6.3 权限控制设计
# 权限定义 (rbac.py)
class Permission(Enum):
REQ_CREATE = 'req_create'
REQ_EDIT = 'req_edit'
REQ_DELETE = 'req_delete'
PROJECT_CREATE = 'project_create'
PROJECT_EDIT = 'project_edit'
PROJECT_DELETE = 'project_delete'
IMPORT = 'import'
EXPORT = 'export'
# 角色权限映射
class Role(Enum):
ADMIN = 'admin' # 所有权限
PM = 'pm' # 项目管理权限
PO = 'po' # 需求创建/编辑权限
DEVELOPER = 'developer' # 部分编辑权限
TESTER = 'tester' # 测试用例权限
VIEWER = 'viewer' # 只读权限
7. 部署方法
7.1 开发环境部署
7.1.1 环境要求
-
Python 3.10+
-
pip 包管理工具
-
Git
7.1.2 步骤
# 1. 初始化数据库
python init_db.py
# 2. 初始化RBAC权限
python init_rbac.py
# 3. 运行开发服务器
python app.py
7.2 生产环境部署
7.2.1 使用 Gunicorn
# 安装 Gunicorn
pip install gunicorn
# 启动生产服务器
gunicorn -w 4 -b 0.0.0.0:5000 app:app
7.2.2 使用 Docker
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]
7.3 配置说明
# app.py 关键配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///requirements.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'your-secret-key-here'
8. 启动方法
8.1 开发模式启动
# 方法1:直接运行
python app.py
# 方法2:使用 Flask CLI
flask run --debug
# 方法3:指定端口
flask run --host=0.0.0.0 --port=8080
8.2 访问地址
启动后访问:http://localhost:5000
8.3 默认管理员账户
系统初始化后创建默认管理员:
- 用户名:
admin
9. 代码规范
9.1 Python 代码规范
-
遵循 PEP 8 规范
-
使用 4 空格缩进
-
函数/方法名使用 snake_case
-
类名使用 PascalCase
-
常量使用 UPPER_CASE
9.2 SQLAlchemy 规范
-
模型类名使用单数形式(如
User,非Users) -
表名使用复数形式(如
users) -
外键命名:
{关联表名}_id(如project_id) -
使用
backref定义反向关联
9.3 模板规范
-
模板文件使用
.html扩展名 -
继承
base.html基础模板 -
使用
{% block %}定义可扩展区域 -
变量命名使用 snake_case
10. 测试指南
10.1 单元测试
# 示例测试结构
import unittest
from app import app
from models import db, User
class TestUserManagement(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
self.client = app.test_client()
with app.app_context():
db.create_all()
def tearDown(self):
with app.app_context():
db.session.remove()
db.drop_all()
def test_user_creation(self):
# 测试用户创建逻辑
pass
10.2 运行测试
# 运行所有测试
python -m unittest discover
# 运行指定测试
python -m unittest tests.test_auth
11. 常见问题
11.1 数据库连接问题
问题:SQLite 数据库文件权限不足
解决方案:
chmod 644 requirements.db
11.2 依赖安装问题
问题:NetworkX 安装失败
解决方案:
pip install --no-cache-dir networkx
11.3 启动问题
问题:端口被占用
解决方案:
# 查看占用端口
netstat -ano | findstr :5000
# 使用其他端口
flask run --port=8080
12. 附录
12.1 需求状态说明
| 状态码 | 显示名称 | 说明 |
|---|---|---|
draft |
草稿 | 需求初稿,待完善 |
under_review |
评审中 | 提交评审,等待审核 |
approved |
已批准 | 评审通过,可开始实现 |
rejected |
已驳回 | 评审未通过,需修改 |
implementing |
实现中 | 开发人员正在实现 |
done |
已完成 | 需求已实现并验收 |
12.2 优先级说明
| 优先级 | 说明 |
|---|---|
critical |
关键需求,必须实现 |
high |
高优先级,重要需求 |
medium |
中优先级,一般需求 |
low |
低优先级,可选需求 |
12.3 复杂度说明
| 复杂度 | 说明 |
|---|---|
S |
简单,1-2天工作量 |
M |
中等,3-5天工作量 |
L |
复杂,1-2周工作量 |
XL |
非常复杂,2周以上 |