目录
一、前言介绍
二、功能需求
三、功能结构设计
四、管理员功能实现
招聘单位管理
用户管理
论坛管理
公告信息管理
五、招聘单位功能实现
职位招聘管理
职位留言管理
简历投递管理
六、用户功能实现
在线论坛
职位招聘信息
简历投递
简历
七、部分核心代码
职位招聘代码
一、前言介绍
互联网社会的到来,让各行各业通过互联网实现了浴火重生的可能,每个行业都发现了完全可以使用互联网技术用来提高信息在内部的传递效率,提高管理水准。通过对大学生兼职管理系统的设计和开发,不仅能巩固已经学到的知识,还能学习更多的专业知识,提升专业素养,熟悉设计流程,掌握编程知识。不管是从程序的设计分析以及编码,都有了很多的感悟。
大学生兼职管理系统采用当前最流行的IDEA工具进行开发,使用Java语言,框架使用Spring Boot框架。能实现公告管理,职位招聘管理,论坛管理,招聘单位管理,简历投递管理等功能。
大学生兼职管理系统不仅在操作上面符合常规操作,在信息处理环节更加的符合设计需求,符合生产需求,提高了
二、功能需求
大学生兼职管理系统将使用人员划分为三类,分别是管理员,招聘单位,用户。这些使用者中,管理员的操作权限最大,拥有所有功能的操作权限,其他使用者都是根据工作需要合理的安排部分功能。
(1)管理员功能分析
图3.1展示了管理员用例图。针对管理员角色,系统允许其操作所有的功能,其主要包括增删改查用户信息,招聘单位信息,公告信息等,参与论坛的帖子内容和帖子回复信息的查看和管理,对职位招聘信息,简历投递信息进行管理等。
(2)招聘单位功能分析
图3.2展示了招聘单位用例图。针对招聘单位角色,系统允许其登录系统之后,可以参与论坛交流,以及可以发布职位招聘信息,回复职位招聘的留言,查看职位招聘的收藏,审核用户的简历投递信息等。
(3)用户功能分析
图3.3展示了用户用例图。针对用户角色,系统允许其登录系统之后,可以参与论坛交流,以及可以对职位招聘投递简历或者发布职位招聘的留言,查看招聘单位信息,管理个人简历信息等。
三、功能结构设计
前面对大学生兼职管理系统的功能需求的分析只是大致的划分功能模块,接下来的工作就是对这些大致的功能进行细分。让大学生兼职管理系统的内容变得更具体,更丰富。
(1)管理员功能结构设计
图4.1展示的是管理员功能结构。系统将管理员的个人中心模块划分为个人信息管理与修改密码子模块,将基础数据管理功能划分为招聘单位类型管理,求职意向管理,招聘类型管理,公告类型管理,招聘岗位管理子模块。
(2)招聘单位功能结构设计
图4.2展示的是招聘单位功能结构。系统将招聘单位的职位招聘管理模块划分为职位招聘管理,职位留言管理,职位收藏管理子模块。
(3)用户功能结构设计
图4.3展示的是用户功能结构。系统将用户的个人中心模块划分为更改个人信息,简历,简历投递,职位收藏子模块。
四、管理员功能实现
招聘单位管理
图5.1展示的是招聘单位管理界面。
此界面展示了招聘单位名称,联系方式,招聘单位封面等信息。每条招聘单位信息的右侧区域都展示了可供管理员选择的操作,包括修改招聘单位信息,为招聘单位的账户进行密码重置,删除招聘单位信息等。
用户管理
图5.2展示的是用户管理界面。
此界面展示了注册的用户信息以及管理员自己新增的用户信息等,其中包括用户姓名,用户手机号,账户,性别等信息。每条用户信息的右侧区域都展示了可供管理员选择的操作,包括修改,删除,用户账户的密码重置。
论坛管理
图5.3展示的是论坛管理界面。
此界面展示了前台用户在论坛模块的发帖与评论帖子的信息。每条帖子信息都有身份,姓名,帖子标题,发帖时间等信息。每条帖子信息的右侧区域都展示了可供管理员选择的操作,包括查看该帖子的回复信息,删除帖子信息,对该帖子进行修改等。
公告信息管理
图5.4展示的是公告信息管理界面。
此界面展示了公告信息的标题,公告信息的图片以及发布公告的时间等信息。每条公告信息的右侧区域都展示了可供管理员选择的操作,包括删除,修改。
五、招聘单位功能实现
职位招聘管理
图5.5展示的是职位招聘管理界面。
此界面主要用于展示招聘单位自行发布的职位招聘信息,包括薪资待遇,招聘岗位,招聘电话,招聘人数等信息。每条职位招聘信息的右侧区域都展示了可供招聘单位选择的操作,包括下架已经发布的职位招聘信息,对发布的职位招聘信息进行修改,删除职位招聘信息等。
职位留言管理
图5.6展示的是职位留言管理界面。
此界面主要用于展示用户在查看招聘单位发布的职位招聘信息之后,提交的留言内容,作为招聘单位,其需要对每条用户的职位招聘的留言信息进行认真查看,然后点击职位留言信息右侧的回复按钮发布回复信息。
简历投递管理
图5.7展示的是简历投递管理界面。
此界面展示了用户对招聘单位发布的职位招聘信息进行查看之后,投递的简历信息,该信息需要招聘单位进行审核,招聘单位审核用户的简历投递信息时,不管是同意还是拒绝用户的简历投递请求,招聘单位可以回复相应的拒绝或者同意的理由。
六、用户功能实现
在线论坛
图5.8展示的是在线论坛界面。
此界面展示了所有用户的发帖信息,作为用户,其点击任意一条帖子标题就能查看其详细的帖子内容,同时,每条帖子内容查看完毕之后,在帖子内容的正下方都提供了评论功能让用户发布关于该帖子内容的评论信息。
职位招聘信息
图5.9展示的是职位招聘信息界面。
此界面展示了职位招聘信息的详细内容,包括招聘人数,招聘岗位,点赞数,踩数等信息。用户在查看了招聘单位发布的职位招聘信息之后,如果觉得与自己的求职意向相匹配,可以点击“投递简历”按钮提交个人简历文件,如果用户对该职位招聘信息存在许多不理解的方面,可以在界面的下方编辑留言内容然后提交,待该职位招聘信息的招聘单位发布方,在查看完该留言之后,会回答用户的疑问。
简历投递
图5.10展示的是简历投递界面。
此界面展示了所有的用户对职位招聘投递的简历信息,用户在该界面查看招聘单位的审核以及答复信息。
简历
图5.11展示的是简历界面。
此界面展示了所有的用户自行新增的简历信息,作为用户,其新增简历信息时,也能上传简历文件。
七、部分核心代码
职位招聘代码
/**
* 职位招聘
* 后端接口
* @author
* @email
*/
@RestController
@Controller
@RequestMapping("/zhaopin")
public class ZhaopinController {
private static final Logger logger = LoggerFactory.getLogger(ZhaopinController.class);
private static final String TABLE_NAME = "zhaopin";
@Autowired
private ZhaopinService zhaopinService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;//字典表
@Autowired
private ForumService forumService;//论坛
@Autowired
private GongsiService gongsiService;//招聘单位
@Autowired
private JianliService jianliService;//简历
@Autowired
private NewsService newsService;//公告信息
@Autowired
private ToudiService toudiService;//简历投递
@Autowired
private YonghuService yonghuService;//用户
@Autowired
private ZhaopinCollectionService zhaopinCollectionService;//职位收藏
@Autowired
private ZhaopinLiuyanService zhaopinLiuyanService;//职位留言
@Autowired
private UsersService usersService;//管理员
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("用户".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
else if("招聘单位".equals(role))
params.put("gongsiId",request.getSession().getAttribute("userId"));
CommonUtil.checkMap(params);
PageUtils page = zhaopinService.queryPage(params);
//字典表数据转换
List<ZhaopinView> list =(List<ZhaopinView>)page.getList();
for(ZhaopinView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ZhaopinEntity zhaopin = zhaopinService.selectById(id);
if(zhaopin !=null){
//entity转view
ZhaopinView view = new ZhaopinView();
BeanUtils.copyProperties( zhaopin , view );//把实体数据重构到view中
//级联表 招聘单位
//级联表
GongsiEntity gongsi = gongsiService.selectById(zhaopin.getGongsiId());
if(gongsi != null){
BeanUtils.copyProperties( gongsi , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "gongsiId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
view.setGongsiId(gongsi.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ZhaopinEntity zhaopin, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,zhaopin:{}",this.getClass().getName(),zhaopin.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("招聘单位".equals(role))
zhaopin.setGongsiId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<ZhaopinEntity> queryWrapper = new EntityWrapper<ZhaopinEntity>()
.eq("gongsi_id", zhaopin.getGongsiId())
.eq("zhaopin_name", zhaopin.getZhaopinName())
.eq("zhaopin_daiyu", zhaopin.getZhaopinDaiyu())
.eq("zhaopin_address", zhaopin.getZhaopinAddress())
.eq("lianxiren_name", zhaopin.getLianxirenName())
.eq("zhaopin_phone", zhaopin.getZhaopinPhone())
.eq("zan_number", zhaopin.getZanNumber())
.eq("cai_number", zhaopin.getCaiNumber())
.eq("zhaopin_types", zhaopin.getZhaopinTypes())
.eq("leixing_types", zhaopin.getLeixingTypes())
.eq("zhaopin_renshu_number", zhaopin.getZhaopinRenshuNumber())
.eq("shangxia_types", zhaopin.getShangxiaTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhaopinEntity zhaopinEntity = zhaopinService.selectOne(queryWrapper);
if(zhaopinEntity==null){
zhaopin.setShangxiaTypes(1);
zhaopin.setCreateTime(new Date());
zhaopinService.insert(zhaopin);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody ZhaopinEntity zhaopin, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,zhaopin:{}",this.getClass().getName(),zhaopin.toString());
ZhaopinEntity oldZhaopinEntity = zhaopinService.selectById(zhaopin.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("招聘单位".equals(role))
// zhaopin.setGongsiId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
if("".equals(zhaopin.getZhaopinPhoto()) || "null".equals(zhaopin.getZhaopinPhoto())){
zhaopin.setZhaopinPhoto(null);
}
zhaopinService.updateById(zhaopin);//根据id更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
List<ZhaopinEntity> oldZhaopinList =zhaopinService.selectBatchIds(Arrays.asList(ids));//要删除的数据
zhaopinService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//.eq("time", new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
try {
List<ZhaopinEntity> zhaopinList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
ZhaopinEntity zhaopinEntity = new ZhaopinEntity();
// zhaopinEntity.setGongsiId(Integer.valueOf(data.get(0))); //招聘单位 要改的
// zhaopinEntity.setZhaopinName(data.get(0)); //招聘信息名称 要改的
// zhaopinEntity.setZhaopinPhoto("");//详情和图片
// zhaopinEntity.setZhaopinDaiyu(data.get(0)); //薪资待遇 要改的
// zhaopinEntity.setZhaopinAddress(data.get(0)); //上班地点 要改的
// zhaopinEntity.setLianxirenName(data.get(0)); //联系人 要改的
// zhaopinEntity.setZhaopinPhone(data.get(0)); //招聘电话 要改的
// zhaopinEntity.setZanNumber(Integer.valueOf(data.get(0))); //赞 要改的
// zhaopinEntity.setCaiNumber(Integer.valueOf(data.get(0))); //踩 要改的
// zhaopinEntity.setZhaopinTypes(Integer.valueOf(data.get(0))); //招聘岗位 要改的
// zhaopinEntity.setLeixingTypes(Integer.valueOf(data.get(0))); //招聘类型 要改的
// zhaopinEntity.setZhaopinRenshuNumber(Integer.valueOf(data.get(0))); //招聘人数 要改的
// zhaopinEntity.setShangxiaTypes(Integer.valueOf(data.get(0))); //是否上架 要改的
// zhaopinEntity.setZhaopinContent("");//详情和图片
// zhaopinEntity.setCreateTime(date);//时间
zhaopinList.add(zhaopinEntity);
//把要查询是否重复的字段放入map中
//招聘电话
if(seachFields.containsKey("zhaopinPhone")){
List<String> zhaopinPhone = seachFields.get("zhaopinPhone");
zhaopinPhone.add(data.get(0));//要改的
}else{
List<String> zhaopinPhone = new ArrayList<>();
zhaopinPhone.add(data.get(0));//要改的
seachFields.put("zhaopinPhone",zhaopinPhone);
}
}
//查询是否重复
//招聘电话
List<ZhaopinEntity> zhaopinEntities_zhaopinPhone = zhaopinService.selectList(new EntityWrapper<ZhaopinEntity>().in("zhaopin_phone", seachFields.get("zhaopinPhone")));
if(zhaopinEntities_zhaopinPhone.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(ZhaopinEntity s:zhaopinEntities_zhaopinPhone){
repeatFields.add(s.getZhaopinPhone());
}
return R.error(511,"数据库的该表中的 [招聘电话] 字段已经存在 存在数据为:"+repeatFields.toString());
}
zhaopinService.insertBatch(zhaopinList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
/**
* 个性推荐
*/
@IgnoreAuth
@RequestMapping("/gexingtuijian")
public R gexingtuijian(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("gexingtuijian方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
CommonUtil.checkMap(params);
List<ZhaopinView> returnZhaopinViewList = new ArrayList<>();
//查看收藏
Map<String, Object> params1 = new HashMap<>(params);params1.put("sort","id");params1.put("yonghuId",request.getSession().getAttribute("userId"));
PageUtils pageUtils = zhaopinCollectionService.queryPage(params1);
List<ZhaopinCollectionView> collectionViewsList =(List<ZhaopinCollectionView>)pageUtils.getList();
Map<Integer,Integer> typeMap=new HashMap<>();//购买的类型list
for(ZhaopinCollectionView collectionView:collectionViewsList){
Integer zhaopinTypes = collectionView.getZhaopinTypes();
if(typeMap.containsKey(zhaopinTypes)){
typeMap.put(zhaopinTypes,typeMap.get(zhaopinTypes)+1);
}else{
typeMap.put(zhaopinTypes,1);
}
}
List<Integer> typeList = new ArrayList<>();//排序后的有序的类型 按最多到最少
typeMap.entrySet().stream().sorted((o1, o2) -> o2.getValue() - o1.getValue()).forEach(e -> typeList.add(e.getKey()));//排序
Integer limit = Integer.valueOf(String.valueOf(params.get("limit")));
for(Integer type:typeList){
Map<String, Object> params2 = new HashMap<>(params);params2.put("zhaopinTypes",type);
PageUtils pageUtils1 = zhaopinService.queryPage(params2);
List<ZhaopinView> zhaopinViewList =(List<ZhaopinView>)pageUtils1.getList();
returnZhaopinViewList.addAll(zhaopinViewList);
if(returnZhaopinViewList.size()>= limit) break;//返回的推荐数量大于要的数量 跳出循环
}
//正常查询出来商品,用于补全推荐缺少的数据
PageUtils page = zhaopinService.queryPage(params);
if(returnZhaopinViewList.size()<limit){//返回数量还是小于要求数量
int toAddNum = limit - returnZhaopinViewList.size();//要添加的数量
List<ZhaopinView> zhaopinViewList =(List<ZhaopinView>)page.getList();
for(ZhaopinView zhaopinView:zhaopinViewList){
Boolean addFlag = true;
for(ZhaopinView returnZhaopinView:returnZhaopinViewList){
if(returnZhaopinView.getId().intValue() ==zhaopinView.getId().intValue()) addFlag=false;//返回的数据中已存在此商品
}
if(addFlag){
toAddNum=toAddNum-1;
returnZhaopinViewList.add(zhaopinView);
if(toAddNum==0) break;//够数量了
}
}
}else {
returnZhaopinViewList = returnZhaopinViewList.subList(0, limit);
}
for(ZhaopinView c:returnZhaopinViewList)
dictionaryService.dictionaryConvert(c, request);
page.setList(returnZhaopinViewList);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
CommonUtil.checkMap(params);
PageUtils page = zhaopinService.queryPage(params);
//字典表数据转换
List<ZhaopinView> list =(List<ZhaopinView>)page.getList();
for(ZhaopinView c:list)
dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
return R.ok().put("data", page);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
ZhaopinEntity zhaopin = zhaopinService.selectById(id);
if(zhaopin !=null){
//entity转view
ZhaopinView view = new ZhaopinView();
BeanUtils.copyProperties( zhaopin , view );//把实体数据重构到view中
//级联表
GongsiEntity gongsi = gongsiService.selectById(zhaopin.getGongsiId());
if(gongsi != null){
BeanUtils.copyProperties( gongsi , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setGongsiId(gongsi.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ZhaopinEntity zhaopin, HttpServletRequest request){
logger.debug("add方法:,,Controller:{},,zhaopin:{}",this.getClass().getName(),zhaopin.toString());
Wrapper<ZhaopinEntity> queryWrapper = new EntityWrapper<ZhaopinEntity>()
.eq("gongsi_id", zhaopin.getGongsiId())
.eq("zhaopin_name", zhaopin.getZhaopinName())
.eq("zhaopin_daiyu", zhaopin.getZhaopinDaiyu())
.eq("zhaopin_address", zhaopin.getZhaopinAddress())
.eq("lianxiren_name", zhaopin.getLianxirenName())
.eq("zhaopin_phone", zhaopin.getZhaopinPhone())
.eq("zan_number", zhaopin.getZanNumber())
.eq("cai_number", zhaopin.getCaiNumber())
.eq("zhaopin_types", zhaopin.getZhaopinTypes())
.eq("leixing_types", zhaopin.getLeixingTypes())
.eq("zhaopin_renshu_number", zhaopin.getZhaopinRenshuNumber())
.eq("shangxia_types", zhaopin.getShangxiaTypes())
// .notIn("zhaopin_types", new Integer[]{102})
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
ZhaopinEntity zhaopinEntity = zhaopinService.selectOne(queryWrapper);
if(zhaopinEntity==null){
zhaopin.setZanNumber(1);
zhaopin.setCaiNumber(1);
zhaopin.setCreateTime(new Date());
zhaopinService.insert(zhaopin);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
}
此源码非开源,若需要此源码可扫码添加微信或者qq:2214904953进行咨询!
2600多套项目欢迎咨询