公安局数字档案馆建设实操指南:从零搭建完整档案管理系统

一、系统架构与核心组件

公安局数字档案馆采用微服务架构,核心包含档案采集、存储管理、检索利用、安全防护四大模块。系统基于Java Spring Cloud开发,数据库使用PostgreSQL 14.8,文件存储采用MinIO对象存储,全文检索使用Elasticsearch 7.17.5。

1.1 硬件环境要求

服务器配置:CPU 16核以上,内存64GB,硬盘采用RAID 10阵列,存储空间根据档案总量按1:1.5比例预留。网络要求千兆局域网,与公安网物理隔离。

1.2 软件环境部署

操作系统:CentOS 7.9 minimal

安装基础依赖:

```bash yum install -y java-11-openjdk-devel postgresql-server \ docker-ce docker-ce-cli containerd.io ```

初始化PostgreSQL:

```bash postgresql-setup initdb systemctl start postgresql systemctl enable postgresql ```

二、数据库设计与初始化

2.1 创建数据库用户

切换到postgres用户执行:

```sql CREATE USER archive_admin WITH PASSWORD 'Archive@2024Secure'; CREATE DATABASE digital_archive OWNER archive_admin; GRANT ALL PRIVILEGES ON DATABASE digital_archive TO archive_admin; ```

2.2 核心表结构

档案基本信息表:

```sql CREATE TABLE archive_document ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), archive_code VARCHAR(50) UNIQUE NOT NULL, title VARCHAR(500) NOT NULL, document_type VARCHAR(20) CHECK (document_type IN ('刑事', '行政', '户籍', '其他')), secret_level VARCHAR(10) CHECK (secret_level IN ('公开', '内部', '秘密', '机密')), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, file_path VARCHAR(1000) NOT NULL, file_size BIGINT, md5_hash VARCHAR(32) UNIQUE NOT NULL ); ```

2.3 建立索引

创建查询优化索引:

```sql CREATE INDEX idx_archive_code ON archive_document(archive_code); CREATE INDEX idx_create_time ON archive_document(create_time); CREATE INDEX idx_secret_level ON archive_document(secret_level); ```

三、文件存储系统配置

3.1 MinIO对象存储安装

下载并安装MinIO:

```bash wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio mkdir -p /data/minio ./minio server /data/minio --console-address ":9001" ```

3.2 创建存储桶

通过MinIO控制台(http://服务器IP:9001)创建存储桶:

1. 使用默认账号密码minioadmin/minioadmin登录

2. 点击"Create Bucket"按钮

3. 输入桶名称:police-archive

4. 版本控制选择"Enable"

5. 点击"Create Bucket"完成创建

3.3 生成访问密钥

在MinIO控制台:

1. 左侧菜单点击"Access Keys"

2. 点击"Create Access Key"

3. 复制生成的Access Key和Secret Key

公安局数字档案馆建设实操指南:从零搭建完整档案管理系统

4. 在应用配置中使用这些密钥

四、后端服务开发与配置

4.1 Spring Boot应用配置

application.yml核心配置:

```yaml server: port: 8080 spring: datasource: url: jdbc:postgresql://localhost:5432/digital_archive username: archive_admin password: Archive@2024Secure driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: validate show-sql: true minio: endpoint: http://localhost:9000 accessKey: 你的AccessKey secretKey: 你的SecretKey bucket: police-archive ```

4.2 档案上传接口实现

创建FileUploadController.java:

```java @RestController @RequestMapping("/api/archive") public class FileUploadController { @PostMapping("/upload") public ResponseEntity uploadArchive( @RequestParam("file") MultipartFile file, @RequestParam("archiveCode") String archiveCode, @RequestParam("secretLevel") String secretLevel) { // 计算MD5 String md5 = DigestUtils.md5DigestAsHex(file.getBytes()); // 检查文件是否已存在 if (archiveService.checkFileExists(md5)) { return ResponseEntity.status(409).body("文件已存在"); } // 上传到MinIO String objectName = UUID.randomUUID().toString() + getFileExtension(file.getOriginalFilename()); minioClient.putObject( PutObjectArgs.builder() .bucket("police-archive") .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); // 保存到数据库 ArchiveDocument document = new ArchiveDocument(); document.setArchiveCode(archiveCode); document.setTitle(file.getOriginalFilename()); document.setSecretLevel(secretLevel); document.setFilePath(objectName); document.setFileSize(file.getSize()); document.setMd5Hash(md5); archiveRepository.save(document); return ResponseEntity.ok("上传成功"); } } ```

五、全文检索系统集成

5.1 Elasticsearch安装与配置

安装Elasticsearch:

```bash rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch cat > /etc/yum.repos.d/elasticsearch.repo << EOF [elasticsearch] name=Elasticsearch repository baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF yum install -y elasticsearch systemctl start elasticsearch systemctl enable elasticsearch ```

5.2 创建档案索引

使用curl创建索引映射:

```bash curl -X PUT "localhost:9200/archive_documents" -H 'Content-Type: application/json' -d' { "mappings": { "properties": { "archiveCode": {"type": "keyword"}, "title": {"type": "text", "analyzer": "ik_max_word"}, "content": {"type": "text", "analyzer": "ik_max_word"}, "secretLevel": {"type": "keyword"}, "createTime": {"type": "date"}, "fileType": {"type": "keyword"} } } }' ```

5.3 OCR文字识别集成

安装Tesseract OCR:

```bash yum install -y tesseract tesseract-langpack-chi_sim ```

Java调用OCR代码:

```java public String extractTextFromImage(File imageFile) { ITesseract tesseract = new Tesseract(); tesseract.setDatapath("/usr/share/tesseract/tessdata"); tesseract.setLanguage("chi_sim"); try { return tesseract.doOCR(imageFile); } catch (TesseractException e) { throw new RuntimeException("OCR识别失败", e); } } ```

六、安全防护机制

6.1 访问控制配置

Spring Security配置类:

```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/archive/upload").hasRole("ARCHIVE_MANAGER") .antMatchers("/api/archive/search").hasAnyRole("POLICE", "ARCHIVE_MANAGER") .antMatchers("/api/admin/").hasRole("ADMIN") .anyRequest().authenticated() .and() .httpBasic() .and() .csrf().disable(); } } ```

6.2 操作日志记录

创建操作日志表:

```sql CREATE TABLE operation_log ( id SERIAL PRIMARY KEY, user_id VARCHAR(50) NOT NULL, operation_type VARCHAR(20) NOT NULL, target_id UUID, operation_detail TEXT, ip_address INET, operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ```

6.3 文件完整性校验

定期校验文件完整性:

```java @Component public class FileIntegrityChecker { @Scheduled(cron = "0 0 2 ?") // 每天凌晨2点执行 public void checkFileIntegrity() { List documents = archiveRepository.findAll(); for (ArchiveDocument doc : documents) { try { InputStream stream = minioClient.getObject( GetObjectArgs.builder() .bucket("police-archive") .object(doc.getFilePath()) .build() ); String currentMd5 = DigestUtils.md5DigestAsHex( IOUtils.toByteArray(stream) ); if (!currentMd5.equals(doc.getMd5Hash())) { log.error("文件完整性校验失败:{}", doc.getArchiveCode()); // 触发告警机制 } } catch (Exception e) { log.error("文件访问失败:{}", doc.getArchiveCode(), e); } } } } ```

七、系统部署与监控

7.1 Docker容器化部署

创建Dockerfile:

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

构建并运行容器:

```bash docker build -t digital-archive:1.0 . docker run -d -p 8080:8080 \ --name archive-service \ --network=archive-network \ digital-archive:1.0 ```

7.2 监控配置

集成Spring Boot Actuator:

在pom.xml中添加:

```xml org.springframework.boot spring-boot-starter-actuator ```

配置application.yml:

```yaml management: endpoints: web: exposure: include: health,metrics,info endpoint: health: show-details: always ```

7.3 备份策略

创建数据库备份脚本:

```bash !/bin/bash BACKUP_DIR="/backup/archive" DATE=$(date +%Y%m%d_%H%M%S) 备份数据库 pg_dump -U archive_admin digital_archive > \ $BACKUP_DIR/db_backup_$DATE.sql 备份MinIO数据 mc mirror --overwrite police-archive \ $BACKUP_DIR/minio_backup_$DATE/ 保留最近7天备份 find $BACKUP_DIR -type f -mtime +7 -delete ```

设置定时任务:

```bash crontab -e 添加以下行,每天凌晨3点执行备份 0 3 /opt/scripts/backup_archive.sh ```

八、常见问题排查

8.1 文件上传失败处理

检查步骤:

  • 1. 检查MinIO服务状态:systemctl status minio
  • 2. 验证网络连接:telnet minio服务器IP 9000
  • 3. 检查存储桶权限:mc policy get police-archive
  • 4. 查看应用日志:tail -f /var/log/archive-app.log

8.2 检索性能优化

当检索速度变慢时:

  • 执行Elasticsearch索引优化:curl -X POST "localhost:9200/archive_documents/_forcemerge?max_num_segments=1"
  • 检查索引分片设置:curl "localhost:9200/_cat/indices?v"
  • 调整JVM堆内存:修改/etc/elasticsearch/jvm.options中的-Xms4g -Xmx4g

8.3 系统扩容方案

当存储空间不足时:

  • 扩展MinIO集群:添加新的存储节点
  • 数据库垂直扩展:增加内存和CPU资源
  • 实施数据归档策略:将历史数据迁移到冷存储
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统