|
@@ -0,0 +1,662 @@
|
|
|
|
|
+# SSM 蛋糕商城系统 — 设计文档
|
|
|
|
|
+
|
|
|
|
|
+## 一、技术栈
|
|
|
|
|
+
|
|
|
|
|
+| 层次 | 技术 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| 前端 | JSP + JSTL + Bootstrap 4.3.1 CDN + jQuery CDN |
|
|
|
|
|
+| 控制层 | Spring MVC 5.3.31 |
|
|
|
|
|
+| 业务层 | Spring 5.3.31 + @Transactional |
|
|
|
|
|
+| 持久层 | MyBatis 3.5.6 + MyBatis-Spring 2.0.6 |
|
|
|
|
|
+| 连接池 | Druid 1.2.8 |
|
|
|
|
|
+| 数据库 | MySQL 8.0 |
|
|
|
|
|
+| 容器 | Tomcat 7+ (war 包部署) |
|
|
|
|
|
+| 构建 | Maven (Java 8) |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 二、系统架构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+┌─────────────────────────────────────────────────────┐
|
|
|
|
|
+│ Browser │
|
|
|
|
|
+│ JSP + Bootstrap CDN + jQuery CDN │
|
|
|
|
|
+└─────────────────────┬───────────────────────────────┘
|
|
|
|
|
+ │ HTTP
|
|
|
|
|
+┌─────────────────────▼───────────────────────────────┐
|
|
|
|
|
+│ DispatcherServlet (web.xml) │
|
|
|
|
|
+│ ┌─────────────────────────────────────────────┐ │
|
|
|
|
|
+│ │ Spring MVC (spring-mvc.xml) │ │
|
|
|
|
|
+│ │ InternalResourceViewResolver │ │
|
|
|
|
|
+│ │ prefix=/WEB-INF/views/ suffix=.jsp │ │
|
|
|
|
|
+│ └─────────────────────────────────────────────┘ │
|
|
|
|
|
+└─────────────────────┬───────────────────────────────┘
|
|
|
|
|
+ │
|
|
|
|
|
+┌─────────────────────▼───────────────────────────────┐
|
|
|
|
|
+│ Controller Layer │
|
|
|
|
|
+│ ┌──────────────┐ ┌──────────────────────────┐ │
|
|
|
|
|
+│ │ FrontController│ │ AdminController │ │
|
|
|
|
|
+│ │ (前台控制器) │ │ (后台控制器) │ │
|
|
|
|
|
+│ └──────┬───────┘ └──────┬───────────────────┘ │
|
|
|
|
|
+└──────────┼──────────────────┼────────────────────────┘
|
|
|
|
|
+ │ │
|
|
|
|
|
+┌──────────▼──────────────────▼────────────────────────┐
|
|
|
|
|
+│ Service Layer (interface + impl) │
|
|
|
|
|
+│ @Service @Transactional │
|
|
|
|
|
+└─────────────────────┬────────────────────────────────┘
|
|
|
|
|
+ │
|
|
|
|
|
+┌─────────────────────▼────────────────────────────────┐
|
|
|
|
|
+│ Mapper Layer (MyBatis) │
|
|
|
|
|
+│ Mapper interface → Mapper XML (classpath:mapper/) │
|
|
|
|
|
+└─────────────────────┬────────────────────────────────┘
|
|
|
|
|
+ │
|
|
|
|
|
+┌─────────────────────▼────────────────────────────────┐
|
|
|
|
|
+│ MySQL 8.0 │
|
|
|
|
|
+│ Druid DataSource (spring-context.xml) │
|
|
|
|
|
+└──────────────────────────────────────────────────────┘
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 三、数据库设计
|
|
|
|
|
+
|
|
|
|
|
+### 3.1 ER 关系说明
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+cake_category (1) ──→ (N) cake
|
|
|
|
|
+cake (1) ──→ (N) cake_image
|
|
|
|
|
+cake (1) ──→ (N) cake_spec
|
|
|
|
|
+cake (1) ──→ (N) custom_option
|
|
|
|
|
+cake (1) ──→ (N) cart_item
|
|
|
|
|
+cake (1) ──→ (N) order_item
|
|
|
|
|
+cake (1) ──→ (N) favorite
|
|
|
|
|
+cake (1) ──→ (N) review
|
|
|
|
|
+
|
|
|
|
|
+user (1) ──→ (N) address
|
|
|
|
|
+user (1) ──→ (N) cart
|
|
|
|
|
+user (1) ──→ (N) order
|
|
|
|
|
+user (1) ──→ (N) favorite
|
|
|
|
|
+user (1) ──→ (N) review
|
|
|
|
|
+user (1) ──→ (N) message
|
|
|
|
|
+user (1) ──→ (N) user_coupon
|
|
|
|
|
+
|
|
|
|
|
+cart (1) ──→ (N) cart_item
|
|
|
|
|
+
|
|
|
|
|
+order (1) ──→ (N) order_item
|
|
|
|
|
+order (1) ──→ (N) order_tracking
|
|
|
|
|
+
|
|
|
|
|
+coupon (1) ──→ (N) user_coupon
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 3.2 数据字典
|
|
|
|
|
+
|
|
|
|
|
+#### 1. `cake_category` — 蛋糕分类
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | 分类ID |
|
|
|
|
|
+| name | VARCHAR(50) | NOT NULL UNIQUE | 分类名称(水果款/慕斯款/儿童款/祝寿款/网红定制款) |
|
|
|
|
|
+| sort_order | INT | DEFAULT 0 | 排序权重 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
|
+| update_time | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
|
|
|
|
|
+
|
|
|
|
|
+#### 2. `cake` — 蛋糕商品
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | 蛋糕ID |
|
|
|
|
|
+| category_id | INT | FK → cake_category.id | 所属分类 |
|
|
|
|
|
+| name | VARCHAR(100) | NOT NULL | 蛋糕名称 |
|
|
|
|
|
+| description | TEXT | | 商品描述/介绍 |
|
|
|
|
|
+| base_price | DECIMAL(10,2) | NOT NULL | 基础价格 |
|
|
|
|
|
+| main_image | VARCHAR(255) | | 主图URL |
|
|
|
|
|
+| taste | VARCHAR(50) | | 口味标签 |
|
|
|
|
|
+| layers | VARCHAR(50) | | 可选层数描述 |
|
|
|
|
|
+| filling | VARCHAR(100) | | 可选夹层描述 |
|
|
|
|
|
+| style | VARCHAR(50) | | 风格标签 |
|
|
|
|
|
+| is_customizable | TINYINT | DEFAULT 0 | 是否支持自定义(0/1) |
|
|
|
|
|
+| is_new | TINYINT | DEFAULT 0 | 是否新品 |
|
|
|
|
|
+| is_hot | TINYINT | DEFAULT 0 | 是否热门 |
|
|
|
|
|
+| is_discount | TINYINT | DEFAULT 0 | 是否限时折扣 |
|
|
|
|
|
+| discount_price | DECIMAL(10,2) | | 折扣价 |
|
|
|
|
|
+| stock | INT | DEFAULT 0 | 库存 |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '上架' | 上下架状态: 上架/下架 |
|
|
|
|
|
+| sales_count | INT | DEFAULT 0 | 销量 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+| update_time | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | |
|
|
|
|
|
+
|
|
|
|
|
+#### 3. `cake_image` — 蛋糕图片
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | |
|
|
|
|
|
+| image_url | VARCHAR(255) | NOT NULL | 图片URL |
|
|
|
|
|
+| is_main | TINYINT | DEFAULT 0 | 是否主图 |
|
|
|
|
|
+| sort_order | INT | DEFAULT 0 | 排序 |
|
|
|
|
|
+
|
|
|
|
|
+#### 4. `cake_spec` — 规格(尺寸 + 加价)
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | 关联蛋糕(NULL=通用规格) |
|
|
|
|
|
+| spec_name | VARCHAR(50) | NOT NULL | 规格名(如 6寸/8寸/10寸/12寸) |
|
|
|
|
|
+| add_price | DECIMAL(10,2) | DEFAULT 0.00 | 加价金额 |
|
|
|
|
|
+| sort_order | INT | DEFAULT 0 | |
|
|
|
|
|
+
|
|
|
|
|
+#### 5. `custom_option` — 定制配件
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | 关联蛋糕(NULL=全局配置) |
|
|
|
|
|
+| option_type | VARCHAR(30) | NOT NULL | 类型: 尺寸/层数/蛋糕胚/奶油/配饰 |
|
|
|
|
|
+| option_name | VARCHAR(50) | NOT NULL | 选项名 |
|
|
|
|
|
+| add_price | DECIMAL(10,2) | DEFAULT 0.00 | 加价 |
|
|
|
|
|
+| sort_order | INT | DEFAULT 0 | |
|
|
|
|
|
+
|
|
|
|
|
+#### 6. `user` — 用户
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| username | VARCHAR(50) | NOT NULL UNIQUE | 用户名 |
|
|
|
|
|
+| password | VARCHAR(255) | NOT NULL | 密码(MD5或BCrypt) |
|
|
|
|
|
+| nickname | VARCHAR(50) | | 昵称 |
|
|
|
|
|
+| phone | VARCHAR(20) | | 手机号 |
|
|
|
|
|
+| email | VARCHAR(100) | | 邮箱 |
|
|
|
|
|
+| avatar | VARCHAR(255) | | 头像URL |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '正常' | 正常/禁用 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+| update_time | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | |
|
|
|
|
|
+
|
|
|
|
|
+#### 7. `address` — 收货地址
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| receiver_name | VARCHAR(50) | NOT NULL | 收货人 |
|
|
|
|
|
+| receiver_phone | VARCHAR(20) | NOT NULL | 联系电话 |
|
|
|
|
|
+| province | VARCHAR(50) | | 省 |
|
|
|
|
|
+| city | VARCHAR(50) | | 市 |
|
|
|
|
|
+| district | VARCHAR(50) | | 区 |
|
|
|
|
|
+| detail_address | VARCHAR(255) | NOT NULL | 详细地址 |
|
|
|
|
|
+| is_default | TINYINT | DEFAULT 0 | 是否默认 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 8. `cart` — 购物车
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| user_id | INT | FK → user.id UNIQUE | 一个用户一个购物车 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+| update_time | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | |
|
|
|
|
|
+
|
|
|
|
|
+#### 9. `cart_item` — 购物车项
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| cart_id | INT | FK → cart.id | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | |
|
|
|
|
|
+| spec_id | INT | FK → cake_spec.id | 所选规格 |
|
|
|
|
|
+| quantity | INT | DEFAULT 1 | 数量 |
|
|
|
|
|
+| custom_json | TEXT | | 定制信息JSON |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 10. `orders` — 订单(避开 MySQL 保留字 `order`)
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| order_no | VARCHAR(32) | NOT NULL UNIQUE | 订单编号 |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| total_amount | DECIMAL(10,2) | NOT NULL | 总金额 |
|
|
|
|
|
+| discount_amount | DECIMAL(10,2) | DEFAULT 0.00 | 优惠金额 |
|
|
|
|
|
+| pay_amount | DECIMAL(10,2) | NOT NULL | 实付金额 |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '待付款' | 待付款/待制作/制作中/配送中/已完成/已取消/已拒绝 |
|
|
|
|
|
+| receiver_name | VARCHAR(50) | | 收货人 |
|
|
|
|
|
+| receiver_phone | VARCHAR(20) | | |
|
|
|
|
|
+| province | VARCHAR(50) | | |
|
|
|
|
|
+| city | VARCHAR(50) | | |
|
|
|
|
|
+| district | VARCHAR(50) | | |
|
|
|
|
|
+| detail_address | VARCHAR(255) | | |
|
|
|
|
|
+| delivery_date | DATE | | 配送日期 |
|
|
|
|
|
+| delivery_time | VARCHAR(20) | | 配送时段 |
|
|
|
|
|
+| remark | VARCHAR(500) | | 客户备注 |
|
|
|
|
|
+| refuse_reason | VARCHAR(500) | | 拒绝原因 |
|
|
|
|
|
+| payment_method | VARCHAR(20) | DEFAULT '模拟支付' | |
|
|
|
|
|
+| payment_time | DATETIME | | 支付时间 |
|
|
|
|
|
+| delivery_fee | DECIMAL(10,2) | DEFAULT 0.00 | 配送费 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+| update_time | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | |
|
|
|
|
|
+
|
|
|
|
|
+#### 11. `order_item` — 订单项
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| order_id | INT | FK → orders.id | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | |
|
|
|
|
|
+| cake_name | VARCHAR(100) | | 快照:蛋糕名 |
|
|
|
|
|
+| spec_name | VARCHAR(50) | | 快照:规格 |
|
|
|
|
|
+| price | DECIMAL(10,2) | | 快照:单价 |
|
|
|
|
|
+| quantity | INT | DEFAULT 1 | |
|
|
|
|
|
+| custom_json | TEXT | | 快照:定制信息 |
|
|
|
|
|
+| image_url | VARCHAR(255) | | 快照:图片 |
|
|
|
|
|
+
|
|
|
|
|
+#### 12. `order_tracking` — 订单状态日志
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| order_id | INT | FK → orders.id | |
|
|
|
|
|
+| from_status | VARCHAR(20) | | 原状态 |
|
|
|
|
|
+| to_status | VARCHAR(20) | NOT NULL | 新状态 |
|
|
|
|
|
+| operator | VARCHAR(50) | | 操作人(管理员用户名/系统) |
|
|
|
|
|
+| remark | VARCHAR(255) | | 备注 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 13. `favorite` — 收藏
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 14. `review` — 评价
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| order_id | INT | FK → orders.id | |
|
|
|
|
|
+| cake_id | INT | FK → cake.id | |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| rating | TINYINT | NOT NULL | 评分 1-5 |
|
|
|
|
|
+| content | VARCHAR(500) | | 评价内容 |
|
|
|
|
|
+| reply_content | VARCHAR(500) | | 商家回复 |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '显示' | 显示/隐藏 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 15. `coupon` — 优惠券
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| name | VARCHAR(100) | NOT NULL | 优惠券名称 |
|
|
|
|
|
+| type | VARCHAR(20) | NOT NULL | 满减/折扣 |
|
|
|
|
|
+| condition_amount | DECIMAL(10,2) | | 满额条件 |
|
|
|
|
|
+| discount_amount | DECIMAL(10,2) | | 减额 |
|
|
|
|
|
+| discount_rate | DECIMAL(3,2) | | 折扣率(如0.8) |
|
|
|
|
|
+| total_count | INT | DEFAULT 0 | 发行总量 |
|
|
|
|
|
+| remain_count | INT | DEFAULT 0 | 剩余数量 |
|
|
|
|
|
+| start_time | DATETIME | | 有效期开始 |
|
|
|
|
|
+| end_time | DATETIME | | 有效期结束 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 16. `user_coupon` — 用户优惠券
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| coupon_id | INT | FK → coupon.id | |
|
|
|
|
|
+| used | TINYINT | DEFAULT 0 | 是否已使用 |
|
|
|
|
|
+| used_time | DATETIME | | 使用时间 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 17. `activity` — 活动
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| title | VARCHAR(100) | NOT NULL | 活动标题 |
|
|
|
|
|
+| type | VARCHAR(20) | NOT NULL | 满减/套餐/团购 |
|
|
|
|
|
+| content | TEXT | | 活动详情 |
|
|
|
|
|
+| start_time | DATETIME | | |
|
|
|
|
|
+| end_time | DATETIME | | |
|
|
|
|
|
+| image_url | VARCHAR(255) | | 活动图片 |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '启用' | 启用/停用 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 18. `message` — 留言咨询
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| user_id | INT | FK → user.id | |
|
|
|
|
|
+| title | VARCHAR(100) | | 标题 |
|
|
|
|
|
+| content | TEXT | NOT NULL | 留言内容 |
|
|
|
|
|
+| reply_content | TEXT | | 客服回复 |
|
|
|
|
|
+| status | VARCHAR(20) | DEFAULT '待回复' | 待回复/已回复 |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 19. `admin` — 管理员
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| username | VARCHAR(50) | NOT NULL UNIQUE | |
|
|
|
|
|
+| password | VARCHAR(255) | NOT NULL | |
|
|
|
|
|
+| nickname | VARCHAR(50) | | |
|
|
|
|
|
+| role | VARCHAR(20) | DEFAULT '管理员' | |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+#### 20. `delivery_config` — 配送设置
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| region | VARCHAR(100) | NOT NULL | 配送区域 |
|
|
|
|
|
+| fee | DECIMAL(10,2) | DEFAULT 0.00 | 配送费 |
|
|
|
|
|
+| free_amount | DECIMAL(10,2) | DEFAULT 0.00 | 满额免配送费 |
|
|
|
|
|
+| is_active | TINYINT | DEFAULT 1 | 是否启用 |
|
|
|
|
|
+
|
|
|
|
|
+#### 21. `announcement` — 公告
|
|
|
|
|
+
|
|
|
|
|
+| 列名 | 类型 | 约束 | 说明 |
|
|
|
|
|
+|------|------|------|------|
|
|
|
|
|
+| id | INT | PK AUTO_INCREMENT | |
|
|
|
|
|
+| title | VARCHAR(100) | NOT NULL | |
|
|
|
|
|
+| content | TEXT | | |
|
|
|
|
|
+| is_active | TINYINT | DEFAULT 1 | |
|
|
|
|
|
+| create_time | DATETIME | DEFAULT CURRENT_TIMESTAMP | |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 四、Controller 路由设计
|
|
|
|
|
+
|
|
|
|
|
+### 4.1 前台路由 (FrontController)
|
|
|
|
|
+
|
|
|
|
|
+| 方法 | URL | 说明 | JSP |
|
|
|
|
|
+|------|-----|------|-----|
|
|
|
|
|
+| GET | `/` | 首页 | index |
|
|
|
|
|
+| GET | `/cake/list` | 蛋糕列表页 | cake/list |
|
|
|
|
|
+| GET | `/cake/{id}` | 蛋糕详情页 | cake/detail |
|
|
|
|
|
+| GET | `/cake/custom` | 自定义蛋糕页 | cake/custom |
|
|
|
|
|
+| POST | `/cake/custom/preview` | 预览效果/核算加价 | JSON |
|
|
|
|
|
+| GET | `/user/register` | 注册页 | user/register |
|
|
|
|
|
+| POST | `/user/register` | 注册提交 | redirect |
|
|
|
|
|
+| GET | `/user/login` | 登录页 | user/login |
|
|
|
|
|
+| POST | `/user/login` | 登录提交 | redirect |
|
|
|
|
|
+| GET | `/user/logout` | 退出 | redirect |
|
|
|
|
|
+| GET | `/user/profile` | 个人中心 | user/profile |
|
|
|
|
|
+| POST | `/user/profile` | 修改资料 | redirect |
|
|
|
|
|
+| GET | `/user/address` | 地址管理页 | user/address |
|
|
|
|
|
+| POST | `/user/address` | 新增地址 | redirect |
|
|
|
|
|
+| PUT | `/user/address/{id}` | 编辑地址 | redirect |
|
|
|
|
|
+| DELETE | `/user/address/{id}` | 删除地址 | redirect |
|
|
|
|
|
+| GET | `/user/orders` | 我的订单 | user/orders |
|
|
|
|
|
+| GET | `/user/order/{orderNo}` | 订单详情 | user/orderDetail |
|
|
|
|
|
+| GET | `/user/favorites` | 我的收藏 | user/favorites |
|
|
|
|
|
+| POST | `/user/favorite/{cakeId}` | 添加收藏 | JSON |
|
|
|
|
|
+| DELETE | `/user/favorite/{cakeId}` | 取消收藏 | JSON |
|
|
|
|
|
+| GET | `/user/coupons` | 我的优惠券 | user/coupons |
|
|
|
|
|
+| GET | `/user/messages` | 我的留言 | user/messages |
|
|
|
|
|
+| POST | `/user/message` | 提交留言 | redirect |
|
|
|
|
|
+| GET | `/cart` | 购物车页 | cart/cart |
|
|
|
|
|
+| POST | `/cart/add` | 加入购物车 | JSON |
|
|
|
|
|
+| PUT | `/cart/item/{id}` | 修改数量 | JSON |
|
|
|
|
|
+| DELETE | `/cart/item/{id}` | 删除购物车项 | JSON |
|
|
|
|
|
+| POST | `/cart/checkout` | 结算页 | cart/checkout |
|
|
|
|
|
+| POST | `/order/submit` | 提交订单 | redirect |
|
|
|
|
|
+| POST | `/order/pay/{orderNo}` | 模拟支付 | redirect |
|
|
|
|
|
+| POST | `/order/cancel/{orderNo}` | 取消订单 | redirect |
|
|
|
|
|
+| POST | `/order/review` | 提交评价 | redirect |
|
|
|
|
|
+| GET | `/activity` | 活动页面 | activity/list |
|
|
|
|
|
+| GET | `/activity/{id}` | 活动详情 | activity/detail |
|
|
|
|
|
+
|
|
|
|
|
+### 4.2 后台路由 (AdminController)
|
|
|
|
|
+
|
|
|
|
|
+| 方法 | URL | 说明 | JSP |
|
|
|
|
|
+|------|-----|------|-----|
|
|
|
|
|
+| GET | `/admin/login` | 管理员登录页 | admin/login |
|
|
|
|
|
+| POST | `/admin/login` | 登录提交 | redirect |
|
|
|
|
|
+| GET | `/admin/logout` | 退出 | redirect |
|
|
|
|
|
+| GET | `/admin/` | 后台首页 | admin/index |
|
|
|
|
|
+| GET | `/admin/category` | 分类管理 | admin/category |
|
|
|
|
|
+| POST | `/admin/category` | 新增分类 | redirect |
|
|
|
|
|
+| PUT | `/admin/category/{id}` | 编辑分类 | redirect |
|
|
|
|
|
+| DELETE | `/admin/category/{id}` | 删除分类 | redirect |
|
|
|
|
|
+| GET | `/admin/cake` | 商品列表 | admin/cake |
|
|
|
|
|
+| GET | `/admin/cake/add` | 新增商品页 | admin/cakeEdit |
|
|
|
|
|
+| GET | `/admin/cake/edit/{id}` | 编辑商品页 | admin/cakeEdit |
|
|
|
|
|
+| POST | `/admin/cake` | 保存商品 | redirect |
|
|
|
|
|
+| PUT | `/admin/cake/{id}` | 更新商品 | redirect |
|
|
|
|
|
+| DELETE | `/admin/cake/{id}` | 删除商品 | redirect |
|
|
|
|
|
+| POST | `/admin/cake/{id}/status` | 上下架 | JSON |
|
|
|
|
|
+| GET | `/admin/spec/{cakeId}` | 规格管理 | admin/spec |
|
|
|
|
|
+| POST | `/admin/spec` | 保存规格 | redirect |
|
|
|
|
|
+| GET | `/admin/custom-option/{cakeId}` | 定制配件管理 | admin/customOption |
|
|
|
|
|
+| POST | `/admin/custom-option` | 保存配件 | redirect |
|
|
|
|
|
+| GET | `/admin/order` | 订单列表 | admin/order |
|
|
|
|
|
+| GET | `/admin/order/{id}` | 订单详情 | admin/orderDetail |
|
|
|
|
|
+| POST | `/admin/order/{id}/status` | 更改状态 | redirect |
|
|
|
|
|
+| GET | `/admin/user` | 用户列表 | admin/user |
|
|
|
|
|
+| POST | `/admin/user/{id}/status` | 禁用/启用 | redirect |
|
|
|
|
|
+| GET | `/admin/review` | 评价管理 | admin/review |
|
|
|
|
|
+| POST | `/admin/review/{id}/status` | 隐藏评价 | redirect |
|
|
|
|
|
+| POST | `/admin/review/{id}/reply` | 回复评价 | redirect |
|
|
|
|
|
+| GET | `/admin/statistics` | 数据统计 | admin/statistics |
|
|
|
|
|
+| GET | `/admin/settings` | 系统设置 | admin/settings |
|
|
|
|
|
+| POST | `/admin/settings/delivery` | 保存配送设置 | redirect |
|
|
|
|
|
+| POST | `/admin/settings/announcement` | 发布公告 | redirect |
|
|
|
|
|
+| POST | `/admin/settings/password` | 修改密码 | redirect |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 五、包结构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+src/main/java/space/anyi/
|
|
|
|
|
+├── controller/
|
|
|
|
|
+│ ├── front/
|
|
|
|
|
+│ │ ├── IndexController.java # 首页
|
|
|
|
|
+│ │ ├── CakeController.java # 蛋糕浏览/定制
|
|
|
|
|
+│ │ ├── UserController.java # 用户中心
|
|
|
|
|
+│ │ ├── CartController.java # 购物车
|
|
|
|
|
+│ │ ├── OrderController.java # 订单
|
|
|
|
|
+│ │ └── ActivityController.java # 活动
|
|
|
|
|
+│ └── admin/
|
|
|
|
|
+│ ├── AdminLoginController.java # 管理员登录
|
|
|
|
|
+│ ├── AdminCakeController.java # 商品管理
|
|
|
|
|
+│ ├── AdminOrderController.java # 订单管理
|
|
|
|
|
+│ ├── AdminUserController.java # 用户管理
|
|
|
|
|
+│ ├── AdminReviewController.java # 评价管理
|
|
|
|
|
+│ ├── AdminStatisticsController.java # 数据统计
|
|
|
|
|
+│ └── AdminSettingsController.java # 系统设置
|
|
|
|
|
+├── service/
|
|
|
|
|
+│ ├── CakeService.java
|
|
|
|
|
+│ ├── UserService.java
|
|
|
|
|
+│ ├── CartService.java
|
|
|
|
|
+│ ├── OrderService.java
|
|
|
|
|
+│ ├── CategoryService.java
|
|
|
|
|
+│ ├── ReviewService.java
|
|
|
|
|
+│ ├── FavoriteService.java
|
|
|
|
|
+│ ├── CouponService.java
|
|
|
|
|
+│ ├── ActivityService.java
|
|
|
|
|
+│ ├── MessageService.java
|
|
|
|
|
+│ ├── AdminService.java
|
|
|
|
|
+│ └── DeliveryService.java
|
|
|
|
|
+├── service/impl/
|
|
|
|
|
+│ ├── CakeServiceImpl.java
|
|
|
|
|
+│ ├── UserServiceImpl.java
|
|
|
|
|
+│ ├── CartServiceImpl.java
|
|
|
|
|
+│ ├── OrderServiceImpl.java
|
|
|
|
|
+│ ├── CategoryServiceImpl.java
|
|
|
|
|
+│ ├── ReviewServiceImpl.java
|
|
|
|
|
+│ ├── FavoriteServiceImpl.java
|
|
|
|
|
+│ ├── CouponServiceImpl.java
|
|
|
|
|
+│ ├── ActivityServiceImpl.java
|
|
|
|
|
+│ ├── MessageServiceImpl.java
|
|
|
|
|
+│ ├── AdminServiceImpl.java
|
|
|
|
|
+│ └── DeliveryServiceImpl.java
|
|
|
|
|
+├── entity/
|
|
|
|
|
+│ ├── CakeCategory.java
|
|
|
|
|
+│ ├── Cake.java
|
|
|
|
|
+│ ├── CakeImage.java
|
|
|
|
|
+│ ├── CakeSpec.java
|
|
|
|
|
+│ ├── CustomOption.java
|
|
|
|
|
+│ ├── User.java
|
|
|
|
|
+│ ├── Address.java
|
|
|
|
|
+│ ├── Cart.java
|
|
|
|
|
+│ ├── CartItem.java
|
|
|
|
|
+│ ├── Orders.java
|
|
|
|
|
+│ ├── OrderItem.java
|
|
|
|
|
+│ ├── OrderTracking.java
|
|
|
|
|
+│ ├── Favorite.java
|
|
|
|
|
+│ ├── Review.java
|
|
|
|
|
+│ ├── Coupon.java
|
|
|
|
|
+│ ├── UserCoupon.java
|
|
|
|
|
+│ ├── Activity.java
|
|
|
|
|
+│ ├── Message.java
|
|
|
|
|
+│ ├── Admin.java
|
|
|
|
|
+│ ├── DeliveryConfig.java
|
|
|
|
|
+│ └── Announcement.java
|
|
|
|
|
+├── mapper/
|
|
|
|
|
+│ ├── CakeCategoryMapper.java
|
|
|
|
|
+│ ├── CakeMapper.java
|
|
|
|
|
+│ ├── CakeImageMapper.java
|
|
|
|
|
+│ ├── CakeSpecMapper.java
|
|
|
|
|
+│ ├── CustomOptionMapper.java
|
|
|
|
|
+│ ├── UserMapper.java
|
|
|
|
|
+│ ├── AddressMapper.java
|
|
|
|
|
+│ ├── CartMapper.java
|
|
|
|
|
+│ ├── CartItemMapper.java
|
|
|
|
|
+│ ├── OrdersMapper.java
|
|
|
|
|
+│ ├── OrderItemMapper.java
|
|
|
|
|
+│ ├── OrderTrackingMapper.java
|
|
|
|
|
+│ ├── FavoriteMapper.java
|
|
|
|
|
+│ ├── ReviewMapper.java
|
|
|
|
|
+│ ├── CouponMapper.java
|
|
|
|
|
+│ ├── UserCouponMapper.java
|
|
|
|
|
+│ ├── ActivityMapper.java
|
|
|
|
|
+│ ├── MessageMapper.java
|
|
|
|
|
+│ ├── AdminMapper.java
|
|
|
|
|
+│ ├── DeliveryConfigMapper.java
|
|
|
|
|
+│ └── AnnouncementMapper.java
|
|
|
|
|
+├── interceptor/
|
|
|
|
|
+│ ├── LoginInterceptor.java # 前台登录拦截
|
|
|
|
|
+│ └── AdminLoginInterceptor.java # 后台登录拦截
|
|
|
|
|
+├── util/
|
|
|
|
|
+│ ├── OrderNoGenerator.java # 订单号生成
|
|
|
|
|
+│ └── MD5Util.java # 密码加密
|
|
|
|
|
+└── constant/
|
|
|
|
|
+ └── OrderStatus.java # 订单状态常量
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 六、JSP 视图结构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+src/main/webapp/WEB-INF/views/
|
|
|
|
|
+├── index.jsp # 首页
|
|
|
|
|
+├── common/
|
|
|
|
|
+│ ├── header.jsp # 页面头部(导航栏)
|
|
|
|
|
+│ └── footer.jsp # 页面底部
|
|
|
|
|
+├── cake/
|
|
|
|
|
+│ ├── list.jsp # 蛋糕列表
|
|
|
|
|
+│ ├── detail.jsp # 蛋糕详情
|
|
|
|
|
+│ └── custom.jsp # 自定义蛋糕
|
|
|
|
|
+├── user/
|
|
|
|
|
+│ ├── login.jsp # 登录
|
|
|
|
|
+│ ├── register.jsp # 注册
|
|
|
|
|
+│ ├── profile.jsp # 个人中心
|
|
|
|
|
+│ ├── address.jsp # 地址管理
|
|
|
|
|
+│ ├── orders.jsp # 我的订单
|
|
|
|
|
+│ ├── orderDetail.jsp # 订单详情
|
|
|
|
|
+│ ├── favorites.jsp # 我的收藏
|
|
|
|
|
+│ ├── coupons.jsp # 优惠券
|
|
|
|
|
+│ └── messages.jsp # 留言
|
|
|
|
|
+├── cart/
|
|
|
|
|
+│ ├── cart.jsp # 购物车
|
|
|
|
|
+│ └── checkout.jsp # 结算页
|
|
|
|
|
+├── order/
|
|
|
|
|
+│ └── result.jsp # 下单结果
|
|
|
|
|
+├── activity/
|
|
|
|
|
+│ ├── list.jsp # 活动列表
|
|
|
|
|
+│ └── detail.jsp # 活动详情
|
|
|
|
|
+└── admin/
|
|
|
|
|
+ ├── login.jsp # 管理员登录
|
|
|
|
|
+ ├── index.jsp # 后台首页
|
|
|
|
|
+ ├── category.jsp # 分类管理
|
|
|
|
|
+ ├── cake.jsp # 商品列表
|
|
|
|
|
+ ├── cakeEdit.jsp # 商品编辑
|
|
|
|
|
+ ├── spec.jsp # 规格管理
|
|
|
|
|
+ ├── customOption.jsp # 定制配件
|
|
|
|
|
+ ├── order.jsp # 订单列表
|
|
|
|
|
+ ├── orderDetail.jsp # 订单详情
|
|
|
|
|
+ ├── user.jsp # 用户列表
|
|
|
|
|
+ ├── review.jsp # 评价管理
|
|
|
|
|
+ ├── statistics.jsp # 数据统计
|
|
|
|
|
+ └── settings.jsp # 系统设置
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 七、核心业务流程
|
|
|
|
|
+
|
|
|
|
|
+### 7.1 下单流程
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+用户浏览蛋糕 → 选择规格 → 加入购物车
|
|
|
|
|
+ → 在购物车勾选 → 结算 → 填写配送信息
|
|
|
|
|
+ → 提交订单(状态: 待付款)
|
|
|
|
|
+ → 模拟支付(状态: 待制作)
|
|
|
|
|
+ → 管理员后台更改状态:
|
|
|
|
|
+ 待制作 → 制作中 → 配送中 → 已完成
|
|
|
|
|
+ 或: 拒绝订单(填写原因)→ 已取消
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 7.2 蛋糕定制流程
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+选择蛋糕 → 点击"自定义" →
|
|
|
|
|
+ 选择尺寸、层数、蛋糕胚口味、奶油类型
|
|
|
|
|
+ → 输入祝福语、上传图片、选择配饰
|
|
|
|
|
+ → 预览效果图(系统自动核算加价)
|
|
|
|
|
+ → 加入购物车 / 立即下单
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 7.3 订单状态机
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+待付款 → (支付) → 待制作
|
|
|
|
|
+待制作 → (接单) → 制作中
|
|
|
|
|
+制作中 → (配送) → 配送中
|
|
|
|
|
+配送中 → (签收) → 已完成
|
|
|
|
|
+ ↑
|
|
|
|
|
+待付款 → (取消) → 已取消
|
|
|
|
|
+待制作 → (拒绝) → 已拒绝
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 八、非功能性设计
|
|
|
|
|
+
|
|
|
|
|
+### 8.1 登录拦截
|
|
|
|
|
+- 前台: `LoginInterceptor` 拦截 `/user/*`, `/cart/*`, `/order/*` 未登录跳转登录页
|
|
|
|
|
+- 后台: `AdminLoginInterceptor` 拦截 `/admin/` 下除 login 外的路径
|
|
|
|
|
+
|
|
|
|
|
+### 8.2 密码安全
|
|
|
|
|
+- 密码使用 MD5(或 BCrypt)加密存储
|
|
|
|
|
+- 管理员密码单独管理
|
|
|
|
|
+
|
|
|
|
|
+### 8.3 表单校验
|
|
|
|
|
+- 前端: Bootstrap Validate 或 JS 校验
|
|
|
|
|
+- 后端: 每个写入操作校验必填字段
|
|
|
|
|
+
|
|
|
|
|
+### 8.4 分页
|
|
|
|
|
+- 列表页使用 MySQL `LIMIT offset, size`
|
|
|
|
|
+- 封装 PageInfo 工具类
|
|
|
|
|
+- 传参: page, size
|
|
|
|
|
+
|
|
|
|
|
+### 8.5 图片存储
|
|
|
|
|
+- 上传图片保存到服务器本地 `static/upload/` 目录
|
|
|
|
|
+- 数据库存相对路径
|