Python手把手搭建行政单位档案培训系统
技术选型与环境准备
本方案旨在为行政单位构建一套轻量级、无需复杂运维的档案培训系统。考虑到行政单位内网环境及数据敏感性,我们选用Python作为开发语言,配合Flask框架实现Web服务,使用SQLite作为数据库。SQLite具备文件型数据库特性,无需安装数据库服务即可运行,非常适合单机或小规模局域网部署。
第一步:安装Python环境
请确保操作系统已安装Python 3.8或更高版本。打开终端或命令提示符,输入以下命令检查版本:
python --version
若未安装,请前往Python官网下载对应系统的安装包并安装。安装时务必勾选"Add Python to PATH"。
第二步:安装依赖库
在项目根目录下,我们需要安装Flask框架。执行以下命令:
pip install flask
安装完成后,即可开始代码编写。无需配置Web服务器,Flask自带开发服务器足以应对百人级并发访问。
数据库设计与初始化
为了管理档案培训课程及员工学习进度,我们需要设计三张核心表:用户表(users)、课程表(courses)和学习记录表(progress)。
第一步:创建数据库模式文件
在项目目录下创建一个名为schema.sql的文件,并将以下完整的SQL语句复制进去。这将定义我们的数据结构。
-- 用户表:存储员工账号和密码
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
department TEXT NOT NULL,
role TEXT DEFAULT 'staff' -- staff 或 admin
);
-- 课程表:存储档案培训课程信息
DROP TABLE IF EXISTS courses;
CREATE TABLE courses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT NOT NULL, -- 课程内容或视频链接
category TEXT NOT NULL -- 档案分类,如:文书档案、科技档案
);
-- 学习记录表:记录员工的学习状态
DROP TABLE IF EXISTS progress;
CREATE TABLE progress (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
status TEXT DEFAULT 'not_started', -- not_started, completed
score INTEGER DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users (id),
FOREIGN KEY (course_id) REFERENCES courses (id)
);
第二步:编写数据库初始化脚本
创建名为init_db.py的文件,用于执行上述SQL并生成training.db数据库文件。
import sqlite3
connection = sqlite3.connect('training.db')
with open('schema.sql') as f:
connection.executescript(f.read())
cur = connection.cursor()
预置一个管理员账号:admin/123456
cur.execute("INSERT INTO users (username, password, department, role) VALUES (?, ?, ?, ?)",
('admin', '123456', '办公室', 'admin')
)
预置两个示例课程
cur.execute("INSERT INTO courses (title, content, category) VALUES (?, ?, ?)",
('机关文书档案管理规范', '本课程讲解文书档案的收集、整理、归档流程...', '文书档案')
)
cur.execute("INSERT INTO courses (title, content, category) VALUES (?, ?, ?)",
('电子档案安全保密指南', '学习涉密电子档案的存储与传输安全要求...', '安全保密')
)
connection.commit()
connection.close()
print("数据库初始化完成,已生成 training.db")
在终端执行python init_db.py。如果执行成功,当前目录下将出现training.db文件。
后端核心逻辑实现
创建主程序文件app.py。我们将实现用户登录、主页展示、课程详情页及学习进度提交的功能。
import sqlite3
from flask import Flask, render_template, request, session, redirect, url_for, flash
app = Flask(__name__)
app.secret_key = 'dev_key_archives_training' 用于Session加密,生产环境请修改为随机字符串
数据库连接辅助函数
def get_db_connection():
conn = sqlite3.connect('training.db')
conn.row_factory = sqlite3.Row 允许通过列名访问数据
return conn
首页/登录页路由
@app.route('/', methods=['GET', 'POST'])
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
conn = get_db_connection()
user = conn.execute('SELECT FROM users WHERE username = ? AND password = ?', (username, password)).fetchone()
conn.close()
if user:
session['user_id'] = user['id']
session['role'] = user['role']
session['username'] = user['username']
return redirect(url_for('dashboard'))
else:
flash('用户名或密码错误')
return render_template('login.html')
培训仪表盘路由
@app.route('/dashboard')
def dashboard():
if 'user_id' not in session:
return redirect(url_for('login'))
conn = get_db_connection()
获取所有课程
courses = conn.execute('SELECT FROM courses').fetchall()
获取当前用户的学习进度
progress_rows = conn.execute('SELECT course_id, status FROM progress WHERE user_id = ?', (session['user_id'],)).fetchall()
将进度转换为字典方便前端查找 {course_id: status}
user_progress = {row['course_id']: row['status'] for row in progress_rows}
conn.close()
return render_template('dashboard.html', courses=courses, progress=user_progress)
课程学习页路由
@app.route('/course/')
def course_detail(course_id):
if 'user_id' not in session:
return redirect(url_for('login'))
conn = get_db_connection()
course = conn.execute('SELECT FROM courses WHERE id = ?', (course_id,)).fetchone()
检查是否已学习
progress = conn.execute('SELECT status FROM progress WHERE user_id = ? AND course_id = ?',
(session['user_id'], course_id)).fetchone()
conn.close()
is_completed = progress['status'] == 'completed' if progress else False
return render_template('course.html', course=course, is_completed=is_completed)
提交学习完成路由
@app.route('/complete/', methods=['POST'])
def complete_course(course_id):
if 'user_id' not in session:
return redirect(url_for('login'))
conn = get_db_connection()
检查是否已有记录,有则更新,无则插入
existing = conn.execute('SELECT id FROM progress WHERE user_id = ? AND course_id = ?',
(session['user_id'], course_id)).fetchone()
if existing:
conn.execute('UPDATE progress SET status = ?, score = 100 WHERE id = ?',
('completed', existing['id']))
else:
conn.execute('INSERT INTO progress (user_id, course_id, status, score) VALUES (?, ?, ?, ?)',
(session['user_id'], course_id, 'completed', 100))
conn.commit()
conn.close()
flash('恭喜!该课程学习已完成。')
return redirect(url_for('dashboard'))
退出登录
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True, port=5000)
前端页面开发
在项目目录下创建templates文件夹。Flask会自动在此文件夹中寻找HTML文件。我们需要创建三个HTML文件:登录页、仪表盘页和课程详情页。
第一步:创建基础模板(可选,此处为简化直接创建独立页面)

第二步:创建登录页 templates/login.html
档案培训系统登录
系统登录
{% with messages = get_flashed_messages() %}
{% if messages %}
{{ messages[0] }}
{% endif %}
{% endwith %}
第三步:创建培训仪表盘 templates/dashboard.html
培训课程中心
行政单位档案培训系统
欢迎, {{ session.username }} |
退出
待培训课程列表
{% with messages = get_flashed_messages() %}
{% if messages %}
{{ messages[0] }}
{% endif %}
{% endwith %}
{% for course in courses %}
{{ course.title }} {{ course.category }}
{{ course.content[:50] }}...
{% if progress.get(course.id) == 'completed' %}
● 已完成培训
{% else %}
○ 未开始
{% endif %}
{% endfor %}
第四步:创建课程详情页 templates/course.html
{{ course.title }}
← 返回课程列表
{{ course.title }}
{{ course.content }}
(此处可扩展嵌入视频播放器或PDF文档阅读器,本示例为纯文本演示)
学习重点:
- 掌握档案分类的基本原则
- 熟悉档案借阅审批流程
- 了解电子档案备份策略
{% if is_completed %}
{% else %}
{% endif %}
部署与运行
所有代码已准备就绪,项目结构应如下所示:
项目文件夹/
├── app.py 主程序
├── init_db.py 数据库初始化脚本
├── schema.sql 数据库结构定义
├── training.db 运行init_db.py后生成的数据库文件
└── templates/ 模板文件夹
├── login.html
├── dashboard.html
└── course.html
第一步:启动服务
在终端确保位于项目目录下,执行以下命令启动Flask服务器:
python app.py
终端将显示Running on http://127.0.0.1:5000。
第二步:访问与测试
- 管理员登录:打开浏览器访问
http