Python快速开发仲裁档案管理系统的完整落地教程
一、环境准备与依赖安装
在开始构建仲裁档案管理系统之前,需要确保本地开发环境已经配置妥当。本系统采用轻量级架构,后端使用 Python 的 Flask 框架,数据库使用 SQLite(无需安装数据库服务),前端使用原生 HTML/JS。这种方式部署简单,维护成本低。
请在终端中执行以下命令,检查 Python 版本(建议 3.8 及以上):
python --version
接着,创建项目目录并安装必要的第三方依赖包。我们主要需要 Flask 作为 Web 框架,Flask-SQLAlchemy 用于数据库 ORM 操作:
mkdir arbitration_system
cd arbitration_system
pip install flask flask-sqlalchemy
为了确保文件上传的安全性,还需要安装 Werkzeug(Flask 依赖库中通常包含,但单独确认一下是个好习惯):
pip install werkzeug
二、项目目录结构规划
为了保证代码的可维护性,请按照以下结构创建文件夹和文件。这种结构清晰地将业务逻辑、数据存储和前端展示分离开来:
- arbitration_system/ (项目根目录)
- static/ (存放 CSS、JS 等静态资源,本例暂不涉及复杂静态文件)
- templates/ (存放 HTML 模板文件)
- index.html
- uploads/ (存放上传的仲裁档案文件,需手动创建)
- app.py (后端核心逻辑文件)
请务必在根目录下手动创建一个名为 uploads 的空文件夹,否则后续文件上传功能会报错。
三、后端核心代码实现
在 app.py 中编写完整的后端逻辑。我们需要实现数据库连接、数据模型定义、文件上传处理以及档案检索功能。以下是完整的代码,可以直接复制使用:
```python
import os
from datetime import datetime
from flask import Flask, render_template, request, jsonify, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
初始化应用
app = Flask(__name__)
配置数据库与上传路径
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'arbitration.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['UPLOAD_FOLDER'] = os.path.join(basedir, 'uploads')
app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传文件最大为 16MB
app.config['SECRET_KEY'] = 'hard-to-guess-string' 用于 Flash 消息
允许上传的文件扩展名
ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg', 'doc', 'docx'}
初始化数据库
db = SQLAlchemy(app)
定义仲裁档案数据模型
class Archive(db.Model):
id = db.Column(db.Integer, primary_key=True)
case_no = db.Column(db.String(50), nullable=False, index=True) 案号
party_name = db.Column(db.String(100), nullable=False) 当事人
archive_type = db.Column(db.String(50), nullable=False) 档案类型(如:证据、裁决书)
filename = db.Column(db.String(255), nullable=False) 存储的文件名
upload_time = db.Column(db.DateTime, default=datetime.utcnow) 上传时间

def to_dict(self):
return {
'id': self.id,
'case_no': self.case_no,
'party_name': self.party_name,
'archive_type': self.archive_type,
'filename': self.filename,
'upload_time': self.upload_time.strftime('%Y-%m-%d %H:%M:%S')
}
辅助函数:检查文件扩展名
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
创建数据库表
with app.app_context():
db.create_all()
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
获取表单数据
case_no = request.form.get('case_no')
party_name = request.form.get('party_name')
archive_type = request.form.get('archive_type')
file = request.files.get('file')
基础校验
if not case_no or not party_name or not archive_type or not file:
return jsonify({'success': False, 'message': '请填写完整信息并选择文件'})
if file.filename == '':
return jsonify({'success': False, 'message': '未选择文件'})
if not allowed_file(file.filename):
return jsonify({'success': False, 'message': '不支持的文件类型'})
安全处理文件名并保存
filename = secure_filename(file.filename)
防止重名,添加时间戳
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
final_filename = f"{timestamp}_{filename}"
save_path = os.path.join(app.config['UPLOAD_FOLDER'], final_filename)
try:
file.save(save_path)
写入数据库
new_archive = Archive(
case_no=case_no,
party_name=party_name,
archive_type=archive_type,
filename=final_filename
)
db.session.add(new_archive)
db.session.commit()
return jsonify({'success': True, 'message': '档案上传成功'})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'message': f'保存失败: {str(e)}'})
@app.route('/api/archives')
def get_archives():
获取查询参数
search_case = request.args.get('case_no', '')
search_party = request.args.get('party_name', '')
构建查询
query = Archive.query
if search_case:
query = query.filter(Archive.case_no.contains(search_case))
if search_party:
query = query.filter(Archive.party_name.contains(search_party))
按时间倒序排列
results = query.order_by(Archive.upload_time.desc()).all()
return jsonify([item.to_dict() for item in results])
if __name__ == '__main__':
app.run(debug=True, port=5000)
```
这段代码实现了完整的 CRUD 中的“增”和“查”。特别注意 secure_filename 的使用,它能有效防止路径遍历攻击,这在档案管理系统中是必须注意的安全细节。
四、前端页面构建
在 templates/index.html 中构建前端界面。为了保持零门槛,我们不使用 Vue 或 React,而是通过原生 JavaScript 的 Fetch API 与后端交互。界面包含档案录入表单和检索列表两个核心区域。
```html
仲裁档案录入
档案查询
ID
案号
当事人
档案类型
文件名
上传时间
```
五、系统启动与功能验证
代码编写完成后,即可启动系统进行测试。在终端中执行以下命令启动 Flask 服务:
python app.py
看到终端输出 Running on http://127.0.0.1:5000 即表示启动成功。此时打开浏览器访问该地址。
1. 录入测试:
- 在“案号”栏输入:2023-仲-001
- 在“当事人名称”栏输入:张三
- 选择档案类型:申请书
- 点击“选择文件”,选取本地的任意 PDF 或图片文件。
- 点击“提交档案”。如果看到绿色提示框显示“档案上传成功”,且下方表格出现了新记录,说明后端逻辑正常。
2. 检索测试:
- 在“案号查询”框中输入:2023。
- 点击“查询”。下方表格应自动刷新,仅显示案号包含“2023”的记录。
- 清空案号,在“当事人查询”框中输入:张三。
- 点击“查询”。表格应仅显示当事人为“张三”的记录。
3. 数据持久化验证:
- 关闭终端程序(Ctrl+C),然后重新运行
python app.py。 - 刷新浏览器页面,之前录入的数据依然存在,说明 SQLite 数据库读写配置正确。
至此,一个具备基础的录入、上传、检索功能的仲裁档案管理系统已完全落地。该系统可以直接部署在内网环境中,作为轻量级的