第三次团队作业:需求改进&系统设计
团队名称:洛珈山下
日期:2025-11-22
本周工程目标
| 维度 | 目标 |
|---|---|
| 对齐进度 | 将第二次作业“校正后的安排”细化为可执行任务并分配到人 |
| 接口落地 | 给出“已冻结”的 RESTful 接口文档(路径、请求/响应、错误码、Mock) |
| 前端联调 | 输出Mock 服务器(基于 Vite+Express)与真接口并行方案 |
| 测试左移 | 为每个接口写出单元测试用例(gtest/doctest)与Postman 集合 |
| 风险闭环 | 建立每日 Stand-up 模板与燃尽图追踪机制 |
本周(第12周)详细任务分解
原则:一张卡一个可交付物,粒度 ≤ 4 h,全部录入 Gitee Issues(标签:week-12)
| 序号 | 任务卡标题 | 描述 / 验收标准 | 后端负责人 | 前端负责人 | 计划工时 |
|---|---|---|---|---|---|
| 12-1 | 【用户】登录/注册接口冻结 | 文档+Mock+单元测试通过 | 齐思贤 | 张嘉铭 | 4 h |
| 12-2 | 【用户】JWT 中间件 & 全局异常 | 401/403/429 统一返回 | 齐思贤 | — | 3 h |
| 12-3 | 【商户】创建商户 & 冻结字段 | 包含审核状态流转 | 阿丽亚 | — | 5 h |
| 12-4 | 【商户】商户详情+列表接口 | 分页、校区/分类筛选 | 阿丽亚 | 彭文昊 | 5 h |
| 12-5 | 【点评】发布点评 & 图片上传 | OSS 直签+本地 Mock | 谢嘉骏 | 张嘉铭 | 6 h |
| 12-6 | 【点评】点赞/取消点赞 | Redis INCR + 定时落库 | 谢嘉骏 | — | 3 h |
| 12-7 | 【收藏】收藏/取消收藏 | 幂等设计 | 袁镇清 | 彭文昊 | 3 h |
| 12-8 | 【搜索】ES 索引 Mapping | 商户 & 点评 2 个索引 | 袁镇清 | — | 4 h |
| 12-9 | 【Mock】前端联调服务器 | 基于 Vite-plugin-mock | — | 张嘉铭 | 4 h |
| 12-10 | 【部署】CI 流水线 | Go 单元测试+编译镜像 | 齐思贤 | — | 3 h |
题目任务
1. 需求&原型改进:(20分)
1.1按照老师的问题进行修改:(5分)
老师没有提出任何问题,这里不用进行修改。
1.2修改完善上周提交的需求规格说明书(10分)
1.2.1:我们把第12周的任务计划详细的写出来了,并放到了前面,并没有直接在原版上修改
1.2.2:我们分好了小组,分割好了任务,每个小组都有自己的工作:
后端任务分割
| 组别 | 接口列表(完整路径) | 预计工时 | 备注(可先Mock) |
|---|---|---|---|
| 后端A组(用户 + 收藏 + 通知) | - POST /api/v1/users/register - POST /api/v1/users/login - GET /api/v1/users/me - PUT /api/v1/users/me - POST /api/v1/collections - DELETE /api/v1/collections/{merchant_id} - GET /api/v1/users/me/collections - GET /api/v1/notifications - PUT /api/v1/notifications/{id}/read - PUT /api/v1/notifications/read-all |
6-8天 | 最独立,先做完可供前端登录使用 |
| 后端B组(商户核心 + 管理员审核) | - POST /api/v1/merchants(创建待审核) - GET /api/v1/merchants(列表,支持?category_id=&campus=) - GET /api/v1/merchants/{id}(详情) - GET /api/v1/admin/merchants/pending - PUT /api/v1/admin/merchants/{id}/approve - PUT /api/v1/admin/merchants/{id}/reject(带reject_reason) |
7-9天 | 商户主流程,核心 |
| 后端C组(点评 + 互动) | - POST /api/v1/reviews(发布点评) - GET /api/v1/merchants/{id}/reviews - POST /api/v1/reviews/{id}/like - POST /api/v1/reviews/{review_id}/replies(一级回复) - GET /api/v1/reviews/{review_id}/replies |
7-9天 | 点评互动,依赖商户存在 |
| 前端任务分割 | |||
| 组别 | 负责人 | 页面列表(路由) | 预计工时 |
| ----------------------------------------------------- | ------ | ------------------------------------------------------------ | -------- |
| 前端A组(登录 + 我的 + 通知 + 收藏) | FE1 | - /login 登录页 - /register 注册页 - /pages/my/index 个人中心 - /pages/my/collections 我的收藏 - /pages/my/reviews 我的点评(可选) - /pages/notification/list 通知中心 |
8-10天 |
| 前端B组(首页 + 商户 + 点评 + 发布 + 管理员后台) | FE2 | - /pages/index/index 首页 - /pages/category/list 分类列表 - /pages/merchant/detail 商户详情(含点评列表) - /pages/review/post 发布点评页 - /pages/review/detail 点评详情页(含回复) - /pages/admin/* 管理员后台全部页面 |
10-12天 |
人员分组
| 小组 | 人员 | 任务 |
|---|---|---|
| 后端1组 | 齐思贤,阿里亚 | 后端A组 |
| 后端2组 | 袁镇清,谢嘉骏 | 后端C组 |
| 前端组 | 彭文昊,张嘉铭 | 前端A,B组 |
| 运维与管理人员 | 林旭坚 | 管理工程,“救火队长” |
1.3参考《构建之法》5节功能的定位和优先级,给出功能分析的四个象限(2分)
| 象限 | 类型 | 描述 | 示例功能 |
|---|---|---|---|
| 第一象限 | 杀手级(高优先、高差异) | 核心竞争力,独特卖点 | 匿名点评、楼中楼回复、实时评分更新、智能商户推荐 |
| 第二象限 | 外围级(低优先、低差异) | 基础支持,非核心 | 管理员操作日志、数据统计导出、系统设置 |
| 第三象限 | 必要级(高优先、低差异) | 必须有,但无差异 | 用户注册/登录、商户信息展示、基础点评发布 |
| 第四象限 | 辅助级(低优先、高差异) | 锦上添花,可后期加 | 点评情感分析、用户行为画像、高级搜索筛选 |
1.4根据修改后的需求,调整任务分解WBS及相应的项目进度计划(3分)
我们现在任务已经分配下去了,现在已经通知每个团队,先进行自己的高优先任务。(举例:齐思贤先进行登录和注册,袁镇清进行楼中楼服务)
2. 系统设计:(50分)
2.1如何才能最大限度地实现这些需求,这就是架构设计要解决的问题。请给出系统的架构设计

分层说明:
2.1.1:前端层:客户端层(Client Layer)
职责(解决什么问题):用户交互界面,发起 HTTP/HTTPS 请求。
2.2.2: API 网关层(Gateway Layer)
职责(解决什么问题):统一入口,路由转发,抵御ddos攻击等。
2.2.3 后台层:微服务层(Microservice Layer)
因为后台有7部分,所以用一张表格加以描述:
| 服务名称 | 职责 |
|---|---|
| User Service | 用户注册、登录、信息管理 |
| Merchant Service | 商户信息管理、审核状态 |
| Review Service | 点评发布、点赞、回复 |
| Collection Service | 用户收藏管理 |
| Search Service | 全文检索(商户、点评) |
| Notification Service | 消息推送、通知管理 |
| Audit Service | 商户/点评审核、权限控制 |
2.2.4 数据层(Data Layer)
职责(解决什么问题):存储数据,供后台使用。
2.2完成团队项目的数据库设计,并在随笔中提供相应ER图(如果必要)
ER图如下:

这是一个可行的数据库设计:
用户方面:
-- 用户表
CREATE TABLE user (id BIGINT PRIMARY KEY COMMENT '主键(可以用雪花算法生成)',student_id VARCHAR(20) UNIQUE NOT NULL COMMENT '学号,唯一标识',password_hash VARCHAR(255) NOT NULL COMMENT '加密的密码哈希值,这里用BCrypt加密',nickname VARCHAR(50) NOT NULL COMMENT '用户昵称',avatar_url VARCHAR(500) DEFAULT '' COMMENT '用户头像URL地址',role ENUM('user', 'admin') DEFAULT 'user' COMMENT '用户角色:user-普通用户,admin-管理员',review_count INT DEFAULT 0 COMMENT '用户发表的点评数量',collection_count INT DEFAULT 0 COMMENT '用户收藏的商家数量',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间'
);-- 用户收藏表
CREATE TABLE collection (id BIGINT PRIMARY KEY COMMENT '收藏记录ID,主键',user_id BIGINT NOT NULL COMMENT '用户ID,外键关联user表',merchant_id BIGINT NOT NULL COMMENT '商家ID,外键关联merchant表',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '收藏创建时间',UNIQUE KEY uk_user_merchant (user_id, merchant_id) COMMENT '用户与商家唯一索引,防止重复收藏',FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (merchant_id) REFERENCES merchant(id)
);
商户方面:
-- 商户分类表
CREATE TABLE merchant_category (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',name VARCHAR(50) NOT NULL COMMENT '分类名称:食堂/超市/教学楼/图书馆...',description VARCHAR(200) COMMENT '分类描述',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
);-- 商户表
CREATE TABLE merchant (id BIGINT PRIMARY KEY COMMENT '主键ID,可以使用雪花算法生成',name VARCHAR(100) NOT NULL COMMENT '商户名称',campus VARCHAR(50) NOT NULL COMMENT '所属校区:东校区/西校区...',category_id BIGINT NOT NULL COMMENT '商户分类ID,关联merchant_category表',address VARCHAR(200) COMMENT '商户详细地址',business_hours VARCHAR(100) COMMENT '营业时间',avg_score DECIMAL(2,1) DEFAULT 0.0 COMMENT '平均评分',review_count INT DEFAULT 0 COMMENT '评价数量',collection_count INT DEFAULT 0 COMMENT '收藏数量',status TINYINT DEFAULT 10 COMMENT '状态:10-待审核,20-已审核,30-已驳回',create_user_id BIGINT NOT NULL COMMENT '创建用户ID,关联user表',tags JSON COMMENT '标签数组,存储商户标签信息',images JSON COMMENT '图片URL数组,存储商户相关图片',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',FOREIGN KEY (category_id) REFERENCES merchant_category(id),FOREIGN KEY (create_user_id) REFERENCES user(id)
);
点评互动相关方面:
-- 点评表
CREATE TABLE review (id BIGINT PRIMARY KEY COMMENT '本身的ID(默认雪花id)',merchant_id BIGINT NOT NULL COMMENT '商家ID',user_id BIGINT NOT NULL COMMENT '用户ID',score DECIMAL(2,1) NOT NULL COMMENT '评分:1.0-5.0',content TEXT NOT NULL COMMENT '点评内容',images JSON COMMENT '图片URL数组',tags JSON COMMENT '标签数组',anonymous BOOLEAN DEFAULT FALSE COMMENT '是否匿名',like_count INT DEFAULT 0 COMMENT '点赞数',reply_count INT DEFAULT 0 COMMENT '回复数',status TINYINT DEFAULT 1 COMMENT '1-正常,10-待审核,20-隐藏',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',FOREIGN KEY (merchant_id) REFERENCES merchant(id),FOREIGN KEY (user_id) REFERENCES user(id)
) COMMENT = '用户点评表';-- 点评点赞表
CREATE TABLE review_like (id BIGINT PRIMARY KEY COMMENT '本身的ID(默认雪花ID)',user_id BIGINT NOT NULL COMMENT '用户ID',review_id BIGINT NOT NULL COMMENT '点评ID',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',UNIQUE KEY uk_user_review (user_id, review_id) COMMENT '用户-点评唯一索引',FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (review_id) REFERENCES review(id)
) COMMENT = '点评点赞表';-- 回复表(支持楼中楼)
CREATE TABLE reply (id BIGINT PRIMARY KEY COMMENT '本身的ID(默认雪花ID)',review_id BIGINT NOT NULL COMMENT '点评ID',user_id BIGINT NOT NULL COMMENT '回复用户ID',to_reply_id BIGINT COMMENT 'NULL=回复点评,有值=回复用户',to_user_id BIGINT COMMENT '被回复的用户ID',content TEXT NOT NULL COMMENT '回复内容',like_count INT DEFAULT 0 COMMENT '点赞数',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',FOREIGN KEY (review_id) REFERENCES review(id),FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (to_reply_id) REFERENCES reply(id),FOREIGN KEY (to_user_id) REFERENCES user(id)
) COMMENT = '点评回复表';
3. Alpha任务分配计划
3.1依据项目组能提供的总时间、功能模块的优先级以及模块之间的依赖关系,在Product Backlog中选取待实现的功能项。(5分)
我们团队基于明确的系统设计,我们制定了清晰的任务分配计划,以实现高效并行开发:
前端开发组(张嘉铭、文昊): 负责将确认无误的高保真原型转化为实际代码。具体任务包括:搭建前端项目框架、实现所有静态页面、开发通用UI组件库、并调用后端提供的API接口完成数据渲染与用户交互功能。两人内部可根据功能模块进一步分工,如一人负责用户中心模块,另一人负责业务主流程模块,并定期进行代码审查与整合。
后端开发组(齐思贤、阿丽亚、谢嘉骏、袁镇清): 负责服务器端业务逻辑、数据库与API的实现。任务包括:搭建后端服务框架、设计并创建数据库表结构、实现核心业务算法、以及编写所有在系统设计中定义的前端所需API接口。
团队将采用“小组功能模块负责制”进行分工,齐思贤和阿丽亚的后端1组负责用户认证与权限管理模块(后端A组);谢嘉骏和袁镇清的后端2组负责订单或数据处理等核心业务模块(后端C组),确保责任到人。同时,小组需每日进行站会沟通,同步进度并解决协作中的问题。小组之间每两天一次讨论交流,确保相互监督。
3.2对已选择的功能项再做进一步分解,分解为1-10小时左右的任务,构成Sprint Backlog。在PM的协助下,编码的同学对任务进行认领。(5分)
每个后端小组决定自己分解项目的方式,这里因为沟通耗时,暂时不进行收集。
3.3以甘特图的方式拟定迭代冲刺计划。(10分)
每个后端小组决定自己的冲刺计划,这里因为沟通耗时,暂时不进行收集。
4. 测试计划(10分)
为保证交付质量,测试工作将贯穿整个Alpha阶段,而非仅在最后进行。
后端测试: 后端开发小组的一位同学在编写代码的同时,另一位同学需要为其负责的模块编写单元测试(如使用JUnit、pytest等),并对核心API进行集成测试,确保接口功能与性能符合预期。这样不技能节约时间,还可以充分发挥结对小组能力。这是开发过程中的首要质量关卡。
前端测试: 前端开发团队将进行充分的界面与交互测试,包括但不限于:跨浏览器兼容性测试、响应式布局测试、用户操作流程测试等。
集成测试: 在前后端功能基本完成后,全体成员将共同参与集成测试。前端与后端紧密配合,按照真实用户场景进行端到端的流程测试,确保系统各个模块能够无缝衔接、稳定运行。所有测试过程中发现的问题将及时记录并快速修复,形成闭环管理。
附件:完整文档已推送至 Gitee Wiki
接口文档(节选)
###3.1 用户服务
POST /api/v1/users/register
RequestJSON
{
"student_id": "20211234",
"password": "Abc123456",
"nickname": "珞珈山扛把子"
}JSON
{
"code": 200,
"message": "注册成功",
"data": { "user_id": 142536172839456256 }
}
抛出的异常:|code | message|场景|
|----|----|----|
|400|学号已存在| DB unique|
|400|密码强度不足|正则|单元测试(Go)
go
复制
func TestRegisterDuplicate(t *testing.T) {
req := {"student_id":"20211234","password":"Abc123456","nickname":"nick"}
w := httptest.NewRecorder()
router.ServeHTTP(w, httptest.NewRequest("POST", "/api/v1/users/register", strings.NewReader(req)))
assert.Equal(t, 400, w.Code)
assert.Contains(t, w.Body.String(), "学号已存在")
}
###3.2 商户服务
POST /api/v1/merchants
Header
Authorization: Bearer
Body
JSON
复制
{
"name": "东区麻辣烫",
"campus": "东校区",
"category_id": 3,
"address": "东区食堂2楼",
"business_hours": "10:00-21:30",
"tags": ["夜宵", "性价比高"],
"images": ["https://cdn.xxx.com/tmp/aaa.jpg"]
}
Response 200
JSON
复制
{
"code": 200,
"message": "提交成功,待审核",
"data": { "merchant_id": 142536199898765312, "status": 10 }
}
###3.3 点评服务
POST /api/v1/reviews
Body
JSON
复制
{
"merchant_id": 142536199898765312,
"score": 4.5,
"content": "今天麻辣烫量很大!",
"images": ["https://cdn.xxx.com/review/1.jpg"],
"tags": ["量大", "实惠"],
"anonymous": true
}
Response 200
JSON
复制
{
"code": 200,
"message": "发布成功",
"data": { "review_id": 142536277777777777 }
}
##4. 前端 Mock 方案
由张嘉铭统一维护,路径 frontend/mock/
TypeScript
复制
// mock/user.ts
export default [
{
url: '/api/v1/users/register',
method: 'post',
response: ({ body }) => {
if (body.student_id === '20211234') {
return { code: 400, message: '学号已存在' };
}
return { code: 200, data: { user_id: '142536172839456256' } };
},
},
];
启动命令
bash
复制
pnpm dev:mock # 同时启动 Vite + Express-Mock
5. 测试策略| 层级 | 工具 | 覆盖要求 | 责任人 |
| :--- | :--- | :--- | :--- |
| 单元 | Go + testify | 核心业务 ≥ 80% | 各后端 |
| 接口 | Postman + Newman | 全部 P0 接口 | 齐思贤 |
| 性能 | k6 | 300 并发 < 500 ms | 袁镇清 |
| E2E | Cypress | 登录→发布点评→点赞 主流程 | 彭文昊 |风险与对策
| 风险 | 触发概率 | 影响 | 对策 | owner |
| ------- | ---- | ---- | -------------------- | ----- |
| 比赛冲突 | 高,已经触发 | 工时缩水 | 预留 30% buffer | 齐思贤 |
| ES 学习成本 | 中 | 搜索延期 | 先用 SQLite FTS5 降级 | 袁镇清 |
| OSS 费用 | 低 | 超预算 | 校内 MinIO 替代方案 | 谢嘉骏 |
| 合规风险 | 中 | 无法公开 | 了解法律法规 | 齐思贤 |
本周产出清单(验收标准)
Gitee Issues 100% 创建并打标签 week-12
backend/api/ 目录下 接口文档 Markdown 与代码同级
backend/mock/ 下线,单元测试通过率 ≥ 80%
frontend/mock/ 可脱离后端独立运行
Postman 集合导出文件 Campus-Review-P0.json 上传至 Wiki
燃尽图每日自动推送(GitHub Action)
下周(13 周):前瞻
点评回复、搜索联调、管理后台页面
第一次 “吃狗粮” 活动:团队成员使用自己系统发布 3 条真实点评
性能压测达标:300 并发 95th < 500 ms