数字档案馆系统开发部署与全流程监督实操手册

一、开发环境准备与依赖引入

本指南基于Spring Boot 2.7.x构建,使用MySQL 8.0作为数据存储,利用AOP实现全流程操作监督。首先确保服务器已安装JDK 11及Maven 3.6+。若未安装,执行以下命令:

```bash Ubuntu/Debian 安装 JDK 11 sudo apt-get update && sudo apt-get install -y openjdk-11-jdk 安装 Maven wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz sudo tar -xf apache-maven-3.6.3-bin.tar.gz -C /opt/ export PATH=/opt/apache-maven-3.6.3/bin:$PATH ```

创建Maven项目,在`pom.xml`中引入核心依赖,无需多余配置,直接复制以下内容覆盖原有依赖:

```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-aop org.projectlombok lombok true com.alibaba fastjson 1.2.83 ```

二、数据库表结构设计

数字档案馆的核心在于档案数据的存储与操作留痕。我们需要建立两张表:`t_archive`(档案信息表)和`t_sys_log`(系统监督日志表)。在MySQL客户端执行以下SQL脚本完成建表:

```sql CREATE DATABASE IF NOT EXISTS digital_archive_db DEFAULT CHARSET utf8mb4; USE digital_archive_db; -- 档案主表 CREATE TABLE t_archive ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', archive_no VARCHAR(64) NOT NULL UNIQUE COMMENT '档案编号', title VARCHAR(255) NOT NULL COMMENT '档案标题', content TEXT COMMENT '档案内容摘要', status TINYINT DEFAULT 0 COMMENT '状态:0-归档,1-借出,2-销毁', creator VARCHAR(50) COMMENT '创建人', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_archive_no (archive_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字档案主表'; -- 监督日志表 CREATE TABLE t_sys_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID', username VARCHAR(50) NOT NULL COMMENT '操作人', module VARCHAR(50) COMMENT '操作模块', operation VARCHAR(50) COMMENT '操作动作', method_desc VARCHAR(255) COMMENT '方法描述', params TEXT COMMENT '请求参数', ip_address VARCHAR(50) COMMENT 'IP地址', execute_time BIGINT COMMENT '执行时长(毫秒)', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统操作监督日志'; ```

三、核心业务代码与监督机制实现

为了实现零侵入式的监督,我们将使用Spring AOP技术。首先定义实体类、切面注解及切面逻辑。

1. 实体类定义

创建`entity`包,分别定义档案实体和日志实体。

```java // Archive.java package com.example.demo.entity; import javax.persistence.; import lombok.Data; import java.util.Date; @Entity @Table(name = "t_archive") @Data public class Archive { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String archiveNo; private String title; @Lob private String content; private Integer status; private String creator; private Date createTime; } // SysLog.java package com.example.demo.entity; import javax.persistence.; import lombok.Data; import java.util.Date; @Entity @Table(name = "t_sys_log") @Data public class SysLog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String module; private String operation; private String methodDesc; private String params; private String ipAddress; private Long executeTime; private Date createTime; } ```

2. 自定义监督注解

创建`annotation`包,定义`@LogMonitor`注解,用于标记需要被监督的方法。

```java package com.example.demo.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LogMonitor { String module() default ""; String operation() default ""; String desc() default ""; } ```

3. AOP切面实现(核心监督逻辑)

创建`aspect`包,编写`LogAspect`类。该类将拦截带有`@LogMonitor`注解的方法,自动记录操作人、参数、耗时等信息并存入数据库。

```java package com.example.demo.aspect; import com.alibaba.fastjson.JSON; import com.example.demo.annotation.LogMonitor; import com.example.demo.entity.SysLog; import com.example.demo.repository.SysLogRepository; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.lang.reflect.Method; @Aspect @Component public class LogAspect { @Autowired private SysLogRepository sysLogRepository; // 定义切点,拦截所有带LogMonitor注解的方法 @Pointcut("@annotation(com.example.demo.annotation.LogMonitor)") public void logPointCut() {} @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); // 执行方法 Object result = point.proceed(); // 计算耗时 long time = System.currentTimeMillis() - beginTime; // 保存日志 saveLog(point, time); return result; } private void saveLog(ProceedingJoinPoint joinPoint, long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogMonitor logMonitor = method.getAnnotation(LogMonitor.class); SysLog sysLog = new SysLog(); if (logMonitor != null) { sysLog.setModule(logMonitor.module()); sysLog.setOperation(logMonitor.operation()); sysLog.setMethodDesc(logMonitor.desc()); } // 获取请求参数(简化处理,实际生产需过滤敏感字段) Object[] args = joinPoint.getArgs(); String params = JSON.toJSONString(args); sysLog.setParams(params.length() > 2000 ? params.substring(0, 2000) : params); // 模拟获取当前用户(实际应从SecurityContext获取) sysLog.setUsername("ADMIN"); sysLog.setIpAddress("127.0.0.1"); sysLog.setExecuteTime(time); sysLogRepository.save(sysLog); } } ```

4. 业务层与控制层实现

创建Repository、Service和Controller。在Service方法上应用`@LogMonitor`注解以触发监督。

```java // ArchiveRepository.java package com.example.demo.repository; import com.example.demo.entity.Archive; import org.springframework.data.jpa.repository.JpaRepository; public interface ArchiveRepository extends JpaRepository {} // SysLogRepository.java package com.example.demo.repository; import com.example.demo.entity.SysLog; import org.springframework.data.jpa.repository.JpaRepository; public interface SysLogRepository extends JpaRepository {} // ArchiveService.java package com.example.demo.service; import com.example.demo.annotation.LogMonitor; import com.example.demo.entity.Archive; import com.example.demo.repository.ArchiveRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ArchiveService { @Autowired private ArchiveRepository archiveRepository; @LogMonitor(module = "档案管理", operation = "新增档案", desc = "录入新的数字档案") public Archive saveArchive(Archive archive) { return archiveRepository.save(archive); } @LogMonitor(module = "档案管理", operation = "删除档案", desc = "物理删除指定ID档案") public void deleteArchive(Long id) { archiveRepository.deleteById(id); } } // ArchiveController.java package com.example.demo.controller; import com.example.demo.entity.Archive; import com.example.demo.service.ArchiveService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.; @RestController @RequestMapping("/api/archive") public class ArchiveController { @Autowired private ArchiveService archiveService; @PostMapping public Archive add(@RequestBody Archive archive) { return archiveService.saveArchive(archive); } @DeleteMapping("/{id}") public void delete(@PathVariable Long id) { archiveService.deleteArchive(id); } } ```

四、系统配置与Docker容器化部署

1. 应用配置文件

在`src/main/resources`下创建或修改`application.yml`,确保连接信息准确:

```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://mysql-server:3306/digital_archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Root@123 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ```

2. Dockerfile编写

数字档案馆系统开发部署与全流程监督实操手册

在项目根目录创建`Dockerfile`,用于构建镜像:

```dockerfile FROM maven:3.6.3-jdk-11 AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests FROM openjdk:11-jre-slim WORKDIR /app COPY --from=build /app/target/.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"] ```

3. Docker Compose编排

在项目根目录创建`Docker Compose`,一键启动应用和数据库:

```yaml version: '3.8' services: mysql-server: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: Root@123 MYSQL_DATABASE: digital_archive_db ports: - "3306:3306" volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql archive-app: build: . ports: - "8080:8080" depends_on: - mysql-server ```

五、系统启动与功能验证

执行以下命令完成整个系统的启动与验证。

1. 初始化数据库脚本

将步骤二中的SQL脚本保存为项目根目录下的`init.sql`,确保Docker启动MySQL时自动执行建表。

2. 构建并并启动服务

在项目根目录下执行:

```bash docker-compose up -d --build ```

3. 功能测试与日志验证

使用curl命令模拟新增档案操作:

```bash curl -X POST http://localhost:8080/api/archive \ -H "Content-Type: application/json" \ -d '{ "archiveNo": "ARC20231001001", "title": "2023年度重点项目验收报告", "content": "项目验收通过,资金已结算...", "creator": "张三" }' ```

操作成功后,查看数据库`t_sys_log`表。如果配置无误,你将看到一条新增的记录,详细记录了操作人"ADMIN"、操作模块"档案管理"、操作动作"新增档案"以及传入的JSON参数和执行耗时。至此,数字档案馆系统及其核心监督机制已完全落地。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统