1、OA系统概述与项目初始化:OA系统是什么、技术选型(Spring Boot + Vue)、项目初始化与目录结构搭建
1.1 OA系统到底是什么?
说实话,很多刚入行的朋友问我:「OA系统不就是个请假审批吗?」
嗯,这么说也没错,但太片面了。
OA,全称是Office Automation,办公自动化。
说白了,就是把公司里那些纸质流程、口头沟通、邮件往来,全部搬到线上来管理。
我参与过的OA项目,小到几十人的创业公司,大到几千人的集团企业。
核心功能其实就那几块:
- 流程审批:请假、报销、合同审批、用章申请
- 考勤管理:打卡、排班、加班、调休
- 文档管理:公司制度、项目文档、知识库
- 通知公告:内部消息、待办提醒、系统通知
- 人事管理:员工信息、组织架构、入职离职
你想想看,一个公司如果没有OA系统,会发生什么?
请假要打印纸质单子,找三个领导签字,跑断腿。报销单在财务室堆成山,一个月都批不下来。
这就是痛点。OA系统就是来解决这些痛点的。
核心观点:OA系统不是「万能系统」,而是「流程引擎」+「数据底座」。
我见过很多公司想把OA做成ERP,结果四不像。记住,OA的核心是「流程」和「协同」。
1.2 技术选型:为什么是Spring Boot + Vue?
这个问题,我在面试时经常被问到。
「为什么选Spring Boot?不用Spring Cloud?」
「为什么用Vue?不用React?」
我的回答很简单:看场景。
OA系统属于企业级内部系统,用户量通常几百到几千人,并发不高,但业务逻辑复杂、流程多变。
我们来看看选型逻辑:
| 技术栈 | 选择理由 | 我的经验 |
|---|---|---|
| Spring Boot | 快速搭建、约定大于配置、生态成熟 | 我做过一个项目,用Spring Boot三天就搭好了基础框架,而用Spring Cloud光配置中心就折腾了一周 |
| Vue 3 | 上手快、组件化、适合表单密集型场景 | OA系统里全是表单和表格,Vue的双向绑定简直不要太爽 |
| MySQL | 关系型数据库,流程数据天然适合表结构 | 别一上来就上MongoDB,OA的审批流、组织架构用关系型数据库最稳 |
| Redis | 缓存、会话管理、待办提醒 | 我曾经踩过坑,没用Redis缓存部门树,结果每次加载组织架构都要查数据库,页面卡得不行 |
避坑指南:我曾经在一个项目中,技术选型时选了微服务架构,结果团队只有三个人,光维护服务间调用就累得半死。
所以,单体应用能解决的问题,别上分布式。OA系统用Spring Boot单体就够了,等用户量上万再考虑拆分。
1.3 项目初始化:从零搭建Spring Boot项目
好,理论说完了,咱们动手。
我个人习惯用 Spring Initializr 来生成项目骨架,省时省力。
打开 start.spring.io,配置如下:
- Project:Maven Project
- Language:Java 17
- Spring Boot:3.2.0(稳定版)
- Group:com.oa
- Artifact:oa-system
- Dependencies:Spring Web、Spring Data JPA、MySQL Driver、Lombok、Spring Security(后面会用到)
生成后,导入IDEA。嗯,这里要注意:
记得检查一下 pom.xml 里的依赖版本,别用太新的,容易踩坑。
<!-- pom.xml 核心依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
1.4 目录结构搭建:一个「能打」的项目骨架
项目初始化后,默认的目录结构太简单了。
我建议你按照 领域驱动设计(DDD) 的思路来组织,但别搞太复杂,我们实际一点。
这是我个人习惯的目录结构,用了很多项目,很稳:
oa-system/
├── src/
│ ├── main/
│ │ ├── java/com/oa/
│ │ │ ├── OaApplication.java // 启动类
│ │ │ ├── config/ // 配置类
│ │ │ │ ├── SecurityConfig.java
│ │ │ │ ├── CorsConfig.java
│ │ │ │ └── SwaggerConfig.java
│ │ │ ├── controller/ // 控制器层
│ │ │ │ ├── UserController.java
│ │ │ │ ├── LeaveController.java
│ │ │ │ └── DeptController.java
│ │ │ ├── service/ // 业务逻辑层
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl/
│ │ │ │ └── UserServiceImpl.java
│ │ │ ├── repository/ // 数据访问层
│ │ │ │ ├── UserRepository.java
│ │ │ │ └── LeaveRepository.java
│ │ │ ├── entity/ // 实体类
│ │ │ │ ├── User.java
│ │ │ │ └── Leave.java
│ │ │ ├── dto/ // 数据传输对象
│ │ │ │ ├── UserDTO.java
│ │ │ │ └── LeaveDTO.java
│ │ │ ├── vo/ // 视图对象
│ │ │ │ └── ResultVO.java
│ │ │ ├── common/ // 公共工具
│ │ │ │ ├── exception/
│ │ │ │ ├── utils/
│ │ │ │ └── constant/
│ │ │ └── enums/ // 枚举
│ │ │ └── LeaveStatusEnum.java
│ │ └── resources/
│ │ ├── application.yml
│ │ ├── application-dev.yml
│ │ └── application-prod.yml
│ └── test/
│ └── java/com/oa/
│ └── OaApplicationTests.java
└── pom.xml
注意:千万别把代码全写在controller里!
我见过一个项目,一个controller里写了2000行代码,service层几乎为空。
这种代码,后期维护起来简直是噩梦。记住:controller只做参数校验和路由转发,业务逻辑全在service里。
1.5 配置文件:别让环境配置坑了你
配置文件这块,我吃过不少亏。
有一次,我把生产环境的数据库密码写在了 application.yml 里,结果代码被同事不小心提交到了Git仓库……
嗯,从那以后,我养成了 多环境配置 的习惯。
# application.yml 主配置
spring:
profiles:
active: dev
# application-dev.yml 开发环境
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/oa_dev?useSSL=false
username: root
password: root123
jpa:
hibernate:
ddl-auto: update
show-sql: true
# application-prod.yml 生产环境
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://192.168.1.100:3306/oa_prod?useSSL=true
username: oa_admin
password: ${DB_PASSWORD} # 从环境变量读取
jpa:
hibernate:
ddl-auto: validate # 生产环境不要自动建表
show-sql: false
小技巧:开发环境用 ddl-auto: update 很方便,实体类改了自动同步数据库。
但生产环境一定要改成 validate 或 none,否则一个手误,表结构就乱了。
我曾经在生产环境误操作,导致一张核心表被重建,数据全丢了……说多了都是泪。
1.6 本章小结
这一章,我们从OA系统的定义讲起,聊了技术选型的思路,然后亲手搭建了项目骨架。
说白了,就是给整个课程打了个地基。
下一章,我们会开始写第一个接口——用户登录。
到时候会涉及到Spring Security的集成、JWT的生成与验证,还有Vue前端的路由守卫。
嗯,内容不少,但跟着我一步步来,不会太难。
记住一句话:好的开始是成功的一半。
项目结构搭好了,后面写代码就像搭积木一样顺畅。
咱们下章见。