@ -26,7 +26,7 @@ import java.io.UnsupportedEncodingException;
import java.util.List ;
/ * *
* Description :
* Description : 这 是 AdminController 类 , 用 于 处 理 与 管 理 员 相 关 的 各 种 Web 请 求 , 例 如 登 录 、 查 询 、 添 加 、 修 改 等 操 作 。
*
* @Date : 2020 / 2 / 10 15 : 20
* @Author : PeiChen
@ -34,7 +34,10 @@ import java.util.List;
@Controller
public class AdminController {
// 依赖注入AdminService, 用于调用业务逻辑层相关方法来处理管理员数据
private AdminService adminService ;
// 通过@Autowired注解, 让Spring框架自动注入AdminService的实现类实例
@Autowired
public void setAdminService ( AdminService adminService ) {
this . adminService = adminService ;
@ -42,44 +45,66 @@ public class AdminController {
/ * *
* 处 理 用 户 登 录 请 求
* @param model
* @param admin
* @param session
* @param request
* @return
*
* @param model 用 于 在 视 图 和 控 制 器 之 间 传 递 数 据 , 向 视 图 层 传 递 数 据 , 如 错 误 信 息 等
* @param admin 封 装 了 用 户 提 交 的 登 录 信 息 ( 用 户 名 、 密 码 等 ) 的 Admin 对 象
* @param session 用 于 存 储 用 户 登 录 后 的 会 话 信 息 , 比 如 登 录 成 功 后 将 用 户 信 息 存 入 session
* @param request 用 于 获 取 HTTP 请 求 相 关 信 息 , 例 如 设 置 请 求 编 码 等
* @param response 用 于 设 置 HTTP 响 应 相 关 信 息 , 例 如 设 置 响 应 编 码 、 向 客 户 端 返 回 数 据 等
* @return 根 据 登 录 验 证 结 果 , 返 回 对 应 的 视 图 名 称 , 登 录 成 功 返 回 "main" , 失 败 返 回 "login"
* @throws Exception 可 能 抛 出 的 异 常 , 例 如 编 码 设 置 异 常 、 数 据 库 查 询 异 常 等
* /
@RequestMapping ( value = "/login" )
public String login ( Model model , Admin admin , HttpSession session , HttpServletRequest request , HttpServletResponse response ) throws Exception {
public String login ( Model model , Admin admin , HttpSession session , HttpServletRequest request , HttpServletResponse response ) throws Exception {
// 设置请求的字符编码为utf-8, 防止中文乱码等问题
request . setCharacterEncoding ( "utf-8" ) ;
// 设置响应的字符编码为utf-8, 确保返回给客户端的数据编码正确
response . setCharacterEncoding ( "utf-8" ) ;
// 获取响应的输出流对象,用于向客户端输出数据(这里主要用于输出错误提示等文本信息)
PrintWriter writer = response . getWriter ( ) ;
// 如果传入的admin对象为空, 或者用户名、密码为空, 则直接返回登录页面
if ( admin = = null | | admin . getUsername ( ) = = null | | admin . getPassword ( ) = = null ) {
return "login" ;
}
// 使用MD5Util工具类对用户输入的密码进行MD5加密( 以utf-8编码格式) , 增强密码安全性
admin . setPassword ( MD5Util . MD5EncodeUtf8 ( admin . getPassword ( ) ) ) ;
// 调用adminService的方法, 根据传入的admin对象( 包含加密后的密码) 去数据库查找对应的管理员信息
Admin ad = adminService . findAdmin ( admin ) ;
// 如果能查到对应的管理员信息,说明登录成功
if ( ad ! = null ) {
//登录信息存入session域
session . setAttribute ( "adminInfo" , ad ) ;
// System.out.println(ad);
// 将 登录成功后的管理员 信息存入session域,方便后续在其他请求中获取登录用户信息
session . setAttribute ( "adminInfo" , ad ) ;
// 返回主页面视图名称,通常对应着系统的主界面
return "main" ;
}
model . addAttribute ( "msg" , "用户名或密码错误,请重新输入!" ) ;
// 如果没查到,说明用户名或密码错误,向模型中添加错误提示信息
model . addAttribute ( "msg" , "用户名或密码错误,请重新输入!" ) ;
// 返回登录页面视图名称,让用户重新输入登录信息
return "login" ;
}
// 拦截后跳转至登录页
// 拦截后跳转至登录页,当用户未登录访问需要登录才能访问的资源时,可能会被拦截到此方法,然后跳转到登录页面
@RequestMapping ( "/to_login" )
public String Login ( ) {
return "login" ;
}
/ * *
* 退 出 登 录
n * /
* 退 出 登 录 操 作 , 通 过 使 当 前 会 话 失 效 来 实 现 退 出 登 录 功 能 , 清 除 用 户 在 本 次 会 话 中 的 登 录 状 态 等 信 息
*
* @param admin 此 处 参 数 可 能 未 实 际 使 用 , 但 在 Spring MVC 的 方 法 参 数 绑 定 中 需 要 定 义 ( 具 体 看 业 务 场 景 是 否 会 用 到 )
* @param model 可 用 于 向 视 图 传 递 一 些 提 示 信 息 等 ( 此 处 可 能 未 实 际 使 用 )
* @param session 用 于 操 作 当 前 用 户 的 会 话 , 通 过 invalidate 方 法 注 销 当 前 会 话
* @return 返 回 登 录 页 面 视 图 名 称 , 退 出 登 录 后 一 般 跳 转 到 登 录 页 面
* /
@RequestMapping ( value = "/loginOut" )
public String loginOut ( Admin admin , Model model , HttpSession session ) {
//通过session.invalidate()方法来注销当前的session
public String loginOut ( Admin admin , Model model , HttpSession session ) {
// 通过session.invalidate()方法来注销当前的session,清除会话相关信息
session . invalidate ( ) ;
return "login" ;
@ -87,84 +112,133 @@ public class AdminController {
/ * *
* 分 页 查 询 所 有 管 理 员 信 息
*
* @param page 当 前 页 码 , 通 过 @RequestParam 注 解 从 请 求 参 数 中 获 取 , 默 认 值 为 1 , 如 果 请 求 中 未 传 递 该 参 数 则 使 用 默 认 值
* @param size 每 页 显 示 的 记 录 数 , 通 过 @RequestParam 注 解 从 请 求 参 数 中 获 取 , 默 认 值 为 5 , 如 果 请 求 中 未 传 递 该 参 数 则 使 用 默 认 值
* @param request 用 于 获 取 HTTP 请 求 相 关 信 息 , 例 如 获 取 查 询 关 键 字 等 参 数
* @param response 用 于 设 置 HTTP 响 应 相 关 信 息 , 例 如 设 置 编 码 等
* @return 返 回 一 个 ModelAndView 对 象 , 包 含 了 查 询 到 的 管 理 员 分 页 数 据 以 及 要 跳 转 的 视 图 名 称
* @throws Exception 可 能 抛 出 的 异 常 , 比 如 编 码 设 置 异 常 、 数 据 库 查 询 异 常 等
* /
@RequestMapping ( value = "/findAllAdmin" )
public ModelAndView findAll ( @RequestParam ( name = "page" , required = true , defaultValue = "1" ) int page , @RequestParam ( name = "size" , required = true , defaultValue = "5" ) int size , HttpServletRequest request , HttpServletResponse response ) throws Exception {
public ModelAndView findAll ( @RequestParam ( name = "page" , required = true , defaultValue = "1" ) int page , @RequestParam ( name = "size" , required = true , defaultValue = "5" ) int size , HttpServletRequest request , HttpServletResponse response ) throws Exception {
// 设置请求的字符编码为utf-8
request . setCharacterEncoding ( "utf-8" ) ;
// 设置响应的字符编码为utf-8
response . setCharacterEncoding ( "utf-8" ) ;
// 创建一个ModelAndView对象, 用于封装要返回给视图的数据以及视图名称
ModelAndView mv = new ModelAndView ( ) ;
// 用于存放查询到的管理员列表数据, 初始化为null
List < Admin > admins = null ;
// 从请求参数中获取查询关键字, 如果没有传递该参数则可能为null
String keyword = request . getParameter ( "keyword" ) ;
// 如果关键字为空( 包括null、空字符串、长度为0等情况) , 则查询所有管理员信息( 按照分页条件)
if ( keyword = = null | | keyword . trim ( ) . equals ( "" ) | | keyword . length ( ) = = 0 ) {
admins = adminService . findAll ( page , size ) ;
} else {
admins = adminService . serarchInfo ( page , size , keyword ) ;
admins = adminService . findAll ( page , size ) ;
} else {
// 如果有关键字,则根据关键字进行模糊查询管理员信息(按照分页条件)
admins = adminService . serarchInfo ( page , size , keyword ) ;
}
//PageInfo就是一个封装了分页数据的bean
// 使用PageInfo对查询到的管理员列表数据进行分页相关信息的封装, 方便在视图层展示分页导航等信息
PageInfo pageInfo = new PageInfo ( admins ) ;
mv . addObject ( "pageInfo" , pageInfo ) ;
// 将封装好分页数据的PageInfo对象添加到ModelAndView中, 以便在视图中可以获取并展示分页数据
mv . addObject ( "pageInfo" , pageInfo ) ;
// 设置要跳转的视图名称为"admin-list",通常对应着展示管理员列表的页面
mv . setViewName ( "admin-list" ) ;
return mv ;
}
/ * *
* 删 除 管 理 员
* 删 除 管 理 员 操 作 , 接 收 一 个 管 理 员 的 id 作 为 参 数 ( 从 请 求 中 获 取 ) , 调 用 adminService 的 方 法 来 删 除 对 应 的 管 理 员 记 录
*
* @param request 用 于 获 取 HTTP 请 求 中 传 递 的 管 理 员 id 参 数
* @throws Exception 可 能 抛 出 的 异 常 , 比 如 参 数 解 析 异 常 、 数 据 库 删 除 操 作 异 常 等
* /
@ResponseBody
@RequestMapping ( value = "/deleteAdmin" )
public void deleteAdmin ( HttpServletRequest request ) throws Exception {
// 从请求参数中获取要删除的管理员的id
String id = request . getParameter ( "id" ) ;
// 调用adminService的方法, 根据解析后的管理员id( 转换为整数类型) 来删除对应的管理员记录
adminService . deleteAdminById ( Integer . parseInt ( id ) ) ;
}
/ * *
* 校 验 用 户 名 是 否 存 在
* 校 验 用 户 名 是 否 存 在 , 接 收 客 户 端 传 递 的 用 户 名 参 数 , 调 用 adminService 的 方 法 进 行 校 验 , 然 后 向 客 户 端 返 回 相 应 的 提 示 信 息
*
* @param request 用 于 获 取 HTTP 请 求 中 传 递 的 用 户 名 参 数
* @param response 用 于 向 客 户 端 返 回 校 验 结 果 信 息 ( 通 过 设 置 响 应 编 码 、 输 出 流 等 )
* @throws Exception 可 能 抛 出 的 异 常 , 比 如 编 码 设 置 异 常 、 数 据 库 查 询 异 常 等
* /
@RequestMapping ( value = "/checkUserName" )
public void checkUserName ( HttpServletRequest request , HttpServletResponse response ) throws Exception {
// 设置请求的字符编码为utf-8
request . setCharacterEncoding ( "utf-8" ) ;
// 设置响应的字符编码为utf-8
response . setCharacterEncoding ( "utf-8" ) ;
// 获取响应的输出流对象,用于向客户端输出校验结果信息
PrintWriter pw = response . getWriter ( ) ;
//取值
// 从请求参数中获取要校验的用户名
String u_name = request . getParameter ( "u_name" ) ;
//调用service,用户名存在返回true, 不存在则返回false
// 调用adminService的方法, 校验用户名是否存在, 存在返回true, 不存在返回false
Boolean result = adminService . checkUserName ( u_name ) ;
//System.out.println(result);
// 回调函数
// 根据校验结果,向客户端输出相应的提示信息
if ( result ) {
//pw.write("用户名已存在,请重新输入!");
pw . write ( "账号可用" ) ;
} else {
} else {
pw . write ( "账号不存在" ) ;
}
}
@RequestMapping ( value = "/adminAdd" )
public String adminAdd ( ) {
// 返回添加管理员页面的视图名称,通常对应着展示添加管理员表单的页面
return "admin-add" ;
}
/ * *
* 添 加 管 理 员
* @param admin
* @param request
* @param response
* @throws Exception
* 添 加 管 理 员 操 作 , 接 收 一 个 Admin 对 象 ( 包 含 管 理 员 的 各 项 信 息 ) 以 及 请 求 和 响 应 对 象 , 进 行 一 系 列 校 验 后 , 调 用 adminService 的 方 法 将 管 理 员 信 息 添 加 到 数 据 库
*
* @param admin 封 装 了 要 添 加 的 管 理 员 各 项 信 息 的 Admin 对 象
* @param request 用 于 获 取 HTTP 请 求 相 关 信 息 , 例 如 获 取 请 求 中 的 参 数 等
* @param response 用 于 向 客 户 端 返 回 添 加 操 作 的 结 果 信 息 ( 通 过 输 出 流 等 )
* @throws Exception 可 能 抛 出 的 异 常 , 比 如 编 码 设 置 异 常 、 参 数 校 验 不 通 过 、 数 据 库 插 入 异 常 等
* /
@RequestMapping ( "/addAdmin" )
public void addAdmin ( Admin admin , HttpServletRequest request , HttpServletResponse response ) throws Exception {
public void addAdmin ( Admin admin , HttpServletRequest request , HttpServletResponse response ) throws Exception {
// 获取响应的输出流对象,用于向客户端输出添加操作的结果信息(成功或失败)
PrintWriter writer = response . getWriter ( ) ;
// 调用adminService的方法校验用户名是否已存在, 已存在则check为true, 不存在为false
Boolean check = adminService . checkUserName ( admin . getUsername ( ) ) ;
//如果用户名已存在check为true, 不存在为false
// 如果用户名已存在,向客户端输出"false"表示添加失败,并结束方法执行
if ( check ) {
writer . write ( "false" ) ;
return ;
}
// 如果传入的admin对象为空, 向客户端输出"false"表示添加失败,并结束方法执行
if ( admin = = null ) {
writer . write ( "false" ) ;
return ;
} else {
if ( admin . getUsername ( ) = = null | | "" . trim ( ) . equals ( admin . getUsername ( ) )
| | admin . getPassword ( ) = = null | | "" . trim ( ) . equals ( admin . getPassword ( ) )
} else {
// 进一步校验管理员对象的各个属性是否为空(去除两端空格后为空字符串也算空),只要有一个属性为空,就向客户端输出"false"表示添加失败,并结束方法执行
if ( admin . getUsername ( ) = = null | | "" . trim ( ) . equals ( admin . getUsername ( ) )
| | admin . getPassword ( ) = = null | | "" . trim ( ) . equals ( admin . getPassword ( ) )
| | admin . getName ( ) = = null | | "" . trim ( ) . equals ( admin . getName ( ) )
| | admin . getUid ( ) = = null | | "" . trim ( ) . equals ( admin . getUid ( ) )
| | admin . getPhone ( ) = = null | | "" . trim ( ) . equals ( admin . getPhone ( ) )
@ -173,35 +247,58 @@ public class AdminController {
return ;
}
}
// 校验学工号是否已被注册, 若已被注册( 返回的Admin对象不为null) , 向客户端输出"false"表示添加失败,并结束方法执行
Admin isNull = adminService . checkUid ( admin . getUid ( ) ) ;
if ( isNull ! = null ) {
writer . write ( "false" ) ;
return ;
}
// 使用MD5Util工具类对管理员密码进行MD5加密( 以utf-8编码格式)
admin . setPassword ( MD5Util . MD5EncodeUtf8 ( admin . getPassword ( ) ) ) ;
// 调用adminService的方法, 将经过校验和加密密码后的管理员信息添加到数据库
adminService . addAdmin ( admin ) ;
// 添加成功后,向客户端输出"true"表示添加成功
writer . write ( "true" ) ;
}
//跳转管理员信息编辑页面,并回显信息
// 跳转管理员信息编辑页面, 并回显信息, 根据传入的管理员id从数据库查询对应的管理员信息, 然后将信息传递到编辑页面进行展示
@RequestMapping ( "/adminEdit" )
public ModelAndView editAdmin ( HttpServletRequest request ) throws Exception {
// 创建一个ModelAndView对象, 用于封装要返回给视图的数据以及视图名称
ModelAndView mv = new ModelAndView ( ) ;
// 从请求参数中获取要编辑的管理员的id
String id = request . getParameter ( "id" ) ;
// 调用adminService的方法, 根据管理员id查询对应的管理员信息
Admin ad = adminService . findAdminById ( Integer . parseInt ( id ) ) ;
mv . addObject ( "ad" , ad ) ;
//mv.addObject("id",id);
// 将查询到的管理员信息添加到ModelAndView中, 以便在编辑页面可以获取并展示该信息
mv . addObject ( "ad" , ad ) ;
// 设置要跳转的视图名称为"admin-edit",通常对应着展示管理员信息编辑表单的页面
mv . setViewName ( "admin-edit" ) ;
return mv ;
}
//修改管理员信息
// 修改管理员信息操作, 接收一个Admin对象( 包含修改后的管理员各项信息) 以及响应对象, 进行一系列校验后, 调用adminService的方法更新数据库中的管理员信息
@RequestMapping ( "/editAdmin" )
public void editAdmin ( Admin admin , HttpServletResponse response ) throws Exception {
public void editAdmin ( Admin admin , HttpServletResponse response ) throws Exception {
// 获取响应的输出流对象,用于向客户端输出修改操作的结果信息(成功或失败)
PrintWriter writer = response . getWriter ( ) ;
// 如果传入的admin对象为空, 向客户端输出"false"表示修改失败,并结束方法执行
if ( admin = = null ) {
writer . write ( "false" ) ;
return ;
} else {
if ( admin . getUsername ( ) = = null | | "" . trim ( ) . equals ( admin . getUsername ( ) )
} else {
// 校验管理员对象的各个属性是否为空(去除两端空格后为空字符串也算空),只要有一个属性为空,就向客户端输出"false"表示修改失败,并结束方法执行
if ( admin . getUsername ( ) = = null | | "" . trim ( ) . equals ( admin . getUsername ( ) )
| | admin . getName ( ) = = null | | "" . trim ( ) . equals ( admin . getName ( ) )
| | admin . getUid ( ) = = null | | "" . trim ( ) . equals ( admin . getUid ( ) )
| | admin . getPhone ( ) = = null | | "" . trim ( ) . equals ( admin . getPhone ( ) )
@ -210,63 +307,46 @@ public class AdminController {
return ;
}
}
// 此处注释掉了密码加密代码,可能根据业务需求,修改管理员信息时不一定需要重新加密密码(具体看实际情况)
//admin.setPassword(MD5Util.MD5EncodeUtf8(admin.getPassword()));
// 调用adminService的方法, 根据传入的修改后的管理员信息更新数据库中的对应记录
adminService . updateAdmin ( admin ) ;
//更新成功进行提示信息回显
// 更新成功后,向客户端输出"true"表示更新成功
writer . write ( "true" ) ;
}
/ * *
* 授 权 操 作
* 授 权 操 作 , 接 收 一 个 Admin 对 象 ( 包 含 要 授 权 的 管 理 员 相 关 信 息 及 授 权 级 别 等 ) , 进 行 一 系 列 校 验 后 , 调 用 adminService 的 方 法 进 行 授 权 相 关 的 数 据 库 操 作
*
* @param admin 封 装 了 要 授 权 的 管 理 员 相 关 信 息 及 授 权 级 别 等 的 Admin 对 象
* @param response 用 于 向 客 户 端 返 回 授 权 操 作 的 结 果 信 息 ( 通 过 输 出 流 等 )
* @throws Exception 可 能 抛 出 的 异 常 , 比 如 编 码 设 置 异 常 、 参 数 校 验 不 通 过 、 数 据 库 更 新 异 常 等
* /
@RequestMapping ( "/put_power" )
public void put_power ( Admin admin , HttpServletResponse response ) throws Exception {
public void put_power ( Admin admin , HttpServletResponse response ) throws Exception {
// 获取响应的输出流对象,用于向客户端输出授权操作的结果信息(成功或失败)
PrintWriter writer = response . getWriter ( ) ;
// 如果传入的admin对象为空, 向客户端输出"false"表示授权失败,并结束方法执行
if ( admin = = null ) {
writer . write ( "false" ) ;
return ;
}
// 校验授权级别是否在合法范围内( 0到4之间) , 不在则向客户端输出"false"表示授权失败,并结束方法执行
if ( admin . getPower ( ) < 0 | | admin . getPower ( ) > 4 ) {
writer . write ( "false" ) ;
return ;
}
adminService . put_power ( admin ) ;
writer . write ( "true" ) ;
}
/ * *
* 导 出 管 理 员 信 息
* @param response
* @throws Exception
* /
@RequestMapping ( "/exportAdminInfo" )
public void exportAdminInfo ( HttpServletResponse response ) throws Exception {
InputStream is = adminService . getInputStream ( ) ;
response . setContentType ( "application/vnd.ms-excel" ) ;
response . setHeader ( "contentDisposition" , "attachment;filename=adminsInfo.xls" ) ;
ServletOutputStream outputStream = response . getOutputStream ( ) ;
IOUtils . copy ( is , outputStream ) ;
}
/ * *
* 校 验 学 工 号 是 否 已 被 注 册
* @param request
* @param response
* @throws Exception
* /
@RequestMapping ( "/checkUid" )
public void checkUid ( HttpServletRequest request , HttpServletResponse response ) throws Exception {
request . setCharacterEncoding ( "utf-8" ) ;
response . setCharacterEncoding ( "utf-8" ) ;
PrintWriter writer = response . getWriter ( ) ;
String uid = request . getParameter ( "uid" ) ;
Admin admin = adminService . checkUid ( uid ) ;
if ( admin ! = null ) {
writer . write ( "true" ) ; //uid已被注册
return ;
}
// 调用adminService的方法, 进行授权相关的数据库操作( 具体操作由service层实现)
adminService . put_power ( admin ) ;
// 授权成功后,向客户端输出"true"表示授权成功
writer . write ( "true" ) ;
}
}