土地证档案管理系统:从零到一搭建实操技术指南

系统架构与技术选型

土地证档案管理系统需要处理大量结构化数据,同时保证数据安全性和查询效率。我们采用以下技术栈:

  • 后端: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中添加依赖:

``` com.baomidou mybatis-plus-boot-starter 3.5.4 io.minio minio 8.5.4 ```

配置文件

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 attachments; } ```

文件上传服务

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:

``` ```

部署与配置

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); } } ```

按照以上步骤操作,即可完成土地证档案管理系统的搭建。系统具备完整的增删改查功能、文件上传管理、数据备份等核心功能,可直接用于生产环境。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统