档案系统业务培训在线报名功能实现全流程指南

一、核心功能与系统架构设计

本指南将指导你从零开始,实现一个完整的档案业务培训在线报名系统。该系统核心功能包括:培训课程发布、学员在线报名、报名数据收集与导出、以及简单的后台管理。我们将采用前后端分离的架构,前端使用原生HTML、CSS和JavaScript,后端使用Node.js搭配Express框架,数据存储使用轻量级的SQLite数据库。

1.1 系统模块划分

  • 前端展示页:展示培训课程列表、详情及报名表单。
  • 报名处理接口:接收并验证前端提交的报名数据,存入数据库。
  • 管理后台接口:提供课程增删改查、报名数据查询与导出的API。
  • 数据库:存储课程信息(courses表)和报名记录(registrations表)。

二、开发环境搭建与项目初始化

确保你的开发环境已安装Node.js(版本14或以上)。

2.1 创建项目目录并初始化

打开终端,执行以下命令:

``` mkdir archive-training-registration cd archive-training-registration npm init -y ```

2.2 安装必备依赖包

在项目根目录下,运行以下命令安装后端所需的核心包:

``` npm install express sqlite3 cors body-parser ```

同时,安装开发依赖nodemon,以便在开发时自动重启服务:

``` npm install --save-dev nodemon ```

2.3 配置启动脚本

打开项目根目录下的package.json文件,找到"scripts"部分,修改为:

``` "scripts": { "start": "node server.js", "dev": "nodemon server.js" } ```

三、后端服务器与数据库构建

3.1 创建主服务器文件

在项目根目录创建server.js文件,并写入以下完整代码:

``` const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const sqlite3 = require('sqlite3').verbose(); const app = express(); const PORT = process.env.PORT || 3000; // 启用中间件 app.use(cors()); // 允许前端跨域请求 app.use(bodyParser.json()); app.use(express.static('public')); // 用于托管前端静态文件 // 连接SQLite数据库(如果不存在则会自动创建) const db = new sqlite3.Database('./database.db', (err) => { if (err) { console.error('数据库连接失败:', err.message); } else { console.log('已成功连接到SQLite数据库。'); initDatabase(); // 初始化数据表 } }); // 初始化数据库表结构 function initDatabase() { // 创建课程表 db.run(`CREATE TABLE IF NOT EXISTS courses ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, trainer TEXT, date TEXT NOT NULL, location TEXT, max_seats INTEGER, current_seats INTEGER DEFAULT 0 )`); // 创建报名记录表 db.run(`CREATE TABLE IF NOT EXISTS registrations ( id INTEGER PRIMARY KEY AUTOINCREMENT, course_id INTEGER NOT NULL, name TEXT NOT NULL, department TEXT NOT NULL, employee_id TEXT NOT NULL, phone TEXT NOT NULL, email TEXT NOT NULL, notes TEXT, submit_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (course_id) REFERENCES courses (id) )`); } // 此处预留API接口位置,后续步骤将填充 app.listen(PORT, () => { console.log(`服务器运行在 http://localhost:${PORT}`); }); ```

3.2 实现核心API接口

server.js文件的app.listen之前,添加以下API接口。

3.2.1 课程相关API

获取所有课程列表

``` // 获取所有可用课程 app.get('/api/courses', (req, res) => { const sql = `SELECT FROM courses WHERE date >= date('now') ORDER BY date ASC`; db.all(sql, [], (err, rows) => { if (err) { res.status(400).json({ "error": err.message }); return; } res.json({ "message": "success", "data": rows }); }); }); ```

创建新课程(管理用)

``` // 创建新课程(管理后台使用,建议在实际部署时添加身份验证) app.post('/api/courses', (req, res) => { const { title, description, trainer, date, location, max_seats } = req.body; const sql = `INSERT INTO courses (title, description, trainer, date, location, max_seats) VALUES (?, ?, ?, ?, ?, ?)`; const params = [title, description, trainer, date, location, max_seats]; db.run(sql, params, function (err) { if (err) { res.status(400).json({ "error": err.message }); return; } res.json({ "message": "success", "courseId": this.lastID }); }); }); ```

3.2.2 报名相关API

提交报名信息:这是系统的核心接口,包含业务逻辑验证(如名额检查)。

``` // 提交培训报名 app.post('/api/register', (req, res) => { const { course_id, name, department, employee_id, phone, email, notes } = req.body; // 第一步:检查课程是否存在且未报满 const checkSql = `SELECT max_seats, current_seats FROM courses WHERE id = ?`; db.get(checkSql, [course_id], (err, course) => { if (err) { return res.status(500).json({ "error": "数据库查询失败" }); } if (!course) { return res.status(404).json({ "error": "未找到指定的培训课程" }); } if (course.current_seats >= course.max_seats) { return res.status(400).json({ "error": "该课程报名名额已满" }); } // 第二步:检查该员工是否已报名此课程(防止重复报名) const duplicateCheckSql = `SELECT id FROM registrations WHERE course_id = ? AND employee_id = ?`; db.get(duplicateCheckSql, [course_id, employee_id], (err, row) => { if (err) { return res.status(500).json({ "error": "重复性检查失败" }); } if (row) { return res.status(400).json({ "error": "您已报名此课程,请勿重复提交" }); } // 第三步:插入报名记录 const insertSql = `INSERT INTO registrations (course_id, name, department, employee_id, phone, email, notes) VALUES (?, ?, ?, ?, ?, ?, ?)`; db.run(insertSql, [course_id, name, department, employee_id, phone, email, notes], function (insertErr) { if (insertErr) { return res.status(500).json({ "error": "报名信息保存失败" }); } // 第四步:成功插入后,更新课程的当前报名人数 const updateSeatSql = `UPDATE courses SET current_seats = current_seats + 1 WHERE id = ?`; db.run(updateSeatSql, [course_id], (updateErr) => { if (updateErr) { console.error("更新课程人数失败:", updateErr); // 注意:这里发生了数据不一致的风险,生产环境需要引入事务(transaction)来回滚 } res.json({ "message": "报名成功!", "registrationId": this.lastID }); }); }); }); }); }); ```

四、前端页面开发

在项目根目录下创建public文件夹,所有前端文件将放置于此。

4.1 创建主页面 (index.html)

public目录下创建index.html,这是一个包含课程列表和报名表单的单页应用。

``` 档案业务培训报名系统
档案业务培训课程列表

档案系统业务培训在线报名功能实现全流程指南

正在加载课程信息...

培训报名

```

4.2 创建前端逻辑脚本 (main.js)

public目录下创建main.js,处理页面交互和API调用。

``` document.addEventListener('DOMContentLoaded', function() { const coursesContainer = document.getElementById('coursesContainer'); const courseSelect = document.getElementById('courseSelect'); const registrationForm = document.getElementById('registrationForm'); const messageDiv = document.getElementById('message'); // 1. 加载并渲染课程列表 fetch('/api/courses') .then(response => response.json()) .then(data => { if (data.message === 'success') { const courses = data.data; coursesContainer.innerHTML = ''; // 清空加载提示 courseSelect.innerHTML = ''; if (courses.length === 0) { coursesContainer.innerHTML = '

暂无即将开始的培训课程。

'; return; } courses.forEach(course => { // 渲染课程列表项 const isFull = course.current_seats >= course.max_seats; const courseItem = document.createElement('div'); courseItem.className = `course-item ${isFull ? 'full' : ''}`; courseItem.innerHTML = `

${course.title} ${isFull ? '(已满)' : ''}

讲师:${course.trainer}

时间:${course.date}

地点:${course.location}

名额:${course.current_seats} / ${course.max_seats}

${course.description}

`; coursesContainer.appendChild(courseItem); // 填充下拉选择框(仅显示未报满的课程) if (!isFull) { const option = document.createElement('option'); option.value = course.id; option.textContent = `${course.title} (${course.date})`; courseSelect.appendChild(option); } }); } else { showMessage('加载课程失败,请刷新页面重试。', 'error'); } }) .catch(error => { console.error('Error:', error); showMessage('网络错误,无法连接到服务器。', 'error'); }); // 2. 处理报名表单提交 registrationForm.addEventListener('submit', function(event) { event.preventDefault(); // 阻止表单默认提交行为 const formData = { course_id: parseInt(courseSelect.value), name: document.getElementById('name').value.trim(), department: document.getElementById('department').value.trim(), employee_id: document.getElementById('employeeId').value.trim(), phone: document.getElementById('phone').value.trim(), email: document.getElementById('email').value.trim(), notes: document.getElementById('notes').value.trim() }; // 简单的前端验证 if (!formData.course_id) { showMessage('请选择要报名的课程。', 'error'); return; } // 禁用提交按钮,防止重复提交 const submitBtn = registrationForm.querySelector('button[type="submit"]'); const originalBtnText = submitBtn.textContent; submitBtn.disabled = true; submitBtn.textContent = '提交中...'; // 调用报名API fetch('/api/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formData) }) .then(response => response.json()) .then(data => { if (data.message) { showMessage(data.message, 'success'); registrationForm.reset(); // 清空表单 } else if (data.error) { showMessage(data.error, 'error'); } }) .catch(error => { console.error('Error:', error); showMessage('提交失败,请检查网络连接。', 'error'); }) .finally(() => { // 恢复提交按钮状态 submitBtn.disabled = false; submitBtn.textContent = originalBtnText; }); }); // 显示消息的函数 function showMessage(text, type) { messageDiv.textContent = text; messageDiv.className = `message ${type}`; messageDiv.style.display = 'block'; // 5秒后自动隐藏消息 setTimeout(() => { messageDiv.style.display = 'none'; }, 5000); } }); ```

五、系统测试与部署

5.1 启动系统并测试

在项目根目录的终端中,运行开发服务器:

``` npm run dev ```

打开浏览器,访问 http://localhost:3000。你应该能看到课程列表页面和报名表单。

5.2 插入测试课程数据

为了测试,你需要先创建一些课程。可以使用命令行工具(如curl)或API测试工具(如Postman)调用创建课程接口。

示例:使用curl命令创建一门课程

``` curl -X POST http://localhost:3000/api/courses \ -H "Content-Type: application/json" \ -d '{ "title": "档案数字化管理规范", "description": "讲解档案数字化全流程标准操作规范与常见问题处理。", "trainer": "张主任", "date": "2023-11-15", "location": "总部三楼会议室", "max_seats": 30 }' ```

重复执行此命令(修改title、date等字段)创建多门课程用于测试。

5.3 完整功能测试流程

  1. 刷新前端页面,确认课程列表正确显示。
  2. 在报名表单中,选择一门课程,填写完整的个人信息,点击提交。
  3. 观察页面提示“报名成功!”。
  4. 再次为同一课程用相同工号报名,应提示“您已报名此课程”。
  5. 将一门课程的max_seats设置为1,并报名一次后,再次报名应提示“名额已满”。

5.4 简易管理后台与数据导出

你可以通过直接查询

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统