@TOC
ssm020基于ssm的人才招聘网站+jsp
绪论
1.1课题开发背景
网络和科技的进步以及人们生活条件的提高都让计算机技术越来越平民化,深入日常生活中。网络更是成为生活的必备条件,大到国家单位、科研项目,小到大街小巷都充斥着网络的身影。在日常办公中,计算机起到了文字编辑、打印、信息检索、统计等的作用。使用计算机可以使日常繁杂的信息进行科学的加工,使信息变得更加的有序、可利用。计算机技术已成为热门。
正是因为网络、科技、计算机技术使现代人的生活和工作变得便利、轻松,给实体行业带来了巨大的冲击。人才招聘的日常工作也遇到了前所未有的挑战。现如今,对于招聘的管理有很多的局限性,究其原因是因为招聘管理的根本是信息的运动。在新时代的环境下,传统的管理方式不再满足用户的需求,难以管理现代的工作。传统的管理方式不仅跟不上时代的发展,还不能实现最基本的工作要求,例如对于各种信息的统计还停留在花费大量的时间进行手动审核,这种方式辐射范围非常有限,效果也非常不好。对于基本工作信息的管理也还是采用人工管理,人工管理出错率大,效率低。对于信息的传递都需要经过多人审核才可以完成,想要定期进行分析和总结更是难上加难。因为每种信息之间的关系错综复杂,在定期的统计和查询中就会出现重复出现的问题,对工作人员来说工作压力非常大。
1.2课题研究现状
现在招聘管理中已有一些企业使用了基本的管理软件,这些软件都是依靠客户端,只可以特定人员使用,不能实现信息的共享。虽然可以帮助工作人员减少工作量,但从根本上还是无法满足用户的需求。这些软件都还是基于网络发展之初的要求,没有利用现代网络的技术,体现不了更为实用的功能。依靠客户端的系统开发时没有考虑园际化的问题,所以也满足不了国际化的要求。最近几年来,我国网络快速发展,传统的管理方式也越来越适应不了新时代的要求,在处理大量信息时表现不足,开发一个依托现代技术、网络技术的基于ssm的人才招聘网站迫在眉捷。这类系统将会改变人才招聘管理的现状。
1.3课题开发目的与意义
想要改变传统的办公管理的现状,就需要采用更为先进的管理方式。本基于ssm的人才招聘网站就是在新时代发展下开发的。本系统的开发非常有意义,体现了行业的创新。本系统是以信息管理为主导,而信息管理就是行业最大的问题,可以极大的提高工作效率。招聘信息的信息化管理是目前本系统的核心,解决了信息化的问题就可以使招聘管理更进一步。开发本系统可以使招聘信息更加的清晰、透明,便于管理人员操作。使用本系统可以使管理工作实现部分自动化,减少人工,提高正确率。
本系统是将网络技术和现代的管理理念相结合,根据招聘信息的特点进行重新分配、整合形成动态的、分类明确的信息资源,实现了招聘信息的自动化,减少人工管理过程,为管理人员的决策提供帮助。使用新型的辅助系统已成为时代的标志,本系统可以提高招聘管理的竞争力,提高信息统计效率,使工作人员的管理工作更加轻松。
1.4课题开发主要内容
本课题的主要内容包括企业、管理员和用户三个部分,管理员负责网站相关信息的管理,包括企业信息、招聘资讯信息、简历信息、职位分类信息、行业领域信息、招聘信息和应聘信息、应聘邀请信息;用户可以查询企业信息、招聘信息,可以进行应聘和评价、收藏,也可以进行所有公开信息的查询;企业可以发布招聘信息和管理用户的简介信息发出邀请。本基于ssm的人才招聘网站满足了用户和企业、管理员三方的要求,符合了信息化现代的要求。
1.5论文结构安排
本论文分为四个部分,摘要、外文翻译部分,目录部分,正文部分和致谢、参考文献部分。其中正文部分包括:
- 绪论,从课题开发的背景、现状等进行阐述证明课题开发的意义和目的;
- 系统分析,从系统开发可能遇到的所有问题进行提前分析,确定系统设计时可以进行解决;
- 系统设计,进行系统功能的设计和数据库的设计;
- 系统实现,进行系统界面和功能的详情实现阐述;
- 系统测试,测试部分为正文的最后一部分,此部分是保证系统准确性、稳定性的重要方法。
第2章 系统分析
2.1系统使用相关技术分析介绍
本基于ssm的人才招聘网站采用myeclipse软件进行调试运行,在代码编写中采用java语言,数据库采用mysql软件,在设计中采用了ssm框架。以下分为几节进行阐述。
2.1.1Myeclipse环境介绍
Myeclipse是一个非常实用的一个javaee开发平台,兼容性非常的强,可以支持各种框架和数据库,比如servlet,struts,sql,mysql等。目前用于开发javaee的平台主要分为eclipse ,myeclipse和idea三种,而每个都有自己的优缺点,首先是eclipse,属于一个开源软件,开源免费使用,而且对硬件要求不高,占用内存很小,但是最大的缺点就是自带的插件很少,如果需要开发项目,需要自己单独安装和配置所需要的插件,对于新手来说,是一个非常大的挑战,所以目前使用eclipse进行开发的技术人员越来越少。而myeclipse软件最大的不同就是集成了开发javaEE所需要的所有插件,比如jdk,tomcat,可以直接使用,不需要单独进行配置,对于新手来说非常的友好,而且还可以直接进行编码,测试,然后发布。而idea跟myeclipse功能差不多,最大的特点是增加了智能助手,开发过程中可以进行代码提示,自动检查,更加的智能化,但是最大的缺点就是对硬件方面要求比较高,而且比较占用内存。所以综合考虑,还是使用myeclipse进行软件开发是比较适合的。
2.1.2Java语言介绍
Java语言跟c++语言非常的相似,可以说是从c++上进行衍生出来的一个新型开发语言,他充分吸收了其他语言的优点,而避开了它们的缺点,使编程语言更加的简单,而且java系统非常的小,摒弃掉了之前的运算符重载,然后造成的卡顿现象,然后添加了垃圾自动清理,增加了开发的简单和可靠性。当然了java最大的特点是平台独立性,只要可以支持java虚拟机环境,就可以直接运行所有程序,而且还是面向对象开发的技术,有很好的封装行,采用了动态编码技术,可以使程序更好的呈现。可以多线程进行运行,用户随时可以加入新的 实例然后不影响整体程序执行,使开发更有灵活性,因为java是在公共密钥技术上进行建立开发的,所以也有一定的安全保障,除此之外,还有一定的跨平台性,可扩展性等优点,可以和不同的操作环境进行互联共享,所以java语言是目前使用最广泛的一个语言开发技术。
2.1.3Mysql数据库介绍
Mysql数据库最初是由瑞典MySQL AB公司进行开发出来的,后来被SUN公司进行了收购,然后进行了一系列的优化改进,最后被oracle公司收购。mysql数据库是一种关系型数据库,而且采用的是开发式结构,支持大多的平台,而且功能很多,性能很高。Mysql数据库最大的特性就是把自己所编译好的数据进行单独存放,而不是跟传统数据库一样,全部放到一起,这样的话就保证了数据的安全性和灵活性,大大的提供了数据的访问速度,当用户需要调取数据时候可以直接通过sql语句进行查询。Mysql的数据存储非常的稳定,而且是一个开源代码,使用成本非常的低,最大的特点就是安装包非常的小,对硬件没有特别要求,不会造成硬件卡顿,非常便于维护。Mysql还支持多种语言,比如php ,安卓等,都可以支持数据存储。
2.2系统需求分析
在当今信息化社会发展的条件下人们越来越追求自动化,基于ssm的人才招聘网站组成的多样化是现代招聘常用的管理手段。这种情况下就造成多种信息的暴增,如果还是采用传统的管理方式势必会造成信息的拥堵,用户的烦躁,工作水平的降低。
本基于ssm的人才招聘网站采用了ssm框架进行设计,结构了网络的技术,可以单独运行,不再需要固定的客户端。可以实现招聘信息的快速管理,保证了工作水平,提高用户的好评率。
2.2.1系统性能要求分析
系统的性能要求包括服务器和客户机两部分,主要是对系统存储和后续存储的要求,还有对系统运行的速度和系统的安全性进行考虑。本系统的性能要求如下表2.1所示:
表2.1系统性能要求表
对于系统的性能要求还需要操作的流畅性、理解性以及可靠、维护性。用户使用本系统时要求系统非常好理解,便于用户的操作。售后人员使用本系统时要求系统可读和便于测试。可靠性则指的是系统的准确和运行稳定,在尽可能的情况下利用所有的工具可以使上述要求得到最大的满足。
2.3系统可行性分析
可行性分析主要是分析本系统是否有开发的必要性,是否存在开发难度,是否能实现一定的商业价值,所以主要是从技术可行性,经济可行性,法律可行性等方面进行研究分析。
2.3.1技术可行性
开发本系统采用目前比较主流的java开发语言,具有很好的扩展性和平台兼容性,而且功能非常强大,易操作。页面技术采用jsp技术,jsp可以实现动态编码,通过html进行页面效果呈现,最大的特点就是本系统采用b/s框架进行开发,b/s可以不受本机系统的限制,可以把数据存放到服务器,用户可以直接通过浏览器进行系统访问,对于用户来说非常的简单省事。所以从技术层面考虑是非常可行的。
2.3.2法律可行性
本系统没有抄袭市面上的任何网站、系统,不管是界面风格,还是后台代码,都是自己原创,所以不存在版权方面的纠纷,而且开发环境都是开源的,开源共享的,所以不管是硬件方面还是软件方面都不存在侵权行为,在法律上是完全可行的。
2.3.3操作可行性
本系统采用的全是可视化操作界面,不管是对于系统的管理者还是用户者,都可以在没有任何编程背景的基础下进行系统操作,而且系统界面还存在各种功能提示,用户都可以简单操作,所以在操作可行性上是可行的。
2.4系统流程分析
本系统的流程为先进行登录,在登录中需要输入账号和密码并选择相对应的身份才可以登录成功,管理员登录后的功能主要为管理,用户登录后的功能主要为查看和应聘。本系统中的主要功能有企业信息、招聘信息、招聘资讯信息、简历信息,应聘邀请信息等,在本系统中用户也可以修改个人资料。用户登录流程图如下图2.1所示:
图2.1用户登录流程图
用户修改个人资料的流程图如下图2.2所示:
图2.2用户修改个人资料流程图
系统操作的整体流程如下图2.3所示:
图2.3系统操作流程图
2.5系统用例分析
本系统的主要角色为企业和管理员、用户,管理员用例包括用户管理、招聘管理、招聘资讯管理、企业管理、个人简历管理、职位分类管理、行业领域管理、应聘信息管理、应聘邀请管理。管理员的用例图如下图2.4所示:
图2.4管理员用例图
用户的用例包括个人简历、应聘信息、应聘邀请、我的收藏。用户用例图如下图2.5所示:
图2.5用户用例图
企业的用例包括企业信息、个人简历、职位分类、行业领域、招聘信息、应聘信息和应聘邀请。企业用例如下图2.6所示:
图2.6企业用例图
第3章 系统设计
3.1系统总体结构设计
一个好的设计不止是功能完整,操作流畅,还要符合用户的审美和界面的友好。在进入正式系统实施前,不可缺少的步骤为系统的总体结构设计,本系统为实用性的系统,所以开发的功能都是针对招聘信息相关的。本系统的结构可以分为企业、管理员界面和用户功能界面。在企业和管理员界面主要展示的是简历和招聘相关的信息,在用户界面展示的主要是查看招聘、简历和应聘等功能,本系统的总体结构图如下图3.1所示:
图3.1基于ssm的人才招聘网站的功能结构图
3.2系统开发步骤
系统的开发步骤可以分为系统开发、系统规划和系统实施。每一步都是在上上步的基础上进行的,不能跳级,在下一级进行时,不会对上一级的工作进行大的改变。所以就需要在每一级设计时充分保证正确才可以进行一下级的设计。这种开发步骤是最省时省力的方法,是经过国内外长久实践得出的最有效方法。
3.3数据库设计
3.3.1数据库概念结构设计
数据库的概念结构设计就是需要在系统分析的过程中分析开发本系统是要做什么,然后设计出大的框架,根据大的框架把系统进行转换成怎么做的物理模型。然后再进行设计。
在所有的系统设计中数据库的设计占有举足轻重的地位,选择合适的数据库软件进行设计非常重要。因为本系统的功能非常有针对性,没有进行扩展,所以本系统采用小型轻便的mysql软件进行设计。数据库的安全保障着系统里数据的安全,本系统的主要数据为简历信息、招聘信息、企业信息、应聘信息、应聘邀约信息。本系统的ER关系图如下图3.2所示:
图3.2实体关系ER图
(1)管理员的属性包括编号、用户名和密码,管理员的ER图如下图3.3所示:
图3.3管理员信息ER图
(2)用户基本信息管理为本系统的核心功能,主要包含用户的各种信息的统计,详细的用户基本信息ER图如下图3.4所示:
图3.4用户基本信息ER图
(3)招聘信息的ER图如下图3.5所示:
图3.5招聘信息ER图
(4)简历信息ER图如下图3.6所示:
图3.6简历信息ER图
3.3.2数据库逻辑结构设计
数据库的逻辑结构设计也可以称为数据库表的设计,一般情况下采用第三范式进行设计,因为数据库的概念结构可以单独使用,不特定于某个数据库所以就需要对数据库的概念结构进行转换,从上节的数据ER图转换出本系统的数据库表,主要包括管理员信息表、用户信息表、招聘信息表等,具体的数据库表如下表3.1-3.8所示:
表3.1 config
表3.2 discussqiyexinxi
表3.3 discusszhaopinxinxi
表3.4 discusszhaopinzixun
表3.5 gerenjianli
表3.6 qiye
表3.7 qiyexinxi
表3.8 storeup
第4章 系统实现
4.1登录功能模块的实现
登录功能包括用户登录和管理员、企业登录,在登录界面设计中包括用户名和密码、权限的检验。用户名和密码、身份的检验过程由数据库自动完成,此过程需要1秒左右。首先由用户填写账号和密码,选择身份,然后点击登录系统,数据库自行对用户名和密码进行对比,所填写数据正确方能进行登录,所填写数据错误则需要返回登录界面重新登录。此外,用户注册和企业注册也在本界面里。用户登录界面的设计运行界面效果如下图4.1所示:
图4.1用户系统登录界面效果
核心代码如下:
4.2 前台功能界面的实现
前台功能界面是最直接的展示,用户可以对系统进行最直接的了解。在本功能界面里可以看到背景图片、功能导航栏等。前台功能界面的运行效果界面如下图4.2所示:
图4.2前台功能界面的运行效果
4.3资讯文章管理模块实现
资讯文章信息管理员负责管理的功能,包括资讯文章添加、资讯文章查询和修改。资讯文章管理信息功能的界面实现效果如下图4.3所示:
图4.3资讯文章信息功能实现界面
核心代码如下:
4.4 用户信息管理功能的实现
用户信息管理功能分为管理员管理用户信息和用户自己管理自己的信息两种,管理员可以看到用户的各项基本信息,可以删除用户的基本信息。用户信息管理功能的界面实现效果如下图4.4所示:
图4.4用户信息管理功能界面实现效果
核心代码如下:
4.5 企业信息管理功能的实现
系统里展示的企业信息都是由管理员和企业在系统进行添加的。企业信息管理功能的界面实现效果如下图4.5所示:
图4.5企业信息管理功能的运行效果界面
企业添加企业信息的效果图如下图4.6所示:
图4.6添加企业信息的界面效果
核心代码如下:
4.6个人简历管理功能的实现
企业可以看到用户的简历信息可以发送邀请,用户可以管理自己的简历信息。个人简历管理功能的实现界面如下图4.7所示:
图4.7个人简历管理功能的实现
核心代码如下:
4.7招聘信息管理功能的实现
企业可以发布招聘信息,用户可以在前台看到招聘信息进行应聘。管理员也可以管理招聘信息。实现界面如下图4.8所示:
图4.8招聘信息管理功能的实现
核心代码如下:
4.8用户应聘功能的实现
用户可以查看招聘信息和进行应聘,应聘的填写界面如下图4.9所示:
图4.9应聘填写界面
核心代码如下:
4.9应聘邀请管理功能的实现
企业可以查看所有的应聘邀请信息,用户也可以查看应聘邀请信息并进行管理。应聘邀请管理功能的实现界面如下图4.10所示:
图4.10应聘邀请管理功能的实现
核心代码如下:
系
GerenjianliController.java
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
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.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.GerenjianliEntity;
import com.entity.view.GerenjianliView;
import com.service.GerenjianliService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
* 个人简历
* 后端接口
* @author
* @email
* @date 2021-02-06 18:51:25
*/
@RestController
@RequestMapping("/gerenjianli")
public class GerenjianliController {
@Autowired
private GerenjianliService gerenjianliService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,GerenjianliEntity gerenjianli, HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
gerenjianli.setYonghuming((String)request.getSession().getAttribute("username"));
}
EntityWrapper<GerenjianliEntity> ew = new EntityWrapper<GerenjianliEntity>();
PageUtils page = gerenjianliService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, gerenjianli), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,GerenjianliEntity gerenjianli, HttpServletRequest request){
EntityWrapper<GerenjianliEntity> ew = new EntityWrapper<GerenjianliEntity>();
PageUtils page = gerenjianliService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, gerenjianli), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( GerenjianliEntity gerenjianli){
EntityWrapper<GerenjianliEntity> ew = new EntityWrapper<GerenjianliEntity>();
ew.allEq(MPUtil.allEQMapPre( gerenjianli, "gerenjianli"));
return R.ok().put("data", gerenjianliService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(GerenjianliEntity gerenjianli){
EntityWrapper< GerenjianliEntity> ew = new EntityWrapper< GerenjianliEntity>();
ew.allEq(MPUtil.allEQMapPre( gerenjianli, "gerenjianli"));
GerenjianliView gerenjianliView = gerenjianliService.selectView(ew);
return R.ok("查询个人简历成功").put("data", gerenjianliView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
GerenjianliEntity gerenjianli = gerenjianliService.selectById(id);
return R.ok().put("data", gerenjianli);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
GerenjianliEntity gerenjianli = gerenjianliService.selectById(id);
return R.ok().put("data", gerenjianli);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody GerenjianliEntity gerenjianli, HttpServletRequest request){
gerenjianli.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(gerenjianli);
gerenjianliService.insert(gerenjianli);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody GerenjianliEntity gerenjianli, HttpServletRequest request){
gerenjianli.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(gerenjianli);
gerenjianliService.insert(gerenjianli);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody GerenjianliEntity gerenjianli, HttpServletRequest request){
//ValidatorUtils.validateEntity(gerenjianli);
gerenjianliService.updateById(gerenjianli);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
gerenjianliService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
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));
}
}
Wrapper<GerenjianliEntity> wrapper = new EntityWrapper<GerenjianliEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu")) {
wrapper.eq("yonghuming", (String)request.getSession().getAttribute("username"));
}
int count = gerenjianliService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
CommonController.java
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.util.ResourceUtils;
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.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
/**
* 通用接口
*/
@RestController
public class CommonController{
@Autowired
private CommonService commonService;
@Autowired
private ConfigService configService;
private static AipFace client = null;
private static String BAIDU_DITU_AK = null;
@RequestMapping("/location")
public R location(String lng,String lat) {
if(BAIDU_DITU_AK==null) {
BAIDU_DITU_AK = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "baidu_ditu_ak")).getValue();
if(BAIDU_DITU_AK==null) {
return R.error("请在配置管理中正确配置baidu_ditu_ak");
}
}
Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
return R.ok().put("data", map);
}
/**
* 人脸比对
*
* @param face1 人脸1
* @param face2 人脸2
* @return
*/
@RequestMapping("/matchFace")
public R matchFace(String face1, String face2, HttpServletRequest request) {
if(client==null) {
/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
String token = BaiduUtil.getAuth(APIKey, SecretKey);
if(token==null) {
return R.error("请在配置管理中正确配置APIKey和SecretKey");
}
client = new AipFace(null, APIKey, SecretKey);
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
}
JSONObject res = null;
try {
File file1 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face1);
File file2 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face2);
String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
MatchRequest req1 = new MatchRequest(img1, "BASE64");
MatchRequest req2 = new MatchRequest(img2, "BASE64");
ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
requests.add(req1);
requests.add(req2);
res = client.match(requests);
System.out.println(res.get("result"));
} catch (FileNotFoundException e) {
e.printStackTrace();
return R.error("文件不存在");
} catch (IOException e) {
e.printStackTrace();
}
return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
}
/**
* 获取table表中的column列表(联动接口)
* @param table
* @param column
* @return
*/
@RequestMapping("/option/{tableName}/{columnName}")
@IgnoreAuth
public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,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);
}
List<String> data = commonService.getOption(params);
return R.ok().put("data", data);
}
/**
* 根据table中的column获取单条记录
* @param table
* @param column
* @return
*/
@RequestMapping("/follow/{tableName}/{columnName}")
@IgnoreAuth
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
*/
@RequestMapping("/remind/{tableName}/{columnName}/{type}")
@IgnoreAuth
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);
}
/**
* 单列求和
*/
@RequestMapping("/cal/{tableName}/{columnName}")
@IgnoreAuth
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);
}
/**
* 分组统计
*/
@RequestMapping("/group/{tableName}/{columnName}")
@IgnoreAuth
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);
return R.ok().put("data", result);
}
/**
* (按值统计)
*/
@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
@IgnoreAuth
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);
}
}
ZhaopinxinxiController.java
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
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.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.ZhaopinxinxiEntity;
import com.entity.view.ZhaopinxinxiView;
import com.service.ZhaopinxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
* 招聘信息
* 后端接口
* @author
* @email
* @date 2021-02-06 18:51:25
*/
@RestController
@RequestMapping("/zhaopinxinxi")
public class ZhaopinxinxiController {
@Autowired
private ZhaopinxinxiService zhaopinxinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("qiye")) {
zhaopinxinxi.setQiyezhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<ZhaopinxinxiEntity> ew = new EntityWrapper<ZhaopinxinxiEntity>();
PageUtils page = zhaopinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhaopinxinxi), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request){
EntityWrapper<ZhaopinxinxiEntity> ew = new EntityWrapper<ZhaopinxinxiEntity>();
PageUtils page = zhaopinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhaopinxinxi), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( ZhaopinxinxiEntity zhaopinxinxi){
EntityWrapper<ZhaopinxinxiEntity> ew = new EntityWrapper<ZhaopinxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( zhaopinxinxi, "zhaopinxinxi"));
return R.ok().put("data", zhaopinxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(ZhaopinxinxiEntity zhaopinxinxi){
EntityWrapper< ZhaopinxinxiEntity> ew = new EntityWrapper< ZhaopinxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( zhaopinxinxi, "zhaopinxinxi"));
ZhaopinxinxiView zhaopinxinxiView = zhaopinxinxiService.selectView(ew);
return R.ok("查询招聘信息成功").put("data", zhaopinxinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
ZhaopinxinxiEntity zhaopinxinxi = zhaopinxinxiService.selectById(id);
zhaopinxinxi.setClicknum(zhaopinxinxi.getClicknum()+1);
zhaopinxinxi.setClicktime(new Date());
zhaopinxinxiService.updateById(zhaopinxinxi);
return R.ok().put("data", zhaopinxinxi);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
ZhaopinxinxiEntity zhaopinxinxi = zhaopinxinxiService.selectById(id);
zhaopinxinxi.setClicknum(zhaopinxinxi.getClicknum()+1);
zhaopinxinxi.setClicktime(new Date());
zhaopinxinxiService.updateById(zhaopinxinxi);
return R.ok().put("data", zhaopinxinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request){
zhaopinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(zhaopinxinxi);
zhaopinxinxiService.insert(zhaopinxinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request){
zhaopinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(zhaopinxinxi);
zhaopinxinxiService.insert(zhaopinxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(zhaopinxinxi);
zhaopinxinxiService.updateById(zhaopinxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
zhaopinxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
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));
}
}
Wrapper<ZhaopinxinxiEntity> wrapper = new EntityWrapper<ZhaopinxinxiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("qiye")) {
wrapper.eq("qiyezhanghao", (String)request.getSession().getAttribute("username"));
}
int count = zhaopinxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
/**
* 前端智能排序
*/
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,ZhaopinxinxiEntity zhaopinxinxi, HttpServletRequest request,String pre){
EntityWrapper<ZhaopinxinxiEntity> ew = new EntityWrapper<ZhaopinxinxiEntity>();
Map<String, Object> newMap = new HashMap<String, Object>();
Map<String, Object> param = new HashMap<String, Object>();
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
String newKey = entry.getKey();
if (pre.endsWith(".")) {
newMap.put(pre + newKey, entry.getValue());
} else if (StringUtils.isEmpty(pre)) {
newMap.put(newKey, entry.getValue());
} else {
newMap.put(pre + "." + newKey, entry.getValue());
}
}
params.put("sort", "clicknum");
params.put("order", "desc");
PageUtils page = zhaopinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhaopinxinxi), params), params));
return R.ok().put("data", page);
}
}
jquery.countdown.js
/*!
* The Final Countdown for jQuery v2.0.3 (http://hilios.github.io/jQuery.countdown/)
* Copyright (c) 2014 Edson Hilios
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
(function(factory) {
"use strict";
if (typeof define === "function" && define.amd) {
define([ "jquery" ], factory);
} else {
factory(jQuery);
}
})(function($) {
"use strict";
var PRECISION = 100;
var instances = [], matchers = [];
matchers.push(/^[0-9]*$/.source);
matchers.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);
matchers.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);
matchers = new RegExp(matchers.join("|"));
function parseDateString(dateString) {
if (dateString instanceof Date) {
return dateString;
}
if (String(dateString).match(matchers)) {
if (String(dateString).match(/^[0-9]*$/)) {
dateString = Number(dateString);
}
if (String(dateString).match(/\-/)) {
dateString = String(dateString).replace(/\-/g, "/");
}
return new Date(dateString);
} else {
throw new Error("Couldn't cast `" + dateString + "` to a date object.");
}
}
var DIRECTIVE_KEY_MAP = {
Y: "years",
m: "months",
w: "weeks",
d: "days",
D: "totalDays",
H: "hours",
M: "minutes",
S: "seconds"
};
function strftime(offsetObject) {
return function(format) {
var directives = format.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);
if (directives) {
for (var i = 0, len = directives.length; i < len; ++i) {
var directive = directives[i].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/), regexp = new RegExp(directive[0]), modifier = directive[1] || "", plural = directive[3] || "", value = null;
directive = directive[2];
if (DIRECTIVE_KEY_MAP.hasOwnProperty(directive)) {
value = DIRECTIVE_KEY_MAP[directive];
value = Number(offsetObject[value]);
}
if (value !== null) {
if (modifier === "!") {
value = pluralize(plural, value);
}
if (modifier === "") {
if (value < 10) {
value = "0" + value.toString();
}
}
format = format.replace(regexp, value.toString());
}
}
}
format = format.replace(/%%/, "%");
return format;
};
}
function pluralize(format, count) {
var plural = "s", singular = "";
if (format) {
format = format.replace(/(:|;|\s)/gi, "").split(/\,/);
if (format.length === 1) {
plural = format[0];
} else {
singular = format[0];
plural = format[1];
}
}
if (Math.abs(count) === 1) {
return singular;
} else {
return plural;
}
}
var Countdown = function(el, finalDate, callback) {
this.el = el;
this.$el = $(el);
this.interval = null;
this.offset = {};
this.instanceNumber = instances.length;
instances.push(this);
this.$el.data("countdown-instance", this.instanceNumber);
if (callback) {
this.$el.on("update.countdown", callback);
this.$el.on("stoped.countdown", callback);
this.$el.on("finish.countdown", callback);
}
this.setFinalDate(finalDate);
this.start();
};
$.extend(Countdown.prototype, {
start: function() {
if (this.interval !== null) {
clearInterval(this.interval);
}
var self = this;
this.update();
this.interval = setInterval(function() {
self.update.call(self);
}, PRECISION);
},
stop: function() {
clearInterval(this.interval);
this.interval = null;
this.dispatchEvent("stoped");
},
pause: function() {
this.stop.call(this);
},
resume: function() {
this.start.call(this);
},
remove: function() {
this.stop();
instances[this.instanceNumber] = null;
delete this.$el.data().countdownInstance;
},
setFinalDate: function(value) {
this.finalDate = parseDateString(value);
},
update: function() {
if (this.$el.closest("html").length === 0) {
this.remove();
return;
}
this.totalSecsLeft = this.finalDate.getTime() - new Date().getTime();
this.totalSecsLeft = Math.ceil(this.totalSecsLeft / 1e3);
this.totalSecsLeft = this.totalSecsLeft < 0 ? 0 : this.totalSecsLeft;
this.offset = {
seconds: this.totalSecsLeft % 60,
minutes: Math.floor(this.totalSecsLeft / 60) % 60,
hours: Math.floor(this.totalSecsLeft / 60 / 60) % 24,
days: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,
totalDays: Math.floor(this.totalSecsLeft / 60 / 60 / 24),
weeks: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7),
months: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 30),
years: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 365)
};
if (this.totalSecsLeft === 0) {
this.stop();
this.dispatchEvent("finish");
} else {
this.dispatchEvent("update");
}
},
dispatchEvent: function(eventName) {
var event = $.Event(eventName + ".countdown");
event.finalDate = this.finalDate;
event.offset = $.extend({}, this.offset);
event.strftime = strftime(this.offset);
this.$el.trigger(event);
}
});
$.fn.countdown = function() {
var argumentsArray = Array.prototype.slice.call(arguments, 0);
return this.each(function() {
var instanceNumber = $(this).data("countdown-instance");
if (instanceNumber !== undefined) {
var instance = instances[instanceNumber], method = argumentsArray[0];
if (Countdown.prototype.hasOwnProperty(method)) {
instance[method].apply(instance, argumentsArray.slice(1));
} else if (String(method).match(/^[$A-Z_][0-9A-Z_$]*$/i) === null) {
instance.setFinalDate.call(instance, method);
instance.start();
} else {
$.error("Method %s does not exist on jQuery.countdown".replace(/\%s/gi, method));
}
} else {
new Countdown(this, argumentsArray[0], argumentsArray[1]);
}
});
};
});
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。