1. 项目概述:全栈电商后台管理系统实战
这个基于SpringBoot+Vue的在线商场后台管理系统,是我去年为某中型零售企业交付的数字化升级核心项目。系统采用前后端分离架构,后端基于SpringBoot 2.7提供RESTful API,前端使用Vue 3 + Element Plus构建管理界面,数据库选用MySQL 8.0。整套方案从技术选型到部署上线共耗时3个月,目前日均处理订单量2万+,支撑着该企业线上线下全渠道业务。
提示:本系统完整源码、部署文档和LW(设计说明)已整理在文末资源包,建议先通读全文了解架构设计要点再动手实践
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端技术栈设计
SpringBoot 2.7.x作为后端框架,主要基于以下考量:
- 自动配置特性简化了SSM框架整合(实测比传统Spring项目减少60%的XML配置)
- 内嵌Tomcat支持快速部署(无需额外安装Web容器)
- 完善的Starter生态(项目中使用到的关键starter):
xml复制<!-- 数据库相关 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <!-- 安全控制 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
数据库选型对比:
| 选项 | 版本 | 适用场景 | 最终选择原因 |
|---|---|---|---|
| MySQL | 8.0 | 事务型业务 | 成熟稳定,团队熟悉 |
| PostgreSQL | 14 | 复杂查询 | 学习成本较高 |
| MongoDB | 6.0 | 非结构化数据 | 事务支持不足 |
2.2 前端技术栈设计
Vue 3组合式API带来代码组织方式的革新:
javascript复制// 商品管理模块示例
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
export default {
setup() {
const productList = ref([])
const router = useRouter()
const loadProducts = async () => {
try {
const res = await axios.get('/api/products')
productList.value = res.data
} catch (error) {
ElMessage.error('加载失败')
}
}
onMounted(() => {
loadProducts()
})
return { productList }
}
}
Element Plus组件库的二次封装实践:
- 表格组件增强:支持动态列配置、Excel导出
- 表单组件:统一校验规则(手机号/邮箱/身份证等)
- 权限按钮:v-permission指令控制显隐
3. 核心功能实现
3.1 商品SPU/SKU管理
商品模型采用SPU+SKU两级结构:
java复制// 商品SPU实体
@Entity
public class ProductSpu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name; // 商品名称
private String description; // 商品描述
@OneToMany(mappedBy = "spu", cascade = CascadeType.ALL)
private List<ProductSku> skus = new ArrayList<>();
}
// 商品SKU实体
@Entity
public class ProductSku {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String skuCode; // SKU编码
private BigDecimal price; // 售价
@ManyToOne
@JoinColumn(name = "spu_id")
private ProductSpu spu;
@ElementCollection
@CollectionTable(name = "sku_specs")
private Map<String,String> specs; // 规格参数
}
3.2 订单状态机设计
采用状态模式实现订单流转:
java复制public interface OrderState {
void pay(Order order);
void cancel(Order order);
void deliver(Order order);
void receive(Order order);
}
// 具体状态实现
@Component
@Scope("prototype")
public class UnpaidState implements OrderState {
@Override
public void pay(Order order) {
order.setState(OrderStatusEnum.PAID.getCode());
// 扣减库存等操作
}
@Override
public void cancel(Order order) {
order.setState(OrderStatusEnum.CANCELLED.getCode());
}
}
// 状态上下文
public class Order {
private OrderState state;
public void setState(String status) {
switch(status) {
case "unpaid":
this.state = applicationContext.getBean(UnpaidState.class);
break;
// 其他状态...
}
}
}
4. 安全与权限控制
4.1 RBAC权限模型实现
数据库表设计:
sql复制CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_role` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `sys_user_role` (
`user_id` bigint NOT NULL,
`role_id` bigint NOT NULL
);
CREATE TABLE `sys_permission` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`code` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
Spring Security配置要点:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/product/**").hasAnyRole("ADMIN","PRODUCT_MANAGER")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
return http.build();
}
}
5. 部署与性能优化
5.1 多环境部署方案
使用Maven Profile管理环境配置:
xml复制<profiles>
<profile>
<id>dev</id>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>
Nginx配置示例(负载均衡+静态资源缓存):
nginx复制upstream backend {
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080;
}
server {
listen 80;
server_name mall-admin.example.com;
location / {
proxy_pass http://backend;
}
location ~* \.(js|css|png|jpg)$ {
expires 30d;
add_header Cache-Control "public";
}
}
6. 项目资源与使用说明
完整项目包含:
- 后端源码(SpringBoot)
- 前端源码(Vue3)
- 数据库SQL脚本
- API文档(Swagger格式)
- 部署手册(含Docker Compose配置)
- 设计说明文档(LW)
重要提示:启动前需修改application-prod.yml中的数据库配置,初始化脚本在/sql/mall_init.sql
我在实际开发中遇到的三个典型问题及解决方案:
- 商品批量导入时内存溢出 → 采用Apache POI的SAX模式解析Excel
- 订单超卖问题 → Redis分布式锁+乐观锁双重保障
- 权限缓存不一致 → 使用Spring Cache配合@CacheEvict注解
系统扩展建议:
- 增加ELK日志分析
- 集成Prometheus监控
- 开发微信小程序端
- 实现自动化测试流水线
