wushengzong преди 5 години
ревизия
c8dad662ce
променени са 72 файла, в които са добавени 13729 реда и са изтрити 0 реда
  1. 11 0
      .gitignore
  2. 300 0
      pom.xml
  3. 111 0
      sql/conference_room.sql
  4. 192 0
      src/main/java/com/em/controller/AdminController.java
  5. 43 0
      src/main/java/com/em/controller/LoginController.java
  6. 140 0
      src/main/java/com/em/controller/OrdinaryController.java
  7. 33 0
      src/main/java/com/em/controller/converter/StringToDateConverter.java
  8. 37 0
      src/main/java/com/em/dao/ReservationMapper.java
  9. 68 0
      src/main/java/com/em/dao/ReservationMapper.xml
  10. 11 0
      src/main/java/com/em/dao/RoleMapper.java
  11. 8 0
      src/main/java/com/em/dao/RoleMapper.xml
  12. 27 0
      src/main/java/com/em/dao/RoomMapper.java
  13. 52 0
      src/main/java/com/em/dao/RoomMapper.xml
  14. 12 0
      src/main/java/com/em/dao/UserMapper.java
  15. 11 0
      src/main/java/com/em/dao/UserMapper.xml
  16. 16 0
      src/main/java/com/em/domain/DateVo.java
  17. 82 0
      src/main/java/com/em/domain/PagingVO.java
  18. 88 0
      src/main/java/com/em/domain/Reservation.java
  19. 17 0
      src/main/java/com/em/domain/ReservationCustom.java
  20. 88 0
      src/main/java/com/em/domain/ReservationVo.java
  21. 26 0
      src/main/java/com/em/domain/Role.java
  22. 36 0
      src/main/java/com/em/domain/Room.java
  23. 36 0
      src/main/java/com/em/domain/User.java
  24. 97 0
      src/main/java/com/em/realm/LoginRealm.java
  25. 94 0
      src/main/java/com/em/service/ReservationService.java
  26. 11 0
      src/main/java/com/em/service/RoleService.java
  27. 68 0
      src/main/java/com/em/service/RoomService.java
  28. 24 0
      src/main/java/com/em/service/UserService.java
  29. 94 0
      src/main/java/com/em/service/impl/ReservationServiceImpl.java
  30. 20 0
      src/main/java/com/em/service/impl/RoleServiceImpl.java
  31. 64 0
      src/main/java/com/em/service/impl/RoomServiceImpl.java
  32. 26 0
      src/main/java/com/em/service/impl/UserServiceImpl.java
  33. 53 0
      src/main/resources/ApplicationContext-Dao.xml
  34. 19 0
      src/main/resources/ApplicationContext-Service.xml
  35. 75 0
      src/main/resources/ApplicationContext-Shiro.xml
  36. 51 0
      src/main/resources/ApplicationContext-Trans.xml
  37. 50 0
      src/main/resources/SpringMvc.xml
  38. 7 0
      src/main/resources/SqlMapConfig.xml
  39. 4 0
      src/main/resources/db.properties
  40. 6 0
      src/main/resources/log4j.properties
  41. 67 0
      src/main/webapp/WEB-INF/jsp/admin/addRoom.jsp
  42. 71 0
      src/main/webapp/WEB-INF/jsp/admin/editRoom.jsp
  43. 13 0
      src/main/webapp/WEB-INF/jsp/admin/menu.jsp
  44. 128 0
      src/main/webapp/WEB-INF/jsp/admin/showRecord.jsp
  45. 138 0
      src/main/webapp/WEB-INF/jsp/admin/showReservation.jsp
  46. 131 0
      src/main/webapp/WEB-INF/jsp/admin/showRoom.jsp
  47. 57 0
      src/main/webapp/WEB-INF/jsp/admin/top.jsp
  48. 81 0
      src/main/webapp/WEB-INF/jsp/admin/userRegister.jsp
  49. 12 0
      src/main/webapp/WEB-INF/jsp/error.jsp
  50. 113 0
      src/main/webapp/WEB-INF/jsp/ordinary/cancelApplication.jsp
  51. 13 0
      src/main/webapp/WEB-INF/jsp/ordinary/menu.jsp
  52. 209 0
      src/main/webapp/WEB-INF/jsp/ordinary/reserveRoom.jsp
  53. 127 0
      src/main/webapp/WEB-INF/jsp/ordinary/showRecord.jsp
  54. 120 0
      src/main/webapp/WEB-INF/jsp/ordinary/showRoom.jsp
  55. 50 0
      src/main/webapp/WEB-INF/jsp/ordinary/top.jsp
  56. 16 0
      src/main/webapp/WEB-INF/jsp/success.jsp
  57. 75 0
      src/main/webapp/WEB-INF/web.xml
  58. 587 0
      src/main/webapp/css/bootstrap-theme.css
  59. 6 0
      src/main/webapp/css/bootstrap-theme.min.css
  60. 6757 0
      src/main/webapp/css/bootstrap.css
  61. 6 0
      src/main/webapp/css/bootstrap.min.css
  62. 0 0
      src/main/webapp/fonts/glyphicons-halflings-regular.eot
  63. 288 0
      src/main/webapp/fonts/glyphicons-halflings-regular.svg
  64. 0 0
      src/main/webapp/fonts/glyphicons-halflings-regular.ttf
  65. 0 0
      src/main/webapp/fonts/glyphicons-halflings-regular.woff
  66. 0 0
      src/main/webapp/fonts/glyphicons-halflings-regular.woff2
  67. BIN
      src/main/webapp/images/view.jpg
  68. 2377 0
      src/main/webapp/js/bootstrap.js
  69. 7 0
      src/main/webapp/js/bootstrap.min.js
  70. 4 0
      src/main/webapp/js/jquery-3.2.1.min.js
  71. 13 0
      src/main/webapp/js/npm.js
  72. 55 0
      src/main/webapp/login.jsp

+ 11 - 0
.gitignore

@@ -0,0 +1,11 @@
+src/main/.DS_Store
+src/main/resources/.DS_Store
+.DS_Store
+.idea
+*.iml
+log/*
+.classpath
+.project
+.settings/
+src/test/java/*
+target/*

+ 300 - 0
pom.xml

@@ -0,0 +1,300 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.persagy</groupId>
+  <artifactId>booking</artifactId>
+  <packaging>war</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>booking Maven Webapp</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <!--SSM框架所用到的jar包-->
+    <!--Spring-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-core</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-expression</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+
+    <!--日志文件jar包依赖-->
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>1.2</version>
+    </dependency>
+<!--    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.15</version>
+    </dependency>-->
+
+    <!--Spring框架整合Junit-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-test</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+
+    <!--spring的aop相关依赖-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-aop</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>aopalliance</groupId>
+      <artifactId>aopalliance</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjweaver</artifactId>
+      <version>1.8.10</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-aspects</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+
+    <!--Spring的JDBC相关依赖配置-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-jdbc</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.25</version>
+    </dependency>
+    <!--创建数据源连接池DBCP依赖-->
+    <dependency>
+      <groupId>commons-dbcp</groupId>
+      <artifactId>commons-dbcp</artifactId>
+      <version>1.4</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-pool</groupId>
+      <artifactId>commons-pool</artifactId>
+      <version>1.5.6</version>
+    </dependency>
+    <!--创建c3p0连接池依赖-->
+    <dependency>
+      <groupId>com.mchange</groupId>
+      <artifactId>c3p0</artifactId>
+      <version>0.9.5.2</version>
+    </dependency>
+    <!--Spring的事务相关依赖配置-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-tx</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <!--springmvc相关jar包配置-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-webmvc</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+      <version>4.2.6.RELEASE</version>
+    </dependency>
+    <!--引入dubbo-->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>dubbo</artifactId>
+      <version>2.6.7</version>
+    </dependency>
+
+
+    <!--Mybatis-->
+    <dependency>
+      <groupId>org.mybatis</groupId>
+      <artifactId>mybatis</artifactId>
+      <version>3.3.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <version>3.18.1-GA</version>
+    </dependency>
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm</artifactId>
+      <version>5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>cglib</groupId>
+      <artifactId>cglib</artifactId>
+      <version>2.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <version>2.6.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <version>2.6.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.25</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>1.7.25</version>
+      <scope>test</scope>
+    </dependency>
+    <!--Mybatis逆向工程jar包配置-->
+    <dependency>
+      <groupId>org.mybatis.generator</groupId>
+      <artifactId>mybatis-generator-core</artifactId>
+      <version>1.3.7</version>
+    </dependency>
+
+    <!--Spring和Mybatis整合-->
+    <dependency>
+      <groupId>org.mybatis</groupId>
+      <artifactId>mybatis-spring</artifactId>
+      <version>1.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>RELEASE</version>
+    </dependency>
+
+    <!--导入Servlet-->
+   <!-- <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      &lt;!&ndash;不要使用2.3版本,2.3版本的ServletResponse没有setCharacterEncoding()方法&ndash;&gt;
+      <version>2.5</version>
+      <scope>provided</scope> &lt;!&ndash;此处应该加这段话,为了防止Tomcat与Servlet冲突找不到对应的页面&ndash;&gt;
+    </dependency>-->
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>3.1.0</version>
+      <scope>provided</scope>
+    </dependency>
+
+
+    <!--导入JSTL标签库-->
+    <dependency>
+      <groupId>jstl</groupId>
+      <artifactId>jstl</artifactId>
+      <version>1.2</version>
+    </dependency>
+    <dependency>
+      <groupId>taglibs</groupId>
+      <artifactId>standard</artifactId>
+      <version>1.1.2</version>
+    </dependency>
+
+    <!--文件上传jar包导入-->
+    <dependency>
+      <groupId>commons-fileupload</groupId>
+      <artifactId>commons-fileupload</artifactId>
+      <version>1.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.5</version>
+    </dependency>
+
+    <!--Json相关Jar包-->
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>2.6.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>2.6.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.6.2</version>
+    </dependency>
+    <!-- 配置阿里巴巴Druid连接池jar包 -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>druid</artifactId>
+      <version>1.1.12</version>
+    </dependency>
+
+    <!--shiro依赖-->
+    <dependency>
+      <groupId>org.apache.shiro</groupId>
+      <artifactId>shiro-core</artifactId>
+      <version>1.2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.shiro</groupId>
+      <artifactId>shiro-web</artifactId>
+      <version>1.2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.shiro</groupId>
+      <artifactId>shiro-spring</artifactId>
+      <version>1.2.3</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <finalName>booking</finalName>
+    <resources>
+      <resource>
+        <directory>src/main/java</directory>
+        <includes>
+          <include>**/**/**/*.xml</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+      </resource>
+    </resources>
+      <plugins>
+          <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-compiler-plugin</artifactId>
+              <configuration>
+                  <source>1.6</source>
+                  <target>1.6</target>
+              </configuration>
+          </plugin>
+      </plugins>
+  </build>
+</project>

+ 111 - 0
sql/conference_room.sql

@@ -0,0 +1,111 @@
+/*
+Navicat MySQL Data Transfer
+
+Source Server         : localhost_3306
+Source Server Version : 50635
+Source Host           : localhost:3306
+Source Database       : conference_room
+
+Target Server Type    : MYSQL
+Target Server Version : 50635
+File Encoding         : 65001
+
+Date: 2019-02-12 22:28:13
+*/
+
+SET FOREIGN_KEY_CHECKS=0;
+
+-- ----------------------------
+-- Table structure for reservation
+-- ----------------------------
+DROP TABLE IF EXISTS `reservation`;
+CREATE TABLE `reservation` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `room_id` int(11) DEFAULT NULL,
+  `user` varchar(32) DEFAULT NULL,
+  `mobile` varchar(20) DEFAULT NULL,
+  `date` date DEFAULT NULL,
+  `begintime` time DEFAULT NULL,
+  `endtime` time DEFAULT NULL,
+  `mark` varchar(10) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `fk_reservation_room` (`room_id`),
+  CONSTRAINT `fk_reservation_room` FOREIGN KEY (`room_id`) REFERENCES `room` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of reservation
+-- ----------------------------
+INSERT INTO `reservation` VALUES ('1', '1', 'ordinary', '13988888888', '2018-01-02', '13:30:00', '15:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('2', '2', 'ordinary', '13988888888', '2018-01-06', '15:00:00', '16:30:00', '审核通过');
+INSERT INTO `reservation` VALUES ('3', '1', 'ordinary', '13988888888', '2018-01-08', '09:00:00', '11:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('4', '1', 'ordinary', '13988888888', '2018-01-09', '15:00:00', '16:30:00', '审核通过');
+INSERT INTO `reservation` VALUES ('5', '3', 'ordinary', '13988888888', '2018-01-12', '10:00:00', '12:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('6', '2', 'ordinary', '13988888888', '2018-01-12', '13:00:00', '15:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('8', '1', 'ordinary', '13988888888', '2018-01-22', '09:00:00', '10:00:00', '取消申请');
+INSERT INTO `reservation` VALUES ('9', '1', 'ordinary', '13988888888', '2018-01-22', '10:30:00', '11:30:00', '待审核');
+INSERT INTO `reservation` VALUES ('10', '2', 'ordinary', '13988888888', '2018-01-22', '15:00:00', '17:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('11', '3', 'ordinary', '13988888888', '2018-01-22', '10:00:00', '12:00:00', '待审核');
+INSERT INTO `reservation` VALUES ('12', '3', 'ordinary', '13988888888', '2018-01-23', '09:00:00', '10:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('13', '1', 'ordinary', '13988888888', '2018-01-24', '09:00:00', '10:00:00', '取消申请');
+INSERT INTO `reservation` VALUES ('14', '1', 'ordinary', '13988888888', '2018-02-02', '09:00:00', '10:00:00', '审核通过');
+INSERT INTO `reservation` VALUES ('15', '1', '201801', '13988888888', '2018-02-10', '09:00:00', '10:00:00', '待审核');
+INSERT INTO `reservation` VALUES ('16', '3', '201801', '13988888888', '2018-02-10', '10:00:00', '11:00:00', '待审核');
+INSERT INTO `reservation` VALUES ('17', '1', '201801', '13988888888', '2018-02-10', '00:30:00', '13:30:00', '审核通过');
+
+-- ----------------------------
+-- Table structure for role
+-- ----------------------------
+DROP TABLE IF EXISTS `role`;
+CREATE TABLE `role` (
+  `role_id` int(11) NOT NULL,
+  `role_name` varchar(50) DEFAULT NULL,
+  PRIMARY KEY (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of role
+-- ----------------------------
+INSERT INTO `role` VALUES ('1', 'admin');
+INSERT INTO `role` VALUES ('2', 'ordinary');
+
+-- ----------------------------
+-- Table structure for room
+-- ----------------------------
+DROP TABLE IF EXISTS `room`;
+CREATE TABLE `room` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `name` varchar(60) NOT NULL,
+  `message` varchar(200) DEFAULT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of room
+-- ----------------------------
+INSERT INTO `room` VALUES ('1', 'J305', '大型会议室,可使用多媒体,适合开会、讲座');
+INSERT INTO `room` VALUES ('2', '第一会议室327', '能够使用多媒体,适合组会,论文答辩');
+INSERT INTO `room` VALUES ('3', '第三会议室329', '能够使用多媒体,适合开组会,硕/博士毕业论文答辩');
+INSERT INTO `room` VALUES ('4', 'J123', '大型会议室,可容纳200人,适合举办讲座');
+INSERT INTO `room` VALUES ('5', 'J226', '小包间会议室,适合小组讨论');
+INSERT INTO `room` VALUES ('6', 'J211', '小会议室,适合二十人小型会议,含多媒体');
+
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `user`;
+CREATE TABLE `user` (
+  `id` varchar(32) NOT NULL,
+  `password` varchar(32) NOT NULL,
+  `role` int(11) DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  KEY `fk_user_role` (`role`),
+  CONSTRAINT `fk_user_role` FOREIGN KEY (`role`) REFERENCES `role` (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- ----------------------------
+-- Records of user
+-- ----------------------------
+INSERT INTO `user` VALUES ('201801', '123', '2');
+INSERT INTO `user` VALUES ('admin', 'emadmin', '1');
+INSERT INTO `user` VALUES ('ordinary', '123456', '2');

+ 192 - 0
src/main/java/com/em/controller/AdminController.java

@@ -0,0 +1,192 @@
+package com.em.controller;
+
+import com.em.domain.*;
+import com.em.service.ReservationService;
+import com.em.service.RoomService;
+import com.em.service.UserService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+@Controller
+@RequestMapping("/admin")
+public class AdminController {
+
+    @Resource(name = "roomServiceImpl")
+    private RoomService roomService;
+
+    @Resource(name = "reservationServiceImpl")
+    private ReservationService reservationService;
+
+    @Resource(name = "userServiceImpl")
+    private UserService userService;
+
+    /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<会议室信息管理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
+    // 会议室信息显示
+    @RequestMapping("/showRoom")
+    public String showRoom(Model model, Integer page) throws Exception {
+
+        List<Room> list = null;
+        //页码对象
+        PagingVO pagingVO = new PagingVO();
+        //设置总页数
+        pagingVO.setTotalCount(roomService.roomCount());
+        if (page == null || page == 0) {
+            pagingVO.setToPageNo(1);
+            list = roomService.findByPaging(1);
+        } else {
+            pagingVO.setToPageNo(page);
+            list = roomService.findByPaging(page);
+        }
+
+        model.addAttribute("roomList", list);
+        model.addAttribute("pagingVO", pagingVO);
+
+        return "/admin/showRoom";
+    }
+
+    //搜索会议室
+    @RequestMapping(value = "/queryRoom", method = {RequestMethod.POST})
+    private String queryRoom(String findByName, Model model) throws Exception {
+
+        List<Room> list = roomService.findByName(findByName);
+
+        model.addAttribute("roomList", list);
+        return "/admin/showRoom";
+    }
+
+    //添加会议室页面跳转
+    @RequestMapping(value = "/addRoom", method = {RequestMethod.GET})
+    public String addRoom(Model model) throws Exception {
+
+        return "/admin/addRoom";
+    }
+
+    //添加会议室业务实现
+    @RequestMapping(value = "/addRoom", method = {RequestMethod.POST})
+    public String addRoom(Room room, Model model) throws Exception {
+
+        roomService.add(room);
+
+        return "redirect:/admin/showRoom";
+    }
+
+    // 修改会议室信息页面显示
+    @RequestMapping(value = "/editRoom", method = {RequestMethod.GET})
+    public String editRoomUI(Integer id, Model model) throws Exception {
+        if (id == null) {
+            return "redirect:/admin/showRoom";
+        }
+        Room room = roomService.findById(id);
+        model.addAttribute("roomList", room);
+
+        return "/admin/editRoom";
+    }
+
+    // 修改会议室信息页面处理
+    @RequestMapping(value = "/editRoom", method = {RequestMethod.POST})
+    public String editRoom(Room room) throws Exception {
+        roomService.updateById(room);
+
+        //重定向
+        return "redirect:/admin/showRoom";
+    }
+
+    // 删除会议室信息
+    @RequestMapping("/removeRoom")
+    public String removeRoom(Integer id) throws Exception {
+        if (id == null) {
+            //加入没有带教师id就进来的话就返回教师显示页面
+            return "/admin/showRoom";
+        }
+        roomService.removeById(id);
+
+        return "redirect:/admin/showRoom";
+    }
+
+    /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<会议室预约管理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
+    //查询所有待审核预约记录
+    @RequestMapping("/showReservation")
+    public String findAllReservation(Model model,Integer page) throws Exception {
+        List<ReservationVo> list = null;
+
+        //页码对象
+        PagingVO pagingVO = new PagingVO();
+        //设置总页数
+        pagingVO.setTotalCount(reservationService.reservationCount());
+        if (page == null || page == 0) {
+            pagingVO.setToPageNo(1);
+            list = reservationService.findByPaging(1);
+        } else {
+            pagingVO.setToPageNo(page);
+            list = reservationService.findByPaging(page);
+        }
+
+        model.addAttribute("reservationList", list);
+        model.addAttribute("pagingVO", pagingVO);
+
+        return "/admin/showReservation";
+    }
+
+    //搜索借用人
+    @RequestMapping(value = "queryUser", method = {RequestMethod.POST})
+    private String queryUser(String findByName, Model model) throws Exception {
+
+        List<Reservation> list = reservationService.findByName(findByName);
+
+        model.addAttribute("reservationList", list);
+        return "/admin/showReservation";
+    }
+
+    //同意会议室申请
+    @RequestMapping("/reviewReservation")
+    public String reviewReservation(Integer id) throws Exception{
+        reservationService.reviewReservation(id);
+        return "redirect:/admin/showReservation";
+    }
+
+    //查询所有审核通过预约记录
+    @RequestMapping("/showRecord")
+    public String findRecord(Model model,Integer page) throws Exception{
+        List<ReservationVo> list = null;
+
+        //页码对象
+        PagingVO pagingVO = new PagingVO();
+        //设置总页数
+        pagingVO.setTotalCount(reservationService.reservationPassCount());
+        if (page == null || page == 0) {
+            pagingVO.setToPageNo(1);
+            list = reservationService.findRecord(1);
+        } else {
+            pagingVO.setToPageNo(page);
+            list = reservationService.findRecord(page);
+        }
+
+        model.addAttribute("recordList", list);
+        model.addAttribute("pagingVo", pagingVO);
+
+        return "/admin/showRecord";
+    }
+
+    /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<用户信息管理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
+    //添加新用户
+    @RequestMapping(value = "/userRegister", method = {RequestMethod.GET})
+    public String userRegister(Model model) throws Exception {
+        return "/admin/userRegister";
+    }
+
+    @RequestMapping(value = "/userRegister",method = RequestMethod.POST)
+    public String userRegister(User user) throws Exception{
+         if(user.getId()!=null && user.getId()!="" && user.getPassword()!=null && user.getPassword()!=""){
+            userService.addNewUser(user);
+        }
+        return "redirect:/admin/userRegister";
+    }
+}

+ 43 - 0
src/main/java/com/em/controller/LoginController.java

@@ -0,0 +1,43 @@
+package com.em.controller;
+
+import com.em.domain.User;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * Created by Carson on 2017/11/30.
+ */
+@Controller
+public class LoginController {
+
+    //登录跳转
+    @RequestMapping(value = "/login", method = {RequestMethod.GET})
+    public String loginUI() throws Exception {
+        return "../../login";
+    }
+
+    //登录表单处理
+    @RequestMapping(value = "/login", method = {RequestMethod.POST})
+    public String login(User user) throws Exception {
+
+        //Shiro实现登录
+        UsernamePasswordToken token = new UsernamePasswordToken(user.getId(),user.getPassword());
+        Subject subject = SecurityUtils.getSubject();
+
+        //如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常
+        subject.login(token);
+
+        if (subject.hasRole("admin")) {
+            return "redirect:/admin/showRoom";
+        } else if (subject.hasRole("ordinary")) {
+            return "redirect:/ordinary/showRoom";
+        }
+
+        return "/login";
+    }
+
+}

+ 140 - 0
src/main/java/com/em/controller/OrdinaryController.java

@@ -0,0 +1,140 @@
+package com.em.controller;
+
+import com.em.domain.*;
+import com.em.service.ReservationService;
+import com.em.service.RoomService;
+import com.em.service.UserService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/20.
+ */
+@Controller
+@RequestMapping("/ordinary")
+public class OrdinaryController {
+
+    @Resource(name = "roomServiceImpl")
+    private RoomService roomService;
+
+    @Resource(name = "reservationServiceImpl")
+    private ReservationService reservationService;
+
+    @Resource(name = "userServiceImpl")
+    private UserService userService;
+
+    /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<会议室信息管理>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
+    // 会议室信息显示
+    @RequestMapping("/showRoom")
+    public String showRoom(Model model, Integer page) throws Exception {
+
+        List<Room> list = null;
+        //页码对象
+        PagingVO pagingVO = new PagingVO();
+        //设置总页数
+        pagingVO.setTotalCount(roomService.roomCount());
+        if (page == null || page == 0) {
+            pagingVO.setToPageNo(1);
+            list = roomService.findByPaging(1);
+        } else {
+            pagingVO.setToPageNo(page);
+            list = roomService.findByPaging(page);
+        }
+
+        model.addAttribute("roomList", list);
+        model.addAttribute("pagingVO", pagingVO);
+
+        return "/ordinary/showRoom";
+    }
+
+    //搜索会议室
+    @RequestMapping(value = "/queryRoom", method = {RequestMethod.POST})
+    private String queryRoom(String findByName, Model model) throws Exception {
+
+        List<Room> list = roomService.findByName(findByName);
+
+        model.addAttribute("roomList", list);
+        return "/ordinary/showRoom";
+    }
+
+    //查询接下来的15天内所有已被预约的会议室记录
+    @RequestMapping("/showRecord")
+    public String findAllReservation(Model model, Integer page) throws Exception {
+        List<ReservationVo> list = null;
+
+        //页码对象
+        PagingVO pagingVO = new PagingVO();
+        //设置总页数
+        pagingVO.setTotalCount(reservationService.reserveCount());
+        if (page == null || page == 0) {
+            pagingVO.setToPageNo(1);
+            list = reservationService.findAllByPaging(1);
+        } else {
+            pagingVO.setToPageNo(page);
+            list = reservationService.findAllByPaging(page);
+        }
+
+        model.addAttribute("recordList", list);
+        model.addAttribute("pagingVo", pagingVO);
+
+        return "/ordinary/showRecord";
+    }
+
+    //搜索借用人
+    @RequestMapping(value = "/queryByUser", method = {RequestMethod.POST})
+    private String queryUser(String findByName, Model model) throws Exception {
+
+        List<ReservationVo> list = reservationService.queryByUser(findByName);
+
+        model.addAttribute("recordList", list);
+
+        return "/ordinary/showRecord";
+    }
+
+    //预约会议室页面跳转
+    @RequestMapping(value = "/reserveRoom", method = RequestMethod.GET)
+    public String reserveRoomUI(Model model) throws Exception {
+        //从数据库查询出所有会议室信息回显到页面
+        List<Room> list = roomService.nameList();
+        model.addAttribute("nameList", list);
+
+        return "/ordinary/reserveRoom";
+    }
+
+    //预约会议室功能实现
+    @RequestMapping(value = "/reserveRoom", method = RequestMethod.POST)
+    public String reserveRoom(ReservationCustom reservationCustom) throws Exception {
+
+        reservationService.addReservation(reservationCustom);
+
+        return "redirect:/ordinary/showRecord";
+    }
+
+    //取消预约申请页面跳转
+    @RequestMapping(value = "/cancelApplication",method = RequestMethod.GET)
+    public String cancelApplicationUI(String user,Model model) throws Exception{
+        List<ReservationCustom> list=reservationService.findByUser(user);
+        model.addAttribute("reserveList",list);
+
+        return "/ordinary/cancelApplication";
+    }
+
+    //取消预约申请业务实现
+    @RequestMapping("/cancelApply")
+    public String cancelApplication(Integer id) throws Exception{
+        reservationService.cancelApplication(id);
+
+        return "redirect:/ordinary/showRecord";
+    }
+
+}

+ 33 - 0
src/main/java/com/em/controller/converter/StringToDateConverter.java

@@ -0,0 +1,33 @@
+package com.em.controller.converter;
+
+import org.springframework.core.convert.converter.Converter;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Converter<S,T>:
+ * S:source
+ * T:target
+ * Created by Admiral on 2018/1/18.
+ */
+public class StringToDateConverter implements Converter<String,Date> {
+    @Override
+    public Date convert(String source) {
+        Date date=null;
+        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            date=dateFormat.parse(source.trim());
+            //return date;
+        } catch (ParseException e) {
+            try{
+                dateFormat=new SimpleDateFormat("hh:mm:ss");
+                date=dateFormat.parse(source.trim());
+            }catch (ParseException e1){
+                e1.printStackTrace();
+            }
+        }
+        return date;
+    }
+}

+ 37 - 0
src/main/java/com/em/dao/ReservationMapper.java

@@ -0,0 +1,37 @@
+package com.em.dao;
+
+import com.em.domain.PagingVO;
+import com.em.domain.Reservation;
+import com.em.domain.ReservationCustom;
+import com.em.domain.ReservationVo;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface ReservationMapper {
+    public Integer reservationCount();
+
+    public List<ReservationVo> findByPaging(PagingVO pagingVO);
+
+    public List<Reservation> findByName(String name);
+
+    public Integer reservationPassCount();
+
+    public List<ReservationVo> findRecord(PagingVO pagingVO);
+
+    public void reviewReservation(Integer id);
+
+    public Integer reserveCount();
+
+    public List<ReservationVo> findAllByPaging(PagingVO pagingVO);
+
+    public void addReservation(ReservationCustom reservationCustom);
+
+    public List<ReservationVo> queryByUser(String name);
+
+    public List<ReservationCustom> findByUser(String name);
+
+    public void cancelApplication(Integer id);
+}

+ 68 - 0
src/main/java/com/em/dao/ReservationMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+
+<mapper namespace="com.em.dao.ReservationMapper">
+    <select id="reservationCount" resultType="int">
+        SELECT count(*) FROM reservation a WHERE date>CURDATE() AND a.mark='待审核'
+    </select>
+
+    <select id="reserveCount" resultType="int">
+        SELECT count(*) FROM reservation a WHERE date>CURDATE() AND mark!='取消申请'
+    </select>
+
+    <select id="findByPaging" parameterType="com.em.domain.PagingVO" resultType="com.em.domain.ReservationVo">
+        SELECT a.id,b.`name` ,a.date,a.begintime,a.endtime,a.`user`,a.mobile,a.mark FROM reservation a
+        LEFT JOIN room b on a.room_id=b.id
+        WHERE date>CURDATE() AND a.mark='待审核' ORDER BY id
+        limit #{toPageNo}, #{pageSize}
+    </select>
+
+    <select id="findAllByPaging" parameterType="com.em.domain.PagingVO" resultType="com.em.domain.ReservationVo">
+        SELECT a.id,b.`name` ,a.date,a.begintime,a.endtime,a.`user`,a.mobile,a.mark FROM reservation a
+        LEFT JOIN room b on a.room_id=b.id
+        WHERE date>CURDATE() AND mark!='取消申请' ORDER BY date DESC
+        limit #{toPageNo}, #{pageSize}
+    </select>
+
+    <select id="findByName" parameterType="string" resultType="com.em.domain.ReservationVo">
+        SELECT a.id,b.`name` ,a.date,a.begintime,a.endtime,a.`user`,a.mobile,a.mark FROM reservation a
+        LEFT JOIN room b on a.room_id=b.id
+        WHERE date>CURDATE() AND a.mark='待审核' AND a.user LIKE '%${value}%' ORDER BY id
+    </select>
+
+    <select id="reservationPassCount" resultType="int">
+        SELECT count(*) FROM reservation a WHERE date BETWEEN CURDATE()-30 AND CURDATE() AND a.mark='审核通过' ORDER BY date DESC
+    </select>
+
+    <select id="findRecord" parameterType="com.em.domain.PagingVO" resultType="com.em.domain.ReservationVo">
+        SELECT a.id,b.`name` ,a.date,a.begintime,a.endtime,a.`user`,a.mobile,a.mark FROM reservation a
+        LEFT JOIN room b on a.room_id=b.id
+        WHERE date BETWEEN CURDATE()-30 AND CURDATE() AND a.mark='审核通过' ORDER BY id
+        limit #{toPageNo}, #{pageSize}
+    </select>
+
+    <select id="queryByUser" parameterType="string" resultType="com.em.domain.ReservationVo">
+        SELECT a.id,b.`name` ,a.date,a.begintime,a.endtime,a.`user`,a.mobile,a.mark FROM reservation a
+        LEFT JOIN room b on a.room_id=b.id
+        WHERE date>CURDATE() AND a.user LIKE '%${value}%' ORDER BY date DESC
+    </select>
+
+    <update id="reviewReservation" parameterType="int">
+        UPDATE reservation SET mark='审核通过' WHERE id=#{id}
+    </update>
+
+    <insert id="addReservation" parameterType="com.em.domain.ReservationCustom">
+        INSERT INTO reservation(user,mobile,date,begintime,endtime,mark,room_id)
+        SELECT #{user},#{mobile},#{date},#{beginTime},#{endTime},'待审核',id FROM room WHERE name=#{name}
+    </insert>
+
+    <select id="findByUser" parameterType="string" resultType="com.em.domain.ReservationCustom">
+        SELECT a.id,b.name,a.user,a.date,a.begintime,a.endtime,a.mark FROM reservation a
+        LEFT JOIN room b ON a.room_id=b.id
+        WHERE a.date > CURDATE()-15  AND a.mark='待审核' AND a.user=#{value} ORDER BY a.date DESC
+    </select>
+
+    <update id="cancelApplication" parameterType="int">
+        UPDATE reservation SET mark='取消申请' where id=#{id}
+    </update>
+</mapper>

+ 11 - 0
src/main/java/com/em/dao/RoleMapper.java

@@ -0,0 +1,11 @@
+package com.em.dao;
+
+import com.em.domain.Role;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface RoleMapper {
+
+    public String findNameById(Integer roleId);
+}

+ 8 - 0
src/main/java/com/em/dao/RoleMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+
+<mapper namespace="com.em.dao.RoleMapper">
+    <select id="findNameById" parameterType="int" resultType="string">
+        SELECT a.role_name FROM role a WHERE  role_id=#{roleId}
+    </select>
+</mapper>

+ 27 - 0
src/main/java/com/em/dao/RoomMapper.java

@@ -0,0 +1,27 @@
+package com.em.dao;
+
+import com.em.domain.PagingVO;
+import com.em.domain.Room;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface RoomMapper {
+    public Integer roomCount();
+
+    public List<Room> findByPaging(PagingVO pagingVO) throws Exception;
+
+    public void add(Room room) throws Exception;
+
+    public void updateById(Room room) throws Exception;
+
+    public Room findById(Integer id) throws Exception;
+
+    public void removeById(Integer id) throws Exception;
+
+    public List<Room> findByName(String name) throws Exception;
+
+    public List<Room> nameList() throws Exception;
+}

+ 52 - 0
src/main/java/com/em/dao/RoomMapper.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+
+<mapper namespace="com.em.dao.RoomMapper">
+    <select id="roomCount" resultType="int">
+        SELECT count(*) FROM room
+    </select>
+
+    <select id="findByPaging" parameterType="com.em.domain.PagingVO" resultType="com.em.domain.Room">
+        SELECT * FROM room
+        limit #{toPageNo}, #{pageSize}
+    </select>
+
+    <insert id="add" parameterType="com.em.domain.Room">
+        INSERT INTO room VALUES(null,#{name},#{message})
+    </insert>
+
+    <select id="findById" parameterType="int" resultType="com.em.domain.Room">
+        SELECT * FROM room WHERE id=#{id}
+    </select>
+
+    <select id="findByName" parameterType="java.lang.String" resultType="com.em.domain.Room">
+        SELECT * FROM room
+        <where>
+            <!--对于拼接符${},如果仅传入一个类型为String的参数(注意是只有一个参数),那么在${}中参数名称必须使用value或_parameter来代替-->
+            <if test="value!=null and value!=''">
+                AND name LIKE '%${value}%'
+            </if>
+        </where>
+    </select>
+    <!--获取所有会议室的名字-->
+    <select id="nameList" resultType="com.em.domain.Room">
+        SELECT a.name FROM room a
+    </select>
+
+    <update id="updateById" parameterType="com.em.domain.Room">
+        UPDATE room
+        <set>
+            <if test="name!=null and name!=''">
+                name=#{name},
+            </if>
+            <if test="message!=null and message!=''">
+                message=#{message},
+            </if>
+        </set>
+        WHERE id=#{id}
+    </update>
+
+    <update id="removeById" parameterType="int">
+        DELETE FROM room WHERE id=#{id}
+    </update>
+</mapper>

+ 12 - 0
src/main/java/com/em/dao/UserMapper.java

@@ -0,0 +1,12 @@
+package com.em.dao;
+
+import com.em.domain.User;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface UserMapper {
+    public User findUserById(String id);
+
+    public void addNewUser(User user);
+}

+ 11 - 0
src/main/java/com/em/dao/UserMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.em.dao.UserMapper">
+    <select id="findUserById" parameterType="string" resultType="com.em.domain.User">
+        SELECT * FROM user WHERE id=#{id}
+    </select>
+
+    <insert id="addNewUser" parameterType="com.em.domain.User">
+        INSERT INTO user VALUES (#{id},#{password},2)
+    </insert>
+</mapper>

+ 16 - 0
src/main/java/com/em/domain/DateVo.java

@@ -0,0 +1,16 @@
+package com.em.domain;
+
+/**
+ * Created by Admiral on 2018/1/20.
+ */
+public class DateVo {
+    private String next;
+
+    public String getNext() {
+        return next;
+    }
+
+    public void setNext(String next) {
+        this.next = next;
+    }
+}

+ 82 - 0
src/main/java/com/em/domain/PagingVO.java

@@ -0,0 +1,82 @@
+package com.em.domain;
+
+/**
+ *  分页信息 domain类
+ */
+public class PagingVO {
+
+    //当前页码,默认第一页
+    private int curentPageNo = 1;
+    //总页数
+    private int totalCount;
+    //页面容量
+    private int pageSize=5;
+    //上一页
+    private int upPageNo;
+    //下一页
+    private int nextPageNo;
+    //要前往的页码,默认0
+    private int toPageNo = 0;
+
+    public void setToPageNo(Integer toPageNo) {
+        //新一页
+        this.toPageNo = (toPageNo-1) * pageSize ;
+        //设置跳转后当前的页码
+        setCurentPageNo(toPageNo);
+    }
+
+    public Integer getTopageNo() {
+        return toPageNo;
+    }
+
+    public int getCurentPageNo() {
+        return curentPageNo;
+    }
+
+    //设置当前页码
+    public void setCurentPageNo(int curentPageNo) {
+        if (curentPageNo != 1) {
+            this.upPageNo = curentPageNo - 1;
+        }
+        this.nextPageNo = curentPageNo + 1;
+
+        this.curentPageNo = curentPageNo;
+    }
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        if (totalCount%pageSize > 0) {
+            this.totalCount = (totalCount/pageSize)+1;
+        } else {
+            this.totalCount = totalCount/pageSize;
+        }
+
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public int getUpPageNo() {
+        return upPageNo;
+    }
+
+    public void setUpPageNo(int upPageNo) {
+        this.upPageNo = upPageNo;
+    }
+
+    public int getNextPageNo() {
+        return nextPageNo;
+    }
+
+    public void setNextPageNo(int nextPageNo) {
+        this.nextPageNo = nextPageNo;
+    }
+}

+ 88 - 0
src/main/java/com/em/domain/Reservation.java

@@ -0,0 +1,88 @@
+package com.em.domain;
+
+import java.util.Date;
+
+/**
+ * Created by Admiral on 2018/1/18.
+ */
+public class Reservation {
+    private int id;
+
+    private int roomId;
+
+    private String user;
+
+    private String mobile;
+
+    private Date date;
+
+    private Date beginTime;
+
+    private Date endTime;
+
+    private String mark;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(int roomId) {
+        this.roomId = roomId;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getMark() {
+        return mark;
+    }
+
+    public void setMark(String mark) {
+        this.mark = mark;
+    }
+}

+ 17 - 0
src/main/java/com/em/domain/ReservationCustom.java

@@ -0,0 +1,17 @@
+package com.em.domain;
+
+/**
+ * Created by Admiral on 2018/1/20.
+ */
+//Reservation的扩展类
+public class ReservationCustom extends Reservation {
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 88 - 0
src/main/java/com/em/domain/ReservationVo.java

@@ -0,0 +1,88 @@
+package com.em.domain;
+
+import java.util.Date;
+
+/**
+ * Created by Admiral on 2018/1/20.
+ */
+public class ReservationVo {
+    private int id;
+
+    private String name;
+
+    private String user;
+
+    private String mobile;
+
+    private Date date;
+
+    private Date beginTime;
+
+    private Date endTime;
+
+    private String mark;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getMark() {
+        return mark;
+    }
+
+    public void setMark(String mark) {
+        this.mark = mark;
+    }
+}

+ 26 - 0
src/main/java/com/em/domain/Role.java

@@ -0,0 +1,26 @@
+package com.em.domain;
+
+/**
+ * Created by Admiral on 2018/1/18.
+ */
+public class Role {
+    private Integer roleId;
+
+    private String roleName;
+
+    public int getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(int roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 36 - 0
src/main/java/com/em/domain/Room.java

@@ -0,0 +1,36 @@
+package com.em.domain;
+
+/**
+ * Created by Admiral on 2018/1/18.
+ */
+public class Room {
+    private int id;
+
+    private String name;
+
+    private String message;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 36 - 0
src/main/java/com/em/domain/User.java

@@ -0,0 +1,36 @@
+package com.em.domain;
+
+/**
+ * Created by Admiral on 2018/1/18.
+ */
+public class User {
+    private String id;
+
+    private String password;
+
+    private int role;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public int getRole() {
+        return role;
+    }
+
+    public void setRole(int role) {
+        this.role = role;
+    }
+}

+ 97 - 0
src/main/java/com/em/realm/LoginRealm.java

@@ -0,0 +1,97 @@
+package com.em.realm;
+
+import com.em.domain.Role;
+import com.em.domain.User;
+import com.em.service.RoleService;
+import com.em.service.RoomService;
+import com.em.service.UserService;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo.*;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Created by Carson on 2017/11/30.
+ */
+
+@Component
+public class LoginRealm extends AuthorizingRealm{
+
+    @Resource(name = "userServiceImpl")
+    private UserService userService;
+
+    @Resource(name = "roleServiceImpl")
+    private RoleService roleService;
+
+
+    /**
+     * 获取身份信息,我们可以在这个方法中,从数据库获取该用户的权限和角色信息
+     *     当调用权限验证时,就会调用此方法
+     */
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
+
+        String id = (String) getAvailablePrincipal(principalCollection);
+
+        String role = null;
+
+        try {
+            User user = userService.findUserById(id);
+            Integer i=user.getRole();
+            //获取角色对象
+            role=roleService.findNameById(i);
+            //role = roleService.findRoleById(user.getRole());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //通过用户名从数据库获取权限/角色信息
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+        Set<String> set = new HashSet<String>();
+        if (role != null) {
+            set.add(role);
+            info.setRoles(set);
+        }
+
+        return info;
+    }
+
+    /**
+     * 在这个方法中,进行身份验证
+     *         login时调用
+     */
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
+        //用户名
+        String id = (String) token.getPrincipal();
+        //密码
+        String password = new String((char[])token.getCredentials());
+
+        User user = null;
+        try {
+            user = userService.findUserById(id);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (user == null) {
+            //没有该用户名
+            throw new UnknownAccountException();
+        } else if (!password.equals(user.getPassword())) {
+            //密码错误
+            throw new IncorrectCredentialsException();
+        }
+
+        //身份验证通过,返回一个身份信息
+        AuthenticationInfo loginInfo = new SimpleAuthenticationInfo(id,password,getName());
+
+        return loginInfo;
+    }
+}

+ 94 - 0
src/main/java/com/em/service/ReservationService.java

@@ -0,0 +1,94 @@
+package com.em.service;
+
+import com.em.domain.PagingVO;
+import com.em.domain.Reservation;
+import com.em.domain.ReservationCustom;
+import com.em.domain.ReservationVo;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface ReservationService {
+    /**
+     * 查询15天内待审核的预约总数
+     * @return
+     */
+    public Integer reservationCount() throws Exception;
+
+    /**
+     * 查询15天内的所有待审核预约记录
+     * @return
+     */
+    public List<ReservationVo> findByPaging(Integer toPageNo) throws Exception;
+
+    /**
+     * 根据借用人查询其所有预约记录
+     * @param name
+     * @return
+     */
+    public List<Reservation> findByName(String name);
+
+    /**
+     * 查询15天内的审核通过的预约总数
+     * @return
+     */
+    public Integer reservationPassCount();
+
+    /**
+     * 查询15天内的所有审核通过预约记录
+     * @param toPageNo
+     * @return
+     * @throws Exception
+     */
+    public List<ReservationVo> findRecord(Integer toPageNo) throws Exception;
+
+    /**
+     * 审核预约会议室
+     * @param id
+     * @throws Exception
+     */
+    public void reviewReservation(Integer id) throws Exception;
+
+    /**
+     * 查询15天内所有预约记录
+     * @return
+     */
+    public Integer reserveCount() throws Exception;
+
+    /**
+     * 查询当前日期起,15天内的所有已被预约的会议室记录
+     * @return
+     */
+    public List<ReservationVo> findAllByPaging(Integer toPageNo) throws Exception;
+
+    /**
+     * 添加会议室预约
+     * @param reservationCustom
+     */
+    public void addReservation(ReservationCustom reservationCustom) throws Exception;
+
+    /**
+     * 根据借用人查询所有会议室预约信息
+     * @param name
+     * @return
+     * @throws Exception
+     */
+    public List<ReservationVo> queryByUser(String name) throws Exception;
+
+    /**
+     * 查询指定借用人预约会议室信息
+     * @param name
+     * @return
+     * @throws Exception
+     */
+    public List<ReservationCustom> findByUser(String name) throws Exception;
+
+    /**
+     * 根据id取消会议室申请
+     * @param id
+     * @throws Exception
+     */
+    public void cancelApplication(Integer id) throws Exception;
+}

+ 11 - 0
src/main/java/com/em/service/RoleService.java

@@ -0,0 +1,11 @@
+package com.em.service;
+
+import com.em.domain.Role;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface RoleService {
+
+    public String findNameById(Integer roleId) throws Exception;
+}

+ 68 - 0
src/main/java/com/em/service/RoomService.java

@@ -0,0 +1,68 @@
+package com.em.service;
+
+import com.em.domain.Room;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface RoomService {
+    /**
+     * 获取会议室总数
+     * @return
+     */
+    public Integer roomCount();
+
+    /**
+     * 获取分页查询会议室信息
+     * @param toPageNo
+     * @return
+     * @throws Exception
+     */
+    List<Room> findByPaging(Integer toPageNo) throws Exception;
+
+    /**
+     * 添加会议室信息
+     * @param room
+     * @throws Exception
+     */
+    public void add(Room room) throws Exception;
+
+    /**
+     * 根据id查询会议室信息
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    public Room findById(Integer id) throws Exception;
+
+    /**
+     * 根据id更新会议室信息
+     * @param room  输入Room对象(包含id,name,message属性)
+     * @throws Exception
+     */
+    public void updateById(Room room) throws Exception;
+
+    /**
+     * 根据id删除会议室信息
+     * @param id
+     * @throws Exception
+     */
+    public void removeById(Integer id) throws Exception;
+
+    /**
+     * 根据名字模糊查询会议室信息
+     * @param name
+     * @return
+     * @throws Exception
+     */
+    public List<Room> findByName(String name) throws Exception;
+
+    /**
+     * 获取所有会议室的名称
+     * @return
+     * @throws Exception
+     */
+    public List<Room> nameList() throws Exception;
+}

+ 24 - 0
src/main/java/com/em/service/UserService.java

@@ -0,0 +1,24 @@
+package com.em.service;
+
+import com.em.domain.User;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+public interface UserService {
+
+    /**
+     * 根据Id查找用户
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    public User findUserById(String id) throws Exception;
+
+    /**
+     * 添加新用户
+     * @param user
+     * @throws Exception
+     */
+    public void addNewUser(User user) throws Exception;
+}

+ 94 - 0
src/main/java/com/em/service/impl/ReservationServiceImpl.java

@@ -0,0 +1,94 @@
+package com.em.service.impl;
+
+import com.em.dao.ReservationMapper;
+import com.em.domain.PagingVO;
+import com.em.domain.Reservation;
+import com.em.domain.ReservationCustom;
+import com.em.domain.ReservationVo;
+import com.em.service.ReservationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+@Service
+public class ReservationServiceImpl implements ReservationService {
+
+    @Autowired
+    private ReservationMapper reservationMapper;
+
+    @Override
+    public Integer reservationCount() {
+        return reservationMapper.reservationCount();
+    }
+
+    @Override
+    public List<ReservationVo> findByPaging(Integer toPageNo) {
+        PagingVO pagingVO = new PagingVO();
+        pagingVO.setToPageNo(toPageNo);
+
+        List<ReservationVo> list = reservationMapper.findByPaging(pagingVO);
+        return list;
+    }
+
+    @Override
+    public List<Reservation> findByName(String name) {
+        return reservationMapper.findByName(name);
+    }
+
+    @Override
+    public Integer reservationPassCount() {
+        return reservationMapper.reservationPassCount();
+    }
+
+    @Override
+    public List<ReservationVo> findRecord(Integer toPageNo) throws Exception {
+        PagingVO pagingVO = new PagingVO();
+        pagingVO.setToPageNo(toPageNo);
+
+        List<ReservationVo> list = reservationMapper.findRecord(pagingVO);
+        return list;
+    }
+
+    @Override
+    public void reviewReservation(Integer id) throws Exception {
+        reservationMapper.reviewReservation(id);
+    }
+
+    @Override
+    public Integer reserveCount() throws Exception {
+        return reservationMapper.reserveCount();
+    }
+
+    @Override
+    public List<ReservationVo> findAllByPaging(Integer toPageNo) throws Exception {
+        PagingVO pagingVO = new PagingVO();
+        pagingVO.setToPageNo(toPageNo);
+
+        List<ReservationVo> list = reservationMapper.findAllByPaging(pagingVO);
+        return list;
+    }
+
+    @Override
+    public void addReservation(ReservationCustom reservationCustom) throws Exception {
+        reservationMapper.addReservation(reservationCustom);
+    }
+
+    @Override
+    public List<ReservationVo> queryByUser(String name) throws Exception {
+        return reservationMapper.queryByUser(name);
+    }
+
+    @Override
+    public List<ReservationCustom> findByUser(String name) throws Exception {
+        return reservationMapper.findByUser(name);
+    }
+
+    @Override
+    public void cancelApplication(Integer id) throws Exception {
+        reservationMapper.cancelApplication(id);
+    }
+}

+ 20 - 0
src/main/java/com/em/service/impl/RoleServiceImpl.java

@@ -0,0 +1,20 @@
+package com.em.service.impl;
+
+import com.em.dao.RoleMapper;
+import com.em.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+@Service
+public class RoleServiceImpl implements RoleService {
+    @Autowired
+    private RoleMapper roleMapper;
+
+    @Override
+    public String findNameById(Integer roleId) throws Exception {
+        return roleMapper.findNameById(roleId);
+    }
+}

+ 64 - 0
src/main/java/com/em/service/impl/RoomServiceImpl.java

@@ -0,0 +1,64 @@
+package com.em.service.impl;
+
+import com.em.dao.RoomMapper;
+import com.em.domain.PagingVO;
+import com.em.domain.Room;
+import com.em.service.RoomService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+@Service
+public class RoomServiceImpl implements RoomService {
+    @Autowired
+    private RoomMapper roomMapper;
+
+    @Override
+    public Integer roomCount() {
+        return roomMapper.roomCount();
+    }
+
+    @Override
+    public List<Room> findByPaging(Integer toPageNo) throws Exception {
+        PagingVO pagingVO = new PagingVO();
+        pagingVO.setToPageNo(toPageNo);
+
+        List<Room> list = roomMapper.findByPaging(pagingVO);
+        return list;
+    }
+
+    @Override
+    public void add(Room room) throws Exception {
+        roomMapper.add(room);
+    }
+
+    @Override
+    public Room findById(Integer id) throws Exception {
+        return roomMapper.findById(id);
+    }
+
+    @Override
+    public void updateById(Room room) throws Exception {
+        roomMapper.updateById(room);
+    }
+
+    @Override
+    public void removeById(Integer id) throws Exception {
+        roomMapper.removeById(id);
+    }
+
+    @Override
+    public List<Room> findByName(String name) throws Exception {
+        return roomMapper.findByName(name);
+    }
+
+    @Override
+    public List<Room> nameList() throws Exception {
+        return roomMapper.nameList();
+    }
+
+}

+ 26 - 0
src/main/java/com/em/service/impl/UserServiceImpl.java

@@ -0,0 +1,26 @@
+package com.em.service.impl;
+
+import com.em.dao.UserMapper;
+import com.em.domain.User;
+import com.em.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by Admiral on 2018/1/19.
+ */
+@Service
+public class UserServiceImpl implements UserService {
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public User findUserById(String id) throws Exception {
+        return userMapper.findUserById(id);
+    }
+
+    @Override
+    public void addNewUser(User user) throws Exception {
+        userMapper.addNewUser(user);
+    }
+}

+ 53 - 0
src/main/resources/ApplicationContext-Dao.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+	http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/aop
+	http://www.springframework.org/schema/aop/spring-aop.xsd
+	http://www.springframework.org/schema/tx
+	http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+    <!--加载配置文件-->
+    <context:property-placeholder location="classpath:db.properties"/>
+
+    <!--使用bean标签  id必须唯一  class后面加的是具体的实现类(不是接口)的全路径-->
+    <!--Druid连接池配置-->
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
+        <property name="driverClassName" value="${jdbc.driver}"/>
+        <property name="url" value="${jdbc.url}"/>
+        <property name="username" value="${jdbc.username}"/>
+        <property name="password" value="${jdbc.password}"/>
+    </bean>
+
+    <!--整合后会话工厂归Spring管理-->
+    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
+        <!--指定Mybatis核心配置文件-->
+        <!--<property name="configLocation" value="classpath:SqlMapConfig.xml"/>-->
+<!--
+        <property name="mapperLocations" value="classpath:com/em/dao/*.xml"></property>
+-->
+        <property name="mapperLocations">
+            <list>
+                <value>classpath*:com/em/dao/ReservationMapper.xml</value>
+                <value>classpath*:com/em/dao/RoleMapper.xml</value>
+                <value>classpath*:com/em/dao/RoomMapper.xml</value>
+                <value>classpath*:com/em/dao/UserMapper.xml</value>
+            </list>
+        </property>
+
+        <!--指定会话工厂使用的数据库连接池-->
+        <property name="dataSource" ref="dataSource"/>
+    </bean>
+
+    <!--Mapper接口代理(动态代理)方式实现Spring-Mybatis整合-->
+    <!--使用包扫描的方式批量实现代理
+        扫描后可以使用类名首字母小写进行引用-->
+    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+        <!--指定需要扫描的包的全路径名称,如果有多个包,用英文输入法状态下的逗号分隔。-->
+        <property name="basePackage" value="com.em.dao"/>
+        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
+    </bean>
+</beans>

+ 19 - 0
src/main/resources/ApplicationContext-Service.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+	http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/aop
+	http://www.springframework.org/schema/aop/spring-aop.xsd
+	http://www.springframework.org/schema/tx
+	http://www.springframework.org/schema/tx/spring-tx.xsd
+	http://www.springframework.org/schema/context
+	http://www.springframework.org/schema/context/spring-context.xsd">
+
+    <!--@Service扫描-->
+    <context:component-scan base-package="com.em.service.impl"></context:component-scan>
+</beans>

+ 75 - 0
src/main/resources/ApplicationContext-Shiro.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+	http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/context
+	http://www.springframework.org/schema/context/spring-context.xsd
+	http://www.springframework.org/schema/aop
+	http://www.springframework.org/schema/aop/spring-aop.xsd
+	http://www.springframework.org/schema/tx
+	http://www.springframework.org/schema/tx/spring-tx.xsd">
+
+    <!--组件扫描器-->
+    <context:component-scan base-package="com.em.realm" />
+
+    <!-- shiro过滤器bean,id要和web.xml中filter-name一致 -->
+    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
+        <property name="securityManager" ref="securityManager" />
+
+        <!-- 要求登录时的链接(登录页面地址),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
+        <!--<property name="loginUrl" value="/admin/show"></property>-->
+
+        <property name="filterChainDefinitions">
+            <value>
+                #这里相当于ini配置文件中的[urls]
+                #url=拦截器[参数],拦截器
+                # /techer/** = authc, perms[document:read]
+                # 如果用户没有该角色,然后访问该 路径 会报 401错误
+
+                /admin/** = authc, roles[admin]
+                /techer/** = authc, roles[teacher]
+                /student/** = authc, roles[student]
+
+                # 当访问login时,不用进行认证(anon表示匿名)
+                /login = anon
+
+                /logout = logout
+
+                # 配置静态资源可以匿名访问
+                /css/** = anon
+                /js/** = anon
+                /images/** = anon
+                /fonts/** = anon
+
+                # 除了上面额 /login 可以匿名访问,其他路径都需要登录访问
+                # 如果没登录,就访问其他路径会跳转到 /login 登录
+
+                /** = authc
+            </value>
+        </property>
+    </bean>
+
+
+    <!-- 配置securityManager -->
+    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
+        <!--配置自定义Realm-->
+        <!--loginRealm 使用扫描器扫描注册成功了-->
+        <property name="realm" ref="loginRealm" />
+        <!-- <property name="sessionMode" value="native"/> -->
+    </bean>
+    <!-- 生命周期 -->
+    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+
+
+    <!-- 启用shiro注解 -->
+    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
+    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
+        <property name="securityManager" ref="securityManager"/>
+    </bean>
+
+
+</beans>

+ 51 - 0
src/main/resources/ApplicationContext-Trans.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+	http://www.springframework.org/schema/beans/spring-beans.xsd
+	http://www.springframework.org/schema/aop
+	http://www.springframework.org/schema/aop/spring-aop.xsd
+	http://www.springframework.org/schema/tx
+	http://www.springframework.org/schema/tx/spring-tx.xsd
+	http://www.springframework.org/schema/context
+	http://www.springframework.org/schema/context/spring-context.xsd">
+
+    <!--Druid连接池配置-->
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
+        <property name="driverClassName" value="${jdbc.driver}"/>
+        <property name="url" value="${jdbc.url}"/>
+        <property name="username" value="${jdbc.username}"/>
+        <property name="password" value="${jdbc.password}"/>
+    </bean>
+
+    <!-- 事务管理器 -->
+    <bean id="transactionManager"
+          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <!-- 数据源 -->
+        <property name="dataSource" ref="dataSource" />
+    </bean>
+
+    <!-- 通知 -->
+    <tx:advice id="txAdvice" transaction-manager="transactionManager">
+        <tx:attributes>
+            <!-- 传播行为 -->
+            <tx:method name="save*" propagation="REQUIRED" />
+            <tx:method name="insert*" propagation="REQUIRED" />
+            <tx:method name="delete*" propagation="REQUIRED" />
+            <tx:method name="update*" propagation="REQUIRED" />
+            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
+            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
+        </tx:attributes>
+    </tx:advice>
+
+    <!-- 切面 -->
+    <aop:config>
+        <aop:advisor advice-ref="txAdvice"
+                     pointcut="execution(* com.em.service.*.*(..))" />
+    </aop:config>
+
+</beans>

+ 50 - 0
src/main/resources/SpringMvc.xml

@@ -0,0 +1,50 @@
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:p="http://www.springframework.org/schema/p"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
+        http://www.springframework.org/schema/mvc
+        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
+        http://code.alibabatech.com/schema/dubbo
+        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
+        http://www.springframework.org/schema/context
+        http://www.springframework.org/schema/context/spring-context-4.0.xsd">
+
+
+    <!--加载静态资源-->
+    <mvc:default-servlet-handler/>
+
+    <!--配置@Controller注解扫描-->
+    <context:component-scan base-package="com.em.controller"></context:component-scan>
+
+    <!--注解驱动:
+        自动配置最新版的注解的处理器映射器和处理器适配器-->
+    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
+
+    <!--配置视图解析器:
+        作用:在Controller中指定页面路径的时候就不用写页面的完整路径名和扩展名称了-->
+    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <!--真正的jsp访问路径是前缀+Controller里的 modelAndView.setViewName()的页面名称+后缀-->
+        <!--前缀-->
+        <property name="prefix" value="/WEB-INF/jsp/"></property>
+        <!--后缀-->
+        <property name="suffix" value=".jsp"></property>
+    </bean>
+
+    <!-- 配置自定义转换器
+	    注意: 一定要将自定义的转换器配置到注解驱动上
+	-->
+    <bean id="conversionService"
+          class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
+        <property name="converters">
+            <set>
+                <!-- 指定自定义转换器的全路径名称 -->
+                <bean class="com.em.controller.converter.StringToDateConverter"/>
+            </set>
+        </property>
+    </bean>
+
+</beans>

+ 7 - 0
src/main/resources/SqlMapConfig.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+
+</configuration>

+ 4 - 0
src/main/resources/db.properties

@@ -0,0 +1,4 @@
+jdbc.driver=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://47.94.89.44:3306/conference_room?characterEncoding=utf-8
+jdbc.username=root
+jdbc.password=123qwe!@#

+ 6 - 0
src/main/resources/log4j.properties

@@ -0,0 +1,6 @@
+# Global logging configuration
+log4j.rootLogger=DEBUG, stdout
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

+ 67 - 0
src/main/webapp/WEB-INF/jsp/admin/addRoom.jsp

@@ -0,0 +1,67 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+</head>
+<body>
+<!-- 顶栏 -->
+<jsp:include page="top.jsp"></jsp:include>
+<!-- 中间主体 -->
+<div class="container" id="content">
+	<div class="row">
+		<jsp:include page="menu.jsp"></jsp:include>
+		<div class="col-md-10">
+			<div class="panel panel-default">
+				<div class="panel-heading">
+					<div class="row">
+						<h1 style="text-align: center;">添加会议室信息</h1>
+					</div>
+				</div>
+				<div class="panel-body">
+					<form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/admin/addRoom" id="editfrom" method="post">
+
+						<div class="form-group">
+							<label for="inputPassword3" class="col-sm-2 control-label">会议室名称</label>
+							<div class="col-sm-10">
+								<input type="text" class="form-control" id="inputPassword3" name="name" placeholder="请输入会议室名称">
+							</div>
+						</div>
+
+						<div class="form-group">
+							<label for="inputPassword3" class="col-sm-2 control-label">详细信息</label>
+							<div class="col-sm-10">
+								<input type="text" class="form-control" name="message" placeholder="请录入会议室详细信息">
+							</div>
+
+						<div class="form-group" style="text-align: center">
+							<button class="btn btn-default" type="submit">提交</button>
+							<button class="btn btn-default" type="reset">重置</button>
+						</div>
+					</form>
+				</div>
+
+			</div>
+
+		</div>
+	</div>
+</div>
+<div class="container" id="footer">
+	<div class="row">
+		<div class="col-md-12"></div>
+	</div>
+</div>
+</body>
+<script type="text/javascript">
+    $("#nav li:nth-child(1)").addClass("active")
+</script>
+</html>

+ 71 - 0
src/main/webapp/WEB-INF/jsp/admin/editRoom.jsp

@@ -0,0 +1,71 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+</head>
+<body>
+	<!-- 顶栏 -->
+	<jsp:include page="top.jsp"></jsp:include>
+	<!-- 中间主体 -->
+		<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 style="text-align: center;">修改会议室信息</h1>
+						</div>
+				    </div>
+				    <div class="panel-body">
+						<form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/admin/editRoom" id="editForm" method="post">
+							  <div class="form-group">
+							    <label for="inputEmail3" class="col-sm-2 control-label">会议室编号</label>
+							    <div class="col-sm-10">
+							      <input readonly="readonly"  type="number" class="form-control" id="inputEmail3" value="${roomList.id}" name="id" placeholder="请输入课程号">
+							    </div>
+							  </div>
+							  <div class="form-group">
+							    <label for="inputPassword3" class="col-sm-2 control-label">会议室名称</label>
+									<div class="col-sm-10">
+							      <input type="text" class="form-control" id="inputPassword3" name="name" value="${roomList.name}" placeholder="请输入会议室名称">
+							    </div>
+							  </div>
+
+							<div class="form-group">
+								<label for="inputPassword3" class="col-sm-2 control-label">会议室详细信息</label>
+								<div class="col-sm-10">
+									<input type="text" class="form-control" name="message" value="${roomList.message}" placeholder="会议室详细信息">
+								</div>
+							</div>
+
+							<div class="form-group" style="text-align: center">
+								<button class="btn btn-default" type="submit">提交</button>
+								<button class="btn btn-default" type="reset">重置</button>
+							</div>
+						</form>
+				    </div>
+				    
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+	<div class="row">
+		<div class="col-md-12"></div>
+	</div>
+	</div>
+</body>
+
+</html>

+ 13 - 0
src/main/webapp/WEB-INF/jsp/admin/menu.jsp

@@ -0,0 +1,13 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+
+<div class="col-md-2">
+    <ul class="nav nav-pills nav-stacked" id="nav">
+        <li><a href="${pageContext.request.contextPath}/admin/showRoom">会议室信息管理<span class="glyphicon glyphicon-pencil pull-right"/></a></li>
+        <li><a href="${pageContext.request.contextPath}/admin/showReservation">预约审核管理<span class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/admin/showRecord">预约记录查询<span class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/admin/userRegister">用户注册管理<sapn class="glyphicon glyphicon-repeat pull-right" /></a></li>
+        <%--<li><a href="${pageContext.request.contextPath}/admin/passwordReset">修改密码<sapn class="glyphicon glyphicon-pencil pull-right" /></a></li>--%>
+        <li><a href="${pageContext.request.contextPath}/logout">退出系统<sapn class="glyphicon glyphicon-log-out pull-right" /></a></li>
+        <%--<li class="disabled"><a href="##">Responsive</a></li>--%>
+    </ul>
+</div>

+ 128 - 0
src/main/webapp/WEB-INF/jsp/admin/showRecord.jsp

@@ -0,0 +1,128 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>预约记录查询</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+
+	<!-- 中间主体 --><jsp:include page="top.jsp"></jsp:include>
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">预约记录查询</h1>
+							<%--<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/admin/queryUser" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入借用人姓名" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>--%>
+
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>会议室</th>
+									<th>借用日期</th>
+									<th>开始时间</th>
+									<th>结束时间</th>
+									<th>借用人</th>
+									<th>联系方式</th>
+									<th>状态</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${recordList}" var="item">
+								<tr>
+									<td>${item.name}</td>
+									<td><fmt:formatDate value="${item.date}" dateStyle="medium" pattern="yyyy-MM-dd"/></td>
+									<!--pattern="HH:mm:ss"为24小时计时法,pattern="hh:mm:ss"为12小时计时法-->
+									<td><fmt:formatDate value="${item.beginTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td><fmt:formatDate value="${item.endTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td>${item.user}</td>
+									<td>${item.mobile}</td>
+									<td>${item.mark}</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				    <div class="panel-footer">
+						<c:if test="${pagingVo != null}">
+							<nav style="text-align: center">
+								<ul class="pagination">
+									<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.upPageNo}">&laquo;上一页</a></li>
+									<li class="active"><a href="">${pagingVo.curentPageNo}</a></li>
+									<c:if test="${pagingVo.curentPageNo+1 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.curentPageNo+1}">${pagingVo.curentPageNo+1}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+2 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.curentPageNo+2}">${pagingVo.curentPageNo+2}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+3 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.curentPageNo+3}">${pagingVo.curentPageNo+3}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+4 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.curentPageNo+4}">${pagingVo.curentPageNo+4}</a></li>
+									</c:if>
+									<li><a href="${pageContext.request.contextPath}/admin/showRecord?page=${pagingVo.totalCount}">最后一页&raquo;</a></li>
+								</ul>
+							</nav>
+						</c:if>
+				    </div>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		$("#nav li:nth-child(3)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+			if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+				$(".pagination li:last-child").addClass("disabled")
+			};
+
+			if (${pagingVO.curentPageNo} == ${1}) {
+				$(".pagination li:nth-child(1)").addClass("disabled")
+			};
+        </c:if>
+
+        function confirmd() {
+            var msg = "您真的确定要删除吗?!";
+            if (confirm(msg)==true){
+                return true;
+            }else{
+                return false;
+            }
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 138 - 0
src/main/webapp/WEB-INF/jsp/admin/showReservation.jsp

@@ -0,0 +1,138 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>预约审核管理</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+
+	<!-- 中间主体 --><jsp:include page="top.jsp"></jsp:include>
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">预约审核管理</h1>
+							<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/admin/queryUser" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入借用人姓名" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>
+							<%--<button class="btn btn-default col-md-2" style="margin-top: 20px" onClick="location.href='${pageContext.request.contextPath}/admin/addTeacher'">
+								添加教师信息
+								<sapn class="glyphicon glyphicon-plus"/>
+							</button>--%>
+
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>预约编号</th>
+									<th>会议室</th>
+									<th>借用日期</th>
+									<th>开始时间</th>
+									<th>结束时间</th>
+									<th>借用人</th>
+									<th>联系方式</th>
+									<th>状态</th>
+									<th>操作</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${reservationList}" var="item">
+								<tr>
+									<td>${item.id}</td>
+									<td>${item.name}</td>
+									<td><fmt:formatDate value="${item.date}" dateStyle="medium" pattern="yyyy-MM-dd"/></td>
+									<!--pattern="HH:mm:ss"为24小时计时法,pattern="hh:mm:ss"为12小时计时法-->
+									<td><fmt:formatDate value="${item.beginTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td><fmt:formatDate value="${item.endTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td>${item.user}</td>
+									<td>${item.mobile}</td>
+									<td>${item.mark}</td>
+									<td>
+										<button class="btn btn-default btn-xs btn-info" onClick="location.href='${pageContext.request.contextPath}/admin/reviewReservation?id=${item.id}'">同意申请</button>
+									</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				    <div class="panel-footer">
+						<c:if test="${pagingVO != null}">
+							<nav style="text-align: center">
+								<ul class="pagination">
+									<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.upPageNo}">&laquo;上一页</a></li>
+									<li class="active"><a href="">${pagingVO.curentPageNo}</a></li>
+									<c:if test="${pagingVO.curentPageNo+1 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.curentPageNo+1}">${pagingVO.curentPageNo+1}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+2 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.curentPageNo+2}">${pagingVO.curentPageNo+2}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+3 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.curentPageNo+3}">${pagingVO.curentPageNo+3}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+4 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.curentPageNo+4}">${pagingVO.curentPageNo+4}</a></li>
+									</c:if>
+									<li><a href="${pageContext.request.contextPath}/admin/showReservation?page=${pagingVO.totalCount}">最后一页&raquo;</a></li>
+								</ul>
+							</nav>
+						</c:if>
+				    </div>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		$("#nav li:nth-child(2)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+			if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+				$(".pagination li:last-child").addClass("disabled")
+			};
+
+			if (${pagingVO.curentPageNo} == ${1}) {
+				$(".pagination li:nth-child(1)").addClass("disabled")
+			};
+        </c:if>
+
+        function confirmd() {
+            var msg = "您真的确定要删除吗?!";
+            if (confirm(msg)==true){
+                return true;
+            }else{
+                return false;
+            }
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 131 - 0
src/main/webapp/WEB-INF/jsp/admin/showRoom.jsp

@@ -0,0 +1,131 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>会议室信息显示</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+	<jsp:include page="top.jsp"></jsp:include>
+	<!-- 中间主体 -->
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">会议室信息管理</h1>
+							<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/admin/queryRoom" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入会议室" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>
+							<button class="btn btn-default col-md-2" style="margin-top: 20px" onClick="location.href='${pageContext.request.contextPath}/admin/addRoom'">
+								添加会议室信息
+								<sapn class="glyphicon glyphicon-plus"/>
+							</button>
+
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>会议室编号</th>
+									<th>会议室名称</th>
+									<th>详细信息</th>
+									<th>操作</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${roomList}" var="item">
+								<tr>
+									<td>${item.id}</td>
+									<td>${item.name}</td>
+									<td>${item.message}</td>
+									<td>
+										<button class="btn btn-default btn-xs btn-info" onClick="location.href='${pageContext.request.contextPath}/admin/editRoom?id=${item.id}'">修改</button>
+										<button class="btn btn-default btn-xs btn-danger btn-primary" onclick="removeRoom(${item.id})">删除</button>
+										<%--<button class="btn btn-default btn-xs btn-danger btn-primary" onClick="location.href='${pageContext.request.contextPath}/admin/removeRoom?id=${item.id}'">删除</button>--%>
+										<!--弹出框-->
+									</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				    <div class="panel-footer">
+						<c:if test="${pagingVO != null}">
+							<nav style="text-align: center">
+								<ul class="pagination">
+									<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.upPageNo}">&laquo;上一页</a></li>
+									<li class="active"><a href="">${pagingVO.curentPageNo}</a></li>
+									<c:if test="${pagingVO.curentPageNo+1 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.curentPageNo+1}">${pagingVO.curentPageNo+1}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+2 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.curentPageNo+2}">${pagingVO.curentPageNo+2}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+3 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.curentPageNo+3}">${pagingVO.curentPageNo+3}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+4 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.curentPageNo+4}">${pagingVO.curentPageNo+4}</a></li>
+									</c:if>
+									<li><a href="${pageContext.request.contextPath}/admin/showRoom?page=${pagingVO.totalCount}">最后一页&raquo;</a></li>
+								</ul>
+							</nav>
+						</c:if>
+				    </div>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		<%--设置菜单中选中背景色改变,nth-child(1)中参数1表示第1个导航栏,参数不可重复--%>
+		$("#nav li:nth-child(1)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+        if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+            $(".pagination li:last-child").addClass("disabled")
+        };
+
+        if (${pagingVO.curentPageNo} == ${1}) {
+            $(".pagination li:nth-child(1)").addClass("disabled")
+        };
+        </c:if>
+
+        function removeRoom(id) {
+			if(confirm('确认要删除该会议室吗?')) {
+				$.post("${pageContext.request.contextPath}/admin/removeRoom",{"id":id},function(data){
+					alert("会议室删除更新成功!");
+					window.location.reload();
+				});
+			}
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 57 - 0
src/main/webapp/WEB-INF/jsp/admin/top.jsp

@@ -0,0 +1,57 @@
+<%--
+  Created by IntelliJ IDEA.
+  User: Admiral
+  Date: 2017/11/28
+  Time: 9:30
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%--shiro标签--%>
+<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
+<!-- 顶栏 -->
+<div class="container" id="top">
+    <div class="row">
+        <div class="col-md-12">
+            <!--加入导航条标题-->
+            <div class="navbar navbar-default" role="navigation">
+                 <div class="navbar-header">
+                     <a href="##" class="navbar-brand">网上会议室预约系统(管理员)</a>
+                 </div>
+                <form action="##" class="navbar-form navbar-right" rol="search">
+                    <div class="dropdown">
+                        <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" style="margin-right: 20px; ">
+                            <%--登录用户名--%>
+                            <span class="glyphicon glyphicon-user"><shiro:principal/></span>
+                            <span class="caret"></span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
+                            <li role="presentation">
+                                <a role="menuitem" tabindex="-1" href="${pageContext.request.contextPath}/admin/showRoom">
+                                    <span class="glyphicon glyphicon-cog pull-right"></span>
+                                    修改会议室信息
+                                </a>
+                            </li>
+                            <li role="presentation" class="divider"></li>
+                            <li role="presentation">
+                                <a role="menuitem" tabindex="-1" href="${pageContext.request.contextPath}/admin/showReservation">
+                                    <span class="glyphicon glyphicon-cog pull-right"></span>
+                                    预约审核管理
+                                </a>
+                            </li>
+                            <!-分割线--->
+                            <li role="presentation" class="divider"></li>
+                            <li role="presentation">
+                                <a role="menuitem" tabindex="-1" href="${pageContext.request.contextPath}/logout">
+                                    <span class="glyphicon glyphicon-off pull-right"></span>
+                                    注销
+                                </a>
+                            </li>
+                        </ul>
+                    </div>
+
+                </form>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 81 - 0
src/main/webapp/WEB-INF/jsp/admin/userRegister.jsp

@@ -0,0 +1,81 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+</head>
+<body>
+<!-- 顶栏 -->
+<jsp:include page="top.jsp"></jsp:include>
+<!-- 中间主体 -->
+<div class="container" id="content">
+	<div class="row">
+		<jsp:include page="menu.jsp"></jsp:include>
+		<div class="col-md-10">
+			<div class="panel panel-default">
+				<div class="panel-heading">
+					<div class="row">
+						<h1 style="text-align: center;">用户注册管理</h1>
+					</div>
+				</div>
+				<div class="panel-body">
+					<form class="form-horizontal" name="newUser" role="form" action="${pageContext.request.contextPath}/admin/userRegister" id="editfrom" method="post" onsubmit="check()">
+						<div class="form-group">
+							<label for="inputEmail3" class="col-sm-2 control-label">用户(非管理员)</label>
+							<div class="col-sm-10">
+								<input type="text" class="form-control" name="id" id="inputEmail3" placeholder="请输入用户名">
+							</div>
+						</div>
+						<div class="form-group">
+							<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
+							<div class="col-sm-10">
+								<input type="password" class="form-control" id="inputPassword3" placeholder="请输入密码" name="password">
+							</div>
+						</div>
+						<div class="form-group">
+							<label for="inputPassword3" class="col-sm-2 control-label">确认密码</label>
+							<div class="col-sm-10">
+								<input type="password" class="form-control" name="password2" id="inputPassword3" placeholder="请再次输入密码">
+							</div>
+						</div>
+						<div class="form-group" style="text-align: center">
+							<button class="btn btn-default" type="submit">提交</button>
+							<button class="btn btn-default">重置</button>
+						</div>
+					</form>
+				</div>
+
+			</div>
+
+		</div>
+	</div>
+</div>
+<div class="container" id="footer">
+	<div class="row">
+		<div class="col-md-12"></div>
+	</div>
+</div>
+</body>
+<script>
+	$("#nav li:nth-child(4)").addClass("active")
+
+	function check() {
+		if(newUser.id.value==""||newUser.id.value==null)
+		{alert("请输入用户名称");return false;}
+		if(newUser.password.value==""||newUser.password.value==null)
+		{alert("请输入用户密码");return false;}
+		if(newUser.password2.value==""||newUser.password2.value==null)
+		{alert("请输入再次输入密码");return false;}
+		if(newUser.password.value != newUser.password2.value)
+		{alert("两次密码不一致,请重新输入");return false;}
+
+	}
+</script>
+</html>

+ 12 - 0
src/main/webapp/WEB-INF/jsp/error.jsp

@@ -0,0 +1,12 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%--开启el表达式--%>
+<%@ page  isELIgnored="false"%>
+
+<html>
+<head>
+    <title>错误提示</title>
+</head>
+<body>
+    <h1>${message}</h1>
+</body>
+</html>

+ 113 - 0
src/main/webapp/WEB-INF/jsp/ordinary/cancelApplication.jsp

@@ -0,0 +1,113 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>预约审核管理</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+
+	<!-- 中间主体 --><jsp:include page="top.jsp"></jsp:include>
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">预约审核管理</h1>
+							<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/ordinary/queryByUser" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入借用人姓名" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>
+							<%--<button class="btn btn-default col-md-2" style="margin-top: 20px" onClick="location.href='${pageContext.request.contextPath}/admin/addTeacher'">
+								添加教师信息
+								<sapn class="glyphicon glyphicon-plus"/>
+							</button>--%>
+
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>预约编号</th>
+									<th>会议室</th>
+									<th>借用日期</th>
+									<th>开始时间</th>
+									<th>结束时间</th>
+									<th>借用人</th>
+									<th>状态</th>
+									<th>操作</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${reserveList}" var="item">
+								<tr>
+									<td>${item.id}</td>
+									<td>${item.name}</td>
+									<td><fmt:formatDate value="${item.date}" dateStyle="medium" pattern="yyyy-MM-dd"/></td>
+									<!--pattern="HH:mm:ss"为24小时计时法,pattern="hh:mm:ss"为12小时计时法-->
+									<td><fmt:formatDate value="${item.beginTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td><fmt:formatDate value="${item.endTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td>${item.user}</td>
+									<td>${item.mark}</td>
+									<td>
+										<button class="btn btn-default btn-xs btn-info" onClick="location.href='${pageContext.request.contextPath}/ordinary/cancelApply?id=${item.id}'">取消申请</button>
+									</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		$("#nav li:nth-child(4)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+			if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+				$(".pagination li:last-child").addClass("disabled")
+			};
+
+			if (${pagingVO.curentPageNo} == ${1}) {
+				$(".pagination li:nth-child(1)").addClass("disabled")
+			};
+        </c:if>
+
+        function confirmd() {
+            var msg = "您真的确定要删除吗?!";
+            if (confirm(msg)==true){
+                return true;
+            }else{
+                return false;
+            }
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 13 - 0
src/main/webapp/WEB-INF/jsp/ordinary/menu.jsp

@@ -0,0 +1,13 @@
+<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+
+<div class="col-md-2">
+    <ul class="nav nav-pills nav-stacked" id="nav">
+        <li><a href="${pageContext.request.contextPath}/ordinary/showRoom">会议室信息<sapn class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/ordinary/showRecord">预约记录查询<span class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/ordinary/reserveRoom">预约会议室<sapn class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/ordinary/cancelApplication?user=<shiro:principal/>">取消预约申请<sapn class="glyphicon glyphicon-pencil pull-right" /></a></li>
+        <li><a href="${pageContext.request.contextPath}/logout">退出系统<sapn class="glyphicon glyphicon-log-out pull-right" /></a></li>
+        <%--<li class="disabled"><a href="##">Responsive</a></li>--%>
+    </ul>
+</div>

+ 209 - 0
src/main/webapp/WEB-INF/jsp/ordinary/reserveRoom.jsp

@@ -0,0 +1,209 @@
+<%@ page import="java.text.SimpleDateFormat" %>
+<%@ page import="java.util.Calendar" %>
+<%@ page import="java.util.Date" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.ArrayList" %>
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+    <title>预约会议室</title>
+
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <!-- 引入bootstrap -->
+    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+    <!-- 引入JQuery  bootstrap.js-->
+    <script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+    <script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+    <%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+<%
+    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+    String currDate = dateFormat.format(new Date());
+    List dateList=new ArrayList();
+    for (int i = 0; i < 16; i++) {
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(dateFormat.parse(currDate));
+
+        calendar.add(Calendar.DAY_OF_MONTH, i);
+
+        String nextDay= dateFormat.format(calendar.getTime());
+        dateList.add(nextDay);
+    }
+    request.setAttribute("dateList",dateList);
+%>
+<!-- 顶栏 -->
+<jsp:include page="top.jsp"></jsp:include>
+<!-- 中间主体 -->
+<div class="container" id="content">
+    <div class="row">
+        <jsp:include page="menu.jsp"></jsp:include>
+        <div class="col-md-10">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <div class="row">
+                        <h1 style="text-align: center;">添加会议室预约</h1>
+                    </div>
+                </div>
+                <div class="panel-body">
+                    <form class="form-horizontal" role="form"
+                          action="${pageContext.request.contextPath}/ordinary/reserveRoom" id="editfrom" method="post">
+
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label">会议室名称</label>
+                            <div class="col-sm-10">
+                                <select class="form-control" id="inputPassword3" name="name">
+                                    <c:forEach items="${nameList}" var="item">
+                                        <option value="${item.name}">${item.name}</option>
+                                    </c:forEach>
+                                </select>
+                                <%--<input type="text" class="form-control" id="inputPassword3" name="name" placeholder="请输入会议室名称">--%>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label">借用人</label>
+                            <div class="col-sm-10">
+                                <input readonly="readonly" type="text" class="form-control" id="inputPassword3-1" name="user"
+                                       value=<shiro:principal/>>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label" name="mobile">联系电话</label>
+                            <div class="col-sm-10">
+                                <input type="text" class="form-control" id="inputPassword3-2" name="mobile"
+                                       placeholder="请输入借用人联系电话">
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label" name="date">借用日期</label>
+                            <div  class="col-sm-10">
+                                <%--<input type="date" value="2018-01-01" name="date" />--%>
+                                <select class="form-control" name="date">
+                                    <option>${dateList[0]}</option>
+                                    <option >${dateList[1]}</option>
+                                    <option >${dateList[2]}</option>
+                                    <option >${dateList[3]}</option>
+                                    <option >${dateList[4]}</option>
+                                    <option >${dateList[5]}</option>
+                                    <option >${dateList[6]}</option>
+                                    <option >${dateList[7]}</option>
+                                    <option >${dateList[8]}</option>
+                                    <option >${dateList[9]}</option>
+                                    <option >${dateList[10]}</option>
+                                    <option >${dateList[11]}</option>
+                                    <option >${dateList[12]}</option>
+                                    <option >${dateList[13]}</option>
+                                    <option >${dateList[14]}</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label" name="beginTime">开始时间</label>
+                            <div class="col-sm-10">
+                                <select class="form-control" name="beginTime">
+                                    <option >9:00:00</option>
+                                    <option >9:30:00</option>
+                                    <option >10:00:00</option>
+                                    <option >10:30:00</option>
+                                    <option >11:00:00</option>
+                                    <option >11:30:00</option>
+                                    <option >12:00:00</option>
+                                    <option >12:30:00</option>
+                                    <option >13:00:00</option>
+                                    <option >13:30:00</option>
+                                    <option >14:00:00</option>
+                                    <option >14:30:00</option>
+                                    <option >15:00:00</option>
+                                    <option >15:30:00</option>
+                                    <option >16:00:00</option>
+                                    <option >16:30:00</option>
+                                    <option >17:00:00</option>
+                                    <option >17:30:00</option>
+                                    <option >18:00:00</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label for="inputPassword3" class="col-sm-2 control-label" name="endTime">结束时间</label>
+                            <div class="col-sm-10">
+                                <select class="form-control" name="endTime">
+                                    <option >9:00:00</option>
+                                    <option >9:30:00</option>
+                                    <option >10:00:00</option>
+                                    <option >10:30:00</option>
+                                    <option >11:00:00</option>
+                                    <option >11:30:00</option>
+                                    <option >12:00:00</option>
+                                    <option >12:30:00</option>
+                                    <option >13:00:00</option>
+                                    <option >13:30:00</option>
+                                    <option >14:00:00</option>
+                                    <option >14:30:00</option>
+                                    <option >15:00:00</option>
+                                    <option >15:30:00</option>
+                                    <option >16:00:00</option>
+                                    <option >16:30:00</option>
+                                    <option >17:00:00</option>
+                                    <option >17:30:00</option>
+                                    <option >18:00:00</option>
+                                </select>
+                            </div>
+                        </div>
+
+                        <div class="form-group" style="text-align: center">
+                            <button class="btn btn-default" type="submit">提交</button>
+                            <button class="btn btn-default" type="reset">重置</button>
+                        </div>
+                    </form>
+                </div>
+
+            </div>
+
+        </div>
+    </div>
+</div>
+<div class="container" id="footer">
+    <div class="row">
+        <div class="col-md-12"></div>
+    </div>
+</div>
+</body>
+<script type="text/javascript">
+    <%--设置菜单中--%>
+    $("#nav li:nth-child(3)").addClass("active")
+
+    <c:if test="${pagingVO != null}">
+    if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+        $(".pagination li:last-child").addClass("disabled")
+    }
+    ;
+
+    if (${pagingVO.curentPageNo} == ${1}) {
+        $(".pagination li:nth-child(1)").addClass("disabled")
+    }
+    ;
+    </c:if>
+
+    function confirmd() {
+        var msg = "您真的确定要删除吗?!";
+        if (confirm(msg) == true) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    $("#sub").click(function () {
+        $("#form1").submit();
+    });
+</script>
+</html>

+ 127 - 0
src/main/webapp/WEB-INF/jsp/ordinary/showRecord.jsp

@@ -0,0 +1,127 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>预约记录查询</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+
+	<!-- 中间主体 --><jsp:include page="top.jsp"></jsp:include>
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">预约记录查询</h1>
+							<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/ordinary/queryByUser" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入借用人" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>预约编号</th>
+									<th>会议室</th>
+									<th>借用人</th>
+									<th>借用日期</th>
+									<th>开始时间</th>
+									<th>结束时间</th>
+									<th>状态</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${recordList}" var="item">
+								<tr>
+									<td>${item.id}</td>
+									<td>${item.name}</td>
+									<td>${item.user}</td>
+									<td><fmt:formatDate value="${item.date}" dateStyle="medium" pattern="yyyy-MM-dd"/></td>
+									<!--pattern="HH:mm:ss"为24小时计时法,pattern="hh:mm:ss"为12小时计时法-->
+									<td><fmt:formatDate value="${item.beginTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td><fmt:formatDate value="${item.endTime}" dateStyle="medium" pattern="HH:mm:ss"/></td>
+									<td>${item.mark}</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				    <div class="panel-footer">
+						<c:if test="${pagingVo != null}">
+							<nav style="text-align: center">
+								<ul class="pagination">
+									<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.upPageNo}">&laquo;上一页</a></li>
+									<li class="active"><a href="">${pagingVo.curentPageNo}</a></li>
+									<c:if test="${pagingVo.curentPageNo+1 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.curentPageNo+1}">${pagingVo.curentPageNo+1}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+2 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.curentPageNo+2}">${pagingVo.curentPageNo+2}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+3 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.curentPageNo+3}">${pagingVo.curentPageNo+3}</a></li>
+									</c:if>
+									<c:if test="${pagingVo.curentPageNo+4 <= pagingVo.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.curentPageNo+4}">${pagingVo.curentPageNo+4}</a></li>
+									</c:if>
+									<li><a href="${pageContext.request.contextPath}/ordinary/showRecord?page=${pagingVo.totalCount}">最后一页&raquo;</a></li>
+								</ul>
+							</nav>
+						</c:if>
+				    </div>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		$("#nav li:nth-child(2)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+			if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+				$(".pagination li:last-child").addClass("disabled")
+			};
+
+			if (${pagingVO.curentPageNo} == ${1}) {
+				$(".pagination li:nth-child(1)").addClass("disabled")
+			};
+        </c:if>
+
+        function confirmd() {
+            var msg = "您真的确定要删除吗?!";
+            if (confirm(msg)==true){
+                return true;
+            }else{
+                return false;
+            }
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 120 - 0
src/main/webapp/WEB-INF/jsp/ordinary/showRoom.jsp

@@ -0,0 +1,120 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
+
+<!DOCTYPE html>
+<html>
+<head>
+	<title>会议室信息查询</title>
+
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+
+	<%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%>
+
+</head>
+<body>
+	<!-- 顶栏 -->
+	<jsp:include page="top.jsp"></jsp:include>
+	<!-- 中间主体 -->
+	<div class="container" id="content">
+		<div class="row">
+			<jsp:include page="menu.jsp"></jsp:include>
+			<div class="col-md-10">
+				<div class="panel panel-default">
+				    <div class="panel-heading">
+						<div class="row">
+					    	<h1 class="col-md-5">会议室信息查询</h1>
+							<form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/ordinary/queryRoom" id="form1" method="post">
+								<div class="input-group">
+									<input type="text" class="form-control" placeholder="请输入会议室" name="findByName">
+									<span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span>
+								</div>
+							</form>
+
+						</div>
+				    </div>
+				    <table class="table table-bordered">
+					        <thead>
+					            <tr>
+									<th>会议室编号</th>
+									<th>会议室名称</th>
+									<th>详细信息</th>
+					            </tr>
+					        </thead>
+					        <tbody>
+							<c:forEach  items="${roomList}" var="item">
+								<tr>
+									<td>${item.id}</td>
+									<td>${item.name}</td>
+									<td>${item.message}</td>
+								</tr>
+							</c:forEach>
+					        </tbody>
+				    </table>
+				    <div class="panel-footer">
+						<c:if test="${pagingVO != null}">
+							<nav style="text-align: center">
+								<ul class="pagination">
+									<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.upPageNo}">&laquo;上一页</a></li>
+									<li class="active"><a href="">${pagingVO.curentPageNo}</a></li>
+									<c:if test="${pagingVO.curentPageNo+1 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.curentPageNo+1}">${pagingVO.curentPageNo+1}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+2 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.curentPageNo+2}">${pagingVO.curentPageNo+2}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+3 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.curentPageNo+3}">${pagingVO.curentPageNo+3}</a></li>
+									</c:if>
+									<c:if test="${pagingVO.curentPageNo+4 <= pagingVO.totalCount}">
+										<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.curentPageNo+4}">${pagingVO.curentPageNo+4}</a></li>
+									</c:if>
+									<li><a href="${pageContext.request.contextPath}/ordinary/showRoom?page=${pagingVO.totalCount}">最后一页&raquo;</a></li>
+								</ul>
+							</nav>
+						</c:if>
+				    </div>
+				</div>
+
+			</div>
+		</div>
+	</div>
+	<div class="container" id="footer">
+		<div class="row">
+			<div class="col-md-12"></div>
+		</div>
+	</div>
+</body>
+	<script type="text/javascript">
+		<%--设置菜单中选中背景色改变,不同导航栏,nth-child(1)中参数1不可重复--%>
+		$("#nav li:nth-child(1)").addClass("active")
+
+        <c:if test="${pagingVO != null}">
+        if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) {
+            $(".pagination li:last-child").addClass("disabled")
+        };
+
+        if (${pagingVO.curentPageNo} == ${1}) {
+            $(".pagination li:nth-child(1)").addClass("disabled")
+        };
+        </c:if>
+
+        function removeRoom(id) {
+			if(confirm('确实要删除该客户吗?')) {
+				$.post("${pageContext.request.contextPath}/ordinary/removeRoom",{"id":id},function(data){
+					alert("客户删除更新成功!");
+					window.location.reload();
+				});
+			}
+        }
+
+        $("#sub").click(function () {
+            $("#form1").submit();
+        });
+	</script>
+</html>

+ 50 - 0
src/main/webapp/WEB-INF/jsp/ordinary/top.jsp

@@ -0,0 +1,50 @@
+<%--
+  Created by IntelliJ IDEA.
+  User: Jacey
+  Date: 2017/6/30
+  Time: 9:30
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<%--shiro标签--%>
+<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
+<!-- 顶栏 -->
+<div class="container" id="top">
+    <div class="row">
+        <div class="col-md-12">
+            <!--加入导航条标题-->
+            <div class="navbar navbar-default" role="navigation">
+                 <div class="navbar-header">
+                     <a href="##" class="navbar-brand">网上预约会议室系统</a>
+                 </div>
+                <form action="##" class="navbar-form navbar-right" rol="search">
+                    <div class="dropdown">
+                        <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" style="margin-right: 20px; ">
+                            <%--登录用户名--%>
+                            <span class="glyphicon glyphicon-user"><shiro:principal/></span>
+                            <span class="caret"></span>
+                        </button>
+                        <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
+                            <li role="presentation">
+                                <a role="menuitem" tabindex="-1" href="${pageContext.request.contextPath}/ordinary/reserveRoom">
+                                    <span class="glyphicon glyphicon-cog pull-right"></span>
+                                    添加会议室预约
+                                </a>
+                            </li>
+                            <!-分割线--->
+                            <li role="presentation" class="divider"></li>
+                            <li role="presentation">
+                                <a role="menuitem" tabindex="-1" href="${pageContext.request.contextPath}/logout">
+                                    <span class="glyphicon glyphicon-off pull-right"></span>
+                                    注销
+                                </a>
+                            </li>
+                        </ul>
+                    </div>
+
+                </form>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 16 - 0
src/main/webapp/WEB-INF/jsp/success.jsp

@@ -0,0 +1,16 @@
+<%--
+  Created by IntelliJ IDEA.
+  User: Admiral
+  Date: 2017/11/28
+  Time: 21:17
+  To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<html>
+<head>
+    <title>成功页面</title>
+</head>
+<body>
+    <h1>操作成功</h1>
+</body>
+</html>

+ 75 - 0
src/main/webapp/WEB-INF/web.xml

@@ -0,0 +1,75 @@
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+         version="3.0">
+  <display-name>Archetype Created Web Application</display-name>
+  
+  <welcome-file-list>
+    <welcome-file>login.jsp</welcome-file>
+  </welcome-file-list>
+
+  <!-- 加载spring容器 -->
+  <context-param>
+    <param-name>contextConfigLocation</param-name>
+    <param-value>classpath:ApplicationContext-*.xml</param-value>
+  </context-param>
+  <listener>
+    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+  </listener>
+
+
+  <!-- springmvc前端控制器 -->
+  <servlet>
+    <servlet-name>springMvc</servlet-name>
+    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+    <init-param>
+      <param-name>contextConfigLocation</param-name>
+      <param-value>classpath:SpringMvc.xml</param-value>
+    </init-param>
+    <!-- 在tomcat启动的时候就加载这个servlet -->
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>springMvc</servlet-name>
+    <!--
+    *.action    代表拦截后缀名为.action结尾的
+    / 			拦截所有但是不包括.jsp
+    /* 			拦截所有包括.jsp
+     -->
+    <!--<url-pattern>*.action</url-pattern>-->
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
+  <!-- 配置post请求乱码 -->
+  <filter>
+    <filter-name>CharacterEncodingFilter</filter-name>
+    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+    <init-param>
+      <param-name>encoding</param-name>
+      <param-value>utf-8</param-value>
+    </init-param>
+  </filter>
+  <filter-mapping>
+    <filter-name>CharacterEncodingFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+  <!--Shiro拦截器 shiro入口-->
+  <filter>
+    <filter-name>shiroFilter</filter-name>
+    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+    <init-param>
+      <param-name>targetFilterLifecycle</param-name>
+      <param-value>true</param-value>
+    </init-param>
+  </filter>
+  <filter-mapping>
+    <filter-name>shiroFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+</web-app>

+ 587 - 0
src/main/webapp/css/bootstrap-theme.css

@@ -0,0 +1,587 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #2e6da4;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+@media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+    background-repeat: repeat-x;
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #286090;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */

Файловите разлики са ограничени, защото са твърде много
+ 6 - 0
src/main/webapp/css/bootstrap-theme.min.css


Файловите разлики са ограничени, защото са твърде много
+ 6757 - 0
src/main/webapp/css/bootstrap.css


Файловите разлики са ограничени, защото са твърде много
+ 6 - 0
src/main/webapp/css/bootstrap.min.css


+ 0 - 0
src/main/webapp/fonts/glyphicons-halflings-regular.eot


Файловите разлики са ограничени, защото са твърде много
+ 288 - 0
src/main/webapp/fonts/glyphicons-halflings-regular.svg


+ 0 - 0
src/main/webapp/fonts/glyphicons-halflings-regular.ttf


+ 0 - 0
src/main/webapp/fonts/glyphicons-halflings-regular.woff


+ 0 - 0
src/main/webapp/fonts/glyphicons-halflings-regular.woff2


BIN
src/main/webapp/images/view.jpg


Файловите разлики са ограничени, защото са твърде много
+ 2377 - 0
src/main/webapp/js/bootstrap.js


Файловите разлики са ограничени, защото са твърде много
+ 7 - 0
src/main/webapp/js/bootstrap.min.js


Файловите разлики са ограничени, защото са твърде много
+ 4 - 0
src/main/webapp/js/jquery-3.2.1.min.js


+ 13 - 0
src/main/webapp/js/npm.js

@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')

+ 55 - 0
src/main/webapp/login.jsp

@@ -0,0 +1,55 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<!-- 引入bootstrap -->
+	<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
+	<!-- 引入JQuery  bootstrap.js-->
+	<script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
+	<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
+	<style type="text/css">
+	body{
+	   background: url(images/view.jpg)repeat;
+	}
+	#login-box {
+		/*border:1px solid #F00;*/
+		padding: 35px;
+		border-radius:15px;
+		background: #56666B;
+		color: #fff;
+	}
+
+	</style>
+</head>
+<body>
+	<div class="container" id="top">
+		<div class="row" style="margin-top: 280px; ">
+			<div class="col-md-4"></div>
+			<div class="col-md-4" id="login-box">
+				<form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/login" id="from1" method="post">
+				  <div class="form-group">
+				    <label for="firstname" class="col-sm-3 control-label">用户名:</label>
+				    <div class="col-sm-9">
+				      <input type="text" class="form-control" id="id" placeholder="请输入名字" name="id">
+				    </div>
+				  </div>
+				  <div class="form-group">
+				    <label for="lastname" class="col-sm-3 control-label">密&nbsp;&nbsp;&nbsp;码:</label>
+				    <div class="col-sm-9">
+				      <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
+				    </div>
+				  </div>
+				  <div class="form-group pull-right" style="margin-right: 15px;">
+				    <div class="col-sm-offset-2 col-sm-10">
+				      <button type="submit" class="btn btn-default btn-info">登录</button>
+				    </div>
+				  </div>
+				</form>
+			</div>
+			<div class="col-md-4"></div>
+		</div>		
+	</div>
+</body>
+</html>