diff --git a/src/main/java/cn/ppdxzz/controller/VisitorController.java b/src/main/java/cn/ppdxzz/controller/VisitorController.java index 30b9f92..b11d985 100644 --- a/src/main/java/cn/ppdxzz/controller/VisitorController.java +++ b/src/main/java/cn/ppdxzz/controller/VisitorController.java @@ -24,154 +24,216 @@ import java.util.List; import java.util.UUID; /** - * Description: + * Description: 该类是访客相关功能的控制器,处理与访客相关的各种请求,例如来访登记、注销、查询、导出等操作。 * * @Date: 2020/2/18 16:26 * @Author: PeiChen */ +// 声明这是一个Spring框架中的控制器,表明该类可以处理HTTP请求并返回相应的视图或数据 @Controller +// 映射访问路径为/visitor,意味着所有以/visitor开头的请求都会被该控制器处理 @RequestMapping("/visitor") public class VisitorController { + // 自动注入VisitorService服务类,通过依赖注入的方式获取VisitorService的实例,以便调用其中的业务逻辑方法 private VisitorService visitorService; + // 通过Autowired注解自动注入VisitorService,这里是设置属性注入的方法,Spring会自动找到VisitorService的实现类并注入进来 @Autowired public void setVisitorService(VisitorService visitorService) { this.visitorService = visitorService; } + // 访问路径为/visitor/login的请求处理方法,该方法返回注册页面的视图名称,通常Spring会根据这个名称去查找对应的视图文件进行渲染展示 @RequestMapping("/login") public String register() { return "regist_visitor"; - } + } // 返回regist_visitor视图,此视图应该是用于展示访客注册相关页面内容的,具体的页面解析和渲染由Spring的视图解析器根据配置来完成 /** * 来访登记实现(C操作) - * @param visitor - * @return - * @throws Exception + * 该方法用于处理访客的来访登记功能,接收一个Visitor对象作为参数,将访客信息保存到数据库中,并根据操作结果返回相应的视图。 + * + * @param visitor 访客对象,包含了访客的各种信息,如姓名、学号、电话、访问地点等,这些信息将被保存到数据库中。 + * @return ModelAndView 视图模型对象,用于携带数据并指定要返回的视图名称,以便Spring进行视图渲染和数据展示。 + * @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.addObject("error_msg", "来访登记失败,请重新登记!"); mv.setViewName("regist_visitor"); return mv; } + // 生成访客ID,使用UUID(通用唯一识别码)来生成一个唯一的标识符作为访客的ID,如果原访客对象中的ID为空或者是空白字符串,则进行生成操作 if (visitor.getId() == null || "".trim().equals(visitor.getId())) { String uuid = UUID.randomUUID().toString().replace("-", ""); visitor.setId(uuid); } + // 设置来访时间为当前系统时间,通过SimpleDateFormat格式化当前的日期和时间(格式为"yyyy-MM-dd HH:mm:ss"),并设置到访客对象的来访时间属性中 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方法将完整的访客信息保存到数据库中 visitorService.add(visitor); - mv.addObject("id",visitor.getId()); - mv.setViewName("visitor-success"); + // 添加访客ID到模型,用于页面显示,将生成的访客ID添加到ModelAndView对象中,以便在后续的视图中可以获取并展示给用户 + mv.addObject("id", visitor.getId()); + mv.setViewName("visitor-success"); // 设置成功页面视图,指定成功登记后要展示的视图名称,通常会显示登记成功的相关提示信息 return mv; } /** * 访客记录注销 - * @param request - * @return - * @throws Exception + * 该方法用于处理访客记录的注销功能,接收一个HttpServletRequest对象,从请求中获取访客ID,然后调用业务逻辑进行注销操作,并根据操作结果返回相应的视图。 + * + * @param request HttpServletRequest对象,用于获取请求中的参数,如访客ID等信息。 + * @return ModelAndView 视图模型对象,携带注销操作的相关提示信息并指定要返回的视图名称。 + * @throws Exception 异常,可能会抛出如数据库操作异常等各种异常情况,由调用者进行处理。 */ @RequestMapping("/login_out") public ModelAndView logout(HttpServletRequest request) throws Exception { ModelAndView mv = new ModelAndView(); + // 获取访客ID,从HttpServletRequest对象中获取名为"id"的参数值,该参数值代表要注销的访客的唯一标识 String id = request.getParameter("id"); + // 如果ID为空,则返回错误信息页面,提示系统繁忙,让用户稍后再试 if (id == null || "".trim().equals(id)) { - mv.addObject("logout_msg","系统繁忙,请稍后再试!"); + mv.addObject("logout_msg", "系统繁忙,请稍后再试!"); mv.setViewName("regist_visitor"); } + // 获取当前系统时间,通过SimpleDateFormat格式化当前的日期和时间(格式为"yyyy-MM-dd HH:mm:ss"),用于更新访客记录的注销时间 String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - visitorService.logout(id,date); - mv.addObject("logout_msg","注销成功"); + // 注销访客记录,调用VisitorService中的logout方法,传入访客ID和当前时间,完成在数据库中对访客记录的注销操作(可能是更新离开时间等相关操作) + visitorService.logout(id, date); + mv.addObject("logout_msg", "注销成功"); mv.setViewName("regist_visitor"); return mv; } /** * 管理员手动注销来访状态 - * @param request - * @param response - * @throws Exception + * 该方法用于管理员手动注销来访状态,接收HttpServletRequest和HttpServletResponse对象,从请求中获取访客ID,进行注销操作,并向响应中写入操作结果(true或false)。 + * + * @param request HttpServletRequest对象,用于获取请求中的访客ID等参数信息。 + * @param response HttpServletResponse对象,用于设置响应的字符编码、向客户端发送操作结果等信息。 + * @throws Exception 异常,可能出现如数据库操作异常、编码设置异常等情况,由调用者进行处理。 */ @RequestMapping("/updateStatus") - public void updateStatus(HttpServletRequest request,HttpServletResponse response) throws Exception { + public void updateStatus(HttpServletRequest request, HttpServletResponse response) throws Exception { request.setCharacterEncoding("utf-8"); + // 设置请求的字符编码为UTF-8,确保能正确接收和处理包含中文等特殊字符的请求参数 response.setCharacterEncoding("utf-8"); + // 设置响应的字符编码为UTF-8,保证返回给客户端的数据能正确显示,避免出现乱码问题 PrintWriter writer = response.getWriter(); + // 获取响应的输出流的PrintWriter对象,用于向客户端发送文本数据(这里用于写入操作结果) + // 获取访客ID,从HttpServletRequest对象中获取名为"id"的参数值,该参数值是要注销的访客记录的标识 String id = request.getParameter("id"); + // 如果ID为空,则返回错误信息,向客户端写入"false"表示注销操作失败 if (id == null || "".trim().equals(id)) { writer.write("false"); return; } + // 获取当前系统时间,通过SimpleDateFormat格式化当前的日期和时间(格式为"yyyy-MM-dd HH:mm:ss"),用于更新访客记录的注销时间 String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - visitorService.logout(id,date); + // 注销访客记录,调用VisitorService中的logout方法,传入访客ID和当前时间,在数据库中执行注销操作(比如更新离开时间等相关字段) + visitorService.logout(id, date); writer.write("true"); + // 向客户端写入"true"表示注销操作成功,客户端可以根据接收到的这个结果进行相应的提示或后续处理 } /** * 查询所有访客记录 - * @param page - * @param size - * @param request - * @param response - * @return - * @throws Exception + * 该方法用于查询所有访客记录,支持分页查询以及根据关键词搜索查询,接收当前页码、每页显示数量以及HttpServletRequest和HttpServletResponse对象,返回包含查询结果和分页信息的视图模型对象。 + * + * @param page 当前页码,用于指定要获取第几页的数据,从请求参数中获取,默认值为1,如果请求中没有传递该参数则使用默认值。 + * @param size 每页显示数量,用于指定每页展示多少条访客记录,从请求参数中获取,默认值为5,如果请求中没有传递该参数则使用默认值。 + * @param request HttpServletRequest对象,用于获取请求中的参数,如关键词等信息,以及设置请求的字符编码。 + * @param response HttpServletResponse对象,用于设置响应的字符编码等操作。 + * @return ModelAndView 视图模型对象,携带查询到的访客记录列表以及分页信息,并指定要返回的视图名称,方便Spring进行视图渲染和数据展示。 + * @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 { + public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page, + @RequestParam(name = "page", 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对象用于返回视图和数据,该对象可以携带数据并指定要展示的视图名称,方便Spring进行后续的视图渲染操作 ModelAndView mv = new ModelAndView(); List visitors = null; + + // 获取请求中的keyword参数,该参数用于根据关键词进行访客记录的搜索,如果没有该参数则查询所有记录 String keyword = request.getParameter("keyword"); + + // 如果keyword为空或为空字符串,或者长度为0(进一步确保为空的情况),则查询所有访客记录,调用VisitorService的findAll方法获取所有访客信息(分页查询) if (keyword == null || "".trim().equals(keyword) || keyword.length() == 0) { - visitors = visitorService.findAll(page,size); - }else { - visitors = visitorService.search(page,size,keyword); + visitors = visitorService.findAll(page, size); + } else { + // 否则根据keyword进行搜索,调用VisitorService的search方法,传入当前页码、每页显示数量以及关键词,进行带关键词的分页搜索操作 + visitors = visitorService.search(page, size, keyword); } + + // 创建分页信息对象,通过PageInfo对查询到的访客列表进行分页相关信息的封装,如总页数、总记录数等信息都会被自动计算并封装在该对象中 PageInfo pageInfo = new PageInfo(visitors); - mv.addObject("pageInfo",pageInfo); + // 将分页信息添加到ModelAndView对象中,这样在视图中就可以获取并展示分页相关的信息,如页码导航、总记录数等内容 + mv.addObject("pageInfo", pageInfo); + // 设置视图名称为"visitor-list",指定要返回的视图名称,Spring会根据配置找到对应的视图文件进行渲染展示,该视图可能用于展示访客记录列表信息 mv.setViewName("visitor-list"); - + // 返回ModelAndView对象,将携带数据的视图模型返回给Spring框架,由框架进行后续的视图渲染和响应返回操作 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 { + public ModelAndView log(@RequestParam(name = "page", required = true, defaultValue = "1") int page, + @RequestParam(name = "size", required = true, defaultValue = "10") int size) throws Exception { + // 创建ModelAndView对象用于返回视图和数据,该对象可以携带数据并指定要展示的视图名称,方便Spring进行后续的视图渲染操作 ModelAndView mv = new ModelAndView(); - List logs = visitorService.log(page,size); + // 获取访客日志列表,调用VisitorService的log方法,传入当前页码和每页显示数量,获取相应分页的访客日志信息 + List logs = visitorService.log(page, size); + // 创建分页信息对象,通过PageInfo对获取到的访客日志列表进行分页相关信息的封装,方便在视图中展示分页相关的内容 PageInfo pageInfo = new PageInfo(logs); - mv.addObject("pageInfo",pageInfo); + // 将分页信息添加到ModelAndView对象中,使得视图可以获取并展示如总页数、当前页码等分页相关信息 + mv.addObject("pageInfo", pageInfo); + // 设置视图名称为"visitor-log",指定要返回的视图名称,Spring会根据配置找到对应的视图文件进行渲染展示,该视图用于展示访客日志相关信息 mv.setViewName("visitor-log"); - + // 返回ModelAndView对象,将携带访客日志数据和分页信息的视图模型返回给Spring框架,由框架进行后续的视图渲染和响应返回操作 return mv; } + /** * 导出访客信息 - * @param response - * @throws Exception + * 该方法用于将访客信息导出为Excel文件格式,接收一个HttpServletResponse对象,用于设置响应头信息以及将Excel文件内容通过响应流发送给客户端。 + * + * @param response HttpServletResponse对象,用于发送Excel文件作为响应,设置响应的相关属性(如内容类型、文件头信息等)以及输出文件内容。 + * @throws Exception 抛出可能的异常,如文件读取异常、流操作异常等情况,由调用者进行处理。 */ @RequestMapping("/visitorInfo") public void export(HttpServletResponse response) throws Exception { + // 获取Excel文件的输入流,调用VisitorService的getInputStream方法获取访客信息对应的Excel文件的输入流,以便后续将文件内容发送给客户端 InputStream is = visitorService.getInputStream(); + + // 设置响应的内容类型为Excel文件,指定响应的内容类型为"application/vnd.ms-excel",告诉客户端返回的数据是Excel格式的文件,以便客户端进行正确的处理(如下载或打开操作) response.setContentType("application/vnd.ms-excel"); - response.setHeader("contentDisposition","attachment;filename=visitorInfo.xls"); + // 设置响应头,指示浏览器以附件形式下载文件,并设置文件名为visitorInfo.xls,通过设置"contentDisposition"头信息,让浏览器以附件形式下载文件,并指定文件名,方便用户保存文件 + response.setHeader("contentDisposition", "attachment;filename=visitorInfo.xls"); + // 获取响应的输出流,用于将Excel文件的内容写入到响应中,发送给客户端 ServletOutputStream outputStream = response.getOutputStream(); - IOUtils.copy(is,outputStream); + // 使用IOUtils工具类将输入流的内容复制到输出流,借助Apache Commons IO库提供的IOUtils工具类,方便地将Excel文件的输入流内容复制到响应的输出流中,实现文件的发送 + IOUtils.copy(is, outputStream); } -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/dao/VisitorDao.java b/src/main/java/cn/ppdxzz/dao/VisitorDao.java index a4bb26f..26643b5 100644 --- a/src/main/java/cn/ppdxzz/dao/VisitorDao.java +++ b/src/main/java/cn/ppdxzz/dao/VisitorDao.java @@ -11,45 +11,62 @@ import java.util.List; /** * Description:访客持久层 + * 该接口定义了与访客数据访问相关的操作方法,通过MyBatis的注解方式来声明SQL语句, + * 用于实现对数据库中访客信息表(visitors)的增、查、改等操作,每个方法对应不同的业务需求。 * * @Date: 2020/2/18 16:27 * @Author: PeiChen */ +// 声明这是一个数据访问对象接口,在Spring框架中,使用 @Repository 注解标记该接口为数据访问层组件,便于进行依赖注入和管理 @Repository public interface VisitorDao { /** * 登记到访信息 - * @param visitor - * @throws Exception + * 该方法用于向数据库中插入访客的到访信息,通过MyBatis的 @Insert 注解定义插入操作的SQL语句, + * 将访客对象中的各个属性值插入到对应的数据库表字段中。 + * + * @param visitor 访客对象,包含访客的所有信息,如ID、姓名、学号、电话、访问地点、来访时间、离开时间、到访原因等, + * 这些属性值将按照SQL语句中的占位符对应插入到数据库的visitors表中相应字段。 + * @throws Exception 抛出可能的异常,例如数据库连接异常、SQL执行异常等情况,由调用该方法的上层代码进行处理。 */ @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 + * 该方法用于从数据库中查询所有访客记录,并按照来访时间(begin_date)降序排列,即时间晚的访客记录优先显示, + * 通过MyBatis的 @Select 注解定义查询操作的SQL语句,返回一个包含所有访客信息的列表。 + * + * @return 返回访客记录列表,列表中的每个元素是一个Visitor对象,包含了从数据库中查询到的访客的各项详细信息。 + * @throws Exception 抛出可能的异常,如数据库查询出现问题、数据转换异常等,由调用者负责处理。 */ @Select("select * from visitors order by begin_date desc") List findAll() throws Exception; /** * 访客离开后修改离开时间(访客记录注销) - * @param id - * @param end_date - * @throws Exception + * 该方法用于在访客离开后,更新数据库中对应访客记录的离开时间字段,通过MyBatis的 @Update 注解定义更新操作的SQL语句, + * 根据访客的唯一标识(ID)找到对应的记录,并将离开时间(end_date)字段更新为指定的值。 + * + * @param id 访客的唯一标识,用于在数据库中定位要更新的具体访客记录,对应visitors表中的id字段。 + * @param end_date 访客离开的时间,要更新到数据库中对应访客记录的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; + void logout(@Param(value = "id") String id, @Param(value = "end_date") String end_date) throws Exception; /** * 根据关键字模糊查询访客记录,并按时间倒序排列 - * @param keyword - * @return - * @throws Exception + * 该方法用于根据给定的关键字在数据库中对访客记录进行模糊查询,查询条件涵盖访客的多个字段(姓名、学号、电话等), + * 只要这些字段中包含关键字的内容就会被匹配到,并且查询结果按照来访时间(begin_date)降序排列, + * 通过MyBatis的 @Select 注解定义复杂的模糊查询操作的SQL语句,返回匹配关键字的访客记录列表。 + * + * @param keyword 查询关键字,是一个字符串类型的值,用于在多个字段中进行模糊匹配查找符合条件的访客记录。 + * @return 返回匹配关键字的访客记录列表,列表中的元素为Visitor对象,包含了符合模糊查询条件的访客的详细信息。 + * @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; -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/domain/Visitor.java b/src/main/java/cn/ppdxzz/domain/Visitor.java index e20cc25..f1f61d3 100644 --- a/src/main/java/cn/ppdxzz/domain/Visitor.java +++ b/src/main/java/cn/ppdxzz/domain/Visitor.java @@ -4,23 +4,49 @@ import java.io.Serializable; /** * Description:访客实体类 - * + * 用于表示访客信息,并实现Serializable接口以便于序列化,这样该类的对象就可以在网络传输、保存到文件等场景下进行序列化和反序列化操作。 * @Date: 2020/2/18 16:29 * @Author: PeiChen */ public class Visitor implements Serializable { - private String id;//uuid 全球唯一id - private String name;//访客姓名 - private String sno;//访客学号 - private String phone;//联系方式 - private String place;//访问地址 - private String begin_date;//来访时间 - private String end_date;//离开时间 - private String visit_result;//到访原因 - + // uuid 全球唯一id,用于唯一标识每个访客记录,在数据库操作等场景中可作为主键来区分不同访客 + private String id; + // 访客姓名,用于记录访客的具体称呼,方便后续识别和查询访客相关信息 + private String name; + // 访客学号,若访客是学生等有学号标识的群体,可通过该字段存储学号信息,便于按学号进行相关业务操作(如查询、统计等) + private String sno; + // 联系方式,存储访客的电话号码等联系信息,方便在需要时与访客进行沟通联系 + private String phone; + // 访问地址,记录访客访问的具体地点,例如访问的具体校区、办公楼、房间号等信息 + private String place; + // 来访时间,用于记录访客到达访问地点的具体时间,格式通常遵循一定的日期时间格式(如 yyyy-MM-dd HH:mm:ss) + private String begin_date; + // 离开时间,记录访客离开访问地点的时间,初始可能为空字符串,在访客离开时更新为实际离开时间,同样一般遵循日期时间格式 + private String end_date; + // 到访原因,用于描述访客前来访问的事由,例如参加会议、拜访某人等具体原因说明 + private String visit_result; + + /** + * 默认构造函数 + * 无参构造函数,当创建Visitor对象时若没有传入具体参数,会调用此构造函数创建一个默认的对象实例, + * 常用于一些框架在初始化对象或者反射创建对象等场景下。 + */ public Visitor() { } + /** + * 带参数的构造函数,用于创建一个完整的访客对象 + * 通过传入各个属性的值,一次性初始化访客对象的所有属性,方便在已知所有访客信息的情况下快速创建对象实例。 + * + * @param id 访客的ID,传入唯一标识访客的ID值,赋值给对象的id属性,确保每个访客对象具有唯一的标识。 + * @param name 访客的姓名,传入访客的具体姓名信息,赋值给对象的name属性,用于后续对访客姓名相关的操作。 + * @param sno 访客的学号,传入访客对应的学号信息,赋值给对象的sno属性,便于按学号进行数据处理等操作。 + * @param phone 访客的联系方式,传入访客的联系电话等联系方式信息,赋值给对象的phone属性,方便后续沟通联系。 + * @param place 访客访问的地址,传入访客访问的具体地点信息,赋值给对象的place属性,用于记录访问位置相关操作。 + * @param begin_date 访客的来访时间,传入访客到达的具体时间信息,赋值给对象的begin_date属性,记录来访时间情况。 + * @param end_date 访客的离开时间,传入访客离开的时间信息(初始可能为空,后续更新),赋值给对象的end_date属性,记录离开时间情况。 + * @param visit_result 访客到访的原因或结果,传入访客前来访问的具体事由等信息,赋值给对象的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,70 +58,159 @@ public class Visitor implements Serializable { this.visit_result = visit_result; } + // 以下是属性的getter和setter方法,用于获取和设置对象的各个属性值,遵循JavaBean规范,方便外部类对对象属性进行访问和修改操作。 + + /** + * 获取访客的ID + * + * @return 返回访客对象的ID属性值,供外部类获取该访客的唯一标识信息。 + */ public String getId() { return id; } + /** + * 设置访客的ID + * + * @param id 传入要设置的访客ID值,用于更新访客对象的id属性,改变其唯一标识信息。 + */ public void setId(String id) { this.id = id; } + /** + * 获取访客的姓名 + * + * @return 返回访客对象的姓名属性值,供外部类获取该访客的姓名信息。 + */ public String getName() { return name; } + /** + * 设置访客的姓名 + * + * @param name 传入要设置的访客姓名值,用于更新访客对象的name属性,改变其姓名信息。 + */ public void setName(String name) { this.name = name; } + /** + * 获取访客的学号 + * + * @return 返回访客对象的学号属性值,供外部类获取该访客的学号信息。 + */ public String getSno() { return sno; } + /** + * 设置访客的学号 + * + * @param sno 传入要设置的访客学号值,用于更新访客对象的sno属性,改变其学号信息。 + */ public void setSno(String sno) { this.sno = sno; } + /** + * 获取访客的联系方式 + * + * @return 返回访客对象的联系方式属性值,供外部类获取该访客的联系方式信息。 + */ public String getPhone() { return phone; } + /** + * 设置访客的联系方式 + * + * @param phone 传入要设置的访客联系方式值,用于更新访客对象的phone属性,改变其联系方式信息。 + */ public void setPhone(String phone) { this.phone = phone; } + /** + * 获取访客的访问地址 + * + * @return 返回访客对象的访问地址属性值,供外部类获取该访客的访问地址信息。 + */ public String getPlace() { return place; } + /** + * 设置访客的访问地址 + * + * @param place 传入要设置的访客访问地址值,用于更新访客对象的place属性,改变其访问地址信息。 + */ public void setPlace(String place) { this.place = place; } + /** + * 获取访客的来访时间 + * + * @return 返回访客对象的来访时间属性值,供外部类获取该访客的来访时间信息。 + */ public String getBegin_date() { return begin_date; } + /** + * 设置访客的来访时间 + * + * @param begin_date 传入要设置的访客来访时间值,用于更新访客对象的begin_date属性,改变其来访时间信息。 + */ public void setBegin_date(String begin_date) { this.begin_date = begin_date; } + /** + * 获取访客的离开时间 + * + * @return 返回访客对象的离开时间属性值,供外部类获取该访客的离开时间信息。 + */ public String getEnd_date() { return end_date; } + /** + * 设置访客的离开时间 + * + * @param end_date 传入要设置的访客离开时间值,用于更新访客对象的end_date属性,改变其离开时间信息。 + */ public void setEnd_date(String end_date) { this.end_date = end_date; } + /** + * 获取访客的到访原因 + * + * @return 返回访客对象的到访原因属性值,供外部类获取该访客的到访原因信息。 + */ public String getVisit_result() { return visit_result; } + /** + * 设置访客的到访原因 + * + * @param visit_result 传入要设置的访客到访原因值,用于更新访客对象的visit_result属性,改变其到访原因信息。 + */ public void setVisit_result(String visit_result) { this.visit_result = visit_result; } + /** + * 重写toString方法,返回访客对象的字符串表示形式 + * 当使用System.out.println等方式输出访客对象或者在需要以字符串形式展示访客对象信息的场景下,会调用此方法, + * 方便查看访客对象各属性的具体值情况,按照指定格式返回包含所有属性值的字符串内容。 + * + * @return 访客对象的字符串表示,格式为 "Visitor{" + 各属性名及对应值的字符串拼接 + '}',清晰展示访客对象的详细信息。 + */ @Override public String toString() { return "Visitor{" + @@ -109,4 +224,4 @@ public class Visitor implements Serializable { ", visit_result='" + visit_result + '\'' + '}'; } -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/service/VisitorService.java b/src/main/java/cn/ppdxzz/service/VisitorService.java index ff0c7c2..cf84cc9 100644 --- a/src/main/java/cn/ppdxzz/service/VisitorService.java +++ b/src/main/java/cn/ppdxzz/service/VisitorService.java @@ -6,23 +6,103 @@ import java.io.InputStream; import java.util.List; /** - * Description: + * Description:访客服务接口,定义了访客管理相关的服务方法 + * 该接口作为业务逻辑层与外部交互的契约,规定了一系列用于访客信息管理的方法签名, + * 具体的实现类需要按照这些方法定义来实现相应的业务逻辑,实现类通常会调用数据访问层的方法来完成具体操作, + * 并且可以被更上层的控制器层等调用,以实现对访客相关功能的处理。 * * @Date: 2020/2/18 18:27 * @Author: PeiChen */ public interface VisitorService { + /** + * 添加新的访客记录 + * 该方法用于向系统中添加新的访客信息,接收一个包含访客详细信息的Visitor对象作为参数, + * 若在添加过程中出现如数据库插入失败、数据验证不通过等错误情况,则抛出异常,由调用者进行相应处理。 + * + * @param visitor 访客对象,包含访客的详细信息,例如访客的姓名、学号、联系方式、访问地址、来访时间、离开时间、来访原因等属性, + * 这些信息将被保存到对应的存储介质(通常是数据库)中,形成一条新的访客记录。 + * @throws Exception 如果添加过程中发生错误,比如数据库连接异常、插入操作违反数据库约束等情况,则抛出异常, + * 以便调用该方法的上层代码(如控制器层)能够捕获并进行适当的错误处理,例如给用户返回错误提示信息等。 + */ void add(Visitor visitor) throws Exception; - List findAll(int page,int size) throws Exception; + /** + * 查找所有访客记录,并分页显示 + * 该方法用于查询所有的访客记录,并按照指定的分页参数进行分页展示,返回包含访客记录的列表, + * 如果在查询过程中出现如数据库查询语句执行错误、分页插件配置问题等错误情况,则抛出异常。 + * + * @param page 当前页码,用于指定要获取第几页的数据,是一个正整数,通过该参数结合每页显示的记录数可以确定具体的分页查询范围, + * 例如,page为1表示获取第一页的数据。 + * @param size 每页显示的记录数,用于控制每页展示多少条访客记录,同样是一个正整数,例如,size为10表示每页展示10条访客记录, + * 它与当前页码配合实现对大量访客记录的分页查询功能。 + * @return 包含访客记录的列表,返回的列表中的元素为Visitor对象,每个对象代表一条访客记录,包含了访客的各项详细信息, + * 例如访客的个人基本信息以及访问相关的时间、地点、原因等信息,这些记录是按照分页要求从所有访客记录中筛选出来的。 + * @throws Exception 如果查询过程中发生错误,比如数据库查询失败、分页相关的逻辑出现问题等情况,则抛出异常, + * 由调用该方法的上层代码(如控制器层)进行异常处理,例如给用户展示相应的错误提示页面等。 + */ + List findAll(int page, int size) throws Exception; - List search(int page,int size,String keyword) throws Exception; + /** + * 根据关键字进行搜索,并分页显示搜索结果 + * 该方法用于根据给定的关键字在所有访客记录中进行模糊搜索,并按照指定的分页参数展示搜索结果,返回符合条件的访客记录列表, + * 在搜索或分页过程中若出现错误情况,例如数据库查询语法错误、关键字格式不符合要求等,则抛出异常。 + * + * @param page 当前页码,用于确定要获取第几页的搜索结果,通过与每页显示记录数配合来定位具体的分页数据范围, + * 其取值通常为正整数,代表相应的页码数。 + * @param size 每页显示的记录数,用于限定每页展示的符合搜索条件的访客记录数量,也是正整数,与当前页码共同作用实现分页搜索功能, + * 比如设置为20表示每页最多展示20条符合关键字搜索的访客记录。 + * @param keyword 搜索关键字,是一个字符串类型的值,用于在访客记录的多个字段(如姓名、学号、联系方式、访问地址等)中进行模糊匹配查找, + * 只要访客记录的相应字段中包含该关键字内容,就会被作为符合条件的记录筛选出来,例如,关键字为"张三",则会查找出姓名包含"张三"的所有访客记录。 + * @return 包含搜索结果的访客记录列表,返回的列表中的元素为Visitor对象,每个对象对应一条满足关键字模糊搜索条件的访客记录, + * 这些记录包含了访客完整的详细信息,并且是按照分页要求进行展示的,方便用户查看和浏览搜索到的访客信息。 + * @throws Exception 如果搜索过程中发生错误,比如数据库查询出现语法错误、根据关键字构造查询语句时出现问题、分页设置不合理等情况, + * 则抛出异常,由调用该方法的上层代码(如控制器层)进行相应的异常处理,例如给用户提示搜索失败等信息。 + */ + List search(int page, int size, String keyword) throws Exception; - void logout(String id,String end_date) throws Exception; + /** + * 更新访客的离开时间 + * 该方法用于更新访客记录中的离开时间信息,接收访客的唯一标识符和离开时间作为参数, + * 在更新操作过程中若遇到如数据库更新失败、参数不合法等错误情况,则抛出异常进行相应处理。 + * + * @param id 访客的唯一标识符,用于在存储访客记录的介质(通常是数据库)中准确找到对应的访客记录, + * 一般是一个具有唯一性的字符串值(例如使用UUID生成的唯一标识),与数据库表中的主键字段相对应,通过该标识可以唯一确定一条访客记录。 + * @param end_date 访客的离开时间,是一个表示日期时间的字符串,其格式通常需要与数据库中存储时间的格式保持一致(如常见的 "yyyy-MM-dd HH:mm:ss" 格式), + * 该值将被更新到数据库中对应访客记录的离开时间字段,用于准确记录访客离开的时间点,实现访客记录状态的更新。 + * @throws Exception 如果更新过程中发生错误,比如数据库连接异常、更新语句执行失败、传入的参数不符合要求等情况,则抛出异常, + * 由调用该方法的上层代码(如控制器层)进行异常处理,例如给用户提示更新失败等信息,并可以根据具体的业务需求进行相应的后续操作。 + */ + void logout(String id, String end_date) throws Exception; + /** + * 获取访客记录的输入流,通常用于导出数据 + * 该方法用于获取包含访客记录数据的输入流,一般是为了将访客记录导出到外部文件(如Excel文件等)而准备的, + * 在获取输入流过程中若出现如文件读取失败、数据转换错误等情况,则抛出异常进行处理。 + * + * @return 访客记录的输入流,返回的输入流指向包含访客记录数据的数据源(例如内存中的数据缓冲区或者实际的文件内容等), + * 通过该输入流可以将访客记录数据传输到其他地方进行处理,比如在控制器层将其作为响应流发送给客户端,实现访客记录的导出功能, + * 客户端接收到输入流后可以将其保存为本地文件或者进行其他相应的数据展示操作。 + * @throws Exception 如果获取输入流过程中发生错误,比如无法正确生成包含访客记录数据的流对象、读取相关数据资源时出现问题等情况, + * 则抛出异常,由调用该方法的上层代码(如实现类或者控制器层等)进行异常处理,例如给用户提示导出失败等信息。 + */ InputStream getInputStream() throws Exception; - List log(int page,int size) throws Exception; + /** + * 获取访客日志记录,并分页显示 + * 该方法用于获取访客的日志记录信息,并按照指定的分页参数进行分页展示,返回包含访客日志记录的列表, + * 如果在获取日志记录或者分页过程中出现错误情况,例如数据库查询错误、分页配置不当等,则抛出异常进行处理。 + * + * @param page 当前页码,用于指定要获取第几页的访客日志记录数据,通过与每页显示记录数配合来确定具体的分页查询范围, + * 其取值应为正整数,代表相应的页码位置,例如page为2表示获取第二页的访客日志记录。 + * @param size 每页显示的记录数,用于控制每页展示多少条访客日志记录,是一个正整数,与当前页码共同作用实现对访客日志记录的分页查询功能, + * 例如设置size为15表示每页展示15条访客日志记录。 + * @return 包含访客日志记录的列表,返回的列表中的元素为Visitor对象,每个对象代表一条访客日志记录,包含了访客访问相关的详细信息, + * 如来访时间、离开时间、来访原因等日志信息,这些记录是按照分页要求从所有访客日志记录中筛选出来的,方便用户查看和分析访客的访问历史情况。 + * @throws Exception 如果获取日志记录过程中发生错误,比如数据库查询语句执行失败、分页逻辑出现问题等情况,则抛出异常, + * 由调用该方法的上层代码(如控制器层)进行异常处理,例如给用户展示相应的错误提示页面等。 + */ + List log(int page, int size) throws Exception; -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java b/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java index 0c405ef..3823ba7 100644 --- a/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java +++ b/src/main/java/cn/ppdxzz/service/impl/VisitorServiceImpl.java @@ -13,16 +13,26 @@ import java.util.ArrayList; import java.util.List; /** - * Description: + * Description:访客服务实现类,实现了VisitorService接口定义的方法 + * 该类作为业务逻辑层的具体实现,负责调用数据访问层(VisitorDao)的方法来完成与访客相关的各项业务操作, + * 同时利用一些工具类(如PageHelper进行分页,WriteExcel进行Excel文件导出等)来处理更复杂的业务逻辑。 * * @Date: 2020/2/18 18:50 * @Author: PeiChen */ +// 使用 @Service 注解将该类标记为Spring框架中的服务层组件,并指定了组件的名称为 "visitorService",方便在依赖注入时使用 @Service("visitorService") public class VisitorServiceImpl implements VisitorService { + // 定义一个VisitorDao类型的成员变量,用于后续调用数据访问层的方法来操作数据库中的访客数据 private VisitorDao visitorDao; + /** + * 通过Autowired注解自动注入VisitorDao + * @Autowired注解用于告诉Spring框架自动装配VisitorDao的实例到该成员变量中, + * 通过类型匹配找到对应的实现类并注入,使得本类可以方便地调用数据访问层的方法。 + * @param visitorDao 访客数据访问对象,该参数接收Spring框架注入的VisitorDao的实例。 + */ @Autowired public void setVisitorDao(VisitorDao visitorDao) { this.visitorDao = visitorDao; @@ -30,59 +40,95 @@ public class VisitorServiceImpl implements VisitorService { /** * 登记到访信息 - * @param visitor - * @throws Exception + * 实现VisitorService接口中定义的添加访客信息的方法,该方法接收一个Visitor对象作为参数, + * 通过调用VisitorDao的对应方法将访客信息持久化存储到数据库中。 + * + * @param visitor 访客对象,包含访客的详细信息,如姓名、学号、联系方式、访问地址等,这些信息将被保存到数据库中对应的访客记录里。 + * @throws Exception 如果添加过程中发生错误,例如数据库连接异常、插入数据违反约束等情况,则抛出异常,由调用该方法的上层代码进行处理。 */ @Override public void add(Visitor visitor) throws Exception { + // 调用VisitorDao的add方法,将传入的访客对象visitor的信息插入到数据库中,实现来访登记功能,将访客信息持久化 visitorDao.add(visitor); } /** - * 按时间晚的优先显示查询所有访客记录 - * @return - * @throws Exception + * 按时间晚的优先显示查询所有访客记录,并分页显示 + * 实现VisitorService接口中定义的查询所有访客记录的方法,该方法支持分页功能,按照来访时间降序排列查询结果, + * 先利用PageHelper插件设置分页参数,然后调用VisitorDao的方法从数据库中获取访客记录列表。 + * + * @return 包含访客记录的列表,返回的列表中的元素为Visitor对象,每个对象代表一条访客记录,包含了访客的各项详细信息。 + * @throws Exception 如果查询过程中发生错误,比如数据库查询语句执行失败、分页设置出现问题等,则抛出异常,由调用者负责处理。 */ @Override public List findAll(int page, int size) throws Exception { - PageHelper.startPage(page,size); + // 使用PageHelper插件进行分页,传入当前页码page和每页显示的记录数size参数,该插件会自动拦截后续的数据库查询操作, + // 根据设置的分页参数对查询结果进行分页处理,使得返回的结果是符合分页要求的访客记录列表 + PageHelper.startPage(page, size); + // 调用VisitorDao的findAll方法,从数据库中查询所有访客记录,由于前面已经设置了分页,这里返回的结果将是分页后的访客记录列表, + // 按照来访时间降序排列(由VisitorDao的findAll方法中的SQL语句决定排序方式) return visitorDao.findAll(); } /** - * 根据关键字模糊查询访客记录,并按时间倒序排列 - * @param keyword - * @return - * @throws Exception + * 根据关键字模糊查询访客记录,并按时间倒序排列,然后分页显示 + * 实现VisitorService接口中定义的根据关键字进行模糊查询访客记录的方法,支持分页功能,按照来访时间降序排列查询结果, + * 先利用PageHelper插件设置分页参数,然后调用VisitorDao的对应方法从数据库中获取符合关键字模糊匹配的访客记录列表。 + * + * @param page 当前页码,用于指定要获取第几页的数据,通过该参数结合每页显示记录数可以确定具体的分页查询范围。 + * @param size 每页显示的记录数,用于控制每页展示多少条符合条件的访客记录,通过和当前页码配合实现分页查询功能。 + * @param keyword 搜索关键字,是一个字符串类型的值,用于在访客记录的多个字段(如姓名、学号等)中进行模糊匹配查找符合条件的记录。 + * @return 包含搜索结果的访客记录列表,返回的列表中的元素为Visitor对象,每个对象代表一条符合模糊查询条件的访客记录,包含了访客的各项详细信息。 + * @throws Exception 如果搜索过程中发生错误,例如数据库查询语法错误、分页参数设置不合理等情况,则抛出异常,由调用该方法的上层代码进行处理。 */ @Override public List search(int page, int size, String keyword) throws Exception { - PageHelper.startPage(page,size); + // 使用PageHelper插件进行分页,传入当前页码page和每页显示的记录数size参数,让插件为后续的数据库查询操作添加分页逻辑, + // 确保返回符合分页要求的查询结果 + PageHelper.startPage(page, size); + // 调用VisitorDao的search方法,传入搜索关键字keyword,从数据库中查询所有符合关键字模糊匹配条件的访客记录, + // 并且按照来访时间降序排列(由VisitorDao的search方法中的SQL语句决定排序方式),最终返回分页后的符合条件的访客记录列表 return visitorDao.search(keyword); } /** * 访客离开后修改离开时间(访客注销) - * @param id - * @param end_date - * @throws Exception + * 实现VisitorService接口中定义的用于注销访客记录的方法,该方法接收访客的唯一标识符和离开时间作为参数, + * 通过调用VisitorDao的对应方法更新数据库中访客记录的离开时间字段,完成访客注销的业务逻辑。 + * + * @param id 访客的唯一标识符,用于在数据库中准确找到对应的访客记录,一般是一个唯一的字符串值(如UUID),与数据库表中的主键对应。 + * @param end_date 访客的离开时间,是一个表示日期时间的字符串,格式通常与数据库中存储时间的格式一致(如 yyyy-MM-dd HH:mm:ss), + * 该值将被更新到数据库中对应访客记录的离开时间字段,用于记录访客离开的时间点。 + * @throws Exception 如果更新过程中发生错误,比如数据库连接异常、更新语句执行失败等情况,则抛出异常,由调用该方法的上层代码进行处理。 */ @Override public void logout(String id, String end_date) throws Exception { - visitorDao.logout(id,end_date); + // 调用VisitorDao的logout方法,传入访客的唯一标识符id和离开时间end_date,在数据库中执行更新操作, + // 将对应访客记录的离开时间字段更新为传入的end_date值,实现访客记录的注销功能,即标记访客已经离开 + visitorDao.logout(id, end_date); } /** - * 导出访客记录 - * @return - * @throws Exception + * 导出访客记录到Excel文件 + * 实现VisitorService接口中定义的导出访客记录为Excel文件的方法,该方法通过从数据库中获取所有访客记录, + * 整理数据格式后利用WriteExcel类将数据写入Excel文件,并返回该Excel文件对应的输入流,以便后续在控制器中通过响应流发送给客户端进行下载。 + * + * @return 访客记录的输入流,返回的输入流指向包含访客记录数据的Excel文件内容,可通过该输入流将Excel文件发送给客户端, + * 实现访客记录的导出功能,客户端可以将接收到的输入流保存为本地的Excel文件进行查看和分析。 + * @throws Exception 如果导出过程中发生错误,例如读取数据库数据失败、写入Excel文件出现问题、生成输入流异常等情况,则抛出异常, + * 由调用该方法的上层代码(如控制器层)进行处理。 */ @Override public InputStream getInputStream() throws Exception { - //Excel中的每列列名,依次对应数据库的字段 - String[] title = new String[]{"ID","姓名","学号","联系方式","访问地址","来访时间","离开时间","来访原因"}; + // Excel中的每列列名,依次对应数据库的字段,定义一个字符串数组,用于指定要导出到Excel文件中的列标题, + // 这些标题与数据库中访客表的字段名相对应,方便在Excel文件中清晰展示访客记录的各项信息 + String[] title = new String[]{"ID", "姓名", "学号", "联系方式", "访问地址", "来访时间", "离开时间", "来访原因"}; + // 调用VisitorDao的findAll方法,从数据库中获取所有访客记录,得到一个包含所有访客信息的列表,后续将基于这些数据来填充Excel文件内容 List visitors = visitorDao.findAll(); + // 创建一个List类型的列表,用于存储整理后的访客数据,每个Object[]数组代表一行数据, + // 数组中的元素依次对应Excel文件中的每列数据(与前面定义的title列名顺序对应),方便后续将数据批量写入Excel文件 List datalist = new ArrayList<>(); + // 遍历从数据库中获取到的所有访客记录列表visitors,将每条访客记录的数据按照指定顺序整理到Object[]数组中,并添加到datalist列表中 for (int i = 0; i < visitors.size(); i++) { Object[] obj = new Object[8]; obj[0] = visitors.get(i).getId(); @@ -95,20 +141,32 @@ public class VisitorServiceImpl implements VisitorService { obj[7] = visitors.get(i).getVisit_result(); datalist.add(obj); } - WriteExcel excel = new WriteExcel(title,datalist); + // 使用WriteExcel类将数据写入Excel文件,创建一个WriteExcel类的实例,传入列标题title和整理好的数据列表datalist, + // 该类内部会实现将数据按照指定格式写入到Excel文件的逻辑,并返回该Excel文件对应的输入流 + WriteExcel excel = new WriteExcel(title, datalist); + // 调用WriteExcel类实例的export方法,获取包含访客记录数据的Excel文件的输入流,以便后续在控制器层将该输入流通过响应流发送给客户端, + // 实现访客记录的导出功能,客户端可以将接收到的输入流保存为本地的Excel文件进行查看和分析 return excel.export(); } /** - * 访客日志 - * @param page - * @param size - * @return - * @throws Exception + * 获取访客日志记录,并分页显示 + * 实现VisitorService接口中定义的获取访客日志记录的方法,该方法支持分页功能,按照来访时间降序排列查询结果, + * 先利用PageHelper插件设置分页参数,然后调用VisitorDao的方法从数据库中获取访客日志记录列表。 + * + * @param page 当前页码,用于指定要获取第几页的访客日志记录数据,通过该参数结合每页显示记录数可以确定具体的分页查询范围。 + * @param size 每页显示的记录数,用于控制每页展示多少条访客日志记录,通过和当前页码配合实现分页查询功能。 + * @return 包含访客日志记录的列表,返回的列表中的元素为Visitor对象,每个对象代表一条访客日志记录,包含了访客的各项详细信息, + * 例如来访时间、离开时间、来访原因等,用于展示访客的访问历史记录情况。 + * @throws Exception 如果获取日志记录过程中发生错误,比如数据库查询语句执行失败、分页设置出现问题等情况,则抛出异常,由调用该方法的上层代码进行处理。 */ @Override - public List log(int page,int size) throws Exception { - PageHelper.startPage(page,size); + public List log(int page, int size) throws Exception { + // 使用PageHelper插件进行分页,传入当前页码page和每页显示的记录数size参数,该插件会自动拦截后续的数据库查询操作, + // 根据设置的分页参数对查询结果进行分页处理,使得返回的结果是符合分页要求的访客日志记录列表 + PageHelper.startPage(page, size); + // 调用VisitorDao的findAll方法,从数据库中查询所有访客日志记录,由于前面已经设置了分页,这里返回的结果将是分页后的访客日志记录列表, + // 按照来访时间降序排列(由VisitorDao的findAll方法中的SQL语句决定排序方式) return visitorDao.findAll(); } -} +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/look-dorm.jsp b/src/main/webapp/WEB-INF/jsp/look-dorm.jsp index 49cf3f0..67e1106 100644 --- a/src/main/webapp/WEB-INF/jsp/look-dorm.jsp +++ b/src/main/webapp/WEB-INF/jsp/look-dorm.jsp @@ -6,53 +6,136 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - + + + + Title + + + + - - -
-
+ + + +
+ + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
${dorm.dorm_id}
${dorm.dorm_intro}
- - ${dorm.dorm_rps}
- - ${dorm.dorm_leader}
${dorm.teacher}
${dorm.dorm_id}
${dorm.dorm_intro}
+ + ${dorm.dorm_rps}
+ + ${dorm.dorm_leader}
${dorm.teacher}
去修改
-
- - - + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/regist_visitor.jsp b/src/main/webapp/WEB-INF/jsp/regist_visitor.jsp index 6bf7e92..2fef960 100644 --- a/src/main/webapp/WEB-INF/jsp/regist_visitor.jsp +++ b/src/main/webapp/WEB-INF/jsp/regist_visitor.jsp @@ -6,74 +6,191 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - + + + + + + + + + + 来访登记 - + + + + + - + + - + - + - + - + - - - -
+ + + +
学生来访登记 -
- -
+ + +
+
-
- 姓名: - -
-
- 学号: - -
-
- 手机: - -
-
- 楼宇: + +
+ 姓名: + + +
+ +
+ 学号: + + +
+ +
+ 手机: + + +
+ +
+ 楼宇: +
+ 备注: + +
+ +
-
- - - + if (${logout_msg!= null &&!(logout_msg.trim().equals(""))}) { + // 使用 JSP 表达式语言(EL)进行条件判断,判断名为 logout_msg 的变量是否不为 null 并且去除两端空白字符后不为空字符串,如果满足该条件,则执行以下代码块,此处可能是用于处理注销相关的提示信息显示逻辑 + layer.msg(${logout_msg}); + // 使用 layer 插件弹出提示框,显示 logout_msg 变量对应的消息内容,向用户展示相关提示信息(例如注销成功或失败等提示) + } + if (${error_msg!= null &&!("".trim().equals(error_msg))}) { + // 同样使用 EL 表达式进行条件判断,判断名为 error_msg 的变量是否不为 null 并且去除两端空白字符后不为空字符串,如果满足条件,则执行以下代码块,此处可能是用于处理其他错误相关的提示信息显示逻辑 + layer.msg(${error_msg}); + // 使用 layer 插件弹出提示框,显示 error_msg 变量对应的消息内容,向用户展示相应的错误提示信息(例如表单提交失败等错误提示) + } + + + diff --git a/src/main/webapp/WEB-INF/jsp/visitor-list.jsp b/src/main/webapp/WEB-INF/jsp/visitor-list.jsp index cba1df0..1584988 100644 --- a/src/main/webapp/WEB-INF/jsp/visitor-list.jsp +++ b/src/main/webapp/WEB-INF/jsp/visitor-list.jsp @@ -6,78 +6,135 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + + + + + + + - + + + +<%-- 以下这部分代码被注释掉了,原本可能是用于展示页面导航相关元素,包含面包屑导航以及一个刷新按钮,点击按钮可刷新页面,但当前处于注释状态,不会在页面中显示生效 --%> <%----%> + +
+
+
+
+
+
+
+
+
+
+ - 导出 + + 导出 + 共有数据:${pageInfo.total} 条 +
+ + @@ -86,29 +143,41 @@ + - + + <% + // 在JSP脚本片段中定义一个局部变量j并初始化为1,用于给表格中的数据行编号,混合使用了JSP脚本片段和JSTL标签库来构建表格数据展示 int j = 1; %> + + + + - + + + - + + +
ID 姓名 学号来访时间 离开时间 到访原因 操作操作
<%=j++%> ${visitor.name} ${visitor.sno}${visitor.phone} ${visitor.place} ${visitor.begin_date} 尚未离开 ${visitor.end_date} ${visitor.visit_result} @@ -121,97 +190,283 @@
+
+
+ 共 ${pageInfo.pages} 页 当前页:${pageInfo.pageNum} / ${pageInfo.pages}  每页 + 条 +
+ // 结束一个外层的div容器,这个div可能用于布局,包裹与每页显示条数选择相关的元素等 +
+ // 结束另一个外层的div容器,可能在页面布局层级中处于更上层,具体作用需结合整体页面结构来看 + + + // 这是一个HTML注释,用于说明下面的代码块主要是用于控制分页按钮的显示逻辑,方便后续阅读和维护代码 + + // 使用JSTL(JavaServer Pages Standard Tag Library)的标签,开始一个条件选择结构, + // 类似于Java中的switch语句,用于根据不同条件执行不同的逻辑分支 + + // 标签表示一个具体的条件分支,这里的条件是判断pageInfo对象中的pages属性(通常表示总页数)是否小于5, + // 如果满足该条件,则执行此分支内的代码 + + // 使用标签在JSP页面中设置一个名为“begin”的变量,值设置为1, + // 这个变量可能后续用于确定分页页码显示的起始范围等相关逻辑 + + // 同样使用标签设置一个名为“end”的变量,其值设置为pageInfo对象中的pages属性值(即总页数), + // 用于配合“begin”变量来确定分页页码显示的范围 + + // 另一个条件分支,判断pageInfo对象中的pageNum属性(通常表示当前页码)是否小于等于3, + // 如果满足该条件,则执行此分支内的代码,用于设置不同情况下分页页码显示的范围 + + // 设置名为“begin”的变量值为1,为后续确定分页页码显示范围做准备 + + // 设置名为“end”的变量值为5,结合“begin”变量来确定在当前页码小于等于3这种情况下分页页码显示的范围 + - + + // 又一个条件分支,判断当前页码(pageInfo.pageNum)大于3并且小于等于总页数减2时执行此分支内的代码, + // 用于根据当前页码在特定区间时设置分页页码显示的范围 + + // 根据当前页码动态计算“begin”变量的值,将其设置为当前页码减2,以此来确定合适的分页页码显示起始范围 + + // 根据当前页码动态计算“end”变量的值,设置为当前页码加2,与“begin”变量配合确定分页页码显示的范围 + + // otherwise标签表示当上述所有条件都不满足时执行的代码分支,相当于Java中switch语句的default分支 + + // 设置名为“begin”的变量值为总页数减4,用于确定在其他情况之外的分页页码显示起始范围 + + // 设置名为“end”的变量值为总页数,与“begin”变量配合确定分页页码显示的范围 + -
-
-
- - - - - - - ${i} - - - ${i} - - - - - - -
-
+
+ // 创建一个使用layui样式的卡片主体内容区域(layui-card-body),并应用了x-right类(可能用于控制布局靠右显示等), + // 设置了高度样式为min-content,使该区域的高度根据其内部内容自适应,最小化高度占用 + +
+ // 创建一个自定义类名为“page”的
容器,可能用于专门放置分页相关的按钮等元素,进行布局分组 + +
+ // 再创建一个内层的
容器,用于进一步细化分页按钮等元素的布局 + + + // 创建一个链接,应用了名为“next”的类(可能有对应的CSS样式用于外观控制), + // href属性通过EL表达式拼接出具体的URL路径,用于跳转到访客信息列表的第一页,同时传递了每页显示条数(pageInfo.pageSize)和搜索关键词(param.keyword)等参数, + // 链接显示的文本为“首页”,方便用户点击回到第一页 + + + // 使用JSTL的条件判断标签,判断pageInfo对象中的pageNum属性(当前页码)是否大于1, + // 如果满足该条件,则执行此标签内包含的代码,用于判断是否显示上一页按钮 + + + // 创建一个链接,应用“prev”类(可能对应特定样式),href属性通过EL表达式拼接出URL路径, + // 用于跳转到上一页(当前页码减1),同时传递每页显示条数和搜索关键词等参数,链接显示文本为“上一页”,方便用户进行翻页操作 + + + + // 使用JSTL的forEach循环标签,开始一个循环,循环变量为“i”,循环的起始值为之前设置的“begin”变量的值, + // 结束值为“end”变量的值,步长为1,即依次遍历从“begin”到“end”范围的每一个值,用于生成分页页码链接 + + + // 在循环内部,再次使用条件判断标签,判断当前页码(pageInfo.pageNum)是否等于循环变量“i”的值, + // 如果相等,则执行此标签内的代码,用于对当前页码进行特殊样式显示等处理 + + ${i} + // 创建一个span标签,应用了“current”类(可能有对应的突出显示当前页码的样式),并通过EL表达式显示循环变量“i”的值, + // 用于将当前页码以特定样式展示出来,与其他页码区分开 + + + + // 另一个条件判断标签,判断当前页码是否不等于循环变量“i”的值,如果不相等,则执行此标签内的代码, + // 用于生成普通的页码链接(非当前页码的情况) + + ${i} + // 创建一个链接,应用“num”类(可能对应普通页码链接的样式),href属性通过EL表达式拼接出URL路径, + // 用于跳转到对应页码(循环变量“i”表示的页码),同时传递每页显示条数和搜索关键词等参数,链接内通过EL表达式显示循环变量“i”的值作为页码显示内容,方便用户点击跳转到相应页码 + + + + + // 这是一个HTML注释,说明下面的代码是用于在不是最后一页的情况下显示下一页的链接 + + + // 使用JSTL的条件判断标签,判断当前页码(pageInfo.pageNum)是否小于总页数(pageInfo.pages), + // 如果满足该条件,则执行此标签内的代码,用于判断是否显示下一页链接 + + + // 创建一个链接(标签),应用“next”类,href属性通过EL表达式拼接出URL路径,用于跳转到下一页(当前页码加1), + // 同时传递每页显示条数和搜索关键词等参数,链接显示文本为“下一页”,方便用户进行翻页操作 + + + + // 这是一个HTML注释,说明下面的代码是用于显示尾页的链接 + + + // 创建一个链接,应用“next”类,href属性通过EL表达式拼接出URL路径,用于跳转到最后一页(总页数对应的页码), + // 同时传递每页显示条数和搜索关键词等参数,链接显示文本为“尾页”,方便用户直接跳转到最后一页 +
-
-
-
-
- - diff --git a/src/main/webapp/WEB-INF/jsp/visitor-log.jsp b/src/main/webapp/WEB-INF/jsp/visitor-log.jsp index 9c9c768..63fede2 100644 --- a/src/main/webapp/WEB-INF/jsp/visitor-log.jsp +++ b/src/main/webapp/WEB-INF/jsp/visitor-log.jsp @@ -6,65 +6,108 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + Title + + + +
+ 访客时间线
+
    +
  • + +
    +

    + 访客日志共计: ${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}离开
  • +
  • + +
    +
    2020.02.21日志开启
- + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/visitor-success.jsp b/src/main/webapp/WEB-INF/jsp/visitor-success.jsp index c1f8ae4..f363681 100644 --- a/src/main/webapp/WEB-INF/jsp/visitor-success.jsp +++ b/src/main/webapp/WEB-INF/jsp/visitor-success.jsp @@ -6,14 +6,36 @@ To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> + + 登记成功 - +

恭喜您,来访登记成功!

+
+ 注销登记 - + \ No newline at end of file diff --git a/src/main/webapp/js/hLight.js b/src/main/webapp/js/hLight.js index 4dc7bac..a7879b8 100644 --- a/src/main/webapp/js/hLight.js +++ b/src/main/webapp/js/hLight.js @@ -1,53 +1,90 @@ -function highlight(s,id) { - if(s.length == 0) { +function highlight(s, id) { + // 判断传入的字符串s的长度是否为0,如果长度为0,表示可能不需要进行高亮相关操作了,执行以下代码块 + if (s.length == 0) { + // 通过document.getElementById方法根据传入的id获取对应的DOM元素,并将其赋值给变量obj,后续会对这个元素的innerHTML内容进行处理 var obj = document.getElementById(id); + // 使用正则表达式替换obj元素innerHTML中的内容,目的是去除已经存在的带有"highlight"类名的标签,只保留其内部的文本内容, + // 正则表达式 /([^<>]*)<\/span>/gi 用于匹配包含"highlight"类名的标签及其内部的非尖括号内容(通过 ([^<>]*) 捕获),并将匹配到的内容替换为捕获的内部文本内容(通过 $1 引用捕获组) var t = obj.innerHTML.replace(/([^<>]*)<\/span>/gi, "$1"); + // 将处理后的文本内容重新赋值给obj元素的innerHTML属性,实现去除已有高亮标签的效果 obj.innerHTML = t; + // 返回false,表示在这种字符串长度为0的情况下,没有进行实际的搜索和高亮操作 return false; } + // 调用内部定义的encode函数,对传入的字符串s进行编码处理(主要是对一些特殊字符进行转义等操作,从函数内部实现可以看到具体转义的字符),并将结果重新赋值给s s = encode(s); + // 通过document.getElementById方法根据传入的id获取对应的DOM元素,赋值给变量obj,后续会基于这个元素来查找匹配的文本并进行高亮显示操作 var obj = document.getElementById(id); + // 同样使用正则表达式替换obj元素innerHTML中的内容,去除已有的带有"highlight"类名的标签,只保留其内部文本内容,与前面长度为0时的处理类似,目的是先清理之前可能存在的高亮标记,准备进行新的高亮操作 var t = obj.innerHTML.replace(/([^<>]*)<\/span>/gi, "$1"); + // 将清理后的文本内容重新赋值给obj元素的innerHTML属性 obj.innerHTML = t; + // 调用内部定义的loopSearch函数,传入经过编码处理的字符串s和获取到的DOM元素obj,这个函数会递归地在DOM元素及其子元素中查找匹配的文本内容,并返回匹配到的次数,将返回的结果赋值给变量cnt var cnt = loopSearch(s, obj); - t = obj.innerHTML + // 获取obj元素当前的innerHTML内容,并赋值给变量t,后续会基于这个内容再次进行处理,添加高亮显示的标签 + var t = obj.innerHTML + // 定义一个正则表达式r,用于匹配之前在文本中标记好的需要高亮显示的位置(通过 {searchHL} 和 {/searchHL} 包裹的内容),以便后续将其替换为带有"highlight"类名的标签来实现可视化的高亮效果 var r = /{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g + // 使用正则表达式r对变量t(即obj元素的innerHTML内容)进行替换操作,将匹配到的用 {searchHL} 和 {/searchHL} 包裹的内容替换为带有"highlight"类名的标签包裹的内容,实现文本的高亮显示效果,然后将替换后的结果重新赋值给变量t t = t.replace(r, "$1"); + // 将添加了高亮显示标签后的文本内容重新赋值给obj元素的innerHTML属性,使得页面上对应的DOM元素中的文本呈现出高亮显示的效果 obj.innerHTML = t; + // 定义一个名为encode的内部函数,用于对传入的字符串进行编码处理,主要是对一些在正则表达式中有特殊含义或者HTML中有特殊用途的字符进行转义,防止出现意外的匹配或解析问题 function encode(s) { + // 使用字符串的replace方法,通过正则表达式匹配并替换相应的特殊字符,将 & 替换为 & (HTML实体编码转义),< 替换为 < (防止被解析为HTML标签开头),> 替换为 > (同理防止被解析为HTML标签结尾), + // 对于正则表达式中有特殊含义的字符(如 \、.、*、[、]、(、)、$、^ 等),在其前面添加 \ 进行转义,使其在后续作为正则表达式内容时能按字面意思进行匹配,最后将处理后的字符串返回 return s.replace(/&/g, "&").replace(//g, ">").replace(/([\\\.\*\[\]\(\)\$\^])/g, "\\$1"); } + // 定义一个名为decode的内部函数,与encode函数作用相反,用于对经过编码的字符串进行解码还原操作,将转义后的字符恢复为原来的字符形式 function decode(s) { + // 使用字符串的replace方法,通过正则表达式匹配并替换相应的转义字符,将前面添加了 \ 转义的字符(如 \[ 等)还原为原来的字符(去除前面的 \ ), + // 然后将 > 替换为 > ,< 替换为 < ,& 替换为 & ,恢复字符串中这些特殊字符的原始形式,最后将处理后的字符串返回 return s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g, "$1").replace(/>/g, ">").replace(/等),通过循环遍历它的子节点(使用childNodes属性获取子节点列表), + // 对于每个子节点c,判断如果其不存在className属性或者className属性不等于"highlight"(即不是已经处理过的高亮显示的节点),则递归调用loopSearch函数在这个子节点中继续查找匹配内容,并将返回的匹配次数累加到变量cnt中 + for (var i = 0, c; c = obj.childNodes[i]; i++) { + if (!c.className || c.className!= "highlight") { cnt += loopSearch(s, c); } } + // 循环结束后,将统计好的匹配次数cnt返回,这个cnt就是整个DOM元素及其所有子元素中匹配到传入字符串s的总次数 return cnt; } + // 定义一个名为replace的内部函数,它用于在给定的文本节点dest中查找与传入字符串s匹配的文本内容,并进行替换操作,将匹配的内容用特定标记包裹起来(后续会进一步处理为高亮显示的标签),同时返回匹配到的次数 function replace(s, dest) { + // 根据传入的字符串s创建一个正则表达式对象r,设置全局匹配模式(g标志),用于在文本节点中查找所有匹配的内容 var r = new RegExp(s, "g"); + // 初始化一个变量tm,用于存储通过正则表达式匹配到的结果,初始值设为null var tm = null; + // 获取文本节点dest的nodeValue属性(即文本节点中的文本内容),赋值给变量t,后续会基于这个文本内容进行查找和替换操作 var t = dest.nodeValue; + // 初始化一个变量cnt,用于记录匹配到的次数,初始值设为0 var cnt = 0; - if(tm = t.match(r)) { + // 使用match方法在文本t中查找所有与正则表达式r匹配的内容,如果匹配到了(即tm不为null),则执行以下代码块 + if (tm = t.match(r)) { + // 将匹配到的次数(即tm数组的长度,因为match方法返回的数组包含了所有匹配到的内容)赋值给变量cnt,记录匹配的次数 cnt = tm.length; + // 使用replace方法对文本t进行替换操作,将匹配到的内容替换为用 {searchHL} 和 {/searchHL} 包裹起来,并且内部通过decode函数对匹配的字符串s进行解码还原后的内容, + // 这样就标记好了需要后续处理为高亮显示的文本位置,然后将替换后的结果重新赋值给文本节点dest的nodeValue属性,实现文本内容的初步替换标记 t = t.replace(r, "{searchHL}" + decode(s) + "{/searchHL}") dest.nodeValue = t; } + // 将记录的匹配次数cnt返回,供外部调用的函数(如loopSearch函数)获取并进一步处理(比如累加统计总的匹配次数等) return cnt; } } \ No newline at end of file diff --git a/src/main/webapp/js/layfilter.js b/src/main/webapp/js/layfilter.js index e109d5c..af5dd3c 100644 --- a/src/main/webapp/js/layfilter.js +++ b/src/main/webapp/js/layfilter.js @@ -1,147 +1,242 @@ -layui.define(['jquery', 'layer'], function (exports){ +layui.define(['jquery', 'layer'], function (exports) { + // 获取layui框架中引入的jQuery模块,并将其赋值给变量$,方便后续使用jQuery的相关功能,如DOM操作、AJAX请求等 var $ = layui.jquery; + // 创建一个空对象chekedArr,用于存储一些被选中的数据相关信息(从后续代码推测可能是记录过滤组件中被选中的选项等情况),其结构和具体用途会在后续代码中逐渐清晰 var chekedArr = {}; + // 创建一个名为layfilter的对象,用于封装与查询过滤组件相关的一系列功能方法,比如初始化组件、获取选中值、绑定事件等操作 var layfilter = { - render:function(options){ + // 定义名为render的方法,用于渲染查询过滤组件,该方法接收一个名为options的参数,参数中应该包含了组件渲染所需的各种配置信息,如请求数据的URL、筛选条件等 + render: function (options) { + // 从传入的options参数中获取名为url的属性值,该值可能是用于获取过滤组件数据的接口地址,后续根据这个地址来发起数据请求 var url = options.url; + // 定义一个布尔变量flag,并初始化为true,用于标记数据获取及组件渲染过程中的一些状态,比如数据获取是否成功等情况,后续会根据不同情况修改这个值来控制流程 var flag = true; - //传入了地址,则直接将此地址覆盖 - if(url){ - $.getJSON(url,options.where,function(res){ - if(res.code == 0){ - var data = res.data; + // 判断如果传入的url属性存在(即有值),则执行以下代码块,意味着如果配置了数据请求地址,就按照这个地址去获取数据来渲染组件 + if (url) { + // 使用jQuery的$.getJSON方法发起一个GET类型的AJAX请求,请求的URL就是前面获取到的url,同时传入options.where作为请求参数(可能是一些筛选条件等数据),请求成功后的回调函数用于处理返回的数据 + $.getJSON(url, options.where, function (res) { + // 判断返回数据中的code属性是否等于0,如果等于0通常表示请求成功,数据正常获取到了,可以进行后续的组件渲染等操作 + if (res.code == 0) { + // 从返回的数据中获取名为data的属性值,这应该就是实际用于渲染组件的数据源,例如包含了各种过滤选项的数据列表等内容 + var data = res.data; + // 此处疑似拼写错误,将flase(应该是想写false)赋值为true,不过从逻辑上推测可能是想重置某个用于判断的标志位,但这个变量名错误可能会导致意想不到的问题,先按照正确的逻辑理解此处应该是设置一个表示数据获取成功等相关含义的标志为true flase = true; - layfilter.init(options,data); - }else{ - layer.msg(res.msg||'查询过滤组件数据异常',{icon:2}); + // 调用layfilter对象自身的init方法,传入options和获取到的data数据,进行查询过滤组件的初始化操作,将数据展示在页面上形成可交互的过滤组件 + layfilter.init(options, data); + } else { + // 如果返回数据中的code属性不等于0,表示请求出现异常,比如服务器端返回错误等情况,使用layer弹出提示框显示相应的错误信息,优先显示res.msg中的内容,如果res.msg不存在则显示默认的提示信息'查询过滤组件数据异常',同时设置提示框的图标为2(通常表示错误图标) + layer.msg(res.msg || '查询过滤组件数据异常', {icon: 2}); + // 将flag标志位设置为false,表示数据获取或处理出现问题,后续可能根据这个标志来决定是否继续进行组件渲染等操作 flag = false } }) } - if(!flag){ + // 判断如果flag为false(即前面的数据获取或处理出现问题了),则直接使用return语句结束当前函数的执行,不再进行后续可能的组件渲染等操作 + if (!flag) { return; } }, - init:function(options,dataSource){ + // 定义名为init的方法,用于初始化查询过滤组件,接收两个参数,options包含了组件的各种配置信息,dataSource则是具体要展示在组件中的数据列表等数据源信息 + init: function (options, dataSource) { + // 从options参数中获取名为elem的属性值,该值可能是一个DOM元素的选择器或者DOM元素本身,用于指定查询过滤组件在页面中要挂载的位置,后续会将生成的组件内容添加到这个元素内 var elem = options.elem; + // 使用jQuery根据elem选择器(或者传入的就是DOM元素本身)获取对应的DOM元素,并赋值给变量$dom,方便后续对这个挂载元素进行操作,比如添加子元素等 var $dom = $(elem); + // 从options参数中获取名为itemWidth的属性值,从变量名推测可能是用于设置组件中每个选项元素的宽度相关信息,后续会根据这个值来进行宽度的具体设置 var itemWidth = options.itemWidth + // 创建一个空对象arr,同样从后续代码推测可能是用于临时存储一些与组件选项相关的数据结构,具体用途会随着代码执行逐渐清晰 var arr = {}; + // 使用jQuery创建一个元素,并添加类名"filterTable",这个表格元素将用于构建查询过滤组件的可视化布局,后续会往里面添加行、列以及具体的选项内容 var $table = $('
'); - for(var i=0;i'); - var $td1 = $(''+dataSource[i].title+':'); + // 开始循环遍历数据源dataSource,dataSource应该是一个数组,里面每个元素代表一组过滤选项数据等相关内容,循环是为了逐个处理并展示这些数据到组件中 + for (var i = 0; i < dataSource.length; i++) { + // 使用jQuery创建一个元素,代表表格中的一行,用于放置一组过滤选项的相关标题和具体选项内容,后续会将这行添加到前面创建的表格$table中 + var $tr = $(''); + // 使用jQuery创建一个元素,作为表格的单元格,添加类名"item-title",并将当前数据源中对应元素的title属性值(应该是这组过滤选项的标题名称)添加到单元格内作为文本内容,用于展示这组选项的标题 + var $td1 = $('' + dataSource[i].title + ':'); + // 使用jQuery创建另一个元素,添加类名"items",这个单元格将用于放置具体的过滤选项内容(如单选框、复选框等选项列表),后续会将构建好的选项列表添加到这个单元格内 var $td2 = $(''); + // 从当前数据源中对应元素获取名为type的属性值,该值可能用于指定这组过滤选项的类型,比如是单选、复选等类型,后续会根据这个类型来构建不同样式和交互逻辑的选项元素 var type = dataSource[i].type; - if(!type){ - console.warn('第'+(i+1)+'个元素的类型[type]为空设为默认值[radio]'); + // 判断如果type属性不存在(即为空),则在控制台输出警告信息,提示第几个元素的类型[type]为空,并将其默认设置为'radio'(单选类型),以保证组件能正常构建,避免因类型未定义出现错误 + if (!type) { + console.warn('第' + (i + 1) + '个元素的类型[type]为空设为默认值[radio]'); type = 'radio'; } - var $ul = $('
    '); - var width = itemWidth && itemWidth.length>0 ? (itemWidth.length>i ? itemWidth[i]:itemWidth[itemWidth.length-1]):80; - arr[dataSource[i].name]=[]; - for(var j=0;j元素,添加类名"layfilter-ul",并设置type和name属性,type属性使用前面获取到的(或者默认设置的)选项类型值,name属性则使用当前数据源中对应元素的name属性值(可能用于唯一标识这组选项等用途),这个