源码示例:使用SpringBoot+Vue+ElementUI+UniAPP技术组合开发一套小微企业ERP系统
目录
一、系统架构设计
1、技术分层
2、开发环境
二、快速开发实践
1、后端搭建(Spring Boot)
2、前端管理端(Vue+ElementUI)
3、移动端开发(UniAPP)
三、关键集成方案
1、统一接口处理
2、跨平台适配方案
四、典型业务实现
1、进销存核心流程
2、数据可视化方案
五、效率提升技巧
代码生成策略
通用组件封装
3.移动端优化方案
六、部署方案
1、容器化部署
2、Nginx配置
使用SpringBoot+Vue+ElementUI+UniAPP技术组合开发小微企业ERP系统,可以按以下步骤快速实现:
一、系统架构设计
1、技术分层
后端:Spring Boot + MyBatis Plus + MySQL
Web端:Vue3 + Element Plus + Axios
移动端:UniAPP + uView UI
接口规范:RESTful API + JWT鉴权
2、开发环境
JDK17 + Maven
Node.js 18+ + Vue CLI
HBuilder X(UniAPP开发工具)
二、快速开发实践
1、后端搭建(Spring Boot)
// 1. 使用Spring Initializr快速生成项目
// 选择依赖:Web, JPA, Security, Lombok// 2. 核心配置示例
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/auth/**").permitAll().anyRequest().authenticated().and().addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);}
}// 3. 使用MyBatis Plus快速生成CRUD
public interface GoodsMapper extends BaseMapper<Goods> {// 自动继承基础CRUD方法
}
2、前端管理端(Vue+ElementUI)
<!-- 快速构建表单页面 -->
<template><el-form :model="goodsForm" label-width="120px"><el-form-item label="商品名称"><el-input v-model="goodsForm.name"></el-input></el-form-item><el-form-item label="库存预警值"><el-input-number v-model="goodsForm.stockAlert"></el-input-number></el-form-item></el-form>
</template><script setup>
// 使用Composition API
import { reactive } from 'vue'
import { ElMessage } from 'element-plus'const goodsForm = reactive({name: '',stockAlert: 10
})
</script>
3、移动端开发(UniAPP)
// 库存查询页面
export default {data() {return {inventoryList: []}},onLoad() {uni.request({url: 'https://api.yourdomain.com/inventory',success: (res) => {this.inventoryList = res.data}})}
}
三、关键集成方案
1、统一接口处理
// api.js
import axios from 'axios'const service = axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 5000
})// 请求拦截(JWT处理)
service.interceptors.request.use(config => {config.headers['Authorization'] = getToken()return config
})// 响应拦截
service.interceptors.response.use(response => {const res = response.dataif (res.code !== 200) {ElMessage.error(res.message)return Promise.reject(res)}return res}
)
2、跨平台适配方案
// 使用uni-app的条件编译
// #ifdef H5
const baseUrl = 'https://h5.yourdomain.com'
// #endif
// #ifdef MP-WEIXIN
const baseUrl = 'https://wx.yourdomain.com'
// #endif
四、典型业务实现
1、进销存核心流程
// 采购入库业务逻辑
@Service
@Transactional
public class PurchaseService {@Autowiredprivate InventoryService inventoryService;public void confirmPurchase(PurchaseOrder order) {// 1. 更新订单状态order.setStatus(OrderStatus.CONFIRMED);purchaseMapper.updateById(order);// 2. 更新库存inventoryService.updateStock(order.getGoodsId(), order.getQuantity(), StockOperationType.PURCHASE);}
}
2、数据可视化方案
<template><div class="dashboard"><el-row :gutter="20"><el-col :span="12"><v-chart :option="salesChart"/></el-col><el-col :span="12"><v-chart :option="inventoryChart"/></el-col></el-row></div>
</template><script setup>
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { LineChart, PieChart } from 'echarts/charts'
import { GridComponent, TitleComponent } from 'echarts/components'
import VChart from 'vue-echarts'use([CanvasRenderer, LineChart, PieChart, GridComponent, TitleComponent])// 销售趋势图表配置
const salesChart = reactive({xAxis: { type: 'category', data: [] },yAxis: { type: 'value' },series: [{ type: 'line', data: [] }]
})// 库存分布图表配置
const inventoryChart = reactive({series: [{ type: 'pie',data: []}]
})
</script>
五、效率提升技巧
-
代码生成策略
-
使用
mybatis-plus-generator
自动生成Controller/Service/Mapper代码 -
配置Velocity模板定制生成代码结构
-
-
通用组件封装
<!-- 通用搜索组件 -->
<template><el-form inline><el-form-item v-for="item in searchItems" :key="item.prop"><el-input v-if="item.type === 'input'"v-model="searchData[item.prop]":placeholder="item.label"/><el-date-pickerv-else-if="item.type === 'date'"v-model="searchData[item.prop]"type="daterange"/></el-form-item></el-form>
</template>
3.移动端优化方案
// 使用uni-app的缓存策略
const getCachedData = async (key) => {try {const value = await uni.getStorage({ key })if (value) return value.dataconst freshData = await fetchData()uni.setStorage({ key, data: freshData })return freshData} catch (e) {console.error('Cache error:', e)}
}
六、部署方案
1、容器化部署
# Spring Boot Dockerfile
FROM openjdk:17-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2、Nginx配置
# 前端部署配置
server {listen 80;server_name erp.yourdomain.com;location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;}location /api {proxy_pass http://backend-server;proxy_set_header X-Real-IP $remote_addr;}
}
这套技术组合的优势在于:
-
Spring Boot提供稳健的后端服务
-
Vue+ElementUI快速构建管理界面
-
UniAPP实现一次开发多端发布
-
组件库丰富,开发效率高
-
社区资源丰富,遇到问题容易找到解决方案
建议开发时优先实现MVP版本(最小可行产品),核心功能包含:
-
基础商品管理
-
采购销售流程
-
库存预警功能
-
基础财务报表
-
移动端数据看板
后续可根据实际需求逐步迭代扩展功能模块。注意做好权限控制和数据验证,保障企业数据安全。