跳到主要内容基于 SpringBoot 与 Vue 的高校实习生管理平台设计与实现 | 极客日志Java大前端java
基于 SpringBoot 与 Vue 的高校实习生管理平台设计与实现
本系统采用 SpringBoot 后端框架结合 Vue 前端技术构建高校实习生管理平台。通过 MySQL 数据库存储用户、企业及实习信息,实现了从注册登录到简历管理、招聘发布及培养记录的全流程数字化处理。系统引入 Token 机制进行权限验证,确保数据安全,支持跨域请求与动态交互,为高校与企业提供高效的实习对接解决方案。
信号故障1 浏览 基于 SpringBoot 与 Vue 的高校实习生管理平台设计与实现
技术选型
本项目选用 SpringBoot 作为后端核心框架,配合 Vue 构建响应式前端,数据存储采用 MySQL。SpringBoot 内置 Tomcat 容器,支持自动配置,能显著降低开发复杂度;Vue 的组件化与双向绑定特性提升了交互体验;MySQL 则保障了数据的一致性与查询效率。
后端基础
SpringBoot 简化了传统 Spring 应用的配置过程。以下是一个典型的启动入口示例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@GetMapping("/hello")
public String helloWorld() {
return "Hello, World!";
}
}
该类使用 @SpringBootApplication 标记应用入口,@RestController 定义 RESTful 接口。访问 /hello 路径即可触发方法返回结果,展示了 SpringBoot 快速搭建服务的能力。
前端交互
Vue.js 利用虚拟 DOM 实现高效渲染,数据驱动视图更新。开发者只需关注数据状态变化,UI 会自动同步。
<!DOCTYPE html>
<html>
<head>
<title>Vue.js Demo</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">
{{ message }}
Change Message
</script>
</head>
<body>
<div id="app">
<h2>
</h2>
<button @click="changeMessage">
</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: { message: 'Hello, Vue.js!' },
methods: {
changeMessage: function() {
this.message = 'Vue.js is awesome!';
}
}
});
</script>
</body>
</html>
此示例展示了 Vue 实例绑定、数据插值及事件绑定的基本用法,体现了其简洁灵活的开发模式。
系统功能与流程
系统涵盖用户管理、企业信息维护、招聘信息发布及实习生培养记录等核心模块。
认证与权限
用户需先注册后登录。登录成功后,系统生成 Token 用于后续请求的身份验证。权限控制通过拦截器实现,确保只有持有有效 Token 的用户才能访问受保护资源。
业务逻辑
管理员负责监管用户账户,包括信息的增删改查。各模块间存在共性操作,如信息管理均遵循统一的 CRUD 流程。
核心代码解析
登录与 Token 生成
登录接口接收用户名、密码及验证码,校验通过后生成 Token 并返回给客户端。
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(), username, "users", user.getRole());
return R.ok().put("token", token);
}
@Override
public String generateToken(Long userid, String username, String tableName, String role) {
TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
String token = CommonUtil.getRandomString(32);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.HOUR_OF_DAY, 1);
if(tokenEntity!=null) {
tokenEntity.setToken(token);
tokenEntity.setExpiratedtime(cal.getTime());
this.updateById(tokenEntity);
} else {
this.insert(new TokenEntity(userid, username, tableName, role, token, cal.getTime()));
}
return token;
}
权限拦截器
拦截器在请求处理前检查 Header 中的 Token。若 Token 无效且非白名单接口,则拒绝访问并返回 401 错误。
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
response.setStatus(HttpStatus.OK.value());
return false;
}
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
if(annotation!=null) {
return true;
}
String token = request.getHeader(LOGIN_TOKEN_KEY);
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
if(writer != null){
writer.close();
}
}
return false;
}
}
数据库设计
系统主要包含简历、企业、实习生培养记录及职位招聘等表结构。
DROP TABLE IF EXISTS `jianli`;
CREATE TABLE `jianli` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ',
`yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
`jianli_uuid_number` varchar(200) DEFAULT NULL COMMENT '简历唯一编号 ',
`jianli_name` varchar(200) DEFAULT NULL COMMENT '简历标题',
`jianli_xingming` varchar(200) DEFAULT NULL COMMENT '姓名',
`jianli_types` int(11) DEFAULT NULL COMMENT '求职意向 Search111',
`jianli_xinzi` varchar(200) DEFAULT NULL COMMENT '期望工资 Search111',
`jianli_xueli` varchar(200) DEFAULT NULL COMMENT '学历 Search111',
`jianli_jingli` varchar(200) DEFAULT NULL COMMENT '工作经历 Search111',
`sex_types` int(11) DEFAULT NULL COMMENT '性别',
`jianli_file` varchar(200) DEFAULT NULL COMMENT '简历文件',
`jianli_phone` varchar(200) DEFAULT NULL COMMENT '手机号',
`jianli_photo` varchar(200) DEFAULT NULL COMMENT '照片',
`jianli_address` varchar(200) DEFAULT NULL COMMENT '现在位置',
`jiaoyu_text` text COMMENT '教育经历',
`shixi_text` text COMMENT '实习或工作经历',
`geren_text` text COMMENT '个人介绍',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show3 listShow',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='简历';
DROP TABLE IF EXISTS `qiye`;
CREATE TABLE `qiye` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ',
`username` varchar(200) DEFAULT NULL COMMENT '账户 ',
`password` varchar(200) DEFAULT NULL COMMENT '密码 ',
`qiye_name` varchar(200) DEFAULT NULL COMMENT '企业名称 Search111 ',
`qiye_types` int(11) DEFAULT NULL COMMENT '企业类型',
`qiye_phone` varchar(200) DEFAULT NULL COMMENT '联系方式',
`qiye_email` varchar(200) DEFAULT NULL COMMENT '邮箱',
`qiye_photo` varchar(200) DEFAULT NULL COMMENT '企业 logo',
`qiye_chenglishijian_time` timestamp NULL DEFAULT NULL COMMENT '企业成立时间',
`qiye_content` text COMMENT '企业介绍',
`qiye_delete` int(11) DEFAULT NULL COMMENT '逻辑删除',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='企业';
DROP TABLE IF EXISTS `shixishengpeiyang`;
CREATE TABLE `shixishengpeiyang` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ',
`yonghu_id` int(11) DEFAULT NULL COMMENT '用户',
`shixishengpeiyang_uuid_number` varchar(200) DEFAULT NULL COMMENT '实习生培养记录编号',
`shixishengpeiyang_name` varchar(200) DEFAULT NULL COMMENT '实习生培养标题 Search111 ',
`shixishengpeiyang_address` varchar(200) DEFAULT NULL COMMENT '培养地点',
`shixishengpeiyang_types` int(11) DEFAULT NULL COMMENT '培养类型 Search111',
`shixishengpeiyang_time` timestamp NULL DEFAULT NULL COMMENT '培养时间',
`shixishengpeiyang_content` longtext COMMENT '培养内容',
`shixishengpeiyang_dafen` decimal(10,2) DEFAULT NULL COMMENT '打分 ',
`shixishengpeiyang_jieguo_types` int(11) DEFAULT NULL COMMENT '培养结果 Search111',
`shixishengpeiyang_pingyu_content` longtext COMMENT '培养评语',
`insert_time` timestamp NULL DEFAULT NULL COMMENT '上传时间',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show3 listShow',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='实习生培养记录';
DROP TABLE IF EXISTS `zhaopin`;
CREATE TABLE `zhaopin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 ',
`qiye_id` int(11) DEFAULT NULL COMMENT '企业',
`zhaopin_name` varchar(200) DEFAULT NULL COMMENT '招聘信息名称 Search111 ',
`zhaopin_photo` varchar(200) DEFAULT NULL COMMENT '招聘信息照片',
`zhaopin_daiyu` varchar(200) DEFAULT NULL COMMENT '薪资待遇',
`zhaopin_address` varchar(200) DEFAULT NULL COMMENT '上班地点',
`lianxiren_name` varchar(200) DEFAULT NULL COMMENT '联系人',
`zan_number` int(11) DEFAULT NULL COMMENT '赞',
`cai_number` int(11) DEFAULT NULL COMMENT '踩',
`zhaopin_phone` varchar(200) DEFAULT NULL COMMENT '招聘电话',
`zhaopin_types` int(11) DEFAULT NULL COMMENT '招聘岗位 Search111',
`zhaopin_renshu_number` int(11) DEFAULT NULL COMMENT '招聘人数',
`shangxia_types` int(11) DEFAULT NULL COMMENT '是否上架 ',
`zhaopin_content` text COMMENT '招聘信息详情',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间 show1 show2 photoShow',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='职位招聘';
以上表结构涵盖了实习管理所需的核心数据字段,支持多角色协同作业。
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online