parent
eb53db701a
commit
0458f4c24f
@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
|
</classpath>
|
@ -0,0 +1 @@
|
|||||||
|
/target/
|
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>tamguo-oms</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
@ -0,0 +1,9 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/main/java=UTF-8
|
||||||
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/main/resources/static/common/common.css=UTF-8
|
||||||
|
encoding//src/main/resources/static/common/i18n/jeesite_en.js=UTF-8
|
||||||
|
encoding//src/main/resources/static/common/i18n/jeesite_zh_CN.js=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding//src/test/resources=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
@ -0,0 +1,5 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
@ -0,0 +1,4 @@
|
|||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
@ -0,0 +1,164 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.tamguo</groupId>
|
||||||
|
<artifactId>tamguo-oms</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.0.3.RELEASE</version>
|
||||||
|
<relativePath /> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<mybatis-plus-boot-starter.version>2.1.9</mybatis-plus-boot-starter.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- mybatis-plus begin -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
|
<version>${mybatis-plus-boot-starter.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>tomcat-jdbc</artifactId>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<!-- mybatis-plus end -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.nekohtml</groupId>
|
||||||
|
<artifactId>nekohtml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-redis</artifactId>
|
||||||
|
<version>1.3.8.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.session</groupId>
|
||||||
|
<artifactId>spring-session-data-redis</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>fastjson</artifactId>
|
||||||
|
<version>1.2.32</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
<version>1.2.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-ehcache</artifactId>
|
||||||
|
<version>1.2.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.theborakompanioni</groupId>
|
||||||
|
<artifactId>thymeleaf-extras-shiro</artifactId>
|
||||||
|
<version>1.2.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.songxinqiang</groupId>
|
||||||
|
<artifactId>com.baidu.ueditor</artifactId>
|
||||||
|
<version>1.1.2-edit-1.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-fileupload</groupId>
|
||||||
|
<artifactId>commons-fileupload</artifactId>
|
||||||
|
<version>1.3.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.penggle</groupId>
|
||||||
|
<artifactId>kaptcha</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid</artifactId>
|
||||||
|
<version>1.0.18</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.aliyun</groupId>
|
||||||
|
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.aliyun</groupId>
|
||||||
|
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||||
|
<version>3.2.8</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-email</artifactId>
|
||||||
|
<version>1.5</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-dependencies</artifactId>
|
||||||
|
<version>Camden.SR6</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>oms</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -0,0 +1,36 @@
|
|||||||
|
package com.tamguo;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
|
import com.alibaba.fastjson.support.config.FastJsonConfig;
|
||||||
|
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@ComponentScan("com.tamguo")
|
||||||
|
public class Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new SpringApplicationBuilder(Application.class).run(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FastJson替代Jackson
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public HttpMessageConverters fastJsonHttpMessageConverters() {
|
||||||
|
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
|
||||||
|
FastJsonConfig fastJsonConfig = new FastJsonConfig();
|
||||||
|
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
|
||||||
|
fastConverter.setFastJsonConfig(fastJsonConfig);
|
||||||
|
FastJsonHttpMessageConverter converter = fastConverter;
|
||||||
|
return new HttpMessageConverters(converter);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.tamguo.common;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
import com.google.code.kaptcha.impl.DefaultKaptcha;
|
||||||
|
import com.google.code.kaptcha.util.Config;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class WebConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@Value("${file.storage.path}")
|
||||||
|
private String fileStoragePath;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
|
registry.addResourceHandler("/files/**").addResourceLocations("file:"+fileStoragePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name="producer")
|
||||||
|
public DefaultKaptcha getKaptchaBean(){
|
||||||
|
DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
|
||||||
|
Properties properties=new Properties();
|
||||||
|
// properties.setProperty("kaptcha.border.color", "105,179,90");
|
||||||
|
properties.setProperty("kaptcha.border", "no");
|
||||||
|
properties.setProperty("kaptcha.image.width", "125");
|
||||||
|
properties.setProperty("kaptcha.image.height", "38");
|
||||||
|
properties.setProperty("kaptcha.session.key", "code");
|
||||||
|
properties.setProperty("kaptcha.textproducer.char.length", "4");
|
||||||
|
properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
|
||||||
|
Config config=new Config(properties);
|
||||||
|
defaultKaptcha.setConfig(config);
|
||||||
|
return defaultKaptcha;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.tamguo.common.dao;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
|
||||||
|
import org.apache.ibatis.reflection.MetaObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注入公共字段自动填充,任选注入方式即可
|
||||||
|
*/
|
||||||
|
//@Component
|
||||||
|
public class MyMetaObjectHandler extends MetaObjectHandler {
|
||||||
|
|
||||||
|
protected final static Logger logger = LoggerFactory.getLogger(MyMetaObjectHandler.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insertFill(MetaObject metaObject) {
|
||||||
|
logger.info("新增的时候干点不可描述的事情");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateFill(MetaObject metaObject) {
|
||||||
|
logger.info("更新的时候干点不可描述的事情");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.tamguo.common.dao;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import com.baomidou.mybatisplus.activerecord.Model;
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实体父类
|
||||||
|
*/
|
||||||
|
public class SuperEntity<T extends Model<?>> extends Model<T> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId("uid")
|
||||||
|
private String uid;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Serializable pkVal() {
|
||||||
|
return this.getUid();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUid() {
|
||||||
|
return uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUid(String uid) {
|
||||||
|
this.uid = uid;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package com.tamguo.common.redis;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
||||||
|
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
|
||||||
|
|
||||||
|
//这个类用配置redis服务器的连接
|
||||||
|
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 1800)
|
||||||
|
public class SessionConfig {
|
||||||
|
|
||||||
|
@Value("${redis.hostname}")
|
||||||
|
String HostName;
|
||||||
|
@Value("${redis.port}")
|
||||||
|
int Port;
|
||||||
|
@Value("${redis.password}")
|
||||||
|
String password;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Bean
|
||||||
|
public JedisConnectionFactory connectionFactory() {
|
||||||
|
JedisConnectionFactory connection = new JedisConnectionFactory();
|
||||||
|
connection.setPort(Port);
|
||||||
|
connection.setHostName(HostName);
|
||||||
|
connection.setPassword(password);
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.tamguo.common.redis;
|
||||||
|
|
||||||
|
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
|
||||||
|
|
||||||
|
//初始化Session配置
|
||||||
|
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
|
||||||
|
public SessionInitializer() {
|
||||||
|
super(SessionConfig.class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package com.tamguo.common.shiro;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.shiro.cache.ehcache.EhCacheManager;
|
||||||
|
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
||||||
|
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
||||||
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
|
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
||||||
|
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ShiroConfiguration {
|
||||||
|
private static Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
|
@Bean(name = "shiroRealm")
|
||||||
|
public UserRealm getShiroRealm() {
|
||||||
|
return new UserRealm();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "shiroEhcacheManager")
|
||||||
|
public EhCacheManager getEhCacheManager() {
|
||||||
|
EhCacheManager em = new EhCacheManager();
|
||||||
|
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
|
||||||
|
return em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "lifecycleBeanPostProcessor")
|
||||||
|
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
|
||||||
|
return new LifecycleBeanPostProcessor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
|
||||||
|
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
|
||||||
|
daap.setProxyTargetClass(true);
|
||||||
|
return daap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "securityManager")
|
||||||
|
public DefaultWebSecurityManager getDefaultWebSecurityManager() {
|
||||||
|
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
|
||||||
|
dwsm.setRealm(getShiroRealm());
|
||||||
|
dwsm.setCacheManager(getEhCacheManager());
|
||||||
|
return dwsm;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
|
||||||
|
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
|
||||||
|
aasa.setSecurityManager(getDefaultWebSecurityManager());
|
||||||
|
return new AuthorizationAttributeSourceAdvisor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "shiroFilter")
|
||||||
|
public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
|
||||||
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
||||||
|
shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager());
|
||||||
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
||||||
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
||||||
|
filterChainDefinitionMap.put("/jquery/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/adminlte/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/bootstrap/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/bootstrap-plugins/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/common/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/fastclick/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/fonts/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/icheck/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery-asDatepicker/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery-plugins/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery-toastr/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery-validation/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jquery-ztree/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/layer/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/modules/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/my97/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/select2/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/login/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/validCode", "anon");
|
||||||
|
filterChainDefinitionMap.put("/**", "authc");
|
||||||
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
||||||
|
return shiroFilterFactoryBean;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package com.tamguo.common.shiro;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authc.AuthenticationInfo;
|
||||||
|
import org.apache.shiro.authc.AuthenticationToken;
|
||||||
|
import org.apache.shiro.authc.IncorrectCredentialsException;
|
||||||
|
import org.apache.shiro.authc.LockedAccountException;
|
||||||
|
import org.apache.shiro.authc.SimpleAuthenticationInfo;
|
||||||
|
import org.apache.shiro.authc.UnknownAccountException;
|
||||||
|
import org.apache.shiro.authz.AuthorizationInfo;
|
||||||
|
import org.apache.shiro.authz.SimpleAuthorizationInfo;
|
||||||
|
import org.apache.shiro.realm.AuthorizingRealm;
|
||||||
|
import org.apache.shiro.subject.PrincipalCollection;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.tamguo.modules.sys.model.SysMenuEntity;
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
import com.tamguo.modules.sys.model.enums.SysUserStatusEnum;
|
||||||
|
import com.tamguo.modules.sys.service.ISysMenuService;
|
||||||
|
import com.tamguo.modules.sys.service.ISysUserService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class UserRealm extends AuthorizingRealm {
|
||||||
|
@Autowired
|
||||||
|
private ISysMenuService sysMenuService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISysUserService sysUserService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权(验证权限时调用)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
|
||||||
|
SysUserEntity user = (SysUserEntity)principals.getPrimaryPrincipal();
|
||||||
|
String userId = user.getUid();
|
||||||
|
|
||||||
|
List<String> permsList = null;
|
||||||
|
|
||||||
|
List<SysMenuEntity> menuList = sysMenuService.getUserMenuList(userId);
|
||||||
|
permsList = new ArrayList<>();
|
||||||
|
for(SysMenuEntity menu : menuList){
|
||||||
|
permsList.add(menu.getPerms());
|
||||||
|
}
|
||||||
|
//用户权限列表
|
||||||
|
Set<String> permsSet = new HashSet<String>();
|
||||||
|
for(String perms : permsList){
|
||||||
|
if(StringUtils.isEmpty(perms)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
permsSet.addAll(Arrays.asList(perms.trim().split(",")));
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
|
||||||
|
info.setStringPermissions(permsSet);
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 认证(登录时调用)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected AuthenticationInfo doGetAuthenticationInfo(
|
||||||
|
AuthenticationToken token) throws AuthenticationException {
|
||||||
|
String username = (String) token.getPrincipal();
|
||||||
|
String password = new String((char[]) token.getCredentials());
|
||||||
|
|
||||||
|
//查询用户信息
|
||||||
|
SysUserEntity user = sysUserService.queryByUserName(username);
|
||||||
|
|
||||||
|
//账号不存在
|
||||||
|
if(user == null) {
|
||||||
|
throw new UnknownAccountException("账号或密码不正确");
|
||||||
|
}
|
||||||
|
|
||||||
|
//密码错误
|
||||||
|
if(!password.equals(user.getPassword())) {
|
||||||
|
throw new IncorrectCredentialsException("账号或密码不正确");
|
||||||
|
}
|
||||||
|
|
||||||
|
//账号锁定
|
||||||
|
if(user.getStatus() == SysUserStatusEnum.LOCKED){
|
||||||
|
throw new LockedAccountException("账号已被锁定,请联系管理员");
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.io.InterruptedIOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public abstract class AbstractRunningLogHandler implements LogHandler {
|
||||||
|
|
||||||
|
private static Method getStackTraceMethod;
|
||||||
|
private static Method getClassNameMethod;
|
||||||
|
private static Method getMethodNameMethod;
|
||||||
|
private static Method getFileNameMethod;
|
||||||
|
private static Method getLineNumberMethod;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Class<?>[] noArgs = null;
|
||||||
|
getStackTraceMethod = Throwable.class.getMethod("getStackTrace", noArgs);
|
||||||
|
Class<?> stackTraceElementClass = Class.forName("java.lang.StackTraceElement");
|
||||||
|
getClassNameMethod = stackTraceElementClass.getMethod("getClassName", noArgs);
|
||||||
|
getMethodNameMethod = stackTraceElementClass.getMethod("getMethodName", noArgs);
|
||||||
|
getFileNameMethod = stackTraceElementClass.getMethod("getFileName", noArgs);
|
||||||
|
getLineNumberMethod = stackTraceElementClass.getMethod("getLineNumber", noArgs);
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
LogDebug.debug("will use pre-JDK 1.4 methods to determine location.");
|
||||||
|
} catch (NoSuchMethodException ex) {
|
||||||
|
LogDebug.debug("will use pre-JDK 1.4 methods to determine location.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定class的StackTraceElement
|
||||||
|
*
|
||||||
|
* @param t
|
||||||
|
* @param fqnOfCallingClass
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected StackTraceElement getRunningStackTrace(Throwable t, String fqnOfCallingClass) {
|
||||||
|
if (getLineNumberMethod != null) {
|
||||||
|
try {
|
||||||
|
Object[] noArgs = null;
|
||||||
|
Object[] elements = (Object[]) getStackTraceMethod.invoke(t, noArgs);
|
||||||
|
for (int i = elements.length - 1; i >= 0; i--) {
|
||||||
|
String thisClass = (String) getClassNameMethod.invoke(elements[i], noArgs);
|
||||||
|
if (fqnOfCallingClass.equals(thisClass)) {
|
||||||
|
// 执行class名称
|
||||||
|
String className = fqnOfCallingClass;
|
||||||
|
// 执行方法名称
|
||||||
|
String methodName = (String) getMethodNameMethod.invoke(elements[i], noArgs);
|
||||||
|
// 执行class文件名称
|
||||||
|
String fileName = (String) getFileNameMethod.invoke(elements[i], noArgs);
|
||||||
|
// 执行到行号
|
||||||
|
int lineNumber = ((Integer) getLineNumberMethod.invoke(elements[i], noArgs)).intValue();
|
||||||
|
return new StackTraceElement(className, methodName, fileName, lineNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException ex) {
|
||||||
|
LogDebug.debug("failed using JDK 1.4 methods", ex);
|
||||||
|
} catch (InvocationTargetException ex) {
|
||||||
|
if (ex.getTargetException() instanceof InterruptedException
|
||||||
|
|| ex.getTargetException() instanceof InterruptedIOException) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
LogDebug.debug("failed using JDK 1.4 methods", ex);
|
||||||
|
} catch (RuntimeException ex) {
|
||||||
|
LogDebug.debug("failed using JDK 1.4 methods", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.createDefaultStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建默认StackTraceElement
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private StackTraceElement createDefaultStackTrace() {
|
||||||
|
return new StackTraceElement(this.getClass().getName(), "log", this.getClass().getName(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void info(String msg, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void info(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void error(String msg, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void error(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void debug(String msg, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void debug(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void warning(String msg, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void warning(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public class CException extends RuntimeException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 6401592364022805815L;
|
||||||
|
|
||||||
|
public CException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统一异常处理 日志处理
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ExceptionSupport {
|
||||||
|
|
||||||
|
private final static Result failResult = Result.failResult("500");
|
||||||
|
private static LogHandler handler = new Log4jHandler();
|
||||||
|
|
||||||
|
private final static String LOG_INFO_PREFIX = "--info>> ";
|
||||||
|
private final static String LOG_ERROR_PREFIX = "--error>> ";
|
||||||
|
|
||||||
|
public static Result resolverResult(String methodInfo, Class<?> clazz, Exception e) {
|
||||||
|
if(e instanceof CException) {
|
||||||
|
handler.info(formatInfoLevelMsg(methodInfo, e.getMessage()), clazz.getName());
|
||||||
|
return Result.failResult(e.getMessage());
|
||||||
|
}
|
||||||
|
handler.error(formatErrorLevelMsg(methodInfo), e, clazz.getName());
|
||||||
|
return failResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String formatInfoLevelMsg(String methodInfo, String infoMsg) {
|
||||||
|
return LOG_INFO_PREFIX + methodInfo + ": " + infoMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String formatErrorLevelMsg(String methodInfo) {
|
||||||
|
return LOG_ERROR_PREFIX + methodInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,99 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public class IdGen
|
||||||
|
{
|
||||||
|
private long workerId;
|
||||||
|
private long datacenterId;
|
||||||
|
private long sequence = 0L;
|
||||||
|
private long twepoch = 1288834974657L;
|
||||||
|
private long workerIdBits = 5L;
|
||||||
|
private long datacenterIdBits = 5L;
|
||||||
|
private long maxWorkerId = -1L ^ (-1L << workerIdBits);
|
||||||
|
private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
|
||||||
|
private long sequenceBits = 12L;
|
||||||
|
private long workerIdShift = sequenceBits;
|
||||||
|
private long datacenterIdShift = sequenceBits + workerIdBits;
|
||||||
|
private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
|
||||||
|
private long sequenceMask = -1L ^ (-1L << sequenceBits);
|
||||||
|
private long lastTimestamp = -1L;
|
||||||
|
private String suffix;
|
||||||
|
private boolean flag;
|
||||||
|
|
||||||
|
private static class IdGenHolder {
|
||||||
|
private static final IdGen instance = new IdGen();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IdGen get(){
|
||||||
|
return IdGenHolder.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字符串拼接id
|
||||||
|
* @param suffix 字符串
|
||||||
|
* @param flag true:前缀 false:后缀
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static IdGen get(String suffix,boolean flag){
|
||||||
|
if(suffix == null || suffix.trim().length() == 0)
|
||||||
|
return IdGenHolder.instance;
|
||||||
|
else{
|
||||||
|
return new IdGen(suffix,flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public IdGen() {
|
||||||
|
this(0L, 0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IdGen(String suffix,boolean flag){
|
||||||
|
this.suffix = suffix;
|
||||||
|
this.flag = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IdGen(long workerId, long datacenterId) {
|
||||||
|
if (workerId > maxWorkerId || workerId < 0) {
|
||||||
|
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
|
||||||
|
}
|
||||||
|
if (datacenterId > maxDatacenterId || datacenterId < 0) {
|
||||||
|
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
|
||||||
|
}
|
||||||
|
this.workerId = workerId;
|
||||||
|
this.datacenterId = datacenterId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized String nextId() {
|
||||||
|
long timestamp = timeGen();
|
||||||
|
if (timestamp < lastTimestamp) {
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
|
||||||
|
}
|
||||||
|
if (lastTimestamp == timestamp) {
|
||||||
|
sequence = (sequence + 1) & sequenceMask;
|
||||||
|
if (sequence == 0) {
|
||||||
|
timestamp = tilNextMillis(lastTimestamp);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sequence = 0L;
|
||||||
|
}
|
||||||
|
lastTimestamp = timestamp;
|
||||||
|
|
||||||
|
long serialNumber = ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)
|
||||||
|
| (workerId << workerIdShift) | sequence;
|
||||||
|
|
||||||
|
return (suffix == null || suffix.trim().length() == 0) ? serialNumber+"" : (flag ? (new StringBuffer()).append(suffix).append(serialNumber).toString() : (new StringBuffer()).append(serialNumber).append(suffix).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long tilNextMillis(long lastTimestamp) {
|
||||||
|
long timestamp = timeGen();
|
||||||
|
while (timestamp <= lastTimestamp) {
|
||||||
|
timestamp = timeGen();
|
||||||
|
}
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long timeGen() {
|
||||||
|
return System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.slf4j.event.Level;
|
||||||
|
|
||||||
|
public class Log4jHandler extends AbstractRunningLogHandler {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Log4jHandler.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void info(String msg, String fqnOfCallingClass) {
|
||||||
|
logger.info(fqnOfCallingClass, Level.INFO, msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void info(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
logger.info(fqnOfCallingClass, Level.INFO, msg, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void error(String msg, String fqnOfCallingClass) {
|
||||||
|
logger.error(fqnOfCallingClass, Level.ERROR, msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void error(String msg, Throwable t, String fqnOfCallingClass) {
|
||||||
|
logger.error(fqnOfCallingClass, Level.ERROR, msg, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public class LogDebug {
|
||||||
|
|
||||||
|
private final static String DEBUG_LOG_KEY = "-- LogHandler: ";
|
||||||
|
|
||||||
|
public static void debug(String msg) {
|
||||||
|
System.err.println(DEBUG_LOG_KEY + msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void debug(String msg, Throwable t) {
|
||||||
|
System.err.println(DEBUG_LOG_KEY + msg);
|
||||||
|
if (t != null)
|
||||||
|
t.printStackTrace(System.err);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public interface LogHandler {
|
||||||
|
|
||||||
|
public void info(String msg, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void info(String msg, Throwable t, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void error(String msg, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void error(String msg, Throwable t, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void debug(String msg, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void debug(String msg, Throwable t, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void warning(String msg, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
public void warning(String msg, Throwable t, String fqnOfCallingClass);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
|
public class ObjectUtil extends SerializeTranscoder {
|
||||||
|
@Override
|
||||||
|
public byte[] serialize(Object value) {
|
||||||
|
if (value == null) {
|
||||||
|
throw new NullPointerException("Can't serialize null");
|
||||||
|
}
|
||||||
|
byte[] result = null;
|
||||||
|
ByteArrayOutputStream bos = null;
|
||||||
|
ObjectOutputStream os = null;
|
||||||
|
try {
|
||||||
|
bos = new ByteArrayOutputStream();
|
||||||
|
os = new ObjectOutputStream(bos);
|
||||||
|
os.writeObject(value);
|
||||||
|
os.close();
|
||||||
|
bos.close();
|
||||||
|
result = bos.toByteArray();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalArgumentException("Non-serializable object", e);
|
||||||
|
} finally {
|
||||||
|
close(os);
|
||||||
|
close(bos);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object deserialize(byte[] in) {
|
||||||
|
Object result = null;
|
||||||
|
ByteArrayInputStream bis = null;
|
||||||
|
ObjectInputStream is = null;
|
||||||
|
try {
|
||||||
|
if (in != null) {
|
||||||
|
bis = new ByteArrayInputStream(in);
|
||||||
|
is = new ObjectInputStream(bis);
|
||||||
|
result = is.readObject();
|
||||||
|
is.close();
|
||||||
|
bis.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
close(is);
|
||||||
|
close(bis);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equals(Object o1, Object o2) {
|
||||||
|
|
||||||
|
if (o1 == o2) {
|
||||||
|
return true;
|
||||||
|
} else if (o1 == null || o2 == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return o1.equals(o2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,105 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class Result implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -1651614836984397356L;
|
||||||
|
|
||||||
|
private int code;
|
||||||
|
|
||||||
|
private Object result;
|
||||||
|
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public static final int SUCCESS_CODE = 0;
|
||||||
|
|
||||||
|
public static final int FAIL_CODE = 1;
|
||||||
|
|
||||||
|
private Result() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private Result(int code, Object result, String message) {
|
||||||
|
this.code = code;
|
||||||
|
this.result = result;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功响应
|
||||||
|
*
|
||||||
|
* @param result
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Result successResult(Object result) {
|
||||||
|
return result(SUCCESS_CODE, result, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result successResult(Object records, Long recordSum, Long rowsOfPage) {
|
||||||
|
return successResult(records, recordSum, rowsOfPage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result successResult(Object records, Long recordSum, Long rowsOfPage, Object userData) {
|
||||||
|
Map<String, Object> result = resultOfList(records, recordSum, rowsOfPage, userData);
|
||||||
|
|
||||||
|
return successResult(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> resultOfList(Object records, Long recordSum, Long rowsOfPage) {
|
||||||
|
return resultOfList(records, recordSum, rowsOfPage, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> resultOfList(Object Obj, Long records, Long rowsOfPage, Object userData) {
|
||||||
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
|
result.put("rows", Obj);
|
||||||
|
result.put("records", records);
|
||||||
|
result.put("total", rowsOfPage);
|
||||||
|
if (null != userData) {
|
||||||
|
result.put("userdata", userData);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, Object> jqGridResult(List<?> list, long totalCount, int pageSize, int currPage,
|
||||||
|
int totalPage) {
|
||||||
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
|
result.put("list", list);
|
||||||
|
result.put("totalCount", totalCount);
|
||||||
|
result.put("pageSize", pageSize);
|
||||||
|
result.put("currPage", currPage);
|
||||||
|
result.put("totalPage", totalPage);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 失败响应
|
||||||
|
*
|
||||||
|
* @param errorMsg
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Result failResult(String errorMsg) {
|
||||||
|
return result(FAIL_CODE, "", errorMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Result result(int code, Object result, String message) {
|
||||||
|
Result res = new Result(code, result, message);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
|
||||||
|
public abstract class SerializeTranscoder {
|
||||||
|
|
||||||
|
public abstract byte[] serialize(Object value);
|
||||||
|
|
||||||
|
public abstract Object deserialize(byte[] in);
|
||||||
|
|
||||||
|
public void close(Closeable closeable) {
|
||||||
|
if (closeable != null) {
|
||||||
|
try {
|
||||||
|
closeable.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setting - 系统
|
||||||
|
*
|
||||||
|
* @author candy.tam
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public final class Setting {
|
||||||
|
|
||||||
|
/** 域名 */
|
||||||
|
@Value(value="${domain.name}")
|
||||||
|
public String domain;
|
||||||
|
/** 真题 */
|
||||||
|
public final String PAPER_TYPE_ZHENTI = "1";
|
||||||
|
/** 模拟*/
|
||||||
|
public final String PAPER_TYPE_MONI = "2";
|
||||||
|
/** 押题*/
|
||||||
|
public final String PAPER_TYPE_YATI = "3";
|
||||||
|
/** 名校 */
|
||||||
|
public final String PAPER_TYPE_MINGXIAO = "4";
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
import org.apache.shiro.session.Session;
|
||||||
|
import org.apache.shiro.subject.Subject;
|
||||||
|
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
|
||||||
|
public class ShiroUtils {
|
||||||
|
|
||||||
|
public static Session getSession() {
|
||||||
|
return SecurityUtils.getSubject().getSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Subject getSubject() {
|
||||||
|
return SecurityUtils.getSubject();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SysUserEntity getUser() {
|
||||||
|
return (SysUserEntity)SecurityUtils.getSubject().getPrincipal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUid() {
|
||||||
|
return getUser().getUid();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setSessionAttribute(Object key, Object value) {
|
||||||
|
getSession().setAttribute(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getSessionAttribute(Object key) {
|
||||||
|
return getSession().getAttribute(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isLogin() {
|
||||||
|
return SecurityUtils.getSubject().getPrincipal() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void logout() {
|
||||||
|
SecurityUtils.getSubject().logout();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getKaptcha(String key) {
|
||||||
|
String kaptcha = getSessionAttribute(key).toString();
|
||||||
|
getSession().removeAttribute(key);
|
||||||
|
return kaptcha;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public enum Status {
|
||||||
|
SUCCESS , ERROR
|
||||||
|
}
|
@ -0,0 +1,122 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
public class TamguoConstant {
|
||||||
|
|
||||||
|
public static final String WEBSITE_NAME = "探果网";
|
||||||
|
|
||||||
|
public static final String REDIS_PRE_KEY = "TAMGUO:";
|
||||||
|
|
||||||
|
/** 高考SubjectId*/
|
||||||
|
public static final String GAOKAO_SUBJECT_ID = "13";
|
||||||
|
|
||||||
|
/** 高考专区缓存KEY*/
|
||||||
|
public static final String GAOKAO_COURSE_AREA = "GAOKAO_COURSE_AREA";
|
||||||
|
|
||||||
|
/** 首页菜单缓存KEY*/
|
||||||
|
public static final String INDEX_MENU = "index_menu";
|
||||||
|
|
||||||
|
/** 首页菜单缓存KEY*/
|
||||||
|
public static final String ALL_INDEX_MENU = "all_index_menu";
|
||||||
|
|
||||||
|
/** 首页左侧菜单缓存KEY*/
|
||||||
|
public static final String LEFT_INDEX_MENU = "left_index_menu";
|
||||||
|
|
||||||
|
/** 首页底部菜单缓存KEY*/
|
||||||
|
public static final String FOOTER_INDEX_MENU = "footer_index_menu";
|
||||||
|
|
||||||
|
/** 北京地区ID*/
|
||||||
|
public static final String BEIJING_AREA_ID = "1";
|
||||||
|
|
||||||
|
/** 真题类型ID*/
|
||||||
|
public static final String ZHENGTI_PAPER_ID = "1";
|
||||||
|
|
||||||
|
/** 模拟类型ID */
|
||||||
|
public static final String SIMULATION_PAPER_ID = "2";
|
||||||
|
|
||||||
|
/** 首页历年真题缓存KEY*/
|
||||||
|
public static final String HISTORY_PAPER = "HistoryPaper:";
|
||||||
|
|
||||||
|
/** 首页模拟试卷缓存KEY*/
|
||||||
|
public static final String SIMULATION_PAPER = "SimulationPaper:";
|
||||||
|
|
||||||
|
/** 首页热门试卷缓存KEY*/
|
||||||
|
public static final String HOT_PAPER = "HOT_PAPER";
|
||||||
|
|
||||||
|
/** 名校试卷缓存KEY*/
|
||||||
|
public static final String ELITE_SCHOOL_PAPER = "EliteSchoolPaper:";
|
||||||
|
|
||||||
|
/** 所有广告缓存KEY*/
|
||||||
|
public static final String ALL_AD = "AllAd:";
|
||||||
|
|
||||||
|
/** 名校缓存KEY*/
|
||||||
|
public static final String ELITE_PAPER = "ElitePaper:";
|
||||||
|
|
||||||
|
/** 章节科目为空*/
|
||||||
|
public static final String CHAPTER_COURSE_EMPTY = "all";
|
||||||
|
|
||||||
|
/** 默认分页大笑*/
|
||||||
|
public static final Integer DEFAULT_PAGE_SIZE = 10;
|
||||||
|
|
||||||
|
/** 单选题*/
|
||||||
|
public static final String QUESTION_TYOE_DANXUANTI = "1";
|
||||||
|
|
||||||
|
/** 简答题*/
|
||||||
|
public static final String QUESTION_TYOE_JIANDATI = "2";
|
||||||
|
|
||||||
|
/** 书面表达*/
|
||||||
|
public static final String QUESTION_TYOE_SHUMIANBIAODA = "3";
|
||||||
|
|
||||||
|
/** 默认会员头像*/
|
||||||
|
public static final String DEFAULT_MEMBER_AVATAR = "images/avatar.png";
|
||||||
|
|
||||||
|
/** 重置密码KEY*/
|
||||||
|
public static final String RESET_PASSWORD_KEY = "ResetPasswordKey";
|
||||||
|
|
||||||
|
/** ALIYUN */
|
||||||
|
public static final String ALIYUN_ACCESS_KEY_ID = "LTAINGkheMeWtxUR";
|
||||||
|
|
||||||
|
/** ALIYUN*/
|
||||||
|
public static final String ALIYUN_ACCESS_KEY_SECRET = "ONUKuCz85kU4In07y4dvpM28mfWOGa";
|
||||||
|
|
||||||
|
/** ALIYUN*/
|
||||||
|
public static final String ALIYUN_SMTP_HOST_NAME = "smtp.aliyun.com";
|
||||||
|
|
||||||
|
/** ALIYUN*/
|
||||||
|
public static final int ALIYUN_SMTP_HOST_PORT = 465;
|
||||||
|
|
||||||
|
/** ALIYUN*/
|
||||||
|
public static final String ALIYUN_MAIL_ACCOUNT = "candy.tam@aliyun.com";
|
||||||
|
|
||||||
|
/** ALIYUN*/
|
||||||
|
public static final String ALIYUN_MAIL_PASSWORD = "tanguo520pig";
|
||||||
|
|
||||||
|
/** 邮件主题*/
|
||||||
|
public static final String ALIYUN_MAIL_SUBJECT_FINDPASSWORD = "探果网找回密码";
|
||||||
|
|
||||||
|
/** 邮箱找回密码前缀*/
|
||||||
|
public static final String ALIYUN_MAIL_FIND_PASSWORD_PREFIX = "EMAIL_FIND_PASSWORD_";
|
||||||
|
|
||||||
|
/** 短信找回密码前缀*/
|
||||||
|
public static final String ALIYUN_MOBILE_SMS_PREFIX = "MOBILE_SMS_PREKEY_";
|
||||||
|
|
||||||
|
/** 安全验证前缀*/
|
||||||
|
public static final String SECURITY_CHECK_PREFIX = "securityCheck:";
|
||||||
|
|
||||||
|
/** 默认的章节根目录*/
|
||||||
|
public static final String CHAPTER_DEFAULT_ROOT_UID = "-1";
|
||||||
|
|
||||||
|
/** 登录错误次数*/
|
||||||
|
public static final String LOGIN_FAILURE_COUNT = "loginFailureCount:";
|
||||||
|
|
||||||
|
/** 题目未审核*/
|
||||||
|
public static final String QUESTION_NOTHING_AUDIT_STATUS = "0";
|
||||||
|
|
||||||
|
/** 题目审核成功*/
|
||||||
|
public static final String QUESTION_SUCCESS_AUDIT_STATUS = "1";
|
||||||
|
|
||||||
|
/** 题目审核失败*/
|
||||||
|
public static final String QUESTION_FAILED_AUDIT_STATUS = "2";
|
||||||
|
|
||||||
|
/** 题目审核失败*/
|
||||||
|
public static final String TEACHER_ROLE_ID = "2";
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
||||||
|
public class UploaderMessage {
|
||||||
|
private Status status;
|
||||||
|
private String statusMsg = "";
|
||||||
|
private ArrayList<Integer> errorKys;
|
||||||
|
private String error = "";
|
||||||
|
private String filePath = "";
|
||||||
|
|
||||||
|
public Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Status status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatusMsg() {
|
||||||
|
return statusMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusMsg(String statusMsg) {
|
||||||
|
this.statusMsg = statusMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Integer> getErrorKys() {
|
||||||
|
return errorKys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrorKys(ArrayList<Integer> errorKys) {
|
||||||
|
this.errorKys = errorKys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getError() {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setError(String error) {
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilePath() {
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilePath(String filePath) {
|
||||||
|
this.filePath = filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
package com.tamguo.common.utils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
public class XMLConfiguration {
|
||||||
|
private Document document = null;
|
||||||
|
|
||||||
|
public boolean readConfigFile(String configFilename) {
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
try {
|
||||||
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
document = db.parse(configFilename);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (document == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean readConfigFile(InputStream stream) {
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
try {
|
||||||
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
document = db.parse(stream);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (document == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDocument(Document document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.tamguo.modules.sys.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
|
||||||
|
import com.tamguo.common.dao.SuperMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysMenuEntity;
|
||||||
|
|
||||||
|
public interface SysMenuMapper extends SuperMapper<SysMenuEntity>{
|
||||||
|
|
||||||
|
List<SysMenuEntity> queryList(Map<String, Object> hashMap , Pagination page);
|
||||||
|
|
||||||
|
List<SysMenuEntity> queryNotButtonList();
|
||||||
|
|
||||||
|
SysMenuEntity queryByParentId(String parentId);
|
||||||
|
|
||||||
|
SysMenuEntity queryByUid(String uid);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.tamguo.modules.sys.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
|
||||||
|
import com.tamguo.common.dao.SuperMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysRoleEntity;
|
||||||
|
|
||||||
|
public interface SysRoleMapper extends SuperMapper<SysRoleEntity>{
|
||||||
|
|
||||||
|
List<SysRoleEntity> selectPageByName(SysRoleEntity sysRoleEntity, Pagination page);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.tamguo.modules.sys.dao;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.tamguo.common.dao.SuperMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
|
||||||
|
public interface SysUserMapper extends SuperMapper<SysUserEntity>{
|
||||||
|
|
||||||
|
SysUserEntity queryByUserName(String username);
|
||||||
|
|
||||||
|
List<SysUserEntity> queryPage(@Param(value="userName")String userName , Page<SysUserEntity> page);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
package com.tamguo.modules.sys.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableName;
|
||||||
|
import com.tamguo.common.dao.SuperEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The persistent class for the reaps_sys_menu database table.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TableName(value="sys_menu")
|
||||||
|
public class SysMenuEntity extends SuperEntity<SysMenuEntity> implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private Integer orderNum;
|
||||||
|
private String parentId;
|
||||||
|
private Integer type;
|
||||||
|
private String url;
|
||||||
|
private String perms;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private List<SysMenuEntity> menuList;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private String parentName;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private Boolean open;
|
||||||
|
|
||||||
|
public SysMenuEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getOrderNum() {
|
||||||
|
return this.orderNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrderNum(Integer orderNum) {
|
||||||
|
this.orderNum = orderNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentId() {
|
||||||
|
return this.parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentId(String parentId) {
|
||||||
|
this.parentId = parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getType() {
|
||||||
|
return this.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(Integer type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return this.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SysMenuEntity> getMenuList() {
|
||||||
|
return menuList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMenuList(List<SysMenuEntity> menuList) {
|
||||||
|
this.menuList = menuList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentName() {
|
||||||
|
return parentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentName(String parentName) {
|
||||||
|
this.parentName = parentName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getOpen() {
|
||||||
|
return open;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpen(Boolean open) {
|
||||||
|
this.open = open;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPerms() {
|
||||||
|
return perms;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerms(String perms) {
|
||||||
|
this.perms = perms;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.tamguo.modules.sys.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableName;
|
||||||
|
import com.tamguo.common.dao.SuperEntity;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The persistent class for the reaps_sys_role database table.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TableName(value="sys_role")
|
||||||
|
public class SysRoleEntity extends SuperEntity<SysRoleEntity> implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String perms;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private List<String> menuIdList;
|
||||||
|
|
||||||
|
public SysRoleEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getMenuIdList() {
|
||||||
|
return menuIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMenuIdList(List<String> menuIdList) {
|
||||||
|
this.menuIdList = menuIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPerms() {
|
||||||
|
return perms;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPerms(String perms) {
|
||||||
|
this.perms = perms;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
package com.tamguo.modules.sys.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
|
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotations.TableName;
|
||||||
|
import com.tamguo.common.dao.SuperEntity;
|
||||||
|
import com.tamguo.modules.sys.model.enums.SysUserStatusEnum;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The persistent class for the reaps_sys_user database table.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TableName(value="sys_user")
|
||||||
|
public class SysUserEntity extends SuperEntity<SysUserEntity> implements Serializable {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String userName;
|
||||||
|
private String nickName;
|
||||||
|
private String mobile;
|
||||||
|
private String email;
|
||||||
|
private String password;
|
||||||
|
private String roleIds;
|
||||||
|
|
||||||
|
@JSONField(serialzeFeatures= SerializerFeature.WriteEnumUsingToString)
|
||||||
|
private SysUserStatusEnum status;
|
||||||
|
|
||||||
|
private String safeKeyValue;
|
||||||
|
private Long createTime;
|
||||||
|
private String courseId;
|
||||||
|
private String subjectId;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private List<String> roleIdList;
|
||||||
|
|
||||||
|
@TableField(exist=false)
|
||||||
|
private String roleName;
|
||||||
|
|
||||||
|
public SysUserEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return this.password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRoleIds() {
|
||||||
|
return this.roleIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoleIds(String roleIds) {
|
||||||
|
this.roleIds = roleIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserName(String userName) {
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNickName() {
|
||||||
|
return nickName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNickName(String nickName) {
|
||||||
|
this.nickName = nickName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMobile() {
|
||||||
|
return mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMobile(String mobile) {
|
||||||
|
this.mobile = mobile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getCreateTime() {
|
||||||
|
return createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreateTime(Long createTime) {
|
||||||
|
this.createTime = createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getRoleIdList() {
|
||||||
|
return roleIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoleIdList(List<String> roleIdList) {
|
||||||
|
this.roleIdList = roleIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSafeKeyValue() {
|
||||||
|
return safeKeyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSafeKeyValue(String safeKeyValue) {
|
||||||
|
this.safeKeyValue = safeKeyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SysUserStatusEnum getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(SysUserStatusEnum status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCourseId() {
|
||||||
|
return courseId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCourseId(String courseId) {
|
||||||
|
this.courseId = courseId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRoleName() {
|
||||||
|
return roleName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoleName(String roleName) {
|
||||||
|
this.roleName = roleName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSubjectId() {
|
||||||
|
return subjectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubjectId(String subjectId) {
|
||||||
|
this.subjectId = subjectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.tamguo.modules.sys.model.enums;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import com.baomidou.mybatisplus.enums.IEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户状态
|
||||||
|
*/
|
||||||
|
public enum SysUserStatusEnum implements IEnum {
|
||||||
|
NORMAL("normal", "正常"),
|
||||||
|
LOCKED("locked", "锁定");
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
private String desc;
|
||||||
|
|
||||||
|
SysUserStatusEnum(final String value, final String desc) {
|
||||||
|
this.value = value;
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Serializable getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc(){
|
||||||
|
return this.desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package com.tamguo.modules.sys.service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.tamguo.modules.sys.model.SysMenuEntity;
|
||||||
|
|
||||||
|
public interface ISysMenuService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户菜单权限
|
||||||
|
* @param userId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SysMenuEntity> getUserMenuList(String userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取菜单树
|
||||||
|
* @param menus
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SysMenuEntity> getUserMenuTree(List<SysMenuEntity> menus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单列表
|
||||||
|
* @param hashMap
|
||||||
|
* @param page
|
||||||
|
* @param limit
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Page<SysMenuEntity> queryList(Map<String, Object> hashMap, Page<SysMenuEntity> page);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询不是按钮的菜单
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SysMenuEntity> queryNotButtonList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据父菜单查询菜单
|
||||||
|
* @param parentId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SysMenuEntity select(String parentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存数据
|
||||||
|
* @param menu
|
||||||
|
*/
|
||||||
|
void save(SysMenuEntity menu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改
|
||||||
|
* @param menu
|
||||||
|
*/
|
||||||
|
void update(SysMenuEntity menu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
* @param menuIds
|
||||||
|
*/
|
||||||
|
void deleteBatch(String[] menuIds);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.tamguo.modules.sys.service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.tamguo.modules.sys.model.SysRoleEntity;
|
||||||
|
|
||||||
|
public interface ISysRoleService {
|
||||||
|
|
||||||
|
public List<SysRoleEntity> findAll();
|
||||||
|
|
||||||
|
public Page<SysRoleEntity> queryList(SysRoleEntity role, Page<SysRoleEntity> page);
|
||||||
|
|
||||||
|
public SysRoleEntity select(String uid);
|
||||||
|
|
||||||
|
public void save(SysRoleEntity role);
|
||||||
|
|
||||||
|
public void update(SysRoleEntity role);
|
||||||
|
|
||||||
|
public void deleteBatch(String[] roleIds);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.tamguo.modules.sys.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.tamguo.common.utils.Result;
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
|
||||||
|
public interface ISysUserService {
|
||||||
|
|
||||||
|
SysUserEntity queryByUserName(String username);
|
||||||
|
|
||||||
|
SysUserEntity queryByUid(String uid);
|
||||||
|
|
||||||
|
void updateUserInfo(SysUserEntity user);
|
||||||
|
|
||||||
|
Result updatePassword(String oldPassword, String password, String repassword);
|
||||||
|
|
||||||
|
Page<SysUserEntity> queryPage(String userName ,Page<SysUserEntity> page);
|
||||||
|
|
||||||
|
SysUserEntity selectById(String userId);
|
||||||
|
|
||||||
|
void save(SysUserEntity user);
|
||||||
|
|
||||||
|
void update(SysUserEntity user);
|
||||||
|
|
||||||
|
void deleteBatch(String[] userIds);
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
package com.tamguo.modules.sys.service.impl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
||||||
|
import com.tamguo.modules.sys.dao.SysMenuMapper;
|
||||||
|
import com.tamguo.modules.sys.dao.SysRoleMapper;
|
||||||
|
import com.tamguo.modules.sys.dao.SysUserMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysMenuEntity;
|
||||||
|
import com.tamguo.modules.sys.model.SysRoleEntity;
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
import com.tamguo.modules.sys.service.ISysMenuService;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenuEntity> implements ISysMenuService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysMenuMapper sysMenuMapper;
|
||||||
|
@Autowired
|
||||||
|
private SysUserMapper sysUserMapper;
|
||||||
|
@Autowired
|
||||||
|
private SysRoleMapper sysRoleMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SysMenuEntity> getUserMenuList(String userId) {
|
||||||
|
SysUserEntity user = sysUserMapper.selectById(userId);
|
||||||
|
List<String> roleIds = Arrays.asList(user.getRoleIds().split(","));
|
||||||
|
// 获取用户角色
|
||||||
|
List<SysRoleEntity> roles = sysRoleMapper.selectBatchIds(roleIds);
|
||||||
|
// 有权限的菜单
|
||||||
|
List<String> menuIds = new ArrayList<>();
|
||||||
|
if(!CollectionUtils.isEmpty(roles)) {
|
||||||
|
for(int i=0 ; i<roles.size() ; i++) {
|
||||||
|
SysRoleEntity role = roles.get(i);
|
||||||
|
if(!StringUtils.isEmpty(role.getPerms())) {
|
||||||
|
List<String> mIds = Arrays.asList(role.getPerms().split(","));
|
||||||
|
menuIds.addAll(mIds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<SysMenuEntity> menuList = sysMenuMapper.selectBatchIds(menuIds);
|
||||||
|
|
||||||
|
return menuList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SysMenuEntity> getUserMenuTree(List<SysMenuEntity> menus){
|
||||||
|
List<SysMenuEntity> pMenuList = new ArrayList<>();
|
||||||
|
for(int i=0 ; i<menus.size() ; i++) {
|
||||||
|
SysMenuEntity menu = menus.get(i);
|
||||||
|
if(menu.getParentId().equals("0")) {
|
||||||
|
pMenuList.add(menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 支持二级菜单
|
||||||
|
for(int i=0 ; i<pMenuList.size() ; i++) {
|
||||||
|
SysMenuEntity pMenu = pMenuList.get(i);
|
||||||
|
|
||||||
|
List<SysMenuEntity> childMenus = new ArrayList<>();
|
||||||
|
for(int k=0 ; k<menus.size() ; k++) {
|
||||||
|
SysMenuEntity cMenu = menus.get(k);
|
||||||
|
if(cMenu.getParentId().toString().equals(pMenu.getUid())) {
|
||||||
|
childMenus.add(cMenu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pMenu.setMenuList(childMenus);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pMenuList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
@Override
|
||||||
|
public Page<SysMenuEntity> queryList(Map<String, Object> hashMap, Page<SysMenuEntity> page) {
|
||||||
|
List<SysMenuEntity> pageList = (List<SysMenuEntity>) sysMenuMapper.queryList(hashMap , page);
|
||||||
|
page.setRecords(pageList);
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SysMenuEntity> queryNotButtonList() {
|
||||||
|
return sysMenuMapper.queryNotButtonList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysMenuEntity select(String parentId) {
|
||||||
|
return sysMenuMapper.queryByUid(parentId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void save(SysMenuEntity menu) {
|
||||||
|
sysMenuMapper.insert(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void update(SysMenuEntity menu) {
|
||||||
|
sysMenuMapper.updateById(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void deleteBatch(String[] menuIds) {
|
||||||
|
sysMenuMapper.deleteBatchIds(Arrays.asList(menuIds));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.tamguo.modules.sys.service.impl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
||||||
|
import com.tamguo.modules.sys.dao.SysRoleMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysRoleEntity;
|
||||||
|
import com.tamguo.modules.sys.service.ISysRoleService;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRoleEntity> implements ISysRoleService{
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysRoleMapper sysRoleMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SysRoleEntity> findAll() {
|
||||||
|
return sysRoleMapper.selectList(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
@Override
|
||||||
|
public Page<SysRoleEntity> queryList(SysRoleEntity sysRoleEntity, Page<SysRoleEntity> page) {
|
||||||
|
List<SysRoleEntity> list = sysRoleMapper.selectPageByName(sysRoleEntity , page);
|
||||||
|
page.setRecords(list);
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysRoleEntity select(String uid) {
|
||||||
|
return sysRoleMapper.selectById(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void save(SysRoleEntity role) {
|
||||||
|
role.setPerms(StringUtils.join(role.getMenuIdList(), ","));
|
||||||
|
sysRoleMapper.insert(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void update(SysRoleEntity role) {
|
||||||
|
role.setPerms(StringUtils.join(role.getMenuIdList(), ","));
|
||||||
|
sysRoleMapper.updateById(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void deleteBatch(String[] roleIds) {
|
||||||
|
sysRoleMapper.deleteBatchIds(Arrays.asList(roleIds));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
package com.tamguo.modules.sys.service.impl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.shiro.crypto.hash.Sha256Hash;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.plugins.Page;
|
||||||
|
import com.tamguo.common.utils.DateUtil;
|
||||||
|
import com.tamguo.common.utils.Result;
|
||||||
|
import com.tamguo.common.utils.ShaEncrypt;
|
||||||
|
import com.tamguo.common.utils.ShiroUtils;
|
||||||
|
import com.tamguo.modules.sys.dao.SysUserMapper;
|
||||||
|
import com.tamguo.modules.sys.model.SysUserEntity;
|
||||||
|
import com.tamguo.modules.sys.service.ISysUserService;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SysUserServiceImpl implements ISysUserService{
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public SysUserMapper sysUserMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysUserEntity queryByUserName(String username) {
|
||||||
|
return sysUserMapper.queryByUserName(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysUserEntity queryByUid(String uid) {
|
||||||
|
return sysUserMapper.selectById(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateUserInfo(SysUserEntity user) {
|
||||||
|
SysUserEntity entity = sysUserMapper.selectById(user.getUid());
|
||||||
|
entity.setRoleIds(user.getRoleIds());
|
||||||
|
entity.setNickName(user.getNickName());
|
||||||
|
entity.setMobile(user.getMobile());
|
||||||
|
entity.setEmail(user.getEmail());
|
||||||
|
entity.setStatus(user.getStatus());
|
||||||
|
sysUserMapper.updateById(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public Result updatePassword(String oldPassword, String password, String repassword) {
|
||||||
|
String userId = ShiroUtils.getUid();
|
||||||
|
SysUserEntity user = sysUserMapper.selectById(userId);
|
||||||
|
if(!new Sha256Hash(oldPassword).toHex().equals(user.getPassword())) {
|
||||||
|
return Result.result(1, null, "旧密码错误");
|
||||||
|
}
|
||||||
|
if(!password.equals(repassword)) {
|
||||||
|
return Result.result(2, null, "两次密码输入不一致");
|
||||||
|
}
|
||||||
|
user.setPassword(new Sha256Hash(password).toHex());
|
||||||
|
sysUserMapper.updateById(user);
|
||||||
|
return Result.successResult(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=true)
|
||||||
|
@Override
|
||||||
|
public Page<SysUserEntity> queryPage(String userName ,Page<SysUserEntity> page) {
|
||||||
|
if(!StringUtils.isEmpty(userName)) {
|
||||||
|
userName = "%" + userName + "%";
|
||||||
|
}
|
||||||
|
page.setRecords(sysUserMapper.queryPage(userName , page));
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysUserEntity selectById(String userId) {
|
||||||
|
return sysUserMapper.selectById(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void save(SysUserEntity user) {
|
||||||
|
user.setCreateTime(DateUtil.getTime());
|
||||||
|
// sha256加密
|
||||||
|
user.setPassword(ShaEncrypt.SHA256(user.getPassword()));
|
||||||
|
// 处理角色
|
||||||
|
if(!CollectionUtils.isEmpty(user.getRoleIdList())) {
|
||||||
|
user.setRoleIds(StringUtils.join(user.getRoleIdList(), ","));
|
||||||
|
}
|
||||||
|
sysUserMapper.insert(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
public void update(SysUserEntity user) {
|
||||||
|
if (StringUtils.isEmpty(user.getPassword())) {
|
||||||
|
user.setPassword(null);
|
||||||
|
} else {
|
||||||
|
user.setPassword(ShaEncrypt.SHA256(user.getPassword()));
|
||||||
|
}
|
||||||
|
sysUserMapper.updateById(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(readOnly=false)
|
||||||
|
@Override
|
||||||
|
public void deleteBatch(String[] userIds) {
|
||||||
|
sysUserMapper.deleteBatchIds(Arrays.asList(userIds));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package com.tamguo.modules.sys.web;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authc.IncorrectCredentialsException;
|
||||||
|
import org.apache.shiro.authc.LockedAccountException;
|
||||||
|
import org.apache.shiro.authc.UnknownAccountException;
|
||||||
|
import org.apache.shiro.authc.UsernamePasswordToken;
|
||||||
|
import org.apache.shiro.crypto.hash.Sha256Hash;
|
||||||
|
import org.apache.shiro.subject.Subject;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import com.google.code.kaptcha.Constants;
|
||||||
|
import com.tamguo.common.utils.ExceptionSupport;
|
||||||
|
import com.tamguo.common.utils.Result;
|
||||||
|
import com.tamguo.common.utils.ShiroUtils;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class LoginController {
|
||||||
|
|
||||||
|
@RequestMapping(path="login")
|
||||||
|
public String helloWorld() {
|
||||||
|
return "login";
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseBody
|
||||||
|
@RequestMapping(value = "login", method = RequestMethod.POST)
|
||||||
|
public Result toLogin(HttpServletRequest request, String username, String password, String captcha)
|
||||||
|
throws IOException {
|
||||||
|
try {
|
||||||
|
String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
|
||||||
|
if (!captcha.equalsIgnoreCase(kaptcha)) {
|
||||||
|
return Result.failResult("验证码错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
Subject subject = ShiroUtils.getSubject();
|
||||||
|
// sha256加密
|
||||||
|
password = new Sha256Hash(password).toHex();
|
||||||
|
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
|
||||||
|
subject.login(token);
|
||||||
|
} catch (UnknownAccountException e) {
|
||||||
|
return ExceptionSupport.resolverResult("找不到账户", this.getClass(), e);
|
||||||
|
} catch (IncorrectCredentialsException e) {
|
||||||
|
return ExceptionSupport.resolverResult("账户验证失败", this.getClass(), e);
|
||||||
|
} catch (LockedAccountException e) {
|
||||||
|
return ExceptionSupport.resolverResult("账户验证失败", this.getClass(), e);
|
||||||
|
} catch (AuthenticationException e) {
|
||||||
|
return ExceptionSupport.resolverResult("账户验证失败", this.getClass(), e);
|
||||||
|
}
|
||||||
|
request.getSession().setAttribute("currAdmin", ShiroUtils.getUser());
|
||||||
|
return Result.successResult(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.tamguo.modules.sys.web;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletOutputStream;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import com.google.code.kaptcha.Constants;
|
||||||
|
import com.google.code.kaptcha.Producer;
|
||||||
|
import com.tamguo.common.utils.ShiroUtils;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class ValidCodeController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Producer producer;
|
||||||
|
|
||||||
|
@RequestMapping("validCode")
|
||||||
|
public void validCode(HttpServletResponse response) throws ServletException, IOException {
|
||||||
|
response.setHeader("Cache-Control", "no-store, no-cache");
|
||||||
|
response.setContentType("image/jpeg");
|
||||||
|
// 生成文字验证码
|
||||||
|
String text = producer.createText();
|
||||||
|
// 生成图片验证码
|
||||||
|
BufferedImage image = producer.createImage(text);
|
||||||
|
// 保存到shiro session
|
||||||
|
ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
|
||||||
|
ServletOutputStream out = response.getOutputStream();
|
||||||
|
ImageIO.write(image, "jpg", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
domain.name=http://localhost/
|
||||||
|
server.port=80
|
||||||
|
jasypt.encryptor.password=tamguo
|
||||||
|
|
||||||
|
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
|
||||||
|
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
||||||
|
spring.datasource.filters=stat,wall,log4j
|
||||||
|
spring.datasource.initialSize=5
|
||||||
|
spring.datasource.maxActive=20
|
||||||
|
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
|
||||||
|
spring.datasource.maxWait=60000
|
||||||
|
spring.datasource.minEvictableIdleTimeMillis=300000
|
||||||
|
spring.datasource.minIdle=5
|
||||||
|
spring.datasource.password=Tanguo
|
||||||
|
spring.datasource.poolPreparedStatements=true
|
||||||
|
spring.datasource.testOnBorrow=false
|
||||||
|
spring.datasource.testOnReturn=false
|
||||||
|
spring.datasource.testWhileIdle=true
|
||||||
|
spring.datasource.timeBetweenEvictionRunsMillis=60000
|
||||||
|
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
|
||||||
|
spring.datasource.url=jdbc:mysql://47.100.175.14:3306/tiku?useUnicode=true&characterEncoding=UTF-8&useSSL=false
|
||||||
|
spring.datasource.username=root
|
||||||
|
spring.datasource.validationQuery=SELECT 1 FROM DUAL
|
||||||
|
|
||||||
|
mybatis-plus.mapper-locations=classpath:/mappers/*Mapper.xml
|
||||||
|
mybatis-plus.typeAliasesPackage=com.tamguo.modules.*.model
|
||||||
|
mybatis-plus.typeEnumsPackage=com.tamguo.modules.*.model.enums
|
||||||
|
mybatis-plus.global-config.id-type=5
|
||||||
|
mybatis-plus.global-config.field-strategy=2
|
||||||
|
mybatis-plus.global-config.db-column-underline=true
|
||||||
|
mybatis-plus.global-config.refresh-mapper=true
|
||||||
|
mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.H2KeyGenerator
|
||||||
|
mybatis-plus.global-config.logic-delete-value=0
|
||||||
|
mybatis-plus.global-config.logic-not-delete-value=1
|
||||||
|
mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
|
||||||
|
mybatis-plus.global-config.meta-object-handler=com.tamguo.common.dao.MyMetaObjectHandler
|
||||||
|
mybatis-plus.global-config.sql-parser-cache=true
|
||||||
|
mybatis-plus.configuration.map-underscore-to-camel-case=true
|
||||||
|
mybatis-plus.configuration.cache-enabled=false
|
||||||
|
|
||||||
|
spring.thymeleaf.prefix=classpath:/templates/
|
||||||
|
spring.thymeleaf.suffix=.html
|
||||||
|
spring.thymeleaf.mode=LEGACYHTML5
|
||||||
|
spring.thymeleaf.encoding=UTF-8
|
||||||
|
spring.thymeleaf.content-type=text/html
|
||||||
|
spring.thymeleaf.cache=false
|
||||||
|
|
||||||
|
redis.hostname=47.100.175.14
|
||||||
|
redis.port=6379
|
||||||
|
redis.password=
|
||||||
|
|
||||||
|
file.storage.path=/home/webdata/files/
|
||||||
|
|
||||||
|
logging.level.root=INFO
|
||||||
|
logging.level.org.springframework.web=INFO
|
||||||
|
logging.file=/home/webdata/log/tamguo.log
|
||||||
|
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
|
||||||
|
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
|
||||||
|
|
||||||
|
server.compression.enabled=true
|
||||||
|
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
|
@ -0,0 +1,11 @@
|
|||||||
|
<ehcache updateCheck="false" name="shiroCache">
|
||||||
|
<defaultCache
|
||||||
|
maxElementsInMemory="10000"
|
||||||
|
eternal="false"
|
||||||
|
timeToIdleSeconds="120"
|
||||||
|
timeToLiveSeconds="120"
|
||||||
|
overflowToDisk="false"
|
||||||
|
diskPersistent="false"
|
||||||
|
diskExpiryThreadIntervalSeconds="120"
|
||||||
|
/>
|
||||||
|
</ehcache>
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<redis>
|
||||||
|
<preKey value="TAMGUO:" />
|
||||||
|
<pool maxActive="50" maxIdle="20" maxWait="1000" />
|
||||||
|
<servers>
|
||||||
|
<!-- test -->
|
||||||
|
<server ip="47.100.175.14" port="6379"/>
|
||||||
|
</servers>
|
||||||
|
</redis>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,171 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Black
|
||||||
|
* -----------
|
||||||
|
*/
|
||||||
|
/* skin-black navbar */
|
||||||
|
.main-header {
|
||||||
|
border-bottom: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.main-header .navbar-toggle {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.main-header .navbar-brand {
|
||||||
|
color: #333;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: #ffffff;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #999999;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar > .sidebar-toggle {
|
||||||
|
color: #333;
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar .navbar-nav > li > a {
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
|
||||||
|
.main-header .navbar .navbar-right > li > a {
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
border-right-width: 0;
|
||||||
|
}
|
||||||
|
.main-header > .logo {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #333333;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header > .logo:hover {
|
||||||
|
background-color: #fcfcfc;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header > .logo {
|
||||||
|
background-color: #222222;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
.main-header > .logo:hover {
|
||||||
|
background-color: #1f1f1f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #222;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #eaedf1;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #eaedf1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000000;
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Black
|
||||||
|
* -----------
|
||||||
|
*/
|
||||||
|
/* skin-black navbar */
|
||||||
|
.main-header {
|
||||||
|
-webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
.main-header .navbar-toggle {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.main-header .navbar-brand {
|
||||||
|
color: #333;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: #ffffff;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #999999;
|
||||||
|
background: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar > .sidebar-toggle {
|
||||||
|
color: #333;
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar .navbar-nav > li > a {
|
||||||
|
border-right: 1px solid #eee;
|
||||||
|
}
|
||||||
|
.main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
|
||||||
|
.main-header .navbar .navbar-right > li > a {
|
||||||
|
border-left: 1px solid #eee;
|
||||||
|
border-right-width: 0;
|
||||||
|
}
|
||||||
|
.main-header > .logo {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #333333;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header > .logo:hover {
|
||||||
|
background-color: #fcfcfc;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header > .logo {
|
||||||
|
background-color: #222222;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
|
.main-header > .logo:hover {
|
||||||
|
background-color: #1f1f1f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #222;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #ffffff; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
.pace .pace-progress {
|
||||||
|
background: #222;
|
||||||
|
}
|
||||||
|
.pace .pace-activity {
|
||||||
|
border-top-color: #222;
|
||||||
|
border-left-color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#ddd;}
|
@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Blue
|
||||||
|
* ----------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #2A579A;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #367fa9;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #367fa9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #2A579A;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #204F93;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #2A579A;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #E3E7EC;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #E3E7EC;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000;
|
||||||
|
background: #EAEDF1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #2A579A;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #EAEDF1;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-footer {
|
||||||
|
border-top-color: #d2d6de;
|
||||||
|
}
|
||||||
|
.skin-blue.layout-top-nav .main-header > .logo {
|
||||||
|
background-color: #2A579A;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.skin-blue.layout-top-nav .main-header > .logo:hover {
|
||||||
|
background-color: #3b8ab8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Blue
|
||||||
|
* ----------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #3c8dbc;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #367fa9;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #367fa9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #367fa9;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #357ca5;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #3c8dbc;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #3c8dbc; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
.skin-blue.layout-top-nav .main-header > .logo {
|
||||||
|
background-color: #3c8dbc;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.skin-blue.layout-top-nav .main-header > .logo:hover {
|
||||||
|
background-color: #3b8ab8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#fff;background-color:#3c8dbc;}
|
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Green
|
||||||
|
* -----------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #00a65a;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #008d4c;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #008d4c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #00a65a;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #00a157;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #00a65a;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #eaedf1;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #eaedf1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000000;
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #00a65a;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Green
|
||||||
|
* -----------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #00a65a;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #008d4c;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #008d4c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #008d4c;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #008749;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #00a65a;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #00a65a; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#fff;background-color:#00a65a;}
|
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Purple
|
||||||
|
* ------------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #605ca8;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #555299;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #555299;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #605ca8;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #5d59a6;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #605ca8;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #eaedf1;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #eaedf1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000000;
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #605ca8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Purple
|
||||||
|
* ------------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #605ca8;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #555299;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #555299;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #555299;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #545096;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #605ca8;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #605ca8; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#fff;background-color:#605ca8;}
|
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Red
|
||||||
|
* ---------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #dd4b39;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #d73925;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #d73925;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #dd4b39;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #dc4735;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #dd4b39;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #eaedf1;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #eaedf1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000000;
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #dd4b39;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Red
|
||||||
|
* ---------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #dd4b39;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #d73925;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #d73925;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #d73925;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #d33724;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #dd4b39;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #dd4b39; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#fff;background-color:#dd4b39;}
|
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Yellow
|
||||||
|
* ------------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #f39c12;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #e08e0b;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #e08e0b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #f39c12;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #f39a0d;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #f39c12;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #eaedf1;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.main-footer {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li {
|
||||||
|
-webkit-transition: border-left-color 0.3s ease;
|
||||||
|
-o-transition: border-left-color 0.3s ease;
|
||||||
|
transition: border-left-color 0.3s ease;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #848484;
|
||||||
|
background: #eaedf1;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #000000;
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active {
|
||||||
|
border-left-color: #f39c12;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
background: #f4f6f8;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #777777;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d2d6de;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
|
||||||
|
border-left: 1px solid #d2d6de;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#000;background-color:#fff;}
|
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Skin: Yellow
|
||||||
|
* ------------
|
||||||
|
*/
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #f39c12;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
background-color: #e08e0b;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.main-header .navbar .dropdown-menu li.divider {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.main-header .navbar .dropdown-menu li a:hover {
|
||||||
|
background: #e08e0b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-header .logo {
|
||||||
|
background-color: #e08e0b;
|
||||||
|
color: #ffffff;
|
||||||
|
border-bottom: 0 solid transparent;
|
||||||
|
}
|
||||||
|
.main-header .logo:hover {
|
||||||
|
background-color: #db8b0b;
|
||||||
|
}
|
||||||
|
.main-header li.user-header {
|
||||||
|
background-color: #f39c12;
|
||||||
|
}
|
||||||
|
.content-header {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #263238;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #4b646f;
|
||||||
|
background: #1a2226;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #2c3b41;
|
||||||
|
/* border-left-color: #f39c12; */
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background: #2c3b41;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #abb1b7;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #374850;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #374850;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-menu .treeview-item.active > a {color:#fff;background-color:#f39c12;}
|
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 43 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,130 @@
|
|||||||
|
/**
|
||||||
|
* @preserve
|
||||||
|
* Project: Bootstrap Hover Dropdown
|
||||||
|
* Author: Cameron Spear
|
||||||
|
* Version: v2.2.1
|
||||||
|
* Contributors: Mattia Larentis
|
||||||
|
* Dependencies: Bootstrap's Dropdown plugin, jQuery
|
||||||
|
* Description: A simple plugin to enable Bootstrap dropdowns to active on hover and provide a nice user experience.
|
||||||
|
* License: MIT
|
||||||
|
* Homepage: http://cameronspear.com/blog/bootstrap-dropdown-on-hover-plugin/
|
||||||
|
*/
|
||||||
|
;(function ($, window, undefined) {
|
||||||
|
// outside the scope of the jQuery plugin to
|
||||||
|
// keep track of all dropdowns
|
||||||
|
var $allDropdowns = $();
|
||||||
|
|
||||||
|
// if instantlyCloseOthers is true, then it will instantly
|
||||||
|
// shut other nav items when a new one is hovered over
|
||||||
|
$.fn.dropdownHover = function (options) {
|
||||||
|
// don't do anything if touch is supported
|
||||||
|
// (plugin causes some issues on mobile)
|
||||||
|
if('ontouchstart' in document) return this; // don't want to affect chaining
|
||||||
|
|
||||||
|
// the element we really care about
|
||||||
|
// is the dropdown-toggle's parent
|
||||||
|
$allDropdowns = $allDropdowns.add(this.parent());
|
||||||
|
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this),
|
||||||
|
$parent = $this.parent(),
|
||||||
|
defaults = {
|
||||||
|
delay: 500,
|
||||||
|
hoverDelay: 0,
|
||||||
|
instantlyCloseOthers: true
|
||||||
|
},
|
||||||
|
data = {
|
||||||
|
delay: $(this).data('delay'),
|
||||||
|
hoverDelay: $(this).data('hover-delay'),
|
||||||
|
instantlyCloseOthers: $(this).data('close-others')
|
||||||
|
},
|
||||||
|
showEvent = 'show.bs.dropdown',
|
||||||
|
hideEvent = 'hide.bs.dropdown',
|
||||||
|
// shownEvent = 'shown.bs.dropdown',
|
||||||
|
// hiddenEvent = 'hidden.bs.dropdown',
|
||||||
|
settings = $.extend(true, {}, defaults, options, data),
|
||||||
|
timeout, timeoutHover;
|
||||||
|
|
||||||
|
$parent.hover(function (event) {
|
||||||
|
// so a neighbor can't open the dropdown
|
||||||
|
if(!$parent.hasClass('open') && !$this.is(event.target)) {
|
||||||
|
// stop this event, stop executing any code
|
||||||
|
// in this callback but continue to propagate
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
openDropdown(event);
|
||||||
|
}, function () {
|
||||||
|
// clear timer for hover event
|
||||||
|
window.clearTimeout(timeoutHover)
|
||||||
|
timeout = window.setTimeout(function () {
|
||||||
|
$this.attr('aria-expanded', 'false');
|
||||||
|
$parent.removeClass('open');
|
||||||
|
$this.trigger(hideEvent);
|
||||||
|
}, settings.delay);
|
||||||
|
});
|
||||||
|
|
||||||
|
// this helps with button groups!
|
||||||
|
$this.hover(function (event) {
|
||||||
|
// this helps prevent a double event from firing.
|
||||||
|
// see https://github.com/CWSpear/bootstrap-hover-dropdown/issues/55
|
||||||
|
if(!$parent.hasClass('open') && !$parent.is(event.target)) {
|
||||||
|
// stop this event, stop executing any code
|
||||||
|
// in this callback but continue to propagate
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
openDropdown(event);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle submenus
|
||||||
|
$parent.find('.dropdown-submenu').each(function (){
|
||||||
|
var $this = $(this);
|
||||||
|
var subTimeout;
|
||||||
|
$this.hover(function () {
|
||||||
|
window.clearTimeout(subTimeout);
|
||||||
|
$this.children('.dropdown-menu').show();
|
||||||
|
// always close submenu siblings instantly
|
||||||
|
$this.siblings().children('.dropdown-menu').hide();
|
||||||
|
}, function () {
|
||||||
|
var $submenu = $this.children('.dropdown-menu');
|
||||||
|
subTimeout = window.setTimeout(function () {
|
||||||
|
$submenu.hide();
|
||||||
|
}, settings.delay);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function openDropdown(event) {
|
||||||
|
if($this.parents(".navbar").find(".navbar-toggle").is(":visible")) {
|
||||||
|
// If we're inside a navbar, don't do anything when the
|
||||||
|
// navbar is collapsed, as it makes the navbar pretty unusable.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear dropdown timeout here so it doesnt close before it should
|
||||||
|
window.clearTimeout(timeout);
|
||||||
|
// restart hover timer
|
||||||
|
window.clearTimeout(timeoutHover);
|
||||||
|
|
||||||
|
// delay for hover event.
|
||||||
|
timeoutHover = window.setTimeout(function () {
|
||||||
|
$allDropdowns.find(':focus').blur();
|
||||||
|
|
||||||
|
if(settings.instantlyCloseOthers === true)
|
||||||
|
$allDropdowns.removeClass('open');
|
||||||
|
|
||||||
|
// clear timer for hover event
|
||||||
|
window.clearTimeout(timeoutHover);
|
||||||
|
$this.attr('aria-expanded', 'true');
|
||||||
|
$parent.addClass('open');
|
||||||
|
$this.trigger(showEvent);
|
||||||
|
}, settings.hoverDelay);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
// apply dropdownHover to all elements with the data-hover="dropdown" attribute
|
||||||
|
$('[data-hover="dropdown"]').dropdownHover();
|
||||||
|
});
|
||||||
|
})(jQuery, window);
|
@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* @preserve
|
||||||
|
* Project: Bootstrap Hover Dropdown
|
||||||
|
* Author: Cameron Spear
|
||||||
|
* Version: v2.2.1
|
||||||
|
* Contributors: Mattia Larentis
|
||||||
|
* Dependencies: Bootstrap's Dropdown plugin, jQuery
|
||||||
|
* Description: A simple plugin to enable Bootstrap dropdowns to active on hover and provide a nice user experience.
|
||||||
|
* License: MIT
|
||||||
|
* Homepage: http://cameronspear.com/blog/bootstrap-dropdown-on-hover-plugin/
|
||||||
|
*/
|
||||||
|
!function(e,n){var o=e();e.fn.dropdownHover=function(t){return"ontouchstart"in document?this:(o=o.add(this.parent()),this.each(function(){function r(){d.parents(".navbar").find(".navbar-toggle").is(":visible")||(n.clearTimeout(a),n.clearTimeout(i),i=n.setTimeout(function(){o.find(":focus").blur(),v.instantlyCloseOthers===!0&&o.removeClass("open"),n.clearTimeout(i),d.attr("aria-expanded","true"),s.addClass("open"),d.trigger(h)},v.hoverDelay))}var a,i,d=e(this),s=d.parent(),u={delay:500,hoverDelay:0,instantlyCloseOthers:!0},l={delay:e(this).data("delay"),hoverDelay:e(this).data("hover-delay"),instantlyCloseOthers:e(this).data("close-others")},h="show.bs.dropdown",c="hide.bs.dropdown",v=e.extend(!0,{},u,t,l);s.hover(function(e){return s.hasClass("open")||d.is(e.target)?void r(e):!0},function(){n.clearTimeout(i),a=n.setTimeout(function(){d.attr("aria-expanded","false"),s.removeClass("open"),d.trigger(c)},v.delay)}),d.hover(function(e){return s.hasClass("open")||s.is(e.target)?void r(e):!0}),s.find(".dropdown-submenu").each(function(){var o,t=e(this);t.hover(function(){n.clearTimeout(o),t.children(".dropdown-menu").show(),t.siblings().children(".dropdown-menu").hide()},function(){var e=t.children(".dropdown-menu");o=n.setTimeout(function(){e.hide()},v.delay)})})}))},e(document).ready(function(){e('[data-hover="dropdown"]').dropdownHover()})}(jQuery,window);
|
@ -0,0 +1,587 @@
|
|||||||
|
/*!
|
||||||
|
* Bootstrap v3.3.7 (http://getbootstrap.com)
|
||||||
|
* Copyright 2011-2016 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
.btn-default,
|
||||||
|
.btn-primary,
|
||||||
|
.btn-success,
|
||||||
|
.btn-info,
|
||||||
|
.btn-warning,
|
||||||
|
.btn-danger {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.btn-default:active,
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-success:active,
|
||||||
|
.btn-info:active,
|
||||||
|
.btn-warning:active,
|
||||||
|
.btn-danger:active,
|
||||||
|
.btn-default.active,
|
||||||
|
.btn-primary.active,
|
||||||
|
.btn-success.active,
|
||||||
|
.btn-info.active,
|
||||||
|
.btn-warning.active,
|
||||||
|
.btn-danger.active {
|
||||||
|
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
}
|
||||||
|
.btn-default.disabled,
|
||||||
|
.btn-primary.disabled,
|
||||||
|
.btn-success.disabled,
|
||||||
|
.btn-info.disabled,
|
||||||
|
.btn-warning.disabled,
|
||||||
|
.btn-danger.disabled,
|
||||||
|
.btn-default[disabled],
|
||||||
|
.btn-primary[disabled],
|
||||||
|
.btn-success[disabled],
|
||||||
|
.btn-info[disabled],
|
||||||
|
.btn-warning[disabled],
|
||||||
|
.btn-danger[disabled],
|
||||||
|
fieldset[disabled] .btn-default,
|
||||||
|
fieldset[disabled] .btn-primary,
|
||||||
|
fieldset[disabled] .btn-success,
|
||||||
|
fieldset[disabled] .btn-info,
|
||||||
|
fieldset[disabled] .btn-warning,
|
||||||
|
fieldset[disabled] .btn-danger {
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.btn-default .badge,
|
||||||
|
.btn-primary .badge,
|
||||||
|
.btn-success .badge,
|
||||||
|
.btn-info .badge,
|
||||||
|
.btn-warning .badge,
|
||||||
|
.btn-danger .badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.btn:active,
|
||||||
|
.btn.active {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-default {
|
||||||
|
text-shadow: 0 1px 0 #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
|
||||||
|
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dbdbdb;
|
||||||
|
border-color: #ccc;
|
||||||
|
}
|
||||||
|
.btn-default:hover,
|
||||||
|
.btn-default:focus {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-default:active,
|
||||||
|
.btn-default.active {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
border-color: #dbdbdb;
|
||||||
|
}
|
||||||
|
.btn-default.disabled,
|
||||||
|
.btn-default[disabled],
|
||||||
|
fieldset[disabled] .btn-default,
|
||||||
|
.btn-default.disabled:hover,
|
||||||
|
.btn-default[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-default:hover,
|
||||||
|
.btn-default.disabled:focus,
|
||||||
|
.btn-default[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-default:focus,
|
||||||
|
.btn-default.disabled.focus,
|
||||||
|
.btn-default[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-default.focus,
|
||||||
|
.btn-default.disabled:active,
|
||||||
|
.btn-default[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-default:active,
|
||||||
|
.btn-default.disabled.active,
|
||||||
|
.btn-default[disabled].active,
|
||||||
|
fieldset[disabled] .btn-default.active {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-primary {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #245580;
|
||||||
|
}
|
||||||
|
.btn-primary:hover,
|
||||||
|
.btn-primary:focus {
|
||||||
|
background-color: #265a88;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-primary.active {
|
||||||
|
background-color: #265a88;
|
||||||
|
border-color: #245580;
|
||||||
|
}
|
||||||
|
.btn-primary.disabled,
|
||||||
|
.btn-primary[disabled],
|
||||||
|
fieldset[disabled] .btn-primary,
|
||||||
|
.btn-primary.disabled:hover,
|
||||||
|
.btn-primary[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-primary:hover,
|
||||||
|
.btn-primary.disabled:focus,
|
||||||
|
.btn-primary[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-primary:focus,
|
||||||
|
.btn-primary.disabled.focus,
|
||||||
|
.btn-primary[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-primary.focus,
|
||||||
|
.btn-primary.disabled:active,
|
||||||
|
.btn-primary[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-primary:active,
|
||||||
|
.btn-primary.disabled.active,
|
||||||
|
.btn-primary[disabled].active,
|
||||||
|
fieldset[disabled] .btn-primary.active {
|
||||||
|
background-color: #265a88;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
|
||||||
|
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #3e8f3e;
|
||||||
|
}
|
||||||
|
.btn-success:hover,
|
||||||
|
.btn-success:focus {
|
||||||
|
background-color: #419641;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-success:active,
|
||||||
|
.btn-success.active {
|
||||||
|
background-color: #419641;
|
||||||
|
border-color: #3e8f3e;
|
||||||
|
}
|
||||||
|
.btn-success.disabled,
|
||||||
|
.btn-success[disabled],
|
||||||
|
fieldset[disabled] .btn-success,
|
||||||
|
.btn-success.disabled:hover,
|
||||||
|
.btn-success[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-success:hover,
|
||||||
|
.btn-success.disabled:focus,
|
||||||
|
.btn-success[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-success:focus,
|
||||||
|
.btn-success.disabled.focus,
|
||||||
|
.btn-success[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-success.focus,
|
||||||
|
.btn-success.disabled:active,
|
||||||
|
.btn-success[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-success:active,
|
||||||
|
.btn-success.disabled.active,
|
||||||
|
.btn-success[disabled].active,
|
||||||
|
fieldset[disabled] .btn-success.active {
|
||||||
|
background-color: #419641;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
|
||||||
|
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #28a4c9;
|
||||||
|
}
|
||||||
|
.btn-info:hover,
|
||||||
|
.btn-info:focus {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-info:active,
|
||||||
|
.btn-info.active {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
border-color: #28a4c9;
|
||||||
|
}
|
||||||
|
.btn-info.disabled,
|
||||||
|
.btn-info[disabled],
|
||||||
|
fieldset[disabled] .btn-info,
|
||||||
|
.btn-info.disabled:hover,
|
||||||
|
.btn-info[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-info:hover,
|
||||||
|
.btn-info.disabled:focus,
|
||||||
|
.btn-info[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-info:focus,
|
||||||
|
.btn-info.disabled.focus,
|
||||||
|
.btn-info[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-info.focus,
|
||||||
|
.btn-info.disabled:active,
|
||||||
|
.btn-info[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-info:active,
|
||||||
|
.btn-info.disabled.active,
|
||||||
|
.btn-info[disabled].active,
|
||||||
|
fieldset[disabled] .btn-info.active {
|
||||||
|
background-color: #2aabd2;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
|
||||||
|
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #e38d13;
|
||||||
|
}
|
||||||
|
.btn-warning:hover,
|
||||||
|
.btn-warning:focus {
|
||||||
|
background-color: #eb9316;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-warning:active,
|
||||||
|
.btn-warning.active {
|
||||||
|
background-color: #eb9316;
|
||||||
|
border-color: #e38d13;
|
||||||
|
}
|
||||||
|
.btn-warning.disabled,
|
||||||
|
.btn-warning[disabled],
|
||||||
|
fieldset[disabled] .btn-warning,
|
||||||
|
.btn-warning.disabled:hover,
|
||||||
|
.btn-warning[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-warning:hover,
|
||||||
|
.btn-warning.disabled:focus,
|
||||||
|
.btn-warning[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-warning:focus,
|
||||||
|
.btn-warning.disabled.focus,
|
||||||
|
.btn-warning[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-warning.focus,
|
||||||
|
.btn-warning.disabled:active,
|
||||||
|
.btn-warning[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-warning:active,
|
||||||
|
.btn-warning.disabled.active,
|
||||||
|
.btn-warning[disabled].active,
|
||||||
|
fieldset[disabled] .btn-warning.active {
|
||||||
|
background-color: #eb9316;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.btn-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
|
||||||
|
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #b92c28;
|
||||||
|
}
|
||||||
|
.btn-danger:hover,
|
||||||
|
.btn-danger:focus {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
background-position: 0 -15px;
|
||||||
|
}
|
||||||
|
.btn-danger:active,
|
||||||
|
.btn-danger.active {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
border-color: #b92c28;
|
||||||
|
}
|
||||||
|
.btn-danger.disabled,
|
||||||
|
.btn-danger[disabled],
|
||||||
|
fieldset[disabled] .btn-danger,
|
||||||
|
.btn-danger.disabled:hover,
|
||||||
|
.btn-danger[disabled]:hover,
|
||||||
|
fieldset[disabled] .btn-danger:hover,
|
||||||
|
.btn-danger.disabled:focus,
|
||||||
|
.btn-danger[disabled]:focus,
|
||||||
|
fieldset[disabled] .btn-danger:focus,
|
||||||
|
.btn-danger.disabled.focus,
|
||||||
|
.btn-danger[disabled].focus,
|
||||||
|
fieldset[disabled] .btn-danger.focus,
|
||||||
|
.btn-danger.disabled:active,
|
||||||
|
.btn-danger[disabled]:active,
|
||||||
|
fieldset[disabled] .btn-danger:active,
|
||||||
|
.btn-danger.disabled.active,
|
||||||
|
.btn-danger[disabled].active,
|
||||||
|
fieldset[disabled] .btn-danger.active {
|
||||||
|
background-color: #c12e2a;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
.thumbnail,
|
||||||
|
.img-thumbnail {
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.dropdown-menu > li > a:hover,
|
||||||
|
.dropdown-menu > li > a:focus {
|
||||||
|
background-color: #e8e8e8;
|
||||||
|
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||||
|
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.dropdown-menu > .active > a,
|
||||||
|
.dropdown-menu > .active > a:hover,
|
||||||
|
.dropdown-menu > .active > a:focus {
|
||||||
|
background-color: #2e6da4;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.navbar-default {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
|
||||||
|
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.navbar-default .navbar-nav > .open > a,
|
||||||
|
.navbar-default .navbar-nav > .active > a {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
|
||||||
|
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.navbar-brand,
|
||||||
|
.navbar-nav > li > a {
|
||||||
|
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
|
||||||
|
}
|
||||||
|
.navbar-inverse {
|
||||||
|
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
|
||||||
|
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.navbar-inverse .navbar-nav > .open > a,
|
||||||
|
.navbar-inverse .navbar-nav > .active > a {
|
||||||
|
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
|
||||||
|
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
|
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
||||||
|
}
|
||||||
|
.navbar-inverse .navbar-brand,
|
||||||
|
.navbar-inverse .navbar-nav > li > a {
|
||||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
|
||||||
|
}
|
||||||
|
.navbar-static-top,
|
||||||
|
.navbar-fixed-top,
|
||||||
|
.navbar-fixed-bottom {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
|
||||||
|
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
|
||||||
|
color: #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.alert {
|
||||||
|
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
||||||
|
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
}
|
||||||
|
.alert-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
|
||||||
|
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #b2dba1;
|
||||||
|
}
|
||||||
|
.alert-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
|
||||||
|
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #9acfea;
|
||||||
|
}
|
||||||
|
.alert-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
|
||||||
|
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #f5e79e;
|
||||||
|
}
|
||||||
|
.alert-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
|
||||||
|
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dca7a7;
|
||||||
|
}
|
||||||
|
.progress {
|
||||||
|
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
|
||||||
|
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-success {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
|
||||||
|
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-info {
|
||||||
|
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
|
||||||
|
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-warning {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
|
||||||
|
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-danger {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
|
||||||
|
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.progress-bar-striped {
|
||||||
|
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
||||||
|
}
|
||||||
|
.list-group {
|
||||||
|
border-radius: 4px;
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
||||||
|
}
|
||||||
|
.list-group-item.active,
|
||||||
|
.list-group-item.active:hover,
|
||||||
|
.list-group-item.active:focus {
|
||||||
|
text-shadow: 0 -1px 0 #286090;
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #2b669a;
|
||||||
|
}
|
||||||
|
.list-group-item.active .badge,
|
||||||
|
.list-group-item.active:hover .badge,
|
||||||
|
.list-group-item.active:focus .badge {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.panel {
|
||||||
|
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
||||||
|
}
|
||||||
|
.panel-default > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
||||||
|
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-primary > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
|
||||||
|
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-success > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
|
||||||
|
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-info > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
|
||||||
|
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-warning > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
|
||||||
|
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.panel-danger > .panel-heading {
|
||||||
|
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
|
||||||
|
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
.well {
|
||||||
|
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
|
||||||
|
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dcdcdc;
|
||||||
|
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||||
|
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=bootstrap-theme.css.map */
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||||
|
*
|
||||||
|
* 国际化文件
|
||||||
|
* @author ThinkGem
|
||||||
|
* @version 2017-12-24
|
||||||
|
*/
|
||||||
|
(function(a){window.js=window.js||{};js.i18n=a.extend({},js.i18n,{"tabpanel.newTabPage":"New Page","loading.message":"Loading ...","loading.submitMessage":"Submission ...","showMessage.error":"failure,error","showMessage.success":"success,completion","showMessage.warning":"no"})})(jQuery);
|
@ -0,0 +1,8 @@
|
|||||||
|
/*!
|
||||||
|
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||||
|
*
|
||||||
|
* 国际化文件
|
||||||
|
* @author ThinkGem
|
||||||
|
* @version 2017-12-24
|
||||||
|
*/
|
||||||
|
(function(a){window.js=window.js||{};js.i18n=a.extend({},js.i18n,{"tabpanel.newTabPage":"新页签","loading.message":"正在加载,请稍后...","loading.submitMessage":"正在提交,请稍后...","showMessage.error":"失败,错误,未完成","showMessage.success":"成功,完成","showMessage.warning":"不能,不允许,必须,已存在,不需要,不正确"})})(jQuery);
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue