1. 项目概述与技术选型
这个基于SpringBoot+Vue的民俗电商管理系统,是我去年带队完成的一个校企合作项目。系统采用前后端分离架构,后端使用Java+SpringBoot提供RESTful API,前端基于Vue.js构建用户界面,数据库选用MySQL 5.7。整个开发周期约3个月,最终交付的不仅是一个可运行的系统,还包括完整的项目文档和技术支持材料。
技术栈选择上,我们经过多次讨论确定了以下方案:
- 后端:SpringBoot 2.5 + MyBatis-Plus
- 前端:Vue 2.6 + Element UI
- 数据库:MySQL 5.7
- 构建工具:Maven + Webpack
提示:JDK版本选择1.8是因为企业生产环境普遍还在使用这个长期支持版本,避免兼容性问题。MySQL 5.7则在性能和功能上都能满足中型电商系统的需求。
2. 系统架构设计
2.1 整体架构
系统采用经典的三层架构:
- 表现层:Vue前端项目,通过axios与后端交互
- 业务逻辑层:SpringBoot应用,包含控制器、服务和数据访问层
- 数据持久层:MySQL数据库,使用MyBatis-Plus简化CRUD操作
前后端通过JWT进行身份认证,接口设计遵循RESTful规范。考虑到民俗商品的特殊性,我们在商品模块特别设计了"民俗文化"属性字段,用于存储相关的文化背景信息。
2.2 数据库设计
数据库共设计10个核心表,以下是几个关键表的结构说明:
用户表(user)
sql复制CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`gender` tinyint(1) DEFAULT '0' COMMENT '性别(0:未知 1:男 2:女)',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`status` tinyint(1) DEFAULT '1' COMMENT '状态(0:禁用 1:正常)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
商品表(product)
sql复制CREATE TABLE `product` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '商品名称',
`category_id` bigint(20) NOT NULL COMMENT '分类ID',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`cover_image` varchar(255) DEFAULT NULL COMMENT '封面图',
`detail_images` text COMMENT '详情图片(JSON数组)',
`description` text COMMENT '商品描述',
`culture_info` text COMMENT '民俗文化信息',
`status` tinyint(1) DEFAULT '1' COMMENT '状态(0:下架 1:上架)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
注意:culture_info字段专门用于存储民俗商品的背景故事、制作工艺等文化信息,这是普通电商系统没有的特殊设计。
3. 核心功能实现
3.1 用户管理模块
用户模块采用RBAC权限模型,主要功能包括:
- 用户CRUD操作
- 角色分配
- 状态管理(启用/禁用)
后端接口示例(UserController.java):
java复制@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public Result list(@RequestParam(required = false) String username,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(username)) {
wrapper.like("username", username);
}
Page<User> userPage = userService.page(new Page<>(page, size), wrapper);
return Result.success(userPage);
}
@PostMapping("/add")
public Result add(@RequestBody User user) {
if (userService.getOne(new QueryWrapper<User>().eq("username", user.getUsername())) != null) {
return Result.error("用户名已存在");
}
user.setPassword(DigestUtils.md5Hex(user.getPassword()));
return Result.success(userService.save(user));
}
// 其他CRUD方法...
}
前端实现关键点:
- 使用Element UI的Table组件展示用户列表
- 表单验证使用async-validator
- 密码传输前进行MD5加密
3.2 商品管理模块
商品模块是系统的核心,除了基本的CRUD外,还实现了:
- 多级分类管理
- 商品上下架
- 库存预警
- 民俗文化信息编辑
商品添加的前端代码示例(ProductForm.vue):
vue复制<template>
<el-form :model="form" :rules="rules" ref="form" label-width="100px">
<el-form-item label="商品名称" prop="name">
<el-input v-model="form.name" placeholder="请输入商品名称"></el-input>
</el-form-item>
<el-form-item label="商品分类" prop="categoryId">
<el-cascader
v-model="form.categoryId"
:options="categoryOptions"
:props="{value:'id',label:'name'}"
clearable
></el-cascader>
</el-form-item>
<el-form-item label="民俗文化" prop="cultureInfo">
<el-input
type="textarea"
:rows="3"
v-model="form.cultureInfo"
placeholder="请输入该商品的民俗文化背景"
></el-input>
</el-form-item>
<!-- 其他表单项... -->
</el-form>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
categoryId: null,
price: 0,
stock: 0,
cultureInfo: '',
// 其他字段...
},
rules: {
name: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
categoryId: [{ required: true, message: '请选择分类', trigger: 'change' }],
// 其他验证规则...
},
categoryOptions: [] // 从接口获取的分类数据
}
},
methods: {
submitForm() {
this.$refs.form.validate(valid => {
if (valid) {
// 调用接口提交数据
}
})
}
}
}
</script>
4. 特色功能实现
4.1 民俗文化展示组件
为了突出民俗特色,我们专门开发了一个文化展示组件:
vue复制<template>
<div class="culture-card">
<div class="culture-title">
<i class="el-icon-info"></i>
<span>民俗文化</span>
</div>
<div class="culture-content" v-html="content"></div>
</div>
</template>
<script>
export default {
props: {
content: {
type: String,
default: ''
}
}
}
</script>
<style scoped>
.culture-card {
border: 1px solid #e6a23c;
border-radius: 4px;
padding: 15px;
margin: 20px 0;
background-color: #fdf6ec;
}
.culture-title {
color: #e6a23c;
font-weight: bold;
margin-bottom: 10px;
}
.culture-content {
line-height: 1.6;
}
</style>
4.2 订单处理流程
订单模块采用状态机模式管理订单生命周期:
java复制public enum OrderStatus {
UNPAID(0, "待支付"),
PAID(1, "已支付"),
SHIPPED(2, "已发货"),
COMPLETED(3, "已完成"),
CANCELLED(4, "已取消"),
REFUNDED(5, "已退款");
// 枚举方法和字段...
}
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public Result cancelOrder(Long orderId) {
Order order = orderMapper.selectById(orderId);
if (order == null) {
return Result.error("订单不存在");
}
if (order.getStatus() != OrderStatus.UNPAID.getCode()) {
return Result.error("当前状态不可取消");
}
order.setStatus(OrderStatus.CANCELLED.getCode());
orderMapper.updateById(order);
// 释放库存
productService.releaseStock(order.getProductId(), order.getQuantity());
return Result.success();
}
// 其他订单操作方法...
}
5. 系统部署方案
5.1 开发环境搭建
- 后端环境:
bash复制# 安装JDK
sudo apt install openjdk-8-jdk
# 安装Maven
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
tar -xzf apache-maven-3.8.4-bin.tar.gz
sudo mv apache-maven-3.8.4 /opt/maven
- 前端环境:
bash复制# 安装Node.js
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install -y nodejs
# 安装Yarn
npm install -g yarn
5.2 生产环境部署
我们采用Docker容器化部署方案,docker-compose.yml配置示例:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: folk_mall
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/folk_mall
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root123
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
提示:实际部署时应将数据库密码等敏感信息通过环境变量或配置中心管理,不要直接写在配置文件中。
6. 开发经验与问题解决
6.1 跨域问题处理
在前后端分离开发中,跨域是常见问题。我们的解决方案:
后端配置(SpringBoot):
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.maxAge(3600);
}
}
前端配置(axios):
javascript复制const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 10000,
withCredentials: true
})
// 请求拦截器
service.interceptors.request.use(
config => {
const token = store.getters.token
if (token) {
config.headers['Authorization'] = 'Bearer ' + token
}
return config
},
error => {
return Promise.reject(error)
}
)
6.2 性能优化实践
- 数据库层面:
- 为常用查询字段添加索引
- 使用连接池(HikariCP)
- 对大表进行分表处理
- 后端层面:
- 启用SpringBoot缓存(Redis)
- 使用@Transactional合理控制事务范围
- 对复杂查询进行SQL优化
- 前端层面:
- 组件懒加载
- 路由懒加载
- 使用keep-alive缓存组件状态
6.3 常见问题排查
- 接口返回404:
- 检查后端控制器@RequestMapping路径
- 确认请求方法(GET/POST等)是否匹配
- 查看是否被权限拦截
- 页面刷新后空白:
- 检查vue-router的history模式配置
- 确认nginx配置了try_files回退
- 数据库连接超时:
- 检查连接池配置
- 确认数据库服务正常运行
- 查看网络是否通畅
7. 项目总结与扩展方向
这个民俗电商系统在实现基础电商功能的同时,特别注重民俗文化特色的展示。通过近三个月的开发,我们积累了以下经验:
- 技术选型要兼顾团队熟悉度和项目需求
- 民俗类商品需要特殊的数据字段和展示方式
- 前后端分离开发需要完善的接口文档和Mock数据支持
未来可以考虑的扩展方向:
- 增加短视频展示民俗工艺制作过程
- 开发AR/VR功能让用户虚拟体验民俗活动
- 接入第三方支付和物流接口
- 实现多语言支持面向国际市场
在项目开发过程中,我们特别注重代码规范和文档完整性,这为后续维护和功能扩展打下了良好基础。整个系统的模块化设计也使得新功能的添加更加便捷。