# 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 ``` ---