福泰轴承进销存管理系统是一个基于SpringBoot+Vue技术栈的企业级应用解决方案,专为轴承制造行业设计。这个系统我从零开始搭建,前后花了3个月时间完成核心功能开发,目前已在本地测试环境稳定运行6个月。对于计算机相关专业的学生来说,这套代码结构清晰、文档完整,特别适合作为毕业设计或课程设计的参考案例。
系统采用前后端分离架构,后端使用SpringBoot 2.7.x+MyBatis Plus框架,前端采用Vue 3+Element Plus组件库,数据库选用MySQL 8.0。我在开发过程中特别注意了企业级应用的实际需求,比如库存预警、采购审批流程等实用功能都做了完整实现。
选择SpringBoot+Vue这套技术栈主要基于以下几个实际考量:
数据库选择MySQL 8.0是因为:
系统主要分为6个核心模块:
每个模块我都设计了独立的API接口,前后端完全解耦。这种设计让系统更容易扩展和维护。
采购模块是系统中业务逻辑最复杂的部分,我采用了状态机模式来管理采购流程:
java复制// 采购订单状态枚举
public enum PurchaseStatus {
DRAFT("草稿"),
SUBMITTED("已提交"),
APPROVED("已审批"),
REJECTED("已驳回"),
PART_RECEIVED("部分到货"),
COMPLETED("已完成"),
CANCELLED("已取消");
private String desc;
// 构造方法和getter省略
}
状态转换通过Spring的状态机(StateMachine)实现,确保业务流程的严谨性。特别要注意的是:
库存预警是进销存系统的核心功能之一。我在数据库设计时专门添加了安全库存字段:
sql复制CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_code` varchar(50) NOT NULL COMMENT '产品编码',
`product_name` varchar(100) NOT NULL COMMENT '产品名称',
`specification` varchar(200) DEFAULT NULL COMMENT '规格型号',
`unit` varchar(20) DEFAULT NULL COMMENT '单位',
`purchase_price` decimal(10,2) DEFAULT NULL COMMENT '采购价',
`selling_price` decimal(10,2) DEFAULT NULL COMMENT '销售价',
`min_stock` int DEFAULT '0' COMMENT '安全库存',
`current_stock` int DEFAULT '0' COMMENT '当前库存',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_product_code` (`product_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
预警逻辑通过定时任务实现,每天凌晨2点检查库存情况:
java复制@Scheduled(cron = "0 0 2 * * ?")
public void checkStockWarning() {
List<Product> products = productMapper.selectList(
new QueryWrapper<Product>()
.lt("current_stock", "min_stock")
);
if(!products.isEmpty()) {
// 发送邮件或系统通知
notificationService.sendStockWarning(products);
}
}
系统采用完全前后端分离的架构,通过RESTful API进行通信。我特别设计了统一的响应格式:
java复制@Data
public class R<T> implements Serializable {
private int code;
private String msg;
private T data;
public static <T> R<T> ok(T data) {
R<T> r = new R<>();
r.setCode(200);
r.setMsg("success");
r.setData(data);
return r;
}
// 其他静态方法省略
}
前端通过axios拦截器统一处理响应:
javascript复制// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 200) {
Message.error(res.msg || 'Error')
return Promise.reject(new Error(res.msg || 'Error'))
} else {
return res
}
},
error => {
Message.error(error.message)
return Promise.reject(error)
}
)
系统采用RBAC(基于角色的访问控制)模型,主要涉及5张表:
权限验证通过Spring Security + JWT实现:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/auth/login").permitAll()
.antMatchers("/doc.html").permitAll()
.antMatchers("/webjars/**").permitAll()
.antMatchers("/swagger-resources/**").permitAll()
.antMatchers("/v2/api-docs").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
系统主要包含20多张表,以下是几个关键表的设计:
对于关键业务操作,如采购入库、销售出库等,必须使用事务保证数据一致性:
java复制@Transactional(rollbackFor = Exception.class)
public void confirmPurchase(Long orderId) {
// 1. 更新采购单状态
PurchaseOrder order = purchaseOrderMapper.selectById(orderId);
order.setStatus(PurchaseStatus.APPROVED.getValue());
purchaseOrderMapper.updateById(order);
// 2. 生成入库单
Warehousing warehousing = new Warehousing();
// 设置入库单属性...
warehousingMapper.insert(warehousing);
// 3. 更新库存
List<PurchaseItem> items = purchaseItemMapper.selectList(
new QueryWrapper<PurchaseItem>().eq("order_id", orderId)
);
for(PurchaseItem item : items) {
stockService.increaseStock(item.getProductId(), item.getQuantity());
}
}
系统运行需要以下环境:
建议开发环境:
后端启动:
前端启动:
在实际开发和使用过程中,我遇到过以下几个典型问题:
跨域问题:
java复制@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
日期格式问题:
java复制@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
return builder -> {
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.serializers(new LocalDateTimeSerializer(
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
builder.serializers(new LocalDateSerializer(
DateTimeFormatter.ofPattern("yyyy-MM-dd")));
};
}
性能优化:
sql复制ALTER TABLE `stock` ADD INDEX `idx_product_date` (`product_id`, `operate_date`);
基于现有系统,可以考虑以下几个扩展方向:
对于学生毕设来说,建议选择1-2个扩展方向进行深入研究,既能体现工作量,又能展示技术深度。我在项目中预留了相应的扩展接口,二次开发时会比较方便。