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