1. 项目概述:一个面向教学实践的电商管理系统
去年帮学弟调试毕业设计时,发现市面上很多所谓的"电商平台Demo"要么功能残缺,要么架构混乱。这促使我整理了一套基于SpringBoot+Vue的手机销售管理系统,这套代码特别适合计算机专业学生用于毕业设计、课程作业或者自学全栈开发。系统采用前后端分离架构,后端使用Java+SpringBoot+MyBatis技术栈,前端基于Vue+ElementUI,数据库选用MySQL 5.7,完整实现了电商后台管理的核心功能链。
这个项目最大的特点是"教学友好性"——我刻意保留了开发过程中的典型问题解决方案(如跨域处理、Token刷新机制),并在代码注释中详细标注了每个技术选型的教学意义。相比直接使用成熟电商框架,这套代码更利于理解企业级应用的基础搭建过程。
2. 技术架构解析
2.1 后端技术栈设计
SpringBoot 2.5.6版本的选择经过慎重考虑:这是LTS长期支持版本中兼容性最好的,既支持Java8也兼容Java11,避免学生因JDK版本问题卡在环境配置阶段。主要依赖包括:
- spring-boot-starter-web(RESTful接口)
- mybatis-spring-boot-starter(数据持久层)
- hutool-all(国产工具包,简化CRUD操作)
- jwt(无状态认证)
数据库设计遵循三范式基础原则,包含8个核心表:
sql复制CREATE TABLE `phone_info` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`model` varchar(50) NOT NULL COMMENT '手机型号',
`price` decimal(10,2) NOT NULL COMMENT '售价',
`stock` int NOT NULL DEFAULT '0' COMMENT '库存',
`specs` json DEFAULT NULL COMMENT '规格参数(JSON格式)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 前端技术方案
Vue 2.x版本的选择基于教学考量:相比Vue3,2.x版本的资料更丰富,遇到问题更容易找到解决方案。前端工程采用vue-cli4搭建,主要技术点包括:
- axios封装(统一错误处理)
- vue-router(路由守卫实现权限控制)
- vuex(状态管理)
- ElementUI(快速构建管理后台界面)
特意保留了开发环境代理配置示例,解决学生最头疼的跨域问题:
javascript复制devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
3. 核心功能实现细节
3.1 商品管理模块
采用RBAC权限模型实现分级管理,包含三个关键接口设计:
- 商品列表分页查询(带条件过滤)
java复制@GetMapping("/list")
public PageResult<PhoneInfo> list(
@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
PageHelper.startPage(page, size);
return PageResult.success(phoneService.selectByKeyword(keyword));
}
- 商品图片上传(阿里云OSS集成)
- 商品规格参数动态表单(JSON Schema存储)
3.2 订单状态机设计
为演示状态模式的实际应用,订单系统设计了6种状态:
mermaid复制stateDiagram
[*] --> 待支付
待支付 --> 已取消: 超时未支付
待支付 --> 已支付: 完成支付
已支付 --> 已发货: 商家操作
已发货 --> 已完成: 用户确认
已发货 --> 退款中: 用户申请
对应数据库字段使用ENUM类型约束:
sql复制`status` ENUM('待支付','已支付','已发货','已完成','已取消','退款中') NOT NULL DEFAULT '待支付'
4. 教学实践特别设计
4.1 刻意保留的"教学陷阱"
- N+1查询问题示例(在商品列表关联查询评论数据)
java复制// 错误示范(会引发N+1问题)
List<Phone> phones = phoneMapper.selectAll();
phones.forEach(phone -> {
phone.setComments(commentMapper.selectByPhoneId(phone.getId()));
});
- 未做参数校验的接口(用于演示Spring Validation的重要性)
- 故意不加索引的表字段(让学生体验SQL性能优化)
4.2 分阶段开发指引
在项目README.md中提供了渐进式开发路线:
- 基础阶段:纯后端CRUD(2周)
- 进阶阶段:前端联调(1周)
- 优化阶段:缓存/消息队列集成(1周)
- 扩展阶段:微信支付对接(可选)
5. 项目部署与调试
5.1 开发环境准备
推荐使用Docker快速搭建MySQL环境:
bash复制docker run --name mysql57 \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
后端项目配置要点:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/phone_shop?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
5.2 常见问题解决方案
整理了学生最常遇到的10个问题及排查方法:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 前端请求404 | 后端未启动/路径错误 | 1. 检查后端控制台日志 2. 确认axios baseURL |
| 数据库连接失败 | 密码错误/端口占用 | 1. telnet测试3306端口 2. 检查application.yml |
| 页面样式错乱 | ElementUI未正确引入 | 1. 检查main.js导入语句 2. 查看浏览器控制台错误 |
6. 扩展方向建议
对于想深入提升的学生,提供三个进阶路线:
- 性能优化方向:Redis缓存热点数据、Elasticsearch实现商品搜索
- 架构扩展方向:SpringCloud微服务改造、Docker容器化部署
- 业务完善方向:秒杀系统设计、用户行为分析
每个扩展点都标注了推荐学习资源和预计耗时,例如Redis集成示例:
java复制@Cacheable(value = "phone", key = "#id")
public PhoneInfo getById(Integer id) {
return phoneMapper.selectByPrimaryKey(id);
}
这套代码库特别加入了Git历史记录展示功能,学生可以通过查看commit记录,了解一个真实项目从零到有的演进过程。比如最早的v0.1版本只有基础CRUD,v0.5加入JWT认证,v1.0完善所有前端交互,这种渐进式提交记录本身就是很好的教学素材。