From 563386b4500a0e99500e896dfbec814bc1e8b922 Mon Sep 17 00:00:00 2001 From: LiuChang <3178799235@qq.com> Date: Sat, 14 Dec 2024 12:58:59 +0800 Subject: [PATCH] 8 --- .../ppdxzz/controller/VisitorController.java | 87 ++++++++++++++----- src/main/java/cn/ppdxzz/dao/VisitorDao.java | 23 ++--- src/main/java/cn/ppdxzz/domain/Visitor.java | 23 ++++- .../cn/ppdxzz/service/VisitorService.java | 40 ++++++++- .../service/impl/VisitorServiceImpl.java | 52 ++++++----- src/main/webapp/WEB-INF/jsp/visitor-list.jsp | 48 +++++++++- src/main/webapp/WEB-INF/jsp/visitor-log.jsp | 32 ++++++- .../webapp/WEB-INF/jsp/visitor-success.jsp | 22 ++++- 8 files changed, 262 insertions(+), 65 deletions(-) diff --git a/src/main/java/cn/ppdxzz/controller/VisitorController.java b/src/main/java/cn/ppdxzz/controller/VisitorController.java index 30b9f92..fc0f8b6 100644 --- a/src/main/java/cn/ppdxzz/controller/VisitorController.java +++ b/src/main/java/cn/ppdxzz/controller/VisitorController.java @@ -29,67 +29,81 @@ import java.util.UUID; * @Date: 2020/2/18 16:26 * @Author: PeiChen */ +// 声明这是一个控制器 @Controller +// 映射访问路径为/visitor @RequestMapping("/visitor") public class VisitorController { + // 自动注入VisitorService服务类 private VisitorService visitorService; + // 通过Autowired注解自动注入VisitorService @Autowired public void setVisitorService(VisitorService visitorService) { this.visitorService = visitorService; } + // 访问路径为/visitor/login的请求处理方法,返回注册页面 @RequestMapping("/login") public String register() { return "regist_visitor"; - } + } // 返回regist_visitor视图 /** * 来访登记实现(C操作) - * @param visitor - * @return - * @throws Exception + * @param visitor 访客对象 + * @return ModelAndView 视图模型对象 + * @throws Exception 异常 */ @RequestMapping("/addLogin") public ModelAndView addVisitor(Visitor visitor) throws Exception { ModelAndView mv = new ModelAndView(); + // 参数校验,如果访客信息不完整,则返回错误信息 if (visitor == null || visitor.getName() == null || visitor.getSno() == null || visitor.getPhone() == null || visitor.getPlace() == null) { mv.addObject("error_msg","来访登记失败,请重新登记!"); mv.setViewName("regist_visitor"); return mv; } + // 生成访客ID if (visitor.getId() == null || "".trim().equals(visitor.getId())) { String uuid = UUID.randomUUID().toString().replace("-", ""); visitor.setId(uuid); } + // 设置来访时间为当前系统时间 String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); visitor.setBegin_date(date);//设置来访时间为提交来访登记时间 //先设置离开时间为空串,后续注销时再修改为注销时系统时间 if (visitor.getEnd_date() == null || "".trim().equals(visitor.getEnd_date())) { visitor.setEnd_date(""); } + // 添加访客信息到数据库 visitorService.add(visitor); + // 添加访客ID到模型,用于页面显示 mv.addObject("id",visitor.getId()); - mv.setViewName("visitor-success"); + mv.setViewName("visitor-success"); // 设置成功页面视图 return mv; } /** * 访客记录注销 - * @param request - * @return - * @throws Exception + * @param request HttpServletRequest对象 + * @return ModelAndView 视图模型对象 + * @throws Exception 异常 */ @RequestMapping("/login_out") public ModelAndView logout(HttpServletRequest request) throws Exception { ModelAndView mv = new ModelAndView(); + // 获取访客ID String id = request.getParameter("id"); + // 如果ID为空,则返回错误信息 if (id == null || "".trim().equals(id)) { mv.addObject("logout_msg","系统繁忙,请稍后再试!"); mv.setViewName("regist_visitor"); } + // 获取当前系统时间 String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + // 注销访客记录 visitorService.logout(id,date); mv.addObject("logout_msg","注销成功"); mv.setViewName("regist_visitor"); @@ -98,79 +112,106 @@ public class VisitorController { /** * 管理员手动注销来访状态 - * @param request - * @param response - * @throws Exception + * @param request HttpServletRequest对象 + * @param response HttpServletResponse对象 + * @throws Exception 异常 */ @RequestMapping("/updateStatus") public void updateStatus(HttpServletRequest request,HttpServletResponse response) throws Exception { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); PrintWriter writer = response.getWriter(); + // 获取访客ID String id = request.getParameter("id"); + // 如果ID为空,则返回错误信息 if (id == null || "".trim().equals(id)) { writer.write("false"); return; } + // 获取当前系统时间 String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + // 注销访客记录 visitorService.logout(id,date); writer.write("true"); } /** * 查询所有访客记录 - * @param page - * @param size - * @param request - * @param response - * @return - * @throws Exception + * @param page 当前页码 + * @param size 每页显示数量 + * @param request HttpServletRequest对象 + * @param response HttpServletResponse对象 + * @return ModelAndView 视图模型对象 + * @throws Exception 异常 */ @RequestMapping("/findAll") 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"); response.setCharacterEncoding("utf-8"); + + // 创建ModelAndView对象用于返回视图和数据 ModelAndView mv = new ModelAndView(); List visitors = null; + + // 获取请求中的keyword参数 String keyword = request.getParameter("keyword"); + + // 如果keyword为空或为空字符串,则查询所有访客记录 if (keyword == null || "".trim().equals(keyword) || keyword.length() == 0) { visitors = visitorService.findAll(page,size); }else { + // 否则根据keyword进行搜索 visitors = visitorService.search(page,size,keyword); } + + // 创建分页信息对象 PageInfo pageInfo = new PageInfo(visitors); + // 将分页信息添加到ModelAndView对象中 mv.addObject("pageInfo",pageInfo); + // 设置视图名称为"visitor-list" mv.setViewName("visitor-list"); - + // 返回ModelAndView对象 return mv; } /** * 访客日志` - * @return - * @throws Exception + * @return ModelAndView 视图模型对象,包含访客日志列表和分页信息 + * @throws Exception 抛出可能的异常 */ @RequestMapping("/log") public ModelAndView log(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "10") int size) throws Exception { + // 创建ModelAndView对象用于返回视图和数据 ModelAndView mv = new ModelAndView(); + // 获取访客日志列表 List logs = visitorService.log(page,size); + // 创建分页信息对象 PageInfo pageInfo = new PageInfo(logs); + // 将分页信息添加到ModelAndView对象中 mv.addObject("pageInfo",pageInfo); + // 设置视图名称为"visitor-log" mv.setViewName("visitor-log"); - + // 返回ModelAndView对象 return mv; } /** * 导出访客信息 - * @param response - * @throws Exception + * @param response HttpServletResponse对象,用于发送Excel文件作为响应 + * @throws Exception 抛出可能的异常 */ @RequestMapping("/visitorInfo") public void export(HttpServletResponse response) throws Exception { + // 获取Excel文件的输入流 InputStream is = visitorService.getInputStream(); + + // 设置响应的内容类型为Excel文件 response.setContentType("application/vnd.ms-excel"); + // 设置响应头,指示浏览器以附件形式下载文件,并设置文件名为visitorInfo.xls response.setHeader("contentDisposition","attachment;filename=visitorInfo.xls"); + // 获取响应的输出流 ServletOutputStream outputStream = response.getOutputStream(); + // 使用IOUtils工具类将输入流的内容复制到输出流 IOUtils.copy(is,outputStream); } diff --git a/src/main/java/cn/ppdxzz/dao/VisitorDao.java b/src/main/java/cn/ppdxzz/dao/VisitorDao.java index d6958c6..b129544 100644 --- a/src/main/java/cn/ppdxzz/dao/VisitorDao.java +++ b/src/main/java/cn/ppdxzz/dao/VisitorDao.java @@ -15,39 +15,40 @@ import java.util.List; * @Date: 2020/2/18 16:27 * @Author: PeiChen */ +// 声明这是一个数据访问对象接口 @Repository -public interface VisitorDao { //liih +public interface VisitorDao { /** * 登记到访信息 - * @param visitor - * @throws Exception + * @param visitor 访客对象,包含访客的所有信息 + * @throws Exception 抛出可能的异常 */ @Insert("insert into visitors(id,name,sno,phone,place,begin_date,end_date,visit_result) values(#{id},#{name},#{sno},#{phone},#{place},#{begin_date},#{end_date},#{visit_result})") void add(Visitor visitor) throws Exception; /** * 按时间晚的优先显示查询所有访客记录 - * @return - * @throws Exception + * @return 返回访客记录列表 + * @throws Exception 抛出可能的异常 */ @Select("select * from visitors order by begin_date desc") List findAll() throws Exception; /** * 访客离开后修改离开时间(访客记录注销) - * @param id - * @param end_date - * @throws Exception + * @param id 访客的唯一标识 + * @param end_date 访客离开的时间 + * @throws Exception 抛出可能的异常 */ @Update("update visitors set end_date = #{end_date} where id = #{id}") void logout(@Param(value = "id") String id,@Param(value = "end_date") String end_date) throws Exception; /** * 根据关键字模糊查询访客记录,并按时间倒序排列 - * @param keyword - * @return - * @throws Exception + * @param keyword 查询关键字 + * @return 返回匹配关键字的访客记录列表 + * @throws Exception 抛出可能的异常 */ @Select("select * from visitors where name like '%${keyword}%' or sno like '%${keyword}%' or phone like '%${keyword}%' or place like '%${keyword}%' or begin_date like '%${keyword}%' or end_date like '%${keyword}%' or visit_result like '%${keyword}%' order by begin_date desc ") List search(@Param(value = "keyword") String keyword) throws Exception; diff --git a/src/main/java/cn/ppdxzz/domain/Visitor.java b/src/main/java/cn/ppdxzz/domain/Visitor.java index e20cc25..be38320 100644 --- a/src/main/java/cn/ppdxzz/domain/Visitor.java +++ b/src/main/java/cn/ppdxzz/domain/Visitor.java @@ -4,7 +4,7 @@ import java.io.Serializable; /** * Description:访客实体类 - * + * 用于表示访客信息,并实现Serializable接口以便于序列化 * @Date: 2020/2/18 16:29 * @Author: PeiChen */ @@ -18,9 +18,24 @@ public class Visitor implements Serializable { private String end_date;//离开时间 private String visit_result;//到访原因 + /** + * 默认构造函数 + */ public Visitor() { } + + /** + * 带参数的构造函数,用于创建一个完整的访客对象 + * @param id 访客的ID + * @param name 访客的姓名 + * @param sno 访客的学号 + * @param phone 访客的联系方式 + * @param place 访客访问的地址 + * @param begin_date 访客的来访时间 + * @param end_date 访客的离开时间 + * @param visit_result 访客到访的原因或结果 + */ public Visitor(String id, String name, String sno, String phone, String place, String begin_date, String end_date, String visit_result) { this.id = id; this.name = name; @@ -32,6 +47,8 @@ public class Visitor implements Serializable { this.visit_result = visit_result; } + // 以下是属性的getter和setter方法、 + public String getId() { return id; } @@ -96,6 +113,10 @@ public class Visitor implements Serializable { this.visit_result = visit_result; } + /** + * 重写toString方法,返回访客对象的字符串表示形式 + * @return 访客对象的字符串表示 + */ @Override public String toString() { return "Visitor{" + diff --git a/src/main/java/cn/ppdxzz/service/VisitorService.java b/src/main/java/cn/ppdxzz/service/VisitorService.java index ff0c7c2..d31cf6d 100644 --- a/src/main/java/cn/ppdxzz/service/VisitorService.java +++ b/src/main/java/cn/ppdxzz/service/VisitorService.java @@ -6,23 +6,61 @@ import java.io.InputStream; import java.util.List; /** - * Description: + * Description:访客服务接口,定义了访客管理相关的服务方法 * * @Date: 2020/2/18 18:27 * @Author: PeiChen */ public interface VisitorService { + /** + * 添加新的访客记录 + * @param visitor 访客对象,包含访客的详细信息 + * @throws Exception 如果添加过程中发生错误,则抛出异常 + */ void add(Visitor visitor) throws Exception; + /** + * 查找所有访客记录,并分页显示 + * @param page 当前页码 + * @param size 每页显示的记录数 + * @return 包含访客记录的列表 + * @throws Exception 如果查询过程中发生错误,则抛出异常 + */ List findAll(int page,int size) throws Exception; + /** + * 根据关键字进行搜索,并分页显示搜索结果 + * @param page 当前页码 + * @param size 每页显示的记录数 + * @param keyword 搜索关键字 + * @return 包含搜索结果的访客记录列表 + * @throws Exception 如果搜索过程中发生错误,则抛出异常 + */ List search(int page,int size,String keyword) throws Exception; + /** + * 更新访客的离开时间 + * @param id 访客的唯一标识符 + * @param end_date 访客的离开时间 + * @throws Exception 如果更新过程中发生错误,则抛出异常 + */ void logout(String id,String end_date) throws Exception; + /** + * 获取访客记录的输入流,通常用于导出数据 + * @return 访客记录的输入流 + * @throws Exception 如果获取输入流过程中发生错误,则抛出异常 + */ InputStream getInputStream() throws Exception; + /** + * 获取访客日志记录,并分页显示 + * @param page 当前页码 + * @param size 每页显示的记录数 + * @return 包含访客日志记录的列表 + * @throws Exception 如果获取日志记录过程中发生错误,则抛出异常 + */ List log(int page,int size) throws Exception; } diff --git a/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java b/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java index 0c405ef..9415aa3 100644 --- a/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java +++ b/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; /** - * Description: + * Description:访客服务实现类,实现了VisitorService接口定义的方法 * * @Date: 2020/2/18 18:50 * @Author: PeiChen @@ -23,6 +23,10 @@ public class VisitorServiceImpl implements VisitorService { private VisitorDao visitorDao; + /** + * 通过Autowired注解自动注入VisitorDao + * @param visitorDao 访客数据访问对象 + */ @Autowired public void setVisitorDao(VisitorDao visitorDao) { this.visitorDao = visitorDao; @@ -30,8 +34,8 @@ public class VisitorServiceImpl implements VisitorService { /** * 登记到访信息 - * @param visitor - * @throws Exception + * @param visitor 访客对象,包含访客的详细信息 + * @throws Exception 如果添加过程中发生错误,则抛出异常 */ @Override public void add(Visitor visitor) throws Exception { @@ -39,33 +43,37 @@ public class VisitorServiceImpl implements VisitorService { } /** - * 按时间晚的优先显示查询所有访客记录 - * @return - * @throws Exception + * 按时间晚的优先显示查询所有访客记录,并分页显示 + * @return 包含访客记录的列表 + * @throws Exception 如果查询过程中发生错误,则抛出异常 */ @Override public List findAll(int page, int size) throws Exception { + // 使用PageHelper插件进行分页 PageHelper.startPage(page,size); return visitorDao.findAll(); } /** - * 根据关键字模糊查询访客记录,并按时间倒序排列 - * @param keyword - * @return - * @throws Exception + * 根据关键字模糊查询访客记录,并按时间倒序排列,然后分页显示 + * @param page 当前页码 + * @param size 每页显示的记录数 + * @param keyword 搜索关键字 + * @return 包含搜索结果的访客记录列表 + * @throws Exception 如果搜索过程中发生错误,则抛出异常 */ @Override public List search(int page, int size, String keyword) throws Exception { + // 使用PageHelper插件进行分页 PageHelper.startPage(page,size); return visitorDao.search(keyword); } /** * 访客离开后修改离开时间(访客注销) - * @param id - * @param end_date - * @throws Exception + * @param id 访客的唯一标识符 + * @param end_date 访客的离开时间 + * @throws Exception 如果更新过程中发生错误,则抛出异常 */ @Override public void logout(String id, String end_date) throws Exception { @@ -73,9 +81,9 @@ public class VisitorServiceImpl implements VisitorService { } /** - * 导出访客记录 - * @return - * @throws Exception + * 导出访客记录到Excel文件 + * @return 访客记录的输入流 + * @throws Exception 如果导出过程中发生错误,则抛出异常 */ @Override public InputStream getInputStream() throws Exception { @@ -95,19 +103,21 @@ public class VisitorServiceImpl implements VisitorService { obj[7] = visitors.get(i).getVisit_result(); datalist.add(obj); } + // 使用WriteExcel类将数据写入Excel文件 WriteExcel excel = new WriteExcel(title,datalist); return excel.export(); } /** - * 访客日志 - * @param page - * @param size - * @return - * @throws Exception + * 获取访客日志记录,并分页显示 + * @param page 当前页码 + * @param size 每页显示的记录数 + * @return 包含访客日志记录的列表 + * @throws Exception 如果获取日志记录过程中发生错误,则抛出异常 */ @Override public List log(int page,int size) throws Exception { + // 使用PageHelper插件进行分页 PageHelper.startPage(page,size); return visitorDao.findAll(); } diff --git a/src/main/webapp/WEB-INF/jsp/visitor-list.jsp b/src/main/webapp/WEB-INF/jsp/visitor-list.jsp index cba1df0..8903391 100644 --- a/src/main/webapp/WEB-INF/jsp/visitor-list.jsp +++ b/src/main/webapp/WEB-INF/jsp/visitor-list.jsp @@ -9,35 +9,47 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + + @@ -53,27 +65,35 @@ --%> + +<%-- 页面主体部分,使用LayUI流体布局 --%>
+ <%-- 表单区域,用于搜索 --%>
+ <%-- 搜索框 --%>
+ <%-- 搜索按钮 --%>
+ <%-- 重置按钮(回到第一页) --%>
+ <%-- 导出按钮和总数据条数显示 --%> 导出 共有数据:${pageInfo.total} 条 + <%-- 数据表格区域 --%>
@@ -86,14 +106,17 @@ + + <%-- 使用JSP脚本循环遍历访客列表 --%> <% - int j = 1; + int j = 1; // 初始化计数器,用于行编号 %> + @@ -102,6 +125,7 @@ + <%-- 判断访客是否已离开 --%> @@ -109,6 +133,7 @@ +
来访时间 离开时间 到访原因 操作
<%=j++%>${visitor.phone} ${visitor.place} ${visitor.begin_date}尚未离开 ${visitor.end_date} ${visitor.visit_result} @@ -121,9 +146,11 @@
+ <%-- 分页控制区域 --%>
共 ${pageInfo.pages} 页 当前页:${pageInfo.pageNum} / ${pageInfo.pages}  每页 +
+ <%-- 分页按钮逻辑控制 --%> @@ -174,9 +202,11 @@ ${i} + +
@@ -189,23 +219,35 @@ +
访客时间线
+
    +
  • +

    +

    访客日志共计: ${pageInfo.total} 条 当前显示:${pageInfo.size} 条   + 上一页   + 下一页

    +
      +
    • 【${log.name}】于 ${log.begin_date} 访问了${log.place},事因${log.visit_result},目前尚未离开
    • +
    • 【${log.name}】于 ${log.begin_date} 访问了${log.place},事因${log.visit_result},并与${log.end_date}离开
    • @@ -48,6 +66,7 @@
  • +
  • @@ -55,14 +74,19 @@
+ + diff --git a/src/main/webapp/WEB-INF/jsp/visitor-success.jsp b/src/main/webapp/WEB-INF/jsp/visitor-success.jsp index c1f8ae4..8fd3376 100644 --- a/src/main/webapp/WEB-INF/jsp/visitor-success.jsp +++ b/src/main/webapp/WEB-INF/jsp/visitor-success.jsp @@ -6,14 +6,34 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + 登记成功 + - +

恭喜您,来访登记成功!

+
+ 注销登记