一、环境准备与依赖安装
在开始构建泉州档案软件之前,需要确保本地开发环境已经配置好Python运行环境。本指南基于Python 3.9版本进行开发,数据库使用轻量级的SQLite,无需额外安装数据库服务,适合快速落地。
1. 安装Python环境
如果尚未安装Python,请直接访问Python官网下载对应操作系统的安装包。对于Linux用户,可以使用以下命令进行安装:
```bash
sudo apt update
sudo apt install python3.9 python3-pip -y
```
2. 创建项目目录
在终端中执行以下命令,创建项目文件夹并进入:
```bash
mkdir quanzhou_archive
cd quanzhou_archive
```
3. 创建虚拟环境并安装依赖
为了保证项目依赖隔离,建议创建虚拟环境。创建完成后,激活虚拟环境并安装Flask框架及其依赖库:
```bash
python3 -m venv venv
source venv/bin/activate
pip install flask flask-sqlalchemy flask-wtf
```
4. 生成依赖文件
为了方便后续部署,将当前环境的依赖包导出到requirements.txt文件中:
```bash
pip freeze > requirements.txt
```
二、项目目录结构初始化
一个规范的Web项目需要清晰的目录结构。请在quanzhou_archive目录下按照以下结构创建文件和文件夹:
- app.py:主程序入口,包含路由配置和业务逻辑。
- models.py:数据库模型定义文件,用于存储档案数据。
- templates/:存放HTML模板文件的文件夹。
- static/:存放CSS、JS等静态资源的文件夹。
- uploads/:存放用户上传的档案文件的文件夹。
执行以下命令自动生成文件夹:
```bash
mkdir templates static uploads
touch app.py models.py templates/base.html templates/index.html templates/upload.html
```
三、数据库模型设计
针对泉州档案管理的需求,我们需要设计一个包含档案标题、所属区域(如鲤城、丰泽等)、档案分类以及文件路径的数据模型。打开models.py文件,输入以下完整代码:
```python
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
db = SQLAlchemy()
class Archive(db.Model):
__tablename__ = 'archives'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
district = db.Column(db.String(50), nullable=False) 对应泉州各区县
category = db.Column(db.String(50), nullable=False) 档案分类
filename = db.Column(db.String(255), nullable=False) 存储的文件名
upload_time = db.Column(db.DateTime, default=datetime.now)
def __repr__(self):
return f'
'
```
此模型定义了档案的基本属性。其中district字段专门用于区分泉州不同行政区的档案,便于后续按区域筛选。
四、核心业务逻辑实现
在app.py中编写核心逻辑,包括数据库连接配置、文件上传处理、档案列表展示以及搜索功能。请复制以下完整代码到app.py:
```python
import os
from flask import Flask, render_template, request, redirect, url_for, flash
from models import db, Archive
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'quanzhou_archive_secret_key_2024'
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 1024 1024 限制上传大小为16MB
允许上传的文件扩展名
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'doc', 'docx'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
初始化数据库
with app.app_context():
db.init_app(app)
db.create_all()
@app.route('/')
def index():
query = request.args.get('q')
district_filter = request.args.get('district')
archives = Archive.query
if query:
archives = archives.filter(Archive.title.contains(query))
if district_filter:
archives = archives.filter(Archive.district == district_filter)
archives = archives.order_by(Archive.upload_time.desc()).all()
泉州主要区域列表,用于前端筛选
districts = ['鲤城区', '丰泽区', '洛江区', '泉港区', '惠安县', '安溪县', '永春县', '德化县', '石狮市', '晋江市', '南安市']
return render_template('index.html', archives=archives, districts=districts)
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
flash('没有文件部分')
return redirect(request.url)
file = request.files['file']
title = request.form.get('title')
district = request.form.get('district')
category = request.form.get('category')
if file.filename == '':
flash('未选择文件')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
确保文件名唯一,添加时间戳前缀
from time import time
filename = f"{int(time())}_{filename}"
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
保存到数据库
new_archive = Archive(
title=title,
district=district,
category=category,
filename=filename
)
db.session.add(new_archive)
db.session.commit()
flash('档案上传成功!')
return redirect(url_for('index'))
else:
flash('不支持的文件类型')
districts = ['鲤城区', '丰泽区', '洛江区', '泉港区', '惠安县', '安溪县', '永春县', '德化县', '石狮市', '晋江市', '南安市']
return render_template('upload.html', districts=districts)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
```

这段代码实现了文件的安全性检查、文件存储以及数据库的增删改查逻辑。特别注意districts列表,完整涵盖了泉州的所有下辖区县,确保软件的本地化适用性。
五、前端页面构建
为了实现用户交互,我们需要创建三个HTML模板文件:基础模板base.html、列表页index.html和上传页upload.html。
1. 基础模板 (templates/base.html)
定义页面的整体布局和导航栏:
```html
泉州档案管理系统
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```
2. 档案列表页 (templates/index.html)
展示档案列表,并提供按区域和标题搜索的功能:
```html
{% extends "base.html" %}
{% block content %}
档案列表
| ID |
档案标题 |
所属区域 |
分类 |
上传时间 |
操作 |
{% for archive in archives %}
| {{ archive.id }} |
{{ archive.title }} |
{{ archive.district }} |
{{ archive.category }} |
{{ archive.upload_time.strftime('%Y-%m-%d %H:%M') }} |
下载 |
{% else %}
| 暂无档案数据 |
{% endfor %}
{% endblock %}
```
3. 档案上传页 (templates/upload.html)
提供文件上传表单和必填项填写:
```html
{% extends "base.html" %}
{% block content %}
上传新档案
{% endblock %}
```
六、运行与功能验证
所有代码和配置文件已准备就绪。现在启动服务进行测试。
1. 启动Flask应用
确保终端处于项目根目录且虚拟环境已激活,执行以下命令:
```bash
python app.py
```
2. 访问系统
打开浏览器,在地址栏输入http://127.0.0.1:5000。你将看到泉州档案管理系统的主界面。
3. 验证上传功能
- 点击导航栏的“档案上传”。
- 在表单中输入档案标题,例如“2023年度鲤城区重点项目汇总”。
- 在“所属区域”下拉框中选择“鲤城区”。
- 输入分类“文书档案”。
- 点击“选择文件”,上传一个本地的PDF或图片文件。
- 点击“立即上传”。系统提示成功后自动跳转回列表页。
4. 验证筛选与搜索
- 在列表页的搜索框中输入“重点项目”,点击筛选,确认只显示匹配的记录。
- 在区域下拉框中选择“丰泽区”,点击筛选,确认列表能正确过滤出该区域的档案。
- 点击表格右侧的“下载”按钮,确认能成功下载刚才上传的文件。