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