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) 上传时间

Python快速开发仲裁档案管理系统的完整落地教程

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 数据库读写配置正确。

至此,一个具备基础的录入、上传、检索功能的仲裁档案管理系统已完全落地。该系统可以直接部署在内网环境中,作为轻量级的

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统