本文面向需要构建或采购档案管理系统的技术负责人、项目经理和开发者。我们将直接切入核心,提供一套可立即执行的、符合国家档案局《数字档案室建设指南》和《电子文件归档与电子档案管理规范》等核心法规的技术方案。你将通过以下步骤,获得一个具备基础资质的档案软件原型。
档案软件的核心资质围绕“四性”保障:真实性、完整性、可用性、安全性。以下表格将法规要求直接映射为具体的技术实现点。
| 资质维度 | 法规/标准要求 | 必须实现的技术功能点 |
|---|---|---|
| 真实性 | 固化电子文件内容、结构、背景信息 | 1. 文件上传时计算并存储哈希值(如SHA-256) 2. 支持电子签章或数字签名集成 3. 记录所有操作日志(何人、何时、何事) |
| 完整性 | 确保电子档案内容、结构、元数据齐全 | 1. 强制元数据著录(档号、题名、责任者等) 2. 文件与元数据绑定存储,不可单独删除 3. 定期完整性校验(比对存储哈希与计算哈希) |
| 可用性 | 长期可读、可检索、可输出 | 1. 支持OFD、PDF/A等版式归档格式 2. 建立全文检索索引(如Elasticsearch) 3. 提供标准API接口供数据交换 |
| 安全性 | 存储安全、传输安全、权限控制 | 1. 存储加密(如AES-256) 2. HTTPS传输 3. 基于角色的细粒度权限控制(RBAC) |
我们使用Java Spring Boot作为后端,Vue作为前端,PostgreSQL作为数据库,MinIO作为对象存储,快速搭建一个具备资质雏形的系统。
使用Spring Initializr创建项目,或直接复制以下pom.xml核心依赖:
```在application.yml中配置数据库和MinIO连接:
``` spring: datasource: url: jdbc:postgresql://localhost:5432/archive_db username: your_username password: your_password jpa: hibernate: ddl-auto: update minio: endpoint: http://localhost:9000 accessKey: your_minio_access_key secretKey: your_minio_secret_key ```创建档案核心实体,映射“四性”要求到数据库字段:
``` @Entity public class ArchiveFile { @Id private String id; // 档案唯一标识,建议使用UUID @Column(nullable = false) private String fileName; @Column(nullable = false) private String fileSize; @Column(nullable = false, unique = true) private String fileHash; // SHA-256哈希值,保障真实性、完整性 @Column(nullable = false) private String storagePath; // 在MinIO中的存储路径 // 以下为必须的元数据字段,保障完整性 @Column(nullable = false) private String archiveCode; // 档号 private String title; // 题名 private String responsiblePerson; // 责任者 private LocalDateTime createDate; // 形成日期 @Column(nullable = false) private LocalDateTime uploadTime; private String uploadUser; } ```这是保障“真实性”和“完整性”的第一步。创建FileService,实现接收文件流、计算哈希、存储至MinIO和数据库的完整逻辑。
``` @Service public class FileService { @Autowired private MinioClient minioClient; @Autowired private ArchiveFileRepository fileRepository; public ArchiveFile uploadFile(MultipartFile file, String archiveCode, String title) throws Exception { // 1. 计算文件SHA-256哈希值 String fileHash = DigestUtils.sha256Hex(file.getInputStream()); // 2. 检查哈希是否已存在,防止重复归档 if (fileRepository.findByFileHash(fileHash).isPresent()) { throw new RuntimeException("相同内容的文件已存在,哈希值:" + fileHash); } // 3. 上传到MinIO对象存储 String objectName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename(); minioClient.putObject( PutObjectArgs.builder() .bucket("archive-bucket") .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); // 4. 保存元数据及哈希值到数据库 ArchiveFile archiveFile = new ArchiveFile(); archiveFile.setId(UUID.randomUUID().toString()); archiveFile.setFileName(file.getOriginalFilename()); archiveFile.setFileSize(String.valueOf(file.getSize())); archiveFile.setFileHash(fileHash); // 存储哈希 archiveFile.setStoragePath(objectName); archiveFile.setArchiveCode(archiveCode); // 强制著录元数据 archiveFile.setTitle(title); archiveFile.setUploadTime(LocalDateTime.now()); archiveFile.setUploadUser(getCurrentUser()); return fileRepository.save(archiveFile); } } ```定期比对存储文件的当前哈希与入库时哈希,确保文件未被篡改。使用Spring Scheduler实现。
``` @Component public class IntegrityCheckScheduler { @Autowired private FileService fileService; @Autowired private ArchiveFileRepository fileRepository; @Scheduled(cron = "0 0 2 ?") // 每天凌晨2点执行 public void checkFileIntegrity() { List为实现高效检索(保障“可用性”),集成Elasticsearch。在pom.xml添加依赖,然后创建文档实体和仓库。
```
创建用于检索的文档模型:
``` @Document(indexName = "archive_index") public class ArchiveDoc { @Id private String id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; // 题名 @Field(type = FieldType.Text, analyzer = "ik_max_word") private String content; // 文件内容(需通过Tika等工具从文件中提取文本) @Field(type = FieldType.Keyword) private String archiveCode; // 档号 // ... 其他可检索字段 } ```在文件上传成功后,调用服务提取文本并存入Elasticsearch。
保障“安全性”。定义角色(如档案管理员、查阅员、审计员)和权限(如上传、删除、下载、查看日志)。在数据库中建立五张表:用户、角色、权限、用户-角色关联、角色-权限关联。在每次接口访问时,通过拦截器或过滤器进行校验。
创建一个简单的权限注解和拦截器:
``` @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PreAuthorize { String value(); // 例如 "file:upload" } ```在拦截器中,根据当前登录用户的角色,查询其拥有的所有权限标识符,与注解中的value进行比对,匹配则放行,否则返回403错误。
使用pg_dump进行定期备份,并将备份文件存储在与数据库不同的物理设备上。
``` 每日全量备份脚本(crontab -e 添加) 0 1 pg_dump -U your_username archive_db > /mnt/backup/archive_db_$(date +\%Y\%m\%d).sql ```MinIO默认支持纠删码,在启动MinIO时,使用至少4个驱动器以实现数据冗余和高可用。
``` 启动一个4个驱动器的MinIO实例 minio server /data1 /data2 /data3 /data4 ```使用Logback或Log4j2,确保记录所有用户的关键操作。配置日志滚动策略并长期保存。
```在系统开发完成后,请逐项核对以下清单:
通过以上步骤构建的系统,已具备了符合档案管理软件核心资质要求的技术骨架。后续可根据具体业务需求,在此骨架之上增加流程审批、电子签章集成、长期保存格式转换等高级功能。