diff --git a/src/main/java/cn/ppdxzz/controller/AdminController.java b/src/main/java/cn/ppdxzz/controller/AdminController.java index b7b7286..53513de 100644 --- a/src/main/java/cn/ppdxzz/controller/AdminController.java +++ b/src/main/java/cn/ppdxzz/controller/AdminController.java @@ -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,121 +112,193 @@ 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 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()) || admin.getDescription() == null || "".trim().equals(admin.getDescription())) { - writer.write("false"); - return; + writer.write("false"); + 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"); } - } + diff --git a/src/main/java/cn/ppdxzz/controller/LoginInterceptor.java b/src/main/java/cn/ppdxzz/controller/LoginInterceptor.java index 297a9c5..5924915 100644 --- a/src/main/java/cn/ppdxzz/controller/LoginInterceptor.java +++ b/src/main/java/cn/ppdxzz/controller/LoginInterceptor.java @@ -9,39 +9,80 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** - * Description: + * Description: 这是一个登录拦截器类,用于拦截Web请求,判断用户是否登录, + * 如果已登录则允许访问相应资源,未登录则将请求重定向到登录页面,实现访问控制的功能。 * * @Date: 2020/2/14 16:50 * @Author: PeiChen */ public class LoginInterceptor implements HandlerInterceptor { + + /** + * 预处理方法,在请求处理之前进行调用,用于进行登录验证等前置逻辑判断。 + * + * @param request 当前的HTTP请求对象,从中可以获取请求的各种信息,比如请求的URL、请求参数等。 + * @param response 当前的HTTP响应对象,可用于设置响应的相关信息,比如重定向等操作。 + * @param handler 被拦截的处理器对象,一般是对应的Controller方法等(通常在复杂场景下可能会用到,这里暂未深度使用该参数)。 + * @return 如果返回true,表示允许请求继续向下执行,即访问目标资源;如果返回false,则会中断请求,根据具体逻辑进行相应处理(比如重定向等)。 + * @throws Exception 可能抛出的异常,例如获取请求信息异常、重定向异常等。 + */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 获取请求的URL + // 获取请求的URL(统一资源标识符),用于判断当前请求的是哪个页面或者资源路径。 String url = request.getRequestURI(); - // URL:除了login.jsp是可以公开访问的,其它的URL都进行拦截控制 - if(url.toLowerCase().indexOf("login")>=0){ + + // 进行URL判断,这里设定的规则是:除了包含"login"(不区分大小写)的URL是可以公开访问的(比如登录页面本身),其它的URL都要进行拦截控制。 + // 如果URL中包含"login",则允许请求继续执行,返回true。 + if (url.toLowerCase().indexOf("login") >= 0) { return true; } + + // 获取当前请求对应的HttpSession对象,HttpSession用于在服务器端存储用户相关的会话信息,比如用户登录后的身份信息等。 HttpSession session = request.getSession(); - // 获取Session中的用户登录信息 + + // 尝试从Session中获取用户登录信息,这里假设用户登录成功后将登录的管理员信息(Admin对象)存入了名为"adminInfo"的Session属性中。 + // 通过强制类型转换获取存储在Session中的Admin对象,如果不存在则返回null。 Admin admin = (Admin) session.getAttribute("adminInfo"); - // 判断Session中是否有用户数据,如果有,则返回true,继续向下执行 - if(admin != null){ + + // 判断Session中是否获取到了用户数据(即Admin对象是否为null),如果不为null,说明用户已经登录,允许请求继续向下执行,返回true。 + if (admin!= null) { return true; } - // 地址栏不符合条件的直接重定向到登录页面 + + // 如果经过前面的判断,地址栏对应的URL不符合可直接访问的条件(既不是登录相关页面,且用户又未登录), + // 则使用响应对象的sendRedirect方法将请求重定向到登录页面(这里的"/hellossm/to_login"是登录页面的相对路径,根据实际项目配置可能会不同)。 + // 并且返回false,表示中断当前请求,不再继续执行后续的处理器逻辑。 response.sendRedirect("/hellossm/to_login"); return false; } + /** + * 后处理方法,在请求处理之后、视图渲染之前进行调用,可以对请求处理后的结果进行一些额外处理,比如向视图添加一些模型数据等。 + * 但此方法在当前类中暂时没有具体的实现逻辑(可能根据具体业务需求后续添加)。 + * + * @param request 当前的HTTP请求对象。 + * @param response 当前的HTTP响应对象。 + * @param handler 被拦截的处理器对象。 + * @param modelAndView 包含了视图相关信息以及要传递给视图的数据的对象,如果在请求处理过程中有视图渲染的情况,可通过此对象进行操作。 + * @throws Exception 可能抛出的异常,例如操作ModelAndView对象异常等。 + */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } + /** + * 整个请求处理完成(包括视图渲染等全部完成)之后调用的方法,可用于进行一些资源清理等操作。 + * 此方法在当前类中暂时也没有具体的实现逻辑(同样可能根据业务需求后续添加)。 + * + * @param request 当前的HTTP请求对象。 + * @param response 当前的HTTP响应对象。 + * @param handler 被拦截的处理器对象。 + * @param ex 如果在请求处理过程中出现了异常,会在此处传递进来,可用于记录日志、进行异常处理等操作。 + * @throws Exception 可能抛出的异常,例如处理异常对象异常等。 + */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/dao/AdminDao.java b/src/main/java/cn/ppdxzz/dao/AdminDao.java index 657f6ab..a76e4fc 100644 --- a/src/main/java/cn/ppdxzz/dao/AdminDao.java +++ b/src/main/java/cn/ppdxzz/dao/AdminDao.java @@ -8,101 +8,151 @@ import java.util.List; /** * Description:持久层 + * 该接口定义了与管理员数据操作相关的各种数据库访问方法,使用MyBatis的注解来映射SQL语句,实现对数据库中管理员表(admins)的增删改查等操作。 * * @Date: 2020/2/10 15:33 * @Author: PeiChen */ @Repository -public interface AdminDao {//sss +public interface AdminDao { /** - * 通过用户名密码查询用户信息 - * @param admin - * @return - * @throws Exception + * 通过用户名和密码查询用户信息 + * 该方法使用MyBatis的@Select注解,定义了一个SQL查询语句,从数据库的"admins"表中查询满足指定用户名和密码条件的记录,并将查询结果映射为Admin对象返回。 + * + * @param admin 传入的Admin对象,其中包含了要查询的用户名和密码等信息,MyBatis会通过#{username}和#{password}的方式将对象中的属性值替换到SQL语句中相应的位置。 + * @return 如果查询到匹配的记录,则返回对应的Admin对象;如果未查询到,则根据具体情况返回null或者抛出异常(由具体的MyBatis配置和数据库操作决定)。 + * @throws Exception 可能抛出的异常,比如数据库连接异常、SQL执行异常等。 */ @Select("select * from admins where username = #{username} and password = #{password}") Admin findAdmin(Admin admin) throws Exception; /** * 通过id查询用户信息 + * 使用@Select注解定义SQL语句,从"admins"表中查询指定id对应的用户记录,并将其映射为Admin对象返回。 + * 这里通过#{id}的方式将传入的整数类型的id参数替换到SQL语句中,实现根据唯一标识id查询用户信息的功能。 + * + * @param id 要查询的用户的唯一标识(通常是数据库表中的主键值)。 + * @return 查询到的对应的Admin对象,如果不存在则返回null或者抛出异常(取决于具体配置和数据库情况)。 + * @throws Exception 可能出现的异常情况,如数据库查询出错等。 */ @Select("select * from admins where id = #{id}") Admin findAdminById(Integer id) throws Exception; /** * 分页查询所有管理员信息 + * 此方法使用@Select注解定义了一个简单的SQL查询语句,目的是从"admins"表中获取所有的管理员记录。 + * 不过需要注意的是,这里只是定义了基本的查询语句,实际的分页功能可能需要在MyBatis的配置或者调用该方法的上层业务逻辑中结合相关插件(如PageHelper等)来实现。 + * + * @return 返回一个包含所有管理员信息的List集合,如果查询出现问题可能返回空集合或者抛出异常。 + * @throws Exception 比如数据库连接失败、查询执行异常等情况下抛出的异常。 */ @Select("select * from admins") List findAll() throws Exception; /** * 导出管理员信息 - * @return - * @throws Exception + * 同样使用@Select注解定义SQL语句,从"admins"表中获取所有管理员记录,主要用于数据导出的场景,将数据库中的管理员信息提取出来以便后续进行导出操作(如生成Excel文件等)。 + * + * @return 包含所有管理员信息的List集合,若出现问题则可能返回空集合或者抛出异常。 + * @throws Exception 像数据库访问异常等可能出现的异常情况。 */ @Select("select * from admins") List exportAdminInfo() throws Exception; /** * 根据id删除管理员信息 - * @param id - * @throws Exception + * 使用@Delete注解定义了一个SQL删除语句,根据传入的管理员id,从"admins"表中删除对应的记录,实现删除指定管理员数据的功能。 + * 通过#{id}将传入的id参数替换到SQL语句中,准确地定位要删除的记录。 + * + * @param id 要删除的管理员的唯一标识(数据库表中的主键值)。 + * @throws Exception 可能在数据库执行删除操作时出现的异常,例如违反外键约束、数据库权限不足等导致的异常。 */ @Delete("delete from admins where id = #{id}") void deleteAdminById(Integer id) throws Exception; /** * 修改管理员信息 - * @param admin - * @throws Exception + * 通过@Update注解定义了一个SQL更新语句,根据传入的Admin对象中的属性值,更新"admins"表中对应id的管理员记录信息。 + * 使用#{属性名}的方式将Admin对象中的各个属性值替换到SQL语句相应位置,实现对指定管理员记录的多字段更新操作。 + * + * @param admin 包含了要更新的管理员信息的Admin对象,其属性值将用于更新数据库中的对应记录。 + * @throws Exception 比如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况。 */ @Update("update admins set username= #{username},name = #{name},uid = #{uid}, phone = #{phone}, description = #{description} where id = #{id}") void updateAdmin(Admin admin) throws Exception; /** * 添加管理员信息 - * @param admin - * @throws Exception + * 利用@Insert注解定义了一个SQL插入语句,将传入的Admin对象中的各个属性值插入到"admins"表中,实现新增管理员记录的功能。 + * 通过#{属性名}将Admin对象的属性值对应地填充到SQL语句的相应位置,按照数据库表的字段顺序插入数据。 + * + * @param admin 包含了要添加的管理员各项信息的Admin对象,这些信息将被插入到数据库表中。 + * @throws Exception 可能出现的异常情况,例如插入的数据不符合表结构约束、数据库插入失败等。 */ @Insert("insert into admins(username,password,name,uid,phone,power,description) values (#{username},#{password},#{name},#{uid},#{phone},#{power},#{description})") void addAdmin(Admin admin) throws Exception; /** * 校验用户名是否存在 + * 使用@Select注解定义了一个SQL查询语句,从"admins"表中查询是否存在指定用户名的记录,用于验证用户名在数据库中是否已经被使用。 + * 如果查询到记录,说明用户名存在,返回true;若未查询到记录,则返回false(具体返回值的处理方式由MyBatis和业务逻辑共同决定)。 + * + * @param u_name 要校验的用户名。 + * @return 如果用户名存在于数据库中则返回true,否则返回false,过程中若出现异常则抛出相应异常情况。 + * @throws Exception 比如数据库查询异常等可能出现的问题。 */ @Select("select * from admins where username = #{u_name}") Boolean checkUserName(String u_name) throws Exception; /** * 校验学/工号是否已被注册 - * @param uid - * @return - * @throws Exception + * 通过@Select注解定义SQL查询语句,从"admins"表中查找是否存在指定学/工号(uid)的记录,以此判断该学/工号是否已经被其他管理员注册使用。 + * 如果查询到对应记录,则返回该记录对应的Admin对象(可以根据返回对象是否为null来判断学/工号是否已注册);若未查询到记录则返回null或者抛出异常(取决于具体配置和业务场景)。 + * + * @param uid 要校验的学/工号。 + * @return 如果学/工号已被注册,则返回对应的Admin对象,否则返回null或者抛出异常情况(比如数据库查询异常等)。 + * @throws Exception 数据库访问过程中可能出现的异常。 */ @Select("select * from admins where uid = #{uid}") Admin checkUid(String uid) throws Exception; /** * 重置密码 - * @param password - * @param id - * @throws Exception + * 使用@Update注解定义了一个SQL更新语句,根据传入的密码和管理员id,更新"admins"表中对应管理员记录的密码字段值,实现重置密码的功能。 + * 通过#{password}和#{id}将传入的参数替换到SQL语句相应位置,准确地更新指定管理员的密码。 + * + * @param password 要设置的新密码。 + * @param id 对应的管理员的唯一标识(数据库表中的主键值),用于定位要更新密码的记录。 + * @throws Exception 比如在执行更新操作时出现的数据库权限不足、数据类型不匹配等异常情况。 */ @Update("update admins set password = #{password} where id = #{id}") - void updatePassword(String password,Integer id) throws Exception; + void updatePassword(String password, Integer id) throws Exception; //select * from admins where username like '%p%' or name like '%万%' or power like '%1%' or description like '%管理员%'; //模糊搜索管理员信息,查询结果返回一个list集合 + /** + * 模糊搜索管理员信息 + * 使用@Select注解定义了一个带有模糊查询(LIKE操作符)的SQL语句,从"admins"表中查找用户名、姓名、学/工号、电话、权限、描述等字段中包含指定关键字(keyword)的管理员记录。 + * 通过${keyword}的方式将传入的关键字参数直接拼接到SQL语句中(与#{keyword}的区别在于,${}是直接拼接,#{}是预编译防止SQL注入),实现模糊搜索功能,查询结果以List集合形式返回。 + * 需要注意的是,使用${}方式可能存在SQL注入风险,要确保传入的关键字是可信的或者进行相应的安全处理。 + * + * @param keyword 用于模糊搜索的关键字,将在多个字段中进行模糊匹配查找符合条件的管理员记录。 + * @return 返回一个包含符合模糊搜索条件的管理员信息的List集合,如果没有找到匹配记录则可能返回空集合或者抛出异常。 + * @throws Exception 比如数据库查询异常等可能出现的问题。 + */ @Select("select * from admins where username like '%${keyword}%' or name like '%${keyword}%' or uid like '%${keyword}%' or phone like '%${keyword}%' or power like '%${keyword}%' or description like '%${keyword}%' ") List serarchInfo(@Param(value="keyword") String keyword) throws Exception; /** * 管理员授权 * 授权等级 : 0 1 2 3 - * @param admin - * @throws Exception + * 通过@Update注解定义了一个SQL更新语句,根据传入的Admin对象中的id和授权等级(power)属性值,更新"admins"表中对应管理员记录的授权等级字段值,实现管理员授权功能。 + * 通过#{power}和#{id}将Admin对象中的相应属性值替换到SQL语句中,准确地更新指定管理员的授权等级。 + * + * @param admin 包含了要授权的管理员的相关信息(主要是id和授权等级power)的Admin对象,用于更新数据库中对应记录的授权等级。 + * @throws Exception 例如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况。 */ @Update("update admins set power = #{power} where id = #{id} ") void put_power(Admin admin) throws Exception; -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/domain/Admin.java b/src/main/java/cn/ppdxzz/domain/Admin.java index c7cce7c..9894e6e 100644 --- a/src/main/java/cn/ppdxzz/domain/Admin.java +++ b/src/main/java/cn/ppdxzz/domain/Admin.java @@ -4,23 +4,54 @@ import java.io.Serializable; /** * Description:管理员实体类 + * 该类用于表示管理员相关的信息,作为Java对象与数据库中的管理员表记录进行映射,实现数据的传输和持久化操作等。 + * 实现Serializable接口是为了让该类的对象能够被序列化,便于在网络传输、文件存储等场景下使用。 * * @Date: 2020/2/10 15:13 * @Author: PeiChen */ public class Admin implements Serializable { - private Integer id; //id 主键自增 - private String username; //用户名 - private String password; //密码 - private String name; //姓名 - private String uid; //学/工号 - private String phone; //手机号 - private int power; //是否开启权限 - private String description; //描述 + // 管理员的唯一标识,通常对应数据库表中的主键字段,设置为自增类型,用于唯一确定一条管理员记录。 + private Integer id; + + // 管理员的用户名,用于登录系统等操作,存储用户名相关的字符串信息。 + private String username; + + // 管理员的密码,用于验证登录身份,存储密码相关的字符串信息,在实际应用中应进行加密存储等安全处理。 + private String password; + + // 管理员的真实姓名,用于展示和区分不同的管理员个体,存储姓名相关的字符串信息。 + private String name; + + // 学/工号,用于唯一标识管理员在学校或单位内的身份编号,存储相应的字符串信息。 + private String uid; + + // 管理员的手机号码,可用于联系管理员等相关用途,存储手机号码的字符串信息。 + private String phone; + + // 表示管理员是否开启权限的标识,整型变量,具体含义根据业务逻辑确定(例如不同数值对应不同权限级别等)。 + private int power; + + // 对管理员的相关描述信息,比如岗位描述、职责范围等,存储对应的字符串信息。 + private String description; + + // 默认的无参构造函数,在一些框架进行对象实例化等操作时可能会用到,例如通过反射机制创建对象时需要默认构造函数。 public Admin() { } + /** + * 全参构造函数,用于根据传入的各个参数创建一个完整的Admin对象,方便在初始化对象时一次性赋值所有属性。 + * + * @param id 管理员的唯一标识。 + * @param username 管理员的用户名。 + * @param password 管理员的密码。 + * @param name 管理员的真实姓名。 + * @param uid 学/工号。 + * @param phone 管理员的手机号码。 + * @param power 表示是否开启权限的标识。 + * @param description 对管理员的描述信息。 + */ public Admin(Integer id, String username, String password, String name, String uid, String phone, int power, String description) { this.id = id; this.username = username; @@ -32,70 +63,92 @@ public class Admin implements Serializable { this.description = description; } + // 获取管理员的唯一标识(id)的方法,供外部类访问该对象的id属性值。 public Integer getId() { return id; } + // 设置管理员的唯一标识(id)的方法,供外部类修改该对象的id属性值。 public void setId(Integer id) { this.id = id; } + // 获取管理员用户名的方法,供外部类访问该对象的username属性值。 public String getUsername() { return username; } + // 设置管理员用户名的方法,供外部类修改该对象的username属性值。 public void setUsername(String username) { this.username = username; } + // 获取管理员密码的方法,供外部类访问该对象的password属性值。 public String getPassword() { return password; } + // 设置管理员密码的方法,供外部类修改该对象的password属性值。 public void setPassword(String password) { this.password = password; } + // 获取管理员真实姓名的方法,供外部类访问该对象的name属性值。 public String getName() { return name; } + // 设置管理员真实姓名的方法,供外部类修改该对象的name属性值。 public void setName(String name) { this.name = name; } + // 获取管理员学/工号的方法,供外部类访问该对象的uid属性值。 public String getUid() { return uid; } + // 设置管理员学/工号的方法,供外部类修改该对象的uid属性值。 public void setUid(String uid) { this.uid = uid; } + // 获取管理员手机号码的方法,供外部类访问该对象的phone属性值。 public String getPhone() { return phone; } + // 设置管理员手机号码的方法,供外部类修改该对象的phone属性值。 public void setPhone(String phone) { this.phone = phone; } + // 获取管理员权限标识的方法,供外部类访问该对象的power属性值。 public int getPower() { return power; } + // 设置管理员权限标识的方法,供外部类修改该对象的power属性值。 public void setPower(int power) { this.power = power; } + // 获取管理员描述信息的方法,供外部类访问该对象的description属性值。 public String getDescription() { return description; } + // 设置管理员描述信息的方法,供外部类修改该对象的description属性值。 public void setDescription(String description) { this.description = description; } + /** + * 重写toString方法,用于方便地将Admin对象以特定格式转换为字符串表示形式,便于在调试、日志输出等场景下查看对象的具体内容。 + * 返回一个包含对象各个属性值的字符串,格式为 "Admin{" + 属性名=属性值 + '}' 的形式。 + * + * @return 表示Admin对象的字符串内容。 + */ @Override public String toString() { return "Admin{" + @@ -109,4 +162,4 @@ public class Admin implements Serializable { ", description='" + description + '\'' + '}'; } -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/poi/WriteExcel.java b/src/main/java/cn/ppdxzz/poi/WriteExcel.java index c134037..da99124 100644 --- a/src/main/java/cn/ppdxzz/poi/WriteExcel.java +++ b/src/main/java/cn/ppdxzz/poi/WriteExcel.java @@ -2,188 +2,237 @@ package cn.ppdxzz.poi; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; - import java.io.*; import java.util.ArrayList; import java.util.List; /** * Description:通用Excel输入流 + * 该类主要用于将数据导出为Excel文件格式,并提供相关的样式设置以及数据填充等功能,最终返回一个Excel文件对应的输入流,方便在Web等场景下进行文件下载等操作。 * * @Date: 2020/2/16 15:17 * @Author: PeiChen */ public class WriteExcel { - //导出表的列名 + + // 导出表的列名数组,用于存储Excel表格每列的标题名称。 private String[] rowName; - //每行作为一个Object对象 - private List dataList = new ArrayList(); - //构造方法,传入要导出的数据:第一个参数传入一个列名数组,第二个参数传入一个list集合(Object对象数组) - public WriteExcel(String[] rowName,List dataList){ + // 每行作为一个Object对象,这里使用List来存储多个Object数组,每个Object数组代表Excel表格中的一行数据(除去列名那一行)。 + private List dataList = new ArrayList(); + + // 构造方法,传入要导出的数据 + // 第一个参数传入一个列名数组,用于设置Excel表格的列标题。 + // 第二个参数传入一个list集合(Object对象数组),集合中的每个Object数组对应Excel表格中的一行具体数据。 + public WriteExcel(String[] rowName, List dataList) { this.dataList = dataList; this.rowName = rowName; } - /* - * 导出数据 - * */ - public InputStream export() throws Exception{ - HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象 - HSSFSheet sheet = workbook.createSheet("sheet1"); // 创建工作表 + /** + * 导出数据方法 + * 该方法主要实现将传入的数据按照设定的格式和样式填充到Excel工作簿中,并进行一些列宽自适应等优化操作,最后返回一个代表该Excel文件内容的输入流,以便后续进行文件下载等处理。 + * + * @return 返回一个InputStream类型的输入流,该输入流指向生成的Excel文件内容,可用于在网络传输(如文件下载)等场景中。 + * @throws Exception 可能抛出的异常,比如创建工作簿、写入文件内容等过程中出现的IO异常或者其他相关异常。 + */ + public InputStream export() throws Exception { + // 创建工作簿对象,这是整个Excel文件的基础容器,后续的工作表、单元格等都将添加到这个工作簿中。 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 创建工作表,这里创建了一个名为"sheet1"的工作表,一个工作簿可以包含多个工作表,此处只创建了一个。 + HSSFSheet sheet = workbook.createSheet("sheet1"); // 设置sheet表样式 - HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象 - HSSFCellStyle style = this.getColumnStyle(workbook); //单元格样式对象 + // 获取列头样式对象,用于设置Excel表格中列标题那一行单元格的样式。 + HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); + // 获取单元格样式对象,用于设置Excel表格中除列标题外其他数据单元格的样式。 + HSSFCellStyle style = this.getColumnStyle(workbook); - // 定义所需列数 + // 定义所需列数,通过传入的列名数组长度来确定Excel表格的列数。 int columnNum = rowName.length; - HSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置创建行(最顶端的行开始的第二行) + // 在索引0的位置创建行(Excel表格中最顶端的行),用于设置列头信息。 + HSSFRow rowRowName = sheet.createRow(0); // 将列头设置到sheet的单元格中 - for(int n=0;n findAll(int page,int size) throws Exception; + /** + * 查询所有管理员信息 + * 该方法用于获取所有管理员的信息列表,不过考虑到可能数据量较大需要分页展示,所以接收当前页码(page)和每页显示的记录数(size)两个参数, + * 在具体实现类中会按照这两个参数进行分页查询操作,从数据库中获取相应分页后的管理员信息列表并返回。 + * + * @param page 当前页码,用于指定要获取哪一页的数据,从1开始计数。 + * @param size 每页显示的记录数,用于确定每页包含的管理员记录数量。 + * @return 返回一个包含管理员信息的List集合,集合中的元素是按照分页条件从数据库中查询出来的管理员对象,执行过程中可能抛出异常(由具体实现决定)。 + * @throws Exception 比如数据库查询异常、分页插件使用异常等可能出现的问题。 + */ + List findAll(int page, int size) throws Exception; + /** + * 通过id删除管理员 + * 根据传入的管理员id,调用具体实现类中的业务逻辑,从数据库中删除具有该id的管理员记录,实现对管理员数据的删除操作,该方法无返回值,主要关注删除操作是否成功执行。 + * + * @param id 要删除的管理员的唯一标识(对应数据库表中的主键值)。 + * @throws Exception 可能在数据库执行删除操作时出现的异常,例如违反外键约束、数据库权限不足等导致的异常,具体由实现类中数据库操作情况决定抛出的异常类型。 + */ void deleteAdminById(Integer id) throws Exception; + /** + * 更新管理员信息 + * 接收一个包含更新后管理员各项信息的Admin对象,通过具体实现类中的业务逻辑,将传入对象中的信息更新到数据库中对应的管理员记录上, + * 以此实现对管理员信息的修改功能,该方法无返回值,重点在于完成信息更新操作。 + * + * @param admin 包含了更新后的管理员各项信息的Admin对象,这些信息将用于更新数据库中的记录。 + * @throws Exception 比如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况,具体取决于实现类中与数据库交互及数据更新的操作情况。 + */ void updateAdmin(Admin admin) throws Exception; + /** + * 添加管理员信息 + * 该方法用于将一个包含新管理员各项信息的Admin对象添加到数据库中,创建一条新的管理员记录,具体实现类会处理相关的数据库插入操作, + * 此方法无返回值,主要关注插入操作是否能成功执行,若出现异常则插入失败。 + * + * @param admin 包含了要添加的管理员各项信息的Admin对象,这些信息将被插入到数据库表中。 + * @throws Exception 可能出现的异常情况,例如插入的数据不符合表结构约束、数据库插入失败等,具体由实现类中数据库插入操作情况决定抛出的异常类型。 + */ void addAdmin(Admin admin) throws Exception; + /** + * 校验用户名是否存在 + * 根据传入的用户名,调用具体实现类中的业务逻辑,去数据库中查询是否存在该用户名对应的管理员记录,以此判断用户名是否已被其他管理员使用, + * 如果存在则返回true,不存在则返回false,可用于注册等场景下验证用户名的唯一性。 + * + * @param u_name 要校验的用户名。 + * @return 如果用户名在数据库中已存在,则返回true;若不存在则返回false,查询过程中可能抛出异常(由具体实现决定)。 + * @throws Exception 比如数据库查询异常等可能出现的问题,具体取决于实现类中查询操作的执行情况。 + */ Boolean checkUserName(String u_name) throws Exception; - //模糊搜索管理员信息,查询结果返回一个list集合 - List serarchInfo(int page,int size,String keyword) throws Exception; - //授权 + // 模糊搜索管理员信息,查询结果返回一个list集合 + /** + * 模糊搜索管理员信息 + * 按照传入的当前页码(page)、每页显示记录数(size)以及搜索关键字(keyword),在具体实现类中调用相应业务逻辑, + * 通过关键字在数据库的相关字段中进行模糊匹配查询,获取符合条件的管理员信息列表并返回,便于实现根据部分信息查找管理员的功能。 + * + * @param page 当前页码,用于指定要获取哪一页的数据,从1开始计数。 + * @param size 每页显示的记录数,用于确定每页包含的管理员记录数量。 + * @param keyword 用于模糊查询的关键字,将在数据库中相关字段(如用户名、姓名等)进行模糊匹配查找符合条件的管理员记录。 + * @return 返回一个包含符合模糊查询条件的管理员信息的List集合,如果没有找到匹配记录则返回空集合,执行过程中可能抛出异常(由具体实现决定)。 + * @throws Exception 比如数据库查询异常、分页插件使用异常等可能出现的问题。 + */ + List serarchInfo(int page, int size, String keyword) throws Exception; + + // 授权 + /** + * 授权操作 + * 接收一个包含管理员相关信息及授权等级等的Admin对象,通过具体实现类中的业务逻辑,将该对象中的授权等级信息更新到数据库中对应管理员记录上, + * 实现对管理员授权等级的修改,该方法无返回值,重点关注授权等级更新操作是否成功执行。 + * + * @param admin 包含了要授权的管理员的相关信息(主要是授权等级等)的Admin对象,这些信息将用于更新数据库中对应记录的授权等级。 + * @throws Exception 例如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况,具体取决于实现类中与数据库交互及数据更新的操作情况。 + */ void put_power(Admin admin) throws Exception; - //返回一个携带所有管理员信息数据的InputStream输入流 + // 返回一个携带所有管理员信息数据的InputStream输入流 + /** + * 获取所有管理员信息的输入流 + * 该方法的具体实现类会将所有管理员的信息整理并转换为适合的数据格式(通常用于导出数据场景,比如生成Excel文件等), + * 然后以InputStream的形式返回,外部可以利用这个输入流进行文件下载等相关操作,获取包含所有管理员信息的数据内容。 + * + * @return 返回一个InputStream类型的输入流,该输入流指向包含所有管理员信息的数据内容,可用于后续的文件下载、数据传输等操作,执行过程中可能抛出异常(由具体实现决定)。 + * @throws Exception 比如数据整理转换异常、生成输入流过程中出现的异常等,具体取决于实现类中相关操作的执行情况。 + */ InputStream getInputStream() throws Exception; - //校验学工号是否被注册 + // 校验学工号是否被注册 + /** + * 校验学/工号是否被注册 + * 根据传入的学/工号,调用具体实现类中的业务逻辑,去数据库中查询是否存在该学/工号对应的管理员记录,以此判断该学/工号是否已被其他管理员使用, + * 如果存在则返回对应的Admin对象(可以根据返回对象是否为null来判断是否已注册),不存在则返回null,用于在添加或修改管理员信息等场景下验证学/工号的唯一性。 + * + * @param uid 要校验的学/工号。 + * @return 如果学/工号在数据库中已被注册,则返回对应的Admin对象;若未被注册则返回null,查询过程中可能抛出异常(由具体实现决定)。 + * @throws Exception 比如数据库查询异常等可能出现的问题,具体取决于实现类中查询操作的执行情况。 + */ Admin checkUid(String uid) throws Exception; -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/service/impl/AdminServiceImpl.java b/src/main/java/cn/ppdxzz/service/impl/AdminServiceImpl.java index f29f595..1d2fe8f 100644 --- a/src/main/java/cn/ppdxzz/service/impl/AdminServiceImpl.java +++ b/src/main/java/cn/ppdxzz/service/impl/AdminServiceImpl.java @@ -18,7 +18,8 @@ import java.util.ArrayList; import java.util.List; /** - * Description: + * Description: 这是管理员服务层的实现类,实现了AdminService接口,用于处理与管理员相关的业务逻辑, + * 并调用持久层(AdminDao)的方法来完成具体的数据操作,如查询、添加、删除、修改等功能,同时也包含了一些如分页、数据导出等辅助功能的实现。 * * @Date: 2020/2/10 15:30 * @Author: PeiChen @@ -26,7 +27,10 @@ import java.util.List; @Service("adminService") public class AdminServiceImpl implements AdminService { + // 依赖注入AdminDao接口,用于调用持久层的数据库操作方法。 private AdminDao adminDao; + + // 通过@Autowired注解,让Spring框架自动注入AdminDao的实现类实例,实现依赖注入。 @Autowired public void setAdminDao(AdminDao adminDao) { this.adminDao = adminDao; @@ -34,9 +38,11 @@ public class AdminServiceImpl implements AdminService { /** * 调用持久层中的findAdmin()方法校验用户名密码是否正确 - * @param admin - * @return - * @throws Exception + * 该方法接收一个包含用户名和密码信息的Admin对象,将验证工作委托给持久层的对应方法,根据持久层返回结果判断用户名和密码是否匹配。 + * + * @param admin 包含用户名和密码等信息的Admin对象,用于传递给持久层方法进行查询验证。 + * @return 如果持久层查询到匹配的管理员记录,则返回对应的Admin对象,否则返回null(根据持久层方法具体实现情况而定)。 + * @throws Exception 可能抛出的异常,比如持久层数据库操作异常等。 */ @Override public Admin findAdmin(Admin admin) throws Exception { @@ -45,9 +51,11 @@ public class AdminServiceImpl implements AdminService { /** * 通过id查询管理员信息 - * @param id - * @return Admin - * @throws Exception + * 该方法根据传入的管理员id,调用持久层的对应方法从数据库中查询并获取相应管理员的详细信息。 + * + * @param id 要查询的管理员的唯一标识(通常对应数据库表中的主键值)。 + * @return 返回查询到的对应的Admin对象,如果未查询到则返回null(取决于持久层方法实现及数据库情况)。 + * @throws Exception 可能出现的数据库查询异常等情况。 */ @Override public Admin findAdminById(Integer id) throws Exception { @@ -56,19 +64,26 @@ public class AdminServiceImpl implements AdminService { /** * 查询所有管理员信息 - * @return - * @throws Exception + * 此方法借助PageHelper分页插件实现分页查询功能,先设置分页参数(当前页码和每页显示记录数),然后调用持久层的方法获取所有管理员记录,返回的结果将是按照分页设置后的管理员信息列表。 + * + * @param page 当前页码,用于指定要查询的页面。 + * @param size 每页显示的记录数,用于确定每页的数据量。 + * @return 返回一个包含管理员信息的List集合,集合中的数据是按照分页条件从数据库中查询出来的管理员记录。 + * @throws Exception 比如分页插件使用异常、数据库查询异常等可能出现的问题。 */ @Override - public List findAll(int page,int size) throws Exception { - PageHelper.startPage(page,size); + public List findAll(int page, int size) throws Exception { + // 启动PageHelper分页功能,设置当前页码和每页显示的记录数,后续调用持久层查询方法时会自动应用分页逻辑。 + PageHelper.startPage(page, size); return adminDao.findAll(); } /** * 通过id删除管理员 - * @param id - * @throws Exception + * 该方法接收要删除的管理员的id,直接调用持久层的对应方法,从数据库中删除具有该id的管理员记录,实现删除管理员数据的功能。 + * + * @param id 要删除的管理员的唯一标识(对应数据库表中的主键值)。 + * @throws Exception 可能在数据库执行删除操作时出现的异常,例如违反外键约束、数据库权限不足等导致的异常。 */ @Override public void deleteAdminById(Integer id) throws Exception { @@ -77,8 +92,10 @@ public class AdminServiceImpl implements AdminService { /** * 更新管理员信息 - * @param admin - * @throws Exception + * 该方法接收一个包含更新后管理员信息的Admin对象,调用持久层的对应方法,将传入的对象信息更新到数据库中对应管理员记录上,实现管理员信息修改的功能。 + * + * @param admin 包含了更新后的管理员各项信息的Admin对象,将被用于更新数据库中的记录。 + * @throws Exception 比如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况。 */ @Override public void updateAdmin(Admin admin) throws Exception { @@ -87,8 +104,11 @@ public class AdminServiceImpl implements AdminService { /** * 添加管理员信息 - * @param admin - * @throws Exception + * 该方法使用了Spring的事务管理机制(通过@Transactional注解标记),在添加管理员信息时,如果出现异常,将自动回滚事务,保证数据的一致性。 + * 它接收一个包含要添加的管理员各项信息的Admin对象,调用持久层的对应方法将该对象信息插入到数据库中,实现新增管理员记录的功能。 + * + * @param admin 包含了要添加的管理员各项信息的Admin对象,这些信息将被插入到数据库表中。 + * @throws Exception 可能出现的异常情况,例如插入的数据不符合表结构约束、数据库插入失败等,出现异常时事务会自动回滚。 */ @Transactional @Override @@ -96,11 +116,20 @@ public class AdminServiceImpl implements AdminService { adminDao.addAdmin(admin); } + /** + * 校验用户名是否存在 + * 该方法调用持久层的对应方法,根据传入的用户名去数据库中查询是否存在对应的记录,以此判断用户名是否已经被其他管理员使用。 + * 如果查询到记录(即返回的结果不为null),则表示用户名存在,返回true;若未查询到记录,则返回false。 + * + * @param u_name 要校验的用户名。 + * @return 如果用户名存在于数据库中则返回true,否则返回false,过程中若出现异常则抛出相应异常情况。 + * @throws Exception 比如数据库查询异常等可能出现的问题。 + */ @Override public Boolean checkUserName(String u_name) throws Exception { //System.out.println(adminDao.checkUserName(u_name)); - //用户名不存在则返回空,直接false - if (adminDao.checkUserName(u_name) != null) { + // 用户名不存在则返回空,直接false + if (adminDao.checkUserName(u_name)!= null) { return true; } return false; @@ -108,21 +137,28 @@ public class AdminServiceImpl implements AdminService { /** * 管理员信息模糊查询 - * @param keyword - * @return - * @throws Exception + * 此方法借助PageHelper分页插件实现分页模糊查询功能,先设置分页参数(当前页码和每页显示记录数),然后调用持久层的模糊查询方法,根据传入的关键字在数据库中查找匹配的管理员记录,返回符合条件的管理员信息列表。 + * + * @param page 当前页码,用于指定要查询的页面。 + * @param size 每页显示的记录数,用于确定每页的数据量。 + * @param keyword 用于模糊查询的关键字,将在数据库中根据相关字段进行模糊匹配查找符合条件的管理员记录。 + * @return 返回一个包含符合模糊查询条件的管理员信息的List集合,如果没有找到匹配记录则返回空集合(取决于持久层方法实现及数据库情况)。 + * @throws Exception 比如分页插件使用异常、数据库查询异常等可能出现的问题。 */ @Override - public List serarchInfo(int page,int size,String keyword) throws Exception { - PageHelper.startPage(page,size); + public List serarchInfo(int page, int size, String keyword) throws Exception { + // 启动PageHelper分页功能,设置当前页码和每页显示的记录数,后续调用持久层模糊查询方法时会自动应用分页逻辑。 + PageHelper.startPage(page, size); List list = adminDao.serarchInfo(keyword); return list; } /** * 授权 - * @param admin - * @throws Exception + * 该方法接收一个包含管理员相关信息及授权等级等的Admin对象,调用持久层的对应方法,将该对象中的授权等级信息更新到数据库中对应管理员记录上,实现管理员授权功能。 + * + * @param admin 包含了要授权的管理员的相关信息(主要是授权等级等)的Admin对象,用于更新数据库中对应记录的授权等级。 + * @throws Exception 例如在执行更新操作时出现的数据类型不匹配、数据库约束违反等异常情况。 */ @Override public void put_power(Admin admin) throws Exception { @@ -131,17 +167,23 @@ public class AdminServiceImpl implements AdminService { /** * 导出管理员信息 - * @return - * @throws Exception + * 该方法主要实现将数据库中的管理员信息导出为Excel文件格式的功能,首先获取数据库中所有管理员的记录,然后将这些记录按照一定格式整理到数据列表中, + * 接着利用WriteExcel类将数据列表转换为Excel文件对应的输入流,最终返回该输入流,可用于后续在Web等场景下进行文件下载操作。 + * + * @return 返回一个InputStream类型的输入流,该输入流指向生成的包含管理员信息的Excel文件内容,可用于文件下载等相关业务操作。 + * @throws Exception 可能抛出的异常,比如获取数据库数据异常、生成Excel文件过程中出现的异常(如写入文件流异常等)。 */ @Override public InputStream getInputStream() throws Exception { - //Excel中的每列列名,依次对应数据库的字段 - String[] title = new String[]{"ID","用户名","密码","姓名","学/工号","手机号","权限","描述"}; + // Excel中的每列列名,依次对应数据库的字段,用于设置导出的Excel表格的列标题。 + String[] title = new String[]{"ID", "用户名", "密码", "姓名", "学/工号", "手机号", "权限", "描述"}; + // 调用持久层的方法获取数据库中所有管理员的信息,得到一个List集合,集合中的每个Admin对象代表一条管理员记录。 List admins = adminDao.exportAdminInfo(); - List dataList = new ArrayList(); + // 创建一个用于存储每行数据的列表,每个元素是一个Object数组,代表Excel表格中的一行数据(除去列标题行),初始化为空列表。 + List dataList = new ArrayList(); + // 遍历从数据库获取的管理员信息列表,将每条管理员记录的各个字段值提取出来,整理成Object数组形式,添加到数据列表中,以便后续生成Excel文件。 for (int i = 0; i < admins.size(); i++) { - Object[] obj = new Object[7]; + Object[] obj = new Object[8]; obj[0] = admins.get(i).getId(); obj[1] = admins.get(i).getUsername(); obj[2] = admins.get(i).getPassword(); @@ -152,20 +194,25 @@ public class AdminServiceImpl implements AdminService { obj[7] = admins.get(i).getDescription(); dataList.add(obj); } + // 创建WriteExcel类的实例,传入列名数组和整理好的数据列表,用于生成Excel文件。 WriteExcel ex = new WriteExcel(title, dataList); InputStream in; + // 调用WriteExcel类的export方法,生成包含管理员信息的Excel文件对应的输入流,将其赋值给变量in。 in = ex.export(); return in; } /** * 校验学/工号是否已被注册 - * @param uid - * @return - * @throws Exception + * 该方法调用持久层的对应方法,根据传入的学/工号去数据库中查询是否存在对应的管理员记录,以此判断该学/工号是否已经被其他管理员使用。 + * 如果查询到记录,则返回对应的Admin对象(可以根据返回对象是否为null来判断学/工号是否已注册);若未查询到记录则返回null(取决于持久层方法实现及数据库情况)。 + * + * @param uid 要校验的学/工号。 + * @return 如果学/工号已被注册,则返回对应的Admin对象,否则返回null,过程中若出现异常则抛出相应异常情况。 + * @throws Exception 比如数据库查询异常等可能出现的问题。 */ @Override public Admin checkUid(String uid) throws Exception { return adminDao.checkUid(uid); } -} +} \ No newline at end of file diff --git a/src/main/java/cn/ppdxzz/utils/MD5Util.java b/src/main/java/cn/ppdxzz/utils/MD5Util.java index 34fffce..b57e0ac 100644 --- a/src/main/java/cn/ppdxzz/utils/MD5Util.java +++ b/src/main/java/cn/ppdxzz/utils/MD5Util.java @@ -4,59 +4,112 @@ import java.security.MessageDigest; /** * MD5加密算法 + * 该类提供了基于MD5算法对字符串进行加密的功能,主要用于对敏感信息(如密码等)进行加密处理,增强数据的安全性。 + * 其中包含了一些辅助方法用于字节数组与十六进制字符串之间的转换等操作,最终对外提供了以UTF-8编码进行MD5加密的便捷方法。 */ - public class MD5Util { + /** + * 将字节数组转换为十六进制字符串的方法 + * 该方法遍历传入的字节数组,逐个将字节转换为对应的十六进制表示形式,并拼接成一个完整的十六进制字符串返回。 + * + * @param b 要转换的字节数组,通常是经过MD5摘要算法处理后得到的字节数组结果。 + * @return 返回一个由字节数组转换而来的十六进制字符串,用于后续表示加密后的结果等用途。 + */ private static String byteArrayToHexString(byte b[]) { + // 创建一个StringBuffer对象,用于高效地拼接字符串,存储最终转换后的十六进制字符串结果。 StringBuffer resultSb = new StringBuffer(); + // 遍历字节数组中的每个字节 for (int i = 0; i < b.length; i++) + // 调用byteToHexString方法将每个字节转换为十六进制字符串,并添加到resultSb中 resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } + /** + * 将单个字节转换为十六进制字符串的方法 + * 该方法先对传入的字节进行处理(如果是负数则转换为正数范围),然后将其拆分为高4位和低4位,分别对应十六进制的一位, + * 通过查找预定义的十六进制字符数组,获取对应的十六进制字符并拼接成一个两位的十六进制字符串返回。 + * + * @param b 要转换的单个字节。 + * @return 返回一个表示该字节的十六进制字符串,长度为2位。 + */ private static String byteToHexString(byte b) { + // 将字节转换为整数,如果字节值是负数(Java中字节是有符号的,范围是 -128 到 127),则通过加上256将其转换为正数范围(0 到 255),便于后续计算。 int n = b; if (n < 0) n += 256; + // 获取该整数的高4位,用于对应十六进制的高位数字,通过除以16来得到(十六进制中每一位代表16的幂次,高4位对应的幂次为1)。 int d1 = n / 16; + // 获取该整数的低4位,用于对应十六进制的低位数字,通过取模16来得到。 int d2 = n % 16; + // 从预定义的十六进制字符数组中查找对应的字符,拼接成十六进制字符串返回,高4位在前,低4位在后。 return hexDigits[d1] + hexDigits[d2]; } /** * 返回大写MD5 + * 该方法实现了对给定字符串进行MD5加密,并将结果转换为大写形式返回的功能。 + * 可以根据是否指定字符编码来处理字符串转换字节数组的操作,然后通过MessageDigest类获取MD5摘要信息,并进一步转换为十六进制字符串表示。 + * + * @param origin 要进行MD5加密的原始字符串,通常是需要加密的文本信息(如密码等)。 + * @param charsetname 指定的字符编码名称,用于将字符串转换为字节数组时使用,如果为null或空字符串则使用默认编码(通常是平台默认编码)。 + * @return 返回经过MD5加密后的大写十六进制字符串结果,如果在加密过程中出现异常,则返回null(当前代码中只是简单捕获异常,未做详细处理)。 */ private static String MD5Encode(String origin, String charsetname) { String resultString = null; try { + // 先将传入的原始字符串赋值给结果字符串变量,这里可以根据实际需求考虑是否进行深拷贝等更严谨的处理(当前代码只是简单赋值)。 resultString = new String(origin); + // 获取MD5算法的MessageDigest实例,用于进行MD5摘要计算,通过传入"MD5"字符串指定使用MD5算法。 MessageDigest md = MessageDigest.getInstance("MD5"); + // 如果未指定字符编码或者字符编码为空字符串,则使用默认方式将字符串转换为字节数组后进行MD5摘要计算,再将摘要结果转换为十六进制字符串。 if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString.getBytes())); else + // 如果指定了字符编码,则按照指定的字符编码将字符串转换为字节数组,然后进行MD5摘要计算,并转换为十六进制字符串。 resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); } catch (Exception exception) { + // 当前代码只是简单捕获异常,未做详细的异常处理(如记录日志、抛出更具体的异常等),实际应用中可根据需求完善此处逻辑。 } return resultString.toUpperCase(); } + /** + * 以UTF-8编码进行MD5加密的方法 + * 该方法是对外提供的方便调用的接口,默认使用UTF-8编码调用MD5Encode方法对传入的原始字符串进行加密,并返回加密后的结果(大写形式)。 + * 此处还预留了盐值(Salt)加密的代码逻辑(当前被注释掉了),盐值加密可以进一步增强加密的安全性,防止简单的MD5彩虹表攻击等情况。 + * + * @param origin 要进行MD5加密的原始字符串,通常是需要加密的文本信息(如密码等)。 + * @return 返回经过UTF-8编码的MD5加密后的大写十六进制字符串结果。 + */ public static String MD5EncodeUtf8(String origin) { - //盐值Salt加密 - //origin = origin + PropertiesUtil.getProperty("password.salt", ""); + // 盐值Salt加密 + // 以下代码是预留的盐值加密逻辑,通过从配置文件(PropertiesUtil.getProperty方法调用,此处未展示该类的实现)中获取盐值, + // 将盐值添加到原始字符串后面再进行MD5加密,可以使相同的原始字符串在不同的盐值情况下加密结果不同,增强安全性。 + // 当前代码将其注释掉了,如果需要启用盐值加密,可取消注释并确保配置文件读取等相关逻辑正确实现。 + // origin = origin + PropertiesUtil.getProperty("password.salt", ""); + return MD5Encode(origin, "utf-8"); } + // 预定义的十六进制字符数组,用于在字节转换十六进制字符串时查找对应的字符表示,按照十六进制的顺序排列,从0到f。 private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; + /** + * 主方法,用于测试MD5加密功能 + * 该方法创建了MD5Util类的实例(实际上不需要创建实例也可以调用静态方法,这里只是一种简单的测试写法), + * 然后调用MD5EncodeUtf8方法对字符串"123456"进行MD5加密,并将加密结果输出到控制台,方便查看加密后的效果。 + * + * @param args 命令行参数,在当前测试场景下未使用。 + */ public static void main(String[] args) { MD5Util md = new MD5Util(); String psd = md.MD5EncodeUtf8("123456"); System.out.println(psd); } -} - +} \ No newline at end of file