doc.md 27 KB

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