零基础Python搭建档案电子系统全流程实操

一、环境准备与依赖安装

在开始构建档案电子系统之前,需要确保你的开发环境已经配置妥当。我们将使用Python作为后端语言,Flask作为Web框架,SQLite作为数据库(无需额外安装数据库服务),以及Werkzeug处理文件上传的安全问题。这种组合轻量且高效,非常适合快速落地。

请在终端中执行以下命令安装所需的依赖库。如果尚未安装Python,请前往python.org下载并安装3.8及以上版本。

pip install flask flask-sqlalchemy flask-cors werkzeug

安装完成后,在本地创建一个项目文件夹,例如命名为digital_archive。在该文件夹下,我们需要预先创建以下目录结构以保持项目整洁:

  • uploads/:用于存储用户上传的电子档案文件。
  • instance/:Flask默认的数据库存放目录。
  • templates/:存放前端HTML文件。
  • static/:存放CSS和JS文件(本例我们将CSS和JS内嵌在HTML中,简化操作)。

执行以下命令创建必要的文件夹:

mkdir uploads instance templates

二、数据库模型设计

档案系统的核心在于对文件元数据的结构化存储。我们需要创建一个Archive模型来记录每一份档案的详细信息。设计字段包括:主键ID、原始文件名、存储路径、文件大小、上传时间、档案分类、描述信息以及标签。

在项目根目录下创建app.py文件,并写入以下代码。这段代码配置了数据库连接并定义了数据模型。

import os
from flask import Flask, request, jsonify, render_template, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from werkzeug.utils import secure_filename
from datetime import datetime
import uuid
app = Flask(__name__)
CORS(app)
配置上传文件夹和数据库路径
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
app.config['UPLOAD_FOLDER'] = os.path.join(BASE_DIR, 'uploads')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MAX_CONTENT_LENGTH'] = 100  1024  1024   限制最大上传100MB
确保上传目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
db = SQLAlchemy(app)
定义档案数据模型
class Archive(db.Model):
id = db.Column(db.Integer, primary_key=True)
original_filename = db.Column(db.String(255), nullable=False)
stored_filename = db.Column(db.String(255), nullable=False)
file_path = db.Column(db.String(500), nullable=False)
file_size = db.Column(db.Integer, nullable=False)
category = db.Column(db.String(50), nullable=True)
description = db.Column(db.Text, nullable=True)
tags = db.Column(db.String(255), nullable=True)
upload_time = db.Column(db.DateTime, default=datetime.utcnow)
def to_dict(self):
return {
'id': self.id,
'original_filename': self.original_filename,
'file_size': round(self.file_size / 1024, 2),  转换为KB
'category': self.category,
'description': self.description,
'tags': self.tags,
'upload_time': self.upload_time.strftime('%Y-%m-%d %H:%M:%S')
}
初始化数据库
with app.app_context():
db.create_all()

三、后端核心逻辑实现

接下来实现后端的核心业务逻辑,包括文件上传、列表查询、文件下载和删除功能。请将以下代码追加到app.py文件中。

1. 文件上传接口

该接口接收前端传来的文件和表单数据,进行安全校验后保存文件,并将元数据写入数据库。为了防止文件名冲突,我们使用UUID重命名文件。

ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'doc', 'docx', 'xls', 'xlsx'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/api/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': '没有文件部分'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': '未选择文件'}), 400
if file and allowed_file(file.filename):
获取表单其他数据
category = request.form.get('category', '未分类')
description = request.form.get('description', '')
tags = request.form.get('tags', '')
生成安全的文件名(使用UUID防止重名)
original_filename = secure_filename(file.filename)
ext = original_filename.rsplit('.', 1)[1].lower()
stored_filename = f"{uuid.uuid4().hex}.{ext}"
file_path = os.path.join(app.config['UPLOAD_FOLDER'], stored_filename)
file.save(file_path)
获取文件大小
file_size = os.path.getsize(file_path)
存入数据库
new_archive = Archive(
original_filename=original_filename,
stored_filename=stored_filename,
file_path=file_path,
file_size=file_size,
category=category,
description=description,
tags=tags
)
db.session.add(new_archive)
db.session.commit()
return jsonify({'message': '上传成功', 'data': new_archive.to_dict()}), 201
else:
return jsonify({'error': '不支持的文件类型'}), 400

2. 档案列表与搜索接口

零基础Python搭建档案电子系统全流程实操

该接口支持分页查询,并可根据关键词(文件名、描述或标签)进行模糊搜索。

@app.route('/api/archives', methods=['GET'])
def get_archives():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
search = request.args.get('search', '')
query = Archive.query
if search:
query = query.filter(
db.or_(
Archive.original_filename.like(f'%{search}%'),
Archive.description.like(f'%{search}%'),
Archive.tags.like(f'%{search}%')
)
)
按上传时间倒序排列
pagination = query.order_by(Archive.upload_time.desc()).paginate(page=page, per_page=per_page, error_out=False)
archives_list = [item.to_dict() for item in pagination.items]
return jsonify({
'items': archives_list,
'total': pagination.total,
'pages': pagination.pages,
'current_page': page
})

3. 文件下载与删除接口

下载接口通过send_from_directory安全地发送文件,删除接口则会同时移除物理文件和数据库记录。

@app.route('/api/download/', methods=['GET'])
def download_file(archive_id):
archive = Archive.query.get_or_404(archive_id)
return send_from_directory(app.config['UPLOAD_FOLDER'], archive.stored_filename, as_attachment=True, download_name=archive.original_filename)
@app.route('/api/archive/', methods=['DELETE'])
def delete_archive(archive_id):
archive = Archive.query.get_or_404(archive_id)
删除物理文件
if os.path.exists(archive.file_path):
try:
os.remove(archive.file_path)
except Exception as e:
return jsonify({'error': f'文件删除失败: {str(e)}'}), 500
删除数据库记录
db.session.delete(archive)
db.session.commit()
return jsonify({'message': '档案删除成功'})

四、前端页面开发

为了实现零门槛操作,我们创建一个单页应用HTML,包含上传表单和档案列表展示。在templates文件夹下创建index.html,并写入以下代码:










档案上传

档案列表

文件名 分类 大小(KB) 上传时间 操作

app.py文件末尾添加路由以渲染该HTML页面:

@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True, port=5000)

五、系统运行与测试

所有代码已经准备就绪,现在可以启动系统进行测试。

1. 启动服务

在终端中进入项目根目录,执行以下命令启动Flask服务器:

python app.py

当终端显示Running on http://127.0.0.1:5000时,说明服务已成功启动。

2. 功能测试

打开浏览器,访问http://127.0.0.1:5000。你将看到一个简洁的操作界面。

  • 上传测试:点击“选择文件”,选取一个PDF或图片,填写分类为“测试文档”,描述为“系统功能验证”,点击上传。成功后会看到下方列表自动刷新出该条目。
  • 搜索测试:在搜索框输入刚才填写的描述或文件名,点击搜索,列表将过滤显示匹配的档案。
  • 下载测试:点击列表中的“下载”按钮,浏览器将下载原始文件。
  • 删除测试:点击“删除”按钮,确认弹窗后,该条目将从列表中移除,且服务器uploads文件夹下的物理文件也会被同步删除。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统