油田数字档案馆的核心是构建一个能安全、高效管理海量结构化数据(如井史、测井曲线)与非结构化数据(如设计图纸、施工报告)的系统。我们采用微服务架构,将系统拆分为独立部署的服务,便于后期维护和扩展。
以下是经过验证的、稳定且文档齐全的技术组合,可直接用于生产环境。
所有操作均在CentOS 7.9或Ubuntu 20.04 LTS系统上验证通过。
通过以下脚本一键安装Docker引擎和最新版Docker Compose。
执行安装命令:
``` curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo systemctl start docker && sudo systemctl enable docker sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```验证安装:
``` docker --version docker-compose --version ```创建 `docker-compose.yml` 文件,一次性启动MySQL、Redis、MinIO和Elasticsearch。
在项目根目录创建 `docker-compose.yml`,内容如下:
``` version: '3.8' services: mysql: image: mysql:8.0 container_name: archive-mysql environment: MYSQL_ROOT_PASSWORD: StrongPass123! MYSQL_DATABASE: oilfield_archive ports: - "3306:3306" volumes: - ./mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password redis: image: redis:6-alpine container_name: archive-redis ports: - "6379:6379" volumes: - ./redis_data:/data minio: image: minio/minio container_name: archive-minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: AdminPass123! volumes: - ./minio_data:/data command: server /data --console-address ":9001" elasticsearch: image: elasticsearch:7.17.9 container_name: archive-es environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms512m -Xmx512m ports: - "9200:9200" volumes: - ./es_data:/usr/share/elasticsearch/data ```启动服务:
``` sudo docker-compose up -d ```检查所有容器状态:
``` sudo docker-compose ps ```使用Spring Initializr生成项目骨架,或直接克隆以下基础模板。
核心依赖 `pom.xml` 配置:
```
数据库连接配置 `application.yml`:
``` spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://你的服务器IP:3306/oilfield_archive?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: StrongPass123! redis: host: 你的服务器IP port: 6379 database: 0 elasticsearch: uris: http://你的服务器IP:9200 minio: endpoint: http://你的服务器IP:9000 accessKey: admin secretKey: AdminPass123! bucketName: oilfield-files ```文件上传服务实现:创建 `FileStorageService` 类,封装MinIO操作。
``` @Service public class FileStorageService { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Value("${minio.bucketName}") private String bucketName; private MinioClient minioClient; @PostConstruct public void init() throws Exception { minioClient = MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); // 确保存储桶存在 boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } public String uploadFile(MultipartFile file, String objectName) throws Exception { minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return endpoint + "/" + bucketName + "/" + objectName; } } ```档案元数据索引:创建Elasticsearch文档模型与仓储接口,实现档案内容的全文检索。
``` @Document(indexName = "archive_document") @Data public class ArchiveDocument { @Id private String id; private String fileId; // 对应文件表ID private String fileName; private String fileType; private String content; // 从TXT/PDF/Word中提取的文本内容 private String uploadUser; private Date uploadTime; private String oilfield; // 所属油田 private String wellNumber; // 关联井号 } public interface ArchiveDocumentRepository extends ElasticsearchRepository使用Vite快速创建项目,并安装必要依赖。
``` npm create vite@latest oilfield-archive-frontend -- --template vue cd oilfield-archive-frontend npm install element-plus axios --save npm install ```在 `main.js` 中引入Element Plus:
``` import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' const app = createApp(App) app.use(ElementPlus) app.mount('app') ```创建 `FileUpload.vue` 组件,包含文件选择、元数据填写和上传进度显示。
```在后端项目根目录创建 `Dockerfile`:
``` FROM openjdk:11-jre-slim VOLUME /tmp COPY target/.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] ```构建并运行后端服务容器:
``` 在项目根目录执行Maven打包 mvn clean package -DskipTests 构建Docker镜像 sudo docker build -t oilfield-archive-backend . 运行容器,连接到之前启动的数据库等服务网络 sudo docker run -d -p 8080:8080 \ --network=your_project_default \ -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/oilfield_archive \ -e SPRING_REDIS_HOST=redis \ -e SPRING_ELASTICSEARCH_URIS=http://elasticsearch:9200 \ -e MINIO_ENDPOINT=http://minio:9000 \ --name archive-backend \ oilfield-archive-backend ```构建前端生产环境代码:
``` npm run build ```创建 `nginx.conf` 配置文件,处理前端路由和后端API代理:
``` server { listen 80; server_name your_domain_or_ip; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://archive-backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```使用Docker运行Nginx服务:
``` sudo docker run -d -p 80:80 \ -v /path/to/your/dist:/usr/share/nginx/html:ro \ -v /path/to/your/nginx.conf:/etc/nginx/conf.d/default.conf:ro \ --name archive-frontend \ nginx:alpine ```系统启动后,按顺序验证以下核心功能是否正常。
完成以上所有步骤后,一个具备文件上传、存储、检索等核心功能的油田数字档案馆最小可行系统即部署完成。后续可根据具体业务需求,在此架构上扩展权限管理、工作流、数据可视化等功能模块。