一、项目背景:电商数字化浪潮下的商城系统需求
在互联网经济高速发展的当下,传统线下零售面临获客成本高、商品管理难、交易效率低三大核心痛点。据电商行业报告显示,2023年仍有超40%的中小商户依赖线下门店单一渠道,商品库存与销售数据割裂,用户购物体验受时空限制严重。
为顺应电商数字化趋势,基于Spring Boot的网上商城系统应运而生。系统以“商品管理数字化、交易流程线上化、用户体验便捷化”为核心目标,采用B/S架构构建一体化电商平台,整合用户管理、商品管理、订单管理、评价互动等核心功能,建立“管理员统筹-用户消费”的双层应用模式,推动零售业务从“线下单一运营”向“线上线下协同、数据驱动决策”转型。
二、技术架构:网上商城系统的全栈技术选型
项目围绕“高性能、易维护、高安全”三大原则,选用成熟稳定的技术栈,确保系统在高并发交易、大量商品数据存储时的可靠性:
| 技术模块 | 具体工具/技术 | 核心作用 |
|---|---|---|
| 后端框架 | Spring Boot 2.x | 快速构建RESTful API,处理商品、订单等核心业务逻辑 |
| 前端技术 | JSP + Layui | 构建简洁直观的电商界面,适配管理员与用户操作场景 |
| 数据库 | MySQL 8.0 | 安全存储用户信息、商品数据、订单记录等核心业务数据 |
| 架构模式 | B/S(浏览器/服务器) | 无需客户端安装,支持多设备随时访问 |
| 文件存储 | 本地文件系统 | 存储商品图片、用户头像等静态资源 |
| 开发工具 | Eclipse + Navicat | 高效完成代码开发与数据库可视化管理 |
三、项目全流程:6步完成网上商城系统开发
3.1 第一步:需求分析——明确系统核心价值
针对传统零售的“运营低效、体验单一”痛点,系统聚焦“商品集中管理、交易在线闭环、用户互动留存”,明确双角色的核心需求:
3.1.1 功能性需求
-
双角色权限体系
- 管理员:个人中心(密码修改)、用户信息管理(新增/编辑/删除用户)、商品分类管理(新增/修改/删除分类)、商品信息管理(上架/下架/编辑商品)、订单管理(处理订单状态)、商品评价管理(审核评价)、商品资讯管理(发布/编辑资讯);
- 普通用户:个人中心(资料维护、密码修改)、商品浏览(按分类/关键词筛选)、购物车管理(添加/删除商品)、订单管理(提交订单、查看物流)、商品评价(提交评分与评论)、收藏管理(收藏心仪商品)。
-
核心业务功能
- 商品全生命周期管理:从商品上架、库存更新到下架归档的完整流程;
- 交易闭环实现:用户浏览商品→加入购物车→提交订单→支付→订单跟踪→评价反馈;
- 分类管理:支持多级商品分类,适配不同品类商品的管理需求;
- 互动功能:商品评价、收藏管理,提升用户粘性;
- 数据安全:用户密码加密存储,订单信息脱敏展示,防止信息泄露。
3.1.2 非功能性需求
- 系统性能:支持50+并发用户操作,商品查询响应时间<2秒,订单提交成功率100%;
- 数据安全:用户密码加密(MD5)存储,敏感信息(手机号、地址)脱敏展示;
- 用户体验:界面符合电商用户操作习惯,核心功能操作步骤≤3步;
- 兼容性:支持Chrome、Edge、Firefox等主流浏览器,适配1366×768及以上分辨率。
3.2 第二步:系统设计——构建整体架构
系统采用分层设计思想,确保各模块职责清晰、可维护性强,同时满足电商业务的高可用性要求:
3.2.1 系统总体架构
-
前端架构
- 基于JSP实现页面动态渲染,结合Layui提供的表单、表格、弹窗等组件,快速搭建电商风格界面;
- 采用Ajax实现异步数据交互(如商品加入购物车、订单状态更新),避免页面刷新,提升操作流畅度;
- 按角色划分权限视图:管理员登录后展示完整管理菜单,用户仅显示“商品浏览、购物车、订单”等消费功能。
-
后端架构
- 基于Spring Boot实现分层架构:Controller(接口层,处理HTTP请求)、Service(业务逻辑层,实现核心功能)、Mapper(数据访问层,操作数据库);
- 统一异常处理机制:捕获业务异常(如“商品库存不足”“订单支付超时”)并返回友好提示;
- 权限拦截器:验证用户登录状态与角色权限,防止用户越权访问管理员功能(如商品下架)。
-
数据持久层
- 采用MyBatis实现数据库操作,通过XML配置SQL语句,降低代码耦合度;
- 配置HikariCP数据库连接池,优化数据库访问性能,避免连接资源浪费。
3.2.2 核心数据库设计
系统设计12张核心数据表,覆盖用户、商品、订单等全业务场景,关键表结构如下:
| 表名 | 核心字段 | 作用 |
|---|---|---|
| 用户表(user) | id、用户名、密码(加密)、姓名、头像、性别、联系电话、余额 | 存储用户基本信息 |
| 商品分类表(shangpinfenlei) | id、商品分类、创建时间 | 管理商品分类体系 |
| 商品信息表(shangpinxinxi) | id、商品名称、分类、图片、标签、品牌、详情、价格、点击次数 | 存储商品详细信息 |
| 购物车表(gouwuche) | id、用户id、商品id、商品名称、图片、购买数量、单价 | 记录用户购物车数据 |
| 订单表(dingdan) | id、订单编号、用户id、商品id、购买数量、总价、地址、状态 | 存储订单交易记录 |
| 商品评价表(shangpinpingjia) | id、订单编号、商品名称、评分、评价内容、审核状态 | 管理用户评价互动 |
| 收藏表(shoucang) | id、用户id、收藏id、商品名称、图片 | 记录用户收藏行为 |
3.3 第三步:后端核心功能实现——Spring Boot架构
基于Spring Boot框架实现系统核心业务逻辑,重点突破“商品管理”“订单管理”“购物车交互”三大核心场景,确保功能稳定、符合电商实际运营需求:
3.3.1 商品信息管理功能实现
@RestController
@RequestMapping("/api/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
/**
* 管理员新增商品
*/
@PostMapping("/add")
public ResponseEntity<?> addGoods(@RequestBody GoodsDTO goodsDTO,
@RequestHeader("adminId") Long adminId) {
try {
// 参数校验:商品名称、分类、价格为必填项
if (StringUtils.isEmpty(goodsDTO.getShangpinmingcheng()) ||
StringUtils.isEmpty(goodsDTO.getShangpinfenlei()) ||
goodsDTO.getPrice() == null) {
return ResponseEntity.badRequest().body("商品名称、分类、价格不能为空");
}
// 构建商品实体
Shangpinxinxi goods = new Shangpinxinxi();
goods.setShangpinmingcheng(goodsDTO.getShangpinmingcheng());
goods.setShangpinfenlei(goodsDTO.getShangpinfenlei());
goods.setTupian(goodsDTO.getTupian()); // 商品图片路径
goods.setBiaoqian(goodsDTO.getBiaoqian());
goods.setPinpai(goodsDTO.getPinpai());
goods.setShangpinxiangqing(goodsDTO.getShangpinxiangqing());
goods.setPrice(goodsDTO.getPrice());
goods.setClicknum(0); // 初始点击次数为0
goods.setAddtime(new Date());
// 保存商品信息
Shangpinxinxi result = goodsService.addGoods(goods);
return ResponseEntity.ok("商品新增成功,商品ID:" + result.getId());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("商品新增失败:" + e.getMessage());
}
}
/**
* 用户查询商品列表(支持多维度筛选)
*/
@GetMapping("/list")
public ResponseEntity<?> getGoodsList(
@RequestParam(required = false) String shangpinfenlei,
@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
try {
// 构建查询条件
GoodsQuery query = new GoodsQuery();
query.setShangpinfenlei(shangpinfenlei);
query.setKeyword(keyword);
query.setPage(page);
query.setSize(size);
// 分页查询商品
PageResult<GoodsVO> result = goodsService.getGoodsList(query);
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("商品查询失败:" + e.getMessage());
}
}
}
@Service
@Transactional
public class GoodsServiceImpl implements GoodsService {
@Autowired
private ShangpinxinxiMapper goodsMapper;
@Override
public Shangpinxinxi addGoods(Shangpinxinxi goods) {
goodsMapper.insert(goods);
return goods;
}
@Override
public PageResult<GoodsVO> getGoodsList(GoodsQuery query) {
// 分页配置
PageHelper.startPage(query.getPage(), query.getSize());
// 构建查询条件
ShangpinxinxiExample example = new ShangpinxinxiExample();
ShangpinxinxiExample.Criteria criteria = example.createCriteria();
if (StringUtils.isNotEmpty(query.getShangpinfenlei())) {
criteria.andShangpinfenleiEqualTo(query.getShangpinfenlei());
}
if (StringUtils.isNotEmpty(query.getKeyword())) {
criteria.andShangpinmingchengLike("%" + query.getKeyword() + "%")
.or()
.like(Shangpinxinxi::getBiaoqian, query.getKeyword());
}
// 按点击次数倒序,热门商品优先展示
example.setOrderByClause("clicknum DESC");
// 执行查询
List<Shangpinxinxi> goodsList = goodsMapper.selectByExample(example);
PageInfo<Shangpinxinxi> pageInfo = new PageInfo<>(goodsList);
// 转换为VO(隐藏敏感字段,如创建时间)
List<GoodsVO> voList = goodsList.stream()
.map(goods -> {
GoodsVO vo = new GoodsVO();
BeanUtils.copyProperties(goods, vo);
return vo;
}).collect(Collectors.toList());
// 返回分页结果
return new PageResult<>(voList, pageInfo.getTotal());
}
}
3.3.2 订单管理功能实现(核心交易闭环)
@RestController
@RequestMapping("/api/order")
public class OrderController {
@Autowired
private OrderService orderService;
/**
* 用户提交订单(从购物车生成订单)
*/
@PostMapping("/submit")
public ResponseEntity<?> submitOrder(@RequestBody OrderDTO orderDTO,
@RequestHeader("userId") Long userId) {
try {
// 参数校验:商品ID、地址、购买数量为必填项
if (orderDTO.getGoodId() == null ||
StringUtils.isEmpty(orderDTO.getAddress()) ||
orderDTO.getBuyNumber() == null) {
return ResponseEntity.badRequest().body("商品ID、地址、购买数量不能为空");
}
// 提交订单(校验商品库存、生成订单编号)
Dingdan order = orderService.submitOrder(orderDTO, userId);
return ResponseEntity.ok("订单提交成功,订单编号:" + order.getOrderid());
} catch (IllegalStateException e) {
// 业务异常:如商品库存不足、地址不存在
return ResponseEntity.badRequest().body(e.getMessage());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("订单提交失败:" + e.getMessage());
}
}
/**
* 管理员更新订单状态(如发货、完成)
*/
@PostMapping("/update-status")
public ResponseEntity<?> updateOrderStatus(@RequestBody OrderStatusDTO statusDTO,
@RequestHeader("adminId") Long adminId) {
try {
// 参数校验:订单编号、状态为必填项
if (StringUtils.isEmpty(statusDTO.getOrderid()) ||
StringUtils.isEmpty(statusDTO.getStatus())) {
return ResponseEntity.badRequest().body("订单编号、状态不能为空");
}
// 更新订单状态
Dingdan order = orderService.updateOrderStatus(statusDTO);
return ResponseEntity.ok("订单状态更新成功,当前状态:" + order.getStatus());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("订单状态更新失败:" + e.getMessage());
}
}
}
@Service
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private DingdanMapper orderMapper;
@Autowired
private ShangpinxinxiMapper goodsMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private GouwucheMapper cartMapper;
@Override
public Dingdan submitOrder(OrderDTO dto, Long userId) {
// 1. 校验商品是否存在且库存充足
Shangpinxinxi goods = goodsMapper.selectByPrimaryKey(dto.getGoodId());
if (goods == null) {
throw new RuntimeException("商品不存在");
}
// 此处简化库存逻辑,实际需新增库存字段并校验
// if (goods.getKucun() < dto.getBuyNumber()) {
// throw new IllegalStateException("商品库存不足");
// }
// 2. 校验用户信息与地址
User user = userMapper.selectByPrimaryKey(userId);
if (user == null) {
throw new RuntimeException("用户信息不存在");
}
// 校验地址是否属于该用户(此处简化,实际需关联地址表)
// 3. 生成唯一订单编号(规则:年月日+用户ID+随机数)
String orderId = new SimpleDateFormat("yyyyMMdd").format(new Date()) +
userId +
(int)(Math.random() * 1000);
// 4. 计算订单金额
float totalPrice = goods.getPrice() * dto.getBuyNumber();
// 5. 保存订单记录
Dingdan order = new Dingdan();
order.setOrderid(orderId);
order.setUserid(userId);
order.setGoodid(dto.getGoodId());
order.setGoodname(goods.getShangpinmingcheng());
order.setPicture(goods.getTupian());
order.setBuynumber(dto.getBuyNumber());
order.setPrice(goods.getPrice());
order.setTotal(totalPrice);
order.setAddress(dto.getAddress());
order.setStatus("待支付"); // 初始状态:待支付
order.setAddtime(new Date());
orderMapper.insert(order);
// 6. 可选:从购物车删除已下单商品
GouwucheExample cartExample = new GouwucheExample();
cartExample.createCriteria()
.andUseridEqualTo(userId)
.andGoodidEqualTo(dto.getGoodId());
cartMapper.deleteByExample(cartExample);
// 7. 可选:更新商品库存
// goods.setKucun(goods.getKucun() - dto.getBuyNumber());
// goodsMapper.updateByPrimaryKeySelective(goods);
return order;
}
@Override
public Dingdan updateOrderStatus(OrderStatusDTO dto) {
// 1. 校验订单是否存在
DingdanExample example = new DingdanExample();
example.createCriteria().andOrderidEqualTo(dto.getOrderid());
List<Dingdan> orders = orderMapper.selectByExample(example);
if (orders.isEmpty()) {
throw new RuntimeException("订单不存在");
}
Dingdan order = orders.get(0);
// 2. 更新订单状态(支持:待支付→已支付→已发货→已完成)
List<String> validStatus = Arrays.asList("待支付", "已支付", "已发货", "已完成");
if (!validStatus.contains(dto.getStatus())) {
throw new IllegalStateException("无效订单状态,支持状态:" + validStatus);
}
order.setStatus(dto.getStatus());
orderMapper.updateByPrimaryKeySelective(order);
return order;
}
}
3.3.3 商品评价功能实现(用户互动)
@RestController
@RequestMapping("/api/evaluation")
public class EvaluationController {
@Autowired
private EvaluationService evaluationService;
/**
* 用户提交商品评价
*/
@PostMapping("/add")
public ResponseEntity<?> addEvaluation(@RequestBody EvaluationDTO evaluationDTO,
@RequestHeader("userId") Long userId) {
try {
// 参数校验:订单编号、商品名称、评分为必填项
if (StringUtils.isEmpty(evaluationDTO.getDingdanbianhao()) ||
StringUtils.isEmpty(evaluationDTO.getShangpinmingcheng()) ||
StringUtils.isEmpty(evaluationDTO.getPingfen())) {
return ResponseEntity.badRequest().body("订单编号、商品名称、评分不能为空");
}
// 提交评价
Shangpinpingjia evaluation = evaluationService.addEvaluation(evaluationDTO, userId);
return ResponseEntity.ok("评价提交成功,评价ID:" + evaluation.getId());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("评价提交失败:" + e.getMessage());
}
}
/**
* 管理员审核商品评价
*/
@PostMapping("/audit")
public ResponseEntity<?> auditEvaluation(@RequestBody AuditDTO auditDTO,
@RequestHeader("adminId") Long adminId) {
try {
// 参数校验:评价ID、审核状态为必填项
if (auditDTO.getId() == null ||
StringUtils.isEmpty(auditDTO.getSfsh())) {
return ResponseEntity.badRequest().body("评价ID、审核状态不能为空");
}
// 审核评价
Shangpinpingjia evaluation = evaluationService.auditEvaluation(auditDTO);
return ResponseEntity.ok("评价审核成功,当前状态:" + evaluation.getSfsh());
} catch (Exception e) {
return ResponseEntity.internalServerError()
.body("评价审核失败:" + e.getMessage());
}
}
}
3.4 第四步:前端界面实现——电商风格操作平台
基于JSP + Layui构建前端界面,贴合电商用户的“简洁、高效、直观”需求,按角色划分核心界面:
3.4.1 核心界面设计
- 登录界面:支持管理员/用户双角色登录,输入账号密码后验证权限并跳转至对应首页,含“忘记密码”功能(用户可重置,管理员需联系超级管理员);
- 管理员后台:
- 首页:展示系统核心数据(商品总数、订单总数、用户总数);
- 用户管理:表格展示用户列表,支持新增、编辑、删除、关键词搜索;
- 商品分类管理:表格展示分类列表,支持新增(填写分类名称)、编辑、删除;
- 商品信息管理:表格展示商品列表,支持新增(上传图片、填写详情)、编辑、下架,可按分类筛选;
- 订单管理:表格展示订单列表,支持按状态筛选(待支付/已支付/已发货),点击“更新状态”修改订单进度;
- 评价管理:表格展示用户评价,支持审核(通过/驳回)并填写回复;
- 用户前台:
- 首页:展示热门商品、新品推荐、商品资讯;
- 商品列表:按分类/关键词筛选商品,点击商品卡片进入详情页;
- 商品详情:展示商品图片、详情、价格,支持“加入购物车”“立即购买”“收藏”;
- 购物车:展示已添加商品,支持修改数量、删除商品、批量结算;
- 订单中心:展示个人订单,查看订单状态与物流信息;
- 个人中心:维护个人信息、修改密码、查看收藏与评价。
3.4.2 设计亮点
- 电商风格统一:采用橙色为主色调(符合电商活力形象),界面布局清晰,商品展示采用卡片式设计,直观吸引用户;
- 操作流程简化:如购物流程仅需“选商品→加购物车→结算→提交订单”四步,关键步骤有引导提示;
- 数据可视化:管理员首页采用卡片式统计核心数据,订单状态用不同颜色标注(如“待支付”红色、“已完成”绿色);
- 响应式适配:在平板设备上自动调整商品列表布局,确保浏览与操作便捷性。
3.5 第五步:系统测试——确保电商系统稳定性
通过多维度测试验证系统功能完整性、性能稳定性和安全性,符合电商平台的严格要求:
3.5.1 功能测试
| 测试场景 | 测试用例 | 预期结果 | 实际结果 |
|---|---|---|---|
| 管理员新增商品 | 填写商品名称、分类、价格,上传图片,提交 | 商品新增成功,用户前台可见 | 新增成功,展示正常 |
| 用户提交订单 | 加入商品到购物车,填写地址,提交订单 | 订单提交成功,状态为“待支付” | 提交成功,管理员后台可查 |
| 管理员更新订单状态 | 选择待支付订单,更新为“已支付”,提交 | 订单状态同步更新,用户可查 | 更新成功,状态一致 |
| 用户提交评价 | 完成订单后,填写评分与评论,提交 | 评价提交成功,状态为“待审核” | 提交成功,管理员可审核 |
3.5.2 性能测试
- 并发测试:模拟50名用户同时浏览商品、20名用户同时提交订单,系统响应时间<2秒,无数据丢失;
- 数据加载测试:加载200条商品信息时,页面渲染时间<1.5秒,表格滚动流畅;
- 文件上传测试:支持5MB以内的商品图片上传,上传成功率100%,图片展示清晰。
3.5.3 安全性测试
| 测试项 | 测试方法 | 预期结果 | 实际结果 |
|---|---|---|---|
| 密码加密 | 查看数据库user表mima字段 | 密码以加密形式存储(如MD5) | 符合预期,加密存储 |
| 越权访问 | 用户角色直接访问管理员商品删除接口 | 跳转至登录页,提示“无权限” | 符合预期,拦截成功 |
| 敏感数据脱敏 | 查看用户订单中的“联系电话”字段 | 仅展示前3位+后4位(如138****1234) | 符合预期,脱敏展示 |
| 订单编号唯一性 | 同时提交10个订单,查看订单编号 | 无重复订单编号 | 符合预期,编号唯一 |
3.6 第六步:问题排查与优化——提升电商系统体验
开发过程中遇到的核心问题及解决方案,确保系统符合电商实际运营需求:
- 问题:商品图片上传后无法正常展示
解决方案:统一图片存储路径(如/static/images/goods/),配置Spring Boot静态资源访问映射,确保图片URL正确解析; - 问题:订单编号生成重复(高并发场景)
解决方案:优化订单编号生成规则,引入UUID或分布式ID生成器,避免并发时编号重复; - 问题:商品查询效率低(大量商品数据时)
解决方案:对商品表的“shangpinmingcheng”“shangpinfenlei”字段建立索引,优化SQL查询语句,同时实现商品数据缓存(如Redis); - 问题:用户提交订单后未收到反馈
解决方案:实现订单提交成功弹窗提示,同时发送短信/邮件通知(需集成第三方服务),提升用户感知。
四、毕业设计复盘:网上商城系统开发实践总结
4.1 开发过程中的技术挑战
- 交易流程闭环设计:从商品浏览、加入购物车到订单提交、支付的全流程数据关联,需确保各环节数据一致性;
- 电商安全性保障:用户支付信息加密、订单数据防篡改、敏感信息脱敏,需平衡安全性与用户体验;
- 高并发场景适配:商品详情页高频访问、促销活动高并发下单,需优化数据库与缓存策略;
- 前后端数据交互:商品规格、订单状态等复杂数据的格式统一,避免前端展示与后端存储不一致。
4.2 给后续开发者的建议
- 技术选型:优先选择成熟稳定的技术栈(如Spring Boot + MySQL),电商系统对稳定性要求高于新技术尝鲜;
- 数据库设计:提前梳理商品、订单、用户的关联关系(如订单与商品的多对多关系),设计合理的表结构与索引;
- 功能迭代:采用“核心功能优先”策略,先实现商品管理、订单提交等核心功能,再迭代评价、收藏等附加功能;
- 用户体验:从电商用户习惯出发,简化购物流程,增加“商品搜索历史”“订单状态跟踪”等便捷功能;
- 文档完善:编写详细的接口文档与操作手册,方便后期维护与二次开发(如对接支付接口、物流接口)。
五、项目资源与发展展望
5.1 项目核心资源
本项目提供完整的开发与部署资料,方便后续学习和二次开发,满足毕业设计与电商实际应用需求:
- 后端源码:完整的Spring Boot项目,包含所有业务逻辑代码(Controller、Service、Mapper),注释详细;
- 前端源码:JSP页面文件、Layui配置文件、JS脚本,可直接运行;
- 数据库脚本:MySQL建表语句和示例数据(含测试管理员账号、用户账号);
- 部署指南:详细的环境配置(JDK 1.8、Tomcat 8.5、MySQL 8.0)和项目部署步骤;
- 使用手册:管理员与用户的操作指南,含界面截图和步骤描述,适配电商运营培训需求。
5.2 系统扩展方向
- 智能化升级:集成AI推荐功能,根据用户浏览历史推荐相似商品,提升转化率;
- 支付功能集成:对接支付宝、微信支付接口,实现在线支付闭环;
- 物流跟踪:集成快递API,实时展示订单物流信息,提升用户体验;
- 会员体系:新增会员等级、积分兑换功能,提高用户粘性;
- 移动端适配:开发微信小程序或移动端App,支持用户随时随地购物。
如果本文对您的Spring Boot学习、电商类毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多企业级电商项目实战案例!