档案在线培训系统从零到一实操部署教程
一、环境准备与依赖安装
本教程基于Python轻量级Web框架Flask构建,无需配置复杂的服务器环境,适合快速搭建内部档案培训系统。请确保你的操作系统中已安装Python 3.8及以上版本。
我们需要创建一个独立的项目目录,并安装必要的依赖包。打开终端(Windows下为CMD或PowerShell),依次执行以下命令:
1. 创建项目目录并进入
mkdir archive_training
cd archive_training
2. 创建Python虚拟环境
虚拟环境可以隔离项目依赖,避免版本冲突。执行命令后,目录下会生成一个名为venv的文件夹。
python -m venv venv
3. 激活虚拟环境并安装Flask
注意:Windows系统使用venv\Scripts\activate,Mac或Linux系统使用source venv/bin/activate。激活成功后,命令行前缀会出现(venv)标识。
Windows激活命令
venv\Scripts\activate
安装Flask框架
pip install flask
至此,基础环境准备完毕。接下来我们将编写核心代码逻辑。
二、后端核心逻辑开发
在项目根目录下创建一个名为app.py的文件。这个文件将包含数据库配置、模型定义、用户认证以及培训内容展示的所有逻辑。我们将使用SQLite作为数据库,因为它无需安装额外的数据库服务,直接以文件形式存储,非常适合零门槛部署。
请将以下完整代码复制到app.py中。代码中已包含详细的注释说明每一步的功能。
import sqlite3
import os
from flask import Flask, render_template, request, redirect, url_for, session, flash
app = Flask(__name__)
app.secret_key = 'dev_secret_key_change_in_production' 用于Session加密,生产环境请修改
DATABASE = 'training.db'
数据库辅助函数
def get_db_connection():
conn = sqlite3.connect(DATABASE)
conn.row_factory = sqlite3.Row 允许通过列名访问数据
return conn
def init_db():
"""初始化数据库表结构"""
conn = get_db_connection()
创建用户表
conn.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password TEXT)')
创建课程表
conn.execute('CREATE TABLE IF NOT EXISTS course (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, description TEXT, video_url TEXT, category TEXT)')
创建学习记录表
conn.execute('CREATE TABLE IF NOT EXISTS progress (user_id INTEGER, course_id INTEGER, status INTEGER, PRIMARY KEY (user_id, course_id))')
conn.commit()
conn.close()
路由逻辑
@app.route('/')
def index():
if 'user_id' in session:
return redirect(url_for('dashboard'))
return redirect(url_for('login'))
@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 user WHERE username = ? AND password = ?', (username, password)).fetchone()
conn.close()
if user:
session['user_id'] = user['id']
session['username'] = user['username']
return redirect(url_for('dashboard'))
else:
flash('用户名或密码错误')
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
try:
conn = get_db_connection()
conn.execute('INSERT INTO user (username, password) VALUES (?, ?)', (username, password))
conn.commit()
conn.close()
flash('注册成功,请登录')
return redirect(url_for('login'))
except sqlite3.IntegrityError:
flash('用户名已存在')
return render_template('register.html')
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('login'))
@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 course').fetchall()
获取当前用户的学习进度
progress_rows = conn.execute('SELECT course_id FROM progress WHERE user_id = ?', (session['user_id'],)).fetchall()
completed_course_ids = {row['course_id'] for row in progress_rows}
conn.close()
return render_template('dashboard.html', courses=courses, completed_ids=completed_course_ids)
@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 course WHERE id = ?', (course_id,)).fetchone()
检查是否已完成
progress = conn.execute('SELECT status FROM progress WHERE user_id = ? AND course_id = ?',
(session['user_id'], course_id)).fetchone()
is_completed = bool(progress and progress['status'])
conn.close()
return render_template('course_detail.html', course=course, is_completed=is_completed)
@app.route('/complete/', methods=['POST'])
def mark_complete(course_id):
if 'user_id' not in session:
return redirect(url_for('login'))
conn = get_db_connection()
使用INSERT OR REPLACE确保记录唯一性
conn.execute('INSERT OR REPLACE INTO progress (user_id, course_id, status) VALUES (?, ?, 1)',
(session['user_id'], course_id))
conn.commit()
conn.close()
flash('恭喜!该课程学习进度已更新为完成。')
return redirect(url_for('dashboard'))
if __name__ == '__main__':
if not os.path.exists(DATABASE):
init_db()
预置一些演示数据
conn = get_db_connection()
添加演示管理员账号
try:
conn.execute('INSERT INTO user (username, password) VALUES (?, ?)', ('admin', '123456'))
添加演示档案课程
conn.execute("INSERT INTO course (title, description, video_url, category) VALUES (?, ?, ?, ?)",
('档案分类与编号规则', '学习如何对文书档案进行标准的分类和编号', 'https://www.w3schools.com/html/mov_bbb.mp4', '基础业务'))
conn.execute("INSERT INTO course (title, description, video_url, category) VALUES (?, ?, ?, ?)",
('数字化加工流程规范', '掌握纸质档案数字化扫描的全流程操作规范', 'https://www.w3schools.com/html/movie.mp4', '数字化'))
conn.commit()
except:
pass
conn.close()
app.run(debug=True, port=5000)
三、前端页面模板开发
Flask默认使用Jinja2模板引擎。我们需要在项目根目录下创建一个名为templates的文件夹,并在其中创建以下HTML文件。为了保持页面整洁,我们引入Bootstrap 5的CDN样式。
1. 创建基础模板 base.html
这个文件定义了网页的整体框架,其他页面将继承此模板。
档案在线培训系统
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
2. 创建登录页面 login.html
{% extends "base.html" %}
{% block content %}
用户登录
没有账号? 立即注册
{% endblock %}
3. 创建注册页面 register.html
{% extends "base.html" %}
{% block content %}
新用户注册
已有账号? 返回登录
{% endblock %}

4. 创建课程列表页面 dashboard.html
{% extends "base.html" %}
{% block content %}
培训课程列表
{% for course in courses %}
{{ course.title }}
{{ course.category }}
{{ course.description }}
{% endfor %}
{% endblock %}
5. 创建课程详情页面 course_detail.html
{% extends "base.html" %}
{% block content %}
← 返回列表
{{ course.title }}
{{ course.description }}
{% endblock %}
四、运行与测试
代码和页面文件准备就绪后,我们可以启动系统进行测试。
1. 启动服务
确保终端仍处于虚拟环境激活状态,在项目根目录下执行:
python app.py
当终端显示Running on http://127.0.0.1:5000时,说明服务启动成功。
2. 访问系统
打开浏览器,访问 http://127.0.0.1:5000。系统会自动跳转到登录页。
3. 测试流程
- 登录:使用代码中预置的管理员账号 admin,密码 123456 进行登录。
- 学习:登录后进入课程列表,点击“开始学习”观看演示视频。
- 打卡:观看完毕后,点击页面底部的“确认完成学习”按钮。
- 验证:返回课程列表页,对应的课程卡片按钮应变为绿色的“已完成学习”状态。
五、如何替换为真实档案视频
目前演示使用的是公网MP4链接。要替换为你内部的档案培训视频(如MP4文件),请执行以下步骤:
1. 创建静态资源目录
在项目根目录下创建名为static的文件夹。
mkdir static
2. 放置视频文件
将你的培训视频文件(例如lesson1.mp4)复制到static文件夹内。
3. 修改数据库数据
你需要更新数据库中course表的video_url字段。由于我们没有开发后台管理页面,可以直接使用SQLite命令行工具或Python脚本来更新。最简单的方法是停止运行中的服务,修改app.py中预置