从零搭建可直接落地的合同档案管理系统 零门槛手把手实操指南
一、前期环境准备
本系统基于Python+Flask+SQLite开发,不需要复杂的服务器环境,个人本地/小团队局域网都可以用,仅需2步完成环境准备:
- 安装Python3.8及以上版本,直接从官方地址下载:https://www.python.org/downloads/,安装时必须勾选 Add Python to PATH,安装完成后打开命令提示符输入
python --version,输出版本号即安装成功。 - 安装依赖库,打开命令提示符直接执行以下命令:
``` pip install flask sqlalchemy ```
如果提示网络超时,换成国内镜像命令:``` pip install flask sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple ```
二、项目创建与完整代码
按以下步骤创建项目结构,全程不需要额外编写代码,直接复制即可:
- 在电脑任意位置新建名为
contract_manage的项目文件夹 - 进入项目文件夹,新建名为
instance的空文件夹,用来存放数据库文件 - 在项目根目录新建名为
app.py的文件,将以下完整代码复制进去:

```
from flask import Flask, render_template_string, request, send_file, redirect, url_for
from sqlalchemy import create_engine, Column, Integer, String, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import os
from datetime import datetime
app = Flask(__name__)
配置数据库路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATABASE_PATH = os.path.join(BASE_DIR, 'instance', 'contract.db')
engine = create_engine(f'sqlite:///{DATABASE_PATH}', echo=False)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
配置上传文件夹
UPLOAD_FOLDER = os.path.join(BASE_DIR, 'uploads')
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
合同数据模型
class Contract(Base):
__tablename__ = 'contracts'
id = Column(Integer, primary_key=True, index=True)
contract_no = Column(String(50), unique=True, index=True, nullable=False)
contract_name = Column(String(100), nullable=False)
contract_type = Column(String(50), nullable=False)
sign_date = Column(Date, nullable=False)
party_a = Column(String(100))
party_b = Column(String(100))
file_path = Column(String(200), nullable=False)
自动创建数据库表
Base.metadata.create_all(bind=engine)
页面模板
HTML_TEMPLATE = '''
合同档案管理系统
合同档案管理系统
合同档案列表
合同编号
名称
类型
签订日期
甲方
乙方
操作
{% for c in contracts %}
{{c.contract_no}}
{{c.contract_name}}
{{c.contract_type}}
{{c.sign_date}}
{{c.party_a}}
{{c.party_b}}
下载
删除
{% endfor %}
'''
首页展示列表
@app.route('/')
def index():
db = SessionLocal()
contracts = db.query(Contract).order_by(Contract.sign_date.desc()).all()
db.close()
return render_template_string(HTML_TEMPLATE, contracts=contracts)
新增合同接口
@app.route('/add', methods=['POST'])
def add():
contract_no = request.form.get('contract_no')
contract_name = request.form.get('contract_name')
contract_type = request.form.get('contract_type')
sign_date = datetime.strptime(request.form.get('sign_date'), '%Y-%m-%d').date()
party_a = request.form.get('party_a')
party_b = request.form.get('party_b')
file = request.files['contract_file']
filename = f"{datetime.now().strftime('%Y%m%d%H%M%S')}_{file.filename}"
save_path = os.path.join(UPLOAD_FOLDER, filename)
file.save(save_path)
db = SessionLocal()
new_contract = Contract(
contract_no=contract_no,
contract_name=contract_name,
contract_type=contract_type,
sign_date=sign_date,
party_a=party_a,
party_b=party_b,
file_path=save_path
)
db.add(new_contract)
db.commit()
db.close()
return redirect(url_for('index'))
下载合同文件
@app.route('/download/')
def download(contract_id):
db = SessionLocal()
contract = db.query(Contract).filter_by(id=contract_id).first()
db.close()
return send_file(contract.file_path, as_attachment=True)
删除合同档案
@app.route('/delete/')
def delete(contract_id):
db = SessionLocal()
contract = db.query(Contract).filter_by(id=contract_id).first()
if os.path.exists(contract.file_path):
os.remove(contract.file_path)
db.delete(contract)
db.commit()
db.close()
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
```
三、启动使用操作
完成代码配置后,按以下步骤启动:
- 打开命令提示符,输入命令进入项目文件夹,示例:如果项目放在D盘根目录,命令为cd D:\contract_manage
- 输入启动命令:python app.py
- 终端输出
Running on http://127.0.0.1:5000即启动成功 - 打开浏览器,输入地址 http://127.0.0.1:5000 即可进入系统使用
如果需要局域网内同事访问,只需查询你电脑的内网IP,比如IP为192.168.1.100,同事访问http://192.168.1.100:5000 即可使用。
四、数据备份与常见问题
数据备份方法
本系统所有数据分为两部分:合同基础信息存在instance/contract.db,合同原文件存在uploads文件夹,备份只需将这两个文件/文件夹复制到其他存储位置即可,恢复时直接替换对应位置即可。
常见问题解决
- 输入python提示命令不存在:重新运行Python安装程序,选择修改选项,勾选
Add Python to PATH后保存即可。 - 端口被占用无法启动:打开app.py,将最后一行的
port=5000修改为port=5001或其他未占用端口,重启服务即可。 - 新增合同后无法下载:不需要特殊处理,不要移动项目文件夹位置即可,若要转移项目,整体复制文件夹即可。