最新档案管理政策(如DA/T 22-2019《归档文件整理规则》)对元数据的完整性提出了严格要求。为了确保系统底层数据结构符合标准,我们需要设计一套包含全宗号、保管期限、密级等核心字段的数据库表。以下以MySQL为例,提供可直接执行的建表语句。
请在数据库客户端中执行以下SQL命令,创建符合标准的档案主表:
CREATE TABLE `archives_main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`archive_code` varchar(50) NOT NULL COMMENT '档号(唯一标识,符合档号编制规则)',
`fond_code` varchar(20) NOT NULL COMMENT '全宗号',
`category_code` varchar(10) NOT NULL COMMENT '门类代码:WS-文书,KJ-会计,TP-图片',
`retention_period` varchar(10) NOT NULL COMMENT '保管期限:Y-永久,D30-30年,D10-10年',
`security_level` varchar(10) DEFAULT '公开' COMMENT '密级:公开, 内部, 秘密, 机密, 绝密',
`file_title` varchar(255) NOT NULL COMMENT '题文件名',
`file_size` bigint(20) DEFAULT '0' COMMENT '文件大小(字节)',
`file_hash` varchar(64) DEFAULT NULL COMMENT 'SHA-256哈希值(用于电子档案真实性校验)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '归档日期',
`creator` varchar(50) NOT NULL COMMENT '归档人',
`is_deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_archive_code` (`archive_code`),
KEY `idx_fond_category` (`fond_code`, `category_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='符合最新政策的档案主表';
关键配置说明:
1. file_hash字段:政策要求必须保障电子档案“真实性”,通过SHA-256存储哈希值是技术落地的核心。
2. retention_period枚举值:严格对应国家档案局关于保管期限的最新分类标准。
3. 逻辑删除:档案管理严禁物理删除数据,必须使用is_deleted标记,确保审计追踪。
政策要求归档文件必须具备完整的元数据。为了防止用户录入不合规数据,我们需要在应用层(以Python为例)编写一个强校验脚本。请确保你的环境已安装Python 3.8+,并执行pip install python-dateutil安装依赖库。
创建名为archive_validator.py的文件,并写入以下完整代码:
import re
from datetime import datetime
class ArchiveValidator:
定义符合政策的保管期限枚举
VALID_PERIODS = ['Y', 'D30', 'D10']
定义符合政策的门类代码
VALID_CATEGORIES = ['WS', 'KJ', 'TP', 'KY', 'SW']
定义符合政策的密级
VALID_SECURITY = ['公开', '内部', '秘密', '机密', '绝密']
def validate_metadata(self, data):
"""
对归档元数据进行全量校验
:param data: dict, 包含档案元数据的字典
:return: tuple (bool, str), (是否通过, 错误信息)
"""
1. 校验档号格式 (示例:全宗号-门类代码-年度-件号)
if 'archive_code' not in data or not data['archive_code']:
return False, "档号不能为空"
pattern = r'^\d{4}-[A-Z]{2}-\d{4}-\d{4}$'
if not re.match(pattern, data['archive_code']):
return False, f"档号格式不符合规则,应为:全宗号-门类代码-年度-件号,当前值:{data['archive_code']}"
2. 校验保管期限
if data.get('retention_period') not in self.VALID_PERIODS:
return False, f"保管期限不合规,必须是:{', '.join(self.VALID_PERIODS)}"
3. 校验门类代码
if data.get('category_code') not in self.VALID_CATEGORIES:
return False, f"门类代码不合规,必须是:{', '.join(self.VALID_CATEGORIES)}"
4. 校验题名长度(政策通常要求题名简明扼要但不宜过短)
if len(data.get('file_title', '')) < 5:
return False, "题名过短,无法准确描述档案内容"
5. 校验归档日期格式
try:
if 'create_time' in data:
datetime.strptime(data['create_time'], '%Y-%m-%d %H:%M:%S')
except ValueError:
return False, "归档日期格式错误,必须为 YYYY-MM-DD HH:MM:SS"
return True, "校验通过"
测试用例(实际使用时请删除或注释)
if __name__ == "__main__":
validator = ArchiveValidator()
test_data = {
"archive_code": "0001-WS-2023-0001",
"retention_period": "Y",
"category_code": "WS",
"file_title": "2023年度公司数字化转型建设方案",
"create" : "2023-10-01 10:00:00"
}
result, msg = validator.validate_metadata(test_data)
print(f"校验结果: {result}, 信息: {msg}")
操作指引:
在开发框架中(如Django或Flask),在接收POST请求的Controller中直接实例化ArchiveValidator并调用validate_metadata方法。如果返回False,直接拦截请求并返回错误信息,确保不合规数据无法进入数据库。
根据最新政策,电子档案在归档前必须通过“四性检测”(真实性、完整性、可用性、安全性)。这不仅是政策要求,更是技术合规的底线。以下脚本通过计算文件哈希值校验真实性,通过文件头魔数校验可用性。

创建名为four_property_check.py的文件,复制以下代码:
import os
import hashlib
import struct
class FourPropertyChecker:
def __init__(self, file_path):
self.file_path = file_path
def check_authenticity(self, expected_hash):
"""
检测真实性:比对SHA-256哈希值
"""
if not os.path.exists(self.file_path):
return False, "文件不存在"
sha256 = hashlib.sha256()
try:
with open(self.file_path, 'rb') as f:
while chunk := f.read(8192):
sha256.update(chunk)
except IOError as e:
return False, f"文件读取失败: {str(e)}"
current_hash = sha256.hexdigest()
if current_hash.lower() == expected_hash.lower():
return True, "真实性校验通过"
else:
return False, f"真实性校验失败,哈希不匹配。预期:{expected_hash},实际:{current_hash}"
def check_usability(self):
"""
检测可用性:通过文件头魔数简单判断文件是否损坏
这里以PDF和PNG为例进行演示
"""
if not os.path.exists(self.file_path):
return False, "文件不存在"
try:
with open(self.file_path, 'rb') as f:
header_bytes = f.read(8)
if not header_bytes:
return False, "文件内容为空"
PDF魔数: 25 50 44 46 (%PDF)
if header_bytes.startswith(b'%PDF'):
return True, "可用性校验通过 (PDF)"
PNG魔数: 89 50 4E 47 0D 0A 1A 0A
if header_bytes == b'\x89PNG\r\n\x1a\n':
return True, "可用性校验通过 (PNG)"
简单的JPEG魔数检查
if header_bytes.startswith(b'\xff\xd8\xff'):
return True, "可用性校验通过 (JPEG)"
return False, "未知的文件格式或文件头已损坏"
except Exception as e:
return False, f"可用性检测异常: {str(e)}"
def check_integrity(self, expected_size):
"""
检测完整性:校验文件大小
"""
actual_size = os.path.getsize(self.file_path)
if int(actual_size) == int(expected_size):
return True, "完整性校验通过"
else:
return False, f"完整性校验失败,大小不匹配。预期:{expected_size},实际:{actual_size}"
执行示例
if __name__ == "__main__":
请确保当前目录下存在一个名为 test.pdf 的文件用于测试
checker = FourPropertyChecker("test.pdf")
模拟数据
is_ok, msg = checker.check_integrity(12345) 替换为实际大小
print(f"完整性: {is_ok}, {msg}")
注意:真实性需要预先知道正确的哈希值,此处仅演示调用
is_ok, msg = checker.check_authenticity("correct_hash_value...")
集成步骤:
在文件上传接口中,文件保存成功后,立即调用此脚本。
1. 完整性:将前端上传的Content-Length与服务器磁盘文件大小比对。
2. 真实性:首次归档时计算哈希值存入数据库,后续每次读取时重新计算比对。
3. 可用性:如果脚本返回“未知格式”或“损坏”,应立即标记文件状态为“不可用”并报警。
最新网络安全法及档案管理规定明确要求实行“三员管理”(系统管理员、安全保密员、安全审计员)。我们不能仅仅依靠口头约定,必须在配置文件中硬编码角色权限,并记录所有敏感操作。
创建配置文件role_config.json,定义不可篡改的权限矩阵:
{
"role_definitions": {
"SYSTEM_ADMIN": {
"description": "系统管理员:负责系统维护,但禁止操作档案数据",
"permissions": [
"system.config",
"user.manage"
],
"denied_permissions": [
"archive.delete",
"archive.modify",
"log.delete"
]
},
"SECURITY_AUDITOR": {
"description": "安全审计员:仅负责查看日志,无权修改数据",
"permissions": [
"log.view",
"audit.report"
],
"denied_permissions": [
"archive.view",
"system.config",
"user.manage"
]
},
"ARCHIVE_USER": {
"description": "普通档案员:负责档案归档与利用",
"permissions": [
"archive.upload",
"archive.view",
"archive.download"
],
"denied_permissions": [
"system.shutdown",
"user.delete"
]
}
}
}
接下来,实现一个简单的审计日志记录类audit_logger.py,确保满足“任何操作可追溯”的政策要求:
import json
import time
from datetime import datetime
class AuditLogger:
def __init__(self, log_file_path="audit.log"):
self.log_file_path = log_file_path
def log_sensitive_action(self, user_id, role, action, resource_id, result):
"""
记录敏感操作日志
:param user_id: 操作用户ID
:param role: 用户角色
:param action: 操作动作 (如 'DELETE_ARCHIVE', 'MODIFY_METADATA')
:param resource_id: 操作的资源ID
:param result: 操作结果 ('SUCCESS' 或 'FAILURE')
"""
log_entry = {
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user_id": user_id,
"role": role,
"action": action,
"resource_id": resource_id,
"result": result,
"ip": "127.0.0.1" 实际部署时应从Request Context中获取真实IP
}
将日志写入文件,实际生产环境建议写入ELK或专用审计数据库
try:
with open(self.log_file_path, 'a', encoding='utf-8') as f:
f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")
except Exception as e:
print(f"日志写入失败:{str(e)}")
使用示例
if __name__ == "__main__":
logger = AuditLogger()
模拟记录一次删除操作
logger.log_sensitive_action(
user_id="user_001",
role="SYSTEM_ADMIN",
action="ATTEMPT_DELETE_ARCHIVE",
resource_id="archive_12345",
result="FAILURE" 因为我们在配置中禁止了SYSTEM_ADMIN删除档案
)
print("审计日志已生成,请查看 audit.log 文件")
落地执行要点:
1. 权限拦截:在代码中,任何涉及archive.delete的操作前,必须检查当前用户角色是否在denied_permissions列表中。
2. 日志防篡改:生成的audit.log文件应设置操作系统权限,仅允许SECURITY_AUDITOR角色对应的系统账号读取,禁止任何人修改。
3. 定期备份:配置Crontab任务,每天凌晨将审计日志打包备份到异地服务器,确保日志留存时间符合政策(通常要求不少于6个月)。
为了确保上述所有技术点能够快速落地,提供一个Linux环境下的初始化脚本deploy.sh。该脚本将自动检查Python环境、安装依赖并初始化日志文件。
!/bin/bash
echo "开始部署符合最新政策的档案管理系统环境..."
1. 检查Python版本
echo "检查Python环境..."
python3 --version
if [ $? -ne 0 ]; then
echo "错误:未安装Python3,请先安装Python 3.8+"
exit 1
fi
2. 安装依赖
echo "安装Python依赖库..."
pip3 install python-dateutil
3. 初始化目录结构
echo "初始化目录..."
mkdir -p /data/archives/files
mkdir -p /data/archives/logs
mkdir -p /data/archives/backup
4. 创建空的审计日志文件并设置权限
touch /data/archives/logs/audit.log
chmod 640 /data/archives/logs/audit.log
echo "审计日志文件已创建,权限设置为640(仅所有者读写,组只读)"
5. 验证核心脚本
echo "验证核心脚本语法..."
python3 -m py_compile archive_validator.py
python3 -m py_compile four_property_check.py
if [ $? -eq 0 ]; then
echo "========================================="
echo "部署成功!"
echo "请执行数据库建表SQL脚本。"
echo "请确保应用服务器对 /data/archives 目录有读写权限。"
echo "========================================="
else
echo "错误:脚本语法校验失败,请检查代码。"
exit 1
fi
最后操作步骤:
1. 将上述所有代码文件(SQL, .py, .json, .sh)放入同一目录。
2. 执行命令chmod +x deploy.sh赋予执行权限。
3. 执行./deploy.sh完成环境初始化。
4. 在数据库管理工具中运行第一步中的SQL语句。
5. 启动你的应用程序,至此,一套符合最新档案制度建设政策的底层技术架构已完全搭建完毕。