网站首页/ 信息中心/ 档案百科/

行政处罚数字档案馆系统开发从零到一实操指南

发布时间:2026年08月25日 08:00:07 浏览量:0

一、技术栈选型与环境准备

为了确保系统的高可用性与易维护性,本指南采用Spring Boot + Vue + MySQL + MinIO的经典组合。MySQL负责存储结构化数据,MinIO负责存储非结构化的行政处罚档案文件(如PDF、图片)。在开始编码前,请确保服务器已安装以下环境:

执行以下命令验证环境:

```bash java -version mvn -v docker --version ```

二、数据库设计与初始化

行政处罚数字档案馆的核心在于对案件全生命周期的管理。我们需要设计一张核心表来存储案件元数据,并关联档案文件。请在MySQL客户端执行以下SQL脚本,完成数据库与表的创建:

```sql CREATE DATABASE IF NOT EXISTS admin_penalty_archive DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE admin_penalty_archive; -- 行政处罚案件主表 CREATE TABLE t_penalty_case ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', case_code VARCHAR(64) NOT NULL COMMENT '案号,唯一标识', party_name VARCHAR(128) NOT NULL COMMENT '当事人名称', illegal_act TEXT COMMENT '违法行为描述', penalty_content TEXT COMMENT '处罚内容', penalty_date DATE COMMENT '处罚决定日期', archive_status TINYINT DEFAULT 0 COMMENT '归档状态:0-未归档,1-已归档', archive_file_url VARCHAR(512) COMMENT '档案文件在MinIO中的存储路径', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', UNIQUE KEY uk_case_code (case_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='行政处罚案件表'; ```

三、后端项目构建与配置

使用Spring Initializr生成项目,勾选Web、MyBatis Framework、MySQL Driver、Lombok。在pom.xml中额外引入MinIO客户端依赖:

```xml io.minio minio 8.5.7 ```

配置application.yml文件,包含数据库连接池与MinIO存储配置。请务必替换usernamepassword以及MinIO的密钥为实际生产环境的值:

```yaml server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/admin_penalty_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: your_strong_password hikari: maximum-pool-size: 20 minimum-idle: 5 MinIO 对象存储配置 minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin bucketName: penalty-archives ```

四、核心业务代码实现

我们需要实现一个完整的流程:接收处罚决定书文件 -> 上传至MinIO -> 保存案件信息至MySQL。以下是分层实现的完整代码。

1. 实体类

使用Lombok简化实体类代码:

```java package com.example.archive.entity; import lombok.Data; import java.time.LocalDate; @Data public class PenaltyCase { private Long id; private String caseCode; private String partyName; private String illegalAct; private String penaltyContent; private LocalDate penaltyDate; private Integer archiveStatus; // 0:未归档, 1:已归档 private String archiveFileUrl; } ```

2. MinIO 配置类

初始化MinIO客户端实例:

```java package com.example.archive.config; import io.minio.MinioClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "minio") public class MinioConfig { private String endpoint; private String accessKey; private String secretKey; private String bucketName; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } } ```

3. 业务服务层

行政处罚数字档案馆系统开发从零到一实操指南

这是核心逻辑层,负责文件上传和数据库交互。为了保持简洁,这里直接使用JdbcTemplate进行数据库操作,实际项目中建议使用MyBatis-Plus。

```java package com.example.archive.service; import com.example.archive.config.MinioConfig; import com.example.archive.entity.PenaltyCase; import io.minio.MinioClient; import io.minio.PutObjectArgs; import io.minio.errors.MinioException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.time.LocalDate; import java.util.UUID; @Service public class ArchiveService { @Autowired private MinioClient minioClient; @Autowired private MinioConfig minioConfig; @Autowired private JdbcTemplate jdbcTemplate; / 归档行政处罚案件:上传文件并保存元数据 / public void archiveCase(PenaltyCase caseInfo, MultipartFile file) throws Exception { // 1. 上传文件到MinIO String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename(); String objectName = "archives/" + LocalDate.now().getYear() + "/" + fileName; try (InputStream inputStream = file.getInputStream()) { minioClient.putObject( PutObjectArgs.builder() .bucket(minioConfig.getBucketName()) .object(objectName) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build()); } catch (MinioException | InvalidKeyException | NoSuchAlgorithmException e) { throw new RuntimeException("文件上传失败", e); } // 2. 保存数据库记录 String fileUrl = minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + objectName; String sql = "INSERT INTO t_penalty_case (case_code, party_name, illegal_act, penalty_content, penalty_date, archive_status, archive_file_url) VALUES (?, ?, ?, ?, ?, ?, ?)"; jdbcTemplate.update(sql, caseInfo.getCaseCode(), caseInfo.getPartyName(), caseInfo.getIllegalAct(), caseInfo.getPenaltyContent(), caseInfo.getPenaltyDate(), 1, // 标记为已归档 fileUrl ); } } ```

4. 控制层

提供RESTful API接口供前端调用:

```java package com.example.archive.controller; import com.example.archive.entity.PenaltyCase; import com.example.archive.service.ArchiveService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/api/archive") public class ArchiveController { @Autowired private ArchiveService archiveService; @PostMapping("/upload") public String uploadCase( @RequestParam("caseCode") String caseCode, @RequestParam("partyName") String partyName, @RequestParam("illegalAct") String illegalAct, @RequestParam("penaltyContent") String penaltyContent, @RequestParam(value = "penaltyDate", required = false) String penaltyDate, @RequestParam("file") MultipartFile file) { try { PenaltyCase caseInfo = new PenaltyCase(); caseInfo.setCaseCode(caseCode); caseInfo.setPartyName(partyName); caseInfo.setIllegalAct(illegalAct); caseInfo.setPenaltyContent(penaltyContent); if (penaltyDate != null) { caseInfo.setPenaltyDate(java.time.LocalDate.parse(penaltyDate)); } archiveService.archiveCase(caseInfo, file); return "案件归档成功,案号:" + caseCode; } catch (Exception e) { e.printStackTrace(); return "归档失败:" + e.getMessage(); } } } ```

五、MinIO存储服务部署

在运行Spring Boot应用之前,必须先启动MinIO服务。使用Docker可以一键启动:

```bash docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio-server \ -e "MINIO_ROOT_USER=minioadmin" \ -e "MINIO_ROOT_PASSWORD=minioadmin" \ minio/minio server /data --console-address ":9001" ```

执行完毕后,访问http://localhost:9001登录MinIO控制台,手动创建名为penalty-archives的Bucket,并将访问策略设置为Public(或者根据安全需求设置为Private并配置Presigned URL)。

六、项目打包与容器化部署

为了实现零门槛落地,我们将整个应用打包为Docker镜像。

1. 创建Dockerfile

在项目根目录下创建Dockerfile

```dockerfile FROM openjdk:11-jre-slim WORKDIR /app COPY target/admin-penalty-archive-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ```

2. 构建并运行

首先使用Maven打包项目:

```bash mvn clean package -DskipTests ```

然后构建Docker镜像并运行容器:

```bash 构建镜像 docker build -t penalty-archive-system:1.0 . 运行容器 (假设MySQL和MinIO都在同一Docker网络中,或者使用host网络) docker run -d \ --name archive-app \ -p 8080:8080 \ --link minio-server:minio \ -e SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/admin_penalty_archive \ -e SPRING_DATASOURCE_USERNAME=root \ -e SPRING_DATASOURCE_PASSWORD=your_strong_password \ penalty-archive-system:1.0 ```

至此,行政处罚数字档案馆系统的核心后端服务已完全部署。你可以使用Postman向http://localhost:8080/api/archive/upload发送POST请求,携带表单数据和文件进行测试。系统会自动将档案文件存入MinIO,并将案件信息归档至MySQL数据库,实现了电子档案的数字化管理闭环。

太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务通常包含需求分析、方案制定、现场整理、扫描加工、数据挂接、验收交付等核心流程,费用根据档案数量、纸张状况、数字化标准等因素综合计算,2026年市场价格范围大致在每页0.5元至2元之间...
2026年08月25日 08:00:07
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818