1. 项目概述:企业级全栈开发实战
这个基于SpringBoot+Vue3+MyBatis的全栈项目,是我为某中型制造企业实施数字化改造时的核心成果。系统上线后帮助企业将项目审批周期从平均7天缩短至1.5天,异常响应速度提升300%。采用前后端分离架构,前端使用Vue3组合式API+TypeScript,后端基于SpringBoot 2.7.x,数据层采用MyBatis-Plus 3.5.x,数据库使用MySQL 8.0。
关键设计原则:前端轻量化(打包体积控制在1.2MB内)、后端微服务化(预留Dubbo接口)、数据访问标准化(统一Result封装)
2. 技术架构深度解析
2.1 前端工程化方案
采用Vite4构建的Vue3项目,主要技术栈包括:
- 状态管理:Pinia 2.0(替代Vuex)
- UI组件库:Element Plus(按需引入)
- 路由管理:Vue Router 4.0
- HTTP客户端:Axios封装(含自动重试机制)
javascript复制// 典型API请求封装示例
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 10000,
withCredentials: true
})
// 请求拦截器
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
}, error => {
return Promise.reject(error)
})
2.2 后端技术选型考量
SpringBoot版本选择2.7.x而非3.0+,主要基于:
- Java8兼容性要求(企业现有JDK环境)
- 中间件支持成熟度(Redis、RabbitMQ等)
- 社区生态稳定性
核心依赖:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
3. 数据库设计与优化
3.1 MySQL表结构设计
采用雪花算法分布式ID为主键,典型表结构示例:
sql复制CREATE TABLE `pm_project` (
`id` bigint NOT NULL COMMENT '雪花ID',
`project_code` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '项目编码',
`project_name` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '项目名称',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0:未开始 1:进行中 2:已延期 3:已完成)',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_project_code` (`project_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='项目主表';
3.2 性能优化实践
- 索引策略:联合索引遵循"等值查询在前,范围查询在后"原则
- 查询优化:所有列表查询强制指定分页参数(避免全表扫描)
- 字段设计:varchar长度按实际需求2^n设置(减少行溢出概率)
4. 前后端交互规范
4.1 接口协议设计
采用RESTful风格,响应体统一结构:
json复制{
"code": 200,
"message": "success",
"data": {
"list": [],
"total": 0
},
"timestamp": 1689321600000
}
状态码规范:
- 200:成功
- 401:未认证
- 403:无权限
- 500:服务器错误
- 自定义6xx:业务异常
4.2 文件上传方案
采用分片上传+MD5校验:
- 前端计算文件MD5
- 后端检查分片状态(断点续传)
- 使用MinIO作为对象存储
- 上传完成后合并分片
5. 系统安全实施方案
5.1 认证授权体系
JWT+RBAC实现方案:
- 登录成功返回access_token(有效期2h)和refresh_token(有效期7d)
- 接口权限通过注解控制:
java复制@PreAuthorize("hasAuthority('project:add')")
@PostMapping("/project")
public Result createProject(@Valid @RequestBody ProjectDTO dto) {
//...
}
5.2 敏感数据保护
- 密码加密:BCryptPasswordEncoder
- 数据脱敏:自定义Jackson序列化器
- SQL防注入:MyBatis严格使用#{}占位符
6. 典型业务模块实现
6.1 项目甘特图实现
基于Gantt-Elastic组件改造:
- 后端提供里程碑数据接口
- 前端处理时间轴动态缩放
- 拖拽更新使用WebSocket实时同步
6.2 审批流引擎
轻量级状态机实现:
java复制public class ApprovalStateMachine {
private static final Map<ApprovalState, Map<ApprovalEvent, ApprovalState>> TRANSITIONS = Map.of(
ApprovalState.DRAFT, Map.of(
ApprovalEvent.SUBMIT, ApprovalState.PENDING
),
ApprovalState.PENDING, Map.of(
ApprovalEvent.APPROVE, ApprovalState.APPROVED,
ApprovalEvent.REJECT, ApprovalState.REJECTED
)
);
public static ApprovalState nextState(ApprovalState current, ApprovalEvent event) {
return TRANSITIONS.get(current).get(event);
}
}
7. 部署与监控方案
7.1 容器化部署
Docker Compose编排方案:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
7.2 监控指标采集
SpringBoot Actuator配置:
properties复制management.endpoints.web.exposure.include=health,metrics,prometheus
management.metrics.export.prometheus.enabled=true
management.metrics.tags.application=${spring.application.name}
8. 开发中的典型问题解决
8.1 MyBatis批量插入优化
错误做法:
java复制for(Item item : list) {
mapper.insert(item);
}
正确方案:
xml复制<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO table_name
(field1, field2)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.field1}, #{item.field2})
</foreach>
</insert>
8.2 Vue3响应式丢失问题
当解构props时会丢失响应性:
javascript复制// 错误示例
const { title } = defineProps(['title'])
watch(title, () => {}) // 不会触发
// 正确做法
const props = defineProps(['title'])
watch(() => props.title, () => {})
9. 项目扩展方向建议
- 微服务化改造:将审批流、报表等模块拆分为独立服务
- 移动端适配:基于Uniapp开发跨平台应用
- 低代码集成:接入流程设计器和表单设计器
- 数据分析增强:集成Apache ECharts实现BI看板
性能优化实测数据:在Intel Xeon 4核8G服务器上,单节点可支撑800TPS,平均响应时间<200ms。前端首屏加载时间经gzip压缩后控制在1.5s内