# phone-shopping-mall-college
**Repository Path**: deng-chongshuang/phone-shopping-mall-college
## Basic Information
- **Project Name**: phone-shopping-mall-college
- **Description**: 手机商场
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-06
- **Last Updated**: 2025-04-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 手机商城
## 项目架构
### **微服务模块及调用关系**
#### 1. **用户服务**
##### 功能:
- 用户注册与登录:
- 用户通过手机号或邮箱注册。
- 通过用户名和密码验证登录。
- 用户信息管理:
- 用户可以更新自己的个人资料。
##### 数据库设计:
- 表:`user`
- **字段**:`user_id`(主键)、`username`、`password`、`email`、`phone`、`created_at`、`updated_at`等。
##### 调用关系:
- 用户服务调用 **通知服务** 发送注册欢迎短信或邮件。
---
#### 2. **商品服务**
##### 功能:
- 商品列表与搜索:
- 用户获取商城商品列表,支持分页、排序。
- 商品详情:
- 用户查询商品详细信息。
- 商品库存管理:
- 更新商品库存(订单创建后减少库存,订单取消后回滚库存)。
##### 数据库设计:
- 表:`product`
- **字段**:`product_id`(主键)、`name`、`description`、`price`、`stock`、`created_at`、`updated_at`等。
##### 调用关系:
- 商品服务与 **购物车服务** 交互:
- 商品服务提供商品信息用于购物车展示。
- 商品服务与 **订单服务** 交互:
- 验证库存是否足够,并更新库存。
---
#### 3. **订单服务**
##### 功能:
- 创建订单:
- 用户从购物车提交订单。
- 验证商品库存是否足够。
- 查询订单:
- 用户查看订单历史。
- 更新订单状态:
- 简化后的支付逻辑:直接由订单服务维护订单状态(如“已支付/未支付”)。
- 用户主动取消订单时,回滚库存。
- 超时取消订单:
- 定时任务自动取消未支付订单,回滚库存。
##### 数据库设计:
- 表:`order`
- **字段**:`order_id`(主键)、`user_id`、`product_id`、`total_price`、`status`(如:已支付、未支付、取消)、`created_at`、`updated_at`等。
##### 调用关系:
- 订单服务调用 **商品服务** 验证并扣减库存。
- 订单服务调用 **通知服务** 发送订单状态变更通知。
---
#### 4. **购物车服务**
##### 功能:
- 添加商品到购物车:
- 用户将商品加入购物车。
- 查看购物车:
- 用户查询购物车商品列表。
- 删除商品或清空购物车:
- 用户移除购物车中的商品。
- 更新购物车商品数量:
- 用户调整购物车商品数量。
##### 数据库设计:
- 表:`cart`
- **字段**:`cart_id`(主键)、`user_id`、`product_id`、`quantity`、`created_at`、`updated_at`等。
##### 调用关系:
- 购物车服务调用 **商品服务** 查询商品信息。
---
#### 5. **通知服务**
##### 功能:
- 发送短信或邮件通知:
- 用户注册成功后发送欢迎短信。
- 订单状态变更时发送通知。
- 支付成功后发送订单支付成功通知(订单服务直接更新状态)。
##### 调用关系:
- 通知服务接收来自 **用户服务**、**订单服务** 的通知请求。
---
#### 6. **网关服务**
##### 功能:
- 路由转发:
- 将客户端请求转发到对应的微服务。
- 用户身份验证:
- 网关服务简单验证用户是否已登录(如通过Session或用户ID)。
- 基本权限控制:
- 限制某些API的访问(如只有登录用户可以访问购物车和订单相关接口)。
---
### **业务流程**
#### **1. 用户注册与登录**
- 客户端向 **API网关** 发送注册或登录请求。
- **API网关** 转发请求到 **用户服务**:
- 注册时,用户服务保存用户信息到数据库。
- 登录时,用户服务验证用户名和密码,返回用户信息。
#### **2. 商品浏览**
- 客户端向 **API网关** 提交商品浏览请求。
- **API网关** 转发请求到 **商品服务**:
- 商品服务从数据库获取商品列表或商品详情。
#### **3. 添加商品到购物车**
- 客户端向 **API网关** 提交添加商品到购物车的请求。
- **API网关** 转发请求到 **购物车服务**:
- 购物车服务调用 **商品服务** 验证商品是否存在及库存是否足够,并存储购物车信息。
#### **4. 创建订单**
- 客户端向 **API网关** 提交订单创建请求。
- **API网关** 转发请求到 **订单服务**:
- 订单服务调用 **商品服务** 验证库存是否足够,并扣减库存。
- 订单服务生成订单并保存到数据库。
#### **5. 支付订单**
- 简化后的支付流程直接由订单服务维护:
- 用户提交支付请求,订单服务直接更新订单状态为“已支付”。
#### **6. 订单状态变更**
- 用户主动取消订单:
- 用户向 **API网关** 提交取消订单请求。
- **API网关** 转发请求到 **订单服务**:
- 订单服务更新订单状态为“取消”,并调用 **商品服务** 回滚库存。
- 超时自动取消订单:
- **订单服务** 定时检查未支付订单的超时时间,自动取消订单并回滚库存。
#### **7. 通知发送**
- **通知服务**负责发送以下通知:
- 用户注册成功后发送欢迎短信。
- 订单状态变更后通知用户(例如订单支付成功或订单取消)。
---
### **微服务调用关系**
- [ ] TODO
---
## **数据库表设计**
### **1. 用户服务**
用于存储用户信息。
#### 表:`user`
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|---------------------------|
| `user_id` | BIGINT | 主键、自增 | 用户唯一标识 |
| `username` | VARCHAR(50) | 唯一、非空 | 用户名 |
| `password` | VARCHAR(255) | 非空 | 用户密码 |
| `email` | VARCHAR(100) | 唯一、可空 | 用户邮箱 |
| `phone` | VARCHAR(15) | 唯一、可空 | 用户手机号 |
| `avatar` | VARCHAR(255) | 可空 | 用户头像URL |
| `created_at` | DATETIME | 非空 | 用户创建时间 |
| `updated_at` | DATETIME | 非空 | 信息最后更新时间 |
---
### **2. 商品服务**
用于存储商品信息和分类信息。
#### 表:`product`(商品表)
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|-----------------------------|
| `product_id` | BIGINT | 主键、自增 | 商品唯一标识 |
| `name` | VARCHAR(100) | 非空 | 商品名称 |
| `description` | TEXT | 可空 | 商品描述 |
| `price` | DECIMAL(10,2) | 非空 | 商品单价 |
| `stock` | INT | 非空 | 商品库存数量 |
| `image_url` | VARCHAR(255) | 可空 | 商品图片URL |
| `category_id` | BIGINT | 外键(categories) | 商品所属分类ID |
| `created_at` | DATETIME | 非空 | 商品创建时间 |
| `updated_at` | DATETIME | 非空 | 商品信息最后更新时间 |
#### 表:`category`(分类表)
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|-----------------------------|
| `category_id` | BIGINT | 主键、自增 | 分类唯一标识 |
| `name` | VARCHAR(50) | 非空 | 分类名称 |
| `parent_id` | BIGINT | 可空 | 父分类ID(支持分类层级) |
---
### **3. 购物车服务**
用于存储用户购物车信息。
#### 表:`cart`
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|-----------------------------|
| `cart_id` | BIGINT | 主键、自增 | 购物车记录唯一标识 |
| `user_id` | BIGINT | 外键(users) | 用户ID |
| `product_id` | BIGINT | 外键(products) | 商品ID |
| `quantity` | INT | 非空 | 商品数量 |
| `created_at` | DATETIME | 非空 | 记录创建时间 |
| `updated_at` | DATETIME | 非空 | 记录最后更新时间 |
---
### **4. 订单服务**
用于存储订单信息。
#### 表:`order`
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|-----------------------------|
| `order_id` | BIGINT | 主键、自增 | 订单唯一标识 |
| `user_id` | BIGINT | 外键(users) | 用户ID |
| `product_id` | BIGINT | 外键(products) | 商品ID |
| `quantity` | INT | 非空 | 商品数量 |
| `total_price` | DECIMAL(10,2) | 非空 | 订单总价 |
| `status` | VARCHAR(20) | 非空 | 订单状态(如:已支付、待支付、取消) |
| `created_at` | DATETIME | 非空 | 订单创建时间 |
| `updated_at` | DATETIME | 非空 | 订单状态最后更新时间 |
---
### **5. 通知服务**
用于记录发送的通知信息(短信或邮件)。
#### 表:`notification`
| 字段名 | 数据类型 | 约束 | 描述 |
|----------------|---------------|---------------------|-----------------------------|
| `notification_id` | BIGINT | 主键、自增 | 通知记录唯一标识 |
| `user_id` | BIGINT | 外键(users) | 用户ID |
| `type` | VARCHAR(20) | 非空 | 通知类型(如:短信、邮件) |
| `message` | TEXT | 非空 | 通知内容 |
| `status` | VARCHAR(20) | 非空 | 通知状态(如:已发送、失败)|
| `created_at` | DATETIME | 非空 | 通知创建时间 |
---
### **数据库表之间的关系**
1. **用户服务**:
- `user` 表是所有其他表的核心关联点,例如购物车记录和订单记录都需要关联用户ID。
2. **商品服务**:
- `product` 表记录商品信息。
- `category` 表用于商品分类层次结构。
- `product.category_id → category.category_id`。
3. **购物车服务**:
- `cart.user_id → user.user_id`:购物车和用户关联。
- `cart.product_id → product.product_id`:购物车记录关联商品。
4. **订单服务**:
- `order.user_id → user.user_id`:订单和用户关联。
- `order.product_id → product.product_id`:订单记录关联商品。
5. **通知服务**:
- `notification.user_id → user.user_id`:通知和用户关联。
---
### **关系图**
以下是数据库表之间的关系示意图:
- [ ] TODO
以下是关系的解释:
1. `user` 表中的 `user_id` 是所有与用户相关的表(如 `cart`、`order`、`notification`)的外键,确保数据一致性。
2. `product` 表中的 `product_id` 被 `cart` 和 `order` 表引用,用于管理商品的库存和信息。
3. `category` 表中的 `category_id` 被 `product` 表引用,用于支持商品分类。
4. `notification` 表中的 `user_id` 用于跟踪给特定用户发送的通知。
---
### **优化建议**
#### 1. **索引优化**
- **用户表 (`user`)**:
- `username`、`email` 和 `phone` 字段需要唯一索引,以快速查找用户。
- **商品表 (`product`)**:
- 为 `category_id` 和 `price` 创建索引,以提高分类页面或价格排序场景的查询性能。
- **购物车表 (`cart`)**:
- 为 `user_id` 和 `product_id` 创建复合索引,以提高用户快速查看购物车的性能。
- **订单表 (`order`)**:
- 为 `user_id` 和 `status` 创建复合索引,以快速查询用户的订单历史及订单状态。
#### 2. **表分区**
- **产品表 (`product`)**:
- 如果商品数量非常庞大,可以按 `category_id` 分区,提高特定分类的查询性能。
- **订单表 (`order`)**:
- 按 `user_id` 或 `created_at` 分区,方便以用户或时间为维度的订单查询。
#### 3. **字段优化**
- **金额字段**:
- 所有涉及金额的字段(如 `price` 和 `total_price`)使用 `DECIMAL(10,2)`,确保准确性,避免浮点数的问题。
- **状态字段**:
- 在 `order` 表和 `notification` 表中,将状态字段(如 `status`)使用 ENUM 类型,限定值域(比如订单状态:`待支付`、`已支付`、`取消`)。
#### 4. **事务处理**
- 在订单创建和支付过程中,需要使用数据库事务来确保数据一致性。例如:
- 下单时,扣减商品库存和生成订单应作为一个事务。
- 用户主动取消订单时,回滚库存和更新订单状态应作为一个事务。
#### 5. **定时任务支持(订单超时取消)**
- 为了支持订单的自动超时取消,可以考虑以下方案:
- 使用数据库中的延迟任务表:
- 创建一个任务表 `tasks`,记录订单的超时时间。
- 定时扫描任务表,找到超时的订单并取消。
- 使用消息队列:
- 在订单创建时,向消息队列(如 RabbitMQ 或 Kafka)发送一个延迟消息。
- 当消息到期(超时时间到)时,触发订单取消操作。
#### 6. **数据归档**
- 订单数据可能会随着时间增长到非常庞大的规模,可以定期将历史订单归档到单独的历史表或数据仓库中,以减少主订单表的查询压力。
---
### **扩展设计(未来可选项)**
1. **购物车优惠**:
- 增加优惠券功能,支持在购物车中应用优惠券。
- 添加 `coupon` 表,维护优惠券的基本信息及使用规则。
2. **用户角色管理**:
- 增加管理员角色,支持管理商品、订单等操作。
- 在 `user` 表中添加 `role` 字段(如 `user` 或 `admin`)。
3. **产品评价与评论**:
- 增加用户对产品的评价功能。
- 创建 `review` 表,用于存储用户评价数据:
```
review
┌─────────────┬─────────────┬─────────────┬─────────────┐
│ review_id │ product_id │ user_id │ rating │
│ comment │ created_at │ updated_at │ │
└─────────────┴─────────────┴─────────────┴─────────────┘
```
4. **商品库存报警**:
- 增加商品库存阈值设置,当库存低于某个值时触发通知,提醒管理员补充库存。
好的,接下来我们将使用 **Maven** 构建一个基于 Spring 的微服务项目,依赖的主要组件包括 **MyBatis-Plus**、**Nacos**、**OpenFeign**、**Sentinel**、**Gateway** 和 **Seata**。以下是项目的整体搭建流程、模块划分、组件配置和代码目录结构。
---
## **项目整体结构**
### **1. 项目模块划分**
采用 **多模块 Maven 项目**,以下是各模块及其职责:
| 模块名 | 职责 |
|------------------|---------------------------------------|
| `common` | 公共模块,包含通用工具类、实体类、全局异常处理等 |
| `gateway` | API 网关,使用 Spring Cloud Gateway 实现路由转发和鉴权 |
| `user-service` | 用户服务,负责用户注册、登录和用户信息管理 |
| `product-service`| 商品服务,负责商品管理和库存管理 |
| `order-service` | 订单服务,负责订单创建、状态更新和管理 |
| `cart-service` | 购物车服务,负责用户购物车管理 |
| `notification-service` | 通知服务,负责短信或邮件通知 |
| `nacos-server` | 配置中心和服务注册中心,基于 Nacos 实现 |
---
## **Maven 项目结构**
```plaintext
商城项目
├── pom.xml # 父级 Maven 配置文件
├── common # 公共模块
│ ├── pom.xml
│ └── src/main/java/com/example/common
│ ├── entity # 通用实体类
│ ├── utils # 工具类
│ ├── exception # 全局异常处理类
├── gateway # 网关模块
│ ├── pom.xml
│ └── src/main/java/com/example/gateway
├── nacos-server # Nacos 配置中心和注册中心
│ └── 配置 Nacos 的相关文档(或独立部署)
├── user-service # 用户服务模块
│ ├── pom.xml
│ └── src/main/java/com/example/service/user
├── product-service # 商品服务模块
│ ├── pom.xml
│ └── src/main/java/com/example/service/product
├── order-service # 订单服务模块
│ ├── pom.xml
│ └── src/main/java/com/example/service/order
├── cart-service # 购物车服务模块
│ ├── pom.xml
│ └── src/main/java/com/example/service/cart
├── notification-service # 通知服务模块
│ ├── pom.xml
│ └── src/main/java/com/example/service/notification
└── seata-server # 分布式事务 Seata(独立部署或配置)
```
---
## **父级 POM**
在项目根目录下创建父级 `pom.xml`,用于管理所有子模块的依赖和版本:
```xml
4.0.0
com.example
mall
1.0.0-SNAPSHOT
pom
common
gateway
user-service
product-service
order-service
cart-service
notification-service
17
2022.0.3
3.1.3
3.5.3
2.2.1
1.6.1
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.apache.maven.plugins
maven-compiler-plugin
3.10.1
${java.version}
${java.version}
```
---
## **模块配置示例**
以下为每个模块 `pom.xml` 的示例配置:
### **公共模块(common)**
```xml
com.example
mall
1.0.0-SNAPSHOT
common
org.projectlombok
lombok
provided
org.springframework.boot
spring-boot-starter
```
---
### **网关模块(gateway)**
```xml
com.example
mall
1.0.0-SNAPSHOT
gateway
org.springframework.cloud
spring-cloud-starter-gateway
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
```
---
### **用户服务模块(user-service)**
```xml
com.example
mall
1.0.0-SNAPSHOT
user-service
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus.version}
org.springframework.cloud
spring-cloud-starter-openfeign
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
io.seata
seata-all
${seata.version}
```
其余微服务模块(如 `product-service`、`order-service`、`cart-service` 等)与 `user-service` 的依赖类似。
---
## **集成 Knife4j**
### **1. 添加 Knife4j 依赖**
每个服务模块(如 `user-service`、`product-service`)的 `pom.xml` 中添加以下依赖:
```xml
com.github.xiaoymin
knife4j-spring-boot-starter
4.1.0
io.springfox
springfox-boot-starter
3.0.0
```
确保父级 POM 中统一管理依赖版本,便于升级。
---
### **2. 配置 Swagger 和 Knife4j**
在各微服务模块的 `application.yml` 或 `application.properties` 文件中,添加 Knife4j 配置。
#### 示例:`user-service` 配置文件
```yaml
spring:
application:
name: user-service
knife4j:
enable: true # 启用 Knife4j
swagger:
api-docs:
path: /v3/api-docs # Swagger 默认路径
```
#### Swagger 文档配置类
在每个微服务模块中创建一个 `SwaggerConfig` 类,用于配置 Swagger 文档和 Knife4j 的相关属性。
```java
package com.example.service.user.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.service.user.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("用户服务 API 文档")
.description("用户服务相关接口")
.version("1.0")
.build();
}
}
```
注意:
- `basePackage` 应设置为每个微服务的 `controller` 包路径。
- `title` 和 `description` 可根据模块服务自定义。
---
### **3. 网关模块 Knife4j 的聚合文档**
如果您希望在 Gateway 中整合所有微服务的 Knife4j 文档,可以使用 Swagger 的聚合功能。
#### 网关模块添加 Swagger 聚合配置
在 `gateway` 模块的 `SwaggerConfig` 配置中,定义所有微服务的 API 文档源。
```java
package com.example.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spi.DocumentationType;
@Configuration
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.select()
.paths(PathSelectors.any())
.build();
}
}
```
之后,在 `application.yml` 中为 Gateway 配置 Knife4j 的文档聚合:
```yaml
knife4j:
enable: true
gateway:
header-enable: true # 支持网关转发的聚合 API 文档
swagger:
aggregated:
name: Mall API Gateway
resources:
- name: 用户服务
location: http://localhost:8081/v3/api-docs # 用户服务地址
- name: 商品服务
location: http://localhost:8082/v3/api-docs # 商品服务地址
- name: 订单服务
location: http://localhost:8083/v3/api-docs # 订单服务地址
```
---
### **4. 访问 Knife4j 文档**
- 启动各微服务后,访问每个服务的 Swagger UI。
- 用户服务:`http://localhost:8081/doc.html`
- 商品服务:`http://localhost:8082/doc.html`
- 订单服务:`http://localhost:8083/doc.html`
- 启动 Gateway 后,访问聚合文档:
- 网关服务:`http://localhost:8080/doc.html`
---
### **5. Knife4j 的高级功能**
- **接口分组**:
在 Swagger 配置中,定义分组信息。例如,按业务模块分组。
```java
@Bean
public Docket userGroup() {
return new Docket(DocumentationType.OAS_30)
.groupName("用户管理") // 分组名称
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.service.user.controller"))
.paths(PathSelectors.any())
.build();
}
```
- **身份认证和鉴权**:
Knife4j 提供了支持 OAuth2、API Key 或 JWT 的认证配置,可在接口文档中模拟用户登录。
---
### **6. 完整项目集成后的依赖管理**
父 POM 文件中统一管理 Knife4j 和 Swagger 相关依赖:
```xml
com.github.xiaoymin
knife4j-spring-boot-starter
4.1.0
io.springfox
springfox-boot-starter
3.0.0
```
---