如何从零搭建企业级人事档案管理系统:完整实操指南

一、系统核心需求与选型决策

人事档案管理系统需要满足以下核心功能:员工信息录入与存储、档案分类管理、权限分级控制、查询检索、档案借阅追踪、数据备份与安全。我们将采用开源技术栈实现零成本部署。

技术选型方案:

  • 后端框架:Spring Boot 2.7.18(Java 17)
  • 数据库:MySQL 8.0.33
  • 前端框架:Vue 3.3.4 + Element Plus 2.3.14
  • 文件存储:MinIO 2023.11.22(替代FastDFS,部署更简单)
  • 权限框架:Spring Security 5.8.5

二、开发环境准备与项目初始化

2.1 环境安装

安装JDK 17:

``` wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz tar -xzf jdk-17_linux-x64_bin.tar.gz sudo mv jdk-17.0.10 /usr/local/ export JAVA_HOME=/usr/local/jdk-17.0.10 export PATH=$JAVA_HOME/bin:$PATH ```

安装MySQL 8.0:

``` sudo apt update sudo apt install mysql-server sudo mysql_secure_installation 创建数据库 mysql -u root -p CREATE DATABASE personnel_archive DEFAULT CHARACTER SET utf8mb4; CREATE USER 'archive_user'@'%' IDENTIFIED BY 'Archive@2024'; GRANT ALL PRIVILEGES ON personnel_archive. TO 'archive_user'@'%'; FLUSH PRIVILEGES; ```

2.2 项目结构搭建

创建Spring Boot项目:

``` curl https://start.spring.io/starter.zip \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.18 \ -d baseDir=personnel-archive \ -d groupId=com.company \ -d artifactId=archive \ -d name=PersonnelArchive \ -d description=Personnel+Archive+Management \ -d packageName=com.company.archive \ -d packaging=jar \ -d javaVersion=17 \ -d dependencies=web,data-jpa,mysql,security \ -o archive.zip unzip archive.zip ```

三、数据库设计与实体建模

3.1 核心表结构

创建员工档案主表:

``` CREATE TABLE employee_archive ( id BIGINT PRIMARY KEY AUTO_INCREMENT, employee_id VARCHAR(20) UNIQUE NOT NULL COMMENT '员工工号', name VARCHAR(50) NOT NULL COMMENT '姓名', id_card VARCHAR(18) UNIQUE NOT NULL COMMENT '身份证号', department_id INT NOT NULL COMMENT '部门ID', position VARCHAR(50) COMMENT '职位', entry_date DATE NOT NULL COMMENT '入职日期', archive_status TINYINT DEFAULT 1 COMMENT '档案状态:1-在档,2-借出,3-销毁', created_time DATETIME DEFAULT CURRENT_TIMESTAMP, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_department (department_id), INDEX idx_status (archive_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```

创建档案文件表:

``` CREATE TABLE archive_file ( id BIGINT PRIMARY KEY AUTO_INCREMENT, archive_id BIGINT NOT NULL COMMENT '档案ID', file_type VARCHAR(20) NOT NULL COMMENT '文件类型:contract,education,certificate', file_name VARCHAR(255) NOT NULL COMMENT '原始文件名', storage_path VARCHAR(500) NOT NULL COMMENT '存储路径', file_size BIGINT NOT NULL COMMENT '文件大小(字节)', upload_user VARCHAR(50) NOT NULL COMMENT '上传人', upload_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (archive_id) REFERENCES employee_archive(id) ON DELETE CASCADE, INDEX idx_archive (archive_id), INDEX idx_type (file_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```

四、后端核心功能实现

4.1 实体类定义

EmployeeArchive实体类:

``` @Entity @Table(name = "employee_archive") @Data public class EmployeeArchive { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "employee_id", unique = true, nullable = false) private String employeeId; @Column(nullable = false) private String name; @Column(name = "id_card", unique = true, nullable = false) private String idCard; @Column(name = "department_id", nullable = false) private Integer departmentId; private String position; @Column(name = "entry_date", nullable = false) private LocalDate entryDate; @Column(name = "archive_status") private Integer archiveStatus = 1; @OneToMany(mappedBy = "archive", cascade = CascadeType.ALL) private List files; } ```

4.2 文件上传服务

MinIO配置类:

``` @Configuration public class MinIOConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } } ```

文件上传服务实现:

``` @Service public class FileStorageService { @Autowired private MinioClient minioClient; @Value("${minio.bucket}") private String bucketName; public String uploadFile(MultipartFile file, String fileType) throws Exception { // 创建bucket(如果不存在) boolean found = minioClient.bucketExists(BucketExistsArgs.builder() .bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName).build()); } // 生成唯一文件名 String originalFilename = file.getOriginalFilename(); String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); String objectName = fileType + "/" + UUID.randomUUID() + extension; // 上传文件 minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return objectName; } } ```

五、前端界面开发

5.1 员工档案列表页面

如何从零搭建企业级人事档案管理系统:完整实操指南

创建ArchiveList.vue组件:

``` ```

六、系统部署与配置

6.1 应用配置文件

application.yml配置:

``` server: port: 8080 servlet: context-path: /api spring: datasource: url: jdbc:mysql://localhost:3306/personnel_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: archive_user password: Archive@2024 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: format_sql: true servlet: multipart: max-file-size: 100MB max-request-size: 100MB minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin bucket: personnel-archive logging: level: com.company.archive: DEBUG file: name: logs/archive.log ```

6.2 使用Docker一键部署

创建docker-compose.yml:

``` version: '3.8' services: mysql: image: mysql:8.0.33 container_name: archive-mysql environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: personnel_archive MYSQL_USER: archive_user MYSQL_PASSWORD: Archive@2024 ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password minio: image: minio/minio:RELEASE.2023-11-22T19-40-07Z container_name: archive-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - minio_data:/data command: server /data --console-address ":9001" backend: build: . container_name: archive-backend ports: - "8080:8080" depends_on: - mysql - minio environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/personnel_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai SPRING_DATASOURCE_USERNAME: archive_user SPRING_DATASOURCE_PASSWORD: Archive@2024 MINIO_ENDPOINT: http://minio:9000 volumes: mysql_data: minio_data: ```

创建Dockerfile:

``` FROM openjdk:17-jdk-slim WORKDIR /app COPY target/archive-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ```

七、权限控制与安全配置

7.1 Spring Security配置

安全配置类:

``` @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeHttpRequests(authz -> authz .antMatchers("/api/auth/").permitAll() .antMatchers("/api/archive/").hasAnyRole("ADMIN", "HR") .antMatchers("/api/file/upload").hasAnyRole("ADMIN", "HR") .antMatchers("/api/file/download/").authenticated() .anyRequest().authenticated() ) .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(); } } ```

7.2 数据库权限表

创建用户角色表:

``` CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, real_name VARCHAR(50) NOT NULL, department VARCHAR(50), enabled BOOLEAN DEFAULT true, created_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE sys_role ( id INT PRIMARY KEY AUTO_INCREMENT, role_code VARCHAR(20) UNIQUE NOT NULL, role_name VARCHAR(50) NOT NULL ); INSERT INTO sys_role (role_code, role_name) VALUES ('ROLE_ADMIN', '系统管理员'), ('ROLE_HR', '人事专员'), ('ROLE_USER', '普通用户'); ```

八、系统测试与上线

8.1 功能测试用例

创建测试数据脚本:

``` INSERT INTO employee_archive (employee_id, name, id_card, department_id, position, entry_date) VALUES ('EMP2024001', '张三', '110101199001011234', 1, 'Java开发工程师', '2024-01-15'), ('EMP2024002', '李四', '110101199002021235', 2, '人事专员', '2024-02-20'), ('EMP2024003', '王五', '110101199003031236', 1, '前端开发工程师', '2024-03-10'); ```

接口测试命令:

``` 测试档案列表接口 curl -X GET "http://localhost:8080/api/archive/list?page=1&size=10" \ -H "Authorization: Bearer your_jwt_token" 测试文件上传接口 curl -X POST "http://localhost:8080/api/file/upload" \ -H "Authorization: Bearer your_jwt_token" \ -F "file=@/path/to/contract.pdf" \ -F "archiveId=1" \ -F "fileType=contract" ```

8.2 生产环境部署

Nginx反向代理配置:

``` server { listen 80; server_name archive.yourcompany.com; location /api/ { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } } ```

设置开机自启动:

``` sudo systemctl enable nginx sudo systemctl enable docker sudo docker-compose up -d ```

至此,一个完整的人事档案管理系统已经部署完成。系统包含了员工信息管理、档案文件上传下载、权限控制等核心功能,可以直接用于生产环境。后续可根据实际需求扩展考勤记录、绩效考核等模块。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统