系统架构与核心技术选型
本系统采用B/S架构,前端使用Vue.js,后端使用Spring Boot,数据库选用MySQL,文件存储使用MinIO。水印功能基于OpenCV和iText库实现。
环境准备与依赖安装
首先确保服务器已安装Java 11、Node.js 14+和MySQL 8.0。
安装MinIO对象存储:
```
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data --console-address ":9001"
```
访问 http://你的服务器IP:9001,使用默认账号密码(minioadmin/minioadmin)登录,创建名为archives的存储桶。
数据库设计与初始化
创建数据库和数据表:
```
CREATE DATABASE archive_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE archive_db;
CREATE TABLE archive_file (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
file_name VARCHAR(255) NOT NULL,
original_name VARCHAR(255) NOT NULL,
file_path VARCHAR(500) NOT NULL,
file_size BIGINT NOT NULL,
upload_time DATETIME DEFAULT CURRENT_TIMESTAMP,
upload_user_id BIGINT NOT NULL,
watermark_text VARCHAR(100),
watermark_position VARCHAR(20) DEFAULT 'bottom-right',
trace_code VARCHAR(64) UNIQUE NOT NULL
);
CREATE TABLE access_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
trace_code VARCHAR(64) NOT NULL,
access_time DATETIME DEFAULT CURRENT_TIMESTAMP,
access_user_id BIGINT NOT NULL,
access_ip VARCHAR(45) NOT NULL,
operation_type VARCHAR(20) NOT NULL,
FOREIGN KEY (trace_code) REFERENCES archive_file(trace_code)
);
```
后端服务实现
项目初始化与依赖配置
创建Spring Boot项目,在pom.xml中添加关键依赖:
```
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
io.minio
minio
8.5.2
org.opencv
opencv
4.5.5
com.itextpdf
itextpdf
5.5.13.3
```
MinIO配置类
创建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();
}
}
```
在application.yml中配置:
```
minio:
endpoint: http://127.0.0.1:9000
accessKey: minioadmin
secretKey: minioadmin
bucket: archives
```
水印服务实现

创建水印处理服务,支持图片和PDF文件:
```
@Service
public class WatermarkService {
public File addImageWatermark(MultipartFile file, String watermarkText,
String position) throws IOException {
// 加载OpenCV库
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat image = Imgcodecs.imread(convertMultipartToFile(file).getPath());
Scalar color = new Scalar(255, 255, 255);
Point textPosition = getPosition(position, image);
// 添加文字水印
Imgproc.putText(image, watermarkText, textPosition,
Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, color, 2);
// 生成追溯码
String traceCode = generateTraceCode();
// 保存带水印的文件
String outputPath = "watermarked_" + file.getOriginalFilename();
Imgcodecs.imwrite(outputPath, image);
return new File(outputPath);
}
private String generateTraceCode() {
return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
}
}
```
文件上传控制器
实现文件上传接口,自动添加水印:
```
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@PostMapping("/upload")
public ResponseEntity