零基础搭建旅游部门档案培训报名系统实操

一、环境准备与依赖安装

在开始构建旅游部门档案培训报名系统之前,我们需要确保本地开发环境已经配置妥当。本系统采用Python作为后端语言,使用Flask轻量级框架进行快速开发,数据库选用SQLite,无需额外安装数据库服务,适合快速落地。

请确保你的系统中已安装Python 3.8及以上版本。打开终端或命令提示符,输入以下命令检查Python版本:

```bash python --version ```

如果未安装,请前往Python官网下载安装包并完成安装。接下来,我们在本地创建一个项目文件夹,并进入该文件夹:

```bash mkdir tourism_training_sys cd tourism_training_sys ```

为了隔离项目依赖,我们需要创建一个虚拟环境。在项目根目录下执行:

```bash python -m venv venv ```

激活虚拟环境。Windows系统执行:

```bash venv\Scripts\activate ``>

macOS或Linux系统执行:

```bash source venv/bin/activate ```

激活成功后,命令行前缀会出现`(venv)`标识。现在安装核心依赖库Flask:

```bash pip install flask ```

至此,基础环境准备完毕。我们将在当前目录下创建以下文件结构:`app.py`(主程序)、`init_db.py`(数据库初始化)、`templates/`(存放HTML文件)。创建templates文件夹的命令如下:

```bash mkdir templates ```

二、数据库设计与初始化

旅游部门档案培训报名需要收集的关键信息包括:学员姓名、身份证号、所属单位、联系电话、职务以及报名时间。我们需要创建一个SQLite数据库文件`training.db`,并建立一张`registrations`表。

请在项目根目录下创建`init_db.py`文件,并写入以下完整代码。这段代码包含了连接数据库、创建表结构(包含自增ID、姓名、身份证、单位、电话、职务、时间戳)的逻辑:

```python import sqlite3 def init_db(): 连接到SQLite数据库文件,如果不存在会自动创建 conn = sqlite3.connect('training.db') cursor = conn.cursor() 创建registrations表 id: 自增主键 name: 学员姓名,非空 id_card: 身份证号,非空 unit: 所属单位,非空 phone: 联系电话,非空 job_title: 职务 created_at: 报名时间,默认为当前时间戳 cursor.execute(''' CREATE TABLE IF NOT EXISTS registrations ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, id_card TEXT NOT NULL, unit TEXT NOT NULL, phone TEXT NOT NULL, job_title TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() print("数据库初始化完成,training.db 已生成。") if __name__ == '__main__': init_db() ```

保存文件后,在终端执行以下命令运行初始化脚本:

```bash python init_db.py ```

执行成功后,项目目录下会生成一个`training.db`文件,这就是我们存储报名数据的数据库。

三、后端核心逻辑开发

接下来编写后端主程序`app.py`。我们需要实现三个核心功能路由:首页展示报名表单、处理表单提交数据、管理员查看报名列表。为了方便数据导出,我们还将增加一个简单的CSV导出功能。

在项目根目录创建`app.py`,写入以下完整代码。请注意代码中的注释,它们解释了每一步的操作细节,特别是数据验证和防SQL注入的处理:

```python import sqlite3 import csv from io import StringIO from flask import Flask, render_template, request, redirect, url_for, flash, make_response app = Flask(__name__) app.secret_key = 'your_secret_key_here' 用于Flash消息加密,请自行修改为随机字符串 数据库连接辅助函数 def get_db_connection(): conn = sqlite3.connect('training.db') conn.row_factory = sqlite3.Row 允许通过列名访问数据 return conn 首页:展示报名表单 @app.route('/') def index(): return render_template('index.html') 处理报名提交 @app.route('/submit', methods=['POST']) def submit(): 获取表单数据 name = request.form.get('name') id_card = request.form.get('id_card') unit = request.form.get('unit') phone = request.form.get('phone') job_title = request.form.get('job_title') 基础数据非空验证 if not all([name, id_card, unit, phone]): flash('错误:姓名、身份证号、单位和电话为必填项。') return redirect(url_for('index')) 身份证号简单格式验证(中国大陆18位) if len(id_card) != 18 or not id_card[:-1].isdigit(): flash('错误:请输入有效的18位身份证号码。') return redirect(url_for('index')) try: conn = get_db_connection() cursor = conn.cursor() 使用参数化查询防止SQL注入 cursor.execute('INSERT INTO registrations (name, id_card, unit, phone, job_title) VALUES (?, ?, ?, ?, ?)', (name, id_card, unit, phone, job_title)) conn.commit() conn.close() flash('报名成功!您的信息已录入系统。') except Exception as e: flash(f'系统错误:{str(e)}') return redirect(url_for('index')) return redirect(url_for('index')) 管理员列表页 @app.route('/admin') def admin(): conn = get_db_connection() 按报名时间倒序排列 cursor = conn.cursor() cursor.execute('SELECT FROM registrations ORDER BY created_at DESC') registrations = cursor.fetchall() conn.close() return render_template('admin.html', registrations=registrations) 导出CSV功能 @app.route('/export') def export(): conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT name, id_card, unit, phone, job_title, created_at FROM registrations ORDER BY created_at DESC') data = cursor.fetchall() conn.close() 创建CSV流 si = StringIO() writer = csv.writer(si) 写入表头 writer.writerow(['姓名', '身份证号', '所属单位', '联系电话', '职务', '报名时间']) 写入数据 for row in data: writer.writerow([row['name'], row['id_card'], row['unit'], row['phone'], row['job_title'], row['created_at']]) output = make_response(si.getvalue()) output.headers["Content-Disposition"] = "attachment; filename=training_data.csv" output.headers["Content-type"] = "text/csv" return output if __name__ == '__main__': 启动服务,开启Debug模式便于调试 app.run(debug=True, port=5000) ```

四、前端页面开发

零基础搭建旅游部门档案培训报名系统实操

为了确保页面美观且无需编写复杂的CSS,我们将使用Bootstrap 5 CDN。我们需要在`templates`文件夹下创建两个HTML文件:`index.html`(报名页)和`admin.html`(管理页)。

首先创建`templates/index.html`。这个页面包含一个报名表单,使用了Bootstrap的表单组件进行布局,并包含显示Flash消息(成功或错误提示)的代码块:

```html 旅游部门档案培训报名

旅游部门档案培训报名系统

{% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} {% endfor %} {% endif %} {% endwith %}
```

接下来创建`templates/admin.html`。这个页面用于展示所有报名人员的列表,并提供一个“导出数据”的按钮。页面包含一个响应式表格:

```html 报名数据管理
已报名人员列表
导出CSV数据
{% if registrations %} {% for reg in registrations %} {% endfor %} {% else %} {% endif %}
ID 姓名 身份证号 所属单位 联系电话 职务 报名时间
{{ reg.id }} {{ reg.name }} {{ reg.id_card }} {{ reg.unit }} {{ reg.phone }} {{ reg.job_title }} {{ reg.created_at }}
暂无报名数据
```

五、系统运行与测试

所有代码文件已准备就绪。现在启动Flask开发服务器进行测试。确保终端仍处于虚拟环境激活状态,且位于项目根目录下,执行以下命令:

```bash python app.py ```

终端将显示服务启动信息,通常包含 `Running on http://127.0.0.1:5000`。此时,打开浏览器访问该地址。

测试步骤一:提交报名数据

在首页表单中依次输入:张三110101199001011234市旅游局13800000000科员。点击“提交报名”。页面应刷新并显示绿色的“报名成功”提示框。

测试步骤二:查看管理后台

点击页面底部的“管理员入口”链接,或直接访问 `http://127.0.0.1:5000/admin`。你将看到刚才提交的张三的信息显示在表格中。

测试步骤三:数据导出

在管理页面点击右上角的“导出CSV数据”按钮。浏览器将下载一个名为`training_data.csv`的文件。使用Excel或文本编辑器打开该文件,确认表头和数据内容格式正确,且包含刚才录入的信息。

测试步骤四:异常处理

返回报名页,故意不输入姓名直接提交,系统应拦截并提示“姓名...为必填项”。输入错误的身份证号(如少于18位),系统应提示格式错误。这验证了后端的数据校验逻辑生效。

至此,一个功能完整、具备数据校验、展示及导出功能的旅游部门档案培训报名系统已完全落地。该系统虽轻量,但具备了Web应用的核心CRUD(增删改查)中的“增”和“查”功能,足以应对中小规模的培训报名需求。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统