土地证档案管理系统:从零到一搭建实操技术指南
系统架构与技术选型
土地证档案管理系统需要处理大量结构化数据,同时保证数据安全性和查询效率。我们采用以下技术栈:
- 后端:Spring Boot 2.7.18 + MyBatis Plus 3.5.4
- 数据库:MySQL 8.0.33
- 前端:Vue 3.3.4 + Element Plus 2.3.8
- 文件存储:MinIO 2023.11.1
- 全文检索:Elasticsearch 8.11.1
环境准备
安装JDK 17:
``` wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz tar -xzf jdk-17_linux-x64_bin.tar.gz sudo mv jdk-17.0.9 /usr/local/ echo 'export JAVA_HOME=/usr/local/jdk-17.0.9' >> ~/.bashrc echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc ```安装MySQL 8.0:
``` sudo apt update sudo apt install mysql-server -y sudo mysql_secure_installation ```数据库设计与初始化
核心表结构
创建数据库和用户:
``` CREATE DATABASE land_cert_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'land_admin'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON land_cert_db. TO 'land_admin'@'%'; FLUSH PRIVILEGES; ```创建土地证主表:
``` CREATE TABLE land_certificate ( id BIGINT PRIMARY KEY AUTO_INCREMENT, certificate_no VARCHAR(50) UNIQUE NOT NULL COMMENT '证书编号', land_location VARCHAR(200) NOT NULL COMMENT '土地位置', land_area DECIMAL(15,2) NOT NULL COMMENT '土地面积(平方米)', land_use_type VARCHAR(20) NOT NULL COMMENT '土地用途', owner_name VARCHAR(100) NOT NULL COMMENT '权利人', certificate_date DATE NOT NULL COMMENT '发证日期', valid_years INT COMMENT '使用年限', status TINYINT DEFAULT 1 COMMENT '状态:1-有效 0-注销', archive_path VARCHAR(500) COMMENT '档案存储路径', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_certificate_no (certificate_no), INDEX idx_owner_name (owner_name), INDEX idx_location (land_location) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```创建档案附件表:
``` CREATE TABLE archive_attachment ( id BIGINT PRIMARY KEY AUTO_INCREMENT, certificate_id BIGINT NOT NULL, file_name VARCHAR(255) NOT NULL, file_type VARCHAR(50) NOT NULL, file_size BIGINT NOT NULL, storage_path VARCHAR(500) NOT NULL, upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (certificate_id) REFERENCES land_certificate(id) ON DELETE CASCADE, INDEX idx_certificate_id (certificate_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```后端服务搭建
项目初始化
使用Spring Initializr创建项目:
``` curl https://start.spring.io/starter.zip \ -d type=maven-project \ -d language=java \ -d bootVersion=2.7.18 \ -d baseDir=land-cert-backend \ -d groupId=com.land.cert \ -d artifactId=land-cert-system \ -d name=land-cert-system \ -d description="土地证档案管理系统" \ -d packageName=com.land.cert \ -d packaging=jar \ -d javaVersion=17 \ -d dependencies=web,data-jpa,mysql,mybatis,lombok \ -o land-cert-backend.zip unzip land-cert-backend.zip ```在pom.xml中添加依赖:
```配置文件
application.yml完整配置:
``` server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/land_cert_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: land_admin password: StrongPass123! driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 100MB max-request-size: 100MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 minio: endpoint: http://localhost:9000 accessKey: minioadmin secretKey: minioadmin bucketName: land-cert-files ```实体类定义
LandCertificate.java:
``` @Data @TableName("land_certificate") public class LandCertificate { @TableId(type = IdType.AUTO) private Long id; private String certificateNo; private String landLocation; private BigDecimal landArea; private String landUseType; private String ownerName; @JsonFormat(pattern = "yyyy-MM-dd") private Date certificateDate; private Integer validYears; private Integer status; private String archivePath; @TableField(fill = FieldFill.INSERT) private Date createdAt; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updatedAt; @TableField(exist = false) 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(); } } ```文件上传服务实现:
``` @Service public class FileStorageService { @Autowired private MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; public String uploadFile(MultipartFile file) throws Exception { String fileName = UUID.randomUUID().toString() + file.getOriginalFilename().substring( file.getOriginalFilename().lastIndexOf(".")); // 确保存储桶存在 boolean found = minioClient.bucketExists( BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { minioClient.makeBucket( MakeBucketArgs.builder().bucket(bucketName).build()); } // 上传文件 minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); return fileName; } public InputStream downloadFile(String fileName) throws Exception { return minioClient.getObject( GetObjectArgs.builder() .bucket(bucketName) .object(fileName) .build()); } } ```前端界面开发
Vue项目初始化
创建Vue项目:
``` npm create vue@latest land-cert-frontend cd land-cert-frontend npm install npm install element-plus axios ```配置Element Plus:
``` // main.js import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('app') ```土地证列表组件
LandCertificateList.vue:
```文件上传组件
FileUpload.vue:
```
支持PDF、JPG、PNG格式,单个文件不超过100MB
部署与配置
MinIO安装配置
安装MinIO:
``` wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio sudo mv minio /usr/local/bin/ ```
创建启动脚本:
``` !/bin/bash export MINIO_ROOT_USER=minioadmin export MINIO_ROOT_PASSWORD=minioadmin nohup minio server /data/minio --console-address ":9001" > /var/log/minio.log 2>&1 & ```启动MinIO:
``` chmod +x start-minio.sh ./start-minio.sh ```访问MinIO控制台:http://localhost:9001,使用minioadmin/minioadmin登录。
Nginx反向代理配置
安装Nginx:
``` sudo apt install nginx -y ```配置反向代理:
``` server { listen 80; server_name land-cert.example.com; location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { proxy_pass http://localhost:5173/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```重启Nginx:
``` sudo systemctl restart nginx ```系统启动
启动后端服务:
``` cd land-cert-backend mvn clean package java -jar target/land-cert-system-0.0.1-SNAPSHOT.jar ```启动前端服务:
``` cd land-cert-frontend npm run dev ```数据迁移与备份
数据库备份脚本
backup.sh:
``` !/bin/bash BACKUP_DIR="/backup/land_cert" DATE=$(date +%Y%m%d_%H%M%S) DB_NAME="land_cert_db" mkdir -p $BACKUP_DIR 备份数据库 mysqldump -u land_admin -pStrongPass123! $DB_NAME > \ $BACKUP_DIR/${DB_NAME}_${DATE}.sql 压缩备份文件 gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql 保留最近30天的备份 find $BACKUP_DIR -name ".sql.gz" -mtime +30 -delete ```设置定时任务:
``` crontab -e 每天凌晨2点执行备份 0 2 /path/to/backup.sh ```文件存储备份
MinIO数据备份:
``` !/bin/bash BACKUP_DIR="/backup/minio" DATE=$(date +%Y%m%d) mkdir -p $BACKUP_DIR/$DATE 使用mc命令同步数据 mc mirror --overwrite minio/land-cert-files $BACKUP_DIR/$DATE/ ```常见问题解决
文件上传失败
检查MinIO服务状态:
``` ps aux | grep minio netstat -tlnp | grep 9000 ```检查存储桶权限:
``` mc policy set public minio/land-cert-files ```数据库连接失败
检查MySQL服务状态:
``` sudo systemctl status mysql ```检查用户权限:
``` mysql -u land_admin -pStrongPass123! -e "SHOW GRANTS;" ```前端跨域问题
在后端添加CORS配置:
``` @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/") .allowedOrigins("http://localhost:5173") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("") .allowCredentials(true) .maxAge(3600); } } ```按照以上步骤操作,即可完成土地证档案管理系统的搭建。系统具备完整的增删改查功能、文件上传管理、数据备份等核心功能,可直接用于生产环境。