本文主要介绍小学期代码的部分重要函数,源码地址:https://github.com/NagisaG/Museum-Final.git,项目网址:http://120.46.179.195:8888/guest/artifact/index,第一次尝试搭建网站,如有问题,请多多指教。
Controller
web配置
1 | package com.museum.Interceptor; |
这段代码是一个Java类,名为WebMvcConfig,它实现了WebMvcConfigurer接口。这个类主要用于配置Spring MVC框架的一些行为和功能。下面是它的功能介绍:
拦截器配置:
通过重写addInterceptors方法,将一个名为CustomerInterceptor的拦截器添加到拦截器注册表中。
使用.addPathPatterns(“/“)指定了需要拦截的路径模式,即对所有请求进行拦截。
使用.excludePathPatterns排除了一些不需要拦截的路径,包括
/checkLogin/tologin、/checkLogin/dopost、/museum/findall、/static/、/css/、/images/和/js/**。静态资源处理器配置:
通过重写addResourceHandlers方法,配置了静态资源的处理器。
使用.addResourceHandler(“/static/**”)指定了对以/static/开头的请求进行处理。
使用.addResourceLocations(“classpath:/static/“)指定了静态资源所在的路径,这里是在classpath下的/static/目录。跨域请求配置:
通过重写addCorsMappings方法,配置了跨域请求的设置。
使用.addMapping(“/**”)指定了允许跨域请求的路径模式,这里是对所有请求都进行跨域配置。
使用.allowedOrigins(“http:localhost:8888”)指定了允许跨域请求的来源,这里是允许来自http://localhost:8888的请求。
总体来说,这段代码的功能是配置拦截器、静态资源处理器和跨域请求设置,以满足具体的需求,例如进行登录验证、处理静态资源和允许特定来源的跨域请求。
管理员控制器
1 | package com.museum.controller; |
控制器类AdminController
中定义的各个方法的功能如下:
getAdminWithPermissin(String username)
: 根据用户名获取具有权限的管理员对象,并返回该对象。内部通过调用adminService.getAdminWithPermissin(username)
实现。judgePermission(HttpServletRequest request)
: 判断当前用户是否具有足够的权限。通过从会话中获取用户名,并获取该用户的权限进行比较。内部通过调用adminService.getAdminWithPermissin(username)
获取管理员对象,并比较其权限是否为”一级”。findAllAdmins(Model model, HttpServletRequest request)
: 获取所有管理员的列表并返回视图。如果当前用户具有足够的权限,则调用adminService.findAllAdmins()
获取管理员列表,并将列表添加到Model中,返回视图”adminindex”。否则,将错误消息添加到Model中,返回视图”public/false”。insertAdmin(Admin admin, Model model, HttpServletRequest request)
: 插入新的管理员信息。如果当前用户具有足够的权限,则调用adminService.insertAdmin(admin)
将新管理员插入数据库。如果插入成功,获取所有管理员列表并添加到Model中,返回视图”admin/adminlist”。如果权限不足,将错误消息添加到Model中,返回视图”public/false”。toupdate(String username, Model model, HttpServletRequest request)
: 根据用户名获取指定管理员信息,并返回视图以便更新管理员信息。如果当前用户具有足够的权限,则通过调用adminService.findAdminByUsername(username)
获取指定用户名的管理员对象,将该对象添加到Model中,返回视图”admin/updateadmin”。如果权限不足,将错误消息添加到Model中,返回视图”public/false”。updateAdmin(Admin admin, Model model, HttpServletRequest request)
: 更新管理员信息。如果当前用户具有足够的权限,则调用adminService.updateAdmin(admin)
更新管理员信息。如果更新成功,获取所有管理员列表并添加到Model中,返回视图”adminindex”。如果更新失败,将错误消息添加到Model中,返回视图”public/false”。findAdminByUsername(String searchStr, Model model, HttpServletRequest request)
: 根据用户名查询管理员信息。如果当前用户具有足够的权限,则调用adminService.findAdminByUsername(searchStr)
根据用户名搜索管理员,并将结果添加到Model中,返回视图”admin/adminlist”。如果没有找到匹配的结果,将错误消息添加到Model中,返回视图”public/false”。findAdminByPermission(String permission, Model model, HttpServletRequest request)
: 根据权限查询管理员信息。如果当前用户具有足够的权限,则调用adminService.findAdminByPermission(permission)
根据权限搜索管理员,并将结果添加到Model中,返回视图”admin/adminlist”。如果没有找到匹配的结果,将错误消息添加到Model中,返回视图”public/false”。deleteAdminByName(String username, Model model, HttpServletRequest request)
: 根据用户名删除管理员信息。如果当前用户具有足够的权限,则调用adminService.deleteAdminByName(username)
根据用户名删除管理员。如果删除成功,获取所有管理员列表并添加到Model中,返回视图”admin/adminlist”。如果没有找到匹配的结果,将错误消息添加到Model中,返回视图”public/false”。
10.deleteAdmins(String[] usernames, Model model, HttpServletRequest request)
: 根据用户名数组批量删除管理员信息。如果当前用户具有足够的权限,则调用adminService.deleteAdmins(usernames)
根据用户名数组删除管理员。如果删除成功,获取所有管理员列表并添加到Model中,返回视图”admin/adminlist”。如果没有找到匹配的结果,将错误消息添加到Model中,返回视图”public/false”。
这些方法用于处理具体的请求,包括获取管理员信息、插入新管理员、更新管理员信息、删除管理员信息、查询管理员等操作,并根据当前用户的权限进行验证和处理。
管理员管理文物
1 | package com.museum.controller; |
这是一个名为ArtifactAdminController
的控制器类,处理与文物管理相关的请求。下面是每个函数的功能:
toIndex()
: 跳转到系统首页的请求处理函数,返回视图”index”。toInsert()
: 跳转到添加文物页面的请求处理函数,返回视图”artifact/insertartifact”。insertArtifact(Artifact artifact, Model model)
: 处理添加文物信息的请求。调用artifactAdminService.insertArtifact(artifact)
方法将文物信息插入数据库。如果插入成功,获取所有文物列表并添加到Model中,返回视图”artifact/artifact”。如果插入失败,返回视图”public/false”。findAllArtifacts(Model model)
: 查询所有文物的请求处理函数。调用artifactAdminService.findAllArtifacts()
方法获取所有文物列表,并将列表添加到Model中,返回视图”artifact/artifactlist”。findArtifactByStr(String searchStr, Model model)
: 处理根据关键词模糊查询文物的请求。调用artifactAdminService.findArtifactByStr(searchStr)
方法根据关键词搜索文物,并将结果添加到Model中,返回视图”artifact/artifactlist”。findArtifactByName(String name)
: 处理根据文物名称准确查找文物的请求。调用artifactAdminService.findArtifactByName(name)
方法根据名称查找文物,并返回查找到的文物对象。toupdate(String name, Model model)
: 跳转到文物修改页面的请求处理函数。调用artifactAdminService.findArtifactByName(name)
方法根据名称获取指定文物对象,将该对象添加到Model中,返回视图”artifact/updateartifact”。updateArtifact(Artifact artifact, Model model)
: 处理修改文物信息的请求。调用artifactAdminService.updateArtifact(artifact)
方法更新文物信息。如果更新成功,获取所有文物列表并添加到Model中,返回视图”artifact/artifactlist”。如果更新失败,返回视图”public/false”。deleteArtifactByName(String name, Model model)
: 处理根据文物名称删除文物的请求。调用artifactAdminService.deleteArtifactByName(name)
方法根据名称删除文物。如果删除成功,获取所有文物列表并添加到Model中,返回视图”artifact/artifactlist”。如果删除失败,返回视图”public/false”。
10.deleteArtifacts(String[] names, Model model)
: 处理批量删除文物的请求。调用artifactAdminService.deleteArtifacts(names)
方法根据名称数组批量删除文物。如果删除成功,获取所有文物列表并添加到Model中,返回视图”artifact/artifactlist”。如果删除失败,返回视图”public/false”。
11.uploadArtifactExcel(MultipartFile file)
: 处理上传文物Excel文件的请求。检查文件是否为空,然后检查文件类型是否为.xlsx后缀。将MultipartFile对象转换为InputStream,并创建ExcelParser对象。调用ExcelParser对象的parseExcel()
方法解析Excel文件,并将解析后的文物列表保存到数据库。如果文物已存在,则更新文物信息;如果文物不存在,则插入新的文物信息。最后返回相应的上传结果信息。
登录认证
1 | package com.museum.controller; |
doGet(HttpServletRequest request, HttpServletResponse response)
: 该方法处理GET请求,用于用户访问”/user/adminindex”路径时执行的逻辑。它首先获取当前会话(session)中的”username”属性,如果该属性存在(即用户已登录),则重定向到”/adminindex”路径;否则,重定向到”/checkLogin/tologin”路径,即跳转到登录页面。doPost(HttpServletRequest request, HttpServletResponse response)
: 该方法处理POST请求,调用了doGet()
方法,实现了对POST请求的统一处理,即与GET请求相同的逻辑。
总体来说,这两个方法主要用于用户登录状态的验证和跳转逻辑。当用户访问”/user/adminindex”路径时,会根据用户是否已登录来进行相应的页面跳转。如果已登录,则重定向到管理员首页”/adminindex”;如果未登录,则重定向到登录页面”/checkLogin/tologin”。
登录判断界面
1 | package com.museum.controller; |
tologin(): 该方法返回一个字符串”login”,用于指定跳转到登录页面。当用户访问”/checkLogin/tologin”路径时,会调用该方法返回登录页面的视图。
doGet(HttpServletRequest request, HttpServletResponse response): 该方法处理GET请求,用于用户提交登录表单时执行的逻辑。它首先从请求参数中获取用户名(username)和密码(password),然后调用aLogInService.logInSearch(username, password)方法进行登录验证。
- 如果登录验证成功,即adminList列表的大小不为0,表示用户名和密码正确,将用户名存储到会话(session)中的”username”属性,并设置会话的最大非活动时间为1天(60 * 60 * 24秒)。最后,重定向到”/user/adminindex”路径,即跳转到管理员首页。
- 如果登录验证失败,即adminList列表的大小为0,表示用户名或密码错误,设置响应内容的编码格式为UTF-8,然后通过response.getWriter()方法获取PrintWriter对象,输出错误信息和重新登录的链接。最后,用户将看到错误提示并可以点击链接返回登录页面。
doPost(HttpServletRequest request, HttpServletResponse response): 该方法处理POST请求,调用了doGet()方法,实现了对POST请求的统一处理,即与GET请求相同的逻辑。此外,还设置了会话(session)中的”isLogged”属性为true,表示用户已登录。
总体来说,这个类的主要功能是处理用户的登录请求。当用户访问”/checkLogin/tologin”路径时,会返回登录页面。当用户提交登录表单时,会进行用户名和密码的验证。验证成功后,将用户名存储到会话中并重定向到管理员首页;验证失败后,返回错误提示并可以重新登录。同时,POST请求的处理与GET请求相同,并设置会话中的”isLogged”属性为true,表示用户已登录。
管理员博物馆控制
1 | package com.museum.controller; |
这个类是一个控制器(Controller),主要用于处理与博物馆相关的请求。以下是每个方法的功能:
- toIndex(): 跳转到系统首页,返回字符串”index”,用于指定跳转到名为”index”的视图页面。
- findAllMuseums(Model model): 查询所有博物馆信息,并将结果存储在Model对象中。通过调用museumService.findAllMuseums()方法获取博物馆列表,并将列表添加到Model对象的属性”mlist”中。最后,返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。
- findMuseumByProvince(String province, Model model): 根据省份查询博物馆信息。通过调用museumService.findMuseumByProvince(province)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- findMuseumByName(String museum_name, Model model): 根据博物馆名称查询博物馆信息。通过调用museumService.findMuseumByName(museum_name)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- findMuseumByLevel(String level, Model model): 根据博物馆级别查询博物馆信息。通过调用museumService.findMuseumByLevel(level)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- findMuseumByType(String type, Model model): 根据博物馆类型查询博物馆信息。通过调用museumService.findMuseumByType(type)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- findMuseumByIsfree(String isfree, Model model): 根据是否免费查询博物馆信息。通过调用museumService.findMuseumByIsfree(isfree)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- findMuseumByStr(String searchStr, Model model): 根据关键词查询博物馆信息。通过调用museumService.findMuseumByStr(searchStr)方法获取符合条件的博物馆列表。如果列表的大小大于0,表示查询成功,将列表和一个”msg”属性添加到Model对象中,并返回字符串”museum/museumlist”,用于指定跳转到名为”museum/museumlist”的视图页面。如果列表的大小为0,表示查询失败,返回字符串”public/false”。
- deleteMuseumByName(String museum_name, Model model): 根据博物馆名称删除博物馆信息。通过调用museumService.deleteMuseumByName(museum_name)方法删除对应的博物馆信息。如果删除成功,重新查询所有博物馆信息并添加到Model对象中,然后返回字符串”Museum/museumlist”,用于指定跳转到名为”Museum/museumlist”的视图页面。如果删除失败,返回字符串”public/false”。
- toupdate(String username, Model model): 根据博物馆名称跳转到更新博物馆信息的页面。通过调用museumService.findMuseumByName(username)方法获取对应的博物馆信息,然后将第一个博物馆对象添加到Model对象中,最后返回字符串”museum/updatemuseum”,用于指定跳转到名为”museum/updatemuseum”的视图页面。
- updateMuseum(Museum museum, Model model): 更新博物馆信息。通过调用museumService.updateMuseum(museum)方法更新博物馆信息。如果更新成功,重新查询所有博物馆信息并添加到Model对象中,然后返回字符串”Museum/museumlist”,用于指定跳转到名为”Museum/museumlist”的视图页面。如果更新失败,返回字符串”public/false”。
- insertMuseum(Museum museum, Model model): 插入新的博物馆信息。通过调用museumService.insertMuseum(museum)方法插入新的博物馆信息。如果插入成功,重新查询所有博物馆信息并添加到Model对象中,然后返回字符串”Museum/museumlist”,用于指定跳转到名为”Museum/museumlist”的视图页面。如果插入失败,返回字符串”public/false”。
总体来说,这个类的功能是处理与博物馆相关的请求,包括查询、删除、更新和插入博物馆信息,并将结果存储在Model对象中,然后跳转到相应的视图页面展示结果。
管理员新闻控制类
1 | package com.museum.controller; |
这个类是一个控制器(Controller),主要用于处理与新闻相关的请求。以下是每个方法的功能:
- toIndex(): 跳转到系统首页,返回字符串”index”,用于指定跳转到名为”index”的视图页面。
- toInsert(): 跳转到插入新闻信息的页面,返回字符串”news/insertnews”,用于指定跳转到名为”news/insertnews”的视图页面。
- findAllNews(Model model): 查询所有新闻信息,并将结果存储在Model对象中。通过调用newsService.findAllNews()方法获取新闻列表,并将列表添加到Model对象的属性”nlist”中。最后,返回字符串”news/newslist”,用于指定跳转到名为”news/newslist”的视图页面。
- findNewsByStr(String searchStr, Model model): 根据关键词查询新闻信息。通过调用newsService.findNewsByStr(searchStr)方法获取符合条件的新闻列表,并将列表添加到Model对象的属性”nlist”中。最后,返回字符串”news/newslist”,用于指定跳转到名为”news/newslist”的视图页面。
- findNewsByTitle(String title, Model model): 根据新闻标题查询新闻信息。通过调用newsService.findNewsByTitle(title)方法获取符合条件的新闻列表。如果列表的大小大于0,表示查询成功,将列表添加到Model对象的属性”nlist”中,并返回字符串”news/newslist”,用于指定跳转到名为”news/newslist”的视图页面。如果列表的大小为0,表示查询失败,将错误信息添加到Model对象的属性”msg”中,然后返回字符串”public/false”。
- deleteNewsByTitle(String title, Model model): 根据新闻标题删除新闻信息。通过调用newsService.deleteNewsByTitle(title)方法删除对应的新闻信息。如果删除成功,重新查询所有新闻信息并添加到Model对象中,然后将成功信息添加到Model对象的属性”msg”中,最后返回字符串”news/newslist”,用于指定跳转到名为”news/newslist”的视图页面。如果删除失败,将错误信息添加到Model对象的属性”msg”中,然后返回字符串”public/false”。
- insertNews(News news, Model model): 插入新的新闻信息。通过调用newsService.insertNews(news)方法插入新的新闻信息。如果插入成功,重新查询所有新闻信息并添加到Model对象中,然后将成功信息添加到Model对象的属性”msg”中,最后返回字符串”news/newslist”,用于指定跳转到名为”news/newslist”的视图页面。如果插入失败,将错误信息添加到Model对象的属性”msg”中,然后返回字符串”public/false”。
- uploadArtifactExcel(MultipartFile file): 处理上传的新闻Excel文件。首先检查文件是否为空,然后检查文件类型是否为.xlsx格式。接下来将MultipartFile对象转换为InputStream,并使用ExcelNews对象解析Excel文件,获取新闻对象列表。然后逐个处理解析后的新闻对象列表,判断新闻是否已存在。如果新闻已存在,调用newsService.updateNews(news)方法更新新闻信息;如果新闻不存在,调用newsService.insertNews(news)方法插入新的新闻信息。最后返回上传结果的字符串。
总体来说,这个类的功能是处理与新闻相关的请求,包括查询、删除、更新和插入新闻信息,并将结果存储在Model对象中,然后跳转到相应的视图页面展示结果。另外,还提供了上传新闻Excel文件的功能。
拦截器
1 | package com.museum.Interceptor; |
这是一个实现了HandlerInterceptor接口的拦截器类,用于进行用户认证和日志记录。
- preHandle方法在请求处理之前进行拦截。它首先获取当前会话的HttpSession对象,并打印出session中的”username”属性。然后检查”username”是否存在,如果存在则返回true,表示允许请求继续执行;如果不存在,则通过response.sendRedirect()方法将请求重定向到登录页面,并返回false,表示拦截请求。注释掉的代码response.resetBuffer()可以用于重置响应缓冲区。
- postHandle方法在请求处理之后、视图渲染之前调用。在这个拦截器中,该方法没有实现具体的逻辑,只是简单地打印一条调试信息。
- afterCompletion方法在请求处理完成后调用,包括视图渲染完成。在该方法中,首先获取存放日志的目录位置(logdir),如果目录不存在,则创建目录。然后获取日志文件路径(logfile),并创建一个用于追加写入的BufferedWriter对象。接下来,判断用户是否已登录,如果是,则获取登录用户名、用户IP地址和用户代理信息,并将这些信息拼接成一条日志消息。最后,将日志消息写入日志文件,关闭写入流。
总体来说,这个拦截器用于检查用户是否已登录,并根据登录状态进行相应的操作。在用户登录时,记录用户登录信息到日志文件中。这个拦截器可以用于实现用户认证和日志记录的功能。
监听器
1 |
|
这是一个实现了HttpSessionBindingListener接口的监听器类,用于在线用户管理。
- OnlineUserBindingListener方法是一个自定义的构造方法,用于接收用户名参数并进行初始化。
- valueBound方法在绑定到HttpSession时调用。在该方法中,首先获取当前会话的HttpSession对象和ServletContext对象。然后从ServletContext中获取在线用户列表(onlineUserList),如果列表为空,则进行初始化。接下来,将当前用户名(this.username)添加到在线用户列表中,并打印在线用户列表。
- valueUnbound方法在从HttpSession解绑时调用。在该方法中,首先获取当前会话的HttpSession对象和ServletContext对象。然后从ServletContext中获取在线用户列表(onlineUserList),并从列表中移除当前用户名(this.username)。最后,打印当前用户名退出的消息。
总体来说,这个监听器用于在用户登录时将用户名添加到在线用户列表中,在用户退出时将用户名从在线用户列表中移除。在线用户列表存储在ServletContext中,可以在应用程序范围内共享。该监听器可以用于实现在线用户管理的功能。