网站首页/ 信息中心/ 档案百科/

基于Python搭建符合实际的档案制度管理系统

发布时间:2026年08月16日 04:15:03 浏览量:0

技术栈选型与环境准备

为了确保档案制度建设的落地性,本指南采用Python作为核心开发语言,配合FastAPI框架提供高性能的RESTful接口,使用SQLite作为轻量级本地数据库。这种组合无需复杂的运维配置,即可在本地或内网环境中直接运行,非常适合中小企业或部门级的档案管理需求。

请确保你的系统已安装Python 3.8及以上版本。打开终端或命令行工具,执行以下命令安装核心依赖包:

pip install fastapi uvicorn sqlalchemy python-multipart aiofiles pydantic

安装完成后,建议创建一个专门的项目目录来存放代码。请在本地磁盘创建一个名为archive_system的文件夹,并在其中建立以下文件结构:

archive_system/
├── main.py           程序入口与API逻辑
├── database.py       数据库连接配置
├── models.py         数据库模型定义(档案制度的核心)
└── storage/          存放实体档案文件的目录(手动创建)

数据库模型设计:落实档案制度

“符合实际”的档案制度建设,核心在于数据模型的设计。我们需要在数据库层面强制规定档案的必填项、分类、保管期限和保密级别。打开models.py文件,输入以下完整的代码。这段代码定义了档案的全生命周期字段,确保每一份入库的档案都符合制度规范。

from sqlalchemy import Column, Integer, String, DateTime, Text, Enum
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
import enum
Base = declarative_base()
定义档案分类枚举,强制规范分类
class ArchiveCategory(str, enum.Enum):
FINANCE = "财务档案"
PERSONNEL = "人事档案"
TECHNICAL = "技术档案"
ADMIN = "行政档案"
定义保管期限枚举,符合档案管理实际规定
class RetentionPeriod(str, enum.Enum):
PERMANENT = "永久"
LONG_TERM = "30年"
SHORT_TERM = "10年"
定义档案实体模型
class ArchiveRecord(Base):
__tablename__ = "archive_records"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(200), nullable=False, comment="档案标题")
category = Column(Enum(ArchiveCategory), nullable=False, comment="档案分类")
file_path = Column(String(500), nullable=False, comment="文件存储路径")
retention_period = Column(Enum(RetentionPeriod), nullable=False, comment="保管期限")
security_level = Column(Integer, default=1, comment="保密级别:1-公开,2-内部,3-机密")
creator = Column(String(50), nullable=False, comment="创建人")
description = Column(Text, nullable=True, comment="档案描述")
created_at = Column(DateTime, default=datetime.now, comment="归档日期")
def to_dict(self):
return {
"id": self.id,
"title": self.title,
"category": self.category.value,
"file_path": self.file_path,
"retention_period": self.retention_period.value,
"security_level": self.security_level,
"creator": self.creator,
"description": self.description,
"created_at": self.created_at.strftime("%Y-%m-%d %H:%M:%S")
}

数据库连接与初始化配置

接下来配置数据库连接。为了实现开箱即用,我们使用SQLite。在database.py中写入以下代码,完成数据库引擎的创建和表结构的初始化。这将自动创建上述定义的archive_records表。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Base
使用本地SQLite数据库文件
SQLALCHEMY_DATABASE_URL = "sqlite:///./archive_management.db"
创建数据库引擎
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
初始化数据库表结构
def init_db():
Base.metadata.create_all(bind=engine)

核心业务逻辑与API接口实现

这是系统最关键的部分。在main.py中,我们将实现档案的“归档”和“检索”功能。为了体现“符合实际”的制度要求,我们在代码中加入了业务逻辑校验:例如,财务档案必须设置保管期限上传文件必须重命名为规范格式。请完整复制以下代码:

import os
import shutil
import uuid
from fastapi import FastAPI, Depends, HTTPException, UploadFile, File, Form
from fastapi.responses import JSONResponse
from sqlalchemy.orm import Session
from pydantic import BaseModel
from typing import Optional
import database
from models import ArchiveRecord, ArchiveCategory, RetentionPeriod
app = FastAPI(title="企业档案制度管理系统")
依赖项:获取数据库会话
def get_db():
db = database.SessionLocal()
try:
yield db
finally:
db.close()
启动时初始化数据库
@app.on_event("startup")
def startup_event():
database.init_db()
if not os.path.exists("storage"):
os.makedirs("storage")
Pydantic模型用于接收归档元数据
class ArchiveCreate(BaseModel):
title: str
category: ArchiveCategory
retention_period: RetentionPeriod
security_level: int = 1
creator: str
description: Optional[str] = None
业务规则校验函数
def validate_archive_policy(data: ArchiveCreate):
规则1:财务档案必须是长期或永久保存
if data.category == ArchiveCategory.FINANCE and data.retention_period == RetentionPeriod.SHORT_TERM:
raise HTTPException(status_code=400, detail="制度限制:财务档案保管期限不得低于10年")
规则2:机密文件必须有描述
if data.security_level >= 3 and (not data.description or len(data.description) < 10):
raise HTTPException(status_code=400, detail="制度限制:机密文件必须填写不少于10字的详细描述")
@app.post("/api/archives/upload")
async def upload_archive(
file: UploadFile = File(...),
title: str = Form(...),
category: str = Form(...),
retention_period: str = Form(...),
security_level: int = Form(1),
creator: str = Form(...),
description: Optional[str] = Form(None),
db: Session = Depends(get_db)
):
1. 构造数据对象并转换枚举
try:
category_enum = ArchiveCategory(category)
retention_enum = RetentionPeriod(retention_period)
except ValueError:
raise HTTPException(status_code=400, detail="档案分类或保管期限参数错误")
archive_data = ArchiveCreate(
title=title,
category=category_enum,
retention_period=retention_enum,
security_level=security_level,
creator=creator,
description=description
)
2. 执行制度校验
validate_archive_policy(archive_data)
3. 文件存储处理:生成唯一文件名,防止覆盖
file_extension = file.filename.split(".")[-1]
new_filename = f"{uuid.uuid4().hex}_{archive_data.title}.{file_extension}"
file_location = f"storage/{new_filename}"
保存文件到本地
with open(file_location, "wb+") as file_object:
shutil.copyfileobj(file.file, file_object)
4. 写入数据库
db_record = ArchiveRecord(
title=archive_data.title,
category=archive_data.category,
file_path=file_location,
retention_period=archive_data.retention_period,
security_level=archive_data.security_level,
creator=archive_data.creator,
description=archive_data.description
)
db.add(db_record)
db.commit()
db.refresh(db_record)
return {"message": "档案归档成功", "archive_id": db_record.id, "file_path": file_location}
@app.get("/api/archives/")
def list_archives(category: Optional[str] = None, db: Session = Depends(get_db)):
query = db.query(ArchiveRecord)
if category:
query = query.filter(ArchiveRecord.category == category)
results = query.all()
return {"data": [r.to_dict() for r in results]}
@app.get("/api/archives/{archive_id}")
def get_archive(archive_id: int, db: Session = Depends(get_db)):
record = db.query(ArchiveRecord).filter(ArchiveRecord.id == archive_id).first()
if not record:
raise HTTPException(status_code=404, detail="档案不存在")
return record.to_dict()

系统启动与实操验证

代码编写完毕后,无需任何额外配置即可启动服务。在终端中进入项目目录,执行以下命令启动FastAPI服务器:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

看到终端显示Application startup complete即表示服务启动成功。此时,你可以直接访问 http://127.0.0.1:8000/docs 查看自动生成的Swagger API文档界面,并进行交互式测试。

基于Python搭建符合实际的档案制度管理系统

实操步骤 1:模拟上传一份财务档案(测试制度校验)

在Swagger界面中点击 POST /api/archives/upload,点击“Try it out”。填写以下表单数据进行测试:

点击“Execute”发送请求。此时系统应返回 400 Bad Request,并在响应中提示“制度限制:财务档案保管期限不得低于10年”。这证明了我们的系统已经在技术层面强制执行了档案管理制度。

实操步骤 2:修正数据并成功归档

再次尝试上传,将 retention_period 修改为 LONG_TERM。此时请求应返回 200 OK,并显示档案ID和存储路径。检查本地storage文件夹,你会发现文件已被安全保存,且文件名已被重命名为UUID格式,防止了文件名冲突。

实操步骤 3:检索档案

在Swagger界面点击 GET /api/archives/,点击“Try it out”后直接执行。你将看到刚才归档的档案详细信息,包括归档时间、保管期限等元数据。你也可以通过传入 category 参数(如 FINANCE)来筛选特定类别的档案。

通过以上步骤,你已成功构建了一个符合实际业务规则的档案管理系统。该系统不仅解决了文件存储问题,更通过代码逻辑将档案管理制度(如分类规范、保管期限限制)固化到了软件流程中,实现了技术对制度的刚性支撑。

太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务流程是怎样的?大概需要多少钱?
太原档案数字化服务通常包含需求分析、方案制定、现场整理、扫描加工、数据挂接、验收交付等核心流程,费用根据档案数量、纸张状况、数字化标准等因素综合计算,2026年市场价格范围大致在每页0.5元至2元之间...
2026年08月16日 04:15:03
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818