1.开发环境
开发工具:IDEA
JDK版本:JDK1.8
Mysql版本:8.0
2.技术选型
后端:Spring、SpringMVC、MyBatis、MySQL
前端:JSP+HTML+CSS。
3.系统功能
实现以下主要功能模块:
普通用户权限:岗位信息、在线留言、招聘信息、岗位应聘、个人中心。
企业权限:企业资料的管理、发布岗位、应聘记录查询、应聘回复。
管理员权限:系统用户管理、企业信息管理、留言管理、系统管理。
4.流程介绍
(1)求职者首先需要注册身份后才能正常使用系统的各个功能进行求职操作,只有
注册了对应权限的身份之后,求职者才可以通过用户名和密码登录系统。如图所示:
(2)在线应聘:求职者可以在网络上浏览到自己满意的招聘信息以后点击招聘按钮
来投递个人简历,如果求职者填写的信息符合系统的设定就能够成功投递简历并等待企
业下一步的回复。如图所示:
(3)综上所述,校园招聘管理系统 web的招聘应聘总流程就是企业在发布想要招聘
的岗位之后等待求职者用户投递简历,企业在收到简历后可以选择满意的简历通过并且
回复具体面试信息给求职者,企业如果不满足该简历可以选择不回复或者直接删除不满
意的简历。如图所示:
5.系统设计与实现
5.1系统设计目标与原则
校园招聘管理系统的设计是为了降低求职者和企业对于工作供求压力的同时提供优
质的工作服务,本着双赢的原则在降低工作供求成本的同时还能够让这种供求变得更加
的便捷。
但是便捷的同时也就意味着程序需要并行提高速率,这样的设计可能存在着一些致
命的漏洞,系统必须要在设计的同时遵守特定的安全原则。而原则如下。
①实用性原则:系统在开发的工程中必须要追求代码的简洁与高效,过于复杂的代
码不仅提高了后期的维护成本,也限制了代码升级的空间,不利于一个项目向成熟发展。
②适应性原则:我们在开发出项目以后注定需要在不同的系统环境下进行运行,那
么我们再开发的阶段就需要及时考虑项目对于不同平台的适应能力,只有强大的适应能
力才是项目大范围推广的基础条件。
③可靠性原则:系统在长期的运行中总会因为设计错漏或者后期故障发生错误,这
个时候项目必须具备一点的容纳能力向用户发出提醒而不是直接崩溃死机,这样才能给
管理员提供时间快速修复。
④可维护性原则:系统的运行过程中难免会出现各种故障,无论是机器故障还是程
序故障,系统都应该拥有一套完好的提醒和执行维护的机制,以此来保证系统长时间平
稳的运行。
⑤安全性原则:网络是一个大的环境,其中有许多攻击甚至是来自于对域名的随机
攻击,这种时候一个完好的保护机制才能够让程序上线之后保护用户信息的同时保证程
序自身能够正常运行。
5.2系统结构设计
系统主要分为前台和后台两个不同的页面。前台主要实现的功能,如注册登录、
浏览职位、简历投递、投递记录等功能模块;后台主要实现的功能模块,如用户管理、
简历管理、招聘信息管理等功能模块。功能分为前后台是为了区分不同权限的用户对
不同的信息进行管理进而完成的实现整个招聘流程。如图所示:
求职者可以在登录系统之后获得系统的一部分权限来达到应聘的功能,具体的方法
则是在浏览到心仪的职位之后投递出自己的简历并等待系统恢复,如图所示:
招聘企业在登录之后同样获得了一部分权限来完成招聘的流程,企业通过发布职位
和整理求职者发送来的简历筛选出需要的员工并向他们发送面试通知,如图所示:
用户管理:编号是用户一个不可为空且不可重复的信息;当我们想要查询某个
用户时首先想到的就是根据编号来查询,而管理员也能够通过编号来锁定某个特殊的用
户并对其进行数据操作,如图所示:
企业管理:企业一方面要提供自己发布的信息吸引求职者,另一方面需要将吸
引到的求职者进行删选,所以企业管理就分为了招聘和审核两个阶段。如图所示:
5.3概念结构设计
概念结构设计其实就是分析多个数据的之间的关联,架构出一份数据之间的详细关
联模型。本章使用的是数据对象的实体图来描述数据间的关联,下面分别绘出这些对象
的实体图。
①求职者实体:真实姓名、性别、出生地、民族、专业、电话、邮箱、简历名称、
语言技能、工作职位、期望薪资、工作技能、自我推荐、期望工作地点、实践经历、学
校类型。这些都是求职者在不同情况下被封装成的单独对象,通过这些不同的对象就可
以在不同的情况下调用该对象,然后同步体现在页面功能中,如图所示:
②注册用户实体:这里可以将注册用户的所有信息封装成一个对象,然后调用对应
的方法就能够操纵该数据库对象,然后同步体现在页面功能中,如图所示:
③职位信息实体:这里表达了职位信息中具体的内容分类,同样可以被封装为对象
进行调用对应的方法来修改,然后同步体现在页面功能中,如图所示:
④职位信息实体:职位类别作为与职位信息直接相关联的信息可以在之后通过在职
位信息中设置职位类别信息来封装职位信息对象,然后同步体现在页面功能中,如图所示:
5.4数据库设计
数据库的设计是将前文分析的具体信息编程一个表来管理,通常一个表就代表着一
个对象,本系统的设计之中存在以下7个表。
学生用户信息表包含了验证一个学生用户的各个身份信息,以此来验证学生的身
份信息,也方便后期再系统中能直接查询到求职者用户的相关信息。
CREATE TABLE IF NOT EXISTS `t_userInfo` (
`user_name` varchar(30) NOT NULL COMMENT 'user_name',
`password` varchar(30) NOT NULL COMMENT '登录密码',
`name` varchar(20) NOT NULL COMMENT '姓名',
`gender` varchar(4) NOT NULL COMMENT '性别',
`birthDate` varchar(20) NULL COMMENT '出生日期',
`userPhoto` varchar(60) NOT NULL COMMENT '学生照片',
`xl` varchar(20) NOT NULL COMMENT '学历',
`telephone` varchar(20) NOT NULL COMMENT '联系电话',
`email` varchar(50) NOT NULL COMMENT '邮箱',
`address` varchar(80) NULL COMMENT '家庭地址',
`jianliFile` varchar(60) NOT NULL COMMENT '简历文件',
`smrzzl` varchar(60) NOT NULL COMMENT '实名认证资料',
`shzt` varchar(20) NOT NULL COMMENT '审核状态',
`regTime` varchar(20) NULL COMMENT '注册时间',
PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
企业用户信息表包含了验证一个企业所需要的必要信息,为了防止非法企业记录
自身信息,这样子记录有利于管理员在后期对企业的审核。
CREATE TABLE IF NOT EXISTS `t_company` (
`companyUserName` varchar(30) NOT NULL COMMENT 'companyUserName',
`password` varchar(20) NOT NULL COMMENT '登录密码',
`qyjb` varchar(20) NOT NULL COMMENT '信用级别',
`companyName` varchar(20) NOT NULL COMMENT '企业名称',
`gszch` varchar(20) NOT NULL COMMENT '工商注册号',
`yyzz` varchar(60) NOT NULL COMMENT '营业执照',
`gsxz` varchar(20) NOT NULL COMMENT '公司性质',
`gsgm` varchar(20) NOT NULL COMMENT '公司规模',
`gghy` varchar(20) NOT NULL COMMENT '公司行业',
`lxr` varchar(20) NOT NULL COMMENT '联系人',
`lxdh` varchar(20) NOT NULL COMMENT '联系电话',
`companyDesc` varchar(8000) NOT NULL COMMENT '公司介绍',
`address` varchar(80) NOT NULL COMMENT '公司地址',
`shzt` varchar(20) NOT NULL COMMENT '审核状态',
PRIMARY KEY (`companyUserName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
管理员信息表,管理员作为系统的核心成员,不需要太多的身份验证,只需要相
应的账号就好了,管理员不需要被其他用户监管,它拥有管理所有用户信息的权限。
CREATE TABLE IF NOT EXISTS `t_jobType` (
`userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员id',
`userName` varchar(50) NOT NULL COMMENT '用户名',
`userPW` varchar(50) NOT NULL COMMENT '密码',
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
招聘岗位信息表包含了构建一个岗位所需要的各种信息,比如我们要具体了解一
个工作的待遇和地点才能决定是否前去上班,一个好的岗位信息表会让求职者更准确地
找到满意的工作。
CREATE TABLE IF NOT EXISTS `t_job` (
`jobId` int(11) NOT NULL AUTO_INCREMENT COMMENT '职位id',
`jobTypeObj` int(11) NOT NULL COMMENT '职位类别',
`jobName` varchar(40) NOT NULL COMMENT '职位名称',
`jobDesc` varchar(8000) NOT NULL COMMENT '职位描述',
`salary` varchar(50) NOT NULL COMMENT '工作薪酬',
`zprs` int(11) NOT NULL COMMENT '招聘人数',
`xlyq` varchar(20) NOT NULL COMMENT '学历要求',
`yxqx` varchar(30) NOT NULL COMMENT '有效期限',
`gzqy` varchar(20) NOT NULL COMMENT '工作区域',
`gzdz` varchar(80) NOT NULL COMMENT '工作地址',
`viewNum` int(11) NOT NULL COMMENT '浏览次数',
`companyObj` varchar(30) NOT NULL COMMENT '发布企业',
`addTime` varchar(20) NULL COMMENT '发布时间',
PRIMARY KEY (`jobId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
职位类别信息表,这个表的存在是为了方便用户在投递简历时选择投递的岗位,
所以岗位类别也只需要提供基础的信息和工作描述就足够了,用户可以通过选择职位类
别来进一步挑选想要的职位。
CREATE TABLE IF NOT EXISTS `t_jobType` (
`jobTypeId` int(11) NOT NULL AUTO_INCREMENT COMMENT '职位类型id',
`jobTypeName` varchar(20) NOT NULL COMMENT '职位类别名称',
`jobTypeDesc` varchar(800) NOT NULL COMMENT '职位类别描述',
PRIMARY KEY (`jobTypeId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
简历投递信息表,简历的投递时十分关键的地方,他既代表了求职者在企业中的
详细信息又是企业筛选求职者的重要手段,所以简历是需要十分全面的信息。
CREATE TABLE IF NOT EXISTS `t_delivery` (
`deliveryId` int(11) NOT NULL AUTO_INCREMENT COMMENT '投递id',
`jobObj` int(11) NOT NULL COMMENT '应聘职位',
`userObj` varchar(30) NOT NULL COMMENT '应聘人',
`deliveryTime` varchar(20) NULL COMMENT '投递时间',
`handleTime` varchar(20) NULL COMMENT '处理时间',
`clzt` varchar(20) NOT NULL COMMENT '处理状态',
`tzxx` varchar(800) NOT NULL COMMENT '通知信息',
`gzpj` varchar(500) NOT NULL COMMENT '工作评价',
PRIMARY KEY (`deliveryId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
经历分享信息表,这个表其实是用户之间的交互,是为了提升用户黏度而开发的
一个表,他的重点就是记录内容,所以记录内容的数据长度就会格外的大。
CREATE TABLE IF NOT EXISTS `t_jobRecord` (
`recordId` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录id',
`title` varchar(60) NOT NULL COMMENT '标题',
`content` varchar(8000) NOT NULL COMMENT '内容',
`userObj` varchar(30) NOT NULL COMMENT '记录人',
`recordDate` varchar(20) NULL COMMENT '记录时间',
PRIMARY KEY (`recordId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
6.功能模块实现
6.1求职者在线应聘模块
在线应聘模块主要是求职者注册登录后所使用的模块,应聘人员可以通过此模块实
现职位搜索,上传简历等功能。该模块主要包括职位查询、在线应聘以及求职记录等子
模块。
(1)注册模块:对于首次访问页面的新人求职者来说,在投递简历之前需要为自己
提供一个经得起审核的身份,这样才能够保证求职者的简历被人相信和重视,所以这个
时候新人求职者就必须先注册才能够接触系统里的其他重要模块。当然用户也能通过后
台进行添加,具体界面将在后台功能模块中展示,代码如下。
/*客户端ajax方式提交添加用户信息*/
@RequestMapping(value = "/add", method = RequestMethod.POST)
public void add(@Validated UserInfo userInfo, BindingResult br, Model model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String message = "";
boolean success = false;
if (br.hasErrors()) {
message = "输入信息不符合要求!";
writeJsonResponse(response, success, message);
return;
}
if (userInfoService.getUserInfo(userInfo.getUser_name()) != null) {
message = "用户名已经存在!";
writeJsonResponse(response, success, message);
return;
}
try {
userInfo.setUserPhoto(this.handlePhotoUpload(request, "userPhotoFile"));
} catch (UserException ex) {
message = "图片格式不正确!";
writeJsonResponse(response, success, message);
return;
}
userInfo.setJianliFile(this.handleFileUpload(request, "jianliFileFile"));
userInfo.setSmrzzl(this.handleFileUpload(request, "smrzzlFile"));
userInfoService.addUserInfo(userInfo);
message = "用户添加成功!";
success = true;
writeJsonResponse(response, success, message);
}
userInfoService代码:
/*添加用户记录*/
public void addUserInfo(UserInfo userInfo) throws Exception {
userInfoMapper.addUserInfo(userInfo);
}
/*根据主键获取用户记录*/
public UserInfo getUserInfo(String user_name) throws Exception {
UserInfo userInfo = userInfoMapper.getUserInfo(user_name);
return userInfo;
}
前台的用户注册界面使用的是用户作为对象,在界面中输入了具体的信息内容后点
击用户注册填写内容就会通过调用代码中添加用户的方法连接数据库。用户注册界面如下图所示:
(2)职位搜索模块:求职者在搜索工作时也能够通过内心偏向的特定信息来作为条
件进行筛选,比如重视工作地点却不重视薪酬,这样就可以将查询条件锁定为心仪的地
址来查询具体工作,代码如下:
/* 前台查询Job信息 */
@RequestMapping(value = "/{jobId}/frontshow", method = RequestMethod.GET)
public String frontshow(@PathVariable Integer jobId, Model model, HttpServletRequest request) throws Exception {
/* 根据主键jobId获取Job对象 */
Job job = jobService.getJob(jobId);
List<Company> companyList = companyService.queryAllCompany();
request.setAttribute("companyList", companyList);
List<JobType> jobTypeList = jobTypeService.queryAllJobType();
request.setAttribute("jobTypeList", jobTypeList);
request.setAttribute("job", job);
return "Job/job_frontshow";
}
/*ajax方式显示职位修改jsp视图页*/
@RequestMapping(value="/{jobId}/update",method=RequestMethod.GET)
public void update(@PathVariable Integer jobId,Model model,HttpServletRequest request,HttpServletResponse response) throws Exception {
/*根据主键jobId获取Job对象*/
Job job = jobService.getJob(jobId);
response.setContentType("text/json;charset=UTF-8");
PrintWriter out = response.getWriter();
//将要被返回到客户端的对象
JSONObject jsonJob = job.getJsonObject();
out.println(jsonJob.toString());
out.flush();
out.close();
}
/*ajax方式更新职位信息*/
@RequestMapping(value = "/{jobId}/update", method = RequestMethod.POST)
public void update(@Validated Job job, BindingResult br,
Model model, HttpServletRequest request,HttpServletResponse response) throws Exception {
String message = "";
boolean success = false;
if (br.hasErrors()) {
message = "输入的信息有错误!";
writeJsonResponse(response, success, message);
return;
}
try {
jobService.updateJob(job);
message = "职位更新成功!";
success = true;
writeJsonResponse(response, success, message);
} catch (Exception e) {
e.printStackTrace();
message = "职位更新失败!";
writeJsonResponse(response, success, message);
}
}
/*删除职位信息*/
@RequestMapping(value="/{jobId}/delete",method=RequestMethod.GET)
public String delete(@PathVariable Integer jobId,HttpServletRequest request) throws UnsupportedEncodingException {
try {
jobService.deleteJob(jobId);
request.setAttribute("message", "职位删除成功!");
return "message";
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("error", "职位删除失败!");
return "error";
}
}
/*ajax方式删除多条职位记录*/
@RequestMapping(value="/deletes",method=RequestMethod.POST)
public void delete(String jobIds,HttpServletRequest request,HttpServletResponse response) throws IOException, JSONException {
String message = "";
boolean success = false;
try {
int count = jobService.deleteJobs(jobIds);
success = true;
message = count + "条记录删除成功";
writeJsonResponse(response, success, message);
} catch (Exception e) {
//e.printStackTrace();
message = "有记录存在外键约束,删除失败";
writeJsonResponse(response, success, message);
}
}
jobService代码
/*根据主键获取职位记录*/
public Job getJob(int jobId) throws Exception {
Job job = jobMapper.getJob(jobId);
return job;
}
companyService代码
/*查询所有企业记录*/
public ArrayList<Company> queryAllCompany() throws Exception {
return companyMapper.queryCompanyList("where 1=1");
}
jobTypeService代码
/*查询所有职位类别记录*/
public ArrayList<JobType> queryAllJobType() throws Exception {
return jobTypeMapper.queryJobTypeList("where 1=1");
}
职位搜索界面是调用了代码中查询全部的方法然后将查询到的结果通过排列的方法展示
在页面中,如图所示:
(3)岗位申请模块:当用户决定了心仪的岗位,就可以填写个人资料,投递简历,
当所有信息的合法之后就可以自由申请相关岗位了。
岗位申请界面是求职者在浏览到职位信息的具体内容时可以点击投递简历,之后就
会调用添加简历的方法,将简历中的信息封装,连接数据库,如图所示:
(4)我的投递:求职者也不能光是一昧的投递简历,有一些时候不用重复考虑同一
个工作也是效率提升的一种表现,而查看投递的历史记录就是一个很好的方法。如果无
法查看投递的历史,那么求职者将会在职位的搜索上浪费相当多的无用时间。代码如下:
/* ajax方式按照查询条件分页查询简历投递信息 */
@RequestMapping(value = { "/list" }, method = { RequestMethod.GET, RequestMethod.POST })
public void list(@ModelAttribute("jobObj") Job jobObj, @ModelAttribute("userObj") UserInfo userObj,
String deliveryTime, String handleTime, String clzt, Integer page, Integer rows, Model model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
if (page == null || page == 0)
page = 1;
if (deliveryTime == null)
deliveryTime = "";
if (handleTime == null)
handleTime = "";
if (clzt == null)
clzt = "";
if (rows != 0)
deliveryService.setRows(rows);
List<Delivery> deliveryList = deliveryService.queryDelivery(jobObj, userObj, deliveryTime, handleTime, clzt,
page);
/* 计算总的页数和总的记录数 */
deliveryService.queryTotalPageAndRecordNumber(jobObj, userObj, deliveryTime, handleTime, clzt);
/* 获取到总的页码数目 */
int totalPage = deliveryService.getTotalPage();
/* 当前查询条件下总记录数 */
int recordNumber = deliveryService.getRecordNumber();
response.setContentType("text/json;charset=UTF-8");
PrintWriter out = response.getWriter();
// 将要被返回到客户端的对象
JSONObject jsonObj = new JSONObject();
jsonObj.accumulate("total", recordNumber);
JSONArray jsonArray = new JSONArray();
for (Delivery delivery : deliveryList) {
JSONObject jsonDelivery = delivery.getJsonObject();
jsonArray.put(jsonDelivery);
}
jsonObj.accumulate("rows", jsonArray);
out.println(jsonObj.toString());
out.flush();
out.close();
}
deliveryService代码
/*按照查询条件分页查询简历投递记录*/
public ArrayList<Delivery> queryDelivery(Job jobObj,UserInfo userObj,String deliveryTime,String handleTime,String clzt,int currentPage) throws Exception {
String where = "where 1=1";
if(null != jobObj && jobObj.getJobId()!= null && jobObj.getJobId()!= 0) where += " and t_delivery.jobObj=" + jobObj.getJobId();
if(null != userObj && userObj.getUser_name() != null && !userObj.getUser_name().equals("")) where += " and t_delivery.userObj='" + userObj.getUser_name() + "'";
if(!deliveryTime.equals("")) where = where + " and t_delivery.deliveryTime like '%" + deliveryTime + "%'";
if(!handleTime.equals("")) where = where + " and t_delivery.handleTime like '%" + handleTime + "%'";
if(!clzt.equals("")) where = where + " and t_delivery.clzt like '%" + clzt + "%'";
int startIndex = (currentPage-1) * this.rows;
return deliveryMapper.queryDelivery(where, startIndex, this.rows);
}
/*当前查询条件下计算总的页数和记录数*/
public void queryTotalPageAndRecordNumber(Job jobObj,UserInfo userObj,String deliveryTime,String handleTime,String clzt) throws Exception {
String where = "where 1=1";
if(null != jobObj && jobObj.getJobId()!= null && jobObj.getJobId()!= 0) where += " and t_delivery.jobObj=" + jobObj.getJobId();
if(null != userObj && userObj.getUser_name() != null && !userObj.getUser_name().equals("")) where += " and t_delivery.userObj='" + userObj.getUser_name() + "'";
if(!deliveryTime.equals("")) where = where + " and t_delivery.deliveryTime like '%" + deliveryTime + "%'";
if(!handleTime.equals("")) where = where + " and t_delivery.handleTime like '%" + handleTime + "%'";
if(!clzt.equals("")) where = where + " and t_delivery.clzt like '%" + clzt + "%'";
recordNumber = deliveryMapper.queryDeliveryCount(where);
int mod = recordNumber % this.rows;
totalPage = recordNumber / this.rows;
if(mod != 0) totalPage++;
}
public int getTotalPage() {
return totalPage;
}
public int getRecordNumber() {
return recordNumber;
}
我的投递界面同样是通过调用查询全部职位的方法然后通过排列方法将所有职位同
步显示在页面当中,如图所示:
6.2企业在线招聘模块
企业通过招聘模块进行网络招聘,通过其中各个子模块的功能实现招聘流程。
(1)用户管理模块:企业在此模块进行修改的操作,改变审核状态和通知信息就能
够让求职者发现自己已经被选中的消息,紧接着进入招聘的下一阶段。如图所示:
(2)招聘管理模块:企业在发布的招聘信息中包含着诸多对于工作描述的内容来细
致刻画工作的实质。同时,企业还可以对职位进行管理,添加新的职位或者修改原本职
位的信息,如果职位已经不被需要,企业也可以选择将它永久删除。代码如下:
/* 客户端ajax方式提交添加职位信息 */
@RequestMapping(value = "/add", method = RequestMethod.POST)
public void add(@Validated Job job, BindingResult br, Model model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String message = "";
boolean success = false;
if (br.hasErrors()) {
message = "输入信息不符合要求!";
writeJsonResponse(response, success, message);
return;
}
jobService.addJob(job);
message = "职位添加成功!";
success = true;
writeJsonResponse(response, success, message);
}
jobService代码
/*添加职位记录*/
public void addJob(Job job) throws Exception {
jobMapper.addJob(job);
}
招聘管理界面调用的是添加职位的方法,将职位内容封装成一个对象然后连接数据
库,如图所示:
(3)简历审核:企业通过查看简历可以根据公司的具体情况对其进行审核然后修改
面试信息给通过的简历设置留言,让网络招聘进行到下一阶段。代码如下:
/*ajax方式按照查询条件分页查询简历投递信息*/
@RequestMapping(value = { "/list" }, method = {RequestMethod.GET,RequestMethod.POST})
public void list(@ModelAttribute("jobObj") Job jobObj,@ModelAttribute("userObj") UserInfo userObj,String deliveryTime,String handleTime,String clzt,Integer page,Integer rows, Model model, HttpServletRequest request,HttpServletResponse response) throws Exception {
if (page==null || page == 0) page = 1;
if (deliveryTime == null) deliveryTime = "";
if (handleTime == null) handleTime = "";
if (clzt == null) clzt = "";
if(rows != 0)deliveryService.setRows(rows);
List<Delivery> deliveryList = deliveryService.queryDelivery(jobObj, userObj, deliveryTime, handleTime, clzt, page);
/*计算总的页数和总的记录数*/
deliveryService.queryTotalPageAndRecordNumber(jobObj, userObj, deliveryTime, handleTime, clzt);
/*获取到总的页码数目*/
int totalPage = deliveryService.getTotalPage();
/*当前查询条件下总记录数*/
int recordNumber = deliveryService.getRecordNumber();
response.setContentType("text/json;charset=UTF-8");
PrintWriter out = response.getWriter();
//将要被返回到客户端的对象
JSONObject jsonObj=new JSONObject();
jsonObj.accumulate("total", recordNumber);
JSONArray jsonArray = new JSONArray();
for(Delivery delivery:deliveryList) {
JSONObject jsonDelivery = delivery.getJsonObject();
jsonArray.put(jsonDelivery);
}
jsonObj.accumulate("rows", jsonArray);
out.println(jsonObj.toString());
out.flush();
out.close();
}
简历审核界面图是企业调用求职者向数据库中添加的简历信息然后通过调用修改的
方法来基于求职者面试的通知,如图所示:
6.3后台信息管理模块
后台信息管理模块的实质就是管理员登录后所操作的功能,在这个模块中管理员能
够操纵网页中所有连接数据库的表来进行增加、删除、修改和查询。这也意味着后台模
块是一个直接连接数据库并且拥有非常多功能的模块,如图所示:
后台添加用户功能和用户管理功能界面一个调用的是用户的添加方法,一个调用的
是用户的修改方法,如图所示:
后台添加企业功能和企业管理功能界面一个调用的是职位类别的添加方法,一个调
用的是职位类别的修改方法,如图所示:
后台添加职位类别功能和职位类别管理功能界面一个调用的是职位类别的添加方
法,一个调用的是职位类别的修改方法,如图所示:
后台添加职位功能和职位管理功能界面一个调用的是职位的添加方法,一个调用的
是职位的修改方法,如图所示:
后台添加简历功能和简历投递管理功能界面一个调用的是简历的添加方法,一个调
用的是简历的修改方法,如图所示:
后台添加兼职功能和兼职记录管理功能界面一个调用的是兼职记录的添加方法,一
个调用的是兼职记录的修改方法,如图所示:
后台添加留言功能和留言管理功能界面一个调用的是留言的添加方法,一个调用的
是留言的修改方法,如图所示:
后台添加新闻公告功能和新闻公告管理功能界面一个调用的是公告的添加方法,一
个调用的是公告的修改方法,如图所示:
后台添加新闻公告功能和新闻公告管理功能界面一个调用的是公告的添加方法,一
个调用的是公告的修改方法,如图所示:
7.后期规划
如果数据量和并发量急增,上述代码是不能正常提供服务的,此时我们需要做如下优化:
①对业务进行拆分,采用微服务架构
②对数据库进行拆分,使用分库分表方案,解决单库性能和容量瓶颈
③增加缓存,减轻数据库读压力
④增加ElasticSearch中间件,解决海量数据多维度复杂搜索问题
⑤增加消息队列中间件,把部分同步操作改为异步
8.参考文献
①尚硅谷
②Redis官方文档
③ElasticSearch官方文档
④RabbitMQ官方文档