档案利用员培训经验:从零搭建高效数字化查询系统实操指南

一、系统核心架构与工具选型

本系统采用B/S架构,前端使用HTML5+CSS3+JavaScript,后端使用Python Flask框架,数据库选用SQLite(适合中小规模档案)。所有工具均为开源免费。

1.1 环境准备清单

安装以下软件(以Windows系统为例):

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//borrow', methods=['POST']) def borrow_archive(archive_id): """借阅档案接口""" data = request.json required_fields = ['borrower_name', 'borrower_id', 'purpose'] for field in required_fields: if field not in data: return jsonify({'error': f'缺少{field}字段'}), 400 conn = get_db_connection() cursor = conn.cursor() try: 检查档案是否存在 cursor.execute('SELECT id FROM archives WHERE id = ?', (archive_id,)) if not cursor.fetchone(): return jsonify({'error': '档案不存在'}), 404 插入借阅记录 cursor.execute(''' INSERT INTO borrow_records (archive_id, borrower_name, borrower_id, borrow_date, purpose) VALUES (?, ?, ?, ?, ?) ''', ( archive_id, data['borrower_name'], data['borrower_id'], datetime.now().strftime('%Y-%m-%d'), data['purpose'] )) conn.commit() return jsonify({'message': '借阅成功'}), 201 except Exception as e: conn.rollback() return jsonify({'error': str(e)}), 500 finally: conn.close() if __name__ == '__main__': app.run(debug=True, port=5000) ```

四、前端界面开发

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 = ` 未找到相关档案 `; return; } archives.forEach(archive => { const row = document.createElement('tr'); row.className = 'archive-item'; row.innerHTML = ` ${archive.archive_number} ${archive.title} ${archive.category} ${archive.create_date} ${archive.storage_location || '未指定'} `; tbody.appendChild(row); }); } // 渲染分页 function renderPagination(total, pageSize, current) { const pagination = document.getElementById('pagination'); pagination.innerHTML = ''; totalPages = Math.ceil(total / pageSize); // 上一页 const prevLi = document.createElement('li'); prevLi.className = `page-item ${current === 1 ? 'disabled' : ''}`; prevLi.innerHTML = ` 上一页 `; pagination.appendChild(prevLi); // 页码 for (let i = 1; i <= totalPages; i++) { const li = document.createElement('li'); li.className = `page-item ${i === current ? 'active' : ''}`; li.innerHTML = ` ${i} `; pagination.appendChild(li); } // 下一页 const nextLi = document.createElement('li'); nextLi.className = `page-item ${current === totalPages ? 'disabled' : ''}`; nextLi.innerHTML = ` 下一页 `; pagination.appendChild(nextLi); } // 打开借阅模态框 function openBorrowModal(archiveId) { document.getElementById('modalArchiveId').value = archiveId; document.getElementById('borrowForm').reset(); const modal = new bootstrap.Modal(document.getElementById('borrowModal')); modal.show(); } // 提交借阅 async function submitBorrow() { const form = document.getElementById('borrowForm'); const formData = new FormData(form); const data = Object.fromEntries(formData.entries()); try { const response = await fetch(`/api/archives/${data.archive_id}/borrow`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (response.ok) { alert('借阅成功!'); const modal = bootstrap.Modal.getInstance(document.getElementById('borrowModal')); modal.hide(); } else { const error = await response.json(); alert(`借阅失败: ${error.error}`); } } catch (error) { alert('网络错误,请重试'); } } // 页面加载时初始化 document.addEventListener('DOMContentLoaded', () => { searchArchives(1); }); ```

五、系统部署与使用

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:数据库

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统