铁路档案管理系统采用微服务架构,核心组件包括:Spring Boot 2.7.x作为服务框架,MySQL 8.0作为主数据库,Redis 7.0用于缓存,MinIO用于文件存储,Vue 3作为前端框架。
在CentOS 7.9服务器上执行以下命令:
安装JDK 17:
```bash yum install -y wget wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm rpm -ivh jdk-17_linux-x64_bpm.rpm ```安装MySQL 8.0:
```bash wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm rpm -ivh mysql80-community-release-el7-7.noarch.rpm yum install -y mysql-community-server systemctl start mysqld grep 'temporary password' /var/log/mysqld.log mysql_secure_installation ```创建数据库和用户:
```sql CREATE DATABASE railway_archive DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'archive_user'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON railway_archive. TO 'archive_user'@'%'; FLUSH PRIVILEGES; ```档案主表:
```sql CREATE TABLE archive_document ( id BIGINT PRIMARY KEY AUTO_INCREMENT, archive_code VARCHAR(50) NOT NULL UNIQUE COMMENT '档案编号规则:RL-线路代码-年份-流水号', document_name VARCHAR(200) NOT NULL COMMENT '档案名称', document_type ENUM('设计图纸','施工记录','验收报告','运维日志','安全文件') NOT NULL, line_code VARCHAR(20) NOT NULL COMMENT '线路代码,如:京沪线-JH', station_code VARCHAR(20) COMMENT '站点代码', secret_level ENUM('公开','内部','秘密','机密') DEFAULT '内部', storage_location VARCHAR(100) COMMENT '物理存放位置', digital_path VARCHAR(500) COMMENT '数字文件存储路径', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_line_station (line_code, station_code), INDEX idx_archive_code (archive_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```使用Spring Initializr创建项目:
```bash curl https://start.spring.io/starter.zip \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.18 \ -d baseDir=railway-archive \ -d groupId=com.railway \ -d artifactId=archive \ -d name=RailwayArchive \ -d description=Railway+Archive+Management \ -d packageName=com.railway.archive \ -d packaging=jar \ -d javaVersion=17 \ -d dependencies=web,data-jpa,mysql,redis,validation \ -o railway-archive.zip unzip railway-archive.zip ```application.yml核心配置:
```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/railway_archive?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: archive_user password: StrongPass123! driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 minimum-idle: 5 jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: format_sql: true redis: host: localhost port: 6379 password: RedisPass123! database: 0 timeout: 3000ms minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin123 bucket: railway-archive ```创建FileStorageService:
```java @Service public class FileStorageService { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Value("${minio.bucket}") private String bucket; private MinioClient minioClient; @PostConstruct public void init() throws Exception { minioClient = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); boolean exists = minioClient.bucketExists( BucketExistsArgs.builder().bucket(bucket).build()); if (!exists) { minioClient.makeBucket( MakeBucketArgs.builder().bucket(bucket).build()); } } public String uploadFile(MultipartFile file, String archiveCode) throws Exception { String fileName = archiveCode + "_" + System.currentTimeMillis() + "_" + file.getOriginalFilename(); minioClient.putObject( PutObjectArgs.builder() .bucket(bucket) .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); return endpoint + "/" + bucket + "/" + fileName; } } ```使用Vite创建项目:
```bash npm create vite@latest railway-archive-frontend -- --template vue cd railway-archive-frontend npm install npm install axios element-plus ```
档案上传组件:
```vue安装Elasticsearch 7.17:
```bash 下载并安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.16-linux-x86_64.tar.gz tar -xzf elasticsearch-7.17.16-linux-x86_64.tar.gz cd elasticsearch-7.17.16/ 修改配置 echo "cluster.name: railway-archive" >> config/elasticsearch.yml echo "node.name: node-1" >> config/elasticsearch.yml echo "network.host: 0.0.0.0" >> config/elasticsearch.yml echo "http.port: 9200" >> config/elasticsearch.yml echo "discovery.type: single-node" >> config/elasticsearch.yml 启动ES ./bin/elasticsearch -d ```创建档案索引:
```bash curl -X PUT "localhost:9200/railway_archive" -H 'Content-Type: application/json' -d' { "mappings": { "properties": { "archiveCode": {"type": "keyword"}, "documentName": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "documentType": {"type": "keyword"}, "lineCode": {"type": "keyword"}, "content": { "type": "text", "analyzer": "ik_max_word" }, "createTime": {"type": "date"} } } }' ```创建Dockerfile:
```dockerfile FROM openjdk:17-jdk-slim VOLUME /tmp COPY target/railway-archive-0.0.1-SNAPSHOT.jar app.jar ENV JAVA_OPTS="-Xmx512m -Xms256m" ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"] ```docker-compose.yml完整配置:
```yaml version: '3.8' services: mysql: image: mysql:8.0 container_name: railway-mysql environment: MYSQL_ROOT_PASSWORD: RootPass123! MYSQL_DATABASE: railway_archive MYSQL_USER: archive_user MYSQL_PASSWORD: StrongPass123! ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password redis: image: redis:7.0-alpine container_name: railway-redis command: redis-server --requirepass RedisPass123! ports: - "6379:6379" volumes: - redis_data:/data minio: image: minio/minio:latest container_name: railway-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 volumes: - minio_data:/data command: server /data --console-address ":9001" elasticsearch: image: elasticsearch:7.17.16 container_name: railway-es environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - es_data:/usr/share/elasticsearch/data archive-backend: build: ./backend container_name: railway-backend ports: - "8080:8080" depends_on: - mysql - redis - minio - elasticsearch environment: - SPRING_PROFILES_ACTIVE=docker archive-frontend: build: ./frontend container_name: railway-frontend ports: - "80:80" depends_on: - archive-backend volumes: mysql_data: redis_data: minio_data: es_data: ```Spring Boot Actuator配置:
```yaml management: endpoints: web: exposure: include: health,metrics,info endpoint: health: show-details: always metrics: export: prometheus: enabled: true ```Nginx反向代理配置:
```nginx server { listen 80; server_name archive.railway.com; location /api/ { proxy_pass http://archive-backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } access_log /var/log/nginx/archive_access.log; error_log /var/log/nginx/archive_error.log; } ```创建backup.sh:
```bash !/bin/bash BACKUP_DIR="/data/backups/archive" DATE=$(date +%Y%m%d_%H%M%S) 备份MySQL mysqldump -uarchive_user -pStrongPass123! railway_archive \ > $BACKUP_DIR/mysql_$DATE.sql 备份MinIO文件 mc cp --recursive minio/railway-archive $BACKUP_DIR/minio_$DATE/ 备份Elasticsearch索引 curl -X GET "localhost:9200/_snapshot/backup_repository/snapshot_$DATE?wait_for_completion=true" 保留最近7天备份 find $BACKUP_DIR -type f -mtime +7 -delete ```设置定时任务:
```bash crontab -e 每天凌晨2点执行备份 0 2 /opt/scripts/backup.sh ```MySQL数据恢复:
```bash mysql -uarchive_user -pStrongPass123! railway_archive < backup_file.sql ```MinIO文件恢复:
```bash mc cp --recursive backup_dir/minio/ minio/railway-archive/ ```