环境准备与项目初始化
本指南将使用Python Flask框架配合SQLite数据库,从零构建一个具备文书录入、分类、检索及下载功能的轻量级档案管理系统。此方案无需配置复杂的服务器环境,适合快速落地。
确保你的系统中已安装Python 3.8或更高版本。打开终端或命令行工具,执行以下命令安装核心依赖Flask:
pip install flask
接着,创建项目目录结构。请在你的工作空间下建立如下文件夹及文件:
- doc_system/ (项目根目录)
- static/ (存放CSS、JS等静态文件)
- templates/ (存放HTML模板)
- uploads/ (存放上传的电子档案文件)
- app.py (后端核心逻辑文件)
- init_db.py (数据库初始化脚本)
数据库设计与初始化
文书档案管理的核心在于对元数据的结构化存储。我们将创建一个名为documents的表,包含文号、题名、责任者、日期、归档类别及文件路径。
打开init_db.py,输入以下完整代码并保存:
```python
import sqlite3
def init_db():
conn = sqlite3.connect('archive.db')
cursor = conn.cursor()
创建文书档案表
cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
doc_no TEXT NOT NULL, -- 文号
title TEXT NOT NULL, -- 题名
author TEXT, -- 责任者
doc_date DATE, -- 文件日期
category TEXT, -- 归档类别 (如: 行政, 人事, 财务)
file_path TEXT, -- 电子文件存储路径
upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
print("数据库初始化完成,数据表 documents 已创建。")
if __name__ == '__main__':
init_db()
```
在终端中运行该脚本以生成数据库文件:
python init_db.py
后端核心逻辑编写
后端逻辑将处理页面的路由请求、文件上传以及数据库的交互。打开app.py,编写如下代码。请注意配置部分的上传文件夹路径设置。
```python
import os
import sqlite3
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.secret_key = 'secret_key_for_session' 用于Flash消息
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'doc', 'docx'}
确保上传目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
数据库连接辅助函数
def get_db_connection():
conn = sqlite3.connect('archive.db')
conn.row_factory = sqlite3.Row
return conn
判断文件扩展名是否合法
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
@app.route('/')
def index():
conn = get_db_connection()
获取搜索关键词
query = request.args.get('q', '')
category_filter = request.args.get('category', '')
sql = "SELECT FROM documents WHERE 1=1"
params = []
if query:
sql += " AND (title LIKE ? OR doc_no LIKE ?)"
params.extend([f'%{query}%', f'%{query}%'])
if category_filter:
sql += " AND category = ?"
params.append(category_filter)
sql += " ORDER BY upload_time DESC"
docs = conn.execute(sql, params).fetchall()
conn.close()
return render_template('index.html', docs=docs, query=query, category_filter=category_filter)
@app.route('/add', methods=['GET', 'POST'])
def add_doc():
if request.method == 'POST':
doc_no = request.form['doc_no']
title = request.form['title']
author = request.form['author']
doc_date = request.form['doc_date']
category = request.form['category']
file = request.files['file']
file_path = None
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
防止文件名冲突,加上时间戳前缀
import time
timestamp = str(int(time.time()))
filename = f"{timestamp}_{filename}"
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
conn = get_db_connection()
conn.execute('INSERT INTO documents (doc_no, title, author, doc_date, category, file_path) VALUES (?, ?, ?, ?, ?, ?)',
(doc_no, title, author, doc_date, category, file_path))
conn.commit()
conn.close()
flash('档案归档成功!')
return redirect(url_for('index'))
return render_template('add.html')
@app.route('/download/

')
def download_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
@app.route('/delete/')
def delete_doc(doc_id):
conn = get_db_connection()
获取文件路径以便删除物理文件
doc = conn.execute('SELECT file_path FROM documents WHERE id = ?', (doc_id,)).fetchone()
if doc and doc['file_path']:
if os.path.exists(doc['file_path']):
os.remove(doc['file_path'])
conn.execute('DELETE FROM documents WHERE id = ?', (doc_id,))
conn.commit()
conn.close()
flash('档案已删除!')
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True, port=5000)
```
前端页面与交互实现
为了快速构建界面,我们使用Bootstrap 5 CDN。请在templates文件夹下创建以下三个HTML文件。
基础模板布局 (base.html)
这个文件包含了所有页面共用的头部导航和样式引用。
```html
文书档案管理系统
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```
档案列表与检索页面 (index.html)
这是系统的主页,展示档案列表并提供搜索和筛选功能。
```html
{% extends "base.html" %}
{% block content %}
| 文号 |
题名 |
责任者 |
日期 |
类别 |
附件 |
操作 |
{% for doc in docs %}
| {{ doc.doc_no }} |
{{ doc.title }} |
{{ doc.author }} |
{{ doc.doc_date }} |
{{ doc.category }} |
{% if doc.file_path %}
下载
{% else %}
无
{% endif %}
|
删除
|
{% else %}
| 暂无符合条件的档案数据 |
{% endfor %}
{% endblock %}
```
档案录入表单页面 (add.html)
提供用于录入新档案的表单界面。
```html
{% extends "base.html" %}
{% block content %}
{% endblock %}
```
系统运行与功能测试
代码编写完毕后,即可启动系统进行测试。确保当前终端路径位于项目根目录doc_system下,执行以下命令启动Web服务:
python app.py
启动成功后,终端会显示服务运行地址。打开浏览器,访问 http://127.0.0.1:5000。
操作步骤验证:
- 录入测试: 点击右上角“归档录入”,填写文号(如“2023-SH-001”)、题名、选择日期和类别,上传一个测试用的PDF或图片文件,点击“保存归档”。系统应自动跳转回首页并提示“档案归档成功”。
- 检索测试: 在首页搜索框输入刚才录入的文号或题名关键词,点击查询,列表应准确筛选出对应条目。
- 筛选测试: 在下拉菜单中选择特定的类别(如“人事”),列表应仅显示该类别的档案。
- 下载测试: 点击列表中的“下载”按钮,浏览器应开始下载之前上传的文件。
- 删除测试: 点击“删除”按钮,确认弹窗后,该条目应从列表中消失,且对应的物理文件也会从服务器的
uploads文件夹中被移除。
至此,一个具备基础CRUD(增删改查)和文件管理功能的文书档案管理系统已完全搭建完成。你可以根据实际需求,进一步扩展documents表字段(如增加保管期限、密级)或对接FlASK-Login实现用户权限管理。