作者主页:编程指南针

简介:Java领域优质创作者、CSDN博客专家  Java项目、简历模板、学习资料、面试题库、技术互助

文末获取源码

目录

一、项目概述.............................................................................................................. 3

二、需求分析.............................................................................................................. 3

2.1 功能需求............................................................................................................... 3

2.2 性能需求............................................................................................................. 10

三、数据库设计........................................................................................................ 10

3.1 实体关系图......................................................................................................... 10

3.2 数据库表设计...................................................................................................... 10

四、详细设计............................................................................................................ 10

4.1 登录设计............................................................................................................. 10

4.2 订单管理............................................................................................................. 11

五、系统界面............................................................................................................ 11

5.1相关界面.............................................................................................................. 11

六、心得体会............................................................................................................ 12

一,项目概述:

本项目基于Springboot 开发实现了一个求职招聘网站,系统分为前端求职招聘和后台数据管理后台。主要分为四个角以:管理员,求职者,公司管理员,公司HR,不同的角色进入系统有不同的功能操作。用户身份可以在后台管理设定。系统功能完整,界面美观大方,适合做毕业设计使用。

运行环境:

开发工具:IDEA或ECLIPSE

数据库:MYSQL+REDIS

开发技术:Springboot+mybatis+mybatisPlus+shiro

前端开发:AJAX+Jquery+layui

2.1 功能需求

2.1.1 系统划分

2.1.1.1 用户角色划分

  1. 求职者

登录本网站的一种用户,可以检索并查看网站入驻的公司及其发布的岗位信息,创建自己的简历,与招聘者进行联系。

  1. 应聘者

2.1、HR

公司下的某一个HR,可以发布新岗位和取消自己发布的岗位招聘

2.2、公司管理员

公司管理员,填写公司相关信息入驻网站后成为该角色,可以管理本公司发布的所有岗位,以及管理所有员工

3、管理员

可以查看站内相关数据,对私信、系统、设置进行管理。

2.1.1.2 前台服务的用例图及说明

  1. 招聘者功能

  1. 查看个人信息:查看自己账号的基本信息及修改
  2. 修改密码:修改自己账号的登录密码
  3. 私信:与求职者私信
  4. 公司入驻:如果是第一次登录该网站,用户可以输入公司信息,进行入驻网站,随后可发布岗位
  5. 岗位管理:对岗位进行发布、取消、编辑等操作
  6. 员工管理:权限允许的前提下,管理自己公司内所有的hr
  7. HR信息:查看自己的基本信息
  1. 求职者功能:

  1. 查看个人信息:查看自己账号的基本信息及修改
  2. 修改密码:修改自己账号的登录密码
  3. 私信:对感兴趣岗位的HR进行联系
  4. 个人简历:创建自己的简历,供HR查看
  5. 搜索岗位:搜索自己感兴趣的岗位
  6. 搜索公司:搜索自己感兴趣的公司

2.1.1.3 管理员后台用例图

  1. 查看个人信息:查看自己账号的基本信息及修改
  2. 修改密码:修改自己账号的登录密码
  3. 公司管理:管理站内所有入驻的公司
  4. 用户管理:管理站内所有用户
  5. 岗位管理:管理站内所有岗位
  6. 简历管理:管理站内所有简历
  7. 数据字典:管理站内数据字典
  8. 私信管理:查看所有用户的聊天关系、聊天记录等

    三、数据库设计

    3.1 实体关系图

    表结构暂略

五、系统界面

  1. 首页:

2.登录界面:

3.注册界面

4.岗位查看搜索

5.公司查看界面

6.HR管理界面

7.岗位管理界面

8.员工管理

9.个人简历

10.管理员后台管理

系统部分核心代码:

package com.iurac.recruit.controller;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.iurac.recruit.entity.Job;
import com.iurac.recruit.entity.User;
import com.iurac.recruit.exception.ManageException;
import com.iurac.recruit.security.RedisCacheManager;
import com.iurac.recruit.service.UserService;
import com.iurac.recruit.util.ImageUtil;
import com.iurac.recruit.util.Result;
import com.iurac.recruit.util.SaltUtil;
import com.iurac.recruit.util.TableResult;
import com.iurac.recruit.vo.PageResultVo;
import com.sun.org.apache.regexp.internal.RE;
import com.sun.org.apache.xpath.internal.operations.Mult;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;@Controller
public class UserController {@Autowiredprivate RedisCacheManager redisCacheManager;@Autowiredprivate UserService userService;@GetMapping({"/","/index"})public String toIndex(Model model){User user = (User) SecurityUtils.getSubject().getPrincipal();if(ObjectUtil.isNotNull(user)){model.addAttribute("userInfo",user);}return "index";}@GetMapping("/login")public String toLogin(){return "login";}@GetMapping("/register")public String toRegister(){return "register";}@PostMapping("/login")@ResponseBodypublic Result login(String username, String password, String code, HttpSession session) {String codes = (String) session.getAttribute("KAPTCHA_SESSION_KEY");if (StrUtil.hasBlank(codes)) {throw new RuntimeException("验证码已超时!");}String msg = "";try {if (codes.equalsIgnoreCase(code)){//获取主体对象Subject subject = SecurityUtils.getSubject();subject.login(new UsernamePasswordToken(username, password));return Result.succ("登录成功");}else{throw new RuntimeException("验证码错误!");}} catch (UnknownAccountException e) {e.printStackTrace();msg="用户名错误!";} catch (IncorrectCredentialsException e) {e.printStackTrace();msg="密码错误!";}catch (Exception e){e.printStackTrace();msg=e.getMessage();}return Result.fail(msg);}@GetMapping("logout")public String logout() {Subject subject = SecurityUtils.getSubject();subject.logout();return "login";}@PostMapping("/register")@ResponseBodypublic Result register(User user, @RequestParam("role")String role) throws Exception {user.setImg("default.png");userService.register(user,role);return Result.succ("操作成功");}@PostMapping("/user/update")@ResponseBodypublic Result updateUserInfo(@RequestParam(value = "phone",required = false) String phone,@RequestParam(value = "email",required = false) String email,@RequestParam(value="imgFile",required = false) MultipartFile file) throws Exception {User user = (User) SecurityUtils.getSubject().getPrincipal();redisCacheManager.getCache("authenticationCacheName").remove(user);if(!StrUtil.hasBlank(phone)){if(ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {user.setPhone(phone);}else {return Result.fail("请输入正确的手机号");}}if(!StrUtil.hasBlank(email)){if(ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){user.setEmail(email);}else {return Result.fail("请输入正确的邮箱地址");}}if(ObjectUtil.isNotNull(file) && !file.isEmpty()){String originalFileName = file.getOriginalFilename();String imgName = user.getImg().equals("default.png")?ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))): user.getImg();user.setImg(imgName);ImageUtil.saveImage(file,user.getImg(),"userIcon");}if(!userService.updateById(user)){return Result.fail("系统错误");}redisCacheManager.getCache("authenticationCacheName").put(user.getUsername(),user);return Result.succ("操作成功");}@PutMapping("/user/updatePassword/{password}")@ResponseBodypublic Result updateUserInfo(@PathVariable("password") String password) throws Exception {User user = (User) SecurityUtils.getSubject().getPrincipal();if(ReUtil.isMatch("[\\S]{6,12}", password)) {Md5Hash md5Hash = new Md5Hash(password,user.getSalt(),1024);if(md5Hash.toHex().equals(user.getPassword())){return Result.fail("请输入新密码");}redisCacheManager.getCache("authorizationCacheName").remove(user.toString());redisCacheManager.getCache("authenticationCacheName").remove(user);user.setPassword(md5Hash.toHex());System.out.println(user.getPassword());}else {return Result.fail("密码必须6到12位,且不能出现空格");}if(!userService.updateById(user)){return Result.fail("系统错误");}redisCacheManager.getCache("authenticationCacheName").put(user.getUsername(),user);return Result.succ("操作成功");}@RequiresRoles("admin")@ResponseBody@GetMapping("/user/getByCondition")public TableResult<User> getByCondition(@RequestParam("page")Long page, @RequestParam("limit")Long limit,@RequestParam("username")String username, @RequestParam("role")String role,@RequestParam("startDate")String startDate, @RequestParam(value = "endDate",required = false)String endDate,@RequestParam("locked")String locked){PageResultVo<User> pageResultVo = userService.getByCondition(page,limit,username,role,locked,startDate,endDate);return new TableResult(0,"",pageResultVo.getTotal(),pageResultVo.getRecords());}@RequiresRoles("admin")@ResponseBody@PostMapping("/user/save")public Result saveUser(@RequestParam("username")String username, @RequestParam("role")String[] role,@RequestParam("password")String password, @RequestParam(value = "imgFile",required = false) MultipartFile file,@RequestParam("phone")String phone, @RequestParam("email")String email) throws IOException, ManageException {if(StrUtil.hasEmpty(username,password,phone,email) || role.length<=0){return Result.fail("请输入完整信息,避免输入空格");}if(!ReUtil.isMatch("[\\S]{6,12}", password)) {return Result.fail("密码必须6到12位,且不能出现空格");}if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {return Result.fail("请输入正确的手机号");}if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){return Result.fail("请输入正确的邮箱地址");}User user = new User();user.setId(IdUtil.simpleUUID());user.setUsername(username);user.setCreateTime(DateUtil.now());user.setSalt(SaltUtil.getSalt(8));Md5Hash md5Hash = new Md5Hash(password, user.getSalt(), 1024);user.setPassword(md5Hash.toHex());user.setLocked("0");user.setPhone(phone);user.setEmail(email);if(ObjectUtil.isNotNull(file) && !file.isEmpty()){String originalFileName = file.getOriginalFilename();user.setImg(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));ImageUtil.saveImage(file,user.getImg(),"userIcon");}else {user.setImg("default.png");}userService.saveUser(user,role);return Result.succ("操作成功");}@RequiresRoles("admin")@ResponseBody@PostMapping("/user/update/{id}")public Result updateUser(@PathVariable("id")String id,@RequestParam("role")String[] role,@RequestParam("password")String password, @RequestParam(value = "imgFile",required = false) MultipartFile file,@RequestParam("phone")String phone, @RequestParam("email")String email) throws IOException, ManageException {if(StrUtil.hasEmpty(password,phone,email) || role.length<=0){return Result.fail("请输入完整信息,避免输入空格");}if(!ReUtil.isMatch("[\\S]{6,12}", password)) {return Result.fail("密码必须6到12位,且不能出现空格");}if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", phone)) {return Result.fail("请输入正确的手机号");}if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", email)){return Result.fail("请输入正确的邮箱地址");}User user = userService.getById(id);redisCacheManager.getCache("authorizationCacheName").remove(user.toString());redisCacheManager.getCache("authenticationCacheName").remove(user);user.setSalt(SaltUtil.getSalt(8));Md5Hash md5Hash = new Md5Hash(password, user.getSalt(), 1024);user.setPassword(md5Hash.toHex());user.setPhone(phone);user.setEmail(email);if(ObjectUtil.isNotNull(file) && !file.isEmpty()){String originalFileName = file.getOriginalFilename();user.setImg(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));ImageUtil.saveImage(file,user.getImg(),"userIcon");}userService.updateUser(user,role);return Result.succ("操作成功");}@RequiresRoles("admin")@ResponseBody@PostMapping("/user/delete/{id}")public Result deleteUser(@PathVariable("id")String id) throws  ManageException {userService.deleteUser(id);return Result.succ("操作成功");}@RequiresRoles("admin")@ResponseBody@PostMapping("/user/lock/{id}")public Result lockUser(@PathVariable("id")String id) throws  ManageException {User user = userService.getById(id);user.setLocked("1".equals(user.getLocked())?"0":"1");userService.updateById(user);return Result.succ("操作成功");}
}
package com.iurac.recruit.controller;import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.iurac.recruit.entity.Company;
import com.iurac.recruit.entity.Resume;
import com.iurac.recruit.entity.User;
import com.iurac.recruit.exception.ManageException;
import com.iurac.recruit.service.ResumeService;
import com.iurac.recruit.util.ImageUtil;
import com.iurac.recruit.util.Result;
import com.iurac.recruit.util.TableResult;
import com.iurac.recruit.vo.PageResultVo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;/*** <p>*  前端控制器* </p>** @author iurac* @since 2021-06-03*/
@Controller
public class ResumeController {@Autowiredprivate ResumeService resumeService;@PostMapping("/resume/saveOrUpdate")@ResponseBodypublic Result saveOrUpdate(Resume resume,@RequestParam(value="imgFile",required = false) MultipartFile file) throws Exception {if(StrUtil.hasBlank(resume.getName(),resume.getTechnology(),resume.getSalary(), resume.getMajor(),resume.getJob(),resume.getIntroduction(),resume.getExperience(),resume.getCollege(),resume.getBirth(),resume.getEducation(),resume.getPolitical(),resume.getMarriage(),resume.getSex())){return Result.fail("请输入完成信息,避免输入空格");}if(!ReUtil.isMatch("(13\\d|14[579]|15[^4\\D]|17[^49\\D]|18\\d)\\d{8}", resume.getPhone())) {return Result.fail("请输入正确的手机号");}if(!ReUtil.isMatch("\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", resume.getEmail())){return Result.fail("请输入正确的邮箱地址");}User user = (User) SecurityUtils.getSubject().getPrincipal();resume.setUserId(user.getId());QueryWrapper<Resume> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",user.getId());Resume exitedResume = resumeService.getOne(queryWrapper);resume.setPhoto("default.png");boolean isUpdate = true;if(ObjectUtil.isNull(exitedResume)){//判断是新增还是更新resume.setId(IdUtil.simpleUUID());isUpdate = false;}else {resume.setId(exitedResume.getId());resume.setPhoto(exitedResume.getPhoto());}if(ObjectUtil.isNotNull(file) && !file.isEmpty()){String originalFileName = file.getOriginalFilename();String photoName = resume.getPhoto().equals("default.png")?ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))): resume.getPhoto();resume.setPhoto(photoName);ImageUtil.saveImage(file,resume.getPhoto(),"photo");}boolean flag = isUpdate?resumeService.updateById(resume):resumeService.save(resume);if(flag){return Result.succ("操作成功");}else {return Result.fail("系统错误");}}@RequiresRoles("admin")@ResponseBody@GetMapping("/resume/getByCondition")public TableResult<Resume> getByCondition(@RequestParam("page")Long page, @RequestParam("limit")Long limit,@RequestParam("username")String username){PageResultVo<Resume> pageResultVo = resumeService.getByCondition(page,limit,username);return new TableResult(0,"",pageResultVo.getTotal(),pageResultVo.getRecords());}@RequiresRoles("admin")@ResponseBody@PostMapping("/resume/update/{id}")public Result updateResume(@PathVariable("id")String id, @RequestParam(value = "imgFile",required = false) MultipartFile file,Resume resume) throws IOException {if(StrUtil.hasEmpty(resume.getSex(),resume.getMarriage(),resume.getPolitical(),resume.getEducation(),resume.getEmail(),resume.getAge(),resume.getPhone(),resume.getName(),resume.getExperience(),resume.getTechnology(),resume.getSalary(),resume.getMajor(),resume.getIntroduction(),resume.getCollege(),resume.getBirth(),resume.getJob())){return Result.fail("请输入完整信息,避免输入空格");}Resume exitedResume = resumeService.getById(id);resume.setId(id);resume.setUserId(exitedResume.getUserId());resume.setPhoto(exitedResume.getPhoto());if(ObjectUtil.isNotNull(file) && !file.isEmpty()){String originalFileName = file.getOriginalFilename();resume.setPhoto(ImageUtil.getFileName(originalFileName.substring(originalFileName.lastIndexOf("."))));ImageUtil.saveImage(file,resume.getPhoto(),"companyIcon");}return resumeService.updateById(resume)?Result.succ("操作成功"):Result.fail("操作失败");}@RequiresRoles("admin")@ResponseBody@PostMapping("/resume/delete/{id}")public Result deleteResume(@PathVariable("id")String id) {resumeService.removeById(id);return Result.succ("操作成功");}/**** @param id  用户ID* @param model* @return*/@RequiresUser@GetMapping("/resume/detail/{id}")public String detail(@PathVariable("id")String id, Model model) {Resume resume = resumeService.getByUserId(id);model.addAttribute("resumeInfo",resume);return "service/detail_resume";}
}

毕业设计:基于Springboot实现求职招聘,校园招聘系统相关推荐

  1. java计算机毕业设计基于安卓Android的高校校园跑腿系统app(源码+系统+mysql数据库+Lw文档)

    项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中,电子商务的发展又促进了快递行业的诞生,由此延伸出相应的跑腿业务,特别是在校园内最后一公里为模式的平台迅速发展起来.为 ...

  2. java计算机毕业设计基于安卓Android的高校校园跑腿系统app uniapp 小程序

    项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中,电子商务的发展又促进了快递行业的诞生,由此延伸出相应的跑腿业务,特别是在校园内最后一公里为模式的平台迅速发展起来.为 ...

  3. Python-Django毕业设计基于微信小程序的校园跑腿系统(程序+Lw)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  4. springboot毕业设计 基于springboot多用户商城(淘宝京东)系统毕业设计设计与实现参考

    功能清单 [用户功能模块] (1)登录功能:注册普通账号登录:登录后可以修改用户的基本信息,也可以退出. (2)浏览资讯:浏览网站管理发布的资讯,可以评论,评论后需要管理员审核和查看.也可以收藏资讯. ...

  5. 毕业设计-基于微信小程序的校园参赛系统

    目录 前言 课题背景与简介 实现设计思路 一.设计背景 二.系统设计概述 三.技术选型及重点功能设计实现 四.系统重点功能实现 五.总结 实现效果样例 更多帮助 前言

  6. 毕业设计-基于微信小程序的校园互助系统

    目录 前言 课题背景与简介 实现设计思路 一.设计思路 二.系统架构设计 三.安全策略 四.功能实现 五.总结 实现效果样例 更多帮助 前言

  7. java计算机毕业设计基于springboo+vue的毕业生信息招聘求职平台管理系统

    项目介绍 随着社会的快速发展,计算机的影响是全面且深入的.人们的生活水平不断提高,日常生活中毕业生对招聘平台方面的要求也在不断提高,需要招聘平台的人数更是不断增加,使得毕业生信息招聘平台的开发成为必需 ...

  8. 教你手把手基于java实现兼职招聘系统、基于SSM+mysql的Web校园招聘网站

    Java实现的兼职招聘系统.基于SSM+mysql的Web校园招聘网站 后期会继续实现springboot版本 需要学习的可以一起交流 项目环境 SSM JSP.JSTL.jQuery.HTML.CS ...

  9. (附源码)springboot基于微信小程序的校园外卖系统 毕业设计091024

    Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...

  10. springboot基于微信小程序的校园外卖系统毕业设计源码091024

    Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...

最新文章

  1. UA MATH566 统计理论 QE练习题2.2
  2. 文件上传测试 bugku
  3. .NET 6新特性试用 | System.Text.Json序列化代码自动生成
  4. C语言无符号数运算问题
  5. 作者:张岩,男,北京大学教授、博士生导师。
  6. 多用途响应式ppt资源下载平台-html模板
  7. Strust2 Mysql数据库,sql语句分页,JSP显示
  8. php导出服务器表格乱码,phpExcel导出, 在本地正常,在服务器乱码解决办法
  9. java与c语言_Java与C语言的区别之我见
  10. oracle时间差转换成小时分钟,oracle 时间差 具体到天:小时:分
  11. YII2 搭建redis拓展(教程)
  12. Vue:返回上一个路由
  13. 学习金字塔 理论的一个应用
  14. PMI与股市同期走势图
  15. 你不知道的3D电影7大危害
  16. Android6.0以下系统判断相机权限
  17. gorilla/mux类库解析
  18. PPT打印省纸法及改变ppt背景
  19. Blander入门笔记(1) 界面和视窗
  20. 周杰伦的2000w个故事

热门文章

  1. 【 Vivado 】Working with Sources in Non-Project Mode
  2. Spartan-6系列内部模块介绍之可配置逻辑模块(CLB)
  3. JVM运行时数据区域
  4. 如何在 CentOS 7 上安装 Nginx
  5. 学嵌入式Linux软件开发需要的知识
  6. 福特CEO加入IBM董事会:为探索自动驾驶和车联网
  7. 关于编译安装nginx的一些问题
  8. mysql免安装版的问题
  9. CPU卡及其应用领域简介
  10. Python中多层List展平为一层