一、环境准备与依赖安装
在开始构建莆田档案培训学员管理系统之前,必须先配置好Python开发环境。本系统基于Flask轻量级框架开发,使用SQLite作为数据库,无需额外安装数据库服务,适合快速落地。
打开终端或命令提示符,检查Python版本。建议使用Python 3.8及以上版本以确保兼容性。输入以下命令:
```bash
python --version
```
接下来,为了防止项目依赖冲突,我们需要创建一个独立的虚拟环境。在项目目录下执行以下命令创建并激活虚拟环境:
```bash
Windows系统
python -m venv venv
venv\Scripts\activate
Linux或MacOS系统
python3 -m venv venv
source venv/bin/activate
```
激活虚拟环境后,安装本项目所需的核心依赖包:Flask(Web框架)、Flask-SQLAlchemy(ORM数据库工具)。直接复制以下命令执行:
```bash
pip install flask flask-sqlalchemy
```
安装完成后,创建项目根目录文件夹,命名为putian_archives_training,后续所有文件将在此目录下创建。
二、项目目录结构规划
为了保证代码的可维护性,请严格按照以下目录结构创建文件和文件夹。请在putian_archives_training根目录下手动创建templates和static文件夹:
- putian_archives_training/ (项目根目录)
- app.py (主程序入口)
- models.py (数据库模型定义)
- templates/ (HTML模板存放目录)
- base.html (基础布局模板)
- index.html (学员列表页)
- add.html (添加学员页)
- edit.html (编辑学员页)
- static/ (静态资源目录,本例暂不涉及)
三、数据库模型设计
创建models.py文件,用于定义数据库表结构。针对莆田档案培训的需求,我们需要存储学员的姓名、身份证号、所属单位、培训类型、培训日期及考核成绩。请将以下完整代码复制到models.py中:
```python
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Trainee(db.Model):
__tablename__ = 'trainees'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
id_card = db.Column(db.String(18), unique=True, nullable=False)
unit = db.Column(db.String(100), nullable=False)
training_type = db.Column(db.String(50), nullable=False)
training_date = db.Column(db.Date, nullable=False)
score = db.Column(db.Integer, nullable=False)
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'id_card': self.id_card,
'unit': self.unit,
'training_type': self.training_type,
'training_date': self.training_date.strftime('%Y-%m-%d'),
'score': self.score
}
```
注意:身份证号使用String类型存储,避免科学计数法问题;日期使用Date类型便于后续统计。
四、后端业务逻辑开发
创建app.py文件,这是系统的核心逻辑部分,包含数据库配置、路由定义和CRUD(增删改查)操作。请复制以下完整代码:
```python
from flask import Flask, render_template, request, redirect, url_for, flash
from datetime import datetime
from models import db, Trainee
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///training.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'putian_archives_secret_key_2024'
db.init_app(app)
with app.app_context():
db.create_all()
@app.route('/')
def index():
search_query = request.args.get('search', '')
query = Trainee.query
if search_query:
query = query.filter(Trainee.name.contains(search_query) | Trainee.id_card.contains(search_query))
trainees = query.order_by(Trainee.training_date.desc()).all()
return render_template('index.html', trainees=trainees, search_query=search_query)
@app.route('/add', methods=['GET', 'POST'])
def add_trainee():
if request.method == 'POST':
try:
name = request.form['name']
id_card = request.form['id_card']
unit = request.form['unit']
training_type = request.form['training_type']
training_date = datetime.strptime(request.form['training_date'], '%Y-%m-%d')
score = int(request.form['score'])
new_trainee = Trainee(
name=name, id_card=id_card, unit=unit,
training_type=training_type, training_date=training_date, score=score
)
db.session.add(new_trainee)
db.session.commit()
flash('学员档案添加成功!', 'success')
return redirect(url_for('index'))
except Exception as e:
db.session.rollback()
flash(f'添加失败,请检查输入信息,特别是身份证号是否重复。错误: {e}', 'error')
return render_template('add.html')
@app.route('/edit/
', methods=['GET', 'POST'])
def edit_trainee(id):
trainee = Trainee.query.get_or_404(id)
if request.method == 'POST':
try:
trainee.name = request.form['name']
trainee.id_card = request.form['id_card']
trainee.unit = request.form['unit']
trainee.training_type = request.form['training_type']
trainee.training_date = datetime.strptime(request.form['training_date'], '%Y-%m-%d')
trainee.score = int(request.form['score'])
db.session.commit()
flash('学员档案更新成功!', 'success')
return redirect(url_for('index'))
except Exception as e:
db.session.rollback()
flash(f'更新失败: {e}', 'error')
return render_template('edit.html', trainee=trainee)
@app.route('/delete/', methods=['POST'])
def delete_trainee(id):
trainee = Trainee.query.get_or_404(id)
try:
db.session.delete(trainee)
db.session.commit()
flash('学员档案已删除。', 'success')
except Exception as e:
db.session.rollback()
flash(f'删除失败: {e}', 'error')
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True, port=5000)
```

这段代码实现了自动创建数据库文件training.db,首页支持按姓名或身份证号搜索,以及完整的增删改查逻辑。
五、前端页面实现
为了保持界面简洁且无需复杂的前端构建工具,我们使用Bootstrap 5 CDN进行样式渲染。请在templates文件夹下依次创建以下HTML文件。
1. 基础模板 base.html
这是所有页面的公共骨架,包含导航栏和消息提示样式:
```html
莆田档案培训管理系统
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
{{ message }}
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
```
2. 学员列表页 index.html
展示所有学员数据,并提供搜索、编辑和删除入口:
```html
{% extends "base.html" %}
{% block content %}
| ID |
姓名 |
身份证号 |
所属单位 |
培训类型 |
培训日期 |
成绩 |
操作 |
{% for trainee in trainees %}
| {{ trainee.id }} |
{{ trainee.name }} |
{{ trainee.id_card }} |
{{ trainee.unit }} |
{{ trainee.training_type }} |
{{ trainee.training_date.strftime('%Y-%m-%d') }} |
{{ trainee.score }} |
编辑
|
{% else %}
| 暂无数据 |
{% endfor %}
{% endblock %}
```
3. 添加学员页 add.html
包含一个完整的表单,用于录入新学员信息:
```html
{% extends "base.html" %}
{% block content %}
新增学员档案
{% endblock %}
```
4. 编辑学员页 edit.html
复用添加页面的表单结构,但预填充现有数据:
```html
{% extends "base.html" %}
{% block content %}
编辑学员档案
{% endblock %}
```
六、系统启动与功能验证
所有代码文件创建完毕后,即可启动系统。确保终端位于项目根目录下,且虚拟环境处于激活状态,执行以下命令启动服务:
```bash
python app.py
```
当终端出现Running on http://127.0.0.1:5000提示时,说明启动成功。打开浏览器,访问http://127.0.0.1:5000。
验证步骤:
- 添加数据:点击“+ 新增学员”,输入姓名“张三”,身份证号“350300199001011234”,单位“莆田市档案馆”,选择培训类型和日期,输入成绩“85”,点击提交。确认页面跳转回列表页且数据显示正确。
- 搜索功能:在搜索框输入“张三”或身份证号部分数字,点击搜索,确认列表能正确过滤出对应记录。
- 编辑功能:点击张三记录后的“编辑”按钮,修改成绩为“90”,保存后确认列表数据已更新。
- 删除功能:点击“删除”按钮,确认弹窗提示,确认后该记录应从列表中移除。
至此,一套针对莆田档案培训场景的轻量级学员管理系统已完全落地。数据将保存在根目录下的training.db文件中,重启服务器后数据依然存在。