一、环境准备与依赖安装
在开始构建济南档案培训管理系统之前,必须先配置好标准的Python开发环境。本系统基于Flask框架开发,轻量且易于部署,非常适合内部培训场景。
确保你的操作系统已经安装了Python 3.8或更高版本。打开终端,输入以下命令检查版本:
```bash
python3 --version
```
接下来,创建一个独立的项目目录,并进入该目录:
```bash
mkdir jinan_archive_training
cd jinan_archive_training
```
为了防止依赖冲突,强烈建议创建一个Python虚拟环境。执行以下命令创建并激活虚拟环境:
```bash
python3 -m venv venv
source venv/bin/activate
```
激活环境后,我们需要安装必要的Python库。创建一个名为requirements.txt的文件,并填入以下具体依赖版本,以确保环境稳定性:
```text
Flask==2.3.3
Flask-SQLAlchemy==3.0.5
Flask-Login==0.6.3
Werkzeug==2.3.7
```
保存文件后,执行安装命令:
```bash
pip install -r requirements.txt
```
二、数据库模型设计与初始化
本系统使用SQLite作为数据库,无需安装额外的数据库服务,配置简单且文件体积小,非常适合单机或小规模部署。在项目根目录下创建models.py文件,定义用户和培训课程的数据结构。
我们需要两个核心模型:User用于管理参加培训的档案人员,Course用于存储具体的培训课程内容。以下是完整的数据库模型代码:
```python
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from datetime import datetime
db = SQLAlchemy()
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
password = db.Column(db.String(150), nullable=False)
department = db.Column(db.String(100)) 部门信息
is_admin = db.Column(db.Boolean, default=False)
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
category = db.Column(db.String(50)) 例如:文书档案、科技档案
create_time = db.Column(db.DateTime, default=datetime.now)
class TrainingRecord(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
course_id = db.Column(db.Integer, db.ForeignKey('course.id'), nullable=False)
status = db.Column(db.String(20), default='completed') 记录培训状态
completion_time = db.Column(db.DateTime, default=datetime.now)
```
这段代码定义了用户表、课程表以及培训记录表。其中TrainingRecord通过外键关联用户和课程,用于追踪谁完成了哪门培训。
三、核心业务逻辑实现
创建app.py作为系统的入口文件。这里将包含应用初始化、数据库配置、用户认证逻辑以及路由处理。为了确保系统安全,密码存储将使用Werkzeug提供的哈希生成函数。
以下是app.py的完整代码实现:
```python
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
from models import db, User, Course, TrainingRecord
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config['SECRET_KEY'] = 'jinan-archive-training-secret-key-2024'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///archive_training.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
初始化数据库和默认数据
@app.before_first_request
def create_tables():
db.create_all()
如果没有管理员,创建一个默认管理员
if not User.query.filter_by(username='admin').first():
hashed_pw = generate_password_hash('admin123')
admin = User(username='admin', password=hashed_pw, is_admin=True)
db.session.add(admin)
添加默认济南档案培训课程
course1 = Course(title='济南档案归档整理规范', content='本课程详细讲解济南市文书档案的整理标准、分类方案及保管期限表...', category='基础规范')
course2 = Course(title='数字化档案加工技术实操', content='针对纸质档案扫描、OCR识别、双层PDF制作的全流程演示...', category='技术实操')
db.session.add(course1)
db.session.add(course2)
db.session.commit()
@app.route('/')
def index():
if current_user.is_authenticated:
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.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
login_user(user)
return redirect(url_for('dashboard'))
else:
flash('用户名或密码错误')
return render_template('login.html')
@app.route('/dashboard')
@login_required
def dashboard():
courses = Course.query.all()
查询当前用户已完成的课程ID
completed_ids = [r.course_id for r in TrainingRecord.query.filter_by(user_id=current_user.id).all()]
return render_template('dashboard.html', courses=courses, completed_ids=completed_ids)
@app.route('/course/
')
@login_required
def view_course(course_id):
course = Course.query.get_or_404(course_id)
return render_template('course_detail.html', course=course)
@app.route('/complete/')
@login_required
def complete_course(course_id):
记录培训完成状态
record = TrainingRecord(user_id=current_user.id, course_id=course_id)
db.session.add(record)
db.session.commit()
flash('恭喜,您已完成本课程培训!')
return redirect(url_for('dashboard'))
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
```
这段代码实现了用户登录、权限验证、课程列表展示以及课程完成标记的核心功能。特别注意create_tables函数,它在首次运行时会自动创建数据库表,并预置一个管理员账号(admin/admin123)和两门关于济南档案的默认课程。
四、前端页面构建
为了保持系统轻量,前端不使用复杂的JavaScript框架,而是采用原生HTML配合Bootstrap 5进行快速布局。在项目根目录下创建templates文件夹,并在其中创建以下HTML文件。
首先创建base.html作为基础模板:
```html
济南档案培训管理系统
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```

接着创建登录页面login.html:
```html
{% extends "base.html" %}
{% block content %}
{% endblock %}
```
然后创建课程列表页面dashboard.html:
```html
{% extends "base.html" %}
{% block content %}
培训课程列表
{% for course in courses %}
{{ course.title }}
{{ course.category }}
{{ course.content[:50] }}...
{% endfor %}
{% endblock %}
```
最后创建课程详情页面course_detail.html:
```html
{% extends "base.html" %}
{% block content %}
{{ course.title }}
确认完成培训
返回列表
{% endblock %}
```
五、生产环境部署配置
开发环境代码完成后,需要将其部署到服务器上供实际使用。我们使用Gunicorn作为WSGI服务器,配合Nginx作为反向代理,这是标准的Python Web部署方案。
安装Gunicorn:
```bash
pip install gunicorn
```
使用Gunicorn启动应用,建议开启4个worker进程以提高并发处理能力:
```bash
gunicorn -w 4 -b 0.0.0.0:8000 app:app
```
接下来配置Nginx。编辑Nginx配置文件(通常位于/etc/nginx/sites-available/archive_training),填入以下配置:
```nginx
server {
listen 80;
server_name your_server_ip; 替换为你的服务器IP或域名
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
alias /path/to/jinan_archive_training/static; 静态文件路径
}
}
```
创建软链接并重启Nginx:
```bash
sudo ln -s /etc/nginx/sites-available/archive_training /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
为了确保服务在后台持续运行,建议使用systemd管理Gunicorn进程。创建服务文件/etc/systemd/system/archive_training.service:
```ini
[Unit]
Description=Gunicorn instance to serve Jinan Archive Training
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/jinan_archive_training
Environment="PATH=/path/to/jinan_archive_training/venv/bin"
ExecStart=/path/to/jinan_archive_training/venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app
[Install]
WantedBy=multi-user.target
```
启动并设置开机自启:
```bash
sudo systemctl start archive_training
sudo systemctl enable archive_training
```
至此,济南档案培训管理系统已完全部署上线。管理员可以通过浏览器访问服务器IP,使用默认账号admin和密码admin123登录,进行后续的学员账号管理和课程发布。普通学员登录后即可查看课程详情并完成培训打卡。