本系统采用微服务架构,前端使用Vue 3 + Element Plus,后端采用Spring Boot 2.7,数据库使用PostgreSQL 14,文件存储使用MinIO,全文检索使用Elasticsearch 7.17。这种组合能确保系统的高并发处理能力和海量文档的检索效率。
服务器最低配置:4核CPU、16GB内存、500GB SSD存储。操作系统使用Ubuntu 22.04 LTS。所有软件都通过Docker容器部署,确保环境一致性。
在Ubuntu服务器上执行以下命令安装Docker和Docker Compose:
``` sudo apt update sudo apt install docker.io docker-compose -y sudo systemctl start docker sudo systemctl enable docker ```创建docker-compose.yml文件,内容如下:
``` version: '3.8' services: postgres: image: postgres:14 environment: POSTGRES_DB: archive_db POSTGRES_USER: admin POSTGRES_PASSWORD: YourSecurePassword123 volumes: - ./postgres_data:/var/lib/postgresql/data ports: - "5432:5432" minio: image: minio/minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: YourMinioPassword123 volumes: - ./minio_data:/data ports: - "9000:9000" - "9001:9001" elasticsearch: image: elasticsearch:7.17.0 environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - ./es_data:/usr/share/elasticsearch/data ports: - "9200:9200" ```执行docker-compose up -d启动所有基础服务。
使用Spring Initializr创建项目,依赖选择:Spring Web、Spring Data JPA、Spring Security、PostgreSQL Driver。在application.yml中配置数据库连接:
``` spring: datasource: url: jdbc:postgresql://localhost:5432/archive_db username: admin password: YourSecurePassword123 jpa: hibernate: ddl-auto: update show-sql: true servlet: multipart: max-file-size: 500MB max-request-size: 500MB ```创建行政诉讼案件实体类:
``` @Entity @Table(name = "administrative_cases") public class AdministrativeCase { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String caseNumber; @Column(nullable = false) private String caseTitle; @Column(columnDefinition = "TEXT") private String caseContent; @Column(nullable = false) private LocalDate filingDate; @OneToMany(cascade = CascadeType.ALL, mappedBy = "case") private List创建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(); } } ```使用Vite创建Vue项目:
``` npm create vue@latest archive-system cd archive-system npm install npm install element-plus axios ```创建CaseList.vue组件:
```创建案件索引模板:
``` PUT /administrative-cases { "mappings": { "properties": { "caseNumber": { "type": "keyword" }, "caseTitle": { "type": "text", "analyzer": "ik_max_word" }, "caseContent": { "type": "text", "analyzer": "ik_max_word" }, "filingDate": { "type": "date" } } } } ```
添加依赖并配置Elasticsearch:
```在application.yml中添加配置:
``` spring: elasticsearch: uris: http://localhost:9200 ```创建数据导入脚本import_data.py:
``` import psycopg2 import json from datetime import datetime def import_cases(csv_file): conn = psycopg2.connect( host="localhost", database="archive_db", user="admin", password="YourSecurePassword123" ) cursor = conn.cursor() with open(csv_file, 'r', encoding='utf-8') as f: next(f) Skip header for line in f: data = line.strip().split(',') cursor.execute(""" INSERT INTO administrative_cases (case_number, case_title, case_content, filing_date) VALUES (%s, %s, %s, %s) """, (data[0], data[1], data[2], data[3])) conn.commit() cursor.close() conn.close() ```创建文档上传脚本upload_documents.sh:
``` !/bin/bash for file in /path/to/documents/.pdf; do case_number=$(basename "$file" .pdf | cut -d'_' -f1) curl -X POST "http://localhost:8080/api/documents/upload" \ -F "file=@$file" \ -F "caseNumber=$case_number" done ```创建安全配置类:
``` @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeHttpRequests(auth -> auth .requestMatchers("/api/auth/").permitAll() .anyRequest().authenticated() ) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ) .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } } ```在MinIO中创建访问策略:
``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": [""]}, "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::archive-documents/"], "Condition": { "IpAddress": {"aws:SourceIp": ["192.168.1.0/24"]} } } ] } ```创建生产环境docker-compose-prod.yml:
``` version: '3.8' services: backend: build: ./backend ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod depends_on: - postgres - elasticsearch frontend: build: ./frontend ports: - "80:80" nginx: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - "443:443" depends_on: - backend - frontend ```在Spring Boot中添加Actuator依赖并配置:
``` management: endpoints: web: exposure: include: health,metrics,info endpoint: health: show-details: always ```创建Prometheus监控配置prometheus.yml:
``` global: scrape_interval: 15s scrape_configs: - job_name: 'spring-boot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['backend:8080'] ```创建备份脚本backup.sh:
``` !/bin/bash BACKUP_DIR="/backup/$(date +%Y%m%d)" mkdir -p $BACKUP_DIR 备份PostgreSQL pg_dump -h localhost -U admin archive_db > $BACKUP_DIR/archive_db.sql 备份Elasticsearch索引 curl -X GET "localhost:9200/_snapshot/backup_repository/snapshot_$(date +%Y%m%d)" \ -H 'Content-Type: application/json' \ -d '{"indices": "administrative-cases"}' 备份MinIO数据 mc mirror --overwrite minio/archive-documents $BACKUP_DIR/minio-backup/ ```创建恢复脚本restore.sh:
``` !/bin/bash BACKUP_DATE=$1 BACKUP_DIR="/backup/$BACKUP_DATE" 恢复PostgreSQL psql -h localhost -U admin archive_db < $BACKUP_DIR/archive_db.sql 恢复Elasticsearch curl -X POST "localhost:9200/_snapshot/backup_repository/snapshot_$BACKUP_DATE/_restore" 恢复MinIO数据 mc mirror --overwrite $BACKUP_DIR/minio-backup/ minio/archive-documents ```执行系统部署命令:docker-compose -f docker-compose-prod.yml up -d。访问https://your-domain.com查看系统运行状态。使用管理员账号登录后,通过数据导入工具迁移历史数据,系统即可正式投入使用。