Explorar el Código

doc:功能需求

yangyi hace 4 meses
padre
commit
6a5963921d
Se han modificado 1 ficheros con 662 adiciones y 0 borrados
  1. 662 0
      doc.md

+ 662 - 0
doc.md

@@ -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/` 目录
+- 数据库存相对路径