手把手教你用Python搭建轻量级档案整理系统

技术选型与架构说明

本指南将带你从零构建一个基于Web的档案整理系统。我们不使用复杂的前后端分离架构,而是采用Python Flask作为后端框架,SQLite作为数据存储,前端使用原生HTML结合Bootstrap实现。这种组合无需配置复杂的服务器环境,安装Python即可运行,非常适合个人或小团队快速落地档案数字化管理需求。

系统核心功能包括:档案上传、元数据录入(如分类、年份)、关键词检索以及档案删除。所有代码均为完整实现,复制即可运行。

一、环境准备与依赖安装

在开始编写代码前,需要确保本地环境已配置妥当。请打开终端(CMD或PowerShell),依次执行以下步骤。

1. 创建项目目录

为了保持项目整洁,我们在桌面上创建一个名为archive_system的文件夹,并进入该目录:

```bash mkdir archive_system cd archive_system ```

2. 创建并激活虚拟环境

虚拟环境可以隔离项目依赖,避免版本冲突。执行以下命令创建名为venv的虚拟环境:

```bash python -m venv venv ```

创建完成后,激活虚拟环境。注意Windows和MacOS的命令略有不同:

  • Windows: venv\Scripts\activate
  • MacOS/Linux: source venv/bin/activate

激活成功后,命令行前缀会出现(venv)标识。

3. 安装核心依赖

本系统仅依赖Flask框架及其相关工具。执行以下命令进行安装:

```bash pip install flask ```

二、数据库设计与初始化

档案管理系统的核心在于数据的结构化存储。我们将使用SQLite数据库,它无需安装数据库服务,一个文件即可搞定。我们需要在项目根目录下创建一个init_db.py文件来初始化数据库结构。

1. 创建初始化脚本

新建文件init_db.py,并写入以下完整代码:

```python import sqlite3 def init_db(): 连接到数据库文件(如果不存在会自动创建) conn = sqlite3.connect('archives.db') cursor = conn.cursor() 创建档案表 cursor.execute(''' CREATE TABLE IF NOT EXISTS archives ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, category TEXT NOT NULL, description TEXT, file_path TEXT NOT NULL, upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() print("数据库初始化完成,数据库文件为:archives.db") if __name__ == '__main__': init_db() ```

2. 执行初始化

在终端中执行以下命令生成数据库文件:

```bash python init_db.py ```

执行后,项目目录下会多出一个archives.db文件。该表包含了档案标题、分类、描述、文件存储路径和上传时间。

三、后端核心逻辑开发

手把手教你用Python搭建轻量级档案整理系统

接下来编写后端主程序app.py。该文件负责处理文件上传、数据写入、查询响应等所有业务逻辑。请在项目根目录下创建app.py,并创建一个名为uploads的文件夹用于存放上传的文件。

1. 创建上传文件夹

```bash mkdir uploads ```

2. 编写后端完整代码

将以下代码完整复制到app.py中。代码中包含了详细的注释解释每一步操作:

```python import os import sqlite3 from flask import Flask, render_template, request, redirect, url_for, flash from werkzeug.utils import secure_filename app = Flask(__name__) app.secret_key = 'your_secret_key_here' 用于Flash消息 app.config['UPLOAD_FOLDER'] = 'uploads' 文件上传目录 app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传大小为16MB 允许上传的文件扩展名 ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def get_db_connection(): conn = sqlite3.connect('archives.db') conn.row_factory = sqlite3.Row 让查询结果可以通过列名访问 return conn @app.route('/') def index(): query = request.args.get('q', '') conn = get_db_connection() if query: 带搜索条件的查询 archives = conn.execute('SELECT FROM archives WHERE title LIKE ? OR description LIKE ?', ('%' + query + '%', '%' + query + '%')).fetchall() else: 查询所有档案 archives = conn.execute('SELECT FROM archives ORDER BY upload_date DESC').fetchall() conn.close() return render_template('index.html', archives=archives, query=query) @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: flash('没有文件部分') return redirect(url_for('index')) file = request.files['file'] title = request.form.get('title') category = request.form.get('category') description = request.form.get('description') if file.filename == '': flash('未选择文件') return redirect(url_for('index')) if file and allowed_file(file.filename): filename = secure_filename(file.filename) 处理文件名安全问题 filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(filepath) 保存信息到数据库 conn = get_db_connection() conn.execute('INSERT INTO archives (title, category, description, file_path) VALUES (?, ?, ?, ?)', (title, category, description, filepath)) conn.commit() conn.close() flash('档案上传并归档成功!') else: flash('不支持的文件类型') return redirect(url_for('index')) @app.route('/delete/') def delete(id): conn = get_db_connection() 先获取文件路径以便删除物理文件 archive = conn.execute('SELECT FROM archives WHERE id = ?', (id,)).fetchone() if archive: try: os.remove(archive['file_path']) except: pass 文件删除失败忽略,继续删除数据库记录 conn.execute('DELETE FROM archives WHERE id = ?', (id,)) conn.commit() flash('档案已删除') conn.close() return redirect(url_for('index')) if __name__ == '__main__': app.run(debug=True) ```

四、前端页面构建

Flask默认在templates文件夹中寻找HTML文件。我们需要创建该文件夹,并在其中创建index.html。为了美观且无需编写复杂CSS,我们将引入Bootstrap 5 CDN。

1. 创建模板目录

```bash mkdir templates ```

2. 编写前端页面代码

templates文件夹下新建index.html,并填入以下代码。这是一个单页应用,包含了上传表单、搜索栏和数据表格:

```html 档案整理系统

档案整理系统 {% with messages = get_flashed_messages() %} {% if messages %}
{% for message in messages %} {{ message }} {% endfor %}
{% endif %} {% endwith %}
录入新档案
档案列表
{% for archive in archives %} {% else %} {% endfor %}
标题 分类 上传时间 操作
{{ archive['title'] }}
{{ archive['description'] }}
{{ archive['category'] }} {{ archive['upload_date'] }} 删除
暂无档案数据

```

五、系统运行与操作演示

至此,所有代码已编写完毕。现在启动系统并进行实际操作。

1. 启动服务

确保终端仍处于虚拟环境激活状态,且位于项目根目录下,执行:

```bash python app.py ```

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

2. 访问与录入

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

  • 录入测试: 在左侧表单中,输入标题“2023年度财务报表”,选择分类“财务”,上传任意本地文件,点击“提交归档”。页面刷新后,右侧列表将即时显示该条记录。
  • 搜索测试: 在右上角搜索框输入“财务”或“报表”,表格将自动过滤出匹配的行。
  • 删除测试: 点击列表右侧的“删除”按钮,确认后,该条记录将从数据库移除,且服务器上的物理文件也会被同步删除。

3. 常见问题排查

如果在运行过程中遇到报错,请检查以下两点:

  • 文件夹权限: 确保uploads文件夹存在且有写入权限。
  • 依赖缺失: 如果提示模块未找到,请重新执行pip install flask

这套系统虽然轻量,但具备了完整的CRUD(增删改查)核心流程,代码结构清晰,后续若需增加用户登录或OCR识别功能,可直接在此基础上扩展。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统