Spring Boot实现项目管理应用User/Project/Task/Role关联及API调用咨询
实体关联关系设计
你这套场景需要新增一个中间关联表ProjectUser来绑定用户、项目、角色三者的关系,避免同一个用户在不同项目的角色冲突,四个核心实体+中间表的关联逻辑如下:
- Role:角色字典表,预设3种固定角色:全局管理员、项目经理、项目普通成员,无动态增删需求
- 与
ProjectUser为一对多关联:一个角色对应多条项目成员分配记录
- 与
- User:系统用户表,存储用户基础账号信息
- 与
ProjectUser为一对多关联:一个用户可加入多个项目,在不同项目拥有不同角色 - 与
Task为一对多关联:一个用户可被分配多个任务,也可作为创建人创建多个任务
- 与
- Project:项目表,存储项目基础信息
- 与
ProjectUser为一对多关联:一个项目下可添加多个成员 - 与
Task为一对多关联:一个项目下可创建多个任务
- 与
- ProjectUser:中间关联表,核心存用户在指定项目的角色,设置
project_id + user_id联合唯一约束避免重复分配
对应的JPA实体核心注解示例:@Entity @Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"project_id", "user_id"})}) public class ProjectUser { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "project_id", nullable = false) private Project project; @ManyToOne @JoinColumn(name = "user_id", nullable = false) private User user; @ManyToOne @JoinColumn(name = "role_id", nullable = false) private Role role; } - Task:任务表,存储任务基础信息
- 关联
Project外键:标记任务所属项目 - 关联
User的creator_id外键:标记任务创建人(对应项目经理) - 关联
User的assignee_id外键:标记任务执行人(对应项目普通成员)
- 关联
API设计与调用规范
采用RESTful风格设计,所有接口需先调用登录接口POST /api/auth/login获取JWT凭证,后续请求在Header中携带Authorization: Bearer ${token},后端通过拦截器解析当前登录用户身份做权限校验:
管理员专属接口(仅全局管理员可调用)
- 创建项目:
POST /api/admin/projects,请求体携带项目名称、描述等基础信息 - 项目分配成员:
POST /api/admin/projects/{projectId}/members,请求体携带用户ID、角色ID(仅支持传入项目经理/普通成员角色ID) - 移除项目成员:
DELETE /api/admin/projects/{projectId}/members/{userId}
项目经理专属接口(仅对应项目的项目经理可调用)
- 创建项目任务:
POST /api/pm/projects/{projectId}/tasks,请求体携带任务名称、描述、截止时间、执行人ID - 编辑任务信息:
PUT /api/pm/projects/{projectId}/tasks/{taskId} - 删除任务:
DELETE /api/pm/projects/{projectId}/tasks/{taskId} - 查询项目下所有成员:
GET /api/pm/projects/{projectId}/members,用于分配任务时筛选可选执行人
通用接口(所有登录用户可调用,返回数据按权限自动过滤)
- 查询我参与的项目列表:
GET /api/user/projects,管理员返回所有项目、项目经理返回自己负责的项目、普通成员返回自己加入的项目 - 查询我的任务列表:
GET /api/user/tasks,支持按项目ID、任务状态筛选 - 修改任务状态:
PUT /api/user/tasks/{taskId}/status,仅任务所属执行人可调用
权限校验核心逻辑:调用接口时先判断用户全局角色,如果是管理员直接放行;如果是项目经理,校验其是否为当前操作项目的项目经理;如果是普通成员,仅允许操作自己所属的任务和项目数据,避免越权。
内容的提问来源于stack exchange,提问作者u.altintas
相关产品推荐
相关产品推荐

