商场数字档案馆:零基础搭建全流程实操指南

一、系统架构与核心技术选型

商场数字档案馆的核心是安全、可扩展地存储和管理海量非结构化数据(如合同、图纸、监控录像)。我们采用微服务架构,将系统拆分为独立服务,便于维护和扩展。

1.1 基础技术栈

  • 存储层: 对象存储(MinIO)用于存放文件本体,关系型数据库(PostgreSQL)用于存放文件元数据(名称、大小、路径、标签等)。
  • 服务层: 使用Spring Boot构建微服务,包括文件上传服务、元数据管理服务、检索服务。
  • 接入层: 使用Nginx作为反向代理和负载均衡。

1.2 环境准备清单

确保服务器已安装以下软件,所有版本需严格对应以避免兼容性问题。

  • 操作系统:Ubuntu 20.04 LTS
  • Java运行环境:OpenJDK 11
  • 数据库:PostgreSQL 13
  • 对象存储:MinIO RELEASE.2022-10-24T18-35-07Z
  • Web服务器:Nginx 1.18

使用以下命令一键安装所需环境(Ubuntu系统):

``` 更新包列表 sudo apt update 安装OpenJDK 11 sudo apt install -y openjdk-11-jdk 安装PostgreSQL 13 sudo apt install -y postgresql-13 postgresql-client-13 下载并安装MinIO(独立模式) wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio sudo mv minio /usr/local/bin/ 安装Nginx sudo apt install -y nginx ```

二、MinIO对象存储部署与配置

MinIO负责实际文件的存储,是系统的基石。

2.1 启动MinIO服务

创建专用用户、数据目录并启动服务。

``` 创建minio用户和组 sudo useradd -r minio-user -s /sbin/nologin 创建存储目录,假设使用/data/minio sudo mkdir -p /data/minio sudo chown -R minio-user:minio-user /data/minio 创建环境变量文件 sudo tee /etc/default/minio << EOF MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=YourStrongPassword123! MINIO_VOLUMES="/data/minio" MINIO_OPTS="--address :9000 --console-address :9001" EOF 创建Systemd服务文件 sudo tee /etc/systemd/system/minio.service << EOF [Unit] Description=MinIO After=network.target [Service] User=minio-user Group=minio-user EnvironmentFile=/etc/default/minio ExecStart=/usr/local/bin/minio server \$MINIO_OPTS \$MINIO_VOLUMES Restart=always LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF 启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl enable minio sudo systemctl start minio sudo systemctl status minio 检查状态,确保Active: active (running) ```

访问http://你的服务器IP:9001,使用上面设置的admin/YourStrongPassword123!登录MinIO控制台。

2.2 创建存储桶

在MinIO控制台,点击“Create Bucket”,创建一个名为mall-archive的存储桶,所有权限保持默认私有。

三、PostgreSQL数据库初始化

数据库用于记录所有文件的索引信息。

3.1 创建数据库和用户

``` 切换到postgres用户 sudo -u postgres psql 在psql命令行中执行以下SQL CREATE DATABASE mall_archive_db; CREATE USER archive_admin WITH PASSWORD 'SecureDbPass456!'; GRANT ALL PRIVILEGES ON DATABASE mall_archive_db TO archive_admin; \q ```

3.2 创建核心数据表

连接到新创建的数据库,建立文件元数据表。

``` psql -U archive_admin -d mall_archive_db -h localhost -- 执行建表语句 CREATE TABLE file_metadata ( id BIGSERIAL PRIMARY KEY, file_name VARCHAR(500) NOT NULL, original_name VARCHAR(500) NOT NULL, file_size BIGINT NOT NULL, file_md5 VARCHAR(32) NOT NULL UNIQUE, -- 用于去重 mime_type VARCHAR(100), storage_path VARCHAR(1000) NOT NULL, -- MinIO中的路径 bucket_name VARCHAR(100) NOT NULL DEFAULT 'mall-archive', category VARCHAR(50), -- 如'合同','图纸','监控' tags TEXT[], -- 标签数组,便于搜索 upload_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, upload_user VARCHAR(100) ); CREATE INDEX idx_tags ON file_metadata USING GIN(tags); CREATE INDEX idx_category ON file_metadata(category); CREATE INDEX idx_upload_time ON file_metadata(upload_time); \q ```

四、构建文件上传微服务

使用Spring Boot创建一个RESTful API服务,处理文件上传和元数据存储。

4.1 项目初始化与依赖

使用Spring Initializr(https://start.spring.io/)生成项目,选择:

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.7.5
  • Dependencies: Spring Web, Spring Data JPA, PostgreSQL Driver

商场数字档案馆:零基础搭建全流程实操指南

在生成项目的pom.xml中,手动添加MinIO Java SDK依赖:

``` io.minio minio 8.4.6 ```

4.2 核心配置文件

编辑src/main/resources/application.yml

``` server: port: 8080 spring: datasource: url: jdbc:postgresql://localhost:5432/mall_archive_db username: archive_admin password: SecureDbPass456! driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: validate show-sql: true minio: endpoint: http://127.0.0.1:9000 accessKey: admin secretKey: YourStrongPassword123! bucket: mall-archive ```

4.3 实现文件上传控制器

创建FileUploadController.java

``` import org.springframework.web.bind.annotation.; import org.springframework.web.multipart.MultipartFile; import java.util.UUID; @RestController @RequestMapping("/api/archive") public class FileUploadController { @PostMapping("/upload") public ResponseEntity uploadFile( @RequestParam("file") MultipartFile file, @RequestParam(value = "category", required = false) String category, @RequestParam(value = "tags", required = false) String tags) { try { // 1. 生成唯一文件名和存储路径 String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String storedFileName = UUID.randomUUID().toString() + fileExtension; String objectPath = "uploads/" + storedFileName; // 2. 上传到MinIO(此处需注入MinioClient,配置略) minioClient.putObject( PutObjectArgs.builder() .bucket(minioConfig.getBucket()) .object(objectPath) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); // 3. 计算MD5(需引入commons-codec) String md5 = DigestUtils.md5Hex(file.getInputStream()); // 4. 保存元数据到PostgreSQL(需注入JpaRepository,配置略) FileMetadata metadata = new FileMetadata(); metadata.setFileName(storedFileName); metadata.setOriginalName(originalFilename); metadata.setFileSize(file.getSize()); metadata.setFileMd5(md5); metadata.setMimeType(file.getContentType()); metadata.setStoragePath(objectPath); metadata.setCategory(category); metadata.setTags(tags != null ? tags.split(",") : new String[0]); fileMetadataRepository.save(metadata); return ResponseEntity.ok("文件上传成功,ID: " + metadata.getId()); } catch (Exception e) { return ResponseEntity.status(500).body("上传失败: " + e.getMessage()); } } } ```

五、Nginx配置与前端简易接入

配置Nginx作为网关,并提供一个最简化的HTML前端用于测试上传。

5.1 Nginx反向代理配置

编辑/etc/nginx/sites-available/mall-archive

``` server { listen 80; server_name your-domain.com; 或服务器IP 前端静态页面(示例) location / { root /var/www/mall-archive/html; index index.html; } 反向代理到后端Spring Boot服务 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } 可选:直接代理MinIO控制台(仅限内网访问) location /minio/ { proxy_pass http://127.0.0.1:9001/; } } ```

创建软链接并重启Nginx:

``` sudo ln -s /etc/nginx/sites-available/mall-archive /etc/nginx/sites-enabled/ sudo nginx -t 测试配置 sudo systemctl restart nginx ```

5.2 创建测试上传页面

创建/var/www/mall-archive/html/index.html

```

商场数字档案馆-测试上传



分类:

标签:

```

六、基础检索功能实现

在Spring Boot服务中添加一个简单的检索接口。

6.1 创建检索Repository

FileMetadataRepository.java接口中添加方法:

``` import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.List; public interface FileMetadataRepository extends JpaRepository { // 按分类查找 List findByCategory(String category); // 按标签查找(PostgreSQL数组操作符) @Query(value = "SELECT FROM file_metadata WHERE tags @> ARRAY[:tag]::varchar[]", nativeQuery = true) List findByTag(@Param("tag") String tag); // 按文件名模糊搜索 List findByOriginalNameContainingIgnoreCase(String keyword); } ```

6.2 添加检索API

在Controller中添加:

``` @GetMapping("/search") public List searchFiles( @RequestParam(value = "category", required = false) String category, @RequestParam(value = "tag", required = false) String tag, @RequestParam(value = "keyword", required = false) String keyword) { if (category != null) { return fileMetadataRepository.findByCategory(category); } else if (tag != null) { return fileMetadataRepository.findByTag(tag); } else if (keyword != null) { return fileMetadataRepository.findByOriginalNameContainingIgnoreCase(keyword); } else { return fileMetadataRepository.findAll(PageRequest.of(0, 50)).getContent(); } } ```

至此,一个具备文件上传、存储、分类、标签和基础检索功能的商场数字档案馆核心系统已部署完成。通过访问服务器IP,即可使用测试页面上传文件,并通过/api/archive/search接口进行检索。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统