Mall 商城系统详细分析文档
文档信息
| 项目 | 内容 |
|---|---|
| 项目名称 | Mall(商城) |
| 项目版本 | 1.0.0-SNAPSHOT |
| 项目类型 | B2C 电商平台(前台商城 + 后台管理系统) |
| 技术架构 | Spring Boot + MyBatis + Thymeleaf + MySQL |
| 文档版本 | v1.0 |
| 生成日期 | 2026-07-02 |
目录
- 一、项目概述
- 二、技术栈详解
- 三、项目架构设计
- 四、数据库设计详解
- 五、后端代码架构详解
- 六、核心业务模块详解
- 七、前台商城接口清单
- 八、后台管理接口清单
- 九、前端页面结构详解
- 十、安全与权限机制
- 十一、核心工具类详解
- 十二、项目部署与运行
- 十三、项目优缺点分析
- 十四、学习路径建议
一、项目概述
1.1 项目简介
Mall(商城)是一个基于 Java 技术栈开发的 B2C 电商平台项目,采用经典的 MVC 三层架构和服务端渲染(SSR)模式。项目同时包含前台商城系统 和后台管理系统两大子系统,覆盖了电商平台的核心业务流程。
1.2 项目定位
- 学习型项目:适合 Java 初学者学习 Spring Boot + MyBatis 全栈开发
- 功能完整:覆盖商品、购物车、订单、支付、用户等核心电商模块
- 代码规范:包结构清晰,命名规范,易于理解和扩展
1.3 项目目录结构
newbee-mall-master/
├── src/
│ └── main/
│ ├── java/ltd/newbee/mall/
│ │ ├── NewBeeMallApplication.java # 启动类
│ │ ├── common/ # 公共模块(常量、枚举、异常)
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制层
│ │ │ ├── admin/ # 后台管理控制器
│ │ │ ├── mall/ # 前台商城控制器
│ │ │ ├── common/ # 公共控制器
│ │ │ └── vo/ # 视图对象
│ │ ├── dao/ # 数据访问层(Mapper接口)
│ │ ├── entity/ # 实体类
│ │ ├── interceptor/ # 拦截器
│ │ ├── service/ # 业务逻辑层
│ │ │ └── impl/ # 实现类
│ │ └── util/ # 工具类
│ └── resources/
│ ├── mapper/ # MyBatis XML映射文件
│ ├── static/ # 静态资源
│ │ ├── admin/ # 后台静态资源
│ │ └── mall/ # 前台静态资源
│ ├── templates/ # Thymeleaf模板
│ │ ├── admin/ # 后台页面模板
│ │ ├── mall/ # 前台页面模板
│ │ └── error/ # 错误页面
│ ├── upload/ # 上传文件目录
│ ├── application.properties # 应用配置
│ └── newbee_mall_schema.sql # 数据库脚本
├── pom.xml # Maven配置
└── README.md # 项目说明
二、技术栈详解
2.1 后端技术栈
2.1.1 核心框架
| 技术/框架 | 版本 | 用途 | 引入位置 |
|---|---|---|---|
| Spring Boot | 2.3.7.RELEASE | 核心应用框架,提供自动配置、内嵌容器等 | pom.xml#L13-L18(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/pom.xml#L13-L18) |
| Spring MVC | - | Web 层框架,处理 HTTP 请求响应 | 随 Spring Boot 自动引入 |
| MyBatis | 2.1.3 | ORM 持久层框架,SQL 映射 | pom.xml#L39-L43(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/pom.xml#L39-L43) |
| Spring Session | - | Session 管理 | pom.xml#L35-L38(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/pom.xml#L35-L38) |
2.1.2 模板引擎
| 技术/框架 | 版本 | 用途 | 说明 |
|---|---|---|---|
| Thymeleaf | - | 服务端模板引擎 | 天然的 HTML 模板,支持 Spring EL 表达式 |
2.1.3 数据库相关
| 技术/框架 | 用途 | 配置位置 |
|---|---|---|
| MySQL | 关系型数据库 | application.properties#L4-L16(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/resources/application.properties#L4-L16) |
| HikariCP | 数据库连接池 | Spring Boot 默认连接池 |
| MyBatis Mapper XML | SQL 映射文件 | src/main/resources/mapper/ 目录 |
2.1.4 其他依赖
| 技术/框架 | 版本 | 用途 |
|---|---|---|
| Easy-Captcha | 1.6.2 | 图形验证码生成 |
| Spring Boot Test | - | 单元测试支持 |
2.2 前端技术栈
2.2.1 前台商城
| 技术/库 | 用途 | 位置 |
|---|---|---|
| jQuery 1.8.0 | DOM 操作和 AJAX 请求 | static/mall/js/jquery-1.8.0.js |
| Bootstrap 3 | 响应式布局框架 | static/mall/js/bootstrap3.js |
| Swiper | 轮播图组件 | static/mall/js/swiper-bundle.min.js |
2.2.2 后台管理
| 技术/库 | 用途 |
|---|---|
| jQuery | DOM 操作和 AJAX 请求 |
| Bootstrap | 响应式布局 |
| jqGrid | 数据表格组件 |
| Select2 | 下拉选择组件 |
| wangEditor | 富文本编辑器 |
| SweetAlert | 弹窗提示组件 |
| ajaxupload | 文件上传组件 |
2.3 开发环境配置
properties
# 服务端口
server.port=28089
# 数据库配置
spring.datasource.name=mall_db
spring.datasource.url=jdbc:mysql://localhost:3306/mall_db
spring.datasource.username=yuan
spring.datasource.password=yuan
# 连接池配置(HikariCP)
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.connection-timeout=30000
# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
# 模板引擎配置
spring.thymeleaf.cache=false # 开发环境关闭缓存
三、项目架构设计
3.1 整体架构模式
项目采用经典的 MVC 三层架构 + 前后端不分离(服务端渲染)模式:
┌─────────────────────────────────────────────────────────┐
│ 浏览器 (客户端) │
│ (HTML + CSS + JavaScript + jQuery) │
└───────────────────────────┬─────────────────────────────┘
│ HTTP 请求/响应
│ (HTML页面 / JSON数据)
┌───────────────────────────▼─────────────────────────────┐
│ Controller 控制层 │
│ (接收请求、参数校验、调用Service、返回视图/JSON) │
│ - admin/ 后台管理控制器 (7个) │
│ - mall/ 前台商城控制器 (5个) │
│ - common/ 公共控制器 (3个) │
└───────────────────────────┬─────────────────────────────┘
│ 方法调用
┌───────────────────────────▼─────────────────────────────┐
│ Service 业务逻辑层 │
│ (业务处理、事务管理、调用DAO、数据转换) │
│ - 8个Service接口 + 8个实现类 │
│ - @Transactional 事务管理 │
└───────────────────────────┬─────────────────────────────┘
│ 方法调用
┌───────────────────────────▼─────────────────────────────┐
│ DAO / Mapper 数据访问层 │
│ (MyBatis接口 + XML映射、SQL操作) │
│ - 9个Mapper接口 │
│ - 9个XML映射文件 │
└───────────────────────────┬─────────────────────────────┘
│ JDBC
┌───────────────────────────▼─────────────────────────────┐
│ MySQL 数据库 │
│ (9张核心业务表) │
└─────────────────────────────────────────────────────────┘
3.2 分层设计原则
3.2.1 控制层 (Controller)
- 职责:接收 HTTP 请求,参数校验,调用 Service 层,返回视图或 JSON
- 返回类型:页面跳转(String)或 JSON 数据(@ResponseBody)
- 数据传递:通过 HttpServletRequest / Model / @RequestBody 传参
3.2.2 业务层 (Service)
- 职责:核心业务逻辑处理,事务控制,数据组装转换
- 事务管理 :使用
@Transactional注解声明式事务 - 返回结果:状态码字符串或业务对象
3.2.3 数据访问层 (DAO/Mapper)
- 职责:数据库 CRUD 操作
- 实现方式:MyBatis 接口 + XML 映射文件
- 参数传递:单个参数、对象、Map、List 等
3.3 核心设计模式
| 设计模式 | 应用场景 |
|---|---|
| MVC 模式 | 整体架构分层 |
| 工厂模式 | Spring Bean 管理 |
| 代理模式 | 事务管理(AOP) |
| 模板方法 | MyBatis SQL 模板 |
| 值对象模式 | VO / DTO 数据传输 |
| 单例模式 | Spring Bean 默认作用域 |
四、数据库设计详解
4.1 数据表总览
项目共包含 9 张核心数据表 ,表名统一前缀为 tb_newbee_mall_:
| 序号 | 表名 | 用途 | 记录数 | 核心字段数 |
|---|---|---|---|---|
| 1 | tb_newbee_mall_admin_user |
管理员用户表 | 3 | 5 |
| 2 | tb_newbee_mall_carousel |
首页轮播图表 | 2 | 10 |
| 3 | tb_newbee_mall_goods_category |
商品分类表 | ~92 | 10 |
| 4 | tb_newbee_mall_goods_info |
商品信息表 | ~100+ | 16 |
| 5 | tb_newbee_mall_index_config |
首页配置表 | 24 | 10 |
| 6 | tb_newbee_mall_order |
订单主表 | 20 | 16 |
| 7 | tb_newbee_mall_order_item |
订单明细表 | 34 | 8 |
| 8 | tb_newbee_mall_shopping_cart_item |
购物车表 | - | 7 |
| 9 | tb_newbee_mall_user |
前台用户表 | 8 | 9 |
SQL 文件位置:newbee_mall_schema.sql(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/resources/newbee_mall_schema.sql)
4.2 核心表结构详解
4.2.1 管理员用户表 (tb_newbee_mall_admin_user)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| admin_user_id | int(11) | PK, AUTO_INCREMENT | 管理员ID |
| login_user_name | varchar(50) | NOT NULL | 登录名 |
| login_password | varchar(50) | NOT NULL | 登录密码(MD5) |
| nick_name | varchar(50) | NOT NULL | 显示昵称 |
| locked | tinyint(4) | DEFAULT 0 | 是否锁定:0-未锁定 1-已锁定 |
默认账号:admin / 123456(密码MD5:e10adc3949ba59abbe56e057f20f883e)
4.2.2 商品分类表 (tb_newbee_mall_goods_category)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| category_id | bigint(20) | PK, AUTO_INCREMENT | 分类ID |
| category_level | tinyint(4) | DEFAULT 0 | 分类级别:1-一级 2-二级 3-三级 |
| parent_id | bigint(20) | DEFAULT 0 | 父分类ID |
| category_name | varchar(50) | NOT NULL | 分类名称 |
| category_rank | int(11) | DEFAULT 0 | 排序值(越大越靠前) |
| is_deleted | tinyint(4) | DEFAULT 0 | 逻辑删除标识 |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| create_user | int(11) | DEFAULT 0 | 创建者ID |
| update_time | datetime | DEFAULT CURRENT_TIMESTAMP | 修改时间 |
| update_user | int(11) | DEFAULT 0 | 修改者ID |
分类层级示例:
一级分类:家电 数码 手机
├── 二级分类:家电
│ ├── 三级分类:生活电器
│ ├── 三级分类:厨房电器
│ └── ...
├── 二级分类:数码
│ ├── 三级分类:平板电脑
│ ├── 三级分类:数码相机
│ └── ...
└── 二级分类:手机
├── 三级分类:华为手机
├── 三级分类:iPhone
└── ...
4.2.3 商品信息表 (tb_newbee_mall_goods_info)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| goods_id | bigint(20) | PK, AUTO_INCREMENT | 商品ID |
| goods_name | varchar(200) | NOT NULL | 商品名称 |
| goods_intro | varchar(200) | NOT NULL | 商品简介 |
| goods_category_id | bigint(20) | NOT NULL | 关联三级分类ID |
| goods_cover_img | varchar(200) | NOT NULL | 商品主图URL |
| goods_carousel | varchar(500) | NOT NULL | 商品轮播图(逗号分隔) |
| goods_detail_content | text | NOT NULL | 商品详情(HTML) |
| original_price | int(11) | DEFAULT 1 | 原价(分) |
| selling_price | int(11) | DEFAULT 1 | 售价(分) |
| stock_num | int(11) | DEFAULT 0 | 库存数量 |
| tag | varchar(20) | DEFAULT '' | 商品标签 |
| goods_sell_status | tinyint(4) | DEFAULT 0 | 上架状态:0-下架 1-上架 |
| create_user | int(11) | DEFAULT 0 | 添加者ID |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 添加时间 |
| update_user | int(11) | DEFAULT 0 | 修改者ID |
| update_time | datetime | DEFAULT CURRENT_TIMESTAMP | 修改时间 |
设计要点:
- 价格以分为单位存储(int类型),避免浮点数精度问题
- 商品分类只关联三级分类,确保分类粒度最细
- 轮播图使用逗号分隔的字符串存储多张图片URL
4.2.4 订单主表 (tb_newbee_mall_order)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| order_id | bigint(20) | PK, AUTO_INCREMENT | 订单ID |
| order_no | varchar(20) | NOT NULL | 订单号(唯一) |
| user_id | bigint(20) | NOT NULL | 用户ID |
| total_price | int(11) | DEFAULT 1 | 订单总价(分) |
| pay_status | tinyint(4) | DEFAULT 0 | 支付状态:0-未支付 1-支付成功 -1-支付失败 |
| pay_type | tinyint(4) | DEFAULT 0 | 支付类型:0-无 1-支付宝 2-微信 |
| pay_time | datetime | NULL | 支付时间 |
| order_status | tinyint(4) | DEFAULT 0 | 订单状态(详见6.2节) |
| extra_info | varchar(100) | DEFAULT '' | 订单附加信息 |
| user_name | varchar(30) | NOT NULL | 收货人姓名 |
| user_phone | varchar(11) | NOT NULL | 收货人手机号 |
| user_address | varchar(100) | NOT NULL | 收货地址 |
| is_deleted | tinyint(4) | DEFAULT 0 | 逻辑删除 |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | DEFAULT CURRENT_TIMESTAMP | 修改时间 |
4.2.5 订单明细表 (tb_newbee_mall_order_item)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| order_item_id | bigint(20) | PK, AUTO_INCREMENT | 订单项ID |
| order_id | bigint(20) | NOT NULL | 关联订单ID |
| goods_id | bigint(20) | NOT NULL | 关联商品ID |
| goods_name | varchar(200) | NOT NULL | 下单时商品名称(快照) |
| goods_cover_img | varchar(200) | NOT NULL | 下单时商品主图(快照) |
| selling_price | int(11) | DEFAULT 1 | 下单时商品价格(快照) |
| goods_count | int(11) | DEFAULT 1 | 购买数量 |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
设计要点(订单快照模式):
订单明细表保存下单时的商品信息快照,而非仅保存商品ID。这样即使后续商品信息发生变化(如改价、下架),历史订单数据仍能准确反映下单时的真实情况。
4.2.6 购物车表 (tb_newbee_mall_shopping_cart_item)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| cart_item_id | bigint(20) | PK, AUTO_INCREMENT | 购物项ID |
| user_id | bigint(20) | NOT NULL | 用户ID |
| goods_id | bigint(20) | DEFAULT 0 | 关联商品ID |
| goods_count | int(11) | DEFAULT 1 | 商品数量(最大5) |
| is_deleted | tinyint(4) | DEFAULT 0 | 逻辑删除 |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | DEFAULT CURRENT_TIMESTAMP | 修改时间 |
4.2.7 前台用户表 (tb_newbee_mall_user)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| user_id | bigint(20) | PK, AUTO_INCREMENT | 用户ID |
| nick_name | varchar(50) | NOT NULL | 用户昵称 |
| login_name | varchar(11) | NOT NULL | 登录名(手机号) |
| password_md5 | varchar(32) | NOT NULL | MD5加密密码 |
| introduce_sign | varchar(100) | NOT NULL | 个性签名 |
| address | varchar(100) | NOT NULL | 收货地址 |
| is_deleted | tinyint(4) | DEFAULT 0 | 注销标识 |
| locked_flag | tinyint(4) | DEFAULT 0 | 锁定标识 |
| create_time | datetime | DEFAULT CURRENT_TIMESTAMP | 注册时间 |
4.3 表关系图
┌──────────────────┐
│ 管理员用户表 │
│ tb_newbee_mall │
│ _admin_user │
└────────┬─────────┘
│ 操作
▼
┌──────────────┐ ┌──────────────────────┐ ┌──────────────┐
│ 首页配置表 │ │ 商品信息表 │ │ 首页轮播图 │
│ index_config│◄─────┤ tb_newbee_mall_goods ├─────►│ carousel │
└──────────────┘ │ _info │ └──────────────┘
└──────────┬───────────┘
│ 关联
▼
┌──────────────────────┐
│ 商品分类表 │
│ goods_category │
│ (三级分类树) │
└──────────────────────┘
┌──────────────┐ ┌──────────────────────┐ ┌──────────────┐
│ 前台用户表 │ │ 订单主表 │ │ 订单明细表 │
│ mall_user ├─────►│ tb_newbee_mall_order ├─────►│ order_item │
└──────┬───────┘ └──────────────────────┘ └──────┬───────┘
│ │
│ ┌──────────────────────┐ │
└──────────►│ 购物车表 │◄──────────────┘
│ shopping_cart_item │
└──────────────────────┘
4.4 数据库设计特点总结
| 特点 | 说明 | 涉及表 |
|---|---|---|
| 逻辑删除 | 使用 is_deleted 字段标记删除,不物理删除数据 |
所有业务表 |
| 时间审计 | 每张表都有 create_time 和 update_time |
所有业务表 |
| 订单快照 | 订单明细保存商品快照,保证历史数据准确性 | order_item |
| 三级分类 | 商品分类支持三级层级结构 | goods_category |
| 分存储价格 | 价格以分为单位(int),避免浮点误差 | goods, order |
| 排序字段 | 使用 rank 字段自定义排序顺序 |
carousel, category, index_config |
五、后端代码架构详解
5.1 代码包结构
ltd.newbee.mall/
│
├── NewBeeMallApplication.java # Spring Boot 启动类
│ # @SpringBootApplication
│ # @MapperScan("ltd.newbee.mall.dao")
│
├── common/ # 公共模块
│ ├── Constants.java # 常量定义
│ ├── ServiceResultEnum.java # 业务结果枚举(23种)
│ ├── PayStatusEnum.java # 支付状态枚举
│ ├── PayTypeEnum.java # 支付类型枚举
│ ├── NewBeeMallOrderStatusEnum.java # 订单状态枚举(8种)
│ ├── IndexConfigTypeEnum.java # 首页配置类型枚举(5种)
│ ├── NewBeeMallCategoryLevelEnum.java # 分类级别枚举(3种)
│ └── NewBeeMallException.java # 自定义业务异常
│
├── config/
│ └── NeeBeeMallWebMvcConfigurer.java # Web MVC 配置
│ # - 3个拦截器注册
│ # - 静态资源映射
│
├── controller/ # 控制层(15个控制器)
│ ├── admin/ # 后台管理(7个)
│ │ ├── AdminController.java # 管理员登录/个人信息
│ │ ├── NewBeeMallCarouselController.java # 轮播图管理
│ │ ├── NewBeeMallGoodsCategoryController.java # 分类管理
│ │ ├── NewBeeMallGoodsController.java # 商品管理
│ │ ├── NewBeeMallGoodsIndexConfigController.java # 首页配置
│ │ ├── NewBeeMallOrderController.java # 订单管理
│ │ └── NewBeeMallUserController.java # 用户管理
│ ├── mall/ # 前台商城(5个)
│ │ ├── IndexController.java # 首页
│ │ ├── GoodsController.java # 商品搜索/详情
│ │ ├── ShoppingCartController.java # 购物车
│ │ ├── OrderController.java # 订单/支付
│ │ └── PersonalController.java # 个人中心
│ ├── common/ # 公共(3个)
│ │ ├── CommonController.java # 验证码
│ │ ├── ErrorPageController.java # 错误页面
│ │ ├── NewBeeMallExceptionHandler.java # 全局异常处理
│ │ └── UploadController.java # 文件上传
│ └── vo/ # 视图对象(13个VO)
│
├── dao/ # 数据访问层(9个Mapper)
│ ├── AdminUserMapper.java
│ ├── CarouselMapper.java
│ ├── GoodsCategoryMapper.java
│ ├── IndexConfigMapper.java
│ ├── MallUserMapper.java
│ ├── NewBeeMallGoodsMapper.java
│ ├── NewBeeMallOrderMapper.java
│ ├── NewBeeMallOrderItemMapper.java
│ └── NewBeeMallShoppingCartItemMapper.java
│
├── entity/ # 实体类(10个)
│ ├── AdminUser.java
│ ├── Carousel.java
│ ├── GoodsCategory.java
│ ├── IndexConfig.java
│ ├── MallUser.java
│ ├── NewBeeMallGoods.java
│ ├── NewBeeMallOrder.java
│ ├── NewBeeMallOrderItem.java
│ ├── NewBeeMallShoppingCartItem.java
│ └── StockNumDTO.java # 库存更新DTO
│
├── interceptor/ # 拦截器(3个)
│ ├── AdminLoginInterceptor.java # 后台登录拦截
│ ├── NewBeeMallLoginInterceptor.java # 前台登录拦截
│ └── NewBeeMallCartNumberInterceptor.java # 购物车数量拦截
│
├── service/ # 业务逻辑层
│ ├── AdminUserService.java # 8个Service接口
│ ├── NewBeeMallCarouselService.java
│ ├── NewBeeMallCategoryService.java
│ ├── NewBeeMallGoodsService.java
│ ├── NewBeeMallIndexConfigService.java
│ ├── NewBeeMallOrderService.java
│ ├── NewBeeMallShoppingCartService.java
│ ├── NewBeeMallUserService.java
│ └── impl/ # 8个实现类
│
└── util/ # 工具类(11个)
├── BeanUtil.java # Bean属性拷贝
├── JsonUtil.java # JSON工具
├── MD5Util.java # MD5加密
├── NewBeeMallUtils.java # 商城工具
├── NumberUtil.java # 数字/订单号工具
├── PageQueryUtil.java # 分页查询参数
├── PageResult.java # 分页返回结果
├── PatternUtil.java # 正则工具
├── Result.java # 统一响应结果
├── ResultGenerator.java # 响应结果生成器
└── SystemUtil.java # 系统工具
5.2 启动类详解
文件位置:NewBeeMallApplication.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/NewBeeMallApplication.java)
java
@MapperScan("ltd.newbee.mall.dao") // 扫描Mapper接口
@SpringBootApplication // Spring Boot 核心注解
public class NewBeeMallApplication {
public static void main(String[] args) {
SpringApplication.run(NewBeeMallApplication.class, args);
}
}
5.3 Web MVC 配置详解
文件位置:NeeBeeMallWebMvcConfigurer.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/config/NeeBeeMallWebMvcConfigurer.java)
5.3.1 拦截器配置
| 拦截器 | 拦截路径 | 排除路径 | 功能 |
|---|---|---|---|
| AdminLoginInterceptor | /admin/** |
/admin/login + 静态资源 |
后台登录验证 |
| NewBeeMallCartNumberInterceptor | 全站(除/admin、登录注册) | - | 全局购物车数量 |
| NewBeeMallLoginInterceptor | 购物车、订单、个人中心等 | 登录注册页 | 前台登录验证 |
5.3.2 静态资源映射
java
registry.addResourceHandler("/upload/**", "/goods-img/**")
.addResourceLocations(Constants.FILE_UPLOAD_URI);
将 /upload/** 和 /goods-img/** 路径映射到文件上传目录。
5.4 常量定义详解
文件位置:Constants.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/common/Constants.java)
| 常量名 | 值 | 说明 |
|---|---|---|
| INDEX_CAROUSEL_NUMBER | 5 | 首页轮播图数量 |
| INDEX_CATEGORY_NUMBER | 10 | 首页一级分类数量 |
| SEARCH_CATEGORY_NUMBER | 8 | 搜索页分类数量 |
| INDEX_GOODS_HOT_NUMBER | 4 | 首页热销商品数量 |
| INDEX_GOODS_NEW_NUMBER | 5 | 首页新品数量 |
| INDEX_GOODS_RECOMMOND_NUMBER | 10 | 首页推荐商品数量 |
| SHOPPING_CART_ITEM_TOTAL_NUMBER | 13 | 购物车最大商品种类数 |
| SHOPPING_CART_ITEM_LIMIT_NUMBER | 5 | 单商品最大购买数量 |
| MALL_VERIFY_CODE_KEY | "mallVerifyCode" | 前台验证码Session Key |
| MALL_USER_SESSION_KEY | "newBeeMallUser" | 前台用户Session Key |
| GOODS_SEARCH_PAGE_LIMIT | 10 | 商品搜索每页条数 |
| ORDER_SEARCH_PAGE_LIMIT | 3 | 订单列表每页条数 |
| SELL_STATUS_UP | 0 | 商品上架状态 |
| SELL_STATUS_DOWN | 1 | 商品下架状态 |
5.5 业务结果枚举
文件位置:ServiceResultEnum.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/common/ServiceResultEnum.java)
共定义了 23 种业务结果状态:
| 枚举项 | 值 | 场景 |
|---|---|---|
| SUCCESS | "success" | 操作成功 |
| ERROR | "error" | 操作失败 |
| DATA_NOT_EXIST | "未查询到记录!" | 数据不存在 |
| SAME_CATEGORY_EXIST | "已存在同级同名的分类!" | 分类重复 |
| SAME_LOGIN_NAME_EXIST | "用户名已存在!" | 用户重复 |
| LOGIN_NAME_NULL | "请输入登录名!" | 登录名为空 |
| LOGIN_PASSWORD_NULL | "请输入密码!" | 密码为空 |
| LOGIN_VERIFY_CODE_NULL | "请输入验证码!" | 验证码为空 |
| LOGIN_VERIFY_CODE_ERROR | "验证码错误!" | 验证码错误 |
| GOODS_NOT_EXIST | "商品不存在!" | 商品不存在 |
| GOODS_PUT_DOWN | "商品已下架!" | 商品已下架 |
| SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR | "超出单个商品的最大购买数量!" | 超出限购 |
| SHOPPING_CART_ITEM_TOTAL_NUMBER_ERROR | "超出购物车最大容量!" | 购物车已满 |
| LOGIN_ERROR | "登录失败!" | 登录失败 |
| LOGIN_USER_LOCKED | "用户已被禁止登录!" | 用户锁定 |
| ORDER_NOT_EXIST_ERROR | "订单不存在!" | 订单不存在 |
| NULL_ADDRESS_ERROR | "地址不能为空!" | 地址为空 |
| ORDER_PRICE_ERROR | "订单价格异常!" | 价格异常 |
| SHOPPING_ITEM_COUNT_ERROR | "库存不足!" | 库存不足 |
| ORDER_STATUS_ERROR | "订单状态异常!" | 状态错误 |
| OPERATE_ERROR | "操作失败!" | 操作失败 |
| NO_PERMISSION_ERROR | "无权限!" | 无权限 |
| DB_ERROR | "database error" | 数据库错误 |
六、核心业务模块详解
6.1 用户模块
6.1.1 前台用户注册
流程:
用户填写注册信息 → 校验手机号格式 → 校验验证码
→ 检查用户名是否已存在 → MD5加密密码 → 写入数据库 → 返回成功
关键代码:NewBeeMallUserServiceImpl.java#L32-L46(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/service/impl/NewBeeMallUserServiceImpl.java#L32-L46)
java
public String register(String loginName, String password) {
// 1. 检查用户名是否已存在
if (mallUserMapper.selectByLoginName(loginName) != null) {
return ServiceResultEnum.SAME_LOGIN_NAME_EXIST.getResult();
}
// 2. 创建用户对象
MallUser registerUser = new MallUser();
registerUser.setLoginName(loginName);
registerUser.setNickName(loginName);
// 3. MD5加密密码
String passwordMD5 = MD5Util.MD5Encode(password, "UTF-8");
registerUser.setPasswordMd5(passwordMD5);
// 4. 保存到数据库
if (mallUserMapper.insertSelective(registerUser) > 0) {
return ServiceResultEnum.SUCCESS.getResult();
}
return ServiceResultEnum.DB_ERROR.getResult();
}
6.1.2 前台用户登录
流程:
用户输入账号密码 → 校验验证码 → 查询用户(登录名+密码MD5)
→ 检查是否被锁定 → 生成UserVO → 存入Session → 登录成功
关键代码:NewBeeMallUserServiceImpl.java#L48-L67(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/service/impl/NewBeeMallUserServiceImpl.java#L48-L67)
6.1.3 管理员登录
流程:
管理员输入账号密码 → 校验验证码 → 查询管理员
→ 存入Session(userId + nickName)→ 跳转到后台首页
关键代码:AdminController.java#L42-L71(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/admin/AdminController.java#L42-L71)
6.2 订单模块
6.2.1 订单状态流转
订单状态定义在 NewBeeMallOrderStatusEnum.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/common/NewBeeMallOrderStatusEnum.java):
| 状态值 | 状态名称 | 操作方 | 触发操作 |
|---|---|---|---|
| 0 | 待支付 | 系统 | 用户提交订单后初始状态 |
| 1 | 已支付 | 用户 | 用户完成支付 |
| 2 | 配货完成 | 管理员 | 后台点击"配货" |
| 3 | 出库成功 | 管理员 | 后台点击"出库" |
| 4 | 交易成功 | 用户 | 用户确认收货 |
| -1 | 手动关闭 | 用户 | 用户取消订单 |
| -2 | 超时关闭 | 系统 | 订单超时未支付 |
| -3 | 商家关闭 | 管理员 | 后台关闭订单 |
6.2.2 正常订单流转图
┌─────────────┐
│ 待支付(0) │
└──────┬──────┘
用户支付 │ │ 用户取消/超时
──▼─── └──────► 手动关闭(-1)
│ 超时关闭(-2)
┌────▼─────┐
│ 已支付(1) │
└────┬──────┘
管理员配货 │
─▼──
┌───────────┐
│ 配货完成(2) │
└─────┬─────┘
管理员出库 │
─▼──
┌───────────┐
│ 出库成功(3) │
└─────┬─────┘
用户确认收货 │
──▼──
┌───────────┐
│ 交易成功(4) │
└───────────┘
6.2.3 生成订单核心逻辑
文件位置:NewBeeMallOrderServiceImpl.java#L179-L250(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/service/impl/NewBeeMallOrderServiceImpl.java#L179-L250)
生成订单的6大步骤:
步骤1:获取购物车商品和商品信息
步骤2:校验商品状态(是否下架)
步骤3:校验商品库存(数量是否足够)
步骤4:删除购物车商品 + 扣减库存(事务)
步骤5:生成订单号 + 创建订单主记录
步骤6:生成订单明细快照 + 批量插入
关键代码片段:
java
@Transactional
public String saveOrder(NewBeeMallUserVO user,
List<NewBeeMallShoppingCartItemVO> myShoppingCartItems) {
// 1. 查询商品信息
List<NewBeeMallGoods> newBeeMallGoods =
newBeeMallGoodsMapper.selectByPrimaryKeys(goodsIds);
// 2. 检查是否包含已下架商品
List<NewBeeMallGoods> goodsListNotSelling = newBeeMallGoods.stream()
.filter(goods -> goods.getGoodsSellStatus() != Constants.SELL_STATUS_UP)
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(goodsListNotSelling)) {
NewBeeMallException.fail(goodsListNotSelling.get(0).getGoodsName() + "已下架");
}
// 3. 判断商品库存
for (NewBeeMallShoppingCartItemVO item : myShoppingCartItems) {
if (item.getGoodsCount() > goodsMap.get(item.getGoodsId()).getStockNum()) {
NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());
}
}
// 4. 删除购物项 + 扣减库存
newBeeMallShoppingCartItemMapper.deleteBatch(itemIdList);
newBeeMallGoodsMapper.updateStockNum(stockNumDTOS);
// 5. 生成订单号 + 保存订单
String orderNo = NumberUtil.genOrderNo();
NewBeeMallOrder newBeeMallOrder = new NewBeeMallOrder();
newBeeMallOrder.setOrderNo(orderNo);
newBeeMallOrderMapper.insertSelective(newBeeMallOrder);
// 6. 生成订单项快照
List<NewBeeMallOrderItem> orderItems = new ArrayList<>();
for (NewBeeMallShoppingCartItemVO item : myShoppingCartItems) {
NewBeeMallOrderItem orderItem = new NewBeeMallOrderItem();
BeanUtil.copyProperties(item, orderItem);
orderItem.setOrderId(newBeeMallOrder.getOrderId());
orderItems.add(orderItem);
}
newBeeMallOrderItemMapper.insertBatch(orderItems);
return orderNo;
}
6.2.4 订单号生成规则
文件位置:NumberUtil.java#L48-L53(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/NumberUtil.java#L48-L53)
java
public static String genOrderNo() {
StringBuffer buffer = new StringBuffer(String.valueOf(System.currentTimeMillis()));
int num = genRandomNum(4); // 4位随机数
buffer.append(num);
return buffer.toString();
}
格式 :时间戳(13位) + 4位随机数 = 共17位
示例 :15688187285093508
6.3 商品分类模块
6.3.1 三级分类数据组装
文件位置:NewBeeMallCategoryServiceImpl.java#L84-L130(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/service/impl/NewBeeMallCategoryServiceImpl.java#L84-L130)
实现思路:
1. 查询一级分类(10个)
2. 批量查询所有二级分类(一级分类ID列表作为父ID)
3. 批量查询所有三级分类(二级分类ID列表作为父ID)
4. 使用 Stream + groupingBy 按 parentId 分组
5. 逐级组装成树形结构
VO 类结构:
NewBeeMallIndexCategoryVO (一级分类)
└── List<SecondLevelCategoryVO> (二级分类列表)
└── List<ThirdLevelCategoryVO> (三级分类列表)
6.4 购物车模块
6.4.1 购物车操作接口
| 操作 | HTTP方法 | 路径 | 说明 |
|---|---|---|---|
| 购物车列表 | GET | /shop-cart | 页面跳转 |
| 添加商品 | POST | /shop-cart | JSON请求 |
| 修改数量 | PUT | /shop-cart | JSON请求 |
| 删除商品 | DELETE | /shop-cart/{id} | RESTful风格 |
| 结算页面 | GET | /shop-cart/settle | 跳转结算页 |
文件位置:ShoppingCartController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/ShoppingCartController.java)
6.4.2 购物车数量全局注入
通过 NewBeeMallCartNumberInterceptor.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/interceptor/NewBeeMallCartNumberInterceptor.java) 拦截器,在每个请求前更新 Session 中的购物车数量:
java
public boolean preHandle(HttpServletRequest request, ...) throws Exception {
if (null != request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY)) {
NewBeeMallUserVO userVO = (NewBeeMallUserVO)
request.getSession().getAttribute(Constants.MALL_USER_SESSION_KEY);
// 查询数据库中最新的购物车数量
userVO.setShopCartItemCount(
newBeeMallShoppingCartItemMapper.selectCountByUserId(userVO.getUserId()));
request.getSession().setAttribute(Constants.MALL_USER_SESSION_KEY, userVO);
}
return true;
}
6.5 商品搜索模块
6.5.1 搜索功能
文件位置:GoodsController.java#L32-L64(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/GoodsController.java#L32-L64)
支持的搜索方式:
- 关键词搜索 :
/search?keyword=xxx - 分类搜索 :
/search?goodsCategoryId=xxx - 排序方式 :
/search?orderBy=price或orderBy=new
搜索参数封装:
java
params.put("keyword", keyword); // 关键词
params.put("goodsCategoryId", categoryId); // 分类ID
params.put("goodsSellStatus", Constants.SELL_STATUS_UP); // 只搜上架商品
params.put("page", page); // 页码
params.put("limit", Constants.GOODS_SEARCH_PAGE_LIMIT); // 每页条数
七、前台商城接口清单
7.1 首页模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 首页 | GET | /, /index, /index.html |
页面 | 首页展示(分类、轮播、热销、新品、推荐) |
控制器:IndexController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/IndexController.java)
7.2 商品模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 搜索页面 | GET | /search, /search.html |
页面 | 商品搜索(支持关键词、分类、排序) |
| 商品详情 | GET | /goods/detail/{goodsId} |
页面 | 商品详情页 |
控制器:GoodsController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/GoodsController.java)
7.3 购物车模块
| 接口 | 方法 | 路径 | 返回 | 登录需要 | 说明 |
|---|---|---|---|---|---|
| 购物车列表 | GET | /shop-cart |
页面 | 是 | 购物车页面 |
| 添加购物车 | POST | /shop-cart |
JSON | 是 | 添加商品到购物车 |
| 修改购物车 | PUT | /shop-cart |
JSON | 是 | 修改商品数量 |
| 删除购物车 | DELETE | /shop-cart/{id} |
JSON | 是 | 删除购物项 |
| 结算页面 | GET | /shop-cart/settle |
页面 | 是 | 订单结算页 |
控制器:ShoppingCartController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/ShoppingCartController.java)
7.4 订单模块
| 接口 | 方法 | 路径 | 返回 | 登录需要 | 说明 |
|---|---|---|---|---|---|
| 订单列表 | GET | /orders |
页面 | 是 | 我的订单列表 |
| 订单详情 | GET | /orders/{orderNo} |
页面 | 是 | 订单详情页 |
| 生成订单 | GET | /saveOrder |
重定向 | 是 | 提交订单(从购物车) |
| 取消订单 | PUT | /orders/{orderNo}/cancel |
JSON | 是 | 用户取消订单 |
| 确认收货 | PUT | /orders/{orderNo}/finish |
JSON | 是 | 用户确认收货 |
| 选择支付 | GET | /selectPayType |
页面 | 是 | 选择支付方式 |
| 支付页面 | GET | /payPage |
页面 | 是 | 跳转支付页 |
| 支付成功 | GET | /paySuccess |
JSON | 否 | 支付回调 |
控制器:OrderController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/mall/OrderController.java)
7.5 个人中心模块
| 接口 | 方法 | 路径 | 返回 | 登录需要 | 说明 |
|---|---|---|---|---|---|
| 个人中心 | GET | /personal |
页面 | 是 | 个人信息页 |
| 修改信息 | POST | /personal/updateInfo |
JSON | 是 | 修改用户信息 |
7.6 用户认证模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 登录页 | GET | /login |
页面 | 登录页面 |
| 登录提交 | POST | /login |
重定向 | 用户登录 |
| 注册页 | GET | /register |
页面 | 注册页面 |
| 注册提交 | POST | /register |
JSON | 用户注册 |
| 退出登录 | GET | /logout |
重定向 | 退出登录 |
7.7 公共接口
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 前台验证码 | GET | /common/mall/kaptcha |
图片流 | 前台图形验证码 |
| 文件上传 | POST | /upload/file |
JSON | 图片上传接口 |
八、后台管理接口清单
8.1 管理员模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 登录页 | GET | /admin/login |
页面 | 后台登录页 |
| 登录提交 | POST | /admin/login |
重定向 | 管理员登录 |
| 后台首页 | GET | /admin, /admin/index |
页面 | 后台首页 |
| 个人信息 | GET | /admin/profile |
页面 | 个人资料页 |
| 修改密码 | POST | /admin/profile/password |
字符串 | 修改密码 |
| 修改昵称 | POST | /admin/profile/name |
字符串 | 修改昵称 |
| 退出登录 | GET | /admin/logout |
重定向 | 退出登录 |
| 后台验证码 | GET | /common/kaptcha |
图片流 | 后台验证码 |
控制器:AdminController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/admin/AdminController.java)
8.2 商品管理模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 商品列表页 | GET | /admin/goods |
页面 | 商品管理页 |
| 商品列表数据 | GET | /admin/goods/list |
JSON | 分页查询商品 |
| 商品详情 | GET | /admin/goods/info/{id} |
JSON | 获取商品详情 |
| 新增商品页 | GET | /admin/goods/edit |
页面 | 新增商品页面 |
| 编辑商品页 | GET | /admin/goods/edit/{goodsId} |
页面 | 编辑商品页面 |
| 新增商品 | POST | /admin/goods/save |
JSON | 保存商品 |
| 修改商品 | POST | /admin/goods/update |
JSON | 更新商品 |
| 批量上下架 | PUT | /admin/goods/status/{sellStatus} |
JSON | 批量修改销售状态 |
控制器:NewBeeMallGoodsController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/admin/NewBeeMallGoodsController.java)
8.3 分类管理模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 分类列表页 | GET | /admin/categories |
页面 | 分类管理页 |
| 分类列表数据 | GET | /admin/categories/list |
JSON | 分页查询分类 |
| 分类详情 | GET | /admin/categories/info/{id} |
JSON | 获取分类详情 |
| 新增分类 | POST | /admin/categories/save |
JSON | 保存分类 |
| 修改分类 | POST | /admin/categories/update |
JSON | 更新分类 |
| 删除分类 | DELETE | /admin/categories/delete |
JSON | 批量删除分类 |
| 分类列表(按级别) | GET | /admin/categories/listForSelect |
JSON | 用于三级联动 |
8.4 轮播图管理模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 轮播图列表页 | GET | /admin/carousels |
页面 | 轮播图管理页 |
| 轮播图列表数据 | GET | /admin/carousels/list |
JSON | 分页查询 |
| 新增轮播图 | POST | /admin/carousels/save |
JSON | 保存轮播图 |
| 修改轮播图 | POST | /admin/carousels/update |
JSON | 更新轮播图 |
| 删除轮播图 | DELETE | /admin/carousels/delete |
JSON | 批量删除 |
8.5 首页配置模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 配置列表页 | GET | /admin/indexConfigs |
页面 | 首页配置页 |
| 配置列表数据 | GET | /admin/indexConfigs/list |
JSON | 分页查询 |
| 新增配置 | POST | /admin/indexConfigs/save |
JSON | 保存配置 |
| 修改配置 | POST | /admin/indexConfigs/update |
JSON | 更新配置 |
| 删除配置 | DELETE | /admin/indexConfigs/delete |
JSON | 批量删除 |
8.6 订单管理模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 订单列表页 | GET | /admin/orders |
页面 | 订单管理页 |
| 订单列表数据 | GET | /admin/orders/list |
JSON | 分页查询订单 |
| 订单详情 | GET | /admin/orders/detail/{orderNo} |
页面 | 订单详情页 |
| 修改订单 | POST | /admin/orders/update |
JSON | 修改订单信息 |
| 配货操作 | PUT | /admin/orders/checkDone |
JSON | 批量配货 |
| 出库操作 | PUT | /admin/orders/checkOut |
JSON | 批量出库 |
| 关闭订单 | PUT | /admin/orders/close |
JSON | 批量关闭 |
8.7 用户管理模块
| 接口 | 方法 | 路径 | 返回 | 说明 |
|---|---|---|---|---|
| 用户列表页 | GET | /admin/users |
页面 | 用户管理页 |
| 用户列表数据 | GET | /admin/users/list |
JSON | 分页查询用户 |
| 禁用/启用 | POST | /admin/users/lock/{lockStatus} |
JSON | 批量锁定/解锁 |
九、前端页面结构详解
9.1 前台商城页面
前台模板位置:src/main/resources/templates/mall/
| 页面 | 文件名 | 说明 | 主要组件 |
|---|---|---|---|
| 首页 | index.html(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/resources/templates/mall/index.html) | 商城首页 | 分类导航、轮播图、热销、新品、推荐 |
| 登录页 | login.html | 用户登录 | 验证码、登录表单 |
| 注册页 | register.html | 用户注册 | 验证码、注册表单 |
| 搜索页 | search.html | 商品搜索 | 筛选条件、商品列表、分页 |
| 详情页 | detail.html | 商品详情 | 商品图、价格、规格、加入购物车 |
| 购物车 | cart.html | 购物车列表 | 商品列表、数量调整、总价计算 |
| 订单结算 | order-settle.html | 订单确认 | 收货地址、商品清单、提交订单 |
| 订单列表 | my-orders.html | 我的订单 | 订单列表、状态标签、操作按钮 |
| 订单详情 | order-detail.html | 订单详情 | 订单信息、商品明细、物流信息 |
| 支付选择 | pay-select.html | 选择支付方式 | 支付宝/微信支付选择 |
| 支付宝页 | alipay.html | 模拟支付宝支付 | 二维码、支付金额 |
| 微信支付页 | wxpay.html | 模拟微信支付 | 二维码、支付金额 |
| 个人中心 | personal.html | 个人信息 | 头像、昵称、地址修改 |
| 公共头部 | header.html | 公共头部 | logo、搜索、购物车、登录 |
| 公共底部 | footer.html | 公共底部 | 版权信息、链接 |
| 个人侧边栏 | personal-sidebar.html | 个人中心菜单 | 菜单导航 |
页面数量:16个(含3个公共片段)
9.2 后台管理页面
后台模板位置:src/main/resources/templates/admin/
| 页面 | 文件名 | 说明 | 主要组件 |
|---|---|---|---|
| 登录页 | login.html | 管理员登录 | 验证码、登录表单 |
| 首页 | index.html | 后台首页 | 数据概览、快捷入口 |
| 商品管理 | newbee_mall_goods.html | 商品列表 | jqGrid表格、搜索、批量操作 |
| 商品编辑 | newbee_mall_goods_edit.html | 商品新增/编辑 | 三级分类联动、富文本编辑器、图片上传 |
| 分类管理 | newbee_mall_category.html | 分类列表 | 表格、增删改查 |
| 轮播图管理 | newbee_mall_carousel.html | 轮播图列表 | 表格、图片上传、排序 |
| 首页配置 | newbee_mall_index_config.html | 首页配置 | 类型切换、商品选择 |
| 订单管理 | newbee_mall_order.html | 订单列表 | 搜索、状态筛选、批量操作 |
| 用户管理 | newbee_mall_user.html | 用户列表 | 搜索、禁用/启用 |
| 个人资料 | profile.html | 个人信息 | 修改密码、修改昵称 |
| 公共头部 | header.html | 后台头部 | 管理员信息、退出 |
| 侧边栏 | sidebar.html | 左侧菜单 | 功能导航菜单 |
| 公共底部 | footer.html | 底部 | 版权信息 |
页面数量:13个(含3个公共片段)
9.3 静态资源结构
static/
├── admin/ # 后台静态资源
│ └── plugins/ # 第三方插件
│ ├── jquery/ # jQuery
│ ├── bootstrap/ # Bootstrap
│ ├── jqgrid-5.5.2/ # jqGrid表格
│ ├── select2/ # Select2下拉框
│ ├── ajaxupload/ # 文件上传
│ └── ...
│
└── mall/ # 前台静态资源
├── css/ # 样式文件
│ ├── common.css
│ ├── index.css
│ ├── header.css
│ ├── cart.css
│ ├── detail.css
│ └── ...
├── js/ # JavaScript文件
│ ├── jquery-1.8.0.js
│ ├── bootstrap3.js
│ ├── swiper-bundle.min.js
│ ├── index.js
│ ├── detail.js
│ ├── search.js
│ └── ...
├── image/ # 图片资源
│ ├── swiper/ # 轮播图
│ ├── sub_banner/ # 子横幅
│ └── pay/ # 支付相关
├── fonts/ # 字体图标
└── styles/ # 页面专用样式
十、安全与权限机制
10.1 拦截器机制
10.1.1 后台登录拦截器
文件位置:AdminLoginInterceptor.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/interceptor/AdminLoginInterceptor.java)
java
public boolean preHandle(HttpServletRequest request, ...) throws Exception {
if (null == request.getSession().getAttribute("loginUserId")) {
response.sendRedirect(request.getContextPath() + "/admin/login");
return false;
}
return true;
}
拦截规则:
- 拦截所有
/admin/**路径 - 排除
/admin/login登录页 - 排除静态资源路径
10.1.2 前台登录拦截器
文件位置:NewBeeMallLoginInterceptor.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/interceptor/NewBeeMallLoginInterceptor.java)
需要登录的路径:
- 商品详情:
/goods/detail/** - 购物车:
/shop-cart,/shop-cart/** - 订单:
/saveOrder,/orders,/orders/** - 个人中心:
/personal,/personal/updateInfo - 支付:
/selectPayType,/payPage
10.2 密码安全
加密方式:MD5 + 字符集编码
文件位置:MD5Util.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/MD5Util.java)
java
String passwordMD5 = MD5Util.MD5Encode(password, "UTF-8");
注意:MD5 已不再安全,生产环境建议使用 BCrypt、PBKDF2 等更强的加密算法。
10.3 验证码机制
实现库:Easy-Captcha
文件位置:CommonController.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/controller/common/CommonController.java)
验证码类型:
- 纯数字(4位)
- 图片尺寸:前台 110x40,后台 150x40
- 存入 Session 中
10.4 权限隔离
| 角色 | 数据表 | 拦截器 | 访问路径 |
|---|---|---|---|
| 普通用户 | tb_newbee_mall_user | NewBeeMallLoginInterceptor | /, /index, /goods/**, /shop-cart, /orders, ... |
| 管理员 | tb_newbee_mall_admin_user | AdminLoginInterceptor | /admin/** |
10.5 全局异常处理
文件位置 :controller/common/NewBeeMallExceptionHandler.java
统一处理业务异常,返回友好的错误页面或 JSON 错误信息。
十一、核心工具类详解
11.1 BeanUtil - Bean 属性拷贝工具
文件位置:BeanUtil.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/BeanUtil.java)
| 方法 | 说明 |
|---|---|
copyProperties(source, target, ignore...) |
单个对象属性拷贝(基于Spring BeanUtils) |
copyList(sources, clazz) |
列表批量拷贝 |
copyList(sources, clazz, callback) |
列表拷贝+自定义回调 |
toMap(bean, ignore...) |
对象转Map |
toBean(map, beanType) |
Map转对象 |
checkPojoNullField(o, clz) |
检查POJO是否有null字段 |
11.2 Result - 统一响应结果
文件位置:Result.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/Result.java)
java
public class Result<T> implements Serializable {
private int resultCode; // 状态码
private String message; // 提示信息
private T data; // 返回数据
}
生成器:ResultGenerator.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/ResultGenerator.java)
genSuccessResult()- 成功(无数据)genSuccessResult(data)- 成功(带数据)genFailResult(message)- 失败(带消息)
11.3 分页工具
PageQueryUtil - 分页查询参数
文件位置:PageQueryUtil.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/PageQueryUtil.java)
java
public class PageQueryUtil extends LinkedHashMap<String, Object> {
private int page; // 当前页码
private int limit; // 每页条数
public PageQueryUtil(Map<String, Object> params) {
// 自动从Map中提取page和limit参数
this.page = Integer.parseInt(params.get("page").toString());
this.limit = Integer.parseInt(params.get("limit").toString());
this.put("start", (page - 1) * limit); // 计算偏移量
this.put("page", page);
this.put("limit", limit);
}
}
PageResult - 分页返回结果
java
public class PageResult<T> implements Serializable {
private int totalPage; // 总页数
private int totalCount; // 总记录数
private int currentPage; // 当前页
private int pageSize; // 每页条数
private List<T> list; // 列表数据
}
11.4 NumberUtil - 数字工具
文件位置:NumberUtil.java(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/java/ltd/newbee/mall/util/NumberUtil.java)
| 方法 | 说明 |
|---|---|
isPhone(String phone) |
判断是否为11位手机号(正则校验) |
genRandomNum(int length) |
生成指定长度随机数 |
genOrderNo() |
生成订单号(时间戳+4位随机数) |
11.5 MD5Util - MD5加密工具
提供 MD5 加密方法,支持指定字符集。
11.6 其他工具类
| 工具类 | 用途 |
|---|---|
| JsonUtil | JSON 序列化/反序列化 |
| PatternUtil | 正则表达式工具 |
| NewBeeMallUtils | 商城专用工具(字符串清理等) |
| SystemUtil | 系统工具 |
十二、项目部署与运行
12.1 环境要求
| 软件 | 版本要求 | 说明 |
|---|---|---|
| JDK | 1.8+ | Java 8 及以上 |
| Maven | 3.6+ | Maven 构建工具 |
| MySQL | 5.7+ | 关系型数据库 |
| IDE | IntelliJ IDEA / Eclipse | 推荐 IDEA |
12.2 启动步骤
步骤1:创建数据库
sql
CREATE DATABASE mall_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
步骤2:导入数据
执行 SQL 脚本文件:
src/main/resources/newbee_mall_schema.sql
步骤3:修改配置
编辑 application.properties(file:///c:/Users/GaryJie/Desktop/基于Java的Mall商城系统的设计与实现/newbee-mall-master/src/main/resources/application.properties):
properties
# 修改数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/mall_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=your_password
步骤4:启动项目
方式一:IDE 启动
运行 NewBeeMallApplication.main() 方法
方式二:Maven 命令启动
bash
mvn spring-boot:run
方式三:打包后启动
bash
mvn clean package
java -jar target/newbee-mall-1.0.0-SNAPSHOT.jar
步骤5:访问系统
| 系统 | 访问地址 | 默认账号 |
|---|---|---|
| 前台商城 | http://localhost:28089 | 13700002703 / 123456 |
| 后台管理 | http://localhost:28089/admin/login | admin / 123456 |
12.3 项目配置说明
数据库连接池配置(HikariCP)
properties
spring.datasource.hikari.minimum-idle=5 # 最小空闲连接
spring.datasource.hikari.maximum-pool-size=15 # 最大连接数
spring.datasource.hikari.connection-timeout=30000 # 连接超时(毫秒)
spring.datasource.hikari.idle-timeout=30000 # 空闲超时
spring.datasource.hikari.max-lifetime=30000 # 最大生命周期
端口配置
properties
server.port=28089
Thymeleaf 缓存配置
properties
spring.thymeleaf.cache=false # 开发环境建议关闭,生产环境开启
十三、项目优缺点分析
13.1 优点 ✅
13.1.1 架构设计
| 优点 | 说明 |
|---|---|
| 分层清晰 | 严格的 MVC 三层架构,职责分离明确 |
| 代码规范 | 包结构、命名规范统一,易于阅读和维护 |
| 接口设计合理 | RESTful 风格,方法语义明确(GET/POST/PUT/DELETE) |
| 统一返回格式 | 使用 Result 泛型类统一 API 返回格式 |
| 异常处理机制 | 自定义业务异常 + 全局异常处理 |
13.1.2 业务实现
| 优点 | 说明 |
|---|---|
| 功能完整 | 覆盖电商核心流程(商品、购物车、订单、支付、用户) |
| 双端系统 | 同时包含前台商城和后台管理系统 |
| 三级分类 | 完善的商品分类体系(一级→二级→三级) |
| 订单快照 | 订单明细保存商品快照,保证历史数据准确性 |
| 订单状态机 | 完整的订单状态流转,支持多种关闭原因 |
| 逻辑删除 | 所有业务表使用逻辑删除,数据可追溯 |
13.1.3 学习价值
| 优点 | 说明 |
|---|---|
| 适合入门 | 技术选型主流,代码复杂度适中 |
| 注释丰富 | 关键代码有注释,便于理解 |
| SQL 明确 | MyBatis XML 手写 SQL,便于学习 SQL 优化 |
| 设计模式应用 | 多种设计模式的实际应用场景 |
13.2 可改进点 ⚠️
13.2.1 安全性
| 问题 | 建议 |
|---|---|
| 密码加密弱 | 仅使用 MD5,易被彩虹表破解 |
| 缺少 XSS 防护 | 用户输入未做充分过滤 |
| 缺少 CSRF 防护 | 表单提交无 CSRF Token |
| SQL 注入风险 | 部分动态 SQL 可能存在风险 |
| 越权访问 | 订单查询未充分验证权限 |
13.2.2 性能优化
| 问题 | 建议 |
|---|---|
| 无缓存层 | 每次请求都查数据库 |
| 无消息队列 | 订单超时等依赖定时任务 |
| 数据库单节点 | 无读写分离 |
| 无接口限流 | 可能被恶意刷接口 |
13.2.3 功能完善
| 问题 | 建议 |
|---|---|
| 支付模拟 | 未接入真实支付接口 |
| 单地址 | 只有一个收货地址 |
| 无商品评价 | 缺少评价系统 |
| 无商品收藏 | 不能收藏商品 |
| 无物流跟踪 | 订单无物流信息 |
| 无优惠券 | 缺少营销功能 |
| 无会员体系 | 用户等级缺失 |
13.2.4 工程化
| 问题 | 建议 |
|---|---|
| 无单元测试 | 缺少测试用例 |
| 无日志配置 | 日志框架未充分配置 |
| 无 API 文档 | 接口文档缺失 |
| 无监控告警 | 缺少系统监控 |
| Docker 缺失 | 无容器化部署 |
13.3 可扩展方向
13.3.1 技术升级方向
当前架构(单体应用)
│
├─► 增加 Redis 缓存
├─► 引入消息队列(RabbitMQ / RocketMQ)
├─► 前后端分离(Vue / React)
├─► 微服务架构(Spring Cloud)
└─► 容器化部署(Docker + K8s)
13.3.2 业务扩展方向
- 营销模块:优惠券、秒杀、拼团、满减
- 内容模块:商品评价、晒单、问答社区
- 供应商模块:多商户入驻、店铺管理
- 数据报表:销售统计、用户画像、数据分析
- 移动端:小程序、H5、APP
十四、学习路径建议
14.1 初学者学习路线
第一阶段:环境搭建与运行(1-2天)
1. 安装 JDK 1.8、Maven、MySQL
2. 导入项目到 IDEA
3. 创建数据库,执行 SQL 脚本
4. 修改数据库配置,启动项目
5. 访问前台和后台,熟悉功能
第二阶段:理解项目结构(2-3天)
1. 通读 pom.xml,了解依赖
2. 梳理包结构,理解各层职责
3. 学习 application.properties 配置
4. 阅读启动类,理解 Spring Boot 启动流程
5. 画一张架构图
第三阶段:核心代码学习(5-7天)
按模块逐个学习:
模块1:用户模块(注册、登录、验证码)
├─ controller: PersonalController, AdminController
├─ service: NewBeeMallUserService, AdminUserService
├─ dao: MallUserMapper, AdminUserMapper
└─ 页面: login.html, register.html, personal.html
模块2:商品分类模块(三级分类)
├─ 理解分类层级结构(一级→二级→三级)
├─ 学习分类数据的组装算法(Stream + groupingBy)
└─ 前端三级联动实现
模块3:商品模块(搜索、详情、上下架)
├─ 商品搜索 SQL 编写
├─ 分页查询实现
├─ 富文本编辑器的使用
└─ 图片上传功能
模块4:购物车模块(增删改查)
├─ 购物车 CRUD 操作
├─ 购物车数量全局拦截器
└─ 库存校验逻辑
模块5:订单模块(核心重点)
├─ 生成订单的完整事务流程
├─ 订单状态机设计
├─ 订单快照模式
├─ 库存扣减实现
└─ 支付流程(模拟)
模块6:后台管理模块
├─ jqGrid 表格的使用
├─ 批量操作实现
├─ 管理员权限控制
└─ 订单管理(配货、出库、关闭)
第四阶段:动手实践(持续)
1. 修改首页轮播图数量
2. 增加一个商品筛选条件(如价格区间)
3. 实现收货地址管理功能
4. 增加商品收藏功能
5. 尝试接入真实的支付宝沙箱环境
6. 给项目加上 Redis 缓存
14.2 进阶学习建议
14.2.1 Spring Boot 深入
- 自动配置原理
- Starter 机制
- Spring Boot 事件监听
- 自定义 Starter
14.2.2 MyBatis 深入
- 动态 SQL 高级用法
- 一对一、一对多映射
- 分页插件(PageHelper)
- 通用 Mapper / MyBatis-Plus
14.2.3 架构演进
- 从单体到微服务
- Spring Cloud 全家桶
- 分布式事务
- 分布式缓存
14.3 常见问题排查指南
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 启动失败,端口占用 | 28089 端口被占用 | 修改 server.port 或关闭占用程序 |
| 数据库连接失败 | 数据库未启动 / 配置错误 | 检查 MySQL 服务、用户名密码 |
| 验证码不显示 | Easy-Captcha 字体问题 | 安装对应字体或换用其他验证码库 |
| 图片上传失败 | 上传目录权限 / 路径配置 | 检查 upload 目录权限和 Constants 配置 |
| 中文乱码 | 数据库字符集 / 请求编码 | 确认使用 UTF-8,检查连接参数 |
附录
A. 核心文件索引
| 类型 | 数量 | 目录位置 |
|---|---|---|
| Controller | 15 | src/main/java/ltd/newbee/mall/controller/ |
| Service 接口 | 8 | src/main/java/ltd/newbee/mall/service/ |
| Service 实现 | 8 | src/main/java/ltd/newbee/mall/service/impl/ |
| Mapper 接口 | 9 | src/main/java/ltd/newbee/mall/dao/ |
| Mapper XML | 9 | src/main/resources/mapper/ |
| Entity 实体 | 10 | src/main/java/ltd/newbee/mall/entity/ |
| VO 视图对象 | 13 | src/main/java/ltd/newbee/mall/controller/vo/ |
| 工具类 | 11 | src/main/java/ltd/newbee/mall/util/ |
| 枚举类 | 6 | src/main/java/ltd/newbee/mall/common/ |
| 拦截器 | 3 | src/main/java/ltd/newbee/mall/interceptor/ |
| 前台页面 | 16 | src/main/resources/templates/mall/ |
| 后台页面 | 13 | src/main/resources/templates/admin/ |
| 数据库表 | 9 | newbee_mall_schema.sql |
B. 参考资源
文档结束
本文档基于 Mall v1.0.0-SNAPSHOT 版本分析生成