147 文件已重命名
20个文件已删除
22个文件已添加
42个文件已修改
| | |
| | | |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi</artifactId> |
| | | <version>4.8.0</version> |
| | | <version>4.7.9</version> |
| | | |
| | | <name>ruoyi</name> |
| | | <url>http://www.ruoyi.vip</url> |
| | | <description>若依管理系统</description> |
| | | |
| | | <properties> |
| | | <ruoyi.version>4.8.0</ruoyi.version> |
| | | <ruoyi.version>4.7.9</ruoyi.version> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <java.version>1.8</java.version> |
| | | <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> |
| | | <spring-boot.version>2.5.15</spring-boot.version> |
| | | <shiro.version>1.13.0</shiro.version> |
| | | <spring-framework.version>5.3.33</spring-framework.version> |
| | | <thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version> |
| | | <druid.version>1.2.23</druid.version> |
| | | <bitwalker.version>1.21</bitwalker.version> |
| | |
| | | <swagger.version>3.0.0</swagger.version> |
| | | <pagehelper.boot.version>1.4.7</pagehelper.boot.version> |
| | | <fastjson.version>1.2.83</fastjson.version> |
| | | <oshi.version>6.6.5</oshi.version> |
| | | <oshi.version>6.6.3</oshi.version> |
| | | <commons.io.version>2.16.1</commons.io.version> |
| | | <poi.version>4.1.2</poi.version> |
| | | <velocity.version>2.3</velocity.version> |
| | | <!-- override dependency version --> |
| | | <tomcat.version>9.0.96</tomcat.version> |
| | | <logback.version>1.2.13</logback.version> |
| | | <spring-framework.version>5.3.39</spring-framework.version> |
| | | </properties> |
| | | |
| | | <!-- 依赖声明 --> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | |
| | | <!-- 覆盖SpringFramework的依赖配置--> |
| | | <!-- SpringFramework的依赖配置--> |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-framework-bom</artifactId> |
| | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-dependencies</artifactId> |
| | | <version>${spring-boot.version}</version> |
| | | <version>2.5.15</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | |
| | | <!-- 覆盖logback的依赖配置--> |
| | | <dependency> |
| | | <groupId>ch.qos.logback</groupId> |
| | | <artifactId>logback-core</artifactId> |
| | | <version>${logback.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>ch.qos.logback</groupId> |
| | | <artifactId>logback-classic</artifactId> |
| | | <version>${logback.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 覆盖tomcat的依赖配置--> |
| | | <dependency> |
| | | <groupId>org.apache.tomcat.embed</groupId> |
| | | <artifactId>tomcat-embed-core</artifactId> |
| | | <version>${tomcat.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.apache.tomcat.embed</groupId> |
| | | <artifactId>tomcat-embed-el</artifactId> |
| | | <version>${tomcat.version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.apache.tomcat.embed</groupId> |
| | | <artifactId>tomcat-embed-websocket</artifactId> |
| | | <version>${tomcat.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 阿里数据库连接池 --> |
| | |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 核心模块--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-framework</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 系统模块--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-system</artifactId> |
| | | <version>${ruoyi.version}</version> |
| | | </dependency> |
| | | |
| | | <!-- 通用工具--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | |
| | | |
| | | <modules> |
| | | <module>ruoyi-admin</module> |
| | | <module>ruoyi-framework</module> |
| | | <module>ruoyi-system</module> |
| | | <module>ruoyi-quartz</module> |
| | | <module>ruoyi-generator</module> |
| | | <module>ruoyi-common</module> |
| | |
| | | <parent> |
| | | <artifactId>ruoyi</artifactId> |
| | | <groupId>com.ruoyi</groupId> |
| | | <version>4.8.0</version> |
| | | <version>4.7.9</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <packaging>jar</packaging> |
| | |
| | | </description> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- SpringBoot Web容器 --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringBoot 拦截器 --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-aop</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 阿里数据库连接池 --> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>druid-spring-boot-starter</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 验证码 --> |
| | | <dependency> |
| | | <groupId>pro.fessional</groupId> |
| | | <artifactId>kaptcha</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <artifactId>servlet-api</artifactId> |
| | | <groupId>javax.servlet</groupId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | <!-- Shiro使用Spring框架 --> |
| | | <dependency> |
| | | <groupId>org.apache.shiro</groupId> |
| | | <artifactId>shiro-spring</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- thymeleaf模板引擎和shiro框架的整合 --> |
| | | <dependency> |
| | | <groupId>com.github.theborakompanioni</groupId> |
| | | <artifactId>thymeleaf-extras-shiro</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 解析客户端操作系统、浏览器等 --> |
| | | <dependency> |
| | | <groupId>eu.bitwalker</groupId> |
| | | <artifactId>UserAgentUtils</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 获取系统信息 --> |
| | | <dependency> |
| | | <groupId>com.github.oshi</groupId> |
| | | <artifactId>oshi-core</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-common</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- SpringBoot集成thymeleaf模板 --> |
| | | <dependency> |
| | |
| | | <artifactId>mysql-connector-java</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 核心模块--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-framework</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 定时任务--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-generator</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-data-redis</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.baomidou</groupId> |
| | | <artifactId>mybatis-plus</artifactId> |
| | | <version>3.5.5</version> |
| | | <artifactId>mybatis-plus-boot-starter</artifactId> |
| | | <version>3.4.1</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.itextpdf</groupId> |
| | | <artifactId>barcodes</artifactId> |
| | | <version>8.0.4</version> |
| | | <type>pom</type> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>junit</groupId> |
| | | <artifactId>junit</artifactId> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.alibaba</groupId> |
| | | <artifactId>fastjson</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>cn.hutool</groupId> |
| | | <artifactId>hutool-all</artifactId> |
| | | <version>5.8.18</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.jsoup</groupId> |
| | | <artifactId>jsoup</artifactId> |
| | | <version>1.13.1</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>io.jsonwebtoken</groupId> |
| | | <artifactId>jjwt</artifactId> |
| | | <version>0.9.1</version> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | |
| | | package com.ruoyi; |
| | | |
| | | import org.mybatis.spring.annotation.MapperScan; |
| | | import org.springframework.boot.SpringApplication; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @MapperScan(basePackages = {"com.ruoyi.**.mapper"}) |
| | | @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) |
| | | public class RuoYiApplication |
| | | { |
| | | public static void main(String[] args) |
| | | { |
| | | // System.setProperty("spring.devtools.restart.enabled", "false"); |
| | | public class RuoYiApplication { |
| | | public static void main(String[] args) { |
| | | SpringApplication.run(RuoYiApplication.class, args); |
| | | System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" + |
| | | " .-------. ____ __ \n" + |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class RuoYiServletInitializer extends SpringBootServletInitializer |
| | | { |
| | | public class RuoYiServletInitializer extends SpringBootServletInitializer { |
| | | @Override |
| | | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) |
| | | { |
| | | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { |
| | | return application.sources(RuoYiApplication.class); |
| | | } |
| | | } |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java |
| | |
| | | import java.util.Map; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | import org.apache.commons.lang3.ArrayUtils; |
| | | import org.aspectj.lang.JoinPoint; |
| | | import org.aspectj.lang.annotation.AfterReturning; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.manager.AsyncManager; |
| | | import com.ruoyi.framework.manager.factory.AsyncFactory; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | |
| | | /** |
| | | * 操作日志记录处理 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java |
| | |
| | | { |
| | | registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); |
| | | } |
| | | |
| | | |
| | | } |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java |
| | |
| | | filterChainDefinitionMap.put("/js/**", "anon"); |
| | | filterChainDefinitionMap.put("/ruoyi/**", "anon"); |
| | | filterChainDefinitionMap.put("/captcha/captchaImage**", "anon"); |
| | | filterChainDefinitionMap.put("/api/**", "anon"); |
| | | // 匿名访问不鉴权注解列表 |
| | | List<String> permitAllUrl = SpringUtils.getBean(PermitAllUrlProperties.class).getUrls(); |
| | | if (StringUtils.isNotEmpty(permitAllUrl)) |
| | | { |
| | | permitAllUrl.forEach(url -> filterChainDefinitionMap.put(url, "anon")); |
| | | } |
| | | |
| | | // 退出 logout地址,shiro去清除session |
| | | filterChainDefinitionMap.put("/logout", "logout"); |
| | | // 不需要拦截的访问 |
New file |
| | |
| | | package com.ruoyi.framework.config.properties; |
| | | |
| | | import java.lang.reflect.Method; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import org.springframework.aop.framework.Advised; |
| | | import org.springframework.beans.BeansException; |
| | | import org.springframework.beans.factory.InitializingBean; |
| | | import org.springframework.context.ApplicationContext; |
| | | import org.springframework.context.ApplicationContextAware; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.PutMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import com.ruoyi.common.annotation.Anonymous; |
| | | |
| | | /** |
| | | * 设置Anonymous注解允许匿名访问的url |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Configuration |
| | | public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware |
| | | { |
| | | private List<String> urls = new ArrayList<>(); |
| | | |
| | | private ApplicationContext applicationContext; |
| | | |
| | | @Override |
| | | public void afterPropertiesSet() throws Exception |
| | | { |
| | | Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(Controller.class); |
| | | for (Object bean : controllers.values()) |
| | | { |
| | | if (!(bean instanceof Advised)) |
| | | { |
| | | continue; |
| | | } |
| | | Class<?> beanClass = ((Advised) bean).getTargetSource().getTarget().getClass(); |
| | | RequestMapping base = beanClass.getAnnotation(RequestMapping.class); |
| | | String[] baseUrl = {}; |
| | | if (Objects.nonNull(base)) |
| | | { |
| | | baseUrl = base.value(); |
| | | } |
| | | Method[] methods = beanClass.getDeclaredMethods(); |
| | | for (Method method : methods) |
| | | { |
| | | if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(RequestMapping.class)) |
| | | { |
| | | RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); |
| | | String[] uri = requestMapping.value(); |
| | | urls.addAll(rebuildUrl(baseUrl, uri)); |
| | | } |
| | | else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(GetMapping.class)) |
| | | { |
| | | GetMapping requestMapping = method.getAnnotation(GetMapping.class); |
| | | String[] uri = requestMapping.value(); |
| | | urls.addAll(rebuildUrl(baseUrl, uri)); |
| | | } |
| | | else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PostMapping.class)) |
| | | { |
| | | PostMapping requestMapping = method.getAnnotation(PostMapping.class); |
| | | String[] uri = requestMapping.value(); |
| | | urls.addAll(rebuildUrl(baseUrl, uri)); |
| | | } |
| | | else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PutMapping.class)) |
| | | { |
| | | PutMapping requestMapping = method.getAnnotation(PutMapping.class); |
| | | String[] uri = requestMapping.value(); |
| | | urls.addAll(rebuildUrl(baseUrl, uri)); |
| | | } |
| | | else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(DeleteMapping.class)) |
| | | { |
| | | DeleteMapping requestMapping = method.getAnnotation(DeleteMapping.class); |
| | | String[] uri = requestMapping.value(); |
| | | urls.addAll(rebuildUrl(baseUrl, uri)); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | private List<String> rebuildUrl(String[] bases, String[] uris) |
| | | { |
| | | List<String> urls = new ArrayList<>(); |
| | | for (String base : bases) |
| | | { |
| | | for (String uri : uris) |
| | | { |
| | | urls.add(prefix(base) + prefix(uri)); |
| | | } |
| | | } |
| | | return urls; |
| | | } |
| | | |
| | | private String prefix(String seg) |
| | | { |
| | | return seg.startsWith("/") ? seg : "/" + seg; |
| | | } |
| | | |
| | | @Override |
| | | public void setApplicationContext(ApplicationContext context) throws BeansException |
| | | { |
| | | this.applicationContext = context; |
| | | } |
| | | |
| | | public List<String> getUrls() |
| | | { |
| | | return urls; |
| | | } |
| | | |
| | | public void setUrls(List<String> urls) |
| | | { |
| | | this.urls = urls; |
| | | } |
| | | } |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java |
| | |
| | | package com.ruoyi.framework.manager.factory; |
| | | |
| | | import java.util.TimerTask; |
| | | |
| | | import com.ruoyi.web.domain.system.SysLogininfor; |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | import com.ruoyi.web.server.impl.system.SysLogininforServiceImpl; |
| | | import com.ruoyi.web.server.system.ISysOperLogService; |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import com.ruoyi.common.constant.Constants; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.framework.shiro.session.OnlineSession; |
| | | import com.ruoyi.system.domain.SysLogininfor; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | import com.ruoyi.system.service.ISysOperLogService; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | import com.ruoyi.system.service.impl.SysLogininforServiceImpl; |
| | | import eu.bitwalker.useragentutils.UserAgent; |
| | | |
| | | /** |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java |
| | |
| | | |
| | | import java.util.HashSet; |
| | | import java.util.Set; |
| | | |
| | | import com.ruoyi.web.server.system.ISysMenuService; |
| | | import com.ruoyi.web.server.system.ISysRoleService; |
| | | import org.apache.shiro.authc.AuthenticationException; |
| | | import org.apache.shiro.authc.AuthenticationInfo; |
| | | import org.apache.shiro.authc.AuthenticationToken; |
| | |
| | | import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; |
| | | import com.ruoyi.common.utils.ShiroUtils; |
| | | import com.ruoyi.framework.shiro.service.SysLoginService; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | import com.ruoyi.system.service.ISysRoleService; |
| | | |
| | | /** |
| | | * 自定义Realm 处理登录 权限 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java |
| | |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | import com.ruoyi.web.server.system.ISysMenuService; |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.constant.Constants; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.manager.AsyncManager; |
| | | import com.ruoyi.framework.manager.factory.AsyncFactory; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | |
| | | /** |
| | | * 登录校验方法 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java |
| | |
| | | package com.ruoyi.framework.shiro.service; |
| | | |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.constant.Constants; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.manager.AsyncManager; |
| | | import com.ruoyi.framework.manager.factory.AsyncFactory; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | |
| | | /** |
| | | * 注册校验方法 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysShiroService.java |
| | |
| | | package com.ruoyi.framework.shiro.service; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | import org.apache.shiro.session.Session; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.shiro.session.OnlineSession; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | |
| | | /** |
| | | * 会话db操作处理 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java |
| | |
| | | |
| | | import javax.servlet.ServletRequest; |
| | | import javax.servlet.ServletResponse; |
| | | |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | import org.apache.shiro.session.SessionException; |
| | | import org.apache.shiro.subject.Subject; |
| | | import org.slf4j.Logger; |
| | |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.framework.manager.AsyncManager; |
| | | import com.ruoyi.framework.manager.factory.AsyncFactory; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | |
| | | /** |
| | | * 退出过滤器 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java |
| | |
| | | import java.util.Collection; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | import org.apache.commons.lang3.time.DateUtils; |
| | | import org.apache.shiro.session.ExpiredSessionException; |
| | | import org.apache.shiro.session.InvalidSessionException; |
| | |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.framework.shiro.session.OnlineSession; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | |
| | | /** |
| | | * 主要是在此如果会话的属性修改了 就标识下其修改了 然后方便 OnlineSessionDao同步 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ConfigService.java |
| | |
| | | package com.ruoyi.framework.web.service; |
| | | |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | |
| | | /** |
| | | * RuoYi首创 html调用 thymeleaf 实现参数管理 |
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/DictService.java |
| | |
| | | package com.ruoyi.framework.web.service; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.ruoyi.web.server.system.ISysDictDataService; |
| | | import com.ruoyi.web.server.system.ISysDictTypeService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.core.domain.entity.SysDictData; |
| | | import com.ruoyi.system.service.ISysDictDataService; |
| | | import com.ruoyi.system.service.ISysDictTypeService; |
| | | |
| | | /** |
| | | * RuoYi首创 html调用 thymeleaf 实现字典读取 |
New file |
| | |
| | | package com.ruoyi.sange.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.sange.domain.SystemUser; |
| | | import com.ruoyi.sange.service.ISystemUserService; |
| | | import com.ruoyi.sange.util.JwtUtils; |
| | | import com.ruoyi.sange.util.SecurityConstants; |
| | | import com.ruoyi.sange.util.ServletUtils; |
| | | import com.ruoyi.sange.util.TokenService; |
| | | import com.ruoyi.sange.warpper.LoginVo; |
| | | import com.ruoyi.sange.warpper.TokenVo; |
| | | import com.ruoyi.web.tool.StringUtils; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.UUID; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:30 |
| | | */ |
| | | @Api |
| | | @RestController |
| | | @RequestMapping("/api/systemUser") |
| | | public class SystemUserController { |
| | | |
| | | @Resource |
| | | private ISystemUserService systemUserService; |
| | | |
| | | @Resource |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | private final Integer max_err = 5; |
| | | |
| | | @Resource |
| | | private TokenService tokenService; |
| | | |
| | | |
| | | @PostMapping("/login") |
| | | @ApiOperation(value = "登录", tags = {"管理后台-登录"}) |
| | | public R<TokenVo> login(@RequestBody LoginVo vo){ |
| | | String key = "login:" + vo.getPhone(); |
| | | Integer size = (Integer) redisTemplate.opsForValue().get(key); |
| | | if(null != size && max_err.equals(size)){ |
| | | return R.fail("连续登录失败,请稍后重试。"); |
| | | } |
| | | if(null == size){ |
| | | size = 0; |
| | | } |
| | | SystemUser systemUser = systemUserService.getOne(new LambdaQueryWrapper<SystemUser>() |
| | | .eq(SystemUser::getPhone, vo.getPhone()).ne(SystemUser::getStatus, 3)); |
| | | if(null == systemUser){ |
| | | size++; |
| | | redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES); |
| | | return R.fail("登录失败,手机号/密码错误。"); |
| | | } |
| | | if(!vo.getPassword().equals(systemUser.getPassword())){ |
| | | size++; |
| | | redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES); |
| | | return R.fail("登录失败,手机号/密码错误。"); |
| | | } |
| | | if(2 == systemUser.getStatus()){ |
| | | return R.fail("当前账号已冻结。"); |
| | | } |
| | | //创建token |
| | | String userKey = UUID.randomUUID().toString(); |
| | | Map<String, Object> claims = new HashMap<>(); |
| | | claims.put(SecurityConstants.USER_KEY, userKey); |
| | | String token = JwtUtils.createToken(claims); |
| | | //token有效期2小时 |
| | | redisTemplate.opsForValue().set("token:" + userKey, token, SecurityConstants.expireTime, TimeUnit.MILLISECONDS); |
| | | redisTemplate.delete(key); |
| | | TokenVo tokenVo = new TokenVo(); |
| | | tokenVo.setToken(token); |
| | | tokenVo.setExpireTime(SecurityConstants.expireTime); |
| | | return R.ok(tokenVo); |
| | | } |
| | | |
| | | |
| | | @PostMapping("/logout") |
| | | @ApiOperation(value = "退出登录", tags = {"管理后台-登录"}) |
| | | public R logout(){ |
| | | String token = tokenService.getToken(ServletUtils.getRequest()); |
| | | if(StringUtils.isEmpty(token)){ |
| | | return R.fail("请先登录"); |
| | | } |
| | | String userKey = JwtUtils.getUserKey(token); |
| | | redisTemplate.delete("token:" + userKey); |
| | | return R.ok(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.domain; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * 系统用户 |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:18 |
| | | */ |
| | | @Data |
| | | @TableName("t_system_user") |
| | | public class SystemUser { |
| | | /** |
| | | * 主键 |
| | | */ |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | /** |
| | | * 姓名 |
| | | */ |
| | | @TableField("name") |
| | | private String name; |
| | | /** |
| | | * 手机号 |
| | | */ |
| | | @TableField("phone") |
| | | private String phone; |
| | | /** |
| | | * 密码 |
| | | */ |
| | | @TableField("password") |
| | | private String password; |
| | | /** |
| | | * 一级单位id |
| | | */ |
| | | @TableField("one_department_id") |
| | | private Integer oneDepartmentId; |
| | | /** |
| | | * 二级单位id |
| | | */ |
| | | @TableField("two_department_id") |
| | | private Integer twoDepartmentId; |
| | | /** |
| | | * 三级单位id |
| | | */ |
| | | @TableField("three_department_id") |
| | | private Integer threeDepartmentId; |
| | | /** |
| | | * 四级单位id |
| | | */ |
| | | @TableField("four_department_id") |
| | | private Integer fourDepartmentId; |
| | | /** |
| | | * 是否是管理员(0=否,1=是) |
| | | */ |
| | | @TableField("is_admin") |
| | | private Integer isAdmin; |
| | | /** |
| | | * 职位id |
| | | */ |
| | | @TableField("system_post_id") |
| | | private Integer systemPostId; |
| | | /** |
| | | * 角色id |
| | | */ |
| | | @TableField("system_role_id") |
| | | private Integer systemRoleId; |
| | | /** |
| | | * 账号层级(1=市级账号,2=区县账号,3=街道账号,4=社区账号) |
| | | */ |
| | | @TableField("account_level") |
| | | private Integer accountLevel; |
| | | /** |
| | | * 所属区县 |
| | | */ |
| | | @TableField("districts") |
| | | private String districts; |
| | | /** |
| | | * 区县编号 |
| | | */ |
| | | @TableField("districts_code") |
| | | private String districtsCode; |
| | | /** |
| | | * 街道 |
| | | */ |
| | | @TableField("street") |
| | | private String street; |
| | | /** |
| | | * 街道编号 |
| | | */ |
| | | @TableField("street_code") |
| | | private String streetCode; |
| | | /** |
| | | * 社区 |
| | | */ |
| | | @TableField("community") |
| | | private String community; |
| | | /** |
| | | * 社区编号 |
| | | */ |
| | | @TableField("community_code") |
| | | private String communityCode; |
| | | /** |
| | | * 状态(1=正常,2=冻结,3=删除) |
| | | */ |
| | | @TableField("status") |
| | | private Integer status; |
| | | /** |
| | | * 添加时间 |
| | | */ |
| | | @TableField("create_time") |
| | | private LocalDateTime createTime; |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.sange.domain.SystemUser; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:29 |
| | | */ |
| | | @Mapper |
| | | public interface SystemUserMapper extends BaseMapper<SystemUser> { |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.sange.domain.SystemUser; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:30 |
| | | */ |
| | | public interface ISystemUserService extends IService<SystemUser> { |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.sange.domain.SystemUser; |
| | | import com.ruoyi.sange.mapper.SystemUserMapper; |
| | | import com.ruoyi.sange.service.ISystemUserService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:30 |
| | | */ |
| | | @Service |
| | | public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser> implements ISystemUserService { |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.util; |
| | | |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import io.jsonwebtoken.Claims; |
| | | import io.jsonwebtoken.Jwts; |
| | | import io.jsonwebtoken.SignatureAlgorithm; |
| | | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * Jwt工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class JwtUtils { |
| | | public static String secret = TokenConstants.SECRET; |
| | | |
| | | /** |
| | | * 从数据声明生成令牌 |
| | | * |
| | | * @param claims 数据声明 |
| | | * @return 令牌 |
| | | */ |
| | | public static String createToken(Map<String, Object> claims) { |
| | | String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); |
| | | return token; |
| | | } |
| | | |
| | | /** |
| | | * 从令牌中获取数据声明 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 数据声明 |
| | | */ |
| | | public static Claims parseToken(String token) { |
| | | return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户标识 |
| | | * |
| | | * @param token 令牌 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserKey(String token) { |
| | | Claims claims = parseToken(token); |
| | | return getValue(claims, SecurityConstants.USER_KEY); |
| | | } |
| | | |
| | | /** |
| | | * 根据令牌获取用户标识 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @return 用户ID |
| | | */ |
| | | public static String getUserKey(Claims claims) { |
| | | return getValue(claims, SecurityConstants.USER_KEY); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 根据身份信息获取键值 |
| | | * |
| | | * @param claims 身份信息 |
| | | * @param key 键 |
| | | * @return 值 |
| | | */ |
| | | public static String getValue(Claims claims, String key) { |
| | | return Convert.toStr(claims.get(key), ""); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.util; |
| | | |
| | | /** |
| | | * 权限相关通用常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class SecurityConstants |
| | | { |
| | | |
| | | /** |
| | | * 授权信息字段 |
| | | */ |
| | | public static final String AUTHORIZATION_HEADER = "Authorization"; |
| | | |
| | | /** |
| | | * 用户标识 |
| | | */ |
| | | public static final String USER_KEY = "user_key"; |
| | | /** |
| | | * token有效期 |
| | | */ |
| | | public static final Long expireTime = 7200000L; |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.util; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.ruoyi.common.constant.Constants; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import org.springframework.core.io.buffer.DataBuffer; |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.http.server.reactive.ServerHttpResponse; |
| | | import org.springframework.util.LinkedCaseInsensitiveMap; |
| | | import org.springframework.web.context.request.RequestAttributes; |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | import reactor.core.publisher.Mono; |
| | | |
| | | import javax.servlet.ServletRequest; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import javax.servlet.http.HttpSession; |
| | | import java.io.IOException; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.URLDecoder; |
| | | import java.net.URLEncoder; |
| | | import java.util.Collections; |
| | | import java.util.Enumeration; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 客户端工具类 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class ServletUtils |
| | | { |
| | | /** |
| | | * 获取String参数 |
| | | */ |
| | | public static String getParameter(String name) |
| | | { |
| | | return getRequest().getParameter(name); |
| | | } |
| | | |
| | | /** |
| | | * 获取String参数 |
| | | */ |
| | | public static String getParameter(String name, String defaultValue) |
| | | { |
| | | return Convert.toStr(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获取Integer参数 |
| | | */ |
| | | public static Integer getParameterToInt(String name) |
| | | { |
| | | return Convert.toInt(getRequest().getParameter(name)); |
| | | } |
| | | |
| | | /** |
| | | * 获取Integer参数 |
| | | */ |
| | | public static Integer getParameterToInt(String name, Integer defaultValue) |
| | | { |
| | | return Convert.toInt(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获取Boolean参数 |
| | | */ |
| | | public static Boolean getParameterToBool(String name) |
| | | { |
| | | return Convert.toBool(getRequest().getParameter(name)); |
| | | } |
| | | |
| | | /** |
| | | * 获取Boolean参数 |
| | | */ |
| | | public static Boolean getParameterToBool(String name, Boolean defaultValue) |
| | | { |
| | | return Convert.toBool(getRequest().getParameter(name), defaultValue); |
| | | } |
| | | |
| | | /** |
| | | * 获得所有请求参数 |
| | | * |
| | | * @param request 请求对象{@link ServletRequest} |
| | | * @return Map |
| | | */ |
| | | public static Map<String, String[]> getParams(ServletRequest request) |
| | | { |
| | | final Map<String, String[]> map = request.getParameterMap(); |
| | | return Collections.unmodifiableMap(map); |
| | | } |
| | | |
| | | /** |
| | | * 获得所有请求参数 |
| | | * |
| | | * @param request 请求对象{@link ServletRequest} |
| | | * @return Map |
| | | */ |
| | | public static Map<String, String> getParamMap(ServletRequest request) |
| | | { |
| | | Map<String, String> params = new HashMap<>(); |
| | | for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) |
| | | { |
| | | params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); |
| | | } |
| | | return params; |
| | | } |
| | | |
| | | /** |
| | | * 获取request |
| | | */ |
| | | public static HttpServletRequest getRequest() |
| | | { |
| | | try |
| | | { |
| | | return getRequestAttributes().getRequest(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取response |
| | | */ |
| | | public static HttpServletResponse getResponse() |
| | | { |
| | | try |
| | | { |
| | | return getRequestAttributes().getResponse(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取session |
| | | */ |
| | | public static HttpSession getSession() |
| | | { |
| | | return getRequest().getSession(); |
| | | } |
| | | |
| | | public static ServletRequestAttributes getRequestAttributes() |
| | | { |
| | | try |
| | | { |
| | | RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); |
| | | return (ServletRequestAttributes) attributes; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | public static String getHeader(HttpServletRequest request, String name) |
| | | { |
| | | String value = request.getHeader(name); |
| | | if (StringUtils.isEmpty(value)) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | return urlDecode(value); |
| | | } |
| | | |
| | | public static Map<String, String> getHeaders(HttpServletRequest request) |
| | | { |
| | | Map<String, String> map = new LinkedCaseInsensitiveMap<>(); |
| | | Enumeration<String> enumeration = request.getHeaderNames(); |
| | | if (enumeration != null) |
| | | { |
| | | while (enumeration.hasMoreElements()) |
| | | { |
| | | String key = enumeration.nextElement(); |
| | | String value = request.getHeader(key); |
| | | map.put(key, value); |
| | | } |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | /** |
| | | * 将字符串渲染到客户端 |
| | | * |
| | | * @param response 渲染对象 |
| | | * @param string 待渲染的字符串 |
| | | */ |
| | | public static void renderString(HttpServletResponse response, String string) |
| | | { |
| | | try |
| | | { |
| | | response.setStatus(200); |
| | | response.setContentType("application/json"); |
| | | response.setCharacterEncoding("utf-8"); |
| | | response.getWriter().print(string); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 是否是Ajax异步请求 |
| | | * |
| | | * @param request |
| | | */ |
| | | public static boolean isAjaxRequest(HttpServletRequest request) |
| | | { |
| | | String accept = request.getHeader("accept"); |
| | | if (accept != null && accept.contains("application/json")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String xRequestedWith = request.getHeader("X-Requested-With"); |
| | | if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String uri = request.getRequestURI(); |
| | | if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | String ajax = request.getParameter("__ajax"); |
| | | return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); |
| | | } |
| | | |
| | | /** |
| | | * 内容编码 |
| | | * |
| | | * @param str 内容 |
| | | * @return 编码后的内容 |
| | | */ |
| | | public static String urlEncode(String str) |
| | | { |
| | | try |
| | | { |
| | | return URLEncoder.encode(str, Constants.UTF8); |
| | | } |
| | | catch (UnsupportedEncodingException e) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 内容解码 |
| | | * |
| | | * @param str 内容 |
| | | * @return 解码后的内容 |
| | | */ |
| | | public static String urlDecode(String str) |
| | | { |
| | | try |
| | | { |
| | | return URLDecoder.decode(str, Constants.UTF8); |
| | | } |
| | | catch (UnsupportedEncodingException e) |
| | | { |
| | | return StringUtils.EMPTY; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value) |
| | | { |
| | | return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code) |
| | | { |
| | | return webFluxResponseWriter(response, HttpStatus.OK, value, code); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param status http状态码 |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code) |
| | | { |
| | | return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code); |
| | | } |
| | | |
| | | /** |
| | | * 设置webflux模型响应 |
| | | * |
| | | * @param response ServerHttpResponse |
| | | * @param contentType content-type |
| | | * @param status http状态码 |
| | | * @param code 响应状态码 |
| | | * @param value 响应内容 |
| | | * @return Mono<Void> |
| | | */ |
| | | public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code) |
| | | { |
| | | response.setStatusCode(status); |
| | | response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType); |
| | | R<?> result = R.fail(code, value.toString()); |
| | | DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes()); |
| | | return response.writeWith(Mono.just(dataBuffer)); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.util; |
| | | |
| | | /** |
| | | * Token的Key常量 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class TokenConstants |
| | | { |
| | | /** |
| | | * 令牌自定义标识 |
| | | */ |
| | | public static final String AUTHENTICATION = "Authorization"; |
| | | |
| | | /** |
| | | * 令牌前缀 |
| | | */ |
| | | public static final String PREFIX = "Bearer "; |
| | | |
| | | /** |
| | | * 令牌秘钥 |
| | | */ |
| | | public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; |
| | | |
| | | /** |
| | | * 参数签名 |
| | | */ |
| | | public static final String SIGN = "sign"; |
| | | |
| | | /** |
| | | * 参数随机字符串 |
| | | */ |
| | | public static final String NONCE_STR = "nonce_str"; |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.util; |
| | | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.sange.domain.SystemUser; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | | /** |
| | | * token验证处理 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | public class TokenService { |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | |
| | | /** |
| | | * 获取用户身份信息 |
| | | * |
| | | * @return 用户信息 |
| | | */ |
| | | public SystemUser getLoginUser() { |
| | | SystemUser loginUser = getLoginUser(ServletUtils.getRequest()); |
| | | if (loginUser == null) { |
| | | throw new RuntimeException("令牌已过期,请重新登录!"); |
| | | } |
| | | return loginUser; |
| | | } |
| | | |
| | | /** |
| | | * 获取用户身份信息 |
| | | * |
| | | * @return 用户信息 |
| | | */ |
| | | public SystemUser getLoginUser(HttpServletRequest request) { |
| | | // 获取请求携带的令牌 |
| | | String token = getToken(request); |
| | | return getLoginUser(token); |
| | | } |
| | | |
| | | /** |
| | | * 获取用户身份信息 |
| | | * |
| | | * @return 用户信息 |
| | | */ |
| | | public SystemUser getLoginUser(String token) { |
| | | SystemUser user = null; |
| | | try { |
| | | if (StringUtils.isNotEmpty(token)) { |
| | | String userkey = JwtUtils.getUserKey(token); |
| | | user = (SystemUser) redisTemplate.opsForValue().get(userkey); |
| | | return user; |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return user; |
| | | } |
| | | |
| | | |
| | | public String getToken(HttpServletRequest request) { |
| | | // 从header获取token标识 |
| | | String token = request.getHeader(TokenConstants.AUTHENTICATION); |
| | | return replaceTokenPrefix(token); |
| | | } |
| | | |
| | | /** |
| | | * 裁剪token前缀 |
| | | */ |
| | | public String replaceTokenPrefix(String token) { |
| | | // 如果前端设置了令牌前缀,则裁剪掉前缀 |
| | | if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) { |
| | | token = token.replaceFirst(TokenConstants.PREFIX, ""); |
| | | } |
| | | return token; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.warpper; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 22:33 |
| | | */ |
| | | @Data |
| | | @ApiModel |
| | | public class LoginVo { |
| | | @ApiModelProperty(value = "登录账号", required = true) |
| | | private String phone; |
| | | @ApiModelProperty(value = "登录密码", required = true) |
| | | private String password; |
| | | } |
New file |
| | |
| | | package com.ruoyi.sange.warpper; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2025/2/18 23:32 |
| | | */ |
| | | @ApiModel |
| | | @Data |
| | | public class TokenVo { |
| | | @ApiModelProperty("token") |
| | | private String token; |
| | | @ApiModelProperty("有效期(毫秒)") |
| | | private Long expireTime; |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.core.config; |
| | | |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.data.redis.connection.RedisConnectionFactory; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; |
| | | import org.springframework.data.redis.serializer.RedisSerializer; |
| | | |
| | | /** |
| | | * redis序列化配置 |
| | | */ |
| | | @Configuration |
| | | public class RedisConfig { |
| | | |
| | | @Bean |
| | | public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){ |
| | | //1.创建 |
| | | RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>(); |
| | | redisTemplate.setConnectionFactory(connectionFactory); |
| | | //json序列化工具 |
| | | GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); |
| | | //设置key的序列化 |
| | | //StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8); |
| | | redisTemplate.setKeySerializer(RedisSerializer.string()); |
| | | redisTemplate.setHashKeySerializer(RedisSerializer.string()); |
| | | //设置值的value |
| | | redisTemplate.setValueSerializer(serializer); |
| | | redisTemplate.setHashKeySerializer(serializer); |
| | | return redisTemplate; |
| | | } |
| | | |
| | | } |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import javax.validation.constraints.*; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.Size; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import javax.validation.constraints.*; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import java.util.Date; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java |
| | |
| | | package com.ruoyi.system.domain; |
| | | package com.ruoyi.web.domain.system; |
| | | |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
| | | import org.apache.commons.lang3.builder.ToStringStyle; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysConfig; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysConfig; |
| | | |
| | | /** |
| | | * 参数配置 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysConfigMapper |
| | | public interface SysConfigMapper extends BaseMapper<SysConfig> |
| | | { |
| | | /** |
| | | * 查询参数配置信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysDeptMapper |
| | | public interface SysDeptMapper extends BaseMapper<SysDept> |
| | | { |
| | | /** |
| | | * 查询下级部门数量 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import com.ruoyi.common.core.domain.entity.SysDictData; |
| | | |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysDictDataMapper |
| | | public interface SysDictDataMapper extends BaseMapper<SysDictData> |
| | | { |
| | | /** |
| | | * 根据条件分页查询字典数据 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.common.core.domain.entity.SysDictType; |
| | | |
| | | /** |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysDictTypeMapper |
| | | public interface SysDictTypeMapper extends BaseMapper<SysDictType> |
| | | { |
| | | /** |
| | | * 根据条件分页查询字典类型 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysLogininfor; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysLogininfor; |
| | | |
| | | /** |
| | | * 系统访问日志情况信息 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysLogininforMapper |
| | | public interface SysLogininforMapper extends BaseMapper<SysLogininfor> |
| | | { |
| | | /** |
| | | * 新增系统登录日志 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import com.ruoyi.common.core.domain.entity.SysMenu; |
| | | |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysMenuMapper |
| | | public interface SysMenuMapper extends BaseMapper<SysMenu> |
| | | { |
| | | /** |
| | | * 查询系统所有菜单(含按钮) |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysNotice; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysNotice; |
| | | |
| | | /** |
| | | * 公告 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysNoticeMapper |
| | | public interface SysNoticeMapper extends BaseMapper<SysNotice> |
| | | { |
| | | /** |
| | | * 查询公告信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | |
| | | /** |
| | | * 操作日志 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysOperLogMapper |
| | | public interface SysOperLogMapper extends BaseMapper<SysOperLog> |
| | | { |
| | | /** |
| | | * 新增操作日志 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysPost; |
| | | |
| | | /** |
| | | * 岗位信息 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysPostMapper |
| | | public interface SysPostMapper extends BaseMapper<SysPost> |
| | | { |
| | | /** |
| | | * 查询岗位数据集合 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysRoleDept; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysRoleDept; |
| | | |
| | | /** |
| | | * 角色与部门关联表 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysRoleDeptMapper |
| | | public interface SysRoleDeptMapper extends BaseMapper<SysRoleDept> |
| | | { |
| | | /** |
| | | * 通过角色ID删除角色和部门关联 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.common.core.domain.entity.SysRole; |
| | | |
| | | /** |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysRoleMapper |
| | | public interface SysRoleMapper extends BaseMapper<SysRole> |
| | | { |
| | | /** |
| | | * 根据条件分页查询角色数据 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysRoleMenu; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysRoleMenu; |
| | | |
| | | /** |
| | | * 角色与菜单关联表 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysRoleMenuMapper |
| | | public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> |
| | | { |
| | | /** |
| | | * 通过角色ID删除角色和菜单关联 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | |
| | | /** |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysUserMapper |
| | | public interface SysUserMapper extends BaseMapper<SysUser> |
| | | { |
| | | /** |
| | | * 根据条件分页查询用户列表 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserOnlineMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | |
| | | /** |
| | | * 在线用户 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysUserOnlineMapper |
| | | public interface SysUserOnlineMapper extends BaseMapper<SysUserOnline> |
| | | { |
| | | /** |
| | | * 通过会话序号查询信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysUserPost; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysUserPost; |
| | | |
| | | /** |
| | | * 用户与岗位关联表 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysUserPostMapper |
| | | public interface SysUserPostMapper extends BaseMapper<SysUserPost> |
| | | { |
| | | /** |
| | | * 通过用户ID删除用户和岗位关联 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java |
| | |
| | | package com.ruoyi.system.mapper; |
| | | package com.ruoyi.web.mapper.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | |
| | | /** |
| | | * 用户与角色关联表 数据层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface SysUserRoleMapper |
| | | public interface SysUserRoleMapper extends BaseMapper<SysUserRole> |
| | | { |
| | | /** |
| | | * 通过用户ID查询用户和角色关联 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | import javax.annotation.PostConstruct; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysConfig; |
| | | import com.ruoyi.web.mapper.system.SysConfigMapper; |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.constant.Constants; |
| | |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.CacheUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.domain.SysConfig; |
| | | import com.ruoyi.system.mapper.SysConfigMapper; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | |
| | | /** |
| | | * 参数配置 服务层实现 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysConfigServiceImpl implements ISysConfigService |
| | | public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService |
| | | { |
| | | @Autowired |
| | | private SysConfigMapper configMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.mapper.system.SysDeptMapper; |
| | | import com.ruoyi.web.server.system.ISysDeptService; |
| | | import org.apache.commons.lang3.ArrayUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | import com.ruoyi.common.utils.ShiroUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.system.mapper.SysDeptMapper; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | |
| | | /** |
| | | * 部门管理 服务实现 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysDeptServiceImpl implements ISysDeptService |
| | | public class SysDeptServiceImpl extends ServiceImpl< SysDeptMapper, SysDept> implements ISysDeptService |
| | | { |
| | | @Autowired |
| | | private SysDeptMapper deptMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.mapper.system.SysDictDataMapper; |
| | | import com.ruoyi.web.server.system.ISysDictDataService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.core.domain.entity.SysDictData; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.utils.DictUtils; |
| | | import com.ruoyi.system.mapper.SysDictDataMapper; |
| | | import com.ruoyi.system.service.ISysDictDataService; |
| | | |
| | | /** |
| | | * 字典 业务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysDictDataServiceImpl implements ISysDictDataService |
| | | public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService |
| | | { |
| | | @Autowired |
| | | private SysDictDataMapper dictDataMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Comparator; |
| | |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.PostConstruct; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.mapper.system.SysDictDataMapper; |
| | | import com.ruoyi.web.mapper.system.SysDictTypeMapper; |
| | | import com.ruoyi.web.server.system.ISysDictTypeService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.DictUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.mapper.SysDictDataMapper; |
| | | import com.ruoyi.system.mapper.SysDictTypeMapper; |
| | | import com.ruoyi.system.service.ISysDictTypeService; |
| | | |
| | | /** |
| | | * 字典 业务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysDictTypeServiceImpl implements ISysDictTypeService |
| | | public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements ISysDictTypeService |
| | | { |
| | | @Autowired |
| | | private SysDictTypeMapper dictTypeMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysLogininfor; |
| | | import com.ruoyi.web.mapper.system.SysLogininforMapper; |
| | | import com.ruoyi.web.server.system.ISysLogininforService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.system.domain.SysLogininfor; |
| | | import com.ruoyi.system.mapper.SysLogininforMapper; |
| | | import com.ruoyi.system.service.ISysLogininforService; |
| | | |
| | | /** |
| | | * 系统访问日志情况信息 服务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysLogininforServiceImpl implements ISysLogininforService |
| | | public class SysLogininforServiceImpl extends ServiceImpl<SysLogininforMapper, SysLogininfor> implements ISysLogininforService |
| | | { |
| | | |
| | | @Autowired |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.text.MessageFormat; |
| | | import java.util.ArrayList; |
| | |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.mapper.system.SysMenuMapper; |
| | | import com.ruoyi.web.mapper.system.SysRoleMenuMapper; |
| | | import com.ruoyi.web.server.system.ISysMenuService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.constant.UserConstants; |
| | |
| | | import com.ruoyi.common.core.domain.entity.SysRole; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.mapper.SysMenuMapper; |
| | | import com.ruoyi.system.mapper.SysRoleMenuMapper; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | |
| | | /** |
| | | * 菜单 业务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysMenuServiceImpl implements ISysMenuService |
| | | public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService |
| | | { |
| | | public static final String PREMISSION_STRING = "perms[\"{0}\"]"; |
| | | |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysNotice; |
| | | import com.ruoyi.web.mapper.system.SysNoticeMapper; |
| | | import com.ruoyi.web.server.system.ISysNoticeService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.system.domain.SysNotice; |
| | | import com.ruoyi.system.mapper.SysNoticeMapper; |
| | | import com.ruoyi.system.service.ISysNoticeService; |
| | | |
| | | /** |
| | | * 公告 服务层实现 |
| | |
| | | * @date 2018-06-25 |
| | | */ |
| | | @Service |
| | | public class SysNoticeServiceImpl implements ISysNoticeService |
| | | public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice> implements ISysNoticeService |
| | | { |
| | | @Autowired |
| | | private SysNoticeMapper noticeMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | import com.ruoyi.web.mapper.system.SysOperLogMapper; |
| | | import com.ruoyi.web.server.system.ISysOperLogService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | import com.ruoyi.system.mapper.SysOperLogMapper; |
| | | import com.ruoyi.system.service.ISysOperLogService; |
| | | |
| | | /** |
| | | * 操作日志 服务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysOperLogServiceImpl implements ISysOperLogService |
| | | public class SysOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOperLog> implements ISysOperLogService |
| | | { |
| | | @Autowired |
| | | private SysOperLogMapper operLogMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | import com.ruoyi.web.mapper.system.SysPostMapper; |
| | | import com.ruoyi.web.mapper.system.SysUserPostMapper; |
| | | import com.ruoyi.web.server.system.ISysPostService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.constant.UserConstants; |
| | | import com.ruoyi.common.core.text.Convert; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.domain.SysPost; |
| | | import com.ruoyi.system.mapper.SysPostMapper; |
| | | import com.ruoyi.system.mapper.SysUserPostMapper; |
| | | import com.ruoyi.system.service.ISysPostService; |
| | | |
| | | /** |
| | | * 岗位信息 服务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysPostServiceImpl implements ISysPostService |
| | | public class SysPostServiceImpl extends ServiceImpl<SysPostMapper, SysPost> implements ISysPostService |
| | | { |
| | | @Autowired |
| | | private SysPostMapper postMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | import com.ruoyi.web.domain.system.SysRoleDept; |
| | | import com.ruoyi.web.domain.system.SysRoleMenu; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | import com.ruoyi.web.mapper.system.*; |
| | | import com.ruoyi.web.server.system.ISysRoleService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import com.ruoyi.common.utils.ShiroUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.system.domain.SysRoleDept; |
| | | import com.ruoyi.system.domain.SysRoleMenu; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | import com.ruoyi.system.mapper.SysRoleDeptMapper; |
| | | import com.ruoyi.system.mapper.SysRoleMapper; |
| | | import com.ruoyi.system.mapper.SysRoleMenuMapper; |
| | | import com.ruoyi.system.mapper.SysUserRoleMapper; |
| | | import com.ruoyi.system.service.ISysRoleService; |
| | | |
| | | /** |
| | | * 角色 业务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysRoleServiceImpl implements ISysRoleService |
| | | public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService |
| | | { |
| | | @Autowired |
| | | private SysRoleMapper roleMapper; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | import java.util.Deque; |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | import com.ruoyi.web.mapper.system.SysUserOnlineMapper; |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | import org.apache.shiro.cache.Cache; |
| | | import org.apache.shiro.cache.ehcache.EhCacheManager; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import com.ruoyi.common.constant.ShiroConstants; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | import com.ruoyi.system.mapper.SysUserOnlineMapper; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | |
| | | /** |
| | | * 在线用户 服务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysUserOnlineServiceImpl implements ISysUserOnlineService |
| | | public class SysUserOnlineServiceImpl extends ServiceImpl<SysUserOnlineMapper, SysUserOnline> implements ISysUserOnlineService |
| | | { |
| | | @Autowired |
| | | private SysUserOnlineMapper userOnlineDao; |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | package com.ruoyi.web.server.impl.system; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | import javax.validation.ConstraintViolationException; |
| | | import javax.validation.Validator; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | import com.ruoyi.web.domain.system.SysUserPost; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | import com.ruoyi.web.mapper.system.*; |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | import com.ruoyi.web.server.system.ISysDeptService; |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import com.ruoyi.common.utils.html.EscapeUtil; |
| | | import com.ruoyi.common.utils.security.Md5Utils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.system.domain.SysPost; |
| | | import com.ruoyi.system.domain.SysUserPost; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | import com.ruoyi.system.mapper.SysPostMapper; |
| | | import com.ruoyi.system.mapper.SysRoleMapper; |
| | | import com.ruoyi.system.mapper.SysUserMapper; |
| | | import com.ruoyi.system.mapper.SysUserPostMapper; |
| | | import com.ruoyi.system.mapper.SysUserRoleMapper; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | |
| | | /** |
| | | * 用户 业务层处理 |
| | |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | public class SysUserServiceImpl implements ISysUserService |
| | | public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService |
| | | { |
| | | private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); |
| | | |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysConfig; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysConfig; |
| | | |
| | | /** |
| | | * 参数配置 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysConfigService |
| | | public interface ISysConfigService extends IService<SysConfig> |
| | | { |
| | | /** |
| | | * 查询参数配置信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.Ztree; |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | import com.ruoyi.common.core.domain.entity.SysRole; |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysDeptService |
| | | public interface ISysDeptService extends IService<SysDept> |
| | | { |
| | | /** |
| | | * 查询部门管理数据 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.entity.SysDictData; |
| | | |
| | | /** |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysDictDataService |
| | | public interface ISysDictDataService extends IService<SysDictData> |
| | | { |
| | | /** |
| | | * 根据条件分页查询字典数据 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.Ztree; |
| | | import com.ruoyi.common.core.domain.entity.SysDictData; |
| | | import com.ruoyi.common.core.domain.entity.SysDictType; |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysDictTypeService |
| | | public interface ISysDictTypeService extends IService<SysDictType> |
| | | { |
| | | /** |
| | | * 根据条件分页查询字典类型 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysLogininfor; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysLogininfor; |
| | | |
| | | /** |
| | | * 系统访问日志情况信息 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysLogininforService |
| | | public interface ISysLogininforService extends IService<SysLogininfor> |
| | | { |
| | | /** |
| | | * 新增系统登录日志 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.Ztree; |
| | | import com.ruoyi.common.core.domain.entity.SysMenu; |
| | | import com.ruoyi.common.core.domain.entity.SysRole; |
| | |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysMenuService |
| | | public interface ISysMenuService extends IService<SysMenu> |
| | | { |
| | | /** |
| | | * 根据用户ID查询菜单 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysNotice; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysNotice; |
| | | |
| | | /** |
| | | * 公告 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysNoticeService |
| | | public interface ISysNoticeService extends IService<SysNotice> |
| | | { |
| | | /** |
| | | * 查询公告信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | |
| | | /** |
| | | * 操作日志 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysOperLogService |
| | | public interface ISysOperLogService extends IService<SysOperLog> |
| | | { |
| | | /** |
| | | * 新增操作日志 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysPost; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | |
| | | /** |
| | | * 岗位信息 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysPostService |
| | | public interface ISysPostService extends IService<SysPost> |
| | | { |
| | | /** |
| | | * 查询岗位信息集合 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.entity.SysRole; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | |
| | | /** |
| | | * 角色业务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysRoleService |
| | | public interface ISysRoleService extends IService<SysRole> |
| | | { |
| | | /** |
| | | * 根据条件分页查询角色数据 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | |
| | | /** |
| | | * 在线用户 服务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysUserOnlineService |
| | | public interface ISysUserOnlineService extends IService<SysUserOnline> |
| | | { |
| | | /** |
| | | * 通过会话序号查询信息 |
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java |
| | |
| | | package com.ruoyi.system.service; |
| | | package com.ruoyi.web.server.system; |
| | | |
| | | import java.util.List; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | |
| | | /** |
| | | * 用户 业务层 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ISysUserService |
| | | public interface ISysUserService extends IService<SysUser> |
| | | { |
| | | /** |
| | | * 根据条件分页查询用户列表 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java |
| | |
| | | package com.ruoyi.web.controller.common; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | |
| | | * 本地资源通用下载 |
| | | */ |
| | | @GetMapping("/download/resource") |
| | | public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception |
| | | public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) |
| | | throws Exception |
| | | { |
| | | try |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysCaptchaController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.IOException; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.domain.SysConfig; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | import com.ruoyi.web.domain.system.SysConfig; |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | |
| | | /** |
| | | * 参数配置 信息操作处理 |
| | |
| | | /** |
| | | * 新增参数配置 |
| | | */ |
| | | @RequiresPermissions("system:config:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | import com.ruoyi.web.server.system.ISysDeptService; |
| | | |
| | | /** |
| | | * 部门信息 |
| | |
| | | /** |
| | | * 新增部门 |
| | | */ |
| | | @RequiresPermissions("system:dept:add") |
| | | @GetMapping("/add/{parentId}") |
| | | public String add(@PathVariable("parentId") Long parentId, ModelMap mmap) |
| | | { |
| | |
| | | * @param deptId 部门ID |
| | | * @param excludeId 排除ID |
| | | */ |
| | | @RequiresPermissions("system:dept:list") |
| | | @GetMapping(value = { "/selectDeptTree/{deptId}", "/selectDeptTree/{deptId}/{excludeId}" }) |
| | | public String selectDeptTree(@PathVariable("deptId") Long deptId, @PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap) |
| | | public String selectDeptTree(@PathVariable("deptId") Long deptId, |
| | | @PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap) |
| | | { |
| | | mmap.put("dept", deptService.selectDeptById(deptId)); |
| | | mmap.put("excludeId", excludeId); |
| | |
| | | /** |
| | | * 加载部门列表树(排除下级) |
| | | */ |
| | | @RequiresPermissions("system:dept:list") |
| | | @GetMapping("/treeData/{excludeId}") |
| | | @ResponseBody |
| | | public List<Ztree> treeDataExcludeChild(@PathVariable(value = "excludeId", required = false) Long excludeId) |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.service.ISysDictDataService; |
| | | import com.ruoyi.web.server.system.ISysDictDataService; |
| | | |
| | | /** |
| | | * 数据字典信息 |
| | |
| | | /** |
| | | * 新增字典类型 |
| | | */ |
| | | @RequiresPermissions("system:dict:add") |
| | | @GetMapping("/add/{dictType}") |
| | | public String add(@PathVariable("dictType") String dictType, ModelMap mmap) |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.service.ISysDictTypeService; |
| | | import com.ruoyi.web.server.system.ISysDictTypeService; |
| | | |
| | | /** |
| | | * 数据字典信息 |
| | |
| | | /** |
| | | * 新增字典类型 |
| | | */ |
| | | @RequiresPermissions("system:dict:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
| | |
| | | * 选择字典树 |
| | | */ |
| | | @GetMapping("/selectDictTree/{columnId}/{dictType}") |
| | | public String selectDeptTree(@PathVariable("columnId") Long columnId, @PathVariable("dictType") String dictType, ModelMap mmap) |
| | | public String selectDeptTree(@PathVariable("columnId") Long columnId, @PathVariable("dictType") String dictType, |
| | | ModelMap mmap) |
| | | { |
| | | mmap.put("columnId", columnId); |
| | | mmap.put("dict", dictTypeService.selectDictTypeByType(dictType)); |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | |
| | | import com.ruoyi.common.utils.ServletUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.shiro.service.SysPasswordService; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | import com.ruoyi.web.server.system.ISysMenuService; |
| | | |
| | | /** |
| | | * 首页 业务处理 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.ShiroUtils; |
| | | import com.ruoyi.framework.shiro.util.AuthorizationUtils; |
| | | import com.ruoyi.system.service.ISysMenuService; |
| | | import com.ruoyi.web.server.system.ISysMenuService; |
| | | |
| | | /** |
| | | * 菜单信息 |
| | |
| | | /** |
| | | * 新增 |
| | | */ |
| | | @RequiresPermissions("system:menu:add") |
| | | @GetMapping("/add/{parentId}") |
| | | public String add(@PathVariable("parentId") Long parentId, ModelMap mmap) |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysNotice; |
| | | import com.ruoyi.system.service.ISysNoticeService; |
| | | import com.ruoyi.web.domain.system.SysNotice; |
| | | import com.ruoyi.web.server.system.ISysNoticeService; |
| | | |
| | | /** |
| | | * 公告 信息操作处理 |
| | |
| | | /** |
| | | * 新增公告 |
| | | */ |
| | | @RequiresPermissions("system:notice:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.domain.SysPost; |
| | | import com.ruoyi.system.service.ISysPostService; |
| | | import com.ruoyi.web.domain.system.SysPost; |
| | | import com.ruoyi.web.server.system.ISysPostService; |
| | | |
| | | /** |
| | | * 岗位信息操作处理 |
| | |
| | | @ResponseBody |
| | | public AjaxResult remove(String ids) |
| | | { |
| | | try |
| | | { |
| | | return toAjax(postService.deletePostByIds(ids)); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | return error(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 新增岗位 |
| | | */ |
| | | @RequiresPermissions("system:post:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | import com.ruoyi.common.utils.file.FileUploadUtils; |
| | | import com.ruoyi.common.utils.file.MimeTypeUtils; |
| | | import com.ruoyi.framework.shiro.service.SysPasswordService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | |
| | | /** |
| | | * 个人信息 业务处理 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Controller; |
| | |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.framework.shiro.service.SysRegisterService; |
| | | import com.ruoyi.system.service.ISysConfigService; |
| | | import com.ruoyi.web.server.system.ISysConfigService; |
| | | |
| | | /** |
| | | * 注册验证 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.shiro.util.AuthorizationUtils; |
| | | import com.ruoyi.system.domain.SysUserRole; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | import com.ruoyi.system.service.ISysRoleService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | import com.ruoyi.web.domain.system.SysUserRole; |
| | | import com.ruoyi.web.server.system.ISysDeptService; |
| | | import com.ruoyi.web.server.system.ISysRoleService; |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | |
| | | /** |
| | | * 角色信息 |
| | |
| | | /** |
| | | * 新增角色 |
| | | */ |
| | | @RequiresPermissions("system:role:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
| | |
| | | /** |
| | | * 选择用户 |
| | | */ |
| | | @RequiresPermissions("system:role:list") |
| | | @GetMapping("/authUser/selectUser/{roleId}") |
| | | public String selectUser(@PathVariable("roleId") Long roleId, ModelMap mmap) |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | package com.ruoyi.web.system; |
| | | |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.shiro.service.SysPasswordService; |
| | | import com.ruoyi.framework.shiro.util.AuthorizationUtils; |
| | | import com.ruoyi.system.service.ISysDeptService; |
| | | import com.ruoyi.system.service.ISysPostService; |
| | | import com.ruoyi.system.service.ISysRoleService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | import com.ruoyi.web.server.system.ISysDeptService; |
| | | import com.ruoyi.web.server.system.ISysPostService; |
| | | import com.ruoyi.web.server.system.ISysRoleService; |
| | | import com.ruoyi.web.server.system.ISysUserService; |
| | | |
| | | /** |
| | | * 用户信息 |
| | |
| | | /** |
| | | * 新增用户 |
| | | */ |
| | | @RequiresPermissions("system:user:add") |
| | | @GetMapping("/add") |
| | | public String add(ModelMap mmap) |
| | | { |
| | |
| | | /** |
| | | * 进入授权角色页 |
| | | */ |
| | | @RequiresPermissions("system:user:edit") |
| | | @GetMapping("/authRole/{userId}") |
| | | public String authRole(@PathVariable("userId") Long userId, ModelMap mmap) |
| | | { |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoDialogController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoFormController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoIconController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoOperateController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.ruoyi.web.system.demo.domain.CustomerModel; |
| | | import com.ruoyi.web.system.demo.domain.UserOperateModel; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.ui.ModelMap; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.web.controller.demo.domain.CustomerModel; |
| | | import com.ruoyi.web.controller.demo.domain.UserOperateModel; |
| | | |
| | | /** |
| | | * 操作控制 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoReportController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java |
| | |
| | | package com.ruoyi.web.controller.demo.controller; |
| | | package com.ruoyi.web.system.demo.controller; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/CustomerModel.java |
| | |
| | | package com.ruoyi.web.controller.demo.domain; |
| | | package com.ruoyi.web.system.demo.domain; |
| | | |
| | | import java.util.List; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/GoodsModel.java |
| | |
| | | package com.ruoyi.web.controller.demo.domain; |
| | | package com.ruoyi.web.system.demo.domain; |
| | | |
| | | import java.util.Date; |
| | | import org.apache.commons.lang3.builder.ToStringBuilder; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/UserOperateModel.java |
| | |
| | | package com.ruoyi.web.controller.demo.domain; |
| | | package com.ruoyi.web.system.demo.domain; |
| | | |
| | | import java.util.Date; |
| | | import com.ruoyi.common.annotation.Excel; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/DruidController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.stereotype.Controller; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.stereotype.Controller; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.framework.shiro.service.SysPasswordService; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.domain.SysLogininfor; |
| | | import com.ruoyi.system.service.ISysLogininforService; |
| | | import com.ruoyi.web.domain.system.SysLogininfor; |
| | | import com.ruoyi.web.server.system.ISysLogininforService; |
| | | |
| | | /** |
| | | * 系统访问记录 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.system.domain.SysOperLog; |
| | | import com.ruoyi.system.service.ISysOperLogService; |
| | | import com.ruoyi.web.domain.system.SysOperLog; |
| | | import com.ruoyi.web.server.system.ISysOperLogService; |
| | | |
| | | /** |
| | | * 操作日志记录 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java |
| | |
| | | package com.ruoyi.web.controller.monitor; |
| | | package com.ruoyi.web.system.monitor; |
| | | |
| | | import java.util.List; |
| | | import org.apache.shiro.authz.annotation.Logical; |
| | |
| | | import com.ruoyi.common.utils.ShiroUtils; |
| | | import com.ruoyi.framework.shiro.session.OnlineSession; |
| | | import com.ruoyi.framework.shiro.session.OnlineSessionDAO; |
| | | import com.ruoyi.system.domain.SysUserOnline; |
| | | import com.ruoyi.system.service.ISysUserOnlineService; |
| | | import com.ruoyi.web.domain.system.SysUserOnline; |
| | | import com.ruoyi.web.server.system.ISysUserOnlineService; |
| | | |
| | | /** |
| | | * 在线用户监控 |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/BuildController.java |
| | |
| | | package com.ruoyi.web.controller.tool; |
| | | package com.ruoyi.web.tool; |
| | | |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.stereotype.Controller; |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 缓存工具类 |
| | | */ |
| | | public class CacheUtil { |
| | | |
| | | public static Map<String, String> markets = new HashMap<>(); |
| | | |
| | | public static Set<Integer> securitiesIds = new HashSet<>(); |
| | | |
| | | public static Map<String, Thread> threads = new HashMap<>(); |
| | | |
| | | |
| | | public static boolean tradingDay = false; |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * 分布式id模型 |
| | | */ |
| | | @Data |
| | | public class IDModel { |
| | | /** |
| | | * 时针回拨变量(全域值) |
| | | */ |
| | | int hourHandVariable; |
| | | /** |
| | | * 最大时针回拨变量 |
| | | */ |
| | | int maxHourHandVariable; |
| | | /** |
| | | * 自增长变量 |
| | | */ |
| | | int selfGrowth; |
| | | /** |
| | | * 最大自增长变量 |
| | | */ |
| | | int maxSelfGrowth; |
| | | /** |
| | | * 返回的唯一id |
| | | */ |
| | | long id; |
| | | |
| | | public IDModel() { |
| | | } |
| | | |
| | | public IDModel(int hourHandVariable, int maxHourHandVariable, int selfGrowth, int maxSelfGrowth) { |
| | | this.hourHandVariable = hourHandVariable; |
| | | this.maxHourHandVariable = maxHourHandVariable; |
| | | this.selfGrowth = selfGrowth; |
| | | this.maxSelfGrowth = maxSelfGrowth; |
| | | } |
| | | |
| | | |
| | | public IDModel setIDModel(int hourHandVariable, int maxHourHandVariable, int selfGrowth, int maxSelfGrowth, long id){ |
| | | this.setHourHandVariable(hourHandVariable); |
| | | this.setMaxHourHandVariable(maxHourHandVariable); |
| | | this.setSelfGrowth(selfGrowth); |
| | | this.setMaxSelfGrowth(maxSelfGrowth); |
| | | this.setId(id); |
| | | return this; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | |
| | | /** |
| | | * id生成器 |
| | | */ |
| | | public class IDUtil { |
| | | /** |
| | | * 存储时间戳 |
| | | */ |
| | | private static long timestamp = System.currentTimeMillis(); |
| | | /** |
| | | * 自增长值 |
| | | */ |
| | | private static int self = 0; |
| | | /** |
| | | * 最大自增长值 |
| | | */ |
| | | private static int max_self = 9999; |
| | | /** |
| | | * 设备号 |
| | | */ |
| | | private static int device = 0; |
| | | /** |
| | | * 时针回拨增长值 |
| | | */ |
| | | private static int hour_hand_variable = 0; |
| | | /** |
| | | * 时针回拨最大增长值 |
| | | */ |
| | | private static int max_hour_hand_variable = 999; |
| | | |
| | | |
| | | /** |
| | | * 时间戳id |
| | | * @return |
| | | */ |
| | | public static long timestamp_id(){ |
| | | return timestamp; |
| | | } |
| | | |
| | | /** |
| | | * 生成唯一ID |
| | | * @return |
| | | */ |
| | | public static long sole_id(){ |
| | | return sole_id(null); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 唯一ID生成 |
| | | * @param workId 工作ID |
| | | * @return |
| | | */ |
| | | public synchronized static long sole_id(Integer workId){ |
| | | if(null != workId){ |
| | | device = workId; |
| | | } |
| | | long timeMillis = System.currentTimeMillis(); |
| | | /** |
| | | * 时间戳相同 |
| | | * 自增长值使用完后,休眠等待时间戳更新 |
| | | */ |
| | | if(timeMillis == timestamp && self > max_self){ |
| | | try { |
| | | Thread.sleep(1); |
| | | self = 0; |
| | | return sole_id(workId); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | //处理时针回拨的情况 |
| | | if(timeMillis < timestamp) { |
| | | if (hour_hand_variable >= max_hour_hand_variable) { |
| | | hour_hand_variable = 0; |
| | | } else { |
| | | hour_hand_variable++; |
| | | } |
| | | } |
| | | //处理 |
| | | if(timeMillis > timestamp){ |
| | | timestamp = timeMillis; |
| | | self = 0; |
| | | } |
| | | return splice(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 拼接最终的id |
| | | * @return |
| | | */ |
| | | private static long splice(){ |
| | | //格式化自增长数据格式,前位补0 |
| | | String format = String.format("%04d", self); |
| | | Long id = Long.valueOf(timestamp + "" + hour_hand_variable + "" + device + format); |
| | | self++; |
| | | return id; |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | /** |
| | | * 返回结果枚举接口 |
| | | * @param <T> |
| | | */ |
| | | public interface R<T> { |
| | | /** |
| | | * 状态码 |
| | | */ |
| | | Integer code = 200; |
| | | /** |
| | | * 返回结果说明 |
| | | */ |
| | | String msg = ""; |
| | | |
| | | /** |
| | | * 返回状态码 |
| | | * @return |
| | | */ |
| | | Integer getCode(); |
| | | |
| | | /** |
| | | * 返回结果说明 |
| | | * @return |
| | | */ |
| | | String getMsg(); |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | |
| | | import java.util.UUID; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * @author zhibing.pu |
| | | * @Date 2024/9/26 18:43 |
| | | */ |
| | | public class RedisLock { |
| | | private RedisTemplate redisTemplate; |
| | | private String lockKey; |
| | | private int expireTime; // 锁的超时时间 |
| | | private int timeout; // 获取锁的超时时间 |
| | | |
| | | |
| | | public RedisLock(RedisTemplate redisTemplate, String lockKey, int expireTime, int timeout) { |
| | | this.redisTemplate = redisTemplate; |
| | | this.lockKey = lockKey; |
| | | this.expireTime = expireTime; |
| | | this.timeout = timeout; |
| | | } |
| | | |
| | | public boolean lock() { |
| | | String identifier = UUID.randomUUID().toString(); |
| | | long end = System.currentTimeMillis() + timeout; |
| | | while (System.currentTimeMillis() < end) { |
| | | if (redisTemplate.opsForValue().setIfAbsent(lockKey, identifier, expireTime, TimeUnit.SECONDS)) { |
| | | return true; |
| | | } |
| | | // 可以使用延时来减少CPU占用 |
| | | try { |
| | | Thread.sleep(100); |
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public void unlock() { |
| | | redisTemplate.delete(lockKey); |
| | | } |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | |
| | | import cn.hutool.json.JSONObject; |
| | | |
| | | /** |
| | | * 统一返回结果类 |
| | | * @param <T> |
| | | */ |
| | | public class Result<T> { |
| | | /** |
| | | * 状态码 |
| | | */ |
| | | private Integer code; |
| | | /** |
| | | * 返回说明 |
| | | */ |
| | | private String msg; |
| | | /** |
| | | * 返回结果 |
| | | */ |
| | | private T data; |
| | | |
| | | public Result() { |
| | | } |
| | | |
| | | public Result(Integer code, String msg, T data) { |
| | | this.code = code; |
| | | this.msg = msg; |
| | | this.data = data; |
| | | } |
| | | |
| | | public Integer getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getMsg() { |
| | | return msg; |
| | | } |
| | | |
| | | public T getData() { |
| | | return data; |
| | | } |
| | | |
| | | /** |
| | | * 成功 |
| | | * @param t |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> success(T t){ |
| | | return new Result(200, "成功", t); |
| | | } |
| | | |
| | | /** |
| | | * 返回 |
| | | * @return |
| | | */ |
| | | public static Result success(){ |
| | | return new Result(200, "成功", new JSONObject()); |
| | | } |
| | | |
| | | /** |
| | | * 提示信息 |
| | | * @param r |
| | | * @param t |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> tip(R r, T t){ |
| | | return new Result(r.getCode(), r.getMsg(), t); |
| | | } |
| | | |
| | | /** |
| | | * 提示信息 |
| | | * @param r |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> tip(R r){ |
| | | return new Result(r.getCode(), r.getMsg(), new JSONObject()); |
| | | } |
| | | |
| | | /** |
| | | * 失败 |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> fail(){ |
| | | return new Result(500, "失败", new JSONObject()); |
| | | } |
| | | |
| | | /** |
| | | * 失败 |
| | | * @param t |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> fail(T t){ |
| | | return new Result(500, "失败", t); |
| | | } |
| | | |
| | | /** |
| | | * 失败 |
| | | * @param r |
| | | * @param t |
| | | * @return |
| | | * @param <T> |
| | | */ |
| | | public static <T> Result<T> fail(R r, T t){ |
| | | return new Result(500, r.getMsg(), t); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "Result{" + |
| | | "code=" + code + |
| | | ", msg='" + msg + '\'' + |
| | | ", data=" + data + |
| | | '}'; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | /** |
| | | * 字符串工具类 |
| | | */ |
| | | public class StringUtils { |
| | | |
| | | |
| | | /** |
| | | * 空字符串 |
| | | * @param str |
| | | * @return |
| | | */ |
| | | public static boolean isEmpty(String str){ |
| | | return null == str || "".equals(str); |
| | | } |
| | | |
| | | /** |
| | | * 非空字符串 |
| | | * @param str |
| | | * @return |
| | | */ |
| | | public static boolean isNotEmpty(String str){ |
| | | return !isEmpty(str); |
| | | } |
| | | } |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java |
| | |
| | | package com.ruoyi.web.controller.tool; |
| | | package com.ruoyi.web.tool; |
| | | |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | | import org.springframework.stereotype.Controller; |
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java |
| | |
| | | package com.ruoyi.web.controller.tool; |
| | | package com.ruoyi.web.tool; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.LinkedHashMap; |
New file |
| | |
| | | package com.ruoyi.web.tool; |
| | | |
| | | |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * 定义生成随机码的工具类 |
| | | */ |
| | | public class UUIDUtil { |
| | | |
| | | |
| | | |
| | | /** |
| | | * 定义生成原生的UUID随机码 |
| | | * @return |
| | | */ |
| | | public static String getNativeUUID(){ |
| | | return UUID.randomUUID().toString(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 生成32位随机码 |
| | | * @return |
| | | */ |
| | | public static String getRandomCode(){ |
| | | return UUIDUtil.getNativeUUID().replaceAll("-", ""); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取给定长度的随机码 |
| | | * @param num |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public static String getRandomCode(Integer num) throws Exception { |
| | | String str = null; |
| | | if(0 < num){ |
| | | if(num % 32 > 0){ |
| | | Integer s = num / 32; |
| | | Integer l = num % 32; |
| | | StringBuffer sb = new StringBuffer(); |
| | | for(int i = 0; i < s; i++){ |
| | | sb.append(UUIDUtil.getRandomCode()); |
| | | } |
| | | sb.append(UUIDUtil.getRandomCode().substring(0, l)); |
| | | str = sb.toString(); |
| | | }else if(num % 32 == 0){ |
| | | Integer s = num / 32; |
| | | StringBuffer sb = new StringBuffer(); |
| | | for(int i = 0; i < s; i++){ |
| | | sb.append(UUIDUtil.getRandomCode()); |
| | | } |
| | | str = sb.toString(); |
| | | }else{ |
| | | str = UUIDUtil.getRandomCode().substring(0, num); |
| | | } |
| | | }else{ |
| | | throw new Exception("参数只能大于0"); |
| | | } |
| | | return str; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取根据当前时间的字符串数据 |
| | | * @return |
| | | */ |
| | | public synchronized static String getTimeStr(){ |
| | | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); |
| | | return simpleDateFormat.format(new Date()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @Description: 获取数字随机码 |
| | | * @Author pzb |
| | | * @Date 2021/8/11 16:52 |
| | | * @Param |
| | | * @Return |
| | | * @Exception |
| | | */ |
| | | public static String getNumberRandom(Integer num){ |
| | | if(null == num){ |
| | | num = 32; |
| | | } |
| | | StringBuffer sb = new StringBuffer(); |
| | | for(int i = 0; i < num; i++){ |
| | | sb.append(Double.valueOf(Math.random() * 10).intValue()); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | } |
| | |
| | | druid: |
| | | # 主库数据源 |
| | | master: |
| | | url: jdbc:mysql://192.168.110.80:3306/sangeshenbian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 |
| | | url: jdbc:mysql://127.0.0.1:3306/sangeshenbian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 |
| | | username: root |
| | | password: 123456 |
| | | # 从库数据源 |
| | |
| | | # 名称 |
| | | name: RuoYi |
| | | # 版本 |
| | | version: 4.8.0 |
| | | version: 4.7.9 |
| | | # 版权年份 |
| | | copyrightYear: 2025 |
| | | copyrightYear: 2024 |
| | | # 实例演示开关 |
| | | demoEnabled: true |
| | | # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) |
| | |
| | | # 开发环境配置 |
| | | server: |
| | | # 服务器的HTTP端口,默认为80 |
| | | port: 80 |
| | | port: 3000 |
| | | servlet: |
| | | # 应用的访问路径 |
| | | context-path: / |
| | |
| | | |
| | | # Spring配置 |
| | | spring: |
| | | application: |
| | | name: ruoyi |
| | | # 循环依赖 |
| | | main: |
| | | allow-circular-references: true |
| | | # 模板引擎 |
| | | thymeleaf: |
| | | mode: HTML |
| | |
| | | # 热部署开关 |
| | | enabled: true |
| | | |
| | | # MyBatis |
| | | mybatis: |
| | | # 搜索指定包别名 |
| | | typeAliasesPackage: com.ruoyi.**.domain |
| | | # 配置mapper的扫描,找到所有的mapper.xml映射文件 |
| | | mapperLocations: classpath*:mapper/**/*Mapper.xml |
| | | # 加载全局的配置文件 |
| | | configLocation: classpath:mybatis/mybatis-config.xml |
| | | |
| | | mybatis-plus: |
| | | type-aliases-package: com.ruoyi.**.domain |
| | | mapper-locations: classpath*:mapper/**/**.xml |
| | | |
| | | |
| | | |
| | | # PageHelper分页插件 |
| | | pagehelper: |
| | |
| | | # 是否开启记住我 |
| | | enabled: true |
| | | |
| | | |
| | | # 防止XSS攻击 |
| | | xss: |
| | | # 过滤开关 |
| | |
| | | swagger: |
| | | # 是否开启swagger |
| | | enabled: true |
| | | |
| | | ## redis |
| | | --- |
| | | spring: |
| | | redis: |
| | | database: 0 |
| | | host: 127.0.0.1 |
| | | port: 6379 |
| | | password: 123456 |
| | | jedis: |
| | | pool: |
| | | max-active: 20 |
| | | max-idle: 20 |
| | | max-wait: 60s |
| | | min-idle: 5 |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysConfigMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysConfigMapper"> |
| | | |
| | | <resultMap type="SysConfig" id="SysConfigResult"> |
| | | <id property="configId" column="config_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysDeptMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysDeptMapper"> |
| | | |
| | | <resultMap type="SysDept" id="SysDeptResult"> |
| | | <id property="deptId" column="dept_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysDictDataMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysDictDataMapper"> |
| | | |
| | | <resultMap type="SysDictData" id="SysDictDataResult"> |
| | | <id property="dictCode" column="dict_code" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysDictTypeMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysDictTypeMapper"> |
| | | |
| | | <resultMap type="SysDictType" id="SysDictTypeResult"> |
| | | <id property="dictId" column="dict_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysLogininforMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysLogininforMapper"> |
| | | |
| | | <resultMap type="SysLogininfor" id="SysLogininforResult"> |
| | | <id property="infoId" column="info_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysMenuMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysMenuMapper"> |
| | | |
| | | <resultMap type="SysMenu" id="SysMenuResult"> |
| | | <id property="menuId" column="menu_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysNoticeMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysNoticeMapper"> |
| | | |
| | | <resultMap type="SysNotice" id="SysNoticeResult"> |
| | | <result property="noticeId" column="notice_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysOperLogMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysOperLogMapper"> |
| | | |
| | | <resultMap type="SysOperLog" id="SysOperLogResult"> |
| | | <id property="operId" column="oper_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysPostMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysPostMapper"> |
| | | |
| | | <resultMap type="SysPost" id="SysPostResult"> |
| | | <id property="postId" column="post_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysRoleDeptMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysRoleDeptMapper"> |
| | | |
| | | <resultMap type="SysRoleDept" id="SysRoleDeptResult"> |
| | | <result property="roleId" column="role_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysRoleMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysRoleMapper"> |
| | | |
| | | <resultMap type="SysRole" id="SysRoleResult"> |
| | | <id property="roleId" column="role_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysRoleMenuMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysRoleMenuMapper"> |
| | | |
| | | <resultMap type="SysRoleMenu" id="SysRoleMenuResult"> |
| | | <result property="roleId" column="role_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysUserMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysUserMapper"> |
| | | |
| | | <resultMap type="SysUser" id="SysUserResult"> |
| | | <id property="userId" column="user_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysUserOnlineMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysUserOnlineMapper"> |
| | | |
| | | <resultMap type="SysUserOnline" id="SysUserOnlineResult"> |
| | | <id property="sessionId" column="sessionId" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysUserPostMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysUserPostMapper"> |
| | | |
| | | <resultMap type="SysUserPost" id="SysUserPostResult"> |
| | | <result property="userId" column="user_id" /> |
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml |
| | |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysUserRoleMapper"> |
| | | <mapper namespace="com.ruoyi.web.mapper.system.SysUserRoleMapper"> |
| | | |
| | | <resultMap type="SysUserRole" id="SysUserRoleResult"> |
| | | <result property="userId" column="user_id" /> |
| | |
| | | /*! jQuery Validation Plugin - v1.21.0 - 7/17/2024 |
| | | /*! jQuery Validation Plugin - v1.19.3 - 1/9/2021 |
| | | * https://jqueryvalidation.org/ |
| | | * Copyright (c) 2024 Jörn Zaefferer; Licensed MIT */ |
| | | !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,customElements:[],onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)});var f=[":text","[type='password']","[type='file']","select","textarea","[type='number']","[type='search']","[type='tel']","[type='url']","[type='email']","[type='datetime']","[type='date']","[type='month']","[type='week']","[type='time']","[type='datetime-local']","[type='range']","[type='color']","[type='radio']","[type='checkbox']","[contenteditable]","[type='button']"],g=["select","option","[type='radio']","[type='checkbox']"];a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",f.concat(this.settings.customElements).join(", "),b).on("click.validate",g.concat(this.settings.customElements).join(", "),b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={},d=["input","select","textarea","[contenteditable]"];return a(this.currentForm).find(d.concat(this.settings.customElements).join(", ")).not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);this.abortRequest(b),"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||"")):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},elementAjaxPort:function(a){return"validate"+a.name},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},abortRequest:function(b){var c;this.pending[b.name]&&(c=this.elementAjaxPort(b),a.ajaxAbort(c),this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass))},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:-?\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),null!==i.valid&&i.old===h?i.valid:(i.old=h,i.valid=null,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:this.elementAjaxPort(c),dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(b,c,e){var f=b.port;"abort"===b.mode&&(a.ajaxAbort(f),d[f]=e)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(a.ajaxAbort(f),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a.ajaxAbort=function(a){d[a]&&(d[a].abort(),delete d[a])},a}); |
| | | * Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */ |
| | | !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){if(a!==undefined){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")}},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a}); |
| | |
| | | display: block; |
| | | } |
| | | |
| | | .clear { |
| | | display: block; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | a { |
| | | cursor: pointer; |
| | | } |
| | |
| | | h1,h2,h3,h4,h5,h6{font-weight:100}h1{font-size:30px}h2{font-size:24px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:10px}h3,h4,h5{margin-top:5px;font-weight:600}a:focus{outline:0}.nav>li>a{color:#a7b1c2;font-weight:600;padding:14px 20px 14px 25px}.nav li>a{display:block}.nav.navbar-right>li>a,.nav.navbar-left>li>a{color:#fff;font-size:14px;height:50px;padding:15px 15px}.nav>li.active>a{color:#fff}.nav.navbar-right>li>a>.label,.nav.navbar-left>li>a>.label{position:absolute;top:9px;right:5px;text-align:center;font-size:9px;padding:2px 4px;line-height:.9}.nav.navbar-right>li>a:hover,.nav.navbar-left>li>a:hover{background-color:#367fa9;color:#fff}.navbar-default .nav>li>a:hover,.navbar-default .nav>li>a:focus{background-color:#293846;color:white}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:#fff}.navbar{border:0}.navbar-default{background-color:transparent;border-color:#2f4050;position:relative}.nav.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:16px}body.body-small .navbar-top-links li:last-child{margin-right:10px}.navbar-top-links li a{padding:20px 10px;min-height:50px}.dropdown-menu{border:medium none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:1000;border-radius:0;box-shadow:0 0 3px rgba(86,96,117,0.3)}.dropdown-menu>li>a{border-radius:3px;color:inherit;line-height:25px;margin:4px;text-align:left;font-weight:normal}.dropdown-menu>li>a.font-bold{font-weight:600}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.dropdown-messages,.dropdown-alerts{padding:10px 10px 10px 10px}.dropdown-messages li a,.dropdown-alerts li a{font-size:12px}.dropdown-messages li em,.dropdown-alerts li em{font-size:10px}.nav.navbar-top-links .dropdown-alerts a{font-size:12px}.nav>li.active{border-left:4px solid #19aa8d;background:#293846}.nav.nav-second-level>li.active{border:0}.nav.nav-second-level.collapse[style]{height:auto!important}.nav-header a{color:#dfe4ed}.nav-header .text-muted{color:#8095a8}.minimalize-styl-2{padding:4px 12px;margin:12px 5px 5px 15px;font-size:14px;float:left}.navbar-form-custom{float:left;height:50px;padding:0;width:200px;display:inline-table}.navbar-form-custom .form-group{margin-bottom:0}.nav.navbar-top-links a{font-size:14px}.navbar-form-custom .form-control{background:none repeat scroll 0 0 rgba(0,0,0,0);border:medium none;font-size:14px;height:60px;margin:0;z-index:2000}.count-info .label{line-height:12px;padding:1px 5px;position:absolute;right:6px;top:12px}.arrow{float:right;margin-top:2px}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.nav-second-level li,.nav-third-level li{border-bottom:none!important;padding-left:2px;padding-right:2px}.nav-second-level li a{padding:7px 15px 7px 10px;padding-left:52px}.nav-third-level li a{padding-left:70px}.nav-second-level li:last-child{margin-bottom:10px}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover>.nav-second-level,.mini-navbar .nav li:focus>.nav-second-level{display:block;border-radius:0 2px 2px 0;min-width:140px;height:auto}body.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:0 2px 2px 0}body.mini-navbar .navbar-default .nav>li>.nav-third-level li a{padding-left:31px}.fixed-nav .slimScrollDiv #side-menu{padding-bottom:60px;position:relative}.fixed-sidebar.mini-navbar .slimScrollDiv>*{overflow:visible!important}.fixed-sidebar .slimScrollDiv>*{overflow-y:hidden;overflow-x:visible}.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.canvas-menu.mini-navbar .nav-second-level{background:#293846}.mini-navbar li.active .nav-second-level{left:65px}.navbar-default .special_link a{background:#1ab394;color:white}.navbar-default .special_link a:hover{background:#17987e!important;color:white}.navbar-default .special_link a span.label{background:#fff;color:#1ab394}.navbar-default .landing_link a{background:#1cc09f;color:white}.navbar-default .landing_link a:hover{background:#1ab394!important;color:white}.navbar-default .landing_link a span.label{background:#fff;color:#1cc09f}.logo-element{text-align:center;font-size:18px;font-weight:600;color:white;display:none;padding:18px 0}.navbar-fixed-top{background:#fff;-webkit-transition-duration:.5s;transition-duration:.5s;z-index:2030}.fixed-nav #wrapper{padding-top:60px;box-sizing:border-box}.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.body-small .navbar-fixed-top{margin-left:0}body.mini-navbar .navbar-static-side{width:70px}body.mini-navbar .profile-element,body.mini-navbar .nav-label,body.mini-navbar .navbar-default .nav li a span{display:none}body.canvas-menu .profile-element{display:block}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level{display:none}body.mini-navbar .navbar-default .nav>li>a{font-size:16px}body.mini-navbar .logo-element{display:block}body.canvas-menu .logo-element{display:none}body.mini-navbar .nav-header{padding:0;background-color:#1ab394}body.canvas-menu .nav-header{padding:33px 25px}body.mini-navbar #page-wrapper{margin:0 0 0 70px}body.canvas-menu.mini-navbar #page-wrapper,body.canvas-menu.mini-navbar .footer{margin:0}body.fixed-sidebar .navbar-static-side,body.canvas-menu .navbar-static-side{position:fixed;width:200px;z-index:2001;height:100%}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}body.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.fixed-sidebar.mini-navbar .nav li>.nav-second-level{display:none}.fixed-sidebar.mini-navbar .nav li.active{border-left-width:0}.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{top:0;padding:10px 10px 10px 10px;text-align:center;background-color:#243747}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level{top:40px;font-size:12px;background-color:#2f4050}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{position:absolute;left:70px;display:block;min-width:140px;border-radius:2px}.fixed-sidebar.mini-navbar .nav li.active:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li.active:hover>a>span.nav-label{left:67px}.fixed-sidebar.mini-navbar .nav .nav-second-level a>span,.fixed-sidebar.mini-navbar .nav .nav-third-level a>span{display:inline-block}body.fixed-sidebar.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:3px}body.canvas-menu.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-sidebar.mini-navbar .nav-second-level li a,.canvas-menu.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{position:relative;padding:0;font-size:13px}.fixed-sidebar.mini-navbar li.active .nav-second-level,.canvas-menu.mini-navbar li.active .nav-second-level{left:0}body.canvas-menu nav.navbar-static-side{z-index:2001;background:#2f4050;height:100%;position:fixed;display:none}body.canvas-menu.mini-navbar nav.navbar-static-side{display:block;width:70px}.top-navigation #page-wrapper{margin-left:0}.top-navigation .navbar-nav .dropdown-menu>.active>a{background:white;color:#1ab394;font-weight:bold}.white-bg .navbar-fixed-top,.white-bg .navbar-static-top{background:#fff}.top-navigation .navbar{margin-bottom:0}.top-navigation .nav>li>a{padding:15px 20px;color:#676a6c}.top-navigation .nav>li a:hover,.top-navigation .nav>li a:focus{background:#fff;color:#1ab394}.top-navigation .nav>li.active{background:#fff;border:0}.top-navigation .nav>li.active>a{color:#1ab394}.top-navigation .navbar-right{padding-right:10px}.top-navigation .navbar-nav .dropdown-menu{box-shadow:none;border:1px solid #e7eaec}.top-navigation .dropdown-menu>li>a{margin:0;padding:7px 20px}.navbar .dropdown-menu{margin-top:0}.top-navigation .navbar-brand{background:#1ab394;color:#fff;padding:15px 25px}.top-navigation .navbar-top-links li:last-child{margin-right:0}.top-navigation.mini-navbar #page-wrapper,.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,.mini-navbar .top-navigation #page-wrapper,.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,.canvas-menu #page-wrapper{margin:0}.top-navigation.fixed-nav #wrapper,.fixed-nav #wrapper.top-navigation{margin-top:50px}.top-navigation .footer.fixed{margin-left:0!important}.top-navigation .wrapper.wrapper-content{padding:40px}.top-navigation.body-small .wrapper.wrapper-content,.body-small .top-navigation .wrapper.wrapper-content{padding:40px 0 40px 0}.navbar-toggle{background-color:#1ab394;color:#fff;padding:6px 12px;font-size:14px}.top-navigation .navbar-nav .open .dropdown-menu>li>a,.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header{padding:10px 15px 10px 20px}@media(max-width :768px){.top-navigation .navbar-header{display:block;float:none}}.menu-visible-lg,.menu-visible-md{display:none!important}@media(min-width :1200px){.menu-visible-lg{display:block!important}}@media(min-width :992px){.menu-visible-md{display:block!important}}@media(max-width :767px){.menu-visible-md{display:block!important}.menu-visible-lg{display:block!important}}.btn{border-radius:3px}.float-e-margins .btn{margin-bottom:5px}.btn-w-m{min-width:120px}.btn-primary.btn-outline{color:#1ab394}.btn-success.btn-outline{color:#1c84c6}.btn-info.btn-outline{color:#23c6c8}.btn-warning.btn-outline{color:#f8ac59}.btn-danger.btn-outline{color:#ed5565}.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-info.btn-outline:hover,.btn-warning.btn-outline:hover,.btn-danger.btn-outline:hover{color:#fff}.btn-primary{background-color:#1ab394;border-color:#1ab394;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-color:#18a689;border-color:#18a689;color:#fff}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary.active[disabled],fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#1dc5a3;border-color:#1dc5a3}.btn-success{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-color:#1a7bb9!important;border-color:#1a7bb9!important;color:#fff}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success.active[disabled],fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#1f90d8;border-color:#1f90d8}.btn-info{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-color:#21b9bb;border-color:#21b9bb;color:#fff}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info.active[disabled],fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#26d7d9;border-color:#26d7d9}.btn-default{background-color:#f4f4f4;border-color:#ddd;color:#444}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#e7e7e7;border-color:#e7e7e7;color:#444}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default.active[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#ccc;border-color:#ccc}.btn-warning{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-color:#f7a54a;border-color:#f7a54a;color:#fff}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning.active[disabled],fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f9b66d;border-color:#f9b66d}.btn-danger{background-color:#ed5565;border-color:#ed5565;color:#fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#ec4758;border-color:#ec4758;color:#fff}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger.active[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#ef6776;border-color:#ef6776}.btn-link{color:inherit}.btn-link:hover,.btn-link:focus,.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{color:#1ab394;text-decoration:none}.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{background-image:none}.btn-link.disabled,.btn-link.disabled:hover,.btn-link.disabled:focus,.btn-link.disabled:active,.btn-link.disabled.active,.btn-link[disabled],.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link[disabled]:active,.btn-link.active[disabled],fieldset[disabled] .btn-link,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link.active{color:#cacaca}.btn-white{color:inherit;background:white;border:1px solid #e7eaec}.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:inherit;border:1px solid #d2d2d2}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,0.15) inset}.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{background-image:none}.btn-white.disabled,.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled:active,.btn-white.disabled.active,.btn-white[disabled],.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled]:active,.btn-white.active[disabled],fieldset[disabled] .btn-white,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white:active,fieldset[disabled] .btn-white.active{color:#cacaca}.form-control,.has-error .form-control:focus,.has-success .form-control:focus,.has-warning .form-control:focus,.navbar-collapse,.navbar-form,.navbar-form-custom .form-control:focus,.navbar-form-custom .form-control:hover,.open .btn.dropdown-toggle,.panel,.popover,.progress,.progress-bar{box-shadow:none}.btn-outline{color:inherit;background-color:transparent;-webkit-transition:all .5s;transition:all .5s}.btn-rounded{border-radius:50px}.btn-large-dim{width:90px;height:90px;font-size:42px}button.dim{display:inline-block;color:#fff;text-decoration:none;text-transform:uppercase;text-align:center;padding-top:6px;margin-right:10px;position:relative;cursor:pointer;border-radius:5px;font-weight:600;margin-bottom:20px!important}button.dim:active{top:3px}button.btn-primary.dim{box-shadow:inset 0 0 0 #16987e,0px 5px 0 0 #16987e,0px 10px 5px #999}button.btn-primary.dim:active{box-shadow:inset 0 0 0 #16987e,0px 2px 0 0 #16987e,0px 5px 3px #999}button.btn-default.dim{box-shadow:inset 0 0 0 #b3b3b3,0px 5px 0 0 #b3b3b3,0px 10px 5px #999}button.btn-default.dim:active{box-shadow:inset 0 0 0 #b3b3b3,0px 2px 0 0 #b3b3b3,0px 5px 3px #999}button.btn-warning.dim{box-shadow:inset 0 0 0 #f79d3c,0px 5px 0 0 #f79d3c,0px 10px 5px #999}button.btn-warning.dim:active{box-shadow:inset 0 0 0 #f79d3c,0px 2px 0 0 #f79d3c,0px 5px 3px #999}button.btn-info.dim{box-shadow:inset 0 0 0 #1eacae,0px 5px 0 0 #1eacae,0px 10px 5px #999}button.btn-info.dim:active{box-shadow:inset 0 0 0 #1eacae,0px 2px 0 0 #1eacae,0px 5px 3px #999}button.btn-success.dim{box-shadow:inset 0 0 0 #1872ab,0px 5px 0 0 #1872ab,0px 10px 5px #999}button.btn-success.dim:active{box-shadow:inset 0 0 0 #1872ab,0px 2px 0 0 #1872ab,0px 5px 3px #999}button.btn-danger.dim{box-shadow:inset 0 0 0 #ea394c,0px 5px 0 0 #ea394c,0px 10px 5px #999}button.btn-danger.dim:active{box-shadow:inset 0 0 0 #ea394c,0px 2px 0 0 #ea394c,0px 5px 3px #999}button.dim:before{font-size:50px;line-height:1em;font-weight:normal;color:#fff;display:block;padding-top:10px}button.dim:active:before{top:7px;font-size:50px}.label{background-color:#d1dade;color:#5e5e5e;font-size:10px;font-weight:600;padding:3px 8px;text-shadow:none}.badge{background-color:#d1dade;color:#5e5e5e;font-size:11px;font-weight:600;padding-bottom:4px;padding-left:6px;padding-right:6px;text-shadow:none}.label-primary,.badge-primary{background-color:#1ab394;color:#fff}.label-success,.badge-success{background-color:#1c84c6;color:#fff}.label-warning,.badge-warning{background-color:#f8ac59;color:#fff}.label-warning-light,.badge-warning-light{background-color:#f8ac59;color:#fff}.label-danger,.badge-danger{background-color:#ed5565;color:#fff}.label-info,.badge-info{background-color:#23c6c8;color:#fff}.label-inverse,.badge-inverse{background-color:#262626;color:#fff}.label-white,.badge-white{background-color:#fff;color:#5e5e5e}.label-white,.badge-disable{background-color:#2a2e36;color:#8b91a0}.onoffswitch{position:relative;width:64px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:2px}.onoffswitch-inner{width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:10px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:10px;background-color:#fff;color:#999;text-align:right}.onoffswitch-switch{width:20px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:2px;position:absolute;top:0;bottom:0;right:44px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.chosen-container-single .chosen-single{background:#fff;box-shadow:none;-moz-box-sizing:border-box;background-color:#fff;border:1px solid #cbd5dd;border-radius:2px;cursor:text;height:auto!important;margin:0;min-height:30px;overflow:hidden;padding:4px 12px;position:relative;width:100%}.chosen-container-multi .chosen-choices li.search-choice{background:#f1f1f1;border:1px solid #ededed;border-radius:2px;box-shadow:none;color:#333;cursor:default;line-height:13px;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#f4f4f4;border-color:#ddd;color:inherit;cursor:default;z-index:2}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:inherit;float:left;line-height:1.42857;margin-left:-1px;padding:4px 10px;position:relative;text-decoration:none}.tooltip-inner{background-color:#2f4050;word-break:break-all;overflow-wrap:break-word}.tooltip.top .tooltip-arrow{border-top-color:#2f4050}.tooltip.right .tooltip-arrow{border-right-color:#2f4050}.tooltip.bottom .tooltip-arrow{border-bottom-color:#2f4050}.tooltip.left .tooltip-arrow{border-left-color:#2f4050}.easypiechart{position:relative;text-align:center}.easypiechart .h2{margin-left:10px;margin-top:10px;display:inline-block}.easypiechart canvas{top:0;left:0}.easypiechart .easypie-text{line-height:1;position:absolute;top:33px;width:100%;z-index:1}.easypiechart img{margin-top:-4px}.jqstooltip{box-sizing:content-box}.fc-state-default{background-color:#fff;background-image:none;background-repeat:repeat-x;box-shadow:none;color:#333;text-shadow:none}.fc-state-default{border:1px solid}.fc-button{color:inherit;border:1px solid #e7eaec;cursor:pointer;display:inline-block;height:1.9em;line-height:1.9em;overflow:hidden;padding:0 .6em;position:relative;white-space:nowrap}.fc-state-active{background-color:#1ab394;border-color:#1ab394;color:#fff}.fc-header-title h2{font-size:16px;font-weight:600;color:inherit}.fc-content .fc-widget-header,.fc-content .fc-widget-content{border-color:#e7eaec;font-weight:normal}.fc-border-separate tbody{background-color:#f8f8f8}.fc-state-highlight{background:none repeat scroll 0 0 #fcf8e3}.external-event{padding:5px 10px;border-radius:2px;cursor:pointer;margin-bottom:5px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-radius:2px}.fc-event,.fc-agenda .fc-event-time,.fc-event a{padding:4px 6px;background-color:#1ab394;border-color:#1ab394}.fc-event-time,.fc-event-title{color:#717171;padding:0 1px}.ui-calendar .fc-event-time,.ui-calendar .fc-event-title{color:#fff}.chat-activity-list .chat-element{border-bottom:1px solid #e7eaec}.chat-element:first-child{margin-top:0}.chat-element{padding-bottom:15px}.chat-element,.chat-element .media{margin-top:15px}.chat-element,.media-body{overflow:hidden}.media-body{display:block;width:auto}.chat-element>.pull-left{margin-right:10px}.chat-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.chat-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.chat-element .actions{margin-top:10px}.chat-element .photos{margin:10px 0}.right.chat-element>.pull-right{margin-left:10px}.chat-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #b3a9a9}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0;color:#777}.panel .slidedown .glyphicon,.chat .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{background-color:#1ab394;border-color:#1ab394;color:#fff;z-index:2}.list-group-item-heading{margin-top:10px}.list-group-item-text{margin:0 0 10px;color:inherit;font-size:12px;line-height:inherit}.no-padding .list-group-item{border-left:none;border-right:0;border-bottom:0}.no-padding .list-group-item:first-child{border-left:none;border-right:0;border-bottom:0;border-top:0}.no-padding .list-group{margin-bottom:0}.list-group-item{background-color:inherit;border:1px solid #e7eaec;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.elements-list .list-group-item{border-left:none;border-right:0;padding:15px 25px}.elements-list .list-group-item:first-child{border-left:none;border-right:0;border-top:none!important}.elements-list .list-group{margin-bottom:0}.elements-list a{color:inherit}.elements-list .list-group-item.active,.elements-list .list-group-item:hover{background:#f3f3f4;color:inherit;border-color:#e7eaec;border-radius:0}.elements-list li.active{-webkit-transition:none;transition:none}.element-detail-box{padding:25px}.flot-chart{display:block;height:200px}.widget .flot-chart.dashboard-chart{display:block;height:120px;margin-top:40px}.flot-chart.dashboard-chart{display:block;height:180px;margin-top:40px}.flot-chart-content{width:100%;height:100%}.flot-chart-pie-content{width:200px;height:200px;margin:auto}.jqstooltip{position:absolute;display:block;left:0;top:0;visibility:hidden;background:#2b303a;background-color:rgba(43,48,58,0.8);color:white;text-align:left;white-space:nowrap;z-index:10000;padding:5px 5px 5px 5px;min-height:22px;border-radius:3px}.jqsfield{color:white;text-align:left}.h-200{min-height:200px}.legendLabel{padding-left:5px}.stat-list li:first-child{margin-top:0}.stat-list{list-style:none;padding:0;margin:0}.stat-percent{float:right}.stat-list li{margin-top:15px;position:relative}table.dataTable thead .sorting,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background:transparent}table.dataTable thead .sorting_asc:after{float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,0.5)}.dataTables_wrapper{padding-bottom:30px}.img-circle{border-radius:50%}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^="col-"]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.css-animation-box h1{font-size:44px}.animation-efect-links a{padding:4px 6px;font-size:12px}#animation_box{background-color:#f9f8f8;border-radius:16px;width:80%;margin:0 auto;padding-top:80px}.animation-text-box{position:absolute;margin-top:40px;left:50%;margin-left:-100px;width:200px}.animation-text-info{position:absolute;margin-top:-60px;left:50%;margin-left:-100px;width:200px;font-size:10px}.animation-text-box h2{font-size:54px;font-weight:600;margin-bottom:5px}.animation-text-box p{font-size:12px;text-transform:uppercase}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#1ab394;position:fixed;z-index:2000;top:0;width:100%;height:2px}.pace-inactive{display:none}.widget{border-radius:5px;padding:15px 20px;margin-bottom:10px;margin-top:10px}.widget.style1 h2{font-size:30px}.widget h2,.widget h3{margin-top:5px;margin-bottom:0}.widget-text-box{padding:20px;border:1px solid #e7eaec;background:#fff}.widget-head-color-box{border-radius:5px 5px 0 0;margin-top:10px}.widget .flot-chart{height:100px}.vertical-align div{display:inline-block;vertical-align:middle}.vertical-align h2,.vertical-align h3{margin:0}.todo-list{list-style:none outside none;margin:0;padding:0;font-size:14px}.todo-list.small-list{font-size:12px}.todo-list.small-list>li{background:#f3f3f4;border-left:none;border-right:0;border-radius:4px;color:inherit;margin-bottom:2px;padding:6px 6px 6px 12px}.todo-list.small-list .btn-xs,.todo-list.small-list .btn-group-xs>.btn{border-radius:5px;font-size:10px;line-height:1.5;padding:1px 2px 1px 5px}.todo-list>li{background:#f3f3f4;border-left:6px solid #e7eaec;border-right:6px solid #e7eaec;border-radius:4px;color:inherit;margin-bottom:2px;padding:10px}.todo-list .handle{cursor:move;display:inline-block;font-size:16px;margin:0 5px}.todo-list>li .label{font-size:9px;margin-left:10px}.check-link{font-size:16px}.todo-completed{text-decoration:line-through}.geo-statistic h1{font-size:36px;margin-bottom:0}.glyphicon.fa{font-family:"FontAwesome"}.inline{display:inline-block!important}.input-s-sm{width:120px}.input-s{width:200px}.input-s-lg{width:250px}.i-checks{padding-left:0}.form-control,.single-line{background:#fff none;border:1px solid #e5e6e7;border-radius:4px;color:inherit;display:block;padding:3px 6px 4px;-webkit-transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;width:100%;height:31px;font-size:14px}.form-control.kv-fileinput-caption{height:34px!important}.form-control:focus,.single-line:focus{border-color:#3c8dbc!important}.has-success .form-control{border-color:#1ab394}.has-warning .form-control{border-color:#f8ac59}.has-error .form-control{border-color:#ed5565}.has-success .control-label{color:#1ab394}.has-warning .control-label{color:#f8ac59}.has-error .control-label{color:#ed5565}.input-group-addon{background-color:#fff;border:1px solid #e5e6e7;border-radius:4px;color:inherit;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.spinner-buttons.input-group-btn .btn-xs{line-height:1.13}.spinner-buttons.input-group-btn{width:20%}.noUi-connect{background:none repeat scroll 0 0 #1ab394;box-shadow:none}.slider_red .noUi-connect{background:none repeat scroll 0 0 #ed5565;box-shadow:none}.ui-sortable .ibox-title{cursor:move}.ui-sortable-placeholder{border:1px dashed #cecece!important;visibility:visible!important;background:#e7eaec}.ibox.ui-sortable-placeholder{margin:0 0 23px!important}.tabs-container .panel-body{background:#fff;border:1px solid #e7eaec;border-radius:2px;padding:20px;position:relative}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent;background-color:#fff}.tabs-container .nav-tabs>li{float:left;margin-bottom:-1px}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent}.tabs-container .nav-tabs{border-bottom:1px solid #e7eaec}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .tabs-left .tab-pane .panel-body,.tabs-container .tabs-right .tab-pane .panel-body{border-top:1px solid #e7eaec}.tabs-container .nav-tabs>li a:hover{background:transparent;border-color:transparent}.tabs-container .tabs-below>.nav-tabs,.tabs-container .tabs-right>.nav-tabs,.tabs-container .tabs-left>.nav-tabs{border-bottom:0}.tabs-container .tabs-left .panel-body{position:static}.tabs-container .tabs-left>.nav-tabs,.tabs-container .tabs-right>.nav-tabs{width:20%}.tabs-container .tabs-left .panel-body{width:80%;margin-left:20%}.tabs-container .tabs-right .panel-body{width:80%;margin-right:20%}.tabs-container .tab-content>.tab-pane,.tabs-container .pill-content>.pill-pane{display:none}.tabs-container .tab-content>.active,.tabs-container .pill-content>.active{display:block}.tabs-container .tabs-below>.nav-tabs{border-top:1px solid #e7eaec}.tabs-container .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-container .tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-container .tabs-below>.nav-tabs>li>a:hover,.tabs-container .tabs-below>.nav-tabs>li>a:focus{border-top-color:#e7eaec;border-bottom-color:transparent}.tabs-container .tabs-left>.nav-tabs>li,.tabs-container .tabs-right>.nav-tabs>li{float:none}.tabs-container .tabs-left>.nav-tabs>li>a,.tabs-container .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-container .tabs-left>.nav-tabs{float:left;margin-right:19px}.tabs-container .tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-container .tabs-left>.nav-tabs .active>a,.tabs-container .tabs-left>.nav-tabs .active>a:hover,.tabs-container .tabs-left>.nav-tabs .active>a:focus{border-color:#e7eaec transparent #e7eaec #e7eaec;border-right-color:#fff}.tabs-container .tabs-right>.nav-tabs{float:right;margin-left:19px}.tabs-container .tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-container .tabs-right>.nav-tabs .active>a,.tabs-container .tabs-right>.nav-tabs .active>a:hover,.tabs-container .tabs-right>.nav-tabs .active>a:focus{border-color:#e7eaec #e7eaec #e7eaec transparent;border-left-color:#fff;z-index:1}.onoffswitch{position:relative;width:54px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:3px}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;padding:0;font-size:10px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:7px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:7px;background-color:#fff;color:#919191;text-align:right}.onoffswitch-switch{display:block;width:18px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:3px;position:absolute;top:0;bottom:0;right:36px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.dd{position:relative;display:block;margin:0;padding:0;list-style:none;font-size:13px;line-height:20px}.dd-list{display:block;position:relative;margin:0;padding:0;list-style:none}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-item,.dd-empty,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;font-size:13px;line-height:20px}.dd-handle{display:block;margin:5px 0;padding:5px 10px;color:#333;text-decoration:none;border:1px solid #e7eaec;background:#f5f5f5;border-radius:3px;box-sizing:border-box;-moz-box-sizing:border-box}.dd-handle span{font-weight:bold}.dd-handle:hover{background:#f0f0f0;cursor:pointer;font-weight:bold}.dd-item>button{display:block;position:relative;cursor:pointer;float:left;width:25px;height:20px;margin:5px 0;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:transparent;font-size:12px;line-height:1;text-align:center;font-weight:bold}.dd-item>button:before{content:'+';display:block;position:absolute;width:100%;text-align:center;text-indent:0}.dd-item>button[data-action="collapse"]:before{content:'-'}#nestable2 .dd-item>button{font-family:FontAwesome;height:34px;width:33px;color:#c1c1c1}#nestable2 .dd-item>button:before{content:"\f067"}#nestable2 .dd-item>button[data-action="collapse"]:before{content:"\f068"}.dd-placeholder,.dd-empty{margin:5px 0;padding:0;min-height:30px;background:#f2fbff;border:1px dashed #b6bcbf;box-sizing:border-box;-moz-box-sizing:border-box}.dd-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.dd-dragel{position:absolute;z-index:9999;pointer-events:none}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{box-shadow:2px 4px 6px 0 rgba(0,0,0,0.1)}.nestable-lists{display:block;clear:both;padding:30px 0;width:100%;border:0;border-top:2px solid #ddd;border-bottom:2px solid #ddd}#nestable-menu{padding:0;margin:10px 0 20px 0}#nestable-output,#nestable2-output{width:100%;font-size:.75em;line-height:1.333333em;font-family:lucida grande,lucida sans unicode,helvetica,arial,sans-serif;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box}#nestable2 .dd-handle{color:inherit;border:1px dashed #e7eaec;background:#f3f3f4;padding:10px}#nestable2 span.label{margin-right:10px}#nestable-output,#nestable2-output{font-size:12px;padding:25px;box-sizing:border-box;-moz-box-sizing:border-box}.CodeMirror{border:1px solid #eee;height:auto}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.google-map{height:300px}.gridStyle{border:1px solid #d4d4d4;width:100%;height:400px}.gridStyle2{border:1px solid #d4d4d4;width:500px;height:300px}.ngH eaderCell{border-right:0;border-bottom:1px solid #e7eaec}.ngCell{border-right:0}.ngTopPanel{background:#f5f5f6}.ngRow.even{background:#f9f9f9}.ngRow.selected{background:#ebf2f1}.ngRow{border-bottom:1px solid #e7eaec}.ngCell{background-color:transparent}.ngHeaderCell{border-right:0}#toast-container>.toast{background-image:none!important}#toast-container>.toast:before{position:fixed;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#FFF;padding-right:.5em;margin:auto .5em auto -1.5em}#toast-container>div{box-shadow:0 0 3px #999;opacity:.9;-ms-filter:alpha(opacity = 90);filter:alpha(opacity = 90)}#toast-container>:hover{box-shadow:0 0 4px #999;opacity:1;-ms-filter:alpha(opacity = 100);filter:alpha(opacity = 100);cursor:pointer}.toast{background-color:#1ab394}.toast-success{background-color:#1ab394}.toast-error{background-color:#ed5565}.toast-info{background-color:#23c6c8}.toast-warning{background-color:#f8ac59}.toast-top-full-width{margin-top:20px}.toast-bottom-full-width{margin-bottom:20px}.img-container,.img-preview{overflow:hidden;text-align:center;width:100%}.img-preview-sm{height:130px;width:200px}.forum-post-container .media{margin:10px 10px 10px 10px;padding:20px 10px 20px 10px;border-bottom:1px solid #f1f1f1}.forum-avatar{float:left;margin-right:20px;text-align:center;width:110px}.forum-avatar .img-circle{height:48px;width:48px}.author-info{color:#676a6c;font-size:11px;margin-top:5px;text-align:center}.forum-post-info{padding:9px 12px 6px 12px;background:#f9f9f9;border:1px solid #f1f1f1}.media-body>.media{background:#f9f9f9;border-radius:3px;border:1px solid #f1f1f1}.forum-post-container .media-body .photos{margin:10px 0}.forum-photo{max-width:140px;border-radius:3px}.media-body>.media .forum-avatar{width:70px;margin-right:10px}.media-body>.media .forum-avatar .img-circle{height:38px;width:38px}.mid-icon{font-size:66px}.forum-item{margin:10px 0;padding:10px 0 20px;border-bottom:1px solid #f1f1f1}.views-number{font-size:24px;line-height:18px;font-weight:400}.forum-container,.forum-post-container{padding:30px!important}.forum-item small{color:#999}.forum-item .forum-sub-title{color:#999;margin-left:50px}.forum-title{margin:15px 0 15px 0}.forum-info{text-align:center}.forum-desc{color:#999}.forum-icon{float:left;width:30px;margin-right:20px;text-align:center}a.forum-item-title{color:inherit;display:block;font-size:18px;font-weight:600}a.forum-item-title:hover{color:inherit}.forum-icon .fa{font-size:30px;margin-top:8px;color:#9b9b9b}.forum-item.active .fa{color:#1ab394}.forum-item.active a.forum-item-title{color:#1ab394}@media(max-width :992px){.forum-info{margin:15px 0 10px 0;display:none}.forum-desc{float:none!important}}.vertical-container{width:90%;max-width:1170px;margin:0 auto}.vertical-container::after{content:'';display:table;clear:both}#vertical-timeline{position:relative;padding:0;margin-top:2em;margin-bottom:2em}#vertical-timeline::before{content:'';position:absolute;top:0;left:18px;height:100%;width:4px;background:#f1f1f1}.vertical-timeline-content .btn{float:right}#vertical-timeline.light-timeline:before{background:#e7eaec}.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline.center-orientation .vertical-timeline-content:before{border-color:transparent transparent transparent #f5f5f5}.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline .vertical-timeline-content,.dark-timeline.center-orientation .vertical-timeline-content{background:#f5f5f5}@media only screen and (min-width:1170px){#vertical-timeline.center-orientation{margin-top:3em;margin-bottom:3em}#vertical-timeline.center-orientation:before{left:50%;margin-left:-2px}}@media only screen and (max-width:1170px){.center-orientation.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}}.vertical-timeline-block{position:relative;margin:2em 0}.vertical-timeline-block:after{content:"";display:table;clear:both}.vertical-timeline-block:first-child{margin-top:0}.vertical-timeline-block:last-child{margin-bottom:0}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-block{margin:4em 0}.center-orientation .vertical-timeline-block:first-child{margin-top:0}.center-orientation .vertical-timeline-block:last-child{margin-bottom:0}}.vertical-timeline-icon{position:absolute;top:0;left:0;width:40px;height:40px;border-radius:50%;font-size:16px;border:3px solid #f1f1f1;text-align:center}.vertical-timeline-icon i{display:block;width:24px;height:24px;position:relative;left:50%;top:50%;margin-left:-12px;margin-top:-9px}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-icon{width:50px;height:50px;left:50%;margin-left:-25px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;font-size:19px}.center-orientation .vertical-timeline-icon i{margin-left:-12px;margin-top:-10px}.center-orientation .cssanimations .vertical-timeline-icon.is-hidden{visibility:hidden}}.vertical-timeline-content{position:relative;margin-left:60px;background:white;border-radius:.25em;padding:1em}.vertical-timeline-content:after{content:"";display:table;clear:both}.vertical-timeline-content h2{font-weight:400;margin-top:4px}.vertical-timeline-content p{margin:1em 0;line-height:1.6}.vertical-timeline-content .vertical-date{float:left;font-weight:500}.vertical-date small{color:#1ab394;font-weight:400}.vertical-timeline-content::before{content:'';position:absolute;top:16px;right:100%;height:0;width:0;border:7px solid transparent;border-right:7px solid white}@media only screen and (min-width:768px){.vertical-timeline-content h2{font-size:18px}.vertical-timeline-content p{font-size:13px}}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-content{margin-left:0;padding:1.6em;width:45%}.center-orientation .vertical-timeline-content::before{top:24px;left:100%;border-color:transparent;border-left-color:white}.center-orientation .vertical-timeline-content .btn{float:left}.center-orientation .vertical-timeline-content .vertical-date{position:absolute;width:100%;left:122%;top:2px;font-size:14px}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before{top:24px;left:auto;right:100%;border-color:transparent;border-right-color:white}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date{left:auto;right:122%;text-align:right}.center-orientation .cssanimations .vertical-timeline-content.is-hidden{visibility:hidden}}.sidebard-panel{width:220px;background:#ebebed;padding:10px 20px;position:absolute;right:0}.sidebard-panel .feed-element img.img-circle{width:32px;height:32px}.sidebard-panel .feed-element,.media-body,.sidebard-panel p{font-size:12px}.sidebard-panel .feed-element{margin-top:20px;padding-bottom:0}.sidebard-panel .list-group{margin-bottom:10px}.sidebard-panel .list-group .list-group-item{padding:5px 0;font-size:12px;border:0}.sidebar-content .wrapper,.wrapper.sidebar-content{padding-right:240px!important}#right-sidebar{background-color:#fff;border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;overflow:hidden;position:fixed;top:60px;width:260px!important;z-index:1009;bottom:0;right:-260px}#right-sidebar.sidebar-open{right:0}#right-sidebar.sidebar-open.sidebar-top{top:0;border-top:0}.sidebar-container ul.nav-tabs{border:0}.sidebar-container ul.nav-tabs.navs-4 li{width:25%}.sidebar-container ul.nav-tabs.navs-3 li{width:33.3333%}.sidebar-container ul.nav-tabs.navs-2 li{width:50%}.sidebar-container ul.nav-tabs li{border:0}.sidebar-container ul.nav-tabs li a{border:0;padding:12px 10px;margin:0;border-radius:0;background:#2f4050;color:#fff;text-align:center;border-right:1px solid #334556}.sidebar-container ul.nav-tabs li.active a{border:0;background:#f9f9f9;color:#676a6c;font-weight:bold}.sidebar-container .nav-tabs>li.active>a:hover,.sidebar-container .nav-tabs>li.active>a:focus{border:0}.sidebar-container ul.sidebar-list{margin:0;padding:0}.sidebar-container ul.sidebar-list li{border-bottom:1px solid #e7eaec;padding:15px 20px;list-style:none;font-size:12px}.sidebar-container .sidebar-message:nth-child(2n+2){background:#f9f9f9}.sidebar-container ul.sidebar-list li a{text-decoration:none;color:inherit}.sidebar-container .sidebar-content{padding:15px 20px;font-size:12px}.sidebar-container .sidebar-title{background:#f9f9f9;padding:20px;border-bottom:1px solid #e7eaec}.sidebar-container .sidebar-title h3{margin-bottom:3px;padding-left:2px}.sidebar-container .tab-content h4{margin-bottom:5px}.sidebar-container .sidebar-message>a>.pull-left{margin-right:10px}.sidebar-container .sidebar-message>a{text-decoration:none;color:inherit}.sidebar-container .sidebar-message{padding:15px 20px}.sidebar-container .sidebar-message .message-avatar{height:38px;width:38px;border-radius:50%}.sidebar-container .setings-item{padding:15px 20px;border-bottom:1px solid #e7eaec}body{font-family:"open sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;color:#676a6c;overflow-x:hidden}html,body{height:100%}body.full-height-layout #wrapper,body.full-height-layout #page-wrapper{height:100%}#page-wrapper{min-height:auto}body.boxed-layout #wrapper{background-color:#2f4050;max-width:1200px;margin:0 auto}.top-navigation.boxed-layout #wrapper,.boxed-layout #wrapper.top-navigation{max-width:1300px!important}.block{display:block}a{cursor:pointer}a:hover,a:focus{text-decoration:none}.border-bottom{border-bottom:1px solid #e7eaec!important}.font-bold{font-weight:600}.font-noraml{font-weight:400}.text-uppercase{text-transform:uppercase}.b-r{border-right:1px solid #e7eaec}.hr-line-dashed{border-top:1px dashed #e7eaec;color:#fff;background-color:#fff;height:1px;margin:20px 0}.hr-line-solid{border-bottom:1px solid #e7eaec;background-color:rgba(0,0,0,0);border-style:solid!important;margin-top:15px;margin-bottom:15px}video{width:100%!important;height:auto!important}.gallery>.row>div{margin-bottom:15px}.fancybox img{margin-bottom:5px;width:24%}.note-editor{height:auto!important;min-height:100px;border:solid 1px #e5e6e7}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,0);border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,0.3);outline:0 none}.modal-dialog{z-index:1200}.modal-body{padding:20px 30px 30px 30px}.inmodal .modal-body{background:#f8fafb}.inmodal .modal-header{padding:30px 15px;text-align:center}.animated.modal.fade .modal-dialog{-webkit-transform:none;-ms-transform:none;transform:none}.inmodal .modal-title{font-size:26px}.inmodal .modal-icon{font-size:84px;color:#e2e3e3}.modal-footer{margin-top:0}#wrapper{width:100%;overflow-x:hidden;background-color:#2f4050}.wrapper{padding:0 20px}.wrapper-content{padding:20px}#page-wrapper{padding:0 15px;position:inherit;margin:0 0 0 200px}.title-action{text-align:right;padding-top:30px}.ibox-content h1,.ibox-content h2,.ibox-content h3,.ibox-content h4,.ibox-content h5,.ibox-title h1,.ibox-title h2,.ibox-title h3,.ibox-title h4,.ibox-title h5{margin-top:5px}ul.unstyled,ol.unstyled{list-style:none outside none;margin-left:0}.big-icon{font-size:160px;color:#e5e6e7}.footer{background:none repeat scroll 0 0 white;border-top:1px solid #e7eaec;overflow:hidden;padding:10px 20px;margin:0 -15px;height:36px}.footer.fixed_full{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec}.footer.fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec;margin-left:220px}body.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 0 0 70px}body.mini-navbar.canvas-menu .footer.fixed,body.canvas-menu .footer.fixed{margin:0!important}body.fixed-sidebar.body-small.mini-navbar .footer.fixed{margin:0 0 0 220px}body.body-small .footer.fixed{margin-left:0}.page-heading{border-top:0;padding:0 20px 20px}.panel-heading h1,.panel-heading h2{margin-bottom:5px}.content-tabs{position:relative;height:39px;background:#fafafa;line-height:39px}.content-tabs .roll-nav,.page-tabs-list{position:absolute;width:30px;height:38px;text-align:center;color:#999;z-index:2;top:0}.content-tabs .roll-left{left:0;border-right:solid 1px #eee}.content-tabs .roll-right{right:0;border-left:solid 1px #eee}.content-tabs button{background:#fff;border:0;height:40px;width:40px;outline:0}.content-tabs button:hover{background:#fafafa}nav.page-tabs{margin-left:30px;width:100000px;height:39px;overflow:hidden}nav.page-tabs .page-tabs-content{float:left}.page-tabs a{display:block;float:left;border-right:solid 1px #eee;padding:0 15px}.page-tabs a i:hover{color:#c00}.page-tabs a:hover,.content-tabs .roll-nav:hover{color:#777;background:#f2f2f2;cursor:pointer}.roll-right.tabRight{right:60px}.roll-right.btn-group{right:60px;width:80px;padding:0}.roll-right.btn-group button{width:80px}.roll-right.tabReload{background:#fff;height:38px;width:60px;outline:0}.dropdown-menu-right{left:auto}#content-main{height:calc(100% - 127px);overflow:hidden}.tagsview-hide#content-main{height:calc(100% - 88px);overflow:hidden}.footer-hide#content-main{height:calc(100% - 91px);overflow:hidden}.tagsview-footer-hide#content-main{height:calc(100% - 52px);overflow:hidden}.fixed-nav #content-main{height:calc(100% - 80px);overflow:hidden}.table-bordered{border:1px solid #ebebeb}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{background-color:#f5f5f6;border-bottom-width:1px}.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 #e7e7e7}.table>thead>tr>th{border-bottom:1px solid #ddd;vertical-align:bottom}.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 #e7eaec;line-height:1.42857;padding:8px;vertical-align:middle}.panel.blank-panel{background:0;margin:0}.blank-panel .panel-heading{padding-bottom:0}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background:0;border-color:#ddd #ddd rgba(0,0,0,0);border-bottom:#f3f3f4;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid;border-width:1px;color:#555;cursor:default}.nav.nav-tabs li{background:0;border:0}.nav-tabs>li>a{color:#a7b1c2;font-weight:600;padding:10px 20px 10px 25px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{background-color:#e6e6e6;color:#676a6c}.ui-tab .tab-content{padding:20px 0}.no-padding{padding:0!important}.no-borders{border:none!important}.no-margins{margin:0!important}.no-top-border{border-top:0!important}.ibox-content.text-box{padding-bottom:0;padding-top:15px}.border-left-right{border-left:1px solid #e7eaec;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.border-left{border-left:1px solid #e7eaec;border-right:0;border-top:0;border-bottom:0}.border-right{border-left:none;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.full-width{width:100%!important}.link-block{font-size:12px;padding:10px}.nav.navbar-top-links .link-block a{font-size:12px}.link-block a{font-size:10px;color:inherit}body.mini-navbar .branding{display:none}img.circle-border{border:6px solid #fff;border-radius:50%}.branding{float:left;color:#fff;font-size:18px;font-weight:600;padding:17px 20px;text-align:center;background-color:#1ab394}.login-panel{margin-top:25%}.page-header{padding:20px 0 9px;margin:0 0 20px;border-bottom:1px solid #eee}.fontawesome-icon-list{margin-top:22px}.fontawesome-icon-list .fa-hover a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:#222;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:14px;display:inline-block;text-align:right;margin-right:10px}.fontawesome-icon-list .fa-hover a:hover{background-color:#1d9d74;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:30px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a:hover .text-muted{color:#bbe2d5}.feature-list .col-md-4{margin-bottom:22px}.feature-list h4 .fa:before{vertical-align:-10%;font-size:28px;display:inline-block;width:1.07142857em;text-align:center;margin-right:5px}.ui-draggable .ibox-title{cursor:move}.breadcrumb{background-color:#fff;padding:0;margin-bottom:0}.breadcrumb>li a{color:inherit}.breadcrumb>.active{color:inherit}code{background-color:#f9f2f4;border-radius:4px;color:#ca4440;font-size:90%;padding:2px 4px;white-space:nowrap}.ibox{clear:both;margin-bottom:25px;margin-top:0;padding:0}.ibox.collapsed .ibox-content{display:none}.ibox.collapsed .fa.fa-chevron-up:before{content:"\f078"}.ibox.collapsed .fa.fa-chevron-down:before{content:"\f077"}.ibox:after,.ibox:before{display:table}.ibox-title{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:0;color:inherit;margin-bottom:0;padding:14px 15px 7px;min-height:40px}.ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:1px 0}table.table-mail tr td{padding:12px}.table-mail .check-mail{padding-left:20px}.table-mail .mail-date{padding-right:20px}.star-mail,.check-mail{width:40px}.unread td a,.unread td{font-weight:600;color:inherit}.read td a,.read td{font-weight:normal;color:inherit}.unread td{background-color:#f9f8f8}.ibox-content{clear:both}.ibox-heading{background-color:#f3f6fb;border-bottom:0}.ibox-heading h3{font-weight:200;font-size:24px}.ibox-title h5{display:inline-block;font-size:14px;margin:0 0 7px;padding:0;text-overflow:ellipsis;float:left}.ibox-title .label{float:left;margin-left:4px}.ibox-tools{display:inline-block;float:right;margin-top:0;position:relative;padding:0}.ibox-tools a{cursor:pointer;margin-left:5px;color:#676a6c}.ibox-tools a.btn-primary{color:#fff}.ibox-tools .dropdown-menu>li>a{padding:4px 10px;font-size:12px}.ibox .open>.dropdown-menu{left:auto;right:0}.gray-bg{background-color:#f3f3f4}.white-bg{background-color:#fff}.navy-bg{background-color:#1ab394;color:#fff}.blue-bg{background-color:#1c84c6;color:#fff}.lazur-bg{background-color:#23c6c8;color:#fff}.yellow-bg{background-color:#f8ac59;color:#fff}.red-bg{background-color:#ed5565;color:#fff}.black-bg{background-color:#262626}.panel-primary{border-color:#1ab394}.panel-primary>.panel-heading{background-color:#1ab394;border-color:#1ab394}.panel-success{border-color:#1c84c6}.panel-success>.panel-heading{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.panel-info{border-color:#23c6c8}.panel-info>.panel-heading{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.panel-warning{border-color:#f8ac59}.panel-warning>.panel-heading{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.panel-danger{border-color:#ed5565}.panel-danger>.panel-heading{background-color:#ed5565;border-color:#ed5565;color:#fff}.progress-bar{background-color:#1ab394}.progress-small,.progress-small .progress-bar{height:10px}.progress-small,.progress-mini{margin-top:5px}.progress-mini,.progress-mini .progress-bar{height:5px;margin-bottom:0}.progress-bar-navy-light{background-color:#3dc7ab}.progress-bar-success{background-color:#1c84c6}.progress-bar-info{background-color:#23c6c8}.progress-bar-warning{background-color:#f8ac59}.progress-bar-danger{background-color:#ed5565}.panel-title{font-size:inherit}.jumbotron{border-radius:6px;padding:40px}.jumbotron h1{margin-top:0}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.simple_tag{background-color:#f3f3f4;border:1px solid #e7eaec;border-radius:2px;color:inherit;font-size:10px;margin-right:5px;margin-top:5px;padding:5px 12px;display:inline-block}.img-shadow{box-shadow:0 0 3px 0 #919191}.dashboards\.dashboard_2 nav.navbar,.dashboards\.dashboard_3 nav.navbar,.mailbox\.inbox nav.navbar,.mailbox\.email_view nav.navbar,.mailbox\.email_compose nav.navbar,.dashboards\.dashboard_4_1 nav.navbar{background:#fff}.Dashboard_2 .navbar.navbar-static-top,.Dashboard_3 .navbar.navbar-static-top,.Dashboard_4_1 .navbar.navbar-static-top,.ComposeEmail .navbar.navbar-static-top,.EmailView .navbar.navbar-static-top,.Inbox .navbar.navbar-static-top{background:#fff}a.close-canvas-menu{position:absolute;top:10px;right:15px;z-index:1011;color:#a7b1c2}a.close-canvas-menu:hover{color:#fff}.full-height{height:100%}.fh-breadcrumb{height:calc(100% - 196px);margin:0 -15px;position:relative}.fh-no-breadcrumb{height:calc(100% - 99px);margin:0 -15px;position:relative}.fh-column{background:#fff;height:100%;width:240px;float:left}.modal-backdrop{z-index:2040!important}.modal{z-index:2050!important}.spiner-example{height:200px;padding-top:70px}.p-xxs{padding:5px}.p-xs{padding:10px}.p-sm{padding:15px}.p-m{padding:20px}.p-md{padding:25px}.p-lg{padding:30px}.p-xl{padding:40px}.m-xxs{margin:2px 4px}.m-xs{margin:5px}.m-sm{margin:10px}.m{margin:15px}.m-md{margin:20px}.m-lg{margin:30px}.m-xl{margin:50px}.m-n{margin:0!important}.m-l-none{margin-left:0}.m-l-xs{margin-left:5px}.m-l-sm{margin-left:10px}.m-l{margin-left:15px}.m-l-md{margin-left:20px}.m-l-lg{margin-left:30px}.m-l-xl{margin-left:40px}.m-l-n-xxs{margin-left:-1px}.m-l-n-xs{margin-left:-5px}.m-l-n-sm{margin-left:-10px}.m-l-n{margin-left:-15px}.m-l-n-md{margin-left:-20px}.m-l-n-lg{margin-left:-30px}.m-l-n-xl{margin-left:-40px}.m-t-none{margin-top:0}.m-t-xxs{margin-top:1px}.m-t-xs{margin-top:5px}.m-t-sm{margin-top:10px}.m-t{margin-top:15px}.m-t-md{margin-top:20px}.m-t-lg{margin-top:30px}.m-t-xl{margin-top:40px}.m-t-n-xxs{margin-top:-1px}.m-t-n-xs{margin-top:-5px}.m-t-n-sm{margin-top:-10px}.m-t-n{margin-top:-15px}.m-t-n-md{margin-top:-20px}.m-t-n-lg{margin-top:-30px}.m-t-n-xl{margin-top:-40px}.m-r-none{margin-right:0}.m-r-xxs{margin-right:1px}.m-r-xs{margin-right:5px}.m-r-sm{margin-right:10px}.m-r{margin-right:15px}.m-r-md{margin-right:20px}.m-r-lg{margin-right:30px}.m-r-xl{margin-right:40px}.m-r-n-xxs{margin-right:-1px}.m-r-n-xs{margin-right:-5px}.m-r-n-sm{margin-right:-10px}.m-r-n{margin-right:-15px}.m-r-n-md{margin-right:-20px}.m-r-n-lg{margin-right:-30px}.m-r-n-xl{margin-right:-40px}.m-b-none{margin-bottom:0}.m-b-xxs{margin-bottom:1px}.m-b-xs{margin-bottom:5px}.m-b-sm{margin-bottom:10px}.m-b{margin-bottom:15px}.m-b-md{margin-bottom:20px}.m-b-lg{margin-bottom:30px}.m-b-xl{margin-bottom:40px}.m-b-n-xxs{margin-bottom:-1px}.m-b-n-xs{margin-bottom:-5px}.m-b-n-sm{margin-bottom:-10px}.m-b-n{margin-bottom:-15px}.m-b-n-md{margin-bottom:-20px}.m-b-n-lg{margin-bottom:-30px}.m-b-n-xl{margin-bottom:-40px}.space-15{margin:15px 0}.space-20{margin:20px 0}.space-25{margin:25px 0}.space-30{margin:30px 0}body.modal-open{padding-right:inherit!important}.search-form{margin-top:10px}.search-result h3{margin-bottom:0;color:#1e0fbe}.search-result .search-link{color:#006621}.search-result p{font-size:12px;margin-top:5px}.contact-box{background-color:#fff;border:1px solid #e7eaec;padding:20px;margin-bottom:20px}.contact-box a{color:inherit}.invoice-table tbody>tr>td:last-child,.invoice-table tbody>tr>td:nth-child(4),.invoice-table tbody>tr>td:nth-child(3),.invoice-table tbody>tr>td:nth-child(2){text-align:right}.invoice-table thead>tr>th:last-child,.invoice-table thead>tr>th:nth-child(4),.invoice-table thead>tr>th:nth-child(3),.invoice-table thead>tr>th:nth-child(2){text-align:right}.invoice-total>tbody>tr>td:first-child{text-align:right}.invoice-total>tbody>tr>td{border:0 none}.invoice-total>tbody>tr>td:last-child{border-bottom:1px solid #ddd;text-align:right;width:15%}.middle-box{max-width:400px;z-index:100;margin:0 auto;padding-top:40px}.lockscreen.middle-box{width:200px;padding-top:110px}.loginscreen.middle-box{width:300px}.loginColumns{max-width:800px;margin:0 auto;padding:100px 20px 20px 20px}.passwordBox{max-width:460px;margin:0 auto;padding:100px 20px 20px 20px}.logo-name{color:#e6e6e6;font-size:180px;font-weight:800;letter-spacing:-10px;margin-bottom:0}.middle-box h1{font-size:170px}.wrapper .middle-box{margin-top:140px}.lock-word{z-index:10;position:absolute;top:110px;left:50%;margin-left:-470px}.lock-word span{font-size:100px;font-weight:600;color:#e9e9e9;display:inline-block}.lock-word .first-word{margin-right:160px}.dashboard-header{border-top:0;padding:20px 20px 20px 20px}.dashboard-header h2{margin-top:10px;font-size:26px}.fist-item{border-top:none!important}.statistic-box{margin-top:40px}.dashboard-header .list-group-item span.label{margin-right:10px}.list-group.clear-list .list-group-item{border-top:1px solid #e7eaec;border-bottom:0;border-right:0;border-left:0;padding:10px 0}ul.clear-list:first-child{border-top:none!important}.timeline-item .date i{position:absolute;top:0;right:0;padding:5px;width:30px;text-align:center;border-top:1px solid #e7eaec;border-bottom:1px solid #e7eaec;border-left:1px solid #e7eaec;background:#f8f8f8}.timeline-item .date{text-align:right;width:110px;position:relative;padding-top:30px}.timeline-item .content{border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.timeline-item .content:hover{background:#f6f6f6}ul.notes li,ul.tag-list li{list-style:none}ul.notes li h4{margin-top:20px;font-size:16px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;position:relative}ul.notes li div small{position:absolute;top:5px;right:5px;font-size:10px}ul.notes li div a{position:absolute;right:10px;bottom:10px;color:inherit}ul.notes li{margin:10px 40px 50px 0;float:left}ul.notes li div p{font-size:12px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;box-shadow:5px 5px 2px rgba(33,33,33,0.7)}ul.notes li div{-webkit-transform:rotate(-6deg);-o-transform:rotate(-6deg);-moz-transform:rotate(-6deg)}ul.notes li:nth-child(even) div{-o-transform:rotate(4deg);-webkit-transform:rotate(4deg);-moz-transform:rotate(4deg);position:relative;top:5px}ul.notes li:nth-child(3n) div{-o-transform:rotate(-3deg);-webkit-transform:rotate(-3deg);-moz-transform:rotate(-3deg);position:relative;top:-5px}ul.notes li:nth-child(5n) div{-o-transform:rotate(5deg);-webkit-transform:rotate(5deg);-moz-transform:rotate(5deg);position:relative;top:-10px}ul.notes li div:hover,ul.notes li div:focus{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);position:relative;z-index:5}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:210px;width:210px;padding:1em;box-shadow:5px 5px 7px rgba(33,33,33,0.7);-webkit-transition:-webkit-transform .15s linear}.file-box{float:left;width:220px}.file-manager h5{text-transform:uppercase}.file-manager{list-style:none outside none;margin:0;padding:0}.folder-list li a{color:#666;display:block;padding:5px 0}.folder-list li{border-bottom:1px solid #e7eaec;display:block}.folder-list li i{margin-right:8px;color:#3d4d5d}.category-list li a{color:#666;display:block;padding:5px 0}.category-list li{display:block}.category-list li i{margin-right:8px;color:#3d4d5d}.category-list li a .text-navy{color:#1ab394}.category-list li a .text-primary{color:#1c84c6}.category-list li a .text-info{color:#23c6c8}.category-list li a .text-danger{color:#ef5352}.category-list li a .text-warning{color:#f8ac59}.file-manager h5.tag-title{margin-top:20px}.tag-list li{float:left}.tag-list li a{font-size:10px;background-color:#f3f3f4;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.file{border:1px solid #e7eaec;padding:0;background-color:#fff;position:relative;margin-bottom:20px;margin-right:20px}.file-manager .hr-line-dashed{margin:15px 0}.file .icon,.file .image{height:100px;overflow:hidden}.file .icon{padding:15px 10px;text-align:center}.file-control{color:inherit;font-size:14px;margin-right:10px}.file-control.active{text-decoration:underline}.file .icon i{font-size:70px;color:#dadada}.file .file-name{padding:10px;background-color:#f8f8f8;border-top:1px solid #e7eaec}.file-name small{color:#676a6c}.corner{position:absolute;display:inline-block;width:0;height:0;line-height:0;border:.6em solid transparent;border-right:.6em solid #f1f1f1;border-bottom:.6em solid #f1f1f1;right:0;bottom:0}a.compose-mail{padding:8px 10px}.mail-search{max-width:300px}.profile-content{border-top:none!important}.feed-activity-list .feed-element{border-bottom:1px solid #e7eaec}.feed-element:first-child{margin-top:0}.feed-element{padding-bottom:15px}.feed-element,.feed-element .media{margin-top:15px}.feed-element,.media-body{overflow:hidden}.feed-element>.pull-left{margin-right:10px}.feed-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.feed-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.feed-element .actions{margin-top:10px}.feed-element .photos{margin:10px 0}.feed-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.mail-box{background-color:#fff;border:1px solid #e7eaec;border-top:0;padding:0;margin-bottom:20px}.mail-box-header{background-color:#fff;border:1px solid #e7eaec;border-bottom:0;padding:30px 20px 20px 20px}.mail-box-header h2{margin-top:0}.mailbox-content .tag-list li a{background:#fff}.mail-body{border-top:1px solid #e7eaec;padding:20px}.mail-text{border-top:1px solid #e7eaec}.mail-text .note-toolbar{padding:10px 15px}.mail-body .form-group{margin-bottom:5px}.mail-text .note-editor .note-toolbar{background-color:#f9f8f8}.mail-attachment{border-top:1px solid #e7eaec;padding:20px;font-size:12px}.mailbox-content{background:0;border:0;padding:10px}.mail-ontact{width:23%}.project-people,.project-actions{text-align:right;vertical-align:middle}dd.project-people{text-align:left;margin-top:5px}.project-people img{width:32px;height:32px}.project-title a{font-size:14px;color:#676a6c;font-weight:600}.project-list table tr td{border-top:0;border-bottom:1px solid #e7eaec;padding:15px 10px;vertical-align:middle}.project-manager .tag-list li a{font-size:10px;background-color:white;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.project-files li a{font-size:11px;color:#676a6c;margin-left:10px;line-height:22px}.faq-item{padding:20px;margin-bottom:2px;background:#fff}.faq-question{font-size:18px;font-weight:600;color:#1ab394;display:block}.faq-question:hover{color:#179d82}.faq-answer{margin-top:10px;background:#f3f3f4;border:1px solid #e7eaec;border-radius:3px;padding:15px}.faq-item .tag-item{background:#f3f3f4;padding:2px 6px;font-size:10px;text-transform:uppercase}.message-input{height:90px!important}.chat-avatar{width:36px;height:36px;float:left;margin-right:10px}.chat-user-name{padding:10px}.chat-user{padding:8px 10px;border-bottom:1px solid #e7eaec}.chat-user a{color:inherit}.chat-view{z-index:20012}.chat-users,.chat-statistic{margin-left:-30px}@media(max-width:992px){.chat-users,.chat-statistic{margin-left:0}}.chat-view .ibox-content{padding:0}.chat-message{padding:10px 20px}.message-avatar{height:48px;width:48px;border:1px solid #e7eaec;border-radius:4px;margin-top:1px}.chat-discussion .chat-message.left .message-avatar{float:left;margin-right:10px}.chat-discussion .chat-message.right .message-avatar{float:right;margin-left:10px}.message{background-color:#fff;border:1px solid #e7eaec;text-align:left;display:block;padding:10px 20px;position:relative;border-radius:4px}.chat-discussion .chat-message.left .message-date{float:right}.chat-discussion .chat-message.right .message-date{float:left}.chat-discussion .chat-message.left .message{text-align:left;margin-left:55px}.chat-discussion .chat-message.right .message{text-align:right;margin-right:55px}.message-date{font-size:10px;color:#888}.message-content{display:block}.chat-discussion{background:#eee;padding:15px;height:400px;overflow-y:auto}.chat-users{overflow-y:auto;height:400px}.chat-message-form .form-group{margin-bottom:0}.jstree-open>.jstree-anchor>.fa-folder:before{content:"\f07c"}.jstree-default .jstree-icon.none{width:0}.clients-list{margin-top:20px}.clients-list .tab-pane{position:relative;height:600px}.client-detail{position:relative;height:620px}.clients-list table tr td{height:46px;vertical-align:middle;border:0}.client-link{font-weight:600;color:inherit}.client-link:hover{color:inherit}.client-avatar{width:42px}.client-avatar img{width:28px;height:28px;border-radius:50%}.contact-type{width:20px;color:#c1c3c4}.client-status{text-align:left}.client-detail .vertical-timeline-content p{margin:0}.client-detail .vertical-timeline-icon.gray-bg{color:#a7aaab}.clients-list .nav-tabs>li.active>a,.clients-list .nav-tabs>li.active>a:hover,.clients-list .nav-tabs>li.active>a:focus{border-bottom:1px solid #fff}.blog h2{font-weight:700}.blog h5{margin:0 0 5px 0}.blog .btn{margin:0 0 5px 0}.article h1{font-size:48px;font-weight:700;color:#2f4050}.article p{font-size:15px;line-height:26px}.article-title{text-align:center;margin:60px 0 40px 0}.article .ibox-content{padding:40px}.issue-tracker .btn-link{color:#1ab394}table.issue-tracker tbody tr td{vertical-align:middle;height:50px}.issue-info{width:50%}.issue-info a{font-weight:600;color:#676a6c}.issue-info small{display:block}.team-members{margin:10px 0}.team-members img.img-circle{width:42px;height:42px;margin-bottom:5px}.sortable-list{padding:10px 0}.agile-list{list-style:none;margin:0}.agile-list li{background:#fafafb;border:1px solid #e7eaec;margin:0 0 10px 0;padding:10px;border-radius:2px}.agile-list li:hover{cursor:pointer;background:#fff}.agile-list li.warning-element{border-left:3px solid #f8ac59}.agile-list li.danger-element{border-left:3px solid #ed5565}.agile-list li.info-element{border-left:3px solid #1c84c6}.agile-list li.success-element{border-left:3px solid #1ab394}.agile-detail{margin-top:5px;font-size:12px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}#small-chat{position:fixed;bottom:50px;right:26px;z-index:100}#small-chat .badge{position:absolute;top:-3px;right:-4px}.open-small-chat{height:38px;width:38px;display:block;background:#1ab394;padding:9px 8px;text-align:center;color:#fff;border-radius:50%}.open-small-chat:hover{color:white;background:#1ab394}.small-chat-box{display:none;position:fixed;bottom:50px;right:80px;background:#fff;border:1px solid #e7eaec;width:230px;height:320px;border-radius:4px}.small-chat-box.ng-small-chat{display:block}.body-small .small-chat-box{bottom:70px;right:20px}.small-chat-box.active{display:block}.small-chat-box .heading{background:#2f4050;padding:8px 15px;font-weight:bold;color:#fff}.small-chat-box .chat-date{opacity:.6;font-size:10px;font-weight:normal}.small-chat-box .content{padding:15px 15px}.small-chat-box .content .author-name{font-weight:bold;margin-bottom:3px;font-size:11px}.small-chat-box .content>div{padding-bottom:20px}.small-chat-box .content .chat-message{padding:5px 10px;border-radius:6px;font-size:11px;line-height:14px;max-width:80%;background:#f3f3f4;margin-bottom:10px}.small-chat-box .content .chat-message.active{background:#1ab394;color:#fff}.small-chat-box .content .left{text-align:left;clear:both}.small-chat-box .content .left .chat-message{float:left}.small-chat-box .content .right{text-align:right;clear:both}.small-chat-box .content .right .chat-message{float:right}.small-chat-box .form-chat{padding:10px 10px}.sk-spinner-rotating-plane.sk-spinner{width:30px;height:30px;background-color:#1ab394;margin:0 auto;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-180deg);transform:perspective(120px) rotateX(-180deg) rotateY(-180deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg)}}.sk-spinner-double-bounce.sk-spinner{width:40px;height:40px;position:relative;margin:0 auto}.sk-spinner-double-bounce .sk-double-bounce1,.sk-spinner-double-bounce .sk-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#1ab394;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-spinner-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-wave.sk-spinner{margin:0 auto;width:50px;height:30px;text-align:center;font-size:10px}.sk-spinner-wave div{background-color:#1ab394;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-spinner-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-wave .sk-rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-wave .sk-rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}@-webkit-keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-spinner-wandering-cubes.sk-spinner{margin:0 auto;width:32px;height:32px;position:relative}.sk-spinner-wandering-cubes .sk-cube1,.sk-spinner-wandering-cubes .sk-cube2{background-color:#1ab394;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCubeMove 1.8s infinite ease-in-out;animation:sk-wanderingCubeMove 1.8s infinite ease-in-out}.sk-spinner-wandering-cubes .sk-cube2{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}@-webkit-keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse.sk-spinner{width:40px;height:40px;margin:0 auto;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-spinner-chasing-dots.sk-spinner{margin:0 auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-spinner-chasing-dots .sk-dot1,.sk-spinner-chasing-dots .sk-dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-spinner-chasing-dots .sk-dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.sk-spinner-three-bounce div{width:18px;height:18px;background-color:#1ab394;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:20%;height:20%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out;animation:sk-circleBounceDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-cube-grid.sk-spinner{width:30px;height:30px;margin:0 auto}.sk-spinner-cube-grid .sk-cube{width:33%;height:33%;background-color:#1ab394;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-spinner-cube-grid .sk-cube:nth-child(1){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-spinner-cube-grid .sk-cube:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-spinner-cube-grid .sk-cube:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}@keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}.sk-spinner-wordpress.sk-spinner{background-color:#1ab394;width:30px;height:30px;border-radius:30px;position:relative;margin:0 auto;-webkit-animation:sk-innerCircle 1s linear infinite;animation:sk-innerCircle 1s linear infinite}.sk-spinner-wordpress .sk-inner-circle{display:block;background-color:#fff;width:8px;height:8px;position:absolute;border-radius:8px;top:5px;left:5px}@-webkit-keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sk-spinner-fading-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-fading-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:18%;height:18%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out;animation:sk-circleFadeDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-fading-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-fading-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-fading-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-fading-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-fading-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-fading-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-fading-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-fading-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-fading-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}body.rtls #page-wrapper{margin:0 220px 0 0}body.rtls .nav-second-level li a{padding:7px 35px 7px 10px}body.rtls .ibox-title h5{float:right}body.rtls .pull-right{float:left!important}body.rtls .pull-left{float:right!important}body.rtls .ibox-tools{float:left}body.rtls .stat-percent{float:left}body.rtls .navbar-right{float:left!important}body.rtls .navbar-top-links li:last-child{margin-left:40px;margin-right:0}body.rtls .minimalize-styl-2{float:right;margin:14px 20px 5px 5px}body.rtls .feed-element>.pull-left{margin-left:10px;margin-right:0}body.rtls .timeline-item .date{text-align:left}body.rtls .timeline-item .date i{left:0;right:auto}body.rtls .timeline-item .content{border-right:1px solid #e7eaec;border-left:none}body.rtls .toast-close-button{float:left}body.rtls #toast-container>.toast:before{margin:auto -1.5em auto .5em}body.rtls #toast-container>div{padding:15px 50px 15px 15px}body.rtls .center-orientation .vertical-timeline-icon i{margin-left:0;margin-right:-12px}body.rtls .vertical-timeline-icon i{right:50%;left:auto;margin-left:auto;margin-right:-12px}body.rtls .file-box{float:right}body.rtls ul.notes li{float:right}body.rtls .chat-users,body.rtls .chat-statistic{margin-right:-30px;margin-left:auto}body.rtls .dropdown-menu>li>a{text-align:right}body.rtls .b-r{border-left:1px solid #e7eaec;border-right:0}body.rtls .dd-list .dd-list{padding-right:30px;padding-left:0}body.rtls .dd-item>button{float:right}body.rtls .skin-setttings{margin-right:40px;margin-left:0}body.rtls .skin-setttings{direction:ltr}body.rtls .footer.fixed{margin-right:220px;margin-left:0}@media(max-width :992px){body.rtls .chat-users,body.rtls .chat-statistic{margin-right:0}}body.rtls.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0}body.rtls.top-navigation .navbar-toggle{float:right;margin-left:15px;margin-right:15px}.body-small.rtls.top-navigation .navbar-header{float:none}body.rtls.top-navigation #page-wrapper{margin:0}body.rtls.mini-navbar #page-wrapper{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar #page-wrapper{margin:0}body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 220px 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.body-small.rtls .navbar-fixed-top{margin-right:0}.body-small.rtls .navbar-header{float:right}body.rtls .navbar-top-links li:last-child{margin-left:20px}body.rtls .top-navigation #page-wrapper,body.rtls.mini-navbar .top-navigation #page-wrapper,body.rtls.mini-navbar.top-navigation #page-wrapper{margin:0}body.rtls .top-navigation .footer.fixed,body.rtls.top-navigation .footer.fixed{margin:0}@media(max-width :768px){body.rtls .navbar-top-links li:last-child{margin-left:20px}.body-small.rtls #page-wrapper{position:inherit;margin:0;min-height:1000px}.body-small.rtls .navbar-static-side{display:none;z-index:2001;position:absolute;width:70px}.body-small.rtls.mini-navbar .navbar-static-side{display:block}.rtls.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}}.rtls .ltr-support{direction:ltr}.page-tabs a{color:#999}.page-tabs a i{color:#ccc;margin-left:2px;font-size:13px}.page-tabs a.active{background:#eaedf1;color:#23508e}.page-tabs a.active:hover,.page-tabs a.active i:hover{background:#eaedf1;color:#23508e}@media(min-width :768px){.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{margin-left:auto}}@media(max-width :768px){body.fixed-sidebar .navbar-static-side{display:none}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.lock-word{display:none}.navbar-form-custom{display:none}.navbar-header{display:inline;float:left}.sidebard-panel{z-index:2;position:relative;width:auto;min-height:100%!important}.sidebar-content .wrapper{padding-right:0;z-index:1}.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}.ibox-tools{float:none;text-align:right;display:block}.content-tabs{display:none}#content-main{height:calc(100% - 100px)}.fixed-nav #content-main{height:calc(100% - 38px)}}.navbar-static-side{background:#2f4050}.nav-close{padding:10px;display:block;position:absolute;right:5px;top:5px;font-size:1.4em;cursor:pointer;z-index:10;display:none;color:rgba(255,255,255,.3)}@media(max-width :350px){body.fixed-sidebar.mini-navbar .navbar-static-side{width:0}.nav-close{display:block}#page-wrapper{margin-left:0!important}.timeline-item .date{text-align:left;width:110px;position:relative;padding-top:30px}.timeline-item .date i{position:absolute;top:0;left:15px;padding:5px;width:30px;text-align:center;border:1px solid #e7eaec;background:#f8f8f8}.timeline-item .content{border-left:none;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.nav.navbar-top-links li.dropdown{display:none}.ibox-tools{float:none;text-align:left;display:inline-block}}.ui-jqgrid-titlebar{height:40px;line-height:24px;color:#676a6c;background-color:#f9f9f9;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.ui-jqgrid .ui-jqgrid-title{float:left;margin-left:5px;font-weight:700}.ui-jqgrid .ui-jqgrid-titlebar{position:relative;border-left:0 solid;border-right:0 solid;border-top:0 solid}.social-feed-separated .social-feed-box{margin-left:62px}.social-feed-separated .social-avatar{float:left;padding:0}.social-feed-separated .social-avatar img{width:52px;height:52px;border:1px solid #e7eaec}.social-feed-separated .social-feed-box .social-avatar{padding:15px 15px 0 15px;float:none}.social-feed-box{border:1px solid #e7eaec;background:#fff;margin-bottom:15px}.article .social-feed-box{margin-bottom:0;border-bottom:0}.article .social-feed-box:last-child{margin-bottom:0;border-bottom:1px solid #e7eaec}.article .social-feed-box p{font-size:13px;line-height:18px}.social-action{margin:15px}.social-avatar{padding:15px 15px 0 15px}.social-comment .social-comment{margin-left:45px}.social-avatar img{height:40px;width:40px;margin-right:10px}.social-avatar .media-body a{font-size:14px;display:block}.social-body{padding:15px}.social-body img{margin-bottom:10px}.social-footer{border-top:1px solid #e7eaec;padding:10px 15px;background:#f9f9f9}.social-footer .social-comment img{width:32px;margin-right:10px}.social-comment:first-child{margin-top:0}.social-comment{margin-top:15px}.social-comment textarea{font-size:12px}@media(max-width :1000px){.welcome-message{display:none}}.echarts{height:240px}.checkbox-inline,.radio-inline,.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin:0 15px 0 0;font-size:14px}.navbar-toggle{background-color:#fff}.menuTab{-webkit-transition:all .3s ease-out 0s;transition:all .3s ease-out 0s}@media only screen and (-webkit-min-device-pixel-ratio :2){#content-main{-webkit-overflow-scrolling:touch}}.navbar-header{height:50px}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ab394}@media(min-width :768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.t-bar{padding-bottom:10px}.nopadding{padding:0}.note-editor .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.folder-list li.active a{color:#2791df;background:#f5f5f5}nav .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent;-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;height:50px;font-size:20px;line-height:50px;text-align:center;width:200px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.logo-mini{display:none}.logo-lg{display:block}.roleList{color:#d5d5d5;margin-right:10px;padding-top:10px;line-height:1;white-space:nowrap;overflow:hidden;width:110px}.sidebar-collapse .user-panel{white-space:nowrap;position:relative;width:100%;padding:15px;overflow:hidden}.sidebar-collapse .user-panel .image>img{width:100%;max-width:45px;height:auto}.sidebar-collapse .user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.sidebar-collapse .user-panel>.info a{color:#fff;font-size:12px}.sidebar-collapse .user-panel>.info>p{font-weight:600;margin-bottom:9px;color:#fff;font-size:12px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.nav>li:hover .dropdown-menu{display:block}#content-main.max{height:calc(100% - 110px);overflow:hidden;width:100%;height:100%;left:0;position:absolute;top:0;z-index:9998;margin:0} |
| | | h1,h2,h3,h4,h5,h6{font-weight:100}h1{font-size:30px}h2{font-size:24px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:10px}h3,h4,h5{margin-top:5px;font-weight:600}a:focus{outline:0}.nav>li>a{color:#a7b1c2;font-weight:600;padding:14px 20px 14px 25px}.nav li>a{display:block}.nav.navbar-right>li>a,.nav.navbar-left>li>a{color:#fff;font-size:14px;height:50px;padding:15px 15px}.nav>li.active>a{color:#fff}.nav.navbar-right>li>a>.label,.nav.navbar-left>li>a>.label{position:absolute;top:9px;right:5px;text-align:center;font-size:9px;padding:2px 4px;line-height:.9}.nav.navbar-right>li>a:hover,.nav.navbar-left>li>a:hover{background-color:#367fa9;color:#fff}.navbar-default .nav>li>a:hover,.navbar-default .nav>li>a:focus{background-color:#293846;color:white}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:#fff}.navbar{border:0}.navbar-default{background-color:transparent;border-color:#2f4050;position:relative}.nav.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:16px}body.body-small .navbar-top-links li:last-child{margin-right:10px}.navbar-top-links li a{padding:20px 10px;min-height:50px}.dropdown-menu{border:medium none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:1000;border-radius:0;box-shadow:0 0 3px rgba(86,96,117,0.3)}.dropdown-menu>li>a{border-radius:3px;color:inherit;line-height:25px;margin:4px;text-align:left;font-weight:normal}.dropdown-menu>li>a.font-bold{font-weight:600}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.dropdown-messages,.dropdown-alerts{padding:10px 10px 10px 10px}.dropdown-messages li a,.dropdown-alerts li a{font-size:12px}.dropdown-messages li em,.dropdown-alerts li em{font-size:10px}.nav.navbar-top-links .dropdown-alerts a{font-size:12px}.nav>li.active{border-left:4px solid #19aa8d;background:#293846}.nav.nav-second-level>li.active{border:0}.nav.nav-second-level.collapse[style]{height:auto!important}.nav-header a{color:#dfe4ed}.nav-header .text-muted{color:#8095a8}.minimalize-styl-2{padding:4px 12px;margin:12px 5px 5px 15px;font-size:14px;float:left}.navbar-form-custom{float:left;height:50px;padding:0;width:200px;display:inline-table}.navbar-form-custom .form-group{margin-bottom:0}.nav.navbar-top-links a{font-size:14px}.navbar-form-custom .form-control{background:none repeat scroll 0 0 rgba(0,0,0,0);border:medium none;font-size:14px;height:60px;margin:0;z-index:2000}.count-info .label{line-height:12px;padding:1px 5px;position:absolute;right:6px;top:12px}.arrow{float:right;margin-top:2px}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.nav-second-level li,.nav-third-level li{border-bottom:none!important;padding-left:2px;padding-right:2px}.nav-second-level li a{padding:7px 15px 7px 10px;padding-left:52px}.nav-third-level li a{padding-left:70px}.nav-second-level li:last-child{margin-bottom:10px}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover>.nav-second-level,.mini-navbar .nav li:focus>.nav-second-level{display:block;border-radius:0 2px 2px 0;min-width:140px;height:auto}body.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:0 2px 2px 0}body.mini-navbar .navbar-default .nav>li>.nav-third-level li a{padding-left:31px}.fixed-nav .slimScrollDiv #side-menu{padding-bottom:60px;position:relative}.fixed-sidebar.mini-navbar .slimScrollDiv>*{overflow:visible!important}.fixed-sidebar .slimScrollDiv>*{overflow-y:hidden;overflow-x:visible}.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.canvas-menu.mini-navbar .nav-second-level{background:#293846}.mini-navbar li.active .nav-second-level{left:65px}.navbar-default .special_link a{background:#1ab394;color:white}.navbar-default .special_link a:hover{background:#17987e!important;color:white}.navbar-default .special_link a span.label{background:#fff;color:#1ab394}.navbar-default .landing_link a{background:#1cc09f;color:white}.navbar-default .landing_link a:hover{background:#1ab394!important;color:white}.navbar-default .landing_link a span.label{background:#fff;color:#1cc09f}.logo-element{text-align:center;font-size:18px;font-weight:600;color:white;display:none;padding:18px 0}.navbar-fixed-top{background:#fff;-webkit-transition-duration:.5s;transition-duration:.5s;z-index:2030}.fixed-nav #wrapper{padding-top:60px;box-sizing:border-box}.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.body-small .navbar-fixed-top{margin-left:0}body.mini-navbar .navbar-static-side{width:70px}body.mini-navbar .profile-element,body.mini-navbar .nav-label,body.mini-navbar .navbar-default .nav li a span{display:none}body.canvas-menu .profile-element{display:block}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level{display:none}body.mini-navbar .navbar-default .nav>li>a{font-size:16px}body.mini-navbar .logo-element{display:block}body.canvas-menu .logo-element{display:none}body.mini-navbar .nav-header{padding:0;background-color:#1ab394}body.canvas-menu .nav-header{padding:33px 25px}body.mini-navbar #page-wrapper{margin:0 0 0 70px}body.canvas-menu.mini-navbar #page-wrapper,body.canvas-menu.mini-navbar .footer{margin:0}body.fixed-sidebar .navbar-static-side,body.canvas-menu .navbar-static-side{position:fixed;width:200px;z-index:2001;height:100%}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}body.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.fixed-sidebar.mini-navbar .nav li>.nav-second-level{display:none}.fixed-sidebar.mini-navbar .nav li.active{border-left-width:0}.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{top:0;padding:10px 10px 10px 10px;text-align:center;background-color:#243747}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level{top:40px;font-size:12px;background-color:#2f4050}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{position:absolute;left:70px;display:block;min-width:140px;border-radius:2px}.fixed-sidebar.mini-navbar .nav li.active:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li.active:hover>a>span.nav-label{left:67px}.fixed-sidebar.mini-navbar .nav .nav-second-level a>span,.fixed-sidebar.mini-navbar .nav .nav-third-level a>span{display:inline-block}body.fixed-sidebar.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:3px}body.canvas-menu.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-sidebar.mini-navbar .nav-second-level li a,.canvas-menu.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{position:relative;padding:0;font-size:13px}.fixed-sidebar.mini-navbar li.active .nav-second-level,.canvas-menu.mini-navbar li.active .nav-second-level{left:0}body.canvas-menu nav.navbar-static-side{z-index:2001;background:#2f4050;height:100%;position:fixed;display:none}body.canvas-menu.mini-navbar nav.navbar-static-side{display:block;width:70px}.top-navigation #page-wrapper{margin-left:0}.top-navigation .navbar-nav .dropdown-menu>.active>a{background:white;color:#1ab394;font-weight:bold}.white-bg .navbar-fixed-top,.white-bg .navbar-static-top{background:#fff}.top-navigation .navbar{margin-bottom:0}.top-navigation .nav>li>a{padding:15px 20px;color:#676a6c}.top-navigation .nav>li a:hover,.top-navigation .nav>li a:focus{background:#fff;color:#1ab394}.top-navigation .nav>li.active{background:#fff;border:0}.top-navigation .nav>li.active>a{color:#1ab394}.top-navigation .navbar-right{padding-right:10px}.top-navigation .navbar-nav .dropdown-menu{box-shadow:none;border:1px solid #e7eaec}.top-navigation .dropdown-menu>li>a{margin:0;padding:7px 20px}.navbar .dropdown-menu{margin-top:0}.top-navigation .navbar-brand{background:#1ab394;color:#fff;padding:15px 25px}.top-navigation .navbar-top-links li:last-child{margin-right:0}.top-navigation.mini-navbar #page-wrapper,.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,.mini-navbar .top-navigation #page-wrapper,.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,.canvas-menu #page-wrapper{margin:0}.top-navigation.fixed-nav #wrapper,.fixed-nav #wrapper.top-navigation{margin-top:50px}.top-navigation .footer.fixed{margin-left:0!important}.top-navigation .wrapper.wrapper-content{padding:40px}.top-navigation.body-small .wrapper.wrapper-content,.body-small .top-navigation .wrapper.wrapper-content{padding:40px 0 40px 0}.navbar-toggle{background-color:#1ab394;color:#fff;padding:6px 12px;font-size:14px}.top-navigation .navbar-nav .open .dropdown-menu>li>a,.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header{padding:10px 15px 10px 20px}@media(max-width :768px){.top-navigation .navbar-header{display:block;float:none}}.menu-visible-lg,.menu-visible-md{display:none!important}@media(min-width :1200px){.menu-visible-lg{display:block!important}}@media(min-width :992px){.menu-visible-md{display:block!important}}@media(max-width :767px){.menu-visible-md{display:block!important}.menu-visible-lg{display:block!important}}.btn{border-radius:3px}.float-e-margins .btn{margin-bottom:5px}.btn-w-m{min-width:120px}.btn-primary.btn-outline{color:#1ab394}.btn-success.btn-outline{color:#1c84c6}.btn-info.btn-outline{color:#23c6c8}.btn-warning.btn-outline{color:#f8ac59}.btn-danger.btn-outline{color:#ed5565}.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-info.btn-outline:hover,.btn-warning.btn-outline:hover,.btn-danger.btn-outline:hover{color:#fff}.btn-primary{background-color:#1ab394;border-color:#1ab394;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-color:#18a689;border-color:#18a689;color:#fff}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary.active[disabled],fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#1dc5a3;border-color:#1dc5a3}.btn-success{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-color:#1a7bb9;border-color:#1a7bb9;color:#fff}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success.active[disabled],fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#1f90d8;border-color:#1f90d8}.btn-info{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-color:#21b9bb;border-color:#21b9bb;color:#fff}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info.active[disabled],fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#26d7d9;border-color:#26d7d9}.btn-default{background-color:#f4f4f4;border-color:#ddd;color:#444}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#e7e7e7;border-color:#e7e7e7;color:#444}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default.active[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#ccc;border-color:#ccc}.btn-warning{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-color:#f7a54a;border-color:#f7a54a;color:#fff}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning.active[disabled],fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f9b66d;border-color:#f9b66d}.btn-danger{background-color:#ed5565;border-color:#ed5565;color:#fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#ec4758;border-color:#ec4758;color:#fff}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger.active[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#ef6776;border-color:#ef6776}.btn-link{color:inherit}.btn-link:hover,.btn-link:focus,.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{color:#1ab394;text-decoration:none}.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{background-image:none}.btn-link.disabled,.btn-link.disabled:hover,.btn-link.disabled:focus,.btn-link.disabled:active,.btn-link.disabled.active,.btn-link[disabled],.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link[disabled]:active,.btn-link.active[disabled],fieldset[disabled] .btn-link,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link.active{color:#cacaca}.btn-white{color:inherit;background:white;border:1px solid #e7eaec}.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:inherit;border:1px solid #d2d2d2}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,0.15) inset}.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{background-image:none}.btn-white.disabled,.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled:active,.btn-white.disabled.active,.btn-white[disabled],.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled]:active,.btn-white.active[disabled],fieldset[disabled] .btn-white,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white:active,fieldset[disabled] .btn-white.active{color:#cacaca}.form-control,.has-error .form-control:focus,.has-success .form-control:focus,.has-warning .form-control:focus,.navbar-collapse,.navbar-form,.navbar-form-custom .form-control:focus,.navbar-form-custom .form-control:hover,.open .btn.dropdown-toggle,.panel,.popover,.progress,.progress-bar{box-shadow:none}.btn-outline{color:inherit;background-color:transparent;-webkit-transition:all .5s;transition:all .5s}.btn-rounded{border-radius:50px}.btn-large-dim{width:90px;height:90px;font-size:42px}button.dim{display:inline-block;color:#fff;text-decoration:none;text-transform:uppercase;text-align:center;padding-top:6px;margin-right:10px;position:relative;cursor:pointer;border-radius:5px;font-weight:600;margin-bottom:20px!important}button.dim:active{top:3px}button.btn-primary.dim{box-shadow:inset 0 0 0 #16987e,0px 5px 0 0 #16987e,0px 10px 5px #999}button.btn-primary.dim:active{box-shadow:inset 0 0 0 #16987e,0px 2px 0 0 #16987e,0px 5px 3px #999}button.btn-default.dim{box-shadow:inset 0 0 0 #b3b3b3,0px 5px 0 0 #b3b3b3,0px 10px 5px #999}button.btn-default.dim:active{box-shadow:inset 0 0 0 #b3b3b3,0px 2px 0 0 #b3b3b3,0px 5px 3px #999}button.btn-warning.dim{box-shadow:inset 0 0 0 #f79d3c,0px 5px 0 0 #f79d3c,0px 10px 5px #999}button.btn-warning.dim:active{box-shadow:inset 0 0 0 #f79d3c,0px 2px 0 0 #f79d3c,0px 5px 3px #999}button.btn-info.dim{box-shadow:inset 0 0 0 #1eacae,0px 5px 0 0 #1eacae,0px 10px 5px #999}button.btn-info.dim:active{box-shadow:inset 0 0 0 #1eacae,0px 2px 0 0 #1eacae,0px 5px 3px #999}button.btn-success.dim{box-shadow:inset 0 0 0 #1872ab,0px 5px 0 0 #1872ab,0px 10px 5px #999}button.btn-success.dim:active{box-shadow:inset 0 0 0 #1872ab,0px 2px 0 0 #1872ab,0px 5px 3px #999}button.btn-danger.dim{box-shadow:inset 0 0 0 #ea394c,0px 5px 0 0 #ea394c,0px 10px 5px #999}button.btn-danger.dim:active{box-shadow:inset 0 0 0 #ea394c,0px 2px 0 0 #ea394c,0px 5px 3px #999}button.dim:before{font-size:50px;line-height:1em;font-weight:normal;color:#fff;display:block;padding-top:10px}button.dim:active:before{top:7px;font-size:50px}.label{background-color:#d1dade;color:#5e5e5e;font-size:10px;font-weight:600;padding:3px 8px;text-shadow:none}.badge{background-color:#d1dade;color:#5e5e5e;font-size:11px;font-weight:600;padding-bottom:4px;padding-left:6px;padding-right:6px;text-shadow:none}.label-primary,.badge-primary{background-color:#1ab394;color:#fff}.label-success,.badge-success{background-color:#1c84c6;color:#fff}.label-warning,.badge-warning{background-color:#f8ac59;color:#fff}.label-warning-light,.badge-warning-light{background-color:#f8ac59;color:#fff}.label-danger,.badge-danger{background-color:#ed5565;color:#fff}.label-info,.badge-info{background-color:#23c6c8;color:#fff}.label-inverse,.badge-inverse{background-color:#262626;color:#fff}.label-white,.badge-white{background-color:#fff;color:#5e5e5e}.label-white,.badge-disable{background-color:#2a2e36;color:#8b91a0}.onoffswitch{position:relative;width:64px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:2px}.onoffswitch-inner{width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:10px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:10px;background-color:#fff;color:#999;text-align:right}.onoffswitch-switch{width:20px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:2px;position:absolute;top:0;bottom:0;right:44px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.chosen-container-single .chosen-single{background:#fff;box-shadow:none;-moz-box-sizing:border-box;background-color:#fff;border:1px solid #cbd5dd;border-radius:2px;cursor:text;height:auto!important;margin:0;min-height:30px;overflow:hidden;padding:4px 12px;position:relative;width:100%}.chosen-container-multi .chosen-choices li.search-choice{background:#f1f1f1;border:1px solid #ededed;border-radius:2px;box-shadow:none;color:#333;cursor:default;line-height:13px;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#f4f4f4;border-color:#ddd;color:inherit;cursor:default;z-index:2}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:inherit;float:left;line-height:1.42857;margin-left:-1px;padding:4px 10px;position:relative;text-decoration:none}.tooltip-inner{background-color:#2f4050;word-break:break-all;overflow-wrap:break-word}.tooltip.top .tooltip-arrow{border-top-color:#2f4050}.tooltip.right .tooltip-arrow{border-right-color:#2f4050}.tooltip.bottom .tooltip-arrow{border-bottom-color:#2f4050}.tooltip.left .tooltip-arrow{border-left-color:#2f4050}.easypiechart{position:relative;text-align:center}.easypiechart .h2{margin-left:10px;margin-top:10px;display:inline-block}.easypiechart canvas{top:0;left:0}.easypiechart .easypie-text{line-height:1;position:absolute;top:33px;width:100%;z-index:1}.easypiechart img{margin-top:-4px}.jqstooltip{box-sizing:content-box}.fc-state-default{background-color:#fff;background-image:none;background-repeat:repeat-x;box-shadow:none;color:#333;text-shadow:none}.fc-state-default{border:1px solid}.fc-button{color:inherit;border:1px solid #e7eaec;cursor:pointer;display:inline-block;height:1.9em;line-height:1.9em;overflow:hidden;padding:0 .6em;position:relative;white-space:nowrap}.fc-state-active{background-color:#1ab394;border-color:#1ab394;color:#fff}.fc-header-title h2{font-size:16px;font-weight:600;color:inherit}.fc-content .fc-widget-header,.fc-content .fc-widget-content{border-color:#e7eaec;font-weight:normal}.fc-border-separate tbody{background-color:#f8f8f8}.fc-state-highlight{background:none repeat scroll 0 0 #fcf8e3}.external-event{padding:5px 10px;border-radius:2px;cursor:pointer;margin-bottom:5px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-radius:2px}.fc-event,.fc-agenda .fc-event-time,.fc-event a{padding:4px 6px;background-color:#1ab394;border-color:#1ab394}.fc-event-time,.fc-event-title{color:#717171;padding:0 1px}.ui-calendar .fc-event-time,.ui-calendar .fc-event-title{color:#fff}.chat-activity-list .chat-element{border-bottom:1px solid #e7eaec}.chat-element:first-child{margin-top:0}.chat-element{padding-bottom:15px}.chat-element,.chat-element .media{margin-top:15px}.chat-element,.media-body{overflow:hidden}.media-body{display:block;width:auto}.chat-element>.pull-left{margin-right:10px}.chat-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.chat-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.chat-element .actions{margin-top:10px}.chat-element .photos{margin:10px 0}.right.chat-element>.pull-right{margin-left:10px}.chat-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #b3a9a9}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0;color:#777}.panel .slidedown .glyphicon,.chat .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{background-color:#1ab394;border-color:#1ab394;color:#fff;z-index:2}.list-group-item-heading{margin-top:10px}.list-group-item-text{margin:0 0 10px;color:inherit;font-size:12px;line-height:inherit}.no-padding .list-group-item{border-left:none;border-right:0;border-bottom:0}.no-padding .list-group-item:first-child{border-left:none;border-right:0;border-bottom:0;border-top:0}.no-padding .list-group{margin-bottom:0}.list-group-item{background-color:inherit;border:1px solid #e7eaec;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.elements-list .list-group-item{border-left:none;border-right:0;padding:15px 25px}.elements-list .list-group-item:first-child{border-left:none;border-right:0;border-top:none!important}.elements-list .list-group{margin-bottom:0}.elements-list a{color:inherit}.elements-list .list-group-item.active,.elements-list .list-group-item:hover{background:#f3f3f4;color:inherit;border-color:#e7eaec;border-radius:0}.elements-list li.active{-webkit-transition:none;transition:none}.element-detail-box{padding:25px}.flot-chart{display:block;height:200px}.widget .flot-chart.dashboard-chart{display:block;height:120px;margin-top:40px}.flot-chart.dashboard-chart{display:block;height:180px;margin-top:40px}.flot-chart-content{width:100%;height:100%}.flot-chart-pie-content{width:200px;height:200px;margin:auto}.jqstooltip{position:absolute;display:block;left:0;top:0;visibility:hidden;background:#2b303a;background-color:rgba(43,48,58,0.8);color:white;text-align:left;white-space:nowrap;z-index:10000;padding:5px 5px 5px 5px;min-height:22px;border-radius:3px}.jqsfield{color:white;text-align:left}.h-200{min-height:200px}.legendLabel{padding-left:5px}.stat-list li:first-child{margin-top:0}.stat-list{list-style:none;padding:0;margin:0}.stat-percent{float:right}.stat-list li{margin-top:15px;position:relative}table.dataTable thead .sorting,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background:transparent}table.dataTable thead .sorting_asc:after{float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,0.5)}.dataTables_wrapper{padding-bottom:30px}.img-circle{border-radius:50%}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^="col-"]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.css-animation-box h1{font-size:44px}.animation-efect-links a{padding:4px 6px;font-size:12px}#animation_box{background-color:#f9f8f8;border-radius:16px;width:80%;margin:0 auto;padding-top:80px}.animation-text-box{position:absolute;margin-top:40px;left:50%;margin-left:-100px;width:200px}.animation-text-info{position:absolute;margin-top:-60px;left:50%;margin-left:-100px;width:200px;font-size:10px}.animation-text-box h2{font-size:54px;font-weight:600;margin-bottom:5px}.animation-text-box p{font-size:12px;text-transform:uppercase}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#1ab394;position:fixed;z-index:2000;top:0;width:100%;height:2px}.pace-inactive{display:none}.widget{border-radius:5px;padding:15px 20px;margin-bottom:10px;margin-top:10px}.widget.style1 h2{font-size:30px}.widget h2,.widget h3{margin-top:5px;margin-bottom:0}.widget-text-box{padding:20px;border:1px solid #e7eaec;background:#fff}.widget-head-color-box{border-radius:5px 5px 0 0;margin-top:10px}.widget .flot-chart{height:100px}.vertical-align div{display:inline-block;vertical-align:middle}.vertical-align h2,.vertical-align h3{margin:0}.todo-list{list-style:none outside none;margin:0;padding:0;font-size:14px}.todo-list.small-list{font-size:12px}.todo-list.small-list>li{background:#f3f3f4;border-left:none;border-right:0;border-radius:4px;color:inherit;margin-bottom:2px;padding:6px 6px 6px 12px}.todo-list.small-list .btn-xs,.todo-list.small-list .btn-group-xs>.btn{border-radius:5px;font-size:10px;line-height:1.5;padding:1px 2px 1px 5px}.todo-list>li{background:#f3f3f4;border-left:6px solid #e7eaec;border-right:6px solid #e7eaec;border-radius:4px;color:inherit;margin-bottom:2px;padding:10px}.todo-list .handle{cursor:move;display:inline-block;font-size:16px;margin:0 5px}.todo-list>li .label{font-size:9px;margin-left:10px}.check-link{font-size:16px}.todo-completed{text-decoration:line-through}.geo-statistic h1{font-size:36px;margin-bottom:0}.glyphicon.fa{font-family:"FontAwesome"}.inline{display:inline-block!important}.input-s-sm{width:120px}.input-s{width:200px}.input-s-lg{width:250px}.i-checks{padding-left:0}.form-control,.single-line{background:#fff none;border:1px solid #e5e6e7;border-radius:4px;color:inherit;display:block;padding:3px 6px 4px;-webkit-transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;width:100%;height:31px;font-size:14px}.form-control.kv-fileinput-caption{height:34px!important}.form-control:focus,.single-line:focus{border-color:#3c8dbc!important}.has-success .form-control{border-color:#1ab394}.has-warning .form-control{border-color:#f8ac59}.has-error .form-control{border-color:#ed5565}.has-success .control-label{color:#1ab394}.has-warning .control-label{color:#f8ac59}.has-error .control-label{color:#ed5565}.input-group-addon{background-color:#fff;border:1px solid #e5e6e7;border-radius:4px;color:inherit;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.spinner-buttons.input-group-btn .btn-xs{line-height:1.13}.spinner-buttons.input-group-btn{width:20%}.noUi-connect{background:none repeat scroll 0 0 #1ab394;box-shadow:none}.slider_red .noUi-connect{background:none repeat scroll 0 0 #ed5565;box-shadow:none}.ui-sortable .ibox-title{cursor:move}.ui-sortable-placeholder{border:1px dashed #cecece!important;visibility:visible!important;background:#e7eaec}.ibox.ui-sortable-placeholder{margin:0 0 23px!important}.tabs-container .panel-body{background:#fff;border:1px solid #e7eaec;border-radius:2px;padding:20px;position:relative}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent;background-color:#fff}.tabs-container .nav-tabs>li{float:left;margin-bottom:-1px}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent}.tabs-container .nav-tabs{border-bottom:1px solid #e7eaec}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .tabs-left .tab-pane .panel-body,.tabs-container .tabs-right .tab-pane .panel-body{border-top:1px solid #e7eaec}.tabs-container .nav-tabs>li a:hover{background:transparent;border-color:transparent}.tabs-container .tabs-below>.nav-tabs,.tabs-container .tabs-right>.nav-tabs,.tabs-container .tabs-left>.nav-tabs{border-bottom:0}.tabs-container .tabs-left .panel-body{position:static}.tabs-container .tabs-left>.nav-tabs,.tabs-container .tabs-right>.nav-tabs{width:20%}.tabs-container .tabs-left .panel-body{width:80%;margin-left:20%}.tabs-container .tabs-right .panel-body{width:80%;margin-right:20%}.tabs-container .tab-content>.tab-pane,.tabs-container .pill-content>.pill-pane{display:none}.tabs-container .tab-content>.active,.tabs-container .pill-content>.active{display:block}.tabs-container .tabs-below>.nav-tabs{border-top:1px solid #e7eaec}.tabs-container .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-container .tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-container .tabs-below>.nav-tabs>li>a:hover,.tabs-container .tabs-below>.nav-tabs>li>a:focus{border-top-color:#e7eaec;border-bottom-color:transparent}.tabs-container .tabs-left>.nav-tabs>li,.tabs-container .tabs-right>.nav-tabs>li{float:none}.tabs-container .tabs-left>.nav-tabs>li>a,.tabs-container .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-container .tabs-left>.nav-tabs{float:left;margin-right:19px}.tabs-container .tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-container .tabs-left>.nav-tabs .active>a,.tabs-container .tabs-left>.nav-tabs .active>a:hover,.tabs-container .tabs-left>.nav-tabs .active>a:focus{border-color:#e7eaec transparent #e7eaec #e7eaec;border-right-color:#fff}.tabs-container .tabs-right>.nav-tabs{float:right;margin-left:19px}.tabs-container .tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-container .tabs-right>.nav-tabs .active>a,.tabs-container .tabs-right>.nav-tabs .active>a:hover,.tabs-container .tabs-right>.nav-tabs .active>a:focus{border-color:#e7eaec #e7eaec #e7eaec transparent;border-left-color:#fff;z-index:1}.onoffswitch{position:relative;width:54px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:3px}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;padding:0;font-size:10px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:7px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:7px;background-color:#fff;color:#919191;text-align:right}.onoffswitch-switch{display:block;width:18px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:3px;position:absolute;top:0;bottom:0;right:36px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.dd{position:relative;display:block;margin:0;padding:0;list-style:none;font-size:13px;line-height:20px}.dd-list{display:block;position:relative;margin:0;padding:0;list-style:none}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-item,.dd-empty,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;font-size:13px;line-height:20px}.dd-handle{display:block;margin:5px 0;padding:5px 10px;color:#333;text-decoration:none;border:1px solid #e7eaec;background:#f5f5f5;border-radius:3px;box-sizing:border-box;-moz-box-sizing:border-box}.dd-handle span{font-weight:bold}.dd-handle:hover{background:#f0f0f0;cursor:pointer;font-weight:bold}.dd-item>button{display:block;position:relative;cursor:pointer;float:left;width:25px;height:20px;margin:5px 0;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:transparent;font-size:12px;line-height:1;text-align:center;font-weight:bold}.dd-item>button:before{content:'+';display:block;position:absolute;width:100%;text-align:center;text-indent:0}.dd-item>button[data-action="collapse"]:before{content:'-'}#nestable2 .dd-item>button{font-family:FontAwesome;height:34px;width:33px;color:#c1c1c1}#nestable2 .dd-item>button:before{content:"\f067"}#nestable2 .dd-item>button[data-action="collapse"]:before{content:"\f068"}.dd-placeholder,.dd-empty{margin:5px 0;padding:0;min-height:30px;background:#f2fbff;border:1px dashed #b6bcbf;box-sizing:border-box;-moz-box-sizing:border-box}.dd-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.dd-dragel{position:absolute;z-index:9999;pointer-events:none}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{box-shadow:2px 4px 6px 0 rgba(0,0,0,0.1)}.nestable-lists{display:block;clear:both;padding:30px 0;width:100%;border:0;border-top:2px solid #ddd;border-bottom:2px solid #ddd}#nestable-menu{padding:0;margin:10px 0 20px 0}#nestable-output,#nestable2-output{width:100%;font-size:.75em;line-height:1.333333em;font-family:lucida grande,lucida sans unicode,helvetica,arial,sans-serif;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box}#nestable2 .dd-handle{color:inherit;border:1px dashed #e7eaec;background:#f3f3f4;padding:10px}#nestable2 span.label{margin-right:10px}#nestable-output,#nestable2-output{font-size:12px;padding:25px;box-sizing:border-box;-moz-box-sizing:border-box}.CodeMirror{border:1px solid #eee;height:auto}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.google-map{height:300px}.gridStyle{border:1px solid #d4d4d4;width:100%;height:400px}.gridStyle2{border:1px solid #d4d4d4;width:500px;height:300px}.ngH eaderCell{border-right:0;border-bottom:1px solid #e7eaec}.ngCell{border-right:0}.ngTopPanel{background:#f5f5f6}.ngRow.even{background:#f9f9f9}.ngRow.selected{background:#ebf2f1}.ngRow{border-bottom:1px solid #e7eaec}.ngCell{background-color:transparent}.ngHeaderCell{border-right:0}#toast-container>.toast{background-image:none!important}#toast-container>.toast:before{position:fixed;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#FFF;padding-right:.5em;margin:auto .5em auto -1.5em}#toast-container>div{box-shadow:0 0 3px #999;opacity:.9;-ms-filter:alpha(opacity = 90);filter:alpha(opacity = 90)}#toast-container>:hover{box-shadow:0 0 4px #999;opacity:1;-ms-filter:alpha(opacity = 100);filter:alpha(opacity = 100);cursor:pointer}.toast{background-color:#1ab394}.toast-success{background-color:#1ab394}.toast-error{background-color:#ed5565}.toast-info{background-color:#23c6c8}.toast-warning{background-color:#f8ac59}.toast-top-full-width{margin-top:20px}.toast-bottom-full-width{margin-bottom:20px}.img-container,.img-preview{overflow:hidden;text-align:center;width:100%}.img-preview-sm{height:130px;width:200px}.forum-post-container .media{margin:10px 10px 10px 10px;padding:20px 10px 20px 10px;border-bottom:1px solid #f1f1f1}.forum-avatar{float:left;margin-right:20px;text-align:center;width:110px}.forum-avatar .img-circle{height:48px;width:48px}.author-info{color:#676a6c;font-size:11px;margin-top:5px;text-align:center}.forum-post-info{padding:9px 12px 6px 12px;background:#f9f9f9;border:1px solid #f1f1f1}.media-body>.media{background:#f9f9f9;border-radius:3px;border:1px solid #f1f1f1}.forum-post-container .media-body .photos{margin:10px 0}.forum-photo{max-width:140px;border-radius:3px}.media-body>.media .forum-avatar{width:70px;margin-right:10px}.media-body>.media .forum-avatar .img-circle{height:38px;width:38px}.mid-icon{font-size:66px}.forum-item{margin:10px 0;padding:10px 0 20px;border-bottom:1px solid #f1f1f1}.views-number{font-size:24px;line-height:18px;font-weight:400}.forum-container,.forum-post-container{padding:30px!important}.forum-item small{color:#999}.forum-item .forum-sub-title{color:#999;margin-left:50px}.forum-title{margin:15px 0 15px 0}.forum-info{text-align:center}.forum-desc{color:#999}.forum-icon{float:left;width:30px;margin-right:20px;text-align:center}a.forum-item-title{color:inherit;display:block;font-size:18px;font-weight:600}a.forum-item-title:hover{color:inherit}.forum-icon .fa{font-size:30px;margin-top:8px;color:#9b9b9b}.forum-item.active .fa{color:#1ab394}.forum-item.active a.forum-item-title{color:#1ab394}@media(max-width :992px){.forum-info{margin:15px 0 10px 0;display:none}.forum-desc{float:none!important}}.vertical-container{width:90%;max-width:1170px;margin:0 auto}.vertical-container::after{content:'';display:table;clear:both}#vertical-timeline{position:relative;padding:0;margin-top:2em;margin-bottom:2em}#vertical-timeline::before{content:'';position:absolute;top:0;left:18px;height:100%;width:4px;background:#f1f1f1}.vertical-timeline-content .btn{float:right}#vertical-timeline.light-timeline:before{background:#e7eaec}.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline.center-orientation .vertical-timeline-content:before{border-color:transparent transparent transparent #f5f5f5}.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline .vertical-timeline-content,.dark-timeline.center-orientation .vertical-timeline-content{background:#f5f5f5}@media only screen and (min-width:1170px){#vertical-timeline.center-orientation{margin-top:3em;margin-bottom:3em}#vertical-timeline.center-orientation:before{left:50%;margin-left:-2px}}@media only screen and (max-width:1170px){.center-orientation.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}}.vertical-timeline-block{position:relative;margin:2em 0}.vertical-timeline-block:after{content:"";display:table;clear:both}.vertical-timeline-block:first-child{margin-top:0}.vertical-timeline-block:last-child{margin-bottom:0}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-block{margin:4em 0}.center-orientation .vertical-timeline-block:first-child{margin-top:0}.center-orientation .vertical-timeline-block:last-child{margin-bottom:0}}.vertical-timeline-icon{position:absolute;top:0;left:0;width:40px;height:40px;border-radius:50%;font-size:16px;border:3px solid #f1f1f1;text-align:center}.vertical-timeline-icon i{display:block;width:24px;height:24px;position:relative;left:50%;top:50%;margin-left:-12px;margin-top:-9px}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-icon{width:50px;height:50px;left:50%;margin-left:-25px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;font-size:19px}.center-orientation .vertical-timeline-icon i{margin-left:-12px;margin-top:-10px}.center-orientation .cssanimations .vertical-timeline-icon.is-hidden{visibility:hidden}}.vertical-timeline-content{position:relative;margin-left:60px;background:white;border-radius:.25em;padding:1em}.vertical-timeline-content:after{content:"";display:table;clear:both}.vertical-timeline-content h2{font-weight:400;margin-top:4px}.vertical-timeline-content p{margin:1em 0;line-height:1.6}.vertical-timeline-content .vertical-date{float:left;font-weight:500}.vertical-date small{color:#1ab394;font-weight:400}.vertical-timeline-content::before{content:'';position:absolute;top:16px;right:100%;height:0;width:0;border:7px solid transparent;border-right:7px solid white}@media only screen and (min-width:768px){.vertical-timeline-content h2{font-size:18px}.vertical-timeline-content p{font-size:13px}}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-content{margin-left:0;padding:1.6em;width:45%}.center-orientation .vertical-timeline-content::before{top:24px;left:100%;border-color:transparent;border-left-color:white}.center-orientation .vertical-timeline-content .btn{float:left}.center-orientation .vertical-timeline-content .vertical-date{position:absolute;width:100%;left:122%;top:2px;font-size:14px}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before{top:24px;left:auto;right:100%;border-color:transparent;border-right-color:white}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date{left:auto;right:122%;text-align:right}.center-orientation .cssanimations .vertical-timeline-content.is-hidden{visibility:hidden}}.sidebard-panel{width:220px;background:#ebebed;padding:10px 20px;position:absolute;right:0}.sidebard-panel .feed-element img.img-circle{width:32px;height:32px}.sidebard-panel .feed-element,.media-body,.sidebard-panel p{font-size:12px}.sidebard-panel .feed-element{margin-top:20px;padding-bottom:0}.sidebard-panel .list-group{margin-bottom:10px}.sidebard-panel .list-group .list-group-item{padding:5px 0;font-size:12px;border:0}.sidebar-content .wrapper,.wrapper.sidebar-content{padding-right:240px!important}#right-sidebar{background-color:#fff;border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;overflow:hidden;position:fixed;top:60px;width:260px!important;z-index:1009;bottom:0;right:-260px}#right-sidebar.sidebar-open{right:0}#right-sidebar.sidebar-open.sidebar-top{top:0;border-top:0}.sidebar-container ul.nav-tabs{border:0}.sidebar-container ul.nav-tabs.navs-4 li{width:25%}.sidebar-container ul.nav-tabs.navs-3 li{width:33.3333%}.sidebar-container ul.nav-tabs.navs-2 li{width:50%}.sidebar-container ul.nav-tabs li{border:0}.sidebar-container ul.nav-tabs li a{border:0;padding:12px 10px;margin:0;border-radius:0;background:#2f4050;color:#fff;text-align:center;border-right:1px solid #334556}.sidebar-container ul.nav-tabs li.active a{border:0;background:#f9f9f9;color:#676a6c;font-weight:bold}.sidebar-container .nav-tabs>li.active>a:hover,.sidebar-container .nav-tabs>li.active>a:focus{border:0}.sidebar-container ul.sidebar-list{margin:0;padding:0}.sidebar-container ul.sidebar-list li{border-bottom:1px solid #e7eaec;padding:15px 20px;list-style:none;font-size:12px}.sidebar-container .sidebar-message:nth-child(2n+2){background:#f9f9f9}.sidebar-container ul.sidebar-list li a{text-decoration:none;color:inherit}.sidebar-container .sidebar-content{padding:15px 20px;font-size:12px}.sidebar-container .sidebar-title{background:#f9f9f9;padding:20px;border-bottom:1px solid #e7eaec}.sidebar-container .sidebar-title h3{margin-bottom:3px;padding-left:2px}.sidebar-container .tab-content h4{margin-bottom:5px}.sidebar-container .sidebar-message>a>.pull-left{margin-right:10px}.sidebar-container .sidebar-message>a{text-decoration:none;color:inherit}.sidebar-container .sidebar-message{padding:15px 20px}.sidebar-container .sidebar-message .message-avatar{height:38px;width:38px;border-radius:50%}.sidebar-container .setings-item{padding:15px 20px;border-bottom:1px solid #e7eaec}body{font-family:"open sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;color:#676a6c;overflow-x:hidden}html,body{height:100%}body.full-height-layout #wrapper,body.full-height-layout #page-wrapper{height:100%}#page-wrapper{min-height:auto}body.boxed-layout #wrapper{background-color:#2f4050;max-width:1200px;margin:0 auto}.top-navigation.boxed-layout #wrapper,.boxed-layout #wrapper.top-navigation{max-width:1300px!important}.block{display:block}.clear{display:block;overflow:hidden}a{cursor:pointer}a:hover,a:focus{text-decoration:none}.border-bottom{border-bottom:1px solid #e7eaec!important}.font-bold{font-weight:600}.font-noraml{font-weight:400}.text-uppercase{text-transform:uppercase}.b-r{border-right:1px solid #e7eaec}.hr-line-dashed{border-top:1px dashed #e7eaec;color:#fff;background-color:#fff;height:1px;margin:20px 0}.hr-line-solid{border-bottom:1px solid #e7eaec;background-color:rgba(0,0,0,0);border-style:solid!important;margin-top:15px;margin-bottom:15px}video{width:100%!important;height:auto!important}.gallery>.row>div{margin-bottom:15px}.fancybox img{margin-bottom:5px;width:24%}.note-editor{height:auto!important;min-height:100px;border:solid 1px #e5e6e7}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,0);border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,0.3);outline:0 none}.modal-dialog{z-index:1200}.modal-body{padding:20px 30px 30px 30px}.inmodal .modal-body{background:#f8fafb}.inmodal .modal-header{padding:30px 15px;text-align:center}.animated.modal.fade .modal-dialog{-webkit-transform:none;-ms-transform:none;transform:none}.inmodal .modal-title{font-size:26px}.inmodal .modal-icon{font-size:84px;color:#e2e3e3}.modal-footer{margin-top:0}#wrapper{width:100%;overflow-x:hidden;background-color:#2f4050}.wrapper{padding:0 20px}.wrapper-content{padding:20px}#page-wrapper{padding:0 15px;position:inherit;margin:0 0 0 200px}.title-action{text-align:right;padding-top:30px}.ibox-content h1,.ibox-content h2,.ibox-content h3,.ibox-content h4,.ibox-content h5,.ibox-title h1,.ibox-title h2,.ibox-title h3,.ibox-title h4,.ibox-title h5{margin-top:5px}ul.unstyled,ol.unstyled{list-style:none outside none;margin-left:0}.big-icon{font-size:160px;color:#e5e6e7}.footer{background:none repeat scroll 0 0 white;border-top:1px solid #e7eaec;overflow:hidden;padding:10px 20px;margin:0 -15px;height:36px}.footer.fixed_full{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec}.footer.fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec;margin-left:220px}body.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 0 0 70px}body.mini-navbar.canvas-menu .footer.fixed,body.canvas-menu .footer.fixed{margin:0!important}body.fixed-sidebar.body-small.mini-navbar .footer.fixed{margin:0 0 0 220px}body.body-small .footer.fixed{margin-left:0}.page-heading{border-top:0;padding:0 20px 20px}.panel-heading h1,.panel-heading h2{margin-bottom:5px}.content-tabs{position:relative;height:39px;background:#fafafa;line-height:39px}.content-tabs .roll-nav,.page-tabs-list{position:absolute;width:30px;height:38px;text-align:center;color:#999;z-index:2;top:0}.content-tabs .roll-left{left:0;border-right:solid 1px #eee}.content-tabs .roll-right{right:0;border-left:solid 1px #eee}.content-tabs button{background:#fff;border:0;height:40px;width:40px;outline:0}.content-tabs button:hover{background:#fafafa}nav.page-tabs{margin-left:30px;width:100000px;height:39px;overflow:hidden}nav.page-tabs .page-tabs-content{float:left}.page-tabs a{display:block;float:left;border-right:solid 1px #eee;padding:0 15px}.page-tabs a i:hover{color:#c00}.page-tabs a:hover,.content-tabs .roll-nav:hover{color:#777;background:#f2f2f2;cursor:pointer}.roll-right.tabRight{right:60px}.roll-right.btn-group{right:60px;width:80px;padding:0}.roll-right.btn-group button{width:80px}.roll-right.tabReload{background:#fff;height:38px;width:60px;outline:0}.dropdown-menu-right{left:auto}#content-main{height:calc(100% - 127px);overflow:hidden}.tagsview-hide#content-main{height:calc(100% - 88px);overflow:hidden}.footer-hide#content-main{height:calc(100% - 91px);overflow:hidden}.tagsview-footer-hide#content-main{height:calc(100% - 52px);overflow:hidden}.fixed-nav #content-main{height:calc(100% - 80px);overflow:hidden}.table-bordered{border:1px solid #ebebeb}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{background-color:#f5f5f6;border-bottom-width:1px}.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 #e7e7e7}.table>thead>tr>th{border-bottom:1px solid #ddd;vertical-align:bottom}.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 #e7eaec;line-height:1.42857;padding:8px;vertical-align:middle}.panel.blank-panel{background:0;margin:0}.blank-panel .panel-heading{padding-bottom:0}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background:0;border-color:#ddd #ddd rgba(0,0,0,0);border-bottom:#f3f3f4;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid;border-width:1px;color:#555;cursor:default}.nav.nav-tabs li{background:0;border:0}.nav-tabs>li>a{color:#a7b1c2;font-weight:600;padding:10px 20px 10px 25px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{background-color:#e6e6e6;color:#676a6c}.ui-tab .tab-content{padding:20px 0}.no-padding{padding:0!important}.no-borders{border:none!important}.no-margins{margin:0!important}.no-top-border{border-top:0!important}.ibox-content.text-box{padding-bottom:0;padding-top:15px}.border-left-right{border-left:1px solid #e7eaec;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.border-left{border-left:1px solid #e7eaec;border-right:0;border-top:0;border-bottom:0}.border-right{border-left:none;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.full-width{width:100%!important}.link-block{font-size:12px;padding:10px}.nav.navbar-top-links .link-block a{font-size:12px}.link-block a{font-size:10px;color:inherit}body.mini-navbar .branding{display:none}img.circle-border{border:6px solid #fff;border-radius:50%}.branding{float:left;color:#fff;font-size:18px;font-weight:600;padding:17px 20px;text-align:center;background-color:#1ab394}.login-panel{margin-top:25%}.page-header{padding:20px 0 9px;margin:0 0 20px;border-bottom:1px solid #eee}.fontawesome-icon-list{margin-top:22px}.fontawesome-icon-list .fa-hover a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:#222;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:14px;display:inline-block;text-align:right;margin-right:10px}.fontawesome-icon-list .fa-hover a:hover{background-color:#1d9d74;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:30px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a:hover .text-muted{color:#bbe2d5}.feature-list .col-md-4{margin-bottom:22px}.feature-list h4 .fa:before{vertical-align:-10%;font-size:28px;display:inline-block;width:1.07142857em;text-align:center;margin-right:5px}.ui-draggable .ibox-title{cursor:move}.breadcrumb{background-color:#fff;padding:0;margin-bottom:0}.breadcrumb>li a{color:inherit}.breadcrumb>.active{color:inherit}code{background-color:#f9f2f4;border-radius:4px;color:#ca4440;font-size:90%;padding:2px 4px;white-space:nowrap}.ibox{clear:both;margin-bottom:25px;margin-top:0;padding:0}.ibox.collapsed .ibox-content{display:none}.ibox.collapsed .fa.fa-chevron-up:before{content:"\f078"}.ibox.collapsed .fa.fa-chevron-down:before{content:"\f077"}.ibox:after,.ibox:before{display:table}.ibox-title{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:0;color:inherit;margin-bottom:0;padding:14px 15px 7px;min-height:40px}.ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:1px 0}table.table-mail tr td{padding:12px}.table-mail .check-mail{padding-left:20px}.table-mail .mail-date{padding-right:20px}.star-mail,.check-mail{width:40px}.unread td a,.unread td{font-weight:600;color:inherit}.read td a,.read td{font-weight:normal;color:inherit}.unread td{background-color:#f9f8f8}.ibox-content{clear:both}.ibox-heading{background-color:#f3f6fb;border-bottom:0}.ibox-heading h3{font-weight:200;font-size:24px}.ibox-title h5{display:inline-block;font-size:14px;margin:0 0 7px;padding:0;text-overflow:ellipsis;float:left}.ibox-title .label{float:left;margin-left:4px}.ibox-tools{display:inline-block;float:right;margin-top:0;position:relative;padding:0}.ibox-tools a{cursor:pointer;margin-left:5px;color:#676a6c}.ibox-tools a.btn-primary{color:#fff}.ibox-tools .dropdown-menu>li>a{padding:4px 10px;font-size:12px}.ibox .open>.dropdown-menu{left:auto;right:0}.gray-bg{background-color:#f3f3f4}.white-bg{background-color:#fff}.navy-bg{background-color:#1ab394;color:#fff}.blue-bg{background-color:#1c84c6;color:#fff}.lazur-bg{background-color:#23c6c8;color:#fff}.yellow-bg{background-color:#f8ac59;color:#fff}.red-bg{background-color:#ed5565;color:#fff}.black-bg{background-color:#262626}.panel-primary{border-color:#1ab394}.panel-primary>.panel-heading{background-color:#1ab394;border-color:#1ab394}.panel-success{border-color:#1c84c6}.panel-success>.panel-heading{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.panel-info{border-color:#23c6c8}.panel-info>.panel-heading{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.panel-warning{border-color:#f8ac59}.panel-warning>.panel-heading{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.panel-danger{border-color:#ed5565}.panel-danger>.panel-heading{background-color:#ed5565;border-color:#ed5565;color:#fff}.progress-bar{background-color:#1ab394}.progress-small,.progress-small .progress-bar{height:10px}.progress-small,.progress-mini{margin-top:5px}.progress-mini,.progress-mini .progress-bar{height:5px;margin-bottom:0}.progress-bar-navy-light{background-color:#3dc7ab}.progress-bar-success{background-color:#1c84c6}.progress-bar-info{background-color:#23c6c8}.progress-bar-warning{background-color:#f8ac59}.progress-bar-danger{background-color:#ed5565}.panel-title{font-size:inherit}.jumbotron{border-radius:6px;padding:40px}.jumbotron h1{margin-top:0}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.simple_tag{background-color:#f3f3f4;border:1px solid #e7eaec;border-radius:2px;color:inherit;font-size:10px;margin-right:5px;margin-top:5px;padding:5px 12px;display:inline-block}.img-shadow{box-shadow:0 0 3px 0 #919191}.dashboards\.dashboard_2 nav.navbar,.dashboards\.dashboard_3 nav.navbar,.mailbox\.inbox nav.navbar,.mailbox\.email_view nav.navbar,.mailbox\.email_compose nav.navbar,.dashboards\.dashboard_4_1 nav.navbar{background:#fff}.Dashboard_2 .navbar.navbar-static-top,.Dashboard_3 .navbar.navbar-static-top,.Dashboard_4_1 .navbar.navbar-static-top,.ComposeEmail .navbar.navbar-static-top,.EmailView .navbar.navbar-static-top,.Inbox .navbar.navbar-static-top{background:#fff}a.close-canvas-menu{position:absolute;top:10px;right:15px;z-index:1011;color:#a7b1c2}a.close-canvas-menu:hover{color:#fff}.full-height{height:100%}.fh-breadcrumb{height:calc(100% - 196px);margin:0 -15px;position:relative}.fh-no-breadcrumb{height:calc(100% - 99px);margin:0 -15px;position:relative}.fh-column{background:#fff;height:100%;width:240px;float:left}.modal-backdrop{z-index:2040!important}.modal{z-index:2050!important}.spiner-example{height:200px;padding-top:70px}.p-xxs{padding:5px}.p-xs{padding:10px}.p-sm{padding:15px}.p-m{padding:20px}.p-md{padding:25px}.p-lg{padding:30px}.p-xl{padding:40px}.m-xxs{margin:2px 4px}.m-xs{margin:5px}.m-sm{margin:10px}.m{margin:15px}.m-md{margin:20px}.m-lg{margin:30px}.m-xl{margin:50px}.m-n{margin:0!important}.m-l-none{margin-left:0}.m-l-xs{margin-left:5px}.m-l-sm{margin-left:10px}.m-l{margin-left:15px}.m-l-md{margin-left:20px}.m-l-lg{margin-left:30px}.m-l-xl{margin-left:40px}.m-l-n-xxs{margin-left:-1px}.m-l-n-xs{margin-left:-5px}.m-l-n-sm{margin-left:-10px}.m-l-n{margin-left:-15px}.m-l-n-md{margin-left:-20px}.m-l-n-lg{margin-left:-30px}.m-l-n-xl{margin-left:-40px}.m-t-none{margin-top:0}.m-t-xxs{margin-top:1px}.m-t-xs{margin-top:5px}.m-t-sm{margin-top:10px}.m-t{margin-top:15px}.m-t-md{margin-top:20px}.m-t-lg{margin-top:30px}.m-t-xl{margin-top:40px}.m-t-n-xxs{margin-top:-1px}.m-t-n-xs{margin-top:-5px}.m-t-n-sm{margin-top:-10px}.m-t-n{margin-top:-15px}.m-t-n-md{margin-top:-20px}.m-t-n-lg{margin-top:-30px}.m-t-n-xl{margin-top:-40px}.m-r-none{margin-right:0}.m-r-xxs{margin-right:1px}.m-r-xs{margin-right:5px}.m-r-sm{margin-right:10px}.m-r{margin-right:15px}.m-r-md{margin-right:20px}.m-r-lg{margin-right:30px}.m-r-xl{margin-right:40px}.m-r-n-xxs{margin-right:-1px}.m-r-n-xs{margin-right:-5px}.m-r-n-sm{margin-right:-10px}.m-r-n{margin-right:-15px}.m-r-n-md{margin-right:-20px}.m-r-n-lg{margin-right:-30px}.m-r-n-xl{margin-right:-40px}.m-b-none{margin-bottom:0}.m-b-xxs{margin-bottom:1px}.m-b-xs{margin-bottom:5px}.m-b-sm{margin-bottom:10px}.m-b{margin-bottom:15px}.m-b-md{margin-bottom:20px}.m-b-lg{margin-bottom:30px}.m-b-xl{margin-bottom:40px}.m-b-n-xxs{margin-bottom:-1px}.m-b-n-xs{margin-bottom:-5px}.m-b-n-sm{margin-bottom:-10px}.m-b-n{margin-bottom:-15px}.m-b-n-md{margin-bottom:-20px}.m-b-n-lg{margin-bottom:-30px}.m-b-n-xl{margin-bottom:-40px}.space-15{margin:15px 0}.space-20{margin:20px 0}.space-25{margin:25px 0}.space-30{margin:30px 0}body.modal-open{padding-right:inherit!important}.search-form{margin-top:10px}.search-result h3{margin-bottom:0;color:#1e0fbe}.search-result .search-link{color:#006621}.search-result p{font-size:12px;margin-top:5px}.contact-box{background-color:#fff;border:1px solid #e7eaec;padding:20px;margin-bottom:20px}.contact-box a{color:inherit}.invoice-table tbody>tr>td:last-child,.invoice-table tbody>tr>td:nth-child(4),.invoice-table tbody>tr>td:nth-child(3),.invoice-table tbody>tr>td:nth-child(2){text-align:right}.invoice-table thead>tr>th:last-child,.invoice-table thead>tr>th:nth-child(4),.invoice-table thead>tr>th:nth-child(3),.invoice-table thead>tr>th:nth-child(2){text-align:right}.invoice-total>tbody>tr>td:first-child{text-align:right}.invoice-total>tbody>tr>td{border:0 none}.invoice-total>tbody>tr>td:last-child{border-bottom:1px solid #ddd;text-align:right;width:15%}.middle-box{max-width:400px;z-index:100;margin:0 auto;padding-top:40px}.lockscreen.middle-box{width:200px;padding-top:110px}.loginscreen.middle-box{width:300px}.loginColumns{max-width:800px;margin:0 auto;padding:100px 20px 20px 20px}.passwordBox{max-width:460px;margin:0 auto;padding:100px 20px 20px 20px}.logo-name{color:#e6e6e6;font-size:180px;font-weight:800;letter-spacing:-10px;margin-bottom:0}.middle-box h1{font-size:170px}.wrapper .middle-box{margin-top:140px}.lock-word{z-index:10;position:absolute;top:110px;left:50%;margin-left:-470px}.lock-word span{font-size:100px;font-weight:600;color:#e9e9e9;display:inline-block}.lock-word .first-word{margin-right:160px}.dashboard-header{border-top:0;padding:20px 20px 20px 20px}.dashboard-header h2{margin-top:10px;font-size:26px}.fist-item{border-top:none!important}.statistic-box{margin-top:40px}.dashboard-header .list-group-item span.label{margin-right:10px}.list-group.clear-list .list-group-item{border-top:1px solid #e7eaec;border-bottom:0;border-right:0;border-left:0;padding:10px 0}ul.clear-list:first-child{border-top:none!important}.timeline-item .date i{position:absolute;top:0;right:0;padding:5px;width:30px;text-align:center;border-top:1px solid #e7eaec;border-bottom:1px solid #e7eaec;border-left:1px solid #e7eaec;background:#f8f8f8}.timeline-item .date{text-align:right;width:110px;position:relative;padding-top:30px}.timeline-item .content{border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.timeline-item .content:hover{background:#f6f6f6}ul.notes li,ul.tag-list li{list-style:none}ul.notes li h4{margin-top:20px;font-size:16px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;position:relative}ul.notes li div small{position:absolute;top:5px;right:5px;font-size:10px}ul.notes li div a{position:absolute;right:10px;bottom:10px;color:inherit}ul.notes li{margin:10px 40px 50px 0;float:left}ul.notes li div p{font-size:12px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;box-shadow:5px 5px 2px rgba(33,33,33,0.7)}ul.notes li div{-webkit-transform:rotate(-6deg);-o-transform:rotate(-6deg);-moz-transform:rotate(-6deg)}ul.notes li:nth-child(even) div{-o-transform:rotate(4deg);-webkit-transform:rotate(4deg);-moz-transform:rotate(4deg);position:relative;top:5px}ul.notes li:nth-child(3n) div{-o-transform:rotate(-3deg);-webkit-transform:rotate(-3deg);-moz-transform:rotate(-3deg);position:relative;top:-5px}ul.notes li:nth-child(5n) div{-o-transform:rotate(5deg);-webkit-transform:rotate(5deg);-moz-transform:rotate(5deg);position:relative;top:-10px}ul.notes li div:hover,ul.notes li div:focus{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);position:relative;z-index:5}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:210px;width:210px;padding:1em;box-shadow:5px 5px 7px rgba(33,33,33,0.7);-webkit-transition:-webkit-transform .15s linear}.file-box{float:left;width:220px}.file-manager h5{text-transform:uppercase}.file-manager{list-style:none outside none;margin:0;padding:0}.folder-list li a{color:#666;display:block;padding:5px 0}.folder-list li{border-bottom:1px solid #e7eaec;display:block}.folder-list li i{margin-right:8px;color:#3d4d5d}.category-list li a{color:#666;display:block;padding:5px 0}.category-list li{display:block}.category-list li i{margin-right:8px;color:#3d4d5d}.category-list li a .text-navy{color:#1ab394}.category-list li a .text-primary{color:#1c84c6}.category-list li a .text-info{color:#23c6c8}.category-list li a .text-danger{color:#ef5352}.category-list li a .text-warning{color:#f8ac59}.file-manager h5.tag-title{margin-top:20px}.tag-list li{float:left}.tag-list li a{font-size:10px;background-color:#f3f3f4;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.file{border:1px solid #e7eaec;padding:0;background-color:#fff;position:relative;margin-bottom:20px;margin-right:20px}.file-manager .hr-line-dashed{margin:15px 0}.file .icon,.file .image{height:100px;overflow:hidden}.file .icon{padding:15px 10px;text-align:center}.file-control{color:inherit;font-size:14px;margin-right:10px}.file-control.active{text-decoration:underline}.file .icon i{font-size:70px;color:#dadada}.file .file-name{padding:10px;background-color:#f8f8f8;border-top:1px solid #e7eaec}.file-name small{color:#676a6c}.corner{position:absolute;display:inline-block;width:0;height:0;line-height:0;border:.6em solid transparent;border-right:.6em solid #f1f1f1;border-bottom:.6em solid #f1f1f1;right:0;bottom:0}a.compose-mail{padding:8px 10px}.mail-search{max-width:300px}.profile-content{border-top:none!important}.feed-activity-list .feed-element{border-bottom:1px solid #e7eaec}.feed-element:first-child{margin-top:0}.feed-element{padding-bottom:15px}.feed-element,.feed-element .media{margin-top:15px}.feed-element,.media-body{overflow:hidden}.feed-element>.pull-left{margin-right:10px}.feed-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.feed-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.feed-element .actions{margin-top:10px}.feed-element .photos{margin:10px 0}.feed-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.mail-box{background-color:#fff;border:1px solid #e7eaec;border-top:0;padding:0;margin-bottom:20px}.mail-box-header{background-color:#fff;border:1px solid #e7eaec;border-bottom:0;padding:30px 20px 20px 20px}.mail-box-header h2{margin-top:0}.mailbox-content .tag-list li a{background:#fff}.mail-body{border-top:1px solid #e7eaec;padding:20px}.mail-text{border-top:1px solid #e7eaec}.mail-text .note-toolbar{padding:10px 15px}.mail-body .form-group{margin-bottom:5px}.mail-text .note-editor .note-toolbar{background-color:#f9f8f8}.mail-attachment{border-top:1px solid #e7eaec;padding:20px;font-size:12px}.mailbox-content{background:0;border:0;padding:10px}.mail-ontact{width:23%}.project-people,.project-actions{text-align:right;vertical-align:middle}dd.project-people{text-align:left;margin-top:5px}.project-people img{width:32px;height:32px}.project-title a{font-size:14px;color:#676a6c;font-weight:600}.project-list table tr td{border-top:0;border-bottom:1px solid #e7eaec;padding:15px 10px;vertical-align:middle}.project-manager .tag-list li a{font-size:10px;background-color:white;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.project-files li a{font-size:11px;color:#676a6c;margin-left:10px;line-height:22px}.faq-item{padding:20px;margin-bottom:2px;background:#fff}.faq-question{font-size:18px;font-weight:600;color:#1ab394;display:block}.faq-question:hover{color:#179d82}.faq-answer{margin-top:10px;background:#f3f3f4;border:1px solid #e7eaec;border-radius:3px;padding:15px}.faq-item .tag-item{background:#f3f3f4;padding:2px 6px;font-size:10px;text-transform:uppercase}.message-input{height:90px!important}.chat-avatar{width:36px;height:36px;float:left;margin-right:10px}.chat-user-name{padding:10px}.chat-user{padding:8px 10px;border-bottom:1px solid #e7eaec}.chat-user a{color:inherit}.chat-view{z-index:20012}.chat-users,.chat-statistic{margin-left:-30px}@media(max-width:992px){.chat-users,.chat-statistic{margin-left:0}}.chat-view .ibox-content{padding:0}.chat-message{padding:10px 20px}.message-avatar{height:48px;width:48px;border:1px solid #e7eaec;border-radius:4px;margin-top:1px}.chat-discussion .chat-message.left .message-avatar{float:left;margin-right:10px}.chat-discussion .chat-message.right .message-avatar{float:right;margin-left:10px}.message{background-color:#fff;border:1px solid #e7eaec;text-align:left;display:block;padding:10px 20px;position:relative;border-radius:4px}.chat-discussion .chat-message.left .message-date{float:right}.chat-discussion .chat-message.right .message-date{float:left}.chat-discussion .chat-message.left .message{text-align:left;margin-left:55px}.chat-discussion .chat-message.right .message{text-align:right;margin-right:55px}.message-date{font-size:10px;color:#888}.message-content{display:block}.chat-discussion{background:#eee;padding:15px;height:400px;overflow-y:auto}.chat-users{overflow-y:auto;height:400px}.chat-message-form .form-group{margin-bottom:0}.jstree-open>.jstree-anchor>.fa-folder:before{content:"\f07c"}.jstree-default .jstree-icon.none{width:0}.clients-list{margin-top:20px}.clients-list .tab-pane{position:relative;height:600px}.client-detail{position:relative;height:620px}.clients-list table tr td{height:46px;vertical-align:middle;border:0}.client-link{font-weight:600;color:inherit}.client-link:hover{color:inherit}.client-avatar{width:42px}.client-avatar img{width:28px;height:28px;border-radius:50%}.contact-type{width:20px;color:#c1c3c4}.client-status{text-align:left}.client-detail .vertical-timeline-content p{margin:0}.client-detail .vertical-timeline-icon.gray-bg{color:#a7aaab}.clients-list .nav-tabs>li.active>a,.clients-list .nav-tabs>li.active>a:hover,.clients-list .nav-tabs>li.active>a:focus{border-bottom:1px solid #fff}.blog h2{font-weight:700}.blog h5{margin:0 0 5px 0}.blog .btn{margin:0 0 5px 0}.article h1{font-size:48px;font-weight:700;color:#2f4050}.article p{font-size:15px;line-height:26px}.article-title{text-align:center;margin:60px 0 40px 0}.article .ibox-content{padding:40px}.issue-tracker .btn-link{color:#1ab394}table.issue-tracker tbody tr td{vertical-align:middle;height:50px}.issue-info{width:50%}.issue-info a{font-weight:600;color:#676a6c}.issue-info small{display:block}.team-members{margin:10px 0}.team-members img.img-circle{width:42px;height:42px;margin-bottom:5px}.sortable-list{padding:10px 0}.agile-list{list-style:none;margin:0}.agile-list li{background:#fafafb;border:1px solid #e7eaec;margin:0 0 10px 0;padding:10px;border-radius:2px}.agile-list li:hover{cursor:pointer;background:#fff}.agile-list li.warning-element{border-left:3px solid #f8ac59}.agile-list li.danger-element{border-left:3px solid #ed5565}.agile-list li.info-element{border-left:3px solid #1c84c6}.agile-list li.success-element{border-left:3px solid #1ab394}.agile-detail{margin-top:5px;font-size:12px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}#small-chat{position:fixed;bottom:50px;right:26px;z-index:100}#small-chat .badge{position:absolute;top:-3px;right:-4px}.open-small-chat{height:38px;width:38px;display:block;background:#1ab394;padding:9px 8px;text-align:center;color:#fff;border-radius:50%}.open-small-chat:hover{color:white;background:#1ab394}.small-chat-box{display:none;position:fixed;bottom:50px;right:80px;background:#fff;border:1px solid #e7eaec;width:230px;height:320px;border-radius:4px}.small-chat-box.ng-small-chat{display:block}.body-small .small-chat-box{bottom:70px;right:20px}.small-chat-box.active{display:block}.small-chat-box .heading{background:#2f4050;padding:8px 15px;font-weight:bold;color:#fff}.small-chat-box .chat-date{opacity:.6;font-size:10px;font-weight:normal}.small-chat-box .content{padding:15px 15px}.small-chat-box .content .author-name{font-weight:bold;margin-bottom:3px;font-size:11px}.small-chat-box .content>div{padding-bottom:20px}.small-chat-box .content .chat-message{padding:5px 10px;border-radius:6px;font-size:11px;line-height:14px;max-width:80%;background:#f3f3f4;margin-bottom:10px}.small-chat-box .content .chat-message.active{background:#1ab394;color:#fff}.small-chat-box .content .left{text-align:left;clear:both}.small-chat-box .content .left .chat-message{float:left}.small-chat-box .content .right{text-align:right;clear:both}.small-chat-box .content .right .chat-message{float:right}.small-chat-box .form-chat{padding:10px 10px}.sk-spinner-rotating-plane.sk-spinner{width:30px;height:30px;background-color:#1ab394;margin:0 auto;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-180deg);transform:perspective(120px) rotateX(-180deg) rotateY(-180deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg)}}.sk-spinner-double-bounce.sk-spinner{width:40px;height:40px;position:relative;margin:0 auto}.sk-spinner-double-bounce .sk-double-bounce1,.sk-spinner-double-bounce .sk-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#1ab394;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-spinner-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-wave.sk-spinner{margin:0 auto;width:50px;height:30px;text-align:center;font-size:10px}.sk-spinner-wave div{background-color:#1ab394;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-spinner-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-wave .sk-rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-wave .sk-rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}@-webkit-keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-spinner-wandering-cubes.sk-spinner{margin:0 auto;width:32px;height:32px;position:relative}.sk-spinner-wandering-cubes .sk-cube1,.sk-spinner-wandering-cubes .sk-cube2{background-color:#1ab394;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCubeMove 1.8s infinite ease-in-out;animation:sk-wanderingCubeMove 1.8s infinite ease-in-out}.sk-spinner-wandering-cubes .sk-cube2{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}@-webkit-keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse.sk-spinner{width:40px;height:40px;margin:0 auto;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-spinner-chasing-dots.sk-spinner{margin:0 auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-spinner-chasing-dots .sk-dot1,.sk-spinner-chasing-dots .sk-dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-spinner-chasing-dots .sk-dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.sk-spinner-three-bounce div{width:18px;height:18px;background-color:#1ab394;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:20%;height:20%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out;animation:sk-circleBounceDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-cube-grid.sk-spinner{width:30px;height:30px;margin:0 auto}.sk-spinner-cube-grid .sk-cube{width:33%;height:33%;background-color:#1ab394;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-spinner-cube-grid .sk-cube:nth-child(1){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-spinner-cube-grid .sk-cube:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-spinner-cube-grid .sk-cube:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}@keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}.sk-spinner-wordpress.sk-spinner{background-color:#1ab394;width:30px;height:30px;border-radius:30px;position:relative;margin:0 auto;-webkit-animation:sk-innerCircle 1s linear infinite;animation:sk-innerCircle 1s linear infinite}.sk-spinner-wordpress .sk-inner-circle{display:block;background-color:#fff;width:8px;height:8px;position:absolute;border-radius:8px;top:5px;left:5px}@-webkit-keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sk-spinner-fading-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-fading-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:18%;height:18%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out;animation:sk-circleFadeDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-fading-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-fading-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-fading-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-fading-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-fading-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-fading-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-fading-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-fading-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-fading-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}body.rtls #page-wrapper{margin:0 220px 0 0}body.rtls .nav-second-level li a{padding:7px 35px 7px 10px}body.rtls .ibox-title h5{float:right}body.rtls .pull-right{float:left!important}body.rtls .pull-left{float:right!important}body.rtls .ibox-tools{float:left}body.rtls .stat-percent{float:left}body.rtls .navbar-right{float:left!important}body.rtls .navbar-top-links li:last-child{margin-left:40px;margin-right:0}body.rtls .minimalize-styl-2{float:right;margin:14px 20px 5px 5px}body.rtls .feed-element>.pull-left{margin-left:10px;margin-right:0}body.rtls .timeline-item .date{text-align:left}body.rtls .timeline-item .date i{left:0;right:auto}body.rtls .timeline-item .content{border-right:1px solid #e7eaec;border-left:none}body.rtls .toast-close-button{float:left}body.rtls #toast-container>.toast:before{margin:auto -1.5em auto .5em}body.rtls #toast-container>div{padding:15px 50px 15px 15px}body.rtls .center-orientation .vertical-timeline-icon i{margin-left:0;margin-right:-12px}body.rtls .vertical-timeline-icon i{right:50%;left:auto;margin-left:auto;margin-right:-12px}body.rtls .file-box{float:right}body.rtls ul.notes li{float:right}body.rtls .chat-users,body.rtls .chat-statistic{margin-right:-30px;margin-left:auto}body.rtls .dropdown-menu>li>a{text-align:right}body.rtls .b-r{border-left:1px solid #e7eaec;border-right:0}body.rtls .dd-list .dd-list{padding-right:30px;padding-left:0}body.rtls .dd-item>button{float:right}body.rtls .skin-setttings{margin-right:40px;margin-left:0}body.rtls .skin-setttings{direction:ltr}body.rtls .footer.fixed{margin-right:220px;margin-left:0}@media(max-width :992px){body.rtls .chat-users,body.rtls .chat-statistic{margin-right:0}}body.rtls.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0}body.rtls.top-navigation .navbar-toggle{float:right;margin-left:15px;margin-right:15px}.body-small.rtls.top-navigation .navbar-header{float:none}body.rtls.top-navigation #page-wrapper{margin:0}body.rtls.mini-navbar #page-wrapper{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar #page-wrapper{margin:0}body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 220px 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.body-small.rtls .navbar-fixed-top{margin-right:0}.body-small.rtls .navbar-header{float:right}body.rtls .navbar-top-links li:last-child{margin-left:20px}body.rtls .top-navigation #page-wrapper,body.rtls.mini-navbar .top-navigation #page-wrapper,body.rtls.mini-navbar.top-navigation #page-wrapper{margin:0}body.rtls .top-navigation .footer.fixed,body.rtls.top-navigation .footer.fixed{margin:0}@media(max-width :768px){body.rtls .navbar-top-links li:last-child{margin-left:20px}.body-small.rtls #page-wrapper{position:inherit;margin:0;min-height:1000px}.body-small.rtls .navbar-static-side{display:none;z-index:2001;position:absolute;width:70px}.body-small.rtls.mini-navbar .navbar-static-side{display:block}.rtls.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}}.rtls .ltr-support{direction:ltr}.page-tabs a{color:#999}.page-tabs a i{color:#ccc;margin-left:2px;font-size:13px}.page-tabs a.active{background:#eaedf1;color:#23508e}.page-tabs a.active:hover,.page-tabs a.active i:hover{background:#eaedf1;color:#23508e}@media(min-width :768px){.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{margin-left:auto}}@media(max-width :768px){body.fixed-sidebar .navbar-static-side{display:none}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.lock-word{display:none}.navbar-form-custom{display:none}.navbar-header{display:inline;float:left}.sidebard-panel{z-index:2;position:relative;width:auto;min-height:100%!important}.sidebar-content .wrapper{padding-right:0;z-index:1}.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}.ibox-tools{float:none;text-align:right;display:block}.content-tabs{display:none}#content-main{height:calc(100% - 100px)}.fixed-nav #content-main{height:calc(100% - 38px)}}.navbar-static-side{background:#2f4050}.nav-close{padding:10px;display:block;position:absolute;right:5px;top:5px;font-size:1.4em;cursor:pointer;z-index:10;display:none;color:rgba(255,255,255,.3)}@media(max-width :350px){body.fixed-sidebar.mini-navbar .navbar-static-side{width:0}.nav-close{display:block}#page-wrapper{margin-left:0!important}.timeline-item .date{text-align:left;width:110px;position:relative;padding-top:30px}.timeline-item .date i{position:absolute;top:0;left:15px;padding:5px;width:30px;text-align:center;border:1px solid #e7eaec;background:#f8f8f8}.timeline-item .content{border-left:none;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.nav.navbar-top-links li.dropdown{display:none}.ibox-tools{float:none;text-align:left;display:inline-block}}.ui-jqgrid-titlebar{height:40px;line-height:24px;color:#676a6c;background-color:#f9f9f9;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.ui-jqgrid .ui-jqgrid-title{float:left;margin-left:5px;font-weight:700}.ui-jqgrid .ui-jqgrid-titlebar{position:relative;border-left:0 solid;border-right:0 solid;border-top:0 solid}.social-feed-separated .social-feed-box{margin-left:62px}.social-feed-separated .social-avatar{float:left;padding:0}.social-feed-separated .social-avatar img{width:52px;height:52px;border:1px solid #e7eaec}.social-feed-separated .social-feed-box .social-avatar{padding:15px 15px 0 15px;float:none}.social-feed-box{border:1px solid #e7eaec;background:#fff;margin-bottom:15px}.article .social-feed-box{margin-bottom:0;border-bottom:0}.article .social-feed-box:last-child{margin-bottom:0;border-bottom:1px solid #e7eaec}.article .social-feed-box p{font-size:13px;line-height:18px}.social-action{margin:15px}.social-avatar{padding:15px 15px 0 15px}.social-comment .social-comment{margin-left:45px}.social-avatar img{height:40px;width:40px;margin-right:10px}.social-avatar .media-body a{font-size:14px;display:block}.social-body{padding:15px}.social-body img{margin-bottom:10px}.social-footer{border-top:1px solid #e7eaec;padding:10px 15px;background:#f9f9f9}.social-footer .social-comment img{width:32px;margin-right:10px}.social-comment:first-child{margin-top:0}.social-comment{margin-top:15px}.social-comment textarea{font-size:12px}@media(max-width :1000px){.welcome-message{display:none}}.echarts{height:240px}.checkbox-inline,.radio-inline,.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin:0 15px 0 0;font-size:14px}.navbar-toggle{background-color:#fff}.menuTab{-webkit-transition:all .3s ease-out 0s;transition:all .3s ease-out 0s}@media only screen and (-webkit-min-device-pixel-ratio :2){#content-main{-webkit-overflow-scrolling:touch}}.navbar-header{height:50px}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ab394}@media(min-width :768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.t-bar{padding-bottom:10px}.nopadding{padding:0}.note-editor .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.folder-list li.active a{color:#2791df;background:#f5f5f5}nav .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent;-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;height:50px;font-size:20px;line-height:50px;text-align:center;width:200px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.logo-mini{display:none}.logo-lg{display:block}.roleList{color:#d5d5d5;margin-right:10px;padding-top:10px;line-height:1;white-space:nowrap;overflow:hidden;width:110px}.sidebar-collapse .user-panel{white-space:nowrap;position:relative;width:100%;padding:15px;overflow:hidden}.sidebar-collapse .user-panel .image>img{width:100%;max-width:45px;height:auto}.sidebar-collapse .user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.sidebar-collapse .user-panel>.info a{color:#fff;font-size:12px}.sidebar-collapse .user-panel>.info>p{font-weight:600;margin-bottom:9px;color:#fff;font-size:12px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.nav>li:hover .dropdown-menu{display:block}#content-main.max{height:calc(100% - 110px);overflow:hidden;width:100%;height:100%;left:0;position:absolute;top:0;z-index:9998;margin:0} |
| | |
| | | right: 42px; |
| | | } |
| | | |
| | | .select2-hidden-accessible + label.error, select.error + label.error { |
| | | .select2-hidden-accessible + label.error { |
| | | right: 38px; |
| | | } |
| | | |
| | | .Validform_error,input.error,textarea.error,select.error,select.error+label.error+.select2-container--bootstrap .select2-selection--single { |
| | | .Validform_error,input.error,textarea.error,select.error,label.error+.select2-container--bootstrap .select2-selection--single { |
| | | background-color: #fbe2e2; |
| | | border-color: #c66161; |
| | | color: #c00 |
| | |
| | | if (isScrollToTop) { |
| | | $(obj).show().siblings('.RuoYi_iframe').hide(); |
| | | } else { |
| | | $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"}); |
| | | $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}); |
| | | } |
| | | } |
| | | |
| | |
| | | // 添加选项卡对应的iframe |
| | | var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-refresh="' + isRefresh + '" seamless></iframe>'; |
| | | if (isScrollToTop) { |
| | | $('.mainContent').find('iframe.RuoYi_iframe').hide(); |
| | | $('.mainContent').find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1); |
| | | } else { |
| | | $('.mainContent').find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"}); |
| | | $('.mainContent').find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}).parents('.mainContent').append(str1); |
| | | } |
| | | $('.mainContent').append(str1); |
| | | |
| | | $.modal.loading("数据加载中,请稍候..."); |
| | | |
| | |
| | | // 添加选项卡对应的iframe |
| | | var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-panel="' + panelUrl + '" seamless></iframe>'; |
| | | if (isScrollToTop) { |
| | | $('.mainContent', topWindow).find('iframe.RuoYi_iframe').hide(); |
| | | $('.mainContent', topWindow).find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1); |
| | | } else { |
| | | $('.mainContent', topWindow).find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"}); |
| | | $('.mainContent', topWindow).find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}).parents('.mainContent').append(str1); |
| | | } |
| | | $('.mainContent', topWindow).append(str1); |
| | | |
| | | window.parent.$.modal.loading("数据加载中,请稍候..."); |
| | | $('.mainContent iframe:visible', topWindow).on('load', function() { |
| | |
| | | if (isScrollToTop) { |
| | | $(obj).show().siblings('.RuoYi_iframe').hide(); |
| | | } else { |
| | | $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"}); |
| | | $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}); |
| | | } |
| | | } |
| | | |
| | |
| | | sortOrder: "asc", |
| | | pagination: true, |
| | | paginationLoop: false, |
| | | pageSize: 10, |
| | | pageSize: 20, |
| | | pageNumber: 1, |
| | | pageList: [10, 25, 50, 100], |
| | | pageList: [20, 40, 60, 100], |
| | | toolbar: "toolbar", |
| | | loadingFontSize: 13, |
| | | striped: false, |
| | | escape: true, |
| | | escape: false, |
| | | firstLoad: true, |
| | | showFooter: false, |
| | | search: false, |
| | |
| | | type: 1, |
| | | closeBtn: true, |
| | | shadeClose: true, |
| | | area: ['auto', 'auto'], |
| | | content: "<img src='" + src + "' height='" + height + "' width='" + width + "'/>" |
| | | }); |
| | | } else if ($.common.equals("blank", target)) { |
| | |
| | | fix: false, |
| | | area: [_width + 'px', _height + 'px'], |
| | | content: _url, |
| | | closeBtn: $.common.isEmpty(options.closeBtn) ? 1 : options.closeBtn, |
| | | shadeClose: $.common.isEmpty(options.shadeClose) ? true : options.shadeClose, |
| | | skin: options.skin, |
| | | // options.btn设置为0表示不显示按钮 |
| | |
| | | var url = table.options.viewUrl.replace("{id}", id); |
| | | $.modal.popupRight(table.options.modalName + "信息详情", url); |
| | | }, |
| | | // 查看信息,以tab页展现 |
| | | viewTab: function(id) { |
| | | table.set(); |
| | | var url = table.options.viewUrl.replace("{id}", id); |
| | | $.modal.openTab(table.options.modalName + "详情", url); |
| | | }, |
| | | // 保存信息 刷新表格 |
| | | save: function(url, data, callback) { |
| | | var config = { |
| | |
| | | $("#datetimepicker-demo-2").datetimepicker({ |
| | | format: "yyyy-mm-dd", |
| | | minView: "month", |
| | | autoclose: true, |
| | | clearBtn:true |
| | | autoclose: true |
| | | }); |
| | | |
| | | $("#datetimepicker-demo-3").datetimepicker({ |
| | |
| | | <h2>若依后台管理系统</h2> |
| | | <p>ruoyi是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p> |
| | | <p> |
| | | <b>当前版本:</b>v4.8.0 |
| | | <b>当前版本:</b>v4.7.9 |
| | | </p> |
| | | <p> |
| | | <span class="label label-warning">免费开源</span> |
| | |
| | | <h3>你好,若依 </h3> |
| | | <p>H+是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p> |
| | | <p> |
| | | <b>当前版本:</b>v4.8.0 |
| | | <b>当前版本:</b>v4.7.9 |
| | | </p> |
| | | <p> |
| | | <span class="label label-warning">开源免费</span> |
| | |
| | | field: 'areaCode', |
| | | title: '区域代码', |
| | | align: 'left' |
| | | }, |
| | | { |
| | | field: 'simplePy', |
| | | title: '首字母简拼', |
| | | align: 'left' |
| | | }, |
| | | { |
| | | field: 'pinYin', |
| | | title: '名称全拼', |
| | | align: 'left' |
| | | }] |
| | | }; |
| | | $.treeTable.init(options); |
| | |
| | | }, |
| | | { |
| | | field : 'userName', |
| | | title : '用户姓名', |
| | | cellStyle: function (value, row, index) { |
| | | return { css: { "min-width": "100px", "white-space": "nowrap", "text-overflow": "ellipsis", "overflow": "hidden", "max-width": "200px" } } |
| | | }, |
| | | formatter: function(value, row, index) { |
| | | if (index == 0) { |
| | | value = value + ",测试用户姓名,这是一条长文本,可以通过拖拽自适应内容显示。。。。"; |
| | | } |
| | | return $.table.tooltip(value, 30, "open"); |
| | | } |
| | | title : '用户姓名' |
| | | }, |
| | | { |
| | | field : 'userPhone', |
| | |
| | | <link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.22.6}" rel="stylesheet"/> |
| | | <link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/> |
| | | <link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/> |
| | | </head> |
| | | |
| | | <!-- 通用JS --> |
| | |
| | | <script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js?v=1.22.6}"></script> |
| | | <script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js?v=1.22.6}"></script> |
| | | <!-- jquery-validate 表单验证插件 --> |
| | | <script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.21.0}"></script> |
| | | <script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.21.0}"></script> |
| | | <script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.21.0}"></script> |
| | | <script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.19.3}"></script> |
| | | <script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.19.3}"></script> |
| | | <script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.19.3}"></script> |
| | | <!-- bootstrap-table 表格树插件 --> |
| | | <script th:src="@{/ajax/libs/bootstrap-table/extensions/tree/bootstrap-table-tree.min.js?v=1.22.6}"></script> |
| | | <!-- 遮罩层 --> |
| | |
| | | <script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script> |
| | | <script th:src="@{/ajax/libs/layer/layer.min.js?v=3.7.0}"></script> |
| | | <script th:src="@{/ajax/libs/layui/layui.min.js?v=2.8.18}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | </div> |
| | | |
| | | <!-- ztree树插件 --> |
| | |
| | | <link th:href="@{/css/animate.min.css}" rel="stylesheet"/> |
| | | <link th:href="@{/css/style.min.css}" rel="stylesheet"/> |
| | | <link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/> |
| | | <style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style> |
| | | </head> |
| | | <body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden"> |
| | |
| | | <script th:src="@{/js/jquery.contextMenu.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script> |
| | | <script th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script> |
| | | <script th:src="@{/ruoyi/index.js?v=20201208}"></script> |
| | | <script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script> |
| | | <script th:src="@{/js/resize-tabs.js}"></script> |
| | |
| | | <meta charset="utf-8"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | <meta name="renderer" content="webkit"> |
| | | <title>若依系统首页</title> |
| | | <title>系统首页</title> |
| | | <!-- 避免IE使用兼容模式 --> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <link th:href="@{favicon.ico}" rel="shortcut icon"/> |
| | |
| | | <link th:href="@{/css/animate.min.css}" rel="stylesheet"/> |
| | | <link th:href="@{/css/style.min.css}" rel="stylesheet"/> |
| | | <link th:href="@{/css/skins.css}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/> |
| | | <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/> |
| | | </head> |
| | | <body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden"> |
| | | <div id="wrapper"> |
| | |
| | | <script th:src="@{/js/jquery.contextMenu.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script> |
| | | <script th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script> |
| | | <script th:src="@{/ruoyi/index.js?v=20201208}"></script> |
| | | <script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script> |
| | | <script th:inline="javascript"> |
| | |
| | | <script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script> |
| | | <script src="../static/js/three.min.js" th:src="@{/js/three.min.js}"></script> |
| | | <script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | </body> |
| | | <script th:inline="javascript"> |
| | | var ctx = [[@{/}]]; |
| | |
| | | <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/> |
| | | <link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/> |
| | | <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/> |
| | | <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/> |
| | | <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/> |
| | | <!-- 360浏览器急速模式 --> |
| | | <meta name="renderer" content="webkit"> |
| | | <!-- 避免IE使用兼容模式 --> |
| | |
| | | </div> |
| | | <div class="signup-footer"> |
| | | <div class="pull-left"> |
| | | Copyright © 2018-2025 ruoyi.vip All Rights Reserved. <br> |
| | | Copyright © 2018-2024 ruoyi.vip All Rights Reserved. <br> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script> |
| | | <script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | <script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script> |
| | | </body> |
| | | </html> |
| | |
| | | |
| | | <body class="gray-bg"> |
| | | <div class="row border-bottom white-bg dashboard-header"> |
| | | <div class="col-sm-12"> |
| | | <blockquote class="text-warning" style="font-size:14px"> |
| | | 阿里云服务器折扣区 <a target="_blank" href="http://aly.ruoyi.vip">☛☛点我进入☚☚</a> 腾讯云服务器秒杀区 <a target="_blank" href="http://txy.ruoyi.vip">☛☛点我进入☚☚</a><br> |
| | | </blockquote> |
| | | |
| | | <hr> |
| | | </div> |
| | | <div class="col-sm-3"> |
| | | <h2>Hello,Guest</h2> |
| | | <small>移动设备访问请扫描以下二维码:</small> |
| | | <br> |
| | | <br> |
| | | <img th:src="@{/img/qr_code.png}" width="100%" style="max-width:264px;"> |
| | | <br> |
| | | </div> |
| | | <div class="col-sm-5"> |
| | | <h2>若依后台管理框架</h2> |
| | | <p>一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。</p> |
| | | <p> |
| | | <b>当前版本:</b><span>v[[${version}]]</span> |
| | | </p> |
| | | <p> |
| | | <span class="label label-warning">¥免费开源</span> |
| | | </p> |
| | | <br> |
| | | <p> |
| | | <a class="btn btn-success btn-outline" href="https://gitee.com/y_project/RuoYi" target="_blank"> |
| | | <i class="fa fa-cloud"> </i> 访问码云 |
| | | </a> |
| | | <a class="btn btn-white btn-bitbucket" href="http://ruoyi.vip" target="_blank"> |
| | | <i class="fa fa-home"></i> 访问主页 |
| | | </a> |
| | | </p> |
| | | </div> |
| | | <div class="col-sm-4"> |
| | | <h4>技术选型:</h4> |
| | | <ol> |
| | | <li>核心框架:Spring Boot。</li> |
| | | <li>安全框架:Apache Shiro。</li> |
| | | <li>模板引擎:Thymeleaf。</li> |
| | | <li>持久层框架:MyBatis。</li> |
| | | <li>定时任务:Quartz。</li> |
| | | <li>数据库连接池:Druid。</li> |
| | | <li>工具类:Fastjson。</li> |
| | | <li>更多……</li> |
| | | </ol> |
| | | </div> |
| | | |
| | | </div> |
| | | <div class="wrapper wrapper-content"> |
| | | <div class="row"> |
| | | <div class="col-sm-4"> |
| | | |
| | | <div class="ibox float-e-margins"> |
| | | <div class="ibox-title"> |
| | | <h5>联系信息</h5> |
| | | |
| | | </div> |
| | | <div class="ibox-content"> |
| | | <p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a> |
| | | </p> |
| | | <p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s> <s>满185760789</s> <s>满175104288</s> <s>满174942938</s> <s>满287843737</s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=KTVAIhggR3rR3uZWK9A8kR4yYNREQ4jo&authKey=An4DUV9e7uK8I8VgBbp949z0ypQoDrOoqvVg%2FWOr2vuNNDMZUAMPvqHor6TFMIgz&noverify=0&group_code=232896766" target="_blank">232896766</a> |
| | | </p> |
| | | <p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a> |
| | | </p> |
| | | <p><i class="fa fa-credit-card"></i> 支付宝:<a href="javascript:;" class="支付宝信息">/ *若依</a> |
| | | </p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="col-sm-4"> |
| | | <div class="ibox float-e-margins"> |
| | | <div class="ibox-title"> |
| | | <h5>更新日志</h5> |
| | | </div> |
| | | <div class="ibox-content no-padding"> |
| | | <div class="panel-body"> |
| | | <div class="panel-group" id="version"> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v480">v4.8.0</a><code class="pull-right">2024.12.26</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v480" class="panel-collapse collapse in"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>支持自定义显示Excel属性列</li> |
| | | <li>表格默认转义HTML字符串</li> |
| | | <li>新增列宽拖动长内容自适应显示示例</li> |
| | | <li>Excel注解支持wrapText是否允许内容换行</li> |
| | | <li>代码生成新增配置是否允许文件覆盖到本地</li> |
| | | <li>升级oshi到最新版本6.6.5</li> |
| | | <li>升级tomcat到最新版本9.0.96</li> |
| | | <li>升级logback到最新版本1.2.13</li> |
| | | <li>升级commons.io到最新版本2.16.1</li> |
| | | <li>升级spring-framework到最新版本5.3.39</li> |
| | | <li>升级jquery.validate到最新版本v1.21.0</li> |
| | | <li>优化导入带标题文件关闭清理</li> |
| | | <li>代码生成创建表屏蔽违规的字符</li> |
| | | <li>修复主子表数据显示问题</li> |
| | | <li>修复记住我请求头过大的问题</li> |
| | | <li>修复角色禁用权限不失效问题</li> |
| | | <li>修复类匿名注解访问失效问题</li> |
| | | <li>修复导出子列表对象只能在最后的问题</li> |
| | | <li>修复多选下拉框open导致页签空白问题</li> |
| | | <li>优化身份证脱敏正则</li> |
| | | <li>优化查询时间范围日期格式</li> |
| | | <li>优化异步树表格折叠同步子状态</li> |
| | | <li>优化时间控件清除按钮样式问题</li> |
| | | <li>优化表格图片预览动态路径显示问题</li> |
| | | <li>优化select2下拉框必填背景色无法清空问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v479">v4.7.9</a><code class="pull-right">2024.06.06</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v479" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>通知公告新增详细显示</li> |
| | | <li>新增数据脱敏过滤注解</li> |
| | | <li>新增表格示例(虚拟滚动)</li> |
| | | <li>新增表格示例(全文检索)</li> |
| | | <li>新增表格示例(保存状态)</li> |
| | | <li>代码生成支持表单布局选项</li> |
| | | <li>限制用户操作数据权限范围</li> |
| | | <li>用户密码新增非法字符验证</li> |
| | | <li>默认加载layer扩展皮肤</li> |
| | | <li>未修改初始密码弹框提醒</li> |
| | | <li>定时任务白名单配置范围缩小</li> |
| | | <li>操作日志列表重置回第一页</li> |
| | | <li>定时任务日志默认按时间排序</li> |
| | | <li>Excel注解ColumnType类型新增文本</li> |
| | | <li>Excel注解新增属性comboReadDict</li> |
| | | <li>新增Anonymous匿名访问不鉴权注解</li> |
| | | <li>升级oshi到最新版本6.6.1</li> |
| | | <li>升级druid到最新版本1.2.23</li> |
| | | <li>升级commons.io到最新版本2.13.0</li> |
| | | <li>升级spring-framework到安全版本</li> |
| | | <li>升级bootstrap-table到最新版本1.22.6</li> |
| | | <li>修复重置日期时出现的异常问题</li> |
| | | <li>修复页签关闭后存在的跳转问题</li> |
| | | <li>修复tooltip单击复制文本不生效的问题</li> |
| | | <li>更新缓存管理键名排序方式</li> |
| | | <li>更新HttpUtils中的User-Agent</li> |
| | | <li>优化自定义XSS注解匹配方式</li> |
| | | <li>优化登录注册页面验证码验证</li> |
| | | <li>优化数据权限自定义匹配方式</li> |
| | | <li>优化高频率定时任务不执行问题</li> |
| | | <li>优化树表格align属性在标题生效</li> |
| | | <li>优化代码生成主子表关联查询方式</li> |
| | | <li>优化导入Excel时设置dictType属性重复查缓存问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v478">v4.7.8</a><code class="pull-right">2023.11.23</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v478" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>用户列表新增抽屉效果详细信息</li> |
| | | <li>操作日志列表新增IP地址查询</li> |
| | | <li>定时任务新增页去除状态选项</li> |
| | | <li>系统管理角色列表显示数据权限</li> |
| | | <li>通用排序属性orderBy参数限制长度</li> |
| | | <li>新增isScrollToTop页签切换滚动到顶部</li> |
| | | <li>Excel自定义数据处理器增加单元格/工作簿对象</li> |
| | | <li>新增表格参数(数据值为空时显示的内容undefinedText)</li> |
| | | <li>升级oshi到最新版本6.4.7</li> |
| | | <li>升级shiro到最新版本1.13.0</li> |
| | | <li>升级druid到最新版本1.2.20</li> |
| | | <li>升级pagehelper到最新版1.4.7</li> |
| | | <li>升级spring-boot到最新版本2.5.15</li> |
| | | <li>升级jquery到最新版v3.7.1</li> |
| | | <li>升级layer到最新版本v3.7.0</li> |
| | | <li>升级layui到最新版本v2.8.18</li> |
| | | <li>升级x-editable到最新版本1.5.3</li> |
| | | <li>修复自定义字典样式不生效的问题</li> |
| | | <li>修复弹窗按钮启用禁用方法无效问题</li> |
| | | <li>修复横向菜单关闭最后一个页签状态问题</li> |
| | | <li>修复Excel导入数据临时文件无法删除问题</li> |
| | | <li>修复表格行内编辑启用翻页记住选择无效问题</li> |
| | | <li>修复Excels导入时无法获取到dictType字典值问题</li> |
| | | <li>优化重置密码鼠标按下显示密码</li> |
| | | <li>优化参数键值文本框改为文本域</li> |
| | | <li>优化表格重置默认返回到第一页</li> |
| | | <li>优化菜单管理类型为按钮状态可选</li> |
| | | <li>优化数字金额大写转换精度丢失问题</li> |
| | | <li>优化树表查询无数据时清除分页信息</li> |
| | | <li>优化通用detail详细信息弹窗不显示按钮</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v477" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>操作日志新增消耗时间属性</li> |
| | | <li>日志管理使用索引提升查询性能</li> |
| | | <li>日志注解支持排除指定的请求参数</li> |
| | | <li>新增监控页面图标显示</li> |
| | | <li>新增支持登录IP黑名单限制</li> |
| | | <li>更新fontawesome图标示例</li> |
| | | <li>屏蔽定时任务bean违规的字符</li> |
| | | <li>支持自定义隐藏属性列过滤子对象</li> |
| | | <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li> |
| | | <li>升级jquery到最新版v3.6.3</li> |
| | | <li>升级layui到最新版本2.7.6</li> |
| | | <li>升级jasny-bootstrap到最新版4.0.0</li> |
| | | <li>升级oshi到最新版本6.4.1</li> |
| | | <li>升级druid到最新版本1.2.16</li> |
| | | <li>修复异步表格树子项排序问题</li> |
| | | <li>修复冻结列不支持IE浏览器的问题</li> |
| | | <li>修复主子表使用suggest插件无法新增问题</li> |
| | | <li>修复菜单栏快速点击导致展开折叠样式问题</li> |
| | | <li>修复用户多角色数据权限可能出现权限抬升的情况</li> |
| | | <li>修复异步加载表格树重置列表父节点展开异常问题</li> |
| | | <li>修复页签属性refresh为undefined时页面被刷新问题</li> |
| | | <li>移除apache/commons-fileupload依赖</li> |
| | | <li>优化前端属性提醒说明</li> |
| | | <li>优化用户导入更新时需获取用户编号问题</li> |
| | | <li>优化主子表根据序号删除方法加入表格ID参数</li> |
| | | <li>优化导出Excel时设置dictType属性重复查缓存问题</li> |
| | | <li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li> |
| | | <li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v476" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>定时任务违规的字符</li> |
| | | <li>忽略不必要的属性数据返回</li> |
| | | <li>导入更新用户数据前校验数据权限</li> |
| | | <li>修改参数键名时移除前缓存配置</li> |
| | | <li>修改用户登录账号进行重复验证</li> |
| | | <li>兼容Excel下拉框内容过多无法显示</li> |
| | | <li>升级oshi到最新版本6.4.0</li> |
| | | <li>升级kaptcha到最新版2.3.3</li> |
| | | <li>升级druid到最新版本1.2.15</li> |
| | | <li>升级shiro到最新版本1.10.1</li> |
| | | <li>升级pagehelper到最新版1.4.6</li> |
| | | <li>升级bootstrap-fileinput到最新版本5.5.2</li> |
| | | <li>修复sheet超出最大行数异常问题</li> |
| | | <li>修复关闭父页签后提交无法跳转的问题</li> |
| | | <li>修复操作日志类型多选导出不生效问题</li> |
| | | <li>修复导出包含空子列表数据异常的问题</li> |
| | | <li>优化树形表格层级显示</li> |
| | | <li>优化SQL关键字检查防止注入</li> |
| | | <li>优化用户管理重置时取消部门选择</li> |
| | | <li>优化代码生成同步后字典值NULL问题</li> |
| | | <li>优化导出对象的子列表为空会出现[]问题</li> |
| | | <li>优化select2搜索下拉后校验必填样式问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v475">v4.7.5</a><code class="pull-right">2022.09.05</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v475" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>Excel支持导出对象的子列表方法</li> |
| | | <li>数据逻辑删除不进行唯一验证</li> |
| | | <li>优化多角色数据权限匹配规则</li> |
| | | <li>新增主子表提交校验示例</li> |
| | | <li>支持自定义隐藏Excel属性列</li> |
| | | <li>Excel注解支持backgroundColor属性设置背景颜色</li> |
| | | <li>菜单配置刷新时Tab页签切换时刷新</li> |
| | | <li>增加对AjaxResult消息结果类型的判断</li> |
| | | <li>新增示例(进度条)</li> |
| | | <li>新增内容编码/解码方便插件集成使用</li> |
| | | <li>升级jquery到最新版3.6.1</li> |
| | | <li>升级layui到最新版本2.7.5</li> |
| | | <li>升级shiro到最新版本1.9.1</li> |
| | | <li>升级druid到最新版本1.2.11</li> |
| | | <li>升级pagehelper到最新版1.4.3</li> |
| | | <li>升级oshi到最新版本6.2.2</li> |
| | | <li>修复树表onLoadSuccess不生效的问题</li> |
| | | <li>修复用户分配角色大于默认页数丢失问题</li> |
| | | <li>定时任务支持执行父类方法</li> |
| | | <li>自动设置切换多个树表格实例配置</li> |
| | | <li>页签创建标题优先data-title属性</li> |
| | | <li>优化任务过期不执行调度</li> |
| | | <li>优化横向菜单下激活菜单样式</li> |
| | | <li>优化按钮打开窗口后按回车反复弹出</li> |
| | | <li>优化excel/scale属性导出单元格数值类型</li> |
| | | <li>优化druid开启wall过滤器出现的异常问题</li> |
| | | <li>优化多个相同角色数据导致权限SQL重复问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v474">v4.7.4</a><code class="pull-right">2022.06.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v474" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>用户头像上传图片格式限制</li> |
| | | <li>Excel注解支持color属性设置字体颜色</li> |
| | | <li>设置分页参数默认值</li> |
| | | <li>主子表操作列新增单个删除</li> |
| | | <li>定时任务检查Bean包名是否为白名单配置</li> |
| | | <li>升级spring-boot到最新版本2.5.14</li> |
| | | <li>升级shiro到最新版本1.9.0</li> |
| | | <li>升级oshi到最新版本6.1.6</li> |
| | | <li>升级fastjson到最新版1.2.83 安全修复版本</li> |
| | | <li>文件上传兼容Weblogic环境</li> |
| | | <li>新增清理分页的线程变量方法</li> |
| | | <li>新增获取不带后缀文件名称方法</li> |
| | | <li>用户缓存信息添加部门ancestors祖级列表</li> |
| | | <li>自定义ShiroFilterFactoryBean防止中文请求被拦截</li> |
| | | <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li> |
| | | <li>优化IP地址获取到多个的问题</li> |
| | | <li>优化表格冻结列阴影效果显示</li> |
| | | <li>优化菜单侧边栏滚动条尺寸及颜色</li> |
| | | <li>优化显示顺序orderNum类型为整型</li> |
| | | <li>优化接口使用泛型使其看到响应属性字段</li> |
| | | <li>优化导出数据LocalDateTime类型无数据问题</li> |
| | | <li>修复导入Excel时字典字段类型为Long转义为空问题</li> |
| | | <li>优化导出excel单元格验证,包含变更为开头.防止正常内容被替换</li> |
| | | <li>修复URL类型回退键被禁止问题</li> |
| | | <li>修复表格客户端分页序号显示错误问题</li> |
| | | <li>修复代码生成拖拽多次出现的排序不正确问题</li> |
| | | <li>修复表格打印组件不识别多层对象属性值问题</li> |
| | | <li>修复操作日志查询类型条件为0时会查到所有数据</li> |
| | | <li>修复Excel注解prompt/combo同时使用不生效问题</li> |
| | | <li>修复初始化多表格处理回调函数时获取的表格配置不一致问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v473">v4.7.3</a><code class="pull-right">2022.03.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v473" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>表格树支持分页/异步加载</li> |
| | | <li>代码生成预览支持复制内容</li> |
| | | <li>定时任务默认保存到内存中执行</li> |
| | | <li>代码生成同步保留必填/类型选项</li> |
| | | <li>页面若未匹配到字典标签则返回原字典值</li> |
| | | <li>用户访问控制时校验数据权限,防止越权</li> |
| | | <li>导出Excel时屏蔽公式,防止CSV注入风险</li> |
| | | <li>升级spring-boot到最新版本2.5.10</li> |
| | | <li>升级spring-boot-mybatis到最新版2.2.2</li> |
| | | <li>升级pagehelper到最新版1.4.1</li> |
| | | <li>升级oshi到最新版本6.1.2</li> |
| | | <li>升级bootstrap-table到最新版本1.19.1</li> |
| | | <li>服务监控新增运行参数信息显示</li> |
| | | <li>定时任务目标字符串验证包名白名单</li> |
| | | <li>文件上传接口新增原/新文件名返回参数</li> |
| | | <li>定时任务屏蔽违规的字符</li> |
| | | <li>分页数据新增分页参数合理化参数</li> |
| | | <li>表格父子视图添加点击事件打开示例</li> |
| | | <li>优化上传文件名称命名规则</li> |
| | | <li>优化加载字典缓存数据</li> |
| | | <li>优化任务队列满时任务拒绝策略</li> |
| | | <li>优化IE11上传预览不显示的问题</li> |
| | | <li>优化Excel格式化不同类型的日期对象</li> |
| | | <li>优化国际化配置多余的zh请求问题</li> |
| | | <li>优化新版Chrome浏览器回退出现的遮罩层</li> |
| | | <li>修复EMAIL类型回退键被禁止问题</li> |
| | | <li>修复Xss注解字段值为空时的异常问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v472">v4.7.2</a><code class="pull-right">2021.12.23</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v472" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>自定义xss校验注解实现</li> |
| | | <li>进入修改页面方法添加权限标识</li> |
| | | <li>代码生成创建按钮添加超级管理员权限</li> |
| | | <li>代码生成创建表检查关键字,防止注入风险</li> |
| | | <li>修复定时任务多参数逗号分隔的问题</li> |
| | | <li>修复表格插件一起使用出现的声明报错问题</li> |
| | | <li>修复代码生成主子表模板删除方法缺少事务</li> |
| | | <li>升级oshi到最新版本v5.8.6</li> |
| | | <li>升级velocity到最新版本2.3</li> |
| | | <li>升级fastjson到最新版1.2.79</li> |
| | | <li>升级log4j2到最新版2.17.0 防止漏洞风险</li> |
| | | <li>升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞</li> |
| | | <li>优化修改/授权角色实时生效</li> |
| | | <li>修整tomcat配置参数已过期问题</li> |
| | | <li>前端添加单独的二代身份证校验</li> |
| | | <li>优化新增部门时验证用户所属部门</li> |
| | | <li>优化查询用户的角色组&岗位组代码</li> |
| | | <li>请求分页方法设置成通用方便灵活调用</li> |
| | | <li>优化日期类型错误提示与图标重叠问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v471">v4.7.1</a><code class="pull-right">2021.11.10</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v471" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增是否开启页签功能</li> |
| | | <li>代码生成的模块增加创建表功能</li> |
| | | <li>Excel导入支持@Excels注解</li> |
| | | <li>Excel注解支持导入导出标题信息</li> |
| | | <li>Excel注解支持自定义数据处理器</li> |
| | | <li>日志注解新增是否保存响应参数</li> |
| | | <li>防重提交注解支持配置间隔时间/提示消息</li> |
| | | <li>网页部分操作禁止使用后退键(Backspace)</li> |
| | | <li>实例演示中增加多层窗口获取值</li> |
| | | <li>弹出层openOptions增加动画属性</li> |
| | | <li>升级spring-boot到最新版本2.5.6</li> |
| | | <li>升级spring-boot-mybatis到最新版2.2.0</li> |
| | | <li>升级pagehelper到最新版1.4.0</li> |
| | | <li>升级oshi到最新版本v5.8.2</li> |
| | | <li>升级druid到最新版1.2.8</li> |
| | | <li>升级fastjson到最新版1.2.78</li> |
| | | <li>升级thymeleaf-extras-shiro到最新版本v2.1.0</li> |
| | | <li>升级bootstrap-fileinput到最新版本v5.2.4</li> |
| | | <li>修改阿里云maven仓库地址为新版地址</li> |
| | | <li>定时任务屏蔽违规字符</li> |
| | | <li>增加sendGet无参请求方法</li> |
| | | <li>代码生成去掉多余的排序字段</li> |
| | | <li>优化启动脚本参数优化</li> |
| | | <li>优化页签关闭右侧清除iframe元素</li> |
| | | <li>优化多表格切换表单查询参数</li> |
| | | <li>优化表格实例切换event不能为空</li> |
| | | <li>优化mybatis全局默认的执行器</li> |
| | | <li>优化导入Excel数据关闭时清理file</li> |
| | | <li>优化Excel导入图片可能出现的异常</li> |
| | | <li>优化记录登录信息,防止不必要的修改</li> |
| | | <li>优化aop语法,使用spring自动注入注解</li> |
| | | <li>修复无法被反转义问题</li> |
| | | <li>修复拖拽行数据错位问题</li> |
| | | <li>修复新窗口打开页面关闭弹窗报错</li> |
| | | <li>修复富文本回退键被禁止&控制台报错问题</li> |
| | | <li>修复自定义弹出层全屏参数无效问题</li> |
| | | <li>修复树表代码生成短字段无法识别问题</li> |
| | | <li>修复apple/webkit浏览器时间无法格式化</li> |
| | | <li>修复后端主子表代码模板方法名生成错误问题</li> |
| | | <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v470">v4.7.0</a><code class="pull-right">2021.09.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v470" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>优化弹出层显示在顶层窗口</li> |
| | | <li>定时任务支持在线生成cron表达式</li> |
| | | <li>Excel注解支持Image图片导入</li> |
| | | <li>支持配置是否开启记住我功能</li> |
| | | <li>修改时检查用户数据权限范围</li> |
| | | <li>表单重置开始/结束时间控件</li> |
| | | <li>新增多图上传示例</li> |
| | | <li>启用父部门状态排除顶级节点</li> |
| | | <li>富文本默认dialogsInBody属性</li> |
| | | <li>去除默认分页合理化参数</li> |
| | | <li>顶部菜单跳转添加绝对路径</li> |
| | | <li>升级oshi到最新版本v5.8.0</li> |
| | | <li>升级shiro到最新版本v1.8.0</li> |
| | | <li>升级commons.io到最新版本v2.11.0</li> |
| | | <li>升级jquery到最新版v3.6.0</li> |
| | | <li>升级icheck到最新版v1.0.3</li> |
| | | <li>升级layer到最新版本v3.5.1</li> |
| | | <li>升级layui到最新版本v2.6.8</li> |
| | | <li>升级laydate到最新版本v5.3.1</li> |
| | | <li>升级select2到最新版v4.0.13</li> |
| | | <li>升级cropper到最新版本v1.5.12</li> |
| | | <li>升级summernote到最新版本v0.8.18</li> |
| | | <li>升级duallistbox到最新版本v3.0.9</li> |
| | | <li>升级jquery.validate到最新版本v1.19.3</li> |
| | | <li>升级bootstrap-suggest到最新版本v0.1.29</li> |
| | | <li>升级bootstrap-select到最新版本v1.13.18</li> |
| | | <li>升级bootstrap-fileinput到最新版本v5.2.3</li> |
| | | <li>查询表格指定列值增加是否去重属性</li> |
| | | <li>删除sourceMappingURL源映射</li> |
| | | <li>去除多余的favicon.ico引入</li> |
| | | <li>优化代码生成模板</li> |
| | | <li>优化XSS跨站脚本过滤</li> |
| | | <li>补充定时任务表字段注释</li> |
| | | <li>定时任务屏蔽ldap远程调用</li> |
| | | <li>定时任务屏蔽http(s)远程调用</li> |
| | | <li>定时任务对检查异常进行事务回滚</li> |
| | | <li>调度日志详细页添加关闭按钮</li> |
| | | <li>优化异常打印输出信息</li> |
| | | <li>优化移动端进入首页样式</li> |
| | | <li>优化用户操作不能删除自己</li> |
| | | <li>默认开始/结束时间绑定控件选择类型</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v462">v4.6.2</a><code class="pull-right">2021.07.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v462" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>优化参数&字典缓存操作</li> |
| | | <li>新增表格参数(导出方式&导出文件类型)</li> |
| | | <li>新增表格示例(自定义视图分页)</li> |
| | | <li>新增示例(表格列拖拽)</li> |
| | | <li>集成yuicompressor实现(CSS/JS压缩)</li> |
| | | <li>新增表格参数(是否支持打印页面showPrint)</li> |
| | | <li>支持bat脚本执行应用</li> |
| | | <li>修复存在的SQL注入漏洞问题</li> |
| | | <li>定时任务屏蔽rmi远程调用</li> |
| | | <li>导出Excel文件支持数据流下载方式</li> |
| | | <li>实例演示弹层组件增加相册层示例</li> |
| | | <li>删除操作日志记录信息</li> |
| | | <li>增加表格重置分页的参数</li> |
| | | <li>限制超级管理员不允许操作</li> |
| | | <li>树级结构更新子节点使用replaceFirst</li> |
| | | <li>支持动态生成密匙,防止默认密钥泄露</li> |
| | | <li>升级pagehelper到最新版1.3.1</li> |
| | | <li>升级oshi到最新版本v5.7.4</li> |
| | | <li>升级swagger到最新版本v3.0.0</li> |
| | | <li>升级commons.io到最新版本v2.10.0</li> |
| | | <li>升级commons.fileupload到最新版本v1.4</li> |
| | | <li>升级bootstrap-table到最新版本v1.18.3</li> |
| | | <li>升级druid到最新版本v1.2.6</li> |
| | | <li>升级fastjson到最新版1.2.76</li> |
| | | <li>升级layui到最新版本v2.6.6</li> |
| | | <li>升级layer到最新版本v3.5.0</li> |
| | | <li>升级laydate到最新版本v5.3.0</li> |
| | | <li>优化表格树移动端&边框显示</li> |
| | | <li>新增表格刷新options配置方法</li> |
| | | <li>优化图片工具类读取文件,防止异常</li> |
| | | <li>修复表格图片预览移动端宽高无效问题</li> |
| | | <li>主子表通用操作封装处理增加文本域类型</li> |
| | | <li>日志注解兼容获取json类型的参数</li> |
| | | <li>修复表单向导插件有滚动条时底部工具栏无法固定问题</li> |
| | | <li>修复导出角色数据范围翻译缺少仅本人</li> |
| | | <li>修正Velocity模板初始字符集</li> |
| | | <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li> |
| | | <li>优化代码生成导出模板名称</li> |
| | | <li>修改个人中心密码长度提醒</li> |
| | | <li>实例演示中弹出表格增加以回调形式回显到父窗体</li> |
| | | <li>修复登录页面弹窗文字不显示的问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v461">v4.6.1</a><code class="pull-right">2021.04.12</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v461" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增IE浏览器版本过低提示页面</li> |
| | | <li>新增详细信息tab页签方式</li> |
| | | <li>新增解锁屏幕打开上次页签</li> |
| | | <li>数据监控默认账户密码防止越权访问</li> |
| | | <li>新增表格示例(导出选择列)</li> |
| | | <li>个人信息添加手机&邮箱重复验证</li> |
| | | <li>个人中心刷新后样式问题</li> |
| | | <li>操作日志返回参数添加非空验证</li> |
| | | <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li> |
| | | <li>子表模板默认日期格式化</li> |
| | | <li>代码生成预览语言根据后缀名高亮显示</li> |
| | | <li>代码生成主子表相同字段导致数据问题</li> |
| | | <li>升级SpringBoot到最新版本2.2.13</li> |
| | | <li>升级shiro到最新版1.7.1 阻止身份认证绕过漏洞</li> |
| | | <li>升级bootstrapTable到最新版本v1.18.2</li> |
| | | <li>升级bootstrapTable相关组件到最新版本v1.18.2</li> |
| | | <li>升级fastjson到最新版1.2.75</li> |
| | | <li>升级druid到最新版本v1.2.4</li> |
| | | <li>升级oshi到最新版本v5.6.0</li> |
| | | <li>修改ip字段长度防止ipv6地址长度不够</li> |
| | | <li>搜索建议示例选择后隐藏列表</li> |
| | | <li>主子表示例增加初始化数据</li> |
| | | <li>优化Excel导入增加空行判断</li> |
| | | <li>修复横向菜单无法打开页签问题</li> |
| | | <li>修复导入数据为负浮点数时,导入结果会丢失精度问题</li> |
| | | <li>优化更多操作按钮左侧移入内容闪现消失情况</li> |
| | | <li>修复主子表提交中列隐藏后出现列偏移问题</li> |
| | | <li>单据打印网页时通过hidden-print隐藏元素</li> |
| | | <li>表格销毁清除记住选择数据</li> |
| | | <li>增加表格动态列示例</li> |
| | | <li>代码生成选择主子表关联元素必填</li> |
| | | <li>tree根据Id和Name选中指定节点增加空判断</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v46">v4.6.0</a><code class="pull-right">2021.01.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v46" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增缓存监控管理</li> |
| | | <li>新增锁定屏幕功能</li> |
| | | <li>菜单新增是否刷新页面</li> |
| | | <li>删除用户和角色解绑关联</li> |
| | | <li>新增密码强度字符范围提示</li> |
| | | <li>防止匿名访问进行过滤</li> |
| | | <li>升级SpringBoot到最新版本2.2.12</li> |
| | | <li>升级poi到最新版本4.1.2</li> |
| | | <li>升级bitwalker到最新版本1.21</li> |
| | | <li>升级bootstrap-fileinput到最新版本5.1.3</li> |
| | | <li>升级bootstrapTable到最新版本v1.18.0</li> |
| | | <li>升级bootstrapTable相关组件到最新版本v1.18.0</li> |
| | | <li>升级oshi到最新版本v5.3.6</li> |
| | | <li>新增示例(标签 & 提示)</li> |
| | | <li>添加单据打印示例</li> |
| | | <li>修改表格初始参数sortName默认值为undefined</li> |
| | | <li>新增表格参数(自定义打印页面模板printPageBuilder)</li> |
| | | <li>新增表格参数(是否显示行间隔色striped)</li> |
| | | <li>新增表格参数(渲染完成后执行的事件onPostBody)</li> |
| | | <li>Excel注解支持Image图片导出</li> |
| | | <li>Excel支持注解align对齐方式</li> |
| | | <li>Excel支持导入Boolean型数据</li> |
| | | <li>主子表操作添加通用addColumn方法</li> |
| | | <li>代码生成日期控件区分范围</li> |
| | | <li>代码生成数据库文本类型生成表单文本域</li> |
| | | <li>修复生成主子表外键名错误</li> |
| | | <li>选项卡新增是否刷新属性</li> |
| | | <li>修复树表格表头跟表格宽度不同步的问题</li> |
| | | <li>表格树加载完成触发tooltip方法</li> |
| | | <li>使用widthUnit定义树表格选项单位</li> |
| | | <li>修复主子表editColumn序列问题</li> |
| | | <li>修复添加全屏在无参数时没有替换url参数问题</li> |
| | | <li>弹出层openOptions移动端自适应</li> |
| | | <li>防止错误页返回主页出现嵌套问题</li> |
| | | <li>设置回显数据字典验证防止空值</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v451">v4.5.1</a><code class="pull-right">2020.11.18</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v451" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>阻止任意文件下载漏洞</li> |
| | | <li>升级shiro到最新版1.7.0 阻止权限绕过漏洞</li> |
| | | <li>升级druid到最新版本v1.2.2</li> |
| | | <li>新增表格行触发事件(onCheck、onUncheck、onCheckAll、onUncheckAll)</li> |
| | | <li>修复多页签关闭非当前选项出现空白问题</li> |
| | | <li>代码生成预览支持高亮显示</li> |
| | | <li>mapperLocations配置支持分隔符</li> |
| | | <li>权限信息调整</li> |
| | | <li>个人中心头像和上传头像增加默认图片</li> |
| | | <li>全局配置类保持和其他应用命名相同</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v45">v4.5.0</a><code class="pull-right">2020.10.20</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v45" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增菜单导航显示风格(default为左侧导航菜单,topnav为顶部导航菜单)</li> |
| | | <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li> |
| | | <li>账号密码支持自定义更新周期</li> |
| | | <li>初始密码支持自定义修改策略</li> |
| | | <li>新增校验用户修改新密码不能与旧密码相同</li> |
| | | <li>添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+</li> |
| | | <li>注册账号设置默认用户名称及密码最后更新时间</li> |
| | | <li>去除用户手机邮箱部门必填验证</li> |
| | | <li>新增日期格式化方法</li> |
| | | <li>代码生成添加bit类型</li> |
| | | <li>树结构加载添加callBack回调方法</li> |
| | | <li>修复用户管理页面滚动返回顶部条失效</li> |
| | | <li>修复代码生成模板文件上传组件缺少ctx的问题</li> |
| | | <li>限制系统内置参数不允许删除</li> |
| | | <li>新增表格列宽拖动插件</li> |
| | | <li>新增Ajax局部刷新demo</li> |
| | | <li>新增是否开启页脚功能</li> |
| | | <li>新增表格参数(通过自定义函数设置标题样式headerStyle)</li> |
| | | <li>新增表格参数(通过自定义函数设置页脚样式footerStyle)</li> |
| | | <li>修复窗体大小改变后浮动提示框失效问题</li> |
| | | <li>生成代码补充必填样式</li> |
| | | <li>生成页面时不忽略remark属性</li> |
| | | <li>字典数据列表页添加关闭按钮</li> |
| | | <li>Excel注解支持自动统计数据总和</li> |
| | | <li>升级springboot到2.1.17 提升安全性</li> |
| | | <li>升级pagehelper到最新版1.3.0</li> |
| | | <li>升级druid到最新版本v1.2.1</li> |
| | | <li>升级fastjson到最新版1.2.74</li> |
| | | <li>升级bootstrap-fileinput到最新版本5.1.2</li> |
| | | <li>升级oshi到最新版本v5.2.5</li> |
| | | <li>表单向导插件更换为jquery-smartwizard</li> |
| | | <li>修改主子表提交示例代码防止渲染失效</li> |
| | | <li>添加导入数据弹出窗体自定义宽高</li> |
| | | <li>用户信息参数返回忽略掉密码字段</li> |
| | | <li>优化关闭窗体添加index参数</li> |
| | | <li>回显数据字典(字符串数组)增加空值判断</li> |
| | | <li>修改前端密码长度校验和错误提示不符问题</li> |
| | | <li>AjaxResult重写put方法,以方便链式调用</li> |
| | | <li>增强验证码校验的语义,更易懂</li> |
| | | <li>导入excel整形值校验优化</li> |
| | | <li>Excel导出类型NUMERIC支持精度浮点类型</li> |
| | | <li>导出Excel调整targetAttr获取值方法,防止get方法不规范</li> |
| | | <li>输入框组验证错误后置图标提示颜色</li> |
| | | <li>上传媒体类型添加视频格式</li> |
| | | <li>数据权限判断参数类型</li> |
| | | <li>修正数据库字符串类型nvarchar</li> |
| | | <li>优化递归子节点</li> |
| | | <li>修复多表格搜索formId无效</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v44" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>升级bootstrapTable到最新版本1.17.1</li> |
| | | <li>升级shiro到最新版1.6.0 阻止权限绕过漏洞</li> |
| | | <li>升级fastjson到最新版1.2.73</li> |
| | | <li>代码生成支持同步数据库</li> |
| | | <li>代码生成支持富文本控件</li> |
| | | <li>用户密码支持自定义配置规则</li> |
| | | <li>新增表格自动刷新插件</li> |
| | | <li>新增表格打印配置插件</li> |
| | | <li>更换图片裁剪工具为cropper</li> |
| | | <li>Excel支持sort导出排序</li> |
| | | <li>代码生成支持自定义路径</li> |
| | | <li>代码生成支持选择上级菜单</li> |
| | | <li>代码生成支持上传控件</li> |
| | | <li>新增表格参数(自定义加载文本的字体大小loadingFontSize)</li> |
| | | <li>Excel注解支持设置BigDecimal精度&舍入规则</li> |
| | | <li>操作日志记录排除敏感属性字段</li> |
| | | <li>修复不同浏览器附件下载中文名乱码的问题</li> |
| | | <li>用户分配角色不允许选择超级管理员角色</li> |
| | | <li>更换表格冻结列插件</li> |
| | | <li>添加右侧冻结列示例</li> |
| | | <li>升级表格行编辑&移动端适应插件</li> |
| | | <li>修复更新表格插件后无法设置实例配置问题</li> |
| | | <li>修复更新表格插件后导致的主子表错误</li> |
| | | <li>修复页面存在多表格,回调函数res数据不正确问题</li> |
| | | <li>强退&过期清理登录帐号缓存会话</li> |
| | | <li>表格树标题内容支持html语义化标签</li> |
| | | <li>修复配置应用的访问路径首页页签重复问题</li> |
| | | <li>优化openTab打开时滚动到当前页签</li> |
| | | <li>表格请求方式method支持自定义配置</li> |
| | | <li>菜单页签联动优化</li> |
| | | <li>用户邮箱长度限制修改为50</li> |
| | | <li>主子表示例添加日期格式案例</li> |
| | | <li>修改表格行内编辑示例旧值参数</li> |
| | | <li>操作日志查询方式调整</li> |
| | | <li>唯一限制条件只返回单条数据</li> |
| | | <li>修改Excel设置STRING单元格类型</li> |
| | | <li>添加获取当前的环境配置方法</li> |
| | | <li>截取返回参数长度,防止超出异常</li> |
| | | <li>定时任务cron表达式验证</li> |
| | | <li>拆分表格插件,按需引入</li> |
| | | <li>多行文本框补齐必填错误提示背景</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v431">v4.3.1</a><code class="pull-right">2020.07.05</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v431" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>国家信息安全漏洞(请务必保持cipherKey密钥唯一性)</li> |
| | | <li>升级shiro到最新版1.5.3 阻止权限绕过漏洞</li> |
| | | <li>修改验证码在使用后清除,防止多次使用</li> |
| | | <li>检查字符支持小数点&降级改成异常提醒</li> |
| | | <li>openOptions函数中加入自定义maxmin属性</li> |
| | | <li>支持openOptions方法最大化</li> |
| | | <li>支持openOptions方法多个按钮回调</li> |
| | | <li>新增isLinkage支持页签与菜单联动</li> |
| | | <li>修改代码生成导入表结构出现异常页面不提醒问题</li> |
| | | <li>优化用户头像发生错误,则显示一个默认头像</li> |
| | | <li>Excel导出支持字典类型</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v43">v4.3.0</a><code class="pull-right">2020.06.22</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v43" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>代码生成模板支持主子表</li> |
| | | <li>代码生成显示类型支持复选框</li> |
| | | <li>前端表单样式修改成圆角</li> |
| | | <li>新增回显数据字典(字符串数组)</li> |
| | | <li>修复浏览器手动缩放比例后菜单无法自适应问题</li> |
| | | <li>限制用户不允许选择系统管理员角色</li> |
| | | <li>用户信息添加输入框组图标&鼠标按下显示密码</li> |
| | | <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li> |
| | | <li>升级Bootstrap版本到v3.3.7</li> |
| | | <li>修复selectColumns方法获取子对象数据无效问题</li> |
| | | <li>修改数据源类型优先级,先根据方法,再根据类</li> |
| | | <li>修改上级部门(选择项排除本身和下级)</li> |
| | | <li>首页菜单显示调整</li> |
| | | <li>添加是否开启swagger配置</li> |
| | | <li>新增示例(主子表提交)</li> |
| | | <li>新增示例(多级联动下拉示例)</li> |
| | | <li>新增示例(表格属性data数据加载)</li> |
| | | <li>新增表格列参数(是否列选项可见ignore)</li> |
| | | <li>新增表格参数(是否启用显示卡片视图cardView)</li> |
| | | <li>新增表格参数(是否显示全屏按钮showFullscreen)</li> |
| | | <li>新增表格参数(是否启用分页条无限循环的功能paginationLoop)</li> |
| | | <li>新增表格参数(是否显示表头showHeader)</li> |
| | | <li>表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns</li> |
| | | <li>修复部分情况节点不展开问题</li> |
| | | <li>修复关闭标签页后刷新还是上次地址问题</li> |
| | | <li>修复选择菜单后刷新页面,菜单箭头显示不对问题</li> |
| | | <li>修复jquery表单序列化时复选框未选中不会序列化到对象中问题</li> |
| | | <li>Excel支持readConverterExp读取字符串组内容</li> |
| | | <li>更换IP地址查询接口</li> |
| | | <li>默认关闭获取ip地址</li> |
| | | <li>操作处理ajaxSuccess判断修正</li> |
| | | <li>HttpUtils.sendPost()方法,参数无需拼接参数到url</li> |
| | | <li>通用http发送方法增加参数 contentType 编码类型</li> |
| | | <li>HTML过滤器不替换&实体</li> |
| | | <li>代码生成浮点型改用BigDecimal</li> |
| | | <li>修复表单构建单选和多选框渲染问题</li> |
| | | <li>代码生成模板调整,字段为String并且必填则加空串条件</li> |
| | | <li>字典数据查询列表根据dictSort升序排序</li> |
| | | <li>修复树表对imageView和tooltip方法无效问题</li> |
| | | <li>修复Long类型比较相等问题调整</li> |
| | | <li>示例demo页面清除html链接,防止点击后跳转出现404</li> |
| | | <li>在线用户强退方法合并</li> |
| | | <li>添加校验部门包含未停用的子部门</li> |
| | | <li>取消回车自动提交表单</li> |
| | | <li>'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中</li> |
| | | <li>邮箱显示截取部分字符串,防止低分辨率错位</li> |
| | | <li>代码生成列属性根据sort排序</li> |
| | | <li>修复更多操作部分浏览器不兼容情况</li> |
| | | <li>图片预览事件属性修正</li> |
| | | <li>修复冻结列排序样式无效问题</li> |
| | | <li>修复context-path的情况下个人中心刷新导致样式问题</li> |
| | | <li>全屏editFull打开适配表树</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v42">v4.2.0</a><code class="pull-right">2020.03.23</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v42" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>用户管理添加分配角色页面</li> |
| | | <li>定时任务添加调度日志按钮</li> |
| | | <li>新增是否开启用户注册功能</li> |
| | | <li>新增页面滚动显示返回顶部按钮</li> |
| | | <li>用户&角色&任务添加更多操作按钮</li> |
| | | <li>iframe框架页会话过期弹出超时提示</li> |
| | | <li>移动端登录不显示左侧菜单</li> |
| | | <li>侧边栏添加一套深蓝色主题</li> |
| | | <li>首页logo固定,不随菜单滚动</li> |
| | | <li>支持mode配置history(表示去掉地址栏的#)</li> |
| | | <li>任务分组字典翻译(调度日志详细)</li> |
| | | <li>字典管理添加缓存读取</li> |
| | | <li>字典数据列表标签显示样式</li> |
| | | <li>参数管理支持缓存操作</li> |
| | | <li>日期控件清空结束时间设置开始默认值为2099-12-31</li> |
| | | <li>表格树添加获取数据后响应回调处理</li> |
| | | <li>批量替换表前缀调整</li> |
| | | <li>支持表格导入模板的弹窗表单加入其它输入控件</li> |
| | | <li>表单重置刷新表格树</li> |
| | | <li>新增支持导出数据字段排序</li> |
| | | <li>新增表格参数(是否单选checkbox)</li> |
| | | <li>druid未授权不允许访问</li> |
| | | <li>表格树父节点兼容0,'0','',null</li> |
| | | <li>表单必填的项添加星号</li> |
| | | <li>修复select2不显示校验错误信息</li> |
| | | <li>添加自定义HTML过滤器</li> |
| | | <li>修复多数据源下开关关闭出现异常问题</li> |
| | | <li>修复翻页记住选择项数据问题</li> |
| | | <li>用户邮箱长度限制20</li> |
| | | <li>修改错误页面返回主页出现嵌套问题</li> |
| | | <li>表格浮动提示单双引号转义</li> |
| | | <li>支持配置四级菜单</li> |
| | | <li>升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击</li> |
| | | <li>升级summernote到最新版本v0.8.12</li> |
| | | <li>导入Excel根据dateFormat属性格式处理</li> |
| | | <li>修复War部署无法正常shutdown,ehcache内存泄漏</li> |
| | | <li>修复代码生成短字段无法识别问题</li> |
| | | <li>修复serviceImpl模版,修改方法判断日期错误</li> |
| | | <li>代码生成模板增加导出功能日志记录</li> |
| | | <li>代码生成唯一编号调整为tableId</li> |
| | | <li>代码生成查询时忽略大小写</li> |
| | | <li>代码生成支持翻页记住选中</li> |
| | | <li>代码生成表注释未填写也允许导入</li> |
| | | <li>Global全局配置类修改为注解,防止多环境配置下读取问题</li> |
| | | <li>修复多表格情况下,firstLoad只对第一个表格生效</li> |
| | | <li>处理Maven打包出现警告问题</li> |
| | | <li>默认主题样式,防止网速慢情况下出现空白</li> |
| | | <li>修复文件上传多级目录识别问题</li> |
| | | <li>锚链接解码url,防止中文导致页面不能加载问题</li> |
| | | <li>修复右键Tab页刷新事件重复请求问题</li> |
| | | <li>角色禁用&菜单隐藏不查询权限</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v41">v4.1.0</a><code class="pull-right">2019.10.22</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v41" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>支持多表格实例操作</li> |
| | | <li>浮动提示方法tooltip支持弹窗</li> |
| | | <li>代码生成&字典数据支持模糊条件查询</li> |
| | | <li>增加页签全屏方法</li> |
| | | <li>增加清除表单验证错误信息方法</li> |
| | | <li>支持iframe局部刷新页面</li> |
| | | <li>支持在线切换主题</li> |
| | | <li>修改图片预览设置的高宽参数颠倒问题</li> |
| | | <li>操作日志新增解锁账户功能</li> |
| | | <li>管理员用户&角色不允许操作</li> |
| | | <li>去掉jsoup包调用自定义转义工具</li> |
| | | <li>添加时间轴示例</li> |
| | | <li>修复翻页记住选择时获取指定列值的问题</li> |
| | | <li>代码生成sql脚本添加导出按钮</li> |
| | | <li>添加表格父子视图示例</li> |
| | | <li>添加表格行内编辑示例</li> |
| | | <li>升级fastjson到最新版1.2.60 阻止漏洞攻击</li> |
| | | <li>升级echarts到最新版4.2.1</li> |
| | | <li>操作日志新增返回参数</li> |
| | | <li>支持mybatis通配符扫描任意多个包</li> |
| | | <li>权限验证多种情况处理</li> |
| | | <li>修复树形类型的代码生成的部分必要属性无法显示</li> |
| | | <li>修复非表格插件情况下重置出现异常</li> |
| | | <li>修复富文本编辑器有序列表冲突</li> |
| | | <li>代码生成表前缀配置支持多个</li> |
| | | <li>修复自动去除表前缀配置无效问题</li> |
| | | <li>菜单列表按钮数据可见不显示(权限标识控制)</li> |
| | | <li>修复设置会话超时时间无效问题</li> |
| | | <li>新增本地资源通用下载方法</li> |
| | | <li>操作日志记录新增请求方式</li> |
| | | <li>代码生成单选按钮属性重名修复</li> |
| | | <li>优化select2下拉框宽度不会随浏览器改变</li> |
| | | <li>修复代码生成树表异常</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v40">v4.0.0</a><code class="pull-right">2019.08.08</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v40" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>代码生成支持预览、编辑,保存方案</li> |
| | | <li>新增防止表单重复提交注解</li> |
| | | <li>新增后端校验(和前端保持一致)</li> |
| | | <li>新增同一个用户最大会话数控制</li> |
| | | <li>Excel导出子对象支持多个字段</li> |
| | | <li>定时任务支持静态调用和多参数</li> |
| | | <li>定时任务增加分组条件查询</li> |
| | | <li>字典类型增加任务分组数据</li> |
| | | <li>新增表格是否首次加载数据</li> |
| | | <li>新增parentTab选项卡可在同一页签打开</li> |
| | | <li>多数据源支持类注解(允许继承父类的注解)</li> |
| | | <li>部门及以下数据权限(调整为以下及所有子节点)</li> |
| | | <li>新增角色数据权限配(仅本人数据权限)</li> |
| | | <li>修改菜单权限显示问题</li> |
| | | <li>上传文件修改路径及返回名称</li> |
| | | <li>添加报表插件及示例</li> |
| | | <li>添加首页统计模板</li> |
| | | <li>添加表格拖拽示例</li> |
| | | <li>添加卡片列表示例</li> |
| | | <li>添加富文本编辑器示例</li> |
| | | <li>添加表格动态增删改查示例</li> |
| | | <li>添加用户页面岗位选择框提示</li> |
| | | <li>点击菜单操作添加背景高亮显示</li> |
| | | <li>表格树新增showSearch是否显示检索信息</li> |
| | | <li>解决表格列设置sortName无效问题</li> |
| | | <li>表格图片预览支持自定义设置宽高</li> |
| | | <li>添加表格列浮动提示(单击文本复制)</li> |
| | | <li>PC端收起菜单后支持浮动显示</li> |
| | | <li>详细操作样式调整</li> |
| | | <li>修改用户更新描述空串不更新问题</li> |
| | | <li>导入修改为模板渲染</li> |
| | | <li>修改菜单及部门排序规则</li> |
| | | <li>角色导出数据范围表达式翻译</li> |
| | | <li>添加summernote富文本字体大小</li> |
| | | <li>优化表格底部下边框防重叠&汇总像素问题</li> |
| | | <li>树表格支持属性多层级访问</li> |
| | | <li>修复IE浏览器用户管理界面右侧留白问题</li> |
| | | <li>重置按钮刷新表格</li> |
| | | <li>重置密码更新用户缓存</li> |
| | | <li>优化验证码属性参数</li> |
| | | <li>支持数据监控配置用户名和密码</li> |
| | | <li>文件上传修改按钮背景及加载动画</li> |
| | | <li>支持配置一级菜单href跳转</li> |
| | | <li>侧边栏添加一套浅色主题</li> |
| | | <li>树表格添加回调函数(校验异常状态)</li> |
| | | <li>用户个人中心适配手机端显示</li> |
| | | <li>Excel支持设置导出类型&更换样式</li> |
| | | <li>检查属性改变修改为克隆方式(防止热部署强转异常)</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v34">v3.4.0</a><code class="pull-right">2019.06.03</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v34" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增实例演示菜单及demo</li> |
| | | <li>新增页签右键操作</li> |
| | | <li>菜单管理新增打开方式</li> |
| | | <li>新增点击某行触发的事件</li> |
| | | <li>新增双击某行触发的事件</li> |
| | | <li>新增单击某格触发的事件</li> |
| | | <li>新增双击某格触发的事件</li> |
| | | <li>新增是否启用显示细节视图</li> |
| | | <li>支持上传任意格式文件</li> |
| | | <li>修复角色权限注解失效问题</li> |
| | | <li>左侧的菜单栏宽度调整</li> |
| | | <li>新增响应完成后自定义回调函数</li> |
| | | <li>支持前端及其他模块直接获取用户信息</li> |
| | | <li>升级swagger到最新版2.9.2</li> |
| | | <li>升级jquery.slimscroll到最新版1.3.8</li> |
| | | <li>升级select2到最新版4.0.7</li> |
| | | <li>新增角色配置本部门数据权限</li> |
| | | <li>新增角色配置本部门及以下数据权限</li> |
| | | <li>优化底部操作防止跳到页面顶端</li> |
| | | <li>修改冻结列选框无效及样式问题</li> |
| | | <li>修复部门四层级修改祖级无效问题</li> |
| | | <li>更换开关切换按钮样式</li> |
| | | <li>新增select2-bootstrap美化下拉框</li> |
| | | <li>添加表格内图片预览方法</li> |
| | | <li>修复权限校验失败跳转页面路径错误</li> |
| | | <li>国际化资源文件调整</li> |
| | | <li>通知公告布局调整</li> |
| | | <li>删除页签操作功能</li> |
| | | <li>表格树新增查询指定列值</li> |
| | | <li>更改系统接口扫描方式及完善测试案例</li> |
| | | <li>表格列浮动提示及字典回显默认去背景</li> |
| | | <li>修复启用翻页记住前面的选择check没选中问题</li> |
| | | <li>去除监控页面底部的广告</li> |
| | | <li>日期控件功问题修复及data功能增强</li> |
| | | <li>新增角色权限可见性(前端直接调用)</li> |
| | | <li>新增获取当前登录用户方法(前端及子模块调用)</li> |
| | | <li>修复热部署重启导致菜单丢失问题</li> |
| | | <li>优化业务校验失败普通请求跳转页面</li> |
| | | <li>操作日志新增状态条件查询</li> |
| | | <li>操作类型支持多选条件查询</li> |
| | | <li>通知公告防止滚动触底回弹优化</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v33">v3.3.0</a><code class="pull-right">2019.04.01</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v33" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增线程池统一管理</li> |
| | | <li>新增支持左右冻结列</li> |
| | | <li>新增表格字符超长浮动提示</li> |
| | | <li>升级datepicker拓展并汉化</li> |
| | | <li>升级druid到最新版本v1.1.14</li> |
| | | <li>修复个人头像为图片服务器跨域问题</li> |
| | | <li>修改上传文件按日期存储</li> |
| | | <li>新增表格客户端分页选项</li> |
| | | <li>新增表格的高度参数</li> |
| | | <li>新增表格销毁方法</li> |
| | | <li>新增表格下拉按钮切换方法</li> |
| | | <li>新增表格分页跳转到指定页码</li> |
| | | <li>新增表格启用点击选中行参数</li> |
| | | <li>修复表格数据重新加载未触发部分按钮禁用</li> |
| | | <li>使用jsonview展示操作日志参数</li> |
| | | <li>新增方法(addTab、editTab)</li> |
| | | <li>修改用户管理界面为Tab打开方式</li> |
| | | <li>表单验证代码优化</li> |
| | | <li>修复@Excel注解 prompt 属性使用报错</li> |
| | | <li>修复combo属性Excel兼容性问题</li> |
| | | <li>新增@Excel导入导出支持父类字段</li> |
| | | <li>修复关闭最后选项卡无法激活滚动问题</li> |
| | | <li>增加日期控件显示类型及回显格式扩展选项</li> |
| | | <li>修复定时任务执行失败后入库状态为成功状态</li> |
| | | <li>支持定时任务并发开关控制</li> |
| | | <li>优化权限校验失败普通请求跳转页面</li> |
| | | <li>捕获线程池执行任务抛出的异常</li> |
| | | <li>修复IE浏览器导出功能报错</li> |
| | | <li>新增角色管理分配用户功能</li> |
| | | <li>新增表格翻页记住前面的选择</li> |
| | | <li>调整用户个人中心页面</li> |
| | | <li>修复界面存在的一些安全问题</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v32" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>部门修改时不允许选择最后节点</li> |
| | | <li>修复部门菜单排序字段无效</li> |
| | | <li>修复光驱磁盘导致服务监控异常</li> |
| | | <li>登录界面去除check插件</li> |
| | | <li>验证码文本字符间距修正</li> |
| | | <li>升级SpringBoot到最新版本2.1.1</li> |
| | | <li>升级MYSQL驱动</li> |
| | | <li>修正登录必填项位置偏移</li> |
| | | <li>Session会话检查优化</li> |
| | | <li>Excel注解支持多级获取</li> |
| | | <li>新增序列号生成方法</li> |
| | | <li>修复WAR部署tomcat退出线程异常</li> |
| | | <li>全屏操作增加默认确认/关闭</li> |
| | | <li>修复个人信息可能导致漏洞</li> |
| | | <li>字典数据根据下拉选择新增类型</li> |
| | | <li>升级Summernote到最新版本v0.8.11</li> |
| | | <li>新增用户数据导入</li> |
| | | <li>首页主题样式更换</li> |
| | | <li>layer扩展主题更换</li> |
| | | <li>用户管理移动端默认隐藏左侧布局</li> |
| | | <li>详细信息弹出层显示在顶层</li> |
| | | <li>表格支持切换状态(用户/角色/定时任务)</li> |
| | | <li>Druid数据源支持配置继承</li> |
| | | <li>修正部分iPhone手机端表格适配问题</li> |
| | | <li>新增防止重复提交表单方法</li> |
| | | <li>新增表格数据统计汇总方法</li> |
| | | <li>支持富文本上传图片文件</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v31" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增内网不获取IP地址</li> |
| | | <li>新增cron表达式有效校验</li> |
| | | <li>定时任务新增详细信息</li> |
| | | <li>定时任务默认策略修改(不触发立即执行)</li> |
| | | <li>定时任务显示下一个执行周期</li> |
| | | <li>支持前端任意日期格式处理</li> |
| | | <li>上传头像删除多余提交按钮</li> |
| | | <li>表格增加行间隔色配置项</li> |
| | | <li>表格增加转义HTML字符串配置项</li> |
| | | <li>表格增加显示/隐藏指定列</li> |
| | | <li>代码生成优化</li> |
| | | <li>操作日志参数格式化显示</li> |
| | | <li>页签新增新增全屏显示</li> |
| | | <li>新增一键打包部署</li> |
| | | <li>Excel注解新增多个参数</li> |
| | | <li>新增提交静默更新表格方法</li> |
| | | <li>新增服务监控菜单</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v30">v3.0.0</a><code class="pull-right">2018.10.08</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v30" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>升级poi到最新版3.17</li> |
| | | <li>导出修改临时目录绝对路径</li> |
| | | <li>升级laydate到最新版5.0.9</li> |
| | | <li>升级SpringBoot到最新版本2.0.5</li> |
| | | <li>优化开始/结束时间校验限制</li> |
| | | <li>重置密码参数表中获取默认值</li> |
| | | <li>修复头像修改显示问题</li> |
| | | <li>新增数据权限过滤注解</li> |
| | | <li>新增表格检索折叠按钮</li> |
| | | <li>新增清空(登录、操作、调度)日志</li> |
| | | <li>固定按钮位置(提交/关闭)</li> |
| | | <li>部门/菜单支持(展开/折叠)</li> |
| | | <li>部分细节调整优化</li> |
| | | <li>项目采用分模块</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v24">v2.4.0</a><code class="pull-right">2018.09.03</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v24" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>支持部门多级查询</li> |
| | | <li>修复菜单状态查询无效</li> |
| | | <li>支持IP地址开关</li> |
| | | <li>支持XSS开关</li> |
| | | <li>记录日志异步处理</li> |
| | | <li>字典回显样式更改为下拉框</li> |
| | | <li>菜单类型必填校验</li> |
| | | <li>修复在线用户排序报错</li> |
| | | <li>增加重置按钮</li> |
| | | <li>支持注解导入数据</li> |
| | | <li>支持弹层外区域关闭</li> |
| | | <li>备注更换为文本区域</li> |
| | | <li>新增角色逻辑删除</li> |
| | | <li>新增部门逻辑删除</li> |
| | | <li>支持部门数据权限</li> |
| | | <li>管理员默认拥有所有授权</li> |
| | | <li>字典数据采用分页</li> |
| | | <li>部分细节调整优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v23">v2.3.0</a><code class="pull-right">2018.08.06</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v23" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>支持表格不分页开关控制</li> |
| | | <li>修改字典类型同步修改字典数据</li> |
| | | <li>代码生成新增修改后缀处理</li> |
| | | <li>代码生成新增实体toString</li> |
| | | <li>代码生成非字符串去除!=''</li> |
| | | <li>导出数据前加载遮罩层</li> |
| | | <li>部门删除校验条件修改</li> |
| | | <li>搜索查询下载优化</li> |
| | | <li>手机打开弹出层自适应</li> |
| | | <li>角色岗位禁用显示置灰</li> |
| | | <li>角色禁用不显示菜单</li> |
| | | <li>新增导出权限</li> |
| | | <li>角色权限唯一校验</li> |
| | | <li>岗位名称编码唯一校验</li> |
| | | <li>TreeTable优化</li> |
| | | <li>支持多数据源</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v22">v2.2.0</a><code class="pull-right">2018.07.23</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v22" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>修复批量生成代码异常问题</li> |
| | | <li>修复定时器保存失败问题</li> |
| | | <li>修复热部署转换问题</li> |
| | | <li>支持查询菜单管理,部门管理</li> |
| | | <li>大多数功能支持时间查询</li> |
| | | <li>自定义导出注解自动匹配column</li> |
| | | <li>新增任务执行策略</li> |
| | | <li>操作详细动态显示类型</li> |
| | | <li>支持动态回显字典数据</li> |
| | | <li>后台代码优化调整</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v21">v2.1.0</a><code class="pull-right">2018.07.10</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v21" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增登录超时提醒</li> |
| | | <li>修复定时器热部署转换问题</li> |
| | | <li>修复登录验证码校验无效问题</li> |
| | | <li>定时任务新增立即执行一次</li> |
| | | <li>存在字典数据不允许删除字典</li> |
| | | <li>字典数据支持按名称查询</li> |
| | | <li>代码生成增加日志注解&表格优化</li> |
| | | <li>修复用户逻辑删除后能登录问题</li> |
| | | <li>表格支持多字段动态排序</li> |
| | | <li>支持三级菜单显示</li> |
| | | <li>新增ry.sh启动程序脚本</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v20">v2.0.0</a><code class="pull-right">2018.07.02</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v20" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>升级SpringBoot到最新版本2.0.3</li> |
| | | <li>新增公告管理</li> |
| | | <li>表单校验示提体验优化</li> |
| | | <li>前端通用方法封装调整</li> |
| | | <li>前端去除js文件,合并到html</li> |
| | | <li>操作加载遮罩层</li> |
| | | <li>支持全屏模式操作</li> |
| | | <li>支持注解导出数据</li> |
| | | <li>系统支持多查询&下载</li> |
| | | <li>系统样式调整</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v16">v1.1.6</a><code class="pull-right">2018.06.04</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v16" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增用户列表部门列</li> |
| | | <li>新增登录地点</li> |
| | | <li>新增swagger</li> |
| | | <li>修复排序数字校验</li> |
| | | <li>优化头像上传文件类型限定为图片</li> |
| | | <li>新增XSS过滤</li> |
| | | <li>新增热部署提高开发效率</li> |
| | | <li>修复treegrid居中无效</li> |
| | | <li>角色多条件查询</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v15">v1.1.5</a><code class="pull-right">2018.05.28</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v15" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>优化登录失败刷新验证码</li> |
| | | <li>新增用户登录地址时间</li> |
| | | <li>修复ajax超时退出问题</li> |
| | | <li>新增html调用数据字典(若依首创)</li> |
| | | <li>调整系统部分样式</li> |
| | | <li>新增用户逻辑删除</li> |
| | | <li>新增管理员不允许删除修改</li> |
| | | <li>升级bootstrapTable到最新版本1.12.1</li> |
| | | <li>升级layer到最新版本3.1.1</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v14">v1.1.4</a><code class="pull-right">2018.05.20</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v14" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增参数管理</li> |
| | | <li>修复头像上传bug</li> |
| | | <li>手机邮箱唯一校验</li> |
| | | <li>支持手机邮箱登录</li> |
| | | <li>代码生成优化</li> |
| | | <li>支持模糊查询</li> |
| | | <li>支持切换主题皮肤</li> |
| | | <li>修改权限即时生效</li> |
| | | <li>修复页签Tab关闭问题</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v13" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增验证码(数组计算、字符验证)</li> |
| | | <li>新增cookie记住我</li> |
| | | <li>新增头像上传</li> |
| | | <li>用户名密码长度限制</li> |
| | | <li>通用字段提取</li> |
| | | <li>支持自定义条件查询</li> |
| | | <li>部门名称必填、时间格式调整</li> |
| | | <li>其他细节优化</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v12" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增个人信息修改</li> |
| | | <li>菜单存在子菜单不允许删除</li> |
| | | <li>菜单分配角色不允许删除</li> |
| | | <li>角色分配人员不允许删除</li> |
| | | <li>岗位使用后不允许删除</li> |
| | | <li>保证用户的数据完整性加入事物</li> |
| | | <li>新增环境使用手册、数据建模</li> |
| | | <li>Thymeleaf升级到3.0</li> |
| | | <li>支持非ROOT部署</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v11" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增表单构建器</li> |
| | | <li>代码生成优化</li> |
| | | <li>支持新增主部门</li> |
| | | <li>支持选择上级部门、上级菜单</li> |
| | | <li>新增字典管理单条删除</li> |
| | | <li>优化一些其他细节</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v10" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>支持密码盐</li> |
| | | <li>支持新增主目录</li> |
| | | <li>支持批量生成代码</li> |
| | | <li>支持表格导出(csv、txt、doc、excel)</li> |
| | | <li>自动适应宽高模式窗体</li> |
| | | <li>重复校验(角色名、菜单名、部门名)</li> |
| | | <li>优化一些其他细节</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v09" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增代码生成(生成包括 java、html、js、xml、sql)</li> |
| | | <li>新增按钮权限控制隐藏(若依首创)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v08" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增定时任务(新增、修改、删除、查询、启动/暂停)</li> |
| | | <li>新增调度日志(查询、删除)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v07" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增岗位管理(新增、修改、删除、查询)</li> |
| | | <li>优化用户管理,菜单管理部分细节</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v06" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增字典管理(新增、删除、修改、查询、数据选择)</li> |
| | | <li>新增用户密码重置</li> |
| | | <li>优化一些其他细节</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v05" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增菜单管理(新增、删除、修改、查询、图标选择)</li> |
| | | <li>部门管理优化(添加责任人、联系电话、邮箱、修改者)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v04" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增角色管理(新增、删除、修改、查询、菜单选择)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v03" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增用户管理(新增、删除、修改、查询、部门选择)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v02" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增部门管理 (新增、删除、修改、查询)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h5 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code> |
| | | </h5> |
| | | </div> |
| | | <div id="v01" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>新增在线用户 (批量强退、单条强退、查询)</li> |
| | | <li>新增登录日志 (批量删除、查询)</li> |
| | | <li>新增操作日志 (批量删除、查询、详细)</li> |
| | | <li>新增数据监控 (监控DB池连接和SQL的执行)</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="panel panel-default"> |
| | | <div class="panel-heading"> |
| | | <h4 class="panel-title"> |
| | | <a data-toggle="collapse" data-parent="#version" href="#v00">v1.0.0</a><code class="pull-right">2018.03.01</code> |
| | | </h4> |
| | | </div> |
| | | <div id="v00" class="panel-collapse collapse"> |
| | | <div class="panel-body"> |
| | | <ol> |
| | | <li>若依管理系统正式发布。</li> |
| | | </ol> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="col-sm-4"> |
| | | <div class="ibox float-e-margins"> |
| | | <div class="ibox-title"> |
| | | <h5>捐赠</h5> |
| | | </div> |
| | | <div class="ibox-content"> |
| | | <div class="alert alert-warning"> |
| | | 请作者喝杯咖啡(点击图片放大) |
| | | </div> |
| | | <p id="pay-qrcode"> |
| | | <a href="javascript:;"><img th:src="@{/img/pay.png}" width="100%" alt="请使用手机支付宝或者微信扫码支付"> |
| | | </a> |
| | | </p> |
| | | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | |
| | | <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/> |
| | | <link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/> |
| | | <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/> |
| | | <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/> |
| | | <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/> |
| | | <!-- 360浏览器急速模式 --> |
| | | <meta name="renderer" content="webkit"> |
| | | <!-- 避免IE使用兼容模式 --> |
| | |
| | | </div> |
| | | <div class="signup-footer"> |
| | | <div class="pull-left"> |
| | | © 2018-2025 All Rights Reserved. RuoYi <br> |
| | | © 2018-2024 All Rights Reserved. RuoYi <br> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <script src="../static/ajax/libs/validate/jquery.validate.extend.js" th:src="@{/ajax/libs/validate/jquery.validate.extend.js}"></script> |
| | | <script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | <script src="../static/ruoyi/register.js" th:src="@{/ruoyi/register.js}"></script> |
| | | </body> |
| | | </html> |
| | |
| | | </ul> |
| | | </body> |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script> |
| | | <script type="text/javascript"> |
| | | //皮肤样式列表 |
| | | var skins = ["skin-blue", "skin-green", "skin-purple", "skin-red", "skin-yellow"]; |
| | |
| | | <parent> |
| | | <artifactId>ruoyi</artifactId> |
| | | <groupId>com.ruoyi</groupId> |
| | | <version>4.8.0</version> |
| | | <version>4.7.9</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | |
| | | public String prompt() default ""; |
| | | |
| | | /** |
| | | * 是否允许内容换行 |
| | | */ |
| | | public boolean wrapText() default false; |
| | | |
| | | /** |
| | | * 设置只能选择不能输入的列内容. |
| | | */ |
| | | public String[] combo() default {}; |
| | |
| | | private String createBy; |
| | | |
| | | /** 创建时间 */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date createTime; |
| | | |
| | | /** 更新者 */ |
| | | private String updateBy; |
| | | |
| | | /** 更新时间 */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date updateTime; |
| | | |
| | | /** 备注 */ |
| | |
| | | /** |
| | | * 身份证,中间10位星号替换 |
| | | */ |
| | | ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{3}[Xx]|\\d{4})", "$1** **** ****$2")), |
| | | ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")), |
| | | |
| | | /** |
| | | * 手机号,中间4位星号替换 |
| | |
| | | public Class<T> clazz; |
| | | |
| | | /** |
| | | * 需要显示列属性 |
| | | */ |
| | | public String[] includeFields; |
| | | |
| | | /** |
| | | * 需要排除列属性 |
| | | */ |
| | | public String[] excludeFields; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 仅在Excel中显示列属性 |
| | | * |
| | | * @param fields 列属性名 示例[单个"name"/多个"id","name"] |
| | | */ |
| | | public void showColumn(String... fields) |
| | | { |
| | | this.includeFields = fields; |
| | | } |
| | | |
| | | /** |
| | | * 隐藏Excel中列属性 |
| | | * |
| | | * @param fields 列属性名 示例[单个"name"/多个"id","name"] |
| | | * @throws Exception |
| | | */ |
| | | public void hideColumn(String... fields) |
| | | { |
| | |
| | | { |
| | | if (StringUtils.isNotEmpty(title)) |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | int titleLastCol = this.fields.size() - 1; |
| | | if (isSubList()) |
| | | { |
| | |
| | | Cell titleCell = titleRow.createCell(0); |
| | | titleCell.setCellStyle(styles.get("title")); |
| | | titleCell.setCellValue(title); |
| | | sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), 0, titleLastCol)); |
| | | sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | if (isSubList()) |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | Row subRow = sheet.createRow(rownum); |
| | | int column = 0; |
| | | int subFieldSize = subFields != null ? subFields.size() : 0; |
| | | int excelNum = 0; |
| | | for (Object[] objects : fields) |
| | | { |
| | | Field field = (Field) objects[0]; |
| | | Excel attr = (Excel) objects[1]; |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | | { |
| | | Cell cell = subRow.createCell(column); |
| | | cell.setCellValue(attr.name()); |
| | | cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |
| | | if (subFieldSize > 1) |
| | | { |
| | | CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1); |
| | | sheet.addMergedRegion(cellAddress); |
| | | Cell headCell1 = subRow.createCell(excelNum); |
| | | headCell1.setCellValue(attr.name()); |
| | | headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |
| | | excelNum++; |
| | | } |
| | | column += subFieldSize; |
| | | } |
| | | else |
| | | int headFirstRow = excelNum - 1; |
| | | int headLastRow = headFirstRow + subFields.size() - 1; |
| | | if (headLastRow > headFirstRow) |
| | | { |
| | | Cell cell = subRow.createCell(column++); |
| | | cell.setCellValue(attr.name()); |
| | | cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); |
| | | } |
| | | sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); |
| | | } |
| | | rownum++; |
| | | } |
| | |
| | | */ |
| | | public List<T> importExcel(InputStream is) |
| | | { |
| | | return importExcel(is, 0); |
| | | } |
| | | |
| | | /** |
| | | * 对excel表单默认第一个索引名转换成list |
| | | * |
| | | * @param is 输入流 |
| | | * @param titleNum 标题占用行数 |
| | | * @return 转换后集合 |
| | | */ |
| | | public List<T> importExcel(InputStream is, int titleNum) |
| | | { |
| | | List<T> list = null; |
| | | try |
| | | { |
| | | list = importExcel(StringUtils.EMPTY, is, titleNum); |
| | | list = importExcel(is, 0); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | IOUtils.closeQuietly(is); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 对excel表单默认第一个索引名转换成list |
| | | * |
| | | * @param is 输入流 |
| | | * @param titleNum 标题占用行数 |
| | | * @return 转换后集合 |
| | | */ |
| | | public List<T> importExcel(InputStream is, int titleNum) throws Exception |
| | | { |
| | | return importExcel(StringUtils.EMPTY, is, titleNum); |
| | | } |
| | | |
| | | /** |
| | |
| | | { |
| | | int startNo = index * sheetSize; |
| | | int endNo = Math.min(startNo + sheetSize, list.size()); |
| | | int currentRowNum = rownum + 1; // 从标题行后开始 |
| | | |
| | | int rowNo = (1 + rownum) - startNo; |
| | | for (int i = startNo; i < endNo; i++) |
| | | { |
| | | row = sheet.createRow(currentRowNum); |
| | | rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; |
| | | row = sheet.createRow(rowNo); |
| | | // 得到导出对象. |
| | | T vo = (T) list.get(i); |
| | | Collection<?> subList = null; |
| | | if (isSubList()) |
| | | { |
| | | if (isSubListValue(vo)) |
| | | { |
| | | subList = getListCellValue(vo); |
| | | subMergedLastRowNum = subMergedLastRowNum + subList.size(); |
| | | } |
| | | else |
| | | { |
| | | subMergedFirstRowNum++; |
| | | subMergedLastRowNum++; |
| | | } |
| | | } |
| | | int column = 0; |
| | | int maxSubListSize = getCurrentMaxSubListSize(vo); |
| | | for (Object[] os : fields) |
| | | { |
| | | Field field = (Field) os[0]; |
| | | Excel excel = (Excel) os[1]; |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | | if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) |
| | | { |
| | | try |
| | | boolean subFirst = false; |
| | | for (Object obj : subList) |
| | | { |
| | | Collection<?> subList = (Collection<?>) getTargetValue(vo, field, excel); |
| | | if (subList != null && !subList.isEmpty()) |
| | | if (subFirst) |
| | | { |
| | | int subIndex = 0; |
| | | for (Object subVo : subList) |
| | | { |
| | | Row subRow = sheet.getRow(currentRowNum + subIndex); |
| | | if (subRow == null) |
| | | { |
| | | subRow = sheet.createRow(currentRowNum + subIndex); |
| | | rowNo++; |
| | | row = sheet.createRow(rowNo); |
| | | } |
| | | |
| | | int subColumn = column; |
| | | List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); |
| | | int subIndex = 0; |
| | | for (Field subField : subFields) |
| | | { |
| | | Excel subExcel = subField.getAnnotation(Excel.class); |
| | | addCell(subExcel, subRow, (T) subVo, subField, subColumn++); |
| | | if (subField.isAnnotationPresent(Excel.class)) |
| | | { |
| | | subField.setAccessible(true); |
| | | Excel attr = subField.getAnnotation(Excel.class); |
| | | this.addCell(attr, row, (T) obj, subField, column + subIndex); |
| | | } |
| | | subIndex++; |
| | | } |
| | | column += subFields.size(); |
| | | subFirst = true; |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("填充集合数据失败", e); |
| | | } |
| | | this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); |
| | | } |
| | | else |
| | | { |
| | | // 创建单元格并设置值 |
| | | addCell(excel, row, vo, field, column); |
| | | if (maxSubListSize > 1 && excel.needMerge()) |
| | | { |
| | | sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum + maxSubListSize - 1, column, column)); |
| | | } |
| | | column++; |
| | | } |
| | | } |
| | | currentRowNum += maxSubListSize; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取子列表最大数 |
| | | */ |
| | | private int getCurrentMaxSubListSize(T vo) |
| | | { |
| | | int maxSubListSize = 1; |
| | | for (Object[] os : fields) |
| | | { |
| | | Field field = (Field) os[0]; |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | | { |
| | | try |
| | | { |
| | | Collection<?> subList = (Collection<?>) getTargetValue(vo, field, (Excel) os[1]); |
| | | if (subList != null && !subList.isEmpty()) |
| | | { |
| | | maxSubListSize = Math.max(maxSubListSize, subList.size()); |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | log.error("获取集合大小失败", e); |
| | | this.addCell(excel, row, vo, field, column++); |
| | | } |
| | | } |
| | | } |
| | | return maxSubListSize; |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public void annotationDataStyles(Map<String, CellStyle> styles, Field field, Excel excel) |
| | | { |
| | | String key = StringUtils.format("data_{}_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType(), excel.wrapText()); |
| | | String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType()); |
| | | if (!styles.containsKey(key)) |
| | | { |
| | | CellStyle style = wb.createCellStyle(); |
| | |
| | | style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); |
| | | style.setFillPattern(FillPatternType.SOLID_FOREGROUND); |
| | | style.setFillForegroundColor(excel.backgroundColor().getIndex()); |
| | | style.setWrapText(excel.wrapText()); |
| | | Font dataFont = wb.createFont(); |
| | | dataFont.setFontName("Arial"); |
| | | dataFont.setFontHeightInPoints((short) 10); |
| | |
| | | if (isSubList()) |
| | | { |
| | | // 填充默认样式,防止合并单元格样式失效 |
| | | sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); |
| | | sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); |
| | | if (attr.needMerge()) |
| | | { |
| | | sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); |
| | |
| | | cell = row.createCell(column); |
| | | if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) |
| | | { |
| | | if (subMergedLastRowNum >= subMergedFirstRowNum) |
| | | { |
| | | sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); |
| | | CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); |
| | | sheet.addMergedRegion(cellAddress); |
| | | } |
| | | } |
| | | cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); |
| | | cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType()))); |
| | | |
| | | // 用于读取对象中的属性 |
| | | Object value = getTargetValue(vo, field, attr); |
| | |
| | | */ |
| | | private Object getTargetValue(T vo, Field field, Excel excel) throws Exception |
| | | { |
| | | field.setAccessible(true); |
| | | Object o = field.get(vo); |
| | | if (StringUtils.isNotEmpty(excel.targetAttr())) |
| | | { |
| | |
| | | List<Field> tempFields = new ArrayList<>(); |
| | | tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); |
| | | tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); |
| | | if (StringUtils.isNotEmpty(includeFields)) |
| | | { |
| | | for (Field field : tempFields) |
| | | { |
| | | if (ArrayUtils.contains(this.includeFields, field.getName()) || field.isAnnotationPresent(Excels.class)) |
| | | { |
| | | addField(fields, field); |
| | | } |
| | | } |
| | | } |
| | | else if (StringUtils.isNotEmpty(excludeFields)) |
| | | { |
| | | for (Field field : tempFields) |
| | | { |
| | | if (!ArrayUtils.contains(this.excludeFields, field.getName())) |
| | | { |
| | | addField(fields, field); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | for (Field field : tempFields) |
| | | { |
| | | addField(fields, field); |
| | | } |
| | | } |
| | | return fields; |
| | | } |
| | | |
| | | /** |
| | | * 添加字段信息 |
| | | */ |
| | | public void addField(List<Object[]> fields, Field field) |
| | | { |
| | | // 单注解 |
| | | if (field.isAnnotationPresent(Excel.class)) |
| | |
| | | Excel attr = field.getAnnotation(Excel.class); |
| | | if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) |
| | | { |
| | | field.setAccessible(true); |
| | | fields.add(new Object[] { field, attr }); |
| | | } |
| | | if (Collection.class.isAssignableFrom(field.getType())) |
| | |
| | | Excel[] excels = attrs.value(); |
| | | for (Excel attr : excels) |
| | | { |
| | | if (StringUtils.isNotEmpty(includeFields)) |
| | | { |
| | | if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr()) |
| | | && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) |
| | | { |
| | | fields.add(new Object[] { field, attr }); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) |
| | | && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) |
| | | { |
| | | field.setAccessible(true); |
| | | fields.add(new Object[] { field, attr }); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return fields; |
| | | } |
| | | |
| | | /** |
| | | * 根据注解获取最大行高 |
| | |
| | | /** |
| | | * 定义常用的 sql关键字 |
| | | */ |
| | | public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; |
| | | public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()"; |
| | | |
| | | /** |
| | | * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) |
| | |
| | | <parent> |
| | | <artifactId>ruoyi</artifactId> |
| | | <groupId>com.ruoyi</groupId> |
| | | <version>4.8.0</version> |
| | | <version>4.7.9</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | |
| | | /** 生成包路径 */ |
| | | public static String packageName; |
| | | |
| | | /** 自动去除表前缀 */ |
| | | /** 自动去除表前缀,默认是false */ |
| | | public static boolean autoRemovePre; |
| | | |
| | | /** 表前缀 */ |
| | | /** 表前缀(类名不会包含表前缀) */ |
| | | public static String tablePrefix; |
| | | |
| | | /** 是否允许生成文件覆盖到本地(自定义路径) */ |
| | | public static boolean allowOverwrite; |
| | | |
| | | public static String getAuthor() |
| | | { |
| | |
| | | public void setTablePrefix(String tablePrefix) |
| | | { |
| | | GenConfig.tablePrefix = tablePrefix; |
| | | } |
| | | |
| | | public static boolean isAllowOverwrite() |
| | | { |
| | | return allowOverwrite; |
| | | } |
| | | |
| | | @Value("${allowOverwrite}") |
| | | public void setAllowOverwrite(boolean allowOverwrite) |
| | | { |
| | | GenConfig.allowOverwrite = allowOverwrite; |
| | | } |
| | | } |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.security.PermissionUtils; |
| | | import com.ruoyi.common.utils.sql.SqlUtil; |
| | | import com.ruoyi.generator.config.GenConfig; |
| | | import com.ruoyi.generator.domain.GenTable; |
| | | import com.ruoyi.generator.domain.GenTableColumn; |
| | | import com.ruoyi.generator.service.IGenTableColumnService; |
| | |
| | | @ResponseBody |
| | | public AjaxResult genCode(@PathVariable("tableName") String tableName) |
| | | { |
| | | if (!GenConfig.isAllowOverwrite()) |
| | | { |
| | | return AjaxResult.error("【系统预设】不允许生成文件覆盖到本地"); |
| | | } |
| | | genTableService.generatorCode(tableName); |
| | | return AjaxResult.success(); |
| | | } |
| | |
| | | autoRemovePre: false |
| | | # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) |
| | | tablePrefix: sys_ |
| | | # 是否允许生成文件覆盖到本地(自定义路径),默认不允许 |
| | | allowOverwrite: false |
| | |
| | | /** |
| | | * 新增${functionName} |
| | | */ |
| | | @RequiresPermissions("${permissionPrefix}:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
| | |
| | | #if($parentheseIndex != -1) |
| | | @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") |
| | | #elseif($column.javaType == 'Date') |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") |
| | | #else |
| | | @Excel(name = "${comment}") |
| | |
| | | #if($parentheseIndex != -1) |
| | | @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") |
| | | #elseif($column.javaType == 'Date') |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") |
| | | #else |
| | | @Excel(name = "${comment}") |
| | |
| | | <parent> |
| | | <artifactId>ruoyi</artifactId> |
| | | <groupId>com.ruoyi</groupId> |
| | | <version>4.8.0</version> |
| | | <version>4.7.9</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | |
| | |
| | | /** |
| | | * 新增调度 |
| | | */ |
| | | @RequiresPermissions("monitor:job:add") |
| | | @GetMapping("/add") |
| | | public String add() |
| | | { |
| | |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | | <script th:src="@{/js/bootstrap.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/layer/layer.min.js}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script> |
| | | <script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script> |
| | | <script th:src="@{/js/cron.js}"></script> |
| | | <script th:inline="javascript"> |
| | | var prefix = [[@{/}]] + "monitor/job"; |