在开始构建银行级档案管理系统之前,必须确保服务器环境满足安全与性能标准。本指南基于CentOS 7.9环境,采用Java后端与Vue前端分离的架构进行实操演示。
1. 安装JDK 11环境
银行系统通常要求长期支持版本,JDK 11是当前的首选。执行以下命令进行安装:
yum install -y java-11-openjdk java-11-openjdk-devel
安装完成后,验证版本:
java -version
2. 安装Node.js 16.x与MySQL 8.0
前端构建需要Node环境,数据存储选用MySQL 8.0以支持更好的字符集和事务性能。
curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
yum install -y nodejs mysql-server
启动MySQL服务并设置开机自启:
systemctl start mysqld
systemctl enable mysqld
获取MySQL临时root password并进行初始化安全设置:
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
银行版档案管理的核心在于分级分类与审计追踪。登录MySQL创建专用数据库和表结构。
1. 创建数据库与用户
CREATE DATABASE bank_archive_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'archive_admin'@'%' IDENTIFIED BY 'Strong@Pass2024!';
GRANT ALL PRIVILEGES ON bank_archive_db. TO 'archive_admin'@'%';
FLUSH PRIVILEGES;
2. 核心表结构设计
执行以下SQL脚本建立档案主表和审计日志表。注意档案表必须包含密级字段。
USE bank_archive_db;
-- 档案主表
CREATE TABLE t_sys_archive (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
archive_no VARCHAR(64) NOT NULL COMMENT '档案编号,唯一索引',
title VARCHAR(255) NOT NULL COMMENT '档案标题',
file_path VARCHAR(512) NOT NULL COMMENT '文件存储物理路径',
file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
file_hash VARCHAR(64) DEFAULT NULL COMMENT '文件SHA256指纹',
secret_level TINYINT NOT NULL DEFAULT 1 COMMENT '密级:1-公开,2-内部,3-机密,4-绝密',
dept_code VARCHAR(32) NOT NULL COMMENT '归属部门代码',
uploader VARCHAR(64) NOT NULL COMMENT '上传人',
upload_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
is_deleted TINYINT DEFAULT 0 COMMENT '逻辑删除标识',
UNIQUE KEY uk_archive_no (archive_no),
KEY idx_dept_secret (dept_code, secret_level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='银行档案主表';
-- 审计日志表
CREATE TABLE t_sys_audit_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
archive_id BIGINT NOT NULL COMMENT '关联档案ID',
operator VARCHAR(64) NOT NULL COMMENT '操作人',
action_type VARCHAR(32) NOT NULL COMMENT '操作类型:UPLOAD/DOWNLOAD/VIEW/DELETE',
client_ip VARCHAR(64) NOT NULL COMMENT '客户端IP',
action_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
result_desc VARCHAR(255) COMMENT '结果描述',
KEY idx_archive_id (archive_id),
KEY idx_operator (operator)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作审计日志';
使用Spring Boot 2.7.x作为后端框架,集成MyBatis Plus进行持久化操作。
1. Maven依赖配置 (pom.xml)
在节点中添加以下必要依赖,确保包含文件上传和数据库驱动。

org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.5.2
mysql
mysql-connector-java
runtime
org.apache.commons
commons-lang3
commons-codec
commons-codec
2. 核心配置文件
配置文件上传大小限制(银行扫描件通常较大)和数据库连接信息。
server.port=8088
spring.servlet.multipart.max-file-size=200MB
spring.servlet.multipart.max-request-size=500MB
spring.datasource.url=jdbc:mysql://localhost:3306/bank_archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=archive_admin
spring.datasource.password=Strong@Pass2024!
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
3. 文件上传与安全校验逻辑
创建ArchiveController.java,实现文件上传、指纹计算和审计记录插入。这是系统的核心入口。
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@Autowired
private ArchiveService archiveService;
@Value("${file.upload.path:/data/bank_archives/}")
private String uploadPath;
@PostMapping("/upload")
public ResultVO uploadArchive(@RequestParam("file") MultipartFile file,
@RequestParam("secretLevel") Integer secretLevel,
HttpServletRequest request) {
// 1. 校验文件类型
String originalFilename = file.getOriginalFilename();
if (!originalFilename.toLowerCase().endsWith(".pdf") &&
!originalFilename.toLowerCase().endsWith(".ofd")) {
return ResultVO.fail("仅支持PDF或OFD格式文件");
}
try {
// 2. 创建存储目录
File destDir = new File(uploadPath);
if (!destDir.exists()) destDir.mkdirs();
// 3. 计算文件Hash (防篡改)
String fileHash = DigestUtils.sha256Hex(file.getInputStream());
String newFileName = System.currentTimeMillis() + "_" + fileHash.substring(0, 8) + ".pdf";
File destFile = new File(destDir, newFileName);
file.transferTo(destFile);
// 4. 构建数据库实体
ArchiveEntity entity = new ArchiveEntity();
entity.setArchiveNo(generateArchiveNo());
entity.setTitle(originalFilename);
entity.setFilePath(destFile.getAbsolutePath());
entity.setFileSize(file.getSize());
entity.setFileHash(fileHash);
entity.setSecretLevel(secretLevel);
entity.setUploader(getCurrentUser(request)); // 假设有获取当前用户方法
entity.setDeptCode(getCurrentUserDept(request));
// 5. 保存数据
archiveService.save(entity);
// 6. 记录审计日志
archiveService.saveLog(entity.getId(), getCurrentUser(request), "UPLOAD", getIpAddr(request));
return ResultVO.success("上传成功", entity.getArchiveNo());
} catch (IOException e) {
return ResultVO.fail("文件写入失败: " + e.getMessage());
}
}
// 辅助方法省略...
}
前端使用Vue 3配合Element Plus组件库,重点实现大文件上传进度条和密级选择。
1. 安装依赖
npm install element-plus axios
2. 上传组件实现
在src/views/ArchiveUpload.vue中编写代码。注意在请求头中携带Token。
银行档案上传
拖拽文件到此处或 点击上传
仅支持 PDF/OFD 文件,且不超过 200MB
开始上传
银行系统对安全有极高的要求,必须配置文件访问控制和操作审计。
1. 配置Spring Security进行接口鉴权
在SecurityConfig.java中,确保除了登录接口外,所有API都需要认证。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/login").permitAll()
.antMatchers("/api/archive/").authenticated() // 档案接口需登录
.anyRequest().denyAll()
.and()
.addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
2. 实现下载接口的权限校验
下载文件时,必须先检查用户是否有权限访问该密级的档案。以下代码展示了基于角色的简单权限检查逻辑。
@GetMapping("/download/{id}")
public void downloadArchive(@PathVariable Long id, HttpServletResponse response, HttpServletRequest request) {
ArchiveEntity entity = archiveService.getById(id);
if (entity == null) {
throw new RuntimeException("档案不存在");
}
String currentUser = getCurrentUser(request);
Integer userMaxLevel = getUserMaxSecretLevel(currentUser); // 获取用户最高可见密级
// 权限校验:用户密级必须大于等于档案密级
if (userMaxLevel < entity.getSecretLevel()) {
archiveService.saveLog(id, currentUser, "DOWNLOAD_DENIED", getIpAddr(request));
throw new RuntimeException("权限不足:无法下载该密级档案");
}
File file = new File(entity.getFilePath());
if (!file.exists()) {
throw new RuntimeException("物理文件丢失");
}
// 记录成功下载日志
archiveService.saveLog(id, currentUser, "DOWNLOAD", getIpAddr(request));
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + entity.getTitle());
try (FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("下载流异常");
}
}
3. 数据备份策略
编写一个简单的Shell脚本用于每日增量备份,并将其加入crontab。这对于银行数据是强制性操作。
!/bin/bash
/usr/local/bin/backup_archive.sh
DATE=$(date +%Y%m%d)
MYSQL_USER="archive_admin"
MYSQL_PASS="Strong@Pass2024!"
DB_NAME="bank_archive_db"
BACKUP_DIR="/backup/mysql"
mkdir -p $BACKUP_DIR
mysqldump -u$MYSQL_USER -p$MYSQL_PASS $DB_NAME | gzip > $BACKUP_DIR/archive_$DATE.sql.gz
删除7天前的备份
find $BACKUP_DIR -name "archive_.sql.gz" -mtime +7 -exec rm -f {} \;
设置定时任务:
crontab -e
添加如下行,每天凌晨2点执行
0 2 /usr/local/bin/backup_archive.sh