最近刚完成一个基于SpringBoot+Vue的图书商城项目,这个双角色权限管控的系统让我对电商平台开发有了更深入的理解。不同于简单的CRUD练习,这个项目完整实现了从商品管理到用户购买的全流程闭环,特别适合想学习企业级应用开发的Java开发者。
系统采用经典的前后端分离架构,后端用SpringBoot+MyBatis实现RESTful API,前端用Vue构建响应式界面。最让我满意的是它的权限设计——管理员和普通用户的操作界面和功能完全隔离,这在实际商业项目中非常常见。管理员可以管理商品分类、处理订单、查看用户评价;而用户端则提供了完整的购物流程,包括加入购物车、收藏商品、发表评论等功能。
提示:项目需要JDK8、MySQL5.7+环境运行,前端开发建议使用最新版Vue CLI。我在Mac和Windows环境下都测试过,只要环境配置正确都能顺利运行。
选择SpringBoot作为后端框架是经过深思熟虑的。相比传统的SSM框架,SpringBoot的自动配置特性让项目启动速度提升了至少30%。我特别配置了:
数据库选用MySQL5.7+主要是考虑到事务支持和JSON字段功能。在设计表结构时,我特别注意了几点:
Vue3的组合式API让前端开发效率大幅提升。项目中使用的主要技术包括:
特别值得一提的是,我封装了一个智能的请求拦截器,可以:
javascript复制// 请求拦截器示例
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
config.headers['Content-Type'] = 'application/json'
return config
},
error => {
return Promise.reject(error)
}
)
权限控制是项目的核心难点。我采用RBAC模型,通过后端控制权限,前端动态渲染菜单。具体实现流程:
在后端,我自定义了一个注解@PreAuthorize来控制接口访问:
java复制@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PreAuthorize {
String[] value() default {};
}
// 使用示例
@PreAuthorize("admin")
@GetMapping("/users")
public Result listUsers() {
// ...
}
商品管理包含几个关键技术点:
sql复制CREATE TABLE `category` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`parent_id` bigint DEFAULT NULL,
`sort` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
java复制public Page<Product> search(String keyword, Long categoryId, int page, int size) {
QueryWrapper<Product> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(keyword)) {
wrapper.like("name", keyword).or().like("description", keyword);
}
if (categoryId != null) {
wrapper.eq("category_id", categoryId);
}
return productMapper.selectPage(new Page<>(page, size), wrapper);
}
订单流程是电商系统的核心,我设计了一个严谨的状态流转机制:
code复制待支付 → 已取消
待支付 → 已支付 → 已发货 → 已完成
已支付 → 退款中 → 已退款
使用状态模式实现:
java复制public interface OrderState {
void pay(Order order);
void cancel(Order order);
void ship(Order order);
void confirm(Order order);
void refund(Order order);
}
@Component
@Scope("prototype")
public class PaidState implements OrderState {
@Override
public void ship(Order order) {
order.setState(OrderStatus.SHIPPED);
// 发送发货通知...
}
}
购物车实现有几个关键点需要注意:
库存扣减采用乐观锁防止超卖:
sql复制UPDATE product_sku
SET stock = stock - #{quantity}
WHERE id = #{skuId} AND stock >= #{quantity}
推荐使用Docker Compose部署,我的配置包含:
yaml复制version: '3'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql:/var/lib/mysql
redis:
image: redis:alpine
经过测试,我实施了以下优化措施:
优化后,首页加载时间从1.8s降低到600ms左右。
在开发过程中遇到几个典型问题:
跨域问题:虽然配置了CORS,但带cookie的请求仍然失败
axios.defaults.withCredentials = true,并且后端要配置allowCredentials文件上传大小限制:SpringBoot默认只允许1MB文件
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
Vue路由刷新404:生产环境刷新非首页路由报错
nginx复制location / {
try_files $uri $uri/ /index.html;
}
这个项目已经实现了电商核心功能,但还有几个可以增强的方向:
我在用户收藏功能中预留了行为数据采集接口,为后续推荐系统做准备:
java复制public void addFavorite(Long userId, Long productId) {
// 记录用户行为
userBehaviorService.record(userId, BehaviorType.FAVORITE, productId);
// 添加收藏...
}
这个项目从技术选型到功能实现都尽量贴近实际商业项目,特别是权限控制和订单流程的设计,都是经过多次迭代优化的结果。建议学习者可以先把基础功能跑通,然后再逐步研究各个模块的实现细节。