济南档案培训管理系统从零开发与部署实战

一、环境准备与依赖安装

在开始构建济南档案培训管理系统之前,必须先配置好标准的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 }}

{{ course.content }}

确认完成培训 返回列表 {% 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登录,进行后续的学员账号管理和课程发布。普通学员登录后即可查看课程详情并完成培训打卡。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统