基于javaweb+mysql的jsp+servlet宿舍管理系统(超级管理员、宿舍管理员、学生)

基于javaweb+mysql的jsp+servlet宿舍管理系统(超级管理员、宿舍管理员、学生)

基于javaweb+mysql的jsp+servlet宿舍管理系统(超级管理员、宿舍管理员、学生)(java+jsp+servlet+javabean+mysql+tomcat)

运行环境

Java 8、MySQL 5.7、Tomcat 8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

超级管理员:登录退出、宿舍管理员管理、学生管理、宿舍楼管理、缺勤管理、修改密码

宿舍管理员:登录退出、学生管理、缺勤管理

学生:登录退出、缺勤查看

超级管理员

宿舍管理员

学生

技术框架

JSP Servlet MySQL JDBC Tomcat CSS JavaScript

基于javaweb+mysql的JSP+Servlet宿舍管理系统(超级管理员、宿舍管理员、学生)(java+jsp+servlet+javabean+mysql+tomcat)

httpServletRequest.getSession().setAttribute("session_user", user);chain.doFilter(httpServletRequest, response);}else if(requestUrI.startsWith(path+"/student.action") amp;amp; amp;amp; !roleId.equals(2)) {//当用户发送的请求是学生模块的请求时,只有当前用户角色不是学生就放行httpServletRequest.getSession().setAttribute("session_user", user);chain.doFilter(httpServletRequest, response);}else if(requestUrI.startsWith(path+"/record.action") ||requestUrI.startsWith(path+"/password.action")||requestUrI.startsWith(path+"/loginOut.action")||requestUrI.startsWith(path+"/index.action")) {//当用户发送的请求是考勤、修改密码、退出模块的请求时,不管用户的角色是什幺,都放行httpServletRequest.getSession().setAttribute("session_user", user);chain.doFilter(httpServletRequest, response);}else {httpServletRequest.getRequestDispatcher("/index.jsp").forward(httpServletRequest, response);}}/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}}/*** Servlet implementation class LoginServlet*/@WebServlet("/login")public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;

String keyword = request.getParameter("keyword");//当前要查询的页面String pageIndex = request.getParameter("pageIndex");System.out.println("dormBuildId:"+dormBuildId+" searchType:"+searchType+" keyword:"+keyword);//默认查询第一页,需两个参数,当前页码pageIndex,每页展示的条数 PageModel pageModel = new PageModel();if(pageIndex != null amp;amp; amp;amp; !pageIndex.equals("")) {pageModel.setPageIndex(Integer.parseInt(pageIndex));}List amp;lt;User amp;gt; students = userService.findStudent(dormBuildId,searchType,keyword,user,pageModel);//获取查询处理的总数量Integer totalNum = userService.findTotalNum(dormBuildId,searchType,keyword,user);System.out.println("totalNum:"+totalNum);System.out.println("students:"+students);request.setAttribute("totalNum", totalNum);request.setAttribute("pageIndex", pageModel.getPageIndex());request.setAttribute("dormBuildId", dormBuildId);request.setAttribute("searchType", searchType);request.setAttribute("keyword", keyword);request.setAttribute("students", students);request.setAttribute("mainRight", "/WEB-INF/jsp/studentList.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp; action.equals("preAdd")) {//根据用户角色查询宿舍楼进行添加学生,//如当前用户 为宿舍管理员,他只能添加学生到其管理的宿舍楼//跳转到学生的添加页面request.setAttribute("mainRight", "/WEB-INF/jsp/studentAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp; action.equals("save")) {//保存学生String stuCode = request.getParameter("stuCode");String name = request.getParameter("name");String sex = request.getParameter("sex");String tel = request.getParameter("tel");String passWord = request.getParameter("passWord");String dormBuildId= request.getParameter("dormBuildId");String dormCode = request.getParameter("dormCode");System.out.println("stuCode:"+stuCode+" name:"+name+" sex:"+sex+" tel:"+tel+" passWord:"+passWord+" dormBuildId:"+dormBuildId+" dormCode:"+dormCode);

}}else {//保存if(dormBuild != null) {//当前用户输入的宿舍楼名已存在//表示跳转到宿舍楼添加页面request.setAttribute("error", "当前宿舍楼名已存在,请重新输入!");request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else {//当前用户输入的宿舍楼名不存在,则保存用户输入的信息到数据库DormBuild build = new DormBuild();build.setName(name);build.setRemark(remark);build.setDisabled(0);dormBuildService.save(build);//保存完成,跑到宿舍楼管理列表页,查询所有宿舍楼List amp;lt;DormBuild amp;gt; builds = dormBuildService.find();//查询所有的宿舍楼,在select中遍历List amp;lt;DormBuild amp;gt; buildSelects = dormBuildService.find();request.setAttribute("buildSelects", buildSelects);request.setAttribute("builds", builds);request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildList.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}}}else if(action != null amp;amp; action.equals("preUpdate")) {//根据宿舍楼id,查询宿舍楼DormBuild build = dormBuildService.findById(Integer.parseInt(id));//保存宿舍楼信息,到前端页面展示request.setAttribute("build", build);//跳转到宿舍楼修改页面request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp; action.equals("deleteOrAcive")) {//删除或激活String disabled = request.getParameter("disabled");DormBuild dormBuild = dormBuildService.findById(Integer.parseInt(id));System.out.println("更新前dormBuild:"+dormBuild);dormBuild.setDisabled(Integer.parseInt(disabled));System.out.println("更新后dormBuild:"+dormBuild);

//如当前用户 为宿舍管理员,他只能添加学生到其管理的宿舍楼//跳转到学生的添加页面request.setAttribute("mainRight", "/WEB-INF/jsp/studentAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp; action.equals("save")) {//保存学生String stuCode = request.getParameter("stuCode");String name = request.getParameter("name");String sex = request.getParameter("sex");String tel = request.getParameter("tel");String passWord = request.getParameter("passWord");String dormBuildId= request.getParameter("dormBuildId");String dormCode = request.getParameter("dormCode");System.out.println("stuCode:"+stuCode+" name:"+name+" sex:"+sex+" tel:"+tel+" passWord:"+passWord+" dormBuildId:"+dormBuildId+" dormCode:"+dormCode);//未存在,则保存User student = userService.findByStuCode(stuCode);if(id != null amp;amp; amp;amp; !id.equals("")) {//更新之前,查询数据库是否已经存在当前学号的学生,如已存在,则跳转到添加页面if(student != null amp;amp; amp;amp; !student.getId().equals(Integer.parseInt(id))) {System.out.println("根据学生学号查询student:"+student);//当前学号的学生已存在,请重新修改,跳转到该学生的修改页面request.getRequestDispatcher("/student.action?action=preUpdate amp;amp;id="+id).forward(request, response);;}else {//更新User studentUpdate = userService.findById(Integer.parseInt(id));studentUpdate.setStuCode(stuCode);studentUpdate.setSex(sex);studentUpdate.setTel(tel);studentUpdate.setName(name);studentUpdate.setPassWord(passWord);studentUpdate.setDormBuildId(Integer.parseInt(dormBuildId));studentUpdate.setDormCode(dormCode);userService.updateStudent(studentUpdate);response.sendRedirect(getServletContext().getContextPath()+"/student.action?action=list");}}else {//保存if(student != null) {//在保存之前,查询数据库是否已经存在当前学号的学生,如已存在,则跳转到添加页面response.sendRedirect(getServletContext().getContextPath()+"/student.action?action=preAdd");}else {User user2 = new User();user2.setStuCode(stuCode);user2.setSex(sex);user2.setTel(tel);

}}/*** Servlet implementation class RecordServlet*/@WebServlet("/record.action")public class RecordServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public RecordServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)*/protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("====record.action========");//在tomcat8.0中,如果是post请求,传递过来的中文可能会出现乱码问题 request.setCharacterEncoding("utf-8");

UserService userService = new UserServiceImpl();RecordService recordService = new RecordServiceImpl();DormBuildService buildService = new DormBuildServiceImpl();if(action != null amp;amp; action.equals("list")) {//查询缺勤记录并展示Integer roleId = userCurr.getRoleId();List amp;lt;DormBuild amp;gt; builds = new ArrayList amp;lt;DormBuild amp;gt;();if(roleId.equals(0)) {//如当前用户是超级管理员,他能将学生添加到所有的宿舍楼,查询所有宿舍楼builds = buildService.findAll();}else if(roleId.equals(1)) {//如当前用户 为宿舍管理员,他只能添加学生到其管理的宿舍楼builds = buildService.findByUserId(userCurr.getId());}System.out.println("builds:"+builds);request.setAttribute("builds", builds);String startDate = request.getParameter("startDate");String endDate = request.getParameter("endDate");String dormBuildId = request.getParameter("dormBuildId");String searchType = request.getParameter("searchType");String keyword = request.getParameter("keyword");String pageIndex = request.getParameter("pageIndex");System.out.println("startDate:"+startDate+" endDate:"+endDate+" dormBuildId:"+dormBuildId+" searchType:"+searchType+" keyword:"+keyword+" pageIndex:"+pageIndex);//默认查询第一页,需两个参数,当前页码pageIndex,每页展示的条数 PageModel pageModel = new PageModel();if(pageIndex != null amp;amp; amp;amp; !pageIndex.equals("")) {pageModel.setPageIndex(Integer.parseInt(pageIndex));}//分页查询考勤记录List amp;lt;Record amp;gt; records = recordService.findRecords(startDate,endDate,dormBuildId,searchType,keyword,userCurr,pageModel);System.out.println("records:"+records);//获取查询结果总数Integer totalNum = recordService.getToTalNum(startDate,endDate,dormBuildId,searchType,keyword,userCurr);System.out.println("totalNum:"+totalNum);request.setAttribute("totalNum", totalNum);request.setAttribute("startDate", startDate);request.setAttribute("endDate", endDate);request.setAttribute("dormBuildId", dormBuildId);request.setAttribute("searchType", searchType);request.setAttribute("keyword", keyword);request.setAttribute("pageIndex", pageModel.getPageIndex());request.setAttribute("records", records);

DormBuild dormBuild = dormBuildService.findByName(name);System.out.println("dormBuild:"+dormBuild);if(id != null amp;amp;amp; amp;amp;amp; !id.equals("")) {//更新if(dormBuild != null amp;amp;amp; amp;amp;amp; !dormBuild.getId().equals(Integer.parseInt(id))) {//表示跳转到宿舍楼添加页面request.setAttribute("error", "当前宿舍楼名已存在,请重新输入!");//根据宿舍楼id,查询宿舍楼DormBuild build = dormBuildService.findById(Integer.parseInt(id));//保存宿舍楼信息,到前端页面展示request.setAttribute("build", build);request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else {dormBuild = dormBuildService.findById(Integer.parseInt(id));dormBuild.setName(name);dormBuild.setRemark(remark);//执行更新dormBuildService.update(dormBuild);//更新完成,跑到宿舍楼管理列表页,查询所有宿舍楼List amp;amp;lt;DormBuild amp;amp;gt; builds = dormBuildService.find();//查询所有的宿舍楼,在select中遍历List amp;amp;lt;DormBuild amp;amp;gt; buildSelects = dormBuildService.find();request.setAttribute("buildSelects", buildSelects);request.setAttribute("builds", builds);request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildList.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}}else {//保存if(dormBuild != null) {//当前用户输入的宿舍楼名已存在//表示跳转到宿舍楼添加页面request.setAttribute("error", "当前宿舍楼名已存在,请重新输入!");request.setAttribute("mainRight", "/WEB-INF/jsp/dormBuildAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);

String oldPassWord = request.getParameter("oldPassWord");//当前登录的用户原始密码String passWord = userCur.getPassWord();if(!passWord.equals(oldPassWord)) {response.setCharacterEncoding("utf-8");PrintWriter writer = response.getWriter();writer.print("您输入的原始密码错误,请重新输入!");}}else if(action != null amp;amp;amp; amp;amp;amp; action.equals("change")) {//修改密码String newPassword = request.getParameter("newPassword");userCur.setPassWord(newPassword);userService.updatePassWord(userCur);System.out.println("修改密码userCur:"+userCur);request.getRequestDispatcher("/index.jsp").forward(request, response);}}}/*** Servlet implementation class LoginOutServlet*/@WebServlet("/loginOut.action")public class LoginOutServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public LoginOutServlet() {super();// TODO Auto-generated constructor stub}

request.setAttribute("searchType", searchType);request.setAttribute("keyword", keyword);request.setAttribute("users", users);request.setAttribute("mainRight", "dormManagerList.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp;amp; action.equals("preAdd")) {//跳转到宿舍管理员添加页面request.setAttribute("mainRight", "dormManagerAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp;amp; action.equals("save")) {System.out.println("======保存宿舍管理员=========");String name = request.getParameter("name");String passWord = request.getParameter("passWord");String sex = request.getParameter("sex");String tel = request.getParameter("tel");//获取复选框中用户选中的宿舍楼String[] dormBuildIds = request.getParameterValues("dormBuildId");System.out.println("name:"+name+" pass:"+passWord+" sex:"+sex+" tel:"+tel+" dormBuildIds:"+Arrays.toString(dormBuildIds));if(id == null || id.equals("")) {//保存User user = new User(name, passWord, sex, tel, null, 1);user.setDisabled(0);//当前登录的用户User user2 = (User) request.getSession().getAttribute("session_user");user.setCreateUserId(user2.getId());userService.saveManager(user,dormBuildIds);System.out.println("getServletContext().getContextPath():"+getServletContext().getContextPath());}else {//修改//通过宿舍管理员ID获取宿舍管理员User user = userService.findById(Integer.parseInt(id));user.setName(name);user.setPassWord(passWord);user.setSex(sex);user.setTel(tel);userService.updateManager(user);//修改还需修改宿舍管理员与宿舍楼的中间表//① 删除当前宿舍管理员管理的所有宿舍楼buildService.deleteByUserId(user.getId());//② 新增当前宿舍管理员管理的所有宿舍楼 buildService.saveManagerAndBuild(user.getId(),dormBuildIds);}

User user = userService.findById(Integer.parseInt(id));//根据宿舍管理员ID获取宿舍管理员管理的楼栋List amp;amp;lt;DormBuild amp;amp;gt; userBuilds = buildService.findByUserId(user.getId());user.setDormBuilds(userBuilds);System.out.println("user:"+user);List amp;amp;lt;Integer amp;amp;gt; userBuildids = new ArrayList amp;amp;lt; amp;amp;gt;();//遍历当前宿舍管理员管理的所有宿舍,获取当时当前宿舍管理员管理的所有宿舍IDfor (DormBuild userBuild : userBuilds) {userBuildids.add(userBuild.getId());}request.setAttribute("userBuildids", userBuildids);request.setAttribute("user", user);request.setAttribute("mainRight", "dormManagerAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp;amp; action.equals("deleteOrAcive")) {//删除或激活String disabled =request.getParameter("disabled");//通过宿舍管理员ID获取宿舍管理员User user = userService.findById(Integer.parseInt(id));user.setDisabled(Integer.parseInt(disabled));userService.updateManager(user);//跳转到宿舍管理员列表页,查看所有的宿舍管理员//重定向,请求链断开,不能在下一个servlet或jsp中获取保存在request中的参数response.sendRedirect(getServletContext().getContextPath()+"/dormManager.action?action=list");}}}/**

/*** Servlet implementation class RecordServlet*/@WebServlet("/record.action")public class RecordServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public RecordServlet() {super();// TODO Auto-generated constructor stub}

/*** 该过滤器拦截所有以.action的请求*/@WebFilter("*.action")public class LoginFilter implements Filter {/*** Default constructor. */public LoginFilter() {// TODO Auto-generated constructor stub}/*** @see Filter#destroy()*/public void destroy() {// TODO Auto-generated method stub}/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("------------登录拦截器------------");HttpServletRequest httpServletRequest = (HttpServletRequest) request;HttpSession session = httpServletRequest.getSession();//①获取登录后保存在session中的用户信息User user = (User) session.getAttribute("session_user");System.out.println("session user:"+user);

public class LoginOutServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public LoginOutServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)*/protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("========退出==========");//清除保存在session中的用户信息request.getSession().removeAttribute("session_user");//清除保存在cookie中的用户信息//根据名字查找保存当前项目的学号和密码Cookie cookie = CookieUtil.getCookieByName(request,"cookie_name_pass");if(cookie != null) {//设计cookie有效时间0 ,马上失效cookie.setMaxAge(0);//设置cookie作用范围cookie.setPath(request.getContextPath());System.out.println("request.getContextPath():"+request.getContextPath());//将cookie响应出去response.addCookie(cookie);}response.sendRedirect("index.jsp");}}public class CookieUtil {public static void addCookie(String cookieName, int time, HttpServletRequest request,HttpServletResponse response, String stuCode, String password) {//根据保存学号和密码的cookie的名字获取cookieCookie cookie = getCookieByName(request,cookieName);//如有该项目保存学号和密码的cookie,则更改cookie的值,如未有则新建cookieif(cookie != null) {cookie.setValue(stuCode+"#"+password);

response.sendRedirect(getServletContext().getContextPath()+"/record.action?action=list");}else {request.setAttribute("record", record);request.setAttribute("mainRight", "/WEB-INF/jsp/recordAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}}else if(action != null amp;amp;amp; amp;amp;amp; action.equals("deleteOrAcive")) {System.out.println("======删除或者激活=========");//删除或者激活String disabled = request.getParameter("disabled");Record record = recordService.findById(Integer.parseInt(id));record.setDisabled(Integer.parseInt(disabled));//查看用户是否有修改考勤记录的权限User user = userService.findStuCodeAndManager(record.getUser().getStuCode(),userCurr);System.out.println("修改权限user :"+user);if(user == null) {//无删除激活权限response.sendRedirect(getServletContext().getContextPath()+"/record.action?action=list");}else {//有删除激活权限recordService.update(record);//跳转到缺勤记录列表页response.sendRedirect(getServletContext().getContextPath()+"/record.action?action=list");}}}}/*** Servlet implementation class DormBuildServlet*/

//将cookie响应出去response.addCookie(cookie);}response.sendRedirect("index.jsp");}}public class CookieUtil {public static void addCookie(String cookieName, int time, HttpServletRequest request,HttpServletResponse response, String stuCode, String password) {//根据保存学号和密码的cookie的名字获取cookieCookie cookie = getCookieByName(request,cookieName);//如有该项目保存学号和密码的cookie,则更改cookie的值,如未有则新建cookieif(cookie != null) {cookie.setValue(stuCode+"#"+password);}else {cookie = new Cookie(cookieName, stuCode+"#"+password);}//设置cookie的有效时间cookie.setMaxAge(time);//设置cookie的作用范围 只在当前项目范围中有效cookie.setPath(request.getContextPath());System.out.println("request.getContextPath():"+request.getContextPath());response.addCookie(cookie);}public static Cookie getCookieByName(HttpServletRequest request, String cookieName) {//从request中获取当前项目的作用cookieCookie[] cookies = request.getCookies();//遍历所有cookieif(cookies != null amp;amp;amp; amp;amp;amp; cookies.length amp;amp;gt;0) {for (Cookie cookie : cookies) {//根据cookie的名字获取cookie,并返回if(cookie.getName().equals(cookieName)) {return cookie;

/*** Servlet implementation class RecordServlet*/@WebServlet("/record.action")public class RecordServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public RecordServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)*/protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("====record.action========");//在tomcat8.0中,如果是post请求,传递过来的中文可能会出现乱码问题 request.setCharacterEncoding("utf-8");String action = request.getParameter("action");String id = request.getParameter("id");

request.setAttribute("pageIndex", pageModel.getPageIndex());request.setAttribute("records", records);request.setAttribute("mainRight", "/WEB-INF/jsp/recordList.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp;amp; amp;amp;amp; action.equals("preAdd")) {//跳转到添加页面request.setAttribute("mainRight", "/WEB-INF/jsp/recordAddOrUpdate.jsp");request.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(request, response);}else if(action != null amp;amp;amp; amp;amp;amp; action.equals("save")) {//保存String stuCode = request.getParameter("stuCode");String date = request.getParameter("date");String remark = request.getParameter("remark");System.out.println("remark:"+remark+" date:"+date+" stuCode:"+stuCode);//做保存前,判断用户是否有添加该学号学生缺勤记录的权限User user = userService.findStuCodeAndManager(stuCode,userCurr);System.out.println("查询添加缺勤权限user:"+user);if(id != null amp;amp;amp; amp;amp;amp; !id.equals("")) {//更新if(user != null) {//有修改权限Record record = recordService.findById(Integer.parseInt(id));try {record.setDate(new SimpleDateFormat("yyyy-MM-dd").parse(date));record.setRemark(remark);record.setStudentId(user.getId());recordService.update(record);} catch (ParseException e) {e.printStackTrace();}response.sendRedirect(getServletContext().getContextPath()+"/record.action?action=list");}else {//无修改权限response.sendRedirect(getServletContext().getContextPath()+"/record.action?action=list");}

基于javaweb+mysql的jsp+servlet宿舍管理系统(超级管理员、宿舍管理员、学生)