@TOC
springboot614基于springboot的招聘系统的设计与实现--论文
研究背景
近年来,由于计算机技术和互联网技术的快速发展,使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统也应运而生,其中招聘管理系统就是其中的重要组成部分。
招聘工作在环境卫生管理中不可或缺的一部分,然而多年以来工作者大都习惯使用传统方法,即人工来完成招聘的管理,但是这种方法存在着工作效率低以及保密性差的问题,同时还会生成大量的文本和数据,在检索数据时极大不便。随着科技发展进步,我们已进入了信息化社会,仅仅依靠传统的表格管理方式已不能适应时代的要求。因此使用计算机来进行接手传统方式的招聘管理已经势在必行。
通过计算机技术来实现的招聘系统拥有对信息的快速检索、保存了大量的招聘管理信息、信息系统保存的稳定性高和维护成本低等优点,对招聘管理的工作效率也能提高。如今,传统的人工管理方法、文件和图表打印等信息传输方法已经不能满足当下的发展需求,计算机科学与互联网技术的蓬勃发展,颠覆了人们的生活以及思维方式。招聘系统的出现,利用信息技术将招聘管理融于办公平台中,成为提高管理水平的有利手段,将会成为未来招聘管理的新模式。
1.2 课题研究意义
在当下,办公自动化以一种迅速并不可阻挡的速度在慢慢遍布到社会的每一个角落中,而招聘系统正是办公自动化的一个小小分支,解决了传统招聘管理中繁杂且重复的操作,提高了工作的效率。
招聘系统对于管理人员进行管理来说是非常重要的,应该做到让管理人员进行快捷的信息查询以及对信息的处理功能。然而,以往并没有使用电子化管理来进行招聘工作的意识,还是使用传统的人工管理方法。如今,伴随着计算机科学的不断发展,互联网科技的日渐成熟,计算机所带来的种种优势已经逐渐为人们所认识,它已经应用在社会中的各个领域中并且越来越重要,利用计算机将招聘信息进行电子化、系统化的管理能将招聘管理的效率提上一个台阶。所以,开发一套基于springboot的招聘系统,将信息进行电子化、系统化的管理,代替了传统的人工管理方式,提升了工作效率。
无纸化办公,节省了时间,减少了纸张的浪费同时节约了成本。
加快了信息传输的过程,使招聘管理更规范和科学。
利用计算机处理速度快、信息存储量大的特点,将管理工作信息化,可以积累和管理大量的数据。
对数据进行有效并且集中的管理,实现了用户信息的共享,使管理工作可以从传统的人工管理中解放出来,提升了工作的效率,使其有更多的时间去完成更多的工作,来提高自身的业务素质。
1.3 课题研究内容
本系统结合现今主流管理系统的功能模块以及设计方式进行分析,使用Java语言和Springboot框架进行开发设计,具体研究内容如下:
- 管理员主要对个人中心、企业管理、用户管理、岗位类型管理、招聘信息管理、应聘记录管理、留言反馈、系统管理等功能进行管理。
- 企业主要对个人中心、岗位类型管理、招聘信息管理、应聘记录管理等功能进行管理。
- 用户进入系统可以实现对首页、企业、招聘信息、招聘新闻、留言反馈、后台管理、个人中心等进行失踪,还可以进入后台对应聘记录进行管理。
2 系统开发技术
招聘系统采用B/S(Browser/Server)架构和MVC模型进行设计开发。在B/S架构下,用户在浏览器端进行使用,主要工作通过服务器端进行实现,用户通过网站进行访问大大节约了成本。本系统使用Java等语言同时运用了Springboot框架进行开发,使用MySQL进行数据存储。
2.1 Java技术
Java是一种面向对象的静态式编程语言。Java编程语言具有多线程和对象定向的特点。其特点是根据方案的属性将方案分为几个不同的模块,这些模块是封闭的和多样化的,在申请过程中具有很强的独立性。Java语言在计算机软件开发过程中的运用可以达到交互操作的目的,通过各种形式的交换,可以有效地处理所需的数据,从而确保计算机软件开发的可控性和可见性。开发Java语言时,保留了网络接口,Java保留的缺省网络接口可以与web应用程序编程所依赖的类别库相匹配。为了使Java开发的应用程序更加稳定和强健,Java会自动收集程序中的垃圾,并处理程序中存在的异常。Java语言是日常开发过程中广泛使用的通用基本语言。其中Java语言课程库、句子、语法规则和关键字经常用于计算机软件的开发和编程。
面向对象编程是Java语言最显着的特点。它具有原始接口和补充接口以及继承,不仅可以实现相同类型的单个继承,而且还支持接口之间的多个继承,从而实现类、接口和接口之间以及类和接口之间的有效通信。Java的面向对象特性主要包括三个方面:继承、多态性和封装。封装是Java的核心,可以封装所有数据操作。多态性是指由面向对象行为派生的相关行为。继承作为特殊编程模式有两种类型:父类和子类,这两种类型的属性具有相同的功能和特性。对于父类的属性特性,子类可以实现继承和优化。
2.2 Springboot框架
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。
2.3 MySQL数据库
MySql做为瑞典公司MySql AB开发的中小型开源数据库智能管理系统,具备配备低、低成本、运作速度更快的优势。与此同时,因为社区版的开源系统性,变成了许多网址减少开发成本费的最佳选择。被甲骨文回收后,MySQL也发布了商业版。另外Mysql具有以下特性:
(1)使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
(2)为C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等多种编程语言提供了API。
(3)采用多线程并行的方法提高了CPU的利用率。
(4)改善算法,有效地提高查询速度。
2.4 B/S结构
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器,如Chrome、Safari、Microsoft Edge、Netscape Navigator或Internet Explorer,服务器安装SQL Server、Oracle、MYSQL等数据库。浏览器通过Web Server同数据库进行数据交互。
2.5 Tomcat服务器
Tomcat服务器属于轻量级应用服务器,在访问用户数量不是很大的中小型应用中经常被使用。Tomcat服务器主要由三个核心组件Web容器、servlet容器、JSP容器组成。其中,Web容器主要用于完成Web服务器的功能,servlet容器主要用于处理servlet代码,JSP容器主要用于将JSP动态网页翻译成servlet代码。Tomcat作为Web服务器和APP容器,其核心功能主要包括负责接受和反馈外部请求的连接器Connector和负责处理请求的容器Container。二者相辅相成,共同构成了基本的Web服务。Tomcat支持管理多个服务。Tomcat因其技术先进、性能也较为稳定,最重要的是因为其价格免费,故而收到了大量Java爱好者的偏爱,成为比较流行的Web应用服务器。
3 系统需求分析
需求分析在系统开发中有着十分重要的作用。软件项目凭借软件工程的思想和步骤可以大大的提高开发效率,缩短软件开发周期,保证了软件项目的质量。需求分析作为软件工程方法中的一步是至关重要的。软件需求工程是一门分析并记录软件需求的学科。需求分析简单的来说就是用户需要什么,系统需要什么,对此进行问题的列举,等级的排列,需要缜密的思分析和大量的调研。
2.1 可行性分析
根据招聘系统的功能,通过对经济可行性、技术可行性和法律可行性分析进行全面的分析,提供准确的可行性依据。以下是本系统的可行性分析:
- 经济可行性
就是分析在现有经济情况下能否完成本招聘系统的开发。下面对本系统开发、运行、维护的相关费用评估,以及投入到实际运用中完成招聘管理可能费用进行估算。网络资源丰富,本招聘系统只需使用任选一开源服务器即可,此方面无需投入费用。开发阶段,由于本招聘系统不属于大型系统,常规的电脑就可完成开发,不用购置相关硬件设备。软件方面,本招聘系统只需使用网上免费下载的软件即可完成开发,这些软件在使用时简单易懂,无需培训,因此在开发方面也无需投入费用。由于本招聘系统不属于大型系统,运行时候电费可以忽略不记。招聘系统作为自己毕设,由本人开发即可完成,无需人力费用。综上,整个系统开发花费很少,所以本招聘系统在经济上可行。
- 技术可行性
本系统的开发使用java作为系统开发的开发语言,开发工具选择 Eclipse,而 B/S架构决定了本系统的兼容性和多用户可操作性,此外选择MySql作为数据库不仅提高了数据安全性更保障了数据的可操作性。
- 法律可行性分析
法律可行性分析,即分析本招聘系统是否与各类法律相悖。本招聘系统使用市面开源免费软件开发,且作为个人毕设,无商用,均为本人自主开发,并且页面设计合理,发布的信息要求符合常规。整个系统无抵触法律法规的问题。因此在法律上,本招聘系统可行。
3.2 功能需求分析
招聘系统综合网络空间开发设计要求。目的是将招聘通过网络平台将传统管理方式转换为在网上管理,完成招聘的方便快捷、安全性高障,目标明确。招聘系统可以将功能划分为管理员的使用功能、企业使用的功能和用户使用的功能。
(1)管理员的功能是最高的,可以对系统所在功能进行查看,修改和删除,包括企业和用户功能。管理员用例如下:
图3-1管理员用例图
(2)企业关键功能包含个人中心、岗位类型管理、招聘信息管理、应聘记录管理等功能进行详细操作。企业用例如下:
图3-2 企业用例图
(2)用户登录进入系统可以实现对首页、企业、招聘信息、招聘新闻、留言反馈、后台管理、个人中心等进行详细操作。用户用例如下:
图3-3 用户用例图
3.3 系统流程分析
3.3.1系统开发流程图:
图3-4 系统开发流程图
3.3.2管理员模块总体流程图:
图3-5 管理员模块总体流程图
3.3.3招聘管理流程图:
图3-6 招聘管理流程图
4 系统设计
4.1 功能模块设计
招聘系统按照权限的类型进行划分,分为管理员、企业和用户共三个模块。系统实现首页、企业、招聘信息、招聘新闻、留言反馈、后台管理、个人中心等功能进行操作,增强了使用者的操作体验。管理员模块主要针对整个系统的管理进行设计,提高了管理的效率和标准。系统的总体模块设计如下图所示:
图4-1 系统总体模块设计
4.2 系统数据库设计
4.2.1 数据库系统
本系统采用MySQL来进行数据库的管理。MySQL数据库具有体积小、速度快、成本低等优点。具备同时处理数千万条记录,实现大型数据库的高并发读写和高效读写需求错误!未找到引用源。。
4.2.2 数据库概念设计
概念模型用于对信息世界建模,并与指定的数据库管理系统分离。它有助于将真实世界的事物抽象为适合于数据库管理系统的数据库模型。人们倾向于将现实世界抽象为信息世界,再把信息世界变成机器世界。也就是说,将现实世界的目标抽象成独立于专用计算机软件和专用数据库管理系统的信息结构的数据模型,然后将物理模型转化为适合电子计算机的数据库管理系统。事实上,数据模型是从真实世界到机器世界的中间层。
信息世界的基本要素包括实体和关联。现实存在且彼此可区别的事物称为实体。实体可以是实际的人、事或物,还可以是抽象化的概念或联络。以下是对部分主要的关键实体如下:
企业实体属性如图4-2所示。
图4-2企业实体属性图
招聘信息实体属性如图4-3所示。
图4-3招聘信息实体属性图
用户实体属性如图4-4所示。
图4-4用户实体属性图
招聘信息实体属性如图4-5所示。
图4-5招聘信息实体属性图
4.2.3 数据表设计
本设计根据数据表管理系统的具体流程进行管理,方便用户对数据的添加、删除、修改和查询等操作。
4.2.4 数据表的建立
系统采用Navicat Premium对数据库进行操作,数据库管理操作简单,数据处理能力强。数据表建立如下:
表4-1:应聘记录
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
gangweimingcheng | varchar | 200 | 岗位名称 | ||
bangonghuanjing | longtext | 4294967295 | 办公环境 | ||
xinzidaiyu | varchar | 200 | 薪资待遇 | ||
gongzuoshijian | varchar | 200 | 工作时间 | ||
qiyebianhao | varchar | 200 | 企业编号 | ||
qiyemingcheng | varchar | 200 | 企业名称 | ||
jianlitoudi | longtext | 4294967295 | 简历投递 | ||
yingpinriqi | date | 应聘日期 | |||
yingpinneirong | longtext | 4294967295 | 应聘内容 | ||
yonghuming | varchar | 200 | 用户名 | ||
xingming | varchar | 200 | 姓名 | ||
shouji | varchar | 200 | 手机 | ||
shenfenzheng | varchar | 200 | 身份证 | ||
crossuserid | bigint | 跨表用户id | |||
crossrefid | bigint | 跨表主键id | |||
sfsh | varchar | 200 | 是否审核 | 待审核 | |
shhf | longtext | 4294967295 | 审核回复 |
表4-2:用户表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
username | varchar | 100 | 用户名 | ||
password | varchar | 100 | 密码 | ||
role | varchar | 100 | 角色 | 管理员 | |
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP |
表4-3:token表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
userid | bigint | 用户id | |||
username | varchar | 100 | 用户名 | ||
tablename | varchar | 100 | 表名 | ||
role | varchar | 100 | 角色 | ||
token | varchar | 200 | 密码 | ||
addtime | timestamp | 新增时间 | CURRENT_TIMESTAMP | ||
expiratedtime | timestamp | 过期时间 | CURRENT_TIMESTAMP |
表4-4:收藏表
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 用户id | |||
refid | bigint | 商品id | |||
tablename | varchar | 200 | 表名 | ||
name | varchar | 200 | 名称 | ||
picture | longtext | 4294967295 | 图片 | ||
type | varchar | 200 | 类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注) | 1 | |
inteltype | varchar | 200 | 推荐类型 | ||
remark | varchar | 200 | 备注 |
表4-5:企业
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
qiyebianhao | varchar | 200 | 企业编号 | ||
mima | varchar | 200 | 密码 | ||
qiyemingcheng | varchar | 200 | 企业名称 | ||
qiyedizhi | varchar | 200 | 企业地址 | ||
lianxiren | varchar | 200 | 联系人 | ||
lianxifangshi | varchar | 200 | 联系方式 | ||
qiyetupian | longtext | 4294967295 | 企业图片 |
表4-6:招聘新闻
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
title | varchar | 200 | 标题 | ||
introduction | longtext | 4294967295 | 简介 | ||
picture | longtext | 4294967295 | 图片 | ||
content | longtext | 4294967295 | 内容 |
表4-7:留言反馈
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
userid | bigint | 留言人id | |||
username | varchar | 200 | 用户名 | ||
avatarurl | longtext | 4294967295 | 头像 | ||
content | longtext | 4294967295 | 留言内容 | ||
cpicture | longtext | 4294967295 | 留言图片 | ||
reply | longtext | 4294967295 | 回复内容 | ||
rpicture | longtext | 4294967295 | 回复图片 |
表4-8:岗位类型
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
gangweileixing | varchar | 200 | 岗位类型 |
表4-9:配置文件
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
name | varchar | 100 | 配置参数名称 | ||
value | varchar | 100 | 配置参数值 |
表4-10:招聘信息
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
gangweimingcheng | varchar | 200 | 岗位名称 | ||
gangweileixing | varchar | 200 | 岗位类型 | ||
gangweiyaoqiu | varchar | 200 | 岗位要求 | ||
xueliyaoqiu | varchar | 200 | 学历要求 | ||
bangonghuanjing | longtext | 4294967295 | 办公环境 | ||
gangweixingzhi | varchar | 200 | 岗位性质 | ||
xinzidaiyu | varchar | 200 | 薪资待遇 | ||
gongzuojingyan | varchar | 200 | 工作经验 | ||
gongzuoshijian | varchar | 200 | 工作时间 | ||
jiuyechengshi | varchar | 200 | 就业城市 | ||
shangbandidian | varchar | 200 | 上班地点 | ||
qiyebianhao | varchar | 200 | 企业编号 | ||
qiyemingcheng | varchar | 200 | 企业名称 | ||
lianxiren | varchar | 200 | 联系人 | ||
lianxifangshi | varchar | 200 | 联系方式 | ||
gangweijieshao | longtext | 4294967295 | 岗位介绍 |
表4-11:用户
字段名称 | 类型 | 长度 | 字段说明 | 主键 | 默认值 |
---|---|---|---|---|---|
id | bigint | 主键 | 主键 | ||
addtime | timestamp | 创建时间 | CURRENT_TIMESTAMP | ||
yonghuming | varchar | 200 | 用户名 | ||
mima | varchar | 200 | 密码 | ||
xingming | varchar | 200 | 姓名 | ||
xingbie | varchar | 200 | 性别 | ||
touxiang | longtext | 4294967295 | 头像 | ||
shouji | varchar | 200 | 手机 | ||
shenfenzheng | varchar | 200 | 身份证 | ||
qiuzhiyixiang | varchar | 200 | 求职意向 |
5 系统实现
5.1系统功能实现
当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到系统的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
系统注册:在系统注册页面的输入栏中输入用户注册信息进行注册操作,系统注册页面如图5-2所示:
图5-2系统注册页面
企业:在企业页面的输入栏中输入企业名称进行查询,可以查看到企业详细信息,并根据需要进行收藏操作;企业页面如图5-3所示:
图5-3企业详细页面
招聘信息:在招聘信息页面的输入栏中输入岗位名称、薪资待遇、就业城市和企业名称进行查询,可以查看到招聘详细信息,并进行应聘或收藏操作,招聘信息页面如图5-4所示:
图5-4招聘信息详细页面
留言反馈:在留言反馈页面通过输入留言内容、上传图片并立即提交进行在线留言操作;还可以对留言内容进行回复操作,留言反馈页面如图5-5所示:
图5-5留言反馈详细页面
在个人中心页面输入个人信息可以进行更新操作,并根据需要对我的收藏进行详细操作;如图5-6所示:
图5-6 个人中心界面
5.2后台模块实现
后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-7所示。
图5-7 后台登录界面
5.2.1管理员模块实现
管理员进入主页面,主要功能包括对个人中心、企业管理、用户管理、岗位类型管理、招聘信息管理、应聘记录管理、留言反馈、系统管理等进行操作。管理员主页面如图5-8所示:
图5-8 管理员主界面
管理员点击企业管理。在企业页面输入企业名称进行查询、新增或删除企业列表,并根据需要对企业详情信息进行详情、修改或删除操作;如图5-9所示:
图5-9企业管理界面
管理员点击用户管理。在用户页面输入用户名和姓名进行查询、新增或删除用户列表,并根据需要对用户详情信息进行详情、修改或删除操作;如图5-10所示:
图5-10用户管理界面
管理员点击招聘信息管理。在招聘信息页面输入岗位名称、薪资待遇、就业城市或企业名称进行查询或删除招聘信息列表,并根据需要对招聘详情信息进行详情、修改或删除操作;如图5-11所示:
图5-11招聘信息管理界面
管理员点击应聘记录管理。在应聘记录页面输入岗位名称、企业名称和选择是否通过进行查询或删除应聘记录列表,并根据需要对应聘记录详情信息进行详情、修改或删除操作;如图5-12所示:
图5-12应聘记录管理界面
管理员点击留言反馈。在留言反馈页面输入用户名进行查询或删除留言反馈列表,并根据需要对留言反馈详情信息进行详情、修改、回复或删除操作;如图5-13所示:
图5-13留言反馈管理界面
管理员点击系统管理,在招聘新闻页面输入标题可以查询,新增或删除招聘新闻列表,并根据需要对招聘新闻详细信息进行查看详情,修改和删除等操作,还可以对轮播图管理进行详细操作。如图5-14所示:
图5-14系统管理界面
5.2.2企业模块实现
企业进入系统可以对个人中心、岗位类型管理、招聘信息管理、应聘记录管理等功能进行操作。企业主页面如图5-15所示:
图5-15 企业主界面
企业点击招聘信息管理。在招聘信息页面输入岗位名称、薪资待遇、就业城市或企业名称进行查询、新增或删除招聘信息列表,并根据需要对招聘详细信息进行详情、修改或删除操作。如图5-16所示:
图5-16招聘信息管理界面
5.2.3用户后台管理模块实现
用户进入系统后台可以对个人中心、应聘记录管理等功能进行操作。用户后台管理主页面如图5-17所示:
图5-17 用户后台管理主界面
系统测试
UsersController.java
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UsersEntity;
import com.service.TokenService;
import com.service.UsersService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UsersController{
@Autowired
private UsersService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UsersEntity user){
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UsersEntity user){
EntityWrapper<UsersEntity> ew = new EntityWrapper<UsersEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UsersEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UsersEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UsersEntity user){
// ValidatorUtils.validateEntity(user);
UsersEntity u = userService.selectOne(new EntityWrapper<UsersEntity>().eq("username", user.getUsername()));
if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
return R.error("用户名已存在。");
}
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
AlipayConfig.java
package com.config;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
}
GangweileixingController.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.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
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.GangweileixingEntity;
import com.entity.view.GangweileixingView;
import com.service.GangweileixingService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 岗位类型
* 后端接口
* @author
* @email
* @date 2023-01-28 08:43:10
*/
@RestController
@RequestMapping("/gangweileixing")
public class GangweileixingController {
@Autowired
private GangweileixingService gangweileixingService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,GangweileixingEntity gangweileixing,
HttpServletRequest request){
EntityWrapper<GangweileixingEntity> ew = new EntityWrapper<GangweileixingEntity>();
PageUtils page = gangweileixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, gangweileixing), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,GangweileixingEntity gangweileixing,
HttpServletRequest request){
EntityWrapper<GangweileixingEntity> ew = new EntityWrapper<GangweileixingEntity>();
PageUtils page = gangweileixingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, gangweileixing), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( GangweileixingEntity gangweileixing){
EntityWrapper<GangweileixingEntity> ew = new EntityWrapper<GangweileixingEntity>();
ew.allEq(MPUtil.allEQMapPre( gangweileixing, "gangweileixing"));
return R.ok().put("data", gangweileixingService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(GangweileixingEntity gangweileixing){
EntityWrapper< GangweileixingEntity> ew = new EntityWrapper< GangweileixingEntity>();
ew.allEq(MPUtil.allEQMapPre( gangweileixing, "gangweileixing"));
GangweileixingView gangweileixingView = gangweileixingService.selectView(ew);
return R.ok("查询岗位类型成功").put("data", gangweileixingView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
GangweileixingEntity gangweileixing = gangweileixingService.selectById(id);
return R.ok().put("data", gangweileixing);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
GangweileixingEntity gangweileixing = gangweileixingService.selectById(id);
return R.ok().put("data", gangweileixing);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody GangweileixingEntity gangweileixing, HttpServletRequest request){
gangweileixing.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(gangweileixing);
gangweileixingService.insert(gangweileixing);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody GangweileixingEntity gangweileixing, HttpServletRequest request){
gangweileixing.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(gangweileixing);
gangweileixingService.insert(gangweileixing);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody GangweileixingEntity gangweileixing, HttpServletRequest request){
//ValidatorUtils.validateEntity(gangweileixing);
gangweileixingService.updateById(gangweileixing);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
gangweileixingService.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<GangweileixingEntity> wrapper = new EntityWrapper<GangweileixingEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = gangweileixingService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
404.vue
<template>
<div class="content">
<img class="backgroud" src="@/assets/img/404.png" alt>
<div class="text main-text">出错了...页面失踪了</div>
<div>
<el-button class="text" @click="back()" type="text" icon="el-icon-back">返回</el-button>
</div>
</div>
</template>
<script>
export default {
methods: {
back() {
window.history.length > 1 ? this.$router.go(-1) : this.$router.push("/");
}
}
};
</script>
<style lang="scss" scoped>
.content {
display: flex;
align-items: center;
flex-direction: column;
width: 100%;
height: 100%;
min-height: 900px;
text-align: center;
.backgroud {
display: inline-block;
width: 200px;
height: 200px;
margin-top: 80px;
}
.main-text{
margin-top: 80px;
}
.text {
font-size: 24px;
font-weight: bold;
color: #333;
}
}
</style>