运输企业档案培训报名系统实操指南:从零搭建到上线全流程

一、系统核心需求与架构设计

本系统旨在解决运输企业内部档案培训的报名管理问题,核心功能包括:员工信息录入、培训课程发布、在线报名、报名审核、数据统计与导出。系统需支持多角色(管理员、部门负责人、普通员工)访问,并确保操作流程简单、数据安全。

我们采用前后端分离的B/S架构。前端使用Vue.js 3 + Element Plus构建用户界面,后端使用Spring Boot + MyBatis Plus提供RESTful API,数据库选用MySQL 8.0。这种组合成熟稳定,社区资源丰富,便于快速开发和部署。

二、开发环境准备与项目初始化

1. 基础软件安装

在你的开发机器上安装以下软件,请确保版本一致以避免兼容性问题。

  • JDK 17:从Oracle官网下载安装包,或使用OpenJDK。安装后设置环境变量JAVA_HOME指向安装目录。
  • Node.js 18.17.0 LTS:从Node.js官网下载安装包。安装完成后,在命令行执行 node -vnpm -v 验证安装。
  • MySQL 8.0:从MySQL官网下载社区版安装包。安装过程中,请记住你设置的root用户密码。
  • Maven 3.8.6:从Apache Maven官网下载二进制包,解压后设置环境变量MAVEN_HOME,并将%MAVEN_HOME%\bin添加到系统PATH中。
  • IntelliJ IDEA(社区版)Visual Studio Code:分别用于后端和前端开发。

2. 数据库初始化

打开MySQL命令行或客户端,执行以下SQL语句创建数据库和核心表结构。

```sql CREATE DATABASE IF NOT EXISTS `transport_training` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `transport_training`; -- 员工信息表 CREATE TABLE `employee` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `employee_id` varchar(20) NOT NULL COMMENT '员工工号', `name` varchar(50) NOT NULL COMMENT '姓名', `department` varchar(100) NOT NULL COMMENT '所属部门', `phone` varchar(20) DEFAULT NULL COMMENT '联系电话', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_employee_id` (`employee_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 培训课程表 CREATE TABLE `training_course` ( `id` int NOT NULL AUTO_INCREMENT, `course_code` varchar(50) NOT NULL COMMENT '课程编号', `course_name` varchar(200) NOT NULL COMMENT '课程名称', `description` text COMMENT '课程描述', `lecturer` varchar(100) NOT NULL COMMENT '讲师', `start_time` datetime NOT NULL COMMENT '开始时间', `end_time` datetime NOT NULL COMMENT '结束时间', `location` varchar(200) NOT NULL COMMENT '培训地点', `max_participants` int NOT NULL COMMENT '最大报名人数', `current_participants` int DEFAULT '0' COMMENT '当前报名人数', `status` tinyint DEFAULT '1' COMMENT '状态:1-开放报名,2-已截止,3-已取消', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_course_code` (`course_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 报名记录表 CREATE TABLE `registration` ( `id` int NOT NULL AUTO_INCREMENT, `employee_id` varchar(20) NOT NULL COMMENT '报名员工工号', `course_code` varchar(50) NOT NULL COMMENT '报名课程编号', `registration_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '报名时间', `status` tinyint DEFAULT '1' COMMENT '状态:1-待审核,2-已通过,3-已拒绝', `audit_comment` varchar(500) DEFAULT NULL COMMENT '审核意见', `audit_time` datetime DEFAULT NULL COMMENT '审核时间', `auditor` varchar(50) DEFAULT NULL COMMENT '审核人', PRIMARY KEY (`id`), UNIQUE KEY `uk_employee_course` (`employee_id`,`course_code`), KEY `idx_course_code` (`course_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ```

三、后端服务搭建与核心接口实现

1. 创建Spring Boot项目

使用IntelliJ IDEA的Spring Initializr创建项目,选择以下依赖:Spring Web, Spring Data JPA, MySQL Driver, Lombok, MyBatis Plus。生成项目后,在src/main/resources/application.yml中配置数据库连接。

```yaml server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/transport_training?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: your_password_here 替换为你的MySQL root密码 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 开发时开启SQL日志 global-config: db-config: logic-delete-field: deleted 逻辑删除字段名 logic-delete-value: 1 logic-not-delete-value: 0 ```

2. 实现核心业务接口

以“课程报名”接口为例,展示完整的Controller、Service、Mapper实现。

实体类 Registration.java:使用Lombok简化代码。

```java package com.transport.training.entity; import com.baomidou.mybatisplus.annotation.; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("registration") public class Registration { @TableId(type = IdType.AUTO) private Integer id; private String employeeId; private String courseCode; private LocalDateTime registrationTime; private Integer status; // 1-待审核,2-已通过,3-已拒绝 private String auditComment; private LocalDateTime auditTime; private String auditor; } ```

Mapper接口 RegistrationMapper.java:继承MyBatis Plus的BaseMapper。

```java package com.transport.training.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.transport.training.entity.Registration; public interface RegistrationMapper extends BaseMapper { } ```

服务层 RegistrationService.java:包含业务逻辑。

```java package com.transport.training.service; import com.baomidou.mybatisplus.extension.service.IService; import com.transport.training.entity.Registration; public interface RegistrationService extends IService { boolean registerForCourse(String employeeId, String courseCode); } ```

运输企业档案培训报名系统实操指南:从零搭建到上线全流程

服务实现类 RegistrationServiceImpl.java:实现报名逻辑。

```java package com.transport.training.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.transport.training.entity.Registration; import com.transport.training.entity.TrainingCourse; import com.transport.training.mapper.RegistrationMapper; import com.transport.training.mapper.TrainingCourseMapper; import com.transport.training.service.RegistrationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class RegistrationServiceImpl extends ServiceImpl implements RegistrationService { @Autowired private TrainingCourseMapper courseMapper; @Override @Transactional(rollbackFor = Exception.class) public boolean registerForCourse(String employeeId, String courseCode) { // 1. 检查课程是否存在且可报名 TrainingCourse course = courseMapper.selectById(courseCode); if (course == null || course.getStatus() != 1) { throw new RuntimeException("课程不存在或已截止报名"); } // 2. 检查是否已报满 if (course.getCurrentParticipants() >= course.getMaxParticipants()) { throw new RuntimeException("该课程报名人数已满"); } // 3. 检查是否已报名 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Registration::getEmployeeId, employeeId) .eq(Registration::getCourseCode, courseCode); if (this.getOne(queryWrapper) != null) { throw new RuntimeException("您已报名该课程,请勿重复操作"); } // 4. 创建报名记录 Registration reg = new Registration(); reg.setEmployeeId(employeeId); reg.setCourseCode(courseCode); reg.setStatus(1); // 待审核状态 boolean saveSuccess = this.save(reg); // 5. 更新课程当前报名人数 if (saveSuccess) { course.setCurrentParticipants(course.getCurrentParticipants() + 1); courseMapper.updateById(course); } return saveSuccess; } } ```

控制器 RegistrationController.java:暴露REST API。

```java package com.transport.training.controller; import com.transport.training.service.RegistrationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/api/registration") public class RegistrationController { @Autowired private RegistrationService registrationService; @PostMapping("/register") public Map register(@RequestParam String employeeId, @RequestParam String courseCode) { Map result = new HashMap<>(); try { boolean success = registrationService.registerForCourse(employeeId, courseCode); result.put("success", success); result.put("message", success ? "报名成功,等待审核" : "报名失败"); } catch (RuntimeException e) { result.put("success", false); result.put("message", e.getMessage()); } return result; } } ```

四、前端管理界面开发

1. 初始化Vue项目并安装依赖

打开命令行,进入你的工作目录,执行以下命令创建Vue项目并安装UI库和HTTP客户端。

```bash npm create vue@latest transport-training-frontend 根据提示选择:TypeScript, Vue Router, Pinia。其余选项按需选择或直接回车。 cd transport-training-frontend npm install element-plus axios npm install ```

src/main.ts中引入Element Plus。

```typescript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import App from './App.vue' import router from './router' const app = createApp(App) app.use(ElementPlus) app.use(router) app.mount('app') ```

2. 实现课程列表与报名页面

创建页面组件src/views/CourseList.vue,实现课程查询与报名功能。

```vue ```

五、系统部署与上线

1. 后端打包与部署

在后端项目根目录(包含pom.xml的目录)下,执行Maven打包命令。

```bash mvn clean package -DskipTests ```

命令执行成功后,在target目录下会生成一个transport-training-0.0.1-SNAPSHOT.jar文件。将此JAR文件上传到你的Linux服务器(如使用CentOS 7)。在服务器上,使用以下命令启动服务。

```bash 假设JAR文件已上传到 /opt/app/ 目录 cd /opt/app/ 使用nohup在后台运行,并将日志输出到app.log nohup java -jar transport-training-0.0.1-SNAPSHOT.jar > app.log 2>&1 & 检查进程是否启动 ps aux | grep transport-training ```

2. 前端构建与部署

在前端项目根目录下,执行构建命令,生成用于生产环境的静态文件。

```bash npm run build ```

命令执行成功后,项目根目录下会生成一个dist文件夹。将此文件夹内的所有文件上传到你的Web服务器(如Nginx)的网站根目录下,例如/usr/share/nginx/html/。配置Nginx,将请求代理到后端API。

编辑Nginx配置文件(例如/etc/nginx/conf.d/default.conf),添加以下配置。

```nginx server { listen 80; server_name your_domain.com; 替换为你的域名或服务器IP 前端静态文件 location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; 支持Vue Router的history模式 } 后端API代理 location /api/ { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ```
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统