├── .gitignore ├── README.md ├── library.sql ├── pom.xml └── src └── main ├── java └── com │ └── lt │ ├── dao │ ├── BookDao.java │ ├── PageDao.java │ ├── UserDao.java │ └── impl │ │ ├── BookDaoImpl.java │ │ ├── PageDaoImpl.java │ │ └── UserDaoImpl.java │ ├── domain │ ├── Book.java │ ├── PageBean.java │ └── User.java │ ├── service │ ├── BookService.java │ ├── PageService.java │ ├── UserService.java │ └── impl │ │ ├── BookServiceImpl.java │ │ ├── PageServiceImpl.java │ │ └── UserServiceImpl.java │ ├── util │ └── JDBCUtils.java │ └── web │ ├── filter │ └── LoginFilter.java │ └── servlet │ ├── AddBookServlet.java │ ├── BookListServlet.java │ ├── CheckCodeServlet.java │ ├── DelBookServlet.java │ ├── DelSelectedServlet.java │ ├── FindBookByPageServlet.java │ ├── FindBookServlet.java │ ├── LoginServlet.java │ └── UpdateBookServlet.java ├── resources └── druid.properties └── webapp ├── WEB-INF └── web.xml ├── add.jsp ├── css ├── bootstrap-theme.css ├── bootstrap-theme.min.css ├── bootstrap.css └── bootstrap.min.css ├── fonts ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── img ├── bgr.jpg └── gou.png ├── js ├── bootstrap.js ├── bootstrap.min.js └── jquery-2.1.0.min.js ├── list.jsp ├── login.jsp └── update.jsp /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files and Maven 2 | target/ 3 | pom.xml.tag 4 | pom.xml.releaseBackup 5 | pom.xml.versionsBackup 6 | pom.xml.next 7 | release.properties 8 | dependency-reduced-pom.xml 9 | buildNumber.properties 10 | .mvn/timing.properties 11 | 12 | # Compiled class files 13 | *.class 14 | 15 | # Log Files 16 | *.log 17 | 18 | # About IntelliJ 19 | *.iml 20 | /.idea/ 21 | /out/ 22 | 23 | # BlueJ files 24 | *.ctxt 25 | 26 | # Mobile Tools for Java (J2ME) 27 | .mtj.tmp/ 28 | 29 | # macOS 30 | .DS_Store 31 | 32 | # Package Files 33 | *.jar 34 | *.war 35 | *.ear 36 | *.zip 37 | *.tar.gz 38 | *.rar 39 | 40 | # CMake 41 | cmake-build-debug/ 42 | 43 | # File-based project format 44 | *.iws 45 | 46 | # mpeltonen/sbt-idea plugin 47 | .idea_modules/ 48 | 49 | # JIRA plugin 50 | atlassian-ide-plugin.xml 51 | 52 | # Crashlytics plugin (for Android Studio and IntelliJ) 53 | com_crashlytics_export_strings.xml 54 | crashlytics.properties 55 | crashlytics-build.properties 56 | fabric.properties 57 | 58 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 图书管理系统 2 | 3 | > 基于Servlet+JSP+MySQL+JDBCTemplate+Druid+BeanUtils+tomcat(代码没有error,但是在前端显示上有BUG---目前未找到BUG所在---伤心) 4 | 5 | ### 基本信息: 6 | 7 | - **开发环境**:windows10+jdk1.8+Tomcat8+IDEA+MySQL+MVC开发模式 8 | 9 | - 注意:IDE为 `jetbrains IntelliJ IDEA` ,不知道导入Eclipse会出现什么问题。 10 | 11 | - **注意事项**: 调试之前请创建名为library的数据库,相关sql脚本为项目根目录下`library.sql`;并且需要导入相关jar包(相关jar包已经放在该目录下---lib.zip) 12 | 并且在resource中需要配置druid.properties的相关数据库配置文件 13 | 14 | - **存在问题**:管理员登录之后进入主页面不会直接显示图书信息,需要点击查询按钮后才能显示图书信息; 15 | 16 | - 当进行修改或者添加书籍后,也需要重新点击查询按钮之后才能显示图书信息;部分图书信息的描述图片以及相关内容不能显示。 17 | 18 | #### 项目细节描述: 19 | 20 | 1. **登录**: 21 | 其中的验证码可以点击刷新并且不区分大小写 22 | 23 | 2. **主页**: 24 | 1. 可以通过部分(名字)书名、作者或者类别来进行查询 25 | 2. 可以通过点击全选来选中该页面所有书籍 26 | 3. 当通过书名、作者或者类别来查询时在点击下方的下页,输入框中会回显输入记录 27 | 28 | 3. **增加**: 29 | 增加的书籍会有命名的显示规则,需正确输入命名规则才能进行添加书籍 30 | 31 | 4. **修改**: 32 | 点击修改后进入进入修改页面中输入框也会回显出主页面的书籍的信息,但是部分书籍信息不能显示完全 33 | 34 | 5. **删除**: 35 | 可以通过点击全选框在点击删除选中进行多个删除;也可进行单个删除 36 | -------------------------------------------------------------------------------- /library.sql: -------------------------------------------------------------------------------- 1 | --创建数据库 2 | create database homework; 3 | --创建管理员表单 4 | create table user( 5 | id int primary key not null auto_increment, 6 | username varchar (32) not null , 7 | password varchar (32) not null 8 | ); 9 | --插入管理员数据 10 | insert into user values (null ,"李腾", "632005010111"); 11 | insert into user values (null ,"王萍", "632007060118"); 12 | insert into user values (null ,"田雨", "632007060108"); 13 | --创建书籍表单 14 | create table book( 15 | id int not null auto_increment primary key, 16 | name varchar(32) not null, 17 | price double(10,0) not null, 18 | author varchar(255) not null, 19 | type varchar(32) not null, 20 | pdate date not null, 21 | description varchar(255) default null, 22 | detail text default null, 23 | address varchar(30) not null 24 | ) CHARSET=utf8; 25 | --插入书籍信息数据(重复插入5次) 26 | INSERT INTO `book` VALUES (null, 'Java核心技术', '99', '[美] 凯 S.霍斯特曼', '编程语言', '2018-03-26', 'Java领域具有影响力和价值的著作之一', '

编辑推荐

  Java领域*有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评 
  根据Java SE 8全面更新,系统全面讲解Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强 ?? 
  一直以来,《Java核心技术》都被认为是面向高级程序员的经典教程和参考书,它内容翔实、客观准确,不拖泥带水,是想为实际应用编写健壮Java代码的程序员的选。如今,本版进行了全面更新, 以反映近年来人们翘首以待、变革*大的Java版本(Java SE 8)的内容。这一版经过重写,并重新组织,全面阐释了新的Java SE 8特性、惯用法和*佳实践,其中包含数百个示例程序,所有这些代码都经过精心设计,不仅易于理解,也很容易实际应用。 
  本书为专业程序员解决实际问题而写,可以帮助你深入了解Java语言和库。在卷I中,Horstmann主要强调基本语言概念和现代用户界面编程基础,深入介绍了从Java面向对象编程到泛型、集合、lambda表达式、Swing UI设计以及并发和函数式编程的*新方法等内容。 
  通过阅读本书,你将: 
  充分利用你现有的编程知识快速掌握核心Java语法 
  了解Java中封装、类和继承如何工作 
  掌握利用接口、内部类和lambda表达式来实现函数式编程 
  利用异常处理和有效调试提高程序健壮性 
  利用泛型和强类型编写更安全、更可读的程序 
  使用预建集合收集多个对象以便以后获取 
  从头开始掌握并发编程技术 
  利用标准Swing组件构建现代跨平台GUI 
  部署可配置应用和applet,并通过互联网发布 
  利用新的函数式技术简化并发性和提高性能 
  如果你是一个资深程序员,刚刚转向Java SE 8,本书绝对是可靠、实用的“伙伴”,不仅现在能帮助你,在未来的很多年还会继续陪伴你前行。 

内容简介

  Java领域*有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。第10版根据Java SE 8全面更新,同时修正了第9版中的不足,系统全面讲解了Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强。 
  本书共14章。第1章概述Java语言与其他程序设计语言不同的性能;第2章讲解如何下载和安装JDK及本书的程序示例;第3章介绍变量、循环和简单的函数;第4章讲解类和封装;第5章介绍继承;第6章解释接口和内部类;第7章讨论异常处理,并给出大量实用的调试技巧;第8章概要介绍泛型程序设计;第9章讨论Java平台的集合框架;第10章介绍GUI程序设计,讨论如何建立窗口、如何在窗口中绘图、如何利用几何图形绘图、如何采用多种字体格式化文本,以及如何显示图像;第11章详细讨论抽象窗口工具包的事件模型;第12章详细讨论Swing GUI工具包;第13章介绍如何将程序部署为应用或applet;第14章讨论并发。本书最后还有一个附录,其中列出了Java语言的保留字。 

作者简介

  凯 S. 霍斯特曼(Cay S. Horstmann),圣何塞州立大学计算机科学系教授、Java的倡导者,经常在开发人员会议上发表演讲。他是《Core Java for the Impatient》(2015)《Java SE 8 for the Really Impatient》(2014)和《Scala for the lmpatient》(2012)的作者,这些书均由Addison-Wesley出版。他为专业程序员和计算机科学专业学生编写过数十本图书。

', 'TP312-1889'); 27 | INSERT INTO `book` VALUES (null, 'Java编程思想', '99', '[美] Bruce Eckel', '编程语言', '2018-04-10', '《计算机科学丛书:Java编程思想(第4版)》', '

更多参数>>


\"\"

  商品基本信息,请以下列介绍为准
商品名称:

Java核心技术卷II:高级特性+Java核心技术卷I:基础知识(原书第10版)+JAVA编程思想 3册

市场价:   366元
ISBN号:   9787111547426   9787111573319    9787111213826
出版社:   机械工业
商品类型:  图书


  其他参考信息(以实物为准)
  装帧:平装  开本:16开  语种:中文
  出版时间:2017-01-01  版次:1  页数: 
  印刷时间:2017-01-01  印次:1  字数: 千字


  编辑推荐
Java领域*有影响力和价值的著作之一,与《Java编程思想》齐名,10余年全球畅销不衰,广受好评 
根据Java SE 8全面更新,系统全面讲解Java语言的核心概念、语法、重要特性和开发方法,包含大量案例,实践性强 ?? 
一直以来,《Java核心技术》都被认为是面向高级程序员的经典教程和参考书,它内容翔实、客观准确,不拖泥带水,是想为实际应用编写健壮 Java代码的程序员的*选。如今,本版进行了全面更新, 以反映近年来人们翘首以待、变革*大的Java版本(Java SE 8)的内容。这一版经过重写,并重新组织,全面阐释了新的Java SE 8特性、惯用法和*佳实践,其中包含数百个示例程序,所有这些代码都经过精心设计,不仅易于理解,也很容易实际应用。 
本书为专业程序员解决实际问题而写,可以帮助你深入了解Java语言和库。在卷I中,Horstmann主要强调基本语言概念和现代用户界面 编程基础,深入介绍了从Java面向对象编程到泛型、集合、lambda表达式、Swing UI设计以及并发和函数式编程的*新方法等内容。 
通过阅读本书,你将: 
充分利用你现有的编程知识快速掌握核心Java语法 
了解Java中封装、类和继承如何工作 
掌握利用接口、内部类和lambda表达式来实现函数式编程 
利用异常处理和有效调试提高程序健壮性 
利用泛型和强类型编写更安全、更可读的程序 
使用预建集合收集多个对象以便以后获取 
从头开始掌握并发编程技术 
利用标准Swing组件构建现代跨平台GUI 
部署可配置应用和applet,并通过互联网发布 
利用新的函数式技术简化并发性和提高性能 
如果你是一个资深程序员,刚刚转向Java SE 8,本书*是可靠、实用的“伙伴”,不仅现在能帮助你,在未来的很多年还会继续陪伴你前行。


', 'TZ558-1584'); 28 | INSERT INTO `book` VALUES (null, '物理学基础', '150', '[美] 哈里斯(Thomas A.Harris)', '物理学', '2017-10-11', '出版社:机械工业出版社', '

\"\"

内容简介

  《时代教育·国外高校优秀教材精选:物理学基础(原书第6版)》最大的特点是,以鲜活的例子激发学生的学习兴趣,一步一步地引导学生掌握知识,提高学生应用物理知识的能力。它在编排上的主要特色是:(1)设有章前提问,即每章开头都提出一个有趣的疑难问题,同时配以照片,并在这章适当处给予解答,以激发学生的学习兴趣;(2) 设置检查点,用以有效检查学生对刚学内容的理解程度;(3)例题重概念、重技能,即每道例题均由解题的一个或多个关键点及全部解答的详细步骤构成,以帮助学生理解、掌握所学概念,培养学生的解题技巧;(4)给出解题线索,指导性强,易于学生掌握解题方法,避开常犯错误;(5) 每章后均有复习和小结;(6)设置推理性问题;(7)附加题重应用。
  《时代教育·国外高校优秀教材精选:物理学基础(原书第6版)》适合高等学校学生使用,也是广大教师(包括中学教师)、物理科研人员和物理爱好者十分有价值的参考书。



目录

译者的话
前言
第1卷
第1篇
第1章 测量
第2章 直线运动
第3章 矢量
第4章 二维和三维的运动
第5章 力与运动(Ⅰ)
第6章 力与运动(Ⅱ)
第7章 动能和功
第8章 势能与能量守恒
第9章 质点系
第10章 碰撞
第11章 转动
第12章 滚动、力矩和角动量
第2篇
第13章 平衡与弹性
第14章 引力
第15章 流体
第16章 振动
第17章 波(Ⅰ)
第18章 波(Ⅱ)
第19章 温度、热量和热力学第一定律
第20章 气体动理论
第21章 熵和热力学第二定律
第2卷
第3篇
第22章 电荷
第23章 电场
第24章 高斯定律
第25章 电势
第26章 电容
第27章 电流与电阻
第28章 电路
第29章 磁场
第30章 电流的磁场
第31章 感应与电感
第32章 磁场中的物质:麦克斯韦方程
第33章 电磁振荡与交流电
第4篇
第34章 电磁波
第35章 像
第36章 干涉
第37章 衍射
第38章 相对论
第5篇
第39章 光子和物质波
第40章 再论物质波
第41章 原子统论
第42章 固体的导电
第43章 核物理1
第44章 核能
第45章 夸克、轻子和大爆炸
附录
附录A国际单位制(SI)
附录B一些物理基本常量
附录C一些天文数据
附录D换算因子
附录E数学公式
附录F元素的性质
附录G元素周期表
答案
检查点、奇数题号的思考题以及练习和习题的答案
索引

查看全部↓

前言/序言



\"\"
\"\"


', 'PY487-1475'); 29 | INSERT INTO `book` VALUES (null, '呐喊', '45', '鲁迅', '文学', '2018-01-09', '教育部推荐新课标同步课外阅读', '

产品特色

内容简介

  《呐喊》这部短篇集诞生于五四运动及新文化运动的大背景之下,收录了鲁迅从1918年至1922年所创作的14篇短篇小说,其中包括《狂人日记》、《孔乙己》、《药》、《明天》、《一件小事》、《头发的故事》、《风波》、《故乡》、《阿Q正传》、《端午节》、《白光》、《兔和猫》、《鸭的喜剧》以及《社戏》。其中《狂人日记》、《阿Q正传》、《孔乙己》、《故乡》等更是成为传世名篇,艺术价值极高。小说生动真实地描绘了从辛亥革命到“五四”时期的社会生活,揭示了种种深层次的社会矛盾,对中国麻木、愚昧的国民性进行批判,表现出对民族生存浓重的忧患意识和对社会变革的强烈渴望,呈现了鲁迅先生爱国主义思想的发展、探求救国救民道路的精神历程。 
  这部小说集是中国现代小说的开端与成熟的标志,开创了现代现实主义文学的先河。作品通过写实主义、象征主义、浪漫主义等多种手法,以传神的笔触和“画眼睛”、“写灵魂”的艺术技巧,形象生动地塑造了狂人、孔乙己、阿Q等一批不朽的艺术形象。它不仅是新文化运动的一面旗帜,更是鲁迅对封建旧礼教、旧思想开战的有力宣言。 
  文中反讽手法比比皆是,表面上看在冷静地叙述事件的始末,其实是反话正说,在叙述中暗含着“言在此而意在彼”的巧妙讽刺。鲁迅笔下所描绘的一幕幕悲惨的生存画面,展现出一系列形象逼真,个性鲜明的劳苦大众,真实地再现了我国处于辛亥革命时期的农村生活状况。 

作者简介

  鲁迅(1881~1936),原名樟寿,字豫才,后改名周树人,浙江绍兴人。我国现代伟大的无产阶级文学家,思想家,革命家,世界十大文豪之一,是中国现代文学的一面旗帜。他的著作主要以小说、杂文、散文为主,代表作有:小说集《呐喊》《彷徨》《故事新编》,散文集《朝花夕拾》,散文诗集《野草》,杂文集《热风》《华盖集》《华盖集续编》《南腔北调集》《三闲集》《二心集》《而已集》《坟》等。鲁迅以笔代戈、奋笔疾书、战斗一生,被誉为“中国现代文学之父”。 

', 'WX574-0158'); 30 | INSERT INTO `book` VALUES (null, '人教版化学', '2', '化学老师', '化学', '2018-02-06', '人教版化学书是一本非常好的书籍', '


\"\"
\"\"

', 'LT823-0823'); 31 | INSERT INTO `book` VALUES (null, '本草纲目', '25', '李时珍', '医学', '2018-04-02', '图解本草纲目(《本草纲目》图解版本,畅销百万册', '

编辑推荐

  北京中医药大学博导王致谱亲自审订的文本

  养生诊疗方剂大全 家庭必备实用药典

  ◆大量彩色照片及2500余幅内文插图,协助解析《本草纲目》。

  ◆以*完整的金陵本为蓝本,参校他本,精编精校,专家审订。

  ◆收药1892种,附有11000多个药方,天下生民*切于实用的一部生活大典。

  ◆普及中医药知识,再现中医理论精髓,让中医药更好地为全人类服务。

内容简介

  《本草纲目》对16世纪以前的中医药学的进行了系统的总结,被誉为“东方药物巨典”,对人类近代科学以及医学方面影响较大,是我国医药宝库中的一份珍贵遗产。

  《(插图本)本草纲目》对这部中医药巨典进系了完整严谨的点校整理,并请北京中医药大学博导王致谱亲自审订,另加两千余幅图片辅助理解。本书是众多版本中切于实用的文本。

作者简介

  [明]李时珍(1518—1593),字东璧,晚年自号濒湖山人,湖北蕲春县蕲州镇东长街之瓦屑坝(今博士街)人。明代著名医药学家,著述有《奇经八脉考》、《濒湖脉学》、《本草纲目》等多种。

  李伯钦: 1963年生于北京,1985年毕业于北京大学中文系。在中华书局从事编辑工作八年,负责《国务院古籍整理出版情况简报》编辑与出版。1997年创建智品图书(北京)有限公司,任董事长兼总编辑。先后策划的文化项目有《唐宋八大家全集》、《康熙字典(现代版)》、《说文解字(现代版)》、《中国历代碑刻书法全集》、《百衲本二十四史(标点本)》、“家藏四库”百部系列、《中国通史》《东方圣典》等;其中有多种图书荣获国家和省级出版奖项。

前言/序言

  神农尝百草,这个只存在于神话传说中的故事,已经流传了几千年。本草保佑了华夏民族的繁衍和健康,至唐代,出现了世界上第一部由国家编定和颁布的药典——《唐本草》。唐以后,盛朝必修“本草”,明朝时,李时珍集大量古代本草书籍之大成,编写出一部中医学、药物学的专著——《本草纲目》。书中记载药物一千八百多种,方剂一万多个,全面总结了16世纪以前的中国医药学,是中国医药学的全典和中华医药的百科全书,被誉为“东方医药巨典”。

  《本草纲目》中的一些资料,直接影响了达尔文生物进化论的形成。达尔文在奠定进化论、论证人工选择原理的过程中,参阅了《本草纲目》,并称它为“中国古代百科全书”。如达尔文在《变异》中谈到鸡的变种、金鱼家化史等,均吸取和引用了《本草纲目》的内容。李约瑟博士在评价《本草纲目》时写道:“毫无疑问,明代最伟大的科学成就,是李时珍那部在本草书中登峰造极的著作《本草纲目》。”“中国博物学家中‘无冕之王’李时珍写的《本草纲目》,至今这部伟大著作仍然是研究中国文化史的化学史和其他各门科学史的一个取之不尽的知识源泉。”


', 'YX258-1458'); 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | javaweb_homework 9 | 1.0-SNAPSHOT 10 | javaweb_homework 11 | war 12 | 13 | 14 | UTF-8 15 | 1.8 16 | 1.8 17 | 5.7.1 18 | 19 | 20 | 21 | 22 | javax.servlet 23 | javax.servlet-api 24 | 4.0.1 25 | provided 26 | 27 | 28 | org.junit.jupiter 29 | junit-jupiter-api 30 | ${junit.version} 31 | test 32 | 33 | 34 | org.junit.jupiter 35 | junit-jupiter-engine 36 | ${junit.version} 37 | test 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.apache.maven.plugins 45 | maven-war-plugin 46 | 3.3.1 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/BookDao.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao; 2 | 3 | import com.lt.domain.Book; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Author: lt 9 | * Date: 2021/10/18 - 20:13 10 | **/ 11 | 12 | /** 13 | * 操作书籍总信息的DAO---数据访问层 14 | */ 15 | public interface BookDao { 16 | /** 17 | * 查询所有书籍信息 18 | * @return 书籍信息 19 | */ 20 | List queryAllBooks(); 21 | 22 | /** 23 | * 增加书籍信息 24 | * @param book 25 | */ 26 | void addBook(Book book); 27 | 28 | /** 29 | * 删除书籍信息 30 | * @param id 31 | */ 32 | void deleteBook(int id); 33 | 34 | /** 35 | * 根据id查询书籍 36 | * @param id 37 | * @return 38 | */ 39 | Book queryBookById(int id); 40 | 41 | /** 42 | * 更改书籍信息 43 | * @param book 44 | */ 45 | void updateBook(Book book); 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/PageDao.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao; 2 | 3 | import com.lt.domain.Book; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | /** 9 | * Author: lt 10 | * Date: 2021/10/19 - 9:41 11 | **/ 12 | public interface PageDao { 13 | /** 14 | * 查询总记录数 15 | * @return 16 | * @param condition 17 | */ 18 | int findTotalCount(Map condition); 19 | 20 | /** 21 | * 分页查询每页记录 22 | * @param start 23 | * @param rows 24 | * @param condition 25 | * @return 26 | */ 27 | List findByPage(int start, int rows, Map condition); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/UserDao.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao; 2 | 3 | import com.lt.domain.User; 4 | 5 | /** 6 | * Author: lt 7 | * Date: 2021/10/17 - 20:55 8 | **/ 9 | 10 | /** 11 | * 管理员操作的DAO---数据访问层 12 | */ 13 | public interface UserDao { 14 | /** 15 | * 用于判断管理员登录 16 | * @param username 17 | * @param password 18 | * @return 19 | */ 20 | User findUserByUsernameAndPassword(String username, String password); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/impl/BookDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao.impl; 2 | 3 | import com.lt.dao.BookDao; 4 | import com.lt.domain.Book; 5 | import com.lt.util.JDBCUtils; 6 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 7 | import org.springframework.jdbc.core.JdbcTemplate; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Author: lt 13 | * Date: 2021/10/18 - 20:14 14 | **/ 15 | public class BookDaoImpl implements BookDao { 16 | private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); 17 | 18 | @Override 19 | public List queryAllBooks() { 20 | String sql = "select * from book"; 21 | return template.query(sql, new BeanPropertyRowMapper(Book.class)); 22 | } 23 | 24 | @Override 25 | public void addBook(Book book) { 26 | String sql = "insert into book values(null,?,?,?,?,?,?,?,?)"; 27 | template.update(sql, book.getName(),book.getPrice(),book.getAuthor(),book.getType(),book.getPdate(),book.getDescription(),book.getDetail(),book.getAddress()); 28 | } 29 | 30 | @Override 31 | public void deleteBook(int id) { 32 | String sql = "delete from book where id = ?"; 33 | template.update(sql, id); 34 | } 35 | 36 | @Override 37 | public Book queryBookById(int id) { 38 | String sql = "select * from book where id = ?"; 39 | return template.queryForObject(sql, new BeanPropertyRowMapper(Book.class),id); 40 | } 41 | 42 | @Override 43 | public void updateBook(Book book) { 44 | String sql = "update book set name=?,price=?,author=?,type=?,pdate=?,description=?,detail=?,address=? where id=?"; 45 | template.update(sql, book.getName(),book.getPrice(),book.getAuthor(),book.getType(),book.getPdate(),book.getDescription(),book.getDetail(),book.getAddress(),book.getId()); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/impl/PageDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao.impl; 2 | 3 | import com.lt.dao.PageDao; 4 | import com.lt.domain.Book; 5 | import com.lt.util.JDBCUtils; 6 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 7 | import org.springframework.jdbc.core.JdbcTemplate; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.Map; 12 | import java.util.Set; 13 | 14 | /** 15 | * Author: lt 16 | * Date: 2021/10/19 - 9:41 17 | **/ 18 | public class PageDaoImpl implements PageDao { 19 | private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); 20 | 21 | @Override 22 | public int findTotalCount(Map condition) { 23 | //1.定义模板初始化 24 | String sql = "select count(*) from book where 1 = 1 "; 25 | StringBuilder sb = new StringBuilder(sql); 26 | //2.遍历map 27 | Set keyset = condition.keySet(); 28 | //定义参数集合 29 | List params = new ArrayList(); 30 | for (String key : keyset) { 31 | //排除分页条件参数 32 | if ("currentPage".equals(key) || "rows".equals(key)) { 33 | continue; 34 | } 35 | 36 | //获取value 37 | String value = condition.get(key)[0]; 38 | //判断value是否有值 39 | if (value != null && !"".equals(value)) { 40 | //有值 41 | sb.append(" and " +key+ " like ? "); 42 | params.add("%"+value+"%"); //?条件的值 43 | } 44 | } 45 | 46 | return template.queryForObject(sb.toString(), Integer.class, params.toArray()); 47 | } 48 | 49 | @Override 50 | public List findByPage(int start, int rows, Map condition) { 51 | //1.定义模板初始化 52 | String sql = "select * from book where 1 = 1 "; 53 | StringBuilder sb = new StringBuilder(sql); 54 | //2.遍历map 55 | Set keyset = condition.keySet(); 56 | //定义参数集合 57 | List params = new ArrayList(); 58 | for (String key : keyset) { 59 | //排除分页条件参数 60 | if ("currentPage".equals(key) || "rows".equals(key)) { 61 | continue; 62 | } 63 | 64 | //获取value 65 | String value = condition.get(key)[0]; 66 | //判断value是否有值 67 | if (value != null && !"".equals(value)) { 68 | //有值 69 | sb.append(" and " + key + " like ? "); 70 | params.add("%" + value + "%"); //?条件的值 71 | } 72 | } 73 | 74 | //添加分页查询 75 | sb.append(" limit ?,? "); 76 | //添加分页查询参数值 77 | params.add(start); 78 | params.add(rows); 79 | 80 | return template.query(sb.toString(), new BeanPropertyRowMapper(Book.class), params.toArray()); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/com/lt/dao/impl/UserDaoImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.dao.impl; 2 | 3 | import com.lt.dao.UserDao; 4 | import com.lt.domain.User; 5 | import com.lt.util.JDBCUtils; 6 | import org.springframework.dao.DataAccessException; 7 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 8 | import org.springframework.jdbc.core.JdbcTemplate; 9 | 10 | /** 11 | * Author: lt 12 | * Date: 2021/10/17 - 20:55 13 | **/ 14 | public class UserDaoImpl implements UserDao { 15 | private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); 16 | 17 | @Override 18 | public User findUserByUsernameAndPassword(String username, String password) { 19 | try { 20 | String sql = "select * from user where username = ? and password = ?"; 21 | return template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username, password); 22 | } catch (DataAccessException e) { 23 | e.printStackTrace(); 24 | return null; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/lt/domain/Book.java: -------------------------------------------------------------------------------- 1 | package com.lt.domain; 2 | 3 | /** 4 | * Author: lt 5 | * Date: 2021/10/18 - 19:36 6 | **/ 7 | 8 | /** 9 | * 图书类 10 | */ 11 | public class Book { 12 | private int id; //图书id号 13 | private String name; //图书名字 14 | private double price; //图书价格 15 | private String author; //图书作者 16 | private String type; //图书类别 17 | private String pdate; //图书日期 18 | private String description; //图书简介 19 | private String detail; //图书详细描述 20 | private String address; //图书生产编号 21 | 22 | public Book() { 23 | } 24 | 25 | public Book(int id, String name, double price, String author, String type, 26 | String pdate, String description, String detail, String address) { 27 | this.id = id; 28 | this.name = name; 29 | this.price = price; 30 | this.author = author; 31 | this.type = type; 32 | this.pdate = pdate; 33 | this.description = description; 34 | this.detail = detail; 35 | this.address = address; 36 | } 37 | 38 | public int getId() { 39 | return id; 40 | } 41 | 42 | public void setId(int id) { 43 | this.id = id; 44 | } 45 | 46 | public String getName() { 47 | return name; 48 | } 49 | 50 | public void setName(String name) { 51 | this.name = name; 52 | } 53 | 54 | public double getPrice() { 55 | return price; 56 | } 57 | 58 | public void setPrice(double price) { 59 | this.price = price; 60 | } 61 | 62 | public String getAuthor() { 63 | return author; 64 | } 65 | 66 | public void setAuthor(String author) { 67 | this.author = author; 68 | } 69 | 70 | public String getType() { 71 | return type; 72 | } 73 | 74 | public void setType(String type) { 75 | this.type = type; 76 | } 77 | 78 | public String getPdate() { 79 | return pdate; 80 | } 81 | 82 | public void setPdate(String pdate) { 83 | this.pdate = pdate; 84 | } 85 | 86 | public String getDescription() { 87 | return description; 88 | } 89 | 90 | public void setDescription(String description) { 91 | this.description = description; 92 | } 93 | 94 | public String getDetail() { 95 | return detail; 96 | } 97 | 98 | public void setDetail(String detail) { 99 | this.detail = detail; 100 | } 101 | 102 | public String getAddress() { 103 | return address; 104 | } 105 | 106 | public void setAddress(String address) { 107 | this.address = address; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/main/java/com/lt/domain/PageBean.java: -------------------------------------------------------------------------------- 1 | package com.lt.domain; 2 | 3 | /** 4 | * Author: lt 5 | * Date: 2021/10/19 - 9:36 6 | **/ 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 分页对象 12 | */ 13 | public class PageBean { 14 | private int totalCount; //总记录数 15 | private int totalPage; //总页码 16 | private List list; //每页的数据 17 | private int currentPage; //当前页码 18 | private int rows; //每页显示的记录数 19 | 20 | public int getTotalCount() { 21 | return totalCount; 22 | } 23 | 24 | public void setTotalCount(int totalCount) { 25 | this.totalCount = totalCount; 26 | } 27 | 28 | public int getTotalPage() { 29 | return totalPage; 30 | } 31 | 32 | public void setTotalPage(int totalPage) { 33 | this.totalPage = totalPage; 34 | } 35 | 36 | public List getList() { 37 | return list; 38 | } 39 | 40 | public void setList(List list) { 41 | this.list = list; 42 | } 43 | 44 | public int getCurrentPage() { 45 | return currentPage; 46 | } 47 | 48 | public void setCurrentPage(int currentPage) { 49 | this.currentPage = currentPage; 50 | } 51 | 52 | public int getRows() { 53 | return rows; 54 | } 55 | 56 | public void setRows(int rows) { 57 | this.rows = rows; 58 | } 59 | 60 | @Override 61 | public String toString() { 62 | return "PageBean{" + 63 | "totalCount=" + totalCount + 64 | ", totalPage=" + totalPage + 65 | ", list=" + list + 66 | ", currentPage=" + currentPage + 67 | ", rows=" + rows + 68 | '}'; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/lt/domain/User.java: -------------------------------------------------------------------------------- 1 | package com.lt.domain; 2 | 3 | /** 4 | * Author: lt 5 | * Date: 2021/10/17 - 17:19 6 | **/ 7 | 8 | /** 9 | * 管理员类 10 | */ 11 | public class User { 12 | private int id; //管理员的id 13 | private String username; //管理员的姓名 14 | private String password; //管理员的密码 15 | 16 | public int getId() { 17 | return id; 18 | } 19 | 20 | public void setId(int id) { 21 | this.id = id; 22 | } 23 | 24 | public String getUsername() { 25 | return username; 26 | } 27 | 28 | public void setUsername(String username) { 29 | this.username = username; 30 | } 31 | 32 | public String getPassword() { 33 | return password; 34 | } 35 | 36 | public void setPassword(String password) { 37 | this.password = password; 38 | } 39 | 40 | @Override 41 | public String toString() { 42 | return "User{" + 43 | "id=" + id + 44 | ", username='" + username + '\'' + 45 | ", password='" + password + '\'' + 46 | '}'; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/BookService.java: -------------------------------------------------------------------------------- 1 | package com.lt.service; 2 | 3 | import com.lt.domain.Book; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Author: lt 9 | * Date: 2021/10/18 - 20:15 10 | **/ 11 | 12 | /** 13 | * 书籍的业务接口---业务逻辑层 14 | */ 15 | public interface BookService { 16 | /** 17 | * 查询所有书籍信息 18 | * @return 书籍信息 19 | */ 20 | List queryAllBooks(); 21 | 22 | /** 23 | * 增加书籍信息 24 | * @param book 25 | */ 26 | void addBook(Book book); 27 | 28 | /** 29 | * 删除书籍信息 30 | * @param id 31 | */ 32 | void deleteBook(String id); 33 | 34 | /** 35 | * 批量删除书籍 36 | * @param ids 37 | */ 38 | void delSelectedBook(String[] ids); 39 | 40 | /** 41 | * 根据id查询书籍 42 | * @param id 43 | * @return 44 | */ 45 | Book queryBookById(String id); 46 | 47 | /** 48 | * 更改书籍信息 49 | * @param book 50 | */ 51 | void updateBook(Book book); 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/PageService.java: -------------------------------------------------------------------------------- 1 | package com.lt.service; 2 | 3 | import com.lt.domain.Book; 4 | import com.lt.domain.PageBean; 5 | 6 | import java.util.Map; 7 | 8 | /** 9 | * Author: lt 10 | * Date: 2021/10/19 - 9:40 11 | **/ 12 | public interface PageService { 13 | /** 14 | * 查询总记录数 15 | * @return 16 | * @param condition 17 | */ 18 | int findTotalCount(Map condition); 19 | 20 | /** 21 | * 分页查询每页记录 22 | * @param currentPage 23 | * @param rows 24 | * @param condition 25 | * @return 26 | */ 27 | PageBean findBookByPage(String currentPage, String rows, Map condition); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.lt.service; 2 | 3 | import com.lt.domain.User; 4 | 5 | /** 6 | * Author: lt 7 | * Date: 2021/10/17 - 20:53 8 | **/ 9 | 10 | /** 11 | * 系统管理员的业务接口---业务逻辑层 12 | */ 13 | public interface UserService { 14 | /** 15 | * 管理员登录 16 | * @param user 17 | * @return 18 | */ 19 | User login(User user); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/impl/BookServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.service.impl; 2 | 3 | import com.lt.dao.BookDao; 4 | import com.lt.dao.impl.BookDaoImpl; 5 | import com.lt.domain.Book; 6 | import com.lt.service.BookService; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Author: lt 12 | * Date: 2021/10/18 - 20:15 13 | **/ 14 | public class BookServiceImpl implements BookService { 15 | private BookDao dao = new BookDaoImpl(); 16 | 17 | @Override 18 | public List queryAllBooks() { 19 | return dao.queryAllBooks(); 20 | } 21 | 22 | @Override 23 | public void addBook(Book book) { 24 | dao.addBook(book); 25 | } 26 | 27 | @Override 28 | public void deleteBook(String id) { 29 | dao.deleteBook(Integer.parseInt(id)); 30 | } 31 | 32 | @Override 33 | public void delSelectedBook(String[] ids) { 34 | if (ids != null && ids.length > 0) { 35 | //1.遍历数组 36 | for (String id : ids) { 37 | //2.调用dao删除 38 | dao.deleteBook(Integer.parseInt(id)); 39 | } 40 | } 41 | } 42 | 43 | @Override 44 | public Book queryBookById(String id) { 45 | return dao.queryBookById(Integer.parseInt(id)); 46 | } 47 | 48 | @Override 49 | public void updateBook(Book book) { 50 | dao.updateBook(book); 51 | } 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/impl/PageServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.service.impl; 2 | 3 | import com.lt.dao.PageDao; 4 | import com.lt.dao.impl.PageDaoImpl; 5 | import com.lt.domain.Book; 6 | import com.lt.domain.PageBean; 7 | import com.lt.service.PageService; 8 | 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | /** 13 | * Author: lt 14 | * Date: 2021/10/19 - 9:40 15 | **/ 16 | public class PageServiceImpl implements PageService { 17 | private PageDao dao = new PageDaoImpl(); 18 | 19 | @Override 20 | public int findTotalCount(Map condition) { 21 | return dao.findTotalCount(condition); 22 | } 23 | 24 | @Override 25 | public PageBean findBookByPage(String _currentPage, String _rows, Map condition) { 26 | int currentPage = Integer.parseInt(_currentPage); 27 | int rows = Integer.parseInt(_rows); 28 | 29 | if (currentPage <= 0) { 30 | currentPage = 1; 31 | } 32 | //1.创建空的PageBean对象 33 | PageBean pb = new PageBean<>(); 34 | //2.设置参数 35 | pb.setCurrentPage(currentPage); 36 | pb.setRows(rows); 37 | 38 | //3.调用dao查询总记录数 39 | int totalCount = dao.findTotalCount(condition); 40 | pb.setTotalCount(totalCount); 41 | //4.调用dao查询List集合 42 | //计算开始的记录索引 43 | int start = (currentPage - 1) * rows; 44 | List list = dao.findByPage(start, rows, condition); 45 | pb.setList(list); 46 | 47 | //5.计算总页码 48 | int totalPage = totalCount % rows == 0 ? totalCount / rows : totalCount / rows + 1; 49 | pb.setTotalPage(totalPage); 50 | 51 | if (currentPage >= totalPage) { 52 | currentPage = totalPage; 53 | pb.setCurrentPage(currentPage); 54 | } 55 | return pb; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/lt/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.lt.service.impl; 2 | 3 | import com.lt.dao.UserDao; 4 | import com.lt.dao.impl.UserDaoImpl; 5 | import com.lt.domain.User; 6 | import com.lt.service.UserService; 7 | 8 | /** 9 | * Author: lt 10 | * Date: 2021/10/17 - 20:53 11 | **/ 12 | public class UserServiceImpl implements UserService { 13 | private UserDao dao = new UserDaoImpl(); 14 | 15 | @Override 16 | public User login(User user) { 17 | return dao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword()); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/lt/util/JDBCUtils.java: -------------------------------------------------------------------------------- 1 | package com.lt.util; 2 | 3 | /** 4 | * Author: lt 5 | * Date: 2021/10/17 - 17:21 6 | **/ 7 | 8 | import com.alibaba.druid.pool.DruidDataSourceFactory; 9 | 10 | import javax.sql.DataSource; 11 | import java.io.InputStream; 12 | import java.sql.Connection; 13 | import java.sql.ResultSet; 14 | import java.sql.SQLException; 15 | import java.sql.Statement; 16 | import java.util.Properties; 17 | 18 | /** 19 | * JDBC工具类,使用Druid连接池 20 | */ 21 | public class JDBCUtils { 22 | private static DataSource ds; 23 | 24 | static { 25 | try { 26 | //1.加载配置文件 27 | Properties pro = new Properties(); 28 | InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); 29 | pro.load(is); 30 | 31 | //2.初始化连接池 32 | ds = DruidDataSourceFactory.createDataSource(pro); 33 | } catch (Exception e) { 34 | e.printStackTrace(); 35 | } 36 | } 37 | 38 | /** 39 | * 获取Connection连接对象 40 | * @return 连接对象 41 | * @throws SQLException 42 | */ 43 | public static Connection getConnection() throws SQLException { 44 | return ds.getConnection(); 45 | } 46 | 47 | /** 48 | * 获取连接池对象 49 | * @return 连接池对象 50 | */ 51 | public static DataSource getDataSource() { 52 | return ds; 53 | } 54 | 55 | /** 56 | * 释放资源 57 | * @param rs 58 | * @param stmt 59 | * @param conn 60 | */ 61 | public static void close(ResultSet rs, Statement stmt, Connection conn) { 62 | if (rs != null) { 63 | try { 64 | rs.close(); 65 | } catch (SQLException e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | if (stmt != null) { 70 | try { 71 | stmt.close(); 72 | } catch (SQLException e) { 73 | e.printStackTrace(); 74 | } 75 | } 76 | if (conn != null) { 77 | try { 78 | conn.close(); 79 | } catch (SQLException e) { 80 | e.printStackTrace(); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/filter/LoginFilter.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.filter; /** 2 | * Author: lt 3 | * Date: 2021/10/21 - 19:15 4 | **/ 5 | 6 | import javax.servlet.*; 7 | import javax.servlet.annotation.WebFilter; 8 | import javax.servlet.http.HttpServletRequest; 9 | import java.io.IOException; 10 | 11 | @WebFilter("/*") 12 | public class LoginFilter implements Filter { 13 | public void init(FilterConfig config) throws ServletException { 14 | } 15 | 16 | public void destroy() { 17 | } 18 | 19 | @Override 20 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 21 | //0.强制转换 22 | HttpServletRequest req = (HttpServletRequest) request; 23 | 24 | //1.获取资源请求路径 25 | String uri = req.getRequestURI(); 26 | //2.判断是否包含登录相关资源路径 27 | if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet") || uri.contains("/img/")) { 28 | //包含,用户就是想登录,放行 29 | chain.doFilter(request, response); 30 | } else { 31 | //不包含,需要验证用户是否登录 32 | //3.从session中获取user 33 | Object user = req.getSession().getAttribute("user"); 34 | if (user != null) { 35 | //登录了。方向 36 | chain.doFilter(request, response); 37 | } else { 38 | //没有登录。跳转登录页面 39 | req.setAttribute("login_msg", "你尚未登录,请登录"); 40 | req.getRequestDispatcher("/login.jsp").forward(req, response); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/AddBookServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 14:58 4 | **/ 5 | 6 | import com.lt.domain.Book; 7 | import com.lt.service.BookService; 8 | import com.lt.service.impl.BookServiceImpl; 9 | import org.apache.commons.beanutils.BeanUtils; 10 | 11 | import javax.servlet.*; 12 | import javax.servlet.http.*; 13 | import javax.servlet.annotation.*; 14 | import java.io.IOException; 15 | import java.lang.reflect.InvocationTargetException; 16 | import java.util.Map; 17 | 18 | @WebServlet("/addBookServlet") 19 | public class AddBookServlet extends HttpServlet { 20 | @Override 21 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 | this.doPost(request, response); 23 | } 24 | 25 | @Override 26 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 | //1.设置编码 28 | request.setCharacterEncoding("utf-8"); 29 | //2.获取参数 30 | Map map = request.getParameterMap(); 31 | //3.封装对象 32 | Book book = new Book(); 33 | try { 34 | BeanUtils.populate(book, map); 35 | } catch (IllegalAccessException | InvocationTargetException e) { 36 | e.printStackTrace(); 37 | } 38 | //4.调用service保存 39 | BookService service = new BookServiceImpl(); 40 | service.addBook(book); 41 | //5.跳转到bookListServlet 42 | response.sendRedirect(request.getContextPath()+"/bookListServlet"); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/BookListServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 14:53 4 | **/ 5 | 6 | import com.lt.domain.Book; 7 | import com.lt.service.BookService; 8 | import com.lt.service.impl.BookServiceImpl; 9 | 10 | import javax.servlet.ServletException; 11 | import javax.servlet.annotation.WebServlet; 12 | import javax.servlet.http.HttpServlet; 13 | import javax.servlet.http.HttpServletRequest; 14 | import javax.servlet.http.HttpServletResponse; 15 | import java.io.IOException; 16 | import java.util.List; 17 | 18 | @WebServlet("/bookListServlet") 19 | public class BookListServlet extends HttpServlet { 20 | @Override 21 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 | this.doPost(request, response); 23 | } 24 | 25 | @Override 26 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 | //1.调用BookService完成查询 28 | BookService service = new BookServiceImpl(); 29 | List books = service.queryAllBooks(); 30 | //将list存入request域中 31 | request.setAttribute("books", books); 32 | //3.转发到list.jsp页面中 33 | request.getRequestDispatcher("/list.jsp").forward(request, response); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/CheckCodeServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/17 - 20:32 4 | **/ 5 | 6 | import javax.imageio.ImageIO; 7 | import javax.servlet.*; 8 | import javax.servlet.http.*; 9 | import javax.servlet.annotation.*; 10 | import java.awt.*; 11 | import java.awt.image.BufferedImage; 12 | import java.io.IOException; 13 | import java.util.Random; 14 | 15 | @WebServlet("/checkCodeServlet") 16 | public class CheckCodeServlet extends HttpServlet { 17 | @Override 18 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 | //服务器通知浏览器不要缓存 20 | response.setHeader("pragma","no-cache"); 21 | response.setHeader("cache-control","no-cache"); 22 | response.setHeader("expires","0"); 23 | 24 | //在内存中创建一个长80,宽30的图片,默认黑色背景 25 | int width = 80; 26 | int height = 30; 27 | BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 28 | 29 | //获取画笔 30 | Graphics g = image.getGraphics(); 31 | //设置画笔颜色为灰色 32 | g.setColor(Color.GRAY); 33 | //填充图片 34 | g.fillRect(0, 0, width, height); 35 | 36 | //产生四个随机验证码 37 | String checkCode = getCheckCode(); 38 | //将验证码放入HttpSession中 39 | request.getSession().setAttribute("CHECKCODE_SERVER", checkCode); 40 | 41 | //设置画笔颜色为黄色 42 | g.setColor(Color.YELLOW); 43 | //设置字体的大小 44 | g.setFont(new Font("黑体", Font.BOLD, 24)); 45 | //向图片上写入验证码 46 | g.drawString(checkCode, 15, 25); 47 | 48 | //将内存中的图片输出到浏览器 49 | ImageIO.write(image, "PNG", response.getOutputStream()); 50 | } 51 | 52 | /** 53 | * 产生四位随机字符串 54 | * @return 随机字符串 55 | */ 56 | private String getCheckCode() { 57 | String base = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 58 | Random random = new Random(); 59 | int size = base.length(); 60 | StringBuffer sb = new StringBuffer(); 61 | 62 | for (int i = 0; i < 4; i++) { 63 | //产生从0到size-1的随机索引 64 | int index = random.nextInt(size); 65 | //在base字符串中获取索引为index的随机字符 66 | char c = base.charAt(index); 67 | //将c放在StringBuffer中 68 | sb.append(c); 69 | } 70 | 71 | return sb.toString(); 72 | } 73 | 74 | @Override 75 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 76 | this.doGet(request, response); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/DelBookServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 15:02 4 | **/ 5 | 6 | import com.lt.service.BookService; 7 | import com.lt.service.impl.BookServiceImpl; 8 | 9 | import javax.servlet.*; 10 | import javax.servlet.http.*; 11 | import javax.servlet.annotation.*; 12 | import java.io.IOException; 13 | 14 | @WebServlet("/delBookServlet") 15 | public class DelBookServlet extends HttpServlet { 16 | @Override 17 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 | this.doPost(request, response); 19 | } 20 | 21 | @Override 22 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 | //1.获取id 24 | String id = request.getParameter("id"); 25 | //2.调用service删除 26 | BookService service = new BookServiceImpl(); 27 | service.deleteBook(id); 28 | //3.跳转到查询所有的Servlet 29 | response.sendRedirect(request.getContextPath()+"/bookListServlet"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/DelSelectedServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 15:12 4 | **/ 5 | 6 | import com.lt.service.BookService; 7 | import com.lt.service.impl.BookServiceImpl; 8 | 9 | import javax.servlet.*; 10 | import javax.servlet.http.*; 11 | import javax.servlet.annotation.*; 12 | import java.io.IOException; 13 | 14 | @WebServlet("/delSelectedServlet") 15 | public class DelSelectedServlet extends HttpServlet { 16 | @Override 17 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 | this.doPost(request, response); 19 | } 20 | 21 | @Override 22 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 | //1.获取所有的id 24 | String[] ids = request.getParameterValues("uid"); 25 | //2.调用service删除 26 | BookService service = new BookServiceImpl(); 27 | service.delSelectedBook(ids); 28 | //3.跳转到查询所有Servlet 29 | response.sendRedirect(request.getContextPath()+"/bookListServlet"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/FindBookByPageServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 15:19 4 | **/ 5 | 6 | import com.lt.domain.Book; 7 | import com.lt.domain.PageBean; 8 | import com.lt.service.PageService; 9 | import com.lt.service.impl.PageServiceImpl; 10 | 11 | import javax.servlet.ServletException; 12 | import javax.servlet.annotation.WebServlet; 13 | import javax.servlet.http.HttpServlet; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | import java.util.Map; 18 | 19 | @WebServlet("/findBookByPageServlet") 20 | public class FindBookByPageServlet extends HttpServlet { 21 | @Override 22 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 | this.doPost(request, response); 24 | } 25 | 26 | @Override 27 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 28 | //设置编码格式 29 | request.setCharacterEncoding("utf-8"); 30 | //1.获取参数 31 | String currentPage = request.getParameter("currentPage"); //当前页码 32 | String rows = request.getParameter("rows"); //每页显示的条数 33 | 34 | if (currentPage == null || "".equals(currentPage)) { 35 | currentPage = "1"; 36 | } 37 | if (rows == null || "".equals(rows)) { 38 | rows = "5"; 39 | } 40 | 41 | //获取条件查询参数 42 | Map condition = request.getParameterMap(); 43 | 44 | //2.调用service查询 45 | PageService service = new PageServiceImpl(); 46 | PageBean pb = service.findBookByPage(currentPage, rows, condition); 47 | 48 | //3.将PageBean存入request 49 | request.setAttribute("pb", pb); 50 | request.setAttribute("condition", condition); //将查询条件存入request 51 | //4.转发到list.jsp 52 | request.getRequestDispatcher("/list.jsp").forward(request, response); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/FindBookServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 15:08 4 | **/ 5 | 6 | import com.lt.domain.Book; 7 | import com.lt.service.BookService; 8 | import com.lt.service.impl.BookServiceImpl; 9 | 10 | import javax.servlet.*; 11 | import javax.servlet.http.*; 12 | import javax.servlet.annotation.*; 13 | import java.io.IOException; 14 | 15 | @WebServlet("/findBookServlet") 16 | public class FindBookServlet extends HttpServlet { 17 | @Override 18 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 | this.doPost(request, response); 20 | } 21 | 22 | @Override 23 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 | //1.获取id 25 | String id = request.getParameter("id"); 26 | //2.调用service查询 27 | BookService service = new BookServiceImpl(); 28 | Book book = service.queryBookById(id); 29 | //3.将book存入request域 30 | request.setAttribute("book", book); 31 | //4.转发到update.jsp 32 | request.getRequestDispatcher("/update.jsp").forward(request, response); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/LoginServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/17 - 17:24 4 | **/ 5 | 6 | import com.lt.domain.User; 7 | import com.lt.service.UserService; 8 | import com.lt.service.impl.UserServiceImpl; 9 | import org.apache.commons.beanutils.BeanUtils; 10 | 11 | import javax.servlet.ServletException; 12 | import javax.servlet.annotation.WebServlet; 13 | import javax.servlet.http.HttpServlet; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import javax.servlet.http.HttpSession; 17 | import java.io.IOException; 18 | import java.lang.reflect.InvocationTargetException; 19 | import java.util.Map; 20 | 21 | @WebServlet("/loginServlet") 22 | public class LoginServlet extends HttpServlet { 23 | @Override 24 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 | this.doPost(request, response); 26 | } 27 | 28 | @Override 29 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 | //1.设置编码 31 | request.setCharacterEncoding("utf-8"); 32 | 33 | //2.获取数据 34 | //2.1获取用户填写验证码 35 | String verifycode = request.getParameter("verifycode"); 36 | 37 | //3.校验验证码 38 | HttpSession session = request.getSession(); 39 | String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER"); 40 | session.removeAttribute("CHECKCODE_SERVER"); //确保验证码的一次性 41 | 42 | if (!checkcode_server.equalsIgnoreCase(verifycode)) { 43 | //验证码不正确 44 | //提示信息 45 | request.setAttribute("login_msg", "验证码错误!"); 46 | //跳转登录页面 47 | request.getRequestDispatcher("/login.jsp").forward(request, response); 48 | 49 | return; 50 | } 51 | 52 | Map map = request.getParameterMap(); 53 | //4.封装User对象 54 | User user = new User(); 55 | try { 56 | BeanUtils.populate(user, map); 57 | } catch (IllegalAccessException | InvocationTargetException e) { 58 | e.printStackTrace(); 59 | } 60 | 61 | //5.调用service查询 62 | UserService service = new UserServiceImpl(); 63 | User loginUser = service.login(user); 64 | //6.判断用户是否登录成功 65 | if (loginUser != null) { 66 | //登录成功 67 | //将用户存入session 68 | session.setAttribute("user", loginUser); 69 | //重定向页面(跳转页面---跳转到另一个资源,所以用重定向) 70 | response.sendRedirect(request.getContextPath()+"/list.jsp"); 71 | } else { 72 | //登录失败 73 | //提示信息 74 | request.setAttribute("login_msg", "用户名或密码错误"); 75 | //跳转登录页面 76 | request.getRequestDispatcher("/login.jsp").forward(request, response); 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/com/lt/web/servlet/UpdateBookServlet.java: -------------------------------------------------------------------------------- 1 | package com.lt.web.servlet; /** 2 | * Author: lt 3 | * Date: 2021/10/19 - 15:05 4 | **/ 5 | 6 | import com.lt.domain.Book; 7 | import com.lt.service.BookService; 8 | import com.lt.service.impl.BookServiceImpl; 9 | import org.apache.commons.beanutils.BeanUtils; 10 | 11 | import javax.servlet.*; 12 | import javax.servlet.http.*; 13 | import javax.servlet.annotation.*; 14 | import java.io.IOException; 15 | import java.lang.reflect.InvocationTargetException; 16 | import java.util.Map; 17 | 18 | @WebServlet("/updateBookServlet") 19 | public class UpdateBookServlet extends HttpServlet { 20 | @Override 21 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 | this.doPost(request, response); 23 | } 24 | 25 | @Override 26 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 | //1.设置编码 28 | request.setCharacterEncoding("utf-8"); 29 | //2.获取map 30 | Map map = request.getParameterMap(); 31 | //3.封装对象 32 | Book book = new Book(); 33 | try { 34 | BeanUtils.populate(book, map); 35 | } catch (IllegalAccessException | InvocationTargetException e) { 36 | e.printStackTrace(); 37 | } 38 | //4.调用service修改 39 | BookService service = new BookServiceImpl(); 40 | service.updateBook(book); 41 | //5.跳转到查询所有的Servlet 42 | response.sendRedirect(request.getContextPath()+"/bookListServlet"); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/druid.properties: -------------------------------------------------------------------------------- 1 | driverClassName=com.mysql.cj.jdbc.Driver 2 | url=jdbc:mysql://127.0.0.1:3306/homework 3 | username=root 4 | password=806823 5 | initialSize=5 6 | maxActive=10 7 | maxWait=3000 -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /src/main/webapp/add.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 添加图书页面 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 134 | 135 | 140 | 141 | 142 |
143 |

添加图书

144 |
145 |
146 | 147 | 148 | 149 |
150 | 151 |
152 | 153 | 154 | 155 |
156 | 157 |
158 | 159 | 160 | 161 |
162 | 163 |
164 | 165 | 166 | 167 |
168 | 169 |
170 | 171 | 172 | 173 |
174 | 175 |
176 | 177 | 178 |
179 | 180 |
181 | 182 | 183 |
184 | 185 |
186 | 187 | 188 | 189 |
190 | 191 |
192 | 193 | 194 | 195 |
196 |
197 |
198 | 199 | 200 | -------------------------------------------------------------------------------- /src/main/webapp/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | .btn-default, 7 | .btn-primary, 8 | .btn-success, 9 | .btn-info, 10 | .btn-warning, 11 | .btn-danger { 12 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 13 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 14 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | } 16 | 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | 33 | .btn-default.disabled, 34 | .btn-primary.disabled, 35 | .btn-success.disabled, 36 | .btn-info.disabled, 37 | .btn-warning.disabled, 38 | .btn-danger.disabled, 39 | .btn-default[disabled], 40 | .btn-primary[disabled], 41 | .btn-success[disabled], 42 | .btn-info[disabled], 43 | .btn-warning[disabled], 44 | .btn-danger[disabled], 45 | fieldset[disabled] .btn-default, 46 | fieldset[disabled] .btn-primary, 47 | fieldset[disabled] .btn-success, 48 | fieldset[disabled] .btn-info, 49 | fieldset[disabled] .btn-warning, 50 | fieldset[disabled] .btn-danger { 51 | -webkit-box-shadow: none; 52 | box-shadow: none; 53 | } 54 | 55 | .btn-default .badge, 56 | .btn-primary .badge, 57 | .btn-success .badge, 58 | .btn-info .badge, 59 | .btn-warning .badge, 60 | .btn-danger .badge { 61 | text-shadow: none; 62 | } 63 | 64 | .btn:active, 65 | .btn.active { 66 | background-image: none; 67 | } 68 | 69 | .btn-default { 70 | text-shadow: 0 1px 0 #fff; 71 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 72 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 73 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 74 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 75 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 76 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 77 | background-repeat: repeat-x; 78 | border-color: #dbdbdb; 79 | border-color: #ccc; 80 | } 81 | 82 | .btn-default:hover, 83 | .btn-default:focus { 84 | background-color: #e0e0e0; 85 | background-position: 0 -15px; 86 | } 87 | 88 | .btn-default:active, 89 | .btn-default.active { 90 | background-color: #e0e0e0; 91 | border-color: #dbdbdb; 92 | } 93 | 94 | .btn-default.disabled, 95 | .btn-default[disabled], 96 | fieldset[disabled] .btn-default, 97 | .btn-default.disabled:hover, 98 | .btn-default[disabled]:hover, 99 | fieldset[disabled] .btn-default:hover, 100 | .btn-default.disabled:focus, 101 | .btn-default[disabled]:focus, 102 | fieldset[disabled] .btn-default:focus, 103 | .btn-default.disabled.focus, 104 | .btn-default[disabled].focus, 105 | fieldset[disabled] .btn-default.focus, 106 | .btn-default.disabled:active, 107 | .btn-default[disabled]:active, 108 | fieldset[disabled] .btn-default:active, 109 | .btn-default.disabled.active, 110 | .btn-default[disabled].active, 111 | fieldset[disabled] .btn-default.active { 112 | background-color: #e0e0e0; 113 | background-image: none; 114 | } 115 | 116 | .btn-primary { 117 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 118 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 119 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 120 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 121 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 122 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 123 | background-repeat: repeat-x; 124 | border-color: #245580; 125 | } 126 | 127 | .btn-primary:hover, 128 | .btn-primary:focus { 129 | background-color: #265a88; 130 | background-position: 0 -15px; 131 | } 132 | 133 | .btn-primary:active, 134 | .btn-primary.active { 135 | background-color: #265a88; 136 | border-color: #245580; 137 | } 138 | 139 | .btn-primary.disabled, 140 | .btn-primary[disabled], 141 | fieldset[disabled] .btn-primary, 142 | .btn-primary.disabled:hover, 143 | .btn-primary[disabled]:hover, 144 | fieldset[disabled] .btn-primary:hover, 145 | .btn-primary.disabled:focus, 146 | .btn-primary[disabled]:focus, 147 | fieldset[disabled] .btn-primary:focus, 148 | .btn-primary.disabled.focus, 149 | .btn-primary[disabled].focus, 150 | fieldset[disabled] .btn-primary.focus, 151 | .btn-primary.disabled:active, 152 | .btn-primary[disabled]:active, 153 | fieldset[disabled] .btn-primary:active, 154 | .btn-primary.disabled.active, 155 | .btn-primary[disabled].active, 156 | fieldset[disabled] .btn-primary.active { 157 | background-color: #265a88; 158 | background-image: none; 159 | } 160 | 161 | .btn-success { 162 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 163 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 164 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 165 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 166 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 167 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 168 | background-repeat: repeat-x; 169 | border-color: #3e8f3e; 170 | } 171 | 172 | .btn-success:hover, 173 | .btn-success:focus { 174 | background-color: #419641; 175 | background-position: 0 -15px; 176 | } 177 | 178 | .btn-success:active, 179 | .btn-success.active { 180 | background-color: #419641; 181 | border-color: #3e8f3e; 182 | } 183 | 184 | .btn-success.disabled, 185 | .btn-success[disabled], 186 | fieldset[disabled] .btn-success, 187 | .btn-success.disabled:hover, 188 | .btn-success[disabled]:hover, 189 | fieldset[disabled] .btn-success:hover, 190 | .btn-success.disabled:focus, 191 | .btn-success[disabled]:focus, 192 | fieldset[disabled] .btn-success:focus, 193 | .btn-success.disabled.focus, 194 | .btn-success[disabled].focus, 195 | fieldset[disabled] .btn-success.focus, 196 | .btn-success.disabled:active, 197 | .btn-success[disabled]:active, 198 | fieldset[disabled] .btn-success:active, 199 | .btn-success.disabled.active, 200 | .btn-success[disabled].active, 201 | fieldset[disabled] .btn-success.active { 202 | background-color: #419641; 203 | background-image: none; 204 | } 205 | 206 | .btn-info { 207 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 208 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 209 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 210 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 211 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 212 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 213 | background-repeat: repeat-x; 214 | border-color: #28a4c9; 215 | } 216 | 217 | .btn-info:hover, 218 | .btn-info:focus { 219 | background-color: #2aabd2; 220 | background-position: 0 -15px; 221 | } 222 | 223 | .btn-info:active, 224 | .btn-info.active { 225 | background-color: #2aabd2; 226 | border-color: #28a4c9; 227 | } 228 | 229 | .btn-info.disabled, 230 | .btn-info[disabled], 231 | fieldset[disabled] .btn-info, 232 | .btn-info.disabled:hover, 233 | .btn-info[disabled]:hover, 234 | fieldset[disabled] .btn-info:hover, 235 | .btn-info.disabled:focus, 236 | .btn-info[disabled]:focus, 237 | fieldset[disabled] .btn-info:focus, 238 | .btn-info.disabled.focus, 239 | .btn-info[disabled].focus, 240 | fieldset[disabled] .btn-info.focus, 241 | .btn-info.disabled:active, 242 | .btn-info[disabled]:active, 243 | fieldset[disabled] .btn-info:active, 244 | .btn-info.disabled.active, 245 | .btn-info[disabled].active, 246 | fieldset[disabled] .btn-info.active { 247 | background-color: #2aabd2; 248 | background-image: none; 249 | } 250 | 251 | .btn-warning { 252 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 253 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 254 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 255 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 256 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 257 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 258 | background-repeat: repeat-x; 259 | border-color: #e38d13; 260 | } 261 | 262 | .btn-warning:hover, 263 | .btn-warning:focus { 264 | background-color: #eb9316; 265 | background-position: 0 -15px; 266 | } 267 | 268 | .btn-warning:active, 269 | .btn-warning.active { 270 | background-color: #eb9316; 271 | border-color: #e38d13; 272 | } 273 | 274 | .btn-warning.disabled, 275 | .btn-warning[disabled], 276 | fieldset[disabled] .btn-warning, 277 | .btn-warning.disabled:hover, 278 | .btn-warning[disabled]:hover, 279 | fieldset[disabled] .btn-warning:hover, 280 | .btn-warning.disabled:focus, 281 | .btn-warning[disabled]:focus, 282 | fieldset[disabled] .btn-warning:focus, 283 | .btn-warning.disabled.focus, 284 | .btn-warning[disabled].focus, 285 | fieldset[disabled] .btn-warning.focus, 286 | .btn-warning.disabled:active, 287 | .btn-warning[disabled]:active, 288 | fieldset[disabled] .btn-warning:active, 289 | .btn-warning.disabled.active, 290 | .btn-warning[disabled].active, 291 | fieldset[disabled] .btn-warning.active { 292 | background-color: #eb9316; 293 | background-image: none; 294 | } 295 | 296 | .btn-danger { 297 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 298 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 299 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 300 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 301 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 302 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 303 | background-repeat: repeat-x; 304 | border-color: #b92c28; 305 | } 306 | 307 | .btn-danger:hover, 308 | .btn-danger:focus { 309 | background-color: #c12e2a; 310 | background-position: 0 -15px; 311 | } 312 | 313 | .btn-danger:active, 314 | .btn-danger.active { 315 | background-color: #c12e2a; 316 | border-color: #b92c28; 317 | } 318 | 319 | .btn-danger.disabled, 320 | .btn-danger[disabled], 321 | fieldset[disabled] .btn-danger, 322 | .btn-danger.disabled:hover, 323 | .btn-danger[disabled]:hover, 324 | fieldset[disabled] .btn-danger:hover, 325 | .btn-danger.disabled:focus, 326 | .btn-danger[disabled]:focus, 327 | fieldset[disabled] .btn-danger:focus, 328 | .btn-danger.disabled.focus, 329 | .btn-danger[disabled].focus, 330 | fieldset[disabled] .btn-danger.focus, 331 | .btn-danger.disabled:active, 332 | .btn-danger[disabled]:active, 333 | fieldset[disabled] .btn-danger:active, 334 | .btn-danger.disabled.active, 335 | .btn-danger[disabled].active, 336 | fieldset[disabled] .btn-danger.active { 337 | background-color: #c12e2a; 338 | background-image: none; 339 | } 340 | 341 | .thumbnail, 342 | .img-thumbnail { 343 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 344 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 345 | } 346 | 347 | .dropdown-menu > li > a:hover, 348 | .dropdown-menu > li > a:focus { 349 | background-color: #e8e8e8; 350 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 351 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 352 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 353 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 354 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 355 | background-repeat: repeat-x; 356 | } 357 | 358 | .dropdown-menu > .active > a, 359 | .dropdown-menu > .active > a:hover, 360 | .dropdown-menu > .active > a:focus { 361 | background-color: #2e6da4; 362 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 363 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 364 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 365 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 366 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 367 | background-repeat: repeat-x; 368 | } 369 | 370 | .navbar-default { 371 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 372 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 373 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 374 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 375 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 376 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 377 | background-repeat: repeat-x; 378 | border-radius: 4px; 379 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 380 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 381 | } 382 | 383 | .navbar-default .navbar-nav > .open > a, 384 | .navbar-default .navbar-nav > .active > a { 385 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 386 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 387 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 388 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 389 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 390 | background-repeat: repeat-x; 391 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 392 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 393 | } 394 | 395 | .navbar-brand, 396 | .navbar-nav > li > a { 397 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 398 | } 399 | 400 | .navbar-inverse { 401 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 402 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 403 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 404 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 405 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 406 | filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); 407 | background-repeat: repeat-x; 408 | border-radius: 4px; 409 | } 410 | 411 | .navbar-inverse .navbar-nav > .open > a, 412 | .navbar-inverse .navbar-nav > .active > a { 413 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 414 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 415 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 416 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 417 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 418 | background-repeat: repeat-x; 419 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 420 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 421 | } 422 | 423 | .navbar-inverse .navbar-brand, 424 | .navbar-inverse .navbar-nav > li > a { 425 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 426 | } 427 | 428 | .navbar-static-top, 429 | .navbar-fixed-top, 430 | .navbar-fixed-bottom { 431 | border-radius: 0; 432 | } 433 | 434 | @media (max-width: 767px) { 435 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 436 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 437 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 438 | color: #fff; 439 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 440 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 441 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 442 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 443 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 444 | background-repeat: repeat-x; 445 | } 446 | } 447 | 448 | .alert { 449 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 450 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 451 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 452 | } 453 | 454 | .alert-success { 455 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 456 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 457 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 458 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 459 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 460 | background-repeat: repeat-x; 461 | border-color: #b2dba1; 462 | } 463 | 464 | .alert-info { 465 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 466 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 467 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 468 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 469 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 470 | background-repeat: repeat-x; 471 | border-color: #9acfea; 472 | } 473 | 474 | .alert-warning { 475 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 476 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 477 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 478 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 479 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 480 | background-repeat: repeat-x; 481 | border-color: #f5e79e; 482 | } 483 | 484 | .alert-danger { 485 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 486 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 487 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 488 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 489 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 490 | background-repeat: repeat-x; 491 | border-color: #dca7a7; 492 | } 493 | 494 | .progress { 495 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 496 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 497 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 498 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 499 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 500 | background-repeat: repeat-x; 501 | } 502 | 503 | .progress-bar { 504 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 505 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 506 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 507 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 508 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 509 | background-repeat: repeat-x; 510 | } 511 | 512 | .progress-bar-success { 513 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 514 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 515 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 516 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 517 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 518 | background-repeat: repeat-x; 519 | } 520 | 521 | .progress-bar-info { 522 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 523 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 524 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 525 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 526 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 527 | background-repeat: repeat-x; 528 | } 529 | 530 | .progress-bar-warning { 531 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 532 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 533 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 534 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 535 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 536 | background-repeat: repeat-x; 537 | } 538 | 539 | .progress-bar-danger { 540 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 541 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 542 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 543 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 544 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 545 | background-repeat: repeat-x; 546 | } 547 | 548 | .progress-bar-striped { 549 | 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); 550 | 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); 551 | 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); 552 | } 553 | 554 | .list-group { 555 | border-radius: 4px; 556 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 557 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 558 | } 559 | 560 | .list-group-item.active, 561 | .list-group-item.active:hover, 562 | .list-group-item.active:focus { 563 | text-shadow: 0 -1px 0 #286090; 564 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 565 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 566 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 567 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 568 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 569 | background-repeat: repeat-x; 570 | border-color: #2b669a; 571 | } 572 | 573 | .list-group-item.active .badge, 574 | .list-group-item.active:hover .badge, 575 | .list-group-item.active:focus .badge { 576 | text-shadow: none; 577 | } 578 | 579 | .panel { 580 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 581 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 582 | } 583 | 584 | .panel-default > .panel-heading { 585 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 586 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 587 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 588 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 589 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 590 | background-repeat: repeat-x; 591 | } 592 | 593 | .panel-primary > .panel-heading { 594 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 595 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 596 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 597 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 598 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 599 | background-repeat: repeat-x; 600 | } 601 | 602 | .panel-success > .panel-heading { 603 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 604 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 605 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 606 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 607 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 608 | background-repeat: repeat-x; 609 | } 610 | 611 | .panel-info > .panel-heading { 612 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 613 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 614 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 615 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 616 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 617 | background-repeat: repeat-x; 618 | } 619 | 620 | .panel-warning > .panel-heading { 621 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 622 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 623 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 624 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 625 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 626 | background-repeat: repeat-x; 627 | } 628 | 629 | .panel-danger > .panel-heading { 630 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 631 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 632 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 633 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 634 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 635 | background-repeat: repeat-x; 636 | } 637 | 638 | .well { 639 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 640 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 641 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 642 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 643 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 644 | background-repeat: repeat-x; 645 | border-color: #dcdcdc; 646 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 647 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 648 | } 649 | 650 | /*# sourceMappingURL=bootstrap-theme.css.map */ 651 | -------------------------------------------------------------------------------- /src/main/webapp/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{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-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning: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-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .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:focus,.btn-default:hover{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.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{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:focus,.btn-primary:hover{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.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{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:focus,.btn-success:hover{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.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{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:focus,.btn-info:hover{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.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{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:focus,.btn-warning:hover{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.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{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:focus,.btn-danger:hover{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.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.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:focus,.dropdown-menu>li>a:hover{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:focus,.dropdown-menu>.active>a:hover{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>.active>a,.navbar-default .navbar-nav>.open>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>.active>a,.navbar-inverse .navbar-nav>.open>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-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{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:focus,.list-group-item.active:hover{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:focus .badge,.list-group-item.active:hover .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)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /src/main/webapp/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/img/bgr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/img/bgr.jpg -------------------------------------------------------------------------------- /src/main/webapp/img/gou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodeTeng/javaweb_library_system/808524770135666b42f520f6fff4647cfa4c10fa/src/main/webapp/img/gou.png -------------------------------------------------------------------------------- /src/main/webapp/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if ("undefined" == typeof jQuery) throw new Error("Bootstrap's JavaScript requires jQuery"); 7 | +function (a) { 8 | "use strict"; 9 | var b = a.fn.jquery.split(" ")[0].split("."); 10 | if (b[0] < 2 && b[1] < 9 || 1 == b[0] && 9 == b[1] && b[2] < 1 || b[0] > 3) throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4") 11 | }(jQuery), +function (a) { 12 | "use strict"; 13 | 14 | function b() { 15 | var a = document.createElement("bootstrap"), b = { 16 | WebkitTransition: "webkitTransitionEnd", 17 | MozTransition: "transitionend", 18 | OTransition: "oTransitionEnd otransitionend", 19 | transition: "transitionend" 20 | }; 21 | for (var c in b) if (void 0 !== a.style[c]) return {end: b[c]}; 22 | return !1 23 | } 24 | 25 | a.fn.emulateTransitionEnd = function (b) { 26 | var c = !1, d = this; 27 | a(this).one("bsTransitionEnd", function () { 28 | c = !0 29 | }); 30 | var e = function () { 31 | c || a(d).trigger(a.support.transition.end) 32 | }; 33 | return setTimeout(e, b), this 34 | }, a(function () { 35 | a.support.transition = b(), a.support.transition && (a.event.special.bsTransitionEnd = { 36 | bindType: a.support.transition.end, 37 | delegateType: a.support.transition.end, 38 | handle: function (b) { 39 | if (a(b.target).is(this)) return b.handleObj.handler.apply(this, arguments) 40 | } 41 | }) 42 | }) 43 | }(jQuery), +function (a) { 44 | "use strict"; 45 | 46 | function b(b) { 47 | return this.each(function () { 48 | var c = a(this), e = c.data("bs.alert"); 49 | e || c.data("bs.alert", e = new d(this)), "string" == typeof b && e[b].call(c) 50 | }) 51 | } 52 | 53 | var c = '[data-dismiss="alert"]', d = function (b) { 54 | a(b).on("click", c, this.close) 55 | }; 56 | d.VERSION = "3.3.7", d.TRANSITION_DURATION = 150, d.prototype.close = function (b) { 57 | function c() { 58 | g.detach().trigger("closed.bs.alert").remove() 59 | } 60 | 61 | var e = a(this), f = e.attr("data-target"); 62 | f || (f = e.attr("href"), f = f && f.replace(/.*(?=#[^\s]*$)/, "")); 63 | var g = a("#" === f ? [] : f); 64 | b && b.preventDefault(), g.length || (g = e.closest(".alert")), g.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (g.removeClass("in"), a.support.transition && g.hasClass("fade") ? g.one("bsTransitionEnd", c).emulateTransitionEnd(d.TRANSITION_DURATION) : c()) 65 | }; 66 | var e = a.fn.alert; 67 | a.fn.alert = b, a.fn.alert.Constructor = d, a.fn.alert.noConflict = function () { 68 | return a.fn.alert = e, this 69 | }, a(document).on("click.bs.alert.data-api", c, d.prototype.close) 70 | }(jQuery), +function (a) { 71 | "use strict"; 72 | 73 | function b(b) { 74 | return this.each(function () { 75 | var d = a(this), e = d.data("bs.button"), f = "object" == typeof b && b; 76 | e || d.data("bs.button", e = new c(this, f)), "toggle" == b ? e.toggle() : b && e.setState(b) 77 | }) 78 | } 79 | 80 | var c = function (b, d) { 81 | this.$element = a(b), this.options = a.extend({}, c.DEFAULTS, d), this.isLoading = !1 82 | }; 83 | c.VERSION = "3.3.7", c.DEFAULTS = {loadingText: "loading..."}, c.prototype.setState = function (b) { 84 | var c = "disabled", d = this.$element, e = d.is("input") ? "val" : "html", f = d.data(); 85 | b += "Text", null == f.resetText && d.data("resetText", d[e]()), setTimeout(a.proxy(function () { 86 | d[e](null == f[b] ? this.options[b] : f[b]), "loadingText" == b ? (this.isLoading = !0, d.addClass(c).attr(c, c).prop(c, !0)) : this.isLoading && (this.isLoading = !1, d.removeClass(c).removeAttr(c).prop(c, !1)) 87 | }, this), 0) 88 | }, c.prototype.toggle = function () { 89 | var a = !0, b = this.$element.closest('[data-toggle="buttons"]'); 90 | if (b.length) { 91 | var c = this.$element.find("input"); 92 | "radio" == c.prop("type") ? (c.prop("checked") && (a = !1), b.find(".active").removeClass("active"), this.$element.addClass("active")) : "checkbox" == c.prop("type") && (c.prop("checked") !== this.$element.hasClass("active") && (a = !1), this.$element.toggleClass("active")), c.prop("checked", this.$element.hasClass("active")), a && c.trigger("change") 93 | } else this.$element.attr("aria-pressed", !this.$element.hasClass("active")), this.$element.toggleClass("active") 94 | }; 95 | var d = a.fn.button; 96 | a.fn.button = b, a.fn.button.Constructor = c, a.fn.button.noConflict = function () { 97 | return a.fn.button = d, this 98 | }, a(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function (c) { 99 | var d = a(c.target).closest(".btn"); 100 | b.call(d, "toggle"), a(c.target).is('input[type="radio"], input[type="checkbox"]') || (c.preventDefault(), d.is("input,button") ? d.trigger("focus") : d.find("input:visible,button:visible").first().trigger("focus")) 101 | }).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function (b) { 102 | a(b.target).closest(".btn").toggleClass("focus", /^focus(in)?$/.test(b.type)) 103 | }) 104 | }(jQuery), +function (a) { 105 | "use strict"; 106 | 107 | function b(b) { 108 | return this.each(function () { 109 | var d = a(this), e = d.data("bs.carousel"), 110 | f = a.extend({}, c.DEFAULTS, d.data(), "object" == typeof b && b), 111 | g = "string" == typeof b ? b : f.slide; 112 | e || d.data("bs.carousel", e = new c(this, f)), "number" == typeof b ? e.to(b) : g ? e[g]() : f.interval && e.pause().cycle() 113 | }) 114 | } 115 | 116 | var c = function (b, c) { 117 | this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = c, this.paused = null, this.sliding = null, this.interval = null, this.$active = null, this.$items = null, this.options.keyboard && this.$element.on("keydown.bs.carousel", a.proxy(this.keydown, this)), "hover" == this.options.pause && !("ontouchstart" in document.documentElement) && this.$element.on("mouseenter.bs.carousel", a.proxy(this.pause, this)).on("mouseleave.bs.carousel", a.proxy(this.cycle, this)) 118 | }; 119 | c.VERSION = "3.3.7", c.TRANSITION_DURATION = 600, c.DEFAULTS = { 120 | interval: 5e3, 121 | pause: "hover", 122 | wrap: !0, 123 | keyboard: !0 124 | }, c.prototype.keydown = function (a) { 125 | if (!/input|textarea/i.test(a.target.tagName)) { 126 | switch (a.which) { 127 | case 37: 128 | this.prev(); 129 | break; 130 | case 39: 131 | this.next(); 132 | break; 133 | default: 134 | return 135 | } 136 | a.preventDefault() 137 | } 138 | }, c.prototype.cycle = function (b) { 139 | return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this 140 | }, c.prototype.getItemIndex = function (a) { 141 | return this.$items = a.parent().children(".item"), this.$items.index(a || this.$active) 142 | }, c.prototype.getItemForDirection = function (a, b) { 143 | var c = this.getItemIndex(b), d = "prev" == a && 0 === c || "next" == a && c == this.$items.length - 1; 144 | if (d && !this.options.wrap) return b; 145 | var e = "prev" == a ? -1 : 1, f = (c + e) % this.$items.length; 146 | return this.$items.eq(f) 147 | }, c.prototype.to = function (a) { 148 | var b = this, c = this.getItemIndex(this.$active = this.$element.find(".item.active")); 149 | if (!(a > this.$items.length - 1 || a < 0)) return this.sliding ? this.$element.one("slid.bs.carousel", function () { 150 | b.to(a) 151 | }) : c == a ? this.pause().cycle() : this.slide(a > c ? "next" : "prev", this.$items.eq(a)) 152 | }, c.prototype.pause = function (b) { 153 | return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this 154 | }, c.prototype.next = function () { 155 | if (!this.sliding) return this.slide("next") 156 | }, c.prototype.prev = function () { 157 | if (!this.sliding) return this.slide("prev") 158 | }, c.prototype.slide = function (b, d) { 159 | var e = this.$element.find(".item.active"), f = d || this.getItemForDirection(b, e), g = this.interval, 160 | h = "next" == b ? "left" : "right", i = this; 161 | if (f.hasClass("active")) return this.sliding = !1; 162 | var j = f[0], k = a.Event("slide.bs.carousel", {relatedTarget: j, direction: h}); 163 | if (this.$element.trigger(k), !k.isDefaultPrevented()) { 164 | if (this.sliding = !0, g && this.pause(), this.$indicators.length) { 165 | this.$indicators.find(".active").removeClass("active"); 166 | var l = a(this.$indicators.children()[this.getItemIndex(f)]); 167 | l && l.addClass("active") 168 | } 169 | var m = a.Event("slid.bs.carousel", {relatedTarget: j, direction: h}); 170 | return a.support.transition && this.$element.hasClass("slide") ? (f.addClass(b), f[0].offsetWidth, e.addClass(h), f.addClass(h), e.one("bsTransitionEnd", function () { 171 | f.removeClass([b, h].join(" ")).addClass("active"), e.removeClass(["active", h].join(" ")), i.sliding = !1, setTimeout(function () { 172 | i.$element.trigger(m) 173 | }, 0) 174 | }).emulateTransitionEnd(c.TRANSITION_DURATION)) : (e.removeClass("active"), f.addClass("active"), this.sliding = !1, this.$element.trigger(m)), g && this.cycle(), this 175 | } 176 | }; 177 | var d = a.fn.carousel; 178 | a.fn.carousel = b, a.fn.carousel.Constructor = c, a.fn.carousel.noConflict = function () { 179 | return a.fn.carousel = d, this 180 | }; 181 | var e = function (c) { 182 | var d, e = a(this), f = a(e.attr("data-target") || (d = e.attr("href")) && d.replace(/.*(?=#[^\s]+$)/, "")); 183 | if (f.hasClass("carousel")) { 184 | var g = a.extend({}, f.data(), e.data()), h = e.attr("data-slide-to"); 185 | h && (g.interval = !1), b.call(f, g), h && f.data("bs.carousel").to(h), c.preventDefault() 186 | } 187 | }; 188 | a(document).on("click.bs.carousel.data-api", "[data-slide]", e).on("click.bs.carousel.data-api", "[data-slide-to]", e), a(window).on("load", function () { 189 | a('[data-ride="carousel"]').each(function () { 190 | var c = a(this); 191 | b.call(c, c.data()) 192 | }) 193 | }) 194 | }(jQuery), +function (a) { 195 | "use strict"; 196 | 197 | function b(b) { 198 | var c, d = b.attr("data-target") || (c = b.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, ""); 199 | return a(d) 200 | } 201 | 202 | function c(b) { 203 | return this.each(function () { 204 | var c = a(this), e = c.data("bs.collapse"), 205 | f = a.extend({}, d.DEFAULTS, c.data(), "object" == typeof b && b); 206 | !e && f.toggle && /show|hide/.test(b) && (f.toggle = !1), e || c.data("bs.collapse", e = new d(this, f)), "string" == typeof b && e[b]() 207 | }) 208 | } 209 | 210 | var d = function (b, c) { 211 | this.$element = a(b), this.options = a.extend({}, d.DEFAULTS, c), this.$trigger = a('[data-toggle="collapse"][href="#' + b.id + '"],[data-toggle="collapse"][data-target="#' + b.id + '"]'), this.transitioning = null, this.options.parent ? this.$parent = this.getParent() : this.addAriaAndCollapsedClass(this.$element, this.$trigger), this.options.toggle && this.toggle() 212 | }; 213 | d.VERSION = "3.3.7", d.TRANSITION_DURATION = 350, d.DEFAULTS = {toggle: !0}, d.prototype.dimension = function () { 214 | var a = this.$element.hasClass("width"); 215 | return a ? "width" : "height" 216 | }, d.prototype.show = function () { 217 | if (!this.transitioning && !this.$element.hasClass("in")) { 218 | var b, e = this.$parent && this.$parent.children(".panel").children(".in, .collapsing"); 219 | if (!(e && e.length && (b = e.data("bs.collapse"), b && b.transitioning))) { 220 | var f = a.Event("show.bs.collapse"); 221 | if (this.$element.trigger(f), !f.isDefaultPrevented()) { 222 | e && e.length && (c.call(e, "hide"), b || e.data("bs.collapse", null)); 223 | var g = this.dimension(); 224 | this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded", !0), this.$trigger.removeClass("collapsed").attr("aria-expanded", !0), this.transitioning = 1; 225 | var h = function () { 226 | this.$element.removeClass("collapsing").addClass("collapse in")[g](""), this.transitioning = 0, this.$element.trigger("shown.bs.collapse") 227 | }; 228 | if (!a.support.transition) return h.call(this); 229 | var i = a.camelCase(["scroll", g].join("-")); 230 | this.$element.one("bsTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i]) 231 | } 232 | } 233 | } 234 | }, d.prototype.hide = function () { 235 | if (!this.transitioning && this.$element.hasClass("in")) { 236 | var b = a.Event("hide.bs.collapse"); 237 | if (this.$element.trigger(b), !b.isDefaultPrevented()) { 238 | var c = this.dimension(); 239 | this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", !1), this.$trigger.addClass("collapsed").attr("aria-expanded", !1), this.transitioning = 1; 240 | var e = function () { 241 | this.transitioning = 0, this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse") 242 | }; 243 | return a.support.transition ? void this.$element[c](0).one("bsTransitionEnd", a.proxy(e, this)).emulateTransitionEnd(d.TRANSITION_DURATION) : e.call(this) 244 | } 245 | } 246 | }, d.prototype.toggle = function () { 247 | this[this.$element.hasClass("in") ? "hide" : "show"]() 248 | }, d.prototype.getParent = function () { 249 | return a(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each(a.proxy(function (c, d) { 250 | var e = a(d); 251 | this.addAriaAndCollapsedClass(b(e), e) 252 | }, this)).end() 253 | }, d.prototype.addAriaAndCollapsedClass = function (a, b) { 254 | var c = a.hasClass("in"); 255 | a.attr("aria-expanded", c), b.toggleClass("collapsed", !c).attr("aria-expanded", c) 256 | }; 257 | var e = a.fn.collapse; 258 | a.fn.collapse = c, a.fn.collapse.Constructor = d, a.fn.collapse.noConflict = function () { 259 | return a.fn.collapse = e, this 260 | }, a(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function (d) { 261 | var e = a(this); 262 | e.attr("data-target") || d.preventDefault(); 263 | var f = b(e), g = f.data("bs.collapse"), h = g ? "toggle" : e.data(); 264 | c.call(f, h) 265 | }) 266 | }(jQuery), +function (a) { 267 | "use strict"; 268 | 269 | function b(b) { 270 | var c = b.attr("data-target"); 271 | c || (c = b.attr("href"), c = c && /#[A-Za-z]/.test(c) && c.replace(/.*(?=#[^\s]*$)/, "")); 272 | var d = c && a(c); 273 | return d && d.length ? d : b.parent() 274 | } 275 | 276 | function c(c) { 277 | c && 3 === c.which || (a(e).remove(), a(f).each(function () { 278 | var d = a(this), e = b(d), f = {relatedTarget: this}; 279 | e.hasClass("open") && (c && "click" == c.type && /input|textarea/i.test(c.target.tagName) && a.contains(e[0], c.target) || (e.trigger(c = a.Event("hide.bs.dropdown", f)), c.isDefaultPrevented() || (d.attr("aria-expanded", "false"), e.removeClass("open").trigger(a.Event("hidden.bs.dropdown", f))))) 280 | })) 281 | } 282 | 283 | function d(b) { 284 | return this.each(function () { 285 | var c = a(this), d = c.data("bs.dropdown"); 286 | d || c.data("bs.dropdown", d = new g(this)), "string" == typeof b && d[b].call(c) 287 | }) 288 | } 289 | 290 | var e = ".dropdown-backdrop", f = '[data-toggle="dropdown"]', g = function (b) { 291 | a(b).on("click.bs.dropdown", this.toggle) 292 | }; 293 | g.VERSION = "3.3.7", g.prototype.toggle = function (d) { 294 | var e = a(this); 295 | if (!e.is(".disabled, :disabled")) { 296 | var f = b(e), g = f.hasClass("open"); 297 | if (c(), !g) { 298 | "ontouchstart" in document.documentElement && !f.closest(".navbar-nav").length && a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click", c); 299 | var h = {relatedTarget: this}; 300 | if (f.trigger(d = a.Event("show.bs.dropdown", h)), d.isDefaultPrevented()) return; 301 | e.trigger("focus").attr("aria-expanded", "true"), f.toggleClass("open").trigger(a.Event("shown.bs.dropdown", h)) 302 | } 303 | return !1 304 | } 305 | }, g.prototype.keydown = function (c) { 306 | if (/(38|40|27|32)/.test(c.which) && !/input|textarea/i.test(c.target.tagName)) { 307 | var d = a(this); 308 | if (c.preventDefault(), c.stopPropagation(), !d.is(".disabled, :disabled")) { 309 | var e = b(d), g = e.hasClass("open"); 310 | if (!g && 27 != c.which || g && 27 == c.which) return 27 == c.which && e.find(f).trigger("focus"), d.trigger("click"); 311 | var h = " li:not(.disabled):visible a", i = e.find(".dropdown-menu" + h); 312 | if (i.length) { 313 | var j = i.index(c.target); 314 | 38 == c.which && j > 0 && j--, 40 == c.which && j < i.length - 1 && j++, ~j || (j = 0), i.eq(j).trigger("focus") 315 | } 316 | } 317 | } 318 | }; 319 | var h = a.fn.dropdown; 320 | a.fn.dropdown = d, a.fn.dropdown.Constructor = g, a.fn.dropdown.noConflict = function () { 321 | return a.fn.dropdown = h, this 322 | }, a(document).on("click.bs.dropdown.data-api", c).on("click.bs.dropdown.data-api", ".dropdown form", function (a) { 323 | a.stopPropagation() 324 | }).on("click.bs.dropdown.data-api", f, g.prototype.toggle).on("keydown.bs.dropdown.data-api", f, g.prototype.keydown).on("keydown.bs.dropdown.data-api", ".dropdown-menu", g.prototype.keydown) 325 | }(jQuery), +function (a) { 326 | "use strict"; 327 | 328 | function b(b, d) { 329 | return this.each(function () { 330 | var e = a(this), f = e.data("bs.modal"), g = a.extend({}, c.DEFAULTS, e.data(), "object" == typeof b && b); 331 | f || e.data("bs.modal", f = new c(this, g)), "string" == typeof b ? f[b](d) : g.show && f.show(d) 332 | }) 333 | } 334 | 335 | var c = function (b, c) { 336 | this.options = c, this.$body = a(document.body), this.$element = a(b), this.$dialog = this.$element.find(".modal-dialog"), this.$backdrop = null, this.isShown = null, this.originalBodyPad = null, this.scrollbarWidth = 0, this.ignoreBackdropClick = !1, this.options.remote && this.$element.find(".modal-content").load(this.options.remote, a.proxy(function () { 337 | this.$element.trigger("loaded.bs.modal") 338 | }, this)) 339 | }; 340 | c.VERSION = "3.3.7", c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150, c.DEFAULTS = { 341 | backdrop: !0, 342 | keyboard: !0, 343 | show: !0 344 | }, c.prototype.toggle = function (a) { 345 | return this.isShown ? this.hide() : this.show(a) 346 | }, c.prototype.show = function (b) { 347 | var d = this, e = a.Event("show.bs.modal", {relatedTarget: b}); 348 | this.$element.trigger(e), this.isShown || e.isDefaultPrevented() || (this.isShown = !0, this.checkScrollbar(), this.setScrollbar(), this.$body.addClass("modal-open"), this.escape(), this.resize(), this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', a.proxy(this.hide, this)), this.$dialog.on("mousedown.dismiss.bs.modal", function () { 349 | d.$element.one("mouseup.dismiss.bs.modal", function (b) { 350 | a(b.target).is(d.$element) && (d.ignoreBackdropClick = !0) 351 | }) 352 | }), this.backdrop(function () { 353 | var e = a.support.transition && d.$element.hasClass("fade"); 354 | d.$element.parent().length || d.$element.appendTo(d.$body), d.$element.show().scrollTop(0), d.adjustDialog(), e && d.$element[0].offsetWidth, d.$element.addClass("in"), d.enforceFocus(); 355 | var f = a.Event("shown.bs.modal", {relatedTarget: b}); 356 | e ? d.$dialog.one("bsTransitionEnd", function () { 357 | d.$element.trigger("focus").trigger(f) 358 | }).emulateTransitionEnd(c.TRANSITION_DURATION) : d.$element.trigger("focus").trigger(f) 359 | })) 360 | }, c.prototype.hide = function (b) { 361 | b && b.preventDefault(), b = a.Event("hide.bs.modal"), this.$element.trigger(b), this.isShown && !b.isDefaultPrevented() && (this.isShown = !1, this.escape(), this.resize(), a(document).off("focusin.bs.modal"), this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"), this.$dialog.off("mousedown.dismiss.bs.modal"), a.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", a.proxy(this.hideModal, this)).emulateTransitionEnd(c.TRANSITION_DURATION) : this.hideModal()) 362 | }, c.prototype.enforceFocus = function () { 363 | a(document).off("focusin.bs.modal").on("focusin.bs.modal", a.proxy(function (a) { 364 | document === a.target || this.$element[0] === a.target || this.$element.has(a.target).length || this.$element.trigger("focus") 365 | }, this)) 366 | }, c.prototype.escape = function () { 367 | this.isShown && this.options.keyboard ? this.$element.on("keydown.dismiss.bs.modal", a.proxy(function (a) { 368 | 27 == a.which && this.hide() 369 | }, this)) : this.isShown || this.$element.off("keydown.dismiss.bs.modal") 370 | }, c.prototype.resize = function () { 371 | this.isShown ? a(window).on("resize.bs.modal", a.proxy(this.handleUpdate, this)) : a(window).off("resize.bs.modal") 372 | }, c.prototype.hideModal = function () { 373 | var a = this; 374 | this.$element.hide(), this.backdrop(function () { 375 | a.$body.removeClass("modal-open"), a.resetAdjustments(), a.resetScrollbar(), a.$element.trigger("hidden.bs.modal") 376 | }) 377 | }, c.prototype.removeBackdrop = function () { 378 | this.$backdrop && this.$backdrop.remove(), this.$backdrop = null 379 | }, c.prototype.backdrop = function (b) { 380 | var d = this, e = this.$element.hasClass("fade") ? "fade" : ""; 381 | if (this.isShown && this.options.backdrop) { 382 | var f = a.support.transition && e; 383 | if (this.$backdrop = a(document.createElement("div")).addClass("modal-backdrop " + e).appendTo(this.$body), this.$element.on("click.dismiss.bs.modal", a.proxy(function (a) { 384 | return this.ignoreBackdropClick ? void (this.ignoreBackdropClick = !1) : void (a.target === a.currentTarget && ("static" == this.options.backdrop ? this.$element[0].focus() : this.hide())) 385 | }, this)), f && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !b) return; 386 | f ? this.$backdrop.one("bsTransitionEnd", b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : b() 387 | } else if (!this.isShown && this.$backdrop) { 388 | this.$backdrop.removeClass("in"); 389 | var g = function () { 390 | d.removeBackdrop(), b && b() 391 | }; 392 | a.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : g() 393 | } else b && b() 394 | }, c.prototype.handleUpdate = function () { 395 | this.adjustDialog() 396 | }, c.prototype.adjustDialog = function () { 397 | var a = this.$element[0].scrollHeight > document.documentElement.clientHeight; 398 | this.$element.css({ 399 | paddingLeft: !this.bodyIsOverflowing && a ? this.scrollbarWidth : "", 400 | paddingRight: this.bodyIsOverflowing && !a ? this.scrollbarWidth : "" 401 | }) 402 | }, c.prototype.resetAdjustments = function () { 403 | this.$element.css({paddingLeft: "", paddingRight: ""}) 404 | }, c.prototype.checkScrollbar = function () { 405 | var a = window.innerWidth; 406 | if (!a) { 407 | var b = document.documentElement.getBoundingClientRect(); 408 | a = b.right - Math.abs(b.left) 409 | } 410 | this.bodyIsOverflowing = document.body.clientWidth < a, this.scrollbarWidth = this.measureScrollbar() 411 | }, c.prototype.setScrollbar = function () { 412 | var a = parseInt(this.$body.css("padding-right") || 0, 10); 413 | this.originalBodyPad = document.body.style.paddingRight || "", this.bodyIsOverflowing && this.$body.css("padding-right", a + this.scrollbarWidth) 414 | }, c.prototype.resetScrollbar = function () { 415 | this.$body.css("padding-right", this.originalBodyPad) 416 | }, c.prototype.measureScrollbar = function () { 417 | var a = document.createElement("div"); 418 | a.className = "modal-scrollbar-measure", this.$body.append(a); 419 | var b = a.offsetWidth - a.clientWidth; 420 | return this.$body[0].removeChild(a), b 421 | }; 422 | var d = a.fn.modal; 423 | a.fn.modal = b, a.fn.modal.Constructor = c, a.fn.modal.noConflict = function () { 424 | return a.fn.modal = d, this 425 | }, a(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (c) { 426 | var d = a(this), e = d.attr("href"), f = a(d.attr("data-target") || e && e.replace(/.*(?=#[^\s]+$)/, "")), 427 | g = f.data("bs.modal") ? "toggle" : a.extend({remote: !/#/.test(e) && e}, f.data(), d.data()); 428 | d.is("a") && c.preventDefault(), f.one("show.bs.modal", function (a) { 429 | a.isDefaultPrevented() || f.one("hidden.bs.modal", function () { 430 | d.is(":visible") && d.trigger("focus") 431 | }) 432 | }), b.call(f, g, this) 433 | }) 434 | }(jQuery), +function (a) { 435 | "use strict"; 436 | 437 | function b(b) { 438 | return this.each(function () { 439 | var d = a(this), e = d.data("bs.tooltip"), f = "object" == typeof b && b; 440 | !e && /destroy|hide/.test(b) || (e || d.data("bs.tooltip", e = new c(this, f)), "string" == typeof b && e[b]()) 441 | }) 442 | } 443 | 444 | var c = function (a, b) { 445 | this.type = null, this.options = null, this.enabled = null, this.timeout = null, this.hoverState = null, this.$element = null, this.inState = null, this.init("tooltip", a, b) 446 | }; 447 | c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.DEFAULTS = { 448 | animation: !0, 449 | placement: "top", 450 | selector: !1, 451 | template: '', 452 | trigger: "hover focus", 453 | title: "", 454 | delay: 0, 455 | html: !1, 456 | container: !1, 457 | viewport: {selector: "body", padding: 0} 458 | }, c.prototype.init = function (b, c, d) { 459 | if (this.enabled = !0, this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.$viewport = this.options.viewport && a(a.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : this.options.viewport.selector || this.options.viewport), this.inState = { 460 | click: !1, 461 | hover: !1, 462 | focus: !1 463 | }, this.$element[0] instanceof document.constructor && !this.options.selector) throw new Error("`selector` option must be specified when initializing " + this.type + " on the window.document object!"); 464 | for (var e = this.options.trigger.split(" "), f = e.length; f--;) { 465 | var g = e[f]; 466 | if ("click" == g) this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)); else if ("manual" != g) { 467 | var h = "hover" == g ? "mouseenter" : "focusin", i = "hover" == g ? "mouseleave" : "focusout"; 468 | this.$element.on(h + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(i + "." + this.type, this.options.selector, a.proxy(this.leave, this)) 469 | } 470 | } 471 | this.options.selector ? this._options = a.extend({}, this.options, { 472 | trigger: "manual", 473 | selector: "" 474 | }) : this.fixTitle() 475 | }, c.prototype.getDefaults = function () { 476 | return c.DEFAULTS 477 | }, c.prototype.getOptions = function (b) { 478 | return b = a.extend({}, this.getDefaults(), this.$element.data(), b), b.delay && "number" == typeof b.delay && (b.delay = { 479 | show: b.delay, 480 | hide: b.delay 481 | }), b 482 | }, c.prototype.getDelegateOptions = function () { 483 | var b = {}, c = this.getDefaults(); 484 | return this._options && a.each(this._options, function (a, d) { 485 | c[a] != d && (b[a] = d) 486 | }), b 487 | }, c.prototype.enter = function (b) { 488 | var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); 489 | return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusin" == b.type ? "focus" : "hover"] = !0), c.tip().hasClass("in") || "in" == c.hoverState ? void (c.hoverState = "in") : (clearTimeout(c.timeout), c.hoverState = "in", c.options.delay && c.options.delay.show ? void (c.timeout = setTimeout(function () { 490 | "in" == c.hoverState && c.show() 491 | }, c.options.delay.show)) : c.show()) 492 | }, c.prototype.isInStateTrue = function () { 493 | for (var a in this.inState) if (this.inState[a]) return !0; 494 | return !1 495 | }, c.prototype.leave = function (b) { 496 | var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); 497 | if (c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusout" == b.type ? "focus" : "hover"] = !1), !c.isInStateTrue()) return clearTimeout(c.timeout), c.hoverState = "out", c.options.delay && c.options.delay.hide ? void (c.timeout = setTimeout(function () { 498 | "out" == c.hoverState && c.hide() 499 | }, c.options.delay.hide)) : c.hide() 500 | }, c.prototype.show = function () { 501 | var b = a.Event("show.bs." + this.type); 502 | if (this.hasContent() && this.enabled) { 503 | this.$element.trigger(b); 504 | var d = a.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]); 505 | if (b.isDefaultPrevented() || !d) return; 506 | var e = this, f = this.tip(), g = this.getUID(this.type); 507 | this.setContent(), f.attr("id", g), this.$element.attr("aria-describedby", g), this.options.animation && f.addClass("fade"); 508 | var h = "function" == typeof this.options.placement ? this.options.placement.call(this, f[0], this.$element[0]) : this.options.placement, 509 | i = /\s?auto?\s?/i, j = i.test(h); 510 | j && (h = h.replace(i, "") || "top"), f.detach().css({ 511 | top: 0, 512 | left: 0, 513 | display: "block" 514 | }).addClass(h).data("bs." + this.type, this), this.options.container ? f.appendTo(this.options.container) : f.insertAfter(this.$element), this.$element.trigger("inserted.bs." + this.type); 515 | var k = this.getPosition(), l = f[0].offsetWidth, m = f[0].offsetHeight; 516 | if (j) { 517 | var n = h, o = this.getPosition(this.$viewport); 518 | h = "bottom" == h && k.bottom + m > o.bottom ? "top" : "top" == h && k.top - m < o.top ? "bottom" : "right" == h && k.right + l > o.width ? "left" : "left" == h && k.left - l < o.left ? "right" : h, f.removeClass(n).addClass(h) 519 | } 520 | var p = this.getCalculatedOffset(h, k, l, m); 521 | this.applyPlacement(p, h); 522 | var q = function () { 523 | var a = e.hoverState; 524 | e.$element.trigger("shown.bs." + e.type), e.hoverState = null, "out" == a && e.leave(e) 525 | }; 526 | a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", q).emulateTransitionEnd(c.TRANSITION_DURATION) : q() 527 | } 528 | }, c.prototype.applyPlacement = function (b, c) { 529 | var d = this.tip(), e = d[0].offsetWidth, f = d[0].offsetHeight, g = parseInt(d.css("margin-top"), 10), 530 | h = parseInt(d.css("margin-left"), 10); 531 | isNaN(g) && (g = 0), isNaN(h) && (h = 0), b.top += g, b.left += h, a.offset.setOffset(d[0], a.extend({ 532 | using: function (a) { 533 | d.css({top: Math.round(a.top), left: Math.round(a.left)}) 534 | } 535 | }, b), 0), d.addClass("in"); 536 | var i = d[0].offsetWidth, j = d[0].offsetHeight; 537 | "top" == c && j != f && (b.top = b.top + f - j); 538 | var k = this.getViewportAdjustedDelta(c, b, i, j); 539 | k.left ? b.left += k.left : b.top += k.top; 540 | var l = /top|bottom/.test(c), m = l ? 2 * k.left - e + i : 2 * k.top - f + j, 541 | n = l ? "offsetWidth" : "offsetHeight"; 542 | d.offset(b), this.replaceArrow(m, d[0][n], l) 543 | }, c.prototype.replaceArrow = function (a, b, c) { 544 | this.arrow().css(c ? "left" : "top", 50 * (1 - a / b) + "%").css(c ? "top" : "left", "") 545 | }, c.prototype.setContent = function () { 546 | var a = this.tip(), b = this.getTitle(); 547 | a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right") 548 | }, c.prototype.hide = function (b) { 549 | function d() { 550 | "in" != e.hoverState && f.detach(), e.$element && e.$element.removeAttr("aria-describedby").trigger("hidden.bs." + e.type), b && b() 551 | } 552 | 553 | var e = this, f = a(this.$tip), g = a.Event("hide.bs." + this.type); 554 | if (this.$element.trigger(g), !g.isDefaultPrevented()) return f.removeClass("in"), a.support.transition && f.hasClass("fade") ? f.one("bsTransitionEnd", d).emulateTransitionEnd(c.TRANSITION_DURATION) : d(), this.hoverState = null, this 555 | }, c.prototype.fixTitle = function () { 556 | var a = this.$element; 557 | (a.attr("title") || "string" != typeof a.attr("data-original-title")) && a.attr("data-original-title", a.attr("title") || "").attr("title", "") 558 | }, c.prototype.hasContent = function () { 559 | return this.getTitle() 560 | }, c.prototype.getPosition = function (b) { 561 | b = b || this.$element; 562 | var c = b[0], d = "BODY" == c.tagName, e = c.getBoundingClientRect(); 563 | null == e.width && (e = a.extend({}, e, {width: e.right - e.left, height: e.bottom - e.top})); 564 | var f = window.SVGElement && c instanceof window.SVGElement, g = d ? {top: 0, left: 0} : f ? null : b.offset(), 565 | h = {scroll: d ? document.documentElement.scrollTop || document.body.scrollTop : b.scrollTop()}, 566 | i = d ? {width: a(window).width(), height: a(window).height()} : null; 567 | return a.extend({}, e, h, i, g) 568 | }, c.prototype.getCalculatedOffset = function (a, b, c, d) { 569 | return "bottom" == a ? { 570 | top: b.top + b.height, 571 | left: b.left + b.width / 2 - c / 2 572 | } : "top" == a ? { 573 | top: b.top - d, 574 | left: b.left + b.width / 2 - c / 2 575 | } : "left" == a ? {top: b.top + b.height / 2 - d / 2, left: b.left - c} : { 576 | top: b.top + b.height / 2 - d / 2, 577 | left: b.left + b.width 578 | } 579 | }, c.prototype.getViewportAdjustedDelta = function (a, b, c, d) { 580 | var e = {top: 0, left: 0}; 581 | if (!this.$viewport) return e; 582 | var f = this.options.viewport && this.options.viewport.padding || 0, g = this.getPosition(this.$viewport); 583 | if (/right|left/.test(a)) { 584 | var h = b.top - f - g.scroll, i = b.top + f - g.scroll + d; 585 | h < g.top ? e.top = g.top - h : i > g.top + g.height && (e.top = g.top + g.height - i) 586 | } else { 587 | var j = b.left - f, k = b.left + f + c; 588 | j < g.left ? e.left = g.left - j : k > g.right && (e.left = g.left + g.width - k) 589 | } 590 | return e 591 | }, c.prototype.getTitle = function () { 592 | var a, b = this.$element, c = this.options; 593 | return a = b.attr("data-original-title") || ("function" == typeof c.title ? c.title.call(b[0]) : c.title) 594 | }, c.prototype.getUID = function (a) { 595 | do a += ~~(1e6 * Math.random()); while (document.getElementById(a)); 596 | return a 597 | }, c.prototype.tip = function () { 598 | if (!this.$tip && (this.$tip = a(this.options.template), 1 != this.$tip.length)) throw new Error(this.type + " `template` option must consist of exactly 1 top-level element!"); 599 | return this.$tip 600 | }, c.prototype.arrow = function () { 601 | return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") 602 | }, c.prototype.enable = function () { 603 | this.enabled = !0 604 | }, c.prototype.disable = function () { 605 | this.enabled = !1 606 | }, c.prototype.toggleEnabled = function () { 607 | this.enabled = !this.enabled 608 | }, c.prototype.toggle = function (b) { 609 | var c = this; 610 | b && (c = a(b.currentTarget).data("bs." + this.type), c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c))), b ? (c.inState.click = !c.inState.click, c.isInStateTrue() ? c.enter(c) : c.leave(c)) : c.tip().hasClass("in") ? c.leave(c) : c.enter(c) 611 | }, c.prototype.destroy = function () { 612 | var a = this; 613 | clearTimeout(this.timeout), this.hide(function () { 614 | a.$element.off("." + a.type).removeData("bs." + a.type), a.$tip && a.$tip.detach(), a.$tip = null, a.$arrow = null, a.$viewport = null, a.$element = null 615 | }) 616 | }; 617 | var d = a.fn.tooltip; 618 | a.fn.tooltip = b, a.fn.tooltip.Constructor = c, a.fn.tooltip.noConflict = function () { 619 | return a.fn.tooltip = d, this 620 | } 621 | }(jQuery), +function (a) { 622 | "use strict"; 623 | 624 | function b(b) { 625 | return this.each(function () { 626 | var d = a(this), e = d.data("bs.popover"), f = "object" == typeof b && b; 627 | !e && /destroy|hide/.test(b) || (e || d.data("bs.popover", e = new c(this, f)), "string" == typeof b && e[b]()) 628 | }) 629 | } 630 | 631 | var c = function (a, b) { 632 | this.init("popover", a, b) 633 | }; 634 | if (!a.fn.tooltip) throw new Error("Popover requires tooltip.js"); 635 | c.VERSION = "3.3.7", c.DEFAULTS = a.extend({}, a.fn.tooltip.Constructor.DEFAULTS, { 636 | placement: "right", 637 | trigger: "click", 638 | content: "", 639 | template: '' 640 | }), c.prototype = a.extend({}, a.fn.tooltip.Constructor.prototype), c.prototype.constructor = c, c.prototype.getDefaults = function () { 641 | return c.DEFAULTS 642 | }, c.prototype.setContent = function () { 643 | var a = this.tip(), b = this.getTitle(), c = this.getContent(); 644 | a.find(".popover-title")[this.options.html ? "html" : "text"](b), a.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof c ? "html" : "append" : "text"](c), a.removeClass("fade top bottom left right in"), a.find(".popover-title").html() || a.find(".popover-title").hide() 645 | }, c.prototype.hasContent = function () { 646 | return this.getTitle() || this.getContent() 647 | }, c.prototype.getContent = function () { 648 | var a = this.$element, b = this.options; 649 | return a.attr("data-content") || ("function" == typeof b.content ? b.content.call(a[0]) : b.content) 650 | }, c.prototype.arrow = function () { 651 | return this.$arrow = this.$arrow || this.tip().find(".arrow") 652 | }; 653 | var d = a.fn.popover; 654 | a.fn.popover = b, a.fn.popover.Constructor = c, a.fn.popover.noConflict = function () { 655 | return a.fn.popover = d, this 656 | } 657 | }(jQuery), +function (a) { 658 | "use strict"; 659 | 660 | function b(c, d) { 661 | this.$body = a(document.body), this.$scrollElement = a(a(c).is(document.body) ? window : c), this.options = a.extend({}, b.DEFAULTS, d), this.selector = (this.options.target || "") + " .nav li > a", this.offsets = [], this.targets = [], this.activeTarget = null, this.scrollHeight = 0, this.$scrollElement.on("scroll.bs.scrollspy", a.proxy(this.process, this)), this.refresh(), this.process() 662 | } 663 | 664 | function c(c) { 665 | return this.each(function () { 666 | var d = a(this), e = d.data("bs.scrollspy"), f = "object" == typeof c && c; 667 | e || d.data("bs.scrollspy", e = new b(this, f)), "string" == typeof c && e[c]() 668 | }) 669 | } 670 | 671 | b.VERSION = "3.3.7", b.DEFAULTS = {offset: 10}, b.prototype.getScrollHeight = function () { 672 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) 673 | }, b.prototype.refresh = function () { 674 | var b = this, c = "offset", d = 0; 675 | this.offsets = [], this.targets = [], this.scrollHeight = this.getScrollHeight(), a.isWindow(this.$scrollElement[0]) || (c = "position", d = this.$scrollElement.scrollTop()), this.$body.find(this.selector).map(function () { 676 | var b = a(this), e = b.data("target") || b.attr("href"), f = /^#./.test(e) && a(e); 677 | return f && f.length && f.is(":visible") && [[f[c]().top + d, e]] || null 678 | }).sort(function (a, b) { 679 | return a[0] - b[0] 680 | }).each(function () { 681 | b.offsets.push(this[0]), b.targets.push(this[1]) 682 | }) 683 | }, b.prototype.process = function () { 684 | var a, b = this.$scrollElement.scrollTop() + this.options.offset, c = this.getScrollHeight(), 685 | d = this.options.offset + c - this.$scrollElement.height(), e = this.offsets, f = this.targets, 686 | g = this.activeTarget; 687 | if (this.scrollHeight != c && this.refresh(), b >= d) return g != (a = f[f.length - 1]) && this.activate(a); 688 | if (g && b < e[0]) return this.activeTarget = null, this.clear(); 689 | for (a = e.length; a--;) g != f[a] && b >= e[a] && (void 0 === e[a + 1] || b < e[a + 1]) && this.activate(f[a]) 690 | }, b.prototype.activate = function (b) { 691 | this.activeTarget = b, this.clear(); 692 | var c = this.selector + '[data-target="' + b + '"],' + this.selector + '[href="' + b + '"]', 693 | d = a(c).parents("li").addClass("active"); 694 | d.parent(".dropdown-menu").length && (d = d.closest("li.dropdown").addClass("active")), d.trigger("activate.bs.scrollspy") 695 | }, b.prototype.clear = function () { 696 | a(this.selector).parentsUntil(this.options.target, ".active").removeClass("active") 697 | }; 698 | var d = a.fn.scrollspy; 699 | a.fn.scrollspy = c, a.fn.scrollspy.Constructor = b, a.fn.scrollspy.noConflict = function () { 700 | return a.fn.scrollspy = d, this 701 | }, a(window).on("load.bs.scrollspy.data-api", function () { 702 | a('[data-spy="scroll"]').each(function () { 703 | var b = a(this); 704 | c.call(b, b.data()) 705 | }) 706 | }) 707 | }(jQuery), +function (a) { 708 | "use strict"; 709 | 710 | function b(b) { 711 | return this.each(function () { 712 | var d = a(this), e = d.data("bs.tab"); 713 | e || d.data("bs.tab", e = new c(this)), "string" == typeof b && e[b]() 714 | }) 715 | } 716 | 717 | var c = function (b) { 718 | this.element = a(b) 719 | }; 720 | c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.prototype.show = function () { 721 | var b = this.element, c = b.closest("ul:not(.dropdown-menu)"), d = b.data("target"); 722 | if (d || (d = b.attr("href"), d = d && d.replace(/.*(?=#[^\s]*$)/, "")), !b.parent("li").hasClass("active")) { 723 | var e = c.find(".active:last a"), f = a.Event("hide.bs.tab", {relatedTarget: b[0]}), 724 | g = a.Event("show.bs.tab", {relatedTarget: e[0]}); 725 | if (e.trigger(f), b.trigger(g), !g.isDefaultPrevented() && !f.isDefaultPrevented()) { 726 | var h = a(d); 727 | this.activate(b.closest("li"), c), this.activate(h, h.parent(), function () { 728 | e.trigger({type: "hidden.bs.tab", relatedTarget: b[0]}), b.trigger({ 729 | type: "shown.bs.tab", 730 | relatedTarget: e[0] 731 | }) 732 | }) 733 | } 734 | } 735 | }, c.prototype.activate = function (b, d, e) { 736 | function f() { 737 | g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !1), b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", !0), h ? (b[0].offsetWidth, b.addClass("in")) : b.removeClass("fade"), b.parent(".dropdown-menu").length && b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !0), e && e() 738 | } 739 | 740 | var g = d.find("> .active"), 741 | h = e && a.support.transition && (g.length && g.hasClass("fade") || !!d.find("> .fade").length); 742 | g.length && h ? g.one("bsTransitionEnd", f).emulateTransitionEnd(c.TRANSITION_DURATION) : f(), g.removeClass("in") 743 | }; 744 | var d = a.fn.tab; 745 | a.fn.tab = b, a.fn.tab.Constructor = c, a.fn.tab.noConflict = function () { 746 | return a.fn.tab = d, this 747 | }; 748 | var e = function (c) { 749 | c.preventDefault(), b.call(a(this), "show") 750 | }; 751 | a(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', e).on("click.bs.tab.data-api", '[data-toggle="pill"]', e) 752 | }(jQuery), +function (a) { 753 | "use strict"; 754 | 755 | function b(b) { 756 | return this.each(function () { 757 | var d = a(this), e = d.data("bs.affix"), f = "object" == typeof b && b; 758 | e || d.data("bs.affix", e = new c(this, f)), "string" == typeof b && e[b]() 759 | }) 760 | } 761 | 762 | var c = function (b, d) { 763 | this.options = a.extend({}, c.DEFAULTS, d), this.$target = a(this.options.target).on("scroll.bs.affix.data-api", a.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", a.proxy(this.checkPositionWithEventLoop, this)), this.$element = a(b), this.affixed = null, this.unpin = null, this.pinnedOffset = null, this.checkPosition() 764 | }; 765 | c.VERSION = "3.3.7", c.RESET = "affix affix-top affix-bottom", c.DEFAULTS = { 766 | offset: 0, 767 | target: window 768 | }, c.prototype.getState = function (a, b, c, d) { 769 | var e = this.$target.scrollTop(), f = this.$element.offset(), g = this.$target.height(); 770 | if (null != c && "top" == this.affixed) return e < c && "top"; 771 | if ("bottom" == this.affixed) return null != c ? !(e + this.unpin <= f.top) && "bottom" : !(e + g <= a - d) && "bottom"; 772 | var h = null == this.affixed, i = h ? e : f.top, j = h ? g : b; 773 | return null != c && e <= c ? "top" : null != d && i + j >= a - d && "bottom" 774 | }, c.prototype.getPinnedOffset = function () { 775 | if (this.pinnedOffset) return this.pinnedOffset; 776 | this.$element.removeClass(c.RESET).addClass("affix"); 777 | var a = this.$target.scrollTop(), b = this.$element.offset(); 778 | return this.pinnedOffset = b.top - a 779 | }, c.prototype.checkPositionWithEventLoop = function () { 780 | setTimeout(a.proxy(this.checkPosition, this), 1) 781 | }, c.prototype.checkPosition = function () { 782 | if (this.$element.is(":visible")) { 783 | var b = this.$element.height(), d = this.options.offset, e = d.top, f = d.bottom, 784 | g = Math.max(a(document).height(), a(document.body).height()); 785 | "object" != typeof d && (f = e = d), "function" == typeof e && (e = d.top(this.$element)), "function" == typeof f && (f = d.bottom(this.$element)); 786 | var h = this.getState(g, b, e, f); 787 | if (this.affixed != h) { 788 | null != this.unpin && this.$element.css("top", ""); 789 | var i = "affix" + (h ? "-" + h : ""), j = a.Event(i + ".bs.affix"); 790 | if (this.$element.trigger(j), j.isDefaultPrevented()) return; 791 | this.affixed = h, this.unpin = "bottom" == h ? this.getPinnedOffset() : null, this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix", "affixed") + ".bs.affix") 792 | } 793 | "bottom" == h && this.$element.offset({top: g - b - f}) 794 | } 795 | }; 796 | var d = a.fn.affix; 797 | a.fn.affix = b, a.fn.affix.Constructor = c, a.fn.affix.noConflict = function () { 798 | return a.fn.affix = d, this 799 | }, a(window).on("load", function () { 800 | a('[data-spy="affix"]').each(function () { 801 | var c = a(this), d = c.data(); 802 | d.offset = d.offset || {}, null != d.offsetBottom && (d.offset.bottom = d.offsetBottom), null != d.offsetTop && (d.offset.top = d.offsetTop), b.call(c, d) 803 | }) 804 | }) 805 | }(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/list.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 图书管理系统 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 29 | 30 | 72 | 73 | 74 |
75 |

书籍信息列表

76 | 77 |
78 |
79 |
80 | 81 | 82 |
83 |
84 | 85 | 87 |
88 |
89 | 90 | 92 |
93 | 94 |
95 |
96 | 97 |
98 | 添加书籍 99 | 删除选中 100 |
101 | 102 |
103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 132 | 133 | 134 |
编号书名图书价格图书作者图书类别图书生产日期图书简介图书详述图书生产编号
${s.count}${book.name}${book.price}${book.author}${book.type}${book.pdate}${book.description}${book.detail}${book.address}修改   131 | 删除
135 |
136 |
137 | 184 |
185 |
186 | 187 | 188 | -------------------------------------------------------------------------------- /src/main/webapp/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | < 3 | 4 | 5 | 6 | 7 | 8 | 管理员登录 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 25 | 31 | 32 | 33 |
34 |

管理员登录

35 |
36 |
37 | 38 | 39 |
40 | 41 |
42 | 43 | 44 |
45 | 46 |
47 | 48 | 50 | 51 | 52 |
53 |
54 |
55 | 56 |
57 |
58 | 59 | 60 | 65 |
66 | 67 | -------------------------------------------------------------------------------- /src/main/webapp/update.jsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 修改图书页面 12 | 13 | 14 | 15 | 16 | 17 | 41 | 42 | 43 |
44 |

修改图书信息

45 |
46 | <%--隐藏域 提交id--%> 47 | 48 | 49 |
50 | 51 | 52 |
53 | 54 |
55 | 56 | 57 |
58 | 59 |
60 | 61 | 62 |
63 | 64 |
65 | 66 | 67 |
68 | 69 |
70 | 71 | 72 |
73 | 74 |
75 | 76 | 77 |
78 | 79 |
80 | 81 | 82 |
83 | 84 |
85 | 86 | 87 |
88 | 89 |
90 | 91 | 92 | 93 |
94 |
95 |
96 | 97 | 98 | --------------------------------------------------------------------------------