前后端分离开发|基于SSM的就业管理系统分析与设计

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-GX-065

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:SSM框架

前台开发技术:Vue+ElementUI

二,项目简介

2.1 绪 论

随着行计算机的快速发展,人们已经进入了信息时代,人们获得信息并进行相关信息的交流已经不再只是报纸、电视、广播等传统媒体,尤其是毕业生就业,更需要大量的就业信息。如果学校能够提供一个毕业生的就业信息平台,就能够快速有效的帮助学生和相关企业获得对方想要的职位和学生,并且可以让老师或者管理员能够轻松效率地浏览所有的学生就业信息。

本系统实现一个线上的就业管理系统,为毕业生提供免费、安全的互联网环境。同时也为企业提供毕业生资源的一个渠道,提供企业招聘和毕业生就业的问题。就业信息管理系统根据社会现状极力设计出能够满足社会人员需求的就业信息管理系统。本就业管理系统通过Java语言、MySQL数据库、SSM框架、JSP等技术开发,实现了三类用户的功能模块,三类用户分别为招聘公司、高校、毕业生。对于学生模块可实现注册、招聘信息模块、公司信息模块、新闻资讯模块、在线留言模块、后台管理模块;对于企业模块可实现招聘信息管理、简历信息管理、在线留言;对于管理员模块可实现学生管理、企业管理、岗位类型管理、招聘信息管理、简历信息管理、公司信息管理、在线留言、系统管理。

2.2 用例分析

1、登录功能可供学生、企业和管理员共同使用,登录用例分析,如图2.1所示。

图2.1 登录系统用例图

2、注册功能可供学生使用,注册用例分析,如图2.2所示。

图2.2 注册系统用例图

3、修改密码功能可供学生、企业和管理员共同使用,修改密码用例分析,如图2.3所示。

图2.3 修改密码用例图

4、个人信息修改功能可供学生、企业和管理员共同使用,个人信息用例分析,如图2.4所示。

图2.4 个人信息用例图

5、删除和修改角色信息功能可供学生、企业和管理员共同使用,增减和查询角色信息仅能提供管理员使用,角色管理用例分析,如图2.5所示。

图2.5 角色管理用例图

6、学生可查看招聘信息,管理员和企业可增加删除修改招聘信息,招聘信息管理用例分析,如图2.6所示。

图2.6 招聘信息管理用例图

7、学生可查询岗位信息,管理员和企业可增加删除修改岗位信息,岗位信息管理用例分析,如图2.7所示。

图2.7 岗位信息管理用例图

8、企业和管理员可删除、修改、查询简历信息,学生可增加简历信息,简历信息用例分析,如图2.8所示。

图2.8 简历管理用例图

9、企业和管理员可查询、修改、删除、增加公司信息,学生可查询公司信息,公司信息用例分析,如图2.9所示。

图2.9 公司信息管理用例图

10、企业和管理员可增加、删除、修改、查询和回复学生留言,学生可增加和查询留言信息,留言信息管理用例分析,如图2.10所示。

图2.10 留言信息管理用例图

11、学生、企业和管理员可增加和查询新闻资讯,管理员可删除修改新闻资讯,新闻资讯用例分析,如图2.11所示。

图2.11 新闻资讯管理用例图

2.3 系统功能分析

管理员用户系统分为七个部分,具体功能模块图如图 2.2 所示

图4.2 管理员功能模块图

  1. 学生管理模块:学生管理模块主要实现管理员对学生信息的管理,当高校内的学生新增时,可以添加相应的学生账号、学生姓名、性别、电话号码、年龄、学历、邮编、就业情况等属性,在管理员管理学生信息过程中需要更改信息时,管理员可以对学生信息进行增删改查。当管理员修改学生信息时,系统中与该学生相关联的信息也需要一并修改,若系统中有其他信息与该学生相关联时,则该学生信息不能被删除。为了查询学生信息更方便,可以根据学生账号和学生姓名进行模糊查询功能。
  2. 企业管理模块:企业管理模块主要实现管理员对企业信息的管理,当新增企业信息时,可以添加相应的企业账号、企业名称、详细地址、电话号码、企业类型、所属行业等属性,在管理员管理企业信息过程中需要更改信息时,管理员可以对企业信息进行增删改查。当管理员修改企业信息时,系统中与该企业相关联的信息也需要一并修改,若系统中有其他信息与该企业相关联时,则该企业信息不能被删除。为了查询企业信息更方便,可以根据企业账号和企业姓名进行模糊查询功能。
  3. 岗位类型模块:岗位类型管理模块主要实现管理员对企业招聘岗位类型信息的管理,当新增企业招聘岗位类型信息时,可以添加相应的岗位类型名称,在管理员管理企业招聘岗位类型信息过程中需要更改信息时,管理员可以对企业招聘岗位类型信息进行增删改查。当管理员修改企业招聘岗位类型信息时,系统中与该企业招聘岗位类型相关联的信息也需要一并修改,若系统中有其他信息与该企业招聘岗位类型相关联时,则该企业招聘岗位类型信息不能被删除。为了查询企业招聘岗位类型信息更方便,可以根据岗位类型进行模糊查询功能。
  4. 招聘信息模块:招聘信息管理模块主要实现管理员对招聘信息的管理,当新增招聘信息时,可以添加相应的招聘编号、岗位名称、岗位类型、招聘状态、工作省份、学历要求、对口专业、招聘人数、薪资待遇、工作时段、工作地点、发布时间、企业账号、企业名称等属性,在管理员管理招聘信息过程中需要更改信息时,管理员可以对招聘信息进行增删改查。当管理员修改招聘信息时,系统中与该招聘信息相关联的信息也需要一并修改,若系统中有其他信息与该招聘信息相关联时,则该招聘信息不能被删除。为了查询招聘信息更方便,可以根据岗位名称进行模糊查询功能。
  5. 公司信息模块:公司信息管理模块主要实现管理员对公司信息的管理,当新增公司信息时,可以添加相应的公司名称、公司封面、企业类型、公司电话、公司邮箱、公司地址、所属行业、经营范围等属性,在管理员管理公司信息过程中需要更改信息时,管理员可以对公司信息进行增删改查。当管理员修改公司信息时,系统中与该公司信息相关联的信息也需要一并修改,若系统中有其他信息与该公司信息相关联时,则该公司信息不能被删除。为了查询公司信息更方便,可以根据公司名称、公司地址进行模糊查询功能。
  6. 简历信息模块:简历信息管理模块主要实现管理员对简历信息的管理,在管理员管理简历信息过程中需要更改信息时,管理员可以对简历信息进行删改查。当管理员修改简历信息时,系统中与该简历信息相关联的信息也需要一并修改,若系统中有其他信息与该简历信息相关联时,则该简历信息不能被删除。为了查询简历信息更方便,可以根据岗位名称进行模糊查询功能。
  7. 在线留言管理模块:在线留言管理模块主要实现管理员对在线留言的管理,在管理员管理在线留言过程中需要更改信息时,管理员可以对在线留言进行删改查和回复。当管理员修改在线留言时,系统中与该在线留言相关联的信息也需要一并修改,若系统中有其他信息与该在线留言相关联时,则该在线留言不能被删除。为了查询在线留言更方便,可以根据用户名进行模糊查询功能。

企业用户系统功能模块分为三个部分,具体功能模块图如图 4.3 所示:

图4.3 企业功能模块图

  1. 招聘信息管理:企业账号登录系统后,可以在企业端管理公司的招聘信息,企业用户可以发布公司岗位招聘信息,企业用户点击新增,系统跳转到招聘信息输入界面,企业用户根据要求输入招聘编号、岗位名称、岗位类型、招聘状态、工作省份、学历要求、对口专业、招聘人数、薪资待遇、工作时间、工作地点、发布时间、企业账号、企业名称等,点击提交即可完成招聘信息的发布。企业用户可对本公司的招聘信息进行修改、查询和删除;
  2. 简历信息管理:企业账号登录系统后,可以在企业端管理学生投递的简历信息。企业用户可以根据岗位名称对学生投递的简历信息进行模糊查询,可下载学生投递的简历信息,并对学生的简历进行在线审核,审核通过可对通知学生简历通过或者通知学生可直接上岗。
  3. 在线留言管理:企业账号登录系统后,可以在企业端管理学生的在线留言咨询信息。企业用户可以根据用户名对学生在线留言信息进行模糊查询,可在线回复学生的在线留言信息,并且可以对学生回复信息进行修改和删除。

学生功能模块设计

学生用户系统功能模块分为三个部分,具体功能模块图如图 4.4 所示:

图4.4 学生功能模块图

  1. 招聘信息:学生用户在招聘信息模块可以根据求职岗位名称查询招聘信息,用户点击招聘信息图片链接,系统页面跳转到招聘信息详情,学生可查看招聘编号、岗位类型、招聘状态、工作省份、学历要求、对口专业、招聘人数、薪资待遇、工作时段、工作地点、发布时间、企业账号、企业名称等信息;学生可点击收藏即可收藏该招聘信息;学生可对该招聘岗位投递简历信息;学生可对该招聘信息线上评论和查看岗位要求。
  2. 公司信息:学生用户在公司信息模块可以根据公司名称和公司地址查询招聘公司信息,学生点击公司图片链接,系统页面跳转到公司信息详情,学生可查看该公司的企业类型、公司电话、公司邮箱、公司地址、所属行业和经营范围;学生可查看该招聘公司的简介。
  3. 新闻资讯:学生用户在新闻资讯模块根据新闻资讯标题搜索新闻资讯信息,学生用户点击新闻图片链接,系统页面跳转到新闻资讯详情,学生在新闻资讯详情页面可查看新闻内容。
  4. 在线留言:学生点击在线留言按钮,系统页面跳转到在线留言输入界面,学生根据系统提示要求,输入留言内容、选择留言图片,点击提交即可完成在线留言;学生在留言栏下方可查看到其他用户的在线留言信息。
  5. 后台管理:学生用户点击后台管理按钮,系统页面跳转到后台,学生在个人后台可以修改个人系统的登录账号、密码以及注册的个人信息,学生可以查看个人投递的简历信息。

三,系统展示

系统前端首页

 新闻资讯

 在线留言

企业管理

 简历管理

 岗位类型管理

仅展示部分界面,上面功能结构图中所列举的功能全部实现,不再一一展示。 

四,核心代码展示

package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
import com.utils.CommonUtil;
/**
 * 通用接口
 */
@RestController
public class CommonController{
	@Autowired
	private CommonService commonService;

    private static AipFace client = null;
    
    @Autowired
    private ConfigService configService;
    
	/**
	 * 获取table表中的column列表(联动接口)
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/option/{tableName}/{columnName}")
	public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,@RequestParam(required = false) String conditionColumn,@RequestParam(required = false) String conditionValue,String level,String parent) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		if(StringUtils.isNotBlank(level)) {
			params.put("level", level);
		}
		if(StringUtils.isNotBlank(parent)) {
			params.put("parent", parent);
		}
        if(StringUtils.isNotBlank(conditionColumn)) {
            params.put("conditionColumn", conditionColumn);
        }
        if(StringUtils.isNotBlank(conditionValue)) {
            params.put("conditionValue", conditionValue);
        }
		List<String> data = commonService.getOption(params);
		return R.ok().put("data", data);
	}
	
	/**
	 * 根据table中的column获取单条记录
	 * @param table
	 * @param column
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/follow/{tableName}/{columnName}")
	public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		params.put("columnValue", columnValue);
		Map<String, Object> result = commonService.getFollowByOption(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 修改table表的sfsh状态
	 * @param table
	 * @param map
	 * @return
	 */
	@RequestMapping("/sh/{tableName}")
	public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
		map.put("table", tableName);
		commonService.sh(map);
		return R.ok();
	}
	
	/**
	 * 获取需要提醒的记录数
	 * @param tableName
	 * @param columnName
	 * @param type 1:数字 2:日期
	 * @param map
	 * @return
	 */
	@IgnoreAuth
	@RequestMapping("/remind/{tableName}/{columnName}/{type}")
	public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("table", tableName);
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		int count = commonService.remindCount(map);
		return R.ok().put("count", count);
	}
	
	/**
	 * 单列求和
	 */
	@IgnoreAuth
	@RequestMapping("/cal/{tableName}/{columnName}")
	public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		Map<String, Object> result = commonService.selectCal(params);
		return R.ok().put("data", result);
	}
	
	/**
	 * 分组统计
	 */
	@IgnoreAuth
	@RequestMapping("/group/{tableName}/{columnName}")
	public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("column", columnName);
		List<Map<String, Object>> result = commonService.selectGroup(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}
	
	/**
	 * (按值统计)
	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
	public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		List<Map<String, Object>> result = commonService.selectValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}

	/**
 	 * (按值统计)时间统计类型
 	 */
	@IgnoreAuth
	@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")
	public R valueDay(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("table", tableName);
		params.put("xColumn", xColumnName);
		params.put("yColumn", yColumnName);
		params.put("timeStatType", timeStatType);
		List<Map<String, Object>> result = commonService.selectTimeStatValue(params);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for(Map<String, Object> m : result) {
			for(String k : m.keySet()) {
				if(m.get(k) instanceof Date) {
					m.put(k, sdf.format((Date)m.get(k)));
				}
			}
		}
		return R.ok().put("data", result);
	}



}

package com.controller;

import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;

/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
    @IgnoreAuth
	public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
		file.transferTo(dest);
		/**
 		 * 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开
  		 * 请将以下的"D:\\ssmpiv99\\src\\main\\webapp\\upload"替换成你本地项目的upload路径,
 		 * 并且项目路径不能存在中文、空格等特殊字符
 		 */
//		FileUtils.copyFile(dest, new File("D:\\ssmpiv99\\src\\main\\webapp\\upload"+"/"+fileName)); /**修改了路径以后请将该行最前面的//注释去掉**/
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) {
		try {
			File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
			if (file.exists()) {
				response.reset();
				response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName+"\"");
				response.setHeader("Cache-Control", "no-cache");
				response.setHeader("Access-Control-Allow-Credentials", "true");
				response.setContentType("application/octet-stream; charset=UTF-8");
				IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream());
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

猜你喜欢

转载自blog.csdn.net/whirlwind526/article/details/131721545