Repository: banbanzzz/Movie Branch: master Commit: d82b1d2df19b Files: 152 Total size: 4.4 MB Directory structure: gitextract_jaf7y3mn/ ├── .classpath ├── .gitattributes ├── .project ├── .settings/ │ ├── .jsdtscope │ ├── org.eclipse.jdt.core.prefs │ ├── org.eclipse.m2e.core.prefs │ ├── org.eclipse.wst.common.component │ ├── org.eclipse.wst.common.project.facet.core.xml │ ├── org.eclipse.wst.jsdt.ui.superType.container │ ├── org.eclipse.wst.jsdt.ui.superType.name │ └── org.eclipse.wst.validation.prefs ├── README.md ├── movie.sql ├── pom.xml ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ ├── controller/ │ │ │ ├── CommentController.java │ │ │ ├── MovieController.java │ │ │ ├── OrderController.java │ │ │ ├── ScheduleController.java │ │ │ └── UserController.java │ │ ├── entity/ │ │ │ ├── Cinema.java │ │ │ ├── Comment.java │ │ │ ├── Hall.java │ │ │ ├── Movie.java │ │ │ ├── Order.java │ │ │ ├── Schedule.java │ │ │ └── User.java │ │ ├── mapper/ │ │ │ ├── CinemaMapper.java │ │ │ ├── CinemaMapper.xml │ │ │ ├── CommentMapper.java │ │ │ ├── CommentMapper.xml │ │ │ ├── HallMapper.java │ │ │ ├── HallMapper.xml │ │ │ ├── MovieMapper.java │ │ │ ├── MovieMapper.xml │ │ │ ├── OrderMapper.java │ │ │ ├── OrderMapper.xml │ │ │ ├── ScheduleMapper.java │ │ │ ├── ScheduleMapper.xml │ │ │ ├── UserMapper.java │ │ │ └── UserMapper.xml │ │ ├── service/ │ │ │ ├── ICinemaService.java │ │ │ ├── ICommentService.java │ │ │ ├── IHallService.java │ │ │ ├── IMovieService.java │ │ │ ├── IOrderService.java │ │ │ ├── IScheduleService.java │ │ │ ├── IUserService.java │ │ │ └── imp/ │ │ │ ├── CinemaServiceImp.java │ │ │ ├── CommentServiceImp.java │ │ │ ├── HallServiceImp.java │ │ │ ├── MovieServiceImp.java │ │ │ ├── OrderServiceImp.java │ │ │ ├── ScheduleServiceImp.java │ │ │ └── UserServiceImp.java │ │ └── util/ │ │ ├── ResponseModel.java │ │ ├── UUIDUtil.java │ │ └── test.java │ ├── resources/ │ │ ├── movie.sql │ │ ├── mybatis.xml │ │ ├── mysql.properties │ │ └── spring.xml │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml │ ├── index.html │ ├── jsp/ │ │ ├── buySeat.jsp │ │ ├── buyTickets.jsp │ │ ├── center.jsp │ │ ├── footer.jsp │ │ ├── header.jsp │ │ ├── login.jsp │ │ ├── mainPage.jsp │ │ ├── manage.jsp │ │ ├── movieDetail.jsp │ │ ├── movieList.jsp │ │ ├── pay.jsp │ │ ├── payStatus.jsp │ │ ├── selectSeat.jsp │ │ └── test.jsp │ └── static/ │ ├── bootstrap/ │ │ ├── bootstrap.js │ │ ├── css/ │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap.css │ │ │ └── style.css │ │ └── js/ │ │ ├── bootstrap.js │ │ └── npm.js │ ├── css/ │ │ ├── buySeat.css │ │ ├── buyTickets.css │ │ ├── center.css │ │ ├── footer.css │ │ ├── header.css │ │ ├── login.css │ │ ├── main.css │ │ ├── main2.css │ │ ├── manage.css │ │ ├── modify.css │ │ ├── movieDetail.css │ │ ├── movieList.css │ │ ├── pay.css │ │ ├── paystatus.css │ │ ├── selectSeat.css │ │ └── style2.css │ ├── images/ │ │ └── logo_h.psd │ ├── js/ │ │ ├── Api.js │ │ ├── classie.js │ │ ├── echarts.js │ │ ├── header.js │ │ ├── main2.js │ │ └── modernizr-custom.js │ └── layui/ │ ├── css/ │ │ ├── index.css │ │ ├── layui.css │ │ ├── layui.mobile.css │ │ └── modules/ │ │ ├── code.css │ │ ├── laydate/ │ │ │ └── default/ │ │ │ └── laydate.css │ │ └── layer/ │ │ └── default/ │ │ └── layer.css │ ├── js/ │ │ └── firm.js │ ├── lay/ │ │ └── modules/ │ │ ├── carousel.js │ │ ├── code.js │ │ ├── colorpicker.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── rate.js │ │ ├── slider.js │ │ ├── table.js │ │ ├── transfer.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js │ ├── layui.all.js │ └── layui.js └── target/ ├── classes/ │ ├── com/ │ │ └── mapper/ │ │ ├── CinemaMapper.xml │ │ ├── CommentMapper.xml │ │ ├── HallMapper.xml │ │ ├── MovieMapper.xml │ │ ├── OrderMapper.xml │ │ ├── ScheduleMapper.xml │ │ └── UserMapper.xml │ ├── mybatis.xml │ ├── mysql.properties │ └── spring.xml ├── m2e-wtp/ │ └── web-resources/ │ └── META-INF/ │ ├── MANIFEST.MF │ └── maven/ │ └── com.movie/ │ └── Movie/ │ ├── pom.properties │ └── pom.xml ├── maven-archiver/ │ └── pom.properties └── maven-status/ └── maven-compiler-plugin/ ├── compile/ │ └── default-compile/ │ ├── createdFiles.lst │ └── inputFiles.lst └── testCompile/ └── default-testCompile/ └── inputFiles.lst ================================================ FILE CONTENTS ================================================ ================================================ FILE: .classpath ================================================ ================================================ FILE: .gitattributes ================================================ *.js linguist-language=java *.css linguist-language=java *.html linguist-language=java ================================================ FILE: .project ================================================ Movie org.eclipse.jdt.core.javabuilder org.eclipse.wst.common.project.facet.core.builder org.eclipse.wst.validation.validationbuilder org.eclipse.m2e.core.maven2Builder org.eclipse.jem.workbench.JavaEMFNature org.eclipse.wst.common.modulecore.ModuleCoreNature org.eclipse.jdt.core.javanature org.eclipse.m2e.core.maven2Nature org.eclipse.wst.common.project.facet.core.nature org.eclipse.wst.jsdt.core.jsNature ================================================ FILE: .settings/.jsdtscope ================================================ ================================================ FILE: .settings/org.eclipse.jdt.core.prefs ================================================ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=1.8 ================================================ FILE: .settings/org.eclipse.m2e.core.prefs ================================================ activeProfiles= eclipse.preferences.version=1 resolveWorkspaceProjects=true version=1 ================================================ FILE: .settings/org.eclipse.wst.common.component ================================================ ================================================ FILE: .settings/org.eclipse.wst.common.project.facet.core.xml ================================================ ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.container ================================================ org.eclipse.wst.jsdt.launching.baseBrowserLibrary ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.name ================================================ Window ================================================ FILE: .settings/org.eclipse.wst.validation.prefs ================================================ disabled=06target eclipse.preferences.version=1 ================================================ FILE: README.md ================================================ # 仿猫眼电影购票系统 ## 基于Spring+Spring MVC+Mybatis+Layui ### 功能: * 前台: * 登录、注册、注销 * 基本信息修改、修改头像、修改密码 * 按标签检索电影 * 根据电影选择场次 * 根据场次选择座位 * 购票 * 查看个人订单 * 申请退票 * 发布评论、修改评论、删除评论 * 后台: + 用户管理:增、删、改、查 + 电影管理:添加电影、修改和下架前台在映的电影 + 场次管理: - 添加场次:选择影院、影院放映厅、电影、场次时间 - 场次下架 - 检索场次 - 查看上映、下架场次 + 评论管理:查看评论、根据用户检索评论、修改、删除 + 订单管理: - 根据用户/订单编号检索订单 - 查看退票的订单 - 退票审核 + 票房统计: - 统计系统电影类型的票房数据 - 统计系统电影票房排行前10的电影及票房 ### 前台预览:           ### 后台预览:             ================================================ FILE: movie.sql ================================================ /* Navicat Premium Data Transfer Source Server : localhost_3306 Source Server Type : MySQL Source Server Version : 80012 Source Host : localhost:3306 Source Schema : movie Target Server Type : MySQL Target Server Version : 80012 File Encoding : 65001 Date: 06/08/2019 14:40:26 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for cinema -- ---------------------------- DROP TABLE IF EXISTS `cinema`; CREATE TABLE `cinema` ( `cinema_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '影院编号', `cinema_name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '影院名称', `cinema_address` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '影院地址', PRIMARY KEY (`cinema_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of cinema -- ---------------------------- INSERT INTO `cinema` VALUES (1, '中山奇幻电影院', '石岐区岐头新村龙凤街4号大信溢彩荟二期8楼'); INSERT INTO `cinema` VALUES (2, '金逸影城中山石歧店', '石岐区大信南路2路大信新都汇5楼'); INSERT INTO `cinema` VALUES (3, '博纳国际影城(中山IMAX店)', '古镇区同兴路98号利和广场购物中心四楼4009号'); INSERT INTO `cinema` VALUES (4, 'UME影城(中山古镇店)', '古镇区中兴大道南一号花艺广场11层A区'); INSERT INTO `cinema` VALUES (5, '中影100影城石歧店', '石岐区康华路15号恒基大厦3楼'); INSERT INTO `cinema` VALUES (6, '橙天嘉禾影城(利和店)', '石岐区中山三路16号利和广场五层'); INSERT INTO `cinema` VALUES (7, '珠影GCC影城(中山杜比全景声店)', '火炬高技术产业开发区火炬开发区港城路7号明珠广场二期'); INSERT INTO `cinema` VALUES (8, '期遇·翼影城(东凤店)', '东凤镇东富路81号大顺时尚荟广场B座四楼(原君信大厦)'); INSERT INTO `cinema` VALUES (9, '中山IM电影城(南朗壹加壹店)', '南朗镇岭南路62号新壹加壹4楼'); INSERT INTO `cinema` VALUES (10, '艺达国际影城(小榄杜比全景声店)', '小榄镇新华中路118号大信新都汇118广场4楼'); INSERT INTO `cinema` VALUES (11, '中影天乐电影城(海州汇海城店)', '古镇镇古镇海州市场汇海城北门电梯5楼(星海湾对面)'); INSERT INTO `cinema` VALUES (12, '比高电影城(中山店)', '坦洲镇坦神北路118号皇爵假日广场4楼'); INSERT INTO `cinema` VALUES (13, '大地影院(星宝时代店)', '沙溪镇乐群坎溪村(星宝路6号星宝时代广场)'); INSERT INTO `cinema` VALUES (14, '中影星艺影城(南朗车站店)', '南朗镇南朗车站2楼'); INSERT INTO `cinema` VALUES (15, '中影太阳城影院(张家边店)', '火炬高技术产业开发区东镇东一路23号太阳城购物中心4楼(近群英华庭)'); INSERT INTO `cinema` VALUES (16, '五月花电影城(棕榈彩虹商业中心店)', '西区街道棕榈彩虹商业中心1座三楼(近新中医院)'); INSERT INTO `cinema` VALUES (17, '高菲影城(中山万益广场店)', '板芙镇迎宾大道8号(万益广场店)'); INSERT INTO `cinema` VALUES (18, '金逸影城(中山远洋城IMAX店)', '东区街道博爱六路28号远洋广场3幢大信新都汇4楼'); -- ---------------------------- -- Table structure for comment -- ---------------------------- DROP TABLE IF EXISTS `comment`; CREATE TABLE `comment` ( `comment_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '评论编号', `user_id` bigint(10) NOT NULL COMMENT '所属用户编号', `comment_content` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '评论内容', `movie_id` bigint(10) NOT NULL COMMENT '所属电影编号', `comment_time` datetime(0) NOT NULL COMMENT '评论时间', PRIMARY KEY (`comment_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of comment -- ---------------------------- INSERT INTO `comment` VALUES (3, 1, '不容错过', 3, '2019-07-18 15:15:22'); INSERT INTO `comment` VALUES (4, 1, '车开电车侧壁如履平地,足踢卫星返回舱一脚拯救东京,我看柯南跟吴京此生必有一战吧', 4, '2019-07-13 11:15:01'); INSERT INTO `comment` VALUES (5, 1, '看到最后一直在想真正的主角【皮球】怎么还不登场,结果果然没有让我失望。哦对,主役是皮球的话,二番就是安室的车了吧。', 5, '2019-07-13 11:15:14'); INSERT INTO `comment` VALUES (7, 1, '东南亚电影院的观众们同时发出了杠铃般的笑声4536346', 7, '2019-07-24 02:37:36'); INSERT INTO `comment` VALUES (8, 1, '谁要看你们检察院公安撕逼 我操 还我黑衣人组织', 8, '2019-07-13 11:15:51'); INSERT INTO `comment` VALUES (10, 1, '还行,没吹得那么好,有点像强化娱乐性的海底版《黑豹》...故事线极其简单,打戏遍布扩成了143分钟的篇幅,对路人非常友好,不过这类过度炫目眼花缭乱的特效已经越看越麻木,什么海底《阿凡达》吹太过了,坐等《阿凡达2》的潘多拉海底世界吊打吧', 10, '2019-07-13 11:16:34'); INSERT INTO `comment` VALUES (11, 2, '我是admin欢迎大家评论哦', 1, '2019-07-17 16:59:56'); INSERT INTO `comment` VALUES (12, 2, '女王:维科,这是我大儿子,剩下的话不用我多说了吧,以后该怎么办,你自己招子放亮一点,好处不会少了你的。维科:晓得了。zz4124', 2, '2019-07-24 02:34:15'); INSERT INTO `comment` VALUES (13, 2, '东有沉香劈山救母,西有海娃寻叉救母。绿色秋裤哲学变身,刺身放题海底大战。同母异父兄弟相残,弟妹大伯不伦之恋。温子仁携手徐锦江,亚裔之光拯救好莱坞!', 3, '2019-07-13 11:28:40'); INSERT INTO `comment` VALUES (14, 2, '2.5 “我的恋人,就是这个国家啊!”———————好久没有听到这么烂的话了', 4, '2019-07-13 11:33:21'); INSERT INTO `comment` VALUES (15, 2, '今年的柯南剧场版好无聊啊。。后面那段飙车简直夸张到无法理解,故事最后的反转也很让人无语,完全是多此一举,没有好的剧本就别拍了好吗,估计上映了也捞不到太多票房。ps:韩语版的柯南真的让人看得别扭不舒服..', 5, '2019-07-13 11:35:46'); INSERT INTO `comment` VALUES (16, 2, '渔夫和灯塔守护多数是鳏夫,私下里经常养一些人鱼交欢。海洋远比陆地深远得多,人们赞美阳光下的海洋,却不知深夜降临海面上会冒出可怕的妖怪,海底也会藏着嘲笑人类的高级文明。所以!温子仁同样是一个借大热系列ip来讲自己故事的导演!', 6, '2019-07-13 11:36:08'); INSERT INTO `comment` VALUES (17, 2, '海王可能要被微博营销号给奶死了。。。', 7, '2019-07-13 11:36:14'); INSERT INTO `comment` VALUES (18, 2, '当陆地人为自己的文明沾沾自喜时,亚特兰蒂斯的服装设计已经领先我们几百年。', 8, '2019-07-13 11:36:41'); INSERT INTO `comment` VALUES (19, 2, '温子仁就像一个从没拍过特效大片的暴发户。两星半,降降火。', 9, '2019-07-13 11:36:50'); INSERT INTO `comment` VALUES (20, 2, '剧本,导演都有问题,很多片段都似曾相识,硬是凑了两个半小时真是辛苦了我的膀胱。然而剧情不够美工来凑,海底阿凡达,温子仁难担大任,DC要超越漫威还有很长的路要走。', 10, '2019-07-13 11:36:58'); INSERT INTO `comment` VALUES (22, 3, '前面的小男孩突然问起诉是什么意思,我就在想这个故事小孩看得懂吗?动作场景依然需要帮忙按住牛顿的棺材板。', 4, '2019-07-13 11:37:43'); INSERT INTO `comment` VALUES (23, 3, '7分。温子仁确实很厉害,原以为这该是系列中最无趣的一部,尤其各种水下戏份。结果,却难得拍的很好看。影片节奏感和大场面掌控上,确实很见功力。以及,温子仁还融入了很多他自己的趣味,也算很有趣的细节了。整体可看性还不错,就是略长了,海底的光怪陆离,看久了也会有些视觉疲劳。', 5, '2019-07-13 11:38:06'); INSERT INTO `comment` VALUES (24, 3, '渔夫和灯塔守护多数是鳏夫,私下里经常养一些人鱼交欢。海洋远比陆地深远得多,人们赞美阳光下的海洋,却不知深夜降临海面上会冒出可怕的妖怪,海底也会藏着嘲笑人类的高级文明。所以!温子仁同样是一个借大热系列ip来讲自己故事的导演!', 3, '2019-07-13 11:38:35'); INSERT INTO `comment` VALUES (25, 3, '故事老套了一点 但是昨晚我的主要任务是努力让自己不要在影院里发大水…Jason太尼玛适合这个角色了,就算他能轻而易举的把我操坏我也心甘情愿地承受这份痛苦', 9, '2019-07-13 11:39:10'); INSERT INTO `comment` VALUES (26, 4, '飞机里的那一段是纪念,也是传承。钢铁侠说过,我们做的一切其实并不重要,重要的是我们选择给后代留下什么。而蜘蛛侠是托尼留给我们最好的遗产。', 10, '2019-07-13 11:39:30'); INSERT INTO `comment` VALUES (27, 4, '多年以后,面对敌人,蜘蛛侠彼得·帕克将会回想起,托尼·斯塔克带他见识超级英雄们的那个遥远的下午。 两个彩蛋比正片有意思', 7, '2019-07-13 11:39:41'); INSERT INTO `comment` VALUES (28, 4, '轻轻松松、啪啪砰砰,这样的超级英雄电影不挺好?温子仁真DC良心大管家——从头到尾堆特效,经费才烧1.6亿!欣赏不来海王徐锦江,51岁的妮可真的美炸了~~~~~', 6, '2019-07-13 11:39:57'); INSERT INTO `comment` VALUES (29, 4, '天空属于卢卡斯 陆地属于杰克逊 海洋属于温子仁!!!', 2, '2019-07-13 11:40:13'); INSERT INTO `comment` VALUES (30, 4, '特效和场景都非常不错,但是剧情和主角都非常不真实,唯一的真实人类就是那个收到新衣服以后改颜色镶铆钉的生命力很旺盛的青蛙反派。', 8, '2019-07-13 11:40:20'); INSERT INTO `comment` VALUES (32, 5, '3.5;失落的亚特兰蒂斯之国,古远传说提供与一般超英片迥异的丰富背景,DC另辟蹊径,开启美妙神秘的水下世界,星站兵密集,温子仁不负众望且适时塞私货,海沟一战jump scare其乐无穷。视效惊人,音效震人,抛却鸡汤亲情,大场面调度甚是过瘾。妮可基德曼真·女神,形象太契合。', 2, '2019-07-13 11:41:14'); INSERT INTO `comment` VALUES (33, 5, '我宣布!2018就是骨科文艺复兴之年!!!', 9, '2019-07-13 11:41:29'); INSERT INTO `comment` VALUES (38, 2, '毒液好丑啊', 1, '2019-07-21 06:40:43'); INSERT INTO `comment` VALUES (39, 4, '哇,这个毒液真的丑,但是女主真的好看!', 1, '2019-07-21 08:59:44'); INSERT INTO `comment` VALUES (40, 6, '以为是R级片,结果是儿童片。汤老湿毫无邪气只有痞气,把一个反派英雄演得正气凛然到闷,而且毒液跟《寄生兽》一样竟然养着养着就变宠物了77', 1, '2019-07-21 09:04:27'); INSERT INTO `comment` VALUES (41, 5, '无名之辈@@', 3, '2019-07-21 09:05:03'); INSERT INTO `comment` VALUES (42, 5, '你好之华', 5, '2019-07-21 09:05:46'); INSERT INTO `comment` VALUES (43, 6, '你的眼睛像火蜥蜴是我笨拙的情话,疯子离开懦夫是她最凶的咒骂,交换亲人让我的愧疚在博格特前显形,歃血为盟使我的爱在厄里斯镜里再现。点金石可以长生,纳吉尼终会成兽,爱心咒语不能保证天长地久,万咒皆终无法阻止核爆之灾。听说魔法世界也有很多爱恨与无奈,麻瓜世界里今年我的入学信还是被寄丢。', 2, '2019-07-21 09:06:34'); INSERT INTO `comment` VALUES (44, 6, '活人办了葬礼,死人偏剩一口气。手机那头她是暗夜里绽放的花,天台边缘她是绝路尽头的桥。两个抢手机模型的憨皮,却无比清醒地看到对方的痴,何惧陷阱,哪管嫌疑。有的人是还没剥开的蛋壳,有的人是胸口夹带的铁板,有的人是虚张声势的水枪,有的人是无法愈合的伤口。几分痴憨皆是勇,几句咒骂都是爱。', 3, '2019-07-21 09:07:47'); INSERT INTO `comment` VALUES (45, 3, '毒液好恶心,快看吐了。', 1, '2019-07-21 09:08:33'); INSERT INTO `comment` VALUES (46, 6, '在岩井俊二的作品里算不上好,但也不差。里面的“时空信息传递”、“替身与错位”,看似是《情书》的反面,实则挖掘的是家庭代际的空间,引出稍显过满的群戏——每个角色都有互文关系。演员方面重点夸下金马提名的张子枫,没想到她竟是戏眼,两次落泪都是因为她。', 5, '2019-07-21 09:08:54'); INSERT INTO `comment` VALUES (47, 3, '允儿来了zz', 1, '2019-07-21 09:09:21'); INSERT INTO `comment` VALUES (48, 6, '顶顶顶', 4, '2019-07-21 09:09:23'); INSERT INTO `comment` VALUES (49, 6, '别想着拍给年轻人看,拍给人看行不行。', 15, '2019-07-21 09:10:12'); INSERT INTO `comment` VALUES (50, 6, '古天乐又缺钱建学校了', 16, '2019-07-21 09:10:38'); INSERT INTO `comment` VALUES (51, 6, '以为玩三就完结甚至不敢期待怕失望,然而完全是惊喜。新元素加入很出彩,Woody找到归属,我的玩具系列完美结局。', 17, '2019-07-21 09:11:04'); INSERT INTO `comment` VALUES (52, 6, '有点泰国惊悚片的味道了,说实话我好几次被吓的冷汗都出来了;虽然有一些场景还是感觉逻辑不通,但至少画面和节奏不渣。本来我都不知道这部电影,但是我对象说要看,那就看了这部,现在的问题是,他不在家的时候我怎么办?', 18, '2019-07-21 09:11:39'); INSERT INTO `comment` VALUES (53, 6, '一个悲伤的故事:太阳都要毁灭,地球都要流浪了,我国的校服还是这么丑......', 20, '2019-07-21 09:12:06'); INSERT INTO `comment` VALUES (54, 6, '不拍妓女三部曲的陈果就不是陈果了。电影拍得跟开玩笑一样。就像故事的走向,演员的演法,都带着些玩世不恭。而这不是诙谐是轻佻。观众并不想看你们在大银幕开玩笑。', 21, '2019-07-21 09:12:31'); INSERT INTO `comment` VALUES (55, 3, '我的青春也全都是你呀', 26, '2019-07-21 09:19:26'); INSERT INTO `comment` VALUES (56, 1, '观后影片:111', 1, '2019-07-22 11:15:03'); INSERT INTO `comment` VALUES (57, 1, '神奇个锤子', 2, '2019-07-22 11:46:01'); -- ---------------------------- -- Table structure for hall -- ---------------------------- DROP TABLE IF EXISTS `hall`; CREATE TABLE `hall` ( `hall_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '放映厅编号', `hall_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '放映厅名称', `hall_capacity` int(10) NOT NULL DEFAULT 144 COMMENT '放映厅容量 默认为144 12 x 12 ', `cinema_id` bigint(10) NOT NULL COMMENT '所属影院编号', PRIMARY KEY (`hall_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 52 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of hall -- ---------------------------- INSERT INTO `hall` VALUES (1, '1号厅', 144, 1); INSERT INTO `hall` VALUES (2, '1号厅', 144, 2); INSERT INTO `hall` VALUES (3, '1号厅', 144, 3); INSERT INTO `hall` VALUES (4, '1号厅', 144, 4); INSERT INTO `hall` VALUES (5, '1号厅', 144, 5); INSERT INTO `hall` VALUES (6, '1号厅', 144, 6); INSERT INTO `hall` VALUES (7, '2号厅', 144, 1); INSERT INTO `hall` VALUES (8, '2号厅', 144, 2); INSERT INTO `hall` VALUES (9, '2号厅', 144, 3); INSERT INTO `hall` VALUES (10, '2号厅', 144, 4); INSERT INTO `hall` VALUES (11, '2号厅', 144, 5); INSERT INTO `hall` VALUES (12, '2号厅', 144, 6); INSERT INTO `hall` VALUES (13, '3号厅', 144, 1); INSERT INTO `hall` VALUES (14, '1号厅', 144, 7); INSERT INTO `hall` VALUES (15, '1号厅', 144, 8); INSERT INTO `hall` VALUES (16, '1号厅', 144, 9); INSERT INTO `hall` VALUES (17, '1号厅', 144, 10); INSERT INTO `hall` VALUES (18, '1号厅', 144, 11); INSERT INTO `hall` VALUES (19, '1号厅', 144, 12); INSERT INTO `hall` VALUES (20, '1号厅', 144, 13); INSERT INTO `hall` VALUES (21, '1号厅', 144, 14); INSERT INTO `hall` VALUES (22, '1号厅', 144, 15); INSERT INTO `hall` VALUES (23, '1号厅', 144, 16); INSERT INTO `hall` VALUES (24, '1号厅', 144, 17); INSERT INTO `hall` VALUES (25, '1号厅', 144, 18); INSERT INTO `hall` VALUES (26, '2号厅', 144, 7); INSERT INTO `hall` VALUES (27, '2号厅', 144, 8); INSERT INTO `hall` VALUES (28, '2号厅', 144, 9); INSERT INTO `hall` VALUES (29, '2号厅', 144, 10); INSERT INTO `hall` VALUES (30, '2号厅', 144, 11); INSERT INTO `hall` VALUES (31, '2号厅', 144, 12); INSERT INTO `hall` VALUES (32, '2号厅', 144, 13); INSERT INTO `hall` VALUES (33, '2号厅', 144, 14); INSERT INTO `hall` VALUES (34, '2号厅', 144, 15); INSERT INTO `hall` VALUES (35, '2号厅', 144, 16); INSERT INTO `hall` VALUES (36, '2号厅', 144, 17); INSERT INTO `hall` VALUES (37, '2号厅', 144, 18); INSERT INTO `hall` VALUES (38, '3号厅', 144, 3); INSERT INTO `hall` VALUES (39, '3号厅', 144, 5); INSERT INTO `hall` VALUES (40, '3号厅', 144, 7); INSERT INTO `hall` VALUES (41, '3号厅', 144, 10); INSERT INTO `hall` VALUES (42, '3号厅', 144, 11); INSERT INTO `hall` VALUES (43, '3号厅', 144, 15); INSERT INTO `hall` VALUES (44, '3号厅', 144, 18); INSERT INTO `hall` VALUES (45, 'IMAX厅', 144, 1); INSERT INTO `hall` VALUES (46, 'IMAX厅', 144, 3); INSERT INTO `hall` VALUES (47, 'IMAX厅', 144, 8); INSERT INTO `hall` VALUES (48, 'IMAX厅', 144, 12); INSERT INTO `hall` VALUES (49, 'IMAX厅', 144, 14); INSERT INTO `hall` VALUES (50, 'IMAX厅', 144, 16); INSERT INTO `hall` VALUES (51, 'IMAX厅', 144, 17); -- ---------------------------- -- Table structure for movie -- ---------------------------- DROP TABLE IF EXISTS `movie`; CREATE TABLE `movie` ( `movie_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '电影编号', `movie_cn_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电影名称(中文)', `movie_fg_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电影名称(外语)', `movie_actor` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影演职人员', `movie_director` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影导演', `movie_detail` varchar(350) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影详情', `movie_duration` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影时长', `movie_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影类型', `movie_score` float(10, 1) NULL DEFAULT 0.0 COMMENT '电影评分 默认为0', `movie_boxOffice` float(10, 4) NULL DEFAULT 0.0000 COMMENT '电影票房 默认为0', `movie_commentCount` bigint(10) NULL DEFAULT 0 COMMENT '电影参评人数 默认为0', `movie_releaseDate` date NOT NULL COMMENT '电影上映时间', `movie_country` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影制片地区', `movie_picture` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影海报', `movie_state` int(3) NOT NULL DEFAULT 1 COMMENT '电影状态 默认为1 1:在线 0:下架', PRIMARY KEY (`movie_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of movie -- ---------------------------- INSERT INTO `movie` VALUES (1, '毒液:致命守护者', 'Venom', '汤姆·哈迪:埃迪·布洛克/毒液,米歇尔·威廉姆斯:安妮·韦英', '鲁本·弗雷斯彻', '身为记者的埃迪·布洛克(汤姆·哈迪饰)在调查生命基金会老板卡尔顿·德雷克(里兹·阿迈德饰)的过程中,事业遭受重创,与未婚妻安妮·韦英(米歇尔·威廉姆斯饰)的关系岌岌可危,并意外被外星共生体控制,他历经挣扎对抗,最终成为拥有强大超能力,无人可挡的“毒液“', '107分钟', '动作,科幻', 7.2, 1.0209, 7, '2019-06-24', '美国', '../upload/movies/c91fef2f9e2b4d5295cd12e9abf507d9.jpg', 1); INSERT INTO `movie` VALUES (2, '神奇动物:格林德沃之罪', 'Fantastic Beasts: The Crimes of Grindelwald', '埃迪·雷德梅恩:纽特·斯卡曼德,凯瑟琳·沃特斯顿:蒂娜‧戈德斯坦,约翰尼·德普:盖勒·格林德沃', '大卫·叶茨', '在《神奇动物在那里》第一部的结尾,纽特·斯卡曼德(埃迪·雷德梅恩 饰)协助美国魔法国会,将强大的黑巫师盖勒特·格林德沃(约翰尼·德普 饰)抓捕归案。但格林德沃不久便兑现狂言成功越狱,并开始纠集信徒,着手实现他们的邪恶目的:让纯血统的巫师成为统治阶层,镇压一切非魔法生物。为挫败格林德沃的阴谋,阿不思·邓布利多(裘德·洛 饰)向昔日的学生纽特·斯卡曼德寻求帮助。纽特欣然允诺,却没有意识到,他将踏上的会是一段充满艰险的未来征途。此时的魔法世界面临空前的分裂乱局,阶层鸿沟日益加深,爱与忠诚备受考验,至亲好友也可能反目成仇……', '134分钟', '奇幻,冒险', 7.7, 1.0339, 5, '2019-06-25', '美国', '../upload/movies/Fantastic Beasts.jpg', 1); INSERT INTO `movie` VALUES (3, '无名之辈', 'A Cool Fish', '陈建斌:马先勇,任素汐:马嘉旗,潘斌龙:李海根', '饶晓志', '在一座山间小城中,一对低配劫匪、一个落魄的泼皮保安、一个身体残疾却性格彪悍的残毒舌女以及一系列生活在社会不同轨迹上的小人物,在一个貌似平常的日子里,因为一把丢失的老枪和一桩当天发生在城中的乌龙劫案,从而被阴差阳错地拧到一起,发生的一幕幕令人啼笑皆非的荒诞喜剧', '108分钟', '荒诞,喜剧', 9.2, 1.0315, 5, '2019-07-05', '中国大陆', '../upload/movies/A Cool Fish.jpg', 1); INSERT INTO `movie` VALUES (4, '名侦探柯南:零的执行人', '名探偵コナン ゼロの執行人', '高山南:江户川柯南,山崎和佳奈:毛利兰,林原惠美:灰原哀', '立川让', '5月1日,东京湾边的新建筑“海洋边缘”将举办首脑云集的东京峰会。然而,峰会开办前一周,会场发生超大规模的爆炸事件,并出现了安室透的身影。疑似恐怖袭击的事件引起了警察部门的严肃调查。在警察局大型搜查会议上,公安部门提交证物,却发现疑犯指纹与毛利小五郎(小山力也 配音)指纹吻合。作为律师的妃英理努力收集证据证明丈夫的无辜,却无力阻止毛利小五郎被收监。看到毛利兰(山崎和佳奈 配音)绝望哭泣的样子,柯南(高山南 配音)决定调查事件真相,还毛利小五郎清白。另一方面,少年侦探团的孩子们正紧密关注着无人探测器“天鹅”的回航任务。行踪诡异的安室透、惨遭陷害的毛利小五郎、错综复杂的警察部门、即将着陆的无人探测器;随着“机密任务”进入倒计时,关乎整个东京的可怕计划拉开帷幕…', '111分钟', '悬疑,冒险,动画', 8.5, 1.0256, 4, '2019-07-13', '日本', '../upload/movies/名探偵.jpg', 1); INSERT INTO `movie` VALUES (5, '你好,之华', 'Last Letter', '周迅:袁之华,秦昊:尹川,杜江:周文涛', '岩井俊二', '有人慌张得见面,有人简单地告别。姐姐袁之南离世的那个清晨,只匆匆留下一封信和一张同学会邀请函。妹妹之华(周迅 饰)代替姐姐参加,却意外遇见年少时的倾慕对象尹川(秦昊 饰)。往日的记忆在苏醒,但再次相见,已物是人非', '114分钟', '爱情', 7.9, 1.0108, 5, '2019-07-20', '中国大陆、日本', '../upload/movies/Last Letter.jpg', 1); INSERT INTO `movie` VALUES (6, '恐龙王', 'DINO KING', '吕佩玉:钢妈,王衡:斑大师,孙晔:八百度', '施雅雅', '陆地霸主特暴龙“斑大师”和自己的小儿子“小疙瘩”生活在一起。“小疙瘩”自幼失去了母亲,生性懦弱,严厉的“斑大师”虽然心底十分疼爱自己的孩子,但是急于让“小疙瘩”成长为新的陆地霸主,常常忍不住责骂“小疙瘩”,父子俩虽然相依为命,却始终有一些隔阂。 一天“小疙瘩”被几只邪恶的恐爪龙抓走,“斑大师”踏上漫漫的寻子之路,路途中他结识了有高度近视眼的美甲龙“八百度”,两人穿过“巨蝎峡”、走出“长颈龙绿洲”、踏上火山峡谷,经历了重重难关。而身处险境的“小疙瘩”也结识了一些新的朋友,并且开始和邪恶的恐爪龙斗智斗勇。最终父子两人终于相见,但是却不得不一起面对一个更加凶恶的史前怪物……', '95分钟', '喜剧,动画,冒险', 8.9, 1.0000, 2, '2018-12-10', '中国大陆', '../upload/movies/DINO KING.jpg', 0); INSERT INTO `movie` VALUES (7, '冰封侠:时空行者', 'Bing Feng Xia II', '甄子丹:贺英,黄圣依:小美,王宝强:萨獒', '叶伟民', '明朝大将军贺英(甄子丹 饰)利用时空金球终于重返明朝,与锦衣卫兄弟萨獒(王宝强 饰)获悉了倭寇和朝廷奸党之间足以倾覆皇权的密谋,绵延400年的惊天危机一触即发。贺英也在红颜知己小美(黄圣依 饰)的帮助下开始了抗倭锄奸和保护族人的战斗', '87分钟', '剧情,动作', 4.1, 1.0000, 3, '2018-09-02', '中国大陆', '../upload/movies/Bing Feng Xia II.jpg', 0); INSERT INTO `movie` VALUES (8, '梦境之源', 'Source of Dreams', '陈志朋:徐朗,颜丹晨:李雪,方中信:梁文道', '柳珂', '货车司机李昂由于童年时代内向懦弱,颓废度日,频频做噩梦,严重影响了正常的生活,并因此不得不接受心理医生曹井润的催眠治疗,却在梦境中意外卷入一场凶杀案。睿智破案的警探成为凶手,而真正的幕后黑手仍在逍遥法外……', '90分钟', '悬疑,推理', 5.9, 1.0000, 3, '2018-11-16', '中国大陆', '../upload/movies/Source of Dreams.jpg', 0); INSERT INTO `movie` VALUES (9, '摘金奇缘', 'Crazy Rich Asians', '吴恬敏:朱瑞秋,亨利·戈尔丁:杨尼克,杨紫琼:杨爱莉', '朱浩伟', '新加坡富二代王子杨尼克(亨利·戈尔丁饰)自豪地带着美丽大方、学识傲人的女友朱瑞秋(吴恬敏饰)回家见亲友。而这个巨富大家族对朱瑞秋的态度,与她的想像相差十万八千里远,朱瑞秋一开始以为只是跟深爱的男人轻松浪漫地度假,不料却面对排山倒海般的压力,她必须坚强应对一群有心机的情敌和反对者,但更难搞的竟然是她的准婆婆杨爱莉(杨紫琼饰),因为埃莉诺认为朱瑞秋这个现代美国女孩永远都高攀不上她们家', '120分钟', '喜剧,爱情', 6.1, 1.0000, 3, '2018-11-30', '美国', '../upload/movies/Crazy Rich Asians.jpg', 0); INSERT INTO `movie` VALUES (10, '海王', 'Aquaman', '杰森·莫玛:海王/亚瑟·库瑞,艾梅柏·希尔德:海后/湄拉,威廉·达福:努迪斯·维科', '温子仁', '在一场狂风暴雨的海边灯塔看守人汤姆·库瑞(特穆拉·莫里森饰)救了受伤的亚特兰蒂斯女王亚特兰娜(妮可·基德曼饰)之后,他们相爱了,生下了拥有半人类、半亚特兰蒂斯人的血统亚瑟·库瑞(杰森·莫玛饰)。为了救自己的爱人和儿子亚特兰娜选择了离开。\r\n几年之后,亚特兰娜被迫回到海底国家缔结政治婚姻,生下儿子奥姆(帕特里克·威尔森饰)。奥姆长大后当上国王对陆地人类充满憎恨,开始吞并海底中发展中的国家的兵力,一举消灭陆地人。奥姆的未婚妻海底王国泽贝尔公主湄拉(艾梅柏·希尔德饰)打算阻止这场战争,她到陆地找回亚瑟,让他以亚特兰娜女王长子身份回亚特兰蒂斯把王位争回来,而且湄拉要协助亚瑟找回能统治大海的失落的三叉戟', '143分钟', '动作,科幻', 7.6, 1.0000, 3, '2018-12-07', '美国、澳大利亚', '../upload/movies/Aquaman.jpg', 0); INSERT INTO `movie` VALUES (15, '素人特工', 'The Rookies', '王大陆:赵风,张榕容:淼淼', '袁锦麟', '极限运动达人赵风(王大陆 饰),误打误撞闯入了一场国际犯罪交易,不得不跟随国际特工(米拉·乔沃维奇 饰)一起前往布达佩斯。在这里他与废柴刑警淼淼(张榕容 饰)、民间科学家丁山(许魏洲 饰)与待业医生LV(刘美彤 饰)组成一支素人特工小队。这四个特工小白和高级国际特攻米拉一起,与恐怖分子开启了一场又惊又喜的斗争。', '113分钟', '喜剧,动作,冒险', 7.2, 1.0000, 1, '2019-07-12', '中国大陆', '../upload/movies/素人特工.jpg', 1); INSERT INTO `movie` VALUES (16, '追龙Ⅱ', 'Chasing the Dragon Ⅱ', '梁家辉:龙志强,古天乐:何天', '王晶', '悍匪龙志强(梁家辉 饰),在香港回归前,趁香港英政府不作为,而屡犯巨案,先后绑架富豪利家及雷家之长子,勒索超过二十亿元,事主怕被报复, 交赎款后都不敢报警。中国公安部极为关注,与香港警方合力,派香港警员何天(古天乐 饰)卧底潜入龙志强犯罪团伙,发现他正策划绑架澳门富豪贺不凡,最终陆港警察合力勇擒龙志强,救出贺不凡', '103分钟', '犯罪,剧情,动作', 7.9, 1.0120, 1, '2019-06-06', '中国大陆、中国香港', '../upload/movies/追龙Ⅱ.jpg', 1); INSERT INTO `movie` VALUES (17, '玩具总动员4', 'Toy Story 4', '汤姆·汉克斯:胡迪,蒂姆·艾伦:巴斯光年', '乔什·库雷', '当邦妮将所有玩具带上房车家庭旅行时,胡迪(汤姆·汉克斯 配音)与伙伴们将共同踏上全新的冒险之旅,领略房间外面的世界有多广阔,甚至偶遇老朋友牧羊女(安妮·波茨 配音)。在多年的独自闯荡中,牧羊女已经变得热爱冒险,不再只是一个精致的洋娃娃。正当胡迪和牧羊女发现彼此对玩具的使命的意义大相径庭时,他们很快意识到更大的威胁即将到来。', '100分钟', '喜剧,动画,奇幻', 9.1, 1.0000, 1, '2019-06-21', '美国', '../upload/movies/玩具总动员4.jpg', 1); INSERT INTO `movie` VALUES (18, '碟仙', 'Mortal Ouija', '黄奕:梦瑶,范逸臣:项天', '廉涛', '以网络直播为业的单亲妈妈梦瑶(黄奕 饰)带着上幼儿园的女儿雯雯住进了一栋便宜的学区房,然而,屋里的诡异氛围,与不时散发的奇怪恶臭,令梦瑶感到不安。某夜,雯雯竟然在梦游中,玩了前租客遗留的“碟仙”游戏。传说只要玩过的人,七日内必会被碟仙夺命!紧接着,屋内接连发生令人毛骨悚然的怪事。七日大限将至,眼看爱女危在旦夕,为了解开碟仙诅咒,夺回女儿,绝望的妈妈不惜做出了惊人的举动……', '83分钟', '恐怖,惊悚', 7.9, 1.0056, 1, '2019-06-21', '中国大陆', '../upload/movies/碟仙.jpg', 1); INSERT INTO `movie` VALUES (19, '扫毒', 'The White Storm', '古天乐:苏建秋,刘青云:马昊天', '陈木胜', '以马昊天(刘青云 饰)为首的毒品调查科,与手下张子伟(张家辉 饰)和卧底苏建秋(古天乐 饰)在执行一次跨国的大型扫毒行动中,被毒犯巨头八面佛(卢海鹏 饰)暗中揭发反埋伏,最终全军覆没。面对生死关头,三位主角为求活存,被迫命运扭转,展开一场残酷的人生战役。', '134分钟', '剧情,犯罪', 8.9, 1.0000, 0, '2018-11-21', '中国大陆、中国香港', '../upload/movies/扫毒.jpg', 0); INSERT INTO `movie` VALUES (20, '流浪地球', 'The Wandering Earth', '吴京:刘培强,屈楚萧:刘启', '郭帆', '近未来,科学家们发现太阳急速衰老膨胀,短时间内包括地球在内的整个太阳系都将被太阳所吞没。为了自救,人类提出一个名为“流浪地球”的大胆计划,即倾全球之力在地球表面建造上万座发动机和转向发动机,推动地球离开太阳系,用2500年的时间奔往另外一个栖息之地。中国航天员刘培强在儿子刘启四岁那年前往国际空间站,和国际同侪肩负起领航者的重任。转眼刘启长大,他带着妹妹朵朵偷偷跑到地表,偷开外公韩子昂的运输车,结果不仅遭到逮捕,还遭遇了全球发动机停摆的事件。为了修好发动机,阻止地球坠入木星,全球开始展开饱和式营救,连刘启他们的车也被强征加入。在与时间赛跑的过程中,无数的人前仆后继,奋不顾身,只为延续百代子孙生存的希望…… 本片根据刘慈欣的同名小说改编。', '125分钟', '剧情,冒险,科幻', 9.2, 1.0000, 1, '2019-07-05', '中国大陆、中国香港', '../upload/movies/流浪地球.jpg', 1); INSERT INTO `movie` VALUES (21, '九龙不败', 'The Invincible Dragon', '张晋:九龙', '陈果', '警探九龙(张晋 饰),查案方式奇异狠辣却屡建奇功,是叱咤香港警界的精英干探, 但他处事独断爆裂,又被警队视为“偏执狂人”。九龙奉命调查一桩妙龄女警连环被凶杀 案,用尽手段后不仅毫无线索, 他的警花未婚妻方宁(邓丽欣 饰)竟然也在这场抓捕行动中意外失踪。在爱与痛的边缘挣扎的九龙,突然发现女警连环遇害只是第一步,凶手还有着更加血腥的阴谋,自己和未婚妻竟然也被算计其中。此时澳门再度发生女警被杀案,这次的作案手法更加令人发指,但凶手好像故意留下了线索,是危险陷阱还是复仇曙光?九龙义无反顾出发,在好友王梦奇(刘心悠 饰)及国际拳王冼力山(安德森·席尔瓦 饰)的协助下, 与澳门警司曹志德(郑嘉颖 饰)联手展开调查。魔高一丈,道高几何!血债血偿之前,就算流干最后一滴血,也要誓不罢休。', '100分钟', '剧情,动作,犯罪', 5.7, 1.0000, 1, '2019-07-02', '中国大陆、中国香港', '../upload/movies/九龙不败.jpg', 1); INSERT INTO `movie` VALUES (22, '阿丽塔:战斗天使', 'Alita: Battle Angel', '罗莎·萨拉查:阿丽塔,克里斯托弗·沃尔兹:戴森·艾德博士', '罗伯特·罗德里格兹', '未来26世纪,科技发展,人类与机械改造人共存,弱肉强食是钢铁城唯一的生存法则。依德(克里斯托夫·沃尔兹 饰)是钢铁城著名的改造人医生,他在垃圾场发现了一个半机械少女残躯,依德医生将其拯救后为她取名阿丽塔(罗莎·萨拉扎尔 饰)。阿丽塔虽然重获生命却失去了记忆,如一个新生儿一样对这个世界充满新鲜感。在依德医生与好友雨果(基恩·约翰逊 饰)的帮助下,她逐步适应着新生活和街头险恶。一次偶然的机会,阿丽塔发现自己竟有着惊人的战斗天赋。 一次次猎杀激发着她的觉醒,阿丽塔逐渐明白自己注定为战斗而生,为正义而战。一场揭开自己身世之谜,并打破宇宙旧秩序的史诗级冒险之旅就这样展开。', '122分钟', '动作,冒险,科幻', 9.0, 1.0000, 0, '2019-07-11', '美国', '../upload/movies/阿丽塔:战斗天使.jpg', 1); INSERT INTO `movie` VALUES (23, 'X战警:黑凤凰', 'X-Men: Dark Phoenix', '苏菲·特纳:琴·格雷/黑凤凰,詹姆斯·麦卡沃伊:查尔斯·泽维尔/X教授', '西蒙·金伯格', '在一次危及生命的太空营救行动中,琴·葛蕾(苏菲·特纳 饰)被神秘的宇宙力量击中,成为最强大的变种人。此后琴不仅要设法掌控日益增长、极不稳定的力量,更要与自己内心的恶魔抗争,她的失控让整个X战警大家庭分崩离析,也让整个星球陷入毁灭的威胁之中……', '114分钟', '动作,冒险,科幻', 7.8, 1.0000, 0, '2019-06-06', '美国', '../upload/movies/X战警:黑凤凰.jpg', 1); INSERT INTO `movie` VALUES (24, '疯狂的外星人', 'Crazy Alien', '黄渤:耿浩,沈腾:大飞,马修·莫里森:扎克,汤姆·派福瑞:约翰', '宁浩', '耿浩(黄渤 饰)与一心想发大财的好兄弟大飞(沈腾 饰),经营着各自惨淡的“事业”,然而“天外来客”(徐峥 饰)的意外降临,打破了二人平静又拮据的生活。神秘的西方力量也派出“哼哈二将”在全球搜查外星人行踪。啼笑皆非的跨物种对决,别开生面的“星战”,在中国某海边城市激情上演。', '116分钟', '剧情,喜剧,科幻', 8.5, 1.0000, 0, '2019-07-10', '中国大陆、美国', '../upload/movies/疯狂的外星人.jpg', 1); INSERT INTO `movie` VALUES (25, '八子', 'ADVANCE WAVE UPON WAVE', '刘端端:满崽,邵兵:大牛', '高希希', '上世纪30年代的赣南地区,在这个被称为中国革命“红色摇篮”的地方,曾经有这样一位母亲,她将八个儿子先后送入红军,奔赴战场前线。但战火无情,兄弟中的六人陆续牺牲,只剩下大哥杨大牛和最小的孩子满崽。满崽找到了大牛的部队,成了哥哥麾下的普通一兵,经过一场场战役的淬炼,新兵满崽迅速成长为一个真正的战士。最后的战斗打响了,为了掩护大部队安全撤离,杨大牛带领弟弟满崽和全体战友浴血肉搏,直至弹尽粮绝…… 英雄的身前,是枪林弹雨的沙场,而在英雄的身后,家乡的村庄依然宁静安详,微风吹过金黄的稻浪簌簌作响,一位年迈的母亲正在村头的小路旁孤独的守望……', '121分钟', '战争,历史,动作', 8.4, 1.0118, 0, '2019-06-30', '中国大陆', '../upload/movies/bazi.jpg', 1); INSERT INTO `movie` VALUES (26, '我的青春都是你', 'Love The Way You Are', '宋威龙:方予可,宋芸桦:周林林,林妍柔:茹婷,黄俊捷:谢端西,金士杰:畜牧系老师', '周彤', '周林林(宋芸桦 饰)高考发挥超常进入东方大学,与同校理科状元方予可(宋威龙 饰)一同进入了最高学府。郎有情妾无意,方予可其实从幼儿园时期就心系周林林,人生若只如初见,儿时的初遇相见便立下了日久的暗恋情愫!但万人瞩目的帅哥方予可身边有天之骄女茹庭(林妍柔 饰),从小暗恋状元对周林林看不顺眼,周林林则对方予可身边的同为校园风云人物的小西学长(黄俊捷 饰)心存爱慕,修习大学恋爱秘籍,苦练恋爱通关技巧,十八般武艺七十二变法轮番上阵!四人之间情感纠葛,在校园里上演了一幕青春爱情喜剧!', '92分钟', '爱情,青春', 7.3, 1.0000, 1, '2019-06-21', '中国大陆、中国台湾', '../upload/movies/我的青春都是你.jpg', 1); INSERT INTO `movie` VALUES (27, '银河补习班', 'Looking up', '邓超:马皓文,白宇:成年马飞', '俞白眉', '浩瀚太空,航天员意外失联,生命最大的绝境中,他回忆起自己那个最了不起的爸爸。一对父子跨越漫长的时光,守护爱和亲情,故事充满了欢乐、温暖、泪水与奇观。', '147分钟', '剧情,家庭', 9.1, 1.0200, 0, '2019-07-18', '中国大陆', '../upload/movies/银河补习班.jpg', 1); INSERT INTO `movie` VALUES (28, '1', '2', '4:4,52:54235', '3', '5', '6', '7', 8.9, 0.0000, 0, '2019-07-02', '9', '../upload/movies/9a9351332a5149c895b57b4564dbe667.jpg', 1); -- ---------------------------- -- Table structure for orderinfo -- ---------------------------- DROP TABLE IF EXISTS `orderinfo`; CREATE TABLE `orderinfo` ( `order_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单编号', `user_id` bigint(10) NOT NULL COMMENT '所属用户编号', `schedule_id` bigint(10) NOT NULL COMMENT '所属场次编号', `order_position` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影票座位 (x排x座)', `order_state` int(10) NOT NULL DEFAULT 1 COMMENT '订单状态 0:退票中 1:已支付 2:退票成功', `order_price` int(10) NOT NULL COMMENT '订单价格', `order_time` datetime(0) NOT NULL COMMENT '订单支付时间', PRIMARY KEY (`order_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of orderinfo -- ---------------------------- INSERT INTO `orderinfo` VALUES ('2019072100030210', 3, 25, '2排10座', 1, 38, '2019-07-21 07:01:36'); INSERT INTO `orderinfo` VALUES ('2019072100030306', 3, 310, '3排6座', 1, 40, '2019-07-21 14:44:34'); INSERT INTO `orderinfo` VALUES ('2019072100030307', 3, 26, '3排7座', 0, 40, '2019-07-21 07:07:09'); INSERT INTO `orderinfo` VALUES ('2019072100030409', 3, 26, '4排9座', 1, 40, '2019-07-21 07:14:37'); INSERT INTO `orderinfo` VALUES ('2019072100030508', 3, 310, '5排8座', 2, 40, '2019-07-21 14:44:35'); INSERT INTO `orderinfo` VALUES ('2019072100030603', 3, 310, '6排3座', 1, 40, '2019-07-21 14:44:35'); INSERT INTO `orderinfo` VALUES ('2019072100030606', 3, 310, '6排6座', 1, 40, '2019-07-21 14:44:35'); INSERT INTO `orderinfo` VALUES ('2019072100040606', 4, 27, '6排6座', 1, 55, '2019-07-21 08:55:39'); INSERT INTO `orderinfo` VALUES ('2019072100050506', 5, 65, '5排6座', 2, 45, '2019-07-21 08:52:01'); INSERT INTO `orderinfo` VALUES ('2019072100050507', 5, 65, '5排7座', 0, 45, '2019-07-21 08:52:01'); INSERT INTO `orderinfo` VALUES ('2019072100050509', 5, 135, '5排9座', 1, 32, '2019-07-21 08:50:26'); INSERT INTO `orderinfo` VALUES ('2019072100050510', 5, 135, '5排10座', 1, 32, '2019-07-21 08:50:27'); INSERT INTO `orderinfo` VALUES ('2019072100060502', 6, 136, '5排2座', 1, 34, '2019-07-21 08:50:23'); INSERT INTO `orderinfo` VALUES ('2019072100060503', 6, 136, '5排3座', 1, 34, '2019-07-21 08:50:23'); INSERT INTO `orderinfo` VALUES ('2019072100060504', 6, 136, '5排4座', 1, 34, '2019-07-21 08:50:23'); INSERT INTO `orderinfo` VALUES ('2019072100060509', 6, 122, '5排9座', 1, 28, '2019-07-21 08:52:24'); INSERT INTO `orderinfo` VALUES ('2019072100060602', 6, 153, '6排2座', 0, 32, '2019-07-21 08:52:16'); INSERT INTO `orderinfo` VALUES ('2019072100060603', 6, 153, '6排3座', 1, 32, '2019-07-21 08:52:16'); INSERT INTO `orderinfo` VALUES ('2019072100060604', 6, 103, '6排4座', 0, 35, '2019-07-21 08:53:12'); INSERT INTO `orderinfo` VALUES ('2019072100060605', 6, 103, '6排5座', 1, 35, '2019-07-21 08:53:12'); INSERT INTO `orderinfo` VALUES ('2019072100060606', 6, 103, '6排6座', 1, 35, '2019-07-21 08:53:12'); INSERT INTO `orderinfo` VALUES ('2019072100060703', 6, 65, '7排3座', 1, 45, '2019-07-21 08:50:45'); INSERT INTO `orderinfo` VALUES ('2019072100060704', 6, 65, '7排4座', 1, 45, '2019-07-21 08:50:45'); INSERT INTO `orderinfo` VALUES ('2019072100060705', 6, 65, '7排5座', 1, 45, '2019-07-21 08:50:45'); INSERT INTO `orderinfo` VALUES ('2019072100060706', 6, 65, '7排6座', 1, 45, '2019-07-21 08:50:45'); INSERT INTO `orderinfo` VALUES ('2019072100060709', 6, 122, '7排9座', 0, 28, '2019-07-21 08:52:25'); INSERT INTO `orderinfo` VALUES ('2019072100060803', 6, 158, '8排3座', 0, 35, '2019-07-21 08:51:30'); INSERT INTO `orderinfo` VALUES ('2019072100060804', 6, 158, '8排4座', 0, 35, '2019-07-21 08:51:31'); INSERT INTO `orderinfo` VALUES ('2019072200010507', 1, 232, '5排7座', 1, 30, '2019-07-22 11:09:46'); INSERT INTO `orderinfo` VALUES ('2019072200010608', 1, 232, '6排8座', 1, 30, '2019-07-22 11:09:46'); INSERT INTO `orderinfo` VALUES ('2019072200010707', 1, 232, '7排7座', 1, 30, '2019-07-22 11:09:46'); INSERT INTO `orderinfo` VALUES ('2019072200010808', 1, 232, '8排8座', 1, 30, '2019-07-22 11:09:46'); INSERT INTO `orderinfo` VALUES ('2019072200010910', 1, 136, '9排10座', 0, 34, '2019-07-21 17:00:56'); INSERT INTO `orderinfo` VALUES ('2019072200010911', 1, 136, '9排11座', 1, 34, '2019-07-21 17:00:56'); INSERT INTO `orderinfo` VALUES ('2019072200010912', 1, 160, '9排12座', 1, 35, '2019-07-22 11:46:52'); INSERT INTO `orderinfo` VALUES ('2019072200020508', 2, 83, '5排8座', 0, 44, '2019-07-22 11:32:49'); INSERT INTO `orderinfo` VALUES ('2019072200040106', 4, 94, '1排6座', 1, 54, '2019-07-22 01:10:02'); INSERT INTO `orderinfo` VALUES ('2019072200040107', 4, 94, '1排7座', 1, 54, '2019-07-22 01:10:02'); INSERT INTO `orderinfo` VALUES ('2019072200040408', 4, 39, '4排8座', 1, 48, '2019-07-22 03:51:27'); INSERT INTO `orderinfo` VALUES ('2019072200040409', 4, 135, '4排9座', 1, 32, '2019-07-22 01:11:16'); INSERT INTO `orderinfo` VALUES ('2019072200040410', 4, 135, '4排10座', 1, 32, '2019-07-22 01:11:16'); INSERT INTO `orderinfo` VALUES ('2019072200040508', 4, 135, '5排8座', 1, 32, '2019-07-22 01:11:16'); INSERT INTO `orderinfo` VALUES ('2019072200040511', 4, 135, '5排11座', 1, 32, '2019-07-22 01:11:16'); INSERT INTO `orderinfo` VALUES ('2019072200040609', 4, 135, '6排9座', 1, 32, '2019-07-22 01:11:45'); INSERT INTO `orderinfo` VALUES ('2019072200040610', 4, 135, '6排10座', 1, 32, '2019-07-22 01:11:45'); INSERT INTO `orderinfo` VALUES ('2019072400010310', 1, 27, '3排10座', 1, 55, '2019-07-24 02:30:42'); INSERT INTO `orderinfo` VALUES ('2019072400010311', 1, 27, '3排11座', 1, 55, '2019-07-24 02:30:43'); -- ---------------------------- -- Table structure for schedule -- ---------------------------- DROP TABLE IF EXISTS `schedule`; CREATE TABLE `schedule` ( `schedule_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '场次编号', `hall_id` bigint(10) NOT NULL COMMENT '所属放映厅编号', `movie_id` bigint(10) NOT NULL COMMENT '所属电影编号', `schedule_startTime` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '电影放映时间', `schedule_price` int(10) NOT NULL COMMENT '场次价格', `schedule_remain` int(10) NOT NULL COMMENT '剩余座位数 默认=hall_capacity', `schedule_state` int(10) NOT NULL DEFAULT 1 COMMENT '场次状态 默认1 1:上映中 0:下架', PRIMARY KEY (`schedule_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 315 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of schedule -- ---------------------------- INSERT INTO `schedule` VALUES (25, 1, 25, '2019-07-21 17:30', 38, 144, 1); INSERT INTO `schedule` VALUES (26, 7, 25, '2019-07-22 20:00', 40, 143, 1); INSERT INTO `schedule` VALUES (27, 7, 1, '2019-07-21 19:10', 55, 141, 0); INSERT INTO `schedule` VALUES (28, 8, 25, '2019-07-23 17:00', 48, 144, 1); INSERT INTO `schedule` VALUES (29, 1, 20, '2019-07-21 00:00', 38, 144, 1); INSERT INTO `schedule` VALUES (30, 13, 1, '2019-07-22 19:20', 55, 144, 1); INSERT INTO `schedule` VALUES (31, 7, 20, '2019-07-21 00:00', 38, 144, 1); INSERT INTO `schedule` VALUES (32, 13, 20, '2019-07-21 00:00', 38, 144, 1); INSERT INTO `schedule` VALUES (33, 1, 1, '2019-07-23 20:00', 55, 144, 1); INSERT INTO `schedule` VALUES (34, 45, 20, '2019-07-22 20:30', 58, 144, 1); INSERT INTO `schedule` VALUES (35, 8, 25, '2019-07-24 00:00', 39, 144, 1); INSERT INTO `schedule` VALUES (36, 7, 1, '2019-07-24 20:10', 55, 144, 1); INSERT INTO `schedule` VALUES (37, 7, 20, '2019-07-22 15:30', 38, 144, 1); INSERT INTO `schedule` VALUES (38, 8, 20, '2019-07-23 14:20', 39, 144, 1); INSERT INTO `schedule` VALUES (39, 2, 1, '2019-07-21 10:10', 48, 143, 1); INSERT INTO `schedule` VALUES (40, 2, 1, '2019-07-22 10:10', 45, 144, 1); INSERT INTO `schedule` VALUES (41, 8, 20, '2019-07-23 21:45', 39, 144, 1); INSERT INTO `schedule` VALUES (42, 11, 25, '2019-07-23 12:30', 28, 144, 1); INSERT INTO `schedule` VALUES (43, 8, 20, '2019-07-23 10:40', 39, 144, 1); INSERT INTO `schedule` VALUES (44, 29, 25, '2019-07-25 00:00', 40, 144, 1); INSERT INTO `schedule` VALUES (45, 8, 1, '2019-07-23 10:20', 45, 144, 1); INSERT INTO `schedule` VALUES (46, 2, 20, '2019-07-22 19:30', 39, 144, 1); INSERT INTO `schedule` VALUES (47, 8, 1, '2019-07-24 10:20', 45, 144, 1); INSERT INTO `schedule` VALUES (48, 37, 25, '2019-07-23 20:00', 38, 144, 0); INSERT INTO `schedule` VALUES (49, 45, 20, '2019-07-23 20:20', 58, 144, 1); INSERT INTO `schedule` VALUES (50, 7, 20, '2019-07-23 16:20', 38, 144, 1); INSERT INTO `schedule` VALUES (51, 46, 20, '2019-07-23 15:15', 68, 144, 1); INSERT INTO `schedule` VALUES (52, 3, 1, '2019-07-23 10:00', 45, 144, 1); INSERT INTO `schedule` VALUES (53, 14, 20, '2019-07-24 13:00', 39, 144, 1); INSERT INTO `schedule` VALUES (54, 46, 1, '2019-07-23 19:20', 67, 144, 1); INSERT INTO `schedule` VALUES (55, 29, 20, '2019-07-24 17:10', 38, 144, 1); INSERT INTO `schedule` VALUES (56, 9, 1, '2019-07-24 09:40', 45, 144, 1); INSERT INTO `schedule` VALUES (57, 46, 1, '2019-07-24 19:30', 66, 144, 1); INSERT INTO `schedule` VALUES (58, 32, 20, '2019-07-23 09:30', 36, 144, 1); INSERT INTO `schedule` VALUES (59, 24, 3, '2019-07-25 13:35', 45, 144, 1); INSERT INTO `schedule` VALUES (60, 49, 25, '2019-07-24 10:00', 50, 144, 1); INSERT INTO `schedule` VALUES (61, 37, 20, '2019-07-23 22:00', 38, 144, 1); INSERT INTO `schedule` VALUES (62, 5, 1, '2019-07-23 10:15', 43, 144, 1); INSERT INTO `schedule` VALUES (63, 51, 3, '2019-07-23 17:05', 35, 144, 1); INSERT INTO `schedule` VALUES (64, 36, 25, '2019-07-23 19:30', 38, 144, 1); INSERT INTO `schedule` VALUES (65, 35, 3, '2019-07-24 19:05', 45, 138, 1); INSERT INTO `schedule` VALUES (66, 29, 20, '2019-07-24 07:15', 38, 144, 1); INSERT INTO `schedule` VALUES (67, 4, 26, '2019-07-23 20:00', 28, 144, 1); INSERT INTO `schedule` VALUES (68, 16, 3, '2019-07-23 18:05', 40, 144, 1); INSERT INTO `schedule` VALUES (69, 10, 20, '2019-07-24 13:35', 38, 144, 1); INSERT INTO `schedule` VALUES (70, 33, 26, '2019-07-24 21:00', 22, 144, 1); INSERT INTO `schedule` VALUES (71, 4, 1, '2019-07-23 09:45', 43, 144, 1); INSERT INTO `schedule` VALUES (72, 10, 1, '2019-07-23 19:20', 43, 144, 1); INSERT INTO `schedule` VALUES (73, 24, 3, '2019-07-25 21:00', 45, 144, 1); INSERT INTO `schedule` VALUES (74, 11, 21, '2019-07-23 14:15', 36, 144, 1); INSERT INTO `schedule` VALUES (75, 23, 26, '2019-07-24 13:00', 25, 144, 1); INSERT INTO `schedule` VALUES (76, 4, 1, '2019-07-24 09:50', 43, 144, 1); INSERT INTO `schedule` VALUES (77, 31, 3, '2019-07-26 12:45', 35, 144, 1); INSERT INTO `schedule` VALUES (78, 37, 26, '2019-07-24 19:05', 38, 144, 1); INSERT INTO `schedule` VALUES (79, 11, 21, '2019-07-23 15:25', 36, 144, 1); INSERT INTO `schedule` VALUES (80, 10, 1, '2019-07-24 20:00', 43, 144, 1); INSERT INTO `schedule` VALUES (81, 10, 26, '2019-07-23 22:05', 28, 144, 1); INSERT INTO `schedule` VALUES (82, 39, 21, '2019-07-23 20:05', 36, 144, 1); INSERT INTO `schedule` VALUES (83, 11, 1, '2019-07-23 21:10', 44, 143, 1); INSERT INTO `schedule` VALUES (84, 5, 21, '2019-07-24 10:20', 36, 144, 1); INSERT INTO `schedule` VALUES (85, 24, 26, '2019-07-24 17:30', 25, 144, 1); INSERT INTO `schedule` VALUES (86, 31, 26, '2019-07-22 19:00', 28, 144, 1); INSERT INTO `schedule` VALUES (87, 5, 1, '2019-07-24 09:30', 43, 144, 1); INSERT INTO `schedule` VALUES (88, 11, 21, '2019-07-24 22:15', 36, 144, 1); INSERT INTO `schedule` VALUES (89, 17, 26, '2019-07-22 00:00', 29, 144, 1); INSERT INTO `schedule` VALUES (90, 35, 3, '2019-07-24 18:40', 34, 144, 1); INSERT INTO `schedule` VALUES (91, 39, 1, '2019-07-24 20:25', 44, 144, 1); INSERT INTO `schedule` VALUES (92, 12, 21, '2019-07-23 14:10', 29, 144, 1); INSERT INTO `schedule` VALUES (93, 12, 26, '2019-07-23 22:00', 29, 144, 1); INSERT INTO `schedule` VALUES (94, 24, 5, '2019-07-21 19:55', 54, 142, 1); INSERT INTO `schedule` VALUES (95, 12, 21, '2019-07-23 16:05', 29, 144, 1); INSERT INTO `schedule` VALUES (96, 6, 1, '2019-07-23 10:20', 46, 144, 1); INSERT INTO `schedule` VALUES (97, 8, 26, '2019-07-23 10:00', 25, 144, 1); INSERT INTO `schedule` VALUES (98, 47, 24, '2019-07-28 14:45', 33, 144, 1); INSERT INTO `schedule` VALUES (99, 12, 21, '2019-07-24 10:00', 29, 144, 1); INSERT INTO `schedule` VALUES (100, 6, 1, '2019-07-23 21:10', 46, 144, 1); INSERT INTO `schedule` VALUES (101, 29, 26, '2019-07-23 20:00', 30, 144, 1); INSERT INTO `schedule` VALUES (102, 12, 1, '2019-07-24 10:10', 46, 144, 1); INSERT INTO `schedule` VALUES (103, 30, 21, '2019-07-23 13:10', 35, 141, 1); INSERT INTO `schedule` VALUES (104, 12, 1, '2019-07-24 20:40', 46, 144, 1); INSERT INTO `schedule` VALUES (105, 30, 21, '2019-07-23 21:05', 35, 144, 1); INSERT INTO `schedule` VALUES (106, 25, 26, '2019-07-24 23:00', 39, 144, 1); INSERT INTO `schedule` VALUES (107, 28, 21, '2019-07-24 16:05', 38, 144, 1); INSERT INTO `schedule` VALUES (108, 14, 1, '2019-07-23 19:20', 44, 144, 1); INSERT INTO `schedule` VALUES (109, 1, 15, '2019-07-23 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (110, 26, 1, '2019-07-24 10:20', 44, 144, 1); INSERT INTO `schedule` VALUES (111, 51, 22, '2019-07-21 00:00', 59, 144, 1); INSERT INTO `schedule` VALUES (112, 40, 1, '2019-07-24 22:00', 44, 144, 1); INSERT INTO `schedule` VALUES (113, 4, 18, '2019-07-25 08:05', 65, 144, 1); INSERT INTO `schedule` VALUES (114, 36, 22, '2019-07-21 00:00', 58, 144, 1); INSERT INTO `schedule` VALUES (115, 34, 22, '2019-07-23 13:15', 49, 144, 1); INSERT INTO `schedule` VALUES (116, 31, 22, '2019-07-23 13:20', 49, 144, 1); INSERT INTO `schedule` VALUES (117, 16, 17, '2019-07-24 09:10', 35, 144, 1); INSERT INTO `schedule` VALUES (118, 15, 1, '2019-07-23 20:30', 43, 144, 1); INSERT INTO `schedule` VALUES (119, 27, 1, '2019-07-24 09:50', 43, 144, 1); INSERT INTO `schedule` VALUES (120, 47, 18, '2019-07-25 16:30', 54, 144, 1); INSERT INTO `schedule` VALUES (121, 47, 1, '2019-07-24 20:40', 56, 144, 1); INSERT INTO `schedule` VALUES (122, 43, 18, '2019-07-24 04:25', 28, 142, 1); INSERT INTO `schedule` VALUES (123, 1, 15, '2019-07-21 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (124, 16, 1, '2019-07-23 21:20', 41, 144, 1); INSERT INTO `schedule` VALUES (125, 34, 18, '2019-07-21 17:15', 34, 144, 1); INSERT INTO `schedule` VALUES (126, 7, 15, '2019-07-22 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (127, 28, 1, '2019-07-24 20:30', 41, 144, 1); INSERT INTO `schedule` VALUES (128, 17, 1, '2019-07-23 14:15', 42, 144, 1); INSERT INTO `schedule` VALUES (129, 1, 15, '2019-07-21 20:00', 30, 144, 1); INSERT INTO `schedule` VALUES (130, 29, 1, '2019-07-24 09:00', 42, 144, 1); INSERT INTO `schedule` VALUES (131, 7, 15, '2019-07-22 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (132, 36, 22, '2019-07-24 16:20', 48, 144, 1); INSERT INTO `schedule` VALUES (133, 3, 16, '2019-07-24 10:10', 45, 144, 1); INSERT INTO `schedule` VALUES (134, 13, 15, '2019-07-23 10:30', 30, 144, 1); INSERT INTO `schedule` VALUES (135, 25, 4, '2019-07-21 05:25', 32, 136, 1); INSERT INTO `schedule` VALUES (136, 1, 2, '2019-07-23 10:05', 34, 139, 1); INSERT INTO `schedule` VALUES (137, 13, 15, '2019-07-23 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (138, 7, 2, '2019-07-23 22:15', 34, 144, 1); INSERT INTO `schedule` VALUES (139, 48, 22, '2019-07-24 15:25', 58, 144, 1); INSERT INTO `schedule` VALUES (140, 49, 23, '2019-07-21 15:15', 42, 144, 1); INSERT INTO `schedule` VALUES (141, 13, 15, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (142, 30, 22, '2019-07-23 16:15', 48, 144, 1); INSERT INTO `schedule` VALUES (143, 7, 15, '2019-07-24 18:00', 30, 144, 1); INSERT INTO `schedule` VALUES (144, 13, 2, '2019-07-24 17:10', 34, 144, 1); INSERT INTO `schedule` VALUES (145, 7, 15, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (146, 25, 2, '2019-07-23 19:30', 33, 144, 1); INSERT INTO `schedule` VALUES (147, 40, 23, '2019-07-23 10:30', 39, 144, 1); INSERT INTO `schedule` VALUES (148, 37, 2, '2019-07-24 10:05', 34, 144, 1); INSERT INTO `schedule` VALUES (149, 26, 23, '2019-07-23 20:15', 39, 144, 1); INSERT INTO `schedule` VALUES (150, 44, 2, '2019-07-24 19:10', 34, 144, 1); INSERT INTO `schedule` VALUES (151, 24, 2, '2019-07-22 00:00', 32, 144, 1); INSERT INTO `schedule` VALUES (152, 32, 23, '2019-07-23 13:30', 40, 144, 1); INSERT INTO `schedule` VALUES (153, 36, 2, '2019-07-23 00:00', 32, 142, 1); INSERT INTO `schedule` VALUES (154, 51, 2, '2019-07-24 00:00', 32, 144, 1); INSERT INTO `schedule` VALUES (155, 10, 23, '2019-07-23 13:20', 39, 144, 1); INSERT INTO `schedule` VALUES (156, 2, 15, '2019-07-21 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (157, 33, 23, '2019-07-23 19:15', 38, 144, 1); INSERT INTO `schedule` VALUES (158, 23, 2, '2019-07-23 09:00', 35, 142, 1); INSERT INTO `schedule` VALUES (159, 2, 15, '2019-07-21 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (160, 35, 2, '2019-07-24 21:00', 35, 143, 1); INSERT INTO `schedule` VALUES (161, 8, 15, '2019-07-21 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (162, 50, 2, '2019-07-25 20:05', 45, 144, 1); INSERT INTO `schedule` VALUES (163, 8, 15, '2019-07-21 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (164, 22, 2, '2019-07-22 00:00', 33, 144, 1); INSERT INTO `schedule` VALUES (165, 27, 23, '2019-07-23 16:15', 38, 144, 1); INSERT INTO `schedule` VALUES (166, 2, 15, '2019-07-21 20:00', 30, 144, 1); INSERT INTO `schedule` VALUES (167, 34, 2, '2019-07-23 00:00', 33, 144, 1); INSERT INTO `schedule` VALUES (168, 43, 2, '2019-07-24 00:00', 33, 144, 1); INSERT INTO `schedule` VALUES (169, 47, 24, '2019-07-23 16:10', 48, 144, 1); INSERT INTO `schedule` VALUES (170, 2, 15, '2019-07-23 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (171, 28, 24, '2019-07-23 15:05', 38, 144, 1); INSERT INTO `schedule` VALUES (172, 8, 15, '2019-07-23 10:30', 30, 144, 1); INSERT INTO `schedule` VALUES (173, 29, 24, '2019-07-21 15:20', 38, 144, 1); INSERT INTO `schedule` VALUES (174, 20, 3, '2019-07-23 09:00', 27, 144, 1); INSERT INTO `schedule` VALUES (175, 8, 15, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (176, 32, 3, '2019-07-24 12:15', 27, 144, 1); INSERT INTO `schedule` VALUES (177, 34, 24, '2019-07-24 10:20', 38, 144, 1); INSERT INTO `schedule` VALUES (178, 8, 15, '2019-07-24 13:00', 30, 144, 1); INSERT INTO `schedule` VALUES (179, 4, 3, '2019-07-23 15:00', 27, 144, 1); INSERT INTO `schedule` VALUES (180, 8, 15, '2019-07-24 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (181, 10, 3, '2019-07-24 17:00', 27, 144, 1); INSERT INTO `schedule` VALUES (182, 3, 15, '2019-07-22 09:00', 30, 144, 1); INSERT INTO `schedule` VALUES (183, 42, 24, '2019-07-24 13:35', 38, 144, 1); INSERT INTO `schedule` VALUES (184, 25, 3, '2019-07-22 08:00', 26, 144, 1); INSERT INTO `schedule` VALUES (185, 3, 15, '2019-07-22 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (186, 9, 15, '2019-07-22 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (187, 38, 15, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (188, 37, 3, '2019-07-24 14:05', 26, 144, 1); INSERT INTO `schedule` VALUES (189, 35, 24, '2019-07-24 16:15', 38, 144, 1); INSERT INTO `schedule` VALUES (190, 38, 15, '2019-07-25 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (191, 44, 3, '2019-07-25 09:00', 26, 144, 1); INSERT INTO `schedule` VALUES (192, 3, 15, '2019-07-25 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (193, 1, 4, '2019-07-22 23:00', 33, 144, 1); INSERT INTO `schedule` VALUES (194, 7, 4, '2019-07-23 23:00', 33, 144, 1); INSERT INTO `schedule` VALUES (195, 35, 24, '2019-07-24 16:20', 38, 144, 1); INSERT INTO `schedule` VALUES (196, 4, 15, '2019-07-23 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (197, 13, 4, '2019-07-24 23:00', 33, 144, 1); INSERT INTO `schedule` VALUES (198, 10, 15, '2019-07-23 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (199, 45, 4, '2019-07-25 23:00', 33, 144, 1); INSERT INTO `schedule` VALUES (200, 10, 15, '2019-07-24 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (201, 20, 4, '2019-07-23 23:00', 32, 144, 1); INSERT INTO `schedule` VALUES (202, 10, 15, '2019-07-24 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (203, 20, 4, '2019-07-24 23:00', 32, 144, 1); INSERT INTO `schedule` VALUES (204, 5, 15, '2019-07-23 11:00', 30, 144, 1); INSERT INTO `schedule` VALUES (205, 4, 4, '2019-07-23 00:00', 32, 144, 1); INSERT INTO `schedule` VALUES (206, 10, 4, '2019-07-24 00:00', 32, 144, 1); INSERT INTO `schedule` VALUES (207, 11, 15, '2019-07-23 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (208, 16, 21, '2019-07-23 13:25', 38, 144, 1); INSERT INTO `schedule` VALUES (209, 39, 15, '2019-07-23 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (210, 5, 15, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (211, 11, 15, '2019-07-24 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (212, 37, 4, '2019-07-23 15:05', 32, 144, 1); INSERT INTO `schedule` VALUES (213, 22, 22, '2019-07-23 16:05', 49, 144, 1); INSERT INTO `schedule` VALUES (214, 44, 4, '2019-07-24 14:10', 32, 144, 1); INSERT INTO `schedule` VALUES (215, 6, 15, '2019-07-23 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (216, 24, 5, '2019-07-23 04:00', 34, 144, 1); INSERT INTO `schedule` VALUES (217, 12, 15, '2019-07-23 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (218, 12, 15, '2019-07-24 09:00', 30, 144, 1); INSERT INTO `schedule` VALUES (219, 42, 22, '2019-07-24 17:00', 48, 144, 1); INSERT INTO `schedule` VALUES (220, 6, 15, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (221, 1, 16, '2019-07-23 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (222, 36, 5, '2019-07-21 14:54', 34, 144, 1); INSERT INTO `schedule` VALUES (223, 13, 16, '2019-07-23 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (224, 20, 23, '2019-07-24 18:45', 40, 144, 1); INSERT INTO `schedule` VALUES (225, 15, 5, '2019-07-23 04:00', 33, 144, 1); INSERT INTO `schedule` VALUES (226, 7, 16, '2019-07-24 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (227, 42, 5, '2019-07-24 04:00', 34, 144, 1); INSERT INTO `schedule` VALUES (228, 7, 16, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (229, 4, 23, '2019-07-24 14:15', 39, 144, 1); INSERT INTO `schedule` VALUES (230, 27, 5, '2019-07-23 05:05', 33, 144, 1); INSERT INTO `schedule` VALUES (231, 13, 15, '2019-07-24 18:00', 30, 144, 1); INSERT INTO `schedule` VALUES (232, 2, 16, '2019-07-23 11:00', 30, 140, 1); INSERT INTO `schedule` VALUES (233, 47, 23, '2019-07-23 20:15', 58, 144, 1); INSERT INTO `schedule` VALUES (234, 2, 16, '2019-07-23 16:00', 30, 144, 1); INSERT INTO `schedule` VALUES (235, 2, 16, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (236, 15, 23, '2019-07-24 20:15', 38, 144, 1); INSERT INTO `schedule` VALUES (237, 8, 16, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (238, 11, 5, '2019-07-24 14:57', 32, 144, 1); INSERT INTO `schedule` VALUES (239, 2, 16, '2019-07-24 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (240, 27, 5, '2019-07-21 14:58', 33, 144, 1); INSERT INTO `schedule` VALUES (241, 41, 5, '2019-07-24 07:00', 32, 144, 1); INSERT INTO `schedule` VALUES (242, 16, 24, '2019-07-23 20:05', 38, 144, 1); INSERT INTO `schedule` VALUES (243, 3, 16, '2019-07-23 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (244, 22, 5, '2019-07-22 05:00', 33, 144, 1); INSERT INTO `schedule` VALUES (245, 38, 16, '2019-07-23 19:00', 30, 144, 1); INSERT INTO `schedule` VALUES (246, 34, 5, '2019-07-23 05:00', 33, 144, 1); INSERT INTO `schedule` VALUES (247, 9, 15, '2019-07-24 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (248, 41, 24, '2019-07-23 12:00', 38, 144, 1); INSERT INTO `schedule` VALUES (249, 43, 5, '2019-07-24 05:00', 33, 144, 1); INSERT INTO `schedule` VALUES (250, 9, 16, '2019-07-24 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (251, 17, 24, '2019-07-24 20:15', 38, 144, 1); INSERT INTO `schedule` VALUES (252, 4, 16, '2019-07-23 11:00', 30, 144, 1); INSERT INTO `schedule` VALUES (253, 10, 16, '2019-07-24 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (254, 30, 24, '2019-07-23 14:20', 38, 144, 1); INSERT INTO `schedule` VALUES (255, 5, 16, '2019-07-23 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (256, 22, 24, '2019-07-23 14:20', 38, 144, 1); INSERT INTO `schedule` VALUES (257, 5, 16, '2019-07-23 19:00', 30, 144, 1); INSERT INTO `schedule` VALUES (258, 5, 16, '2019-07-24 13:00', 30, 144, 1); INSERT INTO `schedule` VALUES (259, 39, 16, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (260, 6, 16, '2019-07-23 00:00', 30, 144, 1); INSERT INTO `schedule` VALUES (261, 12, 16, '2019-07-24 16:00', 20, 144, 1); INSERT INTO `schedule` VALUES (262, 1, 17, '2019-07-23 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (263, 7, 17, '2019-07-23 11:00', 30, 144, 1); INSERT INTO `schedule` VALUES (264, 13, 17, '2019-07-24 07:00', 30, 144, 1); INSERT INTO `schedule` VALUES (265, 7, 17, '2019-07-24 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (266, 2, 17, '2019-07-23 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (267, 8, 17, '2019-07-23 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (268, 2, 17, '2019-07-24 09:20', 30, 144, 1); INSERT INTO `schedule` VALUES (269, 8, 17, '2019-07-24 15:00', 30, 144, 1); INSERT INTO `schedule` VALUES (270, 3, 17, '2019-07-23 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (271, 9, 17, '2019-07-23 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (272, 38, 17, '2019-07-24 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (273, 4, 17, '2019-07-23 14:00', 20, 144, 1); INSERT INTO `schedule` VALUES (274, 10, 17, '2019-07-24 14:05', 20, 144, 1); INSERT INTO `schedule` VALUES (275, 11, 17, '2019-07-23 10:00', 30, 144, 1); INSERT INTO `schedule` VALUES (276, 11, 17, '2019-07-24 17:00', 30, 144, 1); INSERT INTO `schedule` VALUES (277, 12, 17, '2019-07-23 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (278, 12, 17, '2019-07-24 11:00', 30, 144, 1); INSERT INTO `schedule` VALUES (279, 6, 17, '2019-07-23 09:00', 30, 144, 1); INSERT INTO `schedule` VALUES (280, 39, 17, '2019-07-23 21:00', 30, 144, 1); INSERT INTO `schedule` VALUES (281, 39, 17, '2019-07-24 00:00', 30, 144, 1); INSERT INTO `schedule` VALUES (282, 38, 17, '2019-07-24 08:00', 30, 144, 1); INSERT INTO `schedule` VALUES (283, 1, 18, '2019-07-23 08:00', 30, 144, 1); INSERT INTO `schedule` VALUES (284, 7, 18, '2019-07-23 12:00', 30, 144, 1); INSERT INTO `schedule` VALUES (285, 13, 18, '2019-07-24 14:00', 30, 144, 1); INSERT INTO `schedule` VALUES (286, 1, 18, '2019-07-24 16:00', 33, 144, 1); INSERT INTO `schedule` VALUES (287, 2, 18, '2019-07-23 17:00', 33, 144, 1); INSERT INTO `schedule` VALUES (288, 2, 18, '2019-07-23 09:00', 33, 144, 1); INSERT INTO `schedule` VALUES (289, 2, 18, '2019-07-23 14:00', 33, 144, 1); INSERT INTO `schedule` VALUES (290, 2, 18, '2019-07-24 10:00', 33, 144, 1); INSERT INTO `schedule` VALUES (291, 2, 18, '2019-07-24 13:00', 33, 144, 1); INSERT INTO `schedule` VALUES (292, 3, 18, '2019-07-23 12:00', 33, 144, 1); INSERT INTO `schedule` VALUES (293, 9, 18, '2019-07-23 20:00', 33, 144, 1); INSERT INTO `schedule` VALUES (294, 3, 18, '2019-07-23 15:00', 33, 144, 1); INSERT INTO `schedule` VALUES (295, 9, 18, '2019-07-24 10:00', 33, 144, 1); INSERT INTO `schedule` VALUES (296, 9, 18, '2019-07-24 11:00', 33, 144, 1); INSERT INTO `schedule` VALUES (297, 38, 18, '2019-07-24 21:00', 33, 144, 1); INSERT INTO `schedule` VALUES (298, 10, 18, '2019-07-23 08:00', 33, 144, 1); INSERT INTO `schedule` VALUES (299, 4, 18, '2019-07-23 11:00', 33, 144, 1); INSERT INTO `schedule` VALUES (300, 4, 18, '2019-07-24 14:00', 33, 144, 1); INSERT INTO `schedule` VALUES (301, 10, 18, '2019-07-24 21:00', 33, 144, 1); INSERT INTO `schedule` VALUES (302, 5, 18, '2019-07-23 08:00', 33, 144, 1); INSERT INTO `schedule` VALUES (303, 11, 18, '2019-07-24 11:00', 33, 144, 1); INSERT INTO `schedule` VALUES (304, 39, 18, '2019-07-24 15:00', 33, 144, 1); INSERT INTO `schedule` VALUES (305, 6, 18, '2019-07-23 10:00', 33, 144, 1); INSERT INTO `schedule` VALUES (306, 12, 18, '2019-07-24 12:00', 33, 144, 1); INSERT INTO `schedule` VALUES (307, 12, 18, '2019-07-24 18:00', 33, 144, 1); INSERT INTO `schedule` VALUES (308, 1, 27, '2019-07-23 00:00', 45, 144, 1); INSERT INTO `schedule` VALUES (309, 7, 27, '2019-07-24 19:00', 45, 144, 1); INSERT INTO `schedule` VALUES (310, 8, 27, '2019-07-23 20:00', 40, 140, 1); INSERT INTO `schedule` VALUES (311, 4, 27, '2019-07-23 16:00', 49, 144, 1); INSERT INTO `schedule` VALUES (312, 11, 27, '2019-07-24 19:15', 45, 144, 1); INSERT INTO `schedule` VALUES (313, 8, 27, '2019-07-24 15:00', 35, 144, 1); INSERT INTO `schedule` VALUES (314, 8, 20, '2019-07-18 04:04', 45, 144, 1); -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `user_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '会员编号', `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '会员账号', `user_pwd` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '会员密码', `user_email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '会员邮箱', `user_role` int(10) NOT NULL DEFAULT 0 COMMENT '会员权限(默认为0)\r\n0:普通会员 1:管理员', `user_headImg` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '会员头像', PRIMARY KEY (`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'user', 'user', '33734872621@qq.com', 0, '../upload/head/f6337987771546f9a143fc5206f047f4.jpg'); INSERT INTO `user` VALUES (2, 'admin', 'admin', '3456872621@qq.com', 1, '../upload/head/dc56255b1e4f4ad4b0a76a8eb0fc7f45.jpg'); INSERT INTO `user` VALUES (3, 'wxj', 'wxj', '937872111@126.com', 1, '../upload/head/de9d930c96e240bc9f4f91b914e5dddb.jpg'); INSERT INTO `user` VALUES (4, 'lpf', 'lpf', '23546211543@qq.com', 0, '../upload/head/85c888cf36d649d6aaea58f19cc8c143.jpg'); INSERT INTO `user` VALUES (5, 'wzw', 'wzw', '2154698421@126.com', 0, '../upload/head/bdc1cf2d9b9d4d5ca5d7a34f2ebfc5b3.jpg'); INSERT INTO `user` VALUES (6, 'hzw', 'hzw', 'a487953215@163.com', 0, '../upload/head/demo.jpg'); INSERT INTO `user` VALUES (7, 'lsw', 'lsw', '3215644123@qq.com', 0, '../upload/head/84c69b60d91e4c079e249a6cd09ef91c.jpg'); INSERT INTO `user` VALUES (8, 'bg12356484', '6484', '910050724@qq.com', 0, '../upload/head/demo.jpg'); INSERT INTO `user` VALUES (9, 'ao13546954', '6954', 'hsw236413512@163.com', 0, NULL); INSERT INTO `user` VALUES (19, 'jd15154478', '4478', '5648132142@163.com', 0, '../upload/head/dc56255b1e4f4ad4b0a76a8eb0fc7f45.jpg'); INSERT INTO `user` VALUES (20, 'sn46845411', '5411', 'gs15648231@126.com', 0, '../upload/head/84c69b60d91e4c079e249a6cd09ef91c.jpg'); INSERT INTO `user` VALUES (21, 'gs12314864', '4864', '2154678122@qq.com', 0, '../upload/head/84c69b60d91e4c079e249a6cd09ef91c.jpg'); INSERT INTO `user` VALUES (22, 'jd12315164', '5164', '211215484@qq.com', 0, '../upload/head/dc56255b1e4f4ad4b0a76a8eb0fc7f45.jpg'); INSERT INTO `user` VALUES (23, 'kl15645641', '5641', 'g123456412@163.com', 0, '../upload/head/dd7cf74e264247ffbe888c4e163fb9ed.jpg'); INSERT INTO `user` VALUES (24, 'kd1231854', '1854', '123484547@qq.com', 0, NULL); INSERT INTO `user` VALUES (25, 'tw1123484', '3484', '988744641@qq.com', 0, '../upload/head/dc56255b1e4f4ad4b0a76a8eb0fc7f45.jpg'); INSERT INTO `user` VALUES (26, 'if48648411', '8411', 'u365484741@163.com', 0, '../upload/head/dd7cf74e264247ffbe888c4e163fb9ed.jpg'); INSERT INTO `user` VALUES (27, 'od1561487', '1487', '1564562314@qq.com', 0, NULL); INSERT INTO `user` VALUES (28, 'jd54687233', '7233', '165484754@qq.com', 0, NULL); SET FOREIGN_KEY_CHECKS = 1; ================================================ FILE: pom.xml ================================================ 4.0.0 com.movie Movie war 0.0.1-SNAPSHOT Movie Maven Webapp http://maven.apache.org junit junit 3.8.1 test mysql mysql-connector-java 8.0.12 org.mybatis mybatis 3.4.6 org.mybatis mybatis-spring 2.0.1 org.springframework spring-context 5.1.6.RELEASE org.aspectj aspectjweaver 1.9.3 org.springframework spring-tx 5.1.6.RELEASE org.springframework spring-jdbc 5.1.6.RELEASE com.alibaba druid 1.0.27 org.springframework spring-context-support 5.1.6.RELEASE org.springframework spring-webmvc 5.1.6.RELEASE com.fasterxml.jackson.core jackson-databind 2.9.3 com.fasterxml.jackson.core jackson-core 2.9.3 com.fasterxml.jackson.core jackson-annotations 2.9.3 com.alibaba fastjson 1.2.51 com.thetransactioncompany cors-filter 2.5 org.freemarker freemarker 2.3.23 com.github.pagehelper pagehelper 5.1.4 javax.servlet jstl 1.2 commons-fileupload commons-fileupload 1.3.2 commons-io commons-io 2.5 joda-time joda-time 2.9.9 Movie org.apache.maven.plugins maven-compiler-plugin 3.1 1.8 1.8 ================================================ FILE: src/main/java/com/controller/CommentController.java ================================================ package com.controller; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSONObject; import com.entity.Comment; import com.entity.User; import com.github.pagehelper.PageInfo; import com.service.ICommentService; import com.service.IMovieService; import com.service.IUserService; /** * 评论管理模块 * @author Wxj */ @Controller @RequestMapping("/comment") public class CommentController { @Resource private ICommentService commentService; @Resource private IUserService userService; @Resource private IMovieService movieService; //用户: 修改评论、增加评论 //管理员:x 删除评论、 修改评论 //x查询用户的评论 @RequestMapping("findAllComments") @ResponseBody public JSONObject findAllComments() { JSONObject obj = new JSONObject(); List list = commentService.findAllComments(); for(Comment comment: list) { comment.setComment_user(userService.findUserById(comment.getUser_id())); } obj.put("code", 0); obj.put("msg",""); obj.put("count", list.size()); obj.put("data", list); return obj; } //测试 info.getTotal @RequestMapping("findAllCommentsPage") @ResponseBody public JSONObject findAllCommentsPage(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,String keyword) { PageInfo info = commentService.findAllCommentsBySplitPage(page, limit, keyword); //System.out.println(info); for(Comment comment : info.getList()) { comment.setComment_user(userService.findUserById(comment.getUser_id())); } JSONObject obj = new JSONObject(); obj.put("code", 0); obj.put("msg", ""); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } @RequestMapping("addCommentByUser") @ResponseBody public JSONObject addCommentByUser(@RequestParam("movie_id")long movie_id,@RequestParam("comment_content")String comment_content,HttpServletRequest request) { User user = (User)request.getSession().getAttribute("user"); JSONObject obj = new JSONObject(); if(user == null) { obj.put("code",200); obj.put("msg", "您未登录,登录之后才可评论~"); }else { Comment comment = new Comment(); comment.setComment_content(comment_content); comment.setMovie_id(movie_id); comment.setUser_id(user.getUser_id()); comment.setComment_time(new Date()); Integer rs = commentService.addComemnt(comment); if(rs > 0) { Integer rs2 = movieService.addCommentCount(comment.getMovie_id()); if(rs2 > 0) { obj.put("code", 0); obj.put("msg", "评论成功~"); }else { obj.put("code",200); obj.put("msg", "评论失败2~"); } }else { obj.put("code",200); obj.put("msg", "评论失败~"); } } return obj; } @RequestMapping("updateComment") @ResponseBody public JSONObject updateComment(@RequestParam("comment_id")long comment_id,@RequestParam("comment_content")String comment_content) { JSONObject obj = new JSONObject(); Comment comment = this.commentService.findCommentById(comment_id); comment.setComment_time(new Date()); comment.setComment_content(comment_content); Integer rs = commentService.updateComment(comment); if(rs > 0) { obj.put("code", 0); obj.put("msg", "修改成功~"); }else { obj.put("code",200); obj.put("msg", "修改失败~"); } return obj; } @RequestMapping("deleteComemnt") @ResponseBody public JSONObject deleteComment(@RequestParam("comment_id")long comment_id) { JSONObject obj = new JSONObject(); Integer rs2 = movieService.delCommentCount(commentService.findCommentById(comment_id).getMovie_id()); Integer rs = commentService.deleteComment(comment_id); if(rs > 0) { obj.put("code", 0); obj.put("msg", "删除成功~"); }else { obj.put("code", 200); obj.put("msg", "删除失败~"); } return obj; } @RequestMapping("findCommentsByUserName") @ResponseBody public JSONObject findCommentsByUserName(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,@RequestParam("user_name")String user_name) { PageInfo info = commentService.findCommentsByUserName(page, limit, user_name); //System.out.println(info); for(Comment comment : info.getList()) { comment.setComment_user(userService.findUserById(comment.getUser_id())); } JSONObject obj = new JSONObject(); obj.put("code", 0); obj.put("msg", ""); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } } ================================================ FILE: src/main/java/com/controller/MovieController.java ================================================ package com.controller; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSONObject; import com.entity.Cinema; import com.entity.Movie; import com.service.ICinemaService; import com.service.IMovieService; import com.util.UUIDUtil; /** * 电影管理模块 * @author Wxj */ @Controller @RequestMapping("/movie") public class MovieController { @Resource private IMovieService movieService; @Resource private ICinemaService cinemaService; //1.电影详情页 findid //2.首页电影列表 + name搜索 + type搜素 + 时间、参评人数、评分排序 //3.增加、删除、修改 @RequestMapping("findMovieById") @ResponseBody public JSONObject findMovieById(@RequestParam("movie_id")long movie_id) { JSONObject obj = new JSONObject(); Movie movie = movieService.findMovieById(movie_id); List list = this.cinemaService.findCinemasByMovieId(movie_id); obj.put("code", 0); obj.put("data", movie); obj.put("cinemaList",list); obj.put("cinemaCount",list.size()); return obj; } @RequestMapping("findAllMovies") @ResponseBody public JSONObject findAllMovies() { JSONObject obj = new JSONObject(); List list = movieService.findAllMovies(1); List upcomingList = movieService.findAllMovies(0); List offList = movieService.sortMovieByBoxOffice(); String type[] = {"喜剧","动作","爱情","动画","科幻","惊悚","冒险","犯罪","悬疑"}; ArrayList typeArr = new ArrayList(); for(int i = 0;i < type.length;i++) { List movieList = this.movieService.findMoviesLikeType(type[i]); float boxOffice = 0; for(int j = 0; j < movieList.size();j++) { boxOffice += movieList.get(j).getMovie_boxOffice(); } JSONObject typeJson = new JSONObject(); typeJson.put(type[i], boxOffice); typeArr.add(typeJson); } obj.put("code", 0); obj.put("count", list.size()); obj.put("upcomingCount",upcomingList.size()); obj.put("data", list); obj.put("data1", upcomingList); obj.put("sort", offList); obj.put("type", typeArr); return obj; } @RequestMapping("findMoviesByName") @ResponseBody public JSONObject findMoviesByName(@RequestParam("name") String name) { JSONObject obj = new JSONObject(); List list = movieService.findMoviesLikeName(name); obj.put("code", 0); obj.put("count", list.size()); obj.put("data", list); return obj; } @RequestMapping("findMoviesByType") @ResponseBody public JSONObject findMoviesByType(@RequestParam("type") String type) { JSONObject obj = new JSONObject(); List list = movieService.findMoviesLikeType(type); obj.put("code", 0); obj.put("count", list.size()); obj.put("data", list); return obj; } @RequestMapping("sortAllMovies") @ResponseBody public JSONObject sortAllMovies(@RequestParam("order") String order) { JSONObject obj = new JSONObject(); List list = new ArrayList(); switch (order) { case "热门": list = movieService.sortMovieByCount(); break; case "时间": list = movieService.sortMovieByDate(); break; case "评价": list = movieService.sortMovieByScore(); break; } obj.put("code",0); obj.put("count", list.size()); obj.put("data", list); return obj; } @RequestMapping("deleteMovie") @ResponseBody public JSONObject deleteMovie(@RequestParam("movie_id") long movie_id) { JSONObject obj = new JSONObject(); Integer rs = movieService.deleteMovie(movie_id); if(rs > 0) { obj.put("code",0); obj.put("msg","下架成功~"); }else { obj.put("code", 200); obj.put("msg", "下架失败~"); } return obj; } @RequestMapping("addMovie") @ResponseBody public JSONObject addMovie(@RequestParam(value="file",required=false) MultipartFile file,Movie movie,HttpServletRequest request) throws IOException { String str = file.getOriginalFilename(); System.out.println("file:" + str); String name = UUIDUtil.getUUID() + str.substring(str.lastIndexOf(".")); System.out.println("name:" + name); String path = request.getServletContext().getRealPath("/upload/movies") + "/" + name; System.out.println("path:" + path); String filePath = "../upload/movies/" + name; movie.setMovie_picture(filePath); Date date = new Date(); java.sql.Date releaseDate = new java.sql.Date(date.getYear(), date.getMonth(), date.getDay()); //SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd"); float random = 5 + (new Random().nextFloat() * 4); DecimalFormat fnum = new DecimalFormat("##0.0"); String score = fnum.format(random); movie.setMovie_score(Float.parseFloat(score)); movie.setReleaseDate(releaseDate); Integer rs = movieService.addMovie(movie); JSONObject obj = new JSONObject(); if(rs > 0) { file.transferTo(new File(path)); System.out.println("文件写入成功,Path:" + path); obj.put("code", 0); obj.put("msg", "添加成功~"); }else { obj.put("code", 200); obj.put("msg", "添加失败~"); } return obj; } @RequestMapping("updateMovie") @ResponseBody public JSONObject updateMovie(@RequestParam(value="file",required=false)MultipartFile file,Movie movie,HttpServletRequest request) throws IOException{ JSONObject obj = new JSONObject(); if(file != null) { String str = file.getOriginalFilename(); System.out.println("file:" + str); String name = UUIDUtil.getUUID() + str.substring(str.lastIndexOf(".")); System.out.println("name:" + name); String path = request.getServletContext().getRealPath("/upload/movies") + "/" + name; System.out.println("path:" + path); String filePath = "../upload/movies/" + name; file.transferTo(new File(path)); System.out.println("文件写入成功,Path:" + path); movie.setMovie_picture(filePath); }else { Movie oldMovie = this.movieService.findMovieById(movie.getMovie_id()); movie.setMovie_picture(oldMovie.getMovie_picture()); } Integer rs = movieService.updateMovie(movie); if(rs > 0) { obj.put("code", 0); obj.put("msg", "修改成功~"); }else { obj.put("code", 200); obj.put("msg", "修改失败~"); } return obj; } } ================================================ FILE: src/main/java/com/controller/OrderController.java ================================================ package com.controller; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSONObject; import com.entity.Order; import com.entity.User; import com.github.pagehelper.PageInfo; import com.service.IMovieService; import com.service.IOrderService; import com.service.IScheduleService; @Controller @RequestMapping("/order") public class OrderController { @Resource private IOrderService orderService; @Resource private IScheduleService scheduleService; //支付、退票成功 座位+- @Resource private IMovieService movieService; //支付、退票成功 票房+- //查看订单是否 是支付的(返回给前端的数据) @RequestMapping("findOrderById") @ResponseBody public JSONObject findOrderById(@RequestParam("order_id")String order_id) { JSONObject obj = new JSONObject(); Order order = orderService.findOrderById(order_id); List list = new ArrayList(); list.add(order); obj.put("code", 0); obj.put("msg", ""); obj.put("count", list.size()); obj.put("data",list); return obj; } @RequestMapping("findOrderByUserName") @ResponseBody public JSONObject findOrderByUserName(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,@RequestParam("user_name")String user_name) { PageInfo info = orderService.findOrdersByUserName(page, limit, user_name); JSONObject obj = new JSONObject(); obj.put("code", 0); obj.put("msg", ""); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } @RequestMapping("findRefundOrderByUser") @ResponseBody public JSONObject findRefundOrderByUser(@RequestParam("user_name")String user_name) { JSONObject obj = new JSONObject(); List list = this.orderService.findRefundOrderByUserName(user_name); obj.put("code", 0); obj.put("msg", ""); obj.put("count", list.size()); obj.put("data", list); return obj; } @RequestMapping("findAllOrders") @ResponseBody public JSONObject findAllOrders() { JSONObject obj = new JSONObject(); List list = orderService.findAllOrders(); obj.put("code", 0); obj.put("msg", ""); obj.put("count", list.size()); obj.put("data", list); return obj; } @RequestMapping("findAllOrdersPage") @ResponseBody public JSONObject findAllOrdersPage(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,String keyword) { PageInfo info = orderService.findAllOrdersBySplitPage(page, limit, keyword); JSONObject obj = new JSONObject(); obj.put("code", 0); obj.put("msg", ""); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } @RequestMapping("findAllRefundOrder") @ResponseBody public JSONObject findAllRefundOrder(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit) { JSONObject obj = new JSONObject(); PageInfo info = orderService.findOrdersByState(page, limit, 0); obj.put("code", 0); obj.put("msg", ""); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } @RequestMapping("buyTickets") @ResponseBody public JSONObject buyTickets(@RequestParam("schedule_id")long schedule_id,@RequestParam("position[]")String[] position,@RequestParam("price")int price,HttpServletRequest request) { User user = (User)request.getSession().getAttribute("user"); JSONObject obj = new JSONObject(); if(user == null) { obj.put("code",200); obj.put("msg", "您未登录,登录之后才可购票~"); }else { int done = 0; int order_price = price / position.length; String user_id = ""; switch(String.valueOf(user.getUser_id()).length()) { case 1: user_id = "000" + String.valueOf(user.getUser_id()); break; case 2: user_id = "00" + String.valueOf(user.getUser_id()); break; case 3: user_id = "0" + String.valueOf(user.getUser_id()); break; case 4: user_id = String.valueOf(user.getUser_id()); break; } for(int i = 0;i < position.length;i++) { Order order = new Order(); String order_id = ""; Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("YYYYMMdd"); order_id += dateFormat.format(date); order_id += user_id; String index = ""; switch(position[i].length()) { case 4: index = "0" + position[i].replaceAll("排", "0"); index = index.replaceAll("座", ""); break; case 5: if(position[i].charAt(2) >= 48 && position[i].charAt(2) <= 57) { index = "0" + position[i].replaceAll("排", ""); index = index.replaceAll("座", ""); }else { index = position[i].replaceAll("排", "0"); index = index.replaceAll("座", ""); } break; case 6: index = position[i].replaceAll("排", ""); index = index.replaceAll("座", ""); break; } order_id += index; order.setOrder_id(order_id); order.setOrder_position(position[i]); order.setSchedule_id(schedule_id); order.setUser_id(user.getUser_id()); order.setOrder_price(order_price); order.setOrder_time(new Date()); Integer rs = this.orderService.addOrder(order); Integer rs1 = this.scheduleService.delScheduleRemain(schedule_id); done++; } if(done == position.length) { float sum = (float)price/10000; Integer rs2 = this.movieService.changeMovieBoxOffice(sum, this.scheduleService.findScheduleById(schedule_id).getMovie_id()); obj.put("code",0); obj.put("msg", "购票成功~"); }else { obj.put("code",200); obj.put("msg", "购票失败~"); } } return obj; } @RequestMapping("applyForRefund") @ResponseBody public JSONObject applyForRefund(@RequestParam("order_id")String order_id) { JSONObject obj = new JSONObject(); Integer rs = orderService.updateOrderStateToRefund(order_id); if(rs > 0) { obj.put("code", 0); obj.put("msg", "退票申请已发送~"); }else { obj.put("code", 200); obj.put("msg", "操作失败~"); } return obj; } @RequestMapping("agreeForRefund") @ResponseBody public JSONObject agreeForRefund(@RequestParam("order_id")String order_id) { JSONObject obj = new JSONObject(); Integer rs = this.orderService.updateOrderStateToRefunded(order_id); if(rs > 0) { Order order = this.orderService.findOrderById(order_id); int price = order.getOrder_price(); long movie_id = order.getOrder_schedule().getMovie_id(); Integer rs2 = this.movieService.changeMovieBoxOffice((float)price/10000, movie_id); obj.put("code", 0); obj.put("msg", "退票成功"); }else { obj.put("code", 200); obj.put("msg", "退票失败"); } return obj; } } ================================================ FILE: src/main/java/com/controller/ScheduleController.java ================================================ package com.controller; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSONObject; import com.entity.Cinema; import com.entity.Hall; import com.entity.Movie; import com.entity.Order; import com.entity.Schedule; import com.github.pagehelper.PageInfo; import com.service.ICinemaService; import com.service.IHallService; import com.service.IMovieService; import com.service.IScheduleService; @Controller @RequestMapping("/schedule") public class ScheduleController { @Resource private IScheduleService scheduleService; @Resource private IMovieService movieService; @Resource private ICinemaService cinemaService; @Resource private IHallService hallService; @RequestMapping("findScheduleById") @ResponseBody public JSONObject findScheduleById(@RequestParam("schedule_id")long schedule_id) { JSONObject obj = new JSONObject(); Schedule schedule = scheduleService.findScheduleById(schedule_id); obj.put("code", 0); obj.put("data",schedule); return obj; } @RequestMapping("findAllScheduleByState") @ResponseBody public JSONObject findAllScheduleByState(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,@RequestParam("schedule_state")int schedule_state) { JSONObject obj = new JSONObject(); PageInfo info = scheduleService.findAllScheduleByState(page, limit, schedule_state); ArrayList incomeArr = new ArrayList(); for(int j = 0;j < info.getList().size();j++) { List orderList = info.getList().get(j).getOrderList(); int income = 0; for(int i = 0;i < orderList.size();i++) { income += orderList.get(i).getOrder_price(); } incomeArr.add(income); } obj.put("code", 0); obj.put("count", info.getTotal()); obj.put("data", info.getList()); obj.put("income", incomeArr); return obj; } @RequestMapping("findAllSchedule") @ResponseBody public JSONObject findAllSchedule(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit) { JSONObject obj = new JSONObject(); PageInfo info = scheduleService.findAllSchedule(page, limit); List movieList = movieService.findAllMovies(1); List cinemaList = cinemaService.findAllCinemas(); ArrayList movieArr = new ArrayList(); ArrayList incomeArr = new ArrayList(); for(int j = 0;j < info.getList().size();j++) { List orderList = info.getList().get(j).getOrderList(); int income = 0; for(int i = 0;i < orderList.size();i++) { income += orderList.get(i).getOrder_price(); } incomeArr.add(income); } for(int i = 0;i < movieList.size();i++) { movieArr.add(movieList.get(i).getMovie_cn_name()); } ArrayList cinema = new ArrayList<>(); for(int i = 0;i < cinemaList.size();i++) { JSONObject cinemaObj = new JSONObject(); List hallList = hallService.findHallByCinemaId(cinemaList.get(i).getCinema_id()); ArrayList hallArr = new ArrayList(); for(int j = 0;j < hallList.size();j++) { hallArr.add(hallList.get(j).getHall_name()); } cinemaObj.put(cinemaList.get(i).getCinema_name(), hallList); cinema.add(cinemaObj); } obj.put("code", 0); obj.put("count", info.getTotal()); obj.put("data", info.getList()); obj.put("movieName", movieArr); obj.put("cinema", cinema); obj.put("income", incomeArr); return obj; } @RequestMapping("findScheduleByMovieName") @ResponseBody public JSONObject findScheduleByMovieName(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,@RequestParam("movie_name")String movie_name) { JSONObject obj = new JSONObject(); PageInfo info = scheduleService.findScheduleByMovieName(page,limit,movie_name); ArrayList incomeArr = new ArrayList(); for(int j = 0;j < info.getList().size();j++) { List orderList = info.getList().get(j).getOrderList(); int income = 0; for(int i = 0;i < orderList.size();i++) { income += orderList.get(i).getOrder_price(); } incomeArr.add(income); } obj.put("code", 0); obj.put("count", info.getTotal()); obj.put("data", info.getList()); obj.put("income", incomeArr); return obj; } @RequestMapping("findOffScheduleByMovieName") @ResponseBody public JSONObject findOffScheduleByMovieName(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,@RequestParam("movie_name")String movie_name) { JSONObject obj = new JSONObject(); PageInfo info = scheduleService.findOffScheduleByMovieName(page, limit, movie_name); ArrayList incomeArr = new ArrayList(); for(int j = 0;j < info.getList().size();j++) { List orderList = info.getList().get(j).getOrderList(); int income = 0; for(int i = 0;i < orderList.size();i++) { income += orderList.get(i).getOrder_price(); } incomeArr.add(income); } obj.put("code", 0); obj.put("count", info.getTotal()); obj.put("data", info.getList()); obj.put("income", incomeArr); return obj; } @RequestMapping("findScheduleByCinemaAndMovie") @ResponseBody public JSONObject findScheduleByCinemaAndMovie(@RequestParam("cinema_id")long cinema_id,@RequestParam("movie_id")long movie_id) { JSONObject obj = new JSONObject(); List list = scheduleService.findScheduleByCineamIdAndMovieId(cinema_id, movie_id); obj.put("code",0); obj.put("count",list.size()); obj.put("data", list); return obj; } @RequestMapping("addSchedule") @ResponseBody public JSONObject addSchedule(@RequestParam("movie_name")String movie_name,@RequestParam("hall_name")String hall_name,@RequestParam("cinema_name")String cinema_name, @RequestParam("schedule_price")int schedule_price,@RequestParam("schedule_startTime")String schedule_startTime) { JSONObject obj = new JSONObject(); Schedule schedule = new Schedule(); Hall hall = this.hallService.findHallByCinemaAndHallName(cinema_name, hall_name); schedule.setMovie_id(this.movieService.findMovieByName(movie_name).getMovie_id()); schedule.setHall_id(hall.getHall_id()); schedule.setSchedule_price(schedule_price); schedule.setSchedule_startTime(schedule_startTime); schedule.setSchedule_remain(hall.getHall_capacity()); Integer rs = this.scheduleService.addSchedule(schedule); if(rs > 0) { obj.put("code", 0); obj.put("mgs", "增加成功~"); }else { obj.put("code", 200); obj.put("mgs", "增加失败~"); } return obj; } @RequestMapping("updateSchedulePrice") @ResponseBody public JSONObject updateSchedulePrice(@RequestParam("schedule_id")long schedule_id,@RequestParam("schedule_price")int schedule_price) { JSONObject obj = new JSONObject(); Schedule schedule = new Schedule(); schedule.setSchedule_id(schedule_id); schedule.setSchedule_price(schedule_price); Integer rs = this.scheduleService.updateSchedule(schedule); if(rs > 0) { obj.put("code", 0); obj.put("mgs", "修改成功~"); }else { obj.put("code", 200); obj.put("mgs", "修改失败~"); } return obj; } @RequestMapping("offlineSchedule") @ResponseBody public JSONObject offlineSchedule(@RequestParam("schedule_id")long schedule_id) { JSONObject obj = new JSONObject(); Integer rs = this.scheduleService.deleteSchedule(schedule_id); if(rs > 0) { obj.put("code", 0); obj.put("mgs", "下架成功~"); }else { obj.put("code", 200); obj.put("mgs", "下架失败~"); } return obj; } /** * 测试类Api 根据电影id找到所有放映该电影的影院列表 * @param movie_id * @return */ @RequestMapping("findCinemasByMovieId") @ResponseBody public JSONObject findCinemasByMovieId(@RequestParam("movie_id")long movie_id) { JSONObject obj = new JSONObject(); List list = this.cinemaService.findCinemasByMovieId(movie_id); obj.put("code", 0); obj.put("count", list.size()); obj.put("data", list); return obj; } /** * 测试专用api */ @RequestMapping("testHall") @ResponseBody public JSONObject testHall(@RequestParam("hall_name")String hall_name,@RequestParam("cinema_name")String cinema_name) { Hall hall = this.hallService.findHallByCinemaAndHallName(cinema_name, hall_name); JSONObject obj = new JSONObject(); obj.put("data", hall); return obj; } } ================================================ FILE: src/main/java/com/controller/UserController.java ================================================ package com.controller; import java.io.File; import java.io.IOException; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.entity.User; import com.github.pagehelper.PageInfo; import com.service.IUserService; import com.util.UUIDUtil; /** * 用户管理模块 * update: 2019年7月9日17:18:50 * @author Wxj */ @Controller @RequestMapping("/user") public class UserController { //@Autowired @Resource private IUserService userService; @RequestMapping("login") @ResponseBody public JSONObject login(String user_name,String user_pwd,HttpServletRequest request) { JSONObject obj = new JSONObject(); User user = userService.login(user_name, user_pwd); if(user != null) { HttpSession session = request.getSession(); session.setAttribute("user", user); if(user.getUser_role() == 0) { obj.put("msg", "usersuccess"); obj.put("data", user); return obj; }else { obj.put("msg", "adminsuccess"); obj.put("data", user); return obj; } } obj.put("msg", "fail"); return obj; } @RequestMapping("logout") @ResponseBody public String logout(HttpServletRequest request) { HttpSession session = request.getSession(); session.removeAttribute("user"); return "index"; } @RequestMapping("register") @ResponseBody public String register(User user) { List list = userService.findUserByName(user.getUser_name()); if(list.size() > 0) { return "fail"; }else { Integer rs = userService.addUser(user); if(rs > 0) { return "success"; }else { return "fail"; } } } @RequestMapping("updateUser") @ResponseBody public String updateUser(User user) { Integer rs = userService.updateUserInfo(user); if(rs > 0) { return "success"; }else { return "fail"; } } @RequestMapping("modifyUserPwd") @ResponseBody public String modifyUserPwd(@RequestParam("oldPwd")String oldPwd,@RequestParam("newPwd")String newPwd,HttpServletRequest request) { HttpSession session = request.getSession(); User user = (User)session.getAttribute("user"); if(user.getUser_pwd().equals(oldPwd)) { user.setUser_pwd(newPwd); userService.updateUserInfo(user); session.removeAttribute("user"); return "success"; }else { return "fail"; } } @RequestMapping("findAllUser") @ResponseBody public JSONObject findAllUser(@RequestParam(value="page",defaultValue="1")Integer page,@RequestParam(value="limit",defaultValue="10")Integer limit,String keyword) { PageInfo info = userService.findAllUserBySplitPage(page, limit, keyword); JSONObject obj = new JSONObject(); obj.put("msg", ""); obj.put("code", 0); obj.put("count", info.getTotal()); obj.put("data", info.getList()); return obj; } @RequestMapping("findAllUserInfos") @ResponseBody public JSONObject findAllUserInfos() { JSONObject obj = new JSONObject(); List list = userService.findAllUserInfos(); obj.put("msg",""); obj.put("code",0); obj.put("count",list.size()); obj.put("data", list); return obj; } @RequestMapping("findUserInfosByName") @ResponseBody public JSONObject findUserInfosByName(@RequestParam("user_name")String user_name) { JSONObject obj = new JSONObject(); List list = userService.findUserLikeName(user_name); obj.put("msg",""); obj.put("code",0); obj.put("count",list.size()); obj.put("data", list); return obj; } @RequestMapping("/uploadHeadImg") @ResponseBody public JSONObject uploadHeadImg(@RequestParam(value="file",required=false) MultipartFile file,User user,HttpServletRequest request) throws IOException { JSONObject obj = new JSONObject(); if(file != null) { String str = file.getOriginalFilename(); System.out.println("file:"+str); String name = UUIDUtil.getUUID() + str.substring(str.lastIndexOf(".")); System.out.println("name:"+name); String path = request.getServletContext().getRealPath("/upload/head") + "/" + name; System.out.println("path:"+path); String filePath = "../upload/head/" + name; user.setUser_headImg(filePath); file.transferTo(new File(path)); System.out.println("文件写入成功,Path:" + path); }else { user.setUser_headImg(this.userService.findUserById(user.getUser_id()).getUser_headImg()); user.setUser_pwd(this.userService.findUserById(user.getUser_id()).getUser_pwd()); } Integer rs = userService.updateUserInfo(user); if(rs > 0) { obj.put("code", 0); obj.put("msg", ""); obj.put("data",user); }else { obj.put("code", 200); obj.put("msg", ""); } return obj; } /** * 测试Api * @param file * @param user_name * @param request * @return */ @RequestMapping("test") @ResponseBody public JSONObject uploadImg(@RequestParam(value="file",required=false) MultipartFile file,@RequestParam("user_name")String user_name,HttpServletRequest request) { System.out.println(file); JSONObject obj = new JSONObject(); if(file == null) { System.out.println("null"); }else { String str = file.getOriginalFilename(); System.out.println("file:"+str); String name = UUIDUtil.getUUID() + str.substring(str.lastIndexOf(".")); System.out.println("name:"+name); String path = request.getServletContext().getRealPath("/upload/head") + "/" + name; System.out.println("path:"+path); String filePath = "upload/head/" + name; System.out.println(filePath); try { file.transferTo(new File(path)); System.out.println("文件写入成功,Path:" + path); }catch(IOException ex) { ex.printStackTrace(); } obj.put("file", name); obj.put("user_name",user_name); } return obj; } } ================================================ FILE: src/main/java/com/entity/Cinema.java ================================================ package com.entity; import java.util.List; /** * 电影院表实体对象 * @author Wxj */ public class Cinema { private long cinema_id; private String cinema_name; //影院名称 private String cinema_address; //影院地址 private List hallList; //所有的放映厅集合 public long getCinema_id() { return cinema_id; } public void setCinema_id(long cinema_id) { this.cinema_id = cinema_id; } public String getCinema_name() { return cinema_name; } public void setCinema_name(String cinema_name) { this.cinema_name = cinema_name; } public String getCinema_address() { return cinema_address; } public void setCinema_address(String cinema_address) { this.cinema_address = cinema_address; } public List getHallList() { return hallList; } public void setHallList(List hallList) { this.hallList = hallList; } } ================================================ FILE: src/main/java/com/entity/Comment.java ================================================ package com.entity; /** * 评论表实体对象 * @author Wxj */ import java.util.Date; public class Comment { private long comment_id; private long user_id; //所属用户编号 private String comment_content; //评论内容 private long movie_id; //所属电影编号 private Date comment_time; //评论时间 private User comment_user; //所属用户 public long getComment_id() { return comment_id; } public void setComment_id(long comment_id) { this.comment_id = comment_id; } public long getUser_id() { return user_id; } public void setUser_id(long user_id) { this.user_id = user_id; } public String getComment_content() { return comment_content; } public void setComment_content(String comment_content) { this.comment_content = comment_content; } public long getMovie_id() { return movie_id; } public void setMovie_id(long movie_id) { this.movie_id = movie_id; } public Date getComment_time() { return comment_time; } public void setComment_time(Date comment_time) { this.comment_time = comment_time; } public User getComment_user() { return comment_user; } public void setComment_user(User comment_user) { this.comment_user = comment_user; } } ================================================ FILE: src/main/java/com/entity/Hall.java ================================================ package com.entity; import java.util.List; /** * 放映厅表实体对象 * @author Wxj */ public class Hall { private long hall_id; private String hall_name; //放映厅名称 private int hall_capacity; //放映厅容量 private long cinema_id; //所属影院编号 private Cinema hall_cinema; //所属影院 private List ScheduleList; //所有的电影场次集合 public long getHall_id() { return hall_id; } public void setHall_id(long hall_id) { this.hall_id = hall_id; } public List getScheduleList() { return ScheduleList; } public void setScheduleList(List scheduleList) { ScheduleList = scheduleList; } public Cinema getHall_cinema() { return hall_cinema; } public void setHall_cinema(Cinema hall_cinema) { this.hall_cinema = hall_cinema; } public String getHall_name() { return hall_name; } public void setHall_name(String hall_name) { this.hall_name = hall_name; } public int getHall_capacity() { return hall_capacity; } public void setHall_capacity(int hall_capacity) { this.hall_capacity = hall_capacity; } public long getCinema_id() { return cinema_id; } public void setCinema_id(long cinema_id) { this.cinema_id = cinema_id; } } ================================================ FILE: src/main/java/com/entity/Movie.java ================================================ package com.entity; import java.sql.Date; //yyyy-mm-dd import java.util.List; /** * 电影信息实体对象 * @author Wxj */ public class Movie { private long movie_id; private String movie_cn_name; private String movie_fg_name; private String movie_actor; //演职人员 private String movie_director; //导演 private String movie_detail; //电影详情 private String movie_duration; //电影时长 private String movie_type; //电影类型 private float movie_score; //电影评分 private float movie_boxOffice; //票房 private long movie_commentCount; //电影参评人数 private Date movie_releaseDate; //上映时间 private String movie_country; //制片地区 private String movie_picture; //电影海报地址 private int movie_state; //电影状态 默认1 1:在线 0:下架 private List commentList; //所有的评论信息 public long getMovie_id() { return movie_id; } public void setMovie_id(long movie_id) { this.movie_id = movie_id; } public String getMovie_cn_name() { return movie_cn_name; } public int getMovie_state() { return movie_state; } public void setMovie_state(int movie_state) { this.movie_state = movie_state; } public void setMovie_cn_name(String movie_cn_name) { this.movie_cn_name = movie_cn_name; } public String getMovie_fg_name() { return movie_fg_name; } public void setMovie_fg_name(String movie_fg_name) { this.movie_fg_name = movie_fg_name; } public String getMovie_actor() { return movie_actor; } public void setMovie_actor(String movie_actor) { this.movie_actor = movie_actor; } public String getMovie_director() { return movie_director; } public void setMovie_director(String movie_director) { this.movie_director = movie_director; } public String getMovie_detail() { return movie_detail; } public void setMovie_detail(String movie_detail) { this.movie_detail = movie_detail; } public String getMovie_duration() { return movie_duration; } public void setMovie_duration(String movie_duration) { this.movie_duration = movie_duration; } public String getMovie_type() { return movie_type; } public void setMovie_type(String movie_type) { this.movie_type = movie_type; } public float getMovie_score() { return movie_score; } public void setMovie_score(float movie_score) { this.movie_score = movie_score; } public float getMovie_boxOffice() { return movie_boxOffice; } public void setMovie_boxOffice(float movie_boxOffice) { this.movie_boxOffice = movie_boxOffice; } public long getMovie_commentCount() { return movie_commentCount; } public void setMovie_commentCount(long movie_commentCount) { this.movie_commentCount = movie_commentCount; } public Date getReleaseDate() { return movie_releaseDate; } public void setReleaseDate(Date releaseDate) { this.movie_releaseDate = releaseDate; } public String getMovie_country() { return movie_country; } public void setMovie_country(String movie_country) { this.movie_country = movie_country; } public String getMovie_picture() { return movie_picture; } public void setMovie_picture(String movie_picture) { this.movie_picture = movie_picture; } public List getCommentList() { return commentList; } public void setCommentList(List commentList) { this.commentList = commentList; } } ================================================ FILE: src/main/java/com/entity/Order.java ================================================ package com.entity; import java.util.Date; import java.util.List; /** * 订单表实体对象 * @author Wxj * */ public class Order { private String order_id; private long user_id; //所属用户编号 private long schedule_id; //所属场次编号,通过schedule_id-》场次信息-》放映厅信息+电影信息 private String order_position; //电影票座位信息 private int order_state; //订单状态 0:退票中 -1:无法退票 1:已支付 2:退票成功 private int order_price; //订单价格 private Date order_time; //订单支付时间 private User order_user; //所属用户对象 private Schedule order_schedule; //所属电影场次 public String getOrder_id() { return order_id; } public void setOrder_id(String order_id) { this.order_id = order_id; } public Date getOrder_time() { return order_time; } public void setOrder_time(Date order_time) { this.order_time = order_time; } public int getOrder_price() { return order_price; } public void setOrder_price(int order_price) { this.order_price = order_price; } public long getUser_id() { return user_id; } public void setUser_id(long user_id) { this.user_id = user_id; } public long getSchedule_id() { return schedule_id; } public void setSchedule_id(long schedule_id) { this.schedule_id = schedule_id; } public String getOrder_position() { return order_position; } public void setOrder_position(String order_position) { this.order_position = order_position; } public User getOrder_user() { return order_user; } public int getOrder_state() { return order_state; } public void setOrder_state(int order_state) { this.order_state = order_state; } public void setOrder_user(User order_user) { this.order_user = order_user; } public Schedule getOrder_schedule() { return order_schedule; } public void setOrder_schedule(Schedule order_schedule) { this.order_schedule = order_schedule; } } ================================================ FILE: src/main/java/com/entity/Schedule.java ================================================ package com.entity; import java.util.Date; import java.util.List; import org.springframework.format.annotation.DateTimeFormat; /** * 场次表实体对象 * @author Wxj */ public class Schedule { private long schedule_id; private long hall_id; //所属放映厅 private long movie_id; //放映的电影编号 //@DateTimeFormat(pattern="yyyy-MM-dd") private String schedule_startTime; //电影放映时间 private int schedule_price; //售价 private int schedule_remain; //剩余座位数 private int schedule_state; //场次状态 1:上映中 0:下架 private Hall schedule_hall; //所属放映厅对象 private Movie schedule_movie; //放映的电影 private List orderList; //所有的订单集合 public long getSchedule_id() { return schedule_id; } public void setSchedule_id(long schedule_id) { this.schedule_id = schedule_id; } public int getSchedule_state() { return schedule_state; } public void setSchedule_state(int schedule_state) { this.schedule_state = schedule_state; } public Movie getSchedule_movie() { return schedule_movie; } public void setSchedule_movie(Movie schedule_movie) { this.schedule_movie = schedule_movie; } public long getHall_id() { return hall_id; } public void setHall_id(long hall_id) { this.hall_id = hall_id; } public long getMovie_id() { return movie_id; } public void setMovie_id(long movie_id) { this.movie_id = movie_id; } public String getSchedule_startTime() { return schedule_startTime; } public void setSchedule_startTime(String schedule_startTime) { this.schedule_startTime = schedule_startTime; } public int getSchedule_price() { return schedule_price; } public void setSchedule_price(int schedule_price) { this.schedule_price = schedule_price; } public int getSchedule_remain() { return schedule_remain; } public void setSchedule_remain(int schedule_remain) { this.schedule_remain = schedule_remain; } public Hall getSchedule_hall() { return schedule_hall; } public void setSchedule_hall(Hall schedule_hall) { this.schedule_hall = schedule_hall; } public List getOrderList() { return orderList; } public void setOrderList(List orderList) { this.orderList = orderList; } } ================================================ FILE: src/main/java/com/entity/User.java ================================================ package com.entity; /** * 用户表实体对象 * @author Wxj */ public class User { private long user_id; private String user_name; //用户账号 private String user_pwd; //用户密码 private String user_email; //用户邮箱 private int user_role; //用户权限 0:普通会员 1:管理员 private String user_headImg; //用户头像地址 public long getUser_id() { return user_id; } public void setUser_id(long user_id) { this.user_id = user_id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public String getUser_pwd() { return user_pwd; } public void setUser_pwd(String user_pwd) { this.user_pwd = user_pwd; } public String getUser_email() { return user_email; } public void setUser_email(String user_email) { this.user_email = user_email; } public int getUser_role() { return user_role; } public void setUser_role(int user_role) { this.user_role = user_role; } public String getUser_headImg() { return user_headImg; } public void setUser_headImg(String user_headImg) { this.user_headImg = user_headImg; } } ================================================ FILE: src/main/java/com/mapper/CinemaMapper.java ================================================ package com.mapper; import java.util.List; import org.springframework.stereotype.Repository; import com.entity.Cinema; @Repository public interface CinemaMapper { Cinema findCinemaById(long cinema_id); Integer addCinema(Cinema cinema); Integer updateCinema(Cinema cinema); Integer deleteCinema(long cinema_id); List findAllCinemas(); List findCinemasLikeName(String cinema_name); List findCinemasByMovieId(long movie_id); } ================================================ FILE: src/main/java/com/mapper/CinemaMapper.xml ================================================ select * from cinema where cinema_id = #{cinema_id} select * from cinema select * from cinema where cinema_name like '%${value}%' select distinct cinema.* from hall,schedule,cinema where hall.hall_id=schedule.hall_id and hall.cinema_id=cinema.cinema_id and schedule.movie_id = #{movie_id} insert into cinema(cinema_name,cinema_address) values(#{cinema_name},#{cinema_address}) update cinema cinema_name = #{cinema_name}, cinema_address = #{cinema_address} where cinema_id = #{cinema_id} delete from cinema where cinema_id = #{cinema_id} ================================================ FILE: src/main/java/com/mapper/CommentMapper.java ================================================ package com.mapper; import java.util.List; import org.springframework.stereotype.Repository; import com.entity.Comment; @Repository public interface CommentMapper { //用户: 修改评论、增加评论 //管理员: 删除评论、 修改评论 //查询用户的评论 Comment findCommentById(long comment_id); Integer addComemnt(Comment comment); Integer updateComment(Comment comment); Integer deleteComment(long comment_id); List findAllComments(); List findCommentsByMoiveId(long movie_id); List findCommentsByUserName(String user_name); } ================================================ FILE: src/main/java/com/mapper/CommentMapper.xml ================================================ select * from comment where comment_id = #{comment_id} select * from comment select comment.* from comment,user where comment.user_id = user.user_id and user.user_name = #{user_name} select * from comment where movie_id = #{movie_id} insert into comment(comment_content,comment_time,movie_id,user_id) values(#{comment_content},#{comment_time},#{movie_id},#{user_id}) update comment comment_content = #{comment_content}, comment_time = #{comment_time}, movie_id = #{movie_id}, user_id = #{user_id} where comment_id = #{comment_id} delete from comment where comment_id = #{comment_id} ================================================ FILE: src/main/java/com/mapper/HallMapper.java ================================================ package com.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import com.entity.Hall; @Repository public interface HallMapper { Hall findHallById(long hall_id); Hall findHallByCinemaAndHallName(@Param("cinema_name")String cinema_name,@Param("hall_name")String hall_name); Integer addHall(Hall hall); Integer updateHall(Hall hall); Integer deleteHall(long hall_id); List findHallByCinemaId(long cinema_id); List findAllHalls(); } ================================================ FILE: src/main/java/com/mapper/HallMapper.xml ================================================ select * from hall where hall_id = #{hall_id} select hall.* from hall,cinema where hall.cinema_id = cinema.cinema_id and cinema_name = #{cinema_name} and hall_name= #{hall_name} select * from hall where cinema_id = #{cinema_id} select * from hall insert into hall(hall_name,movie_id) values(hall_name,movie_id) update hall hall_name = #{hall_name}, movie_id = #{movie_id} where hall_id = #{hall_id} delete from hall where hall_id = #{hall_id} ================================================ FILE: src/main/java/com/mapper/MovieMapper.java ================================================ package com.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import com.entity.Movie; @Repository public interface MovieMapper { Movie findMovieById(long movie_id); Movie findMovieByName(String movie_cn_name); Integer addMovie(Movie movie); Integer deleteMovie(long movie_id); Integer updateMovie(Movie movie); Integer deleteMovieCommentCount(long movie_id); Integer addMovieCommentCount(long movie_id); Integer changeMovieBoxOffice(@Param("movie_boxOffice")float movie_boxOffice,@Param("movie_id")long movie_id); List findAllMovies(int movie_state); List findMoviesLikeName(String name); List findMoviesLikeType(String type); //上映时间 参评人数 评分 List sortMovieByDate(); List sortMovieByCount(); List sortMovieByScore(); //票房排序 List sortMovieByBoxOffice(); } ================================================ FILE: src/main/java/com/mapper/MovieMapper.xml ================================================ select * from movie where movie_id = #{movie_id} select * from movie where movie_cn_name = #{movie_cn_name} insert into movie(movie_cn_name,movie_fg_name,movie_actor,movie_director,movie_detail,movie_duration,movie_type,movie_score,movie_releaseDate,movie_country,movie_picture) values(#{movie_cn_name},#{movie_fg_name},#{movie_actor},#{movie_director},#{movie_detail},#{movie_duration},#{movie_type},#{movie_score},#{movie_releaseDate},#{movie_country},#{movie_picture}) update movie movie_state = 0 where movie_id = #{movie_id} update movie set movie_boxOffice = movie_boxOffice + #{movie_boxOffice} where movie_id = #{movie_id} update movie movie_cn_name = #{movie_cn_name}, movie_fg_name = #{movie_fg_name}, movie_actor = #{movie_actor}, movie_director = #{movie_director}, movie_detail = #{movie_detail}, movie_duration = #{movie_duration}, movie_type = #{movie_type}, movie_country = #{movie_country}, movie_picture = #{movie_picture} where movie_id = #{movie_id} update movie set movie_commentCount = movie_commentCount -1 where movie_id = #{movie_id} update movie set movie_commentCount = movie_commentCount +1 where movie_id = #{movie_id} select * from movie where movie_state = #{movie_state} select * from movie where movie_cn_name like '%${value}%' and movie_state = 1 select * from movie where movie_type like '%${value}%' and movie_state = 1 select * from movie where movie_state = 1 order by movie_releaseDate DESC select * from movie where movie_state = 1 order by movie_commentCount DESC select * from movie where movie_state = 1 order by movie_score DESC select * from movie where movie_state = 1 order by movie_boxOffice desc ================================================ FILE: src/main/java/com/mapper/OrderMapper.java ================================================ package com.mapper; import java.util.List; import org.springframework.stereotype.Repository; import com.entity.Order; @Repository public interface OrderMapper { Order findOrderById(String order_id); Integer addOrder(Order order); Integer updateOrderStateToRefund(String order_id); //申请退票 Integer updateOrderStateToRefunded(String order_id); //同意退票 List findRefundOrderByUserName(String user_name); List findOrdersByUserName(String user_name); List findAllOrders(); List findOrdersByScheduleId(long schedule_id); List findOrdersByState(int order_state); } ================================================ FILE: src/main/java/com/mapper/OrderMapper.xml ================================================ select * from orderinfo where order_id = #{order_id} select * from orderinfo order by order_time desc select * from orderinfo where schedule_id = #{schedule_id} and order_state != 2 order by order_time desc select * from orderinfo where order_state = #{order_state} order by order_time desc select orderinfo.* from orderinfo,user where orderinfo.user_id = user.user_id and user.user_name = #{user_name} order by order_time desc select orderinfo.* from orderinfo,user where orderinfo.user_id = user.user_id and user.user_name = #{user_name} and orderinfo.order_state = 0 order by order_time desc insert into orderinfo(order_id,order_position,schedule_id,user_id,order_price,order_time) values(#{order_id},#{order_position},#{schedule_id},#{user_id},#{order_price},#{order_time}) update orderinfo set order_state = 0 where order_id = #{order_id} update orderinfo set order_state = 2 where order_id = #{order_id} ================================================ FILE: src/main/java/com/mapper/ScheduleMapper.java ================================================ package com.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import com.entity.Schedule; @Repository public interface ScheduleMapper { Schedule findScheduleById(long schedule_id); Integer addSchedule(Schedule schedule); Integer updateSchedule(Schedule schedule); Integer deleteSchedule(long schedule_id); Integer addScheduleRemain(long schedule_id); Integer delScheduleRemain(long schedule_id); List findScheduleByMovieName(String movie_name); List findOffScheduleByMovieName(String movie_name); List findScheduleByState(int schedule_state); List findAllSchedule(); List findScheduleByCinemaAndMovie(@Param("cinema_id")long cinema_id,@Param("movie_id")long movie_id); List findScheduleByCinemaAndMovieAndHall(@Param("hall_id")long hall_id,@Param("cinema_id")long cinema_id,@Param("movie_id")long movie_id); } ================================================ FILE: src/main/java/com/mapper/ScheduleMapper.xml ================================================ select * from schedule where schedule_id = #{schedule_id} select * from schedule where schedule_state = #{schedule_state} select schedule.* from schedule,hall where schedule.hall_id=hall.hall_id and hall.cinema_id = #{cinema_id} and movie_id = #{movie_id} and schedule_state = 1 select schedule.* from schedule,hall where schedule.hall_id=hall.hall_id and hall.cinema_id = #{cinema_id} and movie_id = #{movie_id} and schedule.hall_id = #{hall_id} and schedule_state = 1 select * from schedule select schedule.* from schedule,movie where schedule.movie_id = movie.movie_id and schedule.schedule_state = 1 and movie.movie_cn_name like '%${value}%' select schedule.* from schedule,movie where schedule.movie_id = movie.movie_id and schedule.schedule_state = 0 and movie.movie_cn_name like '%${value}%' insert into schedule(hall_id,movie_id,schedule_price,schedule_remain,schedule_startTime) values(#{hall_id},#{movie_id},#{schedule_price},#{schedule_remain},#{schedule_startTime}) update schedule schedule_price = #{schedule_price} where schedule_id = #{schedule_id} update schedule set schedule_state = 0 where schedule_id = #{schedule_id} update schedule set schedule_remain = schedule_remain + 1 where schedule_id = #{schedule_id} update schedule set schedule_remain = schedule_remain - 1 where schedule_id = #{schedule_id} ================================================ FILE: src/main/java/com/mapper/UserMapper.java ================================================ package com.mapper; import java.util.List; import org.springframework.stereotype.Repository; import com.entity.User; @Repository public interface UserMapper { User findUserById(long user_id); Integer addUser(User user); Integer deleteUser(long user_id); Integer updateUser(User user); List findAllUser(); List findUserByName(String name); List findUserLikeName(String name); } ================================================ FILE: src/main/java/com/mapper/UserMapper.xml ================================================ select * from user where user_id = #{id} select * from user select * from user where user_name = #{name} select * from user where user_name like '%${value}%' insert into user(user_name,user_pwd,user_email) values(#{user_name},#{user_pwd},#{user_email}) update user user_name = #{user_name}, user_pwd = #{user_pwd}, user_email = #{user_email}, user_headImg = #{user_headImg} where user_id = #{user_id} ================================================ FILE: src/main/java/com/service/ICinemaService.java ================================================ package com.service; import java.util.List; import com.entity.Cinema; public interface ICinemaService { Cinema findCinemaById(long cinema_id); Integer addCinema(Cinema cinema); Integer updateCinema(Cinema cinema); Integer deleteCinema(long cinema_id); List findAllCinemas(); List findCinemasLikeName(String cinema_name); List findCinemasByMovieId(long movie_id); } ================================================ FILE: src/main/java/com/service/ICommentService.java ================================================ package com.service; import java.util.List; import com.entity.Comment; import com.github.pagehelper.PageInfo; public interface ICommentService { Comment findCommentById(long comment_id); Integer addComemnt(Comment comment); Integer updateComment(Comment comment); Integer deleteComment(long comment_id); List findAllComments(); List findCommentsByMovieId(long movie_id); PageInfo findAllCommentsBySplitPage(Integer page,Integer limit,String keyword); PageInfo findCommentsByUserName(Integer page,Integer limit,String user_name); } ================================================ FILE: src/main/java/com/service/IHallService.java ================================================ package com.service; import java.util.List; import com.entity.Hall; public interface IHallService { Hall findHallById(long hall_id); Hall findHallByCinemaAndHallName(String cinema_name,String hall_name); Integer addHall(Hall hall); Integer updateHall(Hall hall); Integer deleteHall(long hall_id); List findHallByCinemaId(long cinema_id); List findAllHalls(); } ================================================ FILE: src/main/java/com/service/IMovieService.java ================================================ package com.service; import java.util.List; import com.entity.Movie; public interface IMovieService { Movie findMovieById(long movie_id); Movie findMovieByName(String movie_cn_name); Integer addMovie(Movie movie); Integer deleteMovie(long movie_id); Integer updateMovie(Movie movie); Integer delCommentCount(long movie_id); Integer changeMovieBoxOffice(float price,long movie_id); Integer addCommentCount(long movie_id); List findAllMovies(int movie_state); List findMoviesLikeName(String name); List findMoviesLikeType(String type); //上映时间 参评人数 评分 List sortMovieByDate(); List sortMovieByCount(); List sortMovieByScore(); List sortMovieByBoxOffice(); } ================================================ FILE: src/main/java/com/service/IOrderService.java ================================================ package com.service; import java.util.List; import com.entity.Order; import com.github.pagehelper.PageInfo; public interface IOrderService { Order findOrderById(String order_id); Integer addOrder(Order order); Integer updateOrderStateToRefund(String order_id); //申请退票 Integer updateOrderStateToRefunded(String order_id); //同意退票 PageInfo findOrdersByUserName(Integer page,Integer limit,String user_name); List findAllOrders(); List findRefundOrderByUserName(String user_name); PageInfo findOrdersByState(Integer page,Integer limit,int order_state); PageInfo findAllOrdersBySplitPage(Integer page,Integer limit,String keyword); } ================================================ FILE: src/main/java/com/service/IScheduleService.java ================================================ package com.service; import java.util.List; import com.entity.Schedule; import com.github.pagehelper.PageInfo; public interface IScheduleService { Schedule findScheduleById(long schedule_id); Integer addSchedule(Schedule schedule); Integer updateSchedule(Schedule schedule); Integer deleteSchedule(long schedule_id); Integer addScheduleRemain(long schedule_id); Integer delScheduleRemain(long schedule_id); PageInfo findScheduleByMovieName(Integer page,Integer limit,String movie_name); PageInfo findOffScheduleByMovieName(Integer page,Integer limit,String movie_name); PageInfo findAllSchedule(Integer page,Integer limit); PageInfo findAllScheduleByState(Integer page,Integer limit,int schedule_state); List findScheduleByCinemaAndMovie(long cinema_id,long movie_id); List findScheduleByCineamIdAndMovieId(long cinema_id,long movie_id); } ================================================ FILE: src/main/java/com/service/IUserService.java ================================================ package com.service; import java.util.List; import com.entity.User; import com.github.pagehelper.PageInfo; public interface IUserService { User login(String user_name,String user_pwd); Integer updateUserInfo(User user); User findUserById(long user_id); List findUserByName(String name); List findUserLikeName(String name); Integer addUser(User user); Integer deleteUser(long user_id); List findAllUserInfos(); PageInfo findAllUserBySplitPage(Integer page,Integer limit,String keyword); } ================================================ FILE: src/main/java/com/service/imp/CinemaServiceImp.java ================================================ package com.service.imp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Cinema; import com.entity.Hall; import com.entity.Schedule; import com.mapper.CinemaMapper; import com.mapper.HallMapper; import com.mapper.ScheduleMapper; import com.service.ICinemaService; @Service public class CinemaServiceImp implements ICinemaService{ @Autowired private CinemaMapper cinemaMapper; @Autowired private HallMapper hallMapper; @Autowired private ScheduleMapper scheduleMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Cinema findCinemaById(long cinema_id) { Cinema cinema = this.cinemaMapper.findCinemaById(cinema_id); List list = this.hallMapper.findHallByCinemaId(cinema_id); cinema.setHallList(list); return cinema; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findCinemasByMovieId(long movie_id) { List cinemaList = this.cinemaMapper.findCinemasByMovieId(movie_id); for(Cinema cinema : cinemaList) { List hallList = this.hallMapper.findHallByCinemaId(cinema.getCinema_id()); for(Hall hall : hallList) { hall.setScheduleList(this.scheduleMapper.findScheduleByCinemaAndMovieAndHall(hall.getHall_id(), hall.getCinema_id(), movie_id)); } cinema.setHallList(hallList); } return cinemaList; } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addCinema(Cinema cinema) { return this.cinemaMapper.addCinema(cinema); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateCinema(Cinema cinema) { return this.cinemaMapper.updateCinema(cinema); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteCinema(long cinema_id) { return this.cinemaMapper.deleteCinema(cinema_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllCinemas() { List list = this.cinemaMapper.findAllCinemas(); for(Cinema cinema : list) { List hallList = this.hallMapper.findHallByCinemaId(cinema.getCinema_id()); cinema.setHallList(hallList); } return list; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findCinemasLikeName(String cinema_name) { List list = this.cinemaMapper.findCinemasLikeName(cinema_name); for(Cinema cinema : list) { List hallList = this.hallMapper.findHallByCinemaId(cinema.getCinema_id()); cinema.setHallList(hallList); } return list; } } ================================================ FILE: src/main/java/com/service/imp/CommentServiceImp.java ================================================ package com.service.imp; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Comment; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mapper.CommentMapper; import com.service.ICommentService; @Service public class CommentServiceImp implements ICommentService{ @Autowired private CommentMapper commentMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Comment findCommentById(long comment_id) { return this.commentMapper.findCommentById(comment_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addComemnt(Comment comment) { return this.commentMapper.addComemnt(comment); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateComment(Comment comment) { return this.commentMapper.updateComment(comment); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteComment(long comment_id) { return this.commentMapper.deleteComment(comment_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllComments() { return this.commentMapper.findAllComments(); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findAllCommentsBySplitPage(Integer page, Integer limit, String keyword) { PageHelper.startPage(page, limit); List list = new ArrayList(); if(keyword != null && !keyword.trim().equals("")) { System.out.println("keyword:"+keyword); list = this.commentMapper.findCommentsByUserName(keyword); }else { //System.out.println("keyword:"+keyword); list = this.commentMapper.findAllComments(); } PageInfo info = new PageInfo(list); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findCommentsByUserName(Integer page, Integer limit,String user_name) { PageHelper.startPage(page,limit); List list = new ArrayList(); list = this.commentMapper.findCommentsByUserName(user_name); PageInfo info = new PageInfo(list); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findCommentsByMovieId(long movie_id) { return this.commentMapper.findCommentsByMoiveId(movie_id); } } ================================================ FILE: src/main/java/com/service/imp/HallServiceImp.java ================================================ package com.service.imp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Hall; import com.mapper.CinemaMapper; import com.mapper.HallMapper; import com.service.IHallService; @Service public class HallServiceImp implements IHallService{ @Autowired private HallMapper hallMapper; @Autowired private CinemaMapper cinemaMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Hall findHallById(long hall_id) { Hall hall = this.hallMapper.findHallById(hall_id); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); return hall; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Hall findHallByCinemaAndHallName(String cinema_name, String hall_name) { return this.hallMapper.findHallByCinemaAndHallName(cinema_name, hall_name); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addHall(Hall hall) { return this.hallMapper.addHall(hall); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateHall(Hall hall) { return this.hallMapper.updateHall(hall); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteHall(long hall_id) { return this.hallMapper.deleteHall(hall_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findHallByCinemaId(long cinema_id) { List list = this.hallMapper.findHallByCinemaId(cinema_id); for(Hall hall : list) { hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); } return list; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllHalls() { List list = this.hallMapper.findAllHalls(); for(Hall hall : list) { hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); } return list; } } ================================================ FILE: src/main/java/com/service/imp/MovieServiceImp.java ================================================ package com.service.imp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Comment; import com.entity.Movie; import com.mapper.CommentMapper; import com.mapper.MovieMapper; import com.mapper.UserMapper; import com.service.IMovieService; @Service public class MovieServiceImp implements IMovieService{ @Autowired private MovieMapper movieMapper; @Autowired private CommentMapper commentMapper; @Autowired private UserMapper userMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Movie findMovieById(long movie_id) { Movie movie = this.movieMapper.findMovieById(movie_id); List list = this.commentMapper.findCommentsByMoiveId(movie_id); for(Comment comment : list) { comment.setComment_user(this.userMapper.findUserById(comment.getUser_id())); } movie.setCommentList(list); return movie; } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer changeMovieBoxOffice(float price, long movie_id) { return this.movieMapper.changeMovieBoxOffice(price, movie_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Movie findMovieByName(String movie_cn_name) { return this.movieMapper.findMovieByName(movie_cn_name); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addCommentCount(long movie_id) { return this.movieMapper.addMovieCommentCount(movie_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer delCommentCount(long movie_id) { return this.movieMapper.deleteMovieCommentCount(movie_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addMovie(Movie movie) { return this.movieMapper.addMovie(movie); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteMovie(long movie_id) { return this.movieMapper.deleteMovie(movie_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateMovie(Movie movie) { return this.movieMapper.updateMovie(movie); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllMovies(int movie_state) { return this.movieMapper.findAllMovies(movie_state); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findMoviesLikeName(String name) { return this.movieMapper.findMoviesLikeName(name); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findMoviesLikeType(String type) { return this.movieMapper.findMoviesLikeType(type); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List sortMovieByDate() { return this.movieMapper.sortMovieByDate(); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List sortMovieByCount() { return this.movieMapper.sortMovieByCount(); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List sortMovieByScore() { return this.movieMapper.sortMovieByScore(); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List sortMovieByBoxOffice() { return this.movieMapper.sortMovieByBoxOffice(); } } ================================================ FILE: src/main/java/com/service/imp/OrderServiceImp.java ================================================ package com.service.imp; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Hall; import com.entity.Order; import com.entity.Schedule; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mapper.CinemaMapper; import com.mapper.HallMapper; import com.mapper.MovieMapper; import com.mapper.OrderMapper; import com.mapper.ScheduleMapper; import com.mapper.UserMapper; import com.service.IOrderService; @Service public class OrderServiceImp implements IOrderService{ @Autowired private OrderMapper orderMapper; @Autowired private UserMapper userMapper; @Autowired private ScheduleMapper scheduleMapper; @Autowired private HallMapper hallMapper; @Autowired private MovieMapper movieMapper; @Autowired private CinemaMapper cinemaMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Order findOrderById(String order_id) { Order order = this.orderMapper.findOrderById(order_id); if(order != null) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); }else { order = null; } return order; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findRefundOrderByUserName(String user_name) { List list = this.orderMapper.findRefundOrderByUserName(user_name); if(list.size() > 0) { for(Order order : list) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); } }else { list = null; } return list; } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addOrder(Order order) { return this.orderMapper.addOrder(order); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateOrderStateToRefund(String order_id) { return this.orderMapper.updateOrderStateToRefund(order_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateOrderStateToRefunded(String order_id) { return this.orderMapper.updateOrderStateToRefunded(order_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findOrdersByUserName(Integer page,Integer limit,String user_name) { PageHelper.startPage(page, limit); List list = this.orderMapper.findOrdersByUserName(user_name); for(Order order : list) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); } PageInfo info = new PageInfo(list); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllOrders() { List list = this.orderMapper.findAllOrders(); for(Order order : list) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); } return list; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findOrdersByState(Integer page,Integer limit,int order_state) { PageHelper.startPage(page, limit); List list = this.orderMapper.findOrdersByState(order_state); for(Order order : list) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); } PageInfo info = new PageInfo(list); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findAllOrdersBySplitPage(Integer page, Integer limit, String keyword) { PageHelper.startPage(page, limit); List list = new ArrayList(); if(keyword != null && !keyword.trim().equals("")) { list = this.orderMapper.findOrdersByUserName(keyword); }else { list = this.orderMapper.findAllOrders(); } for(Order order : list) { order.setOrder_user(this.userMapper.findUserById(order.getUser_id())); Schedule schedule = this.scheduleMapper.findScheduleById(order.getSchedule_id()); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); order.setOrder_schedule(schedule); } PageInfo info = new PageInfo(list); return info; } } ================================================ FILE: src/main/java/com/service/imp/ScheduleServiceImp.java ================================================ package com.service.imp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.Hall; import com.entity.Order; import com.entity.Schedule; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mapper.CinemaMapper; import com.mapper.HallMapper; import com.mapper.MovieMapper; import com.mapper.OrderMapper; import com.mapper.ScheduleMapper; import com.service.IScheduleService; @Service public class ScheduleServiceImp implements IScheduleService{ @Autowired private ScheduleMapper scheduleMapper; @Autowired private HallMapper hallMapper; @Autowired private MovieMapper movieMapper; @Autowired private OrderMapper orderMapper; @Autowired private CinemaMapper cinemaMapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public Schedule findScheduleById(long schedule_id) { Schedule schedule = this.scheduleMapper.findScheduleById(schedule_id); Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); List list = this.orderMapper.findOrdersByScheduleId(schedule_id); schedule.setOrderList(list); return schedule; } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addSchedule(Schedule schedule) { return this.scheduleMapper.addSchedule(schedule); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateSchedule(Schedule schedule) { return this.scheduleMapper.updateSchedule(schedule); } /** * 场次下架功能 而非删除 */ @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteSchedule(long schedule_id) { return this.scheduleMapper.deleteSchedule(schedule_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addScheduleRemain(long schedule_id) { return this.scheduleMapper.addScheduleRemain(schedule_id); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer delScheduleRemain(long schedule_id) { return this.scheduleMapper.delScheduleRemain(schedule_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findScheduleByMovieName(Integer page,Integer limit,String movie_name) { PageHelper.startPage(page, limit); List schedules = this.scheduleMapper.findScheduleByMovieName(movie_name); for(Schedule schedule: schedules) { Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); List list = this.orderMapper.findOrdersByScheduleId(schedule.getSchedule_id()); schedule.setOrderList(list); } PageInfo info = new PageInfo(schedules); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findOffScheduleByMovieName(Integer page, Integer limit, String movie_name) { PageHelper.startPage(page, limit); List schedules = this.scheduleMapper.findOffScheduleByMovieName(movie_name); for(Schedule schedule: schedules) { Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); List list = this.orderMapper.findOrdersByScheduleId(schedule.getSchedule_id()); schedule.setOrderList(list); } PageInfo info = new PageInfo(schedules); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findAllScheduleByState(Integer page,Integer limit,int schedule_state) { PageHelper.startPage(page, limit); List schedules = this.scheduleMapper.findScheduleByState(schedule_state); for(Schedule schedule: schedules) { Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); List list = this.orderMapper.findOrdersByScheduleId(schedule.getSchedule_id()); schedule.setOrderList(list); } PageInfo info = new PageInfo(schedules); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findAllSchedule(Integer page,Integer limit) { PageHelper.startPage(page, limit); List schedules = this.scheduleMapper.findAllSchedule(); for(Schedule schedule: schedules) { Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); List list = this.orderMapper.findOrdersByScheduleId(schedule.getSchedule_id()); schedule.setOrderList(list); } PageInfo info = new PageInfo(schedules); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findScheduleByCinemaAndMovie(long cinema_id, long movie_id) { return this.scheduleMapper.findScheduleByCinemaAndMovie(cinema_id, movie_id); } /** * selectSeat页面提供接口 */ @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findScheduleByCineamIdAndMovieId(long cinema_id, long movie_id) { List list = this.scheduleMapper.findScheduleByCinemaAndMovie(cinema_id, movie_id); for(Schedule schedule: list) { Hall hall = this.hallMapper.findHallById(schedule.getHall_id()); hall.setHall_cinema(this.cinemaMapper.findCinemaById(hall.getCinema_id())); schedule.setSchedule_hall(hall); schedule.setSchedule_movie(this.movieMapper.findMovieById(schedule.getMovie_id())); } return list; } } ================================================ FILE: src/main/java/com/service/imp/UserServiceImp.java ================================================ package com.service.imp; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.User; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.mapper.UserMapper; import com.service.IUserService; @Service public class UserServiceImp implements IUserService{ @Autowired private UserMapper usermapper; @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public User login(String user_name, String user_pwd) { List userList = usermapper.findUserByName(user_name); for(User user : userList) { if(user.getUser_pwd().equals(user_pwd)) { return user; } } return null; } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer updateUserInfo(User user) { return this.usermapper.updateUser(user); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public User findUserById(long user_id) { return this.usermapper.findUserById(user_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findUserByName(String name) { return this.usermapper.findUserByName(name); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer addUser(User user) { return this.usermapper.addUser(user); } @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) @Override public Integer deleteUser(long user_id) { return this.usermapper.deleteUser(user_id); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public PageInfo findAllUserBySplitPage(Integer page, Integer limit, String keyword) { PageHelper.startPage(page, limit); List list = new ArrayList(); if(keyword != null && !keyword.trim().equals("")) { list = this.usermapper.findUserLikeName(keyword); }else { list = this.usermapper.findAllUser(); } PageInfo info = new PageInfo(list); return info; } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findAllUserInfos() { return this.usermapper.findAllUser(); } @Transactional(propagation=Propagation.REQUIRED,readOnly=true) @Override public List findUserLikeName(String name) { return this.usermapper.findUserLikeName(name); } } ================================================ FILE: src/main/java/com/util/ResponseModel.java ================================================ package com.util; /** * 返回给浏览器的数据 * @param success 状态 true:成功 false:失败 * @param msg 提示信息 * @author Wxj */ public class ResponseModel { private boolean success; private String msg; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } /** * 默认成功 * @param msg */ public ResponseModel(String msg) { this.setSuccess(true); this.setMsg(msg); } public ResponseModel(boolean success,String msg) { this.setSuccess(success); this.setMsg(msg); } } ================================================ FILE: src/main/java/com/util/UUIDUtil.java ================================================ package com.util; import java.util.UUID; /** * 生产唯一标识符 * @author Wxj */ public class UUIDUtil { public static String getUUID() { String str = UUID.randomUUID().toString(); str = str.replace("-", ""); return str; } } ================================================ FILE: src/main/java/com/util/test.java ================================================ package com.util; import java.io.Console; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Random; import com.alibaba.fastjson.JSONObject; public class test { public static void main(String[] args) { // Date date = new Date(); // java.sql.Date zdate = new java.sql.Date(date.getYear(), date.getMonth(), date.getDay()); // System.out.println(date); // System.out.println(zdate); // for(int i = 0;i<20;i++) { // float random = 5 + (new Random().nextFloat() * 4); // DecimalFormat fnum = new DecimalFormat("##0.0"); // String score = fnum.format(random); // //String rs = String.valueOf(random); // System.out.println("score:" + score); // } // JSONObject obj = new JSONObject(); // JSONObject hallobj = new JSONObject(); // //ArrayList cinemalist= new ArrayList(); // for(int i = 0; i < 2;i++) { // ArrayList cinemalist= new ArrayList(); // for(int j=0;j<2;j++) { // cinemalist.add(String.valueOf(j+1)+"号厅"); // } // hallobj.put("影院"+String.valueOf(i),cinemalist); // } // obj.put("cinema", hallobj); // System.out.println(obj); // JSONObject obj2 = obj.getJSONObject("cinema"); // //解析 1级 // System.out.println(obj2); // //解析 2级 // ArrayList halllist= new ArrayList(); // halllist = (ArrayList)obj2.get("影院0"); // System.out.println(halllist.get(0)); // ArrayList arr = new ArrayList(); // for(int i = 0;i < 5;i++) { // arr.add(i); // } // System.out.println(arr.get(4)); // Date date = new Date(); // SimpleDateFormat dateFormat = new SimpleDateFormat("YYYYMMdd"); // String str = ""; // str += dateFormat.format(date); // System.out.println(str); // String [] str = {"3排4座","10排1座","5排12座","11排12座"}; // ArrayList arr = new ArrayList(); // for(int i = 0;i < str.length;i++) { // //System.out.println(str[i].length()); // String index = ""; // switch(str[i].length()) { // case 4: // index = "0" + str[i].replaceAll("排", "0"); // index = index.replaceAll("座", ""); // break; // case 5: // if(str[i].charAt(2) >= 48 && str[i].charAt(2) <= 57) { // index = "0" + str[i].replaceAll("排", ""); // index = index.replaceAll("座", ""); // }else { // index = str[i].replaceAll("排", "0"); // index = index.replaceAll("座", ""); // } // break; // case 6: // index = str[i].replaceAll("排", ""); // index = index.replaceAll("座", ""); // break; // } // arr.add(index); // } // System.out.println(arr); //int price = 29; //float box = (float)price /10000; //System.out.println((float)price /10000);; // DecimalFormat fnum = new DecimalFormat("##0.0000"); // String score = fnum.format(random); ArrayList arr = new ArrayList<>(); ArrayList indexz = new ArrayList<>(); int num[] = {1,2,3,0,5,0,6}; for(int i = 0;i ================================================ FILE: src/main/resources/mysql.properties ================================================ driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/movie?serverTimezone=UTC username=root password=root ================================================ FILE: src/main/resources/spring.xml ================================================ text/plain;charset=UTF-8 application/json;charset=UTF-8 UTF-8 UTF-8 10 zh_CN yyyy-MM-dd HH:mm yyyy-MM-dd HH:mm:ss #.## ================================================ FILE: src/main/webapp/WEB-INF/web.xml ================================================ Movie index.html test.jsp contextConfigLocation classpath:spring.xml org.springframework.web.context.ContextLoaderListener characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 forceEncoding true characterEncodingFilter /*/ springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring.xml 1 springmvc / default *.js default *.css default *.jpg default *.JPG default *.jpeg default *.png default *.eot default *.svg default *.ttf default *.woff default *.woff2 default *.gif default *.ico HiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter HiddenHttpMethodFilter /* HttpPutFormContentFilter org.springframework.web.filter.HttpPutFormContentFilter HttpPutFormContentFilter /* CORS com.thetransactioncompany.cors.CORSFilter cors.allowGenericHttpRequests true cors.allowOrigin * cors.allowSubdomains false cors.supportedMethods GET, HEAD, POST, OPTIONS cors.supportedHeaders Accept, Origin, X-Requested-With, Content-Type, Last-Modified cors.exposedHeaders X-Test-1, X-Test-2 cors.supportsCredentials true cors.maxAge 3600 CORS /* ================================================ FILE: src/main/webapp/index.html ================================================ ================================================ FILE: src/main/webapp/jsp/buySeat.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-选位置 1 选择影片场次 2 选择座位 3 付款 4 影院取票观影 可选座位 已售座位 已选座位 情侣座位 银幕中央 座位:一次最多选4个座位 座位: 总价: 邮箱号: 确认选座 ================================================ FILE: src/main/webapp/jsp/buyTickets.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-选影院 想看 评分 用户评分 累计票房 日期: 品牌: 行政区: 特殊厅: 影院列表 ================================================ FILE: src/main/webapp/jsp/center.jsp ================================================ <%@page import="com.entity.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% User user = (User)request.getSession().getAttribute("user"); if(user == null){ response.sendRedirect("./login.jsp"); } %> 鹰眼电影-个人中心 个人中心 我的订单 基本信息 修改密码 我的订单 基本信息 选择文件 支持JPG,JPEG,PNG格式,且文件需小于1000KB 修改密码 ================================================ FILE: src/main/webapp/jsp/footer.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ================================================ FILE: src/main/webapp/jsp/header.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影 首页 电影 影院 榜单 ================================================ FILE: src/main/webapp/jsp/login.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-登录注册 鹰 眼 电 影 回首向来风雨茶香里 眸中一点可是思念谁 登录 注册 用户登录 帐号 密码 @版权所有 用户注册 帐号 密码 邮箱 验证码 @版权所有 ================================================ FILE: src/main/webapp/jsp/mainPage.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-首页 总体票房 查看完整榜单 最受期待 银河补习班 上映时间:2019-07-18 634541人想看 2 八佰 517365人想看 3 小小的愿望 392336人想看 4 速度与激情:特别行动 315230人想看 5 使徒行者2:谍影行动 306130人想看 6 唐人街探案3 137888人想看 7 摸金校尉之九幽将军 112327人想看 8 上海堡垒 90324人想看 9 攀登者 63547人想看 10 鼠胆英雄 35739人想看 全部 全部 ================================================ FILE: src/main/webapp/jsp/manage.jsp ================================================ <%@page import="com.entity.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% User user = (User)request.getSession().getAttribute("user"); if(user == null){ response.sendRedirect("./mainPage.jsp"); }else{ if(user.getUser_role() != 1){ response.sendRedirect("./mainPage.jsp"); } } %> 鹰眼电影-后台管理 后台管理 用户管理 电影管理 场次管理 评论管理 订单管理 票房统计 用户管理 电影管理 添加电影 场次管理 评论管理 订单管理 票房统计 ================================================ FILE: src/main/webapp/jsp/movieDetail.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-详细 想看 评分 用户评分 累计票房 介绍 剧情简介 演职人员 热门短评 写短评 ================================================ FILE: src/main/webapp/jsp/movieList.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-电影 正在热映 即将上映 经典影片 类型 : 区域 : 年代 : 按热门排序 按时间排序 按评价排序 ================================================ FILE: src/main/webapp/jsp/pay.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-支付 1 选择影片场次 2 选择座位 3 付款 4 影院取票观影 请在分钟秒内完成支付 超时订单会自动取消,如遇支付问题,请联系管理员 请仔细核对场次信息,出票后将无法退票和改签 影片 时间 影院 座位 实际支付: 确认支付 ================================================ FILE: src/main/webapp/jsp/payStatus.jsp ================================================ <%@page import="com.entity.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% User user = (User)request.getSession().getAttribute("user"); if(user == null){ response.sendRedirect("./login.jsp"); } %> 鹰眼电影-支付成功 1 选择影片场次 2 选择座位 3 付款 4 影院取票观影 已完成支付 该页面关闭后可以在个人订单页面查看订单信息 返回个人订单 ================================================ FILE: src/main/webapp/jsp/selectSeat.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 鹰眼电影-选场次 电话:0335-2661222 影院服务 3D眼镜 免押金 可停车 停车场可凭电影票在影城票台领取3小时内免停权益 观影时间 : 放映时间 语言版本 放映厅 售价(元) 选座购票 ================================================ FILE: src/main/webapp/jsp/test.jsp ================================================ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 文件上传 昵称 ================================================ FILE: src/main/webapp/static/bootstrap/bootstrap.js ================================================ /*! * Bootstrap v4.1.3 (https://getbootstrap.com/) * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) : typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) : (factory((global.bootstrap = {}),global.jQuery,global.Popper)); }(this, (function (exports,$,Popper) { 'use strict'; $ = $ && $.hasOwnProperty('default') ? $['default'] : $; Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): util.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Util = function ($$$1) { /** * ------------------------------------------------------------------------ * Private TransitionEnd Helpers * ------------------------------------------------------------------------ */ var TRANSITION_END = 'transitionend'; var MAX_UID = 1000000; var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) function toType(obj) { return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); } function getSpecialTransitionEndEvent() { return { bindType: TRANSITION_END, delegateType: TRANSITION_END, handle: function handle(event) { if ($$$1(event.target).is(this)) { return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params } return undefined; // eslint-disable-line no-undefined } }; } function transitionEndEmulator(duration) { var _this = this; var called = false; $$$1(this).one(Util.TRANSITION_END, function () { called = true; }); setTimeout(function () { if (!called) { Util.triggerTransitionEnd(_this); } }, duration); return this; } function setTransitionEndSupport() { $$$1.fn.emulateTransitionEnd = transitionEndEmulator; $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); } /** * -------------------------------------------------------------------------- * Public Util Api * -------------------------------------------------------------------------- */ var Util = { TRANSITION_END: 'bsTransitionEnd', getUID: function getUID(prefix) { do { // eslint-disable-next-line no-bitwise prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here } while (document.getElementById(prefix)); return prefix; }, getSelectorFromElement: function getSelectorFromElement(element) { var selector = element.getAttribute('data-target'); if (!selector || selector === '#') { selector = element.getAttribute('href') || ''; } try { return document.querySelector(selector) ? selector : null; } catch (err) { return null; } }, getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { if (!element) { return 0; } // Get transition-duration of the element var transitionDuration = $$$1(element).css('transition-duration'); var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found if (!floatTransitionDuration) { return 0; } // If multiple durations are defined, take the first transitionDuration = transitionDuration.split(',')[0]; return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER; }, reflow: function reflow(element) { return element.offsetHeight; }, triggerTransitionEnd: function triggerTransitionEnd(element) { $$$1(element).trigger(TRANSITION_END); }, // TODO: Remove in v5 supportsTransitionEnd: function supportsTransitionEnd() { return Boolean(TRANSITION_END); }, isElement: function isElement(obj) { return (obj[0] || obj).nodeType; }, typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { for (var property in configTypes) { if (Object.prototype.hasOwnProperty.call(configTypes, property)) { var expectedTypes = configTypes[property]; var value = config[property]; var valueType = value && Util.isElement(value) ? 'element' : toType(value); if (!new RegExp(expectedTypes).test(valueType)) { throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); } } } } }; setTransitionEndSupport(); return Util; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Alert = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'alert'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.alert'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var Selector = { DISMISS: '[data-dismiss="alert"]' }; var Event = { CLOSE: "close" + EVENT_KEY, CLOSED: "closed" + EVENT_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY }; var ClassName = { ALERT: 'alert', FADE: 'fade', SHOW: 'show' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Alert = /*#__PURE__*/ function () { function Alert(element) { this._element = element; } // Getters var _proto = Alert.prototype; // Public _proto.close = function close(element) { var rootElement = this._element; if (element) { rootElement = this._getRootElement(element); } var customEvent = this._triggerCloseEvent(rootElement); if (customEvent.isDefaultPrevented()) { return; } this._removeElement(rootElement); }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); this._element = null; }; // Private _proto._getRootElement = function _getRootElement(element) { var selector = Util.getSelectorFromElement(element); var parent = false; if (selector) { parent = document.querySelector(selector); } if (!parent) { parent = $$$1(element).closest("." + ClassName.ALERT)[0]; } return parent; }; _proto._triggerCloseEvent = function _triggerCloseEvent(element) { var closeEvent = $$$1.Event(Event.CLOSE); $$$1(element).trigger(closeEvent); return closeEvent; }; _proto._removeElement = function _removeElement(element) { var _this = this; $$$1(element).removeClass(ClassName.SHOW); if (!$$$1(element).hasClass(ClassName.FADE)) { this._destroyElement(element); return; } var transitionDuration = Util.getTransitionDurationFromElement(element); $$$1(element).one(Util.TRANSITION_END, function (event) { return _this._destroyElement(element, event); }).emulateTransitionEnd(transitionDuration); }; _proto._destroyElement = function _destroyElement(element) { $$$1(element).detach().trigger(Event.CLOSED).remove(); }; // Static Alert._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var $element = $$$1(this); var data = $element.data(DATA_KEY); if (!data) { data = new Alert(this); $element.data(DATA_KEY, data); } if (config === 'close') { data[config](this); } }); }; Alert._handleDismiss = function _handleDismiss(alertInstance) { return function (event) { if (event) { event.preventDefault(); } alertInstance.close(this); }; }; _createClass(Alert, null, [{ key: "VERSION", get: function get() { return VERSION; } }]); return Alert; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Alert._jQueryInterface; $$$1.fn[NAME].Constructor = Alert; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Alert._jQueryInterface; }; return Alert; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): button.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Button = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'button'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.button'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var ClassName = { ACTIVE: 'active', BUTTON: 'btn', FOCUS: 'focus' }; var Selector = { DATA_TOGGLE_CARROT: '[data-toggle^="button"]', DATA_TOGGLE: '[data-toggle="buttons"]', INPUT: 'input', ACTIVE: '.active', BUTTON: '.btn' }; var Event = { CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY) /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Button = /*#__PURE__*/ function () { function Button(element) { this._element = element; } // Getters var _proto = Button.prototype; // Public _proto.toggle = function toggle() { var triggerChangeEvent = true; var addAriaPressed = true; var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0]; if (rootElement) { var input = this._element.querySelector(Selector.INPUT); if (input) { if (input.type === 'radio') { if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) { triggerChangeEvent = false; } else { var activeElement = rootElement.querySelector(Selector.ACTIVE); if (activeElement) { $$$1(activeElement).removeClass(ClassName.ACTIVE); } } } if (triggerChangeEvent) { if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) { return; } input.checked = !this._element.classList.contains(ClassName.ACTIVE); $$$1(input).trigger('change'); } input.focus(); addAriaPressed = false; } } if (addAriaPressed) { this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE)); } if (triggerChangeEvent) { $$$1(this._element).toggleClass(ClassName.ACTIVE); } }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); this._element = null; }; // Static Button._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); if (!data) { data = new Button(this); $$$1(this).data(DATA_KEY, data); } if (config === 'toggle') { data[config](); } }); }; _createClass(Button, null, [{ key: "VERSION", get: function get() { return VERSION; } }]); return Button; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { event.preventDefault(); var button = event.target; if (!$$$1(button).hasClass(ClassName.BUTTON)) { button = $$$1(button).closest(Selector.BUTTON); } Button._jQueryInterface.call($$$1(button), 'toggle'); }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { var button = $$$1(event.target).closest(Selector.BUTTON)[0]; $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)); }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Button._jQueryInterface; $$$1.fn[NAME].Constructor = Button; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Button._jQueryInterface; }; return Button; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): carousel.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Carousel = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'carousel'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.carousel'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch var Default = { interval: 5000, keyboard: true, slide: false, pause: 'hover', wrap: true }; var DefaultType = { interval: '(number|boolean)', keyboard: 'boolean', slide: '(boolean|string)', pause: '(string|boolean)', wrap: 'boolean' }; var Direction = { NEXT: 'next', PREV: 'prev', LEFT: 'left', RIGHT: 'right' }; var Event = { SLIDE: "slide" + EVENT_KEY, SLID: "slid" + EVENT_KEY, KEYDOWN: "keydown" + EVENT_KEY, MOUSEENTER: "mouseenter" + EVENT_KEY, MOUSELEAVE: "mouseleave" + EVENT_KEY, TOUCHEND: "touchend" + EVENT_KEY, LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY }; var ClassName = { CAROUSEL: 'carousel', ACTIVE: 'active', SLIDE: 'slide', RIGHT: 'carousel-item-right', LEFT: 'carousel-item-left', NEXT: 'carousel-item-next', PREV: 'carousel-item-prev', ITEM: 'carousel-item' }; var Selector = { ACTIVE: '.active', ACTIVE_ITEM: '.active.carousel-item', ITEM: '.carousel-item', NEXT_PREV: '.carousel-item-next, .carousel-item-prev', INDICATORS: '.carousel-indicators', DATA_SLIDE: '[data-slide], [data-slide-to]', DATA_RIDE: '[data-ride="carousel"]' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Carousel = /*#__PURE__*/ function () { function Carousel(element, config) { this._items = null; this._interval = null; this._activeElement = null; this._isPaused = false; this._isSliding = false; this.touchTimeout = null; this._config = this._getConfig(config); this._element = $$$1(element)[0]; this._indicatorsElement = this._element.querySelector(Selector.INDICATORS); this._addEventListeners(); } // Getters var _proto = Carousel.prototype; // Public _proto.next = function next() { if (!this._isSliding) { this._slide(Direction.NEXT); } }; _proto.nextWhenVisible = function nextWhenVisible() { // Don't call next when the page isn't visible // or the carousel or its parent isn't visible if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') { this.next(); } }; _proto.prev = function prev() { if (!this._isSliding) { this._slide(Direction.PREV); } }; _proto.pause = function pause(event) { if (!event) { this._isPaused = true; } if (this._element.querySelector(Selector.NEXT_PREV)) { Util.triggerTransitionEnd(this._element); this.cycle(true); } clearInterval(this._interval); this._interval = null; }; _proto.cycle = function cycle(event) { if (!event) { this._isPaused = false; } if (this._interval) { clearInterval(this._interval); this._interval = null; } if (this._config.interval && !this._isPaused) { this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); } }; _proto.to = function to(index) { var _this = this; this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM); var activeIndex = this._getItemIndex(this._activeElement); if (index > this._items.length - 1 || index < 0) { return; } if (this._isSliding) { $$$1(this._element).one(Event.SLID, function () { return _this.to(index); }); return; } if (activeIndex === index) { this.pause(); this.cycle(); return; } var direction = index > activeIndex ? Direction.NEXT : Direction.PREV; this._slide(direction, this._items[index]); }; _proto.dispose = function dispose() { $$$1(this._element).off(EVENT_KEY); $$$1.removeData(this._element, DATA_KEY); this._items = null; this._config = null; this._element = null; this._interval = null; this._isPaused = null; this._isSliding = null; this._activeElement = null; this._indicatorsElement = null; }; // Private _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, Default, config); Util.typeCheckConfig(NAME, config, DefaultType); return config; }; _proto._addEventListeners = function _addEventListeners() { var _this2 = this; if (this._config.keyboard) { $$$1(this._element).on(Event.KEYDOWN, function (event) { return _this2._keydown(event); }); } if (this._config.pause === 'hover') { $$$1(this._element).on(Event.MOUSEENTER, function (event) { return _this2.pause(event); }).on(Event.MOUSELEAVE, function (event) { return _this2.cycle(event); }); if ('ontouchstart' in document.documentElement) { // If it's a touch-enabled device, mouseenter/leave are fired as // part of the mouse compatibility events on first tap - the carousel // would stop cycling until user tapped out of it; // here, we listen for touchend, explicitly pause the carousel // (as if it's the second time we tap on it, mouseenter compat event // is NOT fired) and after a timeout (to allow for mouse compatibility // events to fire) we explicitly restart cycling $$$1(this._element).on(Event.TOUCHEND, function () { _this2.pause(); if (_this2.touchTimeout) { clearTimeout(_this2.touchTimeout); } _this2.touchTimeout = setTimeout(function (event) { return _this2.cycle(event); }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval); }); } } }; _proto._keydown = function _keydown(event) { if (/input|textarea/i.test(event.target.tagName)) { return; } switch (event.which) { case ARROW_LEFT_KEYCODE: event.preventDefault(); this.prev(); break; case ARROW_RIGHT_KEYCODE: event.preventDefault(); this.next(); break; default: } }; _proto._getItemIndex = function _getItemIndex(element) { this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : []; return this._items.indexOf(element); }; _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { var isNextDirection = direction === Direction.NEXT; var isPrevDirection = direction === Direction.PREV; var activeIndex = this._getItemIndex(activeElement); var lastItemIndex = this._items.length - 1; var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; if (isGoingToWrap && !this._config.wrap) { return activeElement; } var delta = direction === Direction.PREV ? -1 : 1; var itemIndex = (activeIndex + delta) % this._items.length; return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; }; _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { var targetIndex = this._getItemIndex(relatedTarget); var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM)); var slideEvent = $$$1.Event(Event.SLIDE, { relatedTarget: relatedTarget, direction: eventDirectionName, from: fromIndex, to: targetIndex }); $$$1(this._element).trigger(slideEvent); return slideEvent; }; _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { if (this._indicatorsElement) { var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE)); $$$1(indicators).removeClass(ClassName.ACTIVE); var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; if (nextIndicator) { $$$1(nextIndicator).addClass(ClassName.ACTIVE); } } }; _proto._slide = function _slide(direction, element) { var _this3 = this; var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM); var activeElementIndex = this._getItemIndex(activeElement); var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); var nextElementIndex = this._getItemIndex(nextElement); var isCycling = Boolean(this._interval); var directionalClassName; var orderClassName; var eventDirectionName; if (direction === Direction.NEXT) { directionalClassName = ClassName.LEFT; orderClassName = ClassName.NEXT; eventDirectionName = Direction.LEFT; } else { directionalClassName = ClassName.RIGHT; orderClassName = ClassName.PREV; eventDirectionName = Direction.RIGHT; } if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) { this._isSliding = false; return; } var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); if (slideEvent.isDefaultPrevented()) { return; } if (!activeElement || !nextElement) { // Some weirdness is happening, so we bail return; } this._isSliding = true; if (isCycling) { this.pause(); } this._setActiveIndicatorElement(nextElement); var slidEvent = $$$1.Event(Event.SLID, { relatedTarget: nextElement, direction: eventDirectionName, from: activeElementIndex, to: nextElementIndex }); if ($$$1(this._element).hasClass(ClassName.SLIDE)) { $$$1(nextElement).addClass(orderClassName); Util.reflow(nextElement); $$$1(activeElement).addClass(directionalClassName); $$$1(nextElement).addClass(directionalClassName); var transitionDuration = Util.getTransitionDurationFromElement(activeElement); $$$1(activeElement).one(Util.TRANSITION_END, function () { $$$1(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE); $$$1(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName); _this3._isSliding = false; setTimeout(function () { return $$$1(_this3._element).trigger(slidEvent); }, 0); }).emulateTransitionEnd(transitionDuration); } else { $$$1(activeElement).removeClass(ClassName.ACTIVE); $$$1(nextElement).addClass(ClassName.ACTIVE); this._isSliding = false; $$$1(this._element).trigger(slidEvent); } if (isCycling) { this.cycle(); } }; // Static Carousel._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = _objectSpread({}, Default, $$$1(this).data()); if (typeof config === 'object') { _config = _objectSpread({}, _config, config); } var action = typeof config === 'string' ? config : _config.slide; if (!data) { data = new Carousel(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'number') { data.to(config); } else if (typeof action === 'string') { if (typeof data[action] === 'undefined') { throw new TypeError("No method named \"" + action + "\""); } data[action](); } else if (_config.interval) { data.pause(); data.cycle(); } }); }; Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { var selector = Util.getSelectorFromElement(this); if (!selector) { return; } var target = $$$1(selector)[0]; if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) { return; } var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data()); var slideIndex = this.getAttribute('data-slide-to'); if (slideIndex) { config.interval = false; } Carousel._jQueryInterface.call($$$1(target), config); if (slideIndex) { $$$1(target).data(DATA_KEY).to(slideIndex); } event.preventDefault(); }; _createClass(Carousel, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }]); return Carousel; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler); $$$1(window).on(Event.LOAD_DATA_API, function () { var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE)); for (var i = 0, len = carousels.length; i < len; i++) { var $carousel = $$$1(carousels[i]); Carousel._jQueryInterface.call($carousel, $carousel.data()); } }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Carousel._jQueryInterface; $$$1.fn[NAME].Constructor = Carousel; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Carousel._jQueryInterface; }; return Carousel; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): collapse.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Collapse = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'collapse'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.collapse'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var Default = { toggle: true, parent: '' }; var DefaultType = { toggle: 'boolean', parent: '(string|element)' }; var Event = { SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY }; var ClassName = { SHOW: 'show', COLLAPSE: 'collapse', COLLAPSING: 'collapsing', COLLAPSED: 'collapsed' }; var Dimension = { WIDTH: 'width', HEIGHT: 'height' }; var Selector = { ACTIVES: '.show, .collapsing', DATA_TOGGLE: '[data-toggle="collapse"]' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Collapse = /*#__PURE__*/ function () { function Collapse(element, config) { this._isTransitioning = false; this._element = element; this._config = this._getConfig(config); this._triggerArray = $$$1.makeArray(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE)); for (var i = 0, len = toggleList.length; i < len; i++) { var elem = toggleList[i]; var selector = Util.getSelectorFromElement(elem); var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { return foundElem === element; }); if (selector !== null && filterElement.length > 0) { this._selector = selector; this._triggerArray.push(elem); } } this._parent = this._config.parent ? this._getParent() : null; if (!this._config.parent) { this._addAriaAndCollapsedClass(this._element, this._triggerArray); } if (this._config.toggle) { this.toggle(); } } // Getters var _proto = Collapse.prototype; // Public _proto.toggle = function toggle() { if ($$$1(this._element).hasClass(ClassName.SHOW)) { this.hide(); } else { this.show(); } }; _proto.show = function show() { var _this = this; if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) { return; } var actives; var activesData; if (this._parent) { actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) { return elem.getAttribute('data-parent') === _this._config.parent; }); if (actives.length === 0) { actives = null; } } if (actives) { activesData = $$$1(actives).not(this._selector).data(DATA_KEY); if (activesData && activesData._isTransitioning) { return; } } var startEvent = $$$1.Event(Event.SHOW); $$$1(this._element).trigger(startEvent); if (startEvent.isDefaultPrevented()) { return; } if (actives) { Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide'); if (!activesData) { $$$1(actives).data(DATA_KEY, null); } } var dimension = this._getDimension(); $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING); this._element.style[dimension] = 0; if (this._triggerArray.length) { $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true); } this.setTransitioning(true); var complete = function complete() { $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); _this._element.style[dimension] = ''; _this.setTransitioning(false); $$$1(_this._element).trigger(Event.SHOWN); }; var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); var scrollSize = "scroll" + capitalizedDimension; var transitionDuration = Util.getTransitionDurationFromElement(this._element); $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); this._element.style[dimension] = this._element[scrollSize] + "px"; }; _proto.hide = function hide() { var _this2 = this; if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) { return; } var startEvent = $$$1.Event(Event.HIDE); $$$1(this._element).trigger(startEvent); if (startEvent.isDefaultPrevented()) { return; } var dimension = this._getDimension(); this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; Util.reflow(this._element); $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW); var triggerArrayLength = this._triggerArray.length; if (triggerArrayLength > 0) { for (var i = 0; i < triggerArrayLength; i++) { var trigger = this._triggerArray[i]; var selector = Util.getSelectorFromElement(trigger); if (selector !== null) { var $elem = $$$1([].slice.call(document.querySelectorAll(selector))); if (!$elem.hasClass(ClassName.SHOW)) { $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false); } } } } this.setTransitioning(true); var complete = function complete() { _this2.setTransitioning(false); $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); }; this._element.style[dimension] = ''; var transitionDuration = Util.getTransitionDurationFromElement(this._element); $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); }; _proto.setTransitioning = function setTransitioning(isTransitioning) { this._isTransitioning = isTransitioning; }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); this._config = null; this._parent = null; this._element = null; this._triggerArray = null; this._isTransitioning = null; }; // Private _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, Default, config); config.toggle = Boolean(config.toggle); // Coerce string values Util.typeCheckConfig(NAME, config, DefaultType); return config; }; _proto._getDimension = function _getDimension() { var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH); return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; }; _proto._getParent = function _getParent() { var _this3 = this; var parent = null; if (Util.isElement(this._config.parent)) { parent = this._config.parent; // It's a jQuery object if (typeof this._config.parent.jquery !== 'undefined') { parent = this._config.parent[0]; } } else { parent = document.querySelector(this._config.parent); } var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; var children = [].slice.call(parent.querySelectorAll(selector)); $$$1(children).each(function (i, element) { _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); }); return parent; }; _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { if (element) { var isOpen = $$$1(element).hasClass(ClassName.SHOW); if (triggerArray.length) { $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); } } }; // Static Collapse._getTargetFromElement = function _getTargetFromElement(element) { var selector = Util.getSelectorFromElement(element); return selector ? document.querySelector(selector) : null; }; Collapse._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var $this = $$$1(this); var data = $this.data(DATA_KEY); var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {}); if (!data && _config.toggle && /show|hide/.test(config)) { _config.toggle = false; } if (!data) { data = new Collapse(this, _config); $this.data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; _createClass(Collapse, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }]); return Collapse; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { // preventDefault only for elements (which change the URL) not inside the collapsible element if (event.currentTarget.tagName === 'A') { event.preventDefault(); } var $trigger = $$$1(this); var selector = Util.getSelectorFromElement(this); var selectors = [].slice.call(document.querySelectorAll(selector)); $$$1(selectors).each(function () { var $target = $$$1(this); var data = $target.data(DATA_KEY); var config = data ? 'toggle' : $trigger.data(); Collapse._jQueryInterface.call($target, config); }); }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Collapse._jQueryInterface; $$$1.fn[NAME].Constructor = Collapse; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Collapse._jQueryInterface; }; return Collapse; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): dropdown.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Dropdown = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'dropdown'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.dropdown'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); var Event = { HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, CLICK: "click" + EVENT_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY, KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY }; var ClassName = { DISABLED: 'disabled', SHOW: 'show', DROPUP: 'dropup', DROPRIGHT: 'dropright', DROPLEFT: 'dropleft', MENURIGHT: 'dropdown-menu-right', MENULEFT: 'dropdown-menu-left', POSITION_STATIC: 'position-static' }; var Selector = { DATA_TOGGLE: '[data-toggle="dropdown"]', FORM_CHILD: '.dropdown form', MENU: '.dropdown-menu', NAVBAR_NAV: '.navbar-nav', VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' }; var AttachmentMap = { TOP: 'top-start', TOPEND: 'top-end', BOTTOM: 'bottom-start', BOTTOMEND: 'bottom-end', RIGHT: 'right-start', RIGHTEND: 'right-end', LEFT: 'left-start', LEFTEND: 'left-end' }; var Default = { offset: 0, flip: true, boundary: 'scrollParent', reference: 'toggle', display: 'dynamic' }; var DefaultType = { offset: '(number|string|function)', flip: 'boolean', boundary: '(string|element)', reference: '(string|element)', display: 'string' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Dropdown = /*#__PURE__*/ function () { function Dropdown(element, config) { this._element = element; this._popper = null; this._config = this._getConfig(config); this._menu = this._getMenuElement(); this._inNavbar = this._detectNavbar(); this._addEventListeners(); } // Getters var _proto = Dropdown.prototype; // Public _proto.toggle = function toggle() { if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) { return; } var parent = Dropdown._getParentFromElement(this._element); var isActive = $$$1(this._menu).hasClass(ClassName.SHOW); Dropdown._clearMenus(); if (isActive) { return; } var relatedTarget = { relatedTarget: this._element }; var showEvent = $$$1.Event(Event.SHOW, relatedTarget); $$$1(parent).trigger(showEvent); if (showEvent.isDefaultPrevented()) { return; } // Disable totally Popper.js for Dropdown in Navbar if (!this._inNavbar) { /** * Check for Popper dependency * Popper - https://popper.js.org */ if (typeof Popper === 'undefined') { throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)'); } var referenceElement = this._element; if (this._config.reference === 'parent') { referenceElement = parent; } else if (Util.isElement(this._config.reference)) { referenceElement = this._config.reference; // Check if it's jQuery element if (typeof this._config.reference.jquery !== 'undefined') { referenceElement = this._config.reference[0]; } } // If boundary is not `scrollParent`, then set position to `static` // to allow the menu to "escape" the scroll parent's boundaries // https://github.com/twbs/bootstrap/issues/24251 if (this._config.boundary !== 'scrollParent') { $$$1(parent).addClass(ClassName.POSITION_STATIC); } this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); } // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; // only needed because of broken event delegation on iOS // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) { $$$1(document.body).children().on('mouseover', null, $$$1.noop); } this._element.focus(); this._element.setAttribute('aria-expanded', true); $$$1(this._menu).toggleClass(ClassName.SHOW); $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget)); }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); $$$1(this._element).off(EVENT_KEY); this._element = null; this._menu = null; if (this._popper !== null) { this._popper.destroy(); this._popper = null; } }; _proto.update = function update() { this._inNavbar = this._detectNavbar(); if (this._popper !== null) { this._popper.scheduleUpdate(); } }; // Private _proto._addEventListeners = function _addEventListeners() { var _this = this; $$$1(this._element).on(Event.CLICK, function (event) { event.preventDefault(); event.stopPropagation(); _this.toggle(); }); }; _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config); Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); return config; }; _proto._getMenuElement = function _getMenuElement() { if (!this._menu) { var parent = Dropdown._getParentFromElement(this._element); if (parent) { this._menu = parent.querySelector(Selector.MENU); } } return this._menu; }; _proto._getPlacement = function _getPlacement() { var $parentDropdown = $$$1(this._element.parentNode); var placement = AttachmentMap.BOTTOM; // Handle dropup if ($parentDropdown.hasClass(ClassName.DROPUP)) { placement = AttachmentMap.TOP; if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) { placement = AttachmentMap.TOPEND; } } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) { placement = AttachmentMap.RIGHT; } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) { placement = AttachmentMap.LEFT; } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) { placement = AttachmentMap.BOTTOMEND; } return placement; }; _proto._detectNavbar = function _detectNavbar() { return $$$1(this._element).closest('.navbar').length > 0; }; _proto._getPopperConfig = function _getPopperConfig() { var _this2 = this; var offsetConf = {}; if (typeof this._config.offset === 'function') { offsetConf.fn = function (data) { data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {}); return data; }; } else { offsetConf.offset = this._config.offset; } var popperConfig = { placement: this._getPlacement(), modifiers: { offset: offsetConf, flip: { enabled: this._config.flip }, preventOverflow: { boundariesElement: this._config.boundary } } // Disable Popper.js if we have a static display }; if (this._config.display === 'static') { popperConfig.modifiers.applyStyle = { enabled: false }; } return popperConfig; }; // Static Dropdown._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = typeof config === 'object' ? config : null; if (!data) { data = new Dropdown(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; Dropdown._clearMenus = function _clearMenus(event) { if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { return; } var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE)); for (var i = 0, len = toggles.length; i < len; i++) { var parent = Dropdown._getParentFromElement(toggles[i]); var context = $$$1(toggles[i]).data(DATA_KEY); var relatedTarget = { relatedTarget: toggles[i] }; if (event && event.type === 'click') { relatedTarget.clickEvent = event; } if (!context) { continue; } var dropdownMenu = context._menu; if (!$$$1(parent).hasClass(ClassName.SHOW)) { continue; } if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) { continue; } var hideEvent = $$$1.Event(Event.HIDE, relatedTarget); $$$1(parent).trigger(hideEvent); if (hideEvent.isDefaultPrevented()) { continue; } // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { $$$1(document.body).children().off('mouseover', null, $$$1.noop); } toggles[i].setAttribute('aria-expanded', 'false'); $$$1(dropdownMenu).removeClass(ClassName.SHOW); $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget)); } }; Dropdown._getParentFromElement = function _getParentFromElement(element) { var parent; var selector = Util.getSelectorFromElement(element); if (selector) { parent = document.querySelector(selector); } return parent || element.parentNode; }; // eslint-disable-next-line complexity Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { // If not input/textarea: // - And not a key in REGEXP_KEYDOWN => not a dropdown command // If input/textarea: // - If space key => not a dropdown command // - If key is other than escape // - If key is not up or down => not a dropdown command // - If trigger inside the menu => not a dropdown command if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { return; } event.preventDefault(); event.stopPropagation(); if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) { return; } var parent = Dropdown._getParentFromElement(this); var isActive = $$$1(parent).hasClass(ClassName.SHOW); if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { if (event.which === ESCAPE_KEYCODE) { var toggle = parent.querySelector(Selector.DATA_TOGGLE); $$$1(toggle).trigger('focus'); } $$$1(this).trigger('click'); return; } var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS)); if (items.length === 0) { return; } var index = items.indexOf(event.target); if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up index--; } if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down index++; } if (index < 0) { index = 0; } items[index].focus(); }; _createClass(Dropdown, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }, { key: "DefaultType", get: function get() { return DefaultType; } }]); return Dropdown; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { event.preventDefault(); event.stopPropagation(); Dropdown._jQueryInterface.call($$$1(this), 'toggle'); }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { e.stopPropagation(); }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Dropdown._jQueryInterface; $$$1.fn[NAME].Constructor = Dropdown; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Dropdown._jQueryInterface; }; return Dropdown; }($, Popper); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): modal.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Modal = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'modal'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.modal'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key var Default = { backdrop: true, keyboard: true, focus: true, show: true }; var DefaultType = { backdrop: '(boolean|string)', keyboard: 'boolean', focus: 'boolean', show: 'boolean' }; var Event = { HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, FOCUSIN: "focusin" + EVENT_KEY, RESIZE: "resize" + EVENT_KEY, CLICK_DISMISS: "click.dismiss" + EVENT_KEY, KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY, MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY, MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY }; var ClassName = { SCROLLBAR_MEASURER: 'modal-scrollbar-measure', BACKDROP: 'modal-backdrop', OPEN: 'modal-open', FADE: 'fade', SHOW: 'show' }; var Selector = { DIALOG: '.modal-dialog', DATA_TOGGLE: '[data-toggle="modal"]', DATA_DISMISS: '[data-dismiss="modal"]', FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', STICKY_CONTENT: '.sticky-top' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Modal = /*#__PURE__*/ function () { function Modal(element, config) { this._config = this._getConfig(config); this._element = element; this._dialog = element.querySelector(Selector.DIALOG); this._backdrop = null; this._isShown = false; this._isBodyOverflowing = false; this._ignoreBackdropClick = false; this._scrollbarWidth = 0; } // Getters var _proto = Modal.prototype; // Public _proto.toggle = function toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); }; _proto.show = function show(relatedTarget) { var _this = this; if (this._isTransitioning || this._isShown) { return; } if ($$$1(this._element).hasClass(ClassName.FADE)) { this._isTransitioning = true; } var showEvent = $$$1.Event(Event.SHOW, { relatedTarget: relatedTarget }); $$$1(this._element).trigger(showEvent); if (this._isShown || showEvent.isDefaultPrevented()) { return; } this._isShown = true; this._checkScrollbar(); this._setScrollbar(); this._adjustDialog(); $$$1(document.body).addClass(ClassName.OPEN); this._setEscapeEvent(); this._setResizeEvent(); $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { return _this.hide(event); }); $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) { if ($$$1(event.target).is(_this._element)) { _this._ignoreBackdropClick = true; } }); }); this._showBackdrop(function () { return _this._showElement(relatedTarget); }); }; _proto.hide = function hide(event) { var _this2 = this; if (event) { event.preventDefault(); } if (this._isTransitioning || !this._isShown) { return; } var hideEvent = $$$1.Event(Event.HIDE); $$$1(this._element).trigger(hideEvent); if (!this._isShown || hideEvent.isDefaultPrevented()) { return; } this._isShown = false; var transition = $$$1(this._element).hasClass(ClassName.FADE); if (transition) { this._isTransitioning = true; } this._setEscapeEvent(); this._setResizeEvent(); $$$1(document).off(Event.FOCUSIN); $$$1(this._element).removeClass(ClassName.SHOW); $$$1(this._element).off(Event.CLICK_DISMISS); $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS); if (transition) { var transitionDuration = Util.getTransitionDurationFromElement(this._element); $$$1(this._element).one(Util.TRANSITION_END, function (event) { return _this2._hideModal(event); }).emulateTransitionEnd(transitionDuration); } else { this._hideModal(); } }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY); this._config = null; this._element = null; this._dialog = null; this._backdrop = null; this._isShown = null; this._isBodyOverflowing = null; this._ignoreBackdropClick = null; this._scrollbarWidth = null; }; _proto.handleUpdate = function handleUpdate() { this._adjustDialog(); }; // Private _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, Default, config); Util.typeCheckConfig(NAME, config, DefaultType); return config; }; _proto._showElement = function _showElement(relatedTarget) { var _this3 = this; var transition = $$$1(this._element).hasClass(ClassName.FADE); if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { // Don't move modal's DOM position document.body.appendChild(this._element); } this._element.style.display = 'block'; this._element.removeAttribute('aria-hidden'); this._element.scrollTop = 0; if (transition) { Util.reflow(this._element); } $$$1(this._element).addClass(ClassName.SHOW); if (this._config.focus) { this._enforceFocus(); } var shownEvent = $$$1.Event(Event.SHOWN, { relatedTarget: relatedTarget }); var transitionComplete = function transitionComplete() { if (_this3._config.focus) { _this3._element.focus(); } _this3._isTransitioning = false; $$$1(_this3._element).trigger(shownEvent); }; if (transition) { var transitionDuration = Util.getTransitionDurationFromElement(this._element); $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); } else { transitionComplete(); } }; _proto._enforceFocus = function _enforceFocus() { var _this4 = this; $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop .on(Event.FOCUSIN, function (event) { if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) { _this4._element.focus(); } }); }; _proto._setEscapeEvent = function _setEscapeEvent() { var _this5 = this; if (this._isShown && this._config.keyboard) { $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) { if (event.which === ESCAPE_KEYCODE) { event.preventDefault(); _this5.hide(); } }); } else if (!this._isShown) { $$$1(this._element).off(Event.KEYDOWN_DISMISS); } }; _proto._setResizeEvent = function _setResizeEvent() { var _this6 = this; if (this._isShown) { $$$1(window).on(Event.RESIZE, function (event) { return _this6.handleUpdate(event); }); } else { $$$1(window).off(Event.RESIZE); } }; _proto._hideModal = function _hideModal() { var _this7 = this; this._element.style.display = 'none'; this._element.setAttribute('aria-hidden', true); this._isTransitioning = false; this._showBackdrop(function () { $$$1(document.body).removeClass(ClassName.OPEN); _this7._resetAdjustments(); _this7._resetScrollbar(); $$$1(_this7._element).trigger(Event.HIDDEN); }); }; _proto._removeBackdrop = function _removeBackdrop() { if (this._backdrop) { $$$1(this._backdrop).remove(); this._backdrop = null; } }; _proto._showBackdrop = function _showBackdrop(callback) { var _this8 = this; var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; if (this._isShown && this._config.backdrop) { this._backdrop = document.createElement('div'); this._backdrop.className = ClassName.BACKDROP; if (animate) { this._backdrop.classList.add(animate); } $$$1(this._backdrop).appendTo(document.body); $$$1(this._element).on(Event.CLICK_DISMISS, function (event) { if (_this8._ignoreBackdropClick) { _this8._ignoreBackdropClick = false; return; } if (event.target !== event.currentTarget) { return; } if (_this8._config.backdrop === 'static') { _this8._element.focus(); } else { _this8.hide(); } }); if (animate) { Util.reflow(this._backdrop); } $$$1(this._backdrop).addClass(ClassName.SHOW); if (!callback) { return; } if (!animate) { callback(); return; } var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); } else if (!this._isShown && this._backdrop) { $$$1(this._backdrop).removeClass(ClassName.SHOW); var callbackRemove = function callbackRemove() { _this8._removeBackdrop(); if (callback) { callback(); } }; if ($$$1(this._element).hasClass(ClassName.FADE)) { var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); } else { callbackRemove(); } } else if (callback) { callback(); } }; // ---------------------------------------------------------------------- // the following methods are used to handle overflowing modals // todo (fat): these should probably be refactored out of modal.js // ---------------------------------------------------------------------- _proto._adjustDialog = function _adjustDialog() { var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; if (!this._isBodyOverflowing && isModalOverflowing) { this._element.style.paddingLeft = this._scrollbarWidth + "px"; } if (this._isBodyOverflowing && !isModalOverflowing) { this._element.style.paddingRight = this._scrollbarWidth + "px"; } }; _proto._resetAdjustments = function _resetAdjustments() { this._element.style.paddingLeft = ''; this._element.style.paddingRight = ''; }; _proto._checkScrollbar = function _checkScrollbar() { var rect = document.body.getBoundingClientRect(); this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; this._scrollbarWidth = this._getScrollbarWidth(); }; _proto._setScrollbar = function _setScrollbar() { var _this9 = this; if (this._isBodyOverflowing) { // Note: DOMNode.style.paddingRight returns the actual value or '' if not set // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT)); var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding $$$1(fixedContent).each(function (index, element) { var actualPadding = element.style.paddingRight; var calculatedPadding = $$$1(element).css('padding-right'); $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px"); }); // Adjust sticky content margin $$$1(stickyContent).each(function (index, element) { var actualMargin = element.style.marginRight; var calculatedMargin = $$$1(element).css('margin-right'); $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px"); }); // Adjust body padding var actualPadding = document.body.style.paddingRight; var calculatedPadding = $$$1(document.body).css('padding-right'); $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); } }; _proto._resetScrollbar = function _resetScrollbar() { // Restore fixed content padding var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT)); $$$1(fixedContent).each(function (index, element) { var padding = $$$1(element).data('padding-right'); $$$1(element).removeData('padding-right'); element.style.paddingRight = padding ? padding : ''; }); // Restore sticky content var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT)); $$$1(elements).each(function (index, element) { var margin = $$$1(element).data('margin-right'); if (typeof margin !== 'undefined') { $$$1(element).css('margin-right', margin).removeData('margin-right'); } }); // Restore body padding var padding = $$$1(document.body).data('padding-right'); $$$1(document.body).removeData('padding-right'); document.body.style.paddingRight = padding ? padding : ''; }; _proto._getScrollbarWidth = function _getScrollbarWidth() { // thx d.walsh var scrollDiv = document.createElement('div'); scrollDiv.className = ClassName.SCROLLBAR_MEASURER; document.body.appendChild(scrollDiv); var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; document.body.removeChild(scrollDiv); return scrollbarWidth; }; // Static Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = _objectSpread({}, Default, $$$1(this).data(), typeof config === 'object' && config ? config : {}); if (!data) { data = new Modal(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](relatedTarget); } else if (_config.show) { data.show(relatedTarget); } }); }; _createClass(Modal, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }]); return Modal; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { var _this10 = this; var target; var selector = Util.getSelectorFromElement(this); if (selector) { target = document.querySelector(selector); } var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data()); if (this.tagName === 'A' || this.tagName === 'AREA') { event.preventDefault(); } var $target = $$$1(target).one(Event.SHOW, function (showEvent) { if (showEvent.isDefaultPrevented()) { // Only register focus restorer if modal will actually get shown return; } $target.one(Event.HIDDEN, function () { if ($$$1(_this10).is(':visible')) { _this10.focus(); } }); }); Modal._jQueryInterface.call($$$1(target), config, this); }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Modal._jQueryInterface; $$$1.fn[NAME].Constructor = Modal; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Modal._jQueryInterface; }; return Modal; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Tooltip = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'tooltip'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.tooltip'; var EVENT_KEY = "." + DATA_KEY; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var CLASS_PREFIX = 'bs-tooltip'; var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); var DefaultType = { animation: 'boolean', template: 'string', title: '(string|element|function)', trigger: 'string', delay: '(number|object)', html: 'boolean', selector: '(string|boolean)', placement: '(string|function)', offset: '(number|string)', container: '(string|element|boolean)', fallbackPlacement: '(string|array)', boundary: '(string|element)' }; var AttachmentMap = { AUTO: 'auto', TOP: 'top', RIGHT: 'right', BOTTOM: 'bottom', LEFT: 'left' }; var Default = { animation: true, template: '' + '' + '', trigger: 'hover focus', title: '', delay: 0, html: false, selector: false, placement: 'top', offset: 0, container: false, fallbackPlacement: 'flip', boundary: 'scrollParent' }; var HoverState = { SHOW: 'show', OUT: 'out' }; var Event = { HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, INSERTED: "inserted" + EVENT_KEY, CLICK: "click" + EVENT_KEY, FOCUSIN: "focusin" + EVENT_KEY, FOCUSOUT: "focusout" + EVENT_KEY, MOUSEENTER: "mouseenter" + EVENT_KEY, MOUSELEAVE: "mouseleave" + EVENT_KEY }; var ClassName = { FADE: 'fade', SHOW: 'show' }; var Selector = { TOOLTIP: '.tooltip', TOOLTIP_INNER: '.tooltip-inner', ARROW: '.arrow' }; var Trigger = { HOVER: 'hover', FOCUS: 'focus', CLICK: 'click', MANUAL: 'manual' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Tooltip = /*#__PURE__*/ function () { function Tooltip(element, config) { /** * Check for Popper dependency * Popper - https://popper.js.org */ if (typeof Popper === 'undefined') { throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)'); } // private this._isEnabled = true; this._timeout = 0; this._hoverState = ''; this._activeTrigger = {}; this._popper = null; // Protected this.element = element; this.config = this._getConfig(config); this.tip = null; this._setListeners(); } // Getters var _proto = Tooltip.prototype; // Public _proto.enable = function enable() { this._isEnabled = true; }; _proto.disable = function disable() { this._isEnabled = false; }; _proto.toggleEnabled = function toggleEnabled() { this._isEnabled = !this._isEnabled; }; _proto.toggle = function toggle(event) { if (!this._isEnabled) { return; } if (event) { var dataKey = this.constructor.DATA_KEY; var context = $$$1(event.currentTarget).data(dataKey); if (!context) { context = new this.constructor(event.currentTarget, this._getDelegateConfig()); $$$1(event.currentTarget).data(dataKey, context); } context._activeTrigger.click = !context._activeTrigger.click; if (context._isWithActiveTrigger()) { context._enter(null, context); } else { context._leave(null, context); } } else { if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) { this._leave(null, this); return; } this._enter(null, this); } }; _proto.dispose = function dispose() { clearTimeout(this._timeout); $$$1.removeData(this.element, this.constructor.DATA_KEY); $$$1(this.element).off(this.constructor.EVENT_KEY); $$$1(this.element).closest('.modal').off('hide.bs.modal'); if (this.tip) { $$$1(this.tip).remove(); } this._isEnabled = null; this._timeout = null; this._hoverState = null; this._activeTrigger = null; if (this._popper !== null) { this._popper.destroy(); } this._popper = null; this.element = null; this.config = null; this.tip = null; }; _proto.show = function show() { var _this = this; if ($$$1(this.element).css('display') === 'none') { throw new Error('Please use show on visible elements'); } var showEvent = $$$1.Event(this.constructor.Event.SHOW); if (this.isWithContent() && this._isEnabled) { $$$1(this.element).trigger(showEvent); var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element); if (showEvent.isDefaultPrevented() || !isInTheDom) { return; } var tip = this.getTipElement(); var tipId = Util.getUID(this.constructor.NAME); tip.setAttribute('id', tipId); this.element.setAttribute('aria-describedby', tipId); this.setContent(); if (this.config.animation) { $$$1(tip).addClass(ClassName.FADE); } var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; var attachment = this._getAttachment(placement); this.addAttachmentClass(attachment); var container = this.config.container === false ? document.body : $$$1(document).find(this.config.container); $$$1(tip).data(this.constructor.DATA_KEY, this); if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) { $$$1(tip).appendTo(container); } $$$1(this.element).trigger(this.constructor.Event.INSERTED); this._popper = new Popper(this.element, tip, { placement: attachment, modifiers: { offset: { offset: this.config.offset }, flip: { behavior: this.config.fallbackPlacement }, arrow: { element: Selector.ARROW }, preventOverflow: { boundariesElement: this.config.boundary } }, onCreate: function onCreate(data) { if (data.originalPlacement !== data.placement) { _this._handlePopperPlacementChange(data); } }, onUpdate: function onUpdate(data) { _this._handlePopperPlacementChange(data); } }); $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; // only needed because of broken event delegation on iOS // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html if ('ontouchstart' in document.documentElement) { $$$1(document.body).children().on('mouseover', null, $$$1.noop); } var complete = function complete() { if (_this.config.animation) { _this._fixTransition(); } var prevHoverState = _this._hoverState; _this._hoverState = null; $$$1(_this.element).trigger(_this.constructor.Event.SHOWN); if (prevHoverState === HoverState.OUT) { _this._leave(null, _this); } }; if ($$$1(this.tip).hasClass(ClassName.FADE)) { var transitionDuration = Util.getTransitionDurationFromElement(this.tip); $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); } else { complete(); } } }; _proto.hide = function hide(callback) { var _this2 = this; var tip = this.getTipElement(); var hideEvent = $$$1.Event(this.constructor.Event.HIDE); var complete = function complete() { if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { tip.parentNode.removeChild(tip); } _this2._cleanTipClass(); _this2.element.removeAttribute('aria-describedby'); $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN); if (_this2._popper !== null) { _this2._popper.destroy(); } if (callback) { callback(); } }; $$$1(this.element).trigger(hideEvent); if (hideEvent.isDefaultPrevented()) { return; } $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { $$$1(document.body).children().off('mouseover', null, $$$1.noop); } this._activeTrigger[Trigger.CLICK] = false; this._activeTrigger[Trigger.FOCUS] = false; this._activeTrigger[Trigger.HOVER] = false; if ($$$1(this.tip).hasClass(ClassName.FADE)) { var transitionDuration = Util.getTransitionDurationFromElement(tip); $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); } else { complete(); } this._hoverState = ''; }; _proto.update = function update() { if (this._popper !== null) { this._popper.scheduleUpdate(); } }; // Protected _proto.isWithContent = function isWithContent() { return Boolean(this.getTitle()); }; _proto.addAttachmentClass = function addAttachmentClass(attachment) { $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); }; _proto.getTipElement = function getTipElement() { this.tip = this.tip || $$$1(this.config.template)[0]; return this.tip; }; _proto.setContent = function setContent() { var tip = this.getTipElement(); this.setElementContent($$$1(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle()); $$$1(tip).removeClass(ClassName.FADE + " " + ClassName.SHOW); }; _proto.setElementContent = function setElementContent($element, content) { var html = this.config.html; if (typeof content === 'object' && (content.nodeType || content.jquery)) { // Content is a DOM node or a jQuery if (html) { if (!$$$1(content).parent().is($element)) { $element.empty().append(content); } } else { $element.text($$$1(content).text()); } } else { $element[html ? 'html' : 'text'](content); } }; _proto.getTitle = function getTitle() { var title = this.element.getAttribute('data-original-title'); if (!title) { title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; } return title; }; // Private _proto._getAttachment = function _getAttachment(placement) { return AttachmentMap[placement.toUpperCase()]; }; _proto._setListeners = function _setListeners() { var _this3 = this; var triggers = this.config.trigger.split(' '); triggers.forEach(function (trigger) { if (trigger === 'click') { $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) { return _this3.toggle(event); }); } else if (trigger !== Trigger.MANUAL) { var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN; var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT; $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) { return _this3._enter(event); }).on(eventOut, _this3.config.selector, function (event) { return _this3._leave(event); }); } $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () { return _this3.hide(); }); }); if (this.config.selector) { this.config = _objectSpread({}, this.config, { trigger: 'manual', selector: '' }); } else { this._fixTitle(); } }; _proto._fixTitle = function _fixTitle() { var titleType = typeof this.element.getAttribute('data-original-title'); if (this.element.getAttribute('title') || titleType !== 'string') { this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); this.element.setAttribute('title', ''); } }; _proto._enter = function _enter(event, context) { var dataKey = this.constructor.DATA_KEY; context = context || $$$1(event.currentTarget).data(dataKey); if (!context) { context = new this.constructor(event.currentTarget, this._getDelegateConfig()); $$$1(event.currentTarget).data(dataKey, context); } if (event) { context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; } if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) { context._hoverState = HoverState.SHOW; return; } clearTimeout(context._timeout); context._hoverState = HoverState.SHOW; if (!context.config.delay || !context.config.delay.show) { context.show(); return; } context._timeout = setTimeout(function () { if (context._hoverState === HoverState.SHOW) { context.show(); } }, context.config.delay.show); }; _proto._leave = function _leave(event, context) { var dataKey = this.constructor.DATA_KEY; context = context || $$$1(event.currentTarget).data(dataKey); if (!context) { context = new this.constructor(event.currentTarget, this._getDelegateConfig()); $$$1(event.currentTarget).data(dataKey, context); } if (event) { context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false; } if (context._isWithActiveTrigger()) { return; } clearTimeout(context._timeout); context._hoverState = HoverState.OUT; if (!context.config.delay || !context.config.delay.hide) { context.hide(); return; } context._timeout = setTimeout(function () { if (context._hoverState === HoverState.OUT) { context.hide(); } }, context.config.delay.hide); }; _proto._isWithActiveTrigger = function _isWithActiveTrigger() { for (var trigger in this._activeTrigger) { if (this._activeTrigger[trigger]) { return true; } } return false; }; _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), typeof config === 'object' && config ? config : {}); if (typeof config.delay === 'number') { config.delay = { show: config.delay, hide: config.delay }; } if (typeof config.title === 'number') { config.title = config.title.toString(); } if (typeof config.content === 'number') { config.content = config.content.toString(); } Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); return config; }; _proto._getDelegateConfig = function _getDelegateConfig() { var config = {}; if (this.config) { for (var key in this.config) { if (this.constructor.Default[key] !== this.config[key]) { config[key] = this.config[key]; } } } return config; }; _proto._cleanTipClass = function _cleanTipClass() { var $tip = $$$1(this.getTipElement()); var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); if (tabClass !== null && tabClass.length) { $tip.removeClass(tabClass.join('')); } }; _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { var popperInstance = popperData.instance; this.tip = popperInstance.popper; this._cleanTipClass(); this.addAttachmentClass(this._getAttachment(popperData.placement)); }; _proto._fixTransition = function _fixTransition() { var tip = this.getTipElement(); var initConfigAnimation = this.config.animation; if (tip.getAttribute('x-placement') !== null) { return; } $$$1(tip).removeClass(ClassName.FADE); this.config.animation = false; this.hide(); this.show(); this.config.animation = initConfigAnimation; }; // Static Tooltip._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = typeof config === 'object' && config; if (!data && /dispose|hide/.test(config)) { return; } if (!data) { data = new Tooltip(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; _createClass(Tooltip, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }, { key: "NAME", get: function get() { return NAME; } }, { key: "DATA_KEY", get: function get() { return DATA_KEY; } }, { key: "Event", get: function get() { return Event; } }, { key: "EVENT_KEY", get: function get() { return EVENT_KEY; } }, { key: "DefaultType", get: function get() { return DefaultType; } }]); return Tooltip; }(); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Tooltip._jQueryInterface; $$$1.fn[NAME].Constructor = Tooltip; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Tooltip._jQueryInterface; }; return Tooltip; }($, Popper); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): popover.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Popover = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'popover'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.popover'; var EVENT_KEY = "." + DATA_KEY; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var CLASS_PREFIX = 'bs-popover'; var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); var Default = _objectSpread({}, Tooltip.Default, { placement: 'right', trigger: 'click', content: '', template: '' + '' + '' + '' }); var DefaultType = _objectSpread({}, Tooltip.DefaultType, { content: '(string|element|function)' }); var ClassName = { FADE: 'fade', SHOW: 'show' }; var Selector = { TITLE: '.popover-header', CONTENT: '.popover-body' }; var Event = { HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, INSERTED: "inserted" + EVENT_KEY, CLICK: "click" + EVENT_KEY, FOCUSIN: "focusin" + EVENT_KEY, FOCUSOUT: "focusout" + EVENT_KEY, MOUSEENTER: "mouseenter" + EVENT_KEY, MOUSELEAVE: "mouseleave" + EVENT_KEY /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Popover = /*#__PURE__*/ function (_Tooltip) { _inheritsLoose(Popover, _Tooltip); function Popover() { return _Tooltip.apply(this, arguments) || this; } var _proto = Popover.prototype; // Overrides _proto.isWithContent = function isWithContent() { return this.getTitle() || this._getContent(); }; _proto.addAttachmentClass = function addAttachmentClass(attachment) { $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); }; _proto.getTipElement = function getTipElement() { this.tip = this.tip || $$$1(this.config.template)[0]; return this.tip; }; _proto.setContent = function setContent() { var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events this.setElementContent($tip.find(Selector.TITLE), this.getTitle()); var content = this._getContent(); if (typeof content === 'function') { content = content.call(this.element); } this.setElementContent($tip.find(Selector.CONTENT), content); $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW); }; // Private _proto._getContent = function _getContent() { return this.element.getAttribute('data-content') || this.config.content; }; _proto._cleanTipClass = function _cleanTipClass() { var $tip = $$$1(this.getTipElement()); var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); if (tabClass !== null && tabClass.length > 0) { $tip.removeClass(tabClass.join('')); } }; // Static Popover._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = typeof config === 'object' ? config : null; if (!data && /destroy|hide/.test(config)) { return; } if (!data) { data = new Popover(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; _createClass(Popover, null, [{ key: "VERSION", // Getters get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }, { key: "NAME", get: function get() { return NAME; } }, { key: "DATA_KEY", get: function get() { return DATA_KEY; } }, { key: "Event", get: function get() { return Event; } }, { key: "EVENT_KEY", get: function get() { return EVENT_KEY; } }, { key: "DefaultType", get: function get() { return DefaultType; } }]); return Popover; }(Tooltip); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Popover._jQueryInterface; $$$1.fn[NAME].Constructor = Popover; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Popover._jQueryInterface; }; return Popover; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): scrollspy.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var ScrollSpy = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'scrollspy'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.scrollspy'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var Default = { offset: 10, method: 'auto', target: '' }; var DefaultType = { offset: 'number', method: 'string', target: '(string|element)' }; var Event = { ACTIVATE: "activate" + EVENT_KEY, SCROLL: "scroll" + EVENT_KEY, LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY }; var ClassName = { DROPDOWN_ITEM: 'dropdown-item', DROPDOWN_MENU: 'dropdown-menu', ACTIVE: 'active' }; var Selector = { DATA_SPY: '[data-spy="scroll"]', ACTIVE: '.active', NAV_LIST_GROUP: '.nav, .list-group', NAV_LINKS: '.nav-link', NAV_ITEMS: '.nav-item', LIST_ITEMS: '.list-group-item', DROPDOWN: '.dropdown', DROPDOWN_ITEMS: '.dropdown-item', DROPDOWN_TOGGLE: '.dropdown-toggle' }; var OffsetMethod = { OFFSET: 'offset', POSITION: 'position' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var ScrollSpy = /*#__PURE__*/ function () { function ScrollSpy(element, config) { var _this = this; this._element = element; this._scrollElement = element.tagName === 'BODY' ? window : element; this._config = this._getConfig(config); this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS); this._offsets = []; this._targets = []; this._activeTarget = null; this._scrollHeight = 0; $$$1(this._scrollElement).on(Event.SCROLL, function (event) { return _this._process(event); }); this.refresh(); this._process(); } // Getters var _proto = ScrollSpy.prototype; // Public _proto.refresh = function refresh() { var _this2 = this; var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION; var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; this._offsets = []; this._targets = []; this._scrollHeight = this._getScrollHeight(); var targets = [].slice.call(document.querySelectorAll(this._selector)); targets.map(function (element) { var target; var targetSelector = Util.getSelectorFromElement(element); if (targetSelector) { target = document.querySelector(targetSelector); } if (target) { var targetBCR = target.getBoundingClientRect(); if (targetBCR.width || targetBCR.height) { // TODO (fat): remove sketch reliance on jQuery position/offset return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector]; } } return null; }).filter(function (item) { return item; }).sort(function (a, b) { return a[0] - b[0]; }).forEach(function (item) { _this2._offsets.push(item[0]); _this2._targets.push(item[1]); }); }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); $$$1(this._scrollElement).off(EVENT_KEY); this._element = null; this._scrollElement = null; this._config = null; this._selector = null; this._offsets = null; this._targets = null; this._activeTarget = null; this._scrollHeight = null; }; // Private _proto._getConfig = function _getConfig(config) { config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {}); if (typeof config.target !== 'string') { var id = $$$1(config.target).attr('id'); if (!id) { id = Util.getUID(NAME); $$$1(config.target).attr('id', id); } config.target = "#" + id; } Util.typeCheckConfig(NAME, config, DefaultType); return config; }; _proto._getScrollTop = function _getScrollTop() { return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; }; _proto._getScrollHeight = function _getScrollHeight() { return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); }; _proto._getOffsetHeight = function _getOffsetHeight() { return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; }; _proto._process = function _process() { var scrollTop = this._getScrollTop() + this._config.offset; var scrollHeight = this._getScrollHeight(); var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); if (this._scrollHeight !== scrollHeight) { this.refresh(); } if (scrollTop >= maxScroll) { var target = this._targets[this._targets.length - 1]; if (this._activeTarget !== target) { this._activate(target); } return; } if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { this._activeTarget = null; this._clear(); return; } var offsetLength = this._offsets.length; for (var i = offsetLength; i--;) { var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); if (isActiveTarget) { this._activate(this._targets[i]); } } }; _proto._activate = function _activate(target) { this._activeTarget = target; this._clear(); var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style queries = queries.map(function (selector) { return selector + "[data-target=\"" + target + "\"]," + (selector + "[href=\"" + target + "\"]"); }); var $link = $$$1([].slice.call(document.querySelectorAll(queries.join(',')))); if ($link.hasClass(ClassName.DROPDOWN_ITEM)) { $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE); $link.addClass(ClassName.ACTIVE); } else { // Set triggered link as active $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active // With both and markup a parent is the previous sibling of any nav ancestor $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE); } $$$1(this._scrollElement).trigger(Event.ACTIVATE, { relatedTarget: target }); }; _proto._clear = function _clear() { var nodes = [].slice.call(document.querySelectorAll(this._selector)); $$$1(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE); }; // Static ScrollSpy._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $$$1(this).data(DATA_KEY); var _config = typeof config === 'object' && config; if (!data) { data = new ScrollSpy(this, _config); $$$1(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; _createClass(ScrollSpy, null, [{ key: "VERSION", get: function get() { return VERSION; } }, { key: "Default", get: function get() { return Default; } }]); return ScrollSpy; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(window).on(Event.LOAD_DATA_API, function () { var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY)); var scrollSpysLength = scrollSpys.length; for (var i = scrollSpysLength; i--;) { var $spy = $$$1(scrollSpys[i]); ScrollSpy._jQueryInterface.call($spy, $spy.data()); } }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = ScrollSpy._jQueryInterface; $$$1.fn[NAME].Constructor = ScrollSpy; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return ScrollSpy._jQueryInterface; }; return ScrollSpy; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): tab.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Tab = function ($$$1) { /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'tab'; var VERSION = '4.1.3'; var DATA_KEY = 'bs.tab'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $$$1.fn[NAME]; var Event = { HIDE: "hide" + EVENT_KEY, HIDDEN: "hidden" + EVENT_KEY, SHOW: "show" + EVENT_KEY, SHOWN: "shown" + EVENT_KEY, CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY }; var ClassName = { DROPDOWN_MENU: 'dropdown-menu', ACTIVE: 'active', DISABLED: 'disabled', FADE: 'fade', SHOW: 'show' }; var Selector = { DROPDOWN: '.dropdown', NAV_LIST_GROUP: '.nav, .list-group', ACTIVE: '.active', ACTIVE_UL: '> li > .active', DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]', DROPDOWN_TOGGLE: '.dropdown-toggle', DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active' /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ }; var Tab = /*#__PURE__*/ function () { function Tab(element) { this._element = element; } // Getters var _proto = Tab.prototype; // Public _proto.show = function show() { var _this = this; if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) { return; } var target; var previous; var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0]; var selector = Util.getSelectorFromElement(this._element); if (listElement) { var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE; previous = $$$1.makeArray($$$1(listElement).find(itemSelector)); previous = previous[previous.length - 1]; } var hideEvent = $$$1.Event(Event.HIDE, { relatedTarget: this._element }); var showEvent = $$$1.Event(Event.SHOW, { relatedTarget: previous }); if (previous) { $$$1(previous).trigger(hideEvent); } $$$1(this._element).trigger(showEvent); if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) { return; } if (selector) { target = document.querySelector(selector); } this._activate(this._element, listElement); var complete = function complete() { var hiddenEvent = $$$1.Event(Event.HIDDEN, { relatedTarget: _this._element }); var shownEvent = $$$1.Event(Event.SHOWN, { relatedTarget: previous }); $$$1(previous).trigger(hiddenEvent); $$$1(_this._element).trigger(shownEvent); }; if (target) { this._activate(target, target.parentNode, complete); } else { complete(); } }; _proto.dispose = function dispose() { $$$1.removeData(this._element, DATA_KEY); this._element = null; }; // Private _proto._activate = function _activate(element, container, callback) { var _this2 = this; var activeElements; if (container.nodeName === 'UL') { activeElements = $$$1(container).find(Selector.ACTIVE_UL); } else { activeElements = $$$1(container).children(Selector.ACTIVE); } var active = activeElements[0]; var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE); var complete = function complete() { return _this2._transitionComplete(element, active, callback); }; if (active && isTransitioning) { var transitionDuration = Util.getTransitionDurationFromElement(active); $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); } else { complete(); } }; _proto._transitionComplete = function _transitionComplete(element, active, callback) { if (active) { $$$1(active).removeClass(ClassName.SHOW + " " + ClassName.ACTIVE); var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0]; if (dropdownChild) { $$$1(dropdownChild).removeClass(ClassName.ACTIVE); } if (active.getAttribute('role') === 'tab') { active.setAttribute('aria-selected', false); } } $$$1(element).addClass(ClassName.ACTIVE); if (element.getAttribute('role') === 'tab') { element.setAttribute('aria-selected', true); } Util.reflow(element); $$$1(element).addClass(ClassName.SHOW); if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) { var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0]; if (dropdownElement) { var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE)); $$$1(dropdownToggleList).addClass(ClassName.ACTIVE); } element.setAttribute('aria-expanded', true); } if (callback) { callback(); } }; // Static Tab._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var $this = $$$1(this); var data = $this.data(DATA_KEY); if (!data) { data = new Tab(this); $this.data(DATA_KEY, data); } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError("No method named \"" + config + "\""); } data[config](); } }); }; _createClass(Tab, null, [{ key: "VERSION", get: function get() { return VERSION; } }]); return Tab; }(); /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { event.preventDefault(); Tab._jQueryInterface.call($$$1(this), 'show'); }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $$$1.fn[NAME] = Tab._jQueryInterface; $$$1.fn[NAME].Constructor = Tab; $$$1.fn[NAME].noConflict = function () { $$$1.fn[NAME] = JQUERY_NO_CONFLICT; return Tab._jQueryInterface; }; return Tab; }($); /** * -------------------------------------------------------------------------- * Bootstrap (v4.1.3): index.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ (function ($$$1) { if (typeof $$$1 === 'undefined') { throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); } var version = $$$1.fn.jquery.split(' ')[0].split('.'); var minMajor = 1; var ltMajor = 2; var minMinor = 9; var minPatch = 1; var maxMajor = 4; if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); } })($); exports.Util = Util; exports.Alert = Alert; exports.Button = Button; exports.Carousel = Carousel; exports.Collapse = Collapse; exports.Dropdown = Dropdown; exports.Modal = Modal; exports.Popover = Popover; exports.Scrollspy = ScrollSpy; exports.Tab = Tab; exports.Tooltip = Tooltip; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=bootstrap.js.map ================================================ FILE: src/main/webapp/static/bootstrap/css/bootstrap-theme.css ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #2e6da4; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ ================================================ FILE: src/main/webapp/static/bootstrap/css/bootstrap.css ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { margin: .67em 0; font-size: 2em; } mark { color: #000; background: #ff0; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -.5em; } sub { bottom: -.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { height: 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { margin: 0; font: inherit; color: inherit; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { padding: .35em .625em .75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-spacing: 0; border-collapse: collapse; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; max-width: 100%; height: auto; padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; margin-left: -5px; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control::-ms-expand { background-color: transparent; border: 0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eee; } .nav > li.disabled > a { color: #777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eee #eee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; -webkit-overflow-scrolling: touch; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #23527c; background-color: #eee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 15px; padding-left: 15px; border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border .2s ease-in-out; -o-transition: border .2s ease-in-out; transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; } .progress-striped .progress-bar, .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); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { 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); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { 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); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { 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); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { 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); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, .15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: .2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: .5; } button.close { -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .tooltip.in { filter: alpha(opacity=90); opacity: .9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999; border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999; border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, .25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, .25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: .6s ease-in-out left; -o-transition: .6s ease-in-out left; transition: .6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform .6s ease-in-out; -o-transition: -o-transform .6s ease-in-out; transition: transform .6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { left: 0; -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { left: 0; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { left: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); background-color: rgba(0, 0, 0, 0); filter: alpha(opacity=50); opacity: .5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; filter: alpha(opacity=90); outline: 0; opacity: .9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: src/main/webapp/static/bootstrap/css/style.css ================================================ body{background:#fff;color:#5B5B5D;font-family:"Microsoft YaHei","Segoe UI","Lucida Grande",Helvetica,Arial,sans-serif} *{margin:0;margin:0} .sucaihuo-container{margin:0 auto;text-align:center;overflow:hidden} .sucaihuo-header{padding:3em 190px 2em;letter-spacing:-1px;text-align:center} .sucaihuo-header h1{color:#404d5b;font-weight:600;font-size:2em;line-height:1;margin-bottom:0;font-family:"Segoe UI","Lucida Grande",Helvetica,Arial,"Microsoft YaHei",FreeSans,Arimo,"Droid Sans","wenquanyi micro hei","Hiragino Sans GB","Hiragino Sans GB W3","FontAwesome",sans-serif} .sucaihuo-content{min-height:60vh;height:60vh;font-size:150%;padding:1em 0} .bgcolor-3{background:#e8e8e8} *,*:after,*:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} .form-bg{ background: #00b4ef; } .form-horizontal{ background: #fff; padding-bottom: 40px; border-radius: 15px; text-align: center; } .form-horizontal .heading{ display: block; font-size: 35px; font-weight: 700; padding: 35px 0; border-bottom: 1px solid #f0f0f0; margin-bottom: 30px; } .form-horizontal .form-group{ padding: 0 40px; margin: 0 0 25px 0; position: relative; } .form-horizontal .form-control{ background: #f0f0f0; border: none; border-radius: 20px; box-shadow: none; padding: 0 20px 0 45px; height: 40px; transition: all 0.3s ease 0s; } .form-horizontal .form-control:focus{ background: #e0e0e0; box-shadow: none; outline: 0 none; } .form-horizontal .form-group i{ position: absolute; top: 12px; left: 60px; font-size: 17px; color: #c8c8c8; transition : all 0.5s ease 0s; } .form-horizontal .form-control:focus + i{ color: #00b4ef; } .form-horizontal .fa-question-circle{ display: inline-block; position: absolute; top: 12px; right: 60px; font-size: 20px; color: #808080; transition: all 0.5s ease 0s; } .form-horizontal .fa-question-circle:hover{ color: #000; } .form-horizontal .main-checkbox{ float: left; width: 20px; height: 20px; background: #11a3fc; border-radius: 50%; position: relative; margin: 5px 0 0 5px; border: 1px solid #11a3fc; } .form-horizontal .main-checkbox label{ width: 20px; height: 20px; position: absolute; top: 0; left: 0; cursor: pointer; } .form-horizontal .main-checkbox label:after{ content: ""; width: 10px; height: 5px; position: absolute; top: 5px; left: 4px; border: 3px solid #fff; border-top: none; border-right: none; background: transparent; opacity: 0; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .form-horizontal .main-checkbox input[type=checkbox]{ visibility: hidden; } .form-horizontal .main-checkbox input[type=checkbox]:checked + label:after{ opacity: 1; } .form-horizontal .text{ float: left; margin-left: 7px; line-height: 20px; padding-top: 5px; text-transform: capitalize; } .form-horizontal .btn{ float: right; font-size: 14px; color: #fff; background: #00b4ef; border-radius: 30px; padding: 10px 25px; border: none; text-transform: capitalize; transition: all 0.5s ease 0s; } @media only screen and (max-width: 479px){ .form-horizontal .form-group{ padding: 0 25px; } .form-horizontal .form-group i{ left: 45px; } .form-horizontal .btn{ padding: 10px 20px; } } ================================================ FILE: src/main/webapp/static/bootstrap/js/bootstrap.js ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.3.7 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.3.7 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.3.7' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector === '#' ? [] : selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.3.7 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.3.7' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { // Prevent double click on radios, and the double selections (so cancellation) on checkboxes e.preventDefault() // The target component still receive the focus if ($btn.is('input,button')) $btn.trigger('focus') else $btn.find('input:visible,button:visible').first().trigger('focus') } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.3.7 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.3.7' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.3.7 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ /* jshint latedef: false */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.3.7' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.3.7 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.3.7' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector && $(selector) return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger($.Event('shown.bs.dropdown', relatedTarget)) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.3.7 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.3.7' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(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') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.3.7 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.3.7' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 } } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (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!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { options = $.extend({}, this.getDefaults(), this.$element.data(), options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.3.7 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.3.7' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' ](content) $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.3.7 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.3.7' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.3.7 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.3.7' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.3.7 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) this.$target = $(this.options.target) .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.3.7' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: src/main/webapp/static/bootstrap/js/npm.js ================================================ // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. require('../../js/transition.js') require('../../js/alert.js') require('../../js/button.js') require('../../js/carousel.js') require('../../js/collapse.js') require('../../js/dropdown.js') require('../../js/modal.js') require('../../js/tooltip.js') require('../../js/popover.js') require('../../js/scrollspy.js') require('../../js/tab.js') require('../../js/affix.js') ================================================ FILE: src/main/webapp/static/css/buySeat.css ================================================ .container{ display: block; margin-bottom: 100px; padding: 0; } .container .order-progress-bar{ height: 60px; width: 100%; margin: 40px 0; text-align: center; } .container .order-progress-bar .step{ float: left; width: 25%; } .container .order-progress-bar .step .step-num{ color: #fff; font-size: 12px; display: inline-block; width: 16px; height: 16px; line-height: 16px; border-radius: 10px; text-align: center; background-color: #ffd8d7; position: relative; top: 10px; } .container .order-progress-bar .first .bar{ border-left-color: transparent !important; } .container .order-progress-bar .last .bar{ border-right-color: transparent !important; } .container .order-progress-bar .step .bar{ width: 0; height: 4px; border-left: 150px solid #ffd8d7; border-right: 150px solid #ffd8d7; } .container .order-progress-bar .done .step-num{ background-color: #f03d37; } .container .order-progress-bar .done .bar{ border-left: 150px solid #f03d37; border-right: 150px solid #f03d37; } .container .order-progress-bar .step .step-next{ font-size: 14px; color: #999; display: inline-block; margin-top: 10px; } .main{ width: 100%; border: 1px solid #e5e5e5; font-size: 0; min-height: 600px; } .main .hall{ width: 770px; display: inline-block; vertical-align: top; } .main .hall .seat-example{ margin: 30px 0 30px 118px; } .main .hall .seat-example .example{ display: inline-block; font-size: 16px; color: #666; height: 26px; line-height: 26px; padding-left: 38px; background-repeat: no-repeat; margin-right: 50px; } .main .hall .seat-example .selectable-example{ background-image: url("../images/selectable_seat.JPG"); } .main .hall .seat-example .sold-example{ background-image: url("../images/sold_seat.JPG"); } .main .hall .seat-example .selected-example{ background-image: url("../images/selected_seat.JPG"); } .main .hall .seat-example .couple-example{ padding-left: 77px; background-image: url("../images/couple_seat.JPG"); } .main .hall .seats-block{ font-size: 0; overflow: hidden; margin-left: 20px; white-space: nowrap; } .main .hall .seats-block .row-id-container{ width: 20px; float: left; margin-top: 112px; white-space: normal; } .main .hall .seats-block .row-id-container .row-id{ font-size: 16px; color: #999; margin-right: 40px; margin-bottom: 10px; display: inline-block; width: 20px; height: 26px; line-height: 29px; text-align: center; } .main .hall .seats-block .seats-container{ margin-left: 50px; overflow: auto; position: relative; padding-top: 112px; } .main .hall .seats-block .seats-container .screen-container{ display: inline-block; position: absolute; top: 0; bottom: 0; z-index: -1; } .main .hall .seats-block .seats-container .screen-container .screen{ width: 550px; padding-top: 50px; text-align: center; font-size: 16px; color: #666; background: url("../images/screen.JPG"); background-repeat: no-repeat; position: relative; margin-bottom: 40px } .main .hall .seats-block .seats-container .screen-container .c-screen-line { width: 0; border-left: 1px dashed #e5e5e5; position: absolute; top: 90px; bottom: 0; left: 50%; } .main .hall .seats-block .seats-wrapper{ display: inline-block; min-width: 550px; } .main .hall .seats-block .seats-wrapper .row{ white-space: nowrap; margin-bottom: 10px; text-align: center; } .main .hall .seats-block .seats-wrapper .row .seat{ display: inline-block; font-size: 0; width: 30px; height: 26px; margin: 0 5px; background: url(../images/selectable_seat.JPG) no-repeat; background-position: 0 1px; } .main .hall .seats-block .seats-wrapper .row .empty{ background-image: none; } .main .hall .seats-block .seats-wrapper .row .selectable{ background: url(../images/selectable_seat.JPG) no-repeat; } .main .hall .seats-block .seats-wrapper .row .selected{ background: url(../images/selected_seat.JPG) no-repeat; } .main .hall .seats-block .seats-wrapper .row .sold{ background: url(../images/sold_seat.JPG) no-repeat; pointer-events: none; } .main .side{ width: 368px; background-color: #f9f9f9; padding: 20px; display: inline-block; min-height: 650px; } .main .side .poster{ width: 115px; height: 158px; border: 2px solid #fff; -webkit-box-shadow: 0 2px 7px 0 hsla(0,0%,53%,.5); box-shadow: 0 2px 7px 0 hsla(0,0%,53%,.5); float: left; } .main .side .poster img{ width: 100%; height: 100%; } .main .side .content{ margin-left: 140px; } .main .side .content .name{ font-size: 20px; font-weight: 700; color: #333; margin: 0 0 14px; } .main .side .content .text-ellipsis{ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .main .side .content .info-item{ font-size: 12px; color: #999; margin-bottom: 4px } .main .side .content .info-item .value{ color: #151515; margin-left: 2px; } .main .side .show-info{ margin-top: 20px; } .main .side .show-info .info-item{ margin-bottom: 9px; color: #999; } .main .side .show-info .info-item span{ display: inline-block; vertical-align: top; font-size: 14px; } .main .side .show-info .info-item .value{ width: 85%; color: #151515; margin-left: 2px; } .main .side .show-info .info-item .screen{ color: #f03d37; } .main .side .ticket-info{ padding: 20px 0 10px; border-top: 1px dashed #e5e5e5; border-bottom: 1px dashed #e5e5e5; } .main .side .ticket-info .no-ticket{ font-size: 14px; color: #999; margin: 0 0 20px; } .main .side .ticket-info .has-ticket .text{ font-size: 14px; color: #999; float: left; } .main .side .ticket-info .has-ticket .ticket-container{ margin-left: 42px; margin-bottom: 20px; position: relative; top: -5px; } .main .side .ticket-info .has-ticket .ticket-container .ticket{ cursor: default; position: relative; font-size: 12px; color: #f03d37; display: inline-block; width: 60px; height: 30px; line-height: 30px; text-align: center; margin: 0 12px 10px 0; background: url(../images/ticket.JPG) no-repeat; } .main .side .ticket-info .total-price{ font-size: 14px; color: #333; } .main .side .confirm-order{ padding: 20px 0; text-align: center; } .main .side .confirm-order .email{ color: #999; font-size: 14px; } .main .side .confirm-order .email .email-num{ color: #151515; } .main .side .confirm-order .confirm-btn{ cursor: pointer; width: 260px; height: 42px; line-height: 42px; text-align: center; font-size: 16px; color: #fff; border-radius: 21px; position: relative; left: 50%; margin: 38px 0 0 -130px; background-color: #f03d37; -webkit-box-shadow: 0 2px 10px -2px #f03d37; box-shadow: 0 2px 10px -2px #f03d37; } .main .side .confirm-order .disable{ cursor: default; background-color: #dedede; box-shadow: none; pointer-events: none; } ================================================ FILE: src/main/webapp/static/css/buyTickets.css ================================================ .banner2 .wrapper { /*background: #000;*/ width: 1200px; margin: 0 auto; height: 376px; position: relative; } .banner2 { width: 100%; min-width: 1200px; background: #392f59 url("../images/banner.png") no-repeat 50%; } .banner2 .wrapper .celeInfo-left { width: 300px; float: left; position: relative; top: 70px; overflow: hidden; z-index: 9; } .celeInfo-left .avatar-shadow .avatar { border: 4px solid #fff; height: 322px; width: 232px; } .celeInfo-left .avatar-shadow, .cinema-left .avatar-shadow { position: relative; margin: 0 30px; width: 240px; height: 330px; padding-bottom: 40px; background: url("../images/gray.jpg") no-repeat bottom; } .banner2 .wrapper .celeInfo-right { height: 100%; position: relative; margin-right: 30px; margin-left: 300px; margin-top: 70px; } .movie-brief-container { position: absolute; top: 73px; color: #fff; font-size: 14px; z-index: 1; } .movie-brief-container .name { width: 900px; margin-top: 0; font-size: 26px; line-height: 32px; font-weight: 700; margin-bottom: 0; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; max-height: 64px; } .movie-brief-container .ename { width: 340px; font-size: 18px; line-height: 1.3; margin-bottom: 14px; } .banner2 li, .banner2 p, .banner2 ul { margin: 0; padding: 0; list-style: none; line-height: 1; } .movie-brief-container ul li { margin: 12px 0; line-height: 100%; } .action-buyBtn { position: absolute; bottom: 20px; } .action-buyBtn .action a { cursor: pointer; float: left; display: block; width: 120px; height: 35px; background-color: #756189; margin-right: 10px; padding-top: 11px; text-align: center; font-size: 14px; line-height: 16px; color: #fff; border-radius: 2px; } .action-buyBtn .action i.icon { display: inline-block; vertical-align: middle; margin-top: -2px; margin-right: 2px; width: 20px; height: 20px; } .action-buyBtn .action .wish i.wish-icon { background: url("../images/heart.jpg"); } .action-buyBtn .action .score-btn i.score-btn-icon { background: url("../images/star.jpg"); } .btn { display: inline-block; padding: 2px 15px; line-height: 25px; font-size: 15px; color: #fff; background-color: #df2d2d; } .action-buyBtn .btn.buy { margin-top: 10px; width: 250px; height: 40px; font-size: 16px; line-height: 40px; text-align: center; border-radius: 2px; padding: 0; color: #ddd; } .action-buyBtn .btn.buy:hover { color: #fff; } .movie-stats-container { position: absolute; top: 158px; left: 342px; } .movie-stats-container .movie-index { margin-bottom: 16px; color: #fff; } .movie-stats-container .movie-index .movie-index-title { font-size: 12px; margin-bottom: 8px; } .movie-stats-container .movie-index .movie-index-content { overflow: hidden; } .movie-stats-container .movie-index .movie-index-content .index-left { float: left; } .movie-stats-container .movie-index .movie-index-content .info-num { font-size: 30px; color: #ffc600; height: 30px; line-height: 30px; } .stonefont { font-family: stonefont; } .movie-stats-container .movie-index .box .stonefont { font-size: 30px; } .movie-stats-container .movie-index .movie-index-content .index-right { margin-left: 54px; font-size: 12px; } .movie-stats-container .movie-index .movie-index-content .star-wrapper { width: 130px; height: 15px; position: relative; /*background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR…6S4us6l62wa1DjEHrgZ5YkNs34vsMTQ76UYYU+5hG2ilE8ABzT5mRcPmFIAAAAAElFTkSuQmCC);*/ background-repeat: repeat-x; margin-bottom: 4px; } .movie-stats-container .movie-index .movie-index-content .star-wrapper .star-on { height: 15px; background-image: url("../images/lightStar.jpg"); background-repeat: repeat-x; } .main-inner{ /*background: white;*/ } .tags-panel { border: 1px solid #e5e5e5; padding: 0 20px; margin: 40px 0; position: relative; } .tags-panel li, .tags-panel ul { margin: 0; padding: 0; list-style-type: none; } .tags-title { height: 24px; line-height: 24px; float: left; color: #999; font-size: 14px; } .tags-panel ul.tags { margin-left: 40px; } .tags li.active { background: #f34d41; color: #fff; } .tags li { border-radius: 14px; padding: 3px 9px; display: inline-block; margin-left: 12px; } .tags li.active a { color: #fff; } .tags li a { color: #333; font-size: 14px; } .tags-line-border { border-top: 1px dashed #e5e5e5; } .tags-line { padding: 10px 0!important; } .cinemas-list .cinemas-list-header { font-size: 18px; color: #333; border-left: 4px solid #f03d37; padding-left: 6px; line-height: 18px; margin: 0; } .cinemas-list .cinema-cell { display: block; padding: 20px 0; border-bottom: 1px dashed #e5e5e5; } .cinemas-list .cinema-info { display: inline-block; max-width: 80%; } .cinemas-list .cinema-name { display: inline-block; font-size: 16px; line-height: 18px; color: #333; text-decoration: none; margin-bottom: 10px; } .cinemas-list .cinema-address { font-size: 14px; line-height: 14px; color: #999; } .cinemas-list .buy-btn { float: right; width: 80px; height: 45px; line-height: 45px; margin-left: 36px; } .cinemas-list .buy-btn a { display: inline-block; width: 100%; height: 30px; color: #fff; background-color: #f03d37; font-size: 14px; line-height: 30px; border-radius: 100px; text-align: center; -webkit-box-shadow: 0 2px 10px -2px #f03d37; box-shadow: 0 2px 10px -2px #f03d37; text-decoration: none; } .cinemas-list .price { float: right; font-size: 12px; color: #999; height: 45px; line-height: 45px; } .cinemas-list .price .rmb { margin-right: -4px; } .cinemas-list .price .price-num { font-size: 16px; margin-right: -3px; font-weight: 700; } .red { color: #f03d37; } .cinema-pager { text-align: center; } .list-pager { display: block; list-style-type: disc; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; padding-inline-start: 40px; } .list-pager li.active { border-color: #ef4238; background-color: #ef4238; } .list-pager li { display: inline-block; height: 30px; margin: 0 4px; border: 1px solid #d8d8d8; line-height: 30px; text-align: center; color: #999; } .list-pager li.active a { color: #fff; } .list-pager a { display: block; padding: 0 12px; color: #333; } .list-pager a { font-size: 14px; } .banner2 .action-buyBtn a{ text-decoration: none; } .moviedetail{ height: 40px !important; width: 20px !important; background-color: rgba(red, green, blue, 0.5); } ================================================ FILE: src/main/webapp/static/css/center.css ================================================ .container{ padding: 0; width: 1200px; height: 1200px; margin-bottom: 100px; } .container .contents .nav-next{ float: left; width: 200px; height: 1198px; background-color: #f4f3f4; border: 1px solid #ddd; } .container .contents .nav-next .nav-title{ margin: 40px auto 30px; text-align: center; } .container .contents .nav-next a{ font-size: 18px; text-align: center; display: block; text-decoration: none; cursor: pointer; height: 40px; width: 100%; line-height: 40px; } .container .contents .nav-next .active{ color: #fff; background-color: #ed3931; } .container .contents .nav-body{ float: left; overflow: auto; width: 940px; height: 1198px; border: 1px solid #ddd; padding-left: 40px; } .container .contents .nav-body .one, .two, .three{ float: left; width: 100%; height: 100%; } .container .contents .nav-body .one .title{ font-size: 18px; color: #ec443f; padding: 26px 0; } .container .contents .nav-body .one hr{ margin-bottom: 30px; } .container .contents .nav-body .one .order-box{ height: 186px; width: (100%-40); margin: 0 40px 30px 0; border: 1px solid #ddd; } .container .contents .nav-body .one .order-box .order-head{ background-color: #f7f7f7; padding: 16px 20px; } .container .contents .nav-body .one .order-box .order-head .order-date{ font-size: 15px; margin-right: 30px; } .container .contents .nav-body .one .order-box .order-head .order-id{ font-size: 14px; color: #999; } .container .contents .nav-body .one .order-box .order-head .order-delete{ font-size: 15px; float: right; } .container .contents .nav-body .one .order-box .order-body{ padding: 20px 0 20px 20px; float: left; height: 133px; width: 100%; } .container .contents .nav-body .one .order-box .order-body .poster{ border: 2px solid #fff; box-shadow: 1px 2px 0 #eee; width: 70px; height: 95px; margin-right: 11px; float: left; } .container .contents .nav-body .one .order-box .order-body .poster img{ width: 100%; height: 100%; } .container .contents .nav-body .one .order-box .order-body .order-content{ width: 49%; height: 100%; float: left; } .container .contents .nav-body .one .order-box .order-body .order-content .movie-name{ font-size: 16px; font-weight: 700; color: #333; margin: 4px 0 7px -6px; } .container .contents .nav-body .one .order-box .order-body .order-content .cinema-name{ font-size: 12px; color: #999; margin-bottom: 4px; } .container .contents .nav-body .one .order-box .order-body .order-content .hall-ticket{ font-size: 12px; color: #999; margin-bottom: 4px; } .container .contents .nav-body .one .order-box .order-body .order-content .show-time{ font-size: 12px; color: #f03d37; } .container .contents .nav-body .one .order-box .order-body .order-price{ float: left; font-size: 14px; color: #333; width: 12%; line-height: 95px; } .container .contents .nav-body .one .order-box .order-body .order-status{ float: left; font-size: 14px; color: #333; width: 12%; line-height: 95px; } .container .contents .nav-body .one .order-box .order-body .actions{ float: right; font-size: 14px; color: #333; width: 12%; line-height: 95px; text-decoration: none; } .container .contents .nav-body .one .order-box .order-body .actions a{ text-decoration: none; } .container .contents .nav-body .two .title{ font-size: 18px; color: #ec443f; padding: 26px 0; } .container .contents .nav-body .two hr{ margin-bottom: 30px; } .container .contents .nav-body .two .avatar-container{ width: 270px; float: left; margin-left: 70px; text-align: center; } .container .contents .nav-body .two .avatar-container img{ width: 258px; height: 258px; } .container .contents .nav-body .two .avatar-container .update-image{ position: relative; } .container .contents .nav-body .two .avatar-container .update-image .upload-btn{ cursor: pointer; margin: 20px auto 0; width: 182px; height: 56px; line-height: 56px; color: #5b5b5b; background-color: #e6e6e6; border-radius: 10px; border: 1px; font-size: 18px; padding: 0; } .container .contents .nav-body .two .avatar-container .update-image #fileUpload{ cursor: copy; position: absolute; width: 185px; height: 60px; top: 18px; right: 42px; opacity: 0; bottom: -50px; direction: ltr; font-size: 200px !important; } .container .contents .nav-body .two .avatar-container .tips{ margin-top: 10px; color: #999; font-size: 18px; line-height: 30px; } .container .contents .nav-body .two .avatar-body{ float: left; width: 495px; margin-left: 58px; margin-top: 100px; } .container .contents .nav-body .two .avatar-body .userexinfo-form-section:first-child{ margin-top: 0; } .container .contents .nav-body .two .avatar-body .userexinfo-form-section{ color: #666; position: relative; margin: 20px 0; padding-left: 90px; height: 30px; line-height: 30px; font-size: 14px; } .container .contents .nav-body .two .avatar-body .userexinfo-form-section p{ position: absolute; top: 0; left: 0; width: 80px; text-align: right; color: #333; padding: 0; margin: 0; font-size: 16px; } .container .contents .nav-body .two .avatar-body .userexinfo-btn-section{ color: #666; position: relative; margin-top: 40px; padding-left: 90px; line-height: 30px; font-size: 14px; } .container .contents .nav-body .two .avatar-body .userexinfo-btn-section .form-save-btn{ cursor: pointer; border-radius: 5px; width: 100px; height: 40px; color: #fff; font-size: 18px; line-height: 40px; border: none; background-color: #ed3931; padding: 0; text-align: center; } .container .contents .nav-body .three .title{ font-size: 18px; color: #ec443f; padding: 26px 0; } .container .contents .nav-body .three hr{ margin-bottom: 30px; } .container .contents .nav-body .three .avatar-body{ margin-left: 30%; } .container .contents .nav-body .three .avatar-body .userexinfo-form-section{ color: #666; position: relative; margin: 20px 0; padding-left: 90px; height: 30px; line-height: 30px; font-size: 14px; } .container .contents .nav-body .three .avatar-body .userexinfo-form-section p{ position: absolute; top: 0; left: 0; width: 80px; text-align: right; color: #333; padding: 0; margin: 0; font-size: 16px; } .container .contents .nav-body .three .avatar-body .userexinfo-btn-section{ color: #666; position: relative; margin-top: 40px; line-height: 30px; font-size: 14px; margin-left: 15% !important; } .container .contents .nav-body .three .avatar-body .userexinfo-btn-section .password-save-btn{ cursor: pointer; border-radius: 5px; width: 100px; height: 40px; color: #fff; font-size: 18px; line-height: 40px; border: none; background-color: #ed3931; padding: 0; text-align: center; } .two .file { margin-top: 20px; position: relative; display: inline-block; background: #009688; /* border: 1px solid rgb(44, 243, 77); */ border-radius: 4px; padding: 4px 12px; overflow: hidden; color: #fff; text-decoration: none; text-indent: 0; line-height: 20px; cursor: pointer; } .two .file input { position: absolute; font-size: 100px; right: 0; top: 0; opacity: 0; cursor: pointer; } .two .file:hover { background: #00ad9c; /* border-color: #009688; */ color: #fff; text-decoration: none; cursor: pointer; } ================================================ FILE: src/main/webapp/static/css/footer.css ================================================ .footer{ margin-top: 50px; height: 211px; background-color: #262426; } .footer p{ color: #666; } .footer p a{ color:#ef4238; } .footer span { display: inline-block; border-left: 1px solid #444; margin: 0 7px; height: 12px; position: relative; top: 1px; } .footer div { text-align:center; padding: 57px 0; } ================================================ FILE: src/main/webapp/static/css/header.css ================================================ .header{ /* height: 80px; background: white; border-bottom: 1px solid #d8d8d8;*/ /*height: 80px; position: fixed; top: 0;*/ z-index: 999; width: 100%; min-width: 1200px; background-color: #fff; } .header-top{ height: 81px; border-bottom: 1px solid #d8d8d8; } .header .header-inner{ width: 1420px; height: 80px; margin: 0 auto; } .header .header-inner h1{ float: left; width: 260px; height: 80px; } .header .header-inner .logo{ background-image: url("../images/logo_h.jpg"); display: block; float: left; width: 150px; height: 80px; margin-left: 130px; background-position-y: center; background-repeat: no-repeat; background-size: auto 65px; } .header .nav{ width: 400px; height: 80px; display: block; overflow: hidden; margin-left: 40px; float: left; } .header .nav ul{ } .header .nav ul li{ width: 80px; height: 80px; float: left; } .header .nav ul li a{ text-decoration: none; text-align: center; display: inline-block; height: 80px; line-height: 80px; width: 80px; font-size: 18px; color: #333; } .header .nav ul li a:hover{ color: #fff; background-color: #ef4238; } .header .app-download{ float: left; background: url("../images/app.jpg"); width: 162px; height: 80px; } .header form{ width: 260px; height: 40px; float: right; margin: 20px 10px 0 0; position: relative; } .header form .search{ display: inline-block; height: 40px; line-height: 1.2; width: 260px; padding: 0 40px 0 20px; border: 1px solid #ccc; font-size: 14px; border-radius: 30px; background-color: #faf8fa; overflow: hidden; color: #333; } .header form .submit{ display: inline-block; position: absolute; left: 220px; top: 0; height: 40px; width: 40px; background-color: #ef4238; border-radius: 30px; background-image: url("../images/search.jpg"); cursor: pointer; } .header .user-info{ float: right; position: relative; z-index: 9999; height: 100%; margin-right: 200px; } .header .user-info .user-avatar { display: block; border: 1px solid transparent; border-top: none; border-bottom: none; padding: 0 10px; width: 56px; height: 100%; } .header .user-info .user-avatar:hover{ } .header .user-info .user-avatar img { margin-top: -20px; width: 42px; height: 42px; border-radius: 50%; cursor: pointer; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 5px solid #666; border-right: 5px solid transparent; border-left: 5px solid transparent; -webkit-transition: all .2s ease; transition: all .2s ease; } .header .user-info .user-avatar .caret { position: absolute; top: 39px; right: 10px; } .header .user-info .user-menu { display: none; position: absolute; right: 0; top: 80px; border: 1px solid #d8d8d8; background-color: #fff; font-size: 14px; color: #333; text-align: right; padding: 15px 26px 5px; text-align: center; } .header .user-info .user-menu li { margin-bottom: 6px; } .header .user-info .user-menu li>a { color: #999; display: block; word-break: keep-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .header form, .header h3, .header input, .header li, .header ul{ border:none; } .header .banner{ height: 440px; width: 100%; min-width: 1200px; } .header .banner .slider{ position: relative; z-index: 1; display: block; height: 440px; overflow: hidden; width: 1420px; margin: 0 auto; margin-bottom: 88px!important; } .fu-nav{ background-color: #47464a !important; height: 60px; text-align: center; } .fu-nav .layui-this a{ color: #ef4238 !important; } .fu-nav li{ width: 144px; } .fu-nav .layui-this:after, .layui-nav-bar, li:after{ background-color: rgba(177, 25, 131, 0) !important; } .fu-nav a{ font-size: 16px; text-decoration: none; cursor: pointer; } .layui-carousel img{ width: 100%; height: auto; } .nav-image a{ text-align: center; height: 35px; text-decoration: none; line-height: 40px; } .header-li{ width: 42px; height: 42px; margin-top: 18px; } body .layui-nav .layui-nav-more { display: none; } ================================================ FILE: src/main/webapp/static/css/login.css ================================================ *{ margin: 0px; padding: 0px; } body{ background-image: url('../images/2.jpg'); } .screen{ float: left; text-align: center; } .screen .title{ font-size: 72px; color: #fff; } .screen .ineer_one{ margin-top: 20px; font-size: 18px; color: rgba(255, 255, 255, 0.7); font-weight: inherit; margin-right: 60px; } .screen .ineer_two{ font-size: 18px; color: rgba(255, 255, 255, 0.7); font-weight: inherit; margin-left: 60px; } .content{ width: 420px; height: 500px; background-color: rgba(255, 255, 255, 0.3); border-radius: 8px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); } .content .tab{ width: 420px; height: 50px; border-radius: 8px 8px 0px 0px; } .content .tab li{ cursor: default; text-align: center; line-height: 50px; font-size: 24px; width: 49.9%; height: 100%; list-style: none; float: left; color: #fff; font-family: '隶书'; } .content .tab .login{ cursor: pointer; border-radius: 8px 0px 0px 0px; background-color: rgba(255, 255, 255, 0); } .content .tab .register{ cursor: pointer; border-radius: 0px 8px 0px 0px; background-color: rgba(255, 255, 255, 0.2); } .content .page .childpage{ margin-top: -10px; background: rgba(255, 255, 255, 0); width: 420px; height: 420px; border-radius: 0px 0px 8px 8px; text-align: center; } .content .page .childpage .login_page div{ margin-top: 30px; } .content .page .childpage .lo_error{ margin-top: 20px; } .content .page .childpage .login_error{ color: rgb(209, 0, 0); } .content .page .childpage .login_version{ margin-top: 90px; color: #ccc; } .content .page .childpage .login_btn{ width: 240px; } .content .page .childpage .login_page #UserName, #PassWord{ width: 240px; height: 30px; border: none; background-color: rgba(255, 255, 255, 0.3); border-radius: 5px; } .content .page .childpage .login_page label{ color: #fff; } .content .page .childpage .login_title, .register_title{ margin-top: 40px; font-size: 32px; color: #fff; } .content .page .childpage .register_page div{ margin-top: 10px; } .content .page .childpage .register_page #UserName, #PassWord, #Email{ width: 240px; height: 30px; border: none; background-color: rgba(255, 255, 255, 0.3); border-radius: 5px; } .content .page .childpage .register_page #Test{ width: 130px; height: 30px; border: none; background-color: rgba(255, 255, 255, 0.3); border-radius: 5px; } .content .page .childpage .register_page #TestNum{ cursor: pointer; font-weight: bold; text-align: center; color: red; margin-left: 20px; width: 88px; height: 30px; border: none; background-color: rgba(255, 255, 255, 0.8); border-radius: 5px; } .content .page .childpage .register_page label{ color: #fff; } .content .page .childpage .register_error{ color: rgb(209, 0, 0); } .content .page .childpage .re_error{ margin-top: 10px; } .content .page .childpage .register_btn{ width: 240px; } .content .page .childpage .register_version{ margin-top: 10px; color: #ccc; } .screen .big_logo{ background-image: url("../images/logo_t.jpg"); background-color: rgba(255, 255, 255, 0.2); border-radius: 8px; width: 200px; height: 200px; background-repeat: no-repeat; background-size: 200px auto; } ================================================ FILE: src/main/webapp/static/css/main.css ================================================ .main{ overflow: hidden; /* height: 2159px; */ /*background-color: green;*/ } .main .main-inner{ width: 981px; /* height: 2079px; */ margin: 0 auto 0 auto; } .main .main-buyticket{ width: 1200px; /* height: 2079px; */ margin: 0 auto 0 auto; } .main .movie-grid{ margin-top: 10px; float: left; /*width: 738px;*/ width: 850px; /* height: 1414px; */ margin-right: 40px; } .main .main-page{ width: 1271px !important; height: 1760px !important; } .panel-header { overflow: hidden; height: 26px; line-height: 26px; } .panel-title { font-size: 26px; color: #ffb400; } .panel-arrow { background: url("../images/arrow.jpg") top no-repeat; } .panel-arrow { display: inline-block; width: 8px; height: 14px; vertical-align: top; } .panel-more { font-size: 14px; line-height: 16px; float: right; margin-top: 10px; } .panel-content{ height: 550px; } .textcolor_red { color: #ef4238!important; } .textcolor_blue{ color: #2d98f3!important; } .main .aside{ float: right; width: 360px; /* height: 2079px; */ } .movie-list{ margin-top: 23px; } .movie-list li{ margin: 0 45px 28px 0px; float: left; width: 160px; height: 259px; background: #fff; border: 1px solid #efefef; } .movie-poster{ height: 220px; } .movie-poster img { border-style: none; height: 220px; width: 160px; } .movie-poster .movie-overlay { color: #fff; position: relative; top: -26px; left: 0; /*background: green;*/ } .movie-title-padding { margin-right: 35px; } .movie-title { font-size: 16px; line-height: 22px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin: 0 10px; } .movie-score { color: #ffb400; float: right; margin-right: 10px; } .movie-detail-strong { height: 39px; line-height: 39px; } .movie-detail { cursor: pointer; position: relative; top: -19px; width: 100%; height: 41px; line-height: 41px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .movie-detail a:hover{ text-decoration: none; background: #ef4238; color: #fff; } .movie-sale .active { color: #ef4238; } .movie-sale a { display: block; width: 160px; height: 40px; color: #999; font-size: 14px; } .movie-item { width: 160px; height: 260px; } .movie-ver { width: 69px; height: 25px; position: relative; top: -280px; left: -2px; font-size: 12px; color: #fff; } .movie-ver i.imax3d { display: block; width: 69px; height: 25px; background-image: url("../images/3Dmax.jpg"); } .main .panel{ margin-top: 28px; } .sidepanel{ margin-top: 10px !important; } .movie-wish { width: 158px; height: 41px; font-size: 14px; color: #ffb400; background-color: #fbfbfb; text-align: left; padding-left: 10px; } .movie-presale-sep { border-right: 1px dotted #e5e5e5; } .movie-presale a { cursor: pointer; width: 50%; box-sizing: border-box; display: inline-block; vertical-align: top; color: #999; font-size: 14px; background: #fff; } .movie-presale a:hover{ background: #2d98f3; } .movie-presale{ border: 1px solid #eee; } .tags-line a{ text-decoration: none; } .tags-line a:hover{ color: #f34d41; } .list-pager a{ text-decoration: none; } .list-pager li:hover{ border: 1px solid #f34d41; } .list-pager .active{ background: #f34d41; color: #fff; } .main-detail{ width: 1131px !important; } .main-movielist{ width: 1100px !important; margin: 0 0 0 400px !important; } .main .main-bodyz{ width: 1100px !important; } .movieList{ width: 1100px !important; } .main .ranking-imgs{ height: 78px; width: 120px; } ================================================ FILE: src/main/webapp/static/css/main2.css ================================================ *{ margin: 0; padding: 0; } .aside { float: right; width: 360px; } .ranking-box-wrapper .panel-content { height: 450px; width: 100%; margin-top: 23px; } .panel-content { width: 100%; margin-top: 23px; } .main .panel { margin-top: 28px; } .panel-header { overflow: hidden; height: 26px; line-height: 26px; } .panel-title .textcolor_red{ font-size: 26px; } .panel-title .textcolor_blue{ font-size: 26px; } .ranking-index-1{ margin-bottom:11px; border: 1px solid #efefef; } .ranking-box .ranking-top-left{ width: 120px; height: 78px; float: left; position: relative; } .ranking-top-right{ padding-left:10px; overflow: hidden; height:78px; line-height: 78px; } .ranking-box .ranking-top-right-main{ width: 220px; } .ranking-top-right-main{ display: inline-block; line-height:1; vertical-align: middle; } .ranking-top-right .ranking-top-moive-name{ margin: 0; padding: 0; overflow: hidden; text-overflow: ellipsis; font-size: 18px; color: #333; line-height: 1.4; } .ranking-top-right .ranking-top-wish,.textcolor_red { color: #ef4238; } .ranking-top-right .ranking-top-wish{ margin-top:12px; font-size: 14px; } .stonefont{ font-size: 14px; } .ranking-item .normal-link{ display: block; height: 35px; line-height: 35px; } .ranking-index-2 .ranking-index, .ranking-index-3 .ranking-index{ color:#ef4238; } .ranking-item .ranking-index{ display: inline-block; width:20px; } .ranking-index{ color:#999; font-size:18px; vertical-align:top; } .ranking-item .ranking-movie-name{ display: inline-block; max-width: 190px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 16px; color: #333; vertical-align: top; } .ranking-num-info{ float: right; font-size: 14px; } .ranking-num-info { color:#ef4238; } /* 222 */ .textcolor_orange { color: #ffb400!important; } .panel-more { font-size: 14px; line-height: 16px; float: right; margin-top: 10px; } .panel-content { width: 100%; margin-top: 23px; } .ranking-mostExpect .ranking-top-left { width: 140px; height: 194px; float: left; position: relative; } .ranking-mostExpect .ranking-top-right { height: 194px; line-height: 194px; } .ranking-top-right{ padding-left: 10px; overflow: hidden; } .ranking-top-right .ranking-release-time { margin-top: 12px; color: #999; } .ranking-top-right .ranking-top-wish { margin-top: 12px; font-size: 14px; color: #ffb400; } .ranking-mostExpect .ranking-index-2, .ranking-mostExpect .ranking-index-3 { border: 1px solid #efefef; position: relative; width: 170px; float: left; margin-top: 20px; margin-bottom: 20px; padding-bottom: 8px; } .ranking-mostExpect .ranking-index-2 .ranking-index, .ranking-mostExpect .ranking-index-3 .ranking-index { position: absolute; padding-left: 4px; width: 16px; line-height: 20px; color: #fff; background-color: #ffb400; } .ranking-mostExpect .ranking-index-2 .name-link, .ranking-mostExpect .ranking-index-3 .name-link { display: block; font-size: 18px; color: #333; margin-top: 8px; margin-left: 10px; margin-right: 10px; } .ranking-mostExpect .ranking-index-2 .ranking-num-info, .ranking-mostExpect .ranking-index-3 .ranking-num-info { float: none; display: inline-block; font-size: 14px; margin-top: 6px; margin-left: 10px; } .ranking-num-info{ color:#fdb863; } .ranking-item .normal-link { display: block; height: 35px; line-height: 35px; margin-top: 5px; } .ranking-num-info { float: right; color: #fdb863; font-size: 14px; } .ranking-mostExpect .ranking-index-4 { clear: both; } .ranking-top100 .ranking-top-right { height: 78px; line-height: 78px; padding-left: 10px; overflow: hidden; } .ranking-top100 .ranking-top-left { width: 120px; height: 78px; float: left; position: relative; } .top100-wrapper { margin-top: 100px; } .aside .most-expect-wrapper { margin-top: 10px; } .ranking-index-2 ,.ranking-index-3{ color: #ef4238; } ================================================ FILE: src/main/webapp/static/css/manage.css ================================================ .container{ /*padding: 0;*/ width: 1530px !important; /*height: 1200px;*/ /*margin-bottom: 100px;*/ } .container .contents .nav-next{ float: left; width: 200px; height: 1200px; background-color: #f4f3f4; border: 1px solid #ddd; } .container .contents .nav-next .nav-title{ margin: 40px auto 30px; text-align: center; } .container .contents .nav-next a{ font-size: 18px; text-align: center; display: block; text-decoration: none; cursor: pointer; height: 40px; width: 100%; line-height: 40px; } .container .contents .nav-next .active{ color: #fff; background-color: #ed3931; } .container .contents .nav-body{ float: left; width: 1300px; height: 1200px; border: 1px solid #ddd; padding-left: 40px; } .container .contents .nav-body .one, .two, .three, .four, .five, .six{ float: left; width: 100%; height: 100%; } .container .contents .nav-body .title{ font-size: 18px; color: #ec443f; padding: 26px 0; } .container .contents .nav-body hr{ margin-bottom: 30px; } /************************ 用户管理 ******************************/ .container .one .userlist{ margin-right: 40px; } .addusertitle{ text-align: center; font-size: 18px; margin: 20px auto 20px; } .addusertext{ width: 60%; } .adduserbtn{ width: 100px; float: left; } .usercheck{ margin-left: 30px; width: 400px; float: left; } .usercheck input{ width: 200px; height: 30px; float: left; } .usercheck button{ float: left; } .layui-table-box{ clear: both; } /************************ 电影管理 ******************************/ .container .two .main-inner{ height: 1090px; overflow-y: auto; } .container .two .main-inner .addMovie{ margin-bottom:30px; height:215px; } .container .two .main-inner .addMovie img{ display:block; width:160; height:160; float:left; cursor:pointer; } .container .two .main-inner .addMovie span{ font-size: large; float: left; display: block; clear: both; margin-left: 42px; } .container .two .movies-list{ margin-top: 23px; } .container .two .movies-list li{ margin: 0 80px 60px 0px; float: left; width: 160px; height: 259px; background: #fff; border: 1px solid #efefef; } .container .two .movies-detail-strong { height: 39px; line-height: 39px; } .container .two .movies-detail { margin-top: -1px; border: 1px solid #eee; cursor: pointer; position: relative; top: -21px; width: 100%; height: 41px; line-height: 41px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background-color: #fff; } .container .two .movies-detail a:hover{ text-decoration: none; background: #ef4238; color: #fff; } .textside{ float: left; width: 450px; } .pictureside{ float: left; width: 300px; text-align: center; } .pictureside .layui-upload{ margin: 50px 0px; width: 300px; } .pictureside #file{ width: 80px; height: 30px; } .pictureside .file { margin-top: 20px; position: relative; display: inline-block; background: #009688; /* border: 1px solid rgb(44, 243, 77); */ border-radius: 4px; padding: 4px 12px; overflow: hidden; color: #fff; text-decoration: none; text-indent: 0; line-height: 20px; cursor: pointer; } .pictureside .file input { position: absolute; font-size: 100px; right: 0; top: 0; opacity: 0; cursor: pointer; } .pictureside .file:hover { background: #00ad9c; /* border-color: #009688; */ color: #fff; text-decoration: none; cursor: pointer; } .pictureside .movie-picture{ margin-bottom: 20px; } .layui-upload-list{ margin: 0px !important; } .textside .layui-form-item{ margin-bottom: 2px !important; } .textside .layui-form-label { width: 100px !important; } .textside .layui-btn { background-color: #fff; border: 1px solid #ccc; color: #ccc; margin-left: 10px; width: 20px; } .textside .actor { width: 110px; } .layui-upload-img{ max-width: 160px; max-height: 220px; } /************************ 场次管理 ******************************/ .container .one .schedulelist{ margin-right: 40px; } .addtitle{ text-align: center; font-size: 18px; margin: 20px auto 20px; } .addmoney{ width: 45%; } .addbtn{ width: 100px; float: left; } .schedulecheck{ margin-left: 30px; width: 300px; float: left; } .schedulecheck input{ width: 200px; height: 30px; float: left; } .layui-table-box{ clear: both; } .scheduleLabel { float: left; display: block; padding: 9px 15px 9px 20px; width: 100px; font-weight: 400; line-height: 20px; text-align: right } .addselect { width: 200px !important; } .schedule-div{ margin-left: 25px; } #scheduleadd { width: 400px; } .layui-laydate{ position: fixed !important; } .drop-cinema dl{ max-height: 180px !important; } .drop-hall dl{ max-height: 120px !important; } .scheduleonall{ float: left; } .scheduledownall{ float: left; margin-left: 30px; } .three .schedulelist{ margin-right: 40px; } /************************ 评论管理 ******************************/ .container .four .commentlist{ margin-right: 40px; } .commentcheck{ margin-left: 30px; width: 400px; float: left; } .commentcheck input{ width: 200px; height: 30px; float: left; } .commentcheck button{ float: left; } /************************ 订单管理 ******************************/ .container .five .ticketlist{ margin-right: 40px; } .ticketcheck{ margin-left: 30px; width: 400px; float: left; } .ticketcheck input{ width: 200px; height: 30px; float: left; } .ticketcheck button{ float: left; } .changeticketBtn{ border: 1px solid #ddd !important; position: relative; left: 1.5px; background-color: #fbfbfb !important; } .orderall{ float: left; } .backorder{ float: left; margin-left: 30px } /************************ 退票审核 ******************************/ .container .six .backticketlist{ margin-right: 40px; } .backticketcheck{ margin-left: 30px; width: 400px; float: left; } .backticketcheck input{ width: 200px; height: 30px; float: left; } .backticketcheck button{ float: left; } .changebackticketBtn{ border: 1px solid #ddd !important; position: relative; left: 1.5px; background-color: #fbfbfb !important; } ================================================ FILE: src/main/webapp/static/css/modify.css ================================================ .Modifyform { height: 18.75em; width: 46em; margin-top: 150px; background: #fff; position: absolute; left: 50%; transform: translate(-50%,-50%); text-transform: lowercase; font-family: "Bebas Neue", Arial; color: #fff; } .Modifyform > div { height: 6.25em; width: 100%; } .username { background-color: #4daf7c; } .username::after { content: ""; width: 0px; height: 0px; position: absolute; border-style: solid; border-width: 0.5em 0.469em 0 0.469em; border-color: #4daf7c transparent transparent transparent; top: 6.25em; left: 50%; margin-left: -0.496em; } .password { background-color: #404241; } .password::after { content: ""; width: 0px; height: 0px; position: absolute; border-style: solid; border-width: 0.5em 0.469em 0 0.469em; border-color: #404241 transparent transparent transparent; top: 12.5em; left: 50%; margin-left: -0.496em; } .type{ background-color: purple; } .type::after{ content: ""; width: 0px; height: 0px; position: absolute; border-style: solid; border-width: 0.5em 0.469em 0 0.469em; border-color: purple transparent transparent transparent; top: 18.7em; left: 50%; margin-left: -0.496em; } .login { background-color: #e9c85d; display: table; } .login span { display: table-cell; vertical-align: middle; text-align: center; font-size:3em; cursor: pointer; } .ModifyInput { height: 1.8em; width: 19.125em; font-size: 2em; text-align:center; border: 0; outline: 0; color: #fff; background: transparent; border:0.033em #fff solid; margin-left: 2.1875em; margin-top: 0.8em; font-family: "Bebas Neue", Arial; } ::placeholder { color: #fff; } ::-moz-placeholder { color: #fff; } :-ms-input-placeholder { color: #fff; } ::-webkit-input-placeholder { color: #fff; } .detailBox{ height: 8.25em; background-color: #ccc; } #detail{ height: 4.5em; width: 19.125em; font-size: 2em; text-align:center; border: 0; outline: 0; color: #fff; background: transparent; border:0.033em #fff solid; margin-left: 2.1875em; margin-top: 1em; font-family: "Bebas Neue", Arial; } ================================================ FILE: src/main/webapp/static/css/movieDetail.css ================================================ .main-content { width: 1130px; float: left; } .tab-container .tab-title-container { width: 1130px; height: 30px; border-bottom: 2px solid #eee; } .tab-container .tab-title-container .tab-title.active { color: #ef4238; border-bottom-color: #ef4238; } .tab-container .tab-title-container .tab-title { cursor: pointer; float: left; margin-right: 30px; margin-bottom: -2px; padding-bottom: 10px; font-size: 18px; color: #333; line-height: 100%; border-bottom: 2px solid transparent; } .tab-container .tab-title-container .tab-title.tab-disabled { color: #999; cursor: not-allowed; } .tab-container .tab-content-container .tab-content.active { display: block; } .tab-container .tab-content-container .tab-content { display: none; } .tab-desc { margin-top: 40px; } .module { position: relative; margin-bottom: 60px; } .module .mod-title h3 { display: inline-block; margin: 0; padding: 0; font-weight: 400; font-size: 18px; color: #333; line-height: 18px; } .module .mod-title h3:before { float: left; content: ""; display: inline-block; width: 4px; height: 18px; margin-right: 6px; background-color: #ef4238; } .module .mod-content { margin-top: 20px; color: #333; } .tab-desc .dra { font-size: 14px; line-height: 26px; } .module .mod-title .more { float: right; cursor: pointer; font-size: 14px; color: #999; padding-right: 14px; background: no-repeat 100%; } .clearfix:after, .clearfix:before { content: " "; display: table; } .tab-desc .celebrity-container .celebrity-group:first-child { margin-left: 0; } .tab-desc .celebrity-container .celebrity-group { float: left; margin-left: 45px; } .celebrity-container .celebrity-type { margin-bottom: 16px; } .celebrity-container .celebrity-list { margin-left: -20px; } .tab-desc .celebrity-container .celebrity-group .celebrity { margin-bottom: 0; } .celebrity-container .celebrity { float: left; width: 128px; margin-left: 20px; margin-bottom: 20px; text-overflow: ellipsis; white-space: nowrap; } .celebrity-container .celebrity .portrait { margin-bottom: 6px; width: 128px; height: 170px; overflow: hidden; } .celebrity-container .celebrity .portrait img { width: 128px; height: 170px; } .default-img { /* background-image: url("../images/movies/banner.jpg") top no-repeat; */ background-position: 50%; background-size: 68px 62px; background-repeat: no-repeat; } .celebrity-container .celebrity .name { margin-top: 8px; line-height: 1.2; color: #333; } .celebrity-container .celebrity .name, .celebrity-container .celebrity .role { display: inline-block; width: 128px; text-align: center; padding-bottom: 1px; margin-bottom: -1px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .banner2 .wrapper .celeInfo-right { margin-top: 4px; } .staringPeople{ height: 300px; } .comment-container .main2 { margin-left: 70px; } .comment-container { margin-top: 20px; } .comment-container .portrait-container { margin-right: 20px; float: left; position: relative; width: 50px; height: 50px; } .comment-container .portrait { border-radius: 50%; overflow: hidden; width: 50px; height: 50px; } .comment-container .portrait img { width: 50px; } .comment-container .portrait-container .level-1-icon { display: inline-block; width: 20px; height: 20px; position: absolute; bottom: -2px; right: -2px; } .comment-container .main2-header { position: relative; font-size: 16px; } .comment-container .main2-header .user { margin-top: 2px; } .comment-container .main2-header .name { vertical-align: middle; color: #333; } .comment-container .main2-header .tag { display: inline-block; width: 14px; height: 14px; border: 1px solid #7cc6f9; border-radius: 2px; color: #7cc6f9; font-size: 12px; line-height: 14px; text-align: center; } .comment-container .main2-header .time { margin-top: 4px; color: #999; } .comment-container .main2-header .time { margin-top: 4px; color: #999; } .comment-container .main2-header .score-star { display: inline-block; } .score-star li { float: left; height: 16px; } .comment-container .approve { position: absolute; top: 20px; right: 0; } .comment-container .approve .approve-icon { cursor: pointer; margin-top: -6px; margin-right: 8px; vertical-align: middle; } .like-icon, i.approve-icon { display: inline-block; width: 16px; height: 16px; } .comment-container .approve .num { font-size: 14px; color: #999; } .clearfix:after { clear: both; } .clearfix:after, .clearfix:before { content: " "; display: table; } .comment-container .comment-content { margin-top: 20px; padding-bottom: 30px; border-bottom: 1px solid #e5e5e5; color: #666; line-height: 26px; font-size: 14px; } .comment-entry { cursor: pointer; position: absolute; top: -10px; right: 0; display: block; height: 30px; padding: 0 10px; border-radius: 15px; border: 1px solid #ef4238; text-align: center; font-size: 14px; line-height: 30px; color: #ef4238; } .comment-entry:hover { text-decoration: none; color: #fff; background-color: #ef4238; } .deleteCom{ cursor: pointer; height: 30px !important; width: 67px; padding: 6 10px; border-radius: 15px; border: 1px solid #ef4238; text-align: center; font-size: 14px; line-height: 30px; color: #ef4238; margin-left: 80px; } .deleteCom:hover{ border: 1px solid #ef4238; background-color: #ef4238; color: #fff; text-decoration: none; } .updateBtn{ cursor: pointer; height: 30px !important; width: 67px; float: left; padding: 6 10px; border-radius: 15px; border: 1px solid #009688; text-align: center; font-size: 14px; line-height: 30px; color: #009688; } .updateBtn:hover{ border: 1px solid #009688; background-color: #009688; color: #fff; text-decoration: none; } .commenttitle{ margin: 30px 0; font-size: 18px; text-align: center; } .username, .commenttime, .commentcontent{ width: 280px; } .usernametext, .commenttimetext, .commentcontenttext{ width: 100px !important; } ================================================ FILE: src/main/webapp/static/css/movieList.css ================================================ .movies-channel { width: 1120px; margin: auto; overflow: hidden; } .tags-panel { border: 1px solid #e5e5e5; padding: 0 20px; margin-top: 40px; } .tags-panel li, .tags-panel ul { margin: 0; padding: 0; list-style-type: none; } .tags li.active { background: #f34d41; color: #fff; } .tags li.active a { color: #fff; } .tags li a { color: #333; font-size: 14px; } .tags li { border-radius: 14px; padding: 3px 9px; display: inline-block; margin-left: 12px; } .tags-title { height: 24px; line-height: 24px; float: left; color: #999; font-size: 14px; } .tags { margin-left: 40px!important; } .tags-line { padding: 10px 0!important; } .tags-line-border { border-top: 1px dotted #e5e5e5; } .movies-panel { margin-top: 40px; margin-left: 30px; } .movies-sorter { overflow: hidden; } .movies-sorter .cat-sorter { float: left; padding-left: 2px; } .movies-sorter ul { margin: 0; padding: 0; list-style: none; } .movies-sorter li { display: inline-block; height: 20px; line-height: 18px; margin-right: 30px; } .sort-control-group { cursor: pointer; line-height: 16px; } .sort-radio { background: url("../images/circle-white.jpg") no-repeat; } .sort-radio-checked { background: url("../images/circle-red.jpg") no-repeat; } .sort-control { display: inline-block; vertical-align: top; width: 20px; height: 20px; margin-right: 2px; } .sort-control-label { font-size: 14px; vertical-align: top; } .movie-item { position: relative; border: 1px solid #efefef; margin: -1px; } .movie-poster { background-color: #fcfcfc; width: 160px; height: 220px; overflow: hidden; position: relative; } .channel-action-sale { background-color: #f34d41; } .channel-action { position: absolute; right: 5px; bottom: 5px; padding: 0 3px; height: 18px; line-height: 18px; border-radius: 1px; } .channel-action a { color: #fff; font-size: 12px; vertical-align: top; } .movie-ver { position: absolute; top: 4px; left: -2px; font-size: 12px; color: #fff; } .channel-detail { width: 160px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: center; font-size: 16px; color: #333; margin-top: 10px; } .channel-detail a { color: #333; } .channel-detail-orange, .channel-detail-prescore { color: #ffb400; } .channel-detail-orange .integer { font-size: 18px; } .channel-detail-orange .fraction { font-size: 14px; } .movie-list li { margin: 0 28px 40px 0px; } .movie-item { height: 220px; } ================================================ FILE: src/main/webapp/static/css/pay.css ================================================ .container{ display: block; margin-bottom: 100px; padding: 0; } .container .order-progress-bar{ height: 60px; width: 100%; margin: 40px 0; text-align: center; } .container .order-progress-bar .step{ float: left; width: 25%; } .container .order-progress-bar .step .step-num{ color: #fff; font-size: 12px; display: inline-block; width: 16px; height: 16px; line-height: 16px; border-radius: 10px; text-align: center; background-color: #ffd8d7; position: relative; top: 10px; } .container .order-progress-bar .first .bar{ border-left-color: transparent !important; } .container .order-progress-bar .last .bar{ border-right-color: transparent !important; } .container .order-progress-bar .step .bar{ width: 0; height: 4px; border-left: 150px solid #ffd8d7; border-right: 150px solid #ffd8d7; } .container .order-progress-bar .done .step-num{ background-color: #f03d37; } .container .order-progress-bar .done .bar{ border-left: 150px solid #f03d37; border-right: 150px solid #f03d37; } .container .order-progress-bar .step .step-next{ font-size: 14px; color: #999; display: inline-block; margin-top: 10px; } .container .count-down-wrapper{ width: 100%; height: 110px; padding-top: 20px; margin-bottom: 40px; background-color: #fff3f3; } .container .count-down-wrapper .count-down{ padding-left: 55px; min-height: 41px; margin-left: 30px; background: url(../images/time.jpg) no-repeat; background-size: 50px 50px; background-position: 0 10px; } .container .count-down-wrapper .count-down .time-left{ font-size: 16px; color: #666; margin-bottom: 4px; } .container .count-down-wrapper .count-down .time-left .minute, .second{ font-size: 32px; color: #f03d37; margin: 0 5px; } .container .count-down-wrapper .count-down .tip{ font-size: 14px; color: #f03d37; } .container .warning{ font-size: 12px; color: #666; padding-left: 18px; background: url(../images/warning.jpg) no-repeat; background-size: 14px; background-position-y: 2px; margin-bottom: 8px; } .container .warning .attention{ color: #faaf00; } .container .order-table{ width: 100%; border: 1px solid #e5e5e5; border-spacing: 0; margin-bottom: 60px; } .container .order-table thead{ background-color: #f7f7f7; } .container .order-table thead th{ font-size: 16px; color: #333; width: 25%; padding: 14px 0; font-weight: 400; text-align: center; } .container .order-table tbody td{ text-align: center; padding: 20px 0; color: #333; } .container .order-table tbody td .hall{ display: inline-block; font-size: 14px; color: #424242; font-weight: 700; margin-right: 10px; vertical-align: top; } .container .order-table tbody td .seats{ display: inline-block; text-align: left; } .container .order-table tbody td .seats span{ font-size: 12px; margin-right: 2px; } .container .order-table tbody td .seats i{ font-size: 16px; font-style: normal; margin: 0 2px; } .container .order-table tbody td .seats span.border{ border-left: 1px solid #e5e5e5; padding-left: 5px; } .order-table tr{ border: 1px solid #ddd; } .container .right{ text-align: right; } .container .right .price-wrapper{ font-size: 14px; color: #333; margin-bottom: 17px; } .container .right .price-wrapper .price{ font-size: 36px; color: #f03d37; } .container .right .pay-btn{ cursor: pointer; display: inline-block; width: 190px; height: 42px; line-height: 42px; text-align: center; color: #fff; background-color: #f03d37; border-radius: 100px; -webkit-box-shadow: 0 2px 10px -2px #f03d37; box-shadow: 0 2px 10px -2px #f03d37; } ================================================ FILE: src/main/webapp/static/css/paystatus.css ================================================ .container{ display: block; margin-bottom: 100px; padding: 0; } .container .order-progress-bar{ height: 60px; width: 100%; margin: 40px 0; text-align: center; } .container .order-progress-bar .step{ float: left; width: 25%; } .container .order-progress-bar .step .step-num{ color: #fff; font-size: 12px; display: inline-block; width: 16px; height: 16px; line-height: 16px; border-radius: 10px; text-align: center; background-color: #ffd8d7; position: relative; top: 10px; } .container .order-progress-bar .first .bar{ border-left-color: transparent !important; } .container .order-progress-bar .last .bar{ border-right-color: transparent !important; } .container .order-progress-bar .step .bar{ width: 0; height: 4px; border-left: 150px solid #ffd8d7; border-right: 150px solid #ffd8d7; } .container .order-progress-bar .done .step-num{ background-color: #f03d37; } .container .order-progress-bar .done .bar{ border-left: 150px solid #f03d37; border-right: 150px solid #f03d37; } .container .order-progress-bar .step .step-next{ font-size: 14px; color: #999; display: inline-block; margin-top: 10px; } .container .warning{ font-size: 12px; color: #666; padding-left: 18px; background: url(../images/warning.jpg) no-repeat; background-position-x: 900px; background-size: 14px; background-position-y: 2px; margin-bottom: 8px; } .container .warning .attention{ color: #faaf00; } .main-paystatus{ text-align: center; padding: 100px 0; margin-top: 30px; margin-bottom: 30px; background-color: rgb(228, 253, 235); } .main-paystatus img{ width: 120px; height: 120px; } .main-paystatus .statustext{ margin-top: 20px; font-size: 24px; color: rgb(0, 148, 0); font-weight: 700; } .container .right{ text-align: right; } .container .right .price-wrapper{ font-size: 14px; color: #333; margin-bottom: 17px; } .container .right .price-wrapper .price{ font-size: 36px; color: #f03d37; } .container .right .pay-btn{ cursor: pointer; display: inline-block; width: 190px; height: 42px; line-height: 42px; text-align: center; color: #fff; background-color: #f03d37; border-radius: 100px; -webkit-box-shadow: 0 2px 10px -2px #f03d37; box-shadow: 0 2px 10px -2px #f03d37; } ================================================ FILE: src/main/webapp/static/css/selectSeat.css ================================================ .banner2 .wrapper { /*background: #000;*/ width: 1200px; margin: 0 auto; height: 320px; position: relative; top: 70px; } .banner2 { width: 100%; min-width: 1200px; background: #392f59 url("../images/movies/banner.png") no-repeat 50%; } .banner2 .wrapper .cinema-main { position: relative; float: left; max-width: 600px; } .banner2 .wrapper .cinema-left { width: 360px; float: left; overflow: hidden; z-index: 9; } .cinema-left .avatar-shadow { width: 300px; height: 300px; background-size: 300px 50px; position: relative; } .cinema-left .avatar-shadow .avatar { border: 4px solid #fff; height: 292px; width: 292px; } .cinema-left .avatar-shadow .avatar-num { position: absolute; left: 4px; bottom: 5px; width: 292px; line-height: 32px; background-color: rgba(0,0,0,.6); color: #fff; font-size: 14px; text-align: center; } .banner2 .wrapper .cinema-brief-container { color: #fff; } .banner2 .wrapper .cinema-brief-container .name { margin: 0; font-size: 26px; margin-bottom: 9px; font-weight: 400; } .text-ellipsis { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .banner2 .wrapper .cinema-brief-container .address, .banner2 .wrapper .cinema-brief-container .telphone { font-size: 14px; margin-bottom: 6px; } .banner2 .wrapper .cinema-brief-container .telphone { margin-bottom: 20px; } .banner2 .wrapper .cinema-brief-container .features-group { position: relative; } .banner2 .wrapper .cinema-brief-container .features-group .group-title { font-size: 14px; margin-bottom: 5px; overflow: hidden; width: 410px; } .banner2 .wrapper .cinema-brief-container .features-group .group-title:after { border-top: 1px solid hsla(0,0%,100%,.7); display: block; content: ""; position: relative; top: -10px; left: 70px; } .banner2 .wrapper .cinema-brief-container .features-group .feature { font-size: 12px; margin-bottom: 2px; position: relative; min-height: 22px; line-height: 23px; -webkit-transform-origin: 0; -ms-transform-origin: 0; transform-origin: 0; -webkit-transform: scale(.8); -ms-transform: scale(.8); transform: scale(.8); } .banner2 .wrapper .cinema-brief-container .features-group .feature .tag { display: inline-block; border: 1px solid hsla(0,0%,100%,.6); border-radius: 2px; min-width: 60px; height: 22px; line-height: 23px; text-align: center; } .banner2 .wrapper .cinema-brief-container .features-group .feature .desc { display: inline-block; max-width: 438px; margin-left: 5px; vertical-align: middle; } .movie-list-container { height: 280px; padding: 22px 5px; -webkit-box-sizing: border-box; box-sizing: border-box; overflow: hidden; -webkit-box-shadow: inset 0 0 100px 80px #ededed; box-shadow: inset 0 0 100px 80px #ededed; position: relative; } .movie-list-container .movie-list { white-space: nowrap; position: relative; display: table; left: 60; -webkit-transition: left .2s ease; transition: left .2s ease; } .movie-list-container .movie.active { margin: 0 16px; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); border-color: #fd8e84; } .movie-list-container .movie { width: 162px; height: 227px; border: 4px solid #fff; -webkit-box-shadow: 0 1px 3px 0 hsla(0,0%,66%,.5); box-shadow: 0 1px 3px 0 hsla(0,0%,66%,.5); display: inline-block; -webkit-transform-origin: 50%; -ms-transform-origin: 50%; transform-origin: 50%; -webkit-transform: scale(.82); -ms-transform: scale(.82); transform: scale(.82); -webkit-transition: -webkit-transform .1s; transition: -webkit-transform .1s; transition: transform .1s; transition: transform .1s,-webkit-transform .1s; word-spacing: 0; } .movie-list-container .movie-list { white-space: nowrap; position: relative; display: table; left: 20; top:-17px; margin-left:60px; } .movie-list-container .movie img { width: 100%; height: 100%; } .movie-list-container .pointer { position: absolute; display: block; content: ""; bottom: -23px; left: 71px; border-style: solid; border-width: 11px 14px; border-color: transparent transparent #fff; } .show-list.active { display: block; } .show-list { display: none; } .show-list .movie-info { margin-top: 20px; border-bottom: 1px solid #e5e5e5; } .show-list .movie-info .movie-name { display: inline-block; margin: 0 20px 20px 0; font-size: 26px; font-weight: 400; color: #333; } th { font-weight: bold; text-align: -internal-center; } td, th { display: table-cell; vertical-align: inherit; } tr { display: table-row; vertical-align: inherit; border-color: inherit; } h3 { display: block; font-size: 1.17em; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold; } table { display: table; border-collapse: separate; border-spacing: 2px; border-color: grey; } tbody { display: table-row-group; vertical-align: middle; border-color: inherit; } .show-list .plist tbody tr { height: 82px; } .show-list .movie-info .score { display: inline-block; font-size: 24px; color: #faaf00; } .show-list .movie-info .movie-desc>div { display: inline-block; font-size: 14px; color: #151515; margin-bottom: 20px; margin-right: 40px; } .show-list .movie-info .movie-desc .key { color: #999; } .show-list .show-date { padding: 30px 0; font-size: 14px; color: #999; } .show-list .show-date { padding: 30px 0; font-size: 14px; color: #999; } .show-list .show-date .date-item.active { color: #fff; background-color: #f03d37; } .show-list .show-date .date-item { display: inline-block; background-color: transparent; border-radius: 100px; color: #333; padding: 2px 10px; margin-left: 12px; cursor: default; } .show-list .show-date { padding: 30px 0; font-size: 14px; color: #999; } .show-list .plist-container.active { display: block; } .show-list .plist-container { display: none; } .show-list .plist { width: 100%; border: none; border-spacing: 0; } .show-list .plist thead { background-color: #f7f7f7; color: #333; font-size: 16px; padding: 18px 0; } .show-list .plist thead th { padding: 16px 0; } .show-list .plist tbody td { text-align: center; width: 20%; } .show-list .plist tbody .begin-time { font-size: 18px; color: #333; font-weight: 700; } .show-list .plist tbody .sell-price { font-size: 18px; color: #f03d37; font-weight: 700; } .stonefont { font-family: stonefont; } .show-list .plist tbody .sell-price:before { content: "\FFE5"; font-size: 12px; } .show-list .plist tbody .buy-btn.normal { -webkit-box-shadow: 0 2px 10px -2px #f03d37; box-shadow: 0 2px 10px -2px #f03d37; } .show-list .plist tbody .buy-btn { display: inline-block; width: 80px; height: 30px; color: #fff; background-color: #f03d37; font-size: 14px; line-height: 30px; border-radius: 100px; text-align: center; } .show-list .plist thead th { padding: 16px 70px; } ================================================ FILE: src/main/webapp/static/css/style2.css ================================================ /*定义css变量*/ :root{ --mywidth: 1420px; --myheight: 440px; } *{ margin: 0; padding: 0; } html,body{ width: 100%; height: 100%; } body{ background-color: #1F1F1F; } ul{ list-style: none; } .content{ width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; } .a-content{ border: 1px solid rgba(0,0,0,0.1); border-radius:20px; -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3); box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3); position: relative; } .a-content:before{ content: ''; width: 500px; height: 300px; left: 35px; top: 19px; z-index:-1; position:absolute; border-radius:20px; border: 1px solid rgba(0,0,0, 0.1); background: rgba(0, 0, 0, 0.0); -webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); -webkit-transform: translate(-5%,-5%); transform:translate(-5%,-5%); -ms-transform:translate(-5%,-5%); -moz-transform:translate(-5%,-5%); -o-transform:translate(-5%,-5%); } .a-content:after{ content: ''; position:absolute; top:-25px; left: 25%; width: 270px; height: 40px; background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2))); border-left: 1px dashed rgba(0, 0, 0, 0.1); border-right: 1px dashed rgba(0, 0, 0, 0.1); -webkit-box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2); box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2); display: none; } .carousel-content{ width: var(--mywidth); height: var(--myheight); position: relative; overflow: hidden; border-radius:10px; } .carousel{ height: var(--myheight); position: absolute; } .carousel li{ float: left; } .carousel li,.carousel li img{ width: var(--mywidth); height: var(--myheight); } .img-index{ position: absolute; bottom: 8px; width: 100%; display: flex; justify-content: center; } .img-index li{ float: left; width: 18px; height: 18px; line-height: 18px; text-align: center; border-radius: 10px; background-color: rgba(0,0,0,0.2); font-size: 12px; cursor: pointer; margin: 0 3px; color: #fff; } .img-index li.js_index,.img-index li:hover{ background-color: rgba(0,0,0,0.7); } .carousel-prev,.carousel-next{ position: absolute; display: inline-block; top: 45%; cursor: pointer; display: none; } .carousel-prev{ left: 0; } .carousel-next{ right: 0; } ================================================ FILE: src/main/webapp/static/js/Api.js ================================================ var urlHead = "http:///edy45u."; var urlFoot = "natappfree.cc"; var url = urlHead.toString() + urlFoot.toString(); ================================================ FILE: src/main/webapp/static/js/classie.js ================================================ /*! * classie v1.0.1 * class helper functions * from bonzo https://github.com/ded/bonzo * MIT license * * classie.has( elem, 'my-class' ) -> true/false * classie.add( elem, 'my-new-class' ) * classie.remove( elem, 'my-unwanted-class' ) * classie.toggle( elem, 'my-class' ) */ /*jshint browser: true, strict: true, undef: true, unused: true */ /*global define: false, module: false */ ( function( window ) { 'use strict'; // class helper functions from bonzo https://github.com/ded/bonzo function classReg( className ) { return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); } // classList support for class management // altho to be fair, the api sucks because it won't accept multiple classes at once var hasClass, addClass, removeClass; if ( 'classList' in document.documentElement ) { hasClass = function( elem, c ) { return elem.classList.contains( c ); }; addClass = function( elem, c ) { elem.classList.add( c ); }; removeClass = function( elem, c ) { elem.classList.remove( c ); }; } else { hasClass = function( elem, c ) { return classReg( c ).test( elem.className ); }; addClass = function( elem, c ) { if ( !hasClass( elem, c ) ) { elem.className = elem.className + ' ' + c; } }; removeClass = function( elem, c ) { elem.className = elem.className.replace( classReg( c ), ' ' ); }; } function toggleClass( elem, c ) { var fn = hasClass( elem, c ) ? removeClass : addClass; fn( elem, c ); } var classie = { // full names hasClass: hasClass, addClass: addClass, removeClass: removeClass, toggleClass: toggleClass, // short names has: hasClass, add: addClass, remove: removeClass, toggle: toggleClass }; // transport if ( typeof define === 'function' && define.amd ) { // AMD define( classie ); } else if ( typeof exports === 'object' ) { // CommonJS module.exports = classie; } else { // browser global window.classie = classie; } })( window ); ================================================ FILE: src/main/webapp/static/js/echarts.js ================================================ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.echarts = {}))); }(this, (function (exports) { 'use strict'; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ // (1) The code `if (__DEV__) ...` can be removed by build tool. // (2) If intend to use `__DEV__`, this module should be imported. Use a global // variable `__DEV__` may cause that miss the declaration (see #6535), or the // declaration is behind of the using position (for example in `Model.extent`, // And tools like rollup can not analysis the dependency if not import). var dev; // In browser if (typeof window !== 'undefined') { dev = window.__DEV__; } // In node else if (typeof global !== 'undefined') { dev = global.__DEV__; } if (typeof dev === 'undefined') { dev = true; } var __DEV__ = dev; /** * zrender: 生成唯一id * * @author errorrik (errorrik@gmail.com) */ var idStart = 0x0907; var guid = function () { return idStart++; }; /** * echarts设备环境识别 * * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 * @author firede[firede@firede.us] * @desc thanks zepto. */ var env = {}; if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { // In Weixin Application env = { browser: {}, os: {}, node: false, wxa: true, // Weixin Application canvasSupported: true, svgSupported: false, touchEventsSupported: true, domSupported: false }; } else if (typeof document === 'undefined' && typeof self !== 'undefined') { // In worker env = { browser: {}, os: {}, node: false, worker: true, canvasSupported: true, domSupported: false }; } else if (typeof navigator === 'undefined') { // In node env = { browser: {}, os: {}, node: true, worker: false, // Assume canvas is supported canvasSupported: true, svgSupported: true, domSupported: false }; } else { env = detect(navigator.userAgent); } var env$1 = env; // Zepto.js // (c) 2010-2013 Thomas Fuchs // Zepto.js may be freely distributed under the MIT license. function detect(ua) { var os = {}; var browser = {}; // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); // var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); // var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); // var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); // var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); // var touchpad = webos && ua.match(/TouchPad/); // var kindle = ua.match(/Kindle\/([\d.]+)/); // var silk = ua.match(/Silk\/([\d._]+)/); // var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); // var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); // var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); // var playbook = ua.match(/PlayBook/); // var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); var firefox = ua.match(/Firefox\/([\d.]+)/); // var safari = webkit && ua.match(/Mobile\//) && !chrome; // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; var ie = ua.match(/MSIE\s([\d.]+)/) // IE 11 Trident/7.0; rv:11.0 || ua.match(/Trident\/.+?rv:(([\d.]+))/); var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+ var weChat = (/micromessenger/i).test(ua); // Todo: clean this up with a better OS/browser seperation: // - discern (more) between multiple browsers on android // - decide if kindle fire in silk mode is android or not // - Firefox on Android doesn't specify the Android version // - possibly devide in os, device and browser hashes // if (browser.webkit = !!webkit) browser.version = webkit[1]; // if (android) os.android = true, os.version = android[2]; // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.'); // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.'); // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; // if (webos) os.webos = true, os.version = webos[2]; // if (touchpad) os.touchpad = true; // if (blackberry) os.blackberry = true, os.version = blackberry[2]; // if (bb10) os.bb10 = true, os.version = bb10[2]; // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]; // if (playbook) browser.playbook = true; // if (kindle) os.kindle = true, os.version = kindle[1]; // if (silk) browser.silk = true, browser.version = silk[1]; // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true; // if (chrome) browser.chrome = true, browser.version = chrome[1]; if (firefox) { browser.firefox = true; browser.version = firefox[1]; } // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true; // if (webview) browser.webview = true; if (ie) { browser.ie = true; browser.version = ie[1]; } if (edge) { browser.edge = true; browser.version = edge[1]; } // It is difficult to detect WeChat in Win Phone precisely, because ua can // not be set on win phone. So we do not consider Win Phone. if (weChat) { browser.weChat = true; } // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || // (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); // os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || // (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || // (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); return { browser: browser, os: os, node: false, // 原生canvas支持,改极端点了 // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9) canvasSupported: !!document.createElement('canvas').getContext, svgSupported: typeof SVGRect !== 'undefined', // works on most browsers // IE10/11 does not support touch event, and MS Edge supports them but not by // default, so we dont check navigator.maxTouchPoints for them here. touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge, // . pointerEventsSupported: 'onpointerdown' in window // Firefox supports pointer but not by default, only MS browsers are reliable on pointer // events currently. So we dont use that on other browsers unless tested sufficiently. // Although IE 10 supports pointer event, it use old style and is different from the // standard. So we exclude that. (IE 10 is hardly used on touch device) && (browser.edge || (browser.ie && browser.version >= 11)), // passiveSupported: detectPassiveSupport() domSupported: typeof document !== 'undefined' }; } // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection // function detectPassiveSupport() { // // Test via a getter in the options object to see if the passive property is accessed // var supportsPassive = false; // try { // var opts = Object.defineProperty({}, 'passive', { // get: function() { // supportsPassive = true; // } // }); // window.addEventListener('testPassive', function() {}, opts); // } catch (e) { // } // return supportsPassive; // } /** * @module zrender/core/util */ // 用于处理merge时无法遍历Date等对象的问题 var BUILTIN_OBJECT = { '[object Function]': 1, '[object RegExp]': 1, '[object Date]': 1, '[object Error]': 1, '[object CanvasGradient]': 1, '[object CanvasPattern]': 1, // For node-canvas '[object Image]': 1, '[object Canvas]': 1 }; var TYPED_ARRAY = { '[object Int8Array]': 1, '[object Uint8Array]': 1, '[object Uint8ClampedArray]': 1, '[object Int16Array]': 1, '[object Uint16Array]': 1, '[object Int32Array]': 1, '[object Uint32Array]': 1, '[object Float32Array]': 1, '[object Float64Array]': 1 }; var objToString = Object.prototype.toString; var arrayProto = Array.prototype; var nativeForEach = arrayProto.forEach; var nativeFilter = arrayProto.filter; var nativeSlice = arrayProto.slice; var nativeMap = arrayProto.map; var nativeReduce = arrayProto.reduce; // Avoid assign to an exported variable, for transforming to cjs. var methods = {}; function $override(name, fn) { // Clear ctx instance for different environment if (name === 'createCanvas') { _ctx = null; } methods[name] = fn; } /** * Those data types can be cloned: * Plain object, Array, TypedArray, number, string, null, undefined. * Those data types will be assgined using the orginal data: * BUILTIN_OBJECT * Instance of user defined class will be cloned to a plain object, without * properties in prototype. * Other data types is not supported (not sure what will happen). * * Caution: do not support clone Date, for performance consideration. * (There might be a large number of date in `series.data`). * So date should not be modified in and out of echarts. * * @param {*} source * @return {*} new */ function clone(source) { if (source == null || typeof source !== 'object') { return source; } var result = source; var typeStr = objToString.call(source); if (typeStr === '[object Array]') { if (!isPrimitive(source)) { result = []; for (var i = 0, len = source.length; i < len; i++) { result[i] = clone(source[i]); } } } else if (TYPED_ARRAY[typeStr]) { if (!isPrimitive(source)) { var Ctor = source.constructor; if (source.constructor.from) { result = Ctor.from(source); } else { result = new Ctor(source.length); for (var i = 0, len = source.length; i < len; i++) { result[i] = clone(source[i]); } } } } else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { result = {}; for (var key in source) { if (source.hasOwnProperty(key)) { result[key] = clone(source[key]); } } } return result; } /** * @memberOf module:zrender/core/util * @param {*} target * @param {*} source * @param {boolean} [overwrite=false] */ function merge(target, source, overwrite) { // We should escapse that source is string // and enter for ... in ... if (!isObject$1(source) || !isObject$1(target)) { return overwrite ? clone(source) : target; } for (var key in source) { if (source.hasOwnProperty(key)) { var targetProp = target[key]; var sourceProp = source[key]; if (isObject$1(sourceProp) && isObject$1(targetProp) && !isArray(sourceProp) && !isArray(targetProp) && !isDom(sourceProp) && !isDom(targetProp) && !isBuiltInObject(sourceProp) && !isBuiltInObject(targetProp) && !isPrimitive(sourceProp) && !isPrimitive(targetProp) ) { // 如果需要递归覆盖,就递归调用merge merge(targetProp, sourceProp, overwrite); } else if (overwrite || !(key in target)) { // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 // NOTE,在 target[key] 不存在的时候也是直接覆盖 target[key] = clone(source[key], true); } } } return target; } /** * @param {Array} targetAndSources The first item is target, and the rests are source. * @param {boolean} [overwrite=false] * @return {*} target */ function mergeAll(targetAndSources, overwrite) { var result = targetAndSources[0]; for (var i = 1, len = targetAndSources.length; i < len; i++) { result = merge(result, targetAndSources[i], overwrite); } return result; } /** * @param {*} target * @param {*} source * @memberOf module:zrender/core/util */ function extend(target, source) { for (var key in source) { if (source.hasOwnProperty(key)) { target[key] = source[key]; } } return target; } /** * @param {*} target * @param {*} source * @param {boolean} [overlay=false] * @memberOf module:zrender/core/util */ function defaults(target, source, overlay) { for (var key in source) { if (source.hasOwnProperty(key) && (overlay ? source[key] != null : target[key] == null) ) { target[key] = source[key]; } } return target; } var createCanvas = function () { return methods.createCanvas(); }; methods.createCanvas = function () { return document.createElement('canvas'); }; // FIXME var _ctx; function getContext() { if (!_ctx) { // Use util.createCanvas instead of createCanvas // because createCanvas may be overwritten in different environment _ctx = createCanvas().getContext('2d'); } return _ctx; } /** * 查询数组中元素的index * @memberOf module:zrender/core/util */ function indexOf(array, value) { if (array) { if (array.indexOf) { return array.indexOf(value); } for (var i = 0, len = array.length; i < len; i++) { if (array[i] === value) { return i; } } } return -1; } /** * 构造类继承关系 * * @memberOf module:zrender/core/util * @param {Function} clazz 源类 * @param {Function} baseClazz 基类 */ function inherits(clazz, baseClazz) { var clazzPrototype = clazz.prototype; function F() {} F.prototype = baseClazz.prototype; clazz.prototype = new F(); for (var prop in clazzPrototype) { clazz.prototype[prop] = clazzPrototype[prop]; } clazz.prototype.constructor = clazz; clazz.superClass = baseClazz; } /** * @memberOf module:zrender/core/util * @param {Object|Function} target * @param {Object|Function} sorce * @param {boolean} overlay */ function mixin(target, source, overlay) { target = 'prototype' in target ? target.prototype : target; source = 'prototype' in source ? source.prototype : source; defaults(target, source, overlay); } /** * Consider typed array. * @param {Array|TypedArray} data */ function isArrayLike(data) { if (!data) { return; } if (typeof data === 'string') { return false; } return typeof data.length === 'number'; } /** * 数组或对象遍历 * @memberOf module:zrender/core/util * @param {Object|Array} obj * @param {Function} cb * @param {*} [context] */ function each$1(obj, cb, context) { if (!(obj && cb)) { return; } if (obj.forEach && obj.forEach === nativeForEach) { obj.forEach(cb, context); } else if (obj.length === +obj.length) { for (var i = 0, len = obj.length; i < len; i++) { cb.call(context, obj[i], i, obj); } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { cb.call(context, obj[key], key, obj); } } } } /** * 数组映射 * @memberOf module:zrender/core/util * @param {Array} obj * @param {Function} cb * @param {*} [context] * @return {Array} */ function map(obj, cb, context) { if (!(obj && cb)) { return; } if (obj.map && obj.map === nativeMap) { return obj.map(cb, context); } else { var result = []; for (var i = 0, len = obj.length; i < len; i++) { result.push(cb.call(context, obj[i], i, obj)); } return result; } } /** * @memberOf module:zrender/core/util * @param {Array} obj * @param {Function} cb * @param {Object} [memo] * @param {*} [context] * @return {Array} */ function reduce(obj, cb, memo, context) { if (!(obj && cb)) { return; } if (obj.reduce && obj.reduce === nativeReduce) { return obj.reduce(cb, memo, context); } else { for (var i = 0, len = obj.length; i < len; i++) { memo = cb.call(context, memo, obj[i], i, obj); } return memo; } } /** * 数组过滤 * @memberOf module:zrender/core/util * @param {Array} obj * @param {Function} cb * @param {*} [context] * @return {Array} */ function filter(obj, cb, context) { if (!(obj && cb)) { return; } if (obj.filter && obj.filter === nativeFilter) { return obj.filter(cb, context); } else { var result = []; for (var i = 0, len = obj.length; i < len; i++) { if (cb.call(context, obj[i], i, obj)) { result.push(obj[i]); } } return result; } } /** * 数组项查找 * @memberOf module:zrender/core/util * @param {Array} obj * @param {Function} cb * @param {*} [context] * @return {*} */ function find(obj, cb, context) { if (!(obj && cb)) { return; } for (var i = 0, len = obj.length; i < len; i++) { if (cb.call(context, obj[i], i, obj)) { return obj[i]; } } } /** * @memberOf module:zrender/core/util * @param {Function} func * @param {*} context * @return {Function} */ function bind(func, context) { var args = nativeSlice.call(arguments, 2); return function () { return func.apply(context, args.concat(nativeSlice.call(arguments))); }; } /** * @memberOf module:zrender/core/util * @param {Function} func * @return {Function} */ function curry(func) { var args = nativeSlice.call(arguments, 1); return function () { return func.apply(this, args.concat(nativeSlice.call(arguments))); }; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isArray(value) { return objToString.call(value) === '[object Array]'; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isFunction$1(value) { return typeof value === 'function'; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isString(value) { return objToString.call(value) === '[object String]'; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isObject$1(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return type === 'function' || (!!value && type === 'object'); } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isBuiltInObject(value) { return !!BUILTIN_OBJECT[objToString.call(value)]; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isTypedArray(value) { return !!TYPED_ARRAY[objToString.call(value)]; } /** * @memberOf module:zrender/core/util * @param {*} value * @return {boolean} */ function isDom(value) { return typeof value === 'object' && typeof value.nodeType === 'number' && typeof value.ownerDocument === 'object'; } /** * Whether is exactly NaN. Notice isNaN('a') returns true. * @param {*} value * @return {boolean} */ function eqNaN(value) { return value !== value; } /** * If value1 is not null, then return value1, otherwise judget rest of values. * Low performance. * @memberOf module:zrender/core/util * @return {*} Final value */ function retrieve(values) { for (var i = 0, len = arguments.length; i < len; i++) { if (arguments[i] != null) { return arguments[i]; } } } function retrieve2(value0, value1) { return value0 != null ? value0 : value1; } function retrieve3(value0, value1, value2) { return value0 != null ? value0 : value1 != null ? value1 : value2; } /** * @memberOf module:zrender/core/util * @param {Array} arr * @param {number} startIndex * @param {number} endIndex * @return {Array} */ function slice() { return Function.call.apply(nativeSlice, arguments); } /** * Normalize css liked array configuration * e.g. * 3 => [3, 3, 3, 3] * [4, 2] => [4, 2, 4, 2] * [4, 3, 2] => [4, 3, 2, 3] * @param {number|Array.} val * @return {Array.} */ function normalizeCssArray(val) { if (typeof (val) === 'number') { return [val, val, val, val]; } var len = val.length; if (len === 2) { // vertical | horizontal return [val[0], val[1], val[0], val[1]]; } else if (len === 3) { // top | horizontal | bottom return [val[0], val[1], val[2], val[1]]; } return val; } /** * @memberOf module:zrender/core/util * @param {boolean} condition * @param {string} message */ function assert$1(condition, message) { if (!condition) { throw new Error(message); } } /** * @memberOf module:zrender/core/util * @param {string} str string to be trimed * @return {string} trimed string */ function trim(str) { if (str == null) { return null; } else if (typeof str.trim === 'function') { return str.trim(); } else { return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } } var primitiveKey = '__ec_primitive__'; /** * Set an object as primitive to be ignored traversing children in clone or merge */ function setAsPrimitive(obj) { obj[primitiveKey] = true; } function isPrimitive(obj) { return obj[primitiveKey]; } /** * @constructor * @param {Object} obj Only apply `ownProperty`. */ function HashMap(obj) { var isArr = isArray(obj); // Key should not be set on this, otherwise // methods get/set/... may be overrided. this.data = {}; var thisMap = this; (obj instanceof HashMap) ? obj.each(visit) : (obj && each$1(obj, visit)); function visit(value, key) { isArr ? thisMap.set(value, key) : thisMap.set(key, value); } } HashMap.prototype = { constructor: HashMap, // Do not provide `has` method to avoid defining what is `has`. // (We usually treat `null` and `undefined` as the same, different // from ES6 Map). get: function (key) { return this.data.hasOwnProperty(key) ? this.data[key] : null; }, set: function (key, value) { // Comparing with invocation chaining, `return value` is more commonly // used in this case: `var someVal = map.set('a', genVal());` return (this.data[key] = value); }, // Although util.each can be performed on this hashMap directly, user // should not use the exposed keys, who are prefixed. each: function (cb, context) { context !== void 0 && (cb = bind(cb, context)); for (var key in this.data) { this.data.hasOwnProperty(key) && cb(this.data[key], key); } }, // Do not use this method if performance sensitive. removeKey: function (key) { delete this.data[key]; } }; function createHashMap(obj) { return new HashMap(obj); } function concatArray(a, b) { var newArray = new a.constructor(a.length + b.length); for (var i = 0; i < a.length; i++) { newArray[i] = a[i]; } var offset = a.length; for (i = 0; i < b.length; i++) { newArray[i + offset] = b[i]; } return newArray; } function noop() {} var zrUtil = (Object.freeze || Object)({ $override: $override, clone: clone, merge: merge, mergeAll: mergeAll, extend: extend, defaults: defaults, createCanvas: createCanvas, getContext: getContext, indexOf: indexOf, inherits: inherits, mixin: mixin, isArrayLike: isArrayLike, each: each$1, map: map, reduce: reduce, filter: filter, find: find, bind: bind, curry: curry, isArray: isArray, isFunction: isFunction$1, isString: isString, isObject: isObject$1, isBuiltInObject: isBuiltInObject, isTypedArray: isTypedArray, isDom: isDom, eqNaN: eqNaN, retrieve: retrieve, retrieve2: retrieve2, retrieve3: retrieve3, slice: slice, normalizeCssArray: normalizeCssArray, assert: assert$1, trim: trim, setAsPrimitive: setAsPrimitive, isPrimitive: isPrimitive, createHashMap: createHashMap, concatArray: concatArray, noop: noop }); var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; /** * 创建一个向量 * @param {number} [x=0] * @param {number} [y=0] * @return {Vector2} */ function create(x, y) { var out = new ArrayCtor(2); if (x == null) { x = 0; } if (y == null) { y = 0; } out[0] = x; out[1] = y; return out; } /** * 复制向量数据 * @param {Vector2} out * @param {Vector2} v * @return {Vector2} */ function copy(out, v) { out[0] = v[0]; out[1] = v[1]; return out; } /** * 克隆一个向量 * @param {Vector2} v * @return {Vector2} */ function clone$1(v) { var out = new ArrayCtor(2); out[0] = v[0]; out[1] = v[1]; return out; } /** * 设置向量的两个项 * @param {Vector2} out * @param {number} a * @param {number} b * @return {Vector2} 结果 */ function set(out, a, b) { out[0] = a; out[1] = b; return out; } /** * 向量相加 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function add(out, v1, v2) { out[0] = v1[0] + v2[0]; out[1] = v1[1] + v2[1]; return out; } /** * 向量缩放后相加 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 * @param {number} a */ function scaleAndAdd(out, v1, v2, a) { out[0] = v1[0] + v2[0] * a; out[1] = v1[1] + v2[1] * a; return out; } /** * 向量相减 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function sub(out, v1, v2) { out[0] = v1[0] - v2[0]; out[1] = v1[1] - v2[1]; return out; } /** * 向量长度 * @param {Vector2} v * @return {number} */ function len(v) { return Math.sqrt(lenSquare(v)); } var length = len; // jshint ignore:line /** * 向量长度平方 * @param {Vector2} v * @return {number} */ function lenSquare(v) { return v[0] * v[0] + v[1] * v[1]; } var lengthSquare = lenSquare; /** * 向量乘法 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function mul(out, v1, v2) { out[0] = v1[0] * v2[0]; out[1] = v1[1] * v2[1]; return out; } /** * 向量除法 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function div(out, v1, v2) { out[0] = v1[0] / v2[0]; out[1] = v1[1] / v2[1]; return out; } /** * 向量点乘 * @param {Vector2} v1 * @param {Vector2} v2 * @return {number} */ function dot(v1, v2) { return v1[0] * v2[0] + v1[1] * v2[1]; } /** * 向量缩放 * @param {Vector2} out * @param {Vector2} v * @param {number} s */ function scale(out, v, s) { out[0] = v[0] * s; out[1] = v[1] * s; return out; } /** * 向量归一化 * @param {Vector2} out * @param {Vector2} v */ function normalize(out, v) { var d = len(v); if (d === 0) { out[0] = 0; out[1] = 0; } else { out[0] = v[0] / d; out[1] = v[1] / d; } return out; } /** * 计算向量间距离 * @param {Vector2} v1 * @param {Vector2} v2 * @return {number} */ function distance(v1, v2) { return Math.sqrt( (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]) ); } var dist = distance; /** * 向量距离平方 * @param {Vector2} v1 * @param {Vector2} v2 * @return {number} */ function distanceSquare(v1, v2) { return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]); } var distSquare = distanceSquare; /** * 求负向量 * @param {Vector2} out * @param {Vector2} v */ function negate(out, v) { out[0] = -v[0]; out[1] = -v[1]; return out; } /** * 插值两个点 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 * @param {number} t */ function lerp(out, v1, v2, t) { out[0] = v1[0] + t * (v2[0] - v1[0]); out[1] = v1[1] + t * (v2[1] - v1[1]); return out; } /** * 矩阵左乘向量 * @param {Vector2} out * @param {Vector2} v * @param {Vector2} m */ function applyTransform(out, v, m) { var x = v[0]; var y = v[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out; } /** * 求两个向量最小值 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function min(out, v1, v2) { out[0] = Math.min(v1[0], v2[0]); out[1] = Math.min(v1[1], v2[1]); return out; } /** * 求两个向量最大值 * @param {Vector2} out * @param {Vector2} v1 * @param {Vector2} v2 */ function max(out, v1, v2) { out[0] = Math.max(v1[0], v2[0]); out[1] = Math.max(v1[1], v2[1]); return out; } var vector = (Object.freeze || Object)({ create: create, copy: copy, clone: clone$1, set: set, add: add, scaleAndAdd: scaleAndAdd, sub: sub, len: len, length: length, lenSquare: lenSquare, lengthSquare: lengthSquare, mul: mul, div: div, dot: dot, scale: scale, normalize: normalize, distance: distance, dist: dist, distanceSquare: distanceSquare, distSquare: distSquare, negate: negate, lerp: lerp, applyTransform: applyTransform, min: min, max: max }); // TODO Draggable for group // FIXME Draggable on element which has parent rotation or scale function Draggable() { this.on('mousedown', this._dragStart, this); this.on('mousemove', this._drag, this); this.on('mouseup', this._dragEnd, this); this.on('globalout', this._dragEnd, this); // this._dropTarget = null; // this._draggingTarget = null; // this._x = 0; // this._y = 0; } Draggable.prototype = { constructor: Draggable, _dragStart: function (e) { var draggingTarget = e.target; if (draggingTarget && draggingTarget.draggable) { this._draggingTarget = draggingTarget; draggingTarget.dragging = true; this._x = e.offsetX; this._y = e.offsetY; this.dispatchToElement(param(draggingTarget, e), 'dragstart', e.event); } }, _drag: function (e) { var draggingTarget = this._draggingTarget; if (draggingTarget) { var x = e.offsetX; var y = e.offsetY; var dx = x - this._x; var dy = y - this._y; this._x = x; this._y = y; draggingTarget.drift(dx, dy, e); this.dispatchToElement(param(draggingTarget, e), 'drag', e.event); var dropTarget = this.findHover(x, y, draggingTarget).target; var lastDropTarget = this._dropTarget; this._dropTarget = dropTarget; if (draggingTarget !== dropTarget) { if (lastDropTarget && dropTarget !== lastDropTarget) { this.dispatchToElement(param(lastDropTarget, e), 'dragleave', e.event); } if (dropTarget && dropTarget !== lastDropTarget) { this.dispatchToElement(param(dropTarget, e), 'dragenter', e.event); } } } }, _dragEnd: function (e) { var draggingTarget = this._draggingTarget; if (draggingTarget) { draggingTarget.dragging = false; } this.dispatchToElement(param(draggingTarget, e), 'dragend', e.event); if (this._dropTarget) { this.dispatchToElement(param(this._dropTarget, e), 'drop', e.event); } this._draggingTarget = null; this._dropTarget = null; } }; function param(target, e) { return {target: target, topTarget: e && e.topTarget}; } /** * Event Mixin * @module zrender/mixin/Eventful * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) * pissang (https://www.github.com/pissang) */ var arrySlice = Array.prototype.slice; /** * Event dispatcher. * * @alias module:zrender/mixin/Eventful * @constructor * @param {Object} [eventProcessor] The object eventProcessor is the scope when * `eventProcessor.xxx` called. * @param {Function} [eventProcessor.normalizeQuery] * param: {string|Object} Raw query. * return: {string|Object} Normalized query. * @param {Function} [eventProcessor.filter] Event will be dispatched only * if it returns `true`. * param: {string} eventType * param: {string|Object} query * return: {boolean} * @param {Function} [eventProcessor.afterTrigger] Call after all handlers called. * param: {string} eventType */ var Eventful = function (eventProcessor) { this._$handlers = {}; this._$eventProcessor = eventProcessor; }; Eventful.prototype = { constructor: Eventful, /** * The handler can only be triggered once, then removed. * * @param {string} event The event name. * @param {string|Object} [query] Condition used on event filter. * @param {Function} handler The event handler. * @param {Object} context */ one: function (event, query, handler, context) { return on(this, event, query, handler, context, true); }, /** * Bind a handler. * * @param {string} event The event name. * @param {string|Object} [query] Condition used on event filter. * @param {Function} handler The event handler. * @param {Object} [context] */ on: function (event, query, handler, context) { return on(this, event, query, handler, context, false); }, /** * Whether any handler has bound. * * @param {string} event * @return {boolean} */ isSilent: function (event) { var _h = this._$handlers; return !_h[event] || !_h[event].length; }, /** * Unbind a event. * * @param {string} event The event name. * @param {Function} [handler] The event handler. */ off: function (event, handler) { var _h = this._$handlers; if (!event) { this._$handlers = {}; return this; } if (handler) { if (_h[event]) { var newList = []; for (var i = 0, l = _h[event].length; i < l; i++) { if (_h[event][i].h !== handler) { newList.push(_h[event][i]); } } _h[event] = newList; } if (_h[event] && _h[event].length === 0) { delete _h[event]; } } else { delete _h[event]; } return this; }, /** * Dispatch a event. * * @param {string} type The event name. */ trigger: function (type) { var _h = this._$handlers[type]; var eventProcessor = this._$eventProcessor; if (_h) { var args = arguments; var argLen = args.length; if (argLen > 3) { args = arrySlice.call(args, 1); } var len = _h.length; for (var i = 0; i < len;) { var hItem = _h[i]; if (eventProcessor && eventProcessor.filter && hItem.query != null && !eventProcessor.filter(type, hItem.query) ) { i++; continue; } // Optimize advise from backbone switch (argLen) { case 1: hItem.h.call(hItem.ctx); break; case 2: hItem.h.call(hItem.ctx, args[1]); break; case 3: hItem.h.call(hItem.ctx, args[1], args[2]); break; default: // have more than 2 given arguments hItem.h.apply(hItem.ctx, args); break; } if (hItem.one) { _h.splice(i, 1); len--; } else { i++; } } } eventProcessor && eventProcessor.afterTrigger && eventProcessor.afterTrigger(type); return this; }, /** * Dispatch a event with context, which is specified at the last parameter. * * @param {string} type The event name. */ triggerWithContext: function (type) { var _h = this._$handlers[type]; var eventProcessor = this._$eventProcessor; if (_h) { var args = arguments; var argLen = args.length; if (argLen > 4) { args = arrySlice.call(args, 1, args.length - 1); } var ctx = args[args.length - 1]; var len = _h.length; for (var i = 0; i < len;) { var hItem = _h[i]; if (eventProcessor && eventProcessor.filter && hItem.query != null && !eventProcessor.filter(type, hItem.query) ) { i++; continue; } // Optimize advise from backbone switch (argLen) { case 1: hItem.h.call(ctx); break; case 2: hItem.h.call(ctx, args[1]); break; case 3: hItem.h.call(ctx, args[1], args[2]); break; default: // have more than 2 given arguments hItem.h.apply(ctx, args); break; } if (hItem.one) { _h.splice(i, 1); len--; } else { i++; } } } eventProcessor && eventProcessor.afterTrigger && eventProcessor.afterTrigger(type); return this; } }; function normalizeQuery(host, query) { var eventProcessor = host._$eventProcessor; if (query != null && eventProcessor && eventProcessor.normalizeQuery) { query = eventProcessor.normalizeQuery(query); } return query; } function on(eventful, event, query, handler, context, isOnce) { var _h = eventful._$handlers; if (typeof query === 'function') { context = handler; handler = query; query = null; } if (!handler || !event) { return eventful; } query = normalizeQuery(eventful, query); if (!_h[event]) { _h[event] = []; } for (var i = 0; i < _h[event].length; i++) { if (_h[event][i].h === handler) { return eventful; } } var wrap = { h: handler, one: isOnce, query: query, ctx: context || eventful, // FIXME // Do not publish this feature util it is proved that it makes sense. callAtLast: handler.zrEventfulCallAtLast }; var lastIndex = _h[event].length - 1; var lastWrap = _h[event][lastIndex]; (lastWrap && lastWrap.callAtLast) ? _h[event].splice(lastIndex, 0, wrap) : _h[event].push(wrap); return eventful; } /** * 事件辅助类 * @module zrender/core/event * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) */ var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; function getBoundingClientRect(el) { // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect return el.getBoundingClientRect ? el.getBoundingClientRect() : {left: 0, top: 0}; } // `calculate` is optional, default false function clientToLocal(el, e, out, calculate) { out = out || {}; // According to the W3C Working Draft, offsetX and offsetY should be relative // to the padding edge of the target element. The only browser using this convention // is IE. Webkit uses the border edge, Opera uses the content edge, and FireFox does // not support the properties. // (see http://www.jacklmoore.com/notes/mouse-position/) // In zr painter.dom, padding edge equals to border edge. // FIXME // When mousemove event triggered on ec tooltip, target is not zr painter.dom, and // offsetX/Y is relative to e.target, where the calculation of zrX/Y via offsetX/Y // is too complex. So css-transfrom dont support in this case temporarily. if (calculate || !env$1.canvasSupported) { defaultGetZrXY(el, e, out); } // Caution: In FireFox, layerX/layerY Mouse position relative to the closest positioned // ancestor element, so we should make sure el is positioned (e.g., not position:static). // BTW1, Webkit don't return the same results as FF in non-simple cases (like add // zoom-factor, overflow / opacity layers, transforms ...) // BTW2, (ev.offsetY || ev.pageY - $(ev.target).offset().top) is not correct in preserve-3d. // // BTW3, In ff, offsetX/offsetY is always 0. else if (env$1.browser.firefox && e.layerX != null && e.layerX !== e.offsetX) { out.zrX = e.layerX; out.zrY = e.layerY; } // For IE6+, chrome, safari, opera. (When will ff support offsetX?) else if (e.offsetX != null) { out.zrX = e.offsetX; out.zrY = e.offsetY; } // For some other device, e.g., IOS safari. else { defaultGetZrXY(el, e, out); } return out; } function defaultGetZrXY(el, e, out) { // This well-known method below does not support css transform. var box = getBoundingClientRect(el); out.zrX = e.clientX - box.left; out.zrY = e.clientY - box.top; } /** * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标. * `calculate` is optional, default false. */ function normalizeEvent(el, e, calculate) { e = e || window.event; if (e.zrX != null) { return e; } var eventType = e.type; var isTouch = eventType && eventType.indexOf('touch') >= 0; if (!isTouch) { clientToLocal(el, e, e, calculate); e.zrDelta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; } else { var touch = eventType !== 'touchend' ? e.targetTouches[0] : e.changedTouches[0]; touch && clientToLocal(el, touch, e, calculate); } // Add which for click: 1 === left; 2 === middle; 3 === right; otherwise: 0; // See jQuery: https://github.com/jquery/jquery/blob/master/src/event.js // If e.which has been defined, if may be readonly, // see: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which var button = e.button; if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); } // [Caution]: `e.which` from browser is not always reliable. For example, // when press left button and `mousemove (pointermove)` in Edge, the `e.which` // is 65536 and the `e.button` is -1. But the `mouseup (pointerup)` and // `mousedown (pointerdown)` is the same as Chrome does. return e; } /** * @param {HTMLElement} el * @param {string} name * @param {Function} handler */ function addEventListener(el, name, handler) { if (isDomLevel2) { // Reproduct the console warning: // [Violation] Added non-passive event listener to a scroll-blocking event. // Consider marking event handler as 'passive' to make the page more responsive. // Just set console log level: verbose in chrome dev tool. // then the warning log will be printed when addEventListener called. // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md // We have not yet found a neat way to using passive. Because in zrender the dom event // listener delegate all of the upper events of element. Some of those events need // to prevent default. For example, the feature `preventDefaultMouseMove` of echarts. // Before passive can be adopted, these issues should be considered: // (1) Whether and how a zrender user specifies an event listener passive. And by default, // passive or not. // (2) How to tread that some zrender event listener is passive, and some is not. If // we use other way but not preventDefault of mousewheel and touchmove, browser // compatibility should be handled. // var opts = (env.passiveSupported && name === 'mousewheel') // ? {passive: true} // // By default, the third param of el.addEventListener is `capture: false`. // : void 0; // el.addEventListener(name, handler /* , opts */); el.addEventListener(name, handler); } else { el.attachEvent('on' + name, handler); } } function removeEventListener(el, name, handler) { if (isDomLevel2) { el.removeEventListener(name, handler); } else { el.detachEvent('on' + name, handler); } } /** * preventDefault and stopPropagation. * Notice: do not do that in zrender. Upper application * do that if necessary. * * @memberOf module:zrender/core/event * @method * @param {Event} e : event对象 */ var stop = isDomLevel2 ? function (e) { e.preventDefault(); e.stopPropagation(); e.cancelBubble = true; } : function (e) { e.returnValue = false; e.cancelBubble = true; }; /** * This method only works for mouseup and mousedown. The functionality is restricted * for fault tolerance, See the `e.which` compatibility above. * * @param {MouseEvent} e * @return {boolean} */ function isMiddleOrRightButtonOnMouseUpDown(e) { return e.which === 2 || e.which === 3; } /** * To be removed. * @deprecated */ /** * Only implements needed gestures for mobile. */ var GestureMgr = function () { /** * @private * @type {Array.} */ this._track = []; }; GestureMgr.prototype = { constructor: GestureMgr, recognize: function (event, target, root) { this._doTrack(event, target, root); return this._recognize(event); }, clear: function () { this._track.length = 0; return this; }, _doTrack: function (event, target, root) { var touches = event.touches; if (!touches) { return; } var trackItem = { points: [], touches: [], target: target, event: event }; for (var i = 0, len = touches.length; i < len; i++) { var touch = touches[i]; var pos = clientToLocal(root, touch, {}); trackItem.points.push([pos.zrX, pos.zrY]); trackItem.touches.push(touch); } this._track.push(trackItem); }, _recognize: function (event) { for (var eventName in recognizers) { if (recognizers.hasOwnProperty(eventName)) { var gestureInfo = recognizers[eventName](this._track, event); if (gestureInfo) { return gestureInfo; } } } } }; function dist$1(pointPair) { var dx = pointPair[1][0] - pointPair[0][0]; var dy = pointPair[1][1] - pointPair[0][1]; return Math.sqrt(dx * dx + dy * dy); } function center(pointPair) { return [ (pointPair[0][0] + pointPair[1][0]) / 2, (pointPair[0][1] + pointPair[1][1]) / 2 ]; } var recognizers = { pinch: function (track, event) { var trackLen = track.length; if (!trackLen) { return; } var pinchEnd = (track[trackLen - 1] || {}).points; var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd; if (pinchPre && pinchPre.length > 1 && pinchEnd && pinchEnd.length > 1 ) { var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); !isFinite(pinchScale) && (pinchScale = 1); event.pinchScale = pinchScale; var pinchCenter = center(pinchEnd); event.pinchX = pinchCenter[0]; event.pinchY = pinchCenter[1]; return { type: 'pinch', target: track[0].target, event: event }; } } // Only pinch currently. }; var SILENT = 'silent'; function makeEventPacket(eveType, targetInfo, event) { return { type: eveType, event: event, // target can only be an element that is not silent. target: targetInfo.target, // topTarget can be a silent element. topTarget: targetInfo.topTarget, cancelBubble: false, offsetX: event.zrX, offsetY: event.zrY, gestureEvent: event.gestureEvent, pinchX: event.pinchX, pinchY: event.pinchY, pinchScale: event.pinchScale, wheelDelta: event.zrDelta, zrByTouch: event.zrByTouch, which: event.which, stop: stopEvent }; } function stopEvent(event) { stop(this.event); } function EmptyProxy() {} EmptyProxy.prototype.dispose = function () {}; var handlerNames = [ 'click', 'dblclick', 'mousewheel', 'mouseout', 'mouseup', 'mousedown', 'mousemove', 'contextmenu' ]; /** * @alias module:zrender/Handler * @constructor * @extends module:zrender/mixin/Eventful * @param {module:zrender/Storage} storage Storage instance. * @param {module:zrender/Painter} painter Painter instance. * @param {module:zrender/dom/HandlerProxy} proxy HandlerProxy instance. * @param {HTMLElement} painterRoot painter.root (not painter.getViewportRoot()). */ var Handler = function (storage, painter, proxy, painterRoot) { Eventful.call(this); this.storage = storage; this.painter = painter; this.painterRoot = painterRoot; proxy = proxy || new EmptyProxy(); /** * Proxy of event. can be Dom, WebGLSurface, etc. */ this.proxy = null; /** * {target, topTarget, x, y} * @private * @type {Object} */ this._hovered = {}; /** * @private * @type {Date} */ this._lastTouchMoment; /** * @private * @type {number} */ this._lastX; /** * @private * @type {number} */ this._lastY; /** * @private * @type {module:zrender/core/GestureMgr} */ this._gestureMgr; Draggable.call(this); this.setHandlerProxy(proxy); }; Handler.prototype = { constructor: Handler, setHandlerProxy: function (proxy) { if (this.proxy) { this.proxy.dispose(); } if (proxy) { each$1(handlerNames, function (name) { proxy.on && proxy.on(name, this[name], this); }, this); // Attach handler proxy.handler = this; } this.proxy = proxy; }, mousemove: function (event) { var x = event.zrX; var y = event.zrY; var lastHovered = this._hovered; var lastHoveredTarget = lastHovered.target; // If lastHoveredTarget is removed from zr (detected by '__zr') by some API call // (like 'setOption' or 'dispatchAction') in event handlers, we should find // lastHovered again here. Otherwise 'mouseout' can not be triggered normally. // See #6198. if (lastHoveredTarget && !lastHoveredTarget.__zr) { lastHovered = this.findHover(lastHovered.x, lastHovered.y); lastHoveredTarget = lastHovered.target; } var hovered = this._hovered = this.findHover(x, y); var hoveredTarget = hovered.target; var proxy = this.proxy; proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); // Mouse out on previous hovered element if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { this.dispatchToElement(lastHovered, 'mouseout', event); } // Mouse moving on one element this.dispatchToElement(hovered, 'mousemove', event); // Mouse over on a new element if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { this.dispatchToElement(hovered, 'mouseover', event); } }, mouseout: function (event) { this.dispatchToElement(this._hovered, 'mouseout', event); // There might be some doms created by upper layer application // at the same level of painter.getViewportRoot() (e.g., tooltip // dom created by echarts), where 'globalout' event should not // be triggered when mouse enters these doms. (But 'mouseout' // should be triggered at the original hovered element as usual). var element = event.toElement || event.relatedTarget; var innerDom; do { element = element && element.parentNode; } while (element && element.nodeType !== 9 && !( innerDom = element === this.painterRoot )); !innerDom && this.trigger('globalout', {event: event}); }, /** * Resize */ resize: function (event) { this._hovered = {}; }, /** * Dispatch event * @param {string} eventName * @param {event=} eventArgs */ dispatch: function (eventName, eventArgs) { var handler = this[eventName]; handler && handler.call(this, eventArgs); }, /** * Dispose */ dispose: function () { this.proxy.dispose(); this.storage = this.proxy = this.painter = null; }, /** * 设置默认的cursor style * @param {string} [cursorStyle='default'] 例如 crosshair */ setCursorStyle: function (cursorStyle) { var proxy = this.proxy; proxy.setCursor && proxy.setCursor(cursorStyle); }, /** * 事件分发代理 * * @private * @param {Object} targetInfo {target, topTarget} 目标图形元素 * @param {string} eventName 事件名称 * @param {Object} event 事件对象 */ dispatchToElement: function (targetInfo, eventName, event) { targetInfo = targetInfo || {}; var el = targetInfo.target; if (el && el.silent) { return; } var eventHandler = 'on' + eventName; var eventPacket = makeEventPacket(eventName, targetInfo, event); while (el) { el[eventHandler] && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket)); el.trigger(eventName, eventPacket); el = el.parent; if (eventPacket.cancelBubble) { break; } } if (!eventPacket.cancelBubble) { // 冒泡到顶级 zrender 对象 this.trigger(eventName, eventPacket); // 分发事件到用户自定义层 // 用户有可能在全局 click 事件中 dispose,所以需要判断下 painter 是否存在 this.painter && this.painter.eachOtherLayer(function (layer) { if (typeof (layer[eventHandler]) === 'function') { layer[eventHandler].call(layer, eventPacket); } if (layer.trigger) { layer.trigger(eventName, eventPacket); } }); } }, /** * @private * @param {number} x * @param {number} y * @param {module:zrender/graphic/Displayable} exclude * @return {model:zrender/Element} * @method */ findHover: function (x, y, exclude) { var list = this.storage.getDisplayList(); var out = {x: x, y: y}; for (var i = list.length - 1; i >= 0; i--) { var hoverCheckResult; if (list[i] !== exclude // getDisplayList may include ignored item in VML mode && !list[i].ignore && (hoverCheckResult = isHover(list[i], x, y)) ) { !out.topTarget && (out.topTarget = list[i]); if (hoverCheckResult !== SILENT) { out.target = list[i]; break; } } } return out; }, processGesture: function (event, stage) { if (!this._gestureMgr) { this._gestureMgr = new GestureMgr(); } var gestureMgr = this._gestureMgr; stage === 'start' && gestureMgr.clear(); var gestureInfo = gestureMgr.recognize( event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom ); stage === 'end' && gestureMgr.clear(); // Do not do any preventDefault here. Upper application do that if necessary. if (gestureInfo) { var type = gestureInfo.type; event.gestureEvent = type; this.dispatchToElement({target: gestureInfo.target}, type, gestureInfo.event); } } }; // Common handlers each$1(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { Handler.prototype[name] = function (event) { // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover var hovered = this.findHover(event.zrX, event.zrY); var hoveredTarget = hovered.target; if (name === 'mousedown') { this._downEl = hoveredTarget; this._downPoint = [event.zrX, event.zrY]; // In case click triggered before mouseup this._upEl = hoveredTarget; } else if (name === 'mouseup') { this._upEl = hoveredTarget; } else if (name === 'click') { if (this._downEl !== this._upEl // Original click event is triggered on the whole canvas element, // including the case that `mousedown` - `mousemove` - `mouseup`, // which should be filtered, otherwise it will bring trouble to // pan and zoom. || !this._downPoint // Arbitrary value || dist(this._downPoint, [event.zrX, event.zrY]) > 4 ) { return; } this._downPoint = null; } this.dispatchToElement(hovered, name, event); }; }); function isHover(displayable, x, y) { if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { var el = displayable; var isSilent; while (el) { // If clipped by ancestor. // FIXME: If clipPath has neither stroke nor fill, // el.clipPath.contain(x, y) will always return false. if (el.clipPath && !el.clipPath.contain(x, y)) { return false; } if (el.silent) { isSilent = true; } el = el.parent; } return isSilent ? SILENT : true; } return false; } mixin(Handler, Eventful); mixin(Handler, Draggable); /** * 3x2矩阵操作类 * @exports zrender/tool/matrix */ var ArrayCtor$1 = typeof Float32Array === 'undefined' ? Array : Float32Array; /** * Create a identity matrix. * @return {Float32Array|Array.} */ function create$1() { var out = new ArrayCtor$1(6); identity(out); return out; } /** * 设置矩阵为单位矩阵 * @param {Float32Array|Array.} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; return out; } /** * 复制矩阵 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} m */ function copy$1(out, m) { out[0] = m[0]; out[1] = m[1]; out[2] = m[2]; out[3] = m[3]; out[4] = m[4]; out[5] = m[5]; return out; } /** * 矩阵相乘 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} m1 * @param {Float32Array|Array.} m2 */ function mul$1(out, m1, m2) { // Consider matrix.mul(m, m2, m); // where out is the same as m2. // So use temp variable to escape error. var out0 = m1[0] * m2[0] + m1[2] * m2[1]; var out1 = m1[1] * m2[0] + m1[3] * m2[1]; var out2 = m1[0] * m2[2] + m1[2] * m2[3]; var out3 = m1[1] * m2[2] + m1[3] * m2[3]; var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = out3; out[4] = out4; out[5] = out5; return out; } /** * 平移变换 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} a * @param {Float32Array|Array.} v */ function translate(out, a, v) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4] + v[0]; out[5] = a[5] + v[1]; return out; } /** * 旋转变换 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} a * @param {number} rad */ function rotate(out, a, rad) { var aa = a[0]; var ac = a[2]; var atx = a[4]; var ab = a[1]; var ad = a[3]; var aty = a[5]; var st = Math.sin(rad); var ct = Math.cos(rad); out[0] = aa * ct + ab * st; out[1] = -aa * st + ab * ct; out[2] = ac * ct + ad * st; out[3] = -ac * st + ct * ad; out[4] = ct * atx + st * aty; out[5] = ct * aty - st * atx; return out; } /** * 缩放变换 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} a * @param {Float32Array|Array.} v */ function scale$1(out, a, v) { var vx = v[0]; var vy = v[1]; out[0] = a[0] * vx; out[1] = a[1] * vy; out[2] = a[2] * vx; out[3] = a[3] * vy; out[4] = a[4] * vx; out[5] = a[5] * vy; return out; } /** * 求逆矩阵 * @param {Float32Array|Array.} out * @param {Float32Array|Array.} a */ function invert(out, a) { var aa = a[0]; var ac = a[2]; var atx = a[4]; var ab = a[1]; var ad = a[3]; var aty = a[5]; var det = aa * ad - ab * ac; if (!det) { return null; } det = 1.0 / det; out[0] = ad * det; out[1] = -ab * det; out[2] = -ac * det; out[3] = aa * det; out[4] = (ac * aty - ad * atx) * det; out[5] = (ab * atx - aa * aty) * det; return out; } /** * Clone a new matrix. * @param {Float32Array|Array.} a */ function clone$2(a) { var b = create$1(); copy$1(b, a); return b; } var matrix = (Object.freeze || Object)({ create: create$1, identity: identity, copy: copy$1, mul: mul$1, translate: translate, rotate: rotate, scale: scale$1, invert: invert, clone: clone$2 }); /** * 提供变换扩展 * @module zrender/mixin/Transformable * @author pissang (https://www.github.com/pissang) */ var mIdentity = identity; var EPSILON = 5e-5; function isNotAroundZero(val) { return val > EPSILON || val < -EPSILON; } /** * @alias module:zrender/mixin/Transformable * @constructor */ var Transformable = function (opts) { opts = opts || {}; // If there are no given position, rotation, scale if (!opts.position) { /** * 平移 * @type {Array.} * @default [0, 0] */ this.position = [0, 0]; } if (opts.rotation == null) { /** * 旋转 * @type {Array.} * @default 0 */ this.rotation = 0; } if (!opts.scale) { /** * 缩放 * @type {Array.} * @default [1, 1] */ this.scale = [1, 1]; } /** * 旋转和缩放的原点 * @type {Array.} * @default null */ this.origin = this.origin || null; }; var transformableProto = Transformable.prototype; transformableProto.transform = null; /** * 判断是否需要有坐标变换 * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵 */ transformableProto.needLocalTransform = function () { return isNotAroundZero(this.rotation) || isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1]) || isNotAroundZero(this.scale[0] - 1) || isNotAroundZero(this.scale[1] - 1); }; var scaleTmp = []; transformableProto.updateTransform = function () { var parent = this.parent; var parentHasTransform = parent && parent.transform; var needLocalTransform = this.needLocalTransform(); var m = this.transform; if (!(needLocalTransform || parentHasTransform)) { m && mIdentity(m); return; } m = m || create$1(); if (needLocalTransform) { this.getLocalTransform(m); } else { mIdentity(m); } // 应用父节点变换 if (parentHasTransform) { if (needLocalTransform) { mul$1(m, parent.transform, m); } else { copy$1(m, parent.transform); } } // 保存这个变换矩阵 this.transform = m; var globalScaleRatio = this.globalScaleRatio; if (globalScaleRatio != null && globalScaleRatio !== 1) { this.getGlobalScale(scaleTmp); var relX = scaleTmp[0] < 0 ? -1 : 1; var relY = scaleTmp[1] < 0 ? -1 : 1; var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0; var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0; m[0] *= sx; m[1] *= sx; m[2] *= sy; m[3] *= sy; } this.invTransform = this.invTransform || create$1(); invert(this.invTransform, m); }; transformableProto.getLocalTransform = function (m) { return Transformable.getLocalTransform(this, m); }; /** * 将自己的transform应用到context上 * @param {CanvasRenderingContext2D} ctx */ transformableProto.setTransform = function (ctx) { var m = this.transform; var dpr = ctx.dpr || 1; if (m) { ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); } else { ctx.setTransform(dpr, 0, 0, dpr, 0, 0); } }; transformableProto.restoreTransform = function (ctx) { var dpr = ctx.dpr || 1; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); }; var tmpTransform = []; var originTransform = create$1(); transformableProto.setLocalTransform = function (m) { if (!m) { // TODO return or set identity? return; } var sx = m[0] * m[0] + m[1] * m[1]; var sy = m[2] * m[2] + m[3] * m[3]; var position = this.position; var scale$$1 = this.scale; if (isNotAroundZero(sx - 1)) { sx = Math.sqrt(sx); } if (isNotAroundZero(sy - 1)) { sy = Math.sqrt(sy); } if (m[0] < 0) { sx = -sx; } if (m[3] < 0) { sy = -sy; } position[0] = m[4]; position[1] = m[5]; scale$$1[0] = sx; scale$$1[1] = sy; this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); }; /** * 分解`transform`矩阵到`position`, `rotation`, `scale` */ transformableProto.decomposeTransform = function () { if (!this.transform) { return; } var parent = this.parent; var m = this.transform; if (parent && parent.transform) { // Get local transform and decompose them to position, scale, rotation mul$1(tmpTransform, parent.invTransform, m); m = tmpTransform; } var origin = this.origin; if (origin && (origin[0] || origin[1])) { originTransform[4] = origin[0]; originTransform[5] = origin[1]; mul$1(tmpTransform, m, originTransform); tmpTransform[4] -= origin[0]; tmpTransform[5] -= origin[1]; m = tmpTransform; } this.setLocalTransform(m); }; /** * Get global scale * @return {Array.} */ transformableProto.getGlobalScale = function (out) { var m = this.transform; out = out || []; if (!m) { out[0] = 1; out[1] = 1; return out; } out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]); out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]); if (m[0] < 0) { out[0] = -out[0]; } if (m[3] < 0) { out[1] = -out[1]; } return out; }; /** * 变换坐标位置到 shape 的局部坐标空间 * @method * @param {number} x * @param {number} y * @return {Array.} */ transformableProto.transformCoordToLocal = function (x, y) { var v2 = [x, y]; var invTransform = this.invTransform; if (invTransform) { applyTransform(v2, v2, invTransform); } return v2; }; /** * 变换局部坐标位置到全局坐标空间 * @method * @param {number} x * @param {number} y * @return {Array.
座位:一次最多选4个座位
用户评分
累计票房
上映时间:2019-07-18
634541人想看
请在分钟秒内完成支付
超时订单会自动取消,如遇支付问题,请联系管理员
请仔细核对场次信息,出票后将无法退票和改签
已完成支付
该页面关闭后可以在个人订单页面查看订单信息
免押金
停车场可凭电影票在影城票台领取3小时内免停权益