档案利用员培训经验:从零搭建高效数字化查询系统实操指南
一、系统核心架构与工具选型
本系统采用B/S架构,前端使用HTML5+CSS3+JavaScript,后端使用Python Flask框架,数据库选用SQLite(适合中小规模档案)。所有工具均为开源免费。
1.1 环境准备清单
安装以下软件(以Windows系统为例):
- Python 3.8+:https://www.python.org/downloads/
- VSCode编辑器:https://code.visualstudio.com/
- Git:https://git-scm.com/downloads
1.2 创建项目目录结构
在D盘创建项目文件夹并初始化:
```bash mkdir D:\archive_system cd D:\archive_system git init ```二、数据库设计与初始化
在项目根目录创建database.py文件:
```python import sqlite3 from datetime import datetime def init_database(): conn = sqlite3.connect('archive.db') cursor = conn.cursor() 档案主表 cursor.execute(''' CREATE TABLE IF NOT EXISTS archives ( id INTEGER PRIMARY KEY AUTOINCREMENT, archive_number VARCHAR(50) UNIQUE NOT NULL, title TEXT NOT NULL, category VARCHAR(20) NOT NULL, create_date DATE NOT NULL, storage_location VARCHAR(100), digital_path VARCHAR(200), access_level INTEGER DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') 借阅记录表 cursor.execute(''' CREATE TABLE IF NOT EXISTS borrow_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, archive_id INTEGER NOT NULL, borrower_name VARCHAR(50) NOT NULL, borrower_id VARCHAR(30) NOT NULL, borrow_date DATE NOT NULL, return_date DATE, purpose TEXT, FOREIGN KEY (archive_id) REFERENCES archives (id) ) ''') 创建索引 cursor.execute('CREATE INDEX idx_archive_number ON archives(archive_number)') cursor.execute('CREATE INDEX idx_category ON archives(category)') conn.commit() conn.close() print("数据库初始化完成") if __name__ == '__main__': init_database() ```三、后端API开发
3.1 安装依赖包
创建requirements.txt文件:
```txt Flask==2.3.3 Flask-CORS==4.0.0 python-dotenv==1.0.0 ```安装命令:
```bash pip install -r requirements.txt ```3.2 核心API开发

创建app.py文件:
```python from flask import Flask, request, jsonify from flask_cors import CORS import sqlite3 import json from datetime import datetime app = Flask(__name__) CORS(app) def get_db_connection(): conn = sqlite3.connect('archive.db') conn.row_factory = sqlite3.Row return conn @app.route('/api/archives', methods=['GET']) def get_archives(): """查询档案接口""" conn = get_db_connection() cursor = conn.cursor() 获取查询参数 keyword = request.args.get('keyword', '') category = request.args.get('category', '') page = int(request.args.get('page', 1)) page_size = 20 构建查询条件 conditions = [] params = [] if keyword: conditions.append("(title LIKE ? OR archive_number LIKE ?)") params.extend([f'%{keyword}%', f'%{keyword}%']) if category: conditions.append("category = ?") params.append(category) where_clause = " AND ".join(conditions) if conditions else "1=1" 分页查询 offset = (page - 1) page_size query = f''' SELECT FROM archives WHERE {where_clause} ORDER BY create_date DESC LIMIT ? OFFSET ? ''' params.extend([page_size, offset]) cursor.execute(query, params) archives = [dict(row) for row in cursor.fetchall()] 获取总数 count_query = f"SELECT COUNT() as total FROM archives WHERE {where_clause}" cursor.execute(count_query, params[:-2]) total = cursor.fetchone()['total'] conn.close() return jsonify({ 'data': archives, 'total': total, 'page': page, 'page_size': page_size }) @app.route('/api/archives/四、前端界面开发
4.1 基础HTML结构
创建templates/index.html:
```html档案查询系统
| 档案编号 | 标题 | 分类 | 创建日期 | 存储位置 | 操作 |
|---|
4.2 JavaScript交互逻辑
创建static/js/main.js:
```javascript let currentPage = 1; let totalPages = 1; // 搜索档案 async function searchArchives(page = 1) { const keyword = document.getElementById('keyword').value; const category = document.getElementById('category').value; const params = new URLSearchParams({ keyword: keyword, category: category, page: page }); try { const response = await fetch(`/api/archives?${params}`); const result = await response.json(); renderArchiveList(result.data); renderPagination(result.total, result.page_size, page); currentPage = page; } catch (error) { console.error('搜索失败:', error); alert('搜索失败,请检查网络连接'); } } // 渲染档案列表 function renderArchiveList(archives) { const tbody = document.getElementById('archive-list'); tbody.innerHTML = ''; if (archives.length === 0) { tbody.innerHTML = `五、系统部署与使用
5.1 启动系统
在项目根目录按顺序执行以下命令:
```bash 1. 初始化数据库 python database.py 2. 启动后端服务 python app.py 3. 创建静态文件夹 mkdir static mkdir static/js 将main.js放入static/js目录 4. 启动前端 浏览器访问 http://localhost:5000 ```5.2 数据导入脚本
创建import_data.py用于批量导入档案:
```python import sqlite3 import csv from datetime import datetime def import_from_csv(csv_file): conn = sqlite3.connect('archive.db') cursor = conn.cursor() with open(csv_file, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: cursor.execute(''' INSERT INTO archives (archive_number, title, category, create_date, storage_location) VALUES (?, ?, ?, ?, ?) ''', ( row['archive_number'], row['title'], row['category'], row['create_date'], row['storage_location'] )) conn.commit() conn.close() print(f"成功导入数据") 使用示例 if __name__ == '__main__': import_from_csv('archives.csv') ```5.3 日常维护命令
- 备份数据库:
sqlite3 archive.db ".backup backup.db" - 查看借阅统计:
sqlite3 archive.db "SELECT category, COUNT() FROM archives GROUP BY category" - 清理过期借阅记录:
sqlite3 archive.db "DELETE FROM borrow_records WHERE return_date IS NOT NULL AND julianday('now') - julianday(return_date) > 365"
六、故障排除
6.1 常见问题解决
问题1:端口5000被占用
解决方案:修改app.py最后一行app.run(debug=True, port=5001)
问题2:数据库