Repository: saysky/manland Branch: master Commit: f536d218d785 Files: 222 Total size: 2.2 MB Directory structure: gitextract_uyewi9iz/ ├── .gitattributes ├── .gitignore ├── README.md ├── pom.xml └── src/ └── main/ ├── java/ │ └── com/ │ └── example/ │ └── sens/ │ ├── Application.java │ ├── common/ │ │ ├── base/ │ │ │ ├── BaseEntity.java │ │ │ └── BaseService.java │ │ └── constant/ │ │ └── CommonConstant.java │ ├── config/ │ │ ├── MvcConfig.java │ │ ├── mybatisplus/ │ │ │ └── MybatisPlusConfig.java │ │ ├── properties/ │ │ │ └── IgnoredUrlsProperties.java │ │ ├── schedule/ │ │ │ └── SystemSchedule.java │ │ └── shiro/ │ │ ├── MyRealm.java │ │ ├── ShiroConfig.java │ │ └── URLPathMatchingFilter.java │ ├── controller/ │ │ ├── admin/ │ │ │ ├── AdminController.java │ │ │ ├── AttachmentController.java │ │ │ ├── CategoryController.java │ │ │ ├── NoticeController.java │ │ │ ├── OrderController.java │ │ │ ├── PermissionController.java │ │ │ ├── PostController.java │ │ │ ├── ProfileController.java │ │ │ ├── RechargeRecordController.java │ │ │ ├── RoleController.java │ │ │ └── UserController.java │ │ ├── common/ │ │ │ ├── BaseController.java │ │ │ └── CommonController.java │ │ └── home/ │ │ ├── FrontPostController.java │ │ ├── IndexController.java │ │ └── LoginController.java │ ├── dto/ │ │ ├── JsonResult.java │ │ ├── PostQueryCondition.java │ │ └── QueryCondition.java │ ├── entity/ │ │ ├── Category.java │ │ ├── City.java │ │ ├── Notice.java │ │ ├── Order.java │ │ ├── Permission.java │ │ ├── Post.java │ │ ├── RechargeRecord.java │ │ ├── Role.java │ │ ├── RolePermissionRef.java │ │ ├── User.java │ │ └── UserRoleRef.java │ ├── enums/ │ │ ├── CommonParamsEnum.java │ │ ├── OrderStatusEnum.java │ │ ├── PostIsRecommendEnum.java │ │ ├── PostIsStickyEnum.java │ │ ├── PostStatusEnum.java │ │ ├── PostTypeEnum.java │ │ ├── ResourceTypeEnum.java │ │ ├── ResultCodeEnum.java │ │ ├── RoleEnum.java │ │ ├── TrueFalseEnum.java │ │ └── UserStatusEnum.java │ ├── exception/ │ │ ├── GlobalExceptionHandler.java │ │ └── MyBusinessException.java │ ├── mapper/ │ │ ├── CategoryMapper.java │ │ ├── CityMapper.java │ │ ├── NoticeMapper.java │ │ ├── OrderMapper.java │ │ ├── PermissionMapper.java │ │ ├── PostMapper.java │ │ ├── RechargeRecordMapper.java │ │ ├── RoleMapper.java │ │ ├── RolePermissionRefMapper.java │ │ ├── UserMapper.java │ │ └── UserRoleRefMapper.java │ ├── service/ │ │ ├── CategoryService.java │ │ ├── CityService.java │ │ ├── MailService.java │ │ ├── NoticeService.java │ │ ├── OrderService.java │ │ ├── PermissionService.java │ │ ├── PostService.java │ │ ├── RechargeRecordService.java │ │ ├── RolePermissionRefService.java │ │ ├── RoleService.java │ │ ├── UserRoleRefService.java │ │ ├── UserService.java │ │ └── impl/ │ │ ├── CategoryServiceImpl.java │ │ ├── CityServiceImpl.java │ │ ├── MailServiceImpl.java │ │ ├── NoticeServiceImpl.java │ │ ├── OrderServiceImpl.java │ │ ├── PermissionServiceImpl.java │ │ ├── PostServiceImpl.java │ │ ├── RechargeRecordServiceImpl.java │ │ ├── RolePermissionRefServiceImpl.java │ │ ├── RoleServiceImpl.java │ │ ├── UserRoleRefServiceImpl.java │ │ └── UserServiceImpl.java │ ├── util/ │ │ ├── DateUtil.java │ │ ├── FileUtil.java │ │ ├── IpInfoUtil.java │ │ ├── Md5Util.java │ │ ├── ObjectUtil.java │ │ ├── PageUtil.java │ │ ├── PermissionUtil.java │ │ ├── RegexUtil.java │ │ ├── RelativeDateFormat.java │ │ ├── Response.java │ │ ├── SensUtils.java │ │ ├── SpringUtil.java │ │ └── ThreadPoolUtil.java │ └── vo/ │ ├── PageVo.java │ └── SearchVo.java └── resources/ ├── application.yaml ├── mapper/ │ ├── CategoryMapper.xml │ ├── CityMapper.xml │ ├── OrderMapper.xml │ ├── PermissionMapper.xml │ ├── PostMapper.xml │ ├── RechargeRecordMapper.xml │ ├── RoleMapper.xml │ ├── RolePermissionRefMapper.xml │ ├── UserMapper.xml │ └── UserRoleRefMapper.xml ├── static/ │ ├── css/ │ │ ├── AdminLTE.css │ │ ├── alt/ │ │ │ ├── AdminLTE-bootstrap-social.css │ │ │ ├── AdminLTE-select2.css │ │ │ └── AdminLTE-without-plugins.css │ │ ├── loader.css │ │ ├── pay.css │ │ ├── skins/ │ │ │ └── _all-skins.css │ │ └── style.css │ ├── front/ │ │ ├── css/ │ │ │ ├── pay.css │ │ │ └── style.css │ │ ├── js/ │ │ │ ├── contact_me.js │ │ │ ├── custom.js │ │ │ └── jqBootstrapValidation.js │ │ └── vendor/ │ │ └── select2/ │ │ └── css/ │ │ └── select2-bootstrap.css │ ├── js/ │ │ ├── adminlte.js │ │ └── app.js │ └── plugins/ │ ├── bootstrap/ │ │ ├── css/ │ │ │ ├── bootstrap-theme.css │ │ │ └── bootstrap.css │ │ └── js/ │ │ ├── bootstrap.js │ │ └── npm.js │ ├── bootstrapStyle/ │ │ └── bootstrapStyle.css │ ├── bootstrapvalidator/ │ │ ├── css/ │ │ │ └── bootstrapValidator.css │ │ └── js/ │ │ ├── bootstrapValidator.js │ │ └── language/ │ │ └── zh_CN.js │ ├── font-awesome/ │ │ ├── css/ │ │ │ └── font-awesome.css │ │ └── fonts/ │ │ └── FontAwesome.otf │ ├── froala-editor/ │ │ ├── css/ │ │ │ ├── froala_editor.css │ │ │ ├── froala_editor.pkgd.css │ │ │ ├── froala_style.css │ │ │ ├── plugins/ │ │ │ │ ├── char_counter.css │ │ │ │ ├── code_view.css │ │ │ │ ├── colors.css │ │ │ │ ├── draggable.css │ │ │ │ ├── emoticons.css │ │ │ │ ├── file.css │ │ │ │ ├── fullscreen.css │ │ │ │ ├── help.css │ │ │ │ ├── image.css │ │ │ │ ├── image_manager.css │ │ │ │ ├── line_breaker.css │ │ │ │ ├── quick_insert.css │ │ │ │ ├── special_characters.css │ │ │ │ ├── table.css │ │ │ │ └── video.css │ │ │ ├── themes/ │ │ │ │ ├── dark.css │ │ │ │ ├── gray.css │ │ │ │ ├── red.css │ │ │ │ └── royal.css │ │ │ └── third_party/ │ │ │ ├── embedly.css │ │ │ ├── font_awesome.css │ │ │ ├── image_tui.css │ │ │ └── spell_checker.css │ │ └── js/ │ │ └── languages/ │ │ ├── ar.js │ │ ├── bs.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de.js │ │ ├── el.js │ │ ├── en_ca.js │ │ ├── en_gb.js │ │ ├── es.js │ │ ├── et.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── he.js │ │ ├── hr.js │ │ ├── hu.js │ │ ├── id.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── ko.js │ │ ├── ku.js │ │ ├── me.js │ │ ├── nb.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── pt_br.js │ │ ├── pt_pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── th.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── vi.js │ │ ├── zh_cn.js │ │ └── zh_tw.js │ ├── highlight/ │ │ ├── highlight.css │ │ └── highlight.js │ ├── layer/ │ │ ├── layer.js │ │ ├── mobile/ │ │ │ ├── layer.js │ │ │ └── need/ │ │ │ └── layer.css │ │ └── theme/ │ │ └── default/ │ │ └── layer.css │ ├── lazyload/ │ │ └── jquery.lazyload.js │ ├── loaders/ │ │ └── loaders.css │ ├── pace/ │ │ ├── pace.css │ │ └── pace.js │ ├── pjax/ │ │ └── jquery.pjax.js │ └── pretty-checkbox/ │ └── pretty-checkbox.css └── 需要前端代码联系博主.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.js linguist-language=Java *.css linguist-language=Java *.html linguist-language=Java ================================================ FILE: .gitignore ================================================ target/ logs/ out/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr log/ ### NetBeans ### nbproject/private/ build/ nbbuild/ dist/ nbdist/ .nb-gradle/ ### Mac .DS_Store */.DS_Store ### VS Code ### *.project *.factorypath ### 屏蔽,需要完整代码联系博主:微信847064370 *.html templates/ webapp/ *.sql ================================================ FILE: README.md ================================================ 最新消息,博主已开通B站账号:[Java刘哥](https://space.bilibili.com/160340478)
# 租房系统 基于SpringBoot实现的租房系统,包括三种角色:管理员、房东、租客。 - 详细介绍:[https://liuyanzhao.com/shop/manland.html](https://liuyanzhao.com/shop/manland.html)
- 预览地址:[http://manland.liuyanzhao.com](http://manland.liuyanzhao.com)

## 博主开发的其他租房或房屋交易项目全部在这里
[https://liuyanzhao.com/shop.html?k=房屋](https://liuyanzhao.com/shop.html?k=房屋) - [基于SpringBoot+Vue房屋租赁系统 租房 Verio的Vue版本](https://liuyanzhao.com/shop/verio-vue.html) - [基于SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台](https://liuyanzhao.com/shop/housekey.html) - [基于SpringBoot/SSM的最新最轻量级最漂亮的的二手房屋交易系统RentUP](https://liuyanzhao.com/shop/rentup.html) - [基于SpringBoot/SSM的房屋租赁系统租房系统Rello](https://liuyanzhao.com/shop/rello.html) - [基于SpringBoot/SSM房屋租赁系统 verio3.0/协同过滤,房屋合租系统 租房系统](https://liuyanzhao.com/shop/verio.html) - [基于SpringBoot房屋租赁系统manland4.0](https://liuyanzhao.com/shop/manland.html) # 功能介绍 #### 管理员功能: - 房屋管理 - 租房类型管理(合租/整租) - 房屋管理 - 订单管理 - 新闻公告管理 - 收支明细 - 用户管理 - 角色管理、权限管理 #### 房东功能 - 房屋管理 - 订单管理:取消订单、审核退租、查看合同、下载打印合同 - 收支明细 - 个人信息修改、账号密码修改 ## 租客功能 订单管理:创建订单、确认合同、支付订单、取消订单、退租、电子合同查看、下载打印合同 收支明细 个人信息修改、账号密码修改 ## 技术组成 - SpringBoot - MyBatis - Shiro - Thymeleaf - Bootstrap + jQuery - MySQL - Maven ## 预览 1-首页1.png ![1-首页1.png](img/1-首页1.png) 2-首页2.png ![2-首页2.png](img/2-首页2.png) 3-房屋列表1.png ![3-房屋列表1.png](img/3-房屋列表1.png) 4-房屋列表2.png ![4-房屋列表2.png](img/4-房屋列表2.png) 5-房屋详情1.png ![5-房屋详情1.png](img/5-房屋详情1.png) 6-房屋详情2.png ![6-房屋详情2.png](img/6-房屋详情2.png) 7-新闻公告列表.png ![7-新闻公告列表.png](img/7-新闻公告列表.png) 8-新闻公告详情.png ![8-新闻公告详情.png](img/8-新闻公告详情.png) 10-注册页面.png ![10-注册页面.png](img/10-注册页面.png) 10-登录页面.png ![10-登录页面.png](img/10-登录页面.png) 11-点击预定.png ![11-点击预定.png](img/11-点击预定.png) 12-签订合同页面.png ![12-签订合同页面.png](img/12-签订合同页面.png) 13-支付订单页面.png ![13-支付订单页面.png](img/13-支付订单页面.png) 14-租客订单列表.png ![14-租客订单列表.png](img/14-租客订单列表.png) 15-租客的房屋信息.png ![15-租客的房屋信息.png](img/15-租客的房屋信息.png) 16-充值管理.png ![16-充值管理.png](img/16-充值管理.png) 17-个人信息.png ![17-个人信息.png](img/17-个人信息.png) 18-出租者的房屋信息列表.png ![18-出租者的房屋信息列表.png](img/18-出租者的房屋信息列表.png) 19-出租者的订单管理.png ![19-出租者的订单管理.png](img/19-出租者的订单管理.png) 20-管理员房屋管理.png ![20-管理员房屋管理.png](img/20-管理员房屋管理.png) 21-出租分类.png ![21-出租分类.png](img/21-出租分类.png) 22-财务统计.png ![22-财务统计.png](img/22-财务统计.png) 23-公告管理.png ![23-公告管理.png](img/23-公告管理.png) 24-编辑发布新闻公告.png ![24-编辑发布新闻公告.png](img/24-编辑发布新闻公告.png) 25-用户管理.png ![25-用户管理.png](img/25-用户管理.png) 26-房屋信息发布.png ![26-房屋信息发布.png](img/26-房屋信息发布.png) 27-房屋信息编辑.png ![27-房屋信息编辑.png](img/27-房屋信息编辑.png) 其他页面,请直接通过演示网站访问
管理员账号admin/123456,房东mayun/123456,租客zhangsan/123456 ## 联系方式 目前只开源后端代码,需要前端和sql等完整代码请联系博主
同时也提供部署或讲解服务
微信/QQ:847064370
[博主博客主页](https://liuyanzhao.com)
## 日志 - 2021/11/13 4.0版本 - 新增中介角色,功能跟房东类似,需要填写房东信息 - 注册登录增加验证码,不区分大小写 - 2021/3/17 3.0版本 - 大改 - 角色改成 管理员、房东和租客三种,将原来用户角色拆分成房东和租客 - 租房时间单位由月改成日,租房时可以选择租到具体哪一天 - 新增退租功能 - 取消充值,用户余额字段,新增收支明细 - 管理员可以对订单做任何操作操作 - 2020/12/14 2.0版本 - 根据部分同学要求,重构代码 — 修改导航菜单,加入图标 - 固定顶部导航 - 添加城市切换切换卡 - 添加合租室友信息 - 2020/12/06 - 根据部分同学要求,重构代码 - 把房东和租客两种角色合二为一,用户既可以租房也可以发布出租信息。 - 把租房分类改成了整租和合租。 - 新增余额充值和收支明细,以及付款后租客余额减少,出租人越增加,定时返回押金 - 修改了合同内容,新增合同下载和打印 - 新增新闻公告 - 新增联系我们页面 - 新增押金字段 - 新增支持租金和面积检索
- 2020/10/18 1.0 版本 - 完成初步开发 - 管理员功能:登录,房屋管理、房屋类型管理、订单管理、房东管理,租客管理、财务统计,个人信息等。还要角色管理和权限管理,这里隐藏了。 - 房东功能:注册,登录,房屋管理(房屋添加修改删除上架等)、订单管理、查看电子合同。 - 租客功能:注册,登录,房屋检索,房屋租赁,查看订单,查看电子合同。 ================================================ FILE: pom.xml ================================================ 4.0.0 com.example Manland 4.0.0 Manland 基于SpringBoot的房租租赁系统 saysky 言曌 admin@example.com https://example.com org.springframework.boot spring-boot-starter-parent 2.1.7.RELEASE UTF-8 UTF-8 1.8 1.1.10 1.18.2 3.8 4.1.13 saysky org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-undertow com.baomidou mybatis-plus-boot-starter 3.1.2 org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java runtime com.alibaba druid-spring-boot-starter ${druid.version} org.springframework.boot spring-boot-starter-thymeleaf org.projectlombok lombok ${lombok.version} provided org.apache.commons commons-lang3 ${commons-lang3.version} cn.hutool hutool-all ${hutool-all.version} org.springframework.boot spring-boot-devtools true com.alibaba fastjson 1.2.72 com.google.guava guava 26.0-jre org.apache.shiro shiro-spring 1.4.0 com.github.theborakompanioni thymeleaf-extras-shiro 2.0.0 com.google.code.gson gson 2.8.5 io.github.biezhi oh-my-email 0.0.3 junit junit 4.12 com.github.penggle kaptcha 2.3.2 aliyun http://maven.aliyun.com/nexus/content/groups/public aliyun http://maven.aliyun.com/nexus/content/groups/public manland org.springframework.boot spring-boot-maven-plugin true ================================================ FILE: src/main/java/com/example/sens/Application.java ================================================ package com.example.sens; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.EnableScheduling; /** *
 *     SENS run!
 * 
* * @author : saysky * @date : 2019/11/14 */ @Slf4j @SpringBootApplication @EnableCaching @EnableScheduling @MapperScan("com.example.sens.mapper*") public class Application { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Application.class, args); String serverPort = context.getEnvironment().getProperty("server.port"); log.info("SENS started at http://localhost:" + serverPort); } } ================================================ FILE: src/main/java/com/example/sens/common/base/BaseEntity.java ================================================ package com.example.sens.common.base; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.example.sens.common.constant.CommonConstant; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @author 言曌 * @date 2019-08-07 00:28 */ @Data public class BaseEntity implements Serializable { /** * ID,自动生成 */ @TableId(type = IdType.AUTO) private Long id; /** * 删除状态:1删除,0未删除 */ @TableField(value = "del_flag") @TableLogic private Integer delFlag = CommonConstant.STATUS_NORMAL; /** * 创建人账号 */ private String createBy; /** * 创建时间 */ private Date createTime; /** * 更新人 */ private String updateBy; /** * 更新时间 */ private Date updateTime; } ================================================ FILE: src/main/java/com/example/sens/common/base/BaseService.java ================================================ package com.example.sens.common.base; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.vo.SearchVo; import com.example.sens.dto.QueryCondition; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.util.Date; import java.util.List; /** * @author 言曌 * @date 2019-09-04 22:47 */ // JDK8函数式接口注解 仅能包含一个抽象方法 public interface BaseService { /** * @return */ BaseMapper getRepository(); /** * 根据ID获取 * * @param id * @return */ default E get(ID id) { return getRepository().selectById(id); } /** * 获取所有列表 * * @return */ default List getAll() { return getRepository().selectList(null); } /** * 获取总数 * * @return */ default Integer getTotalCount() { return getRepository().selectCount(null); } /** * 添加 * * @param entity * @return */ default E insert(E entity) { getRepository().insert(entity); return entity; } /** * 修改 * * @param entity * @return */ default E update(E entity) { getRepository().updateById(entity); return entity; } /** * 保存或者更新 * @param entity * @return */ default E insertOrUpdate(E entity) { try { Object id = entity.getClass().getMethod("getId").invoke(entity); if (id != null) { update(entity); } else { insert(entity); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return entity; } /** * 批量保存与修改 * * @param list * @return */ default List batchInsert(List list) { for (E e : list) { getRepository().insert(e); } return list; } /** * 根据Id删除 * * @param id */ default void delete(ID id) { getRepository().deleteById(id); } /** * 批量删除 * * @param ids */ default void batchDelete(List ids) { getRepository().deleteBatchIds(ids); } /** * 根据id批量查询 * @param ids * @return */ default List findByBatchIds(List ids) { return getRepository().selectBatchIds(ids); } /** * 获取所有 * * @return */ default List findAll() { return getRepository().selectList(null); } /** * 根据条件查询获取 * * @param queryWrapper * @return */ default List findAll(QueryWrapper queryWrapper) { return getRepository().selectList(queryWrapper); } /** * 根据查询条件不分页获取 * * @param condition * @return */ default List findAll(QueryCondition condition) { E e = condition.getData(); //对指定字段查询 QueryWrapper queryWrapper = getQueryWrapper(e); return getRepository().selectList(queryWrapper); } /** * 分页获取 * * @param page * @return */ default Page findAll(Page page) { return (Page) getRepository().selectPage(page, null); } /** * 获得查询器 * * @param e * @return */ QueryWrapper getQueryWrapper(E e); /** * 根据查询条件分页获取 * * @param page * @param condition * @return */ default Page findAll(Page page, QueryCondition condition) { E e = condition.getData(); SearchVo searchVo = condition.getSearchVo(); //对指定字段查询 QueryWrapper queryWrapper = getQueryWrapper(e); //查询日期范围 if (searchVo != null) { String startDate = searchVo.getStartDate(); String endDate = searchVo.getEndDate(); if (StrUtil.isNotBlank(startDate) && StrUtil.isNotBlank(endDate)) { Date start = DateUtil.parse(startDate); Date end = DateUtil.parse(endDate); queryWrapper.between("create_time", start, end); } } return (Page) getRepository().selectPage(page, queryWrapper); } /** * 获取查询条件的结果数 * * @param queryWrapper * @return */ default long count(QueryWrapper queryWrapper) { return getRepository().selectCount(queryWrapper); } } ================================================ FILE: src/main/java/com/example/sens/common/constant/CommonConstant.java ================================================ package com.example.sens.common.constant; /** * 常量 * @author 言曌 */ public interface CommonConstant { /** * 正常状态 */ Integer STATUS_NORMAL = 0; /** * 用户密码加盐的盐 */ String PASSWORD_SALT = "sens"; /** * none */ String NONE = "none"; String CONDITION = "condition"; } ================================================ FILE: src/main/java/com/example/sens/config/MvcConfig.java ================================================ package com.example.sens.config; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; /** * 拦截器,资源路径配置 */ @Slf4j @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.example.sens.controller") @PropertySource(value = "classpath:application.yaml", ignoreResourceNotFound = true, encoding = "UTF-8") public class MvcConfig implements WebMvcConfigurer { /** * 配置静态资源路径 * * @param registry registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); registry.addResourceHandler("/**") .addResourceLocations("classpath:/templates/themes/") .addResourceLocations("classpath:/robots.txt"); registry.addResourceHandler("/upload/**") .addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/sens/upload/"); registry.addResourceHandler("/favicon.png") .addResourceLocations("classpath:/static/images/favicon.png"); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(true) .allowedHeaders("*") .allowedOrigins("*") .allowedMethods("*"); } @Bean public LocaleResolver localeResolver() { SessionLocaleResolver slr = new SessionLocaleResolver(); slr.setDefaultLocale(Locale.CHINA); return slr; } } ================================================ FILE: src/main/java/com/example/sens/config/mybatisplus/MybatisPlusConfig.java ================================================ package com.example.sens.config.mybatisplus; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author 言曌 * @date 2018/12/22 下午1:49 */ @Configuration public class MybatisPlusConfig { /*** * plus 的性能优化 * @return */ @Bean public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); /**/ performanceInterceptor.setMaxTime(1000); /**/ performanceInterceptor.setFormat(false); return performanceInterceptor; } /** * mybatis-plus分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ================================================ FILE: src/main/java/com/example/sens/config/properties/IgnoredUrlsProperties.java ================================================ package com.example.sens.config.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * @author example */ @Data @Configuration @ConfigurationProperties(prefix = "ignored") public class IgnoredUrlsProperties { private List urls = new ArrayList<>(); } ================================================ FILE: src/main/java/com/example/sens/config/schedule/SystemSchedule.java ================================================ package com.example.sens.config.schedule; import com.example.sens.entity.Order; import com.example.sens.entity.Post; import com.example.sens.entity.User; import com.example.sens.enums.OrderStatusEnum; import com.example.sens.enums.PostStatusEnum; import com.example.sens.mapper.OrderMapper; import com.example.sens.mapper.PostMapper; import com.example.sens.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 定时器 * * @author 言曌 * @date 2020/3/21 7:18 下午 */ @Component public class SystemSchedule { @Autowired private PostMapper postMapper; @Autowired private OrderMapper orderMapper; @Autowired private UserMapper userMapper; /** * 更新到期的订单 */ @Scheduled(fixedRate = 10000) @Transactional(rollbackFor = Exception.class) public void updatePostStatus() { List orderList = orderMapper.findOverDueOrder(); for (Order order : orderList) { // 更新房屋状态 Post post = postMapper.selectById(order.getPostId()); if (post == null) { return; } // 退还押金 User user = userMapper.selectById(order.getUserId()); if (user == null) { return; } User ownerUser = userMapper.selectById(post.getId()); if (ownerUser == null) { return; } if (ownerUser.getMoney() < post.getDeposit()) { // 业主余额不足,无法退回押金 // 结束订单 order.setStatus(OrderStatusEnum.DEPOSIT_RETURN_FAIL.getCode()); orderMapper.updateById(order); return; } // 以下代码暂不考虑并发问题,暂不用乐观锁实现 // 业主余额减少 ownerUser.setMoney(ownerUser.getMoney() - post.getDeposit()); userMapper.updateById(ownerUser); // 租客余额增加 user.setMoney(user.getMoney() + post.getDeposit()); userMapper.updateById(user); // 结束订单 order.setStatus(OrderStatusEnum.FINISHED.getCode()); orderMapper.updateById(order); post.setPostStatus(PostStatusEnum.ON_SALE.getCode()); postMapper.updateById(post); } } } ================================================ FILE: src/main/java/com/example/sens/config/shiro/MyRealm.java ================================================ package com.example.sens.config.shiro; import com.example.sens.common.constant.CommonConstant; import com.example.sens.entity.Permission; import com.example.sens.entity.Role; import com.example.sens.service.PermissionService; import com.example.sens.service.RoleService; import com.example.sens.service.UserService; import com.example.sens.entity.User; import com.example.sens.enums.UserStatusEnum; import com.example.sens.util.RegexUtil; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @Slf4j public class MyRealm extends AuthorizingRealm { @Autowired @Lazy private UserService userService; @Autowired @Lazy private RoleService roleService; @Autowired @Lazy private PermissionService permissionService; /** * 认证信息(身份验证) Authentication 是用来验证用户身份 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { log.info("认证-->MyShiroRealm.doGetAuthenticationInfo()"); //1.验证账号 User user; String account = (String) token.getPrincipal(); if (RegexUtil.isIdCard(account)) { user = userService.findByIdCard(account); } else { user = userService.findByUserName(account); } if (user == null) { //用户不存在 log.info("用户不存在! 登录名:{}, 密码:{}", account, token.getCredentials()); return null; } Role role = roleService.findByUserId(user.getId()); if (role != null) { user.setRole(role); } //2.判断账号是否被封号 if (!Objects.equals(user.getStatus(), UserStatusEnum.NORMAL.getCode())) { throw new LockedAccountException("账号被封禁"); } //3.封装authenticationInfo,准备验证密码 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user, // 账号 user.getUserPass(), // 密码 ByteSource.Util.bytes(CommonConstant.PASSWORD_SALT), // 盐 getName() // realm name ); System.out.println("realName:" + getName()); return authenticationInfo; } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); User user = (User) principals.getPrimaryPrincipal(); Role role = roleService.findByUserId(user.getId()); authorizationInfo.addRole(role.getRole()); List permissions = permissionService.listPermissionsByRoleId(role.getId()); //把权限的URL全部放到authorizationInfo中去 Set urls = permissions.stream().map(p -> p.getUrl()).collect(Collectors.toSet()); authorizationInfo.addStringPermissions(urls); return authorizationInfo; } } ================================================ FILE: src/main/java/com/example/sens/config/shiro/ShiroConfig.java ================================================ package com.example.sens.config.shiro; import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; import com.example.sens.config.properties.IgnoredUrlsProperties; import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Configuration public class ShiroConfig { @Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); } @Bean IgnoredUrlsProperties getIgnoredUrlsProperties() { return new IgnoredUrlsProperties(); } @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //自定义拦截器 Map filtersMap = new LinkedHashMap(); //访问权限配置 filtersMap.put("requestURL", getURLPathMatchingFilter()); shiroFilterFactoryBean.setFilters(filtersMap); //拦截器. Map filterChainDefinitionMap = new LinkedHashMap(); // 配置不会被拦截的链接 顺序判断 List urls = getIgnoredUrlsProperties().getUrls(); for (String url : urls) { filterChainDefinitionMap.put(url, "anon"); } filterChainDefinitionMap.put("/admin", "authc"); filterChainDefinitionMap.put("/admin/**", "requestURL"); filterChainDefinitionMap.put("/**", "anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); // 如果不设置默认会自动寻找Web工程根目录下的"/login"页面 shiroFilterFactoryBean.setLoginUrl("/"); // 登录成功后要跳转的链接 shiroFilterFactoryBean.setSuccessUrl("/"); //未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); return shiroFilterFactoryBean; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myRealm()); return securityManager; } @Bean public MyRealm myRealm() { MyRealm normalRealm = new MyRealm(); normalRealm.setCredentialsMatcher(hashedCredentialsMatcher()); return normalRealm; } /** * 访问 权限 拦截器 * * @return */ public URLPathMatchingFilter getURLPathMatchingFilter() { return new URLPathMatchingFilter(); } /** * MD5加盐加密十次 * * @return */ @Bean public HashedCredentialsMatcher hashedCredentialsMatcher() { HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); //散列算法:这里使用MD5算法; hashedCredentialsMatcher.setHashAlgorithmName("md5"); //散列的次数,md5("") hashedCredentialsMatcher.setHashIterations(10); return hashedCredentialsMatcher; } @Bean public AllowAllCredentialsMatcher allowAllCredentialsMatcher() { return new AllowAllCredentialsMatcher(); } ================================================ FILE: src/main/java/com/example/sens/config/shiro/URLPathMatchingFilter.java ================================================ package com.example.sens.config.shiro; import com.alibaba.fastjson.JSONObject; import com.example.sens.service.PermissionService; import com.example.sens.util.SpringUtil; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.PathMatchingFilter; import org.apache.shiro.web.util.WebUtils; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * URL拦截器 */ public class URLPathMatchingFilter extends PathMatchingFilter { PermissionService permissionService = null; private PermissionService permissionService() { if (permissionService == null) { permissionService = (PermissionService) SpringUtil.getBean("permissionServiceImpl"); } return permissionService; } @Override protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { //请求的url String requestURL = getPathWithinApplication(request); System.out.println("请求的url :" + requestURL); Subject subject = SecurityUtils.getSubject(); if (!subject.isAuthenticated()) { // 如果没有登录, 进入登录流程 WebUtils.issueRedirect(request, response, "/login"); return false; } //从session里读取当前用户的权限URL列表 Set urls = (Set) subject.getSession().getAttribute("permissionUrls"); if (urls.contains(requestURL)) { return true; } //没有权限 if (isAjax((HttpServletRequest) request)) { response.setCharacterEncoding("utf-8"); response.setContentType("application/json; charset=utf-8"); PrintWriter writer = response.getWriter(); Map map = new HashMap<>(); map.put("code", 0); map.put("msg", "没有权限访问"); writer.write(JSONObject.toJSONString(map)); } else { WebUtils.issueRedirect(request, response, "/403"); } return false; } public static boolean isAjax(HttpServletRequest httpRequest) { return (httpRequest.getHeader("X-Requested-With") != null && "XMLHttpRequest" .equals(httpRequest.getHeader("X-Requested-With").toString())); } ================================================ FILE: src/main/java/com/example/sens/controller/admin/AdminController.java ================================================ package com.example.sens.controller.admin; import com.example.sens.entity.Permission; import com.example.sens.entity.Role; import com.example.sens.entity.User; import com.example.sens.service.PermissionService; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.service.RoleService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.*; /** *
 *     后台首页控制器
 * 
*/ @Slf4j @Controller @RequestMapping(value = "/admin") public class AdminController extends BaseController { @Autowired private PermissionService permissionService; @Autowired private RoleService roleService; /** * 请求后台页面 * * @param model model * @return 模板路径admin/admin_index */ @GetMapping public String index(Model model) { return "admin/admin_index"; } /** * 获得当前用户的菜单 * * @return */ @GetMapping(value = "/currentMenus") @ResponseBody public JsonResult getMenu() { Long userId = getLoginUserId(); List permissions = permissionService.findPermissionTreeByUserIdAndResourceType(userId, "menu"); return JsonResult.success("", permissions); } /** * 获得当前登录用户 */ @GetMapping(value = "/currentUser") @ResponseBody public JsonResult currentUser() { User user = getLoginUser(); if (user != null) { return JsonResult.success("", user); } return JsonResult.error("用户未登录"); } /** * 获得当前用户角色编码 */ @GetMapping(value = "/currentRole") @ResponseBody public JsonResult currentRole() { Role role = roleService.findByUserId(getLoginUserId()); if (role == null) { return JsonResult.error("用户未登录或无角色"); } return JsonResult.success("", role.getRole()); } @GetMapping("/pay") public String pay(@RequestParam("money") Integer money, Model model) { model.addAttribute("money", money); return "admin/alipay"; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/AttachmentController.java ================================================ package com.example.sens.controller.admin; import com.example.sens.controller.common.BaseController; import com.example.sens.util.FileUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.Map; /** *
 *     后台附件控制器
 * 
* * @author : saysky * @date : 2019/12/19 */ @Slf4j @Controller @RequestMapping(value = "/admin/file") public class AttachmentController extends BaseController { /** * 上传文件 * * @param file file * @return Map */ @PostMapping(value = "/upload", produces = {"application/json;charset=UTF-8"}) @ResponseBody public Map uploadFile(@RequestParam("file") MultipartFile file) { Map map = new HashMap<>(1); String path = FileUtil.upload(file); map.put("link", path); return map; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/CategoryController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.entity.Category; import com.example.sens.dto.JsonResult; import com.example.sens.service.CategoryService; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; /** *
 *     后台分类管理控制器
 * 
* */ @Slf4j @Controller @RequestMapping(value = "/admin/category") public class CategoryController extends BaseController { @Autowired private CategoryService categoryService; /** * 查询所有分类并渲染category页面 * * @return 模板路径admin/admin_category */ @GetMapping public String categories(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "cateSort") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page categoryPage = categoryService.findAll(page); model.addAttribute("categories", categoryPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); return "admin/admin_category"; } /** * 新增/修改分类目录 * * @param category category对象 * @return 重定向到/admin/category */ @PostMapping(value = "/save") @ResponseBody public JsonResult saveCategory(@ModelAttribute Category category) { categoryService.insertOrUpdate(category); return JsonResult.success("保存成功"); } /** * 删除分类 * * @param cateId 分类Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult checkDelete(@RequestParam("id") Long cateId) { //1.判断这个分类有房屋 Integer count = categoryService.countPostByCateId(cateId); if (count != 0) { return JsonResult.error("该分类已经有了房屋,无法删除"); } categoryService.delete(cateId); return JsonResult.success("删除成功"); } /** * 跳转到修改页面 * * @param cateId cateId * @param model model * @return 模板路径admin/admin_category */ @GetMapping(value = "/edit") public String toEditCategory(Model model, @RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "cateSort") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @RequestParam("id") Long cateId) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); //更新的分类 Category category = categoryService.get(cateId); if (category == null) { return this.renderNotFound(); } model.addAttribute("updateCategory", category); // 所有分类 Page categoryPage = categoryService.findAll(page); model.addAttribute("categories", categoryPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); return "admin/admin_category"; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/NoticeController.java ================================================ package com.example.sens.controller.admin; import cn.hutool.http.HtmlUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.entity.Notice; import com.example.sens.exception.MyBusinessException; import com.example.sens.service.NoticeService; import com.example.sens.util.PageUtil; import com.example.sens.vo.SearchVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; /** *
 *     后台公告管理控制器
 * 
* * @author : saysky * @date : 2020/12/6 */ @Slf4j @Controller @RequestMapping(value = "/admin/notice") public class NoticeController extends BaseController { @Autowired private NoticeService noticeService; /** * 处理后台获取公告列表的请求 * * @param model model * @return 模板路径admin/admin_notice */ @GetMapping public String notices(Model model, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @ModelAttribute SearchVo searchVo) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page noticePage = noticeService.findAll(page); List noticeList = noticePage.getRecords(); model.addAttribute("notices", noticeList); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("order", order); model.addAttribute("sort", sort); return "admin/admin_notice"; } /** * 处理跳转到新建公告页面 * * @return 模板路径admin/admin_editor */ @GetMapping(value = "/new") public String newNotice(Model model) { return "admin/admin_notice_new"; } /** * 添加/更新公告 * * @param notice Notice实体 */ @PostMapping(value = "/save") @ResponseBody public JsonResult pushNotice(@ModelAttribute Notice notice) { // 1、提取摘要 int postSummary = 100; //房屋摘要 String summaryText = HtmlUtil.cleanHtmlTag(notice.getContent()); if (summaryText.length() > postSummary) { String summary = summaryText.substring(0, postSummary); notice.setSummary(summary); } else { notice.setSummary(summaryText); } noticeService.insertOrUpdate(notice); return JsonResult.success("发布成功"); } /** * 处理删除公告的请求 * * @param noticeId 公告编号 * @return 重定向到/admin/notice */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult removeNotice(@RequestParam("id") Long noticeId) { noticeService.delete(noticeId); return JsonResult.success("删除成功"); } /** * 跳转到编辑公告页面 * * @param noticeId 公告编号 * @param model model * @return 模板路径admin/admin_editor */ @GetMapping(value = "/edit") public String editNotice(@RequestParam("id") Long noticeId, Model model) { Notice notice = noticeService.get(noticeId); if (notice == null) { throw new MyBusinessException("公告不存在"); } model.addAttribute("notice", notice); return "admin/admin_notice_edit"; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/OrderController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.entity.Order; import com.example.sens.enums.OrderStatusEnum; import com.example.sens.service.OrderService; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; /** *
 *     订单管理控制器
 * 
*/ @Slf4j @Controller @RequestMapping(value = "/admin/order") public class OrderController extends BaseController { @Autowired private OrderService orderService; /** * 查询所有订单并渲染order页面 * * @return 模板路径admin/admin_order */ @GetMapping public String orders(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "id") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page orderPage = null; Order orderCondition = new Order(); orderPage = orderService.findAll(orderCondition, page); model.addAttribute("orders", orderPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); return "admin/admin_order"; } /** * 我出租的房屋订单 * * @return 模板路径admin/admin_order */ @GetMapping("/lease") public String lease(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "id") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Order orderCondition = new Order(); orderCondition.setOwnerUserId(getLoginUserId()); Page orderPage = orderService.findAll(orderCondition, page); model.addAttribute("orders", orderPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("type", "lease"); return "admin/admin_order"; } /** * 我的租房订单 * * @return 模板路径admin/admin_order */ @GetMapping("/rent") public String rent(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "id") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Order orderCondition = new Order(); orderCondition.setUserId(getLoginUserId()); Page orderPage = orderService.findAll(orderCondition, page); model.addAttribute("orders", orderPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("type", "rent"); return "admin/admin_order"; } /** * 删除订单 * * @param id 订单Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult delete(@RequestParam("id") Long id) { Order order = orderService.get(id); if (order == null) { return JsonResult.error("订单不存在"); } if (OrderStatusEnum.HAS_PAY.getCode().equals(order.getStatus())) { return JsonResult.error("订单生效中,不能删除"); } orderService.delete(id); return JsonResult.success("删除成功"); } /** * 完结订单 * * @param id 订单Id * @return JsonResult */ @PostMapping(value = "/finish") @ResponseBody public JsonResult finish(@RequestParam("id") Long id) { Order order = orderService.get(id); if (order == null) { return JsonResult.error("订单不存在"); } order.setStatus(OrderStatusEnum.FINISHED.getCode()); orderService.update(order); return JsonResult.success("完结成功"); } /** * 关闭订单 * * @param id 订单Id * @return JsonResult */ @PostMapping(value = "/close") @ResponseBody @Transactional public JsonResult close(@RequestParam("id") Long id) { // 修改订单状态 Order order = orderService.get(id); if (order == null) { return JsonResult.error("订单不存在"); } order.setStatus(OrderStatusEnum.CLOSED.getCode()); orderService.update(order); return JsonResult.success("取消订单成功"); } /** * 财务页面 * * @param model * @return */ @GetMapping("/finance") public String finance(@RequestParam(value = "startDate", required = false) String startDate, @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "page", defaultValue = "0") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "id") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) throws ParseException { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Order condition = new Order(); Page orderPage = null; Order orderCondition = new Order(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); if (StringUtils.isNotEmpty(startDate)) { orderCondition.setStartDate(dateFormat.parse(startDate)); } if (StringUtils.isNotEmpty(endDate)) { orderCondition.setEndDate(dateFormat.parse(endDate)); } if (loginUserIsUser()) { // 用户 orderCondition.setUserId(getLoginUserId()); } orderPage = orderService.findAll(orderCondition, page); model.addAttribute("orders", orderPage.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); Integer totalPrice = orderService.getTotalPriceSum(condition); model.addAttribute("totalPrice", totalPrice == null ? 0 : totalPrice); model.addAttribute("startDate", startDate); model.addAttribute("endDate", endDate); return "admin/admin_finance"; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/PermissionController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.Permission; import com.example.sens.dto.JsonResult; import com.example.sens.enums.ResourceTypeEnum; import com.example.sens.service.PermissionService; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 后台权限管理控制器 */ @Slf4j @Controller @RequestMapping(value = "/admin/permission") public class PermissionController { @Autowired private PermissionService permissionService; /** * 查询所有权限并渲染permission页面 * * @return 模板路径admin/admin_permission */ @GetMapping public String permissions(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "id") String sort, @RequestParam(value = "order", defaultValue = "asc") String order, Model model) { //权限列表 Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page permissions = permissionService.findAll(page); model.addAttribute("permissionList", permissions.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); // 所有权限 model.addAttribute("permissions", getPermissionList()); return "admin/admin_permission"; } /** * 新增/修改权限 * * @param permission permission对象 * @return 重定向到/admin/permission */ @PostMapping(value = "/save") public String savePermission(@ModelAttribute Permission permission) { permissionService.insertOrUpdate(permission); return "redirect:/admin/permission"; } /** * 删除权限 * * @param permissionId 权限Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult checkDelete(@RequestParam("id") Long permissionId) { // // 请先删除子权限 Integer childCount = permissionService.countChildPermission(permissionId); if (childCount > 0) { return JsonResult.error("请先删除子节点"); } permissionService.delete(permissionId); return JsonResult.success(); } /** * 跳转到新增页面 * * @param model model * @return 模板路径admin/admin_permission */ @GetMapping(value = "/new") public String toAddPermission(Model model) { // 带有等级的权限列表 model.addAttribute("permissionList", permissionService.findPermissionListWithLevel()); // 权限列表 model.addAttribute("permissions", getPermissionList()); return "admin/admin_permission_new"; } /** * 跳转到修改页面 * * @param permissionId permissionId * @param model model * @return 模板路径admin/admin_permission */ @GetMapping(value = "/edit") public String toEditPermission(Model model, @RequestParam("id") Long permissionId) { //更新的权限 Permission permission = permissionService.get(permissionId); model.addAttribute("updatePermission", permission); // 带有等级的权限列表 model.addAttribute("permissionList", permissionService.findPermissionListWithLevel()); // 权限列表 model.addAttribute("permissions", getPermissionList()); // 设置URL为编辑的URL return "admin/admin_permission_edit"; } /** * 所有权限 * @return */ public List getPermissionList() { //权限列表 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.orderByAsc("sort"); List permissions = permissionService.findAll(queryWrapper); // 设置URL为编辑的URL for (Permission permission : permissions) { permission.setUrl("/admin/permission/edit?id=" + permission.getId()); if (ResourceTypeEnum.MENU.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.MENU.getDescription() + "]"); } else if (ResourceTypeEnum.BUTTON.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.BUTTON.getDescription() + "]"); } else if (ResourceTypeEnum.PAGE.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.PAGE.getDescription() + "]"); } } return permissions; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/PostController.java ================================================ package com.example.sens.controller.admin; import cn.hutool.http.HtmlUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.exception.MyBusinessException; import com.example.sens.entity.*; import com.example.sens.enums.*; import com.example.sens.service.*; import com.example.sens.util.PageUtil; import com.example.sens.util.RegexUtil; import com.example.sens.util.SensUtils; import com.example.sens.vo.SearchVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; /** *
 *     后台房屋管理控制器
 * 
* * @author : saysky * @date : 2019/12/10 */ @Slf4j @Controller @RequestMapping(value = "/admin/post") public class PostController extends BaseController { @Autowired private PostService postService; @Autowired private CityService cityService; @Autowired private CategoryService categoryService; @Autowired private OrderService orderService; public static final String TITLE = "title"; public static final String CONTENT = "content"; /** * 处理后台获取房屋列表的请求 * * @param model model * @return 模板路径admin/admin_post */ @GetMapping public String posts(Model model, @RequestParam(value = "status", defaultValue = "-1") Integer status, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @ModelAttribute SearchVo searchVo) { Post condition = new Post(); condition.setPostStatus(status); Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Post postCondition = new Post(); Page postPage = postService.findPostByCondition(postCondition, page); List postList = postPage.getRecords(); //封装分类和标签 model.addAttribute("posts", postList); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("status", status); model.addAttribute("order", order); model.addAttribute("sort", sort); model.addAttribute("type", "all"); return "admin/admin_post"; } /** * 我的出租 * * @param model model * @return 模板路径admin/admin_post */ @GetMapping("/lease") public String lease(Model model, @RequestParam(value = "status", defaultValue = "-1") Integer status, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @ModelAttribute SearchVo searchVo) { Post condition = new Post(); condition.setPostStatus(status); condition.setUserId(getLoginUserId()); Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page postPage = postService.findPostByCondition(condition, page); List postList = postPage.getRecords(); //封装分类和标签 model.addAttribute("posts", postList); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("status", status); model.addAttribute("order", order); model.addAttribute("sort", sort); model.addAttribute("type", "lease"); return "admin/admin_post"; } /** * 我的租赁 * * @param model model * @return 模板路径admin/admin_post */ @GetMapping("/rent") public String rent(Model model, @RequestParam(value = "status", defaultValue = "-1") Integer status, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @ModelAttribute SearchVo searchVo) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page postPage = postService.findByRentUserId(getLoginUserId(), page); List postList = postPage.getRecords(); //封装分类和标签 model.addAttribute("posts", postList); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("status", status); model.addAttribute("order", order); model.addAttribute("sort", sort); model.addAttribute("type", "rent"); return "admin/admin_post"; } /** * 处理跳转到新建房屋页面 * * @return 模板路径admin/admin_editor */ @GetMapping(value = "/new") public String newPost(Model model) { //所有分类 List allCategories = categoryService.findAll(); model.addAttribute("categories", allCategories); //所有城市 List cities = cityService.findAll(); model.addAttribute("cities", cities); return "admin/admin_post_new"; } /** * 添加/更新房屋 * * @param post Post实体 */ @PostMapping(value = "/save") @ResponseBody public JsonResult pushPost(@ModelAttribute Post post) { if (post.getId() != null) { // 只允许更新部分字段 Post temp = new Post(); temp.setId(post.getId()); temp.setPostContent(post.getPostContent()); temp.setPostSummary(post.getPostSummary()); temp.setPostEditor(post.getPostEditor()); post = temp; } // 1、提取摘要 int postSummary = 100; //房屋摘要 String summaryText = HtmlUtil.cleanHtmlTag(post.getPostContent()); if (summaryText.length() > postSummary) { String summary = summaryText.substring(0, postSummary); post.setPostSummary(summary); } else { post.setPostSummary(summaryText); } // 2.处理imgUrl String postEditor = post.getPostEditor(); if (StringUtils.isNotEmpty(postEditor)) { List urlList = RegexUtil.getImgSrc(postEditor); String imgUrl = SensUtils.listToStr(urlList); post.setImgUrl(imgUrl); } // 2.添加/更新入库 if (post.getId() == null) { post.setUserId(getLoginUserId()); } postService.insertOrUpdate(post); return JsonResult.success("发布成功"); } /** * 处理房屋为发布的状态 * * @param postId 房屋编号 * @return 重定向到/admin/post */ @PostMapping(value = "/revert") @ResponseBody public JsonResult moveToPublish(@RequestParam("id") Long postId) { Post post = postService.get(postId); if (post == null) { throw new MyBusinessException("房屋不存在"); } post.setPostStatus(PostStatusEnum.ON_SALE.getCode()); postService.update(post); return JsonResult.success("操作成功"); } /** * 处理删除房屋的请求 * * @param postId 房屋编号 * @return 重定向到/admin/post */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult removePost(@RequestParam("id") Long postId) { Post post = postService.get(postId); if (post == null) { throw new MyBusinessException("房屋不存在"); } if (PostStatusEnum.OFF_SALE.getCode().equals(post.getPostStatus())) { throw new MyBusinessException("该房屋已出租,不能删除"); } // 判断是否有有效订单 // 如果有有效订单,不能删除 Order order = orderService.findByPostId(postId); if (order != null) { throw new MyBusinessException("该房屋已出租,不能删除"); } // 判断权限 if(!Objects.equals(post.getUserId(), getLoginUserId()) && !loginUserIsAdmin()) { throw new MyBusinessException("没有权限操作"); } postService.delete(postId); return JsonResult.success("删除成功"); } /** * 跳转到编辑房屋页面 * * @param postId 房屋编号 * @param model model * @return 模板路径admin/admin_editor */ @GetMapping(value = "/edit") public String editPost(@RequestParam("id") Long postId, Model model) { Post post = postService.get(postId); if (post == null) { throw new MyBusinessException("房屋不存在"); } //当前房屋分类 Category category = categoryService.get(post.getCateId()); post.setCategory(category); model.addAttribute("post", post); //所有分类 List allCategories = categoryService.findAll(); model.addAttribute("categories", allCategories); //所有城市 List cities = cityService.findAll(); model.addAttribute("cities", cities); return "admin/admin_post_edit"; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/ProfileController.java ================================================ package com.example.sens.controller.admin; import com.example.sens.common.constant.CommonConstant; import com.example.sens.controller.common.BaseController; import com.example.sens.entity.User; import com.example.sens.dto.JsonResult; import com.example.sens.service.UserService; import com.example.sens.util.Md5Util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.Objects; /** * 后台用户管理控制器 */ @Slf4j @Controller @RequestMapping(value = "/admin/user") public class ProfileController extends BaseController { @Autowired private UserService userService; /** * 获取用户信息并跳转 * * @return 模板路径admin/admin_profile */ @GetMapping("/profile") public String profile(Model model) { User user = userService.get(getLoginUserId()); model.addAttribute("user", user); return "admin/admin_profile"; } /** * 获取用户信息并跳转 * * @return 模板路径admin/admin_info */ @GetMapping("/info") public String info(@RequestParam("userId") Long userId, Model model) { //1.用户信息 User user = userService.get(userId); if(user == null) { return this.renderNotFound(); } model.addAttribute("user", user); return "admin/admin_user_info"; } /** * 处理修改用户资料的请求 * * @param user user * @return JsonResult */ @PostMapping(value = "/profile/save") @ResponseBody public JsonResult saveProfile(@ModelAttribute User user) { User loginUser = getLoginUser(); User saveUser = userService.get(loginUser.getId()); saveUser.setId(loginUser.getId()); saveUser.setUserName(user.getUserName()); saveUser.setUserDisplayName(user.getUserDisplayName()); saveUser.setUserAvatar(user.getUserAvatar()); saveUser.setUserDesc(user.getUserDesc()); saveUser.setIdCard(user.getIdCard()); saveUser.setEmail(user.getEmail()); saveUser.setPhone(user.getPhone()); userService.insertOrUpdate(saveUser); return JsonResult.success("资料修改成功,请重新登录"); } /** * 处理修改密码的请求 * * @param beforePass 旧密码 * @param newPass 新密码 * @return JsonResult */ @RequestMapping(method = RequestMethod.POST, value = "/changePass") @ResponseBody public JsonResult changePass(@RequestParam(value = "id", required = false) Long id, @RequestParam(value = "beforePass", required = false) String beforePass, @RequestParam("newPass") String newPass) { User loginUser = getLoginUser(); if (id == null) { // 用户修改密码 User user = userService.get(loginUser.getId()); if (user != null && Objects.equals(user.getUserPass(), Md5Util.toMd5(beforePass, CommonConstant.PASSWORD_SALT, 10))) { userService.updatePassword(user.getId(), newPass); } else { return JsonResult.error("旧密码错误"); } } else { // 管理员修改用户密码 if (!loginUserIsAdmin()) { return JsonResult.error("无权操作"); } userService.updatePassword(id, newPass); } return JsonResult.success("密码重置成功"); } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/RechargeRecordController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.entity.RechargeRecord; import com.example.sens.entity.User; import com.example.sens.service.RechargeRecordService; import com.example.sens.service.UserService; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.Date; /** * @author 言曌 * @date 2020/3/17 11:39 下午 */ @Slf4j @Controller @RequestMapping(value = "/admin/rechargeRecord") public class RechargeRecordController extends BaseController { @Autowired private RechargeRecordService rechargeRecordService; @Autowired private UserService userService; /** * 查询所有充值记录并渲染rechargeRecord页面 * * @return 模板路径admin/admin_rechargeRecord */ @GetMapping public String rechargeRecords(@RequestParam(value = "startDate", defaultValue = "") String startDate, @RequestParam(value = "endDate", defaultValue = "") String endDate, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page rechargeRecords = null; if (loginUserIsAdmin()) { rechargeRecords = rechargeRecordService.findAll(startDate, endDate, page); } else { rechargeRecords = rechargeRecordService.findByUserId(startDate, endDate, getLoginUserId(), page); } model.addAttribute("rechargeRecords", rechargeRecords.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("startDate", startDate); model.addAttribute("endDate", endDate); return "admin/admin_rechargeRecord"; } /** * 删除充值记录 * * @param rechargeRecordId 充值记录Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult checkDelete(@RequestParam("id") Long rechargeRecordId) { rechargeRecordService.delete(rechargeRecordId); return JsonResult.success("删除充值记录成功"); } /** * 充值界面 * * @return JsonResult */ @GetMapping(value = "/new") public String rechargePage(Model model) { User user = userService.get(getLoginUserId()); model.addAttribute("currentMoney", user.getMoney()); return "admin/admin_rechargeRecord_new"; } /** * 充值保存 * * @param money * @return */ @PostMapping(value = "/save") @ResponseBody public JsonResult recharge(@RequestParam("money") Long money) { if (money > 10000 || money < 10) { return JsonResult.error("充值金额不合法(最少10元,最多1万元)"); } // 充值操作 // 忽略,假设直接充值成功 // 修改余额 User loginUser = getLoginUser(); User user = userService.get(loginUser.getId()); user.setMoney(user.getMoney() + money); userService.insertOrUpdate(user); // 添加充值记录 RechargeRecord rechargeRecord = new RechargeRecord(); rechargeRecord.setUserId(loginUser.getId()); rechargeRecord.setMoney(money); rechargeRecord.setCreateTime(new Date()); rechargeRecordService.insert(rechargeRecord); return JsonResult.success("充值成功", user.getMoney()); } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/RoleController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.Permission; import com.example.sens.entity.Role; import com.example.sens.dto.JsonResult; import com.example.sens.enums.ResourceTypeEnum; import com.example.sens.service.PermissionService; import com.example.sens.service.RoleService; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 后台角色管理控制器 */ @Slf4j @Controller @RequestMapping(value = "/admin/role") public class RoleController { @Autowired private RoleService roleService; @Autowired private PermissionService permissionService; /** * 查询所有角色并渲染role页面 * * @return 模板路径admin/admin_role */ @GetMapping public String roles(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "level") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { //角色列表 Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page roles = roleService.findAll(page); model.addAttribute("roles", roles.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); return "admin/admin_role"; } /** * 新增/修改角色 * * @param role role对象 * @return 重定向到/admin/role */ @PostMapping(value = "/save") @ResponseBody public JsonResult saveRole(@ModelAttribute Role role, @RequestParam(value = "permissionIds") String permissionIds) { if (Strings.isNotEmpty(permissionIds)) { String[] arr = permissionIds.split(","); List permissions = new ArrayList<>(); for (String permissionId : arr) { Permission permission = new Permission(); permission.setId(Long.valueOf(permissionId)); permissions.add(permission); } role.setPermissions(permissions); } roleService.insertOrUpdate(role); return JsonResult.success(); } /** * 删除角色 * * @param roleId 角色Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult checkDelete(@RequestParam("id") Long roleId) { //判断这个角色有没有用户 Integer userCount = roleService.countUserByRoleId(roleId); if (userCount != 0) { return JsonResult.error("当前角色已关联用户,无法删除"); } roleService.delete(roleId); return JsonResult.success("删除角色成功"); } /** * 添加用户页面 * * @return 模板路径admin/admin_edit */ @GetMapping("/new") public String addRole(Model model) { // 所有权限 model.addAttribute("permissions", getPermissionList()); return "admin/admin_role_add"; } /** * 跳转到修改页面 * * @param roleId roleId * @param model model * @return 模板路径admin/admin_role */ @GetMapping(value = "/edit") public String toEditRole(Model model, @RequestParam("id") Long roleId) { //更新的角色 Role role = roleService.findByRoleId(roleId); //当前角色的权限列表 role.setPermissions(permissionService.listPermissionsByRoleId(roleId)); model.addAttribute("updateRole", role); // 所有权限 model.addAttribute("permissions", getPermissionList()); // 当前角色的权限列表 List currentPermissionIds = permissionService.findPermissionByRoleId(roleId).stream().map(p -> p.getId()).collect(Collectors.toList()); model.addAttribute("currentPermissionIds", currentPermissionIds); return "admin/admin_role_edit"; } /** * 所有权限 * @return */ public List getPermissionList() { //权限列表 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.orderByAsc("sort"); List permissions = permissionService.findAll(queryWrapper); // 设置URL为编辑的URL for (Permission permission : permissions) { permission.setUrl("/admin/permission/edit?id=" + permission.getId()); if (ResourceTypeEnum.MENU.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.MENU.getDescription() + "]"); } else if (ResourceTypeEnum.BUTTON.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.BUTTON.getDescription() + "]"); } else if (ResourceTypeEnum.PAGE.getCode().equals(permission.getResourceType())) { permission.setName(permission.getName() + "[" + ResourceTypeEnum.PAGE.getDescription() + "]"); } } return permissions; } } ================================================ FILE: src/main/java/com/example/sens/controller/admin/UserController.java ================================================ package com.example.sens.controller.admin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.constant.CommonConstant; import com.example.sens.entity.*; import com.example.sens.enums.RoleEnum; import com.example.sens.service.*; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.util.Md5Util; import com.example.sens.util.PageUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 后台用户管理控制器 */ @Slf4j @Controller @RequestMapping(value = "/admin/user") public class UserController extends BaseController { @Autowired private UserService userService; @Autowired private RoleService roleService; @Autowired private UserRoleRefService userRoleRefService; public static final String USER_NAME = "userName"; public static final String USER_DISPLAY_NAME = "userDisplayName"; public static final String EMAIL = "email"; /** * 查询所有分类并渲染user页面 * * @return 模板路径admin/admin_user */ @GetMapping public String users( @RequestParam(value = "status", defaultValue = "0") Integer status, @RequestParam(value = "keywords", defaultValue = "") String keywords, @RequestParam(value = "searchType", defaultValue = "") String searchType, @RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { //用户列表 Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); User condition = new User(); condition.setStatus(status); if (!StringUtils.isBlank(keywords)) { if (USER_NAME.equals(searchType)) { condition.setUserName(keywords); } else if (USER_DISPLAY_NAME.equals(searchType)) { condition.setUserDisplayName(keywords); } else if (EMAIL.equals(searchType)) { condition.setIdCard(keywords); } } Page users = userService.findByRoleAndCondition(CommonConstant.NONE, condition, page); for(User user : users.getRecords()) { user.setRole(roleService.findByUserId(user.getId())); } model.addAttribute("users", users.getRecords()); model.addAttribute("pageInfo", PageUtil.convertPageVo(page)); model.addAttribute("status", status); model.addAttribute("keywords", keywords); model.addAttribute("searchType", searchType); model.addAttribute("sort", sort); model.addAttribute("order", order); return "admin/admin_user"; } /** * 删除用户 * * @param userId 用户Id * @return JsonResult */ @DeleteMapping(value = "/delete") @ResponseBody public JsonResult removeUser(@RequestParam("id") Long userId) { userService.delete(userId); return JsonResult.success("删除成功"); } /** * 添加用户页面 * * @return 模板路径admin/admin_edit */ @GetMapping("/new") public String addUser(Model model) { //角色列表 List roles = roleService.findAll(); model.addAttribute("roles", roles); return "admin/admin_user_add"; } /** * 编辑用户页面 * * @return 模板路径admin/admin_edit */ @GetMapping("/edit") public String edit(@RequestParam("id") Long userId, Model model) { User user = userService.get(userId); if (user != null) { model.addAttribute("user", user); //该用户的角色 Role currentRole = roleService.findByUserId(userId); model.addAttribute("currentRole", currentRole); //角色列表 List roles = roleService.findAll(); model.addAttribute("roles", roles); return "admin/admin_user_edit"; } return this.renderNotFound(); } /** * 批量删除 * * @param ids 用户ID列表 * @return */ @DeleteMapping(value = "/batchDelete") @ResponseBody public JsonResult batchDelete(@RequestParam("ids") List ids) { //批量操作 if (ids == null || ids.size() == 0 || ids.size() >= 100) { return JsonResult.error("参数不合法!"); } List userList = userService.findByBatchIds(ids); for (User user : userList) { userService.delete(user.getId()); } return JsonResult.success("删除成功"); } /** * 新增/修改用户 * * @param user user * @return 重定向到/admin/user */ @PostMapping(value = "/save") @ResponseBody @Transactional(rollbackFor = Exception.class) public JsonResult saveUser(@ModelAttribute User user, @RequestParam(value = "roleId", required = false) Long roleId) { // 1.添加用户 if(user.getId() == null) { user.setUserPass(Md5Util.toMd5(user.getUserPass(), CommonConstant.PASSWORD_SALT, 10)); } userService.insertOrUpdate(user); if(roleId != null) { // 2.先删除该用户的角色关联 userRoleRefService.deleteByUserId(user.getId()); // 3.添加角色关联 userRoleRefService.insert(new UserRoleRef(user.getId(), roleId)); } return JsonResult.success("保存成功"); } } ================================================ FILE: src/main/java/com/example/sens/controller/common/BaseController.java ================================================ package com.example.sens.controller.common; import com.example.sens.entity.User; import com.example.sens.enums.RoleEnum; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; /** * Controller抽象类 */ public abstract class BaseController { /** * 渲染404页面 * * @return redirect:/404 */ public String renderNotFound() { return "forward:/404"; } /** * 渲染404页面 * * @return redirect:/404 */ public String renderNotAllowAccess() { return "redirect:/403"; } /** * 当前登录用户 * * @return */ public User getLoginUser() { Subject subject = SecurityUtils.getSubject(); if (subject.isAuthenticated()) { return (User) subject.getPrincipal(); } return null; } /** * 当前用户ID * * @return */ public Long getLoginUserId() { return getLoginUser().getId(); } /** * 当前用户是管理员 * * @return */ public Boolean loginUserIsAdmin() { User loginUser = getLoginUser(); if (loginUser != null) { return RoleEnum.ADMIN.getValue().equalsIgnoreCase(loginUser.getRole().getRole()); } return false; } /** * 当前用户是消费者 * * @return */ public Boolean loginUserIsUser() { User loginUser = getLoginUser(); if (loginUser != null) { return RoleEnum.USER.getValue().equalsIgnoreCase(loginUser.getRole().getRole()); } return false; } } ================================================ FILE: src/main/java/com/example/sens/controller/common/CommonController.java ================================================ package com.example.sens.controller.common; import com.example.sens.enums.CommonParamsEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletRequest; /** * 错误页面控制器 */ @Slf4j @Controller public class CommonController implements ErrorController { /** * 渲染404,500 * * @param request request * @return String */ @GetMapping(value = "/error") public String handleError(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode.equals(CommonParamsEnum.NOT_FOUND.getValue())) { return "redirect:/404"; } else { return "redirect:/500"; } } /** * 渲染403页面 * * @return String */ @GetMapping(value = "/403") public String fourZeroThree() { return "common/error/403"; } /** * 渲染404页面 * * @return String */ @GetMapping(value = "/404") public String fourZeroFour() { return "common/error/404"; } /** * 渲染500页面 * * @return String */ @GetMapping(value = "/500") public String fiveZeroZero() { return "common/error/500"; } /** * Returns the path of the error page. * * @return the error path */ @Override public String getErrorPath() { return "/error"; } } ================================================ FILE: src/main/java/com/example/sens/controller/home/FrontPostController.java ================================================ package com.example.sens.controller.home; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.dto.JsonResult; import com.example.sens.entity.*; import com.example.sens.enums.OrderStatusEnum; import com.example.sens.enums.PostStatusEnum; import com.example.sens.service.*; import com.example.sens.util.DateUtil; import com.example.sens.util.FileUtil; import com.example.sens.util.PageUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @author 言曌 * @date 2020/3/11 4:59 下午 */ @Controller public class FrontPostController extends BaseController { @Autowired private CategoryService categoryService; @Autowired private PostService postService; @Autowired private CityService cityService; @Autowired private OrderService orderService; @Autowired private UserService userService; /** * 房屋列表 * * @param model * @return */ @GetMapping("/post") public String postList(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "6") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, @RequestParam(value = "postTitle", defaultValue = "") String postTitle, @RequestParam(value = "cityId", defaultValue = "-1") Long cityId, @RequestParam(value = "cateId", defaultValue = "-1") Long cateId, @RequestParam(value = "area", defaultValue = "") String area, @RequestParam(value = "price", defaultValue = "") String price, @RequestParam(value = "status", defaultValue = "-1") Integer status, HttpSession session, Model model) { Post condition = new Post(); List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); model.addAttribute("postCount", postService.count(null)); try { if (StringUtils.isNotEmpty(price)) { String[] priceArr = price.split("-"); if (priceArr.length == 2) { condition.setMinPrice(Integer.valueOf(priceArr[0])); condition.setMaxPrice(Integer.valueOf(priceArr[1])); } } if (StringUtils.isNotEmpty(area)) { String[] areaArr = price.split("-"); if (areaArr.length == 2) { condition.setMinArea(Integer.valueOf(areaArr[0])); condition.setMaxArea(Integer.valueOf(areaArr[1])); } } } catch (Exception e) { e.printStackTrace(); } // 查询日期列表 Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); condition.setPostTitle(postTitle); condition.setPostStatus(status); condition.setCateId(cateId); condition.setCityId(cityId); Page postPage = postService.findPostByCondition(condition, page); model.addAttribute("page", postPage); model.addAttribute("postTitle", postTitle); model.addAttribute("cityId", cityId); model.addAttribute("cateId", cateId); model.addAttribute("status", status); model.addAttribute("area", area); model.addAttribute("price", price); // 侧边栏 model.addAttribute("onCount", postService.countByStatus(PostStatusEnum.ON_SALE.getCode())); model.addAttribute("offCount", postService.countByStatus(PostStatusEnum.OFF_SALE.getCode())); if (cityId != null && cityId != -1) { City city = cityService.get(cityId); if (city != null) { session.setAttribute("city", city); } } else { session.removeAttribute("city"); } return "home/postList"; } /** * 房屋详情 * * @param id * @param model * @return */ @GetMapping("/post/{id}") public String postDetails(@PathVariable("id") Long id, @RequestParam(value = "startDate", required = false) String start, @RequestParam(value = "quantity", defaultValue = "1") Integer quantity, HttpSession session, Model model) { // 房屋 Post post = postService.get(id); if (post == null) { return renderNotFound(); } // 分类和城市 Category category = categoryService.get(post.getCateId()); City city = cityService.get(post.getCityId()); User user = userService.get(post.getUserId()); post.setCategory(category); post.setCity(city); post.setUser(user); model.addAttribute("post", post); boolean allowEdit = getLoginUser() != null && (loginUserIsAdmin() || Objects.equals(post.getUserId(), getLoginUserId())); model.addAttribute("allowEdit", allowEdit); String[] imgUrlList = post.getImgUrl().split(","); model.addAttribute("imgUrlList", imgUrlList); List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); City citySession = (City) session.getAttribute("city"); Long cityId = citySession == null ? null : citySession.getId(); List latestPostList = postService.getLatestPost(cityId, 6); model.addAttribute("latestPostList", latestPostList); // 可以考虑优化下,暂时没有时间优化 List unionRentPost = postService.getUnionRentPost(post); List orderList = new ArrayList<>(); for (Post temp : unionRentPost) { Order order = orderService.findByPostId(temp.getId()); if (order == null) { order = new Order(); } else { order.setUser(userService.get(order.getUserId())); } order.setPost(temp); orderList.add(order); } model.addAttribute("orderList", orderList); return "home/post"; } /** * 结算页面 * * @param postId * @param start * @param quantity * @param model * @return */ @GetMapping("/checkout") public String checkout(@RequestParam("postId") Long postId, @RequestParam(value = "startDate", required = false) String start, @RequestParam(value = "quantity", defaultValue = "1") Integer quantity, Model model) { DateFormat dateFormat = new SimpleDateFormat(DateUtil.FORMAT); if (quantity == null || quantity < 1) { quantity = 1; } Date today = new Date(); // 判断入住日期是否合法 if (StringUtils.isEmpty(start)) { start = dateFormat.format(today); } else { try { Date startDate = dateFormat.parse(start); if (startDate.before(today)) { start = dateFormat.format(today); } } catch (ParseException e) { start = dateFormat.format(today); e.printStackTrace(); } } Post post = postService.get(postId); if (post == null) { return this.renderNotFound(); } User user = getLoginUser(); if (user == null) { return "redirect:/"; } // 分类列表 List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); model.addAttribute("post", post); model.addAttribute("startDate", start); model.addAttribute("quantity", quantity); model.addAttribute("user", user); return "home/checkout"; } /** * 创建订单 * * @param postId * @param quantity * @return */ @PostMapping("/order") @Transactional @ResponseBody public JsonResult addOrder(@RequestParam(value = "postId") Long postId, @RequestParam(value = "quantity") Integer quantity) { User user = getLoginUser(); if (user == null) { return JsonResult.error("请先登录"); } if (quantity == null || quantity < 1 || quantity > 12) { return JsonResult.error("月数不合法"); } Post post = postService.get(postId); if (post == null) { return JsonResult.error("房屋不存在"); } if (Objects.equals(post.getUserId(), user.getId())) { return JsonResult.error("不能租赁自己的房子哦"); } if (!PostStatusEnum.ON_SALE.getCode().equals(post.getPostStatus())) { return JsonResult.error("房屋已租出,暂时无法预定"); } Date today = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(today); cal.add(Calendar.MONTH, quantity); // 添加订单 Order order = new Order(); order.setPostId(postId); order.setQuantity(quantity); order.setStartDate(today); order.setEndDate(cal.getTime()); order.setUserId(user.getId()); order.setOwnerUserId(post.getUserId()); order.setStatus(OrderStatusEnum.NOT_PAY.getCode()); order.setPrice(post.getPrice() * quantity + post.getDeposit()); order.setCreateTime(new Date()); order.setUpdateTime(new Date()); orderService.insert(order); return JsonResult.success("订单创建成功", order.getId()); } @GetMapping("/order/{id}") public String order(@PathVariable("id") Long id, Model model) { Order order = orderService.get(id); if (order == null) { return this.renderNotFound(); } User user = getLoginUser(); if (user == null) { return "redirect:/login"; } if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) { return this.renderNotAllowAccess(); } model.addAttribute("order", order); // 分类列表 List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); model.addAttribute("user", userService.get(order.getUserId())); return "home/order"; } /** * 电子合同 * * @param orderId * @return */ @GetMapping("/agreement") public String agreement(@RequestParam("orderId") Long orderId, Model model) { Order order = orderService.get(orderId); if (order == null) { return this.renderNotFound(); } Post post = postService.get(order.getPostId()); order.setPost(post); order.setUser(userService.get(order.getUserId())); order.setOwnerUser(userService.get(order.getOwnerUserId())); // User user = getLoginUser(); // if (user == null) { // return "redirect:/login"; // } // // if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) { // return this.renderNotAllowAccess(); // } model.addAttribute("order", order); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); return "home/agreement"; } /** * 下载合同 * * @param orderId * @param response */ @GetMapping("/agreement/download") public void agreementDownload(@RequestParam("orderId") Long orderId, HttpServletRequest request, HttpServletResponse response) { StringBuffer requestURL = request.getRequestURL(); String tempContextUrl = requestURL.delete(requestURL.length() - request.getRequestURI().length(), requestURL.length()).append("/").toString(); ServletOutputStream out = null; InputStream inputStream = null; try { Order order = orderService.get(orderId); User user = userService.get(order.getUserId()); User ownerUser = userService.get(order.getOwnerUserId()); String pdfName = ownerUser.getUserDisplayName() + "&" + user.getUserDisplayName() + "租房合同.html"; // 获取外部文件流 URL url = new URL(tempContextUrl + "agreement?orderId=" + orderId); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(3 * 1000); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); inputStream = conn.getInputStream(); int len = 0; // 输出 下载的响应头,如果下载的文件是中文名,文件名需要经过url编码 response.setContentType("text/html;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(pdfName, "UTF-8")); response.setHeader("Cache-Control", "no-cache"); out = response.getOutputStream(); byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) > 0) { out.write(buffer, 0, len); } out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (Exception e) { } } } } /** * 支付页面 * * @param orderId * @param model * @return */ @GetMapping("/pay") public String pay(@RequestParam("orderId") Long orderId, Model model) { Order order = orderService.get(orderId); if (order == null) { return this.renderNotFound(); } Post post = postService.get(order.getPostId()); order.setPost(post); User user = getLoginUser(); if (user == null) { return "redirect:/login"; } if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) { return this.renderNotAllowAccess(); } if (!Objects.equals(OrderStatusEnum.NOT_PAY.getCode(), order.getStatus())) { return this.renderNotAllowAccess(); } model.addAttribute("order", order); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); return "home/pay"; } /** * 支付 * * @return orderId */ @PostMapping("/pay") @Transactional @ResponseBody public JsonResult paySuccess(@RequestParam(value = "orderId") Long orderId) { User user = userService.get(getLoginUserId()); if (user == null) { return JsonResult.error("请先登录"); } Order order = orderService.get(orderId); if (order == null) { return JsonResult.error("订单不存在"); } if (user.getMoney() < order.getPrice()) { return JsonResult.error("余额不足,请充值"); } if (!Objects.equals(user.getId(), order.getUserId())) { return JsonResult.error("没有权限"); } Post post = postService.get(order.getPostId()); if (post == null || !Objects.equals(post.getPostStatus(), PostStatusEnum.ON_SALE.getCode())) { return JsonResult.error("房屋已租出,暂时无法预定"); } order.setStatus(OrderStatusEnum.HAS_PAY.getCode()); orderService.update(order); post.setPostStatus(PostStatusEnum.OFF_SALE.getCode()); postService.update(post); // 这里暂不用乐观锁实现,忽略并发问题 // 我的余额减少 user.setMoney(user.getMoney() - order.getPrice()); userService.update(user); // 对方的余额增加 User ownerUser = userService.get(order.getOwnerUserId()); ownerUser.setMoney(ownerUser.getMoney() + order.getPrice()); userService.update(ownerUser); return JsonResult.success("支付成功", order.getId()); } @GetMapping("/login") public String login() { return "home/login"; } @GetMapping("/register") public String register() { return "home/register"; } } ================================================ FILE: src/main/java/com/example/sens/controller/home/IndexController.java ================================================ package com.example.sens.controller.home; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.controller.common.BaseController; import com.example.sens.entity.*; import com.example.sens.enums.PostStatusEnum; import com.example.sens.service.*; import com.example.sens.util.PageUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpSession; import java.util.List; import java.util.Objects; /** * @author 言曌 * @date 2020/3/9 11:00 上午 */ @Controller public class IndexController extends BaseController { @Autowired private PostService postService; @Autowired private CategoryService categoryService; @Autowired private CityService cityService; @Autowired private NoticeService noticeService; @GetMapping("/") public String index(Model model, HttpSession session) { List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); City city = (City) session.getAttribute("city"); Long cityId = city == null ? null : city.getId(); List latestPostList = postService.getLatestPost(cityId, 6); model.addAttribute("latestPostList", latestPostList); return "home/index"; } @GetMapping("/contact") public String contact(Model model) { List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); return "home/contact"; } /** * 新闻列表 * * @param model * @return */ @GetMapping("/notice") public String noticeList(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber, @RequestParam(value = "size", defaultValue = "10") Integer pageSize, @RequestParam(value = "sort", defaultValue = "createTime") String sort, @RequestParam(value = "order", defaultValue = "desc") String order, Model model) { List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order); Page postPage = noticeService.findAll(page); model.addAttribute("page", postPage); model.addAttribute("noticeList", postPage.getRecords()); return "home/noticeList"; } /** * 新闻详情 * * @param id * @param model * @return */ @GetMapping("/notice/{id}") public String noticeDetails(@PathVariable("id") Long id, @RequestParam(value = "startDate", required = false) String start, @RequestParam(value = "quantity", defaultValue = "1") Integer quantity, Model model) { // 新闻 Notice notice = noticeService.get(id); if (notice == null) { return renderNotFound(); } model.addAttribute("notice", notice); List categoryList = categoryService.findAll(); model.addAttribute("categoryList", categoryList); List cityList = cityService.findAll(); model.addAttribute("cityList", cityList); return "home/notice"; } } ================================================ FILE: src/main/java/com/example/sens/controller/home/LoginController.java ================================================ package com.example.sens.controller.home; import com.example.sens.common.constant.CommonConstant; import com.example.sens.controller.common.BaseController; import com.example.sens.entity.Role; import com.example.sens.entity.User; import com.example.sens.entity.UserRoleRef; import com.example.sens.dto.JsonResult; import com.example.sens.enums.RoleEnum; import com.example.sens.enums.UserStatusEnum; import com.example.sens.service.*; import com.example.sens.util.Md5Util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.Set; @Controller @Slf4j public class LoginController extends BaseController { @Autowired private PermissionService permissionService; @Autowired private UserService userService; @Autowired private RoleService roleService; @Autowired private UserRoleRefService userRoleRefService; /** * 验证登录信息 * * @param userName 登录名:身份证号码/账号 * @param userPass password 密码 * @return JsonResult JsonResult */ @PostMapping(value = "/login") @ResponseBody public JsonResult getLogin(@RequestParam("userName") String userName, @RequestParam("userPass") String userPass) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(userName, userPass); try { subject.login(token); if (subject.isAuthenticated()) { //登录成功,修改登录错误次数为0 User user = (User) subject.getPrincipal(); Set permissionUrls = permissionService.findPermissionUrlsByUserId(user.getId()); subject.getSession().setAttribute("permissionUrls", permissionUrls); return JsonResult.success("登录成功"); } } catch (UnknownAccountException e) { return JsonResult.error("账号不存在"); } catch (IncorrectCredentialsException e) { e.printStackTrace(); return JsonResult.error("账号或密码错误"); } catch (LockedAccountException e) { return JsonResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); log.info(e.getMessage()); } return JsonResult.error("服务器内部错误"); } /** * 退出登录 * * @return 重定向到/login */ @GetMapping(value = "/logout") public String logOut() { Subject subject = SecurityUtils.getSubject(); subject.logout(); return "redirect:/"; } /** * 退出登录 * * @return 重定向到/login */ @PostMapping(value = "/logout") @ResponseBody public JsonResult ajaxLogOut() { Subject subject = SecurityUtils.getSubject(); subject.logout(); return JsonResult.success(); } /** * 验证注册信息 * * @param userName 账号 * @param idCard 身份证号码 * @return JsonResult JsonResult */ @PostMapping(value = "/register") @ResponseBody @Transactional public JsonResult getRegister(@RequestParam("userName") String userName, @RequestParam("userPass") String userPass, @RequestParam("idCard") String idCard, @RequestParam("userDisplayName") String userDisplayName) { // 1.校验是否输入完整 if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(userPass) || StringUtils.isEmpty(idCard)) { return JsonResult.error("请填写完整信息"); } // 2.密码长度是否合法 if (userPass.length() > 20 || userPass.length() < 6) { return JsonResult.error("用户密码长度为6-20位!"); } // 3.密码长度是否合法 Role role = roleService.findByRoleName(RoleEnum.USER.getValue()); //3.创建用户 User user = new User(); user.setUserName(userName); user.setUserDisplayName(userDisplayName); user.setIdCard(idCard); user.setUserPass(Md5Util.toMd5(userPass, CommonConstant.PASSWORD_SALT, 10)); user.setUserAvatar("/static/images/avatar/" + RandomUtils.nextInt(1, 41) + ".jpeg"); user.setStatus(UserStatusEnum.NORMAL.getCode()); userService.insert(user); //4.关联角色 userRoleRefService.insert(new UserRoleRef(user.getId(), role.getId())); return JsonResult.success("注册成功"); } /** * 检查用户是否登录 * * @return JsonResult */ @GetMapping(value = "/checkLogin") @ResponseBody public JsonResult checkLogin() { User user = getLoginUser(); if (user == null) { return JsonResult.error("请先登录"); } else { return JsonResult.success(); } } } ================================================ FILE: src/main/java/com/example/sens/dto/JsonResult.java ================================================ package com.example.sens.dto; import lombok.Data; /** *
 *     Json格式
 * 
* * @author : saysky * @date : 2018/5/24 */ @Data public class JsonResult { /** * 返回的状态码,0:失败,1:成功 */ private Integer code; /** * 返回信息 */ private String msg; /** * 返回的数据 */ private Object result; /** * 不返回数据的构造方法 * * @param code 状态码 * @param msg 信息 */ public JsonResult(Integer code, String msg) { this.code = code; this.msg = msg; } /** * 返回数据的构造方法 * * @param code 状态码 * @param msg 信息 * @param result 数据 */ public JsonResult(Integer code, String msg, Object result) { this.code = code; this.msg = msg; this.result = result; } /** * 返回状态码和数据 * * @param code 状态码 * @param result 数据 */ public JsonResult(Integer code, Object result) { this.code = code; this.result = result; } public static JsonResult error(String msg) { return new JsonResult(0, msg); } public static JsonResult error(String msg, Object data) { return new JsonResult(0, msg, data); } public static JsonResult success() { return new JsonResult(1, "操作成功"); } public static JsonResult success(String msg) { return new JsonResult(1, msg); } public static JsonResult success(String msg, Object result) { return new JsonResult(1, msg, result); } } ================================================ FILE: src/main/java/com/example/sens/dto/PostQueryCondition.java ================================================ package com.example.sens.dto; import lombok.Data; import java.util.List; /** * @author 言曌 * @date 2020/3/12 4:53 下午 */ @Data public class PostQueryCondition { /** * 用户ID */ private Long userId; /** * 分类ID */ private Long cateId; /** * 预订的日期集合 */ private List dateList; } ================================================ FILE: src/main/java/com/example/sens/dto/QueryCondition.java ================================================ package com.example.sens.dto; import com.example.sens.vo.SearchVo; import lombok.Data; import java.io.Serializable; /** * 查询封装类 * @author 言曌 * @date 2019-08-16 13:45 */ @Data public class QueryCondition implements Serializable { /** * 根据字段筛选 */ private T data; /** * 一般筛选 */ private SearchVo searchVo; public QueryCondition() { } public QueryCondition(T data) { this.data = data; } public QueryCondition(T data, SearchVo searchVo) { this.data = data; this.searchVo = searchVo; } } ================================================ FILE: src/main/java/com/example/sens/entity/Category.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** *
 *     房屋分类
 * 
* * @author : saysky * @date : 2019/11/30 */ @Data @TableName("category") public class Category extends BaseEntity { /** * 分类名称 */ private String cateName; /** * 分类排序号 */ private Integer cateSort; /** * 分类描述 */ private String cateDesc; /** * 房屋数量 */ @TableField(exist = false) private Integer count; } ================================================ FILE: src/main/java/com/example/sens/entity/City.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** *
 *     城市
 * 
* * @author : saysky * @date : 2019/11/30 */ @Data @TableName("city") public class City extends BaseEntity { /** * 分类名称 */ private String cityName; /** * 房屋数 */ @TableField(exist = false) private Integer count; } ================================================ FILE: src/main/java/com/example/sens/entity/Notice.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** *
 *     新闻公告
 * 
*/ @Data @TableName("notice") public class Notice extends BaseEntity { /** * 标题 */ private String title; /** * 内容 */ private String content; /** * 摘要 */ private String summary; } ================================================ FILE: src/main/java/com/example/sens/entity/Order.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; import java.util.Date; /** * 订单 * @author 言曌 * @date 2020/4/5 3:25 下午 */ @Data @TableName("t_order") public class Order extends BaseEntity { /** * 下单用户ID */ private Long userId; /** * 业主用户ID */ private Long ownerUserId; /** * 房间ID */ private Long postId; /** * 数量 */ private Integer quantity; /** * 开始日期 */ private Date startDate; /** * 结束日期 */ private Date endDate; /** * 订单状态:0待支付,1已支付生效中,2已完结 */ private Integer status; /** * 总价 */ private Long price; /** * 房屋 */ @TableField(exist = false) private Post post; /** * 下单用户 */ @TableField(exist = false) private User user; /** * 业主用户 */ @TableField(exist = false) private User ownerUser; } ================================================ FILE: src/main/java/com/example/sens/entity/Permission.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; import java.util.List; /** * * 权限,后台的菜单 * @author example */ @Data @TableName("permission") public class Permission extends BaseEntity { /** * 权限名称 */ private String name; /** * pid */ private Long pid; /** * 资源类型 */ private String resourceType; /** * 请求URL */ private String url; /** * 图标 */ private String icon; /** * 序号(越小越靠前) */ private Double sort; /** * 级别 */ @TableField(exist = false) private Integer level; /** * 子权限列表 */ @TableField(exist = false) private List childPermissions; ================================================ FILE: src/main/java/com/example/sens/entity/Post.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** * @author example */ @Data @TableName("post") public class Post extends BaseEntity { /** * 用户ID */ private Long userId; /** * 房屋标题 */ private String postTitle; /** * 房屋描述 */ private String postContent; /** * 房屋摘要 */ private String postSummary; /** * 缩略图 */ private String postThumbnail; /** * 0 正在出租 * 1 已经租出去 * 2 已删除 */ private Integer postStatus; /** * 月付价格 */ private Integer price; /** * 房间编号 */ private String number; /** * 分类ID */ private Long cateId; /** * 城市ID */ private Long cityId; /** * 图片URL */ private String imgUrl; /** * 富文本 */ private String postEditor; /** * 面积 */ private Double area; /** * 卧室数量 */ private Integer roomCount; /** * 洗手间数量 */ private Integer toiletCount; /** * 押金 */ private Long deposit; /** * 房屋所属分类 */ @TableField(exist = false) private Category category; /** * 房屋所属城市 */ @TableField(exist = false) private City city; /** * 房屋业主 */ @TableField(exist = false) private User user; /** * 用于搜索 */ @TableField(exist = false) private Integer minArea; /** * 用于搜索 */ @TableField(exist = false) private Integer maxArea; /** * 用于搜索 */ @TableField(exist = false) private Integer minPrice; /** * 用于搜索 */ @TableField(exist = false) private Integer maxPrice; ================================================ FILE: src/main/java/com/example/sens/entity/RechargeRecord.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** * @author 言曌 * @date 2020/3/22 3:15 下午 */ @TableName("recharge_record") @Data public class RechargeRecord extends BaseEntity { /** * 用户ID */ private Long userId; /** * 金额 */ private Long money; /** * 用户 */ @TableField(exist = false) private User user; } ================================================ FILE: src/main/java/com/example/sens/entity/Role.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; import java.util.List; /** * @author example */ @Data @TableName("role") public class Role extends BaseEntity { /** * 角色名称:admin,author,subscriber */ private String role; /** * 描述:管理员,作者,订阅者 */ private String description; /** * 级别 */ private Integer level; /** * 用户注册默认角色 */ private Integer isRegisterDefault; /** * 该角色对应的用户数量,非数据库字段 */ @TableField(exist = false) private Integer count; /** * 当前角色的权限列表 */ @TableField(exist = false) private List permissions; ================================================ FILE: src/main/java/com/example/sens/entity/RolePermissionRef.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; @Data @TableName("role_permission_ref") public class RolePermissionRef extends BaseEntity { /** * 角色Id */ private Long roleId; /** * 权限Id */ private Long permissionId; public RolePermissionRef() { } public RolePermissionRef(Long roleId, Long permissionId) { this.roleId = roleId; this.permissionId = permissionId; } ================================================ FILE: src/main/java/com/example/sens/entity/User.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.util.Date; /** * 用户信息 */ @Data @TableName("user") public class User extends BaseEntity { /** * 账号 */ private String userName; /** * 姓名称 */ private String userDisplayName; /** * 密码 */ @JsonIgnore private String userPass; /** * 身份证号码 */ private String idCard; /** * 头像 */ private String userAvatar; /** * 说明 */ private String userDesc; /** * 0 正常 * 1 禁用 * 2 已删除 */ private Integer status = 0; /** * 创建时间 */ private Date createTime; /** * 电子邮箱 */ private String email; /** * 手机号 */ private String phone; /** * 余额 */ private Long money; /** * 角色名称 */ @TableField(exist = false) private Role role; } ================================================ FILE: src/main/java/com/example/sens/entity/UserRoleRef.java ================================================ package com.example.sens.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.example.sens.common.base.BaseEntity; import lombok.Data; /** * 用户和角色关联 * @author example */ @Data @TableName("user_role_ref") public class UserRoleRef extends BaseEntity { /** * 用户Id */ private Long userId; /** * 角色Id */ private Long roleId; public UserRoleRef(Long userId, Long roleId) { this.userId = userId; this.roleId = roleId; } public UserRoleRef() { } ================================================ FILE: src/main/java/com/example/sens/enums/CommonParamsEnum.java ================================================ package com.example.sens.enums; /** * 常用数字 */ public enum CommonParamsEnum { /** * 数字10 */ TEN(10), /** * 数字5 */ FIVE(5), /** * 数字404 */ NOT_FOUND(404), /** * 数字1024 */ BYTE(1024); private Integer value; CommonParamsEnum(Integer value) { this.value = value; } public Integer getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/OrderStatusEnum.java ================================================ package com.example.sens.enums; /** *
 *     订单状态enum
 * 
*/ public enum OrderStatusEnum { /** * 待支付 */ NOT_PAY(0), /** * 已支付 */ HAS_PAY(1), /** * 已完结 */ FINISHED(2), /** * 已关闭,已取消 */ CLOSED(3), /** * 押金退回失败 */ DEPOSIT_RETURN_FAIL(4) ; private Integer code; OrderStatusEnum(Integer code) { this.code = code; } public Integer getCode() { return code; } } ================================================ FILE: src/main/java/com/example/sens/enums/PostIsRecommendEnum.java ================================================ package com.example.sens.enums; /** * 房屋推荐枚举 */ public enum PostIsRecommendEnum { /** * 真 */ TRUE(1), /** * 假 */ FALSE(0); private Integer value; PostIsRecommendEnum(Integer value) { this.value = value; } public Integer getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/PostIsStickyEnum.java ================================================ package com.example.sens.enums; /** * 房屋置顶枚举 */ public enum PostIsStickyEnum { /** * 真 */ TRUE(1), /** * 假 */ FALSE(0); private Integer value; PostIsStickyEnum(Integer value) { this.value = value; } public Integer getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/PostStatusEnum.java ================================================ package com.example.sens.enums; /** *
 *     房屋状态enum
 * 
* * @author : saysky * @date : 2018/7/1 */ public enum PostStatusEnum { /** * 正在出租 */ ON_SALE(0), /** * 已出租 */ OFF_SALE(1), /** * 已删除 */ RECYCLE(2); private Integer code; PostStatusEnum(Integer code) { this.code = code; } public Integer getCode() { return code; } } ================================================ FILE: src/main/java/com/example/sens/enums/PostTypeEnum.java ================================================ package com.example.sens.enums; /** *
 *     房屋类型enum
 * 
* * @author : saysky * @date : 2018/7/1 */ public enum PostTypeEnum { /** * 房屋 */ POST_TYPE_POST("post"), /** * 页面 */ POST_TYPE_PAGE("page"), /** * 公告 */ POST_TYPE_NOTICE("notice"); private String value; PostTypeEnum(String value) { this.value = value; } public String getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/ResourceTypeEnum.java ================================================ package com.example.sens.enums; /** * 资源类型 */ public enum ResourceTypeEnum { /** * 菜单 */ MENU("menu", "菜单"), /** * 接口 */ BUTTON("button", "接口"), /** * 菜单 */ PAGE("page", "页面"); private String code; private String description; ResourceTypeEnum(String code, String description) { this.code = code; this.description = description; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } ================================================ FILE: src/main/java/com/example/sens/enums/ResultCodeEnum.java ================================================ package com.example.sens.enums; /** * 返回结果enum */ public enum ResultCodeEnum { /** * 成功 */ SUCCESS(1), /** * 失败 */ FAIL(0); Integer code; ResultCodeEnum(Integer code) { this.code = code; } public Integer getCode() { return code; } } ================================================ FILE: src/main/java/com/example/sens/enums/RoleEnum.java ================================================ package com.example.sens.enums; /** *
 *     角色枚举
 * 
* */ public enum RoleEnum { /** * 管理员 */ ADMIN("admin"), /** * 用户 */ USER("user"); private String value; RoleEnum(String value) { this.value = value; } public String getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/TrueFalseEnum.java ================================================ package com.example.sens.enums; /** * true or false enum */ public enum TrueFalseEnum { /** * 真 */ TRUE("true"), /** * 假 */ FALSE("false"); private String value; TrueFalseEnum(String value) { this.value = value; } public String getValue() { return value; } } ================================================ FILE: src/main/java/com/example/sens/enums/UserStatusEnum.java ================================================ package com.example.sens.enums; /** * 用户状态enum */ public enum UserStatusEnum { /** * 正常 */ NORMAL(0), /** * 禁止登录 */ BAN(1); private Integer code; UserStatusEnum(Integer code) { this.code = code; } public Integer getCode() { return code; } } ================================================ FILE: src/main/java/com/example/sens/exception/GlobalExceptionHandler.java ================================================ package com.example.sens.exception; import com.example.sens.dto.JsonResult; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.UnauthorizedException; import org.springframework.http.HttpStatus; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.ui.Model; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.ValidationException; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 全局异常捕获 */ @ControllerAdvice @Slf4j public class GlobalExceptionHandler { //错误显示页面 public static final String viewName = "common/error/error"; /** * 是否是ajax请求 */ public static boolean isAjax(HttpServletRequest httpRequest) { return (httpRequest.getHeader("X-Requested-With") != null && "XMLHttpRequest" .equals(httpRequest.getHeader("X-Requested-With").toString())); } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MissingServletRequestParameterException.class) public String handleMissingServletRequestParameterException(MissingServletRequestParameterException e, Model model) { log.error("缺少请求参数", e); String message = "【缺少请求参数】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public String handleHttpMessageNotReadableException(HttpMessageNotReadableException e, Model model) { log.error("参数解析失败", e); String message = "【参数解析失败】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public String handleMethodArgumentNotValidException(MethodArgumentNotValidException e, Model model) { log.error("参数验证失败", e); BindingResult result = e.getBindingResult(); FieldError error = result.getFieldError(); String field = error.getField(); String code = error.getDefaultMessage(); String message = "【参数验证失败】" + String.format("%s:%s", field, code); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(BindException.class) public String handleBindException(BindException e, Model model) { log.error("参数绑定失败", e); BindingResult result = e.getBindingResult(); FieldError error = result.getFieldError(); String field = error.getField(); String code = error.getDefaultMessage(); String message = "【参数绑定失败】" + String.format("%s:%s", field, code); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ConstraintViolationException.class) public String handleServiceException(ConstraintViolationException e, Model model) { log.error("参数验证失败", e); Set> violations = e.getConstraintViolations(); ConstraintViolation violation = violations.iterator().next(); String message = "【参数验证失败】" + violation.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ValidationException.class) public String handleValidationException(ValidationException e, Model model) { log.error("参数验证失败", e); String message = "【参数验证失败】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 400); return viewName; } /** * 404 - Not Found */ @ResponseStatus(HttpStatus.NOT_FOUND) @ExceptionHandler(NoHandlerFoundException.class) public String noHandlerFoundException(NoHandlerFoundException e, Model model) { log.error("Not Found", e); String message = "【页面不存在】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 404); return viewName; } /** * 405 - Method Not Allowed */ @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public String handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, Model model) { log.error("不支持当前请求方法", e); String message = "【不支持当前请求方法】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 405); return viewName; } /** * 415 - Unsupported Media Type */ @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE) @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public String handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e, Model model) { log.error("不支持当前媒体类型", e); String message = "【不支持当前媒体类型】" + e.getMessage(); model.addAttribute("message", message); model.addAttribute("code", 415); return viewName; } /** * 统一异常处理 * * @param response * @param e * @return */ @ExceptionHandler(MyBusinessException.class) @ResponseBody public JsonResult processApiException(HttpServletResponse response, MyBusinessException e) { JsonResult result = new JsonResult(0, e.getMessage()); response.setStatus(200); response.setContentType("application/json;charset=UTF-8"); log.error("业务异常,提示前端操作不合法", e.getMessage(), e); return result; } /** * 获取其它异常。包括500 * * @param e * @return * @throws Exception */ @ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest request, HttpServletResponse response, Exception e, Model model) throws IOException { e.printStackTrace(); if (isAjax(request)) { ModelAndView mav = new ModelAndView(); MappingJackson2JsonView view = new MappingJackson2JsonView(); Map attributes = new HashMap(); if (e instanceof UnauthorizedException) { attributes.put("msg", "没有权限"); } else { attributes.put("msg", e.getMessage()); } attributes.put("code", "0"); view.setAttributesMap(attributes); mav.setView(view); return mav; } if (e instanceof UnauthorizedException) { //请登录 log.error("无权访问", e); return new ModelAndView("common/error/403"); } //其他异常 String message = e.getMessage(); model.addAttribute("code", 500); model.addAttribute("message", message); return new ModelAndView("common/error/500"); } } ================================================ FILE: src/main/java/com/example/sens/exception/MyBusinessException.java ================================================ package com.example.sens.exception; /** * @author 言曌 * @date 2019-08-09 16:47 */ public class MyBusinessException extends RuntimeException { private Integer code; private String message; public MyBusinessException() { super(); } public MyBusinessException(String message) { this.code = 500; this.message = message; } public MyBusinessException(Integer code, String message) { this.code = code; this.message = message; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } @Override public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } ================================================ FILE: src/main/java/com/example/sens/mapper/CategoryMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Category; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author liuyanzhao */ @Mapper public interface CategoryMapper extends BaseMapper { /** * 获得子分类Id列表 * * @param pathTrace /138/ 这种格式 * @return 子分类Id列表 */ List selectChildCateIds(@Param("pathTrace") String pathTrace); /** * 根据用户ID删除 * @param userId * @return */ Integer deleteByUserId(Long userId); /** * 获取所有分类 * @return */ List findAllWithCount(); } ================================================ FILE: src/main/java/com/example/sens/mapper/CityMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.City; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @author liuyanzhao */ @Mapper public interface CityMapper extends BaseMapper { /** * 获取所有城市 * @return */ List findAllWithCount(); } ================================================ FILE: src/main/java/com/example/sens/mapper/NoticeMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Notice; import org.apache.ibatis.annotations.Mapper; /** * @author liuyanzhao */ @Mapper public interface NoticeMapper extends BaseMapper { } ================================================ FILE: src/main/java/com/example/sens/mapper/OrderMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.Order; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author liuyanzhao */ @Mapper public interface OrderMapper extends BaseMapper { /** * 根据条件查询订单 * * @param condition * @return */ List findAll(@Param("condition") Order condition, Page page); /** * 根据条件查询总金额 * * @param condition * @return */ Integer getTotalPriceSum(@Param("condition") Order condition); /** * 更新超时订单状态为超时 * * @return */ Integer updateOverDueOrder(); /** * 根据房屋ID删除 * @param postId * @return */ Integer deleteByPostId(Long postId); /** * 获得到期的订单 * @return */ List findOverDueOrder(); /** * 查询有效订单 * @param postId * @return */ Order findByPostId(Long postId); } ================================================ FILE: src/main/java/com/example/sens/mapper/PermissionMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Permission; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author example */ @Mapper public interface PermissionMapper extends BaseMapper { /** * 根据角色Id获得权限列表 * * @param roleId 角色Id * @return 权限列表 */ List findByRoleId(Long roleId); /** * 获得某个用户的权限列表 * * @param userId * @return */ List findPermissionByUserId(Long userId); /** * 获得某个用户的权限列表 * * @param userId * @param resourceType * @return */ List findPermissionByUserIdAndResourceType(@Param("userId") Long userId, @Param("resourceType") String resourceType); /** * 获得权限列表 * * @param resourceType * @return */ List findPermissionByResourceType(Integer resourceType); /** * 根据角色ID获得权限列表 * @param roleId * @return */ List findPermissionByRoleId(Long roleId); /** * 统计子节点数量 * @param id * @return */ Integer countChildPermission(Long id); /** * 根据URL获得权限 * @param url * @return */ Permission findByUrl(String url); } ================================================ FILE: src/main/java/com/example/sens/mapper/PostMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.constant.CommonConstant; import com.example.sens.entity.Post; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author liuyanzhao */ @Mapper public interface PostMapper extends BaseMapper { /** * 根据条件查询房屋 * * @param condition * @param page * @return */ List findPostByCondition(@Param(CommonConstant.CONDITION) Post condition, Page page); /** * 根据租客用户ID查询 * * @param userId * @param page * @return */ List findByRentUserId(@Param("userId") Long userId, Page page); /** * 统计该分类的房屋 * * @param cateId * @return */ Integer countPostByCateId(Long cateId); /** * 获得最新房屋 * * @param cityId * @param limit * @return */ List getLatestPost(@Param("cityId") Long cityId, @Param("limit") Integer limit); /** * 根据状态统计 * * @param postStatus 状态 * @return */ Integer countByStatus(Integer postStatus); /** * 获得合租房屋 * * @return */ List getUnionRentPost(Post post); } ================================================ FILE: src/main/java/com/example/sens/mapper/RechargeRecordMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.RechargeRecord; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author example */ @Mapper public interface RechargeRecordMapper extends BaseMapper { /** * 删除用户和预定关联 * * @param userId 用户ID * @return 影响行数 */ Integer deleteByUserId(Long userId); /** * 查询所有充值记录 * * @return */ List findAll(@Param("startDate") String startDate, @Param("endDate") String endDate, Page page); /** * 获得该用户的充值记录 * * @return */ List findByUserId(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("userId") Long userId, Page page); /** * 根据时间范围查询总金额 * * @param startDate * @param endDate * @return */ Integer getTotalMoneySum(@Param("startDate") String startDate, @Param("endDate") String endDate); } ================================================ FILE: src/main/java/com/example/sens/mapper/RoleMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Role; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @author example */ @Mapper public interface RoleMapper extends BaseMapper { /** * 根据用户Id获得角色 * * @param userId 用户Id * @return 角色列表 */ Role findByUserId(Long userId); /** * 删除用户和角色管理 * * @param userId 用户ID * @return 影响行数 */ Integer deleteByUserId(Long userId); /** * 统计某个角色的用户数 * * @param roleId 角色Id * @return 用户数 */ Integer countUserByRoleId(Long roleId); /** * 获得所有角色和对应用户数量 * @return */ List findAllWithCount(); /** * 查询小于等于该等级的角色 * @param level * @return */ List findByLessThanLevel(Integer level); /** * 查询某个用户最大的角色等级 * @param userId * @return */ Integer findMaxLevelByUserId(Long userId); /** * 获得用户注册默认角色 * @return */ Role findDefaultRole(); } ================================================ FILE: src/main/java/com/example/sens/mapper/RolePermissionRefMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.RolePermissionRef; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * @author example */ @Mapper public interface RolePermissionRefMapper extends BaseMapper { /** * 根据角色Id删除 * * @param roleId 角色Id * @return 影响行数 */ Integer deleteByRoleId(Long roleId); /** * 根据权限Id删除 * * @param permissionId 权限Id * @return 影响行数 */ Integer deleteByPermissionId(Long permissionId); /** * 批量添加 * * @param rolePermissionRefList 列表 * @return 影响喊你高数 */ Integer batchInsert(List rolePermissionRefList); } ================================================ FILE: src/main/java/com/example/sens/mapper/UserMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author example */ @Mapper public interface UserMapper extends BaseMapper { /** * 根据角色Id获得用户 * * @param roleId 角色Id * @param page 分页信息 * @return 用户列表 */ List findByRoleId(@Param("roleId") Long roleId, Page page); /** * 根据角色Id和条件获得用户 * * @param roleId 角色Id * @param user 条件 * @param page 分页信息 * @return 用户列表 */ List findByRoleIdAndCondition(@Param("roleId") Long roleId, @Param("user") User user, Page page); /** * 根据条件查询 * * @param user 用户 * @param page 分页 * @return 用户列表 */ List findByCondition( @Param("user") User user, Page page); /** * 获得今日新增数量 * @return */ Integer getTodayCount(); /** * 获得用户房屋数排名 * @param limit 查询数量 * @return */ List getUserPostRanking(Integer limit); /** * 获得最新注册用户 * @param limit * @return */ List getLatestUser(Integer limit); /** * 获得热门用户 * @param limit 用户数量 * @return */ List getHotUsers(Integer limit); } ================================================ FILE: src/main/java/com/example/sens/mapper/UserRoleRefMapper.java ================================================ package com.example.sens.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.UserRoleRef; import org.apache.ibatis.annotations.Mapper; /** * @author example */ @Mapper public interface UserRoleRefMapper extends BaseMapper { /** * 根据用户Id删除 * * @param userId 用户Id * @return 影响行数 */ Integer deleteByUserId(Long userId); } ================================================ FILE: src/main/java/com/example/sens/service/CategoryService.java ================================================ package com.example.sens.service; import com.example.sens.common.base.BaseService; import com.example.sens.entity.Category; import java.util.List; /** *
 *     分类业务逻辑接口
 * 
* * @author : saysky * @date : 2019/11/30 */ public interface CategoryService extends BaseService { /** * 查询所有分类目录,带count和根据level封装name * * @return 返回List集合 */ List findByUserId(Long userId); /** * 获得某个分类的所有房屋数 * * @param cateId 分类Id * @return 房屋数 */ Integer countPostByCateId(Long cateId); /** * 根据用户ID删除 * * @param userId * @return */ Integer deleteByUserId(Long userId); /** * 将分类ID列表转成分类 * * @param cateIds * @param userId * @return */ List cateIdsToCateList(List cateIds, Long userId); } ================================================ FILE: src/main/java/com/example/sens/service/CityService.java ================================================ package com.example.sens.service; import com.example.sens.common.base.BaseService; import com.example.sens.entity.City; public interface CityService extends BaseService { } ================================================ FILE: src/main/java/com/example/sens/service/MailService.java ================================================ package com.example.sens.service; import javax.mail.MessagingException; /** *
 *     邮件发送业务逻辑接口
 * 
*/ public interface MailService { /** * 发送邮件 * * @param to 接收者 * @param title 标题 * @param content 内容 */ void sendMail(String to, String title, String content) throws MessagingException; } ================================================ FILE: src/main/java/com/example/sens/service/NoticeService.java ================================================ package com.example.sens.service; import com.example.sens.common.base.BaseService; import com.example.sens.entity.Notice; public interface NoticeService extends BaseService { } ================================================ FILE: src/main/java/com/example/sens/service/OrderService.java ================================================ package com.example.sens.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.base.BaseService; import com.example.sens.entity.Order; /** * 订单 * * @author 言曌 * @date 2020/4/6 2:00 下午 */ public interface OrderService extends BaseService { /** * 查询总金额 * * @return */ Integer getTotalPriceSum(Order condition); /** * 根据条件查询 * * @param condition * @param page * @return */ Page findAll(Order condition, Page page); /** * 查询有效订单 * @param postId * @return */ Order findByPostId(Long postId); } ================================================ FILE: src/main/java/com/example/sens/service/PermissionService.java ================================================ package com.example.sens.service; import com.example.sens.entity.Permission; import com.example.sens.common.base.BaseService; import java.util.List; import java.util.Set; /** * 权限逻辑接口 */ public interface PermissionService extends BaseService { /** * 根据角色Id获得权限列表 * * @param roleId 角色Id * @return 权限列表 */ List listPermissionsByRoleId(Long roleId); /** * 获得某个用户的权限URL列表 * * @param userId * @return */ Set findPermissionUrlsByUserId(Long userId); /** * 获得某个用户的用户ID和资源类型 * * @param userId * @param resourceType * @return */ List findPermissionTreeByUserIdAndResourceType(Long userId, String resourceType); /** * 根据角色ID获得权限列表 * @param roleId * @return */ List findPermissionByRoleId(Long roleId); /** * 获得所有权限,带有等级 * @return */ List findPermissionListWithLevel(); /** * 统计子节点数量 * @param id * @return */ Integer countChildPermission(Long id); /** * 根据URL获得权限 * @param url * @return */ Permission findByUrl(String url); } ================================================ FILE: src/main/java/com/example/sens/service/PostService.java ================================================ package com.example.sens.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.base.BaseService; import com.example.sens.entity.Post; import java.util.List; /** *
 *     记录/页面业务逻辑接口
 * 
*/ public interface PostService extends BaseService { /** * 根据条件获得列表 * * @param condition * @return */ Page findPostByCondition(Post condition, Page page); /** * 根据租客userId查询 * * @param userId * @return */ Page findByRentUserId(Long userId, Page page); /** * 获得最新房屋 * * @param cityId * @param limit * @return */ List getLatestPost(Long cityId, int limit); /** * 根据状态统计 * * @param postStatus 状态 * @return */ Integer countByStatus(Integer postStatus); /** * 获得合租房屋 * * @return */ List getUnionRentPost(Post post); } ================================================ FILE: src/main/java/com/example/sens/service/RechargeRecordService.java ================================================ package com.example.sens.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.base.BaseService; import com.example.sens.entity.RechargeRecord; /** * @author 言曌 * @date 2020/3/22 3:18 下午 */ public interface RechargeRecordService extends BaseService { Page findAll(String startDate, String endDate, Page page); /** * 根据用户ID获得预定列表 * * @param userId * @param page * @return */ Page findByUserId(String startDate, String endDate, Long userId, Page page); /** * 根据时间范围查询总金额 * * @param startDate * @param endDate * @return */ Integer getTotalMoneySum(String startDate, String endDate); } ================================================ FILE: src/main/java/com/example/sens/service/RolePermissionRefService.java ================================================ package com.example.sens.service; import com.example.sens.entity.RolePermissionRef; import java.util.List; public interface RolePermissionRefService { /** * 删除某个角色的所有关联 * * @param roleId 角色Id */ void deleteRefByRoleId(Long roleId); /** * 添加角色和权限关联 * * @param rolePermissionRef RolePermissionRef * @return UserRoleRef */ void saveByRolePermissionRef(RolePermissionRef rolePermissionRef); /** * 批量添加 * * @param rolePermissionRefs 列表 */ void batchSaveByRolePermissionRef(List rolePermissionRefs); } ================================================ FILE: src/main/java/com/example/sens/service/RoleService.java ================================================ package com.example.sens.service; import com.example.sens.entity.Role; import com.example.sens.common.base.BaseService; import java.util.List; /** * 角色逻辑接口 */ public interface RoleService extends BaseService { /** * 删除某个用户的所有关联 * * @param userId 用户Id */ void deleteByUserId(Long userId); /** * 根据编号查询单个权限 * * @param roleId roleId * @return Role */ Role findByRoleId(Long roleId); /** * 根据编号查询单个权限 * * @param roleName roleName * @return Role */ Role findByRoleName(String roleName); /** * 根据用户Id获得角色 * * @param userId 用户Id * @return 角色列表 */ Role findByUserId(Long userId); /** * 统计这个角色的用户数 * * @param roleId 角色Id */ Integer countUserByRoleId(Long roleId); /** * 查询某个用户最大的角色等级 * @param userId * @return */ Integer findMaxLevelByUserId(Long userId); /** * 查询小于等于该等级的角色 * @param level * @return */ List findByLessThanLevel(Integer level); /** * 获得用户注册默认角色 * @return */ Role findDefaultRole(); /** * 获得用户注册默认角色 * @return */ Role getMaxRoleByUserId(Long userId); } ================================================ FILE: src/main/java/com/example/sens/service/UserRoleRefService.java ================================================ package com.example.sens.service; import com.example.sens.entity.UserRoleRef; import com.example.sens.common.base.BaseService; public interface UserRoleRefService extends BaseService { /** * 根据用户Id删除 * * @param userId 用户Id */ void deleteByUserId(Long userId); } ================================================ FILE: src/main/java/com/example/sens/service/UserService.java ================================================ package com.example.sens.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.common.base.BaseService; import com.example.sens.entity.User; /** * 用户业务逻辑接口 */ public interface UserService extends BaseService { /** * 根据账号获得用户 * * @param userName 账号 * @return 用户 */ User findByUserName(String userName); /** * 根据身份证号码查找用户 * * @param idCard 身份证号码 * @return User */ User findByIdCard(String idCard); /** * 更新密码 * * @param userId 用户Id * @param password 密码 */ void updatePassword(Long userId, String password); /** * 分页获取所有用户 * * @param roleName 角色名称 * @param condition 查询条件 * @param page 分页信息 * @return 用户列表 */ Page findByRoleAndCondition(String roleName, User condition, Page page); } ================================================ FILE: src/main/java/com/example/sens/service/impl/CategoryServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Category; import com.example.sens.mapper.CategoryMapper; import com.example.sens.mapper.PostMapper; import com.example.sens.service.CategoryService; import com.example.sens.service.PostService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** *
 *     分类业务逻辑实现类
 * 
* */ @Service public class CategoryServiceImpl implements CategoryService { @Autowired private CategoryMapper categoryMapper; @Autowired private PostMapper postMapper; @Autowired private PostService postService; @Override public BaseMapper getRepository() { return categoryMapper; } @Override public QueryWrapper getQueryWrapper(Category category) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (category != null) { if (StrUtil.isNotBlank(category.getCateName())) { queryWrapper.like("cate_name", category.getCateName()); } } return queryWrapper; } @Override public Category insert(Category category) { categoryMapper.insert(category); return category; } @Override public Category update(Category category) { categoryMapper.updateById(category); return category; } @Override public void delete(Long id) { // 删除分类 categoryMapper.deleteById(id); } @Override public List findByUserId(Long userId) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", userId); return categoryMapper.selectList(queryWrapper); } @Override public Integer countPostByCateId(Long cateId) { return postMapper.countPostByCateId(cateId); } @Override public Category insertOrUpdate(Category entity) { if (entity.getId() == null) { insert(entity); } else { update(entity); } return entity; } @Override public Integer deleteByUserId(Long userId) { return categoryMapper.deleteByUserId(userId); } @Override public List cateIdsToCateList(List cateIds, Long userId) { List categoryList = this.findByUserId(userId); List allCateIds = categoryList.stream().map(Category::getId).collect(Collectors.toList()); List result = new ArrayList<>(); for(Long id : cateIds) { if(allCateIds.contains(id)) { Category category = new Category(); category.setId(id); result.add(category); } } return result; } @Override public List findAll() { return categoryMapper.findAllWithCount(); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/CityServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.City; import com.example.sens.mapper.CityMapper; import com.example.sens.service.CityService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** *
 *     城市业务服务实现类
 * 
*/ @Service public class CityServiceImpl implements CityService { @Autowired private CityMapper cityMapper; @Override public BaseMapper getRepository() { return cityMapper; } @Override public QueryWrapper getQueryWrapper(City city) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (city != null) { if (StrUtil.isNotBlank(city.getCityName())) { queryWrapper.like("city_name", city.getCityName()); } } return queryWrapper; } @Override public List findAll() { return cityMapper.findAllWithCount(); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/MailServiceImpl.java ================================================ package com.example.sens.service.impl; import com.example.sens.service.MailService; import com.example.sens.util.SensUtils; import io.github.biezhi.ome.OhMyEmail; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.mail.MessagingException; /** *
 *     邮件发送业务逻辑实现类
 * 
* * @author : saysky * @date : 2018/1/23 */ @Service public class MailServiceImpl implements MailService { @Value("${mail.smtp.host}") private String host; @Value("${mail.smtp.username}") private String username; @Value("${mail.smtp.password}") private String password; @Value("${mail.from.name}") private String fromName; /** * 发送邮件 * * @param to to 接收者 * @param title subject 标题 * @param content content 内容 */ @Override public void sendMail(String to, String title, String content) throws MessagingException { //配置邮件服务器 SensUtils.configMail(host, username, password); OhMyEmail.subject(title) .from(fromName) .to(to) .text(content) .send(); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/NoticeServiceImpl.java ================================================ package com.example.sens.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Notice; import com.example.sens.mapper.NoticeMapper; import com.example.sens.service.NoticeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** *
 *     城市业务服务实现类
 * 
*/ @Service public class NoticeServiceImpl implements NoticeService { @Autowired private NoticeMapper noticeMapper; @Override public BaseMapper getRepository() { return noticeMapper; } @Override public QueryWrapper getQueryWrapper(Notice notice) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); return queryWrapper; } } ================================================ FILE: src/main/java/com/example/sens/service/impl/OrderServiceImpl.java ================================================ package com.example.sens.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.Order; import com.example.sens.mapper.OrderMapper; import com.example.sens.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 言曌 * @date 2020/4/6 2:01 下午 */ @Service public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Override public BaseMapper getRepository() { return orderMapper; } @Override public QueryWrapper getQueryWrapper(Order order) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (order != null) { if (order.getUserId() != null) { queryWrapper.eq("user_id", order.getUserId()); } if (order.getOwnerUserId() != null) { queryWrapper.eq("owner_user_id", order.getOwnerUserId()); } if (order.getPostId() != null) { queryWrapper.eq("post_id", order.getPostId()); } if (order.getStatus() != null) { queryWrapper.eq("status", order.getStatus()); } if (order.getStartDate() != null) { queryWrapper.eq("start_date", order.getStartDate()); } if (order.getEndDate() != null) { queryWrapper.eq("end_date", order.getEndDate()); } } return queryWrapper; } @Override public Integer getTotalPriceSum(Order condition) { return orderMapper.getTotalPriceSum(condition); } @Override public Page findAll(Order condition, Page page) { return page.setRecords(orderMapper.findAll(condition, page)); } @Override public Order findByPostId(Long postId) { return orderMapper.findByPostId(postId); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/PermissionServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Permission; import com.example.sens.mapper.PermissionMapper; import com.example.sens.mapper.RolePermissionRefMapper; import com.example.sens.service.PermissionService; import com.example.sens.util.PermissionUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 角色业务逻辑实现类 */ @Service public class PermissionServiceImpl implements PermissionService { @Autowired private PermissionMapper permissionMapper; @Autowired private RolePermissionRefMapper rolePermissionRefMapper; @Override public List listPermissionsByRoleId(Long roleId) { return permissionMapper.findByRoleId(roleId); } @Override public Set findPermissionUrlsByUserId(Long userId) { List permissions = permissionMapper.findPermissionByUserId(userId); Set urls = permissions.stream().map(p -> p.getUrl()).collect(Collectors.toSet()); return urls; } @Override public List findPermissionTreeByUserIdAndResourceType(Long userId, String resourceType) { List permissions = permissionMapper.findPermissionByUserIdAndResourceType(userId, resourceType); return PermissionUtil.getPermissionTree(permissions); } @Override public List findPermissionByRoleId(Long roleId) { return permissionMapper.findPermissionByRoleId(roleId); } @Override public BaseMapper getRepository() { return permissionMapper; } @Override public QueryWrapper getQueryWrapper(Permission permission) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (permission != null) { if (StrUtil.isNotBlank(permission.getResourceType())) { queryWrapper.eq("resource_type", permission.getResourceType()); } if (StrUtil.isNotBlank(permission.getResourceType())) { queryWrapper.eq("resource_type", permission.getResourceType()); } if (StrUtil.isNotBlank(permission.getUrl())) { queryWrapper.eq("url", permission.getUrl()); } if (StrUtil.isNotBlank(permission.getName())) { queryWrapper.eq("name", permission.getName()); } } return queryWrapper; } @Override public Permission insertOrUpdate(Permission entity) { if (entity.getId() == null) { insert(entity); } else { update(entity); } return entity; } @Override @Transactional(rollbackFor = Exception.class) public void delete(Long id) { permissionMapper.deleteById(id); rolePermissionRefMapper.deleteByPermissionId(id); } @Override public List findPermissionListWithLevel() { List permissionList = permissionMapper.selectList(null); permissionList = PermissionUtil.getPermissionList(permissionList); // 加空格以展示等级 for (Permission permission : permissionList) { for (int i = 1; i < permission.getLevel(); i++) { permission.setName("    "+permission.getName()); } } return permissionList; } @Override public Integer countChildPermission(Long id) { return permissionMapper.countChildPermission(id); } @Override public Permission findByUrl(String url) { return permissionMapper.findByUrl(url); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/PostServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.*; import com.example.sens.mapper.*; import com.example.sens.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** *
 *     房屋业务逻辑实现类
 * 
*/ @Service @Slf4j public class PostServiceImpl implements PostService { @Autowired private PostMapper postMapper; @Override public Page findPostByCondition(Post condition, Page page) { List postList = postMapper.findPostByCondition(condition, page); return page.setRecords(postList); } @Override public Page findByRentUserId(Long userId, Page page) { List postList = postMapper.findByRentUserId(userId, page); return page.setRecords(postList); } @Override public BaseMapper getRepository() { return postMapper; } @Override public Post insert(Post post) { postMapper.insert(post); return post; } @Override public Post update(Post post) { postMapper.updateById(post); return post; } @Override @Transactional(rollbackFor = Exception.class) public void delete(Long postId) { postMapper.deleteById(postId); } @Override public QueryWrapper getQueryWrapper(Post post) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (post != null) { if (StrUtil.isNotBlank(post.getPostTitle())) { queryWrapper.like("post_title", post.getPostTitle()); } if (StrUtil.isNotBlank(post.getPostContent())) { queryWrapper.like("post_content", post.getPostContent()); } if (post.getPostStatus() != null && post.getPostStatus() != -1) { queryWrapper.eq("post_status", post.getPostStatus()); } } return queryWrapper; } @Override public Post insertOrUpdate(Post post) { if (post.getId() == null) { insert(post); } else { update(post); } return post; } @Override public List getLatestPost(Long cityId, int limit) { return postMapper.getLatestPost(cityId, limit); } @Override public Integer countByStatus(Integer postStatus) { return postMapper.countByStatus(postStatus); } @Override public List getUnionRentPost(Post post) { Post temp = new Post(); temp.setNumber(post.getNumber()); temp.setUserId(post.getUserId()); temp.setPostTitle(post.getPostTitle()); temp.setCityId(post.getCityId()); if (temp.getNumber() != null && temp.getNumber().length() > 2) { if (temp.getNumber().indexOf("室") != -1) { temp.setNumber(temp.getNumber().substring(0, temp.getNumber().indexOf("室") + 1)); } } return postMapper.getUnionRentPost(temp); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/RechargeRecordServiceImpl.java ================================================ package com.example.sens.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.entity.RechargeRecord; import com.example.sens.mapper.RechargeRecordMapper; import com.example.sens.service.RechargeRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 言曌 * @date 2020/3/22 3:19 下午 */ @Service public class RechargeRecordServiceImpl implements RechargeRecordService { @Autowired private RechargeRecordMapper rechargeRecordMapper; @Override public BaseMapper getRepository() { return rechargeRecordMapper; } @Override public QueryWrapper getQueryWrapper(RechargeRecord rechargeRecord) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (rechargeRecord != null) { if (rechargeRecord.getUserId() != null) { queryWrapper.eq("user_id", rechargeRecord.getUserId()); } } return queryWrapper; } @Override public Page findAll(String startDate, String endDate, Page page) { return page.setRecords(rechargeRecordMapper.findAll(startDate, endDate, page)); } @Override public Page findByUserId(String startDate, String endDate, Long userId, Page page) { return page.setRecords(rechargeRecordMapper.findByUserId(startDate, endDate, userId, page)); } @Override public Integer getTotalMoneySum(String startDate, String endDate) { return rechargeRecordMapper.getTotalMoneySum(startDate, endDate); } } ================================================ FILE: src/main/java/com/example/sens/service/impl/RolePermissionRefServiceImpl.java ================================================ package com.example.sens.service.impl; import com.example.sens.entity.RolePermissionRef; import com.example.sens.mapper.RolePermissionRefMapper; import com.example.sens.service.RolePermissionRefService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class RolePermissionRefServiceImpl implements RolePermissionRefService { @Autowired private RolePermissionRefMapper rolePermissionRefMapper; @Override public void deleteRefByRoleId(Long roleId) { rolePermissionRefMapper.deleteByRoleId(roleId); } @Override public void saveByRolePermissionRef(RolePermissionRef rolePermissionRef) { rolePermissionRefMapper.insert(rolePermissionRef); } @Override public void batchSaveByRolePermissionRef(List rolePermissionRefs) { rolePermissionRefMapper.batchInsert(rolePermissionRefs); } ================================================ FILE: src/main/java/com/example/sens/service/impl/RoleServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.Permission; import com.example.sens.entity.Role; import com.example.sens.entity.RolePermissionRef; import com.example.sens.mapper.RoleMapper; import com.example.sens.service.RolePermissionRefService; import com.example.sens.service.RoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** * 角色业务逻辑实现类 */ @Service public class RoleServiceImpl implements RoleService { @Autowired private RoleMapper roleMapper; @Autowired private RolePermissionRefService rolePermissionRefService; @Override public BaseMapper getRepository() { return roleMapper; } @Override public QueryWrapper getQueryWrapper(Role role) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (role != null) { if (StrUtil.isNotBlank(role.getRole())) { queryWrapper.eq("role", role.getRole()); } if (StrUtil.isNotBlank(role.getDescription())) { queryWrapper.eq("description", role.getDescription()); } } return queryWrapper; } @Override public void deleteByUserId(Long userId) { roleMapper.deleteByUserId(userId); } @Override public Role findByRoleId(Long roleId) { return roleMapper.selectById(roleId); } @Override public Role findByRoleName(String roleName) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("role", roleName); return roleMapper.selectOne(queryWrapper); } @Override public Role findByUserId(Long userId) { return roleMapper.findByUserId(userId); } @Override public Integer countUserByRoleId(Long roleId) { return roleMapper.countUserByRoleId(roleId); } @Override public Integer findMaxLevelByUserId(Long userId) { return roleMapper.findMaxLevelByUserId(userId); } @Override public List findByLessThanLevel(Integer level) { return roleMapper.findByLessThanLevel(level); } @Override public Role findDefaultRole() { return roleMapper.findDefaultRole(); } @Override public Role getMaxRoleByUserId(Long userId) { return null; } @Override @Transactional(rollbackFor = Exception.class) public Role insert(Role role) { roleMapper.insert(role); if (role.getPermissions() != null && role.getPermissions().size() > 0) { List rolePermissionRefs = new ArrayList<>(role.getPermissions().size()); for (Permission permission : role.getPermissions()) { rolePermissionRefs.add(new RolePermissionRef(role.getId(), permission.getId())); } rolePermissionRefService.batchSaveByRolePermissionRef(rolePermissionRefs); } return role; } @Override @Transactional(rollbackFor = Exception.class) public Role update(Role role) { roleMapper.updateById(role); if (role.getPermissions() != null && role.getPermissions().size() > 0) { // 删除关联 rolePermissionRefService.deleteRefByRoleId(role.getId()); // 添加关联 List rolePermissionRefs = new ArrayList<>(role.getPermissions().size()); for (Permission permission : role.getPermissions()) { rolePermissionRefs.add(new RolePermissionRef(role.getId(), permission.getId())); } rolePermissionRefService.batchSaveByRolePermissionRef(rolePermissionRefs); } return role; } @Override public Role insertOrUpdate(Role entity) { if (entity.getId() == null) { insert(entity); } else { update(entity); } return entity; } } ================================================ FILE: src/main/java/com/example/sens/service/impl/UserRoleRefServiceImpl.java ================================================ package com.example.sens.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.sens.entity.UserRoleRef; import com.example.sens.mapper.UserRoleRefMapper; import com.example.sens.service.UserRoleRefService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserRoleRefServiceImpl implements UserRoleRefService { @Autowired private UserRoleRefMapper roleRefMapper; @Override public void deleteByUserId(Long userId) { roleRefMapper.deleteByUserId(userId); } @Override public BaseMapper getRepository() { return roleRefMapper; } @Override public QueryWrapper getQueryWrapper(UserRoleRef userRoleRef) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (userRoleRef != null) { if (userRoleRef.getUserId() != null) { queryWrapper.eq("user_id", userRoleRef.getUserId()); } if (userRoleRef.getRoleId() != null) { queryWrapper.eq("role_id", userRoleRef.getRoleId()); } } return queryWrapper; } } ================================================ FILE: src/main/java/com/example/sens/service/impl/UserServiceImpl.java ================================================ package com.example.sens.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.exception.MyBusinessException; import com.example.sens.common.constant.CommonConstant; import com.example.sens.entity.Role; import com.example.sens.mapper.OrderMapper; import com.example.sens.mapper.RechargeRecordMapper; import com.example.sens.mapper.UserMapper; import com.example.sens.entity.User; import com.example.sens.service.RoleService; import com.example.sens.service.UserService; import com.example.sens.util.Md5Util; import com.example.sens.util.RegexUtil; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * 用户业务逻辑实现类 */ @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private RoleService roleService; @Autowired private OrderMapper orderMapper; @Autowired private RechargeRecordMapper rechargeRecordMapper; @Override public User findByUserName(String userName) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_name", userName); return userMapper.selectOne(queryWrapper); } @Override public User findByIdCard(String idCard) { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("id_card", idCard); return userMapper.selectOne(queryWrapper); } @Override public void updatePassword(Long userId, String password) { User user = new User(); user.setId(userId); user.setUserPass(Md5Util.toMd5(password, CommonConstant.PASSWORD_SALT, 10)); userMapper.updateById(user); } @Override public Page findByRoleAndCondition(String roleName, User condition, Page page) { List users = new ArrayList<>(); if (Objects.equals(roleName, CommonConstant.NONE)) { users = userMapper.findByCondition(condition, page); } else { Role role = roleService.findByRoleName(roleName); if (role != null) { users = userMapper.findByRoleIdAndCondition(role.getId(), condition, page); } } return page.setRecords(users); } @Override public BaseMapper getRepository() { return userMapper; } @Override public QueryWrapper getQueryWrapper(User user) { //对指定字段查询 QueryWrapper queryWrapper = new QueryWrapper<>(); if (user != null) { if (StrUtil.isNotBlank(user.getUserName())) { queryWrapper.eq("user_name", user.getUserName()); } if (StrUtil.isNotBlank(user.getIdCard())) { queryWrapper.eq("id_card", user.getIdCard()); } } return queryWrapper; } @Override public User insert(User user) { // 1.检查长度 basicCheck(user); // 2.验证账号和身份证号码是否存在 checkUserNameAndIdCard(user); // 3.添加 userMapper.insert(user); return user; } @Override public User update(User user) { // 1.检查长度 basicCheck(user); // 2.验证账号和身份证号码是否存在 checkUserNameAndIdCard(user); // 3.更新 userMapper.updateById(user); return user; } private void checkUserNameAndIdCard(User user) { //验证账号和身份证号码是否存在 if (user.getUserName() != null) { User nameCheck = findByUserName(user.getUserName()); Boolean isExist = (user.getId() == null && nameCheck != null) || (user.getId() != null && nameCheck != null && !Objects.equals(nameCheck.getId(), user.getId())); if (isExist) { throw new MyBusinessException("账号已经存在"); } } if (user.getIdCard() != null) { User idCardCheck = findByIdCard(user.getIdCard()); Boolean isExist = (user.getId() == null && idCardCheck != null) || (user.getId() != null && idCardCheck != null && !Objects.equals(idCardCheck.getId(), user.getId())); if (isExist) { throw new MyBusinessException("身份证号码已经存在"); } } } @Override @Transactional(rollbackFor = Exception.class) public void delete(Long userId) { //删除用户 User user = get(userId); if (user != null) { // 1.修改用户状态为已删除 userMapper.deleteById(userId); // 2.修改用户和角色关联 roleService.deleteByUserId(userId); // 3.删除订单 Map map = new HashMap<>(); map.put("user_id", userId); orderMapper.deleteByMap(map); Map map2 = new HashMap<>(); map.put("owner_user_id", userId); orderMapper.deleteByMap(map2); // 4.删除充值记录 rechargeRecordMapper.deleteByUserId(userId); } } @Override public User insertOrUpdate(User user) { if (user.getId() == null) { user.setUserAvatar("/static/images/avatar/" + RandomUtils.nextInt(1, 41) + ".jpeg"); insert(user); } else { update(user); } return user; } private void basicCheck(User user) { String userName = user.getUserName(); String idCard = user.getIdCard(); String userDisplayName = user.getUserDisplayName(); // 1.身份证号码是否合法 if (StringUtils.isNotEmpty(idCard) && !RegexUtil.isIdCard(idCard)) { throw new MyBusinessException("身份证号码不合法,请输入15或18位"); } // 2.账号码长度是否合法 if (StringUtils.isNotEmpty(userName) && userName.length() > 20 || userName.length() < 2) { throw new MyBusinessException("账号不合法,请输入2-20位"); } // 3.姓名长度是否合法 if (StringUtils.isNotEmpty(userDisplayName) && userDisplayName.length() > 20 || userDisplayName.length() < 2) { throw new MyBusinessException("姓名长度不合法,请输入2-20位"); } } @Override public User get(Long id) { User user = userMapper.selectById(id); return user; } } ================================================ FILE: src/main/java/com/example/sens/util/DateUtil.java ================================================ package com.example.sens.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @author 言曌 * @date 2020/4/5 4:36 下午 */ public class DateUtil { public static final String FORMAT = "yyyy-MM-dd"; public static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); public static List getBetweenDates(String start, int count) { Date startDate = null; SimpleDateFormat sdf = THREAD_LOCAL.get(); if (sdf == null) { sdf = new SimpleDateFormat(FORMAT); } try { startDate = sdf.parse(start); } catch (ParseException e) { e.printStackTrace(); return Collections.emptyList(); } Calendar c = Calendar.getInstance(); c.setTime(startDate); c.add(Calendar.DAY_OF_MONTH, count); Date endDate = c.getTime(); String end = sdf.format(endDate); return getBetweenDates(start, end); } public static List getBetweenDates(String start, String end) { List result = new ArrayList<>(); try { SimpleDateFormat sdf = THREAD_LOCAL.get(); if (sdf == null) { sdf = new SimpleDateFormat(FORMAT); } Date start_date = sdf.parse(start); Date end_date = sdf.parse(end); Calendar tempStart = Calendar.getInstance(); tempStart.setTime(start_date); Calendar tempEnd = Calendar.getInstance(); tempEnd.setTime(end_date); while (tempStart.before(tempEnd)) { result.add(sdf.format(tempStart.getTime())); tempStart.add(Calendar.DAY_OF_YEAR, 1); } } catch (ParseException e) { e.printStackTrace(); } return result; } public static void main(String[] args) { System.out.println(getBetweenDates("2020-04-05", 1)); } ================================================ FILE: src/main/java/com/example/sens/util/FileUtil.java ================================================ package com.example.sens.util; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.StrBuilder; import com.alibaba.fastjson.JSONException; import com.example.sens.exception.MyBusinessException; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.net.URL; import java.nio.charset.Charset; /** * @author 言曌 * @date 2020/3/8 5:45 下午 */ public class FileUtil { /** * 上传文件返回URL * * @param file * @return */ public static String upload(MultipartFile file) { String path = ""; try { //用户目录 final StrBuilder uploadPath = new StrBuilder(System.getProperties().getProperty("user.home")); uploadPath.append("/sens/upload/" + DateUtil.thisYear()).append("/").append(DateUtil.thisMonth() + 1).append("/"); final File mediaPath = new File(uploadPath.toString()); if (!mediaPath.exists()) { if (!mediaPath.mkdirs()) { throw new MyBusinessException("上传失败"); } } //不带后缀 String nameWithOutSuffix = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.')).replaceAll(" ", "_").replaceAll(",", ""); //文件后缀 final String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.') + 1); //带后缀 String fileName = nameWithOutSuffix + "." + fileSuffix; //判断文件名是否已存在 File descFile = new File(mediaPath.getAbsoluteFile(), fileName); int i = 1; while (descFile.exists()) { String newNameWithOutSuffix = nameWithOutSuffix + "(" + i + ")"; descFile = new File(mediaPath.getAbsoluteFile(), newNameWithOutSuffix + "." + fileSuffix); i++; } file.transferTo(descFile); //文件原路径 final StrBuilder fullPath = new StrBuilder(mediaPath.getAbsolutePath()); fullPath.append("/"); fullPath.append(nameWithOutSuffix + "." + fileSuffix); //压缩文件路径 final StrBuilder fullSmallPath = new StrBuilder(mediaPath.getAbsolutePath()); fullSmallPath.append("/"); fullSmallPath.append(nameWithOutSuffix); fullSmallPath.append("_small."); fullSmallPath.append(fileSuffix); //映射路径 final StrBuilder filePath = new StrBuilder("/upload/"); filePath.append(DateUtil.thisYear()); filePath.append("/"); filePath.append(DateUtil.thisMonth() + 1); filePath.append("/"); filePath.append(nameWithOutSuffix + "." + fileSuffix); path = filePath.toString(); } catch (IOException e) { e.printStackTrace(); } return path; } public static String readStringFromUrl(String url) throws IOException, JSONException { InputStream is = new URL(url).openStream(); try { BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); String jsonText = readAll(rd); return jsonText; } finally { is.close(); } } private static String readAll(Reader rd) throws IOException { StringBuilder sb = new StringBuilder(); int cp; while ((cp = rd.read()) != -1) { sb.append((char) cp); } return sb.toString(); } } ================================================ FILE: src/main/java/com/example/sens/util/IpInfoUtil.java ================================================ package com.example.sens.util; import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; /** * @author example */ @Slf4j public class IpInfoUtil { /** * 获取客户端IP地址 * @param request 请求 * @return */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if ("127.0.0.1".equals(ip)) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ip = inet.getHostAddress(); } } // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if (ip != null && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } if("0:0:0:0:0:0:0:1".equals(ip)){ ip = "127.0.0.1"; } return ip; } } ================================================ FILE: src/main/java/com/example/sens/util/Md5Util.java ================================================ package com.example.sens.util; import cn.hutool.core.text.StrBuilder; import org.apache.shiro.crypto.hash.Md5Hash; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.security.MessageDigest; /** * 获取文件hash */ public class Md5Util { /** * shiro的md5加密 * * @param pwd 密码 * @param salt 盐 * @param i 加密次数 * @return 加密后字符串 */ public static String toMd5(String pwd, String salt, int i) { Md5Hash toMd5 = new Md5Hash(pwd, salt, i); return toMd5.toString(); } /** * 计算文件MD5编码 * * @param file file * @return byte * @throws Exception Exception */ private static byte[] createChecksum(MultipartFile file) throws Exception { final InputStream fis = file.getInputStream(); final byte[] buffer = new byte[1024]; final MessageDigest complete = MessageDigest.getInstance("MD5"); int numRead; do { numRead = fis.read(buffer); if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); fis.close(); return complete.digest(); } /** * 生成文件hash值 * * @param file file * @return String * @throws Exception Exception */ public static String getMD5Checksum(MultipartFile file) throws Exception { final byte[] b = createChecksum(file); StrBuilder result = new StrBuilder(); for (int i = 0; i < b.length; i++) { result.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1)); } return result.toString(); } public static void main(String args[]) { } } ================================================ FILE: src/main/java/com/example/sens/util/ObjectUtil.java ================================================ package com.example.sens.util; import cn.hutool.core.util.StrUtil; import com.google.common.collect.Maps; import com.google.gson.Gson; import org.springframework.cglib.beans.BeanMap; import java.util.HashMap; import java.util.Map; /** * @author example */ public class ObjectUtil { public static String mapToString(Map paramMap){ if (paramMap == null) { return ""; } Map params = new HashMap<>(16); for (Map.Entry param : paramMap.entrySet()) { String key = param.getKey(); String paramValue = (param.getValue() != null && param.getValue().length > 0 ? param.getValue()[0] : ""); String obj = StrUtil.endWithIgnoreCase(param.getKey(), "password") ? "密码隐藏" : paramValue; params.put(key,obj); } return new Gson().toJson(params); } public static String mapToStringAll(Map paramMap){ if (paramMap == null) { return ""; } Map params = new HashMap<>(16); for (Map.Entry param : paramMap.entrySet()) { String key = param.getKey(); String paramValue = (param.getValue() != null && param.getValue().length > 0 ? param.getValue()[0] : ""); params.put(key, paramValue); } return new Gson().toJson(params); } public static Map beanToMap(T bean) { Map map = Maps.newHashMap(); if (bean != null) { BeanMap beanMap = BeanMap.create(bean); for (Object key : beanMap.keySet()) { map.put(key+"", beanMap.get(key)); } } return map; } } ================================================ FILE: src/main/java/com/example/sens/util/PageUtil.java ================================================ package com.example.sens.util; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.sens.vo.PageVo; import java.util.ArrayList; import java.util.List; /** * @author example */ public class PageUtil { /** * 最大分页大小 */ public static final int MAX_PAGE_SIZE = 100; /** * mybatis分页封装 * * @param pageNumber 页码 * @param pageSize 页大小 * @param sort 排序字段 * @param order 倒序/升序 * @return */ public static Page initMpPage(long pageNumber, long pageSize, String sort, String order) { Page p = null; if (StrUtil.isNotBlank(sort)) { //驼峰法转下划线, createTime -> create_time sort = camelToUnderline(sort); } if (pageNumber < 1) { pageNumber = 1; } if (pageSize < 1) { pageSize = 10; } if (pageSize > MAX_PAGE_SIZE) { pageSize = MAX_PAGE_SIZE; } if (StrUtil.isNotBlank(sort)) { Boolean isAsc = false; if (StrUtil.isBlank(order)) { isAsc = false; } else { if ("desc".equals(order.toLowerCase())) { isAsc = false; } else if ("asc".equals(order.toLowerCase())) { isAsc = true; } } p = new Page(pageNumber, pageSize); if (isAsc) { p.setAsc(sort); } else { p.setDesc(sort); } } else { p = new Page(pageNumber, pageSize); } return p; } /** * List 手动分页 * * @param page * @param list * @return */ public static List listToPage(PageVo page, List list) { long pageNumber = page.getPage() - 1; long pageSize = page.getSize(); if (pageNumber < 0) { pageNumber = 0; } if (pageSize < 1) { pageSize = 10; } long fromIndex = pageNumber * pageSize; long toIndex = pageNumber * pageSize + pageSize; if (fromIndex > list.size()) { return new ArrayList(); } else if (toIndex >= list.size()) { return list.subList((int) fromIndex, list.size()); } else { return list.subList((int) fromIndex, (int) toIndex); } } /** * 驼峰转下划线 * * @param str * @return */ private static String camelToUnderline(String str) { if (str == null || str.trim().isEmpty()) { return ""; } int len = str.length(); StringBuilder sb = new StringBuilder(len); sb.append(str.substring(0, 1).toLowerCase()); for (int i = 1; i < len; i++) { char c = str.charAt(i); if (Character.isUpperCase(c)) { sb.append("_"); sb.append(Character.toLowerCase(c)); } else { sb.append(c); } } return sb.toString(); } /** * 设计缺陷,前端无法获取mybatis-plus的分页page中的pages,所以自己封装一个PageVO * 同时将分页信息塞到PageVo中 * * @param page mybatis-plus分页类 * @return */ public static PageVo convertPageVo(Page page) { PageVo pageVo = new PageVo(); pageVo.setSize(page.getSize()); pageVo.setTotal(page.getTotal()); pageVo.setCurrent(page.getCurrent()); pageVo.setPages(page.getPages()); List orderItems = page.getOrders(); if (orderItems != null && orderItems.size() > 0) { pageVo.setSort(orderItems.get(0).getColumn()); pageVo.setOrder(orderItems.get(0).isAsc() ? "asc" : "desc"); } return pageVo; } } ================================================ FILE: src/main/java/com/example/sens/util/PermissionUtil.java ================================================ package com.example.sens.util; import com.example.sens.entity.Permission; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 拼装菜单 */ public class PermissionUtil { /** * 获取组装好的菜单 * 以树的形式显示 * * @param permissionsRoot permissionsRoot * @return List */ public static List getPermissionTree(List permissionsRoot) { List permissionsResult = new ArrayList<>(); for (Permission permission : permissionsRoot) { if (permission.getPid() == 0) { permissionsResult.add(permission); } } for (Permission permission : permissionsResult) { permission.setChildPermissions(getChildTree(permission.getId(), permissionsRoot)); } return permissionsResult; } /** * 获取菜单的子菜单 * * @param id 菜单编号 * @param permissionsRoot permissionsRoot * @return List */ private static List getChildTree(Long id, List permissionsRoot) { List permissionsChild = new ArrayList<>(); for (Permission permission : permissionsRoot) { if (permission.getPid() != 0) { if (permission.getPid().equals(id)) { permissionsChild.add(permission); } } } for (Permission permission : permissionsChild) { if (permission.getPid() != 0) { permission.setChildPermissions(getChildTree(permission.getId(), permissionsRoot)); } } if (permissionsChild.size() == 0) { return null; } return permissionsChild; } /** * 获取组装好的菜单, * * @param permissionsRoot permissionsRoot * @return List */ public static List getPermissionList(List permissionsRoot) { List permissionsResult = new ArrayList<>(); for (Permission permission : permissionsRoot) { if (permission.getPid() == 0) { permission.setLevel(1); permissionsResult.add(permission); permissionsResult.addAll(getChildList(permission, permissionsRoot)); } } return permissionsResult; } /** * 获取菜单的子菜单 * * @param parentPermission 菜单编号 * @param permissionsRoot permissionsRoot * @return List */ private static List getChildList(Permission parentPermission, List permissionsRoot) { List permissionsChild = new ArrayList<>(); for (Permission permission : permissionsRoot) { if (permission.getPid() != 0) { if (permission.getPid().equals(parentPermission.getId())) { permission.setLevel(parentPermission.getLevel() + 1); permissionsChild.add(permission); List tempList = getChildList(permission, permissionsRoot); tempList.sort((a, b) -> (int) (b.getSort() - a.getSort())); permissionsChild.addAll(tempList); } } } if (permissionsChild.size() == 0) { return Collections.emptyList(); } return permissionsChild; } } ================================================ FILE: src/main/java/com/example/sens/util/RegexUtil.java ================================================ package com.example.sens.util; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author 言曌 * @date 2020/3/8 1:55 下午 */ public class RegexUtil { /** * 判断Email合法性 * * @param email * @return */ public static boolean isEmail(String email) { if (email == null) { return false; } String rule = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?"; Pattern pattern = Pattern.compile(rule); Matcher matcher = pattern.matcher(email); return matcher.matches(); } /** * 是否为合法身份证号码 * @param idCard * @return */ public static boolean isIdCard(String idCard) { if(idCard == null) { return false; } return idCard.length() == 15 || idCard.length() == 18; } public static List getImgSrc(String htmlStr) { String img = ""; Pattern imgPattern; Matcher imgMatcher; List pics = new ArrayList<>(); String imgReg = "]*?>"; imgPattern = Pattern.compile(imgReg, Pattern.CASE_INSENSITIVE); imgMatcher = imgPattern.matcher(htmlStr); while (imgMatcher.find()) { img = img + "," + imgMatcher.group(); Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img); while (m.find()) { pics.add(m.group(1)); } } return pics; } } ================================================ FILE: src/main/java/com/example/sens/util/RelativeDateFormat.java ================================================ package com.example.sens.util; import java.util.Date; /** * @author 言曌 * @date 2020/3/10 9:48 下午 */ public class RelativeDateFormat { private static final long ONE_MINUTE = 60000L; private static final long ONE_HOUR = 3600000L; private static final long ONE_DAY = 86400000L; private static final long ONE_WEEK = 604800000L; private static final String ONE_SECOND_AGO = "秒前"; private static final String ONE_MINUTE_AGO = "分钟前"; private static final String ONE_HOUR_AGO = "小时前"; private static final String ONE_DAY_AGO = "天前"; private static final String ONE_MONTH_AGO = "月前"; private static final String ONE_YEAR_AGO = "年前"; public static String format(Date date) { long delta = System.currentTimeMillis() - date.getTime(); if (delta < 1L * ONE_MINUTE) { long seconds = toSeconds(delta); return (seconds <= 0 ? 1 : seconds) + ONE_SECOND_AGO; } if (delta < 45L * ONE_MINUTE) { long minutes = toMinutes(delta); return (minutes <= 0 ? 1 : minutes) + ONE_MINUTE_AGO; } if (delta < 24L * ONE_HOUR) { long hours = toHours(delta); return (hours <= 0 ? 1 : hours) + ONE_HOUR_AGO; } if (delta < 48L * ONE_HOUR) { return "昨天"; } if (delta < 30L * ONE_DAY) { long days = toDays(delta); return (days <= 0 ? 1 : days) + ONE_DAY_AGO; } if (delta < 12L * 4L * ONE_WEEK) { long months = toMonths(delta); return (months <= 0 ? 1 : months) + ONE_MONTH_AGO; } else { long years = toYears(delta); return (years <= 0 ? 1 : years) + ONE_YEAR_AGO; } } private static long toSeconds(long date) { return date / 1000L; } private static long toMinutes(long date) { return toSeconds(date) / 60L; } private static long toHours(long date) { return toMinutes(date) / 60L; } private static long toDays(long date) { return toHours(date) / 24L; } private static long toMonths(long date) { return toDays(date) / 30L; } private static long toYears(long date) { return toMonths(date) / 365L; } } ================================================ FILE: src/main/java/com/example/sens/util/Response.java ================================================ package com.example.sens.util; public class Response { private Boolean success; private String message; private T data; /** * 状态码 */ private Integer status = 200; public Response() { } public Response(Boolean success) { this.success = success; } public Response(Boolean success, String message) { this.success = success; this.message = message; } public Response(Boolean success, String message, T data) { this.success = success; this.message = message; this.data = data; } public Response(Boolean success, Integer status, String message, T data) { this.success = success; this.message = message; this.data = data; this.status = status; } public static Response yes() { return new Response(true, 200, "成功", null); } public static Response yes(T data) { return new Response(true, 200, "成功", data); } public static Response yes(String message, T data) { return new Response(true, 200, message, data); } public static Response no() { return new Response(false, 500, "失败", null); } public static Response no(String message) { return new Response(false, 500, message, null); } public static Response no(Integer status, String message) { return new Response(false, status, message, null); } public Boolean isSuccess() { return success; } public void setSuccess(Boolean success) { this.success = success; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } public Boolean getSuccess() { return success; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } } ================================================ FILE: src/main/java/com/example/sens/util/SensUtils.java ================================================ package com.example.sens.util; import io.github.biezhi.ome.OhMyEmail; import lombok.extern.slf4j.Slf4j; import java.util.*; /** *
 *     常用工具
 * 
*/ @Slf4j public class SensUtils { /** * 配置邮件 * * @param smtpHost smtpHost * @param userName 邮件地址 * @param password password */ public static void configMail(String smtpHost, String userName, String password) { Properties properties = OhMyEmail.defaultConfig(false); properties.setProperty("mail.smtp.host", smtpHost); OhMyEmail.config(properties, userName, password); } public static String listToStr(List list) { StringBuilder stringBuilder = new StringBuilder(); for (String str : list) { stringBuilder.append(str).append(","); } String temp = stringBuilder.toString(); if (temp.length() > 0) { return temp.substring(0, temp.length() - 1); } return temp; } public static void main(String[] args) { List list = new ArrayList<>(); list.add("11"); list.add("22"); list.add("13"); System.out.println(listToStr(list)); } } ================================================ FILE: src/main/java/com/example/sens/util/SpringUtil.java ================================================ package com.example.sens.util; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * 获取applicationContext * * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; } } /** * 通过name获取 Bean. * * @param name name * @return Object */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通过class获取Bean * * @param clazz clazz * @param * @return T */ public static T getBean(Class clazz) { return getApplicationContext().getBean(clazz); } } ================================================ FILE: src/main/java/com/example/sens/util/ThreadPoolUtil.java ================================================ package com.example.sens.util; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author example */ public class ThreadPoolUtil { /** * 线程缓冲队列 */ private static BlockingQueue bqueue = new ArrayBlockingQueue(100); /** * 核心线程数,会一直存活,即使没有任务,线程池也会维护线程的最少数量 */ private static final int SIZE_CORE_POOL = 5; /** * 线程池维护线程的最大数量 */ private static final int SIZE_MAX_POOL = 10; /** * 线程池维护线程所允许的空闲时间 */ private static final long ALIVE_TIME = 2000; private static ThreadPoolExecutor pool = new ThreadPoolExecutor(SIZE_CORE_POOL, SIZE_MAX_POOL, ALIVE_TIME, TimeUnit.MILLISECONDS, bqueue, new ThreadPoolExecutor.CallerRunsPolicy()); static { pool.prestartAllCoreThreads(); } public static ThreadPoolExecutor getPool() { return pool; } public static void main(String[] args) { System.out.println(pool.getPoolSize()); } } ================================================ FILE: src/main/java/com/example/sens/vo/PageVo.java ================================================ package com.example.sens.vo; import lombok.Data; import java.io.Serializable; /** * @author example */ @Data public class PageVo implements Serializable { private static final long serialVersionUID = 1L; /** * 页号 */ private long page = 1; /** * 页大小 */ private long size = 10; /** * 排序字段 */ private String sort = "create_time"; /** * 排序方式 asc/desc */ private String order = "desc"; /** * 当前页码 */ private long current; /** * 总数 */ private long total; /** * 页数 */ private long pages; public PageVo() { } public PageVo(int page, int size) { this.page = page; this.size = size; } public PageVo(int page, int size, String sort, String order) { this.page = page; this.size = size; this.sort = sort; this.order = order; } } ================================================ FILE: src/main/java/com/example/sens/vo/SearchVo.java ================================================ package com.example.sens.vo; import lombok.Data; import java.io.Serializable; /** * @author example */ @Data public class SearchVo implements Serializable { /** * 起始日期 */ private String startDate; /** * 结束日期 */ private String endDate; } ================================================ FILE: src/main/resources/application.yaml ================================================ server: port: 8080 forward-headers-strategy: true undertow: io-threads: 2 worker-threads: 36 buffer-size: 1024 directBuffers: true servlet: session: timeout: 86400 spring: transaction: rollback-on-commit-failure: true datasource: type: com.alibaba.druid.pool.DruidDataSource #MySql配置 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/manland?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowMultiQueries=true username: root password: 123456 thymeleaf: mode: HTML5 cache: false prefix: classpath:/templates/ encoding: UTF-8 suffix: .html check-template-location: false servlet: multipart: max-file-size: 2000MB max-request-size: 2000MB devtools: restart: enabled: true additional-paths: src/main/java mybatis-plus: mapper-locations: classpath*:/mapper/**Mapper.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.example.sens.entity global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 0 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 2 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true #逻辑删除配置(下面3个配置) logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true cache-enabled: true logging: file: ./logs/log.log level: org: springframework: boot: autoconfigure: error # web: # trace application: formatted-version: 1.0.0 shiro: userNativeSessionManager: true mail: smtp: host: smtp.qq.com username: 847064370@qq.com password: xxx from: ================================================ FILE: src/main/resources/mapper/CategoryMapper.xml ================================================ DELETE FROM category WHERE user_id = #{value} ================================================ FILE: src/main/resources/mapper/CityMapper.xml ================================================ ================================================ FILE: src/main/resources/mapper/OrderMapper.xml ================================================ DELETE FROM t_order WHERE post_id = #{value} UPDATE t_order SET status = 3 WHERE create_time < SUBDATE( now( ), INTERVAL + 10 MINUTE ) AND status = 0 AND del_flag = 0 ================================================ FILE: src/main/resources/mapper/PermissionMapper.xml ================================================ ================================================ FILE: src/main/resources/mapper/PostMapper.xml ================================================ ================================================ FILE: src/main/resources/mapper/RechargeRecordMapper.xml ================================================ DELETE FROM recharge_record WHERE user_id = #{value} AND del_flag = 0 ================================================ FILE: src/main/resources/mapper/RoleMapper.xml ================================================ DELETE FROM user_role_ref WHERE user_id = #{value} AND del_flag = 0 ================================================ FILE: src/main/resources/mapper/RolePermissionRefMapper.xml ================================================ DELETE FROM role_permission_ref WHERE role_id = #{value} AND del_flag = 0 DELETE FROM role_permission_ref WHERE permission_id = #{value} AND del_flag = 0 INSERT INTO role_permission_ref ( role_id, permission_id ) VALUES ( #{item.roleId}, #{item.permissionId} ) ================================================ FILE: src/main/resources/mapper/UserMapper.xml ================================================ 0 1 2 ================================================ FILE: src/main/resources/mapper/UserRoleRefMapper.xml ================================================ DELETE FROM `user_role_ref` WHERE user_id = #{value} AND del_flag = 0 ================================================ FILE: src/main/resources/static/css/AdminLTE.css ================================================ /*! * AdminLTE v2.4.5 * Author: Almsaeed Studio * Website: Almsaeed Studio * License: Open source - MIT * Please visit http://opensource.org/licenses/MIT for more information */ /* * Core: General Layout Style * ------------------------- */ html, body { height: 100%; } .layout-boxed html, .layout-boxed body { height: 100%; } body { font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 400; overflow-x: hidden; overflow-y: auto; } /* Layout */ .wrapper { height: 100%; position: relative; overflow-x: hidden; overflow-y: auto; } .wrapper:before, .wrapper:after { content: " "; display: table; } .wrapper:after { clear: both; } .layout-boxed .wrapper { max-width: 1250px; margin: 0 auto; min-height: 100%; box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); position: relative; } .layout-boxed { background-color: #f9fafc; } /* * Content Wrapper - contains the main content */ .content-wrapper, .main-footer { -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; margin-left: 230px; z-index: 820; } .layout-top-nav .content-wrapper, .layout-top-nav .main-footer { margin-left: 0; } @media (max-width: 767px) { .content-wrapper, .main-footer { margin-left: 0; } } @media (min-width: 768px) { .sidebar-collapse .content-wrapper, .sidebar-collapse .main-footer { margin-left: 0; } } @media (max-width: 767px) { .sidebar-open .content-wrapper, .sidebar-open .main-footer { -webkit-transform: translate(230px, 0); -ms-transform: translate(230px, 0); -o-transform: translate(230px, 0); transform: translate(230px, 0); } } .content-wrapper { min-height: 100%; background-color: #ecf0f5; z-index: 800; } .main-footer { background: #fff; padding: 15px; color: #444; border-top: 1px solid #d2d6de; } /* Fixed layout */ .fixed .main-header, .fixed .main-sidebar, .fixed .left-side { position: fixed; } .fixed .main-header { top: 0; right: 0; left: 0; } .fixed .content-wrapper, .fixed .right-side { padding-top: 50px; } @media (max-width: 767px) { .fixed .content-wrapper, .fixed .right-side { padding-top: 100px; } } .fixed.layout-boxed .wrapper { max-width: 100%; } .fixed .wrapper { overflow: hidden; } .hold-transition .content-wrapper, .hold-transition .right-side, .hold-transition .main-footer, .hold-transition .main-sidebar, .hold-transition .left-side, .hold-transition .main-header .navbar, .hold-transition .main-header .logo, .hold-transition .menu-open .fa-angle-left { /* Fix for IE */ -webkit-transition: none; -o-transition: none; transition: none; } /* Content */ .content { min-height: 250px; padding: 15px; margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } /* H1 - H6 font */ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: 'Source Sans Pro', sans-serif; } /* General Links */ a { color: #3c8dbc; } a:hover, a:active, a:focus { outline: none; text-decoration: none; color: #72afd2; } /* Page Header */ .page-header { margin: 10px 0 20px 0; font-size: 22px; } .page-header > small { color: #666; display: block; margin-top: 5px; } /* * Component: Main Header * ---------------------- */ .main-header { position: relative; max-height: 100px; z-index: 1030; } .main-header .navbar { -webkit-transition: margin-left 0.3s ease-in-out; -o-transition: margin-left 0.3s ease-in-out; transition: margin-left 0.3s ease-in-out; margin-bottom: 0; margin-left: 230px; border: none; min-height: 50px; border-radius: 0; } .layout-top-nav .main-header .navbar { margin-left: 0; } .main-header #navbar-search-input.form-control { background: rgba(255, 255, 255, 0.2); border-color: transparent; } .main-header #navbar-search-input.form-control:focus, .main-header #navbar-search-input.form-control:active { border-color: rgba(0, 0, 0, 0.1); background: rgba(255, 255, 255, 0.9); } .main-header #navbar-search-input.form-control::-moz-placeholder { color: #ccc; opacity: 1; } .main-header #navbar-search-input.form-control:-ms-input-placeholder { color: #ccc; } .main-header #navbar-search-input.form-control::-webkit-input-placeholder { color: #ccc; } .main-header .navbar-custom-menu, .main-header .navbar-right { float: right; } @media (max-width: 991px) { .main-header .navbar-custom-menu a, .main-header .navbar-right a { color: inherit; background: transparent; } } @media (max-width: 767px) { .main-header .navbar-right { float: none; } .navbar-collapse .main-header .navbar-right { margin: 7.5px -15px; } .main-header .navbar-right > li { color: inherit; border: 0; } } .main-header .sidebar-toggle { float: left; background-color: transparent; background-image: none; padding: 15px 15px; font-family: fontAwesome; } .main-header .sidebar-toggle:before { content: "\f0c9"; } .main-header .sidebar-toggle:hover { color: #fff; } .main-header .sidebar-toggle:focus, .main-header .sidebar-toggle:active { background: transparent; } .main-header .sidebar-toggle .icon-bar { display: none; } .main-header .navbar .nav > li.user > a > .fa, .main-header .navbar .nav > li.user > a > .glyphicon, .main-header .navbar .nav > li.user > a > .ion { margin-right: 5px; } .main-header .navbar .nav > li > a > .label { position: absolute; top: 9px; right: 7px; text-align: center; font-size: 9px; padding: 2px 3px; line-height: .9; } .main-header .logo { -webkit-transition: width 0.3s ease-in-out; -o-transition: width 0.3s ease-in-out; transition: width 0.3s ease-in-out; display: block; float: left; height: 50px; font-size: 20px; line-height: 50px; text-align: center; width: 230px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; padding: 0 15px; font-weight: 300; overflow: hidden; } .main-header .logo .logo-lg { display: block; } .main-header .logo .logo-mini { display: none; } .main-header .navbar-brand { color: #fff; } .content-header { position: relative; padding: 15px 15px 0 15px; } .content-header > h1 { margin: 0; font-size: 24px; } .content-header > h1 > small { font-size: 15px; display: inline-block; padding-left: 4px; font-weight: 300; } .content-header > .breadcrumb { float: right; background: transparent; margin-top: 0; margin-bottom: 0; font-size: 12px; padding: 7px 5px; position: absolute; top: 15px; right: 10px; border-radius: 2px; } .content-header > .breadcrumb > li > a { color: #444; text-decoration: none; display: inline-block; } .content-header > .breadcrumb > li > a > .fa, .content-header > .breadcrumb > li > a > .glyphicon, .content-header > .breadcrumb > li > a > .ion { margin-right: 5px; } .content-header > .breadcrumb > li + li:before { content: '>\00a0'; } @media (max-width: 991px) { .content-header > .breadcrumb { position: relative; margin-top: 5px; top: 0; right: 0; float: none; background: #d2d6de; padding-left: 10px; } .content-header > .breadcrumb li:before { color: #97a0b3; } } .navbar-toggle { color: #fff; border: 0; margin: 0; padding: 15px 15px; } @media (max-width: 991px) { .navbar-custom-menu .navbar-nav > li { float: left; } .navbar-custom-menu .navbar-nav { margin: 0; float: left; } .navbar-custom-menu .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; line-height: 20px; } } @media (max-width: 767px) { .main-header { position: relative; } .main-header .logo, .main-header .navbar { width: 100%; float: none; } .main-header .navbar { margin: 0; } .main-header .navbar-custom-menu { float: right; } } @media (max-width: 991px) { .navbar-collapse.pull-left { float: none !important; } .navbar-collapse.pull-left + .navbar-custom-menu { display: block; position: absolute; top: 0; right: 40px; } } /* * Component: Sidebar * ------------------ */ .main-sidebar { position: absolute; top: 0; left: 0; padding-top: 50px; min-height: 100%; width: 230px; z-index: 810; -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; } @media (max-width: 767px) { .main-sidebar { padding-top: 100px; } } @media (max-width: 767px) { .main-sidebar { -webkit-transform: translate(-230px, 0); -ms-transform: translate(-230px, 0); -o-transform: translate(-230px, 0); transform: translate(-230px, 0); } } @media (min-width: 768px) { .sidebar-collapse .main-sidebar { -webkit-transform: translate(-230px, 0); -ms-transform: translate(-230px, 0); -o-transform: translate(-230px, 0); transform: translate(-230px, 0); } } @media (max-width: 767px) { .sidebar-open .main-sidebar { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } } .sidebar { padding-bottom: 10px; } .sidebar-form input:focus { border-color: transparent; } .user-panel { position: relative; width: 100%; padding: 10px; overflow: hidden; } .user-panel:before, .user-panel:after { content: " "; display: table; } .user-panel:after { clear: both; } .user-panel > .image > img { width: 100%; max-width: 45px; height: auto; } .user-panel > .info { padding: 5px 5px 5px 15px; line-height: 1; position: absolute; left: 55px; } .user-panel > .info > p { font-weight: 600; margin-bottom: 9px; } .user-panel > .info > a { text-decoration: none; padding-right: 5px; margin-top: 3px; font-size: 11px; } .user-panel > .info > a > .fa, .user-panel > .info > a > .ion, .user-panel > .info > a > .glyphicon { margin-right: 3px; } .sidebar-menu { list-style: none; margin: 0; padding: 0; } .sidebar-menu > li { position: relative; margin: 0; padding: 0; } .sidebar-menu > li > a { padding: 12px 5px 12px 15px; display: block; } .sidebar-menu > li > a > .fa, .sidebar-menu > li > a > .glyphicon, .sidebar-menu > li > a > .ion { width: 20px; } .sidebar-menu > li .label, .sidebar-menu > li .badge { margin-right: 5px; } .sidebar-menu > li .badge { margin-top: 3px; } .sidebar-menu li.header { padding: 10px 25px 10px 15px; font-size: 12px; } .sidebar-menu li > a > .fa-angle-left, .sidebar-menu li > a > .pull-right-container > .fa-angle-left { width: auto; height: auto; padding: 0; margin-right: 10px; -webkit-transition: transform 0.5s ease; -o-transition: transform 0.5s ease; transition: transform 0.5s ease; } .sidebar-menu li > a > .fa-angle-left { position: absolute; top: 50%; right: 10px; margin-top: -8px; } .sidebar-menu .menu-open > a > .fa-angle-left, .sidebar-menu .menu-open > a > .pull-right-container > .fa-angle-left { -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); -o-transform: rotate(-90deg); transform: rotate(-90deg); } .sidebar-menu .active > .treeview-menu { display: block; } /* * Component: Sidebar Mini */ @media (min-width: 768px) { .sidebar-mini.sidebar-collapse .content-wrapper, .sidebar-mini.sidebar-collapse .right-side, .sidebar-mini.sidebar-collapse .main-footer { margin-left: 50px !important; z-index: 840; } .sidebar-mini.sidebar-collapse .main-sidebar { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); width: 50px !important; z-index: 850; } .sidebar-mini.sidebar-collapse .sidebar-menu > li { position: relative; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { margin-right: 0; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { border-top-right-radius: 4px; } .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { border-bottom-right-radius: 4px; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { padding-top: 5px; padding-bottom: 5px; border-bottom-right-radius: 4px; } .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, .sidebar-mini.sidebar-collapse .sidebar-form, .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, .sidebar-mini.sidebar-collapse .sidebar-menu li.header { display: none !important; -webkit-transform: translateZ(0); } .sidebar-mini.sidebar-collapse .main-header .logo { width: 50px; } .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { display: block; margin-left: -15px; margin-right: -15px; font-size: 18px; } .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { display: none; } .sidebar-mini.sidebar-collapse .main-header .navbar { margin-left: 50px; } } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { display: block !important; position: absolute; width: 180px; left: 50px; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span { top: 0; margin-left: -3px; padding: 12px 5px 12px 20px; background-color: inherit; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container { position: relative !important; float: right; width: auto !important; left: 180px !important; top: -22px !important; z-index: 900; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container > .label:not(:first-of-type) { display: none; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { top: 44px; margin-left: 0; } .sidebar-expanded-on-hover .main-footer, .sidebar-expanded-on-hover .content-wrapper { margin-left: 50px; } .sidebar-expanded-on-hover .main-sidebar { box-shadow: 3px 0 8px rgba(0, 0, 0, 0.125); } .sidebar-menu, .main-sidebar .user-panel, .sidebar-menu > li.header { white-space: nowrap; overflow: hidden; } .sidebar-menu:hover { overflow: visible; } .sidebar-form, .sidebar-menu > li.header { overflow: hidden; text-overflow: clip; } .sidebar-menu li > a { position: relative; } .sidebar-menu li > a > .pull-right-container { position: absolute; right: 10px; top: 50%; margin-top: -7px; } /* * Component: Control sidebar. By default, this is the right sidebar. */ .control-sidebar-bg { position: fixed; z-index: 1000; bottom: 0; } .control-sidebar-bg, .control-sidebar { top: 0; right: -230px; width: 230px; -webkit-transition: right 0.3s ease-in-out; -o-transition: right 0.3s ease-in-out; transition: right 0.3s ease-in-out; } .control-sidebar { position: absolute; padding-top: 50px; z-index: 1010; } @media (max-width: 767px) { .control-sidebar { padding-top: 100px; } } .control-sidebar > .tab-content { padding: 10px 15px; } .control-sidebar.control-sidebar-open, .control-sidebar.control-sidebar-open + .control-sidebar-bg { right: 0; } .control-sidebar-open .control-sidebar-bg, .control-sidebar-open .control-sidebar { right: 0; } @media (min-width: 768px) { .control-sidebar-open .content-wrapper, .control-sidebar-open .right-side, .control-sidebar-open .main-footer { margin-right: 230px; } } .fixed .control-sidebar { position: fixed; height: 100%; overflow-y: auto; padding-bottom: 50px; } .nav-tabs.control-sidebar-tabs > li:first-of-type > a, .nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, .nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { border-left-width: 0; } .nav-tabs.control-sidebar-tabs > li > a { border-radius: 0; } .nav-tabs.control-sidebar-tabs > li > a, .nav-tabs.control-sidebar-tabs > li > a:hover { border-top: none; border-right: none; border-left: 1px solid transparent; border-bottom: 1px solid transparent; } .nav-tabs.control-sidebar-tabs > li > a .icon { font-size: 16px; } .nav-tabs.control-sidebar-tabs > li.active > a, .nav-tabs.control-sidebar-tabs > li.active > a:hover, .nav-tabs.control-sidebar-tabs > li.active > a:focus, .nav-tabs.control-sidebar-tabs > li.active > a:active { border-top: none; border-right: none; border-bottom: none; } @media (max-width: 768px) { .nav-tabs.control-sidebar-tabs { display: table; } .nav-tabs.control-sidebar-tabs > li { display: table-cell; } } .control-sidebar-heading { font-weight: 400; font-size: 16px; padding: 10px 0; margin-bottom: 10px; } .control-sidebar-subheading { display: block; font-weight: 400; font-size: 14px; } .control-sidebar-menu { list-style: none; padding: 0; margin: 0 -15px; } .control-sidebar-menu > li > a { display: block; padding: 10px 15px; } .control-sidebar-menu > li > a:before, .control-sidebar-menu > li > a:after { content: " "; display: table; } .control-sidebar-menu > li > a:after { clear: both; } .control-sidebar-menu > li > a > .control-sidebar-subheading { margin-top: 0; } .control-sidebar-menu .menu-icon { float: left; width: 35px; height: 35px; border-radius: 50%; text-align: center; line-height: 35px; } .control-sidebar-menu .menu-info { margin-left: 45px; margin-top: 3px; } .control-sidebar-menu .menu-info > .control-sidebar-subheading { margin: 0; } .control-sidebar-menu .menu-info > p { margin: 0; font-size: 11px; } .control-sidebar-menu .progress { margin: 0; } .control-sidebar-dark { color: #b8c7ce; } .control-sidebar-dark, .control-sidebar-dark + .control-sidebar-bg { background: #222d32; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs { border-bottom: #1c2529; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { background: #181f23; color: #b8c7ce; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { border-left-color: #141a1d; border-bottom-color: #141a1d; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { background: #1c2529; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { color: #fff; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { background: #222d32; color: #fff; } .control-sidebar-dark .control-sidebar-heading, .control-sidebar-dark .control-sidebar-subheading { color: #fff; } .control-sidebar-dark .control-sidebar-menu > li > a:hover { background: #1e282c; } .control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { color: #b8c7ce; } .control-sidebar-light { color: #5e5e5e; } .control-sidebar-light, .control-sidebar-light + .control-sidebar-bg { background: #f9fafc; border-left: 1px solid #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs { border-bottom: #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { background: #e8ecf4; color: #444444; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { border-left-color: #d2d6de; border-bottom-color: #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { background: #eff1f7; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { background: #f9fafc; color: #111; } .control-sidebar-light .control-sidebar-heading, .control-sidebar-light .control-sidebar-subheading { color: #111; } .control-sidebar-light .control-sidebar-menu { margin-left: -14px; } .control-sidebar-light .control-sidebar-menu > li > a:hover { background: #f4f4f5; } .control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { color: #5e5e5e; } /* * Component: Dropdown menus * ------------------------- */ /*Dropdowns in general*/ .dropdown-menu { box-shadow: none; border-color: #eee; } .dropdown-menu > li > a { color: #777; } .dropdown-menu > li > a > .glyphicon, .dropdown-menu > li > a > .fa, .dropdown-menu > li > a > .ion { margin-right: 10px; } .dropdown-menu > li > a:hover { background-color: #e1e3e9; color: #333; } .dropdown-menu > .divider { background-color: #eee; } .navbar-nav > .notifications-menu > .dropdown-menu, .navbar-nav > .messages-menu > .dropdown-menu, .navbar-nav > .tasks-menu > .dropdown-menu { width: 280px; padding: 0 0 0 0; margin: 0; top: 100%; } .navbar-nav > .notifications-menu > .dropdown-menu > li, .navbar-nav > .messages-menu > .dropdown-menu > li, .navbar-nav > .tasks-menu > .dropdown-menu > li { position: relative; } .navbar-nav > .notifications-menu > .dropdown-menu > li.header, .navbar-nav > .messages-menu > .dropdown-menu > li.header, .navbar-nav > .tasks-menu > .dropdown-menu > li.header { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; background-color: #ffffff; padding: 7px 10px; border-bottom: 1px solid #f4f4f4; color: #444444; font-size: 14px; } .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; font-size: 12px; background-color: #fff; padding: 7px 10px; border-bottom: 1px solid #eeeeee; color: #444 !important; text-align: center; } @media (max-width: 991px) { .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { background: #fff !important; color: #444 !important; } } .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { text-decoration: none; font-weight: normal; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu, .navbar-nav > .messages-menu > .dropdown-menu > li .menu, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu { max-height: 200px; margin: 0; padding: 0; list-style: none; overflow-x: hidden; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { display: block; white-space: nowrap; /* Prevent text from breaking */ border-bottom: 1px solid #f4f4f4; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { background: #f4f4f4; text-decoration: none; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { color: #444444; overflow: hidden; text-overflow: ellipsis; padding: 10px; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { width: 20px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { margin: 0; padding: 10px 10px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { margin: auto 10px auto auto; width: 40px; height: 40px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { padding: 0; margin: 0 0 0 45px; color: #444444; font-size: 15px; position: relative; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { color: #999999; font-size: 10px; position: absolute; top: 0; right: 0; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { margin: 0 0 0 45px; font-size: 12px; color: #888888; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { content: " "; display: table; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { clear: both; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { padding: 10px; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { font-size: 14px; padding: 0; margin: 0 0 10px 0; color: #666666; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { padding: 0; margin: 0; } .navbar-nav > .user-menu > .dropdown-menu { border-top-right-radius: 0; border-top-left-radius: 0; padding: 1px 0 0 0; border-top-width: 0; width: 280px; } .navbar-nav > .user-menu > .dropdown-menu, .navbar-nav > .user-menu > .dropdown-menu > .user-body { border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header { height: 175px; padding: 10px; text-align: center; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { z-index: 5; height: 90px; width: 90px; border: 3px solid; border-color: transparent; border-color: rgba(255, 255, 255, 0.2); } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { z-index: 5; color: #fff; color: rgba(255, 255, 255, 0.8); font-size: 17px; margin-top: 10px; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { display: block; font-size: 12px; } .navbar-nav > .user-menu > .dropdown-menu > .user-body { padding: 15px; border-bottom: 1px solid #f4f4f4; border-top: 1px solid #dddddd; } .navbar-nav > .user-menu > .dropdown-menu > .user-body:before, .navbar-nav > .user-menu > .dropdown-menu > .user-body:after { content: " "; display: table; } .navbar-nav > .user-menu > .dropdown-menu > .user-body:after { clear: both; } .navbar-nav > .user-menu > .dropdown-menu > .user-body a { color: #444 !important; } @media (max-width: 991px) { .navbar-nav > .user-menu > .dropdown-menu > .user-body a { background: #fff !important; color: #444 !important; } } .navbar-nav > .user-menu > .dropdown-menu > .user-footer { background-color: #f9f9f9; padding: 10px; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { content: " "; display: table; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { clear: both; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { color: #666666; } @media (max-width: 991px) { .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { background-color: #f9f9f9; } } .navbar-nav > .user-menu .user-image { float: left; width: 25px; height: 25px; border-radius: 50%; margin-right: 10px; margin-top: -2px; } @media (max-width: 767px) { .navbar-nav > .user-menu .user-image { float: none; margin-right: 0; margin-top: -8px; line-height: 10px; } } /* Add fade animation to dropdown menus by appending the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ .open:not(.dropup) > .animated-dropdown-menu { backface-visibility: visible !important; -webkit-animation: flipInX 0.7s both; -o-animation: flipInX 0.7s both; animation: flipInX 0.7s both; } @keyframes flipInX { 0% { transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transition-timing-function: ease-in; opacity: 0; } 40% { transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transition-timing-function: ease-in; } 60% { transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { transform: perspective(400px); } } @-webkit-keyframes flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); -webkit-transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); -webkit-transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { -webkit-transform: perspective(400px); } } /* Fix dropdown menu in navbars */ .navbar-custom-menu > .navbar-nav > li { position: relative; } .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { position: absolute; right: 0; left: auto; } @media (max-width: 991px) { .navbar-custom-menu > .navbar-nav { float: right; } .navbar-custom-menu > .navbar-nav > li { position: static; } .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { position: absolute; right: 5%; left: auto; border: 1px solid #ddd; background: #fff; } } /* * Component: Form * --------------- */ .form-control { /*border-radius: 0;*/ /*box-shadow: none;*/ /*border-color: #d2d6de;*/ } .form-control:focus { border-color: #3c8dbc; box-shadow: none; } .form-control::-moz-placeholder, .form-control:-ms-input-placeholder, .form-control::-webkit-input-placeholder { color: #bbb; opacity: 1; } .form-control:not(select) { -webkit-appearance: none; -moz-appearance: none; appearance: none; } .form-group.has-success label { color: #00a65a; } .form-group.has-success .form-control, .form-group.has-success .input-group-addon { border-color: #00a65a; box-shadow: none; } .form-group.has-success .help-block { color: #00a65a; } .form-group.has-warning label { color: #f39c12; } .form-group.has-warning .form-control, .form-group.has-warning .input-group-addon { border-color: #f39c12; box-shadow: none; } .form-group.has-warning .help-block { color: #f39c12; } .form-group.has-error label { color: #dd4b39; } .form-group.has-error .form-control, .form-group.has-error .input-group-addon { border-color: #dd4b39; box-shadow: none; } .form-group.has-error .help-block { color: #dd4b39; } /* Input group */ .input-group .input-group-addon { border-radius: 0; border-color: #d2d6de; background-color: #fff; } /* button groups */ .btn-group-vertical .btn.btn-flat:first-of-type, .btn-group-vertical .btn.btn-flat:last-of-type { border-radius: 0; } .icheck > label { padding-left: 0; } /* support Font Awesome icons in form-control */ .form-control-feedback.fa { line-height: 34px; } .input-lg + .form-control-feedback.fa, .input-group-lg + .form-control-feedback.fa, .form-group-lg .form-control + .form-control-feedback.fa { line-height: 46px; } .input-sm + .form-control-feedback.fa, .input-group-sm + .form-control-feedback.fa, .form-group-sm .form-control + .form-control-feedback.fa { line-height: 30px; } /* * Component: Progress Bar * ----------------------- */ .progress, .progress > .progress-bar { -webkit-box-shadow: none; box-shadow: none; } .progress, .progress > .progress-bar, .progress .progress-bar, .progress > .progress-bar .progress-bar { border-radius: 1px; } /* size variation */ .progress.sm, .progress-sm { height: 10px; } .progress.sm, .progress-sm, .progress.sm .progress-bar, .progress-sm .progress-bar { border-radius: 1px; } .progress.xs, .progress-xs { height: 7px; } .progress.xs, .progress-xs, .progress.xs .progress-bar, .progress-xs .progress-bar { border-radius: 1px; } .progress.xxs, .progress-xxs { height: 3px; } .progress.xxs, .progress-xxs, .progress.xxs .progress-bar, .progress-xxs .progress-bar { border-radius: 1px; } /* Vertical bars */ .progress.vertical { position: relative; width: 30px; height: 200px; display: inline-block; margin-right: 10px; } .progress.vertical > .progress-bar { width: 100%; position: absolute; bottom: 0; } .progress.vertical.sm, .progress.vertical.progress-sm { width: 20px; } .progress.vertical.xs, .progress.vertical.progress-xs { width: 10px; } .progress.vertical.xxs, .progress.vertical.progress-xxs { width: 3px; } .progress-group .progress-text { font-weight: 600; } .progress-group .progress-number { float: right; } /* Remove margins from progress bars when put in a table */ .table tr > td .progress { margin: 0; } .progress-bar-light-blue, .progress-bar-primary { background-color: #3c8dbc; } .progress-striped .progress-bar-light-blue, .progress-striped .progress-bar-primary { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-green, .progress-bar-success { background-color: #00a65a; } .progress-striped .progress-bar-green, .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-aqua, .progress-bar-info { background-color: #00c0ef; } .progress-striped .progress-bar-aqua, .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-yellow, .progress-bar-warning { background-color: #f39c12; } .progress-striped .progress-bar-yellow, .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-red, .progress-bar-danger { background-color: #dd4b39; } .progress-striped .progress-bar-red, .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } /* * Component: Small Box * -------------------- */ .small-box { border-radius: 2px; position: relative; display: block; margin-bottom: 20px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .small-box > .inner { padding: 10px; } .small-box > .small-box-footer { position: relative; text-align: center; padding: 3px 0; color: #fff; color: rgba(255, 255, 255, 0.8); display: block; z-index: 10; background: rgba(0, 0, 0, 0.1); text-decoration: none; } .small-box > .small-box-footer:hover { color: #fff; background: rgba(0, 0, 0, 0.15); } .small-box h3 { font-size: 38px; font-weight: bold; margin: 0 0 10px 0; white-space: nowrap; padding: 0; } .small-box p { font-size: 15px; } .small-box p > small { display: block; color: #f9f9f9; font-size: 13px; margin-top: 5px; } .small-box h3, .small-box p { z-index: 5; } .small-box .icon { -webkit-transition: all 0.3s linear; -o-transition: all 0.3s linear; transition: all 0.3s linear; position: absolute; top: -10px; right: 10px; z-index: 0; font-size: 90px; color: rgba(0, 0, 0, 0.15); } .small-box:hover { text-decoration: none; color: #f9f9f9; } .small-box:hover .icon { font-size: 95px; } @media (max-width: 767px) { .small-box { text-align: center; } .small-box .icon { display: none; } .small-box p { font-size: 12px; } } /* * Component: Box * -------------- */ .box { position: relative; border-radius: 3px; background: #ffffff; border-top: 3px solid #d2d6de; margin-bottom: 20px; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .box.box-primary { border-top-color: #3c8dbc; } .box.box-info { border-top-color: #00c0ef; } .box.box-danger { border-top-color: #dd4b39; } .box.box-warning { border-top-color: #f39c12; } .box.box-success { border-top-color: #00a65a; } .box.box-default { border-top-color: #d2d6de; } .box.collapsed-box .box-body, .box.collapsed-box .box-footer { display: none; } .box .nav-stacked > li { border-bottom: 1px solid #f4f4f4; margin: 0; } .box .nav-stacked > li:last-of-type { border-bottom: none; } .box.height-control .box-body { max-height: 300px; overflow: auto; } .box .border-right { border-right: 1px solid #f4f4f4; } .box .border-left { border-left: 1px solid #f4f4f4; } .box.box-solid { border-top: 0; } .box.box-solid > .box-header .btn.btn-default { background: transparent; } .box.box-solid > .box-header .btn:hover, .box.box-solid > .box-header a:hover { background: rgba(0, 0, 0, 0.1); } .box.box-solid.box-default { border: 1px solid #d2d6de; } .box.box-solid.box-default > .box-header { color: #444444; background: #d2d6de; background-color: #d2d6de; } .box.box-solid.box-default > .box-header a, .box.box-solid.box-default > .box-header .btn { color: #444444; } .box.box-solid.box-primary { border: 1px solid #3c8dbc; } .box.box-solid.box-primary > .box-header { color: #ffffff; background: #3c8dbc; background-color: #3c8dbc; } .box.box-solid.box-primary > .box-header a, .box.box-solid.box-primary > .box-header .btn { color: #ffffff; } .box.box-solid.box-info { border: 1px solid #00c0ef; } .box.box-solid.box-info > .box-header { color: #ffffff; background: #00c0ef; background-color: #00c0ef; } .box.box-solid.box-info > .box-header a, .box.box-solid.box-info > .box-header .btn { color: #ffffff; } .box.box-solid.box-danger { border: 1px solid #dd4b39; } .box.box-solid.box-danger > .box-header { color: #ffffff; background: #dd4b39; background-color: #dd4b39; } .box.box-solid.box-danger > .box-header a, .box.box-solid.box-danger > .box-header .btn { color: #ffffff; } .box.box-solid.box-warning { border: 1px solid #f39c12; } .box.box-solid.box-warning > .box-header { color: #ffffff; background: #f39c12; background-color: #f39c12; } .box.box-solid.box-warning > .box-header a, .box.box-solid.box-warning > .box-header .btn { color: #ffffff; } .box.box-solid.box-success { border: 1px solid #00a65a; } .box.box-solid.box-success > .box-header { color: #ffffff; background: #00a65a; background-color: #00a65a; } .box.box-solid.box-success > .box-header a, .box.box-solid.box-success > .box-header .btn { color: #ffffff; } .box.box-solid > .box-header > .box-tools .btn { border: 0; box-shadow: none; } .box.box-solid[class*='bg'] > .box-header { color: #fff; } .box .box-group > .box { margin-bottom: 5px; } .box .knob-label { text-align: center; color: #333; font-weight: 100; font-size: 12px; margin-bottom: 0.3em; } .box > .overlay, .overlay-wrapper > .overlay, .box > .loading-img, .overlay-wrapper > .loading-img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .box .overlay, .overlay-wrapper .overlay { z-index: 50; background: rgba(255, 255, 255, 0.7); border-radius: 3px; } .box .overlay > .fa, .overlay-wrapper .overlay > .fa { position: absolute; top: 50%; left: 50%; margin-left: -15px; margin-top: -15px; color: #000; font-size: 30px; } .box .overlay.dark, .overlay-wrapper .overlay.dark { background: rgba(0, 0, 0, 0.5); } .box-header:before, .box-body:before, .box-footer:before, .box-header:after, .box-body:after, .box-footer:after { content: " "; display: table; } .box-header:after, .box-body:after, .box-footer:after { clear: both; } .box-header { color: #444; display: block; padding: 10px; position: relative; } .box-header.with-border { border-bottom: 1px solid #f4f4f4; } .collapsed-box .box-header.with-border { border-bottom: none; } .box-header > .fa, .box-header > .glyphicon, .box-header > .ion, .box-header .box-title { display: inline-block; font-size: 18px; margin: 0; line-height: 1; } .box-header > .fa, .box-header > .glyphicon, .box-header > .ion { margin-right: 5px; } .box-header > .box-tools { position: absolute; right: 10px; top: 5px; } .box-header > .box-tools [data-toggle="tooltip"] { position: relative; } .box-header > .box-tools.pull-right .dropdown-menu { right: 0; left: auto; } .box-header > .box-tools .dropdown-menu > li > a { color: #444!important; } .btn-box-tool { padding: 5px; font-size: 12px; background: transparent; color: #97a0b3; } .open .btn-box-tool, .btn-box-tool:hover { color: #606c84; } .btn-box-tool.btn:active { box-shadow: none; } .box-body { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 10px; } .no-header .box-body { border-top-right-radius: 3px; border-top-left-radius: 3px; } .box-body > .table { margin-bottom: 0; } .box-body .fc { margin-top: 5px; } .box-body .full-width-chart { margin: -19px; } .box-body.no-padding .full-width-chart { margin: -9px; } .box-body .box-pane { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 3px; } .box-body .box-pane-right { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 0; } .box-footer { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border-top: 1px solid #f4f4f4; padding: 10px; background-color: #ffffff; } .chart-legend { margin: 10px 0; } @media (max-width: 991px) { .chart-legend > li { float: left; margin-right: 10px; } } .box-comments { background: #f7f7f7; } .box-comments .box-comment { padding: 8px 0; border-bottom: 1px solid #eee; } .box-comments .box-comment:before, .box-comments .box-comment:after { content: " "; display: table; } .box-comments .box-comment:after { clear: both; } .box-comments .box-comment:last-of-type { border-bottom: 0; } .box-comments .box-comment:first-of-type { padding-top: 0; } .box-comments .box-comment img { float: left; } .box-comments .comment-text { margin-left: 40px; color: #555; } .box-comments .username { color: #444; display: block; font-weight: 600; } .box-comments .text-muted { font-weight: 400; font-size: 12px; } /* Widget: TODO LIST */ .todo-list { margin: 0; padding: 0; list-style: none; overflow: auto; } .todo-list > li { border-radius: 2px; padding: 10px; background: #f4f4f4; margin-bottom: 2px; border-left: 2px solid #e6e7e8; color: #444; } .todo-list > li:last-of-type { margin-bottom: 0; } .todo-list > li > input[type='checkbox'] { margin: 0 10px 0 5px; } .todo-list > li .text { display: inline-block; margin-left: 5px; font-weight: 600; } .todo-list > li .label { margin-left: 10px; font-size: 9px; } .todo-list > li .tools { display: none; float: right; color: #dd4b39; } .todo-list > li .tools > .fa, .todo-list > li .tools > .glyphicon, .todo-list > li .tools > .ion { margin-right: 5px; cursor: pointer; } .todo-list > li:hover .tools { display: inline-block; } .todo-list > li.done { color: #999; } .todo-list > li.done .text { text-decoration: line-through; font-weight: 500; } .todo-list > li.done .label { background: #d2d6de !important; } .todo-list .danger { border-left-color: #dd4b39; } .todo-list .warning { border-left-color: #f39c12; } .todo-list .info { border-left-color: #00c0ef; } .todo-list .success { border-left-color: #00a65a; } .todo-list .primary { border-left-color: #3c8dbc; } .todo-list .handle { display: inline-block; cursor: move; margin: 0 5px; } /* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ .chat { padding: 5px 20px 5px 10px; } .chat .item { margin-bottom: 10px; } .chat .item:before, .chat .item:after { content: " "; display: table; } .chat .item:after { clear: both; } .chat .item > img { width: 40px; height: 40px; border: 2px solid transparent; border-radius: 50%; } .chat .item > .online { border: 2px solid #00a65a; } .chat .item > .offline { border: 2px solid #dd4b39; } .chat .item > .message { margin-left: 55px; margin-top: -40px; } .chat .item > .message > .name { display: block; font-weight: 600; } .chat .item > .attachment { border-radius: 3px; background: #f4f4f4; margin-left: 65px; margin-right: 15px; padding: 10px; } .chat .item > .attachment > h4 { margin: 0 0 5px 0; font-weight: 600; font-size: 14px; } .chat .item > .attachment > p, .chat .item > .attachment > .filename { font-weight: 600; font-size: 13px; font-style: italic; margin: 0; } .chat .item > .attachment:before, .chat .item > .attachment:after { content: " "; display: table; } .chat .item > .attachment:after { clear: both; } .box-input { max-width: 200px; } .modal .panel-body { color: #444; } /* * Component: Info Box * ------------------- */ .info-box { display: block; min-height: 90px; background: #fff; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 2px; margin-bottom: 15px; } .info-box small { font-size: 14px; } .info-box .progress { background: rgba(0, 0, 0, 0.2); margin: 5px -10px 5px -10px; height: 2px; } .info-box .progress, .info-box .progress .progress-bar { border-radius: 0; } .info-box .progress .progress-bar { background: #fff; } .info-box-icon { border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; display: block; float: left; height: 90px; width: 90px; text-align: center; font-size: 45px; line-height: 90px; background: rgba(0, 0, 0, 0.2); } .info-box-icon > img { max-width: 100%; } .info-box-content { padding: 5px 10px; margin-left: 90px; } .info-box-number { display: block; font-weight: bold; font-size: 18px; } .progress-description, .info-box-text { display: block; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .info-box-text { text-transform: uppercase; } .info-box-more { display: block; } .progress-description { margin: 0; } /* * Component: Timeline * ------------------- */ .timeline { position: relative; margin: 0 0 30px 0; padding: 0; list-style: none; } .timeline:before { content: ''; position: absolute; top: 0; bottom: 0; width: 4px; background: #ddd; left: 31px; margin: 0; border-radius: 2px; } .timeline > li { position: relative; margin-right: 10px; margin-bottom: 15px; } .timeline > li:before, .timeline > li:after { content: " "; display: table; } .timeline > li:after { clear: both; } .timeline > li > .timeline-item { -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; margin-top: 0; background: #fff; color: #444; margin-left: 60px; margin-right: 15px; padding: 0; position: relative; } .timeline > li > .timeline-item > .time { color: #999; float: right; padding: 10px; font-size: 12px; } .timeline > li > .timeline-item > .timeline-header { margin: 0; color: #555; border-bottom: 1px solid #f4f4f4; padding: 10px; font-size: 16px; line-height: 1.1; } .timeline > li > .timeline-item > .timeline-header > a { font-weight: 600; } .timeline > li > .timeline-item > .timeline-body, .timeline > li > .timeline-item > .timeline-footer { padding: 10px; } .timeline > li > .fa, .timeline > li > .glyphicon, .timeline > li > .ion { width: 30px; height: 30px; font-size: 15px; line-height: 30px; position: absolute; color: #666; background: #d2d6de; border-radius: 50%; text-align: center; left: 18px; top: 0; } .timeline > .time-label > span { font-weight: 600; padding: 5px; display: inline-block; background-color: #fff; border-radius: 4px; } .timeline-inverse > li > .timeline-item { background: #f0f0f0; border: 1px solid #ddd; -webkit-box-shadow: none; box-shadow: none; } .timeline-inverse > li > .timeline-item > .timeline-header { border-bottom-color: #ddd; } /* * Component: Button * ----------------- */ .btn { border-radius: 3px; -webkit-box-shadow: none; box-shadow: none; border: 1px solid transparent; } .btn.uppercase { text-transform: uppercase; } .btn.btn-flat { border-radius: 0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; border-width: 1px; } .btn:active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn:focus { outline: none; } .btn.btn-file { position: relative; overflow: hidden; } .btn.btn-file > input[type='file'] { position: absolute; top: 0; right: 0; min-width: 100%; min-height: 100%; font-size: 100px; text-align: right; opacity: 0; filter: alpha(opacity=0); outline: none; background: white; cursor: inherit; display: block; } .btn-default { background-color: #f4f4f4; color: #444; border-color: #ddd; } .btn-default:hover, .btn-default:active, .btn-default.hover { background-color: #e7e7e7; } .btn-primary { background-color: #3c8dbc; border-color: #367fa9; } .btn-primary:hover, .btn-primary:active, .btn-primary.hover { background-color: #367fa9; } .btn-success { background-color: #00a65a; border-color: #008d4c; } .btn-success:hover, .btn-success:active, .btn-success.hover { background-color: #008d4c; } .btn-info { background-color: #00c0ef; border-color: #00acd6; } .btn-info:hover, .btn-info:active, .btn-info.hover { background-color: #00acd6; } .btn-danger { background-color: #dd4b39; border-color: #d73925; } .btn-danger:hover, .btn-danger:active, .btn-danger.hover { background-color: #d73925; } .btn-warning { background-color: #f39c12; border-color: #e08e0b; } .btn-warning:hover, .btn-warning:active, .btn-warning.hover { background-color: #e08e0b; } .btn-outline { border: 1px solid #fff; background: transparent; color: #fff; } .btn-outline:hover, .btn-outline:focus, .btn-outline:active { color: rgba(255, 255, 255, 0.7); border-color: rgba(255, 255, 255, 0.7); } .btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn[class*='bg-']:hover { -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); } .btn-app { border-radius: 3px; position: relative; padding: 15px 5px; margin: 0 0 10px 10px; min-width: 80px; height: 60px; text-align: center; color: #666; border: 1px solid #ddd; background-color: #f4f4f4; font-size: 12px; } .btn-app > .fa, .btn-app > .glyphicon, .btn-app > .ion { font-size: 20px; display: block; } .btn-app:hover { background: #f4f4f4; color: #444; border-color: #aaa; } .btn-app:active, .btn-app:focus { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-app > .badge { position: absolute; top: -3px; right: -10px; font-size: 10px; font-weight: 400; } /* * Component: Callout * ------------------ */ .callout { border-radius: 3px; margin: 0 0 20px 0; padding: 15px 30px 15px 15px; border-left: 5px solid #eee; } .callout a { color: #fff; text-decoration: underline; } .callout a:hover { color: #eee; } .callout h4 { margin-top: 0; font-weight: 600; } .callout p:last-child { margin-bottom: 0; } .callout code, .callout .highlight { background-color: #fff; } .callout.callout-danger { border-color: #c23321; } .callout.callout-warning { border-color: #c87f0a; } .callout.callout-info { border-color: #0097bc; } .callout.callout-success { border-color: #00733e; } /* * Component: alert * ---------------- */ .alert { border-radius: 3px; } .alert h4 { font-weight: 600; } .alert .icon { margin-right: 10px; } .alert .close { color: #000; opacity: 0.2; filter: alpha(opacity=20); } .alert .close:hover { opacity: 0.5; filter: alpha(opacity=50); } .alert a { color: #fff; text-decoration: underline; } .alert-success { border-color: #008d4c; } .alert-danger, .alert-error { border-color: #d73925; } .alert-warning { border-color: #e08e0b; } .alert-info { border-color: #00acd6; } /* * Component: Nav * -------------- */ .nav > li > a:hover, .nav > li > a:active, .nav > li > a:focus { color: #444; background: #f7f7f7; } /* NAV PILLS */ .nav-pills > li > a { border-radius: 0; border-top: 3px solid transparent; color: #444; } .nav-pills > li > a > .fa, .nav-pills > li > a > .glyphicon, .nav-pills > li > a > .ion { margin-right: 5px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { border-top-color: #3c8dbc; } .nav-pills > li.active > a { font-weight: 600; } /* NAV STACKED */ .nav-stacked > li > a { border-radius: 0; border-top: 0; border-left: 3px solid transparent; color: #444; } .nav-stacked > li.active > a, .nav-stacked > li.active > a:hover { background: transparent; color: #444; border-top: 0; border-left-color: #3c8dbc; } .nav-stacked > li.header { border-bottom: 1px solid #ddd; color: #777; margin-bottom: 10px; padding: 5px 10px; text-transform: uppercase; } /* NAV TABS */ .nav-tabs-custom { margin-bottom: 20px; background: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; } .nav-tabs-custom > .nav-tabs { margin: 0; border-bottom-color: #f4f4f4; border-top-right-radius: 3px; border-top-left-radius: 3px; } .nav-tabs-custom > .nav-tabs > li { border-top: 3px solid transparent; margin-bottom: -2px; margin-right: 5px; } .nav-tabs-custom > .nav-tabs > li.disabled > a { color: #777; } .nav-tabs-custom > .nav-tabs > li > a { color: #444; border-radius: 0; } .nav-tabs-custom > .nav-tabs > li > a.text-muted { color: #999; } .nav-tabs-custom > .nav-tabs > li > a, .nav-tabs-custom > .nav-tabs > li > a:hover { background: transparent; margin: 0; } .nav-tabs-custom > .nav-tabs > li > a:hover { color: #999; } .nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, .nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, .nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { border-color: transparent; } .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #3c8dbc; } .nav-tabs-custom > .nav-tabs > li.active > a, .nav-tabs-custom > .nav-tabs > li.active:hover > a { background-color: #fff; color: #444; } .nav-tabs-custom > .nav-tabs > li.active > a { border-top-color: transparent; border-left-color: #f4f4f4; border-right-color: #f4f4f4; } .nav-tabs-custom > .nav-tabs > li:first-of-type { margin-left: 0; } .nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { border-left-color: transparent; } .nav-tabs-custom > .nav-tabs.pull-right { float: none !important; } .nav-tabs-custom > .nav-tabs.pull-right > li { float: right; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { margin-right: 0; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { border-left-width: 1px; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { border-left-color: #f4f4f4; border-right-color: transparent; } .nav-tabs-custom > .nav-tabs > li.header { line-height: 35px; padding: 0 10px; font-size: 20px; color: #444; } .nav-tabs-custom > .nav-tabs > li.header > .fa, .nav-tabs-custom > .nav-tabs > li.header > .glyphicon, .nav-tabs-custom > .nav-tabs > li.header > .ion { margin-right: 5px; } .nav-tabs-custom > .tab-content { background: #fff; padding: 10px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .nav-tabs-custom .dropdown.open > a:active, .nav-tabs-custom .dropdown.open > a:focus { background: transparent; color: #999; } .nav-tabs-custom.tab-primary > .nav-tabs > li.active { border-top-color: #3c8dbc; } .nav-tabs-custom.tab-info > .nav-tabs > li.active { border-top-color: #00c0ef; } .nav-tabs-custom.tab-danger > .nav-tabs > li.active { border-top-color: #dd4b39; } .nav-tabs-custom.tab-warning > .nav-tabs > li.active { border-top-color: #f39c12; } .nav-tabs-custom.tab-success > .nav-tabs > li.active { border-top-color: #00a65a; } .nav-tabs-custom.tab-default > .nav-tabs > li.active { border-top-color: #d2d6de; } /* PAGINATION */ .pagination > li > a { background: #fafafa; color: #666; } .pagination.pagination-flat > li > a { border-radius: 0 !important; } /* * Component: Products List * ------------------------ */ .products-list { list-style: none; margin: 0; padding: 0; } .products-list > .item { border-radius: 3px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); padding: 10px 0; background: #fff; } .products-list > .item:before, .products-list > .item:after { content: " "; display: table; } .products-list > .item:after { clear: both; } .products-list .product-img { float: left; } .products-list .product-img img { width: 50px; height: 50px; } .products-list .product-info { margin-left: 60px; } .products-list .product-title { font-weight: 600; } .products-list .product-description { display: block; color: #999; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .product-list-in-box > .item { -webkit-box-shadow: none; box-shadow: none; border-radius: 0; border-bottom: 1px solid #f4f4f4; } .product-list-in-box > .item:last-of-type { border-bottom-width: 0; } /* * Component: Table * ---------------- */ .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { border-top: 1px solid #f4f4f4; } .table > thead > tr > th { border-bottom: 2px solid #f4f4f4; } .table tr td .progress { margin-top: 5px; } .table-bordered { border: 1px solid #f4f4f4; } .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 #f4f4f4; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table.no-border, .table.no-border td, .table.no-border th { border: 0; } /* .text-center in tables */ table.text-center, table.text-center td, table.text-center th { text-align: center; } .table.align th { text-align: left; } .table.align td { text-align: right; } /* * Component: Label * ---------------- */ .label-default { background-color: #d2d6de; color: #444; } /* * Component: Direct Chat * ---------------------- */ .direct-chat .box-body { border-bottom-right-radius: 0; border-bottom-left-radius: 0; position: relative; overflow-x: hidden; padding: 0; } .direct-chat.chat-pane-open .direct-chat-contacts { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .direct-chat-messages { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); padding: 10px; height: 250px; overflow: auto; } .direct-chat-msg, .direct-chat-text { display: block; } .direct-chat-msg { margin-bottom: 10px; } .direct-chat-msg:before, .direct-chat-msg:after { content: " "; display: table; } .direct-chat-msg:after { clear: both; } .direct-chat-messages, .direct-chat-contacts { -webkit-transition: -webkit-transform 0.5s ease-in-out; -moz-transition: -moz-transform 0.5s ease-in-out; -o-transition: -o-transform 0.5s ease-in-out; transition: transform 0.5s ease-in-out; } .direct-chat-text { border-radius: 5px; position: relative; padding: 5px 10px; background: #d2d6de; border: 1px solid #d2d6de; margin: 5px 0 0 50px; color: #444444; } .direct-chat-text:after, .direct-chat-text:before { position: absolute; right: 100%; top: 15px; border: solid transparent; border-right-color: #d2d6de; content: ' '; height: 0; width: 0; pointer-events: none; } .direct-chat-text:after { border-width: 5px; margin-top: -5px; } .direct-chat-text:before { border-width: 6px; margin-top: -6px; } .right .direct-chat-text { margin-right: 50px; margin-left: 0; } .right .direct-chat-text:after, .right .direct-chat-text:before { right: auto; left: 100%; border-right-color: transparent; border-left-color: #d2d6de; } .direct-chat-img { border-radius: 50%; float: left; width: 40px; height: 40px; } .right .direct-chat-img { float: right; } .direct-chat-info { display: block; margin-bottom: 2px; font-size: 12px; } .direct-chat-name { font-weight: 600; } .direct-chat-timestamp { color: #999; } .direct-chat-contacts-open .direct-chat-contacts { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .direct-chat-contacts { -webkit-transform: translate(101%, 0); -ms-transform: translate(101%, 0); -o-transform: translate(101%, 0); transform: translate(101%, 0); position: absolute; top: 0; bottom: 0; height: 250px; width: 100%; background: #222d32; color: #fff; overflow: auto; } .contacts-list > li { border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 10px; margin: 0; } .contacts-list > li:before, .contacts-list > li:after { content: " "; display: table; } .contacts-list > li:after { clear: both; } .contacts-list > li:last-of-type { border-bottom: none; } .contacts-list-img { border-radius: 50%; width: 40px; float: left; } .contacts-list-info { margin-left: 45px; color: #fff; } .contacts-list-name, .contacts-list-status { display: block; } .contacts-list-name { font-weight: 600; } .contacts-list-status { font-size: 12px; } .contacts-list-date { color: #aaa; font-weight: normal; } .contacts-list-msg { color: #999; } .direct-chat-danger .right > .direct-chat-text { background: #dd4b39; border-color: #dd4b39; color: #ffffff; } .direct-chat-danger .right > .direct-chat-text:after, .direct-chat-danger .right > .direct-chat-text:before { border-left-color: #dd4b39; } .direct-chat-primary .right > .direct-chat-text { background: #3c8dbc; border-color: #3c8dbc; color: #ffffff; } .direct-chat-primary .right > .direct-chat-text:after, .direct-chat-primary .right > .direct-chat-text:before { border-left-color: #3c8dbc; } .direct-chat-warning .right > .direct-chat-text { background: #f39c12; border-color: #f39c12; color: #ffffff; } .direct-chat-warning .right > .direct-chat-text:after, .direct-chat-warning .right > .direct-chat-text:before { border-left-color: #f39c12; } .direct-chat-info .right > .direct-chat-text { background: #00c0ef; border-color: #00c0ef; color: #ffffff; } .direct-chat-info .right > .direct-chat-text:after, .direct-chat-info .right > .direct-chat-text:before { border-left-color: #00c0ef; } .direct-chat-success .right > .direct-chat-text { background: #00a65a; border-color: #00a65a; color: #ffffff; } .direct-chat-success .right > .direct-chat-text:after, .direct-chat-success .right > .direct-chat-text:before { border-left-color: #00a65a; } /* * Component: Users List * --------------------- */ .users-list > li { width: 25%; float: left; padding: 10px; text-align: center; } .users-list > li img { border-radius: 50%; max-width: 100%; height: auto; } .users-list > li > a:hover, .users-list > li > a:hover .users-list-name { color: #999; } .users-list-name, .users-list-date { display: block; } .users-list-name { font-weight: 600; color: #444; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .users-list-date { color: #999; font-size: 12px; } /* * Component: Carousel * ------------------- */ .carousel-control.left, .carousel-control.right { background-image: none; } .carousel-control > .fa { font-size: 40px; position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -20px; } /* * Component: modal * ---------------- */ .modal { background: rgba(0, 0, 0, 0.3); } .modal-content { border-radius: 0; -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); border: 0; } @media (min-width: 768px) { .modal-content { -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); } } .modal-header { border-bottom-color: #f4f4f4; } .modal-footer { border-top-color: #f4f4f4; } .modal-primary .modal-header, .modal-primary .modal-footer { border-color: #307095; } .modal-warning .modal-header, .modal-warning .modal-footer { border-color: #c87f0a; } .modal-info .modal-header, .modal-info .modal-footer { border-color: #0097bc; } .modal-success .modal-header, .modal-success .modal-footer { border-color: #00733e; } .modal-danger .modal-header, .modal-danger .modal-footer { border-color: #c23321; } /* * Component: Social Widgets * ------------------------- */ .box-widget { border: none; position: relative; } .widget-user .widget-user-header { padding: 20px; height: 120px; border-top-right-radius: 3px; border-top-left-radius: 3px; } .widget-user .widget-user-username { margin-top: 0; margin-bottom: 5px; font-size: 25px; font-weight: 300; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); } .widget-user .widget-user-desc { margin-top: 0; } .widget-user .widget-user-image { position: absolute; top: 65px; left: 50%; margin-left: -45px; } .widget-user .widget-user-image > img { width: 90px; height: auto; border: 3px solid #fff; } .widget-user .box-footer { padding-top: 30px; } .widget-user-2 .widget-user-header { padding: 20px; border-top-right-radius: 3px; border-top-left-radius: 3px; } .widget-user-2 .widget-user-username { margin-top: 5px; margin-bottom: 5px; font-size: 25px; font-weight: 300; } .widget-user-2 .widget-user-desc { margin-top: 0; } .widget-user-2 .widget-user-username, .widget-user-2 .widget-user-desc { margin-left: 75px; } .widget-user-2 .widget-user-image > img { width: 65px; height: auto; float: left; } .treeview-menu { display: none; list-style: none; padding: 0; margin: 0; padding-left: 5px; } .treeview-menu .treeview-menu { padding-left: 20px; } .treeview-menu > li { margin: 0; } .treeview-menu > li > a { padding: 5px 5px 5px 15px; display: block; font-size: 14px; } .treeview-menu > li > a > .fa, .treeview-menu > li > a > .glyphicon, .treeview-menu > li > a > .ion { width: 20px; } .treeview-menu > li > a > .pull-right-container > .fa-angle-left, .treeview-menu > li > a > .pull-right-container > .fa-angle-down, .treeview-menu > li > a > .fa-angle-left, .treeview-menu > li > a > .fa-angle-down { width: auto; } /* * Page: Mailbox * ------------- */ .mailbox-messages > .table { margin: 0; } .mailbox-controls { padding: 5px; } .mailbox-controls.with-border { border-bottom: 1px solid #f4f4f4; } .mailbox-read-info { border-bottom: 1px solid #f4f4f4; padding: 10px; } .mailbox-read-info h3 { font-size: 20px; margin: 0; } .mailbox-read-info h5 { margin: 0; padding: 5px 0 0 0; } .mailbox-read-time { color: #999; font-size: 13px; } .mailbox-read-message { padding: 10px; } .mailbox-attachments li { float: left; width: 200px; border: 1px solid #eee; margin-bottom: 10px; margin-right: 10px; } .mailbox-attachment-name { font-weight: bold; color: #666; } .mailbox-attachment-icon, .mailbox-attachment-info, .mailbox-attachment-size { display: block; } .mailbox-attachment-info { padding: 10px; background: #f4f4f4; } .mailbox-attachment-size { color: #999; font-size: 12px; } .mailbox-attachment-icon { text-align: center; font-size: 65px; color: #666; padding: 20px 10px; } .mailbox-attachment-icon.has-img { padding: 0; } .mailbox-attachment-icon.has-img > img { max-width: 100%; height: auto; } /* * Page: Lock Screen * ----------------- */ /* ADD THIS CLASS TO THE TAG */ .lockscreen { background: #d2d6de; } .lockscreen-logo { font-size: 35px; text-align: center; margin-bottom: 25px; font-weight: 300; } .lockscreen-logo a { color: #444; } .lockscreen-wrapper { max-width: 400px; margin: 0 auto; margin-top: 10%; } /* User name [optional] */ .lockscreen .lockscreen-name { text-align: center; font-weight: 600; } /* Will contain the image and the sign in form */ .lockscreen-item { border-radius: 4px; padding: 0; background: #fff; position: relative; margin: 10px auto 30px auto; width: 290px; } /* User image */ .lockscreen-image { border-radius: 50%; position: absolute; left: -10px; top: -25px; background: #fff; padding: 5px; z-index: 10; } .lockscreen-image > img { border-radius: 50%; width: 70px; height: 70px; } /* Contains the password input and the login button */ .lockscreen-credentials { margin-left: 70px; } .lockscreen-credentials .form-control { border: 0; } .lockscreen-credentials .btn { background-color: #fff; border: 0; padding: 0 10px; } .lockscreen-footer { margin-top: 10px; } /* * Page: Login & Register * ---------------------- */ .login-logo, .register-logo { font-size: 35px; text-align: center; margin-bottom: 25px; font-weight: 300; } .login-logo a, .register-logo a { color: #444; } .login-page, .register-page { background: #d2d6de; } .login-box, .register-box { width: 360px; margin: 7% auto; } @media (max-width: 768px) { .login-box, .register-box { width: 90%; margin-top: 20px; } } .login-box-body, .register-box-body { background: #fff; padding: 20px; border-top: 0; color: #666; } .login-box-body .form-control-feedback, .register-box-body .form-control-feedback { color: #777; } .login-box-msg, .register-box-msg { margin: 0; text-align: center; padding: 0 20px 20px 20px; } .social-auth-links { margin: 10px 0; } /* * Page: 400 and 500 error pages * ------------------------------ */ .error-page { width: 600px; margin: 20px auto 0 auto; } @media (max-width: 991px) { .error-page { width: 100%; } } .error-page > .headline { float: left; font-size: 100px; font-weight: 300; } @media (max-width: 991px) { .error-page > .headline { float: none; text-align: center; } } .error-page > .error-content { margin-left: 190px; display: block; } @media (max-width: 991px) { .error-page > .error-content { margin-left: 0; } } .error-page > .error-content > h3 { font-weight: 300; font-size: 25px; } @media (max-width: 991px) { .error-page > .error-content > h3 { text-align: center; } } /* * Page: Invoice * ------------- */ .invoice { position: relative; background: #fff; border: 1px solid #f4f4f4; padding: 20px; margin: 10px 25px; } .invoice-title { margin-top: 0; } /* * Page: Profile * ------------- */ .profile-user-img { margin: 0 auto; width: 100px; padding: 3px; border: 3px solid #d2d6de; } .profile-username { font-size: 21px; margin-top: 5px; } .post { border-bottom: 1px solid #d2d6de; margin-bottom: 15px; padding-bottom: 15px; color: #666; } .post:last-of-type { border-bottom: 0; margin-bottom: 0; padding-bottom: 0; } .post .user-block { margin-bottom: 15px; } /* * Social Buttons for Bootstrap * * Copyright 2013-2015 Panayiotis Lipiridis * Licensed under the MIT License * * https://github.com/lipis/bootstrap-social */ .btn-social { position: relative; padding-left: 44px; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .btn-social > :first-child { position: absolute; left: 0; top: 0; bottom: 0; width: 32px; line-height: 34px; font-size: 1.6em; text-align: center; border-right: 1px solid rgba(0, 0, 0, 0.2); } .btn-social.btn-lg { padding-left: 61px; } .btn-social.btn-lg > :first-child { line-height: 45px; width: 45px; font-size: 1.8em; } .btn-social.btn-sm { padding-left: 38px; } .btn-social.btn-sm > :first-child { line-height: 28px; width: 28px; font-size: 1.4em; } .btn-social.btn-xs { padding-left: 30px; } .btn-social.btn-xs > :first-child { line-height: 20px; width: 20px; font-size: 1.2em; } .btn-social-icon { position: relative; padding-left: 44px; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; height: 34px; width: 34px; padding: 0; } .btn-social-icon > :first-child { position: absolute; left: 0; top: 0; bottom: 0; width: 32px; line-height: 34px; font-size: 1.6em; text-align: center; border-right: 1px solid rgba(0, 0, 0, 0.2); } .btn-social-icon.btn-lg { padding-left: 61px; } .btn-social-icon.btn-lg > :first-child { line-height: 45px; width: 45px; font-size: 1.8em; } .btn-social-icon.btn-sm { padding-left: 38px; } .btn-social-icon.btn-sm > :first-child { line-height: 28px; width: 28px; font-size: 1.4em; } .btn-social-icon.btn-xs { padding-left: 30px; } .btn-social-icon.btn-xs > :first-child { line-height: 20px; width: 20px; font-size: 1.2em; } .btn-social-icon > :first-child { border: none; text-align: center; width: 100%; } .btn-social-icon.btn-lg { height: 45px; width: 45px; padding-left: 0; padding-right: 0; } .btn-social-icon.btn-sm { height: 30px; width: 30px; padding-left: 0; padding-right: 0; } .btn-social-icon.btn-xs { height: 22px; width: 22px; padding-left: 0; padding-right: 0; } .btn-adn { color: #ffffff; background-color: #d87a68; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:focus, .btn-adn.focus { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:hover { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:active, .btn-adn.active, .open > .dropdown-toggle.btn-adn { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:active, .btn-adn.active, .open > .dropdown-toggle.btn-adn { background-image: none; } .btn-adn .badge { color: #d87a68; background-color: #ffffff; } .btn-bitbucket { color: #ffffff; background-color: #205081; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:focus, .btn-bitbucket.focus { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:hover { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:active, .btn-bitbucket.active, .open > .dropdown-toggle.btn-bitbucket { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:active, .btn-bitbucket.active, .open > .dropdown-toggle.btn-bitbucket { background-image: none; } .btn-bitbucket .badge { color: #205081; background-color: #ffffff; } .btn-dropbox { color: #ffffff; background-color: #1087dd; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:focus, .btn-dropbox.focus { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:hover { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:active, .btn-dropbox.active, .open > .dropdown-toggle.btn-dropbox { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:active, .btn-dropbox.active, .open > .dropdown-toggle.btn-dropbox { background-image: none; } .btn-dropbox .badge { color: #1087dd; background-color: #ffffff; } .btn-facebook { color: #ffffff; background-color: #3b5998; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:focus, .btn-facebook.focus { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:hover { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:active, .btn-facebook.active, .open > .dropdown-toggle.btn-facebook { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:active, .btn-facebook.active, .open > .dropdown-toggle.btn-facebook { background-image: none; } .btn-facebook .badge { color: #3b5998; background-color: #ffffff; } .btn-flickr { color: #ffffff; background-color: #ff0084; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:focus, .btn-flickr.focus { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:hover { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:active, .btn-flickr.active, .open > .dropdown-toggle.btn-flickr { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:active, .btn-flickr.active, .open > .dropdown-toggle.btn-flickr { background-image: none; } .btn-flickr .badge { color: #ff0084; background-color: #ffffff; } .btn-foursquare { color: #ffffff; background-color: #f94877; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:focus, .btn-foursquare.focus { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:hover { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:active, .btn-foursquare.active, .open > .dropdown-toggle.btn-foursquare { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:active, .btn-foursquare.active, .open > .dropdown-toggle.btn-foursquare { background-image: none; } .btn-foursquare .badge { color: #f94877; background-color: #ffffff; } .btn-github { color: #ffffff; background-color: #444444; border-color: rgba(0, 0, 0, 0.2); } .btn-github:focus, .btn-github.focus { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:hover { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:active, .btn-github.active, .open > .dropdown-toggle.btn-github { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:active, .btn-github.active, .open > .dropdown-toggle.btn-github { background-image: none; } .btn-github .badge { color: #444444; background-color: #ffffff; } .btn-google { color: #ffffff; background-color: #dd4b39; border-color: rgba(0, 0, 0, 0.2); } .btn-google:focus, .btn-google.focus { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:hover { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:active, .btn-google.active, .open > .dropdown-toggle.btn-google { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:active, .btn-google.active, .open > .dropdown-toggle.btn-google { background-image: none; } .btn-google .badge { color: #dd4b39; background-color: #ffffff; } .btn-instagram { color: #ffffff; background-color: #3f729b; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:focus, .btn-instagram.focus { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:hover { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:active, .btn-instagram.active, .open > .dropdown-toggle.btn-instagram { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:active, .btn-instagram.active, .open > .dropdown-toggle.btn-instagram { background-image: none; } .btn-instagram .badge { color: #3f729b; background-color: #ffffff; } .btn-linkedin { color: #ffffff; background-color: #007bb6; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:focus, .btn-linkedin.focus { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:hover { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:active, .btn-linkedin.active, .open > .dropdown-toggle.btn-linkedin { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:active, .btn-linkedin.active, .open > .dropdown-toggle.btn-linkedin { background-image: none; } .btn-linkedin .badge { color: #007bb6; background-color: #ffffff; } .btn-microsoft { color: #ffffff; background-color: #2672ec; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:focus, .btn-microsoft.focus { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:hover { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:active, .btn-microsoft.active, .open > .dropdown-toggle.btn-microsoft { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:active, .btn-microsoft.active, .open > .dropdown-toggle.btn-microsoft { background-image: none; } .btn-microsoft .badge { color: #2672ec; background-color: #ffffff; } .btn-openid { color: #ffffff; background-color: #f7931e; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:focus, .btn-openid.focus { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:hover { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:active, .btn-openid.active, .open > .dropdown-toggle.btn-openid { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:active, .btn-openid.active, .open > .dropdown-toggle.btn-openid { background-image: none; } .btn-openid .badge { color: #f7931e; background-color: #ffffff; } .btn-pinterest { color: #ffffff; background-color: #cb2027; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:focus, .btn-pinterest.focus { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:hover { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:active, .btn-pinterest.active, .open > .dropdown-toggle.btn-pinterest { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:active, .btn-pinterest.active, .open > .dropdown-toggle.btn-pinterest { background-image: none; } .btn-pinterest .badge { color: #cb2027; background-color: #ffffff; } .btn-reddit { color: #000000; background-color: #eff7ff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:focus, .btn-reddit.focus { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:hover { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:active, .btn-reddit.active, .open > .dropdown-toggle.btn-reddit { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:active, .btn-reddit.active, .open > .dropdown-toggle.btn-reddit { background-image: none; } .btn-reddit .badge { color: #eff7ff; background-color: #000000; } .btn-soundcloud { color: #ffffff; background-color: #ff5500; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:focus, .btn-soundcloud.focus { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:hover { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:active, .btn-soundcloud.active, .open > .dropdown-toggle.btn-soundcloud { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:active, .btn-soundcloud.active, .open > .dropdown-toggle.btn-soundcloud { background-image: none; } .btn-soundcloud .badge { color: #ff5500; background-color: #ffffff; } .btn-tumblr { color: #ffffff; background-color: #2c4762; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:focus, .btn-tumblr.focus { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:hover { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:active, .btn-tumblr.active, .open > .dropdown-toggle.btn-tumblr { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:active, .btn-tumblr.active, .open > .dropdown-toggle.btn-tumblr { background-image: none; } .btn-tumblr .badge { color: #2c4762; background-color: #ffffff; } .btn-twitter { color: #ffffff; background-color: #55acee; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:focus, .btn-twitter.focus { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:hover { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:active, .btn-twitter.active, .open > .dropdown-toggle.btn-twitter { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:active, .btn-twitter.active, .open > .dropdown-toggle.btn-twitter { background-image: none; } .btn-twitter .badge { color: #55acee; background-color: #ffffff; } .btn-vimeo { color: #ffffff; background-color: #1ab7ea; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:focus, .btn-vimeo.focus { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:hover { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:active, .btn-vimeo.active, .open > .dropdown-toggle.btn-vimeo { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:active, .btn-vimeo.active, .open > .dropdown-toggle.btn-vimeo { background-image: none; } .btn-vimeo .badge { color: #1ab7ea; background-color: #ffffff; } .btn-vk { color: #ffffff; background-color: #587ea3; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:focus, .btn-vk.focus { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:hover { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:active, .btn-vk.active, .open > .dropdown-toggle.btn-vk { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:active, .btn-vk.active, .open > .dropdown-toggle.btn-vk { background-image: none; } .btn-vk .badge { color: #587ea3; background-color: #ffffff; } .btn-yahoo { color: #ffffff; background-color: #720e9e; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:focus, .btn-yahoo.focus { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:hover { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:active, .btn-yahoo.active, .open > .dropdown-toggle.btn-yahoo { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:active, .btn-yahoo.active, .open > .dropdown-toggle.btn-yahoo { background-image: none; } .btn-yahoo .badge { color: #720e9e; background-color: #ffffff; } /* * Plugin: Full Calendar * --------------------- */ .fc-button { background: #f4f4f4; background-image: none; color: #444; border-color: #ddd; border-bottom-color: #ddd; } .fc-button:hover, .fc-button:active, .fc-button.hover { background-color: #e9e9e9; } .fc-header-title h2 { font-size: 15px; line-height: 1.6em; color: #666; margin-left: 10px; } .fc-header-right { padding-right: 10px; } .fc-header-left { padding-left: 10px; } .fc-widget-header { background: #fafafa; } .fc-grid { width: 100%; border: 0; } .fc-widget-header:first-of-type, .fc-widget-content:first-of-type { border-left: 0; border-right: 0; } .fc-widget-header:last-of-type, .fc-widget-content:last-of-type { border-right: 0; } .fc-toolbar { padding: 10px; margin: 0; } .fc-day-number { font-size: 20px; font-weight: 300; padding-right: 10px; } .fc-color-picker { list-style: none; margin: 0; padding: 0; } .fc-color-picker > li { float: left; font-size: 30px; margin-right: 5px; line-height: 30px; } .fc-color-picker > li .fa { -webkit-transition: -webkit-transform linear 0.3s; -moz-transition: -moz-transform linear 0.3s; -o-transition: -o-transform linear 0.3s; transition: transform linear 0.3s; } .fc-color-picker > li .fa:hover { -webkit-transform: rotate(30deg); -ms-transform: rotate(30deg); -o-transform: rotate(30deg); transform: rotate(30deg); } #add-new-event { -webkit-transition: all linear 0.3s; -o-transition: all linear 0.3s; transition: all linear 0.3s; } .external-event { padding: 5px 10px; font-weight: bold; margin-bottom: 4px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; cursor: move; } .external-event:hover { box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); } /* * Plugin: Select2 * --------------- */ .select2-container--default.select2-container--focus, .select2-selection.select2-container--focus, .select2-container--default:focus, .select2-selection:focus, .select2-container--default:active, .select2-selection:active { outline: none; } .select2-container--default .select2-selection--single, .select2-selection .select2-selection--single { border: 1px solid #d2d6de; border-radius: 0; padding: 6px 12px; height: 34px; } .select2-container--default.select2-container--open { border-color: #3c8dbc; } .select2-dropdown { border: 1px solid #d2d6de; border-radius: 0; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #3c8dbc; color: white; } .select2-results__option { padding: 6px 12px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { padding-left: 0; padding-right: 0; height: auto; margin-top: -4px; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 6px; padding-left: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 28px; right: 3px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { margin-top: 0; } .select2-dropdown .select2-search__field, .select2-search--inline .select2-search__field { border: 1px solid #d2d6de; } .select2-dropdown .select2-search__field:focus, .select2-search--inline .select2-search__field:focus { outline: none; } .select2-container--default.select2-container--focus .select2-selection--multiple, .select2-container--default .select2-search--dropdown .select2-search__field { border-color: #3c8dbc !important; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover { color: #444; } .select2-container--default .select2-selection--multiple { border: 1px solid #d2d6de; border-radius: 0; } .select2-container--default .select2-selection--multiple:focus { border-color: #3c8dbc; } .select2-container--default.select2-container--focus .select2-selection--multiple { border-color: #d2d6de; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #3c8dbc; border-color: #367fa9; padding: 1px 10px; color: #fff; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { margin-right: 5px; color: rgba(255, 255, 255, 0.7); } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #fff; } .select2-container .select2-selection--single .select2-selection__rendered { padding-right: 10px; } .box .datepicker-inline, .box .datepicker-inline .datepicker-days, .box .datepicker-inline > table, .box .datepicker-inline .datepicker-days > table { width: 100%; } .box .datepicker-inline td:hover, .box .datepicker-inline .datepicker-days td:hover, .box .datepicker-inline > table td:hover, .box .datepicker-inline .datepicker-days > table td:hover { background-color: rgba(255, 255, 255, 0.3); } .box .datepicker-inline td.day.old, .box .datepicker-inline .datepicker-days td.day.old, .box .datepicker-inline > table td.day.old, .box .datepicker-inline .datepicker-days > table td.day.old, .box .datepicker-inline td.day.new, .box .datepicker-inline .datepicker-days td.day.new, .box .datepicker-inline > table td.day.new, .box .datepicker-inline .datepicker-days > table td.day.new { color: #777; } /* * General: Miscellaneous * ---------------------- */ .pad { padding: 10px; } .margin { margin: 10px; } .margin-bottom { margin-bottom: 20px; } .margin-bottom-none { margin-bottom: 0; } .margin-r-5 { margin-right: 5px; } .inline { display: inline; } .description-block { display: block; margin: 10px 0; text-align: center; } .description-block.margin-bottom { margin-bottom: 25px; } .description-block > .description-header { margin: 0; padding: 0; font-weight: 600; font-size: 16px; } .description-block > .description-text { text-transform: uppercase; } .bg-red, .bg-yellow, .bg-aqua, .bg-blue, .bg-light-blue, .bg-green, .bg-navy, .bg-teal, .bg-olive, .bg-lime, .bg-orange, .bg-fuchsia, .bg-purple, .bg-maroon, .bg-black, .bg-red-active, .bg-yellow-active, .bg-aqua-active, .bg-blue-active, .bg-light-blue-active, .bg-green-active, .bg-navy-active, .bg-teal-active, .bg-olive-active, .bg-lime-active, .bg-orange-active, .bg-fuchsia-active, .bg-purple-active, .bg-maroon-active, .bg-black-active, .callout.callout-danger, .callout.callout-warning, .callout.callout-info, .callout.callout-success, .alert-success, .alert-danger, .alert-error, .alert-warning, .alert-info, .label-danger, .label-info, .label-warning, .label-primary, .label-success, .modal-primary .modal-body, .modal-primary .modal-header, .modal-primary .modal-footer, .modal-warning .modal-body, .modal-warning .modal-header, .modal-warning .modal-footer, .modal-info .modal-body, .modal-info .modal-header, .modal-info .modal-footer, .modal-success .modal-body, .modal-success .modal-header, .modal-success .modal-footer, .modal-danger .modal-body, .modal-danger .modal-header, .modal-danger .modal-footer { color: #fff !important; } .bg-gray { color: #000; background-color: #d2d6de !important; } .bg-gray-light { background-color: #f7f7f7; } .bg-black { background-color: #111111 !important; } .bg-red, .callout.callout-danger, .alert-danger, .alert-error, .label-danger, .modal-danger .modal-body { background-color: #dd4b39 !important; } .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body { background-color: #f39c12 !important; } .bg-aqua, .callout.callout-info, .alert-info, .label-info, .modal-info .modal-body { background-color: #00c0ef !important; } .bg-blue { background-color: #0073b7 !important; } .bg-light-blue, .label-primary, .modal-primary .modal-body { background-color: #3c8dbc !important; } .bg-green, .callout.callout-success, .alert-success, .label-success, .modal-success .modal-body { background-color: #00a65a !important; } .bg-navy { background-color: #001f3f !important; } .bg-teal { background-color: #39cccc !important; } .bg-olive { background-color: #3d9970 !important; } .bg-lime { background-color: #01ff70 !important; } .bg-orange { background-color: #ff851b !important; } .bg-fuchsia { background-color: #f012be !important; } .bg-purple { background-color: #605ca8 !important; } .bg-maroon { background-color: #d81b60 !important; } .bg-gray-active { color: #000; background-color: #b5bbc8 !important; } .bg-black-active { background-color: #000000 !important; } .bg-red-active, .modal-danger .modal-header, .modal-danger .modal-footer { background-color: #d33724 !important; } .bg-yellow-active, .modal-warning .modal-header, .modal-warning .modal-footer { background-color: #db8b0b !important; } .bg-aqua-active, .modal-info .modal-header, .modal-info .modal-footer { background-color: #00a7d0 !important; } .bg-blue-active { background-color: #005384 !important; } .bg-light-blue-active, .modal-primary .modal-header, .modal-primary .modal-footer { background-color: #357ca5 !important; } .bg-green-active, .modal-success .modal-header, .modal-success .modal-footer { background-color: #008d4c !important; } .bg-navy-active { background-color: #001a35 !important; } .bg-teal-active { background-color: #30bbbb !important; } .bg-olive-active { background-color: #368763 !important; } .bg-lime-active { background-color: #00e765 !important; } .bg-orange-active { background-color: #ff7701 !important; } .bg-fuchsia-active { background-color: #db0ead !important; } .bg-purple-active { background-color: #555299 !important; } .bg-maroon-active { background-color: #ca195a !important; } [class^="bg-"].disabled { opacity: 0.65; filter: alpha(opacity=65); } .text-red { color: #dd4b39 !important; } .text-yellow { color: #f39c12 !important; } .text-aqua { color: #00c0ef !important; } .text-blue { color: #0073b7 !important; } .text-black { color: #111111 !important; } .text-light-blue { color: #3c8dbc !important; } .text-green { color: #00a65a !important; } .text-gray { color: #d2d6de !important; } .text-navy { color: #001f3f !important; } .text-teal { color: #39cccc !important; } .text-olive { color: #3d9970 !important; } .text-lime { color: #01ff70 !important; } .text-orange { color: #ff851b !important; } .text-fuchsia { color: #f012be !important; } .text-purple { color: #605ca8 !important; } .text-maroon { color: #d81b60 !important; } .link-muted { color: #7a869d; } .link-muted:hover, .link-muted:focus { color: #606c84; } .link-black { color: #666; } .link-black:hover, .link-black:focus { color: #999; } .hide { display: none !important; } .no-border { border: 0 !important; } .no-padding { padding: 0 !important; } .no-margin { margin: 0 !important; } .no-shadow { box-shadow: none !important; } .list-unstyled, .chart-legend, .contacts-list, .users-list, .mailbox-attachments { list-style: none; margin: 0; padding: 0; } .list-group-unbordered > .list-group-item { border-left: 0; border-right: 0; border-radius: 0; padding-left: 0; padding-right: 0; } .flat { border-radius: 0 !important; } .text-bold, .text-bold.table td, .text-bold.table th { font-weight: 700; } .text-sm { font-size: 12px; } .jqstooltip { padding: 5px !important; width: auto !important; height: auto !important; } .bg-teal-gradient { background: #39cccc !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; background: -o-linear-gradient(#7adddd, #39cccc) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; color: #fff; } .bg-light-blue-gradient { background: #3c8dbc !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; color: #fff; } .bg-blue-gradient { background: #0073b7 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; background: -o-linear-gradient(#0089db, #0073b7) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; color: #fff; } .bg-aqua-gradient { background: #00c0ef !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; background: -o-linear-gradient(#14d1ff, #00c0ef) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; color: #fff; } .bg-yellow-gradient { background: #f39c12 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; background: -o-linear-gradient(#f7bc60, #f39c12) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; color: #fff; } .bg-purple-gradient { background: #605ca8 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; background: -o-linear-gradient(#9491c4, #605ca8) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; color: #fff; } .bg-green-gradient { background: #00a65a !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; background: -o-linear-gradient(#00ca6d, #00a65a) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; color: #fff; } .bg-red-gradient { background: #dd4b39 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; background: -o-linear-gradient(#e47365, #dd4b39) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; color: #fff; } .bg-black-gradient { background: #111111 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; background: -o-linear-gradient(#2b2b2b, #111111) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; color: #fff; } .bg-maroon-gradient { background: #d81b60 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; background: -o-linear-gradient(#e73f7c, #d81b60) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; color: #fff; } .description-block .description-icon { font-size: 16px; } .no-pad-top { padding-top: 0; } .position-static { position: static !important; } .list-header { font-size: 15px; padding: 10px 4px; font-weight: bold; color: #666; } .list-seperator { height: 1px; background: #f4f4f4; margin: 15px 0 9px 0; } .list-link > a { padding: 4px; color: #777; } .list-link > a:hover { color: #222; } .font-light { font-weight: 300; } .user-block:before, .user-block:after { content: " "; display: table; } .user-block:after { clear: both; } .user-block img { width: 40px; height: 40px; float: left; } .user-block .username, .user-block .description, .user-block .comment { display: block; margin-left: 50px; } .user-block .username { font-size: 16px; font-weight: 600; } .user-block .description { color: #999; font-size: 13px; } .user-block.user-block-sm .username, .user-block.user-block-sm .description, .user-block.user-block-sm .comment { margin-left: 40px; } .user-block.user-block-sm .username { font-size: 14px; } .img-sm, .img-md, .img-lg, .box-comments .box-comment img, .user-block.user-block-sm img { float: left; } .img-sm, .box-comments .box-comment img, .user-block.user-block-sm img { width: 30px !important; height: 30px !important; } .img-sm + .img-push { margin-left: 40px; } .img-md { width: 60px; height: 60px; } .img-md + .img-push { margin-left: 70px; } .img-lg { width: 100px; height: 100px; } .img-lg + .img-push { margin-left: 110px; } .img-bordered { border: 3px solid #d2d6de; padding: 3px; } .img-bordered-sm { border: 2px solid #d2d6de; padding: 2px; } .attachment-block { border: 1px solid #f4f4f4; padding: 5px; margin-bottom: 10px; background: #f7f7f7; } .attachment-block .attachment-img { max-width: 100px; max-height: 100px; height: auto; float: left; } .attachment-block .attachment-pushed { margin-left: 110px; } .attachment-block .attachment-heading { margin: 0; } .attachment-block .attachment-text { color: #555; } .connectedSortable { min-height: 100px; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sort-highlight { background: #f4f4f4; border: 1px dashed #ddd; margin-bottom: 10px; } .full-opacity-hover { opacity: 0.65; filter: alpha(opacity=65); } .full-opacity-hover:hover { opacity: 1; filter: alpha(opacity=100); } .chart { position: relative; overflow: hidden; width: 100%; } .chart svg, .chart canvas { width: 100% !important; } /* * Misc: print * ----------- */ @media print { .no-print, .main-sidebar, .left-side, .main-header, .content-header { display: none !important; } .content-wrapper, .right-side, .main-footer { margin-left: 0 !important; min-height: 0 !important; -webkit-transform: translate(0, 0) !important; -ms-transform: translate(0, 0) !important; -o-transform: translate(0, 0) !important; transform: translate(0, 0) !important; } .fixed .content-wrapper, .fixed .right-side { padding-top: 0 !important; } .invoice { width: 100%; border: 0; margin: 0; padding: 0; } .invoice-col { float: left; width: 33.3333333%; } .table-responsive { overflow: auto; } .table-responsive > .table tr th, .table-responsive > .table tr td { white-space: normal !important; } } ================================================ FILE: src/main/resources/static/css/alt/AdminLTE-bootstrap-social.css ================================================ /* * Social Buttons for Bootstrap * * Copyright 2013-2015 Panayiotis Lipiridis * Licensed under the MIT License * * https://github.com/lipis/bootstrap-social */ .btn-social { position: relative; padding-left: 44px; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .btn-social > :first-child { position: absolute; left: 0; top: 0; bottom: 0; width: 32px; line-height: 34px; font-size: 1.6em; text-align: center; border-right: 1px solid rgba(0, 0, 0, 0.2); } .btn-social.btn-lg { padding-left: 61px; } .btn-social.btn-lg > :first-child { line-height: 45px; width: 45px; font-size: 1.8em; } .btn-social.btn-sm { padding-left: 38px; } .btn-social.btn-sm > :first-child { line-height: 28px; width: 28px; font-size: 1.4em; } .btn-social.btn-xs { padding-left: 30px; } .btn-social.btn-xs > :first-child { line-height: 20px; width: 20px; font-size: 1.2em; } .btn-social-icon { position: relative; padding-left: 44px; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; height: 34px; width: 34px; padding: 0; } .btn-social-icon > :first-child { position: absolute; left: 0; top: 0; bottom: 0; width: 32px; line-height: 34px; font-size: 1.6em; text-align: center; border-right: 1px solid rgba(0, 0, 0, 0.2); } .btn-social-icon.btn-lg { padding-left: 61px; } .btn-social-icon.btn-lg > :first-child { line-height: 45px; width: 45px; font-size: 1.8em; } .btn-social-icon.btn-sm { padding-left: 38px; } .btn-social-icon.btn-sm > :first-child { line-height: 28px; width: 28px; font-size: 1.4em; } .btn-social-icon.btn-xs { padding-left: 30px; } .btn-social-icon.btn-xs > :first-child { line-height: 20px; width: 20px; font-size: 1.2em; } .btn-social-icon > :first-child { border: none; text-align: center; width: 100%; } .btn-social-icon.btn-lg { height: 45px; width: 45px; padding-left: 0; padding-right: 0; } .btn-social-icon.btn-sm { height: 30px; width: 30px; padding-left: 0; padding-right: 0; } .btn-social-icon.btn-xs { height: 22px; width: 22px; padding-left: 0; padding-right: 0; } .btn-adn { color: #ffffff; background-color: #d87a68; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:focus, .btn-adn.focus { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:hover { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:active, .btn-adn.active, .open > .dropdown-toggle.btn-adn { color: #ffffff; background-color: #ce563f; border-color: rgba(0, 0, 0, 0.2); } .btn-adn:active, .btn-adn.active, .open > .dropdown-toggle.btn-adn { background-image: none; } .btn-adn .badge { color: #d87a68; background-color: #ffffff; } .btn-bitbucket { color: #ffffff; background-color: #205081; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:focus, .btn-bitbucket.focus { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:hover { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:active, .btn-bitbucket.active, .open > .dropdown-toggle.btn-bitbucket { color: #ffffff; background-color: #163758; border-color: rgba(0, 0, 0, 0.2); } .btn-bitbucket:active, .btn-bitbucket.active, .open > .dropdown-toggle.btn-bitbucket { background-image: none; } .btn-bitbucket .badge { color: #205081; background-color: #ffffff; } .btn-dropbox { color: #ffffff; background-color: #1087dd; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:focus, .btn-dropbox.focus { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:hover { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:active, .btn-dropbox.active, .open > .dropdown-toggle.btn-dropbox { color: #ffffff; background-color: #0d6aad; border-color: rgba(0, 0, 0, 0.2); } .btn-dropbox:active, .btn-dropbox.active, .open > .dropdown-toggle.btn-dropbox { background-image: none; } .btn-dropbox .badge { color: #1087dd; background-color: #ffffff; } .btn-facebook { color: #ffffff; background-color: #3b5998; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:focus, .btn-facebook.focus { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:hover { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:active, .btn-facebook.active, .open > .dropdown-toggle.btn-facebook { color: #ffffff; background-color: #2d4373; border-color: rgba(0, 0, 0, 0.2); } .btn-facebook:active, .btn-facebook.active, .open > .dropdown-toggle.btn-facebook { background-image: none; } .btn-facebook .badge { color: #3b5998; background-color: #ffffff; } .btn-flickr { color: #ffffff; background-color: #ff0084; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:focus, .btn-flickr.focus { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:hover { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:active, .btn-flickr.active, .open > .dropdown-toggle.btn-flickr { color: #ffffff; background-color: #cc006a; border-color: rgba(0, 0, 0, 0.2); } .btn-flickr:active, .btn-flickr.active, .open > .dropdown-toggle.btn-flickr { background-image: none; } .btn-flickr .badge { color: #ff0084; background-color: #ffffff; } .btn-foursquare { color: #ffffff; background-color: #f94877; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:focus, .btn-foursquare.focus { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:hover { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:active, .btn-foursquare.active, .open > .dropdown-toggle.btn-foursquare { color: #ffffff; background-color: #f71752; border-color: rgba(0, 0, 0, 0.2); } .btn-foursquare:active, .btn-foursquare.active, .open > .dropdown-toggle.btn-foursquare { background-image: none; } .btn-foursquare .badge { color: #f94877; background-color: #ffffff; } .btn-github { color: #ffffff; background-color: #444444; border-color: rgba(0, 0, 0, 0.2); } .btn-github:focus, .btn-github.focus { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:hover { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:active, .btn-github.active, .open > .dropdown-toggle.btn-github { color: #ffffff; background-color: #2b2b2b; border-color: rgba(0, 0, 0, 0.2); } .btn-github:active, .btn-github.active, .open > .dropdown-toggle.btn-github { background-image: none; } .btn-github .badge { color: #444444; background-color: #ffffff; } .btn-google { color: #ffffff; background-color: #dd4b39; border-color: rgba(0, 0, 0, 0.2); } .btn-google:focus, .btn-google.focus { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:hover { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:active, .btn-google.active, .open > .dropdown-toggle.btn-google { color: #ffffff; background-color: #c23321; border-color: rgba(0, 0, 0, 0.2); } .btn-google:active, .btn-google.active, .open > .dropdown-toggle.btn-google { background-image: none; } .btn-google .badge { color: #dd4b39; background-color: #ffffff; } .btn-instagram { color: #ffffff; background-color: #3f729b; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:focus, .btn-instagram.focus { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:hover { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:active, .btn-instagram.active, .open > .dropdown-toggle.btn-instagram { color: #ffffff; background-color: #305777; border-color: rgba(0, 0, 0, 0.2); } .btn-instagram:active, .btn-instagram.active, .open > .dropdown-toggle.btn-instagram { background-image: none; } .btn-instagram .badge { color: #3f729b; background-color: #ffffff; } .btn-linkedin { color: #ffffff; background-color: #007bb6; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:focus, .btn-linkedin.focus { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:hover { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:active, .btn-linkedin.active, .open > .dropdown-toggle.btn-linkedin { color: #ffffff; background-color: #005983; border-color: rgba(0, 0, 0, 0.2); } .btn-linkedin:active, .btn-linkedin.active, .open > .dropdown-toggle.btn-linkedin { background-image: none; } .btn-linkedin .badge { color: #007bb6; background-color: #ffffff; } .btn-microsoft { color: #ffffff; background-color: #2672ec; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:focus, .btn-microsoft.focus { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:hover { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:active, .btn-microsoft.active, .open > .dropdown-toggle.btn-microsoft { color: #ffffff; background-color: #125acd; border-color: rgba(0, 0, 0, 0.2); } .btn-microsoft:active, .btn-microsoft.active, .open > .dropdown-toggle.btn-microsoft { background-image: none; } .btn-microsoft .badge { color: #2672ec; background-color: #ffffff; } .btn-openid { color: #ffffff; background-color: #f7931e; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:focus, .btn-openid.focus { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:hover { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:active, .btn-openid.active, .open > .dropdown-toggle.btn-openid { color: #ffffff; background-color: #da7908; border-color: rgba(0, 0, 0, 0.2); } .btn-openid:active, .btn-openid.active, .open > .dropdown-toggle.btn-openid { background-image: none; } .btn-openid .badge { color: #f7931e; background-color: #ffffff; } .btn-pinterest { color: #ffffff; background-color: #cb2027; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:focus, .btn-pinterest.focus { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:hover { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:active, .btn-pinterest.active, .open > .dropdown-toggle.btn-pinterest { color: #ffffff; background-color: #9f191f; border-color: rgba(0, 0, 0, 0.2); } .btn-pinterest:active, .btn-pinterest.active, .open > .dropdown-toggle.btn-pinterest { background-image: none; } .btn-pinterest .badge { color: #cb2027; background-color: #ffffff; } .btn-reddit { color: #000000; background-color: #eff7ff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:focus, .btn-reddit.focus { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:hover { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:active, .btn-reddit.active, .open > .dropdown-toggle.btn-reddit { color: #000000; background-color: #bcddff; border-color: rgba(0, 0, 0, 0.2); } .btn-reddit:active, .btn-reddit.active, .open > .dropdown-toggle.btn-reddit { background-image: none; } .btn-reddit .badge { color: #eff7ff; background-color: #000000; } .btn-soundcloud { color: #ffffff; background-color: #ff5500; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:focus, .btn-soundcloud.focus { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:hover { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:active, .btn-soundcloud.active, .open > .dropdown-toggle.btn-soundcloud { color: #ffffff; background-color: #cc4400; border-color: rgba(0, 0, 0, 0.2); } .btn-soundcloud:active, .btn-soundcloud.active, .open > .dropdown-toggle.btn-soundcloud { background-image: none; } .btn-soundcloud .badge { color: #ff5500; background-color: #ffffff; } .btn-tumblr { color: #ffffff; background-color: #2c4762; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:focus, .btn-tumblr.focus { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:hover { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:active, .btn-tumblr.active, .open > .dropdown-toggle.btn-tumblr { color: #ffffff; background-color: #1c2d3f; border-color: rgba(0, 0, 0, 0.2); } .btn-tumblr:active, .btn-tumblr.active, .open > .dropdown-toggle.btn-tumblr { background-image: none; } .btn-tumblr .badge { color: #2c4762; background-color: #ffffff; } .btn-twitter { color: #ffffff; background-color: #55acee; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:focus, .btn-twitter.focus { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:hover { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:active, .btn-twitter.active, .open > .dropdown-toggle.btn-twitter { color: #ffffff; background-color: #2795e9; border-color: rgba(0, 0, 0, 0.2); } .btn-twitter:active, .btn-twitter.active, .open > .dropdown-toggle.btn-twitter { background-image: none; } .btn-twitter .badge { color: #55acee; background-color: #ffffff; } .btn-vimeo { color: #ffffff; background-color: #1ab7ea; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:focus, .btn-vimeo.focus { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:hover { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:active, .btn-vimeo.active, .open > .dropdown-toggle.btn-vimeo { color: #ffffff; background-color: #1295bf; border-color: rgba(0, 0, 0, 0.2); } .btn-vimeo:active, .btn-vimeo.active, .open > .dropdown-toggle.btn-vimeo { background-image: none; } .btn-vimeo .badge { color: #1ab7ea; background-color: #ffffff; } .btn-vk { color: #ffffff; background-color: #587ea3; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:focus, .btn-vk.focus { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:hover { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:active, .btn-vk.active, .open > .dropdown-toggle.btn-vk { color: #ffffff; background-color: #466482; border-color: rgba(0, 0, 0, 0.2); } .btn-vk:active, .btn-vk.active, .open > .dropdown-toggle.btn-vk { background-image: none; } .btn-vk .badge { color: #587ea3; background-color: #ffffff; } .btn-yahoo { color: #ffffff; background-color: #720e9e; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:focus, .btn-yahoo.focus { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:hover { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:active, .btn-yahoo.active, .open > .dropdown-toggle.btn-yahoo { color: #ffffff; background-color: #500a6f; border-color: rgba(0, 0, 0, 0.2); } .btn-yahoo:active, .btn-yahoo.active, .open > .dropdown-toggle.btn-yahoo { background-image: none; } .btn-yahoo .badge { color: #720e9e; background-color: #ffffff; } ================================================ FILE: src/main/resources/static/css/alt/AdminLTE-select2.css ================================================ /* * Plugin: Select2 * --------------- */ .select2-container--default.select2-container--focus, .select2-selection.select2-container--focus, .select2-container--default:focus, .select2-selection:focus, .select2-container--default:active, .select2-selection:active { outline: none; } .select2-container--default .select2-selection--single, .select2-selection .select2-selection--single { border: 1px solid #d2d6de; border-radius: 0; padding: 6px 12px; height: 34px; } .select2-container--default.select2-container--open { border-color: #3c8dbc; } .select2-dropdown { border: 1px solid #d2d6de; border-radius: 0; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #3c8dbc; color: white; } .select2-results__option { padding: 6px 12px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { padding-left: 0; padding-right: 0; height: auto; margin-top: -4px; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 6px; padding-left: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 28px; right: 3px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { margin-top: 0; } .select2-dropdown .select2-search__field, .select2-search--inline .select2-search__field { border: 1px solid #d2d6de; } .select2-dropdown .select2-search__field:focus, .select2-search--inline .select2-search__field:focus { outline: none; } .select2-container--default.select2-container--focus .select2-selection--multiple, .select2-container--default .select2-search--dropdown .select2-search__field { border-color: #3c8dbc !important; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover { color: #444; } .select2-container--default .select2-selection--multiple { border: 1px solid #d2d6de; border-radius: 0; } .select2-container--default .select2-selection--multiple:focus { border-color: #3c8dbc; } .select2-container--default.select2-container--focus .select2-selection--multiple { border-color: #d2d6de; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #3c8dbc; border-color: #367fa9; padding: 1px 10px; color: #fff; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { margin-right: 5px; color: rgba(255, 255, 255, 0.7); } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #fff; } .select2-container .select2-selection--single .select2-selection__rendered { padding-right: 10px; } ================================================ FILE: src/main/resources/static/css/alt/AdminLTE-without-plugins.css ================================================ /*! * AdminLTE v2.4.0 Without Third-Party Plugins * Author: Almsaeed Studio * Website: Almsaeed Studio * License: Open source - MIT * Please visit http://opensource.org/licenses/MIT for more information !*/ /* * Core: General Layout Style * ------------------------- */ html, body { height: 100%; } .layout-boxed html, .layout-boxed body { height: 100%; } body { font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 400; overflow-x: hidden; overflow-y: auto; } /* Layout */ .wrapper { height: 100%; position: relative; overflow-x: hidden; overflow-y: auto; } .wrapper:before, .wrapper:after { content: " "; display: table; } .wrapper:after { clear: both; } .layout-boxed .wrapper { max-width: 1250px; margin: 0 auto; min-height: 100%; box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); position: relative; } .layout-boxed { background-color: #f9fafc; } /* * Content Wrapper - contains the main content */ .content-wrapper, .main-footer { -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; margin-left: 230px; z-index: 820; } .layout-top-nav .content-wrapper, .layout-top-nav .main-footer { margin-left: 0; } @media (max-width: 767px) { .content-wrapper, .main-footer { margin-left: 0; } } @media (min-width: 768px) { .sidebar-collapse .content-wrapper, .sidebar-collapse .main-footer { margin-left: 0; } } @media (max-width: 767px) { .sidebar-open .content-wrapper, .sidebar-open .main-footer { -webkit-transform: translate(230px, 0); -ms-transform: translate(230px, 0); -o-transform: translate(230px, 0); transform: translate(230px, 0); } } .content-wrapper { min-height: 100%; background-color: #ecf0f5; z-index: 800; } .main-footer { background: #fff; padding: 15px; color: #444; border-top: 1px solid #d2d6de; } /* Fixed layout */ .fixed .main-header, .fixed .main-sidebar, .fixed .left-side { position: fixed; } .fixed .main-header { top: 0; right: 0; left: 0; } .fixed .content-wrapper, .fixed .right-side { padding-top: 50px; } @media (max-width: 767px) { .fixed .content-wrapper, .fixed .right-side { padding-top: 100px; } } .fixed.layout-boxed .wrapper { max-width: 100%; } .fixed .wrapper { overflow: hidden; } .hold-transition .content-wrapper, .hold-transition .right-side, .hold-transition .main-footer, .hold-transition .main-sidebar, .hold-transition .left-side, .hold-transition .main-header .navbar, .hold-transition .main-header .logo, .hold-transition .menu-open .fa-angle-left { /* Fix for IE */ -webkit-transition: none; -o-transition: none; transition: none; } /* Content */ .content { min-height: 250px; padding: 15px; margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } /* H1 - H6 font */ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: 'Source Sans Pro', sans-serif; } /* General Links */ a { color: #3c8dbc; } a:hover, a:active, a:focus { outline: none; text-decoration: none; color: #72afd2; } /* Page Header */ .page-header { margin: 10px 0 20px 0; font-size: 22px; } .page-header > small { color: #666; display: block; margin-top: 5px; } /* * Component: Main Header * ---------------------- */ .main-header { position: relative; max-height: 100px; z-index: 1030; } .main-header .navbar { -webkit-transition: margin-left 0.3s ease-in-out; -o-transition: margin-left 0.3s ease-in-out; transition: margin-left 0.3s ease-in-out; margin-bottom: 0; margin-left: 230px; border: none; min-height: 50px; border-radius: 0; } .layout-top-nav .main-header .navbar { margin-left: 0; } .main-header #navbar-search-input.form-control { background: rgba(255, 255, 255, 0.2); border-color: transparent; } .main-header #navbar-search-input.form-control:focus, .main-header #navbar-search-input.form-control:active { border-color: rgba(0, 0, 0, 0.1); background: rgba(255, 255, 255, 0.9); } .main-header #navbar-search-input.form-control::-moz-placeholder { color: #ccc; opacity: 1; } .main-header #navbar-search-input.form-control:-ms-input-placeholder { color: #ccc; } .main-header #navbar-search-input.form-control::-webkit-input-placeholder { color: #ccc; } .main-header .navbar-custom-menu, .main-header .navbar-right { float: right; } @media (max-width: 991px) { .main-header .navbar-custom-menu a, .main-header .navbar-right a { color: inherit; background: transparent; } } @media (max-width: 767px) { .main-header .navbar-right { float: none; } .navbar-collapse .main-header .navbar-right { margin: 7.5px -15px; } .main-header .navbar-right > li { color: inherit; border: 0; } } .main-header .sidebar-toggle { float: left; background-color: transparent; background-image: none; padding: 15px 15px; font-family: fontAwesome; } .main-header .sidebar-toggle:before { content: "\f0c9"; } .main-header .sidebar-toggle:hover { color: #fff; } .main-header .sidebar-toggle:focus, .main-header .sidebar-toggle:active { background: transparent; } .main-header .sidebar-toggle .icon-bar { display: none; } .main-header .navbar .nav > li.user > a > .fa, .main-header .navbar .nav > li.user > a > .glyphicon, .main-header .navbar .nav > li.user > a > .ion { margin-right: 5px; } .main-header .navbar .nav > li > a > .label { position: absolute; top: 9px; right: 7px; text-align: center; font-size: 9px; padding: 2px 3px; line-height: .9; } .main-header .logo { -webkit-transition: width 0.3s ease-in-out; -o-transition: width 0.3s ease-in-out; transition: width 0.3s ease-in-out; display: block; float: left; height: 50px; font-size: 20px; line-height: 50px; text-align: center; width: 230px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; padding: 0 15px; font-weight: 300; overflow: hidden; } .main-header .logo .logo-lg { display: block; } .main-header .logo .logo-mini { display: none; } .main-header .navbar-brand { color: #fff; } .content-header { position: relative; padding: 15px 15px 0 15px; } .content-header > h1 { margin: 0; font-size: 24px; } .content-header > h1 > small { font-size: 15px; display: inline-block; padding-left: 4px; font-weight: 300; } .content-header > .breadcrumb { float: right; background: transparent; margin-top: 0; margin-bottom: 0; font-size: 12px; padding: 7px 5px; position: absolute; top: 15px; right: 10px; border-radius: 2px; } .content-header > .breadcrumb > li > a { color: #444; text-decoration: none; display: inline-block; } .content-header > .breadcrumb > li > a > .fa, .content-header > .breadcrumb > li > a > .glyphicon, .content-header > .breadcrumb > li > a > .ion { margin-right: 5px; } .content-header > .breadcrumb > li + li:before { content: '>\00a0'; } @media (max-width: 991px) { .content-header > .breadcrumb { position: relative; margin-top: 5px; top: 0; right: 0; float: none; background: #d2d6de; padding-left: 10px; } .content-header > .breadcrumb li:before { color: #97a0b3; } } .navbar-toggle { color: #fff; border: 0; margin: 0; padding: 15px 15px; } @media (max-width: 991px) { .navbar-custom-menu .navbar-nav > li { float: left; } .navbar-custom-menu .navbar-nav { margin: 0; float: left; } .navbar-custom-menu .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; line-height: 20px; } } @media (max-width: 767px) { .main-header { position: relative; } .main-header .logo, .main-header .navbar { width: 100%; float: none; } .main-header .navbar { margin: 0; } .main-header .navbar-custom-menu { float: right; } } @media (max-width: 991px) { .navbar-collapse.pull-left { float: none !important; } .navbar-collapse.pull-left + .navbar-custom-menu { display: block; position: absolute; top: 0; right: 40px; } } /* * Component: Sidebar * ------------------ */ .main-sidebar { position: absolute; top: 0; left: 0; padding-top: 50px; min-height: 100%; width: 230px; z-index: 810; -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; } @media (max-width: 767px) { .main-sidebar { padding-top: 100px; } } @media (max-width: 767px) { .main-sidebar { -webkit-transform: translate(-230px, 0); -ms-transform: translate(-230px, 0); -o-transform: translate(-230px, 0); transform: translate(-230px, 0); } } @media (min-width: 768px) { .sidebar-collapse .main-sidebar { -webkit-transform: translate(-230px, 0); -ms-transform: translate(-230px, 0); -o-transform: translate(-230px, 0); transform: translate(-230px, 0); } } @media (max-width: 767px) { .sidebar-open .main-sidebar { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } } .sidebar { padding-bottom: 10px; } .sidebar-form input:focus { border-color: transparent; } .user-panel { position: relative; width: 100%; padding: 10px; overflow: hidden; } .user-panel:before, .user-panel:after { content: " "; display: table; } .user-panel:after { clear: both; } .user-panel > .image > img { width: 100%; max-width: 45px; height: auto; } .user-panel > .info { padding: 5px 5px 5px 15px; line-height: 1; position: absolute; left: 55px; } .user-panel > .info > p { font-weight: 600; margin-bottom: 9px; } .user-panel > .info > a { text-decoration: none; padding-right: 5px; margin-top: 3px; font-size: 11px; } .user-panel > .info > a > .fa, .user-panel > .info > a > .ion, .user-panel > .info > a > .glyphicon { margin-right: 3px; } .sidebar-menu { list-style: none; margin: 0; padding: 0; } .sidebar-menu > li { position: relative; margin: 0; padding: 0; } .sidebar-menu > li > a { padding: 12px 5px 12px 15px; display: block; } .sidebar-menu > li > a > .fa, .sidebar-menu > li > a > .glyphicon, .sidebar-menu > li > a > .ion { width: 20px; } .sidebar-menu > li .label, .sidebar-menu > li .badge { margin-right: 5px; } .sidebar-menu > li .badge { margin-top: 3px; } .sidebar-menu li.header { padding: 10px 25px 10px 15px; font-size: 12px; } .sidebar-menu li > a > .fa-angle-left, .sidebar-menu li > a > .pull-right-container > .fa-angle-left { width: auto; height: auto; padding: 0; margin-right: 10px; -webkit-transition: transform 0.5s ease; -o-transition: transform 0.5s ease; transition: transform 0.5s ease; } .sidebar-menu li > a > .fa-angle-left { position: absolute; top: 50%; right: 10px; margin-top: -8px; } .sidebar-menu .menu-open > a > .fa-angle-left, .sidebar-menu .menu-open > a > .pull-right-container > .fa-angle-left { -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); -o-transform: rotate(-90deg); transform: rotate(-90deg); } .sidebar-menu .active > .treeview-menu { display: block; } /* * Component: Sidebar Mini */ @media (min-width: 768px) { .sidebar-mini.sidebar-collapse .content-wrapper, .sidebar-mini.sidebar-collapse .right-side, .sidebar-mini.sidebar-collapse .main-footer { margin-left: 50px !important; z-index: 840; } .sidebar-mini.sidebar-collapse .main-sidebar { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); width: 50px !important; z-index: 850; } .sidebar-mini.sidebar-collapse .sidebar-menu > li { position: relative; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { margin-right: 0; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { border-top-right-radius: 4px; } .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { border-bottom-right-radius: 4px; } .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { padding-top: 5px; padding-bottom: 5px; border-bottom-right-radius: 4px; } .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, .sidebar-mini.sidebar-collapse .sidebar-form, .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, .sidebar-mini.sidebar-collapse .sidebar-menu li.header { display: none !important; -webkit-transform: translateZ(0); } .sidebar-mini.sidebar-collapse .main-header .logo { width: 50px; } .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { display: block; margin-left: -15px; margin-right: -15px; font-size: 18px; } .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { display: none; } .sidebar-mini.sidebar-collapse .main-header .navbar { margin-left: 50px; } } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { display: block !important; position: absolute; width: 180px; left: 50px; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > span { top: 0; margin-left: -3px; padding: 12px 5px 12px 20px; background-color: inherit; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container { position: relative !important; float: right; width: auto !important; left: 180px !important; top: -22px !important; z-index: 900; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container > .label:not(:first-of-type) { display: none; } .sidebar-mini:not(.sidebar-mini-expand-feature).sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { top: 44px; margin-left: 0; } .sidebar-expanded-on-hover .main-footer, .sidebar-expanded-on-hover .content-wrapper { margin-left: 50px; } .sidebar-expanded-on-hover .main-sidebar { box-shadow: 3px 0 8px rgba(0, 0, 0, 0.125); } .sidebar-menu, .main-sidebar .user-panel, .sidebar-menu > li.header { white-space: nowrap; overflow: hidden; } .sidebar-menu:hover { overflow: visible; } .sidebar-form, .sidebar-menu > li.header { overflow: hidden; text-overflow: clip; } .sidebar-menu li > a { position: relative; } .sidebar-menu li > a > .pull-right-container { position: absolute; right: 10px; top: 50%; margin-top: -7px; } /* * Component: Control sidebar. By default, this is the right sidebar. */ .control-sidebar-bg { position: fixed; z-index: 1000; bottom: 0; } .control-sidebar-bg, .control-sidebar { top: 0; right: -230px; width: 230px; -webkit-transition: right 0.3s ease-in-out; -o-transition: right 0.3s ease-in-out; transition: right 0.3s ease-in-out; } .control-sidebar { position: absolute; padding-top: 50px; z-index: 1010; } @media (max-width: 767px) { .control-sidebar { padding-top: 100px; } } .control-sidebar > .tab-content { padding: 10px 15px; } .control-sidebar.control-sidebar-open, .control-sidebar.control-sidebar-open + .control-sidebar-bg { right: 0; } .control-sidebar-open .control-sidebar-bg, .control-sidebar-open .control-sidebar { right: 0; } @media (min-width: 768px) { .control-sidebar-open .content-wrapper, .control-sidebar-open .right-side, .control-sidebar-open .main-footer { margin-right: 230px; } } .fixed .control-sidebar { position: fixed; height: 100%; overflow-y: auto; padding-bottom: 50px; } .nav-tabs.control-sidebar-tabs > li:first-of-type > a, .nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, .nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { border-left-width: 0; } .nav-tabs.control-sidebar-tabs > li > a { border-radius: 0; } .nav-tabs.control-sidebar-tabs > li > a, .nav-tabs.control-sidebar-tabs > li > a:hover { border-top: none; border-right: none; border-left: 1px solid transparent; border-bottom: 1px solid transparent; } .nav-tabs.control-sidebar-tabs > li > a .icon { font-size: 16px; } .nav-tabs.control-sidebar-tabs > li.active > a, .nav-tabs.control-sidebar-tabs > li.active > a:hover, .nav-tabs.control-sidebar-tabs > li.active > a:focus, .nav-tabs.control-sidebar-tabs > li.active > a:active { border-top: none; border-right: none; border-bottom: none; } @media (max-width: 768px) { .nav-tabs.control-sidebar-tabs { display: table; } .nav-tabs.control-sidebar-tabs > li { display: table-cell; } } .control-sidebar-heading { font-weight: 400; font-size: 16px; padding: 10px 0; margin-bottom: 10px; } .control-sidebar-subheading { display: block; font-weight: 400; font-size: 14px; } .control-sidebar-menu { list-style: none; padding: 0; margin: 0 -15px; } .control-sidebar-menu > li > a { display: block; padding: 10px 15px; } .control-sidebar-menu > li > a:before, .control-sidebar-menu > li > a:after { content: " "; display: table; } .control-sidebar-menu > li > a:after { clear: both; } .control-sidebar-menu > li > a > .control-sidebar-subheading { margin-top: 0; } .control-sidebar-menu .menu-icon { float: left; width: 35px; height: 35px; border-radius: 50%; text-align: center; line-height: 35px; } .control-sidebar-menu .menu-info { margin-left: 45px; margin-top: 3px; } .control-sidebar-menu .menu-info > .control-sidebar-subheading { margin: 0; } .control-sidebar-menu .menu-info > p { margin: 0; font-size: 11px; } .control-sidebar-menu .progress { margin: 0; } .control-sidebar-dark { color: #b8c7ce; } .control-sidebar-dark, .control-sidebar-dark + .control-sidebar-bg { background: #222d32; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs { border-bottom: #1c2529; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { background: #181f23; color: #b8c7ce; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { border-left-color: #141a1d; border-bottom-color: #141a1d; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { background: #1c2529; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { color: #fff; } .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, .control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { background: #222d32; color: #fff; } .control-sidebar-dark .control-sidebar-heading, .control-sidebar-dark .control-sidebar-subheading { color: #fff; } .control-sidebar-dark .control-sidebar-menu > li > a:hover { background: #1e282c; } .control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { color: #b8c7ce; } .control-sidebar-light { color: #5e5e5e; } .control-sidebar-light, .control-sidebar-light + .control-sidebar-bg { background: #f9fafc; border-left: 1px solid #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs { border-bottom: #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { background: #e8ecf4; color: #444444; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { border-left-color: #d2d6de; border-bottom-color: #d2d6de; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { background: #eff1f7; } .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, .control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { background: #f9fafc; color: #111; } .control-sidebar-light .control-sidebar-heading, .control-sidebar-light .control-sidebar-subheading { color: #111; } .control-sidebar-light .control-sidebar-menu { margin-left: -14px; } .control-sidebar-light .control-sidebar-menu > li > a:hover { background: #f4f4f5; } .control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { color: #5e5e5e; } /* * Component: Dropdown menus * ------------------------- */ /*Dropdowns in general*/ .dropdown-menu { box-shadow: none; border-color: #eee; } .dropdown-menu > li > a { color: #777; } .dropdown-menu > li > a > .glyphicon, .dropdown-menu > li > a > .fa, .dropdown-menu > li > a > .ion { margin-right: 10px; } .dropdown-menu > li > a:hover { background-color: #e1e3e9; color: #333; } .dropdown-menu > .divider { background-color: #eee; } .navbar-nav > .notifications-menu > .dropdown-menu, .navbar-nav > .messages-menu > .dropdown-menu, .navbar-nav > .tasks-menu > .dropdown-menu { width: 280px; padding: 0 0 0 0; margin: 0; top: 100%; } .navbar-nav > .notifications-menu > .dropdown-menu > li, .navbar-nav > .messages-menu > .dropdown-menu > li, .navbar-nav > .tasks-menu > .dropdown-menu > li { position: relative; } .navbar-nav > .notifications-menu > .dropdown-menu > li.header, .navbar-nav > .messages-menu > .dropdown-menu > li.header, .navbar-nav > .tasks-menu > .dropdown-menu > li.header { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; background-color: #ffffff; padding: 7px 10px; border-bottom: 1px solid #f4f4f4; color: #444444; font-size: 14px; } .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; font-size: 12px; background-color: #fff; padding: 7px 10px; border-bottom: 1px solid #eeeeee; color: #444 !important; text-align: center; } @media (max-width: 991px) { .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { background: #fff !important; color: #444 !important; } } .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { text-decoration: none; font-weight: normal; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu, .navbar-nav > .messages-menu > .dropdown-menu > li .menu, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu { max-height: 200px; margin: 0; padding: 0; list-style: none; overflow-x: hidden; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { display: block; white-space: nowrap; /* Prevent text from breaking */ border-bottom: 1px solid #f4f4f4; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { background: #f4f4f4; text-decoration: none; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { color: #444444; overflow: hidden; text-overflow: ellipsis; padding: 10px; } .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, .navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { width: 20px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { margin: 0; padding: 10px 10px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { margin: auto 10px auto auto; width: 40px; height: 40px; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { padding: 0; margin: 0 0 0 45px; color: #444444; font-size: 15px; position: relative; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { color: #999999; font-size: 10px; position: absolute; top: 0; right: 0; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { margin: 0 0 0 45px; font-size: 12px; color: #888888; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { content: " "; display: table; } .navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { clear: both; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { padding: 10px; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { font-size: 14px; padding: 0; margin: 0 0 10px 0; color: #666666; } .navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { padding: 0; margin: 0; } .navbar-nav > .user-menu > .dropdown-menu { border-top-right-radius: 0; border-top-left-radius: 0; padding: 1px 0 0 0; border-top-width: 0; width: 280px; } .navbar-nav > .user-menu > .dropdown-menu, .navbar-nav > .user-menu > .dropdown-menu > .user-body { border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header { height: 175px; padding: 10px; text-align: center; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { z-index: 5; height: 90px; width: 90px; border: 3px solid; border-color: transparent; border-color: rgba(255, 255, 255, 0.2); } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { z-index: 5; color: #fff; color: rgba(255, 255, 255, 0.8); font-size: 17px; margin-top: 10px; } .navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { display: block; font-size: 12px; } .navbar-nav > .user-menu > .dropdown-menu > .user-body { padding: 15px; border-bottom: 1px solid #f4f4f4; border-top: 1px solid #dddddd; } .navbar-nav > .user-menu > .dropdown-menu > .user-body:before, .navbar-nav > .user-menu > .dropdown-menu > .user-body:after { content: " "; display: table; } .navbar-nav > .user-menu > .dropdown-menu > .user-body:after { clear: both; } .navbar-nav > .user-menu > .dropdown-menu > .user-body a { color: #444 !important; } @media (max-width: 991px) { .navbar-nav > .user-menu > .dropdown-menu > .user-body a { background: #fff !important; color: #444 !important; } } .navbar-nav > .user-menu > .dropdown-menu > .user-footer { background-color: #f9f9f9; padding: 10px; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { content: " "; display: table; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { clear: both; } .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { color: #666666; } @media (max-width: 991px) { .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { background-color: #f9f9f9; } } .navbar-nav > .user-menu .user-image { float: left; width: 25px; height: 25px; border-radius: 50%; margin-right: 10px; margin-top: -2px; } @media (max-width: 767px) { .navbar-nav > .user-menu .user-image { float: none; margin-right: 0; margin-top: -8px; line-height: 10px; } } /* Add fade animation to dropdown menus by appending the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ .open:not(.dropup) > .animated-dropdown-menu { backface-visibility: visible !important; -webkit-animation: flipInX 0.7s both; -o-animation: flipInX 0.7s both; animation: flipInX 0.7s both; } @keyframes flipInX { 0% { transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transition-timing-function: ease-in; opacity: 0; } 40% { transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transition-timing-function: ease-in; } 60% { transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { transform: perspective(400px); } } @-webkit-keyframes flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); -webkit-transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); -webkit-transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { -webkit-transform: perspective(400px); } } /* Fix dropdown menu in navbars */ .navbar-custom-menu > .navbar-nav > li { position: relative; } .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { position: absolute; right: 0; left: auto; } @media (max-width: 991px) { .navbar-custom-menu > .navbar-nav { float: right; } .navbar-custom-menu > .navbar-nav > li { position: static; } .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { position: absolute; right: 5%; left: auto; border: 1px solid #ddd; background: #fff; } } /* * Component: Form * --------------- */ .form-control { border-radius: 0; box-shadow: none; border-color: #d2d6de; } .form-control:focus { border-color: #3c8dbc; box-shadow: none; } .form-control::-moz-placeholder, .form-control:-ms-input-placeholder, .form-control::-webkit-input-placeholder { color: #bbb; opacity: 1; } .form-control:not(select) { -webkit-appearance: none; -moz-appearance: none; appearance: none; } .form-group.has-success label { color: #00a65a; } .form-group.has-success .form-control, .form-group.has-success .input-group-addon { border-color: #00a65a; box-shadow: none; } .form-group.has-success .help-block { color: #00a65a; } .form-group.has-warning label { color: #f39c12; } .form-group.has-warning .form-control, .form-group.has-warning .input-group-addon { border-color: #f39c12; box-shadow: none; } .form-group.has-warning .help-block { color: #f39c12; } .form-group.has-error label { color: #dd4b39; } .form-group.has-error .form-control, .form-group.has-error .input-group-addon { border-color: #dd4b39; box-shadow: none; } .form-group.has-error .help-block { color: #dd4b39; } /* Input group */ .input-group .input-group-addon { border-radius: 0; border-color: #d2d6de; background-color: #fff; } /* button groups */ .btn-group-vertical .btn.btn-flat:first-of-type, .btn-group-vertical .btn.btn-flat:last-of-type { border-radius: 0; } .icheck > label { padding-left: 0; } /* support Font Awesome icons in form-control */ .form-control-feedback.fa { line-height: 34px; } .input-lg + .form-control-feedback.fa, .input-group-lg + .form-control-feedback.fa, .form-group-lg .form-control + .form-control-feedback.fa { line-height: 46px; } .input-sm + .form-control-feedback.fa, .input-group-sm + .form-control-feedback.fa, .form-group-sm .form-control + .form-control-feedback.fa { line-height: 30px; } /* * Component: Progress Bar * ----------------------- */ .progress, .progress > .progress-bar { -webkit-box-shadow: none; box-shadow: none; } .progress, .progress > .progress-bar, .progress .progress-bar, .progress > .progress-bar .progress-bar { border-radius: 1px; } /* size variation */ .progress.sm, .progress-sm { height: 10px; } .progress.sm, .progress-sm, .progress.sm .progress-bar, .progress-sm .progress-bar { border-radius: 1px; } .progress.xs, .progress-xs { height: 7px; } .progress.xs, .progress-xs, .progress.xs .progress-bar, .progress-xs .progress-bar { border-radius: 1px; } .progress.xxs, .progress-xxs { height: 3px; } .progress.xxs, .progress-xxs, .progress.xxs .progress-bar, .progress-xxs .progress-bar { border-radius: 1px; } /* Vertical bars */ .progress.vertical { position: relative; width: 30px; height: 200px; display: inline-block; margin-right: 10px; } .progress.vertical > .progress-bar { width: 100%; position: absolute; bottom: 0; } .progress.vertical.sm, .progress.vertical.progress-sm { width: 20px; } .progress.vertical.xs, .progress.vertical.progress-xs { width: 10px; } .progress.vertical.xxs, .progress.vertical.progress-xxs { width: 3px; } .progress-group .progress-text { font-weight: 600; } .progress-group .progress-number { float: right; } /* Remove margins from progress bars when put in a table */ .table tr > td .progress { margin: 0; } .progress-bar-light-blue, .progress-bar-primary { background-color: #3c8dbc; } .progress-striped .progress-bar-light-blue, .progress-striped .progress-bar-primary { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-green, .progress-bar-success { background-color: #00a65a; } .progress-striped .progress-bar-green, .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-aqua, .progress-bar-info { background-color: #00c0ef; } .progress-striped .progress-bar-aqua, .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-yellow, .progress-bar-warning { background-color: #f39c12; } .progress-striped .progress-bar-yellow, .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-red, .progress-bar-danger { background-color: #dd4b39; } .progress-striped .progress-bar-red, .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } /* * Component: Small Box * -------------------- */ .small-box { border-radius: 2px; position: relative; display: block; margin-bottom: 20px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .small-box > .inner { padding: 10px; } .small-box > .small-box-footer { position: relative; text-align: center; padding: 3px 0; color: #fff; color: rgba(255, 255, 255, 0.8); display: block; z-index: 10; background: rgba(0, 0, 0, 0.1); text-decoration: none; } .small-box > .small-box-footer:hover { color: #fff; background: rgba(0, 0, 0, 0.15); } .small-box h3 { font-size: 38px; font-weight: bold; margin: 0 0 10px 0; white-space: nowrap; padding: 0; } .small-box p { font-size: 15px; } .small-box p > small { display: block; color: #f9f9f9; font-size: 13px; margin-top: 5px; } .small-box h3, .small-box p { z-index: 5; } .small-box .icon { -webkit-transition: all 0.3s linear; -o-transition: all 0.3s linear; transition: all 0.3s linear; position: absolute; top: -10px; right: 10px; z-index: 0; font-size: 90px; color: rgba(0, 0, 0, 0.15); } .small-box:hover { text-decoration: none; color: #f9f9f9; } .small-box:hover .icon { font-size: 95px; } @media (max-width: 767px) { .small-box { text-align: center; } .small-box .icon { display: none; } .small-box p { font-size: 12px; } } /* * Component: Box * -------------- */ .box { position: relative; border-radius: 3px; background: #ffffff; border-top: 3px solid #d2d6de; margin-bottom: 20px; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .box.box-primary { border-top-color: #3c8dbc; } .box.box-info { border-top-color: #00c0ef; } .box.box-danger { border-top-color: #dd4b39; } .box.box-warning { border-top-color: #f39c12; } .box.box-success { border-top-color: #00a65a; } .box.box-default { border-top-color: #d2d6de; } .box.collapsed-box .box-body, .box.collapsed-box .box-footer { display: none; } .box .nav-stacked > li { border-bottom: 1px solid #f4f4f4; margin: 0; } .box .nav-stacked > li:last-of-type { border-bottom: none; } .box.height-control .box-body { max-height: 300px; overflow: auto; } .box .border-right { border-right: 1px solid #f4f4f4; } .box .border-left { border-left: 1px solid #f4f4f4; } .box.box-solid { border-top: 0; } .box.box-solid > .box-header .btn.btn-default { background: transparent; } .box.box-solid > .box-header .btn:hover, .box.box-solid > .box-header a:hover { background: rgba(0, 0, 0, 0.1); } .box.box-solid.box-default { border: 1px solid #d2d6de; } .box.box-solid.box-default > .box-header { color: #444444; background: #d2d6de; background-color: #d2d6de; } .box.box-solid.box-default > .box-header a, .box.box-solid.box-default > .box-header .btn { color: #444444; } .box.box-solid.box-primary { border: 1px solid #3c8dbc; } .box.box-solid.box-primary > .box-header { color: #ffffff; background: #3c8dbc; background-color: #3c8dbc; } .box.box-solid.box-primary > .box-header a, .box.box-solid.box-primary > .box-header .btn { color: #ffffff; } .box.box-solid.box-info { border: 1px solid #00c0ef; } .box.box-solid.box-info > .box-header { color: #ffffff; background: #00c0ef; background-color: #00c0ef; } .box.box-solid.box-info > .box-header a, .box.box-solid.box-info > .box-header .btn { color: #ffffff; } .box.box-solid.box-danger { border: 1px solid #dd4b39; } .box.box-solid.box-danger > .box-header { color: #ffffff; background: #dd4b39; background-color: #dd4b39; } .box.box-solid.box-danger > .box-header a, .box.box-solid.box-danger > .box-header .btn { color: #ffffff; } .box.box-solid.box-warning { border: 1px solid #f39c12; } .box.box-solid.box-warning > .box-header { color: #ffffff; background: #f39c12; background-color: #f39c12; } .box.box-solid.box-warning > .box-header a, .box.box-solid.box-warning > .box-header .btn { color: #ffffff; } .box.box-solid.box-success { border: 1px solid #00a65a; } .box.box-solid.box-success > .box-header { color: #ffffff; background: #00a65a; background-color: #00a65a; } .box.box-solid.box-success > .box-header a, .box.box-solid.box-success > .box-header .btn { color: #ffffff; } .box.box-solid > .box-header > .box-tools .btn { border: 0; box-shadow: none; } .box.box-solid[class*='bg'] > .box-header { color: #fff; } .box .box-group > .box { margin-bottom: 5px; } .box .knob-label { text-align: center; color: #333; font-weight: 100; font-size: 12px; margin-bottom: 0.3em; } .box > .overlay, .overlay-wrapper > .overlay, .box > .loading-img, .overlay-wrapper > .loading-img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .box .overlay, .overlay-wrapper .overlay { z-index: 50; background: rgba(255, 255, 255, 0.7); border-radius: 3px; } .box .overlay > .fa, .overlay-wrapper .overlay > .fa { position: absolute; top: 50%; left: 50%; margin-left: -15px; margin-top: -15px; color: #000; font-size: 30px; } .box .overlay.dark, .overlay-wrapper .overlay.dark { background: rgba(0, 0, 0, 0.5); } .box-header:before, .box-body:before, .box-footer:before, .box-header:after, .box-body:after, .box-footer:after { content: " "; display: table; } .box-header:after, .box-body:after, .box-footer:after { clear: both; } .box-header { color: #444; display: block; padding: 10px; position: relative; } .box-header.with-border { border-bottom: 1px solid #f4f4f4; } .collapsed-box .box-header.with-border { border-bottom: none; } .box-header > .fa, .box-header > .glyphicon, .box-header > .ion, .box-header .box-title { display: inline-block; font-size: 18px; margin: 0; line-height: 1; } .box-header > .fa, .box-header > .glyphicon, .box-header > .ion { margin-right: 5px; } .box-header > .box-tools { position: absolute; right: 10px; top: 5px; } .box-header > .box-tools [data-toggle="tooltip"] { position: relative; } .box-header > .box-tools.pull-right .dropdown-menu { right: 0; left: auto; } .box-header > .box-tools .dropdown-menu > li > a { color: #444!important; } .btn-box-tool { padding: 5px; font-size: 12px; background: transparent; color: #97a0b3; } .open .btn-box-tool, .btn-box-tool:hover { color: #606c84; } .btn-box-tool.btn:active { box-shadow: none; } .box-body { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 10px; } .no-header .box-body { border-top-right-radius: 3px; border-top-left-radius: 3px; } .box-body > .table { margin-bottom: 0; } .box-body .fc { margin-top: 5px; } .box-body .full-width-chart { margin: -19px; } .box-body.no-padding .full-width-chart { margin: -9px; } .box-body .box-pane { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 3px; } .box-body .box-pane-right { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 0; } .box-footer { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; border-top: 1px solid #f4f4f4; padding: 10px; background-color: #ffffff; } .chart-legend { margin: 10px 0; } @media (max-width: 991px) { .chart-legend > li { float: left; margin-right: 10px; } } .box-comments { background: #f7f7f7; } .box-comments .box-comment { padding: 8px 0; border-bottom: 1px solid #eee; } .box-comments .box-comment:before, .box-comments .box-comment:after { content: " "; display: table; } .box-comments .box-comment:after { clear: both; } .box-comments .box-comment:last-of-type { border-bottom: 0; } .box-comments .box-comment:first-of-type { padding-top: 0; } .box-comments .box-comment img { float: left; } .box-comments .comment-text { margin-left: 40px; color: #555; } .box-comments .username { color: #444; display: block; font-weight: 600; } .box-comments .text-muted { font-weight: 400; font-size: 12px; } /* Widget: TODO LIST */ .todo-list { margin: 0; padding: 0; list-style: none; overflow: auto; } .todo-list > li { border-radius: 2px; padding: 10px; background: #f4f4f4; margin-bottom: 2px; border-left: 2px solid #e6e7e8; color: #444; } .todo-list > li:last-of-type { margin-bottom: 0; } .todo-list > li > input[type='checkbox'] { margin: 0 10px 0 5px; } .todo-list > li .text { display: inline-block; margin-left: 5px; font-weight: 600; } .todo-list > li .label { margin-left: 10px; font-size: 9px; } .todo-list > li .tools { display: none; float: right; color: #dd4b39; } .todo-list > li .tools > .fa, .todo-list > li .tools > .glyphicon, .todo-list > li .tools > .ion { margin-right: 5px; cursor: pointer; } .todo-list > li:hover .tools { display: inline-block; } .todo-list > li.done { color: #999; } .todo-list > li.done .text { text-decoration: line-through; font-weight: 500; } .todo-list > li.done .label { background: #d2d6de !important; } .todo-list .danger { border-left-color: #dd4b39; } .todo-list .warning { border-left-color: #f39c12; } .todo-list .info { border-left-color: #00c0ef; } .todo-list .success { border-left-color: #00a65a; } .todo-list .primary { border-left-color: #3c8dbc; } .todo-list .handle { display: inline-block; cursor: move; margin: 0 5px; } /* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ .chat { padding: 5px 20px 5px 10px; } .chat .item { margin-bottom: 10px; } .chat .item:before, .chat .item:after { content: " "; display: table; } .chat .item:after { clear: both; } .chat .item > img { width: 40px; height: 40px; border: 2px solid transparent; border-radius: 50%; } .chat .item > .online { border: 2px solid #00a65a; } .chat .item > .offline { border: 2px solid #dd4b39; } .chat .item > .message { margin-left: 55px; margin-top: -40px; } .chat .item > .message > .name { display: block; font-weight: 600; } .chat .item > .attachment { border-radius: 3px; background: #f4f4f4; margin-left: 65px; margin-right: 15px; padding: 10px; } .chat .item > .attachment > h4 { margin: 0 0 5px 0; font-weight: 600; font-size: 14px; } .chat .item > .attachment > p, .chat .item > .attachment > .filename { font-weight: 600; font-size: 13px; font-style: italic; margin: 0; } .chat .item > .attachment:before, .chat .item > .attachment:after { content: " "; display: table; } .chat .item > .attachment:after { clear: both; } .box-input { max-width: 200px; } .modal .panel-body { color: #444; } /* * Component: Info Box * ------------------- */ .info-box { display: block; min-height: 90px; background: #fff; width: 100%; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 2px; margin-bottom: 15px; } .info-box small { font-size: 14px; } .info-box .progress { background: rgba(0, 0, 0, 0.2); margin: 5px -10px 5px -10px; height: 2px; } .info-box .progress, .info-box .progress .progress-bar { border-radius: 0; } .info-box .progress .progress-bar { background: #fff; } .info-box-icon { border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; display: block; float: left; height: 90px; width: 90px; text-align: center; font-size: 45px; line-height: 90px; background: rgba(0, 0, 0, 0.2); } .info-box-icon > img { max-width: 100%; } .info-box-content { padding: 5px 10px; margin-left: 90px; } .info-box-number { display: block; font-weight: bold; font-size: 18px; } .progress-description, .info-box-text { display: block; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .info-box-text { text-transform: uppercase; } .info-box-more { display: block; } .progress-description { margin: 0; } /* * Component: Timeline * ------------------- */ .timeline { position: relative; margin: 0 0 30px 0; padding: 0; list-style: none; } .timeline:before { content: ''; position: absolute; top: 0; bottom: 0; width: 4px; background: #ddd; left: 31px; margin: 0; border-radius: 2px; } .timeline > li { position: relative; margin-right: 10px; margin-bottom: 15px; } .timeline > li:before, .timeline > li:after { content: " "; display: table; } .timeline > li:after { clear: both; } .timeline > li > .timeline-item { -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; margin-top: 0; background: #fff; color: #444; margin-left: 60px; margin-right: 15px; padding: 0; position: relative; } .timeline > li > .timeline-item > .time { color: #999; float: right; padding: 10px; font-size: 12px; } .timeline > li > .timeline-item > .timeline-header { margin: 0; color: #555; border-bottom: 1px solid #f4f4f4; padding: 10px; font-size: 16px; line-height: 1.1; } .timeline > li > .timeline-item > .timeline-header > a { font-weight: 600; } .timeline > li > .timeline-item > .timeline-body, .timeline > li > .timeline-item > .timeline-footer { padding: 10px; } .timeline > li > .fa, .timeline > li > .glyphicon, .timeline > li > .ion { width: 30px; height: 30px; font-size: 15px; line-height: 30px; position: absolute; color: #666; background: #d2d6de; border-radius: 50%; text-align: center; left: 18px; top: 0; } .timeline > .time-label > span { font-weight: 600; padding: 5px; display: inline-block; background-color: #fff; border-radius: 4px; } .timeline-inverse > li > .timeline-item { background: #f0f0f0; border: 1px solid #ddd; -webkit-box-shadow: none; box-shadow: none; } .timeline-inverse > li > .timeline-item > .timeline-header { border-bottom-color: #ddd; } /* * Component: Button * ----------------- */ .btn { border-radius: 3px; -webkit-box-shadow: none; box-shadow: none; border: 1px solid transparent; } .btn.uppercase { text-transform: uppercase; } .btn.btn-flat { border-radius: 0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; border-width: 1px; } .btn:active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn:focus { outline: none; } .btn.btn-file { position: relative; overflow: hidden; } .btn.btn-file > input[type='file'] { position: absolute; top: 0; right: 0; min-width: 100%; min-height: 100%; font-size: 100px; text-align: right; opacity: 0; filter: alpha(opacity=0); outline: none; background: white; cursor: inherit; display: block; } .btn-default { background-color: #f4f4f4; color: #444; border-color: #ddd; } .btn-default:hover, .btn-default:active, .btn-default.hover { background-color: #e7e7e7; } .btn-primary { background-color: #3c8dbc; border-color: #367fa9; } .btn-primary:hover, .btn-primary:active, .btn-primary.hover { background-color: #367fa9; } .btn-success { background-color: #00a65a; border-color: #008d4c; } .btn-success:hover, .btn-success:active, .btn-success.hover { background-color: #008d4c; } .btn-info { background-color: #00c0ef; border-color: #00acd6; } .btn-info:hover, .btn-info:active, .btn-info.hover { background-color: #00acd6; } .btn-danger { background-color: #dd4b39; border-color: #d73925; } .btn-danger:hover, .btn-danger:active, .btn-danger.hover { background-color: #d73925; } .btn-warning { background-color: #f39c12; border-color: #e08e0b; } .btn-warning:hover, .btn-warning:active, .btn-warning.hover { background-color: #e08e0b; } .btn-outline { border: 1px solid #fff; background: transparent; color: #fff; } .btn-outline:hover, .btn-outline:focus, .btn-outline:active { color: rgba(255, 255, 255, 0.7); border-color: rgba(255, 255, 255, 0.7); } .btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn[class*='bg-']:hover { -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); } .btn-app { border-radius: 3px; position: relative; padding: 15px 5px; margin: 0 0 10px 10px; min-width: 80px; height: 60px; text-align: center; color: #666; border: 1px solid #ddd; background-color: #f4f4f4; font-size: 12px; } .btn-app > .fa, .btn-app > .glyphicon, .btn-app > .ion { font-size: 20px; display: block; } .btn-app:hover { background: #f4f4f4; color: #444; border-color: #aaa; } .btn-app:active, .btn-app:focus { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-app > .badge { position: absolute; top: -3px; right: -10px; font-size: 10px; font-weight: 400; } /* * Component: Callout * ------------------ */ .callout { border-radius: 3px; margin: 0 0 20px 0; padding: 15px 30px 15px 15px; border-left: 5px solid #eee; } .callout a { color: #fff; text-decoration: underline; } .callout a:hover { color: #eee; } .callout h4 { margin-top: 0; font-weight: 600; } .callout p:last-child { margin-bottom: 0; } .callout code, .callout .highlight { background-color: #fff; } .callout.callout-danger { border-color: #c23321; } .callout.callout-warning { border-color: #c87f0a; } .callout.callout-info { border-color: #0097bc; } .callout.callout-success { border-color: #00733e; } /* * Component: alert * ---------------- */ .alert { border-radius: 3px; } .alert h4 { font-weight: 600; } .alert .icon { margin-right: 10px; } .alert .close { color: #000; opacity: 0.2; filter: alpha(opacity=20); } .alert .close:hover { opacity: 0.5; filter: alpha(opacity=50); } .alert a { color: #fff; text-decoration: underline; } .alert-success { border-color: #008d4c; } .alert-danger, .alert-error { border-color: #d73925; } .alert-warning { border-color: #e08e0b; } .alert-info { border-color: #00acd6; } /* * Component: Nav * -------------- */ .nav > li > a:hover, .nav > li > a:active, .nav > li > a:focus { color: #444; background: #f7f7f7; } /* NAV PILLS */ .nav-pills > li > a { border-radius: 0; border-top: 3px solid transparent; color: #444; } .nav-pills > li > a > .fa, .nav-pills > li > a > .glyphicon, .nav-pills > li > a > .ion { margin-right: 5px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { border-top-color: #3c8dbc; } .nav-pills > li.active > a { font-weight: 600; } /* NAV STACKED */ .nav-stacked > li > a { border-radius: 0; border-top: 0; border-left: 3px solid transparent; color: #444; } .nav-stacked > li.active > a, .nav-stacked > li.active > a:hover { background: transparent; color: #444; border-top: 0; border-left-color: #3c8dbc; } .nav-stacked > li.header { border-bottom: 1px solid #ddd; color: #777; margin-bottom: 10px; padding: 5px 10px; text-transform: uppercase; } /* NAV TABS */ .nav-tabs-custom { margin-bottom: 20px; background: #fff; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; } .nav-tabs-custom > .nav-tabs { margin: 0; border-bottom-color: #f4f4f4; border-top-right-radius: 3px; border-top-left-radius: 3px; } .nav-tabs-custom > .nav-tabs > li { border-top: 3px solid transparent; margin-bottom: -2px; margin-right: 5px; } .nav-tabs-custom > .nav-tabs > li.disabled > a { color: #777; } .nav-tabs-custom > .nav-tabs > li > a { color: #444; border-radius: 0; } .nav-tabs-custom > .nav-tabs > li > a.text-muted { color: #999; } .nav-tabs-custom > .nav-tabs > li > a, .nav-tabs-custom > .nav-tabs > li > a:hover { background: transparent; margin: 0; } .nav-tabs-custom > .nav-tabs > li > a:hover { color: #999; } .nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, .nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, .nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { border-color: transparent; } .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #3c8dbc; } .nav-tabs-custom > .nav-tabs > li.active > a, .nav-tabs-custom > .nav-tabs > li.active:hover > a { background-color: #fff; color: #444; } .nav-tabs-custom > .nav-tabs > li.active > a { border-top-color: transparent; border-left-color: #f4f4f4; border-right-color: #f4f4f4; } .nav-tabs-custom > .nav-tabs > li:first-of-type { margin-left: 0; } .nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { border-left-color: transparent; } .nav-tabs-custom > .nav-tabs.pull-right { float: none !important; } .nav-tabs-custom > .nav-tabs.pull-right > li { float: right; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { margin-right: 0; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { border-left-width: 1px; } .nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { border-left-color: #f4f4f4; border-right-color: transparent; } .nav-tabs-custom > .nav-tabs > li.header { line-height: 35px; padding: 0 10px; font-size: 20px; color: #444; } .nav-tabs-custom > .nav-tabs > li.header > .fa, .nav-tabs-custom > .nav-tabs > li.header > .glyphicon, .nav-tabs-custom > .nav-tabs > li.header > .ion { margin-right: 5px; } .nav-tabs-custom > .tab-content { background: #fff; padding: 10px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .nav-tabs-custom .dropdown.open > a:active, .nav-tabs-custom .dropdown.open > a:focus { background: transparent; color: #999; } .nav-tabs-custom.tab-primary > .nav-tabs > li.active { border-top-color: #3c8dbc; } .nav-tabs-custom.tab-info > .nav-tabs > li.active { border-top-color: #00c0ef; } .nav-tabs-custom.tab-danger > .nav-tabs > li.active { border-top-color: #dd4b39; } .nav-tabs-custom.tab-warning > .nav-tabs > li.active { border-top-color: #f39c12; } .nav-tabs-custom.tab-success > .nav-tabs > li.active { border-top-color: #00a65a; } .nav-tabs-custom.tab-default > .nav-tabs > li.active { border-top-color: #d2d6de; } /* PAGINATION */ .pagination > li > a { background: #fafafa; color: #666; } .pagination.pagination-flat > li > a { border-radius: 0 !important; } /* * Component: Products List * ------------------------ */ .products-list { list-style: none; margin: 0; padding: 0; } .products-list > .item { border-radius: 3px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); padding: 10px 0; background: #fff; } .products-list > .item:before, .products-list > .item:after { content: " "; display: table; } .products-list > .item:after { clear: both; } .products-list .product-img { float: left; } .products-list .product-img img { width: 50px; height: 50px; } .products-list .product-info { margin-left: 60px; } .products-list .product-title { font-weight: 600; } .products-list .product-description { display: block; color: #999; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .product-list-in-box > .item { -webkit-box-shadow: none; box-shadow: none; border-radius: 0; border-bottom: 1px solid #f4f4f4; } .product-list-in-box > .item:last-of-type { border-bottom-width: 0; } /* * Component: Table * ---------------- */ .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { border-top: 1px solid #f4f4f4; } .table > thead > tr > th { border-bottom: 2px solid #f4f4f4; } .table tr td .progress { margin-top: 5px; } .table-bordered { border: 1px solid #f4f4f4; } .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 #f4f4f4; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table.no-border, .table.no-border td, .table.no-border th { border: 0; } /* .text-center in tables */ table.text-center, table.text-center td, table.text-center th { text-align: center; } .table.align th { text-align: left; } .table.align td { text-align: right; } /* * Component: Label * ---------------- */ .label-default { background-color: #d2d6de; color: #444; } /* * Component: Direct Chat * ---------------------- */ .direct-chat .box-body { border-bottom-right-radius: 0; border-bottom-left-radius: 0; position: relative; overflow-x: hidden; padding: 0; } .direct-chat.chat-pane-open .direct-chat-contacts { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .direct-chat-messages { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); padding: 10px; height: 250px; overflow: auto; } .direct-chat-msg, .direct-chat-text { display: block; } .direct-chat-msg { margin-bottom: 10px; } .direct-chat-msg:before, .direct-chat-msg:after { content: " "; display: table; } .direct-chat-msg:after { clear: both; } .direct-chat-messages, .direct-chat-contacts { -webkit-transition: -webkit-transform 0.5s ease-in-out; -moz-transition: -moz-transform 0.5s ease-in-out; -o-transition: -o-transform 0.5s ease-in-out; transition: transform 0.5s ease-in-out; } .direct-chat-text { border-radius: 5px; position: relative; padding: 5px 10px; background: #d2d6de; border: 1px solid #d2d6de; margin: 5px 0 0 50px; color: #444444; } .direct-chat-text:after, .direct-chat-text:before { position: absolute; right: 100%; top: 15px; border: solid transparent; border-right-color: #d2d6de; content: ' '; height: 0; width: 0; pointer-events: none; } .direct-chat-text:after { border-width: 5px; margin-top: -5px; } .direct-chat-text:before { border-width: 6px; margin-top: -6px; } .right .direct-chat-text { margin-right: 50px; margin-left: 0; } .right .direct-chat-text:after, .right .direct-chat-text:before { right: auto; left: 100%; border-right-color: transparent; border-left-color: #d2d6de; } .direct-chat-img { border-radius: 50%; float: left; width: 40px; height: 40px; } .right .direct-chat-img { float: right; } .direct-chat-info { display: block; margin-bottom: 2px; font-size: 12px; } .direct-chat-name { font-weight: 600; } .direct-chat-timestamp { color: #999; } .direct-chat-contacts-open .direct-chat-contacts { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .direct-chat-contacts { -webkit-transform: translate(101%, 0); -ms-transform: translate(101%, 0); -o-transform: translate(101%, 0); transform: translate(101%, 0); position: absolute; top: 0; bottom: 0; height: 250px; width: 100%; background: #222d32; color: #fff; overflow: auto; } .contacts-list > li { border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 10px; margin: 0; } .contacts-list > li:before, .contacts-list > li:after { content: " "; display: table; } .contacts-list > li:after { clear: both; } .contacts-list > li:last-of-type { border-bottom: none; } .contacts-list-img { border-radius: 50%; width: 40px; float: left; } .contacts-list-info { margin-left: 45px; color: #fff; } .contacts-list-name, .contacts-list-status { display: block; } .contacts-list-name { font-weight: 600; } .contacts-list-status { font-size: 12px; } .contacts-list-date { color: #aaa; font-weight: normal; } .contacts-list-msg { color: #999; } .direct-chat-danger .right > .direct-chat-text { background: #dd4b39; border-color: #dd4b39; color: #ffffff; } .direct-chat-danger .right > .direct-chat-text:after, .direct-chat-danger .right > .direct-chat-text:before { border-left-color: #dd4b39; } .direct-chat-primary .right > .direct-chat-text { background: #3c8dbc; border-color: #3c8dbc; color: #ffffff; } .direct-chat-primary .right > .direct-chat-text:after, .direct-chat-primary .right > .direct-chat-text:before { border-left-color: #3c8dbc; } .direct-chat-warning .right > .direct-chat-text { background: #f39c12; border-color: #f39c12; color: #ffffff; } .direct-chat-warning .right > .direct-chat-text:after, .direct-chat-warning .right > .direct-chat-text:before { border-left-color: #f39c12; } .direct-chat-info .right > .direct-chat-text { background: #00c0ef; border-color: #00c0ef; color: #ffffff; } .direct-chat-info .right > .direct-chat-text:after, .direct-chat-info .right > .direct-chat-text:before { border-left-color: #00c0ef; } .direct-chat-success .right > .direct-chat-text { background: #00a65a; border-color: #00a65a; color: #ffffff; } .direct-chat-success .right > .direct-chat-text:after, .direct-chat-success .right > .direct-chat-text:before { border-left-color: #00a65a; } /* * Component: Users List * --------------------- */ .users-list > li { width: 25%; float: left; padding: 10px; text-align: center; } .users-list > li img { border-radius: 50%; max-width: 100%; height: auto; } .users-list > li > a:hover, .users-list > li > a:hover .users-list-name { color: #999; } .users-list-name, .users-list-date { display: block; } .users-list-name { font-weight: 600; color: #444; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .users-list-date { color: #999; font-size: 12px; } /* * Component: Carousel * ------------------- */ .carousel-control.left, .carousel-control.right { background-image: none; } .carousel-control > .fa { font-size: 40px; position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -20px; } /* * Component: modal * ---------------- */ .modal { background: rgba(0, 0, 0, 0.3); } .modal-content { border-radius: 0; -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); border: 0; } @media (min-width: 768px) { .modal-content { -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); } } .modal-header { border-bottom-color: #f4f4f4; } .modal-footer { border-top-color: #f4f4f4; } .modal-primary .modal-header, .modal-primary .modal-footer { border-color: #307095; } .modal-warning .modal-header, .modal-warning .modal-footer { border-color: #c87f0a; } .modal-info .modal-header, .modal-info .modal-footer { border-color: #0097bc; } .modal-success .modal-header, .modal-success .modal-footer { border-color: #00733e; } .modal-danger .modal-header, .modal-danger .modal-footer { border-color: #c23321; } /* * Component: Social Widgets * ------------------------- */ .box-widget { border: none; position: relative; } .widget-user .widget-user-header { padding: 20px; height: 120px; border-top-right-radius: 3px; border-top-left-radius: 3px; } .widget-user .widget-user-username { margin-top: 0; margin-bottom: 5px; font-size: 25px; font-weight: 300; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); } .widget-user .widget-user-desc { margin-top: 0; } .widget-user .widget-user-image { position: absolute; top: 65px; left: 50%; margin-left: -45px; } .widget-user .widget-user-image > img { width: 90px; height: auto; border: 3px solid #fff; } .widget-user .box-footer { padding-top: 30px; } .widget-user-2 .widget-user-header { padding: 20px; border-top-right-radius: 3px; border-top-left-radius: 3px; } .widget-user-2 .widget-user-username { margin-top: 5px; margin-bottom: 5px; font-size: 25px; font-weight: 300; } .widget-user-2 .widget-user-desc { margin-top: 0; } .widget-user-2 .widget-user-username, .widget-user-2 .widget-user-desc { margin-left: 75px; } .widget-user-2 .widget-user-image > img { width: 65px; height: auto; float: left; } .treeview-menu { display: none; list-style: none; padding: 0; margin: 0; padding-left: 5px; } .treeview-menu .treeview-menu { padding-left: 20px; } .treeview-menu > li { margin: 0; } .treeview-menu > li > a { padding: 5px 5px 5px 15px; display: block; font-size: 14px; } .treeview-menu > li > a > .fa, .treeview-menu > li > a > .glyphicon, .treeview-menu > li > a > .ion { width: 20px; } .treeview-menu > li > a > .pull-right-container > .fa-angle-left, .treeview-menu > li > a > .pull-right-container > .fa-angle-down, .treeview-menu > li > a > .fa-angle-left, .treeview-menu > li > a > .fa-angle-down { width: auto; } /* * Page: Mailbox * ------------- */ .mailbox-messages > .table { margin: 0; } .mailbox-controls { padding: 5px; } .mailbox-controls.with-border { border-bottom: 1px solid #f4f4f4; } .mailbox-read-info { border-bottom: 1px solid #f4f4f4; padding: 10px; } .mailbox-read-info h3 { font-size: 20px; margin: 0; } .mailbox-read-info h5 { margin: 0; padding: 5px 0 0 0; } .mailbox-read-time { color: #999; font-size: 13px; } .mailbox-read-message { padding: 10px; } .mailbox-attachments li { float: left; width: 200px; border: 1px solid #eee; margin-bottom: 10px; margin-right: 10px; } .mailbox-attachment-name { font-weight: bold; color: #666; } .mailbox-attachment-icon, .mailbox-attachment-info, .mailbox-attachment-size { display: block; } .mailbox-attachment-info { padding: 10px; background: #f4f4f4; } .mailbox-attachment-size { color: #999; font-size: 12px; } .mailbox-attachment-icon { text-align: center; font-size: 65px; color: #666; padding: 20px 10px; } .mailbox-attachment-icon.has-img { padding: 0; } .mailbox-attachment-icon.has-img > img { max-width: 100%; height: auto; } /* * Page: Lock Screen * ----------------- */ /* ADD THIS CLASS TO THE TAG */ .lockscreen { background: #d2d6de; } .lockscreen-logo { font-size: 35px; text-align: center; margin-bottom: 25px; font-weight: 300; } .lockscreen-logo a { color: #444; } .lockscreen-wrapper { max-width: 400px; margin: 0 auto; margin-top: 10%; } /* User name [optional] */ .lockscreen .lockscreen-name { text-align: center; font-weight: 600; } /* Will contain the image and the sign in form */ .lockscreen-item { border-radius: 4px; padding: 0; background: #fff; position: relative; margin: 10px auto 30px auto; width: 290px; } /* User image */ .lockscreen-image { border-radius: 50%; position: absolute; left: -10px; top: -25px; background: #fff; padding: 5px; z-index: 10; } .lockscreen-image > img { border-radius: 50%; width: 70px; height: 70px; } /* Contains the password input and the login button */ .lockscreen-credentials { margin-left: 70px; } .lockscreen-credentials .form-control { border: 0; } .lockscreen-credentials .btn { background-color: #fff; border: 0; padding: 0 10px; } .lockscreen-footer { margin-top: 10px; } /* * Page: Login & Register * ---------------------- */ .login-logo, .register-logo { font-size: 35px; text-align: center; margin-bottom: 25px; font-weight: 300; } .login-logo a, .register-logo a { color: #444; } .login-page, .register-page { background: #d2d6de; } .login-box, .register-box { width: 360px; margin: 7% auto; } @media (max-width: 768px) { .login-box, .register-box { width: 90%; margin-top: 20px; } } .login-box-body, .register-box-body { background: #fff; padding: 20px; border-top: 0; color: #666; } .login-box-body .form-control-feedback, .register-box-body .form-control-feedback { color: #777; } .login-box-msg, .register-box-msg { margin: 0; text-align: center; padding: 0 20px 20px 20px; } .social-auth-links { margin: 10px 0; } /* * Page: 400 and 500 error pages * ------------------------------ */ .error-page { width: 600px; margin: 20px auto 0 auto; } @media (max-width: 991px) { .error-page { width: 100%; } } .error-page > .headline { float: left; font-size: 100px; font-weight: 300; } @media (max-width: 991px) { .error-page > .headline { float: none; text-align: center; } } .error-page > .error-content { margin-left: 190px; display: block; } @media (max-width: 991px) { .error-page > .error-content { margin-left: 0; } } .error-page > .error-content > h3 { font-weight: 300; font-size: 25px; } @media (max-width: 991px) { .error-page > .error-content > h3 { text-align: center; } } /* * Page: Invoice * ------------- */ .invoice { position: relative; background: #fff; border: 1px solid #f4f4f4; padding: 20px; margin: 10px 25px; } .invoice-title { margin-top: 0; } /* * Page: Profile * ------------- */ .profile-user-img { margin: 0 auto; width: 100px; padding: 3px; border: 3px solid #d2d6de; } .profile-username { font-size: 21px; margin-top: 5px; } .post { border-bottom: 1px solid #d2d6de; margin-bottom: 15px; padding-bottom: 15px; color: #666; } .post:last-of-type { border-bottom: 0; margin-bottom: 0; padding-bottom: 0; } .post .user-block { margin-bottom: 15px; } /* * General: Miscellaneous * ---------------------- */ .pad { padding: 10px; } .margin { margin: 10px; } .margin-bottom { margin-bottom: 20px; } .margin-bottom-none { margin-bottom: 0; } .margin-r-5 { margin-right: 5px; } .inline { display: inline; } .description-block { display: block; margin: 10px 0; text-align: center; } .description-block.margin-bottom { margin-bottom: 25px; } .description-block > .description-header { margin: 0; padding: 0; font-weight: 600; font-size: 16px; } .description-block > .description-text { text-transform: uppercase; } .bg-red, .bg-yellow, .bg-aqua, .bg-blue, .bg-light-blue, .bg-green, .bg-navy, .bg-teal, .bg-olive, .bg-lime, .bg-orange, .bg-fuchsia, .bg-purple, .bg-maroon, .bg-black, .bg-red-active, .bg-yellow-active, .bg-aqua-active, .bg-blue-active, .bg-light-blue-active, .bg-green-active, .bg-navy-active, .bg-teal-active, .bg-olive-active, .bg-lime-active, .bg-orange-active, .bg-fuchsia-active, .bg-purple-active, .bg-maroon-active, .bg-black-active, .callout.callout-danger, .callout.callout-warning, .callout.callout-info, .callout.callout-success, .alert-success, .alert-danger, .alert-error, .alert-warning, .alert-info, .label-danger, .label-info, .label-warning, .label-primary, .label-success, .modal-primary .modal-body, .modal-primary .modal-header, .modal-primary .modal-footer, .modal-warning .modal-body, .modal-warning .modal-header, .modal-warning .modal-footer, .modal-info .modal-body, .modal-info .modal-header, .modal-info .modal-footer, .modal-success .modal-body, .modal-success .modal-header, .modal-success .modal-footer, .modal-danger .modal-body, .modal-danger .modal-header, .modal-danger .modal-footer { color: #fff !important; } .bg-gray { color: #000; background-color: #d2d6de !important; } .bg-gray-light { background-color: #f7f7f7; } .bg-black { background-color: #111111 !important; } .bg-red, .callout.callout-danger, .alert-danger, .alert-error, .label-danger, .modal-danger .modal-body { background-color: #dd4b39 !important; } .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body { background-color: #f39c12 !important; } .bg-aqua, .callout.callout-info, .alert-info, .label-info, .modal-info .modal-body { background-color: #00c0ef !important; } .bg-blue { background-color: #0073b7 !important; } .bg-light-blue, .label-primary, .modal-primary .modal-body { background-color: #3c8dbc !important; } .bg-green, .callout.callout-success, .alert-success, .label-success, .modal-success .modal-body { background-color: #00a65a !important; } .bg-navy { background-color: #001f3f !important; } .bg-teal { background-color: #39cccc !important; } .bg-olive { background-color: #3d9970 !important; } .bg-lime { background-color: #01ff70 !important; } .bg-orange { background-color: #ff851b !important; } .bg-fuchsia { background-color: #f012be !important; } .bg-purple { background-color: #605ca8 !important; } .bg-maroon { background-color: #d81b60 !important; } .bg-gray-active { color: #000; background-color: #b5bbc8 !important; } .bg-black-active { background-color: #000000 !important; } .bg-red-active, .modal-danger .modal-header, .modal-danger .modal-footer { background-color: #d33724 !important; } .bg-yellow-active, .modal-warning .modal-header, .modal-warning .modal-footer { background-color: #db8b0b !important; } .bg-aqua-active, .modal-info .modal-header, .modal-info .modal-footer { background-color: #00a7d0 !important; } .bg-blue-active { background-color: #005384 !important; } .bg-light-blue-active, .modal-primary .modal-header, .modal-primary .modal-footer { background-color: #357ca5 !important; } .bg-green-active, .modal-success .modal-header, .modal-success .modal-footer { background-color: #008d4c !important; } .bg-navy-active { background-color: #001a35 !important; } .bg-teal-active { background-color: #30bbbb !important; } .bg-olive-active { background-color: #368763 !important; } .bg-lime-active { background-color: #00e765 !important; } .bg-orange-active { background-color: #ff7701 !important; } .bg-fuchsia-active { background-color: #db0ead !important; } .bg-purple-active { background-color: #555299 !important; } .bg-maroon-active { background-color: #ca195a !important; } [class^="bg-"].disabled { opacity: 0.65; filter: alpha(opacity=65); } .text-red { color: #dd4b39 !important; } .text-yellow { color: #f39c12 !important; } .text-aqua { color: #00c0ef !important; } .text-blue { color: #0073b7 !important; } .text-black { color: #111111 !important; } .text-light-blue { color: #3c8dbc !important; } .text-green { color: #00a65a !important; } .text-gray { color: #d2d6de !important; } .text-navy { color: #001f3f !important; } .text-teal { color: #39cccc !important; } .text-olive { color: #3d9970 !important; } .text-lime { color: #01ff70 !important; } .text-orange { color: #ff851b !important; } .text-fuchsia { color: #f012be !important; } .text-purple { color: #605ca8 !important; } .text-maroon { color: #d81b60 !important; } .link-muted { color: #7a869d; } .link-muted:hover, .link-muted:focus { color: #606c84; } .link-black { color: #666; } .link-black:hover, .link-black:focus { color: #999; } .hide { display: none !important; } .no-border { border: 0 !important; } .no-padding { padding: 0 !important; } .no-margin { margin: 0 !important; } .no-shadow { box-shadow: none !important; } .list-unstyled, .chart-legend, .contacts-list, .users-list, .mailbox-attachments { list-style: none; margin: 0; padding: 0; } .list-group-unbordered > .list-group-item { border-left: 0; border-right: 0; border-radius: 0; padding-left: 0; padding-right: 0; } .flat { border-radius: 0 !important; } .text-bold, .text-bold.table td, .text-bold.table th { font-weight: 700; } .text-sm { font-size: 12px; } .jqstooltip { padding: 5px !important; width: auto !important; height: auto !important; } .bg-teal-gradient { background: #39cccc !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; background: -o-linear-gradient(#7adddd, #39cccc) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; color: #fff; } .bg-light-blue-gradient { background: #3c8dbc !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; color: #fff; } .bg-blue-gradient { background: #0073b7 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; background: -o-linear-gradient(#0089db, #0073b7) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; color: #fff; } .bg-aqua-gradient { background: #00c0ef !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; background: -o-linear-gradient(#14d1ff, #00c0ef) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; color: #fff; } .bg-yellow-gradient { background: #f39c12 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; background: -o-linear-gradient(#f7bc60, #f39c12) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; color: #fff; } .bg-purple-gradient { background: #605ca8 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; background: -o-linear-gradient(#9491c4, #605ca8) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; color: #fff; } .bg-green-gradient { background: #00a65a !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; background: -o-linear-gradient(#00ca6d, #00a65a) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; color: #fff; } .bg-red-gradient { background: #dd4b39 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; background: -o-linear-gradient(#e47365, #dd4b39) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; color: #fff; } .bg-black-gradient { background: #111111 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; background: -o-linear-gradient(#2b2b2b, #111111) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; color: #fff; } .bg-maroon-gradient { background: #d81b60 !important; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; background: -o-linear-gradient(#e73f7c, #d81b60) !important; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; color: #fff; } .description-block .description-icon { font-size: 16px; } .no-pad-top { padding-top: 0; } .position-static { position: static !important; } .list-header { font-size: 15px; padding: 10px 4px; font-weight: bold; color: #666; } .list-seperator { height: 1px; background: #f4f4f4; margin: 15px 0 9px 0; } .list-link > a { padding: 4px; color: #777; } .list-link > a:hover { color: #222; } .font-light { font-weight: 300; } .user-block:before, .user-block:after { content: " "; display: table; } .user-block:after { clear: both; } .user-block img { width: 40px; height: 40px; float: left; } .user-block .username, .user-block .description, .user-block .comment { display: block; margin-left: 50px; } .user-block .username { font-size: 16px; font-weight: 600; } .user-block .description { color: #999; font-size: 13px; } .user-block.user-block-sm .username, .user-block.user-block-sm .description, .user-block.user-block-sm .comment { margin-left: 40px; } .user-block.user-block-sm .username { font-size: 14px; } .img-sm, .img-md, .img-lg, .box-comments .box-comment img, .user-block.user-block-sm img { float: left; } .img-sm, .box-comments .box-comment img, .user-block.user-block-sm img { width: 30px !important; height: 30px !important; } .img-sm + .img-push { margin-left: 40px; } .img-md { width: 60px; height: 60px; } .img-md + .img-push { margin-left: 70px; } .img-lg { width: 100px; height: 100px; } .img-lg + .img-push { margin-left: 110px; } .img-bordered { border: 3px solid #d2d6de; padding: 3px; } .img-bordered-sm { border: 2px solid #d2d6de; padding: 2px; } .attachment-block { border: 1px solid #f4f4f4; padding: 5px; margin-bottom: 10px; background: #f7f7f7; } .attachment-block .attachment-img { max-width: 100px; max-height: 100px; height: auto; float: left; } .attachment-block .attachment-pushed { margin-left: 110px; } .attachment-block .attachment-heading { margin: 0; } .attachment-block .attachment-text { color: #555; } .connectedSortable { min-height: 100px; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sort-highlight { background: #f4f4f4; border: 1px dashed #ddd; margin-bottom: 10px; } .full-opacity-hover { opacity: 0.65; filter: alpha(opacity=65); } .full-opacity-hover:hover { opacity: 1; filter: alpha(opacity=100); } .chart { position: relative; overflow: hidden; width: 100%; } .chart svg, .chart canvas { width: 100% !important; } /* * Misc: print * ----------- */ @media print { .no-print, .main-sidebar, .left-side, .main-header, .content-header { display: none !important; } .content-wrapper, .right-side, .main-footer { margin-left: 0 !important; min-height: 0 !important; -webkit-transform: translate(0, 0) !important; -ms-transform: translate(0, 0) !important; -o-transform: translate(0, 0) !important; transform: translate(0, 0) !important; } .fixed .content-wrapper, .fixed .right-side { padding-top: 0 !important; } .invoice { width: 100%; border: 0; margin: 0; padding: 0; } .invoice-col { float: left; width: 33.3333333%; } .table-responsive { overflow: auto; } .table-responsive > .table tr th, .table-responsive > .table tr td { white-space: normal !important; } } ================================================ FILE: src/main/resources/static/css/loader.css ================================================ #loading{ background-color: #fff; height: 100%; width: 100%; position: fixed; z-index: 9999; margin-top: 0px; top: 0px; } #loading-center{ width: 100%; height: 100%; position: relative; } #loading-center-absolute { position: absolute; left: 50%; top: 50%; height: 60px; width: 60px; margin-top: -30px; margin-left: -30px; -webkit-animation: loading-center-absolute 1s infinite; animation: loading-center-absolute 1s infinite; } .object{ width: 20px; height: 20px; background-color: skyblue; float: left; -moz-border-radius: 50% 50% 50% 50%; -webkit-border-radius: 50% 50% 50% 50%; border-radius: 50% 50% 50% 50%; margin-right: 20px; margin-bottom: 20px; } .object:nth-child(2n+0) { margin-right: 0px; } #object_one{ -webkit-animation: object_one 1s infinite; animation: object_one 1s infinite; } #object_two{ -webkit-animation: object_two 1s infinite; animation: object_two 1s infinite; } #object_three{ -webkit-animation: object_three 1s infinite; animation: object_three 1s infinite; } #object_four{ -webkit-animation: object_four 1s infinite; animation: object_four 1s infinite; } @-webkit-keyframes loading-center-absolute{ 100% { -ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes loading-center-absolute{ 100% { -ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-webkit-keyframes object_one{ 50% { -ms-transform: translate(20px,20px); -webkit-transform: translate(20px,20px); transform: translate(20px,20px); } } @keyframes object_one{ 50% { -ms-transform: translate(20px,20px); -webkit-transform: translate(20px,20px); transform: translate(20px,20px); } } @-webkit-keyframes object_two{ 50% { -ms-transform: translate(-20px,20px); -webkit-transform: translate(-20px,20px); transform: translate(-20px,20px); } } @keyframes object_two{ 50% { -ms-transform: translate(-20px,20px); -webkit-transform: translate(-20px,20px); transform: translate(-20px,20px); } } @-webkit-keyframes object_three{ 50% { -ms-transform: translate(20px,-20px); -webkit-transform: translate(20px,-20px); transform: translate(20px,-20px); } } @keyframes object_three{ 50% { -ms-transform: translate(20px,-20px); -webkit-transform: translate(20px,-20px); transform: translate(20px,-20px); } } @-webkit-keyframes object_four{ 50% { -ms-transform: translate(-20px,-20px); -webkit-transform: translate(-20px,-20px); transform: translate(-20px,-20px); } } @keyframes object_four{ 50% { -ms-transform: translate(-20px,-20px); -webkit-transform: translate(-20px,-20px); transform: translate(-20px,-20px); } } ================================================ FILE: src/main/resources/static/css/pay.css ================================================ html { font-size: 62.5%; font-family: "Microsoft YaHei"; } body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td, hr { margin: 0; padding: 0px 2px; } body { line-height: 1.333; font-size: 12px } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-family: "Microsoft YaHei"; } input, textarea, select, button { font-size: 12px; font-weight: normal } .btn-small { width: 118px; height: 28px; font-size: 12px; line-height: 28px; } .btn { display: inline-block; *zoom: 1; *display: inline; width: 158px; height: 38px; padding: 0; margin: 0; border: 1px solid #b0b0b0; font-size: 14px; line-height: 38px; text-align: center; color: #b0b0b0; cursor: pointer; -webkit-transition: all .4s; transition: all .4s; } .btn-success { background: green; border-color: green; color: #fff; } table { border-collapse: collapse; border-spacing: 0 } address, caption, cite, code, dfn, em, th, var { font-style: normal; font-weight: normal } li { list-style: none } caption, th { text-align: left } q:before, q:after { content: '' } abbr, acronym { border: 0; font-variant: normal } sup { vertical-align: text-top } sub { vertical-align: text-bottom } fieldset, img, a img, iframe { border-width: 0; border-style: none } img { -ms-interpolation-mode: bicubic } textarea { overflow-y: auto } legend { color: #000 } a:link, a:visited { text-decoration: none } hr { height: 0 } label { cursor: pointer } a { color: #1baeae } a:hover { color: #1baeae; text-decoration: none } a:focus { outline: none } body, .body { background: #f7f7f7; height: 100%; max-width: 640px; min-width: 300px; min-height: 100%; margin: 0 auto; } .mod-title { height: 60px; line-height: 60px; text-align: center; border-bottom: 1px solid #ddd; background: #fff } .ico_log { display: inline-block; width: 130px; height: 38px; vertical-align: middle; margin-right: 7px } .icon-ali-pay { background: url("../image/pay/alipay_logo.jpg") no-repeat; background-size: cover; } .icon-wx-pay { background: url("../image/pay/wx_logo.jpg") no-repeat; background-size: cover; } .mod-title .text { font-size: 20px; color: #333; font-weight: normal; vertical-align: middle } .mod-ct { min-width: 300px; max-width: 640px; margin: 0 auto; margin-top: 15px; margin-bottom: 15px; padding-bottom: 10px; background: #fff url("../image/pay/wave-repeat.png") top center repeat-x; text-align: center; color: #333; border: 1px solid #e5e5e5; border-top: none } .mod-ct .order { font-size: 20px; padding-top: 10px } .mod-ct .amount { font-size: 42px; margin-top: 10px } .mod-ct .qr-image { margin-top: 30px } .mod-ct .qr-image img { width: 230px; height: 230px } .mod-ct .detail { margin-top: 10px; padding-top: 0px; padding-bottom: 10px; } .mod-ct .detail .detail-ct { display: none; font-size: 12px; text-align: right; line-height: 28px } .mod-ct .detail .detail-ct dt { float: left } .mod-ct .detail-open { border-top: 1px solid #e5e5e5 } .mod-ct .detail .arrow { padding: 6px 34px; border: 1px solid #e5e5e5 } .mod-ct .detail-open .detail-ct { display: block } .mod-ct .tip { margin-top: 20px; border-top: 1px dashed #e5e5e5; padding: 10px 0; position: relative } .mod-ct .tip .ico-scan-wx { display: inline-block; width: 56px; height: 55px; background: url("../image/pay/scan-wx.png") no-repeat; vertical-align: middle; *display: inline; *zoom: 1 } .mod-ct .tip .ico-scan-ali { display: inline-block; width: 56px; height: 55px; background: url("../image/pay/scan-alipay.png") no-repeat; vertical-align: middle; *display: inline; *zoom: 1 } .mod-ct .tip .tip-text { display: inline-block; vertical-align: middle; text-align: left; margin-left: 23px; font-size: 16px; line-height: 28px; *display: inline; *zoom: 1 } .mod-ct .tip .dec-left { background-position: 0 -55px; left: -136px } .mod-ct .tip .dec-right { background-position: -25px -55px; right: -136px } .foot { text-align: center; margin: 30px auto; color: #888888; font-size: 12px; line-height: 20px; font-family: "Microsoft YaHei"; } .copyRight { text-align: center; color: #888888; margin-bottom: 1px; } .copyRight a { color: #888888; } h1 { font-family: "Microsoft YaHei"; font-size: 15px; margin: 5px 0; padding-bottom: 2px; letter-spacing: 2px; } .time-item strong { background: #1baeae; color: #fff; line-height: 25px; font-size: 15px; font-family: "Microsoft YaHei"; padding: 0 10px; margin-right: 10px; border-radius: 5px; box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2); } .item-title { background: none; line-height: 25px; font-size: 24px; padding: 0 10px; float: left; ================================================ FILE: src/main/resources/static/css/skins/_all-skins.css ================================================ /* * Skin: Blue * ---------- */ .skin-blue .main-header .navbar { background-color: #3c8dbc; } .skin-blue .main-header .navbar .nav > li > a { color: #ffffff; } .skin-blue .main-header .navbar .nav > li > a:hover, .skin-blue .main-header .navbar .nav > li > a:active, .skin-blue .main-header .navbar .nav > li > a:focus, .skin-blue .main-header .navbar .nav .open > a, .skin-blue .main-header .navbar .nav .open > a:hover, .skin-blue .main-header .navbar .nav .open > a:focus, .skin-blue .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-blue .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-blue .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-blue .main-header .navbar .sidebar-toggle { color: #fff; } .skin-blue .main-header .navbar .sidebar-toggle:hover { background-color: #367fa9; } @media (max-width: 767px) { .skin-blue .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-blue .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-blue .main-header .navbar .dropdown-menu li a:hover { background: #367fa9; } } .skin-blue .main-header .logo { background-color: #367fa9; color: #ffffff; border-bottom: 0 solid transparent; } .skin-blue .main-header .logo:hover { background-color: #357ca5; } .skin-blue .main-header li.user-header { background-color: #3c8dbc; } .skin-blue .content-header { background: transparent; } .skin-blue .wrapper, .skin-blue .main-sidebar, .skin-blue .left-side { background-color: #222d32; } .skin-blue .user-panel > .info, .skin-blue .user-panel > .info > a { color: #fff; } .skin-blue .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-blue .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-blue .sidebar-menu > li:hover > a, .skin-blue .sidebar-menu > li.active > a, .skin-blue .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-blue .sidebar-menu > li.active > a { border-left-color: #3c8dbc; } .skin-blue .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-blue .sidebar a { color: #b8c7ce; } .skin-blue .sidebar a:hover { text-decoration: none; } .skin-blue .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-blue .sidebar-menu .treeview-menu > li.active > a, .skin-blue .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-blue .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-blue .sidebar-form input[type="text"], .skin-blue .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-blue .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-blue .sidebar-form input[type="text"]:focus, .skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-blue .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } .skin-blue.layout-top-nav .main-header > .logo { background-color: #3c8dbc; color: #ffffff; border-bottom: 0 solid transparent; } .skin-blue.layout-top-nav .main-header > .logo:hover { background-color: #3b8ab8; } /* * Skin: Blue * ---------- */ .skin-blue-light .main-header .navbar { background-color: #3c8dbc; } .skin-blue-light .main-header .navbar .nav > li > a { color: #ffffff; } .skin-blue-light .main-header .navbar .nav > li > a:hover, .skin-blue-light .main-header .navbar .nav > li > a:active, .skin-blue-light .main-header .navbar .nav > li > a:focus, .skin-blue-light .main-header .navbar .nav .open > a, .skin-blue-light .main-header .navbar .nav .open > a:hover, .skin-blue-light .main-header .navbar .nav .open > a:focus, .skin-blue-light .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-blue-light .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-blue-light .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-blue-light .main-header .navbar .sidebar-toggle { color: #fff; } .skin-blue-light .main-header .navbar .sidebar-toggle:hover { background-color: #367fa9; } @media (max-width: 767px) { .skin-blue-light .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-blue-light .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { background: #367fa9; } } .skin-blue-light .main-header .logo { background-color: #3c8dbc; color: #ffffff; border-bottom: 0 solid transparent; } .skin-blue-light .main-header .logo:hover { background-color: #3b8ab8; } .skin-blue-light .main-header li.user-header { background-color: #3c8dbc; } .skin-blue-light .content-header { background: transparent; } .skin-blue-light .wrapper, .skin-blue-light .main-sidebar, .skin-blue-light .left-side { background-color: #f9fafc; } .skin-blue-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-blue-light .user-panel > .info, .skin-blue-light .user-panel > .info > a { color: #444444; } .skin-blue-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-blue-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-blue-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-blue-light .sidebar-menu > li:hover > a, .skin-blue-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-blue-light .sidebar-menu > li.active { border-left-color: #3c8dbc; } .skin-blue-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-blue-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-blue-light .sidebar a { color: #444444; } .skin-blue-light .sidebar a:hover { text-decoration: none; } .skin-blue-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-blue-light .sidebar-menu .treeview-menu > li.active > a, .skin-blue-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-blue-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-blue-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-blue-light .sidebar-form input[type="text"], .skin-blue-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-blue-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-blue-light .sidebar-form input[type="text"]:focus, .skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-blue-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } .skin-blue-light .main-footer { border-top-color: #d2d6de; } .skin-blue.layout-top-nav .main-header > .logo { background-color: #3c8dbc; color: #ffffff; border-bottom: 0 solid transparent; } .skin-blue.layout-top-nav .main-header > .logo:hover { background-color: #3b8ab8; } /* * Skin: Black * ----------- */ /* skin-black navbar */ .skin-black .main-header { -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); } .skin-black .main-header .navbar-toggle { color: #333; } .skin-black .main-header .navbar-brand { color: #333; border-right: 1px solid #eee; } .skin-black .main-header .navbar { background-color: #ffffff; } .skin-black .main-header .navbar .nav > li > a { color: #333333; } .skin-black .main-header .navbar .nav > li > a:hover, .skin-black .main-header .navbar .nav > li > a:active, .skin-black .main-header .navbar .nav > li > a:focus, .skin-black .main-header .navbar .nav .open > a, .skin-black .main-header .navbar .nav .open > a:hover, .skin-black .main-header .navbar .nav .open > a:focus, .skin-black .main-header .navbar .nav > .active > a { background: #ffffff; color: #999999; } .skin-black .main-header .navbar .sidebar-toggle { color: #333333; } .skin-black .main-header .navbar .sidebar-toggle:hover { color: #999999; background: #ffffff; } .skin-black .main-header .navbar > .sidebar-toggle { color: #333; border-right: 1px solid #eee; } .skin-black .main-header .navbar .navbar-nav > li > a { border-right: 1px solid #eee; } .skin-black .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, .skin-black .main-header .navbar .navbar-right > li > a { border-left: 1px solid #eee; border-right-width: 0; } .skin-black .main-header > .logo { background-color: #ffffff; color: #333333; border-bottom: 0 solid transparent; border-right: 1px solid #eee; } .skin-black .main-header > .logo:hover { background-color: #fcfcfc; } @media (max-width: 767px) { .skin-black .main-header > .logo { background-color: #222222; color: #ffffff; border-bottom: 0 solid transparent; border-right: none; } .skin-black .main-header > .logo:hover { background-color: #1f1f1f; } } .skin-black .main-header li.user-header { background-color: #222; } .skin-black .content-header { background: transparent; box-shadow: none; } .skin-black .wrapper, .skin-black .main-sidebar, .skin-black .left-side { background-color: #222d32; } .skin-black .user-panel > .info, .skin-black .user-panel > .info > a { color: #fff; } .skin-black .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-black .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-black .sidebar-menu > li:hover > a, .skin-black .sidebar-menu > li.active > a, .skin-black .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-black .sidebar-menu > li.active > a { border-left-color: #ffffff; } .skin-black .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-black .sidebar a { color: #b8c7ce; } .skin-black .sidebar a:hover { text-decoration: none; } .skin-black .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-black .sidebar-menu .treeview-menu > li.active > a, .skin-black .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-black .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-black .sidebar-form input[type="text"], .skin-black .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-black .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-black .sidebar-form input[type="text"]:focus, .skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-black .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } .skin-black .pace .pace-progress { background: #222; } .skin-black .pace .pace-activity { border-top-color: #222; border-left-color: #222; } /* * Skin: Black * ----------- */ /* skin-black navbar */ .skin-black-light .main-header { border-bottom: 1px solid #d2d6de; } .skin-black-light .main-header .navbar-toggle { color: #333; } .skin-black-light .main-header .navbar-brand { color: #333; border-right: 1px solid #d2d6de; } .skin-black-light .main-header .navbar { background-color: #ffffff; } .skin-black-light .main-header .navbar .nav > li > a { color: #333333; } .skin-black-light .main-header .navbar .nav > li > a:hover, .skin-black-light .main-header .navbar .nav > li > a:active, .skin-black-light .main-header .navbar .nav > li > a:focus, .skin-black-light .main-header .navbar .nav .open > a, .skin-black-light .main-header .navbar .nav .open > a:hover, .skin-black-light .main-header .navbar .nav .open > a:focus, .skin-black-light .main-header .navbar .nav > .active > a { background: #ffffff; color: #999999; } .skin-black-light .main-header .navbar .sidebar-toggle { color: #333333; } .skin-black-light .main-header .navbar .sidebar-toggle:hover { color: #999999; background: #ffffff; } .skin-black-light .main-header .navbar > .sidebar-toggle { color: #333; border-right: 1px solid #d2d6de; } .skin-black-light .main-header .navbar .navbar-nav > li > a { border-right: 1px solid #d2d6de; } .skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav > li > a, .skin-black-light .main-header .navbar .navbar-right > li > a { border-left: 1px solid #d2d6de; border-right-width: 0; } .skin-black-light .main-header > .logo { background-color: #ffffff; color: #333333; border-bottom: 0 solid transparent; border-right: 1px solid #d2d6de; } .skin-black-light .main-header > .logo:hover { background-color: #fcfcfc; } @media (max-width: 767px) { .skin-black-light .main-header > .logo { background-color: #222222; color: #ffffff; border-bottom: 0 solid transparent; border-right: none; } .skin-black-light .main-header > .logo:hover { background-color: #1f1f1f; } } .skin-black-light .main-header li.user-header { background-color: #222; } .skin-black-light .content-header { background: transparent; box-shadow: none; } .skin-black-light .wrapper, .skin-black-light .main-sidebar, .skin-black-light .left-side { background-color: #f9fafc; } .skin-black-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-black-light .user-panel > .info, .skin-black-light .user-panel > .info > a { color: #444444; } .skin-black-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-black-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-black-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-black-light .sidebar-menu > li:hover > a, .skin-black-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-black-light .sidebar-menu > li.active { border-left-color: #ffffff; } .skin-black-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-black-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-black-light .sidebar a { color: #444444; } .skin-black-light .sidebar a:hover { text-decoration: none; } .skin-black-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-black-light .sidebar-menu .treeview-menu > li.active > a, .skin-black-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-black-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-black-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-black-light .sidebar-form input[type="text"], .skin-black-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-black-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-black-light .sidebar-form input[type="text"]:focus, .skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-black-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } /* * Skin: Green * ----------- */ .skin-green .main-header .navbar { background-color: #00a65a; } .skin-green .main-header .navbar .nav > li > a { color: #ffffff; } .skin-green .main-header .navbar .nav > li > a:hover, .skin-green .main-header .navbar .nav > li > a:active, .skin-green .main-header .navbar .nav > li > a:focus, .skin-green .main-header .navbar .nav .open > a, .skin-green .main-header .navbar .nav .open > a:hover, .skin-green .main-header .navbar .nav .open > a:focus, .skin-green .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-green .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-green .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-green .main-header .navbar .sidebar-toggle { color: #fff; } .skin-green .main-header .navbar .sidebar-toggle:hover { background-color: #008d4c; } @media (max-width: 767px) { .skin-green .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-green .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-green .main-header .navbar .dropdown-menu li a:hover { background: #008d4c; } } .skin-green .main-header .logo { background-color: #008d4c; color: #ffffff; border-bottom: 0 solid transparent; } .skin-green .main-header .logo:hover { background-color: #008749; } .skin-green .main-header li.user-header { background-color: #00a65a; } .skin-green .content-header { background: transparent; } .skin-green .wrapper, .skin-green .main-sidebar, .skin-green .left-side { background-color: #222d32; } .skin-green .user-panel > .info, .skin-green .user-panel > .info > a { color: #fff; } .skin-green .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-green .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-green .sidebar-menu > li:hover > a, .skin-green .sidebar-menu > li.active > a, .skin-green .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-green .sidebar-menu > li.active > a { border-left-color: #00a65a; } .skin-green .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-green .sidebar a { color: #b8c7ce; } .skin-green .sidebar a:hover { text-decoration: none; } .skin-green .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-green .sidebar-menu .treeview-menu > li.active > a, .skin-green .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-green .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-green .sidebar-form input[type="text"], .skin-green .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-green .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-green .sidebar-form input[type="text"]:focus, .skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-green .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } /* * Skin: Green * ----------- */ .skin-green-light .main-header .navbar { background-color: #00a65a; } .skin-green-light .main-header .navbar .nav > li > a { color: #ffffff; } .skin-green-light .main-header .navbar .nav > li > a:hover, .skin-green-light .main-header .navbar .nav > li > a:active, .skin-green-light .main-header .navbar .nav > li > a:focus, .skin-green-light .main-header .navbar .nav .open > a, .skin-green-light .main-header .navbar .nav .open > a:hover, .skin-green-light .main-header .navbar .nav .open > a:focus, .skin-green-light .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-green-light .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-green-light .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-green-light .main-header .navbar .sidebar-toggle { color: #fff; } .skin-green-light .main-header .navbar .sidebar-toggle:hover { background-color: #008d4c; } @media (max-width: 767px) { .skin-green-light .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-green-light .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-green-light .main-header .navbar .dropdown-menu li a:hover { background: #008d4c; } } .skin-green-light .main-header .logo { background-color: #00a65a; color: #ffffff; border-bottom: 0 solid transparent; } .skin-green-light .main-header .logo:hover { background-color: #00a157; } .skin-green-light .main-header li.user-header { background-color: #00a65a; } .skin-green-light .content-header { background: transparent; } .skin-green-light .wrapper, .skin-green-light .main-sidebar, .skin-green-light .left-side { background-color: #f9fafc; } .skin-green-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-green-light .user-panel > .info, .skin-green-light .user-panel > .info > a { color: #444444; } .skin-green-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-green-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-green-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-green-light .sidebar-menu > li:hover > a, .skin-green-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-green-light .sidebar-menu > li.active { border-left-color: #00a65a; } .skin-green-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-green-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-green-light .sidebar a { color: #444444; } .skin-green-light .sidebar a:hover { text-decoration: none; } .skin-green-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-green-light .sidebar-menu .treeview-menu > li.active > a, .skin-green-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-green-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-green-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-green-light .sidebar-form input[type="text"], .skin-green-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-green-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-green-light .sidebar-form input[type="text"]:focus, .skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-green-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } /* * Skin: Red * --------- */ .skin-red .main-header .navbar { background-color: #dd4b39; } .skin-red .main-header .navbar .nav > li > a { color: #ffffff; } .skin-red .main-header .navbar .nav > li > a:hover, .skin-red .main-header .navbar .nav > li > a:active, .skin-red .main-header .navbar .nav > li > a:focus, .skin-red .main-header .navbar .nav .open > a, .skin-red .main-header .navbar .nav .open > a:hover, .skin-red .main-header .navbar .nav .open > a:focus, .skin-red .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-red .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-red .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-red .main-header .navbar .sidebar-toggle { color: #fff; } .skin-red .main-header .navbar .sidebar-toggle:hover { background-color: #d73925; } @media (max-width: 767px) { .skin-red .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-red .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-red .main-header .navbar .dropdown-menu li a:hover { background: #d73925; } } .skin-red .main-header .logo { background-color: #d73925; color: #ffffff; border-bottom: 0 solid transparent; } .skin-red .main-header .logo:hover { background-color: #d33724; } .skin-red .main-header li.user-header { background-color: #dd4b39; } .skin-red .content-header { background: transparent; } .skin-red .wrapper, .skin-red .main-sidebar, .skin-red .left-side { background-color: #222d32; } .skin-red .user-panel > .info, .skin-red .user-panel > .info > a { color: #fff; } .skin-red .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-red .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-red .sidebar-menu > li:hover > a, .skin-red .sidebar-menu > li.active > a, .skin-red .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-red .sidebar-menu > li.active > a { border-left-color: #dd4b39; } .skin-red .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-red .sidebar a { color: #b8c7ce; } .skin-red .sidebar a:hover { text-decoration: none; } .skin-red .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-red .sidebar-menu .treeview-menu > li.active > a, .skin-red .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-red .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-red .sidebar-form input[type="text"], .skin-red .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-red .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-red .sidebar-form input[type="text"]:focus, .skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-red .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } /* * Skin: Red * --------- */ .skin-red-light .main-header .navbar { background-color: #dd4b39; } .skin-red-light .main-header .navbar .nav > li > a { color: #ffffff; } .skin-red-light .main-header .navbar .nav > li > a:hover, .skin-red-light .main-header .navbar .nav > li > a:active, .skin-red-light .main-header .navbar .nav > li > a:focus, .skin-red-light .main-header .navbar .nav .open > a, .skin-red-light .main-header .navbar .nav .open > a:hover, .skin-red-light .main-header .navbar .nav .open > a:focus, .skin-red-light .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-red-light .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-red-light .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-red-light .main-header .navbar .sidebar-toggle { color: #fff; } .skin-red-light .main-header .navbar .sidebar-toggle:hover { background-color: #d73925; } @media (max-width: 767px) { .skin-red-light .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-red-light .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-red-light .main-header .navbar .dropdown-menu li a:hover { background: #d73925; } } .skin-red-light .main-header .logo { background-color: #dd4b39; color: #ffffff; border-bottom: 0 solid transparent; } .skin-red-light .main-header .logo:hover { background-color: #dc4735; } .skin-red-light .main-header li.user-header { background-color: #dd4b39; } .skin-red-light .content-header { background: transparent; } .skin-red-light .wrapper, .skin-red-light .main-sidebar, .skin-red-light .left-side { background-color: #f9fafc; } .skin-red-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-red-light .user-panel > .info, .skin-red-light .user-panel > .info > a { color: #444444; } .skin-red-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-red-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-red-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-red-light .sidebar-menu > li:hover > a, .skin-red-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-red-light .sidebar-menu > li.active { border-left-color: #dd4b39; } .skin-red-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-red-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-red-light .sidebar a { color: #444444; } .skin-red-light .sidebar a:hover { text-decoration: none; } .skin-red-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-red-light .sidebar-menu .treeview-menu > li.active > a, .skin-red-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-red-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-red-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-red-light .sidebar-form input[type="text"], .skin-red-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-red-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-red-light .sidebar-form input[type="text"]:focus, .skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-red-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } /* * Skin: Yellow * ------------ */ .skin-yellow .main-header .navbar { background-color: #f39c12; } .skin-yellow .main-header .navbar .nav > li > a { color: #ffffff; } .skin-yellow .main-header .navbar .nav > li > a:hover, .skin-yellow .main-header .navbar .nav > li > a:active, .skin-yellow .main-header .navbar .nav > li > a:focus, .skin-yellow .main-header .navbar .nav .open > a, .skin-yellow .main-header .navbar .nav .open > a:hover, .skin-yellow .main-header .navbar .nav .open > a:focus, .skin-yellow .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-yellow .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-yellow .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-yellow .main-header .navbar .sidebar-toggle { color: #fff; } .skin-yellow .main-header .navbar .sidebar-toggle:hover { background-color: #e08e0b; } @media (max-width: 767px) { .skin-yellow .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-yellow .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-yellow .main-header .navbar .dropdown-menu li a:hover { background: #e08e0b; } } .skin-yellow .main-header .logo { background-color: #e08e0b; color: #ffffff; border-bottom: 0 solid transparent; } .skin-yellow .main-header .logo:hover { background-color: #db8b0b; } .skin-yellow .main-header li.user-header { background-color: #f39c12; } .skin-yellow .content-header { background: transparent; } .skin-yellow .wrapper, .skin-yellow .main-sidebar, .skin-yellow .left-side { background-color: #222d32; } .skin-yellow .user-panel > .info, .skin-yellow .user-panel > .info > a { color: #fff; } .skin-yellow .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-yellow .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-yellow .sidebar-menu > li:hover > a, .skin-yellow .sidebar-menu > li.active > a, .skin-yellow .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-yellow .sidebar-menu > li.active > a { border-left-color: #f39c12; } .skin-yellow .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-yellow .sidebar a { color: #b8c7ce; } .skin-yellow .sidebar a:hover { text-decoration: none; } .skin-yellow .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-yellow .sidebar-menu .treeview-menu > li.active > a, .skin-yellow .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-yellow .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-yellow .sidebar-form input[type="text"], .skin-yellow .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-yellow .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-yellow .sidebar-form input[type="text"]:focus, .skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-yellow .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } /* * Skin: Yellow * ------------ */ .skin-yellow-light .main-header .navbar { background-color: #f39c12; } .skin-yellow-light .main-header .navbar .nav > li > a { color: #ffffff; } .skin-yellow-light .main-header .navbar .nav > li > a:hover, .skin-yellow-light .main-header .navbar .nav > li > a:active, .skin-yellow-light .main-header .navbar .nav > li > a:focus, .skin-yellow-light .main-header .navbar .nav .open > a, .skin-yellow-light .main-header .navbar .nav .open > a:hover, .skin-yellow-light .main-header .navbar .nav .open > a:focus, .skin-yellow-light .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-yellow-light .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-yellow-light .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-yellow-light .main-header .navbar .sidebar-toggle { color: #fff; } .skin-yellow-light .main-header .navbar .sidebar-toggle:hover { background-color: #e08e0b; } @media (max-width: 767px) { .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-yellow-light .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { background: #e08e0b; } } .skin-yellow-light .main-header .logo { background-color: #f39c12; color: #ffffff; border-bottom: 0 solid transparent; } .skin-yellow-light .main-header .logo:hover { background-color: #f39a0d; } .skin-yellow-light .main-header li.user-header { background-color: #f39c12; } .skin-yellow-light .content-header { background: transparent; } .skin-yellow-light .wrapper, .skin-yellow-light .main-sidebar, .skin-yellow-light .left-side { background-color: #f9fafc; } .skin-yellow-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-yellow-light .user-panel > .info, .skin-yellow-light .user-panel > .info > a { color: #444444; } .skin-yellow-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-yellow-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-yellow-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-yellow-light .sidebar-menu > li:hover > a, .skin-yellow-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-yellow-light .sidebar-menu > li.active { border-left-color: #f39c12; } .skin-yellow-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-yellow-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-yellow-light .sidebar a { color: #444444; } .skin-yellow-light .sidebar a:hover { text-decoration: none; } .skin-yellow-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-yellow-light .sidebar-menu .treeview-menu > li.active > a, .skin-yellow-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-yellow-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-yellow-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-yellow-light .sidebar-form input[type="text"], .skin-yellow-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-yellow-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-yellow-light .sidebar-form input[type="text"]:focus, .skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-yellow-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } /* * Skin: Purple * ------------ */ .skin-purple .main-header .navbar { background-color: #605ca8; } .skin-purple .main-header .navbar .nav > li > a { color: #ffffff; } .skin-purple .main-header .navbar .nav > li > a:hover, .skin-purple .main-header .navbar .nav > li > a:active, .skin-purple .main-header .navbar .nav > li > a:focus, .skin-purple .main-header .navbar .nav .open > a, .skin-purple .main-header .navbar .nav .open > a:hover, .skin-purple .main-header .navbar .nav .open > a:focus, .skin-purple .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-purple .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-purple .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-purple .main-header .navbar .sidebar-toggle { color: #fff; } .skin-purple .main-header .navbar .sidebar-toggle:hover { background-color: #555299; } @media (max-width: 767px) { .skin-purple .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-purple .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-purple .main-header .navbar .dropdown-menu li a:hover { background: #555299; } } .skin-purple .main-header .logo { background-color: #555299; color: #ffffff; border-bottom: 0 solid transparent; } .skin-purple .main-header .logo:hover { background-color: #545096; } .skin-purple .main-header li.user-header { background-color: #605ca8; } .skin-purple .content-header { background: transparent; } .skin-purple .wrapper, .skin-purple .main-sidebar, .skin-purple .left-side { background-color: #222d32; } .skin-purple .user-panel > .info, .skin-purple .user-panel > .info > a { color: #fff; } .skin-purple .sidebar-menu > li.header { color: #4b646f; background: #1a2226; } .skin-purple .sidebar-menu > li > a { border-left: 3px solid transparent; } .skin-purple .sidebar-menu > li:hover > a, .skin-purple .sidebar-menu > li.active > a, .skin-purple .sidebar-menu > li.menu-open > a { color: #ffffff; background: #1e282c; } .skin-purple .sidebar-menu > li.active > a { border-left-color: #605ca8; } .skin-purple .sidebar-menu > li > .treeview-menu { margin: 0 1px; background: #2c3b41; } .skin-purple .sidebar a { color: #b8c7ce; } .skin-purple .sidebar a:hover { text-decoration: none; } .skin-purple .sidebar-menu .treeview-menu > li > a { color: #8aa4af; } .skin-purple .sidebar-menu .treeview-menu > li.active > a, .skin-purple .sidebar-menu .treeview-menu > li > a:hover { color: #ffffff; } .skin-purple .sidebar-form { border-radius: 3px; border: 1px solid #374850; margin: 10px 10px; } .skin-purple .sidebar-form input[type="text"], .skin-purple .sidebar-form .btn { box-shadow: none; background-color: #374850; border: 1px solid transparent; height: 35px; } .skin-purple .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-purple .sidebar-form input[type="text"]:focus, .skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-purple .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } /* * Skin: Purple * ------------ */ .skin-purple-light .main-header .navbar { background-color: #605ca8; } .skin-purple-light .main-header .navbar .nav > li > a { color: #ffffff; } .skin-purple-light .main-header .navbar .nav > li > a:hover, .skin-purple-light .main-header .navbar .nav > li > a:active, .skin-purple-light .main-header .navbar .nav > li > a:focus, .skin-purple-light .main-header .navbar .nav .open > a, .skin-purple-light .main-header .navbar .nav .open > a:hover, .skin-purple-light .main-header .navbar .nav .open > a:focus, .skin-purple-light .main-header .navbar .nav > .active > a { background: rgba(0, 0, 0, 0.1); color: #f6f6f6; } .skin-purple-light .main-header .navbar .sidebar-toggle { color: #ffffff; } .skin-purple-light .main-header .navbar .sidebar-toggle:hover { color: #f6f6f6; background: rgba(0, 0, 0, 0.1); } .skin-purple-light .main-header .navbar .sidebar-toggle { color: #fff; } .skin-purple-light .main-header .navbar .sidebar-toggle:hover { background-color: #555299; } @media (max-width: 767px) { .skin-purple-light .main-header .navbar .dropdown-menu li.divider { background-color: rgba(255, 255, 255, 0.1); } .skin-purple-light .main-header .navbar .dropdown-menu li a { color: #fff; } .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { background: #555299; } } .skin-purple-light .main-header .logo { background-color: #605ca8; color: #ffffff; border-bottom: 0 solid transparent; } .skin-purple-light .main-header .logo:hover { background-color: #5d59a6; } .skin-purple-light .main-header li.user-header { background-color: #605ca8; } .skin-purple-light .content-header { background: transparent; } .skin-purple-light .wrapper, .skin-purple-light .main-sidebar, .skin-purple-light .left-side { background-color: #f9fafc; } .skin-purple-light .main-sidebar { border-right: 1px solid #d2d6de; } .skin-purple-light .user-panel > .info, .skin-purple-light .user-panel > .info > a { color: #444444; } .skin-purple-light .sidebar-menu > li { -webkit-transition: border-left-color 0.3s ease; -o-transition: border-left-color 0.3s ease; transition: border-left-color 0.3s ease; } .skin-purple-light .sidebar-menu > li.header { color: #848484; background: #f9fafc; } .skin-purple-light .sidebar-menu > li > a { border-left: 3px solid transparent; font-weight: 600; } .skin-purple-light .sidebar-menu > li:hover > a, .skin-purple-light .sidebar-menu > li.active > a { color: #000000; background: #f4f4f5; } .skin-purple-light .sidebar-menu > li.active { border-left-color: #605ca8; } .skin-purple-light .sidebar-menu > li.active > a { font-weight: 600; } .skin-purple-light .sidebar-menu > li > .treeview-menu { background: #f4f4f5; } .skin-purple-light .sidebar a { color: #444444; } .skin-purple-light .sidebar a:hover { text-decoration: none; } .skin-purple-light .sidebar-menu .treeview-menu > li > a { color: #777777; } .skin-purple-light .sidebar-menu .treeview-menu > li.active > a, .skin-purple-light .sidebar-menu .treeview-menu > li > a:hover { color: #000000; } .skin-purple-light .sidebar-menu .treeview-menu > li.active > a { font-weight: 600; } .skin-purple-light .sidebar-form { border-radius: 3px; border: 1px solid #d2d6de; margin: 10px 10px; } .skin-purple-light .sidebar-form input[type="text"], .skin-purple-light .sidebar-form .btn { box-shadow: none; background-color: #fff; border: 1px solid transparent; height: 35px; } .skin-purple-light .sidebar-form input[type="text"] { color: #666; border-top-left-radius: 2px; border-top-right-radius: 0; border-bottom-right-radius: 0; border-bottom-left-radius: 2px; } .skin-purple-light .sidebar-form input[type="text"]:focus, .skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { background-color: #fff; color: #666; } .skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { border-left-color: #fff; } .skin-purple-light .sidebar-form .btn { color: #999; border-top-left-radius: 0; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 0; } @media (min-width: 768px) { .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { border-left: 1px solid #d2d6de; } } ================================================ FILE: src/main/resources/static/css/style.css ================================================ /** 皮肤颜色附加 */ .skin-blue .box.box-primary { border-top-color: #fff; } .skin-blue .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-blue-light .box.box-primary { border-top-color: #fff; } .skin-blue-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-black .box.box-primary { border-top-color: #fff; } .skin-black .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-black-light .box.box-primary { border-top-color: #fff; } .skin-black-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-green .box.box-primary { border-top-color: #fff; } .skin-green .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-green-light .box.box-primary { border-top-color: #fff; } .skin-green-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-purple .box.box-primary { border-top-color: #fff; } .skin-purple .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-purple-light .box.box-primary { border-top-color: #fff; } .skin-purple-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-red .box.box-primary { border-top-color: #fff; } .skin-red .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-red-light .box.box-primary { border-top-color: #fff; } .skin-red-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-yellow .box.box-primary { border-top-color: #fff; } .skin-yellow .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .skin-yellow-light .box.box-primary { border-top-color: #fff; } .skin-yellow-light .nav-tabs-custom > .nav-tabs > li.active { border-top-color: #fff; } .layout-boxed { background: url('../images/boxed-bg.jpg') repeat fixed; } ::-webkit-scrollbar { width: 2px; height: 2px; background-color: #eee; } ::-webkit-scrollbar-thumb { background-color: #d0afaf; } ::-webkit-scrollbar-track { background-color: #eee; } .post-cate-ul { padding: 0;margin: 0px;list-style: none } .post-cate-li { padding: 0;margin: 2px 0px;list-style: none } .clear { clear: both; display: block; } .level2 { margin-left: 18px; } .level3 { margin-left: 36px; } .level4 { margin-left: 54px; } .level4 { margin-left: 54px; } .disabled-input { border: 0; background: none; } .img-circle { background-color: #fff; } .user-image { background-color: #fff; } .permission-level-2 { padding-left: 30px !important; } .permission-level-3 { padding-left: 60px !important; } .permission-level-4 { padding-left: 90px !important; } .permission-level-4 { padding-left: 120px !important; } .menu-level-2 { padding-left: 30px !important; } .menu-level-3 { padding-left: 60px !important; } .menu-level-4 { padding-left: 90px !important; } .menu-level-4 { padding-left: 120px !important; } #btnNew { margin-left: 4px; padding: 3px 6px; position: relative; top: -4px; border: 1px solid #ccc; border-radius: 2px; background: #fff; text-shadow: none; font-weight: 600; font-size: 12px; line-height: normal; color: #3c8dbc; cursor: pointer; transition: all .2s ease-in-out } #btnNew:hover { background: #3c8dbc; color: #fff } .font-success { color: #087623; } .font-warning { color: #8a3a12; ================================================ FILE: src/main/resources/static/front/css/pay.css ================================================ html { font-size: 62.5%; font-family: "Microsoft YaHei"; } body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td, hr { margin: 0; padding: 0px 2px; } body { line-height: 1.333; font-size: 12px } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-family: "Microsoft YaHei"; } input, textarea, select, button { font-size: 12px; font-weight: normal } .btn-small { width: 118px; height: 28px; font-size: 12px; line-height: 28px; } .btn { display: inline-block; *zoom: 1; *display: inline; width: 158px; height: 38px; padding: 0; margin: 0; border: 1px solid #b0b0b0; font-size: 14px; line-height: 38px; text-align: center; color: #b0b0b0; cursor: pointer; -webkit-transition: all .4s; transition: all .4s; } .btn-success { background: green; border-color: green; color: #fff; } table { border-collapse: collapse; border-spacing: 0 } address, caption, cite, code, dfn, em, th, var { font-style: normal; font-weight: normal } li { list-style: none } caption, th { text-align: left } q:before, q:after { content: '' } abbr, acronym { border: 0; font-variant: normal } sup { vertical-align: text-top } sub { vertical-align: text-bottom } fieldset, img, a img, iframe { border-width: 0; border-style: none } img { -ms-interpolation-mode: bicubic } textarea { overflow-y: auto } legend { color: #000 } a:link, a:visited { text-decoration: none } hr { height: 0 } label { cursor: pointer } a { color: #1baeae } a:hover { color: #1baeae; text-decoration: none } a:focus { outline: none } .mod-title { height: 60px; line-height: 60px; text-align: center; border-bottom: 1px solid #ddd; background: #fff } .ico_log { display: inline-block; width: 130px; height: 38px; vertical-align: middle; margin-right: 7px } .icon-ali-pay { background: url("../image/pay/alipay_logo.jpg") no-repeat; background-size: cover; } .icon-wx-pay { background: url("../image/pay/wx_logo.jpg") no-repeat; background-size: cover; } .mod-title .text { font-size: 20px; color: #333; font-weight: normal; vertical-align: middle } .mod-ct { min-width: 300px; max-width: 640px; margin: 0 auto; margin-top: 15px; margin-bottom: 15px; padding-bottom: 10px; background: #fff url("../image/pay/wave-repeat.png") top center repeat-x; text-align: center; color: #333; border: 1px solid #e5e5e5; border-top: none } .mod-ct .order { font-size: 20px; padding-top: 10px } .mod-ct .amount { font-size: 42px; margin-top: 10px } .mod-ct .qr-image { margin-top: 30px } .mod-ct .qr-image img { width: 230px; height: 230px } .mod-ct .detail { margin-top: 10px; padding-top: 0px; padding-bottom: 10px; } .mod-ct .detail .detail-ct { display: none; font-size: 12px; text-align: right; line-height: 28px } .mod-ct .detail .detail-ct dt { float: left } .mod-ct .detail-open { border-top: 1px solid #e5e5e5 } .mod-ct .detail .arrow { padding: 6px 34px; border: 1px solid #e5e5e5 } .mod-ct .detail-open .detail-ct { display: block } .mod-ct .tip { margin-top: 20px; border-top: 1px dashed #e5e5e5; padding: 10px 0; position: relative } .mod-ct .tip .ico-scan-wx { display: inline-block; width: 56px; height: 55px; background: url("../image/pay/scan-wx.png") no-repeat; vertical-align: middle; *display: inline; *zoom: 1 } .mod-ct .tip .ico-scan-ali { display: inline-block; width: 56px; height: 55px; background: url("../image/pay/scan-alipay.png") no-repeat; vertical-align: middle; *display: inline; *zoom: 1 } .mod-ct .tip .tip-text { display: inline-block; vertical-align: middle; text-align: left; margin-left: 23px; font-size: 16px; line-height: 28px; *display: inline; *zoom: 1 } .mod-ct .tip .dec-left { background-position: 0 -55px; left: -136px } .mod-ct .tip .dec-right { background-position: -25px -55px; right: -136px } .foot { text-align: center; margin: 30px auto; color: #888888; font-size: 12px; line-height: 20px; font-family: "Microsoft YaHei"; } .copyRight { text-align: center; color: #888888; margin-bottom: 1px; } .copyRight a { color: #888888; } h1 { font-family: "Microsoft YaHei"; font-size: 15px; margin: 5px 0; padding-bottom: 2px; letter-spacing: 2px; } .time-item strong { background: #1baeae; color: #fff; line-height: 25px; font-size: 15px; font-family: "Microsoft YaHei"; padding: 0 10px; margin-right: 10px; border-radius: 5px; box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2); } .item-title { background: none; line-height: 25px; font-size: 24px; padding: 0 10px; float: left; ================================================ FILE: src/main/resources/static/front/css/style.css ================================================ /* Template Name: Manland - Bootstrap Light Real Estate HTML Template Version: 1.0 */ /* -- body -- Extra -- Navbar -- Slider -- Slider Form -- Card -- Agents Card -- Sidebar Card -- Grid/list Filters -- Properties List -- Blog -- Property Single -- Add Property -- My Account -- Property Single Gallery -- Footer -- Mobile Media */ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap'); /* Body */ body { background-color: #f0f2f5; font-size: 13px; font-family: 'Poppins', sans-serif; line-height: 25px; color: #34495e; } h1, h2, h3, h4, h5, h6 { color: #000000; } p { font-size: 13px; line-height: 22px; color:#34495e; } img { height: auto; max-width: 100%; } ul, ol { list-style: outside none none; } ul { margin: 0; padding: 0; } img { transform-style: preserve-3d; } a { transition: color 300ms ease 0s, background-color 300ms ease 0s; text-decoration:none !important; color:#34495e; } a:hover { transition: color 300ms ease 0s, background-color 300ms ease 0s; color:#34495e; } a, a:hover { text-decoration: none; } a:focus { outline: medium none; outline-offset: 0; } .hv-100{ height: 100vh; } /* Extra */ .map { border-radius: 8px; overflow: hidden; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .badge { border-radius: 8px; font-size: 12px; font-weight: 400; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .dropdown-item.active, .dropdown-item:active { background-color: #2946f7; } .page-item.active .page-link { background-color: #516af0; border-color: #516af0; color: #fff; z-index: 1; } .page-link { color: #516af0; border: none !important; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .bg-dark { background-color: #1b2a4e!important; } .box-shadow-none { border: 7px solid #fff !important; box-shadow: none !important; } .overlay{ background: #ffffff none repeat scroll 0 0; bottom: 0; left: 0; opacity: 0.8; position: absolute; right: 0; top: 0; } .login-with-social .btn { color: #fff; font-size: 13px; padding: 12px 0; position: relative; font-weight: 400; text-transform: uppercase; } .btn-twitter { background: #64ccf1 none repeat scroll 0 0; } .btn-google { background: #df4930 none repeat scroll 0 0; } .btn-facebook { background: #507cc0 none repeat scroll 0 0; } .login-with-social .btn .mdi { font-size: 19px; left: 18px; position: absolute; top: 8px; } .btn { font-size: 13px; padding: 12px 39px; font-weight: bold; border-radius: 8px; } b, strong { font-weight: 500; } #content .card { box-shadow: none; margin: 0; padding: 26px 0px 26px 26px; } #content .card-body, #content .card-footer { padding: 16px 0; } #content .card-footer span { font-size: 12px; } #content .card-footer { padding-bottom:0px; } .map-slider-form { background: #efefef none repeat scroll 0 0; left: auto !important; padding: 20px 0; position: relative !important; right: auto !important; } .slider-h-auto .carousel-item { height: auto !important; } .padding-card .card-body { padding: 35px; } .margin-auto { margin: auto; } .no-radius { border-radius: 0 !important; } label { font-size: 12px; font-weight: 500; margin-bottom: 2px; } .form-control { background-color: #f8f8f8; border-color: #eeeeee; font-size: 13px; } .select2-container--open .select2-dropdown--below { border: medium none; border-radius: 0; } .section-padding { padding: 100px 0; } .text-success { color: #516af0 !important; } a.text-success:focus, a.text-success:hover { color: #2946f7 !important; } .bg-primary{ background-color: #516af0 !important; } .btn-success, .btn-primary, .btn-outline-primary:hover { background-color: #516af0; border-color: #516af0; color: #fff; } .btn-outline-primary { color: #516af0; border-color: #516af0; } .btn-success:hover, .btn-success:focus { background-color: #2946f7; border-color: #2946f7; color: #fff; } .btn-success.disabled, .btn-success:disabled { background-color: #2946f7; border-color: #2946f7; color: #fff; } .btn-outline-success { background-color: transparent; background-image: none; border-color: #516af0; color: #516af0; } .btn-outline-success:hover { background-color: #2946f7; border-color: #2946f7; color: #fff; } .btn-outline-success.focus, .btn-outline-success:focus { box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } .btn-outline-success.disabled, .btn-outline-success:disabled { background-color: transparent; color: #2946f7; } .btn-link { background-color: transparent; color: #516af0; font-weight: 400; } .demo-page .card.padding-card .card-body { padding: 0; } .demo-page .card.padding-card .card-body h5 { font-size: 15px; padding: 4px 10px; } /* Navbar */ nav.navbar { background: #fff none repeat scroll 0 0 !important; padding: 0; } nav.navbar .navbar-nav .nav-link { padding: 28px 14px; color: rgba(0,0,0,.8); } .logo img { height: 33px; } .dropdown-menu { border: medium none; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); padding: 6px; border-radius: 8px; } .dropdown-menu .dropdown-item { font-size: 13px; padding: 7px 20px; border-radius: 8px; } .dropdown-item:focus, .dropdown-item:hover { color: #ffffff; text-decoration: none; background-color: #5169f0; } .main-nav-right .btn { padding: 7px 16px; border: none; border-radius: 50px; } .main-nav-right .list-inline-item { margin: 0; } /* Slider */ .site-slider { position: relative; } .site-slider .carousel-item { height: 500px; min-height: 500px; background: no-repeat center center scroll; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; } /* Slider Form */ .slider-form { left: 15%; position: absolute; right: 15%; top: 35%; } .slider-form form { border-radius: 5px; overflow: hidden; background: #fff; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .slider-form .input-group-addon { line-height: 58px; position: absolute; text-align: center; width: 41px; z-index: 9; } .slider-form .input-group-addon .mdi { font-size: 18px; } .slider-form .select2-selection { border: medium none !important; border-radius: 0 !important; height: auto !important; padding: 15px 15px 15px 33px; } .slider-form .form-control { border: medium none !important; border-radius: 0 !important; height: auto !important; padding: 19px 15px 19px 43px; } .slider-form .select2-selection__arrow { margin: 15px 12px 0; } .slider-form .btn { font-size: 13px; padding: 14px 8px; border-radius: 8px !important; border: 5px solid; } .inner-page-form .input-group{ padding: 1px; } /* Card */ .card { border: medium none; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); margin-bottom: 32px; border-radius: 8px; overflow: hidden; } .card-list .badge { right: 20px; padding: 7px 10px; position: absolute; top: 20px; z-index: 9; } .card-list .card-body .card-title { font-size: 18px; } .card-list .card-body .card-subtitle { font-size: 14px; font-size: 13px; font-weight: 400; color: #929cab; } .card-list .card-body h2 small { font-size: 19px; } .card-list .card-footer span { margin: 0 16px 0 0; } .card-footer { background: #fff none repeat scroll 0 0; border-color: #eeeeee; } .card-overlay { height: 380px; overflow: hidden; position: relative; } .card-overlay .card-img { height: 380px; object-fit: cover; width: 100%; } .card-overlay .card-img-overlay { left: 0; margin: auto; right: 0; text-align: center; top: auto; } .review-block-rate .mdi { color: #ffc107; font-size: 19px; letter-spacing: -3px; } .review-block-rate { margin: 15px 0px; } .review-block-rate .badge-pill { vertical-align: text-bottom; } /* Agents Card */ .agents-card { padding-bottom: 15px; } .agents-card img { background: #fff none repeat scroll 0 0; border-radius: 90px; box-shadow: 0 0 24px rgba(11, 123, 255, 0.12); height: 107px; } /* Sidebar Card */ .sidebar-card .card-body { padding: 35px; } .sidebar-card-list li a { display: inline-block; width: 100%; } .sidebar-card-list > li { line-height: 32px; } .sidebar-card-list li a .sidebar-badge { float: right; font-weight: 500; margin: 0; } #featured-properties .card-body { padding: 30px 0; } #featured-properties .card { box-shadow: none; margin: 0; } #featured-properties img { border-radius: 3px; } #featured-properties .carousel-indicators .active { background-color: #818080; } #featured-properties .carousel-indicators li { background-color: rgba(166, 166, 166, 0.5); } #featured-properties .carousel-indicators { margin: 0; } /* Grid/list Filters */ .tags-action span { background: #fff none repeat scroll 0 0; border-radius: 8px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); display: inline-block; padding: 3px 10px; } .tags-action span i { margin: 0 0 0 3px; } .site_top_filter { margin-bottom: 18px; } .view-mode { margin: 0 0 0 9px; } .view-mode a { background: #fff none repeat scroll 0 0; border-radius: 8px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); display: inline-block; margin: 0 0 0 4px; padding: 3px 10px; } .view-mode a.active { color: #34495e; } .sort-by-btn .btn { min-width: 160px; padding: 6px 9px; text-align: left; border: none; } .sort-by-btn .dropdown-toggle::after { position: absolute; right: 11px; text-align: right; top: 15px; vertical-align: top; } /* Properties List */ .card-list-view .card-body, .card-list-view .card-footer { padding: 20px 30px; } /* Blog */ .blog-card .card-footer img { margin: 0 11px 0 0; width: 33px; } .blog-card .badge { font-size: 12px; font-stretch: normal; font-style: normal; font-weight: 500; letter-spacing: 1px; line-height: normal; margin: 0 0 12px; padding: 6px 10px; text-transform: uppercase; } .blog-card .badge-primary { background-color: rgba(92, 93, 232, 0.1); color: #5c5de8; } .blog-card .badge-danger { background-color: rgba(250, 100, 35, 0.1); color: #fa6423; } .blog-card .badge-success { background-color: rgba(0, 216, 200, 0.09); color: #00d8c8; } .blog-card .badge-dark { background-color: rgba(52, 58, 64, 0.19); color: #343a40; } .blog-card .badge-info { background-color: rgba(23, 160, 184, 0.17); color: #17a2b8; } .blog-card .badge-white { background-color: rgba(255, 255, 255, 0.81); color: #5c5de8; } /* Property Single */ .reviews-card .d-flex { height: 50px; width: 50px; } .reviews-card h5 small { color: #848484; font-size: 12px; margin: 0 0 0 8px; } .star-rating i { font-size: 15px; letter-spacing: -6px; } .list-icon i { float: left; font-size: 36px; line-height: 47px; width: 52px; } .list-icon { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); margin-bottom: 32px; border-radius: 8px; overflow: hidden; background-color: #ffffff; padding: 15px 21px; } .list-icon strong { text-transform: uppercase; vertical-align: text-top; font-weight: 600; color: #000; } .list-icon p { line-height: 11px; } .property-single-title { bottom: 0; left: 0; padding: 37px 0; position: absolute; right: 0; } /* Add Property */ .property-features-add .custom-control { margin: 7px 0; } .fuzone { background: #f9f9f9 none repeat scroll 0 0; border: 3px dashed #eeeeee; border-radius: 8px; cursor: pointer; display: inline-block; min-height: 150px; position: relative; text-align: center; transition: all 0.3s linear 0s; width: 100%; } .fuzone .fu-text { color: #98aab8; font-size: 12px; margin: 50px 40px; position: relative; text-align: center; } .fuzone .fu-text i { display: inline-block; font-size: 54px; padding-bottom: 10px; transition: all 0.3s linear 0s; width: 100%; } .fuzone input { cursor: pointer; height: 100%; left: 0; opacity: 0; position: absolute; top: 0; width: 100%; z-index: 100; } /* My Account */ .user-pages-sidebar .nav-link { padding: 8px 0; position: relative; } .user-pages-sidebar .nav-link:hover { color: #007bff; } .user-pages-sidebar .nav-item { display: inline-block; width: 100%; } .user-pages-sidebar .nav-link.active:after { content: ""; position: absolute; left: -35px; background: #007bff; top: 9px; bottom: 9px; width: 3px; } .user-pages-sidebar .nav-link:hover:after { content: ""; position: absolute; left: -35px; background: #007bff; top: 9px; bottom: 9px; width: 3px; } .user-pages-main { margin: -66px 0 0 0; } /* Property Single Gallery */ .property-single-title-gallery { background: #fff none repeat scroll 0 0; padding: 50px 0; position: relative; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } /* Footer */ .footer li { line-height: 34px; } .footer-social a { background: #516af0 none repeat scroll 0 0; border-radius: 50px; display: inline-block; height: 35px; line-height: 35px; font-size: 16px; text-align: center; width: 35px; color: #fff; } .footer-social a:hover { background: #000 none repeat scroll 0 0; color: #f5f5f5; } .footer-logo { width: 200px; } /* Mobile Media */ @media (min-width: 0px) and (max-width: 767px) { .container { max-width: 100%; } .section-padding { padding: 50px 0; } nav.navbar { padding: 10px 15px; } .navbar-toggler { padding: 2px 5px; } nav.navbar .navbar-nav .nav-link { border-bottom: 1px solid #ececec; padding: 10px 12px; text-align: center; } .main-nav-right { text-align: center; } nav.navbar .dropdown-menu .dropdown-item { font-size: 13px; padding: 7px 20px; text-align: center; } .carousel-indicators { bottom: auto; left: auto; margin: 0; position: absolute; right: 12px; top: 16px; } .banner-list { padding:0px 15px !important; } .banner-list h6 { font-size: 13px; font-weight: 100; line-height: 21px; margin: 0 0 27px !important; } .banner-list .card { margin-top: 30px; } .inner-page-form, .slider-form { bottom: 1px !important; left: 1px; right: 1px; top: auto !important; } .inner-page-form .container, .slider-form .container{ padding: 0; } .carousel-control-prev, .carousel-control-next { display: none; } .property-single-title { text-align: center; } .property-single-title .text-right { text-align: center !important; } .property-single-title .footer-social { margin: 20px 0 0; } .btn { font-size: 13px; font-weight: bold; padding: 9px 27px; } h1 { font-size: 34px; } h2 br { display: none; } .padding-card .card-body, .sidebar-card .card-body { padding: 18px; } .card-list-view .card-body, .card-list-view .card-footer { padding: 18px; } .footer h4 { margin: 0 0 10px !important; } .footer h6 { margin: 30px 0 8px !important; } .site_top_filter{ text-align:center; } .site_top_filter .float-right { float: none !important; margin: 3px 1px !important; } } @media (min-width: 768px) and (max-width: 1023px) { .container { max-width: 100%; } nav.navbar { padding: 10px 15px; } .navbar-toggler { padding: 2px 5px; } nav.navbar .navbar-nav .nav-link { border-bottom: 1px solid #ececec; padding: 10px 12px; text-align: center; } .main-nav-right { text-align: center; } nav.navbar .dropdown-menu .dropdown-item { font-size: 13px; padding: 7px 20px; text-align: center; } .carousel-indicators { bottom: auto; left: auto; margin: 0; position: absolute; right: 12px; top: 16px; } .padding-card .card-body, .sidebar-card .card-body { padding: 18px; } .card-list-view .card-body, .card-list-view .card-footer { padding: 18px; } .section-padding { padding: 60px 0; } } @media (min-width: 1024px) and (max-width: 1200px) { .container { max-width: 100%; } } /* End Mobile Media */ .profile-sidebar img { margin-bottom: 15px; } .profile-sidebar .card-title { margin-bottom: 5px; } .profile-sidebar .card-subtitle { font-size: 12px; font-weight: 600; } .card-info p { margin-bottom: 5px; } .active > a { color: #516af0; font-weight: bold; ================================================ FILE: src/main/resources/static/front/js/contact_me.js ================================================ $(function() { $("#contactForm input,#contactForm textarea").jqBootstrapValidation({ preventSubmit: true, submitError: function($form, event, errors) { // additional error messages or events }, submitSuccess: function($form, event) { event.preventDefault(); // prevent default submit behaviour // get values from FORM var name = $("input#name").val(); var email = $("input#email").val(); var phone = $("input#phone").val(); var message = $("textarea#message").val(); var firstName = name; // For Success/Failure Message // Check for white space in name for Success/Fail message if (firstName.indexOf(' ') >= 0) { firstName = name.split(' ').slice(0, -1).join(' '); } $this = $("#sendMessageButton"); $this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages $.ajax({ url: "././mail/contact_me.php", type: "POST", data: { name: name, phone: phone, email: email, message: message }, cache: false, success: function() { // Success message $('#success').html("
"); $('#success > .alert-success').html(""); $('#success > .alert-success') .append("Your message has been sent. "); $('#success > .alert-success') .append('
'); //clear all fields $('#contactForm').trigger("reset"); }, error: function() { // Fail message $('#success').html("
"); $('#success > .alert-danger').html(""); $('#success > .alert-danger').append($("").text("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!")); $('#success > .alert-danger').append('
'); //clear all fields $('#contactForm').trigger("reset"); }, complete: function() { setTimeout(function() { $this.prop("disabled", false); // Re-enable submit button when AJAX call is complete }, 1000); } }); }, filter: function() { return $(this).is(":visible"); }, }); $("a[data-toggle=\"tab\"]").click(function(e) { e.preventDefault(); $(this).tab("show"); }); }); /*When clicking on Full hide fail/success boxes */ $('#name').focus(function() { $('#success').html(''); }); ================================================ FILE: src/main/resources/static/front/js/custom.js ================================================ /* Template Name: Manland - Bootstrap Light Real Estate HTML Template Author: Webartinfo Author URI: https://themeforest.net/user/webartinfothems Version: 1.0 */ /* -- Hover Nav -- Select2 */ $(document).ready(function () { "use strict"; // ===========Hover Nav============ $('.navbar-nav li.dropdown').hover(function () { $(this).find('.dropdown-menu').stop(true, true).delay(100).fadeIn(500); }, function () { $(this).find('.dropdown-menu').stop(true, true).delay(100).fadeOut(500); }); // ===========Select2============ $(document).ready(function () { $('.select2').select2(); }); }); $('#toLogin').click(function () { localStorage.setItem('lastUrl', window.location.href); window.location.href = '/login'; }); $('#toRegister').click(function () { localStorage.setItem('lastUrl', window.location.href); window.location.href = '/register'; }); $('#btn-login').click(function () { const name = $("#userName").val(); const pwd = $("#userPass").val(); if (name == "" || pwd == "") { alert("请输入完整信息!"); } else { $.ajax({ type: 'POST', url: '/login', async: false, data: { 'userName': name, 'userPass': pwd }, success: function (data) { if (data.code == 1) { alert('登录成功') let lastUrl = localStorage.getItem('lastUrl'); if (lastUrl == null || lastUrl == '') { window.location.href = '/admin'; } else { localStorage.setItem('lastUrl', ''); window.location.href = lastUrl; } } else { alert(data.msg); } } }); } }) $('#btn-register').click(function () { const userName = $("#userName").val(); const userPass = $("#userPass").val(); const idCard = $("#idCard").val(); const userType = $("input[name='userType']:checked").val(); const userDisplayName = $("#userDisplayName").val(); if (userName == "" || userPass == "" || idCard == "" || userDisplayName == "" || userType == "") { alert("请输入完整信息!"); } else { $.ajax({ type: 'POST', url: '/register', async: false, data: { 'userName': userName, 'userPass': userPass, 'idCard': idCard, 'userDisplayName': userDisplayName, 'userType': userType }, success: function (data) { if (data.code == 1) { alert('注册成功'); window.location.href = '/login'; } else { alert(data.msg); } } }); } }); $('#btn-logout').click(function () { $.ajax({ type: 'POST', url: '/logout', async: false, success: function () { window.location.reload(); } }); }); $('#btn-addOrder').click(function () { if (confirm('您确定是否租赁该房子吗?')) { const postId = $("#postId").val(); const quantity = $("#quantity").val(); if (postId == "" || quantity == "") { alert("请输入完整信息!"); } else { $.ajax({ type: 'POST', url: '/order', async: false, data: { 'postId': postId, 'quantity': quantity }, success: function (data) { if (data.code == 1) { alert('订单生成成功,请签订合同'); window .open('/agreement?orderId=' + data.result); } else { alert(data.msg); } } }); } } }); $('#btn-agreement').click(function () { let orderId = $(this).attr('data-id'); if (confirm('您确定已阅读并同意上述合同内容?')) { window.location.href = '/pay?orderId=' + orderId; } }); $('#btn-pay').click(function () { $.ajax({ type: 'post', url: '/pay', data: { 'orderId': $('#orderId').val() }, success: function (data) { if (data.code == 1) { alert('支付成功'); window.location.href = '/admin/order/rent' } else { alert(data.msg); } } }); }); ================================================ FILE: src/main/resources/static/front/js/jqBootstrapValidation.js ================================================ /* jqBootstrapValidation * A plugin for automating validation on Twitter Bootstrap formatted forms. * * v1.3.6 * * License: MIT - see LICENSE file * * http://ReactiveRaven.github.com/jqBootstrapValidation/ */ (function( $ ){ var createdElements = []; var defaults = { options: { prependExistingHelpBlock: false, sniffHtml: true, // sniff for 'required', 'maxlength', etc preventSubmit: true, // stop the form submit event from firing if validation fails submitError: false, // function called if there is an error when trying to submit submitSuccess: false, // function called just before a successful submit event is sent to the server semanticallyStrict: false, // set to true to tidy up generated HTML output autoAdd: { helpBlocks: true }, filter: function () { // return $(this).is(":visible"); // only validate elements you can see return true; // validate everything } }, methods: { init : function( options ) { var settings = $.extend(true, {}, defaults); settings.options = $.extend(true, settings.options, options); var $siblingElements = this; var uniqueForms = $.unique( $siblingElements.map( function () { return $(this).parents("form")[0]; }).toArray() ); $(uniqueForms).bind("submit", function (e) { var $form = $(this); var warningsFound = 0; var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter); $inputs.trigger("submit.validation").trigger("validationLostFocus.validation"); $inputs.each(function (i, el) { var $this = $(el), $controlGroup = $this.parents(".control-group").first(); if ( $controlGroup.hasClass("has-warning") ) { $controlGroup.removeClass("has-warning").addClass("has-error"); warningsFound++; } }); $inputs.trigger("validationLostFocus.validation"); if (warningsFound) { if (settings.options.preventSubmit) { e.preventDefault(); } $form.addClass("has-error"); if ($.isFunction(settings.options.submitError)) { settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true)); } } else { $form.removeClass("has-error"); if ($.isFunction(settings.options.submitSuccess)) { settings.options.submitSuccess($form, e); } } }); return this.each(function(){ // Get references to everything we're interested in var $this = $(this), $controlGroup = $this.parents(".control-group").first(), $helpBlock = $controlGroup.find(".help-block").first(), $form = $this.parents("form").first(), validatorNames = []; // create message container if not exists if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) { $helpBlock = $('
'); $controlGroup.find('.controls').append($helpBlock); createdElements.push($helpBlock[0]); } // ============================================================= // SNIFF HTML FOR VALIDATORS // ============================================================= // *snort sniff snuffle* if (settings.options.sniffHtml) { var message = ""; // --------------------------------------------------------- // PATTERN // --------------------------------------------------------- if ($this.attr("pattern") !== undefined) { message = "Not in the expected format"; if ($this.data("validationPatternMessage")) { message = $this.data("validationPatternMessage"); } $this.data("validationPatternMessage", message); $this.data("validationPatternRegex", $this.attr("pattern")); } // --------------------------------------------------------- // MAX // --------------------------------------------------------- if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); message = "Too high: Maximum of '" + max + "'"; if ($this.data("validationMaxMessage")) { message = $this.data("validationMaxMessage"); } $this.data("validationMaxMessage", message); $this.data("validationMaxMax", max); } // --------------------------------------------------------- // MIN // --------------------------------------------------------- if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); message = "Too low: Minimum of '" + min + "'"; if ($this.data("validationMinMessage")) { message = $this.data("validationMinMessage"); } $this.data("validationMinMessage", message); $this.data("validationMinMin", min); } // --------------------------------------------------------- // MAXLENGTH // --------------------------------------------------------- if ($this.attr("maxlength") !== undefined) { message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters"; if ($this.data("validationMaxlengthMessage")) { message = $this.data("validationMaxlengthMessage"); } $this.data("validationMaxlengthMessage", message); $this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); } // --------------------------------------------------------- // MINLENGTH // --------------------------------------------------------- if ($this.attr("minlength") !== undefined) { message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters"; if ($this.data("validationMinlengthMessage")) { message = $this.data("validationMinlengthMessage"); } $this.data("validationMinlengthMessage", message); $this.data("validationMinlengthMinlength", $this.attr("minlength")); } // --------------------------------------------------------- // REQUIRED // --------------------------------------------------------- if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { message = settings.builtInValidators.required.message; if ($this.data("validationRequiredMessage")) { message = $this.data("validationRequiredMessage"); } $this.data("validationRequiredMessage", message); } // --------------------------------------------------------- // NUMBER // --------------------------------------------------------- if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") { message = settings.builtInValidators.number.message; if ($this.data("validationNumberMessage")) { message = $this.data("validationNumberMessage"); } $this.data("validationNumberMessage", message); } // --------------------------------------------------------- // EMAIL // --------------------------------------------------------- if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") { message = "Not a valid email address"; if ($this.data("validationValidemailMessage")) { message = $this.data("validationValidemailMessage"); } else if ($this.data("validationEmailMessage")) { message = $this.data("validationEmailMessage"); } $this.data("validationValidemailMessage", message); } // --------------------------------------------------------- // MINCHECKED // --------------------------------------------------------- if ($this.attr("minchecked") !== undefined) { message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required"; if ($this.data("validationMincheckedMessage")) { message = $this.data("validationMincheckedMessage"); } $this.data("validationMincheckedMessage", message); $this.data("validationMincheckedMinchecked", $this.attr("minchecked")); } // --------------------------------------------------------- // MAXCHECKED // --------------------------------------------------------- if ($this.attr("maxchecked") !== undefined) { message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required"; if ($this.data("validationMaxcheckedMessage")) { message = $this.data("validationMaxcheckedMessage"); } $this.data("validationMaxcheckedMessage", message); $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked")); } } // ============================================================= // COLLECT VALIDATOR NAMES // ============================================================= // Get named validators if ($this.data("validation") !== undefined) { validatorNames = $this.data("validation").split(","); } // Get extra ones defined on the element's data attributes $.each($this.data(), function (i, el) { var parts = i.replace(/([A-Z])/g, ",$1").split(","); if (parts[0] === "validation" && parts[1]) { validatorNames.push(parts[1]); } }); // ============================================================= // NORMALISE VALIDATOR NAMES // ============================================================= var validatorNamesToInspect = validatorNames; var newValidatorNamesToInspect = []; do // repeatedly expand 'shortcut' validators into their real validators { // Uppercase only the first letter of each name $.each(validatorNames, function (i, el) { validatorNames[i] = formatValidatorName(el); }); // Remove duplicate validator names validatorNames = $.unique(validatorNames); // Pull out the new validator names from each shortcut newValidatorNamesToInspect = []; $.each(validatorNamesToInspect, function(i, el) { if ($this.data("validation" + el + "Shortcut") !== undefined) { // Are these custom validators? // Pull them out! $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) { newValidatorNamesToInspect.push(el2); }); } else if (settings.builtInValidators[el.toLowerCase()]) { // Is this a recognised built-in? // Pull it out! var validator = settings.builtInValidators[el.toLowerCase()]; if (validator.type.toLowerCase() === "shortcut") { $.each(validator.shortcut.split(","), function (i, el) { el = formatValidatorName(el); newValidatorNamesToInspect.push(el); validatorNames.push(el); }); } } }); validatorNamesToInspect = newValidatorNamesToInspect; } while (validatorNamesToInspect.length > 0) // ============================================================= // SET UP VALIDATOR ARRAYS // ============================================================= var validators = {}; $.each(validatorNames, function (i, el) { // Set up the 'override' message var message = $this.data("validation" + el + "Message"); var hasOverrideMessage = (message !== undefined); var foundValidator = false; message = ( message ? message : "'" + el + "' validation failed " ) ; $.each( settings.validatorTypes, function (validatorType, validatorTemplate) { if (validators[validatorType] === undefined) { validators[validatorType] = []; } if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) { validators[validatorType].push( $.extend( true, { name: formatValidatorName(validatorTemplate.name), message: message }, validatorTemplate.init($this, el) ) ); foundValidator = true; } } ); if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) { var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]); if (hasOverrideMessage) { validator.message = message; } var validatorType = validator.type.toLowerCase(); if (validatorType === "shortcut") { foundValidator = true; } else { $.each( settings.validatorTypes, function (validatorTemplateType, validatorTemplate) { if (validators[validatorTemplateType] === undefined) { validators[validatorTemplateType] = []; } if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) { $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]); validators[validatorType].push( $.extend( validator, validatorTemplate.init($this, el) ) ); foundValidator = true; } } ); } } if (! foundValidator) { $.error("Cannot find validation info for '" + el + "'"); } }); // ============================================================= // STORE FALLBACK VALUES // ============================================================= $helpBlock.data( "original-contents", ( $helpBlock.data("original-contents") ? $helpBlock.data("original-contents") : $helpBlock.html() ) ); $helpBlock.data( "original-role", ( $helpBlock.data("original-role") ? $helpBlock.data("original-role") : $helpBlock.attr("role") ) ); $controlGroup.data( "original-classes", ( $controlGroup.data("original-clases") ? $controlGroup.data("original-classes") : $controlGroup.attr("class") ) ); $this.data( "original-aria-invalid", ( $this.data("original-aria-invalid") ? $this.data("original-aria-invalid") : $this.attr("aria-invalid") ) ); // ============================================================= // VALIDATION // ============================================================= $this.bind( "validation.validation", function (event, params) { var value = getValue($this); // Get a list of the errors to apply var errorsFound = []; $.each(validators, function (validatorType, validatorTypeArray) { if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) { $.each(validatorTypeArray, function (i, validator) { if (settings.validatorTypes[validatorType].validate($this, value, validator)) { errorsFound.push(validator.message); } }); } }); return errorsFound; } ); $this.bind( "getValidators.validation", function () { return validators; } ); // ============================================================= // WATCH FOR CHANGES // ============================================================= $this.bind( "submit.validation", function () { return $this.triggerHandler("change.validation", {submitting: true}); } ); $this.bind( [ "keyup", "focus", "blur", "click", "keydown", "keypress", "change" ].join(".validation ") + ".validation", function (e, params) { var value = getValue($this); var errorsFound = []; $controlGroup.find("input,textarea,select").each(function (i, el) { var oldCount = errorsFound.length; $.each($(el).triggerHandler("validation.validation", params), function (j, message) { errorsFound.push(message); }); if (errorsFound.length > oldCount) { $(el).attr("aria-invalid", "true"); } else { var original = $this.data("original-aria-invalid"); $(el).attr("aria-invalid", (original !== undefined ? original : false)); } }); $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation"); errorsFound = $.unique(errorsFound.sort()); // Were there any errors? if (errorsFound.length) { // Better flag it up as a warning. $controlGroup.removeClass("has-success has-error").addClass("has-warning"); // How many errors did we find? if (settings.options.semanticallyStrict && errorsFound.length === 1) { // Only one? Being strict? Just output it. $helpBlock.html(errorsFound[0] + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); } else { // Multiple? Being sloppy? Glue them together into an UL. $helpBlock.html("
  • " + errorsFound.join("
  • ") + "
" + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); } } else { $controlGroup.removeClass("has-warning has-error has-success"); if (value.length > 0) { $controlGroup.addClass("has-success"); } $helpBlock.html($helpBlock.data("original-contents")); } if (e.type === "blur") { $controlGroup.removeClass("has-success"); } } ); $this.bind("validationLostFocus.validation", function () { $controlGroup.removeClass("has-success"); }); }); }, destroy : function( ) { return this.each( function() { var $this = $(this), $controlGroup = $this.parents(".control-group").first(), $helpBlock = $controlGroup.find(".help-block").first(); // remove our events $this.unbind('.validation'); // events are namespaced. // reset help text $helpBlock.html($helpBlock.data("original-contents")); // reset classes $controlGroup.attr("class", $controlGroup.data("original-classes")); // reset aria $this.attr("aria-invalid", $this.data("original-aria-invalid")); // reset role $helpBlock.attr("role", $this.data("original-role")); // remove all elements we created if (createdElements.indexOf($helpBlock[0]) > -1) { $helpBlock.remove(); } } ); }, collectErrors : function(includeEmpty) { var errorMessages = {}; this.each(function (i, el) { var $el = $(el); var name = $el.attr("name"); var errors = $el.triggerHandler("validation.validation", {includeEmpty: true}); errorMessages[name] = $.extend(true, errors, errorMessages[name]); }); $.each(errorMessages, function (i, el) { if (el.length === 0) { delete errorMessages[i]; } }); return errorMessages; }, hasErrors: function() { var errorMessages = []; this.each(function (i, el) { errorMessages = errorMessages.concat( $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : [] ); }); return (errorMessages.length > 0); }, override : function (newDefaults) { defaults = $.extend(true, defaults, newDefaults); } }, validatorTypes: { callback: { name: "callback", init: function ($this, name) { return { validatorName: name, callback: $this.data("validation" + name + "Callback"), lastValue: $this.val(), lastValid: true, lastFinished: true }; }, validate: function ($this, value, validator) { if (validator.lastValue === value && validator.lastFinished) { return !validator.lastValid; } if (validator.lastFinished === true) { validator.lastValue = value; validator.lastValid = true; validator.lastFinished = false; var rrjqbvValidator = validator; var rrjqbvThis = $this; executeFunctionByName( validator.callback, window, $this, value, function (data) { if (rrjqbvValidator.lastValue === data.value) { rrjqbvValidator.lastValid = data.valid; if (data.message) { rrjqbvValidator.message = data.message; } rrjqbvValidator.lastFinished = true; rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { rrjqbvThis.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } } ); } return false; } }, ajax: { name: "ajax", init: function ($this, name) { return { validatorName: name, url: $this.data("validation" + name + "Ajax"), lastValue: $this.val(), lastValid: true, lastFinished: true }; }, validate: function ($this, value, validator) { if (""+validator.lastValue === ""+value && validator.lastFinished === true) { return validator.lastValid === false; } if (validator.lastFinished === true) { validator.lastValue = value; validator.lastValid = true; validator.lastFinished = false; $.ajax({ url: validator.url, data: "value=" + value + "&field=" + $this.attr("name"), dataType: "json", success: function (data) { if (""+validator.lastValue === ""+data.value) { validator.lastValid = !!(data.valid); if (data.message) { validator.message = data.message; } validator.lastFinished = true; $this.data("validation" + validator.validatorName + "Message", validator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { $this.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } }, failure: function () { validator.lastValid = true; validator.message = "ajax call failed"; validator.lastFinished = true; $this.data("validation" + validator.validatorName + "Message", validator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { $this.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } }); } return false; } }, regex: { name: "regex", init: function ($this, name) { return {regex: regexFromString($this.data("validation" + name + "Regex"))}; }, validate: function ($this, value, validator) { return (!validator.regex.test(value) && ! validator.negative) || (validator.regex.test(value) && validator.negative); } }, required: { name: "required", init: function ($this, name) { return {}; }, validate: function ($this, value, validator) { return !!(value.length === 0 && ! validator.negative) || !!(value.length > 0 && validator.negative); }, blockSubmit: true }, match: { name: "match", init: function ($this, name) { var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first(); element.bind("validation.validation", function () { $this.trigger("change.validation", {submitting: true}); }); return {"element": element}; }, validate: function ($this, value, validator) { return (value !== validator.element.val() && ! validator.negative) || (value === validator.element.val() && validator.negative); }, blockSubmit: true }, max: { name: "max", init: function ($this, name) { return {max: $this.data("validation" + name + "Max")}; }, validate: function ($this, value, validator) { return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative) || (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative); } }, min: { name: "min", init: function ($this, name) { return {min: $this.data("validation" + name + "Min")}; }, validate: function ($this, value, validator) { return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative) || (parseFloat(value) >= parseFloat(validator.min) && validator.negative); } }, maxlength: { name: "maxlength", init: function ($this, name) { return {maxlength: $this.data("validation" + name + "Maxlength")}; }, validate: function ($this, value, validator) { return ((value.length > validator.maxlength) && ! validator.negative) || ((value.length <= validator.maxlength) && validator.negative); } }, minlength: { name: "minlength", init: function ($this, name) { return {minlength: $this.data("validation" + name + "Minlength")}; }, validate: function ($this, value, validator) { return ((value.length < validator.minlength) && ! validator.negative) || ((value.length >= validator.minlength) && validator.negative); } }, maxchecked: { name: "maxchecked", init: function ($this, name) { var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); elements.bind("click.validation", function () { $this.trigger("change.validation", {includeEmpty: true}); }); return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements}; }, validate: function ($this, value, validator) { return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative) || (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative); }, blockSubmit: true }, minchecked: { name: "minchecked", init: function ($this, name) { var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); elements.bind("click.validation", function () { $this.trigger("change.validation", {includeEmpty: true}); }); return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements}; }, validate: function ($this, value, validator) { return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative) || (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative); }, blockSubmit: true } }, builtInValidators: { email: { name: "Email", type: "shortcut", shortcut: "validemail" }, validemail: { name: "Validemail", type: "regex", regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}", message: "Not a valid email address" }, passwordagain: { name: "Passwordagain", type: "match", match: "password", message: "Does not match the given password" }, positive: { name: "Positive", type: "shortcut", shortcut: "number,positivenumber" }, negative: { name: "Negative", type: "shortcut", shortcut: "number,negativenumber" }, number: { name: "Number", type: "regex", regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?", message: "Must be a number" }, integer: { name: "Integer", type: "regex", regex: "[+-]?\\\d+", message: "No decimal places allowed" }, positivenumber: { name: "Positivenumber", type: "min", min: 0, message: "Must be a positive number" }, negativenumber: { name: "Negativenumber", type: "max", max: 0, message: "Must be a negative number" }, required: { name: "Required", type: "required", message: "This is required" }, checkone: { name: "Checkone", type: "minchecked", minchecked: 1, message: "Check at least one option" } } }; var formatValidatorName = function (name) { return name .toLowerCase() .replace( /(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); } ) ; }; var getValue = function ($this) { // Extract the value we're talking about var value = $this.val(); var type = $this.attr("type"); if (type === "checkbox") { value = ($this.is(":checked") ? value : ""); } if (type === "radio") { value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : ""); } return value; }; function regexFromString(inputstring) { return new RegExp("^" + inputstring + "$"); } /** * Thanks to Jason Bunting via StackOverflow.com * * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910 * Short link: http://tinyurl.com/executeFunctionByName **/ function executeFunctionByName(functionName, context /*, args*/) { var args = Array.prototype.slice.call(arguments).splice(2); var namespaces = functionName.split("."); var func = namespaces.pop(); for(var i = 0; i < namespaces.length; i++) { context = context[namespaces[i]]; } return context[func].apply(this, args); } $.fn.jqBootstrapValidation = function( method ) { if ( defaults.methods[method] ) { return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return defaults.methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' ); return null; } }; $.jqBootstrapValidation = function (options) { $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments); }; })( jQuery ); ================================================ FILE: src/main/resources/static/front/vendor/select2/css/select2-bootstrap.css ================================================ /*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */ /** * Reset Bootstrap 3 .form-control styles which - if applied to the * original element Select2 is replacing not be properly being hidden * when used in a "Bootstrap Input Group with Addon". **/ .select2-offscreen, .select2-offscreen:focus { width: 1px !important; height: 1px !important; position: absolute !important; } ================================================ FILE: src/main/resources/static/js/adminlte.js ================================================ /*! AdminLTE app.js * ================ * Main JS application file for AdminLTE v2. This file * should be included in all pages. It controls some layout * options and implements exclusive AdminLTE plugins. * * @Author Almsaeed Studio * @Support * @Email * @version 2.4.5 * @repository git://github.com/almasaeed2010/AdminLTE.git * @license MIT */ // Make sure jQuery has been loaded if (typeof jQuery === 'undefined') { throw new Error('AdminLTE requires jQuery') } /* BoxRefresh() * ========= * Adds AJAX content control to a box. * * @Usage: $('#my-box').boxRefresh(options) * or add [data-widget="box-refresh"] to the box element * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.boxrefresh'; var Default = { source : '', params : {}, trigger : '.refresh-btn', content : '.box-body', loadInContent : true, responseType : '', overlayTemplate: '
', onLoadStart : function () { }, onLoadDone : function (response) { return response; } }; var Selector = { data: '[data-widget="box-refresh"]' }; // BoxRefresh Class Definition // ========================= var BoxRefresh = function (element, options) { this.element = element; this.options = options; this.$overlay = $(options.overlay); if (options.source === '') { throw new Error('Source url was not defined. Please specify a url in your BoxRefresh source option.'); } this._setUpListeners(); this.load(); }; BoxRefresh.prototype.load = function () { this._addOverlay(); this.options.onLoadStart.call($(this)); $.get(this.options.source, this.options.params, function (response) { if (this.options.loadInContent) { $(this.options.content).html(response); } this.options.onLoadDone.call($(this), response); this._removeOverlay(); }.bind(this), this.options.responseType !== '' && this.options.responseType); }; // Private BoxRefresh.prototype._setUpListeners = function () { $(this.element).on('click', Selector.trigger, function (event) { if (event) event.preventDefault(); this.load(); }.bind(this)); }; BoxRefresh.prototype._addOverlay = function () { $(this.element).append(this.$overlay); }; BoxRefresh.prototype._removeOverlay = function () { $(this.element).remove(this.$overlay); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, (data = new BoxRefresh($this, options))); } if (typeof data == 'string') { if (typeof data[option] == 'undefined') { throw new Error('No method named ' + option); } data[option](); } }); } var old = $.fn.boxRefresh; $.fn.boxRefresh = Plugin; $.fn.boxRefresh.Constructor = BoxRefresh; // No Conflict Mode // ================ $.fn.boxRefresh.noConflict = function () { $.fn.boxRefresh = old; return this; }; // BoxRefresh Data API // ================= $(window).on('load', function () { $(Selector.data).each(function () { Plugin.call($(this)); }); }); }(jQuery); /* BoxWidget() * ====== * Adds box widget functions to boxes. * * @Usage: $('.my-box').boxWidget(options) * This plugin auto activates on any element using the `.box` class * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.boxwidget'; var Default = { animationSpeed : 500, collapseTrigger: '[data-widget="collapse"]', removeTrigger : '[data-widget="remove"]', collapseIcon : 'fa-minus', expandIcon : 'fa-plus', removeIcon : 'fa-times' }; var Selector = { data : '.box', collapsed: '.collapsed-box', header : '.box-header', body : '.box-body', footer : '.box-footer', tools : '.box-tools' }; var ClassName = { collapsed: 'collapsed-box' }; var Event = { collapsed: 'collapsed.boxwidget', expanded : 'expanded.boxwidget', removed : 'removed.boxwidget' }; // BoxWidget Class Definition // ===================== var BoxWidget = function (element, options) { this.element = element; this.options = options; this._setUpListeners(); }; BoxWidget.prototype.toggle = function () { var isOpen = !$(this.element).is(Selector.collapsed); if (isOpen) { this.collapse(); } else { this.expand(); } }; BoxWidget.prototype.expand = function () { var expandedEvent = $.Event(Event.expanded); var collapseIcon = this.options.collapseIcon; var expandIcon = this.options.expandIcon; $(this.element).removeClass(ClassName.collapsed); $(this.element) .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer) .children(Selector.tools) .find('.' + expandIcon) .removeClass(expandIcon) .addClass(collapseIcon); $(this.element).children(Selector.body + ', ' + Selector.footer) .slideDown(this.options.animationSpeed, function () { $(this.element).trigger(expandedEvent); }.bind(this)); }; BoxWidget.prototype.collapse = function () { var collapsedEvent = $.Event(Event.collapsed); var collapseIcon = this.options.collapseIcon; var expandIcon = this.options.expandIcon; $(this.element) .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer) .children(Selector.tools) .find('.' + collapseIcon) .removeClass(collapseIcon) .addClass(expandIcon); $(this.element).children(Selector.body + ', ' + Selector.footer) .slideUp(this.options.animationSpeed, function () { $(this.element).addClass(ClassName.collapsed); $(this.element).trigger(collapsedEvent); }.bind(this)); }; BoxWidget.prototype.remove = function () { var removedEvent = $.Event(Event.removed); $(this.element).slideUp(this.options.animationSpeed, function () { $(this.element).trigger(removedEvent); $(this.element).remove(); }.bind(this)); }; // Private BoxWidget.prototype._setUpListeners = function () { var that = this; $(this.element).on('click', this.options.collapseTrigger, function (event) { if (event) event.preventDefault(); that.toggle($(this)); return false; }); $(this.element).on('click', this.options.removeTrigger, function (event) { if (event) event.preventDefault(); that.remove($(this)); return false; }); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, (data = new BoxWidget($this, options))); } if (typeof option == 'string') { if (typeof data[option] == 'undefined') { throw new Error('No method named ' + option); } data[option](); } }); } var old = $.fn.boxWidget; $.fn.boxWidget = Plugin; $.fn.boxWidget.Constructor = BoxWidget; // No Conflict Mode // ================ $.fn.boxWidget.noConflict = function () { $.fn.boxWidget = old; return this; }; // BoxWidget Data API // ================== $(window).on('load', function () { $(Selector.data).each(function () { Plugin.call($(this)); }); }); }(jQuery); /* ControlSidebar() * =============== * Toggles the state of the control sidebar * * @Usage: $('#control-sidebar-trigger').controlSidebar(options) * or add [data-toggle="control-sidebar"] to the trigger * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.controlsidebar'; var Default = { slide: true }; var Selector = { sidebar: '.control-sidebar', data : '[data-toggle="control-sidebar"]', open : '.control-sidebar-open', bg : '.control-sidebar-bg', wrapper: '.wrapper', content: '.content-wrapper', boxed : '.layout-boxed' }; var ClassName = { open : 'control-sidebar-open', fixed: 'fixed' }; var Event = { collapsed: 'collapsed.controlsidebar', expanded : 'expanded.controlsidebar' }; // ControlSidebar Class Definition // =============================== var ControlSidebar = function (element, options) { this.element = element; this.options = options; this.hasBindedResize = false; this.init(); }; ControlSidebar.prototype.init = function () { // Add click listener if the element hasn't been // initialized using the data API if (!$(this.element).is(Selector.data)) { $(this).on('click', this.toggle); } this.fix(); $(window).resize(function () { this.fix(); }.bind(this)); }; ControlSidebar.prototype.toggle = function (event) { if (event) event.preventDefault(); this.fix(); if (!$(Selector.sidebar).is(Selector.open) && !$('body').is(Selector.open)) { this.expand(); } else { this.collapse(); } }; ControlSidebar.prototype.expand = function () { if (!this.options.slide) { $('body').addClass(ClassName.open); } else { $(Selector.sidebar).addClass(ClassName.open); } $(this.element).trigger($.Event(Event.expanded)); }; ControlSidebar.prototype.collapse = function () { $('body, ' + Selector.sidebar).removeClass(ClassName.open); $(this.element).trigger($.Event(Event.collapsed)); }; ControlSidebar.prototype.fix = function () { if ($('body').is(Selector.boxed)) { this._fixForBoxed($(Selector.bg)); } }; // Private ControlSidebar.prototype._fixForBoxed = function (bg) { bg.css({ position: 'absolute', height : $(Selector.wrapper).height() }); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, (data = new ControlSidebar($this, options))); } if (typeof option == 'string') data.toggle(); }); } var old = $.fn.controlSidebar; $.fn.controlSidebar = Plugin; $.fn.controlSidebar.Constructor = ControlSidebar; // No Conflict Mode // ================ $.fn.controlSidebar.noConflict = function () { $.fn.controlSidebar = old; return this; }; // ControlSidebar Data API // ======================= $(document).on('click', Selector.data, function (event) { if (event) event.preventDefault(); Plugin.call($(this), 'toggle'); }); }(jQuery); /* DirectChat() * =============== * Toggles the state of the control sidebar * * @Usage: $('#my-chat-box').directChat() * or add [data-widget="direct-chat"] to the trigger */ +function ($) { 'use strict'; var DataKey = 'lte.directchat'; var Selector = { data: '[data-widget="chat-pane-toggle"]', box : '.direct-chat' }; var ClassName = { open: 'direct-chat-contacts-open' }; // DirectChat Class Definition // =========================== var DirectChat = function (element) { this.element = element; }; DirectChat.prototype.toggle = function ($trigger) { $trigger.parents(Selector.box).first().toggleClass(ClassName.open); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { $this.data(DataKey, (data = new DirectChat($this))); } if (typeof option == 'string') data.toggle($this); }); } var old = $.fn.directChat; $.fn.directChat = Plugin; $.fn.directChat.Constructor = DirectChat; // No Conflict Mode // ================ $.fn.directChat.noConflict = function () { $.fn.directChat = old; return this; }; // DirectChat Data API // =================== $(document).on('click', Selector.data, function (event) { if (event) event.preventDefault(); Plugin.call($(this), 'toggle'); }); }(jQuery); /* Layout() * ======== * Implements AdminLTE layout. * Fixes the layout height in case min-height fails. * * @usage activated automatically upon window load. * Configure any options by passing data-option="value" * to the body tag. */ +function ($) { 'use strict'; var DataKey = 'lte.layout'; var Default = { slimscroll : true, resetHeight: true }; var Selector = { wrapper : '.wrapper', contentWrapper: '.content-wrapper', layoutBoxed : '.layout-boxed', mainFooter : '.main-footer', mainHeader : '.main-header', sidebar : '.sidebar', controlSidebar: '.control-sidebar', fixed : '.fixed', sidebarMenu : '.sidebar-menu', logo : '.main-header .logo' }; var ClassName = { fixed : 'fixed', holdTransition: 'hold-transition' }; var Layout = function (options) { this.options = options; this.bindedResize = false; this.activate(); }; Layout.prototype.activate = function () { this.fix(); this.fixSidebar(); $('body').removeClass(ClassName.holdTransition); if (this.options.resetHeight) { $('body, html, ' + Selector.wrapper).css({ 'height' : 'auto', 'min-height': '100%' }); } if (!this.bindedResize) { $(window).resize(function () { this.fix(); this.fixSidebar(); $(Selector.logo + ', ' + Selector.sidebar).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function () { this.fix(); this.fixSidebar(); }.bind(this)); }.bind(this)); this.bindedResize = true; } $(Selector.sidebarMenu).on('expanded.tree', function () { this.fix(); this.fixSidebar(); }.bind(this)); $(Selector.sidebarMenu).on('collapsed.tree', function () { this.fix(); this.fixSidebar(); }.bind(this)); }; Layout.prototype.fix = function () { // Remove overflow from .wrapper if layout-boxed exists $(Selector.layoutBoxed + ' > ' + Selector.wrapper).css('overflow', 'hidden'); // Get window height and the wrapper height var footerHeight = $(Selector.mainFooter).outerHeight() || 0; var headerHeight = $(Selector.mainHeader).outerHeight() || 0; var neg = headerHeight + footerHeight; var windowHeight = $(window).height(); var sidebarHeight = $(Selector.sidebar).height() || 0; // Set the min-height of the content and sidebar based on // the height of the document. if ($('body').hasClass(ClassName.fixed)) { $(Selector.contentWrapper).css('min-height', windowHeight - footerHeight); } else { var postSetHeight; if (windowHeight >= sidebarHeight) { $(Selector.contentWrapper).css('min-height', windowHeight - neg); postSetHeight = windowHeight - neg; } else { $(Selector.contentWrapper).css('min-height', sidebarHeight); postSetHeight = sidebarHeight; } // Fix for the control sidebar height var $controlSidebar = $(Selector.controlSidebar); if (typeof $controlSidebar !== 'undefined') { if ($controlSidebar.height() > postSetHeight) $(Selector.contentWrapper).css('min-height', $controlSidebar.height()); } } }; Layout.prototype.fixSidebar = function () { // Make sure the body tag has the .fixed class if (!$('body').hasClass(ClassName.fixed)) { if (typeof $.fn.slimScroll !== 'undefined') { $(Selector.sidebar).slimScroll({ destroy: true }).height('auto'); } return; } // Enable slimscroll for fixed layout if (this.options.slimscroll) { if (typeof $.fn.slimScroll !== 'undefined') { // Destroy if it exists // $(Selector.sidebar).slimScroll({ destroy: true }).height('auto') // Add slimscroll $(Selector.sidebar).slimScroll({ height: ($(window).height() - $(Selector.mainHeader).height()) + 'px' }); } } }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option === 'object' && option); $this.data(DataKey, (data = new Layout(options))); } if (typeof option === 'string') { if (typeof data[option] === 'undefined') { throw new Error('No method named ' + option); } data[option](); } }); } var old = $.fn.layout; $.fn.layout = Plugin; $.fn.layout.Constuctor = Layout; // No conflict mode // ================ $.fn.layout.noConflict = function () { $.fn.layout = old; return this; }; // Layout DATA-API // =============== $(window).on('load', function () { Plugin.call($('body')); }); }(jQuery); /* PushMenu() * ========== * Adds the push menu functionality to the sidebar. * * @usage: $('.btn').pushMenu(options) * or add [data-toggle="push-menu"] to any button * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.pushmenu'; var Default = { collapseScreenSize : 767, expandOnHover : false, expandTransitionDelay: 200 }; var Selector = { collapsed : '.sidebar-collapse', open : '.sidebar-open', mainSidebar : '.main-sidebar', contentWrapper: '.content-wrapper', searchInput : '.sidebar-form .form-control', button : '[data-toggle="push-menu"]', mini : '.sidebar-mini', expanded : '.sidebar-expanded-on-hover', layoutFixed : '.fixed' }; var ClassName = { collapsed : 'sidebar-collapse', open : 'sidebar-open', mini : 'sidebar-mini', expanded : 'sidebar-expanded-on-hover', expandFeature: 'sidebar-mini-expand-feature', layoutFixed : 'fixed' }; var Event = { expanded : 'expanded.pushMenu', collapsed: 'collapsed.pushMenu' }; // PushMenu Class Definition // ========================= var PushMenu = function (options) { this.options = options; this.init(); }; PushMenu.prototype.init = function () { if (this.options.expandOnHover || ($('body').is(Selector.mini + Selector.layoutFixed))) { this.expandOnHover(); $('body').addClass(ClassName.expandFeature); } $(Selector.contentWrapper).click(function () { // Enable hide menu when clicking on the content-wrapper on small screens if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) { this.close(); } }.bind(this)); // __Fix for android devices $(Selector.searchInput).click(function (e) { e.stopPropagation(); }); }; PushMenu.prototype.toggle = function () { var windowWidth = $(window).width(); var isOpen = !$('body').hasClass(ClassName.collapsed); if (windowWidth <= this.options.collapseScreenSize) { isOpen = $('body').hasClass(ClassName.open); } if (!isOpen) { this.open(); } else { this.close(); } }; PushMenu.prototype.open = function () { var windowWidth = $(window).width(); if (windowWidth > this.options.collapseScreenSize) { $('body').removeClass(ClassName.collapsed) .trigger($.Event(Event.expanded)); } else { $('body').addClass(ClassName.open) .trigger($.Event(Event.expanded)); } }; PushMenu.prototype.close = function () { var windowWidth = $(window).width(); if (windowWidth > this.options.collapseScreenSize) { $('body').addClass(ClassName.collapsed) .trigger($.Event(Event.collapsed)); } else { $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed) .trigger($.Event(Event.collapsed)); } }; PushMenu.prototype.expandOnHover = function () { $(Selector.mainSidebar).hover(function () { if ($('body').is(Selector.mini + Selector.collapsed) && $(window).width() > this.options.collapseScreenSize) { this.expand(); } }.bind(this), function () { if ($('body').is(Selector.expanded)) { this.collapse(); } }.bind(this)); }; PushMenu.prototype.expand = function () { setTimeout(function () { $('body').removeClass(ClassName.collapsed) .addClass(ClassName.expanded); }, this.options.expandTransitionDelay); }; PushMenu.prototype.collapse = function () { setTimeout(function () { $('body').removeClass(ClassName.expanded) .addClass(ClassName.collapsed); }, this.options.expandTransitionDelay); }; // PushMenu Plugin Definition // ========================== function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, (data = new PushMenu(options))); } if (option === 'toggle') data.toggle(); }); } var old = $.fn.pushMenu; $.fn.pushMenu = Plugin; $.fn.pushMenu.Constructor = PushMenu; // No Conflict Mode // ================ $.fn.pushMenu.noConflict = function () { $.fn.pushMenu = old; return this; }; // Data API // ======== $(document).on('click', Selector.button, function (e) { e.preventDefault(); Plugin.call($(this), 'toggle'); }); $(window).on('load', function () { Plugin.call($(Selector.button)); }); }(jQuery); /* TodoList() * ========= * Converts a list into a todoList. * * @Usage: $('.my-list').todoList(options) * or add [data-widget="todo-list"] to the ul element * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.todolist'; var Default = { onCheck : function (item) { return item; }, onUnCheck: function (item) { return item; } }; var Selector = { data: '[data-widget="todo-list"]' }; var ClassName = { done: 'done' }; // TodoList Class Definition // ========================= var TodoList = function (element, options) { this.element = element; this.options = options; this._setUpListeners(); }; TodoList.prototype.toggle = function (item) { item.parents(Selector.li).first().toggleClass(ClassName.done); if (!item.prop('checked')) { this.unCheck(item); return; } this.check(item); }; TodoList.prototype.check = function (item) { this.options.onCheck.call(item); }; TodoList.prototype.unCheck = function (item) { this.options.onUnCheck.call(item); }; // Private TodoList.prototype._setUpListeners = function () { var that = this; $(this.element).on('change ifChanged', 'input:checkbox', function () { that.toggle($(this)); }); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, (data = new TodoList($this, options))); } if (typeof data == 'string') { if (typeof data[option] == 'undefined') { throw new Error('No method named ' + option); } data[option](); } }); } var old = $.fn.todoList; $.fn.todoList = Plugin; $.fn.todoList.Constructor = TodoList; // No Conflict Mode // ================ $.fn.todoList.noConflict = function () { $.fn.todoList = old; return this; }; // TodoList Data API // ================= $(window).on('load', function () { $(Selector.data).each(function () { Plugin.call($(this)); }); }); }(jQuery); /* Tree() * ====== * Converts a nested list into a multilevel * tree view menu. * * @Usage: $('.my-menu').tree(options) * or add [data-widget="tree"] to the ul element * Pass any option as data-option="value" */ +function ($) { 'use strict'; var DataKey = 'lte.tree'; var Default = { animationSpeed: 500, accordion : true, followLink : false, trigger : '.treeview a' }; var Selector = { tree : '.tree', treeview : '.treeview', treeviewMenu: '.treeview-menu', open : '.menu-open, .active', li : 'li', data : '[data-widget="tree"]', active : '.active' }; var ClassName = { open: 'menu-open', tree: 'tree' }; var Event = { collapsed: 'collapsed.tree', expanded : 'expanded.tree' }; // Tree Class Definition // ===================== var Tree = function (element, options) { this.element = element; this.options = options; $(this.element).addClass(ClassName.tree); $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open); this._setUpListeners(); }; Tree.prototype.toggle = function (link, event) { var treeviewMenu = link.next(Selector.treeviewMenu); var parentLi = link.parent(); var isOpen = parentLi.hasClass(ClassName.open); if (!parentLi.is(Selector.treeview)) { return; } if (!this.options.followLink || link.attr('href') === '#') { event.preventDefault(); } if (isOpen) { this.collapse(treeviewMenu, parentLi); } else { this.expand(treeviewMenu, parentLi); } }; Tree.prototype.expand = function (tree, parent) { var expandedEvent = $.Event(Event.expanded); if (this.options.accordion) { var openMenuLi = parent.siblings(Selector.open); var openTree = openMenuLi.children(Selector.treeviewMenu); this.collapse(openTree, openMenuLi); } parent.addClass(ClassName.open); tree.slideDown(this.options.animationSpeed, function () { $(this.element).trigger(expandedEvent); }.bind(this)); }; Tree.prototype.collapse = function (tree, parentLi) { var collapsedEvent = $.Event(Event.collapsed); //tree.find(Selector.open).removeClass(ClassName.open); parentLi.removeClass(ClassName.open); tree.slideUp(this.options.animationSpeed, function () { //tree.find(Selector.open + ' > ' + Selector.treeview).slideUp(); $(this.element).trigger(collapsedEvent); }.bind(this)); }; // Private Tree.prototype._setUpListeners = function () { var that = this; $(this.element).on('click', this.options.trigger, function (event) { that.toggle($(this), event); }); }; // Plugin Definition // ================= function Plugin(option) { return this.each(function () { var $this = $(this); var data = $this.data(DataKey); if (!data) { var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option); $this.data(DataKey, new Tree($this, options)); } }); } var old = $.fn.tree; $.fn.tree = Plugin; $.fn.tree.Constructor = Tree; // No Conflict Mode // ================ $.fn.tree.noConflict = function () { $.fn.tree = old; return this; }; // Tree Data API // ============= $(window).on('load', function () { $(Selector.data).each(function () { Plugin.call($(this)); }); }); }(jQuery); ================================================ FILE: src/main/resources/static/js/app.js ================================================ function initMenus() { $.ajax({ type: 'GET', url: '/admin/currentMenus', async: false, success: function (data) { if (data.code == 0) { showMsg(data.msg, "error", 1000); } else { var content = '
  • HEADER
  • '; $.each(data.result, function (index, value) { if (value.childPermissions != null) { content += '
  • ' + ' ' + ' ' + ' ' + value.name + '' + ' ' + ' '; content += '
      '; $.each(value.childPermissions, function (index2, value2) { content += '
    • ' + ' ' + ' ' + value2.name + ' ' + '
    • '; }); content += '
  • '; } else { content += '
  • ' + ' ' + ' ' + ' ' + value.name + '' + ' ' + '
  • '; } ; }) $('.sidebar-menu').html(content); } } }); } function getLoginUser() { $.ajax({ type: 'GET', url: '/admin/currentUser', async: false, success: function (data) { if (data.code == 0) { showMsg(data.msg, "error", 1000); } else { var user = data.result; $(".loginUserAvatar").attr("src", user.userAvatar); $(".loginUserDisplayName").html(user.userDisplayName); } } }); }; initMenus(); getLoginUser(); $(document).ready(function () { if ($(window).width() < 1024) { if ($('body').hasClass('layout-boxed')) { $('body').removeClass('layout-boxed'); } if ($('body').hasClass('sidebar-collapse')) { $('body').removeClass('sidebar-collapse'); } } initMenu(); }); /** * https://github.com/JpressProjects/jpress/blob/master/jpress-web/src/main/resources/static/admin/js/jpressadmin.js */ function initMenu() { var pathName = location.pathname; $(".sidebar-menu").children().each(function () { var li = $(this); li.find('a').each(function () { var href = $(this).attr("href"); if (pathName == href) { li.addClass("active"); $(this).parent().addClass("active"); } else { //li.removeClass("active"); $(this).parent().removeClass("active"); } }); }); } $(document).on('pjax:clicked', function () { $('.content-wrapper').html(""); }); $(document).on('pjax:complete', function () { initMenu(); }); /** * 提示框 * @param text * @param icon * @param hideAfter */ function showMsg(text, icon, hideAfter) { if (heading == undefined) { var heading = "提示"; } $.toast({ text: text, heading: heading, icon: icon, showHideTransition: 'fade', allowToastClose: true, hideAfter: hideAfter, stack: 1, position: 'top-center', textAlign: 'left', loader: true, loaderBg: '#ffffff' }); } function showMsgAndReload(text, icon, hideAfter) { if (heading == undefined) { var heading = "提示"; } $.toast({ text: text, heading: heading, icon: icon, showHideTransition: 'fade', allowToastClose: true, hideAfter: hideAfter, stack: 1, position: 'top-center', textAlign: 'left', loader: true, loaderBg: '#ffffff', afterHidden: function () { window.location.reload(); } }); } function showMsgAndRedirect(text, icon, hideAfter, redirectUrl) { if (heading == undefined) { var heading = "提示"; } $.toast({ text: text, heading: heading, icon: icon, showHideTransition: 'fade', allowToastClose: true, hideAfter: hideAfter, stack: 1, position: 'top-center', textAlign: 'left', loader: true, loaderBg: '#ffffff', afterHidden: function () { window.location.href = redirectUrl; } }); } /** * 全选和反选 * @constructor */ function doCheck() { var ch = document.getElementsByName("ids"); if (document.getElementById("allSelect").checked == true) { for (var i = 0; i < ch.length; i++) { ch[i].checked = true; } } else { for (var i = 0; i < ch.length; i++) { ch[i].checked = false; } } } /** * 提交房屋 * @param status 房屋状态 */ function push(status) { const id = $('#postId').val(); const postTitle = $('#postTitle').val(); const cateId = $('#cateId').val(); const postThumbnail = $('#postThumbnail').val(); const price = $('#price').val(); const postEditor = $("#edit").froalaEditor('html.get'); const postContent = $("#postContent").froalaEditor('html.get'); const number = $('#number').val(); const cityId = $('#cityId').val(); const roomCount = $('#roomCount').val(); const toiletCount = $('#toiletCount').val(); const deposit = $('#deposit').val(); const area = $('#area').val(); if (postTitle == null || cateId == null || cateId == null || postThumbnail == null || price == null || postContent == null || number == null || postEditor == null || cityId == null || roomCount == null || toiletCount == null || area == null || deposit == null) { showMsg("请输入完整信息", "info", 2000); return; } $.ajax({ type: 'POST', url: '/admin/post/save', async: false, data: { 'id': id, 'postStatus': status, 'postTitle': postTitle, 'postContent': postContent, 'cateId': cateId, 'postThumbnail': postThumbnail, 'price': price, 'number': number, 'cityId': cityId, 'roomCount': roomCount, 'toiletCount': toiletCount, 'area': area, 'deposit': deposit, 'postEditor': postEditor }, success: function (data) { if (data.code == 1) { showMsgAndRedirect("发布成功", "success", 1000, "/admin/post/lease"); } else { showMsg(data.msg, "error", 2000); } } }); } /** * 发布公告 */ function saveNotice() { const id = $('#noticeId').val(); const title = $('#title').val(); const content = $("#content").froalaEditor('html.get'); if (title == null || content == null) { showMsg("请输入完整信息", "info", 2000); return; } $.ajax({ type: 'POST', url: '/admin/notice/save', async: false, data: { 'id': id, 'title': title, 'content': content }, success: function (data) { if (data.code == 1) { showMsgAndRedirect("发布成功", "success", 1000, "/admin/notice"); } else { showMsg(data.msg, "error", 2000); } } }); } ================================================ FILE: src/main/resources/static/plugins/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/resources/static/plugins/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/resources/static/plugins/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/resources/static/plugins/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') ================================================ FILE: src/main/resources/static/plugins/bootstrapStyle/bootstrapStyle.css ================================================ ================================================ FILE: src/main/resources/static/plugins/bootstrapvalidator/css/bootstrapValidator.css ================================================ /** * BootstrapValidator (http://bootstrapvalidator.com) * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 * * @author http://twitter.com/nghuuphuoc * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc * @license Commercial: http://bootstrapvalidator.com/license/ * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ */ .bv-form .help-block { margin-bottom: 0; } .bv-form .tooltip-inner { text-align: left; } .nav-tabs li.bv-tab-success > a { color: #3c763d; } .nav-tabs li.bv-tab-error > a { color: #a94442; } .bv-form .bv-icon-no-label { top: 0; } .bv-form .bv-icon-input-group { top: 0; z-index: 100; ================================================ FILE: src/main/resources/static/plugins/bootstrapvalidator/js/bootstrapValidator.js ================================================ /*! * BootstrapValidator (http://bootstrapvalidator.com) * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 * * @version v0.5.3, built on 2014-11-05 9:14:18 PM * @author https://twitter.com/nghuuphuoc * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc * @license Commercial: http://bootstrapvalidator.com/license/ * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ */ if (typeof jQuery === 'undefined') { throw new Error('BootstrapValidator requires jQuery'); } (function($) { var version = $.fn.jquery.split(' ')[0].split('.'); if ((+version[0] < 2 && +version[1] < 9) || (+version[0] === 1 && +version[1] === 9 && +version[2] < 1)) { throw new Error('BootstrapValidator requires jQuery version 1.9.1 or higher'); } }(window.jQuery)); (function($) { var BootstrapValidator = function(form, options) { this.$form = $(form); this.options = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, options); this.$invalidFields = $([]); // Array of invalid fields this.$submitButton = null; // The submit button which is clicked to submit form this.$hiddenButton = null; // Validating status this.STATUS_NOT_VALIDATED = 'NOT_VALIDATED'; this.STATUS_VALIDATING = 'VALIDATING'; this.STATUS_INVALID = 'INVALID'; this.STATUS_VALID = 'VALID'; // Determine the event that is fired when user change the field value // Most modern browsers supports input event except IE 7, 8. // IE 9 supports input event but the event is still not fired if I press the backspace key. // Get IE version // https://gist.github.com/padolsey/527683/#comment-7595 var ieVersion = (function() { var v = 3, div = document.createElement('div'), a = div.all || []; while (div.innerHTML = '', a[0]) {} return v > 4 ? v : !v; }()); var el = document.createElement('div'); this._changeEvent = (ieVersion === 9 || !('oninput' in el)) ? 'keyup' : 'input'; // The flag to indicate that the form is ready to submit when a remote/callback validator returns this._submitIfValid = null; // Field elements this._cacheFields = {}; this._init(); }; BootstrapValidator.prototype = { constructor: BootstrapValidator, /** * Init form */ _init: function() { var that = this, options = { autoFocus: this.$form.attr('data-bv-autofocus'), container: this.$form.attr('data-bv-container'), events: { formInit: this.$form.attr('data-bv-events-form-init'), formError: this.$form.attr('data-bv-events-form-error'), formSuccess: this.$form.attr('data-bv-events-form-success'), fieldAdded: this.$form.attr('data-bv-events-field-added'), fieldRemoved: this.$form.attr('data-bv-events-field-removed'), fieldInit: this.$form.attr('data-bv-events-field-init'), fieldError: this.$form.attr('data-bv-events-field-error'), fieldSuccess: this.$form.attr('data-bv-events-field-success'), fieldStatus: this.$form.attr('data-bv-events-field-status'), validatorError: this.$form.attr('data-bv-events-validator-error'), validatorSuccess: this.$form.attr('data-bv-events-validator-success') }, excluded: this.$form.attr('data-bv-excluded'), feedbackIcons: { valid: this.$form.attr('data-bv-feedbackicons-valid'), invalid: this.$form.attr('data-bv-feedbackicons-invalid'), validating: this.$form.attr('data-bv-feedbackicons-validating') }, group: this.$form.attr('data-bv-group'), live: this.$form.attr('data-bv-live'), message: this.$form.attr('data-bv-message'), onError: this.$form.attr('data-bv-onerror'), onSuccess: this.$form.attr('data-bv-onsuccess'), submitButtons: this.$form.attr('data-bv-submitbuttons'), threshold: this.$form.attr('data-bv-threshold'), trigger: this.$form.attr('data-bv-trigger'), verbose: this.$form.attr('data-bv-verbose'), fields: {} }; this.$form // Disable client side validation in HTML 5 .attr('novalidate', 'novalidate') .addClass(this.options.elementClass) // Disable the default submission first .on('submit.bv', function(e) { e.preventDefault(); that.validate(); }) .on('click.bv', this.options.submitButtons, function() { that.$submitButton = $(this); // The user just click the submit button that._submitIfValid = true; }) // Find all fields which have either "name" or "data-bv-field" attribute .find('[name], [data-bv-field]') .each(function() { var $field = $(this), field = $field.attr('name') || $field.attr('data-bv-field'), opts = that._parseOptions($field); if (opts) { $field.attr('data-bv-field', field); options.fields[field] = $.extend({}, opts, options.fields[field]); } }); this.options = $.extend(true, this.options, options); // When pressing Enter on any field in the form, the first submit button will do its job. // The form then will be submitted. // I create a first hidden submit button this.$hiddenButton = $('