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 很方便,实体类改了自动同步数据库。
但生产环境一定要改成 validatenone,否则一个手误,表结构就乱了。
我曾经在生产环境误操作,导致一张核心表被重建,数据全丢了……说多了都是泪。

1.6 本章小结

这一章,我们从OA系统的定义讲起,聊了技术选型的思路,然后亲手搭建了项目骨架。
说白了,就是给整个课程打了个地基。

下一章,我们会开始写第一个接口——用户登录。
到时候会涉及到Spring Security的集成、JWT的生成与验证,还有Vue前端的路由守卫。
嗯,内容不少,但跟着我一步步来,不会太难。

记住一句话:好的开始是成功的一半
项目结构搭好了,后面写代码就像搭积木一样顺畅。

咱们下章见。