# TakeOutMS
**Repository Path**: ye-puxu/TakeOutMS
## Basic Information
- **Project Name**: TakeOutMS
- **Description**: 使用RM2PT构建外卖项目
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-05-11
- **Last Updated**: 2025-05-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 实验一:软件需求分析与确认
姓名:叶普旭 学号:ZF2421119
## 1. 实验目标
掌握需求分析与建模方法,完成基于UML的需求建模,使用RM2PT生成需求原型并验证。
## 2. 实验系统
选取的是外卖系统(TakeOutMS)做需求分析与建模。选择外卖系统的原因是日常应用比较多,对里面的流程较为熟悉,并且功能点也很多,足够支撑本次实验。
共有四种角色,分别是**顾客**、**商家**、**配送员**和**管理员**,用户需求和系统需求如2.1所示。
### 2.1 用户需求
1. **顾客**
- 浏览附近餐厅并筛选菜品
- 提交订单并选择支付方式
- 实时追踪配送进度
- 对订单进行评价
2. **商家**
- 管理菜单(上架/下架菜品)
- 接收并处理订单
- 更新备餐状态
3. **配送员**
- 接收系统派单
- 上报配送位置
- 标记订单完成
4. **管理员**
- 处理用户投诉
- 生成销售统计报表
- 配置促销活动
### 2.2 系统需求
- **功能需求**
- 自动计算订单总价(含优惠券抵扣)
- 实时推送订单状态(商家接单、骑手派送、订单完成)
- 根据位置分配最近骑手
- 同步库存数量与菜单状态
- **非功能需求**
- 高并发支持(同时处理1000+订单)
- 支付接口响应时间≤1秒
- 系统故障后30秒内恢复缓存数据
1. **顾客**
- 浏览附近餐厅并筛选菜品
- 提交订单并选择支付方式
- 实时追踪配送进度
- 对订单进行评价
2. **商家**
- 管理菜单(上架/下架菜品)
- 接收并处理订单
- 更新备餐状态
3. **配送员**
- 接收系统派单
- 上报配送位置
- 标记订单完成
4. **管理员**
- 处理用户投诉
- 生成销售统计报表
- 配置促销活动
## 3. 需求建模
### 3.1 结构化自然语言需求
根据需求定义为需求文档re文件,内容如下所示,[完整内容点此查看](./TakeOutMS/RequirementsDescription/TakeoutMS.re ),详细需求总结在附录中。
```
As a Customer, I want to browse restaurants, so that select desired meals
{
Basic Flow {
(User) 1. the Customer shall open TakeOut app.
(System) 2. the System shall display nearby restaurants within two seconds. // (功能需求)
(User) 3. the Customer shall filter by cuisine type.
(System) 4. the System shall show filtered results with availability tags.//(功能需求)
}
Alternative Flow {
A. At any time, Network latency :
1. System displays loading animation.// (非功能需求: 用户体验)
2. System retries data fetch silently.// (非功能需求: 可靠性)
}
}
...
```
### 3.2 UML需求模型
#### 3.2.1 用例图

- 参与者:4个(Customer, RestaurantOwner, DeliveryRider, SystemAdmin)
- 用例数:14个
#### 3.2.2 系统顺序图
##### BrowseRestaurants(浏览饭店)
##### PlaceOrders(下单)
##### TrackDelivery(查看订单状态)
##### RateOrders(评价订单)
##### ManageMenu(管理界面)
##### ProcessOrders(处理订单)
##### AcceptOrders(接单)
##### UpdateLocation(更新位置信息)
##### HandleComplaints(处理投诉)
##### GenerateReports(生成报表)
##### CustomerLogin(顾客登录)
##### DeliveryRiderLogin(骑手登录)
##### RestaurantOwnerLogin(商家登录)
##### SystemAdminLogin(管理员登录)
- 顺序图总数:14
- 系统操作总数:23
- 合约数量:23
#### 3.2.3 概念类图

- 类数量:11
## 4. 原型验证
使用RM2PT生成的可交互原型运行结果如下所示:


## 5. 模型规模说明
| 模型类型 | 数量 |
| :--------: | :--: |
| 用户需求 | 14 |
| 系统需求 | 25 |
| 参与者 | 4 |
| 用例 | 14 |
| 系统顺序图 | 14 |
| 系统操作 | 23 |
| OCL合约 | 23 |
| 概念类 | 11 |
## 附录
### 需求分析总结
#### 用户需求与系统需求对应关系
##### 用户需求表(共14条)
| 编号 | 用户角色 | 需求描述 | 在`.re`文件中的位置 | 对应代码段 |
| :--: | :--------------------------: | :--------------------------: | :--------------------: | :----------------------------------------------------------: |
| 1 | Customer | 浏览附近餐厅以选择菜品 | 第1个`As a Customer`块 | `As a Customer, I want to browse restaurants, so that select desired meals` |
| 2 | Customer | 下单并接收餐品 | 第2个`As a Customer`块 | `As a Customer, I want to place orders, so that receive meals` |
| 3 | Customer | 实时追踪配送状态 | 第3个`As a Customer`块 | `As a Customer, I want to track delivery, so that know meal arrival time` |
| 4 | Customer | 对订单进行评分 | 第4个`As a Customer`块 | `As a Customer, I want to rate orders, so that improve service quality` |
| 5 | Restaurant Owner | 管理菜单更新菜品 | 第1个`As a Restaurant Owner`块 | `As a Restaurant Owner, I want to manage menu, so that update offerings` |
| 6 | Restaurant Owner | 处理客户订单 | 第2个`As a Restaurant Owner`块 | `As a Restaurant Owner, I want to process orders, so that fulfill customer requests` |
| 7 | Delivery Rider | 接受配送订单 | 第1个`As a Delivery Rider`块 | `As a Delivery Rider, I want to accept orders, so that complete deliveries` |
| 8 | Delivery Rider | 优化配送路线 | 第2个`As a Delivery Rider`块 | `As a Delivery Rider, I want to update location, so that optimize routes` |
| 9 | System Admin | 处理用户投诉 | 第1个`As a System Admin`块 | `As a System Admin, I want to handle complaints, so that improve service` |
| 10 | System Admin | 生成业务分析报告 | 第2个`As a System Admin`块 | `As a System Admin, I want to generate reports, so that analyze business` |
| 11 | Customer | 用户登录系统 | 独立登录用例块 | `As a Customer, I want to login, so that access personal features` |
| 12 | Restaurant Owner | 商家登录系统 | 独立登录用例块 | `As a Restaurant Owner, I want to login, so that manage business` |
| 13 | Delivery Rider | 骑手登录系统 | 独立登录用例块 | `As a Delivery Rider, I want to login, so that start working` |
| 14 | System Admin | 管理员登录系统 | 独立登录用例块 | `As a System Admin, I want to login, so that perform management` |
---
##### 系统需求表(共25条)
| 编号 | 需求描述 | 类型(功能/非功能) | 对应代码/模型元素 |
| :--: | :--------------------------: | :-----------------: | :----------------------------------------------------------: |
| 1 | 2秒内显示附近餐厅列表 | 功能需求 | `(System) 2. the System shall display nearby restaurants within two seconds` |
| 2 | 支持按菜系类型过滤餐厅 | 功能需求 | `(User) 3. the Customer shall filter by cuisine type` |
| 3 | 订单支付成功后立即扣减库存 | 功能需求 | `(System) 5. When payment confirmed, the System shall deduct inventory immediately` |
| 4 | 支付失败后500ms内回滚库存 | 非功能需求(事务一致性) | `1. System rolls back inventory changes within five hundreds ms` |
| 5 | 实时显示骑手位置和ETA预估 | 功能需求 | `(System) 3. the System shall display rider real time location` |
| 6 | 使用交通数据动态更新ETA | 非功能需求(准确性) | `(System) 4. the System shall estimate arrival time with traffic data` |
| 7 | 评分提交后1秒内更新餐厅评分 | 非功能需求(性能) | `(System) 5. the System shall update restaurant score within one second` |
| 8 | 多渠道菜单状态同步 | 非功能需求(数据一致性) | `(System) 5. the System shall sync menu status across all channels` |
| 9 | 新订单200ms内通知骑手 | 非功能需求(实时性) | `(System) 6. the System shall notify rider within two hundreds ms` |
| 10 | 订单分配锁定机制 | 功能需求 | `(System) 5. the System shall lock order assignment` |
| 11 | 骑手离线10秒内自动重新分配订单 | 非功能需求(容错性) | `1. System reallocates order within ten seconds` |
| 12 | 每30秒记录骑手GPS坐标 | 非功能需求(数据采集) | `(System) 3. the System shall record coordinates every thirty seconds` |
| 13 | 紧急投诉红色标签标注 | 功能需求 | `(System) 3. the System shall highlight urgent cases with red tags` |
| 14 | 分片数据库销售数据汇总 | 非功能需求(大数据处理) | `(System) 3. the System shall compile sales data from sharded databases` |
| 15 | 三重登录失败锁定账户 | 非功能需求(安全性) | `1. System blocks after three attempts` |
| 16 | 生物特征身份验证 | 非功能需求(安全性) | `(System) 2. the System shall validate identity via facial recognition` |
| 17 | 双因素认证登录 | 非功能需求(安全性) | `(System) 2. the System shall require SMS verification code` |
| 18 | 网络延迟显示加载动画 | 非功能需求(用户体验) | `1. System displays loading animation` |
| 19 | 路径偏离自动重新规划 | 非功能需求(实时性) | `1. System triggers rerouting algorithm` |
| 20 | 数据分页与关键指标优先 | 非功能需求(性能优化) | `1. System activates pagination mode` |
| 21 | 订单准备倒计时锁定 | 功能需求 | `(System) 4. the System shall lock preparation time countdown` |
| 22 | 加密渠道支付重试 | 非功能需求(安全性) | `2. System prompts retry payment with encrypted channel` |
| 23 | 原料短缺自动取消订单 | 功能需求 | `1. System autocancels related orders` |
| 24 | 骑手可靠性评分机制 | 非功能需求(服务质量) | `2. System deducts rider reliability score` |
| 25 | 可视化数据图表生成 | 功能需求 | `(System) 5. the System shall generate visualization charts` |
---
##### 关键需求分布
```mermaid
pie
title 系统需求类型分布
"功能需求" : 12
"非功能需求" : 13
"用户需求" : 14
```
# 实验二 RM2PT自动化架构设计和详细设计
## 任务一
选中Generate Inital MicroService Model,生成最初的划分模型:
用例图:
metric视图:
选中Generate MicroService Model,生成最后的微服务模型,目录结构如下所示:

MicroServiceModel如下图所示:

## 任务二
Generate Design Model后,目录结构如下图所示:
生成的类图:

生成的序列图:
## 任务三
### 一、设计模型(基于需求模型的分层架构设计)
#### 1. 角色模块划分
| 角色 / 模块 | 核心功能点 | 非功能需求映射 |
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **用户模块** | - 登录认证(密码验证、Token 生成) - 餐厅浏览与筛选 - 订单管理(下单、支付、追踪、评价) | - 登录性能:1 秒内完成验证 - 浏览性能:2 秒内加载附近餐厅 - 支付安全性:加密通道传输数据 |
| **商家模块** | - 菜单管理(上下架、库存同步) - 订单处理(接单、备餐通知) | - 数据一致性:菜单状态实时同步到各渠道 - 实时性:新订单 200ms 内通知骑手 |
| **骑手模块** | - 订单接单与分配锁定 - 实时位置更新与路线优化 | - 数据采集:每 30 秒记录一次坐标 - 容错性:骑手离线 10 秒内重新分配订单 |
| **管理员模块** | - 投诉处理(案件分配、加密通知) - 数据报表生成(分库数据聚合) | - 安全性:投诉通知加密邮件 - 大数据处理:支持分库销售数据快速聚合 |
#### 2. 核心交互流程(以 “用户浏览餐厅” 为例)
```mermaid
graph LR
A[用户打开App] --> B[调用地理位置接口获取坐标]
B --> C[餐厅服务查询附近商家(带库存状态)]
C --> D{2秒内返回结果?}
D -->|是| E[展示餐厅列表+筛选栏]
D -->|否| F[显示加载动画+后台重试拉取数据]
E --> G[用户选择菜系筛选]
G --> H[餐厅服务过滤结果并标记可预订状态]
H --> I[更新页面展示]
```
#### 3. 分层架构设计
- **表现层**:
- 移动端App(用户/商家/骑手界面)、管理端Web后台
- 职责:处理用户输入输出,调用业务层接口
- **业务逻辑层**:
- 领域服务:用户服务、订单服务、配送服务、报表服务
- 职责:实现核心业务规则(如库存扣减、路线优化算法),校验非功能需求(如支付事务一致性)
- **数据层**:
- 主数据库:用户订单、商家菜单(使用分库分表应对高并发)
- 缓存层:Redis存储附近餐厅列表(减少数据库压力,满足2秒响应需求)
- 实时数据存储:Kafka流处理骑手位置数据
- **基础设施层**:
- 认证服务:JWT令牌管理、生物识别接口(如骑手面部识别)
- 消息队列:RabbitMQ异步通知库存变更、骑手接单事件
- 监控服务:APM工具追踪接口性能(如登录响应时间)
### 二、微服务架构设计(基于业务领域拆分)
#### 1. 服务单元划分与职责
| 微服务名称 | 核心功能描述 | 通信方式 | 非功能需求实现 |
| ------------ | ------------------------------------------------------------ | ----------------------- | ------------------------------------------------------------ |
| **用户服务** | - 处理用户注册 / 登录(支持多因子认证) - 管理用户个人信息 | RESTful API | - 登录性能:缓存 Token 减少数据库查询 - 安全性:三次错误登录锁定账号 |
| **餐厅服务** | - 管理餐厅菜单、库存状态 - 提供附近餐厅查询接口(含地理位置搜索) | RESTful API | - 数据一致性:通过消息队列同步菜单状态到各渠道 - 缓存:Redis 存储热门餐厅列表 |
| **订单服务** | - 订单创建、支付状态管理 - 协调库存、配送服务完成订单流程 | 消息队列(Kafka) | - 事务一致性:支付失败时通过分布式事务回滚库存 - 实时性:新订单 200ms 内推送给商家 |
| **配送服务** | - 骑手接单分配、实时位置追踪 - 动态路线优化算法 | 事件总线(EventBridge) | - 数据采集:定时接收骑手坐标并存储到时序数据库 - 容错性:骑手离线自动重新分配订单 |
| **库存服务** | - 管理商家菜品库存 - 处理库存扣减与回滚(如支付失败场景) | 消息队列(RabbitMQ) | - 性能:库存变更请求异步处理 - 降级方案:网络故障时使用本地缓存暂存变更 |
| **报表服务** | - 聚合分库销售数据生成报表 - 提供可视化图表接口 | gRPC | - 大数据处理:使用 Spark 并行计算分库数据 - 性能优化:数据过载时启用分页和指标优先级 |
| **认证服务** | - 统一身份认证中心(JWT 签发、生物识别验证) - 权限管理 | RESTful API | - 安全性:管理员二次认证(SMS + 令牌) - 高可用:多节点部署避免单点故障 |
#### 2. 核心场景通信流程(以 “用户下单→库存扣减→骑手接单” 为例)
```mermaid
sequenceDiagram
participant User
participant 订单服务
participant 库存服务
participant 配送服务
User->>订单服务: 提交订单(含菜品ID、数量)
订单服务->>库存服务: 通过RabbitMQ发送扣库存请求
库存服务->>订单服务: 返回库存扣减结果(成功/失败)
订单服务->>配送服务: 通过Kafka发送新订单事件(含商家地址、用户地址)
配送服务->>配送服务: 触发骑手分配算法(根据热力图推荐骑手)
配送服务->>User: App推送订单已接单通知
```
#### 3. 非功能需求技术方案
| 需求类型 | 实现方式 | 对应服务 / 场景 |
| -------------- | ------------------------------------------------------------ | ---------------------------- |
| **性能优化** | - 餐厅列表缓存(Redis) - 报表服务分页查询 - 订单服务异步处理支付回调 | 餐厅服务、报表服务、订单服务 |
| **数据一致性** | - 库存扣减使用 “最终一致性” 方案(消息队列 + 重试机制) - 菜单状态变更发布到事件总线 | 库存服务、餐厅服务 |
| **实时性** | - 骑手位置数据通过 Kafka 实时流处理 - 新订单通知使用 WebSocket 长连接 | 配送服务、订单服务 |
| **安全性** | - 支付接口 HTTPS 加密 - 管理员操作审计日志 - 骑手面部识别 token 加密存储 | 认证服务、订单服务、骑手模块 |
| **容错性** | - 骑手离线自动触发订单重新分配(10 秒内) - 库存服务熔断机制(应对高并发) | 配送服务、库存服务 |