本文将采用Python轻量级Web框架Flask配合SQLite数据库内嵌存储,构建一套无需复杂服务器配置、开箱即用的博物馆档案管理系统。该方案数据存储为单文件,非常适合中小型博物馆或个人档案管理的快速落地。
首先确保系统已安装Python 3.8及以上版本。打开终端(Windows下为CMD或PowerShell,Mac/Linux下为Terminal),输入以下命令检查Python环境:
```bash python --version ```若未安装,请前往Python官网下载安装包并勾选"Add Python to PATH"。环境确认无误后,在本地创建项目目录并进入:
```bash mkdir museum_archive cd museum_archive ```为了防止项目依赖与系统全局包冲突,必须构建独立的虚拟环境。在项目根目录下执行对应系统的命令:
Windows系统执行:
```bash python -m venv venv venv\Scripts\activate ```Linux或Mac系统执行:
```bash python3 -m venv venv source venv/bin/activate ```激活成功后,命令行前缀会出现`(venv)`标识。接着安装Web框架核心依赖Flask:
```bash pip install flask ```博物馆档案数据的核心在于结构化存储。我们需要设计一张包含文物ID、名称、分类、年代、详细描述及入库时间的表。在项目根目录下新建init_db.py文件,该脚本用于自动生成数据库文件及表结构。
以下代码实现了数据库连接与表的创建逻辑,请完整复制:
```python import sqlite3 def init_db(): 连接数据库,文件不存在会自动创建 conn = sqlite3.connect('museum.db') cursor = conn.cursor() 创建artifacts表 cursor.execute(''' CREATE TABLE IF NOT EXISTS artifacts ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, category TEXT NOT NULL, era TEXT, description TEXT, add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() print("数据库初始化成功,数据表 artifacts 已就绪。") if __name__ == '__main__': init_db() ```
保存文件后,在终端执行以下命令运行脚本,此时项目目录下会生成museum.db文件:
```bash python init_db.py ```后端主要负责处理HTTP请求并与数据库交互。在项目根目录下创建主程序文件app.py。我们将实现档案列表展示、新增档案录入、档案删除三个核心功能。
以下是完整的后端代码,包含了路由配置、数据库CRUD操作及错误处理机制:
```python from flask import Flask, render_template, request, redirect, url_for, flash import sqlite3 app = Flask(__name__) app.secret_key = 'museum_archive_secret_key' 用于Flash消息加密 def get_db_connection(): """获取数据库连接,并设置行工厂为字典模式,方便通过列名访问""" conn = sqlite3.connect('museum.db') conn.row_factory = sqlite3.Row return conn 首页路由:展示所有档案列表 @app.route('/') def index(): conn = get_db_connection() 查询所有数据,按入库时间倒序排列 artifacts = conn.execute('SELECT FROM artifacts ORDER BY add_time DESC').fetchall() conn.close() return render_template('index.html', artifacts=artifacts) 新增档案路由:处理GET显示表单,处理POST保存数据 @app.route('/add', methods=('GET', 'POST')) def add(): if request.method == 'POST': name = request.form['name'] category = request.form['category'] era = request.form['era'] description = request.form['description'] if not name: flash('文物名称是必填项,请填写!') else: conn = get_db_connection() 使用参数化查询防止SQL注入 conn.execute( 'INSERT INTO artifacts (name, category, era, description) VALUES (?, ?, ?, ?)', (name, category, era, description) ) conn.commit() conn.close() return redirect(url_for('index')) return render_template('add.html') 删除档案路由:接收ID参数并执行删除 @app.route('/delete/Flask使用Jinja2模板引擎渲染HTML。我们需要在项目根目录下创建一个名为templates的文件夹,并在其中编写HTML文件。所有页面均包含内联CSS以确保无需额外配置静态文件即可直接使用。
在templates目录下创建index.html。该页面用于展示数据表格,并提供"录入"和"删除"的操作入口:
```html| ID | 文物名称 | 分类 | 年代 | 描述 | 入库时间 | 操作 |
|---|---|---|---|---|---|---|
| {{ artifact.id }} | {{ artifact.name }} | {{ artifact.category }} | {{ artifact.era }} | {{ artifact.description }} | {{ artifact.add_time }} | 删除 |
在templates目录下创建add.html。该页面包含一个表单,用于输入文物信息并提交给后端:
```html完成上述所有代码文件的编写后,请确保你的项目目录结构如下所示,这是程序正常运行的基础:
确认无误后,在终端确保虚拟环境处于激活状态,启动Web服务:
```bash python app.py ```当终端显示 Running on http://127.0.0.1:5000 时,说明服务已成功启动。打开浏览器访问该地址,你将看到一个简洁的档案管理界面。点击"录入新档案"添加数据,提交后页面会自动跳转回列表页显示新录入的文物信息。至此,一套具备基础增删查功能的博物馆档案软件已完全落地。