初始化项目
98
sso/pom.xml
Normal file
@@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<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">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>com.njcn</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>sso</artifactId>
|
||||
<packaging>war</packaging>
|
||||
<name>sso Maven Webapp</name>
|
||||
<url>http://www.example.com</url>
|
||||
|
||||
<properties>
|
||||
<!--项目建设环境编码格式 -->
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.njcn</groupId>
|
||||
<artifactId>comService</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<!-- spring用到的包 *********start********* -->
|
||||
|
||||
|
||||
<!-- 验证码服务 -->
|
||||
<dependency>
|
||||
<groupId>com.github.penggle</groupId>
|
||||
<artifactId>kaptcha</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax</groupId>
|
||||
<artifactId>javaee-api</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<!--编译文件指定jdk-->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.3.2</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
<compilerArguments>
|
||||
<verbose />
|
||||
<bootclasspath>C:\JAVA\jdk\jre\lib\rt.jar;C:\JAVA\jre\lib\jce.jar</bootclasspath>
|
||||
</compilerArguments>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.14.1</version>
|
||||
<configuration>
|
||||
<skipTests>true</skipTests>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!--maven跑tomcat插件-->
|
||||
<plugin>
|
||||
<groupId>org.apache.tomcat.maven</groupId>
|
||||
<artifactId>tomcat7-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<port>8080</port>
|
||||
<path>/</path>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
<excludes>
|
||||
<exclude>**/*.woff</exclude>
|
||||
<exclude>**/*.woff2</exclude>
|
||||
<exclude>**/*.ttf</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>false</filtering>
|
||||
<includes>
|
||||
<include>**/*.woff</include>
|
||||
<include>**/*.woff2</include>
|
||||
<include>**/*.ttf</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<defaultGoal>install</defaultGoal>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
22
sso/src/main/java/com/sso/controller/DefaultController.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.sso.controller;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @Date: 2018/9/18 11:17
|
||||
*/
|
||||
@Controller
|
||||
public class DefaultController {
|
||||
|
||||
@RequestMapping("auth/urlXssError")
|
||||
public String urlXssError(){
|
||||
return "urlXssError";
|
||||
}
|
||||
|
||||
}
|
||||
45
sso/src/main/java/com/sso/controller/ThemeController.java
Normal file
@@ -0,0 +1,45 @@
|
||||
package com.sso.controller;
|
||||
|
||||
import com.njcn.pojo.commons.HttpResult;
|
||||
import com.njcn.service.system.ThemeService;
|
||||
import com.njcn.utils.PubUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @date: 2019/9/27 10:47
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping("theme")
|
||||
public class ThemeController {
|
||||
private static final Logger logger = LoggerFactory.getLogger(ThemeController.class);
|
||||
|
||||
@Resource
|
||||
private ThemeService themeService;
|
||||
|
||||
|
||||
/**
|
||||
* 获取主题色
|
||||
*/
|
||||
@PostMapping("getColor")
|
||||
@ResponseBody
|
||||
public HttpResult getColor() {
|
||||
HttpResult result;
|
||||
String color;
|
||||
try{
|
||||
color=themeService.getThemeColor();
|
||||
result= PubUtils.assignmentResult(color,200,"获取主题色成功");
|
||||
}catch (Exception e){
|
||||
logger.error(e.toString());
|
||||
result= PubUtils.assignmentResult("#006565",500,"获取主题色失败");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
688
sso/src/main/java/com/sso/controller/UserController.java
Normal file
@@ -0,0 +1,688 @@
|
||||
package com.sso.controller;
|
||||
|
||||
import com.google.code.kaptcha.Producer;
|
||||
import com.google.code.kaptcha.util.Config;
|
||||
import com.njcn.enums.*;
|
||||
import com.njcn.mapper.configuration.SysMapper;
|
||||
import com.njcn.mapper.user.UserMapper;
|
||||
import com.njcn.pojo.commons.HttpResult;
|
||||
import com.njcn.pojo.commons.RedisDB;
|
||||
import com.njcn.pojo.configuration.SysSet;
|
||||
import com.njcn.pojo.system.SubSystem;
|
||||
import com.njcn.service.log.UserLogDetailService;
|
||||
import com.njcn.service.log.UserLoginService;
|
||||
import com.njcn.service.system.SystemService;
|
||||
import com.njcn.service.user.UserService;
|
||||
import com.njcn.shiro.filter.KickoutSessionFilter;
|
||||
import com.njcn.shiro.session.UserSessionManager;
|
||||
import com.njcn.shiro.session.UserShiroSessionRepository;
|
||||
import com.njcn.shiro.token.TokenManager;
|
||||
import com.njcn.sso.pojo.user.User;
|
||||
import com.njcn.sso.shiro.session.SessionStatus;
|
||||
import com.njcn.utils.*;
|
||||
import com.njcn.utils.redis.JedisManager;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.apache.shiro.authc.AccountException;
|
||||
import org.apache.shiro.session.Session;
|
||||
import org.apache.shiro.session.mgt.SimpleSession;
|
||||
import org.apache.shiro.subject.SimplePrincipalCollection;
|
||||
import org.apache.shiro.subject.Subject;
|
||||
import org.apache.shiro.subject.support.DefaultSubjectContext;
|
||||
import org.apache.shiro.web.util.WebUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @Date: 2018/9/18 11:36
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping("/user")
|
||||
public class UserController {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
|
||||
|
||||
@Autowired
|
||||
private JedisManager jedisManager;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Autowired
|
||||
private UserLoginService userLoginService;
|
||||
|
||||
@Autowired
|
||||
private UserShiroSessionRepository userShiroSessionRepository;
|
||||
|
||||
@Autowired
|
||||
private AppConfig appConfig;
|
||||
|
||||
@Autowired
|
||||
private SpringPubUtils springPubUtils;
|
||||
|
||||
@Autowired
|
||||
private UserUtil userUtil;
|
||||
|
||||
@Autowired
|
||||
private SysMapper sysSetMapper;
|
||||
|
||||
@Autowired
|
||||
private UserLogDetailService userLogDetailService;
|
||||
|
||||
@Autowired
|
||||
private UserMapper userMapper;
|
||||
|
||||
@Resource
|
||||
private SystemService systemService;
|
||||
|
||||
|
||||
/**
|
||||
* 根据token判断用户是否登录
|
||||
* 不登录便跳转登录页面
|
||||
* 登录后重定向用户原来的目标地址
|
||||
*/
|
||||
@GetMapping("/judgeLogin")
|
||||
public void judgeLogin(HttpServletRequest request, HttpServletResponse response, String item) {
|
||||
try {
|
||||
String tokenValue = PubUtils.getSSOToken(request);
|
||||
if (StringUtils.isNotBlank(tokenValue)) {
|
||||
//首先根据token去redis中查询有没有对应的session
|
||||
Session session = userShiroSessionRepository.getSession(tokenValue);
|
||||
if (null == session) {
|
||||
//会话过期,重新登录
|
||||
redirectLogin(request, response);
|
||||
} else {
|
||||
//用户登录后判断当前用户激活的系统,并从中选择一个默认子系统,如果当前激活的系统只有一个,则默认该系统
|
||||
if (StringUtils.isEmpty(item)) {
|
||||
List<SubSystem> subSystems = systemService.getActiveSystem();
|
||||
if (subSystems.size() == 1) {
|
||||
item = subSystems.get(0).getSystemEName();
|
||||
} else {
|
||||
for (SubSystem subSystem : subSystems) {
|
||||
if (subSystem.getDefaultSystem() == 1) {
|
||||
item = subSystem.getSystemEName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//会话没有过期,将会话ID和用户信息传递给目标项目,同时激活下当前session,延长周期
|
||||
userShiroSessionRepository.activeSession(session);
|
||||
session.setAttribute("item", "");
|
||||
String url;
|
||||
String baseUrl = request.getRequestURL().toString();
|
||||
String nickname = TokenManager.getNickname();
|
||||
if (SecurityUtils.getSubject().hasRole(RoleGroupEnum.SYSTEM.getEname()) || SecurityUtils.getSubject().hasRole(RoleGroupEnum.AUDIT.getEname()) || SecurityUtils.getSubject().hasRole(RoleGroupEnum.CHECK.getEname()) || SecurityUtils.getSubject().hasRole(RoleGroupEnum.BUSINESS.getEname()) || SecurityUtils.getSubject().hasRole(RoleGroupEnum.ROOT.getEname())) {
|
||||
url = baseUrl.substring(0, baseUrl.indexOf(ProjectEnum.SSO.getItem())) + ProjectEnum.PQS9900.getLoginUrl() + tokenValue + "&subItem=" + item;
|
||||
} else if (Objects.equals(nickname, appConfig.getThirdName())) {
|
||||
url = baseUrl.substring(0, baseUrl.indexOf(ProjectEnum.SSO.getItem())) + ProjectEnum.PQS9200.getLoginUrl() + tokenValue;
|
||||
} else {
|
||||
if (item.equalsIgnoreCase(ProjectEnum.PQS9000.getItem())) {
|
||||
url = baseUrl.substring(0, baseUrl.indexOf(ProjectEnum.SSO.getItem())) + ProjectEnum.PQS9000.getLoginUrl() + tokenValue;
|
||||
} else if (item.equalsIgnoreCase(ProjectEnum.PQS9200.getItem())) {
|
||||
url = baseUrl.substring(0, baseUrl.indexOf(ProjectEnum.SSO.getItem())) + ProjectEnum.PQS9200.getLoginUrl() + tokenValue;
|
||||
} else {
|
||||
url = baseUrl.substring(0, baseUrl.indexOf(ProjectEnum.SSO.getItem())) + ProjectEnum.PQS9300.getLoginUrl() + tokenValue;
|
||||
}
|
||||
}
|
||||
|
||||
//重定向到某子系统,进行登录认证
|
||||
WebUtils.issueRedirect(request, response, url);
|
||||
}
|
||||
} else {
|
||||
//没有登录的token,则需要跳转到登录页面
|
||||
redirectLogin(request, response);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("判断登录异常," + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取图形验证码
|
||||
*
|
||||
* @param resp 响应体
|
||||
* @param session 当前会话
|
||||
*/
|
||||
@PostMapping("/getImgCode")
|
||||
public void getImgCode(HttpServletResponse resp, HttpSession session) {
|
||||
ServletOutputStream out;
|
||||
try {
|
||||
out = resp.getOutputStream();
|
||||
if (null != out) {
|
||||
Properties props = new Properties();
|
||||
Producer kaptchaProducer;
|
||||
ImageIO.setUseCache(false);
|
||||
props.put("kaptcha.border", "no");
|
||||
props.put("kaptcha.textproducer.font.color", "black");
|
||||
/*props.put("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");*/
|
||||
/*props.put("kaptcha.noise.impl", "com.sso.utils.ComplexNoise");*/
|
||||
props.put("kaptcha.textproducer.char.space", "5");
|
||||
props.put("kaptcha.textproducer.char.length", "4");
|
||||
Config config = new Config(props);
|
||||
kaptchaProducer = config.getProducerImpl();
|
||||
//此处需要固定采用字母和数字混合
|
||||
String capText = getKatpchaText();
|
||||
BufferedImage bi = kaptchaProducer.createImage(capText);
|
||||
session.removeAttribute("capText");
|
||||
session.setAttribute("capText", capText);
|
||||
ImageIO.write(bi, "jpg", out);
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
logger.error("登录界面获取图形验证码异常,原因为:" + e1.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义获取验证码,固定为字母和数字的组合
|
||||
*/
|
||||
private String getKatpchaText() {
|
||||
String result = "";
|
||||
char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
|
||||
char[] numbers = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
|
||||
Character[] text = new Character[4];
|
||||
//首先获取出需要几个字母,范围在1-3选择,最少一个字母,最多三个字母
|
||||
int letterNumbers = PubUtils.getRandomInt(3) + 1;
|
||||
//填充字母
|
||||
for (int i = 0; i < letterNumbers; i++) {
|
||||
int letterIndex = PubUtils.getRandomInt(26);
|
||||
text[i] = letters[letterIndex];
|
||||
}
|
||||
//填充数字
|
||||
for (int i = letterNumbers; i < 4; i++) {
|
||||
int numberIndex = PubUtils.getRandomInt(10);
|
||||
text[i] = numbers[numberIndex];
|
||||
}
|
||||
//填充完字符后,打乱顺序,返回字符串
|
||||
List<Character> textList = Arrays.asList(text);
|
||||
Collections.shuffle(textList);
|
||||
for (int i = 0; i < textList.size(); i++) {
|
||||
result = result + textList.get(i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据用户名重置密码
|
||||
*
|
||||
* @param username 用户名
|
||||
* @param password 密码
|
||||
*/
|
||||
@PostMapping("modifyPwd")
|
||||
@ResponseBody
|
||||
public HttpResult modifyPwd(HttpServletRequest request, String username, String password) {
|
||||
username = XssFilterUtil.dealString(username);
|
||||
password = XssFilterUtil.dealString(password);
|
||||
username = DesUtils.aesDecrypt(username);
|
||||
HttpResult result = PubUtils.initResult(username, request, LogTypeEnum.SYSTEM.toString(), 1);
|
||||
String ip = PubUtils.getIpAddr(request);
|
||||
try {
|
||||
//密码处理
|
||||
String privateKey = jedisManager.getValueByKey(RedisDB.SHORT_TIME_QUERY, username + ip);
|
||||
//秘钥用完即删
|
||||
jedisManager.deleteByKey(RedisDB.SHORT_TIME_QUERY, username + ip);
|
||||
//对SM2解密面进行验证
|
||||
password = PubUtils.getPasswordSM2Verify(privateKey, password);
|
||||
|
||||
if (password == null && password.length() == 0) {
|
||||
return PubUtils.assignmentResultLog(null, 500, "密码传输完整性被破坏", "密码传输遭破坏", "失败", result);
|
||||
}
|
||||
|
||||
//增加判断密码是否包含用户名
|
||||
if (password.contains(username)) {
|
||||
return PubUtils.assignmentResult(null, 500, "用户密码包含登录名");
|
||||
}
|
||||
if (!(PubUtils.patternPassword(password) || PubUtils.patternUsername(username))) {
|
||||
result = PubUtils.assignmentResult(null, 500, "用户名密码有误");
|
||||
return result;
|
||||
}
|
||||
userService.modifyPassword(username, password);
|
||||
result = PubUtils.assignmentResultLog(null, 200, "修改密码成功", "修改密码", "成功", result);
|
||||
} catch (Exception e) {
|
||||
logger.error("更新密码出错,异常为:" + e.toString());
|
||||
String eMessage = e.getMessage();
|
||||
if (eMessage.length() > 20) {
|
||||
eMessage = "内部出错";
|
||||
}
|
||||
result = PubUtils.assignmentResultLog(null, 500, eMessage, "修改密码", "失败", result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/************************
|
||||
* RSA
|
||||
* 根据用户名生成秘钥对
|
||||
* @param username 用户名
|
||||
*************************/
|
||||
@PostMapping("generateRSAKey")
|
||||
@ResponseBody
|
||||
public HttpResult generateRSAKey(String username, HttpServletRequest request) {
|
||||
HttpResult result;
|
||||
try {
|
||||
username = DesUtils.aesDecrypt(username);
|
||||
// 获取公钥和私钥
|
||||
HashMap<String, Object> keys = RSAUtils.getKeys();
|
||||
RSAPublicKey publicKey = (RSAPublicKey) keys.get("public");
|
||||
RSAPrivateKey privateKey = (RSAPrivateKey) keys.get("private");
|
||||
String ip = StringUtils.isBlank(PubUtils.getIpAddr(request)) ? "127.0.0.1" : PubUtils.getIpAddr(request);
|
||||
//秘钥先删除再添加
|
||||
jedisManager.deleteByKey(RedisDB.SHORT_TIME_QUERY, SerializeUtil.serialize(username + ip));
|
||||
// 保存私钥到 redis,也可以保存到数据库
|
||||
jedisManager.saveValueByKey(RedisDB.SHORT_TIME_QUERY, SerializeUtil.serialize(username + ip), SerializeUtil.serialize(privateKey), -1);
|
||||
// 将公钥传到前端
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
// 注意返回modulus和exponent以16为基数的BigInteger的字符串表示形式
|
||||
map.put("modulus", publicKey.getModulus().toString(16));
|
||||
map.put("exponent", publicKey.getPublicExponent().toString(16));
|
||||
result = PubUtils.assignmentResult(map, 200, "生成秘钥对成功!");
|
||||
|
||||
/*byte[] privateBT = privateKey.getEncoded();
|
||||
// base64
|
||||
saveFile("d://privateKey.txt", encodeBase64(privateBT));
|
||||
byte[] publicBT = publicKey.getEncoded();
|
||||
// base64
|
||||
saveFile("d://publicKey.txt", encodeBase64(publicBT));*/
|
||||
} catch (Exception u) {
|
||||
result = PubUtils.assignmentResult(null, 500, u.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/************************
|
||||
* SM2
|
||||
* 根据用户名生成秘钥对
|
||||
* @param username 用户名
|
||||
*************************/
|
||||
@PostMapping("generateSM2Key")
|
||||
@ResponseBody
|
||||
public HttpResult generateSM2Key(String username, HttpServletRequest request) {
|
||||
HttpResult result;
|
||||
try {
|
||||
if (PubUtils.isBlank(username)) {
|
||||
result = PubUtils.assignmentResult(null, 500, "用户名非法!");
|
||||
return result;
|
||||
}
|
||||
username = DesUtils.aesDecrypt(username);
|
||||
// 获取公钥和私钥
|
||||
Map<String, String> keyMap = PubUtils.getSM2CipHer();
|
||||
String publicKey = keyMap.get("publicKey"); //加密密钥
|
||||
String privateKey = keyMap.get("privateKey"); //解密密钥
|
||||
String ip = PubUtils.isBlank(PubUtils.getIpAddr(request)) ? "127.0.0.1" : PubUtils.getIpAddr(request);
|
||||
//秘钥先删除再添加
|
||||
jedisManager.deleteByKey(RedisDB.SHORT_TIME_QUERY, username + ip);
|
||||
// 保存私钥到 redis,也可以保存到数据库
|
||||
jedisManager.saveValueByKey(RedisDB.SHORT_TIME_QUERY, username + ip, privateKey, -1);
|
||||
// 将公钥传到前端
|
||||
result = PubUtils.assignmentResult(publicKey, 200, "生成秘钥对成功!");
|
||||
} catch (Exception u) {
|
||||
result = PubUtils.assignmentResult(null, 500, u.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户登录入口
|
||||
* todo... 判断是否配置激活子系统
|
||||
*/
|
||||
@RequestMapping(value = "login", method = RequestMethod.POST)
|
||||
@ResponseBody
|
||||
public HttpResult login(HttpServletRequest request, HttpServletResponse response, HttpSession session, String username, String password, String checkcode) {
|
||||
//Xss攻击处理
|
||||
username = XssFilterUtil.dealString(username);
|
||||
username = DesUtils.aesDecrypt(username);
|
||||
HttpResult result = PubUtils.initResult(username, request, LogTypeEnum.SYSTEM.toString(), 2);
|
||||
// 验证码校验
|
||||
if (!judgeCode(checkcode, session)) {
|
||||
return PubUtils.assignmentResult(null, 500, "验证码错误");
|
||||
}
|
||||
String ip = PubUtils.getIpAddr(request);
|
||||
//登录之前针对最大并发会话控制
|
||||
try {
|
||||
judgeLoginSession(username);
|
||||
} catch (Exception u) {
|
||||
String exeString = u.getMessage();
|
||||
if (exeString.length() > 20) {
|
||||
exeString = "登录出错,联系管理员";
|
||||
}
|
||||
return PubUtils.assignmentResultLog(null, 500, exeString, "超过系统最大并发", "失败", result);
|
||||
}
|
||||
try {
|
||||
System.out.println(password);
|
||||
//密码处理
|
||||
String privateKey = jedisManager.getValueByKey(RedisDB.SHORT_TIME_QUERY, username + ip);
|
||||
//秘钥用完即删
|
||||
jedisManager.deleteByKey(RedisDB.SHORT_TIME_QUERY, username + ip);
|
||||
//对SM2解密面进行验证
|
||||
password = PubUtils.getPasswordSM2Verify(privateKey, password);
|
||||
|
||||
if (password == null || password.length() == 0) {
|
||||
return PubUtils.assignmentResultLog(null, 500, "密码传输完整性被破坏", "密码传输遭破坏", "失败", result);
|
||||
}
|
||||
//在登录之前,判断当前session是否存在用户信息,存在便进行一次子系统登出(认证中心的session里的用户信息进行更新时,子系统便需要注销,重新认证)
|
||||
User ssoUser = TokenManager.getToken();
|
||||
if (null != ssoUser) {
|
||||
//注销当前会话中旧用户信息和权限资源
|
||||
logoutSystem(session.getId(), ssoUser.getUserIndex());
|
||||
}
|
||||
TokenManager.login(username, "", password, ip, ProjectEnum.SSO.getItem());
|
||||
TokenManager.getSession().setAttribute(KickoutSessionFilter.KICKOUT_STATUS, null);
|
||||
//保存登录记录
|
||||
userLoginService.insertLogin(username, ProjectEnum.SSO.getItem());
|
||||
onlineSession();
|
||||
result = PubUtils.assignmentResult(null, 200, "登录成功");
|
||||
userLogDetailService.saveUserLog(TokenManager.getToken().getUserIndex(), TokenManager.getToken().getLoginName(), "用户登录", "成功", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), 0);
|
||||
response.setStatus(203);
|
||||
String sessionId = TokenManager.getSession().getId().toString();
|
||||
TokenManager.getSession().setAttribute(CookieKeyEnum.SSOLOGIN.getCookieKey(), sessionId);
|
||||
//将认证后的session保存到cookie中
|
||||
saveTokenToCookie(request, response, sessionId);
|
||||
userUtil.saveRandomToken();
|
||||
} catch (Exception u) {
|
||||
logger.error("用户登录发生异常,异常为:" + u.toString());
|
||||
String exeString = u.getMessage();
|
||||
if (exeString.length() > 20) {
|
||||
exeString = "登录出错,联系管理员";
|
||||
}
|
||||
int level = 2;
|
||||
if (exeString.equalsIgnoreCase(UserStatusEnum.ERROR_ACCOUNT.getMessage())) {
|
||||
level = 1;
|
||||
}
|
||||
result = PubUtils.assignmentResult(null, 500, exeString);
|
||||
User user = new User();
|
||||
user.setLoginName(username);
|
||||
user = userMapper.selectOne(user);
|
||||
try {
|
||||
if (null == user) {
|
||||
userLogDetailService.saveUserLog(username, username, exeString, "失败", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), level);
|
||||
} else {
|
||||
userLogDetailService.saveUserLog(user.getUserIndex(), user.getLoginName(), exeString, "失败", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), level);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("用户异常登录日志入库出错," + e.toString());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 免登录入口
|
||||
* 默认指定为省级用户
|
||||
*/
|
||||
@RequestMapping(value = "visitor", method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public HttpResult visitor(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
|
||||
String username = "sczzdsf";
|
||||
String password = "@#001njcnpqs";
|
||||
HttpResult result;
|
||||
try {
|
||||
//在登录之前,判断当前session是否存在用户信息,存在便进行一次子系统登出(认证中心的session里的用户信息进行更新时,子系统便需要注销,重新认证)
|
||||
User ssoUser = TokenManager.getToken();
|
||||
if (null != ssoUser) {
|
||||
//注销当前会话中旧用户信息和权限资源
|
||||
logoutSystem(session.getId(), ssoUser.getUserIndex());
|
||||
}
|
||||
TokenManager.login(username, "", password, PubUtils.getIpAddr(request), ProjectEnum.SSO.getItem());
|
||||
TokenManager.getSession().setAttribute(KickoutSessionFilter.KICKOUT_STATUS, null);
|
||||
//保存登录记录
|
||||
userLoginService.insertLogin(username, ProjectEnum.SSO.getItem());
|
||||
onlineSession();
|
||||
result = PubUtils.assignmentResult(null, 200, "登录成功");
|
||||
userLogDetailService.saveUserLog(TokenManager.getToken().getUserIndex(), TokenManager.getToken().getLoginName(), "用户登录", "成功", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), 0);
|
||||
//调整为重定向 todo...
|
||||
response.setStatus(203);
|
||||
String sessionId = TokenManager.getSession().getId().toString();
|
||||
TokenManager.getSession().setAttribute( CookieKeyEnum.SSOLOGIN.getCookieKey(), sessionId);
|
||||
//将认证后的session保存到cookie中
|
||||
saveTokenToCookie(request, response, sessionId);
|
||||
userUtil.saveRandomToken();
|
||||
WebUtils.redirectToSavedRequest(request, response, "/user/judgeLogin");
|
||||
} catch (Exception u) {
|
||||
logger.error("用户登录发生异常,异常为:" + u.toString());
|
||||
String exeString = u.getMessage();
|
||||
if (exeString.length() > 20) {
|
||||
exeString = "登录出错,联系管理员";
|
||||
}
|
||||
int level = 2;
|
||||
if (exeString.equalsIgnoreCase(UserStatusEnum.ERROR_ACCOUNT.getMessage())) {
|
||||
level = 1;
|
||||
}
|
||||
result = PubUtils.assignmentResult(null, 500, exeString);
|
||||
User user = new User();
|
||||
user.setLoginName(username);
|
||||
user = userMapper.selectOne(user);
|
||||
try {
|
||||
if (null == user) {
|
||||
userLogDetailService.saveUserLog(username, username, exeString, "失败", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), level);
|
||||
} else {
|
||||
userLogDetailService.saveUserLog(user.getUserIndex(), user.getLoginName(), exeString, "失败", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), level);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("用户异常登录日志入库出错," + e.toString());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 校验验证码是否正确
|
||||
*/
|
||||
private boolean judgeCode(String checkcode, HttpSession session) {
|
||||
boolean codeRight = false;
|
||||
// 校验图形验证码
|
||||
if (StringUtils.isNotBlank(checkcode)) {
|
||||
Object imgCode = session.getAttribute("capText");
|
||||
if ((imgCode != null) && (imgCode.toString().equalsIgnoreCase(checkcode))) {
|
||||
codeRight = true;
|
||||
}
|
||||
}
|
||||
//不管成功与否清空验证码的值
|
||||
session.setAttribute("capText", null);
|
||||
return codeRight;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理密码_RSA
|
||||
*/
|
||||
private String dealPasswordRSA(String password, String username, String ip) {
|
||||
byte[] value = jedisManager.getValueByKey(RedisDB.SHORT_TIME_QUERY, SerializeUtil.serialize(username + ip));
|
||||
RSAPrivateKey privateKey = SerializeUtil.deserialize(value, RSAPrivateKey.class);
|
||||
//秘钥用完即删
|
||||
jedisManager.deleteByKey(RedisDB.SHORT_TIME_QUERY, SerializeUtil.serialize(username + ip));
|
||||
password = PubUtils.getPasswordRSAVerify(privateKey, password);
|
||||
return password;
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录前进行会话最大并发量判断
|
||||
*/
|
||||
private void judgeLoginSession(String username) {
|
||||
Collection<Session> allSessions = userShiroSessionRepository.getAllSessions();
|
||||
int count = 0;
|
||||
for (Session redisSession : allSessions) {
|
||||
if (null != redisSession) {
|
||||
//获取session登录信息。
|
||||
Object simplePrincipalCollectionObject = redisSession.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
|
||||
if (null != simplePrincipalCollectionObject) {
|
||||
SimplePrincipalCollection spc = (SimplePrincipalCollection) simplePrincipalCollectionObject;
|
||||
Object primaryPrincipalObject = spc.getPrimaryPrincipal();
|
||||
if (primaryPrincipalObject instanceof User) {
|
||||
User loginUser = (User) primaryPrincipalObject;
|
||||
//相同登录名,不计数,否则计数到阀值时,无法挤掉相同用户,在异地登录
|
||||
if (loginUser.getLoginName().equalsIgnoreCase(username)) {
|
||||
continue;
|
||||
}
|
||||
SessionStatus sessionStatus = (SessionStatus) redisSession.getAttribute(UserSessionManager.SESSION_STATUS);
|
||||
if (loginUser.getItem().equalsIgnoreCase("sso") & sessionStatus.isOnlineStatus()) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//计数完毕后,查询系统的并发上限
|
||||
SysSet sysSet = new SysSet();
|
||||
sysSet.setState(1);
|
||||
try {
|
||||
sysSet = sysSetMapper.selectOne(sysSet);
|
||||
if (null == sysSet) {
|
||||
throw new AccountException("没有找到系统配置信息");
|
||||
} else {
|
||||
if (sysSet.getLimitNumber() < count) {
|
||||
throw new AccountException("超过系统最大并发");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new AccountException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据当前会话ID、用户ID清理子系统的会话,以及各个系统的用户权限资源
|
||||
*/
|
||||
private void logoutSystem(String sessionId, String userIndex) {
|
||||
Session session = userShiroSessionRepository.getSession(sessionId);
|
||||
if (null == session) {
|
||||
return;
|
||||
}
|
||||
List<String> infoMap = (List<String>) session.getAttribute(sessionId + userIndex);
|
||||
if (!CollectionUtils.isEmpty(infoMap)) {
|
||||
//循环遍历删除redis中所有的session
|
||||
for (String id : infoMap) {
|
||||
userShiroSessionRepository.deleteSession(id);
|
||||
}
|
||||
}
|
||||
session.setAttribute(sessionId + userIndex, null);
|
||||
userShiroSessionRepository.activeSession(session);
|
||||
//同时需要清理所有系统下的角色以及资源信息
|
||||
springPubUtils.clearAllAuthor();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建保存sso会话索引的cookie,以便子系统来认证
|
||||
*
|
||||
* @param request
|
||||
* @param sessionID 会话索引
|
||||
*/
|
||||
private void saveTokenToCookie(HttpServletRequest request, HttpServletResponse response, String sessionID) {
|
||||
Cookie cookie = new Cookie("ssoToken", sessionID);
|
||||
cookie.setMaxAge(-1);
|
||||
cookie.setPath(request.getContextPath());
|
||||
response.addCookie(cookie);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 携带项目标识重定向到sso登录页面
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
private void redirectLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||
//将sso的token置为空,登录成功后会重新赋值
|
||||
saveTokenToCookie(request, response, "");
|
||||
//重定向到登录页面
|
||||
WebUtils.issueRedirect(request, response, "/");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 认证中心进行登出处理
|
||||
*/
|
||||
@PostMapping("logOut")
|
||||
@ResponseBody
|
||||
public HttpResult logOut(HttpServletRequest request) {
|
||||
String tokenValue = PubUtils.getSSOToken(request);
|
||||
if (StringUtils.isNotBlank(tokenValue)) {
|
||||
logoutSession(tokenValue, request);
|
||||
}
|
||||
return PubUtils.assignmentResult(null, 200, "用户已经登出");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 子系统注销用户时,在此处统一进行注销
|
||||
*/
|
||||
@GetMapping("loginout")
|
||||
public void loginout(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||
String tokenValue = PubUtils.getSSOToken(request);
|
||||
if (StringUtils.isNotBlank(tokenValue)) {
|
||||
logoutSession(tokenValue, request);
|
||||
}
|
||||
redirectLogin(request, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据会话进行注销操作
|
||||
*
|
||||
* @param tokenValue
|
||||
* @param request
|
||||
*/
|
||||
private void logoutSession(String tokenValue, HttpServletRequest request) {
|
||||
//根据tokenValue清除所有子系统的session
|
||||
Session session = userShiroSessionRepository.getSession(tokenValue);
|
||||
//根据会话进行注销操作
|
||||
if (null != session) {
|
||||
//根据session,将当前session置为失效
|
||||
invalidSession();
|
||||
Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
|
||||
if (null != obj) {
|
||||
SimplePrincipalCollection spc = (SimplePrincipalCollection) obj;
|
||||
obj = spc.getPrimaryPrincipal();
|
||||
if (null != obj) {
|
||||
User ssoUser = (User) obj;
|
||||
try {
|
||||
userLogDetailService.saveUserLog(ssoUser.getUserIndex(), ssoUser.getLoginName(), "用户退出", "成功", appConfig.getSystemFlag(), PubUtils.getIpAddr(request), LogTypeEnum.SYSTEM.toString(), 0);
|
||||
} catch (javax.security.auth.login.AccountException e) {
|
||||
logger.error("保存用户操作日志记录异常,操作为:用户退出,结果:失败,异常为:" + e.toString());
|
||||
}
|
||||
logoutSystem(tokenValue, ssoUser.getUserIndex());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将会话置为失效
|
||||
*/
|
||||
private void invalidSession( ) {
|
||||
Session session = userShiroSessionRepository.getSession(SecurityUtils.getSubject().getSession().getId());
|
||||
SessionStatus sessionStatus = new SessionStatus();
|
||||
sessionStatus.setOnlineStatus(false);
|
||||
session.setAttribute(UserSessionManager.SESSION_STATUS, sessionStatus);
|
||||
userShiroSessionRepository.saveSession(session);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将会话置为在线
|
||||
*/
|
||||
private void onlineSession() {
|
||||
Session session = userShiroSessionRepository.getSession(SecurityUtils.getSubject().getSession().getId());
|
||||
SessionStatus sessionStatus = new SessionStatus();
|
||||
sessionStatus.setOnlineStatus(true);
|
||||
session.setAttribute(UserSessionManager.SESSION_STATUS, sessionStatus);
|
||||
userShiroSessionRepository.saveSession(session);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
114
sso/src/main/java/com/sso/utils/ComplexNoise.java
Normal file
@@ -0,0 +1,114 @@
|
||||
package com.sso.utils;
|
||||
|
||||
import com.google.code.kaptcha.NoiseProducer;
|
||||
import com.google.code.kaptcha.util.Configurable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.geom.CubicCurve2D;
|
||||
import java.awt.geom.PathIterator;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* @author hongawen
|
||||
* @Date: 2019/5/14 10:08
|
||||
*/
|
||||
public class ComplexNoise extends Configurable implements NoiseProducer {
|
||||
private static final Logger logger = LoggerFactory.getLogger(ComplexNoise.class);
|
||||
@Override
|
||||
public void makeNoise(BufferedImage image, float factorOne, float factorTwo, float factorThree, float factorFour) {
|
||||
Color color = getConfig().getNoiseColor();
|
||||
// image size
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
// the points where the line changes the stroke and direction
|
||||
Point2D[] pts = null;
|
||||
Point2D[] pts1 = null;
|
||||
SecureRandom rand= null;
|
||||
try {
|
||||
rand = SecureRandom.getInstance("SHA1PRNG");
|
||||
CubicCurve2D cc = new CubicCurve2D.Float(width * factorOne, height
|
||||
* rand.nextFloat(), width * factorTwo, height
|
||||
* rand.nextFloat(), width * factorThree, height
|
||||
* rand.nextFloat(), width * factorFour, height
|
||||
* rand.nextFloat());
|
||||
CubicCurve2D cc1 = new CubicCurve2D.Float(width * factorOne, height
|
||||
* rand.nextFloat(), width * factorTwo, height
|
||||
* rand.nextFloat(), width * factorThree, height
|
||||
* rand.nextFloat(), width * factorFour, height
|
||||
* rand.nextFloat());
|
||||
// creates an iterator to define the boundary of the flattened curve
|
||||
PathIterator pi = cc.getPathIterator(null, 2);
|
||||
PathIterator pi1 = cc1.getPathIterator(null, 2);
|
||||
Point2D tmp[] = new Point2D[200];
|
||||
Point2D tmp1[] = new Point2D[200];
|
||||
int i = 0;
|
||||
// while pi is iterating the curve, adds points to tmp array
|
||||
while (!pi.isDone())
|
||||
{
|
||||
float[] coords = new float[6];
|
||||
switch (pi.currentSegment(coords))
|
||||
{
|
||||
case PathIterator.SEG_MOVETO:
|
||||
case PathIterator.SEG_LINETO:
|
||||
tmp[i] = new Point2D.Float(coords[0], coords[1]);
|
||||
}
|
||||
pi.next();
|
||||
i++;
|
||||
}
|
||||
|
||||
int j=0;
|
||||
while (!pi1.isDone())
|
||||
{
|
||||
float[] coords1 = new float[6];
|
||||
switch (pi1.currentSegment(coords1))
|
||||
{
|
||||
case PathIterator.SEG_MOVETO:
|
||||
case PathIterator.SEG_LINETO:
|
||||
tmp1[j] = new Point2D.Float(coords1[0], coords1[1]);
|
||||
}
|
||||
pi1.next();
|
||||
j++;
|
||||
}
|
||||
|
||||
pts = new Point2D[i];
|
||||
pts1 = new Point2D[j];
|
||||
System.arraycopy(tmp, 0, pts, 0, i);
|
||||
System.arraycopy(tmp1, 0, pts1, 0, j);
|
||||
|
||||
Graphics2D graph = (Graphics2D) image.getGraphics();
|
||||
graph.setRenderingHints(new RenderingHints(
|
||||
RenderingHints.KEY_ANTIALIASING,
|
||||
RenderingHints.VALUE_ANTIALIAS_ON));
|
||||
|
||||
graph.setColor(color);
|
||||
|
||||
// for the maximum 3 point change the stroke and direction
|
||||
for (i = 0; i < pts.length - 1; i++)
|
||||
{
|
||||
if (i < 3)
|
||||
graph.setStroke(new BasicStroke(0.9f * (4 - i)));
|
||||
graph.drawLine((int) pts[i].getX(), (int) pts[i].getY(),
|
||||
(int) pts[i + 1].getX(), (int) pts[i + 1].getY());
|
||||
}
|
||||
|
||||
for (i = 0; i < pts1.length - 1; i++)
|
||||
{
|
||||
if (i < 3)
|
||||
graph.setStroke(new BasicStroke(0.9f * (4 - i)));
|
||||
graph.drawLine((int) pts1[i].getX(), (int) pts1[i].getY(),
|
||||
(int) pts1[i + 1].getX(), (int) pts1[i + 1].getY());
|
||||
}
|
||||
graph.dispose();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
logger.error("操作发生异常,异常是"+e.getMessage());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
67
sso/src/main/resources/java.properties
Normal file
@@ -0,0 +1,67 @@
|
||||
################################通用且因环境变化而变化
|
||||
#波形文路径(本地配置)
|
||||
WAVE_PATH=C:/Comtrade
|
||||
#服务器临时文件路径(用于存储离线、报告存储)
|
||||
TMP_PATH=C:/
|
||||
#webSocket
|
||||
WEBSOCKET=ws://127.0.0.1:8080/sso/websocket/
|
||||
#socket端口配置
|
||||
SOCKETPORT=60000
|
||||
#Kafka
|
||||
ZOOKEEPER=192.168.1.200:2181
|
||||
GROUPID=test-consumer-group
|
||||
TOPIC=eventdata
|
||||
KAFKA_LOG=true
|
||||
#报表生成路径
|
||||
REPORT_PATH=http://www.pqmcc.com:8040/shiningCloud/appfiles/
|
||||
#服务器白名单
|
||||
SYSTEM_HOST=192.168.1.211
|
||||
#是否输出业务日志
|
||||
BUSINESS_LOG_FLAG=false
|
||||
#监测点数量级
|
||||
PID_Number=10000
|
||||
#9300谐波越限天数
|
||||
overRunDay=10
|
||||
#报表查询条件设定(单位:天)
|
||||
REPORT_DAY=1
|
||||
#是否发送邮件
|
||||
MAIL_FLAG=false
|
||||
#邮件服务器连接地址
|
||||
MAIL_HOST=smtp.qq.com
|
||||
#发送方邮箱
|
||||
MAIL_ADDRESS=83944980@qq.com
|
||||
#SMTP授权码
|
||||
SMTP_NUM=uwhilozcumpucafd
|
||||
#海南短信验证
|
||||
MSG_USER=1C6CC426DFE8D7C2BC42C7C19F101D80
|
||||
MSG_PASSWORD=8836E651F09195FA3EE892A1B700DC65
|
||||
#加密方式 0、base64 1 、3des
|
||||
CDKEY_ENCY=1
|
||||
|
||||
|
||||
################################独立配置且不随环境变化
|
||||
#当前系统标志
|
||||
SYSTEM_FLAG=SSO
|
||||
#当前系统的GUID
|
||||
SYS_TYPE=3bba2471-7384-41de-800b-aed41c845b7b
|
||||
SYS_TYPE_ZT=1cfcd6e2-c5fe-4b15-988a-32b90f1170c1
|
||||
SYS_TYPE_WT=983f9dfe-4f9a-4c96-89d8-7d425a1f1d6c
|
||||
#sso认证中心url
|
||||
SSO_URL=http://127.0.0.1:7878/sso/user/
|
||||
#如果相同容器的话,直接根据request获取url配置路径,否则自定义配置url
|
||||
ONE_CONTAINER=true
|
||||
SSO_JUDGE=http://127.0.0.1:7878/sso/user/judgeLogin?item=pqs9000
|
||||
#sso认证中心,完毕后前往子系统进行二次认证
|
||||
#如果相同容器的话,直接根据request获取url配置路径,否则自定义配置url
|
||||
pqs9200.regist.url=http://127.0.0.1:8080/pqs9200/user/ssoRegister?token=
|
||||
pqs9000.regist.url=http://127.0.0.1:8088/pqs9000/user/ssoRegister?token=
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
63
sso/src/main/resources/jdbc.properties
Normal file
@@ -0,0 +1,63 @@
|
||||
#oracle.jdbcUrl=jdbc:log4jdbc:oracle:thin:@192.168.5.166:1521:cjldata
|
||||
oracle.driverClass=oracle.jdbc.driver.OracleDriver
|
||||
#pqsadmin
|
||||
#oracle.jdbcUrl=jdbc\:oracle\:thin\:@192.168.1.101\:1521\:pqsbase
|
||||
#oracle.user=8836E651F09195FA3EE892A1B700DC65
|
||||
#oracle.password=110ADDC7B3686BE36E80EB3BC5BD63E8
|
||||
#hainan
|
||||
#oracle.jdbcUrl=jdbc\:oracle\:thin\:@192.168.1.51\:1521\:pqsbase
|
||||
#oracle.user=8836E651F09195FA6312AD217B40D520
|
||||
#oracle.password=8836E651F09195FA3EE892A1B700DC65
|
||||
#jibei
|
||||
#oracle.jdbcUrl=jdbc\:oracle\:thin\:@192.168.1.51\:1521\:pqsbase
|
||||
#oracle.user=8836E651F09195FA36F59F764BEC048E
|
||||
#oracle.password=8836E651F09195FA3EE892A1B700DC65
|
||||
#本地 jibei
|
||||
oracle.jdbcUrl=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:ORCL
|
||||
oracle.user=8836E651F09195FA36F59F764BEC048E
|
||||
oracle.password=8836E651F09195FA3EE892A1B700DC65
|
||||
|
||||
# 池初始化大小
|
||||
oracle.initialSize=1
|
||||
# 池最小连接数
|
||||
oracle.minIdle=1
|
||||
# 池最大连接数
|
||||
oracle.maxActive=50
|
||||
# 获取连接等待超时的时间
|
||||
oracle.maxWait=60000
|
||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||
oracle.timeBetweenEvictionRunsMillis=60000
|
||||
# 一个连接在池中最小生存的时间,单位是毫秒
|
||||
oracle.minEvictableIdleTimeMillis=300000
|
||||
# 是否打开PSCache
|
||||
oracle.poolPreparedStatements=false
|
||||
# 指定每个连接上PSCache的大小
|
||||
oracle.maxPoolPreparedStatementPerConnectionSize=20
|
||||
#mariadb
|
||||
mariadb.driverClass=org.mariadb.jdbc.Driver
|
||||
#db.jdbcUrl=jdbc\:oracle\:thin\:@192.168.1.254\:1521\:orcl
|
||||
mariadb.jdbcUrl=jdbc:mariadb://192.168.1.108:3306/pq?useUnicode=true&characterEncoding=utf-8&useSSL=false
|
||||
#db.user=eventdata
|
||||
mariadb.user=42BAAEC9A8582476
|
||||
#db.user=AE17109A75AE812EF5A59A916627E318
|
||||
mariadb.password=ED94C2C049B041FD
|
||||
#user=eventdata1
|
||||
#password=eventdata
|
||||
# 池初始化大小
|
||||
mariadb.initialSize=1
|
||||
# 池最小连接数
|
||||
mariadb.minIdle=1
|
||||
# 池最大连接数
|
||||
mariadb.maxActive=50
|
||||
# 获取连接等待超时的时间
|
||||
mariadb.maxWait=60000
|
||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||
mariadb.timeBetweenEvictionRunsMillis=60000
|
||||
# 一个连接在池中最小生存的时间,单位是毫秒
|
||||
mariadb.minEvictableIdleTimeMillis=300000
|
||||
# 是否打开PSCache
|
||||
mariadb.poolPreparedStatements=false
|
||||
# 指定每个连接上PSCache的大小
|
||||
mariadb.maxPoolPreparedStatementPerConnectionSize=20
|
||||
dataSource=Oracle
|
||||
|
||||
51
sso/src/main/resources/log4j.xml
Normal file
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
|
||||
<log4j:configuration debug="true">
|
||||
|
||||
|
||||
<!-- 在控制台输出的日志文件,info级别以上 -->
|
||||
<appender name="Console" class="org.apache.log4j.ConsoleAppender">
|
||||
<param name="Encoding" value="UTF-8" />
|
||||
<param name="Threshold" value="ERROR" />
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%d %p %c %t %m%n" />
|
||||
</layout>
|
||||
</appender>
|
||||
<!--输出文件中,该文件中只能输出info级别的日志 -->
|
||||
<appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">
|
||||
<param name="Encoding" value="UTF-8" />
|
||||
<param name="File" value="c:/logs/sso/info/info.log" />
|
||||
<!--<param name="File" value="/usr/local/logs/sso/info/info.log" />-->
|
||||
<param name="DatePattern" value=".yyyy-MM-dd" />
|
||||
<param name="Append" value="true" />
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%d %p %c %t %m%n" />
|
||||
</layout>
|
||||
<filter class="org.apache.log4j.varia.LevelRangeFilter">
|
||||
<param name="LevelMin" value="INFO" />
|
||||
<param name="LevelMax" value="INFO" />
|
||||
</filter>
|
||||
</appender>
|
||||
<!--输出文件中,该文件中只能输出erro级别的日志 -->
|
||||
<appender name="ERROR" class="org.apache.log4j.DailyRollingFileAppender">
|
||||
<param name="Encoding" value="UTF-8" />
|
||||
<param name="File" value="c:/logs/sso/error/error.log" />
|
||||
<!--<param name="File" value="/usr/local/logs/sso/error/error.log" />-->
|
||||
<param name="DatePattern" value=".yyyy-MM-dd" />
|
||||
<param name="Append" value="true" />
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%d %p %c %t %m%n" />
|
||||
</layout>
|
||||
<filter class="org.apache.log4j.varia.LevelRangeFilter">
|
||||
<param name="LevelMin" value="ERROR" />
|
||||
<param name="LevelMax" value="ERROR" />
|
||||
</filter>
|
||||
</appender>
|
||||
<root>
|
||||
<priority value="INFO" />
|
||||
<appender-ref ref="INFO" />
|
||||
<appender-ref ref="ERROR" />
|
||||
<appender-ref ref="Console" />
|
||||
</root>
|
||||
|
||||
</log4j:configuration>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.njcn.mapper.configuration.DicDataMapper">
|
||||
<!-- 查询排序最大 -->
|
||||
<select id="selNumMax" resultType="int">
|
||||
select max(dic_number) from pqs_dicdata where state=1 order by dic_number desc
|
||||
</select>
|
||||
|
||||
<!-- 更新字典表根据主键-->
|
||||
<update id="updateByPrimaryKeyBySql">
|
||||
UPDATE PQS_DICDATA
|
||||
SET DIC_LEAVE = #{dicLeave}
|
||||
WHERE
|
||||
DIC_INDEX = #{dicIndex}
|
||||
</update>
|
||||
</mapper>
|
||||
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.njcn.mapper.log.UserLogDetailMapper">
|
||||
|
||||
<!-- 日志 -->
|
||||
<resultMap type="com.njcn.pojo.log.UserLogDetail" id="UserLogDetailMapperMap" autoMapping="true">
|
||||
|
||||
</resultMap>
|
||||
<!-- 查询所有日志 -->
|
||||
<select id="getUserLog" resultMap="UserLogDetailMapperMap">
|
||||
select t.dictype_name as type,
|
||||
a.dic_name as name,
|
||||
u.USERLOG_DESCRIBE as describe,
|
||||
u.updatetime as updatetime,
|
||||
u.ip as ip,
|
||||
decode(a.DIC_LEAVE, 0, '普通', 1, '中等',2,'严重') as leval
|
||||
from pqs_userlog u ,
|
||||
pqs_dicdata a ,
|
||||
pqs_dictype t
|
||||
where u.type=a.dic_index
|
||||
and a.dic_type=t.dictype_index
|
||||
order by u.updatetime desc
|
||||
</select>
|
||||
<!-- 根据条件查询所有日志 -->
|
||||
<select id="getUserLogId" resultMap="UserLogDetailMapperMap">
|
||||
select t.dictype_name as type,
|
||||
a.dic_name as name,
|
||||
u.USERLOG_DESCRIBE as describe,
|
||||
u.updatetime as updatetime,
|
||||
u.ip as ip,
|
||||
decode(a.DIC_LEAVE, 0, '普通', 1, '中等',2,'严重') as leval
|
||||
from pqs_userlog u ,
|
||||
pqs_dicdata a ,
|
||||
pqs_dictype t
|
||||
where u.type=a.dic_index
|
||||
and a.dic_type=t.dictype_index
|
||||
and t.dictype_index like #{type}
|
||||
and a.dic_index like #{name}
|
||||
and to_number(to_char(u.updatetime, 'yyyyMMddHHmiss')) between #{startTime}
|
||||
and #{endTime}
|
||||
order by u.updatetime desc
|
||||
</select>
|
||||
<!-- 统计事件类型 -->
|
||||
<select id="geteventtype" resultMap="UserLogDetailMapperMap">
|
||||
select t.dictype_name as type,
|
||||
count(1) as num
|
||||
from pqs_userlog u ,
|
||||
pqs_dicdata a ,
|
||||
pqs_dictype t
|
||||
where u.type=a.dic_index
|
||||
and a.dic_type=t.dictype_index
|
||||
and to_number(to_char(u.updatetime, 'yyyyMMddHHmmss')) between #{startTime}
|
||||
and #{endTime}
|
||||
group by t.dictype_name
|
||||
</select>
|
||||
<!-- 统计详细事件 -->
|
||||
<select id="getdetailtype" resultMap="UserLogDetailMapperMap">
|
||||
select a.dic_name as name,
|
||||
count(1) as num
|
||||
from pqs_userlog u ,
|
||||
pqs_dicdata a ,
|
||||
pqs_dictype t
|
||||
where u.type=a.dic_index
|
||||
and a.dic_type=t.dictype_index
|
||||
and to_number(to_char(u.updatetime, 'yyyyMMddHHmmss')) between #{startTime}
|
||||
and #{endTime}
|
||||
group by a.dic_name
|
||||
</select>
|
||||
<!-- 统计用户统计 -->
|
||||
<select id="getUserStatistics" resultMap="UserLogDetailMapperMap">
|
||||
select b.loginname name,
|
||||
count(1) num
|
||||
from pqs_userlog a,
|
||||
pqs_user b
|
||||
where A.USERLOG_DESCRIBE like '%'||b.loginname||'%'
|
||||
and a.user_index=b.user_index
|
||||
and to_number(to_char(a.updatetime, 'yyyyMMddHHmmss')) between #{startTime}
|
||||
and #{endTime}
|
||||
group by b.loginname
|
||||
</select>
|
||||
|
||||
<delete id="delExpireLog" databaseId="Oracle">
|
||||
delete from pqs_userlog
|
||||
where rowid = (select rowid
|
||||
from (select UPDATETIME from pqs_userlog where UPDATETIME < #{endTime} order by UPDATETIME)
|
||||
where rownum = 1)
|
||||
</delete>
|
||||
|
||||
<delete id="delExpireLog" databaseId="MariaDB">
|
||||
delete from pqs_userlog
|
||||
where UPDATETIME = (select UPDATETIME from pqs_userlog where UPDATETIME < #{endTime} order by UPDATETIME LIMIT 1 )
|
||||
</delete>
|
||||
</mapper>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.njcn.mapper.log.UserLoginMapper">
|
||||
|
||||
<!-- 日志 -->
|
||||
<resultMap type="com.njcn.pojo.log.UserLogin" id="UserLoginMapperMap" autoMapping="true">
|
||||
|
||||
</resultMap>
|
||||
<!-- 查询所有登录信息 -->
|
||||
<select id="getUserLogin" resultMap="UserLoginMapperMap">
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
pqs_userlogin ul,
|
||||
pqs_user U
|
||||
WHERE
|
||||
ul.user_index = U .user_index
|
||||
AND TO_NUMBER (
|
||||
TO_CHAR (
|
||||
ul.loginTime,
|
||||
'yyyyMMddHHmiss'
|
||||
)
|
||||
) BETWEEN # { startTime }
|
||||
AND # { endTime }
|
||||
ORDER BY
|
||||
ul.loginTime DESC
|
||||
</select>
|
||||
<select id="getLastedLogin" resultType="userLogin" databaseId="MariaDB">
|
||||
SELECT * FROM (SELECT * FROM PQS_USERLOGIN WHERE USER_INDEX=#{userIndex} ORDER BY LOGINTIME DESC) a limit 1
|
||||
</select>
|
||||
|
||||
<select id="getLastedLogin" resultType="userLogin" databaseId="Oracle">
|
||||
SELECT * FROM (SELECT * FROM PQS_USERLOGIN WHERE USER_INDEX=#{userIndex} ORDER BY LOGINTIME DESC) where ROWNUM = 1
|
||||
</select>
|
||||
</mapper>
|
||||
35
sso/src/main/resources/mybatis/mappers/user/UserMapper.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.njcn.mapper.user.UserMapper">
|
||||
|
||||
<update id="updateLockState">
|
||||
update pqs_user set state = #{state},login_error_times = 0 where user_index = #{userIndex}
|
||||
</update>
|
||||
|
||||
<update id="updateByPrimaryKeyBySql" parameterType="user">
|
||||
update pqs_user
|
||||
<set>
|
||||
<if test="userIndex != null">user_Index=#{userIndex},</if>
|
||||
<if test="name != null">name=#{name},</if>
|
||||
<if test="loginName != null">loginName=#{loginName},</if>
|
||||
<if test="password != null">password=#{password},</if>
|
||||
<if test="phone != null">phone=#{phone},</if>
|
||||
<if test="email != null">email=#{email},</if>
|
||||
<if test="registerTime != null">registerTime=#{registerTime},</if>
|
||||
<if test="psdvalidity != null">psdvalidity=#{psdvalidity},</if>
|
||||
<if test="loginTime != null">loginTime=#{loginTime},</if>
|
||||
<if test="state != null">state=#{state},</if>
|
||||
<if test="mark != null">mark=#{mark},</if>
|
||||
<if test="limitIpStart != null">limit_IpStart=#{limitIpStart},</if>
|
||||
<if test="limitIpEnd != null">limit_IpEnd=#{limitIpEnd},</if>
|
||||
<if test="limitTime != null">limit_Time=#{limitTime},</if>
|
||||
<if test="loginErrorTimes != null">LOGIN_ERROR_TIMES=#{loginErrorTimes},</if>
|
||||
<if test="casualUser != null">casual_User=#{casualUser},</if>
|
||||
<if test="firstErrorTime != null">firstError_Time=#{firstErrorTime},</if>
|
||||
<if test="lockTime != null">lock_Time=#{lockTime}</if>
|
||||
</set>
|
||||
where user_Index=#{userIndex}
|
||||
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
28
sso/src/main/resources/mybatis/mybatis-config.xml
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE configuration
|
||||
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-config.dtd">
|
||||
<configuration>
|
||||
|
||||
<settings>
|
||||
<!-- 开启驼峰自动映射 -->
|
||||
<setting name="mapUnderscoreToCamelCase" value="true" />
|
||||
<!--输出mybatis执行的SQL日志-->
|
||||
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
|
||||
<!--懒加载配置-->
|
||||
<setting name="lazyLoadingEnabled" value="true"/>
|
||||
<setting name="aggressiveLazyLoading" value="false"/>
|
||||
<setting name="mapUnderscoreToCamelCase" value="true"/>
|
||||
|
||||
</settings>
|
||||
<!--使用mybatis的分页插件-->
|
||||
<!-- <plugins> -->
|
||||
<!-- <plugin interceptor="com.github.pagehelper.PageHelper"> -->
|
||||
<!-- <property name="dialect" value="mysql"/> -->
|
||||
<!-- 该参数默认为false -->
|
||||
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
|
||||
<!-- <property name="rowBoundsWithCount" value="true"/> -->
|
||||
<!-- </plugin> -->
|
||||
<!-- </plugins> -->
|
||||
|
||||
</configuration>
|
||||
40
sso/src/main/resources/spring/applicationContext-mybatis.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
|
||||
|
||||
<!-- 定义Mybatis的SqlSessionFactory -->
|
||||
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
|
||||
<!-- 定义数据源 -->
|
||||
<property name="dataSource" ref="${dataSource}"/>
|
||||
<property name="databaseIdProvider" ref="databaseIdProvider"/>
|
||||
<!-- 指定mybatis全局配置文件 -->
|
||||
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
|
||||
<!-- 扫描mappers目录以及子目录下的所有xml文件 -->
|
||||
<property name="mapperLocations" value="classpath:mybatis/mappers/**/*.xml"/>
|
||||
<!-- 别名扫描包 -->
|
||||
<property name="typeAliasesPackage" value="com.njcn.pojo com.njcn.sso.pojo"/>
|
||||
</bean>
|
||||
|
||||
<bean id="transactionManagerManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
|
||||
<property name="dataSource" ref="${dataSource}"/>
|
||||
</bean>
|
||||
|
||||
<!-- 定义Mapper接口扫描器 -->
|
||||
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
|
||||
<property name="basePackage" value="com.njcn.mapper com.sso.mapper"/>
|
||||
</bean>
|
||||
|
||||
<!--配置通用mapper -->
|
||||
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
|
||||
<property name="basePackage" value="com.njcn.mapper com.sso.mapper"/>
|
||||
<property name="properties">
|
||||
<value>
|
||||
mappers=tk.mybatis.mapper.common.Mapper
|
||||
<!-- 仅对insert有效 -->
|
||||
ORDER=BEFORE
|
||||
</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
23
sso/src/main/resources/spring/applicationContext-redis.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
|
||||
default-lazy-init="true">
|
||||
|
||||
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
|
||||
<property name="maxIdle" value="30"/><!-- 最大闲置 -->
|
||||
<property name="minIdle" value="10"/><!-- 最小闲置 -->
|
||||
<property name="testOnBorrow" value="true"/><!-- 可以获取 -->
|
||||
<!--<property name="testOnReturn" value="true"/>-->
|
||||
</bean>
|
||||
<!-- redis 配置,也可以把配置挪到properties配置文件中,再读取 -->
|
||||
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
|
||||
<constructor-arg index="0" ref="jedisPoolConfig" />
|
||||
<!-- 端口,默认6379 -->
|
||||
<constructor-arg index="2" value="6379" name="port" type="int" />
|
||||
<constructor-arg index="3" value="5000" name="timeout" type="int" />
|
||||
<constructor-arg index="1" value="127.0.0.1" name="host" type="java.lang.String" />
|
||||
<!--<constructor-arg index="4" value="yourpassword" name="password" type="java.lang.String" />-->
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
191
sso/src/main/resources/spring/applicationContext-shiro.xml
Normal file
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
|
||||
|
||||
<description>== Shiro Components ==</description>
|
||||
|
||||
<!-- 会话Session ID生成器 -->
|
||||
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
|
||||
|
||||
<!-- 会话Cookie模板 -->
|
||||
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
|
||||
<constructor-arg value="sso"/>
|
||||
<property name="httpOnly" value="true"/>
|
||||
<!--cookie的有效时间 -->
|
||||
<property name="maxAge" value="-1"/>
|
||||
<property name="name" value="ssoCookie" />
|
||||
</bean>
|
||||
|
||||
<!-- user shiro session listener -->
|
||||
<bean id="userSessionListener" class="com.njcn.shiro.listener.UserSessionListener">
|
||||
<property name="userShiroSessionRepository" ref="jedisShiroSessionRepository"/>
|
||||
</bean>
|
||||
|
||||
<!-- user shiro session dao -->
|
||||
<bean id="userShiroSessionDAO" class="com.njcn.shiro.session.UserShiroSessionDao">
|
||||
<property name="userShiroSessionRepository" ref="jedisShiroSessionRepository"/>
|
||||
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
|
||||
</bean>
|
||||
|
||||
<!-- 手动操作Session,管理Session -->
|
||||
<bean id="userSessionManager" class="com.njcn.shiro.session.UserSessionManager">
|
||||
<property name="userShiroSessionRepository" ref="jedisShiroSessionRepository"/>
|
||||
</bean>
|
||||
|
||||
<!-- Session Manager -->
|
||||
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
|
||||
<!-- 相隔多久检查一次session的有效性 -->
|
||||
<property name="sessionValidationInterval" value="-1"/>
|
||||
<!-- session 有效时间为半小时 (毫秒单位)-->
|
||||
<property name="globalSessionTimeout" value="-1"/>
|
||||
<property name="sessionDAO" ref="userShiroSessionDAO"/>
|
||||
<!-- session 监听,可以多个。 -->
|
||||
<property name="sessionListeners">
|
||||
<list>
|
||||
<ref bean="userSessionListener"/>
|
||||
</list>
|
||||
</property>
|
||||
<!-- 间隔多少时间检查,不配置是60分钟 -->
|
||||
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
|
||||
<!-- 会话Cookie模板 -->
|
||||
<property name="sessionIdCookie" ref="sessionIdCookie"/>
|
||||
</bean>
|
||||
|
||||
<!-- 会话验证调度器 -->
|
||||
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
|
||||
<property name="sessionManager" ref="sessionManager"/>
|
||||
</bean>
|
||||
|
||||
<!-- shiro 缓存实现,对ShiroCacheManager,我是采用redis的实现 -->
|
||||
<bean id="jedisShiroCacheManager" class="com.njcn.shiro.cache.impl.JedisShiroCacheManager">
|
||||
<property name="jedisManager" ref="jedisManager"/>
|
||||
</bean>
|
||||
|
||||
<!-- 用户缓存 -->
|
||||
<bean id="userShiroCacheManager" class="com.njcn.shiro.cache.impl.UserShiroCacheManager">
|
||||
<property name="shiroCacheManager" ref="jedisShiroCacheManager"/>
|
||||
</bean>
|
||||
|
||||
<!-- 安全管理器 -->
|
||||
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
|
||||
<property name="realm" ref="dataRealm"/>
|
||||
<property name="sessionManager" ref="sessionManager"/>
|
||||
<property name="cacheManager" ref="userShiroCacheManager"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="jedisManager" class="com.njcn.utils.redis.JedisManager" />
|
||||
|
||||
|
||||
<!-- session 创建、删除、查询 -->
|
||||
<bean id="jedisShiroSessionRepository" class="com.njcn.shiro.session.impl.JedisShiroSessionRepository" >
|
||||
<property name="jedisManager" ref="jedisManager"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<!-- 静态注入,相当于调用SecurityUtils.setSecurityManager(securityManager) -->
|
||||
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
|
||||
<property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
|
||||
<property name="arguments" ref="securityManager"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<!-- 静态注入 jedisShiroSessionRepository-->
|
||||
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
|
||||
<property name="staticMethod" value="com.njcn.shiro.filter.KickoutSessionFilter.setUserShiroSessionRepository"/>
|
||||
<property name="arguments" ref="jedisShiroSessionRepository"/>
|
||||
</bean>
|
||||
|
||||
<!-- 静态注入 jedisShiroSessionRepository-->
|
||||
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
|
||||
<property name="staticMethod" value="com.njcn.shiro.filter.LoginFilter.setUserShiroSessionRepository"/>
|
||||
<property name="arguments" ref="jedisShiroSessionRepository"/>
|
||||
</bean>
|
||||
|
||||
|
||||
<bean id="dataRealm" class="com.njcn.shiro.realm.DataRealm" />
|
||||
|
||||
<!--
|
||||
自定义角色过滤器 支持多个角色可以访问同一个资源 eg:/home.jsp = authc,roleOR[admin,user]
|
||||
用户有admin或者user角色 就可以访问
|
||||
-->
|
||||
|
||||
<!-- 认证数据库存储-->
|
||||
<bean id="login" class="com.njcn.shiro.filter.LoginFilter"/>
|
||||
<bean id="role" class="com.njcn.shiro.filter.RoleFilter"/>
|
||||
<bean id="permission" class="com.njcn.shiro.filter.PermissionFilter"/>
|
||||
<bean id="simple" class="com.njcn.shiro.filter.SimpleAuthFilter"/>
|
||||
|
||||
<!-- session 校验单个用户是否多次登录 -->
|
||||
<bean id="kickoutSessionFilter" class="com.njcn.shiro.filter.KickoutSessionFilter" />
|
||||
|
||||
<!-- shiro filter配置 -->
|
||||
<bean id="shiroSecurityFilter" class="com.njcn.shiro.response.NjcnShiroFilterFactoryBean">
|
||||
<!-- shiro 的核心安全接口 -->
|
||||
<property name="securityManager" ref="securityManager" />
|
||||
<!-- 要求登录时的链接 -->
|
||||
<property name="loginUrl" value="/" />
|
||||
<!-- 登陆成功后要跳转的连接 -->
|
||||
<property name="successUrl" value="/main" />
|
||||
<!-- 未授权时要跳转的连接 -->
|
||||
<property name="unauthorizedUrl" value="/views/auth/unauthorized" />
|
||||
<!-- shiro 连接约束配置 -->
|
||||
<!-- url级别权限权限控制 -->
|
||||
<property name="filterChainDefinitions">
|
||||
<value>
|
||||
<!--不需要权限所有用户能直接获取的资源-->
|
||||
/css/**=anon
|
||||
/js/**=anon
|
||||
/images/**=anon
|
||||
/json/**=anon
|
||||
/font/**=anon
|
||||
/jspJS/**=anon
|
||||
/jspCSS/**=anon
|
||||
/tiles/**=anon
|
||||
/theme/**=anon
|
||||
/user/getImgCode=anon
|
||||
/user/login=anon
|
||||
/user/generateRSAKey=anon
|
||||
/user/generateSM2Key=anon
|
||||
/user/loginout=anon
|
||||
/druid/**=anon
|
||||
/druid=anon
|
||||
/auth/**=anon
|
||||
/njcn/**=anon
|
||||
/user/judgeLogin=anon
|
||||
/=anon
|
||||
/login=anon
|
||||
/user/modifyPwd=anon
|
||||
/user/visitor=anon
|
||||
/user/**=login,kickout
|
||||
<!-- 控制页面 此处过于冗余,是因为没有将页面与方法绑定在一个controller中,造成路径相同,权限限制却不同的局面 -->
|
||||
</value>
|
||||
</property>
|
||||
<property name="filters">
|
||||
<util:map>
|
||||
<entry key="login" value-ref="login" />
|
||||
<entry key="role" value-ref="role" />
|
||||
<entry key="simple" value-ref="simple" />
|
||||
<entry key="permission" value-ref="permission" />
|
||||
<entry key="kickout" value-ref="kickoutSessionFilter" />
|
||||
</util:map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
|
||||
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
|
||||
|
||||
<bean
|
||||
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
|
||||
depends-on="lifecycleBeanPostProcessor" >
|
||||
<property name="proxyTargetClass" value="true" />
|
||||
</bean>
|
||||
|
||||
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
|
||||
<property name="securityManager" ref="securityManager" />
|
||||
</bean>
|
||||
</beans>
|
||||
|
||||
112
sso/src/main/resources/spring/applicationContext.xml
Normal file
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
|
||||
<description>Spring公共配置</description>
|
||||
<!-- 使用spring自带的占位符替换功能 -->
|
||||
<bean id="encryptPropertyPlaceholderConfigurer"
|
||||
class="com.njcn.utils.EncryptPropertyPlaceholderConfigurer">
|
||||
<!-- 允许JVM参数覆盖 -->
|
||||
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
|
||||
<!-- 忽略没有找到的资源文件 -->
|
||||
<property name="ignoreResourceNotFound" value="true"/>
|
||||
<!-- 配置资源文件 -->
|
||||
<property name="locations">
|
||||
<list>
|
||||
<value>classpath:jdbc.properties</value>
|
||||
<value>classpath:java.properties</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
<!--spring自带的定时任务方案解决需要配置的-->
|
||||
<!-- <task:annotation-driven/> -->
|
||||
<!-- 数据源配置,使用应用内的DBCP数据库连接池 ****start****-->
|
||||
<bean id="MariaDB" class="com.alibaba.druid.pool.DruidDataSource"
|
||||
init-method="init" destroy-method="close" lazy-init="true">
|
||||
<property name="driverClassName" value="${mariadb.driverClass}"/>
|
||||
<property name="url" value="${mariadb.jdbcUrl}"/>
|
||||
<property name="username" value="${mariadb.user}"/>
|
||||
<property name="password" value="${mariadb.password}"/>
|
||||
<!-- 配置初始化大小、最小、最大 -->
|
||||
<property name="initialSize" value="${mariadb.initialSize}"/>
|
||||
<property name="minIdle" value="${mariadb.minIdle}"/>
|
||||
<property name="maxActive" value="${mariadb.maxActive}"/>
|
||||
<!-- 配置获取连接等待超时的时间 -->
|
||||
<property name="maxWait" value="${mariadb.maxWait}"/>
|
||||
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
|
||||
<property name="timeBetweenEvictionRunsMillis" value="${mariadb.timeBetweenEvictionRunsMillis}"/>
|
||||
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
|
||||
<property name="minEvictableIdleTimeMillis" value="${mariadb.minEvictableIdleTimeMillis}"/>
|
||||
<property name="testWhileIdle" value="true"/>
|
||||
<property name="validationQuery" value="SELECT 'x' from dual"/>
|
||||
<property name="testOnBorrow" value="false"/>
|
||||
<property name="testOnReturn" value="false"/>
|
||||
<property name="removeAbandoned" value="false"/>
|
||||
<property name="removeAbandonedTimeout" value="300"/>
|
||||
<property name="logAbandoned" value="false"/>
|
||||
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
|
||||
<property name="poolPreparedStatements" value="${mariadb.poolPreparedStatements}"/>
|
||||
<property name="maxPoolPreparedStatementPerConnectionSize"
|
||||
value="${mariadb.maxPoolPreparedStatementPerConnectionSize}"/>
|
||||
<!-- 配置监控统计拦截的filters -->
|
||||
<property name="filters" value="stat"/>
|
||||
</bean>
|
||||
|
||||
<bean id="Oracle" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"
|
||||
lazy-init="true">
|
||||
<property name="driverClassName" value="${oracle.driverClass}"/>
|
||||
<property name="url" value="${oracle.jdbcUrl}"/>
|
||||
<property name="username" value="${oracle.user}"/>
|
||||
<property name="password" value="${oracle.password}"/>
|
||||
<!-- 配置初始化大小、最小、最大 -->
|
||||
<property name="initialSize" value="${oracle.initialSize}"/>
|
||||
<property name="minIdle" value="${oracle.minIdle}"/>
|
||||
<property name="maxActive" value="${oracle.maxActive}"/>
|
||||
<!-- 配置获取连接等待超时的时间 -->
|
||||
<property name="maxWait" value="${oracle.maxWait}"/>
|
||||
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
|
||||
<property name="timeBetweenEvictionRunsMillis" value="${oracle.timeBetweenEvictionRunsMillis}"/>
|
||||
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
|
||||
<property name="minEvictableIdleTimeMillis" value="${oracle.minEvictableIdleTimeMillis}"/>
|
||||
<property name="testWhileIdle" value="true"/>
|
||||
<property name="validationQuery" value="SELECT 'x' from dual"/>
|
||||
<property name="testOnBorrow" value="false"/>
|
||||
<property name="testOnReturn" value="false"/>
|
||||
<property name="removeAbandoned" value="false"/>
|
||||
<property name="removeAbandonedTimeout" value="300"/>
|
||||
<property name="logAbandoned" value="false"/>
|
||||
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
|
||||
<property name="poolPreparedStatements" value="${oracle.poolPreparedStatements}"/>
|
||||
<property name="maxPoolPreparedStatementPerConnectionSize"
|
||||
value="${oracle.maxPoolPreparedStatementPerConnectionSize}"/>
|
||||
<!-- 配置监控统计拦截的filters -->
|
||||
<property name="filters" value="stat"/>
|
||||
</bean>
|
||||
|
||||
<bean id="vendorProperties"
|
||||
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
|
||||
<property name="properties">
|
||||
<props>
|
||||
<prop key="Oracle">Oracle</prop>
|
||||
<prop key="MariaDB">MariaDB</prop>
|
||||
</props>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
|
||||
<property name="properties" ref="vendorProperties"/>
|
||||
</bean>
|
||||
|
||||
<bean class="com.njcn.utils.SpringContextUtil"/>
|
||||
<bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
|
||||
<property name="resultSetLogEnabled" value="false"/>
|
||||
<property name="statementExecutableSqlLogEnable" value="true"/>
|
||||
</bean>
|
||||
<!-- 数据源配置,使用应用内的DBCP数据库连接池 ****end****-->
|
||||
<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
|
||||
<context:component-scan base-package="com.njcn,com.sso">
|
||||
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
|
||||
</context:component-scan>
|
||||
</beans>
|
||||
41
sso/src/main/resources/spring/springmvc-config.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
|
||||
http://www.springframework.org/schema/context
|
||||
http://www.springframework.org/schema/context/spring-context-4.1.xsd
|
||||
http://www.springframework.org/schema/mvc
|
||||
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
|
||||
default-lazy-init="true">
|
||||
|
||||
<!-- 注解驱动 -->
|
||||
<mvc:annotation-driven>
|
||||
<mvc:message-converters register-defaults="true">
|
||||
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
|
||||
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
|
||||
</bean>
|
||||
</mvc:message-converters>
|
||||
</mvc:annotation-driven>
|
||||
|
||||
<context:component-scan base-package="com.sso.controller"/>
|
||||
|
||||
<mvc:interceptors>
|
||||
<mvc:interceptor>
|
||||
<mvc:mapping path="/**"/>
|
||||
<bean class="com.njcn.interceptor.CSRFInterceptor"/>
|
||||
</mvc:interceptor>
|
||||
</mvc:interceptors>
|
||||
|
||||
<!--处理静态资源的拦截问题-->
|
||||
<mvc:default-servlet-handler/>
|
||||
|
||||
<!-- 视图解析器 -->
|
||||
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
|
||||
<property name="prefix" value="/WEB-INF/views/"/>
|
||||
<property name="suffix" value=".jsp"/>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
67
sso/src/main/webapp/WEB-INF/error/404.jsp
Normal file
@@ -0,0 +1,67 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
|
||||
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||
<title>资源未找到</title>
|
||||
<link rel="stylesheet" href="${ctx}/css/plugin/bootstrap/bootstrap.css">
|
||||
<link rel="stylesheet" href="${ctx}/css/plugin/bootstrap/dataTables.bootstrap.css">
|
||||
<link rel="stylesheet" href="${ctx}/css/basic.css">
|
||||
<style>
|
||||
body,html{
|
||||
background-color: #ccc;
|
||||
}
|
||||
#errorCode{
|
||||
font-family: 'wuxin',serif !important;
|
||||
line-height: 280%;
|
||||
}
|
||||
#errorMsg{
|
||||
font-size: 30px;
|
||||
}
|
||||
.aBlank{
|
||||
color: blue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-fluid" >
|
||||
<div class="row">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2" id="main">
|
||||
<div class="row pd15" id="mainCode">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2">
|
||||
<div style="margin: 0 auto">
|
||||
<img src="${ctx}/images/img/error.png" class="fl">
|
||||
<div class="fl mt20 ml20" id="errorCode">
|
||||
<p id="errorMsg">所访问的资源不存在:404</p>
|
||||
<p>可能原因:</p>
|
||||
<p>1:手抖打错资源路径。</p>
|
||||
<p>2:链接过了保质期。</p>
|
||||
<p><a class="aBlank" href="/sso">重新登录</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="${ctx}/js/plugin/jquery/jquery.min.js"></script>
|
||||
<script src="${ctx}/jspJS/themeColor.js"></script>
|
||||
<script>
|
||||
var $main=$("#main");
|
||||
var $mainCode=$("#mainCode");
|
||||
$(function () {
|
||||
var height=$(window).height();
|
||||
$main.eq(0).css("margin-top",height*0.1);
|
||||
$mainCode.eq(0).css("margin-top",height*0.1);
|
||||
$main.eq(0).css("height",height*0.8);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
64
sso/src/main/webapp/WEB-INF/error/500.jsp
Normal file
@@ -0,0 +1,64 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
|
||||
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}" />
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||
<title>资源内部出错</title>
|
||||
<link rel="stylesheet" href="${ctx}/css/plugin/bootstrap/bootstrap.css">
|
||||
<link rel="stylesheet" href="${ctx}/css/plugin/bootstrap/dataTables.bootstrap.css">
|
||||
<link rel="stylesheet" href="${ctx}/css/basic.css">
|
||||
<style>
|
||||
body,html{
|
||||
background-color: #ccc;
|
||||
}
|
||||
#errorCode{
|
||||
font-family: 'wuxin',serif !important;
|
||||
line-height: 280%;
|
||||
}
|
||||
#errorMsg{
|
||||
font-size: 30px;
|
||||
}
|
||||
.aBlank{
|
||||
color: blue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-fluid" >
|
||||
<div class="row">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2" id="main">
|
||||
<div class="row pd15" id="mainCode">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2">
|
||||
<div style="margin: 0 auto">
|
||||
<img src="${ctx}/images/img/error.png" class="fl">
|
||||
<div class="fl mt20 ml20" id="errorCode">
|
||||
<p id="errorMsg">所访问的资源错误:500</p>
|
||||
<p> <a class="aBlank" href="/sso">重新登录</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="${ctx}/js/plugin/jquery/jquery.min.js"></script>
|
||||
<script src="${ctx}/jspJS/themeColor.js"></script>
|
||||
<script>
|
||||
var $main=$("#mainA");
|
||||
var $mainCode=$("#mainCode");
|
||||
$(function () {
|
||||
var height=$(window).height();
|
||||
$main.eq(0).css("margin-top",height*0.1);
|
||||
$mainCode.eq(0).css("margin-top",height*0.1);
|
||||
$main.eq(0).css("height",height*0.8);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
63
sso/src/main/webapp/WEB-INF/views/urlXssError.jsp
Normal file
@@ -0,0 +1,63 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}" />
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
|
||||
<title>输入项包含非法</title>
|
||||
<link rel="shortcut icon" href="/pqs9900/images/favicon.ico" type="image/x-icon"/>
|
||||
<link rel="stylesheet" href="${ctx}/css/plugin/bootstrap/bootstrap.css">
|
||||
<link rel="stylesheet" href="${ctx}/css/basic.css">
|
||||
<style>
|
||||
body,html{
|
||||
background-color: #ccc;
|
||||
}
|
||||
#errorCode{
|
||||
font-family: 'wuxin',serif !important;
|
||||
line-height: 280%;
|
||||
}
|
||||
#errorMsg{
|
||||
font-size: 30px;
|
||||
}
|
||||
.aBlank{
|
||||
color: blue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-fluid" >
|
||||
<div class="row">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2" id="main">
|
||||
<div class="row pd15" id="mainCode">
|
||||
<div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2">
|
||||
<div style="margin: 0 auto">
|
||||
<img src="${ctx}/images/img/error.png" class="fl">
|
||||
<div class="fl mt20 ml20" id="errorCode">
|
||||
<p id="errorMsg">输入项中不能包含非法字符</p>
|
||||
<p>请联系管理员</p>
|
||||
<p> 跳往<a class="aBlank" href="/sso/login">登录页面</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
<script src="${ctx}/js/plugin/jquery/jquery.min.js"></script>
|
||||
<script src="${ctx}/jspJS/themeColor.js"></script>
|
||||
<script>
|
||||
var $main=$("#main");
|
||||
var $mainCode=$("#mainCode");
|
||||
$(function () {
|
||||
var height=$(window).height();
|
||||
$main.eq(0).css("margin-top",height*0.1);
|
||||
$mainCode.eq(0).css("margin-top",height*0.1);
|
||||
$main.eq(0).css("height",height*0.8);
|
||||
})
|
||||
</script>
|
||||
</html>
|
||||
149
sso/src/main/webapp/WEB-INF/web.xml
Normal file
@@ -0,0 +1,149 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
|
||||
version="3.0">
|
||||
<display-name>sso</display-name>
|
||||
|
||||
<!--tomcat启动的时候初始化spring容器 -->
|
||||
<context-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>classpath:spring/applicationContext*.xml</param-value>
|
||||
</context-param>
|
||||
|
||||
<filter>
|
||||
<filter-name>characterEncodingFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
|
||||
<init-param>
|
||||
<param-name>encoding</param-name>
|
||||
<param-value>UTF-8</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>forceEncoding</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>characterEncodingFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<filter>
|
||||
<filter-name>xssFilter</filter-name>
|
||||
<filter-class>com.njcn.fliter.XssFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>xssFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
|
||||
|
||||
<filter>
|
||||
<filter-name>shiroSecurityFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
||||
<init-param>
|
||||
<param-name>targetFilterLifecycle</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>shiroSecurityFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!--Spring的ApplicationContext 载入 -->
|
||||
<listener>
|
||||
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
||||
</listener>
|
||||
<listener>
|
||||
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
|
||||
</listener>
|
||||
|
||||
|
||||
<servlet>
|
||||
<!--设置spring mvc的拦截器,mvc框架都会有个前端控制器 -->
|
||||
<servlet-name>springmvc</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
<!--添加参数,制定mvc读取配置文件的路径 -->
|
||||
<init-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>classpath:spring/springmvc-config.xml</param-value>
|
||||
</init-param>
|
||||
<!--在web应用启动的时候就去加载该servlet -->
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>springmvc</servlet-name>
|
||||
<!--表示拦截所有的请求 -->
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>DruidStatView</servlet-name>
|
||||
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
|
||||
<init-param>
|
||||
<!-- 用户名 -->
|
||||
<param-name>loginUsername</param-name>
|
||||
<param-value>druid</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<!-- 密码 -->
|
||||
<param-name>loginPassword</param-name>
|
||||
<param-value>njcn</param-value>
|
||||
</init-param>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>DruidStatView</servlet-name>
|
||||
<url-pattern>/druid/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<!-- 添加Web应用等监控-->
|
||||
<filter>
|
||||
<filter-name>DruidWebStatFilter</filter-name>
|
||||
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
|
||||
<init-param>
|
||||
<param-name>exclusions</param-name>
|
||||
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>profileEnable</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>principalCookieName</param-name>
|
||||
<param-value>USER_COOKIE</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>principalSessionName</param-name>
|
||||
<param-value>USER_SESSION</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>DruidWebStatFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!--在请求的过程中出现404、或者500的时候跳向指定的页面 -->
|
||||
<error-page>
|
||||
<error-code>404</error-code>
|
||||
<location>/WEB-INF/error/404.jsp</location>
|
||||
</error-page>
|
||||
<error-page>
|
||||
<error-code>500</error-code>
|
||||
<location>/WEB-INF/error/500.jsp</location>
|
||||
</error-page>
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file>login.jsp</welcome-file>
|
||||
</welcome-file-list>
|
||||
|
||||
<session-config>
|
||||
<session-timeout>30</session-timeout>
|
||||
<cookie-config>
|
||||
<http-only>true</http-only>
|
||||
<secure>true</secure>
|
||||
</cookie-config>
|
||||
</session-config>
|
||||
|
||||
</web-app>
|
||||
717
sso/src/main/webapp/css/basic.css
Normal file
@@ -0,0 +1,717 @@
|
||||
:root {
|
||||
--primarycolor:#D9D9D9;
|
||||
}
|
||||
/**
|
||||
*============================
|
||||
*楠ㄦ灦
|
||||
*============================
|
||||
*/
|
||||
/*body, button, input, select, textarea, table{font-family:"Helvetica Neue", Helvetica, Arial, \5FAE\8F6F\96C5\9ED1, sans-serif !important;}*/
|
||||
html{position:relative;min-height:100%;background:#ffffff;color:#000;}
|
||||
body{width:100%;min-height:100%;font-size: 12px}
|
||||
body,p,ul,ol,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,form,fieldset,legend,input,select,textarea,button,th,td{margin:0;padding:0;}
|
||||
h1,h2,h3,h4,h5,h6{font-size:100%;font-weight: normal;}
|
||||
ul,dl,ol{list-style:none;cursor: pointer;}
|
||||
img,fieldset,input[type="submit"]{border:0 none;}
|
||||
img{display:inline-block;overflow:hidden;vertical-align:top;max-width:100%;}
|
||||
em{font-style:normal;}
|
||||
strong{font-weight:normal;}
|
||||
table{border-collapse:collapse;border-spacing:0;text-align:center}
|
||||
textarea{word-wrap:break-word;resize:none;}
|
||||
a{text-decoration:none;color:#333;}
|
||||
a:link,a:visited,a:hover,a:active{text-decoration:none;}
|
||||
.fl{float:left;}
|
||||
.fr{float:right;}
|
||||
.tc{text-align:center;}
|
||||
.pr{position:relative;}
|
||||
.pa{position:absolute;}
|
||||
.pf{position:fixed;}
|
||||
.block{display:block;}
|
||||
.none{display: none;}
|
||||
.clearfix{*zoom:1;}
|
||||
.clearfix:after{clear:both;content:"";display:table;}
|
||||
/*padding*/
|
||||
.pd10{padding:10px;}
|
||||
.pdt10{padding-top:10px;}
|
||||
.pdr10{padding-right:10px;}
|
||||
.pdb10{padding-bottom:10px;}
|
||||
.pdl10{padding-left: 10px;}
|
||||
.pd15{padding:15px;}
|
||||
.pdt15{padding-top:15px;}
|
||||
.pdr15{padding-right:15px;}
|
||||
.pdb15{padding-bottom:15px;}
|
||||
.pdl15{padding-left: 15px;}
|
||||
.pd5{padding:5px;}
|
||||
.pdt5{padding-top:5px;}
|
||||
.pdr5{padding-right:5px;}
|
||||
.pdb5{padding-bottom:5px;}
|
||||
.pdl5{padding-left: 5px;}
|
||||
/*margin*/
|
||||
.mt5{margin-top:5px;}
|
||||
.mt10{margin-top:10px;}
|
||||
.mr10{margin-right:10px;}
|
||||
.mb10{margin-bottom:10px;}
|
||||
.ml10{margin-left:10px;}
|
||||
.m10{margin:10px;}
|
||||
.mt15{margin-top:15px;}
|
||||
.mr15{margin-right:15px;}
|
||||
.mb15{margin-bottom:15px;}
|
||||
.ml15{margin-left:15px;}
|
||||
.ml20{margin-left:19px !important;}
|
||||
.ml30{margin-left: 37% !important;}
|
||||
.ml5{margin-left:5px;}
|
||||
.m15{margin:15px;}
|
||||
.f10{font-size:10px;}
|
||||
.f12{font-size:12px;}
|
||||
.f14{font-size:14px;}
|
||||
.f16{font-size:16px;}
|
||||
.f18{font-size:18px;}
|
||||
.f20{font-size:20px;}
|
||||
.f25{font-size:25px;}
|
||||
.fb{font-weight:bold;}
|
||||
.height100{height: 100%}
|
||||
.height50{height: 50%}
|
||||
.width100{width: 100%}
|
||||
.width50{width: 50%}
|
||||
html,body{height:100%;}
|
||||
thead tr th{text-align: center;}
|
||||
.font12{
|
||||
font-size: 12px;
|
||||
}
|
||||
.bg-error{
|
||||
background-color: #A52a2a;
|
||||
}
|
||||
.error{
|
||||
color:#A52a2a;
|
||||
}
|
||||
.bg-warn{
|
||||
background-color: #DAA520;
|
||||
}
|
||||
.warn{
|
||||
color:#DAA520;
|
||||
}
|
||||
.bg-info{
|
||||
background-color: #2E8B57;
|
||||
}
|
||||
.info{
|
||||
color:#2E8B57;
|
||||
}
|
||||
.inB{
|
||||
display: inline-block;
|
||||
}
|
||||
.smallBlock{
|
||||
height: 10px;
|
||||
width: 15px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
#page_header{position:relative;z-index:905;height:70px;padding:10px 13px 0 20px;}
|
||||
#left_panel{position:absolute;z-index:904;top:0;left:0;width:220px;min-height:100%;padding-top:70px;
|
||||
background-color: #003679;
|
||||
-webkit-transition: all 250ms cubic-bezier(0.1,.57,.1,1);
|
||||
transition: all 250ms cubic-bezier(0.1,.57,.1,1);
|
||||
}
|
||||
#main{background-color:#ffffff;}
|
||||
#main #ribbon{min-height:40px;background:#002049;}
|
||||
#main #content{padding:5px 0;}
|
||||
#page_footer{position:absolute;bottom:0;left:0;width:100%;height:50px;line-height:49px;background: #322f2c;color:#fff;border-top:1px solid #CECECE;}
|
||||
#page_footer .inside{padding-left:220px;text-align:center;}
|
||||
#page_footer .inside i{margin-right:4px;}
|
||||
#page_footer .inside a{color:#fff;}
|
||||
.ajax-loading-animation{font-size:20px;padding:0 15px;}
|
||||
.ajax-loading-error{font-size:20px;padding:0 15px;}
|
||||
#page_header .right_side{float:right;}
|
||||
#page_header .right_side span{display:block;float:left;width:30px;height:30px;line-height:30px;text-align:center;font-size:14px;border-radius:2px;border:1px solid #bfbfbf;color:#6D6A69;margin-left:6px;margin-top:10px;box-shadow:inset 0 0 4px 1px rgba(0,0,0,.08);cursor:pointer;
|
||||
background: #f8f8f8;
|
||||
background: -moz-linear-gradient(left,#f8f8f8 93%,#f1f1f1 100%);
|
||||
background: -webkit-gradient(linear,left top,right top,color-stop(93%,#f8f8f8),color-stop(100%,#f1f1f1));
|
||||
background: -webkit-linear-gradient(left,#f8f8f8 93%,#f1f1f1 100%);
|
||||
background: -o-linear-gradient(left,#f8f8f8 93%,#f1f1f1 100%);
|
||||
background: -ms-linear-gradient(left,#f8f8f8 93%,#f1f1f1 100%);
|
||||
background: linear-gradient(to right,#f8f8f8 93%,#f1f1f1 100%);
|
||||
}
|
||||
#page_header .right_side span:hover{color:#222;}
|
||||
#page_header .right_side span.active{background:#5a5a5a;color:#fff;border:1px solid #5a5a5a;}
|
||||
#page_header .right_side .toggleMenu_btn{display:none;}
|
||||
#page_header .logow{display:inline-block;}
|
||||
#page_header .logow a{}
|
||||
#page_header .logow a:hover{text-decoration:none;}
|
||||
#page_header .logow a:active{text-decoration:none;}
|
||||
#page_header .logow a:focus{text-decoration:none;}
|
||||
|
||||
#left_panel nav ul{list-style:none;padding:0;}
|
||||
#left_panel nav ul li{position:relative;}
|
||||
#left_panel nav ul ul{display:none;}
|
||||
#left_panel nav ul a{position:relative;display:block;padding:10px;font-size:14px;color:#6699cc;text-decoration:none;}
|
||||
#left_panel nav ul a:hover{color:#fff;background:#004394;}
|
||||
#left_panel nav ul a:active,#left_panel nav ul a.active{background:#002b61;color:#fff;}
|
||||
#left_panel nav ul a i{margin-right:5px;}
|
||||
#left_panel nav ul a b{float:right;font-weight:normal;}
|
||||
#left_panel nav ul a b i{margin:0;}
|
||||
#left_panel nav > ul > li > a:hover{background:none;}
|
||||
#left_panel nav > ul > li > a:active{background:rgba(0,43,97,0.6);}
|
||||
#left_panel nav > ul > li > ul{position:relative;background:#002b61;overflow:hidden;margin:0;display:none;}
|
||||
#left_panel nav > ul > li > ul::before{content:"";display:block;position:absolute;z-index:1;left:23px;top:0;bottom:0;border-left:1px solid #7A7A7A;}
|
||||
#left_panel nav > ul > li > ul > li::before{content:"";display:block;position:absolute;width:8px;left:23px;top:16px;border-top:1px solid #7A7A7A;z-index:1;}
|
||||
#left_panel nav > ul > li > ul > li > a{padding:7px 10px 7px 42px;}
|
||||
#left_panel nav > ul > li > ul > li > ul > li > a{padding:8px 0 8px 60px;}
|
||||
#left_panel nav .open ul{display:block;}
|
||||
#left_panel .minifyBtn{
|
||||
display:block;
|
||||
position:absolute;
|
||||
right:0;
|
||||
bottom:0;
|
||||
width:36px;
|
||||
height:28px;
|
||||
margin-top:7px;
|
||||
border-bottom:1px solid #302F2F;
|
||||
background:#002049;
|
||||
border-radius:5px 0 0 5px;
|
||||
color:#A8A8A8;
|
||||
font-size:19px;
|
||||
text-align:center;
|
||||
cursor:pointer;
|
||||
-webkit-transition:all .1s linear;
|
||||
transition:all .1s linear;
|
||||
}
|
||||
#left_panel .minifyBtn:hover{width:40px;padding-right:5px;background:#646464;color:#E4E4E4;}
|
||||
|
||||
.login_info{width:100%;height:40px;}
|
||||
.login_info a:hover,.login_info a:active{text-decoration:none;}
|
||||
.login_info > span{display:block;height:39px;padding:0 10px;border-bottom:1px solid #1A1817;}
|
||||
.login_info > span > div{position:relative;display:block;height:39px;color:#fff;}
|
||||
.login_info > span > div > a{display:inline-block;width:100%;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;height:39px;line-height:39px;color:#c0bbb7;font-size:14px;}
|
||||
.login_info > span > div > .dropdown-menu{margin-top:0;}
|
||||
.login_info .name{margin-right:2px;}
|
||||
|
||||
.minified #main{margin-left:45px;}
|
||||
.minified #page_footer .inside{padding-left:45px;}
|
||||
.minified #left_panel{width:45px !important;}
|
||||
.minified #left_panel, .minified nav > ul > li {overflow:visible;}
|
||||
.minified #left_panel nav > ul > li{border-bottom:1px solid #1A1817;border-top:1px solid #525151;}
|
||||
.minified #left_panel nav > ul > li:first-child{border-top:0;}
|
||||
.minified #left_panel nav > ul > li > a > span{display:none;}
|
||||
.minified #left_panel nav > ul > li > a > i{margin:0 auto;}
|
||||
.minified #left_panel nav > ul > li > a > b{display:none;}
|
||||
.minified #left_panel nav > ul > li > a > span{z-index:2;position:absolute;top:0;left:40px;width:186px;height:38px;padding-left:10px;line-height:38px;background:#f5f5f5;color:#333;border:1px solid #bfbfbf;box-shadow:1px 1px 2px 0 rgba(0,0,0,.2);}
|
||||
.minified #left_panel nav > ul > li > ul{display:none !important;z-index:1;position:absolute;top:36px;left:40px;width:186px;border:1px solid #bfbfbf;box-shadow:1px 1px 2px 0 rgba(0,0,0,.2);}
|
||||
.minified #left_panel nav > ul > li > ul::before{border-left:none;}
|
||||
.minified #left_panel nav > ul > li > ul > li::before{border-top:none;}
|
||||
.minified #left_panel nav > ul > li:hover > a > span{display:block !important;}
|
||||
.minified #left_panel nav > ul > li:hover > ul{display:block !important;}
|
||||
.minified #left_panel nav > ul > li > ul > li > a{padding:7px 10px 7px 10px;}
|
||||
.minified #left_panel nav > ul > li > ul > li > ul > li > a{padding:7px 10px 7px 30px;}
|
||||
.minified .login_info{margin-bottom:0;}
|
||||
.minified .login_info > span{padding:0;}
|
||||
.minified .login_info > span > div > a{text-align:center;}
|
||||
.minified .login_info > span > div > a > span{display:none;}
|
||||
.minified .login_info > span > div > a > i{margin:0;color:#c0bbb7;}
|
||||
|
||||
#main #ribbon .breadcrumb{padding:0 0 0 14px;color:#BBB;line-height:40px;margin-bottom:0;list-style:none;background:none;border-radius:0; }
|
||||
#main #ribbon .breadcrumb li i{margin-right:3px;}
|
||||
#main #ribbon .breadcrumb li:last-child{color:#E4E4E4;}
|
||||
|
||||
@media only screen and (min-width:0px) and (max-width:768px) {
|
||||
#page_header .right_side .toggleMenu_btn{display:block;}
|
||||
#page_header .right_side .fullScreen_btn{display:none;}
|
||||
#main{margin-left:0;}
|
||||
#left_panel{margin-left:-220px;background:#3a3633;}
|
||||
#left_panel .minifyBtn{display:none;}
|
||||
#page_footer .inside{padding-left:0;text-align:center;}
|
||||
}
|
||||
|
||||
.content_wrapper aside{margin-bottom:15px;}
|
||||
.content_wrapper aside header{line-height:34px;border-bottom :1px solid #ddd;padding-left:30px;}
|
||||
.content_wrapper aside header i{margin-right:6px;}
|
||||
.content_wrapper aside section{padding:15px 0;}
|
||||
|
||||
/**
|
||||
*============================
|
||||
*鐧诲綍椤<E7B68D>
|
||||
*============================
|
||||
*/
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'maozedong';
|
||||
src:url('../font/userDefined/maozedong.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'zhengdao';
|
||||
src:url('../font/userDefined/zhengdao.ttf') format('truetype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.bg-login .icon-ren:before,.bg-login .icon-mima:before,.bg-login .icon-yanzhengma:before{font-size:20px;}
|
||||
/*.form-signin {width:510px;padding:20px 0 58px 0;background:rgba(255,255,255,0.2);top:50%;left:50%;position:absolute;margin-left:-255px;margin-top:-180px; border-radius:15px;}*/
|
||||
/*.form-signin .logo{font-size:78px;text-align:center;font-weight:bold;color: #444444;font-family:Consolas,"Courier New",monospace;}*/
|
||||
/*.form-signin h3{color:#676a6c;font-size:14px;text-align:center;}*/
|
||||
/*.form-signin .form-control{padding:0 12px;height:46px;line-height:46px;}*/
|
||||
/*.form-signin .form-control:focus {border:2px solid #afacab;outline:0;-webkit-box-shadow:none;box-shadow: none;}*/
|
||||
/*.form-signin .subBtn{padding:9px 35px 13px;border:0;color:#fff;font-size:20px;*/
|
||||
/* -webkit-transition: all 250ms cubic-bezier(0.1,.57,.1,1);*/
|
||||
/* transition: all 250ms cubic-bezier(0.1,.57,.1,1);*/
|
||||
/*}*/
|
||||
/*.form-signin .subBtn:focus{background:#2e6da4;outline:none;}*/
|
||||
/*.form-signin .help{color:#999;margin:14px 0;text-align:center;}*/
|
||||
/*.form-signin .copyright{text-align:center;margin:14px 0;}*/
|
||||
/*.form-signin .copyright i{margin-right:4px;}*/
|
||||
/*.form-signin .copyright a{color:#3a3633;}*/
|
||||
/*.form-signin .icon-wode:before,.form-signin .icon-mima1:before,.form-signin .icon-mima:before{font-size:22px;}*/
|
||||
|
||||
/**
|
||||
*============================
|
||||
*瀵筨ootstrap鐨勮ˉ鍏ㄦ垨瑕嗙洊
|
||||
*============================
|
||||
*/
|
||||
.table thead,.table tfoot{background:#ebebeb;}
|
||||
.form-inline .gap{display:inline-block;width:10px;}
|
||||
@media only screen and (min-width:0px) and (max-width:767px) {
|
||||
.form-inline .gap{display:none;width:0;height:0;}
|
||||
}
|
||||
hr{margin:15px 0;border-top:1px solid #f0f0f0;}
|
||||
.help-block{margin-bottom:0;}
|
||||
button i,a i{margin-right:6px;}
|
||||
.pagination button i,.pagination a i{margin:0;}
|
||||
.my_panel .heading{padding:8px 10px;font-weight:bold;background:#ebebeb;border-bottom:2px solid #ddd;}
|
||||
.my_panel .body{padding:10px 10px 20px;}
|
||||
.my_panel .body .table{margin-bottom:0;}
|
||||
.my_panel .body .table tr:first-child td{border-top:0;}
|
||||
.my_panel .body .table thead,.my_panel .body .table tfoot{background:none !important;}
|
||||
form .title_bar{padding:8px 10px;font-weight:bold;background:#ebebeb;border-bottom:2px solid #ddd;margin-bottom:14px;}
|
||||
.form-horizontal .modal-content .form-group {margin-left:0 !important;margin-right:0 !important;}
|
||||
.modal-header .modal-title{font-size:16px;}
|
||||
div.dataTables_wrapper div.dataTables_paginate{margin:20px 0 0 0 !important;}
|
||||
.ajaxForm_tip_success{color:#4cae4c;font-size:14px;}
|
||||
.ajaxForm_tip_warning{color:#f0ad4e;font-size:14px;}
|
||||
.J_confirm_btn i{display:none;}
|
||||
.J_confirm_btn.subBtn_sending i{display:inline-block;}
|
||||
.J_tree_table th,
|
||||
.J_tree_table td {
|
||||
vertical-align:middle !important;
|
||||
border-top:1px solid #f0f0f0 !important;
|
||||
}
|
||||
.table-responsive > .J_tree_table > thead > tr > th,
|
||||
.table-responsive > .J_tree_table > tbody > tr > th,
|
||||
.table-responsive > .J_tree_table > tfoot > tr > th,
|
||||
.table-responsive > .J_tree_table > thead > tr > td,
|
||||
.table-responsive > .J_tree_table > tbody > tr > td,
|
||||
.table-responsive > .J_tree_table > tfoot > tr > td {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.J_tree_table > tbody + tbody {border-top:0 !important;}
|
||||
.J_tree_table .J_pull_btn{display:inline-block;width:20px;height:20px;}
|
||||
.J_tree_table .pull_down{background:url(../images/icon_list.png) 0 -20px no-repeat !important;cursor:pointer;}
|
||||
.J_tree_table .pull_up{background:url(../images/icon_list.png) 0 0 no-repeat !important;cursor:pointer;}
|
||||
.J_tree_table .blank_btn{display:inline-block;width:20px;height:20px;background:url(../images/icon_list.png) -20px 0 no-repeat;}
|
||||
.J_tree_table .end{display:inline-block;width:46px;height:20px;vertical-align:middle;cursor:pointer;background:url(../images/icon_list.png) 0 -72px no-repeat;}
|
||||
.J_tree_table .space{display:inline-block;width:46px;height:20px;vertical-align:middle;cursor:pointer;}
|
||||
.J_tree_table input[type=text]{
|
||||
display: inline-block;
|
||||
margin-right:6px;
|
||||
width: 35px;
|
||||
height: 28px;
|
||||
font-size: 14px;
|
||||
padding:0 4px;
|
||||
line-height: 1.42857143;
|
||||
color: #555;
|
||||
background-color: #fff;
|
||||
background-image: none;
|
||||
border: 1px solid #ccc;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
||||
}
|
||||
#example_filter{display:none;}
|
||||
.div-inline{ display:inline}
|
||||
.div-inlineblock{ display:inline-block}
|
||||
div.dataTables_wrapper div.dataTables_info{margin-top:10px;margin-left:10px;}
|
||||
.pg-canvas{position:absolute;}
|
||||
|
||||
|
||||
.left-menu{;position:absolute;z-index:904;top:80px;bottom:35px;left:20px;width:240px;padding-top:0;background:rgba(255,255,255,0.3);}
|
||||
.footer-copy{color:#fff;position:absolute;left:20px;bottom:5px;right:20px;}
|
||||
.left-menu .menu-hd{background:rgba(255,255,255,0.13);padding-left:10px;height:38px;line-height:38px;color:#fff;}
|
||||
.left-menu .menu-hd h2{height:38px;line-height:38px;}
|
||||
.left-menu .menu-hd .menu-arr{position:absolute;right:10px;top:0;}
|
||||
.left-menu .menu-slidedown li a{display:block;padding-left:40px;height:34px;line-height:34px;color:#fff;}
|
||||
|
||||
.disinlineb{
|
||||
display: inline-block;
|
||||
}
|
||||
#bigTitle{
|
||||
font-size: 40px;letter-spacing:1px;color: #FFFFFF;font-family: '华文楷体', serif;
|
||||
}
|
||||
.left-menu .menu-slidedown{display:none;}
|
||||
.left-menu .menu-con{margin-bottom:8px;}
|
||||
.top-menu{padding:35px 15px 15px 15px;}
|
||||
.top-menu li{float:left;margin-right:20px;position:relative;z-index:99;}
|
||||
.top-menu li .menuone{color:#fff;}
|
||||
|
||||
.top-menu li:hover .menutwo{display:block;}
|
||||
.scroll-item{width:500px;overflow:hidden;}
|
||||
.scroll-item a{margin-right:10px;color:#fff;}
|
||||
.menu-con.hover .menu-slidedown{display:block;}
|
||||
.user-checkout li{display:inline-block;margin-left:10px;color:#fff;}
|
||||
.user-checkout li .iconfont{margin-right:5px;}
|
||||
.ui-tabs .ui-tabs-panel{padding:0;}
|
||||
.ui-widget-header{background:#ccc;}
|
||||
|
||||
|
||||
.right-arr{top:50%;right:0;}
|
||||
.left-arr{top:50%;left:0;}
|
||||
|
||||
.right-arr:hover,.left-arr:hover{color:#333;}
|
||||
.dg-container{
|
||||
width: 100%;
|
||||
height: 450px;
|
||||
position: relative;
|
||||
}
|
||||
.dg-wrapper{
|
||||
width: 576px;
|
||||
height: 400px;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
-webkit-transform-style: preserve-3d;
|
||||
-moz-transform-style: preserve-3d;
|
||||
-o-transform-style: preserve-3d;
|
||||
-ms-transform-style: preserve-3d;
|
||||
transform-style: preserve-3d;
|
||||
-webkit-perspective: 1000px;
|
||||
-moz-perspective: 1000px;
|
||||
-o-perspective: 1000px;
|
||||
-ms-perspective: 1000px;
|
||||
perspective: 1000px;
|
||||
}
|
||||
.dg-wrapper a{
|
||||
width: 576px;
|
||||
height: 400px;
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
box-shadow: 0px 10px 20px rgba(0,0,0,0.3);
|
||||
background:url(../images/bg.jpg)
|
||||
}
|
||||
.dg-wrapper a.dg-transition{
|
||||
-webkit-transition: all 0.5s ease-in-out;
|
||||
-moz-transition: all 0.5s ease-in-out;
|
||||
-o-transition: all 0.5s ease-in-out;
|
||||
-ms-transition: all 0.5s ease-in-out;
|
||||
transition: all 0.5s ease-in-out;
|
||||
}
|
||||
.dg-wrapper a img{
|
||||
display: block;
|
||||
/*padding: 41px 0px 0px 1px;*/
|
||||
}
|
||||
.dg-wrapper a div{
|
||||
font-style: italic;
|
||||
text-align: center;
|
||||
line-height: 50px;
|
||||
text-shadow: 1px 1px 1px rgba(255,255,255,0.5);
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
width: 100%;
|
||||
/*bottom: -55px;*/
|
||||
display: none;
|
||||
position: absolute;
|
||||
}
|
||||
.dg-wrapper a.dg-center div{
|
||||
display: block;
|
||||
}
|
||||
.dg-container nav{
|
||||
width: auto;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
top:425px;
|
||||
left: 45%;
|
||||
margin-left: -29px;
|
||||
}
|
||||
.dg-container nav span{
|
||||
text-indent: -9000px;
|
||||
float: left;
|
||||
cursor:pointer;
|
||||
width: 24px;
|
||||
height: 25px;
|
||||
opacity: 0.8;
|
||||
background: transparent url(../images/arrows.png) no-repeat top left;
|
||||
}
|
||||
.dg-container nav span:hover{
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.dg-container nav span.dg-prev{
|
||||
margin-right: 10px;
|
||||
width: 33px;
|
||||
height: 33px;
|
||||
background: transparent url(../images/dg-prev.png) no-repeat top left;
|
||||
}
|
||||
|
||||
.dg-container nav span.dg-next{
|
||||
margin-left: 10px;
|
||||
width: 33px;
|
||||
height: 33px;
|
||||
background: transparent url(../images/dg-next.png) no-repeat top left;
|
||||
}
|
||||
.tab-content > .tab-pane,
|
||||
.pill-content > .pill-pane {
|
||||
display: block;
|
||||
height: 0;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
.tab-content > .active,
|
||||
.pill-content > .active {
|
||||
height: auto;
|
||||
}
|
||||
table.dataTable tbody tr.selected{background-color:#eee;}
|
||||
|
||||
@media screen and (min-width: 1200px) and (max-width:1400px) {
|
||||
.form-control{
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ruler */
|
||||
div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer}
|
||||
div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}
|
||||
.float-news,.float-open{background:#fbfbfb;border:2px solid #e1e1e1;border-right:0 none;border-top-right-radius:4px;border-bottom-right-radius:4px;box-shadow:1px 1px 2px rgba(0, 0, 0, 0.5);display:inline-block;font-size:16px; float:right;!important}
|
||||
.float-news{height:300px;right:0px;padding:10px 15px;width:210px;z-index:100;top:117px;_margin-top:117px;}
|
||||
.float-open{height:42px;right:-70px;padding:4px 4px 4px 6px;z-index:99;top:206px;_margin-top:206px;}
|
||||
.float-news,.float-open{position:fixed;*zoom:1;_position:absolute;_top:expression(eval(document.documentElement.scrollTop));}
|
||||
.float-close{background:url(../images/nav-close.png) no-repeat left top;overflow:hidden;height:32px;opacity:.6;filter:alpha(opacity=60);position:absolute;right:9px;text-indent:100%;top:10px;white-space:nowrap;width:32px;}
|
||||
.open-btn{background:url(../images/ml-open-demo.png) no-repeat left top;display:block;overflow:hidden;height:32px;opacity:.6;filter:alpha(opacity=60);text-indent:100%;white-space:nowrap;width:32px;}
|
||||
.float-close:hover,.open-btn:hover{opacity:1;filter:alpha(opacity=100);}
|
||||
.newslist h3{color:#333;border-bottom:4px solid #F2F2F2;font-size:26px;height:54px;line-height:54px;font-family:Microsoft Yahei,simsun,arial,sans-serif;}
|
||||
.newslist div{margin-top:10px; position:relative;height:30px;line-height:30px;font-size:14px;}
|
||||
|
||||
/*主题背景色*/
|
||||
.themeBGColor{background-color: var(--primarycolor);color:#fff;}
|
||||
.themeBGColor:hover{background-color: var(--primarycolor);color:#fff;}
|
||||
.themeColor{color:var(--primarycolor);}
|
||||
/*按钮主题色*/
|
||||
.btn-primary{color: #fff;background-color: var(--primarycolor);border-color: var(--primarycolor);}
|
||||
.btn-primary:hover{background-color:var(--primarycolor);}
|
||||
.btn-primary:focus, .btn-primary.focus {
|
||||
color: #fff;
|
||||
background-color: var(--primarycolor);
|
||||
border-color: var(--primarycolor);
|
||||
}
|
||||
.btn.focus, .btn:focus, .btn:hover{
|
||||
color:#fff;
|
||||
}
|
||||
/*分页主题色*/
|
||||
.pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus{background-color:var(--primarycolor);}
|
||||
/*main页面的主题色*/
|
||||
.bg-main{width:100%;height:100%;background:var(--primarycolor);}
|
||||
/*瀵艰埅鏍忕殑棰滆壊閰嶇疆*/
|
||||
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #ffffff 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; }
|
||||
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: var(--primarycolor) 50% 50% repeat-x; font-weight: bold; color: #e17009; }
|
||||
ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited{color:var(--primarycolor)}
|
||||
.ui-state-active a, .ui-widget-content .ui-state-active a, .ui-widget-header .ui-state-active a {color:#ffffff}
|
||||
/*瀵艰埅鏍忕殑涓嬭竟妗嗕富棰橀鑹<EE9681>*/
|
||||
.ui-widget-header {border-bottom: 1px solid var(--primarycolor);color: #ffffff;font-weight: bold;}
|
||||
.nav-tabs > li.active > a,
|
||||
.nav-tabs > li.active > a:hover,
|
||||
.nav-tabs > li.active > a:focus {
|
||||
color: #555;
|
||||
cursor: default;
|
||||
background-color: #fff;
|
||||
border: 1px solid var(--primarycolor);
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
.nav-tabs > li > a {
|
||||
margin-right: 2px;
|
||||
line-height: 1.42857143;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px 4px 0 0;
|
||||
}
|
||||
/*菜单下按钮主题色*/
|
||||
.nav-tabs {border-bottom: 1px solid var(--primarycolor);}
|
||||
/*按钮主题色*/
|
||||
button.dt-button,
|
||||
div.dt-button,
|
||||
a.dt-button {
|
||||
color: white;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
background-color: var(--primarycolor);
|
||||
/* Fallback */
|
||||
background-image: -webkit-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||
background-image: -moz-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* FF3.6 */
|
||||
background-image: -ms-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* IE10 */
|
||||
background-image: -o-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Opera 11.10+ */
|
||||
background-image: linear-gradient(to bottom, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='var(--primarycolor)', EndColorStr='var(--primarycolor)');
|
||||
}
|
||||
|
||||
.nav-pills>li.active>a, .nav-pills>li.active>a:focus, .nav-pills>li.active>a:hover {
|
||||
color: #fff;
|
||||
background-color: var(--primarycolor);
|
||||
}
|
||||
|
||||
/*甯姪涓績鐨勬枃瀛楅<E7809B>変腑鐨勪富棰橀鑹<EE9681>*/
|
||||
.bs-docs-sidebar .nav > .active > a,
|
||||
.bs-docs-sidebar .nav > .active:hover > a,
|
||||
.bs-docs-sidebar .nav > .active:focus > a {
|
||||
color: var(--primarycolor);
|
||||
border-left: 2px solid var(--primarycolor);
|
||||
}
|
||||
/*鐩戞祴鐐归椤祎ip鎻愮ず鐨勬爣绛句富棰橀鑹<EE9681>*/
|
||||
.mystyle > label{background:var(--primarycolor);color:#FFFFFF;}
|
||||
|
||||
|
||||
.cancleBGColor{background-color: #ff5722;color:#fff;}
|
||||
|
||||
.cancleColor{color:#ff5722;}
|
||||
|
||||
.table-middle{text-align:center;vertical-align:middle !important;}
|
||||
|
||||
.mainright{float:left;margin-left:1px; height:2000px;width:300px;}
|
||||
|
||||
.imgarrow{float:left; margin-top:1px; margin-left:20px; margin-top:14px;}
|
||||
|
||||
.middlediv{float:left;height: 100%}
|
||||
|
||||
.middleleft{border:1px solid rgb(0,106,106); margin-bottom:1px;margin-top:1px;float:left;width:260px;height: 99%}
|
||||
|
||||
.lefttophandle{float:left; width:75px;text-align:center;}
|
||||
.lefttophandle p{ float:left;}
|
||||
.lefttophandle p a{font-size:11px;}
|
||||
.rightinfo{padding:8px;}
|
||||
.lefttoptitle{float:left; width:230px;text-align:center;}
|
||||
.lefttoptitle img{float:left; margin-top:2px;margin-left:5px;}
|
||||
.lefttoptitle lable{float:left; margin-left:5px;}
|
||||
.form-control{font-size:12px}
|
||||
.toolbar1{float:right;}
|
||||
.toolbar1 li{background:url(../images/toolbg.gif) repeat-x; line-height:33px; height:33px; border:solid 1px #d3dbde; float:left; padding-right:10px; margin-left:5px;border-radius: 3px;}
|
||||
.toolbar1 li span{float:left; margin-left:10px; margin-right:5px; margin-top:5px;cursor:pointer;}
|
||||
|
||||
.layui-layer-btn .layui-layer-btn0 {
|
||||
border-color: var(--primarycolor) !important;
|
||||
background-color: var(--primarycolor) !important;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/*登录按钮获取焦点颜色*/
|
||||
#login:focus{
|
||||
background: var(--primarycolor);
|
||||
}
|
||||
|
||||
/*登陆页面输入框小图标的颜色*/
|
||||
.loginicon{
|
||||
left:5px;
|
||||
top:5px;
|
||||
color:var(--primarycolor);
|
||||
}
|
||||
|
||||
/*登录页面的背景色*/
|
||||
.bg-login{width:100%;height:100%;overflow:hidden;background:var(--primarycolor);}
|
||||
|
||||
/*左侧菜单颜色控制*/
|
||||
.left-menu .menu-slidedown li a:hover{background:var(--primarycolor);opacity:0.2;}
|
||||
.left-menu .menu-slidedown li.hover{background:var(--primarycolor);opacity:0.7;}
|
||||
|
||||
/*导航菜单的颜色,包括二级菜单*/
|
||||
.top-menu .menutwo{display:none;position: absolute;left:-10px;top:28px;z-index:99;background:var(--primarycolor);opacity:0.9;font-size:14px; border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;}
|
||||
.top-menu .menutwo a{color:#fff;display:block;height:40px;line-height:40px;width:120px;text-align:center;border-bottom:1px solid rgba(255,255,255,0.3);}
|
||||
.top-menu .menutwo a:hover{background:var(--primarycolor);opacity:0.8;}
|
||||
|
||||
/**未知**/
|
||||
.slide-carousel .indicator-list a.selected {
|
||||
border-color: #fff;
|
||||
background-color: var(--primarycolor);
|
||||
}
|
||||
.ui-widget-header { border-bottom: 1px solid var(--primarycolor); color: #ffffff; font-weight: bold; }
|
||||
|
||||
/*监测点*/
|
||||
.right-arr,.left-arr{position: absolute;font-size:30px;color:var(--primarycolor);cursor: pointer;background:rgba(0,0,0,0.2);}
|
||||
|
||||
/*datatables导出按钮*/
|
||||
button.dt-button:focus:not(.disabled),
|
||||
div.dt-button:focus:not(.disabled),
|
||||
a.dt-button:focus:not(.disabled) {
|
||||
border: 1px solid #426c9e;
|
||||
text-shadow: 0 1px 0 #c4def1;
|
||||
outline: none;
|
||||
background-color: var(--primarycolor);
|
||||
/* Fallback */
|
||||
background-image: -webkit-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||
background-image: -moz-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* FF3.6 */
|
||||
background-image: -ms-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* IE10 */
|
||||
background-image: -o-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Opera 11.10+ */
|
||||
background-image: linear-gradient(to bottom, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='var(--primarycolor)', EndColorStr='var(--primarycolor)');
|
||||
}
|
||||
div.dt-button-collection button.dt-button:active:not(.disabled), div.dt-button-collection button.dt-button.active:not(.disabled),
|
||||
div.dt-button-collection div.dt-button:active:not(.disabled),
|
||||
div.dt-button-collection div.dt-button.active:not(.disabled),
|
||||
div.dt-button-collection a.dt-button:active:not(.disabled),
|
||||
div.dt-button-collection a.dt-button.active:not(.disabled) {
|
||||
background-color: var(--primarycolor);
|
||||
/* Fallback */
|
||||
background-image: -webkit-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||
background-image: -moz-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* FF3.6 */
|
||||
background-image: -ms-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* IE10 */
|
||||
background-image: -o-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Opera 11.10+ */
|
||||
background-image: linear-gradient(to bottom, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='var(--primarycolor)', EndColorStr='var(--primarycolor)');
|
||||
box-shadow: inset 1px 1px 3px #666;
|
||||
}
|
||||
button.dt-button:hover:not(.disabled),
|
||||
div.dt-button:hover:not(.disabled),
|
||||
a.dt-button:hover:not(.disabled) {
|
||||
border: 1px solid #666;
|
||||
background-color: var(--primarycolor);
|
||||
/* Fallback */
|
||||
background-image: -webkit-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Chrome 10+, Saf5.1+, iOS 5+ */
|
||||
background-image: -moz-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* FF3.6 */
|
||||
background-image: -ms-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* IE10 */
|
||||
background-image: -o-linear-gradient(top, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
/* Opera 11.10+ */
|
||||
|
||||
background-image: linear-gradient(to bottom, var(--primarycolor) 0%, var(--primarycolor) 100%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='var(--primarycolor)', EndColorStr='var(--primarycolor)');
|
||||
}
|
||||
|
||||
/*稳态趋势对比图表颜色*/
|
||||
.historyA{
|
||||
color: var(--primarycolor);
|
||||
}
|
||||
|
||||
/*开关的背景色*/
|
||||
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
|
||||
color: #fff;
|
||||
background: var(--primarycolor);
|
||||
}
|
||||
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.active, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.disabled, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:active, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:focus, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:hover, .bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary[disabled], .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.active, .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.disabled, .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active, .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:focus, .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:hover, .bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary[disabled] {
|
||||
color: #fff;
|
||||
background-color: var(--primarycolor);
|
||||
}
|
||||
|
||||
|
||||
.bg65{
|
||||
background-color: var(--primarycolor);
|
||||
}
|
||||
|
||||
.menu{
|
||||
margin-top: -3px;
|
||||
}
|
||||
6763
sso/src/main/webapp/css/plugin/bootstrap/bootstrap.css
vendored
Normal file
6
sso/src/main/webapp/css/plugin/bootstrap/bootstrap.min.css
vendored
Normal file
@@ -0,0 +1,194 @@
|
||||
table.dataTable {
|
||||
clear: both;
|
||||
margin-top: 6px !important;
|
||||
margin-bottom: 6px !important;
|
||||
max-width: none !important;
|
||||
border-collapse: separate !important;
|
||||
}
|
||||
table.dataTable td,
|
||||
table.dataTable th {
|
||||
-webkit-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
table.dataTable td.dataTables_empty,
|
||||
table.dataTable th.dataTables_empty {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable.nowrap th,
|
||||
table.dataTable.nowrap td {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
div.dataTables_wrapper div.dataTables_length label {
|
||||
font-weight: normal;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_length select {
|
||||
width: 75px;
|
||||
display: inline-block;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_filter {
|
||||
text-align: right;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_filter label {
|
||||
font-size:14px;
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
text-align: left;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_filter input {
|
||||
margin-left: 0.5em;
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_info {
|
||||
padding-top: 0.85em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_paginate {
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
|
||||
margin: 2px 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
div.dataTables_wrapper div.dataTables_processing {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 200px;
|
||||
margin-left: -100px;
|
||||
margin-top: -26px;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
}
|
||||
|
||||
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
|
||||
table.dataTable thead > tr > td.sorting_asc,
|
||||
table.dataTable thead > tr > td.sorting_desc,
|
||||
table.dataTable thead > tr > td.sorting {
|
||||
padding-right: 30px;
|
||||
}
|
||||
table.dataTable thead > tr > th:active,
|
||||
table.dataTable thead > tr > td:active {
|
||||
outline: none;
|
||||
}
|
||||
table.dataTable thead .sorting,
|
||||
table.dataTable thead .sorting_asc,
|
||||
table.dataTable thead .sorting_desc,
|
||||
table.dataTable thead .sorting_asc_disabled,
|
||||
table.dataTable thead .sorting_desc_disabled {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
}
|
||||
table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
|
||||
table.dataTable thead .sorting_asc:before,
|
||||
table.dataTable thead .sorting_asc:after,
|
||||
table.dataTable thead .sorting_desc:before,
|
||||
table.dataTable thead .sorting_desc:after,
|
||||
table.dataTable thead .sorting_asc_disabled:before,
|
||||
table.dataTable thead .sorting_asc_disabled:after,
|
||||
table.dataTable thead .sorting_desc_disabled:before,
|
||||
table.dataTable thead .sorting_desc_disabled:after {
|
||||
position: absolute;
|
||||
bottom: 0.9em;
|
||||
display: block;
|
||||
opacity: 0.3;
|
||||
}
|
||||
table.dataTable thead .sorting:before,
|
||||
table.dataTable thead .sorting_asc:before,
|
||||
table.dataTable thead .sorting_desc:before,
|
||||
table.dataTable thead .sorting_asc_disabled:before,
|
||||
table.dataTable thead .sorting_desc_disabled:before {
|
||||
right: 1em;
|
||||
content: "\2191";
|
||||
}
|
||||
table.dataTable thead .sorting:after,
|
||||
table.dataTable thead .sorting_asc:after,
|
||||
table.dataTable thead .sorting_desc:after,
|
||||
table.dataTable thead .sorting_asc_disabled:after,
|
||||
table.dataTable thead .sorting_desc_disabled:after {
|
||||
right: 0.5em;
|
||||
content: "\2193";
|
||||
}
|
||||
table.dataTable thead .sorting_asc:before,
|
||||
table.dataTable thead .sorting_desc:after {
|
||||
opacity: 1;
|
||||
}
|
||||
table.dataTable thead .sorting_asc_disabled:before,
|
||||
table.dataTable thead .sorting_desc_disabled:after {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
div.dataTables_scrollHead table.dataTable {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
div.dataTables_scrollBody table {
|
||||
border-top: none;
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
div.dataTables_scrollBody table thead .sorting:after,
|
||||
div.dataTables_scrollBody table thead .sorting_asc:after,
|
||||
div.dataTables_scrollBody table thead .sorting_desc:after {
|
||||
display: none;
|
||||
}
|
||||
div.dataTables_scrollBody table tbody tr:first-child th,
|
||||
div.dataTables_scrollBody table tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
div.dataTables_scrollFoot table {
|
||||
margin-top: 0 !important;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
div.dataTables_wrapper div.dataTables_length,
|
||||
div.dataTables_wrapper div.dataTables_filter,
|
||||
div.dataTables_wrapper div.dataTables_info,
|
||||
div.dataTables_wrapper div.dataTables_paginate {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
table.dataTable.table-condensed > thead > tr > th {
|
||||
padding-right: 20px;
|
||||
}
|
||||
table.dataTable.table-condensed .sorting:after,
|
||||
table.dataTable.table-condensed .sorting_asc:after,
|
||||
table.dataTable.table-condensed .sorting_desc:after {
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
}
|
||||
|
||||
table.table-bordered.dataTable th,
|
||||
table.table-bordered.dataTable td {
|
||||
border-left-width: 0;
|
||||
}
|
||||
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
|
||||
table.table-bordered.dataTable td:last-child,
|
||||
table.table-bordered.dataTable td:last-child {
|
||||
border-right-width: 0;
|
||||
}
|
||||
table.table-bordered.dataTable tbody th,
|
||||
table.table-bordered.dataTable tbody td {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
|
||||
div.dataTables_scrollHead table.table-bordered {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
|
||||
div.table-responsive > div.dataTables_wrapper > div.row {
|
||||
margin: 0;
|
||||
}
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
41
sso/src/main/webapp/css/plugin/iconfont/iconfont.css
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
@font-face {font-family: "iconfont";
|
||||
src: url('iconfont.eot?t=1494037489450'); /* IE9*/
|
||||
src: url('iconfont.eot?t=1494037489450#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('iconfont.woff?t=1494037489450') format('woff'), /* chrome, firefox */
|
||||
url('iconfont.ttf?t=1494037489450') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
|
||||
url('iconfont.svg?t=1494037489450#iconfont') format('svg'); /* iOS 4.1- */
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family:"iconfont" !important;
|
||||
font-size:16px;
|
||||
font-style:normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-ditu:before { content: "\e601"; }
|
||||
|
||||
.icon-mima:before { content: "\e736"; }
|
||||
|
||||
.icon-caidan:before { content: "\e639"; }
|
||||
|
||||
.icon-8fuzhi:before { content: "\e603"; }
|
||||
|
||||
.icon-jiance:before { content: "\e678"; }
|
||||
|
||||
.icon-ren:before { content: "\e6e7"; }
|
||||
|
||||
.icon-baojing:before { content: "\e630"; }
|
||||
|
||||
.icon-yanzhengma:before { content: "\e64a"; }
|
||||
|
||||
.icon-xitong:before { content: "\e624"; }
|
||||
|
||||
.icon-tongji:before { content: "\e623"; }
|
||||
|
||||
.icon-yichang:before { content: "\e660"; }
|
||||
|
||||
.icon-shouye:before { content: "\e600"; }
|
||||
|
||||
BIN
sso/src/main/webapp/css/plugin/iconfont/iconfont.eot
Normal file
79
sso/src/main/webapp/css/plugin/iconfont/iconfont.svg
Normal file
@@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
Created by FontForge 20120731 at Sat May 6 10:24:49 2017
|
||||
By admin
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="iconfont" horiz-adv-x="1024" >
|
||||
<font-face
|
||||
font-family="iconfont"
|
||||
font-weight="500"
|
||||
font-stretch="normal"
|
||||
units-per-em="1024"
|
||||
panose-1="2 0 6 3 0 0 0 0 0 0"
|
||||
ascent="896"
|
||||
descent="-128"
|
||||
x-height="792"
|
||||
bbox="1.07692 -164 1023.08 896"
|
||||
underline-thickness="0"
|
||||
underline-position="0"
|
||||
unicode-range="U+0078-E736"
|
||||
/>
|
||||
<missing-glyph
|
||||
/>
|
||||
<glyph glyph-name=".notdef"
|
||||
/>
|
||||
<glyph glyph-name=".notdef"
|
||||
/>
|
||||
<glyph glyph-name=".null" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"
|
||||
/>
|
||||
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
|
||||
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
|
||||
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
|
||||
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
|
||||
<glyph glyph-name="ditu" unicode=""
|
||||
d="M931 696l-181 42q-11 3 -20 -2l-212 -97l-195 82q-12 4 -23 0l-210 -82q-19 -8 -19 -28v-577q0 -16 13 -25t28 -3l199 77l196 -81q5 -3 11 -3q7 0 13 3l16 7l-27 55l-2 -1l-195 81q-6 2 -12 2t-11 -2l-169 -65v511l180 70l196 -82q12 -5 24 0l215 99l147 -34v-514l-28 6
|
||||
l-15 -29q-3 -8 -7 -15l-1 -1l-5 -11l80 -18q14 -3 25.5 6t11.5 23v577q0 11 -6.5 19t-16.5 10zM299 582v-366q0 -5 3.5 -8.5t8.5 -3.5t8.5 3.5t3.5 8.5v366q0 5 -3.5 8.5t-8.5 3.5t-8.5 -3.5t-3.5 -8.5zM506 511v-184q0 -5 3.5 -8.5t8.5 -3.5t9 3.5t4 8.5v184q0 5 -4 8.5
|
||||
t-9 3.5t-8.5 -3.5t-3.5 -8.5zM759 385v223q0 5 -3.5 8.5t-8.5 3.5t-8.5 -3.5t-3.5 -8.5v-223q0 -5 3.5 -8.5t8.5 -3.5t8.5 3.5t3.5 8.5zM674.5 327q-59.5 0 -101.5 -42t-42 -102q0 -38 19 -71v0l14 -28l27 -55l84 -169l114 230l10 22v0q9 16 14 35q5 18 5 36q0 60 -42 102
|
||||
t-101.5 42zM675 141q-25 0 -43 17.5t-18 42.5t18 42.5t43 17.5t42.5 -17.5t17.5 -42.5t-17.5 -42.5t-42.5 -17.5z" />
|
||||
<glyph glyph-name="mima" unicode=""
|
||||
d="M760 371v103q0 5 -0.5 14t-5 34t-13 48t-26.5 50.5t-42.5 47.5t-64.5 34t-89.5 14t-89.5 -13.5t-64.5 -34.5t-42.5 -47t-26 -51.5t-13 -47t-6 -34.5v-14v-103h-104v-484h691v484h-104zM553 104v-113h-69v113q-34 20 -34 59q0 29 20 49.5t48.5 20.5t49 -20.5t20.5 -49.5
|
||||
q0 -39 -35 -59zM691 371h-345v103q0 14 2 29.5t12.5 43t27.5 48t51 36.5t79.5 16t80 -16t51.5 -36.5t27 -48t12 -43t2 -29.5v-103z" />
|
||||
<glyph glyph-name="caidan" unicode=""
|
||||
d="M553 460h171v-171h-171v171zM553 247h171v-171h-171v171zM321 247h171v-171h-171v171zM274 294h218v218h-218v-218zM308 478h150v-149h-150v149zM798 659h-572q-30 0 -52 -22t-22 -52v-569q0 -31 22 -53t52 -22h572q30 0 52 22t22 53v569q0 30 -22 52t-52 22zM827 16
|
||||
q0 -13 -8.5 -21.5t-20.5 -8.5h-572q-12 0 -20.5 8.5t-8.5 21.5v569q0 12 8.5 20.5t20.5 8.5h572q12 0 20.5 -8.5t8.5 -20.5v-569z" />
|
||||
<glyph glyph-name="8fuzhi" unicode=""
|
||||
d="M672 690q1 -7 1 -14v-313q0 -62 -44 -105.5t-106 -43.5t-106 43.5t-44 105.5v313q0 10 2 23q-134 -44 -219.5 -159.5t-85.5 -261.5q0 -90 35 -172t94 -141t141 -94t172 -35t172 35t141 94t94 141t35 172q0 139 -78 251.5t-204 160.5zM589 394q0 -29 -20.5 -49.5
|
||||
t-49.5 -20.5v0q-30 0 .5 20.5t-20.5 49.5v327q0 29 20.5 49.5t50.5 20.5v0q29 0 49.5 -20.5t20.5 -49.5v-327z" />
|
||||
<glyph glyph-name="jiance" unicode=""
|
||||
d="M506 519q-52 0 -89.5 -37t-37.5 -89.5t37.5 -89.5t89.5 -37t89.5 37t37.5 89.5t-37.5 89.5t-89.5 37zM506 323q-29 0 -49 20.5t-20 49t20 48.5t49 20t49 -20t20 -48.5t-20 -49t-49 -20.5zM923 421h-31q-5 63 -29 122q-30 69 -83.5 122.5t-122.5 83.5q-59 25 -122 29v31
|
||||
q0 12 -8.5 20.5t-20.5 8.5t-20.5 -8.5t-8.5 -20.5v-31q-63 -5 -122 -29q-69 -30 -122.5 -83.5t-83.5 -122.5q-24 -59 -29 -122h-31q-12 0 -20.5 -8.5t-8.5 -20.5t8.5 -20.5t20.5 -8.5h31q5 -63 29 -121q30 -70 83.5 -123.5t122.5 -82.5q59 -25 122 -30v-29q0 -12 8.5 -20.5
|
||||
t20.5 -8.5t20.5 8.5t8.5 20.5v29q63 5 122 30q69 29 122.5 82.5t83.5 123.5q24 58 29 121h31q12 0 20.5 8.5t8.5 20.5t-8.5 20.5t-20.5 8.5zM535 64v67q0 12 -8.5 20.5t-20.5 8.5t-20.5 -8.5t-8.5 -20.5v-67q-119 10 -204 95t-95 204h70q12 0 20.5 8.5t8.5 20.5t-8.5 20.5
|
||||
t-20.5 8.5h-70q10 119 95 204t204 95v-65q0 -11 8.5 -19.5t20.5 -8.5t20.5 8.5t8.5 19.5v65q119 -10 204 -95t95 -204h-70q-12 0 -20.5 -8.5t-8.5 -20.5t8.5 -20.5t20.5 -8.5h70q-10 -119 -95 -204t-204 -95z" />
|
||||
<glyph glyph-name="ren" unicode=""
|
||||
d="M520 853q-116 0 -198 -84t-82 -202.5t82 -203t198 -84.5t198 84.5t82 203t-82 202.5t-198 84v0v0zM939 -68q-8 111 -62 204.5t-141 149.5v0q-96 -78 -216 -78q-119 0 -216 78q-86 -56 -140.5 -149.5t-62.5 -204.5h838z" />
|
||||
<glyph glyph-name="baojing" unicode=""
|
||||
d="M827 188v314q0 126 -70 217.5t-186 111.5v26q0 16 -11.5 27.5t-27.5 11.5h-59q-10 0 -14.5 -5t-5 -11t-0.5 -18v-5v-26q-116 -20 -186 -112t-70 -217v-314l-157 -118v-40h944v40zM512 -127q41 0 79.5 38.5t38.5 79.5h-236q0 -41 38.5 -79.5t79.5 -38.5z" />
|
||||
<glyph glyph-name="yanzhengma" unicode=""
|
||||
d="M512 832q-82 -63 -169 -95.5t-212 -32.5v-331q0 -59 34.5 -135t87.5 -143t123.5 -113t135.5 -46t135.5 46t123.5 113t87.5 143t34.5 135v331q-126 0 -212.5 32.5t-168.5 95.5zM769 489l-273 -273q-1 -1 -3 -1t-4 1l-176 176q-1 2 -1 4t1 3l56 56q4 4 7 0l117 -117
|
||||
l213 214q4 3 7 0l56 -56q4 -3 0 -7z" />
|
||||
<glyph glyph-name="xitong" unicode=""
|
||||
d="M985 462h-46q-16 0 -31 10.5t-19 25.5l-27 66q-8 14 -5 31.5t14 29.5l33 33q12 11 12 27.5t-12 27.5l-55 55q-11 11 -27 11t-28 -11l-33 -33q-11 -12 -29.5 -14.5t-32.5 4.5l-65 27q-15 5 -25.5 19.5t-10.5 30.5v46q0 16 -11.5 27.5t-27.5 11.5h-78q-16 0 -27.5 -11.5
|
||||
t-11.5 -27.5v-46q0 -16 -10.5 -30.5t-25.5 -19.5l-65 -27q-14 -7 -32.5 -4.5t-29.5 14.5l-33 33q-12 11 -28 11t-27 -11l-55 -55q-12 -11 -12 -27.5t12 -27.5l33 -33q11 -12 14 -30t-5 -31l-27 -66q-4 -15 -19 -25.5t-31 -10.5h-47q-16 0 -27 -11.5t-11 -27.5v-78
|
||||
q0 -16 11 -27t27 -11h47q16 0 31 -11t19 -26l27 -65q8 -14 5 -32.5t-14 -29.5l-33 -33q-12 -12 -12 -28t12 -27l55 -55q11 -12 27 -12t28 12l33 33q11 11 29 14t32 -5l65 -27q15 -5 26 -19.5t11 -30.5v-47q0 -15 11.5 -26.5t27.5 -11.5h77q16 0 27.5 11.5t11.5 26.5v47
|
||||
q0 16 11 30.5t26 19.5l65 27q14 7 32 4.5t30 -13.5l33 -33q11 -12 27.5 -12t27.5 12l55 55q11 11 11 27t-11 28l-33 33q-12 11 -14.5 29.5t4.5 32.5l27 65q5 15 19.5 26t30.5 11h46q16 0 27.5 11t11.5 27v78q1 16 -10.5 27.5t-27.5 11.5zM714 384q0 -80 -56.5 -137t-137 -57
|
||||
t-137 57t-56.5 137t56.5 137t137 57t137 -57t56.5 -137z" />
|
||||
<glyph glyph-name="tongji" unicode="" horiz-adv-x="1042"
|
||||
d="M-15 47zM743 832h262v-894h-262v894zM383 385h262v-447h-262v447zM22 569h263v-631h-263v631zM1041 47z" />
|
||||
<glyph glyph-name="yichang" unicode=""
|
||||
d="M589 749q-4 4 -12 14.5t-11.5 14.5t-10.5 11t-12 10t-13.5 5t-17.5 2q-8 0 -15 -1.5t-14 -5.5t-11 -6.5t-11 -10.5t-8.5 -10l-9 -12t-8.5 -11l-409 -691q-36 -48 -20 -90q10 -38 71 -38h870q34 0 52.5 12.5t18.5 25.5q16 42 -20 90zM474 518q0 20 16 36t35 16
|
||||
q20 0 35.5 -14.5t15.5 -37.5v-236q0 -20 -16 -36t-35 -16t-35 16t-16 36v236zM525 64q-19 0 -35 16t-16 35t16 35t35 16t35 -16t16 -35q0 -23 -15.5 -37t-35.5 -14zM525 64z" />
|
||||
<glyph glyph-name="shouye" unicode=""
|
||||
d="M994 375l-469 438l-469 -437q-7 -7 -7 -16t6.5 -16t15.5 -7.5t16 6.5l438 408l438 -410q6 -6 15 -6v0v0q10 0 17 7q6 7 5.5 16.5t-6.5 16.5zM850.5 366q-9.5 0 -16 -7t-6.5 -16v-349h-182v243h-242v-243h-182v349q0 9 -6.5 16t-16 7t-16 -7t-6.5 -16v-394h272v242h152
|
||||
v-242h272v394q0 9 -6.5 16t-16 7zM692 691h136v-121q0 -9 6.5 -16t16 -7t16 7t6.5 16v167h-181q-10 0 -16.5 -7t-6.5 -16.5t6.5 -16t16.5 -6.5zM207 -15h210v232h203v-232h226v360h125l-446 423l-462 -417l142 -6z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
After Width: | Height: | Size: 7.8 KiB |
BIN
sso/src/main/webapp/css/plugin/iconfont/iconfont.ttf
Normal file
BIN
sso/src/main/webapp/css/plugin/iconfont/iconfont.woff
Normal file
BIN
sso/src/main/webapp/font/userDefined/maozedong.ttf
Normal file
BIN
sso/src/main/webapp/font/userDefined/zhengdao.ttf
Normal file
BIN
sso/src/main/webapp/images/error.png
Normal file
|
After Width: | Height: | Size: 772 B |
BIN
sso/src/main/webapp/images/favicon.ico
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
sso/src/main/webapp/images/img/error.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
sso/src/main/webapp/images/logo.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
sso/src/main/webapp/images/nffavicon.ico
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
sso/src/main/webapp/images/nflogo.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
sso/src/main/webapp/images/nfperson.png
Normal file
|
After Width: | Height: | Size: 523 B |
BIN
sso/src/main/webapp/images/nfpowerquality.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
sso/src/main/webapp/images/nfsystemManager.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
sso/src/main/webapp/images/nfvoltagedip.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
sso/src/main/webapp/images/person.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
sso/src/main/webapp/images/powerquality.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
sso/src/main/webapp/images/system.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
sso/src/main/webapp/images/systemManager.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
sso/src/main/webapp/images/voltagedip.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
24
sso/src/main/webapp/js/color.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/*波形图三相以及触发点颜色定义*/
|
||||
var yellow="#DAA520";/*A相*/
|
||||
var green="#2E8B57";/*B相*/
|
||||
var red="#A52a2a";/*C相*/
|
||||
var grey="#696969";/*灰色 暂降触发点、停运状态*/
|
||||
var blue="#87CEEB";/*在线率*/
|
||||
var orange="#FF7E50";/*单柱状图*/
|
||||
var canvasBG="#F9F9F9";//画布背景色
|
||||
var white="#FFF";
|
||||
var purple="#800080";/*柱状图中字体的颜色*/
|
||||
var lightgray="#CCC";/*浅灰色*/
|
||||
var dackRed="#A0522D";/*深红色*/
|
||||
var ITICTop='#FF7E50';/*ITIC曲线的上限、F47曲线的分割线*/
|
||||
var ITICBottom='#00E3E3';/*ITIC曲线的下限*/
|
||||
|
||||
var guowang="#006565";/*国网绿*/
|
||||
var nanwang="#003078";/*南网蓝*/
|
||||
|
||||
var noMonitor="#CCC";
|
||||
var noData="#808080";
|
||||
|
||||
|
||||
|
||||
var barMax="30";/*柱状图最大宽度*/
|
||||
21
sso/src/main/webapp/js/ie10-viewport-bug-workaround.js
Normal file
@@ -0,0 +1,21 @@
|
||||
/*!
|
||||
* IE10 viewport hack for Surface/desktop Windows 8 bug
|
||||
* Copyright 2014-2015 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/
|
||||
|
||||
// See the Getting Started docs for more information:
|
||||
// http://getbootstrap.com/getting-started/#support-ie10-width
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
|
||||
var msViewportStyle = document.createElement('style');
|
||||
msViewportStyle.appendChild(
|
||||
document.createTextNode(
|
||||
'@-ms-viewport{width:auto!important}'
|
||||
)
|
||||
);
|
||||
document.querySelector('head').appendChild(msViewportStyle);
|
||||
}
|
||||
})();
|
||||
6
sso/src/main/webapp/js/particleground.all.js
Normal file
1974
sso/src/main/webapp/js/plugin/bootstrap/bootstrap-datetimepicker.js
vendored
Normal file
16
sso/src/main/webapp/js/plugin/bootstrap/bootstrap-datetimepicker.zh-CN.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Simplified Chinese translation for bootstrap-datetimepicker
|
||||
* Yuan Cheung <advanimal@gmail.com>
|
||||
*/
|
||||
;(function($){
|
||||
$.fn.datetimepicker.dates['zh-CN'] = {
|
||||
days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
|
||||
daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
|
||||
daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
|
||||
months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
|
||||
monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
|
||||
today: "今天",
|
||||
suffix: [],
|
||||
meridiem: ["上午", "下午"]
|
||||
};
|
||||
}(jQuery));
|
||||
7
sso/src/main/webapp/js/plugin/bootstrap/bootstrap.min.js
vendored
Normal file
468
sso/src/main/webapp/js/plugin/jquery/jquery.cleverTabs.js
Normal file
@@ -0,0 +1,468 @@
|
||||
/* jQuery iFrame Tabs Plugin
|
||||
* Version: 0.5.01
|
||||
* Author: think8848
|
||||
* Contact: QQ: 166156888 Blog: http://think8848.cnblogs.com
|
||||
* Company: http://www.cleversoft.com */
|
||||
;
|
||||
$.fn.cleverTabs = function (options) {
|
||||
var self = this;
|
||||
var options = $.extend({
|
||||
setupContextMenu: true
|
||||
}, options || {});
|
||||
var tabs = new CleverTabs(self, options);
|
||||
if (options.setupContextMenu) {
|
||||
tabs.setupContextMenu();
|
||||
}
|
||||
return tabs;
|
||||
};
|
||||
|
||||
//定义CleverTabs对象
|
||||
function CleverTabs(self, options) {
|
||||
var self = self;
|
||||
this.hashtable = new Array();
|
||||
this.options = $.extend({
|
||||
//锁定Tab,不允许关闭
|
||||
lock: false,
|
||||
//禁止选中Tab
|
||||
disable: false,
|
||||
//每个Tab是否生成关闭按钮
|
||||
close: false,
|
||||
//当只有一个Tab页面时是否锁定该Tab
|
||||
lockOnlyOne: true,
|
||||
//Tab用于显示Panel的容器
|
||||
panelContainer: (function () {
|
||||
var tick = new Date().getTime();
|
||||
var panelElement = $('<div id="cleverTabsPanelContainer' + tick + '"></div>');
|
||||
self.append(panelElement);
|
||||
return panelElement;
|
||||
})(),
|
||||
//Tab用于控制的头模板
|
||||
tabHeaderTemplate: '<li id="cleverTabHeaderItem-#{id}" class="#{liclass}"><a href="#" title="#{title}">#{label}</a></li>',
|
||||
//Tab用于显示的Panel模板
|
||||
//add by sw scrolling = "no" overflow:hidden 禁止iframe出滚动
|
||||
tabPanelTemplate: '<div id="cleverTabPanelItem-#{id}" style="height: 100%;"><iframe frameBorder="0" style="width: 100%; display: inline; height: 100%; " src="#{src}" ></iframe></div>',
|
||||
//Tab唯一id生成器
|
||||
uidGenerator: function () {
|
||||
return new Date().getTime();
|
||||
}
|
||||
|
||||
}, options || {});
|
||||
|
||||
self.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
|
||||
this.wrapper = self;
|
||||
var el = self.find('ol,ul').eq(0);
|
||||
this.element = el;
|
||||
this.element.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");
|
||||
var pc = this.options.panelContainer;
|
||||
this.panelContainer = pc;
|
||||
if (!this.panelContainer.hasClass('ui-tabs')) {
|
||||
this.panelContainer.addClass('ui-tabs');
|
||||
}
|
||||
this.panelContainer.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");
|
||||
this.lockOnlyOne = this.options.lockOnlyOne;
|
||||
if (this instanceof CleverTabs) {
|
||||
CleverTabs.prototype.resizePanelContainer = function () {
|
||||
if (pc.attr('id').indexOf('cleverTabsPanelContainer') === 0) {
|
||||
var height = self.height() - el.height() - 30;
|
||||
pc.css('height', Math.floor(height / self.height() * 100) + '%');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
//添加Tab
|
||||
CleverTabs.prototype.add = function (options) {
|
||||
var self = this;
|
||||
var uid = self.options.uidGenerator(self);
|
||||
|
||||
var options = $.extend({
|
||||
id: uid,
|
||||
url: '#',
|
||||
label: 'New Tab',
|
||||
closeRefresh: null,
|
||||
closeActivate: null,
|
||||
callback: function () {
|
||||
}
|
||||
}, options || {});
|
||||
|
||||
//验证指定Url的Tab是否已经开启,如果开启则激活它
|
||||
var exsitsTab = self.getTabByUrl(options.url);
|
||||
// alert(exsitsTab)
|
||||
if (exsitsTab) {
|
||||
// alert(2)
|
||||
if (!exsitsTab.activate()) {
|
||||
// alert(1)
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//生成Tab头
|
||||
var tabHeader = $(self.options.tabHeaderTemplate
|
||||
.replace(/#\{id\}/g, options.id)
|
||||
.replace(/#\{liclass\}/g, 'ui-state-default ui-corner-top')
|
||||
.replace(/#\{title\}/g, options.label)
|
||||
.replace(/#\{label\}/g, function () {
|
||||
//如果Tab的Label大于7个字符,则强制使其为前7个字符加'...'
|
||||
if (options.label.length > 7) {
|
||||
return options.label.substring(0, 7) + '...';
|
||||
}
|
||||
return options.label;
|
||||
}()));
|
||||
|
||||
//Tab头绑定click事件
|
||||
tabHeader.bind("click", function () {
|
||||
if (!$(this).hasClass('ui-state-disabled')) {
|
||||
tab.activate();
|
||||
}
|
||||
});
|
||||
|
||||
//Tab头绑定mouseover事件
|
||||
tabHeader.bind('mouseover', function () {
|
||||
if (!$(this).hasClass('ui-state-disabled')) {
|
||||
$(this).addClass('ui-state-hover');
|
||||
}
|
||||
});
|
||||
|
||||
//Tab头绑定mouseout事件
|
||||
tabHeader.bind('mouseout', function () {
|
||||
if (!$(this).hasClass('ui-state-disabled')) {
|
||||
$(this).removeClass('ui-state-hover');
|
||||
}
|
||||
});
|
||||
|
||||
//生成Tab显示面板
|
||||
var panel = $(self.options.tabPanelTemplate
|
||||
.replace(/#\{id\}/g, options.id)
|
||||
.replace(/#\{src\}/g, options.url.toLowerCase()));
|
||||
|
||||
self.element.append(tabHeader);
|
||||
|
||||
//没有办法的办法,因为无法使iframe自动"撑大"外面的div,所在只能在这里计算生成的Tab页面容器的高度,
|
||||
//注意,如果style属性还设置了除height之外的样式,则需要修改这里的代码,自求多福吧
|
||||
//ps: 可以使用https://github.com/aaronmanela外的jQuery.iframe.auto.height插件做到“撑大”外层的div
|
||||
//但是不能支持跨域访问,虽然这不是大问题,但是我没有采用这个方法
|
||||
if (self.panelContainer.attr('id').indexOf('cleverTabsPanelContainer') === 0) {
|
||||
var height = self.wrapper.height() - self.element.height() - 5;
|
||||
self.panelContainer.css('height', Math.floor(height / self.wrapper.height() * 100) + '%');
|
||||
$(window).bind('resize', function () {
|
||||
var height = self.wrapper.height() - self.element.height() - 5;
|
||||
self.panelContainer.css('height', Math.floor(height / self.wrapper.height() * 100) + '%');
|
||||
})
|
||||
}
|
||||
|
||||
self.panelContainer.append(panel);
|
||||
self.hashtable[options.id] = {
|
||||
'callback': options.callback,
|
||||
'closerefresh': options.closeRefresh,
|
||||
'closeactivate': options.closeActivate,
|
||||
'orgLock': options.lock
|
||||
};
|
||||
var tab = new CleverTab(self, options.id);
|
||||
tab.setLock(options.locked);
|
||||
tab.activate();
|
||||
return tab;
|
||||
};
|
||||
//为Tab安装右键菜单
|
||||
CleverTabs.prototype.setupContextMenu = function () {
|
||||
var self = this;
|
||||
var contextMenu;
|
||||
if (!self.options.contextMenu) {
|
||||
contextMenu = {
|
||||
element: $('<ul id="cleverTabsContextMenu">'
|
||||
/*+ '<li id="mnuEnabl" ><a href="#enabled"><span class="ui-icon ui-icon-pencil" style="float: left; margin-right: 5px;"></span>启用</a></li>'
|
||||
+ '<li id="mnuDisalb"><a href="#disable"><span class="ui-icon ui-icon-cancel" style="float: left; margin-right: 5px;"></span>禁用</a></li>'*/
|
||||
+ '<li id="mnuLock" ><a href="#lock"><span class="ui-icon ui-icon-locked" style="float: left; margin-right: 5px;"></span>锁住</a></li>'
|
||||
+ '<li id="mnuUnlock"><a href="#unlock"><span class="ui-icon ui-icon-unlocked" style="float: left; margin-right: 5px;"></span>解锁</a></li>'
|
||||
+ '<li id="mnuRefresh" ><a href="#refresh"><span class="ui-icon ui-icon-refresh" style="float: left; margin-right: 5px;"></span>刷新</a></li>'
|
||||
+ '<li id="mnuCloseAll"><a href="#clear"><span class="ui-icon ui-icon-closethick" style="float: left; margin-right: 5px;"></span>关闭所有</a></li>'
|
||||
+ '</ul>'),
|
||||
handler: function (action, el, pos) {
|
||||
var tab = self.getCurrentTab();
|
||||
switch (action) {
|
||||
case 'enabled':
|
||||
tab.setDisable(false);
|
||||
break;
|
||||
case 'disable':
|
||||
tab.setDisable(true);
|
||||
break;
|
||||
case 'lock':
|
||||
tab.setLock(true);
|
||||
break;
|
||||
case 'unlock':
|
||||
tab.setLock(false);
|
||||
break;
|
||||
case 'refresh':
|
||||
tab.refresh();
|
||||
break;
|
||||
case 'clear':
|
||||
tabs.clear();
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
var menu = contextMenu.element;
|
||||
self.wrapper.parent().append(menu);
|
||||
self.element.contextMenu(
|
||||
{menu: menu.attr('id')}, contextMenu.handler);
|
||||
}
|
||||
//获取当前选中的Tab的唯一Id
|
||||
CleverTabs.prototype.getCurrentUniqueId = function () {
|
||||
var self = this;
|
||||
if (self.element.find(' > li').size() > 0) {
|
||||
var current = self.element.find('li.ui-tabs-selected');
|
||||
return current.size() > 0 ? CleverTab.getUniqueByHeaderId(current.attr('id')) : null;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
//获取当前选中的Tab
|
||||
CleverTabs.prototype.getCurrentTab = function () {
|
||||
var self = this;
|
||||
var uid = self.getCurrentUniqueId();
|
||||
return uid ? new CleverTab(self, self.getCurrentUniqueId()) : null;
|
||||
}
|
||||
//获取指定Url的Tab
|
||||
CleverTabs.prototype.getTabByUrl = function (url) {
|
||||
if (!url) {
|
||||
return null;
|
||||
}
|
||||
var index=url.indexOf("?");
|
||||
if(index>0){
|
||||
url=url.substring(0,index);
|
||||
}
|
||||
var self = this;
|
||||
var frames = self.panelContainer.find('div[id^="cleverTabPanelItem-"]>iframe');
|
||||
var tab;
|
||||
for (i = 0; i < frames.size(); i++) {
|
||||
var frame = $(frames[i]);
|
||||
var src = frame.attr('src');
|
||||
if (src.indexOf('clever_tabs_time_stamp=') > 0) {
|
||||
src = src.substring(0, src.indexOf('clever_tabs_time_stamp=') - 1);
|
||||
}
|
||||
var srcindex=src.indexOf("?");
|
||||
if(srcindex>0){
|
||||
src=src.substring(0,srcindex);
|
||||
}
|
||||
if (src == url.toLowerCase()) {
|
||||
tab = new CleverTab(self, CleverTab.getUniqueByPanelId(frame.parent('div:first').attr('id')));
|
||||
}
|
||||
}
|
||||
return tab;
|
||||
}
|
||||
//清除所有Tab页面
|
||||
CleverTabs.prototype.clear = function () {
|
||||
var self = this;
|
||||
var lis = self.element.find('>li');
|
||||
var hasLock = self.element.find('span.ui-icon-locked').size() > 0;
|
||||
for (i = self.lockOnlyOne && !hasLock ? 1 : 0; i < lis.size(); i++) {
|
||||
var id = CleverTab.getUniqueByHeaderId(lis.eq(i).attr('id'));
|
||||
var tab = new CleverTab(self, id);
|
||||
tab.kill();
|
||||
}
|
||||
}
|
||||
|
||||
//定义Tab页面类
|
||||
function CleverTab(tabs, id) {
|
||||
//Tab控件
|
||||
this.tabs = tabs;
|
||||
//Tab页面Id
|
||||
this.id = id
|
||||
//Tab页面头
|
||||
this.header = this.tabs.element.find('li#' + CleverTab.getFullHeaderId(id));
|
||||
this.headerId = this.header.attr('id');
|
||||
//Tab页面是否可激活
|
||||
this.disable = this.header.hasClass('ui-state-disabled');
|
||||
//Tab页面是否锁定(不允许关闭)
|
||||
this.lock = this.header.find('span.ui-icon-locked').size() != 0;
|
||||
//Tab页面有于显示内容的面板
|
||||
this.panel = tabs.panelContainer.find('div#' + CleverTab.getFullPanelId(id));
|
||||
//Tab页面id
|
||||
this.panelId = this.panel.attr('id');
|
||||
//Tab标题
|
||||
this.label = (this.header ? this.header.find('a:first').attr('title') : null);
|
||||
//Tab中iframe的url
|
||||
this.url = (this.panel ? this.panel.find(' > iframe:first').attr('src') : null);
|
||||
//Tab关闭时的回调函数
|
||||
this.callback = this.tabs.hashtable[id].callback;
|
||||
//当关闭Tab时需要刷新的Tab的url
|
||||
this.closeRefresh = this.tabs.hashtable[id].closeRefresh;
|
||||
//当关闭当前Tab时需要激活的Tab的url
|
||||
this.closeActivate = this.tabs.hashtable[id].closeActivate;
|
||||
//该属性和CleverTabs.lockOnlyOne有关
|
||||
this.orgLock = this.tabs.hashtable[id].orgLock;
|
||||
};
|
||||
//使Tab页面处于未激活状态,不建议在代码中使用
|
||||
CleverTab.prototype.deactivate = function () {
|
||||
var self = this;
|
||||
self.header.removeClass('ui-tabs-selected ui-state-active');
|
||||
self.panel.addClass('ui-tabs-hide');
|
||||
|
||||
if (self.tabs.lockOnlyOne && !self.tabs.hashtable[self.id].orgLock && self.tabs.element.find('>li').size() > 1) {
|
||||
self.setLock(false);
|
||||
}
|
||||
}
|
||||
//使Tab页面处于激活状态
|
||||
CleverTab.prototype.activate = function () {
|
||||
var self = this;
|
||||
|
||||
/*if ($.browser.msie) {
|
||||
self.header.find('a').trigger('blur');
|
||||
}*/
|
||||
|
||||
if (self.disable) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var currentTab = self.tabs.getCurrentTab();
|
||||
if (currentTab) {
|
||||
if (currentTab.id == self.id) {
|
||||
return false;
|
||||
}
|
||||
|
||||
currentTab.deactivate();
|
||||
}
|
||||
|
||||
self.header.addClass('ui-tabs-selected ui-state-active');
|
||||
self.panel.removeClass('ui-tabs-hide');
|
||||
|
||||
if (self.tabs.lockOnlyOne && self.tabs.element.find('>li').size() == 1) {
|
||||
self.setLock(true, false);
|
||||
}
|
||||
}
|
||||
//获取该Tab之前的Tab
|
||||
CleverTab.prototype.prevTab = function () {
|
||||
var self = this;
|
||||
var prev = self.header.prev();
|
||||
if (prev.size() > 0) {
|
||||
var headerId = prev.attr('id');
|
||||
return new CleverTab(tabs, CleverTab.getUniqueByHeaderId(headerId));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
//获取该Tab之后的Tab
|
||||
CleverTab.prototype.nextTab = function () {
|
||||
var self = this;
|
||||
var next = self.header.next();
|
||||
if (next.size() > 0) {
|
||||
var headerId = next.attr('id');
|
||||
return new CleverTab(tabs, CleverTab.getUniqueByHeaderId(headerId));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
//移移该Tab
|
||||
CleverTab.prototype.kill = function () {
|
||||
var self = this;
|
||||
if (self.lock) {
|
||||
return;
|
||||
}
|
||||
var nextTab = self.nextTab();
|
||||
if (!nextTab) {
|
||||
nextTab = self.prevTab();
|
||||
}
|
||||
var callback = self.callback;
|
||||
var refresh = self.closeRefresh;
|
||||
var activate = self.closeActivate;
|
||||
self.header.remove();
|
||||
self.panel.remove();
|
||||
delete self.tabs.hashtable[self.id];
|
||||
if (self.tabs.panelContainer.attr('id').indexOf('cleverTabsPanelContainer') === 0) {
|
||||
var height = self.tabs.wrapper.height() - self.tabs.element.height();
|
||||
self.tabs.panelContainer.css('height', Math.floor(height / self.tabs.wrapper.height() * 100) + '%');
|
||||
}
|
||||
var refreshTab = self.tabs.getTabByUrl(refresh);
|
||||
if (refreshTab) {
|
||||
refreshTab.refresh();
|
||||
}
|
||||
var activateTab = self.tabs.getTabByUrl(activate);
|
||||
if (activateTab) {
|
||||
activateTab.activate();
|
||||
} else {
|
||||
if (nextTab) {
|
||||
nextTab.activate();
|
||||
}
|
||||
}
|
||||
callback();
|
||||
}
|
||||
//刷新该Tab的iframe中的内容
|
||||
CleverTab.prototype.refresh = function () {
|
||||
var self = this;
|
||||
if (self.url.indexOf('clever_tabs_time_stamp=') > 0) {
|
||||
self.url = self.url.substring(0, self.url.indexOf('clever_tabs_time_stamp=') - 1);
|
||||
}
|
||||
var newUrl = self.url.concat(self.url.indexOf('?') < 0 ? '?' : '&').concat('clever_tabs_time_stamp=').concat(new Date().getTime());
|
||||
self.panel.find(' > iframe:first').attr('src', newUrl);
|
||||
}
|
||||
//设置该Tab的disabled属性
|
||||
CleverTab.prototype.setDisable = function (disable) {
|
||||
var self = this;
|
||||
if (disable) {
|
||||
self.header.addClass('ui-state-disabled');
|
||||
var overlay = $('<div class="ui-widget-overlay"></div>');
|
||||
self.panel.append(overlay);
|
||||
this.setLock(true);
|
||||
} else {
|
||||
self.header.removeClass('ui-state-disabled');
|
||||
var overlay = self.panel.find('div.ui-widget-overlay:first');
|
||||
overlay.remove();
|
||||
if (self.tabs.lockOnlyOne && self.tabs.element.find('>li').size() == 1) {
|
||||
return;
|
||||
}
|
||||
this.setLock();
|
||||
}
|
||||
}
|
||||
//设置该Tab的locked属性
|
||||
CleverTab.prototype.setLock = function (lock, changeOrgLock) {
|
||||
var self = this;
|
||||
var changeOrgLock = changeOrgLock == undefined || changeOrgLock;
|
||||
if (changeOrgLock) {
|
||||
self.tabs.hashtable[self.id].orgLock = lock;
|
||||
}
|
||||
if (self.lock == lock) {
|
||||
return;
|
||||
}
|
||||
if (!lock && self.tabs.lockOnlyOne && self.tabs.element.find('>li').size() == 1) {
|
||||
return;
|
||||
}
|
||||
if (!lock) {
|
||||
var btnLock = this.header.find('span.ui-icon-locked');
|
||||
if (btnLock.size() > 0) {
|
||||
btnLock.remove();
|
||||
}
|
||||
var btnClose = $('<a href="javascript:void(0)" class="ui-corner-all" title="Close" style="position: absolute; cursor: pointer; padding: 0px; top: 1px; right: 1px"><span class="ui-icon ui-icon-close"></span></a>');
|
||||
this.header.append(btnClose);
|
||||
btnClose.bind('mouseover', function () {
|
||||
$(this).addClass('ui-state-active');
|
||||
});
|
||||
btnClose.bind('mouseout', function () {
|
||||
$(this).removeClass('ui-state-active');
|
||||
});
|
||||
btnClose.bind('click', function () {
|
||||
new CleverTab(self.tabs, self.id).kill();
|
||||
});
|
||||
} else {
|
||||
var btnClose = this.header.find('span.ui-icon-close').parent('a:first');
|
||||
if (btnClose.size() > 0) {
|
||||
btnClose.remove();
|
||||
}
|
||||
this.header.append($('<span class="ui-icon ui-icon-locked"></span>'));
|
||||
}
|
||||
}
|
||||
//获取指定Tab头完全id的唯一id
|
||||
CleverTab.getUniqueByHeaderId = function (id) {
|
||||
return id.replace('cleverTabHeaderItem-', '');
|
||||
}
|
||||
//获取指定Tab页面完全id的唯一id
|
||||
CleverTab.getUniqueByPanelId = function (id) {
|
||||
return id.replace('cleverTabPanelItem-', '');
|
||||
}
|
||||
//获取指定Tab头唯一id的完全id
|
||||
CleverTab.getFullHeaderId = function (uid) {
|
||||
return 'cleverTabHeaderItem-'.concat(uid);
|
||||
}
|
||||
//获取指定Tab页面唯一id的完全id
|
||||
CleverTab.getFullPanelId = function (uid) {
|
||||
return 'cleverTabPanelItem-'.concat(uid);
|
||||
}
|
||||
230
sso/src/main/webapp/js/plugin/jquery/jquery.contextMenu.js
Normal file
@@ -0,0 +1,230 @@
|
||||
// jQuery Context Menu Plugin
|
||||
//
|
||||
// Version 1.01
|
||||
//
|
||||
// Cory S.N. LaViska
|
||||
// A Beautiful Site (http://abeautifulsite.net/)
|
||||
//
|
||||
// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
|
||||
//
|
||||
// Terms of Use
|
||||
//
|
||||
// This plugin is dual-licensed under the GNU General Public License
|
||||
// and the MIT License and is copyright A Beautiful Site, LLC.
|
||||
//
|
||||
;
|
||||
|
||||
if (jQuery) (function () {
|
||||
$.extend($.fn, {
|
||||
|
||||
contextMenu: function (o, callback) {
|
||||
var cleverContextMenu = {
|
||||
'position': 'absolute',
|
||||
'z-index': '99999',
|
||||
'display': 'none'
|
||||
};
|
||||
// Defaults
|
||||
if (o.menu == undefined) return false;
|
||||
if (o.inSpeed == undefined) o.inSpeed = 150;
|
||||
if (o.outSpeed == undefined) o.outSpeed = 75;
|
||||
// 0 needs to be -1 for expected results (no fade)
|
||||
if (o.inSpeed == 0) o.inSpeed = -1;
|
||||
if (o.outSpeed == 0) o.outSpeed = -1;
|
||||
// Loop each context menu
|
||||
$(this).each(function () {
|
||||
var el = $(this);
|
||||
var offset = $(el).offset();
|
||||
// Add contextMenu class
|
||||
$('#' + o.menu).addClass('cleverContextMenu ui-menu ui-widget ui-widget-content ui-corner-all');
|
||||
$('#' + o.menu).css(cleverContextMenu);
|
||||
$('#' + o.menu).find('>li').each(function () { $(this).addClass('ui-menu-item'); });
|
||||
$('#' + o.menu).find('>li a').each(function () { $(this).addClass('ui-corner-all'); });
|
||||
// Simulate a true right click
|
||||
$(this).mousedown(function (e) {
|
||||
var evt = e;
|
||||
evt.stopPropagation();
|
||||
$(this).mouseup(function (e) {
|
||||
e.stopPropagation();
|
||||
var srcElement = $(this);
|
||||
$(this).unbind('mouseup');
|
||||
if (evt.button == 2) {
|
||||
// Hide context menus that may be showing
|
||||
$(".cleverContextMenu").hide();
|
||||
// Get this context menu
|
||||
var menu = $('#' + o.menu);
|
||||
|
||||
if ($(el).hasClass('ui-state-disabled')) return false;
|
||||
|
||||
// Detect mouse position
|
||||
var d = {}, x, y;
|
||||
if (self.innerHeight) {
|
||||
d.pageYOffset = self.pageYOffset;
|
||||
d.pageXOffset = self.pageXOffset;
|
||||
d.innerHeight = self.innerHeight;
|
||||
d.innerWidth = self.innerWidth;
|
||||
} else if (document.documentElement &&
|
||||
document.documentElement.clientHeight) {
|
||||
d.pageYOffset = document.documentElement.scrollTop;
|
||||
d.pageXOffset = document.documentElement.scrollLeft;
|
||||
d.innerHeight = document.documentElement.clientHeight;
|
||||
d.innerWidth = document.documentElement.clientWidth;
|
||||
} else if (document.body) {
|
||||
d.pageYOffset = document.body.scrollTop;
|
||||
d.pageXOffset = document.body.scrollLeft;
|
||||
d.innerHeight = document.body.clientHeight;
|
||||
d.innerWidth = document.body.clientWidth;
|
||||
}
|
||||
(e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
|
||||
(e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
|
||||
|
||||
// Show the menu
|
||||
$(document).unbind('click');
|
||||
$(menu).find('a').removeClass('ui-state-hover');
|
||||
$(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);
|
||||
var ul = $(menu);
|
||||
ul.outerWidth(ul.outerWidth() + 2);
|
||||
// Hover events
|
||||
$(menu).find('>li a').mouseover(function () {
|
||||
$(this).addClass('ui-state-hover');
|
||||
}).mouseout(function () {
|
||||
$(this).removeClass('ui-state-hover');
|
||||
});
|
||||
|
||||
// Keyboard
|
||||
$(document).keyup(function (e) {
|
||||
var keynum;
|
||||
if ($.browser.msie) {
|
||||
keynum = e.keyCode;
|
||||
}
|
||||
else if (e.which) {
|
||||
keynum = e.which;
|
||||
}
|
||||
switch (keynum) {
|
||||
case 38: // up
|
||||
if ($(menu).find('>li a.ui-state-hover:first').size() == 0) {
|
||||
$(menu).find('>li:last a:first').addClass('ui-state-hover');
|
||||
} else {
|
||||
$(menu).find('>li a.ui-state-hover:first').removeClass('ui-state-hover').parent().prevAll('li:not(.ui-state-disabled)').eq(0).find('>a:first').addClass('ui-state-hover');
|
||||
if ($(menu).find('>li a.ui-state-hover:first').size() == 0) $(menu).find('>li:last a:first').addClass('ui-state-hover');
|
||||
}
|
||||
break;
|
||||
case 40: // down
|
||||
if ($(menu).find('>li a.ui-state-hover:first').size() == 0) {
|
||||
$(menu).find('>li:first a:first').addClass('ui-state-hover');
|
||||
} else {
|
||||
$(menu).find('>li a.ui-state-hover:first').removeClass('ui-state-hover').parent().nextAll('LI:not(.ui-state-disabled)').eq(0).find('a:first').addClass('ui-state-hover');
|
||||
if ($(menu).find('>li a.ui-state-hover:first').size() == 0) $(menu).find('>li:first a:first').addClass('ui-state-hover');
|
||||
}
|
||||
break;
|
||||
case 13: // enter
|
||||
$(menu).find('>li a.ui-state-hover:first').trigger('click');
|
||||
break;
|
||||
case 27: // esc
|
||||
$(document).trigger('click');
|
||||
break
|
||||
}
|
||||
});
|
||||
|
||||
// When items are selected
|
||||
$('#' + o.menu).find('>li').unbind('click');
|
||||
$('#' + o.menu).find('>li:not(.ui-state-disabled)').click(function () {
|
||||
$(document).unbind('click').unbind('keyup');
|
||||
$(".cleverContextMenu").hide();
|
||||
// Callback
|
||||
if (callback) callback($(this).find('>a:first').attr('href').substr(1), $(srcElement), { x: x - offset.left, y: y - offset.top, docX: x, docY: y });
|
||||
return false;
|
||||
});
|
||||
|
||||
// Hide bindings
|
||||
setTimeout(function () { // Delay for Mozilla
|
||||
$(document).click(function () {
|
||||
$(document).unbind('click').unbind('keyup');
|
||||
$(menu).fadeOut(o.outSpeed);
|
||||
return false;
|
||||
});
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Disable text selection
|
||||
/*if ($.browser.mozilla) {
|
||||
$('#' + o.menu).each(function () { $(this).css('ui-state-disabled'); });
|
||||
} else if ($.browser.msie) {
|
||||
$('#' + o.menu).each(function () { $(this).bind('selectstart.disableTextSelect', function () { return false; }); });
|
||||
} else {
|
||||
$('#' + o.menu).each(function () { $(this).bind('mousedown.disableTextSelect', function () { return false; }); });
|
||||
}*/
|
||||
// Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
|
||||
$(el).add($('ul.cleverContextMenu')).bind('contextmenu', function () { return false; });
|
||||
|
||||
});
|
||||
return $(this);
|
||||
},
|
||||
|
||||
// Disable context menu items on the fly
|
||||
disableContextMenuItems: function (o) {
|
||||
if (o == undefined) {
|
||||
// Disable all
|
||||
$(this).find('>li').addClass('ui-state-disabled');
|
||||
return ($(this));
|
||||
}
|
||||
$(this).each(function () {
|
||||
if (o != undefined) {
|
||||
var d = o.split(',');
|
||||
for (var i = 0; i < d.length; i++) {
|
||||
$(this).find('a[href="' + d[i] + '"]').parent().addClass('ui-state-disabled');
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
return ($(this));
|
||||
},
|
||||
|
||||
// Enable context menu items on the fly
|
||||
enableContextMenuItems: function (o) {
|
||||
if (o == undefined) {
|
||||
// Enable all
|
||||
$(this).find('>li.ui-state-disabled').removeClass('ui-state-disabled');
|
||||
return ($(this));
|
||||
}
|
||||
$(this).each(function () {
|
||||
if (o != undefined) {
|
||||
var d = o.split(',');
|
||||
for (var i = 0; i < d.length; i++) {
|
||||
$(this).find('a[href="' + d[i] + '"]').parent().removeClass('ui-state-disabled');
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
return ($(this));
|
||||
},
|
||||
|
||||
// Disable context menu(s)
|
||||
disableContextMenu: function () {
|
||||
$(this).each(function () {
|
||||
$(this).addClass('ui-state-disabled');
|
||||
});
|
||||
return ($(this));
|
||||
},
|
||||
|
||||
// Enable context menu(s)
|
||||
enableContextMenu: function () {
|
||||
$(this).each(function () {
|
||||
$(this).removeClass('ui-state-disabled');
|
||||
});
|
||||
return ($(this));
|
||||
},
|
||||
|
||||
// Destroy context menu(s)
|
||||
destroyContextMenu: function () {
|
||||
// Destroy specified context menus
|
||||
$(this).each(function () {
|
||||
// Disable action
|
||||
$(this).unbind('mousedown').unbind('mouseup');
|
||||
});
|
||||
return ($(this));
|
||||
}
|
||||
|
||||
});
|
||||
})(jQuery);
|
||||
15278
sso/src/main/webapp/js/plugin/jquery/jquery.dataTables.js
vendored
Normal file
5
sso/src/main/webapp/js/plugin/jquery/jquery.min.js
vendored
Normal file
3624
sso/src/main/webapp/js/plugin/layui/css/layui.css
Normal file
191
sso/src/main/webapp/js/plugin/layui/css/layui.mobile.css
Normal file
@@ -0,0 +1,191 @@
|
||||
/**
|
||||
|
||||
@Name: layui mobile
|
||||
@Author: 贤心
|
||||
@Site: http://www.layui.com/mobile/
|
||||
|
||||
*/
|
||||
|
||||
/* reset */
|
||||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,legend{margin:0; padding:0; -webkit-tap-highlight-color:rgba(0,0,0,0)}
|
||||
html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif; -ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}
|
||||
a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);}
|
||||
a{text-decoration: none; background:transparent}
|
||||
a:active,a:hover{outline:0}
|
||||
table{border-collapse:collapse;border-spacing:0}
|
||||
li{list-style:none;}
|
||||
b,strong{font-weight:700;}
|
||||
h1, h2, h3, h4, h5, h6{font-weight:500;}
|
||||
address,cite,dfn,em,var{font-style:normal;}
|
||||
dfn{font-style:italic}
|
||||
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
|
||||
img{border:0; vertical-align: bottom}
|
||||
button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0; outline: 0;}
|
||||
button,select{text-transform:none}
|
||||
select{-webkit-appearance: none; border:none;}
|
||||
input{line-height:normal; }
|
||||
input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}
|
||||
input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}
|
||||
input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
|
||||
input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}
|
||||
label,input{vertical-align: middle;}
|
||||
|
||||
|
||||
/** 图标字体 **/
|
||||
@font-face {font-family: 'layui-icon';
|
||||
src: url('../font/iconfont.eot?v=1.0.7');
|
||||
src: url('../font/iconfont.eot?v=1.0.7#iefix') format('embedded-opentype'),
|
||||
url('../font/iconfont.woff?v=1.0.7') format('woff'),
|
||||
url('../font/iconfont.ttf?v=1.0.7') format('truetype'),
|
||||
url('../font/iconfont.svg?v=1.0.7#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.layui-icon{
|
||||
font-family:"layui-icon" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
|
||||
/** 基础通用 **/
|
||||
/* 消除第三方ui可能造成的冲突 */.layui-box, .layui-box *{-webkit-box-sizing: content-box !important; -moz-box-sizing: content-box !important; box-sizing: content-box !important;}
|
||||
.layui-border-box, .layui-border-box *{-webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
|
||||
.layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;}
|
||||
/* 三角形 */.layui-edge{position: absolute; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden;}
|
||||
/* 单行溢出省略 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
|
||||
/* 屏蔽选中 */.layui-unselect{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
|
||||
.layui-disabled,.layui-disabled:active{background-color: #d2d2d2 !important; color: #fff !important; cursor: not-allowed !important;}
|
||||
/* 纯圆角 */.layui-circle{border-radius: 100%;}
|
||||
.layui-show{display: block !important;}
|
||||
.layui-hide{display: none !important;}
|
||||
|
||||
|
||||
.layui-upload-iframe{position: absolute; width: 0px; height: 0px; border: 0px; visibility: hidden;}
|
||||
.layui-upload-enter{border: 1px solid #009E94; background-color: #009E94; color: #fff; -webkit-transform: scale(1.1); transform: scale(1.1);}
|
||||
|
||||
|
||||
/* 弹出动画 */
|
||||
@-webkit-keyframes layui-m-anim-scale { /* 默认 */
|
||||
0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
|
||||
100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
|
||||
}
|
||||
@keyframes layui-m-anim-scale { /* 由小到大 */
|
||||
0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
|
||||
100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
|
||||
}
|
||||
.layui-m-anim-scale{animation-name: layui-m-anim-scale; -webkit-animation-name: layui-m-anim-scale;}
|
||||
|
||||
@-webkit-keyframes layui-m-anim-up{ /* 从下往上 */
|
||||
0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)}
|
||||
100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)}
|
||||
}
|
||||
@keyframes layui-m-anim-up{
|
||||
0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)}
|
||||
100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)}
|
||||
}
|
||||
.layui-m-anim-up{-webkit-animation-name: layui-m-anim-up; animation-name: layui-m-anim-up}
|
||||
|
||||
@-webkit-keyframes layui-m-anim-left{ /* 从右往左 */
|
||||
0%{-webkit-transform: translateX(100%); transform: translateX(100%)}
|
||||
100%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
}
|
||||
@keyframes layui-m-anim-left{
|
||||
0%{-webkit-transform: translateX(100%); transform: translateX(100%)}
|
||||
100%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
}
|
||||
.layui-m-anim-left{-webkit-animation-name: layui-m-anim-left; animation-name: layui-m-anim-left}
|
||||
|
||||
@-webkit-keyframes layui-m-anim-right{ /* 从左往右 */
|
||||
0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
|
||||
100%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
}
|
||||
@keyframes layui-m-anim-right{
|
||||
0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
|
||||
100%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
}
|
||||
.layui-m-anim-right{-webkit-animation-name: layui-m-anim-right; animation-name: layui-m-anim-right}
|
||||
|
||||
@-webkit-keyframes layui-m-anim-lout{ /* 往左收缩 */
|
||||
0%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
|
||||
}
|
||||
@keyframes layui-m-anim-lout{
|
||||
0%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
|
||||
}
|
||||
.layui-m-anim-lout{-webkit-animation-name: layui-m-anim-lout; animation-name: layui-m-anim-lout}
|
||||
|
||||
@-webkit-keyframes layui-m-anim-rout{ /* 往右收缩 */
|
||||
0%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
100%{-webkit-transform: translateX(100%); transform: translateX(100%)}
|
||||
}
|
||||
@keyframes layui-m-anim-rout{
|
||||
0%{-webkit-transform: translateX(0); transform: translateX(0)}
|
||||
100%{-webkit-transform: translateX(100%); transform: translateX(100%)}
|
||||
}
|
||||
.layui-m-anim-rout{-webkit-animation-name: layui-m-anim-rout; animation-name: layui-m-anim-rout}
|
||||
|
||||
|
||||
/** layer mobile */
|
||||
.layui-m-layer{position:relative; z-index: 19891014;}
|
||||
.layui-m-layer *{-webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box;}
|
||||
.layui-m-layershade,
|
||||
.layui-m-layermain{position:fixed; left:0; top:0; width:100%; height:100%;}
|
||||
.layui-m-layershade{background-color:rgba(0,0,0, .7); pointer-events:auto;}
|
||||
.layui-m-layermain{display:table; font-family: Helvetica, arial, sans-serif; pointer-events: none;}
|
||||
.layui-m-layermain .layui-m-layersection{display:table-cell; vertical-align:middle; text-align:center;}
|
||||
.layui-m-layerchild{position:relative; display:inline-block; text-align:left; background-color:#fff; font-size:14px; border-radius: 5px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); pointer-events:auto; -webkit-overflow-scrolling: touch;}
|
||||
.layui-m-layerchild{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: .2s; animation-duration: .2s;}
|
||||
|
||||
.layui-m-layer0 .layui-m-layerchild{width: 90%; max-width: 640px;}
|
||||
.layui-m-layer1 .layui-m-layerchild{border:none; border-radius:0;}
|
||||
.layui-m-layer2 .layui-m-layerchild{width:auto; max-width:260px; min-width:40px; border:none; background: none; box-shadow: none; color:#fff;}
|
||||
.layui-m-layerchild h3{padding: 0 10px; height: 60px; line-height: 60px; font-size:16px; font-weight: 400; border-radius: 5px 5px 0 0; text-align: center;}
|
||||
.layui-m-layerchild h3,
|
||||
.layui-m-layerbtn span{ text-overflow:ellipsis; overflow:hidden; white-space:nowrap;}
|
||||
.layui-m-layercont{padding: 50px 30px; line-height: 22px; text-align:center;}
|
||||
.layui-m-layer1 .layui-m-layercont{padding:0; text-align:left;}
|
||||
.layui-m-layer2 .layui-m-layercont{text-align:center; padding: 0; line-height: 0;}
|
||||
.layui-m-layer2 .layui-m-layercont i{width:25px; height:25px; margin-left:8px; display:inline-block; background-color:#fff; border-radius:100%;}
|
||||
.layui-m-layer2 .layui-m-layercont p{margin-top: 20px;}
|
||||
|
||||
/* loading */
|
||||
@-webkit-keyframes layui-m-anim-loading{
|
||||
0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)}
|
||||
40%{transform:scale(1); -webkit-transform:scale(1)}
|
||||
}
|
||||
@keyframes layui-m-anim-loading{
|
||||
0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)}
|
||||
40%{transform:scale(1); -webkit-transform:scale(1)}
|
||||
}
|
||||
.layui-m-layer2 .layui-m-layercont i{-webkit-animation: layui-m-anim-loading 1.4s infinite ease-in-out; animation: layui-m-anim-loading 1.4s infinite ease-in-out; -webkit-animation-fill-mode: both; animation-fill-mode: both;}
|
||||
|
||||
.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0; -webkit-animation-delay: -.32s; animation-delay: -.32s;}
|
||||
.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay: -.16s; animation-delay: -.16s;}
|
||||
.layui-m-layer2 .layui-m-layercont>div{line-height:22px; padding-top:7px; margin-bottom:20px; font-size: 14px;}
|
||||
.layui-m-layerbtn{display: box; display: -moz-box; display: -webkit-box; width: 100%; position:relative; height: 50px; line-height: 50px; font-size: 0; text-align:center; border-top:1px solid #D0D0D0; background-color: #F2F2F2; border-radius: 0 0 5px 5px;}
|
||||
.layui-m-layerbtn span{position:relative; display: block; -moz-box-flex: 1; box-flex: 1; -webkit-box-flex: 1; text-align:center; font-size:14px; border-radius: 0 0 5px 5px; cursor:pointer;}
|
||||
.layui-m-layerbtn span[yes]{color: #40AFFE;}
|
||||
.layui-m-layerbtn span[no]{border-right: 1px solid #D0D0D0; border-radius: 0 0 0 5px;}
|
||||
.layui-m-layerbtn span:active{background-color: #F6F6F6;}
|
||||
.layui-m-layerend{position:absolute; right:7px; top:10px; width:30px; height:30px; border: 0; font-weight:400; background: transparent; cursor: pointer; -webkit-appearance: none; font-size:30px;}
|
||||
.layui-m-layerend::before, .layui-m-layerend::after{position:absolute; left:5px; top:15px; content:''; width:18px; height:1px; background-color:#999; transform:rotate(45deg); -webkit-transform:rotate(45deg); border-radius: 3px;}
|
||||
.layui-m-layerend::after{transform:rotate(-45deg); -webkit-transform:rotate(-45deg);}
|
||||
|
||||
/* 底部对话框风格 */
|
||||
body .layui-m-layer .layui-m-layer-footer{position: fixed; width: 95%; max-width: 100%; margin: 0 auto; left:0; right: 0; bottom: 10px; background: none;}
|
||||
.layui-m-layer-footer .layui-m-layercont{padding: 20px; border-radius: 5px 5px 0 0; background-color: rgba(255,255,255,.8);}
|
||||
.layui-m-layer-footer .layui-m-layerbtn{display: block; height: auto; background: none; border-top: none;}
|
||||
.layui-m-layer-footer .layui-m-layerbtn span{background-color: rgba(255,255,255,.8);}
|
||||
.layui-m-layer-footer .layui-m-layerbtn span[no]{color: #FD482C; border-top: 1px solid #c2c2c2; border-radius: 0 0 5px 5px;}
|
||||
.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top: 10px; border-radius: 5px;}
|
||||
|
||||
/* 通用提示 */
|
||||
body .layui-m-layer .layui-m-layer-msg{width: auto; max-width: 90%; margin: 0 auto; bottom: -150px; background-color: rgba(0,0,0,.7); color: #fff;}
|
||||
.layui-m-layer-msg .layui-m-layercont{padding: 10px 20px;}
|
||||
|
||||
|
||||
|
||||
|
||||
23
sso/src/main/webapp/js/plugin/layui/css/modules/code.css
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
|
||||
@Name: layui.code
|
||||
@Author: 贤心
|
||||
@Site: http://www.layui.com
|
||||
|
||||
*/
|
||||
|
||||
/* 加载就绪标志 */
|
||||
html #layuicss-skincodecss{display:none; position: absolute; width:1989px;}
|
||||
|
||||
/* 默认风格 */
|
||||
.layui-code-view{display: block; position: relative; margin: 10px 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}
|
||||
.layui-code-h3{position: relative; padding: 0 10px; height: 32px; line-height: 32px; border-bottom: 1px solid #e2e2e2; font-size: 12px;}
|
||||
.layui-code-h3 a{position: absolute; right: 10px; top: 0; color: #999;}
|
||||
.layui-code-view .layui-code-ol{position: relative; overflow: auto;}
|
||||
.layui-code-view .layui-code-ol li{position: relative; margin-left: 45px; line-height: 20px; padding: 0 5px; border-left: 1px solid #e2e2e2; list-style-type: decimal-leading-zero; *list-style-type: decimal; background-color: #fff;}
|
||||
.layui-code-view pre{margin: 0;}
|
||||
|
||||
/* notepadd++风格 */
|
||||
.layui-code-notepad{border: 1px solid #0C0C0C; border-left-color: #3F3F3F; background-color: #0C0C0C; color: #C2BE9E}
|
||||
.layui-code-notepad .layui-code-h3{border-bottom: none;}
|
||||
.layui-code-notepad .layui-code-ol li{background-color: #3F3F3F; border-left: none;}
|
||||
@@ -0,0 +1,16 @@
|
||||
/** 图标字体 **/
|
||||
@font-face {font-family: 'laydate-icon';
|
||||
src: url('./font/iconfont.eot');
|
||||
src: url('./font/iconfont.eot#iefix') format('embedded-opentype'),
|
||||
url('./font/iconfont.svg#iconfont') format('svg'),
|
||||
url('./font/iconfont.woff') format('woff'),
|
||||
url('./font/iconfont.ttf') format('truetype');
|
||||
}
|
||||
|
||||
.laydate-icon{
|
||||
font-family:"laydate-icon" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/**
|
||||
|
||||
@Name: laydata
|
||||
@Author: 贤心
|
||||
|
||||
**/
|
||||
|
||||
|
||||
html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
|
||||
|
||||
/* 初始化 */
|
||||
.layui-laydate *{margin: 0; padding: 0;}
|
||||
|
||||
/* 主体结构 */
|
||||
.layui-laydate, .layui-laydate *{box-sizing: border-box;}
|
||||
.layui-laydate{position: absolute; z-index: 66666666; margin: 5px 0; border-radius: 2px; font-size: 14px; -webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;}
|
||||
.layui-laydate-main{width: 272px;}
|
||||
.layui-laydate-header *,
|
||||
.layui-laydate-content td,
|
||||
.layui-laydate-list li{transition-duration: .3s; -webkit-transition-duration: .3s;}
|
||||
|
||||
@-webkit-keyframes laydate-upbit{ /* 微微往上滑入 */
|
||||
from {-webkit-transform: translate3d(0, 20px, 0); opacity: 0.3;}
|
||||
to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;}
|
||||
}
|
||||
@keyframes laydate-upbit{
|
||||
from {transform: translate3d(0, 20px, 0); opacity: 0.3;}
|
||||
to {transform: translate3d(0, 0, 0); opacity: 1;}
|
||||
}
|
||||
.layui-laydate{-webkit-animation-name: laydate-upbit; animation-name: laydate-upbit;}
|
||||
.layui-laydate-static{ position: relative; z-index: 0; display: inline-block; margin: 0; -webkit-animation: none; animation: none;}
|
||||
|
||||
/* 展开年月列表时 */
|
||||
.laydate-ym-show .laydate-prev-m,
|
||||
.laydate-ym-show .laydate-next-m{display: none !important;}
|
||||
.laydate-ym-show .laydate-prev-y,
|
||||
.laydate-ym-show .laydate-next-y{display: inline-block !important;}
|
||||
.laydate-ym-show .laydate-set-ym span[lay-type="month"]{display: none !important;}
|
||||
|
||||
/* 展开时间列表时 */
|
||||
.laydate-time-show .layui-laydate-header .layui-icon,
|
||||
.laydate-time-show .laydate-set-ym span[lay-type="year"],
|
||||
.laydate-time-show .laydate-set-ym span[lay-type="month"]{display: none !important;}
|
||||
|
||||
/* 头部结构 */
|
||||
.layui-laydate-header{position: relative; line-height:30px; padding: 10px 70px 5px;}
|
||||
.layui-laydate-header *{display: inline-block; vertical-align: bottom;}
|
||||
.layui-laydate-header i{position: absolute; top: 10px; padding: 0 5px; color: #999; font-size: 18px; cursor: pointer;}
|
||||
.layui-laydate-header i.laydate-prev-y{left: 15px;}
|
||||
.layui-laydate-header i.laydate-prev-m{left: 45px;}
|
||||
.layui-laydate-header i.laydate-next-y{right: 15px;}
|
||||
.layui-laydate-header i.laydate-next-m{right: 45px;}
|
||||
.laydate-set-ym{width: 100%; text-align: center; box-sizing: border-box; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
|
||||
.laydate-set-ym span{padding: 0 5px; cursor: pointer;}
|
||||
.laydate-time-text{cursor: default !important;}
|
||||
|
||||
/* 主体结构 */
|
||||
.layui-laydate-content{position: relative; padding: 10px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
|
||||
.layui-laydate-content table{border-collapse: collapse; border-spacing: 0;}
|
||||
.layui-laydate-content th,
|
||||
.layui-laydate-content td{width: 36px; height: 30px; padding: 5px; text-align: center;}
|
||||
.layui-laydate-content th{font-weight: 400;}
|
||||
.layui-laydate-content td{position: relative; cursor: pointer;}
|
||||
.laydate-day-mark{position: absolute; left: 0; top: 0; width: 100%; height: 100%; line-height: 30px; font-size: 12px; overflow: hidden;}
|
||||
.laydate-day-mark::after{position: absolute; content:''; right: 2px; top: 2px; width: 5px; height: 5px; border-radius: 50%;}
|
||||
|
||||
/* 底部结构 */
|
||||
.layui-laydate-footer{position: relative; height: 46px; line-height: 26px; padding: 10px 20px;}
|
||||
.layui-laydate-footer span{margin-right: 15px; display: inline-block; cursor: pointer; font-size: 12px;}
|
||||
.layui-laydate-footer span:hover{color: #5FB878;}
|
||||
.laydate-footer-btns{position: absolute; right: 10px; top: 10px;}
|
||||
.laydate-footer-btns span{height: 26px; line-height: 26px; margin: 0 0 0 -1px; padding: 0 10px; border: 1px solid #C9C9C9; background-color: #fff; white-space: nowrap; vertical-align: top; border-radius: 2px;}
|
||||
|
||||
/* 年月列表 */
|
||||
.layui-laydate-list{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 10px; box-sizing: border-box; background-color: #fff;}
|
||||
.layui-laydate-list>li{position: relative; display: inline-block; width: 33.3%; height: 36px; line-height: 36px; margin: 3px 0; vertical-align: middle; text-align: center; cursor: pointer;}
|
||||
.laydate-month-list>li{width: 25%; margin: 17px 0;}
|
||||
.laydate-time-list{}
|
||||
.laydate-time-list>li{height: 100%; margin: 0; line-height: normal; cursor: default;}
|
||||
.laydate-time-list p{position: relative; top: -4px; line-height: 29px;}
|
||||
.laydate-time-list ol{height: 181px; overflow: hidden;}
|
||||
.laydate-time-list>li:hover ol{overflow-y: auto;}
|
||||
.laydate-time-list ol li{width: 130%; padding-left: 33px; line-height: 30px; text-align: left; cursor: pointer;}
|
||||
|
||||
/* 提示 */
|
||||
.layui-laydate-hint{position: absolute; top: 115px; left: 50%; width: 250px; margin-left: -125px; line-height: 20px; padding: 15px; text-align: center; font-size: 12px; color: #FF5722;}
|
||||
|
||||
|
||||
/* 双日历 */
|
||||
.layui-laydate-range{width: 546px;}
|
||||
.layui-laydate-range .layui-laydate-main{display: inline-block; vertical-align: middle;}
|
||||
.layui-laydate-range .laydate-main-list-0 .laydate-next-m,
|
||||
.layui-laydate-range .laydate-main-list-0 .laydate-next-y,
|
||||
.layui-laydate-range .laydate-main-list-1 .laydate-prev-y,
|
||||
.layui-laydate-range .laydate-main-list-1 .laydate-prev-m{display: none;}
|
||||
.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left: 1px solid #e2e2e2;}
|
||||
|
||||
|
||||
/* 默认简约主题 */
|
||||
.layui-laydate, .layui-laydate-hint{border: 1px solid #d2d2d2; box-shadow: 0 2px 4px rgba(0,0,0,.12); background-color: #fff; color: #666;}
|
||||
.layui-laydate-header{border-bottom: 1px solid #e2e2e2;}
|
||||
.layui-laydate-header i:hover,
|
||||
.layui-laydate-header span:hover{color: #5FB878;}
|
||||
.layui-laydate-content{border-top: none 0; border-bottom: none 0;}
|
||||
.layui-laydate-content th{color: #333;}
|
||||
.layui-laydate-content td{color: #666;}
|
||||
.layui-laydate-content td.laydate-selected{background-color: #00F7DE;}
|
||||
.laydate-selected:hover{background-color: #00F7DE !important;}
|
||||
.layui-laydate-content td:hover,
|
||||
.layui-laydate-list li:hover{background-color: #eaeaea; color: #333;}
|
||||
.laydate-time-list li ol{margin: 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 0;}
|
||||
.laydate-time-list li:first-child ol{border-left-width: 1px;}
|
||||
.laydate-time-list>li:hover{background: none;}
|
||||
.layui-laydate-content .laydate-day-prev,
|
||||
.layui-laydate-content .laydate-day-next{color: #d2d2d2;}
|
||||
.laydate-selected.laydate-day-prev,
|
||||
.laydate-selected.laydate-day-next{background-color: #f8f8f8 !important;}
|
||||
.layui-laydate-footer{border-top: 1px solid #e2e2e2;}
|
||||
.layui-laydate-hint{color: #FF5722;}
|
||||
.laydate-day-mark::after{background-color: #5FB878;}
|
||||
.layui-laydate-content td.layui-this .laydate-day-mark::after{display: none;}
|
||||
.layui-laydate-footer span[lay-type="date"]{color: #5FB878;}
|
||||
.layui-laydate .layui-this{background-color: #009688 !important; color: #fff !important;}
|
||||
.layui-laydate .laydate-disabled,
|
||||
.layui-laydate .laydate-disabled:hover{background:none !important; color: #d2d2d2 !important; cursor: not-allowed !important; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
|
||||
|
||||
/* 墨绿/自定义背景色主题 */
|
||||
.laydate-theme-molv{border: none;}
|
||||
.laydate-theme-molv.layui-laydate-range{width: 548px}
|
||||
.laydate-theme-molv .layui-laydate-main{width: 274px;}
|
||||
.laydate-theme-molv .layui-laydate-header{border: none; background-color: #009688;}
|
||||
.laydate-theme-molv .layui-laydate-header i,
|
||||
.laydate-theme-molv .layui-laydate-header span{color: #f6f6f6;}
|
||||
.laydate-theme-molv .layui-laydate-header i:hover,
|
||||
.laydate-theme-molv .layui-laydate-header span:hover{color: #fff;}
|
||||
.laydate-theme-molv .layui-laydate-content{border: 1px solid #e2e2e2; border-top: none; border-bottom: none;}
|
||||
.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left: none;}
|
||||
.laydate-theme-molv .layui-laydate-footer{border: 1px solid #e2e2e2;}
|
||||
|
||||
/* 格子主题 */
|
||||
.laydate-theme-grid .layui-laydate-content td,
|
||||
.laydate-theme-grid .layui-laydate-content thead,
|
||||
.laydate-theme-grid .laydate-year-list>li,
|
||||
.laydate-theme-grid .laydate-month-list>li{border: 1px solid #e2e2e2;}
|
||||
.laydate-theme-grid .laydate-selected,
|
||||
.laydate-theme-grid .laydate-selected:hover{background-color: #f2f2f2 !important; color: #009688 !important;}
|
||||
.laydate-theme-grid .laydate-selected.laydate-day-prev,
|
||||
.laydate-theme-grid .laydate-selected.laydate-day-next{color: #d2d2d2 !important;}
|
||||
.laydate-theme-grid .laydate-year-list,
|
||||
.laydate-theme-grid .laydate-month-list{margin: 1px 0 0 1px;}
|
||||
.laydate-theme-grid .laydate-year-list>li,
|
||||
.laydate-theme-grid .laydate-month-list>li{margin: 0 -1px -1px 0;}
|
||||
.laydate-theme-grid .laydate-year-list>li{height: 43px; line-height: 43px;}
|
||||
.laydate-theme-grid .laydate-month-list>li{height: 71px; line-height: 71px;}
|
||||
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,181 @@
|
||||
/**
|
||||
|
||||
@Name: layer
|
||||
@Author: 贤心
|
||||
|
||||
**/
|
||||
|
||||
/* *html{background-image: url(about:blank); background-attachment: fixed;} */
|
||||
html #layuicss-layer{display: none; position: absolute; width: 1989px;}
|
||||
|
||||
/* common */
|
||||
.layui-layer-shade, .layui-layer{position:fixed; _position:absolute; pointer-events: auto;}
|
||||
.layui-layer-shade{top:0; left:0; width:100%; height:100%; _height:expression(document.body.offsetHeight+"px");}
|
||||
.layui-layer{-webkit-overflow-scrolling: touch;}
|
||||
.layui-layer{top:150px; left: 0; margin:0; padding:0; background-color:#fff; -webkit-background-clip: content; border-radius: 2px; box-shadow: 1px 1px 50px rgba(0,0,0,.3);}
|
||||
.layui-layer-close{position:absolute;}
|
||||
.layui-layer-content{position:relative;}
|
||||
.layui-layer-border{border: 1px solid #B2B2B2; border: 1px solid rgba(0,0,0,.1); box-shadow: 1px 1px 5px rgba(0,0,0,.2);}
|
||||
.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat;}
|
||||
.layui-layer-ico{ background:url(icon.png) no-repeat;}
|
||||
.layui-layer-dialog .layui-layer-ico,
|
||||
.layui-layer-setwin a,
|
||||
.layui-layer-btn a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
|
||||
|
||||
.layui-layer-move{display: none; position: fixed; *position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; cursor: move; opacity: 0; filter:alpha(opacity=0); background-color: #fff; z-index: 2147483647;}
|
||||
.layui-layer-resize{position: absolute; width: 15px; height: 15px; right: 0; bottom: 0; cursor: se-resize;}
|
||||
|
||||
/* 动画 */
|
||||
.layer-anim{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.3s; animation-duration:.3s;}
|
||||
|
||||
@-webkit-keyframes layer-bounceIn { /* 默认 */
|
||||
0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
|
||||
100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
|
||||
}
|
||||
@keyframes layer-bounceIn {
|
||||
0% {opacity: 0; -webkit-transform: scale(.5); -ms-transform: scale(.5); transform: scale(.5)}
|
||||
100% {opacity: 1; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1)}
|
||||
}
|
||||
.layer-anim-00{-webkit-animation-name: layer-bounceIn;animation-name: layer-bounceIn}
|
||||
|
||||
@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}
|
||||
|
||||
@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}
|
||||
|
||||
@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}
|
||||
|
||||
@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);-ms-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}
|
||||
|
||||
@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}
|
||||
|
||||
@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}
|
||||
|
||||
/* 标题栏 */
|
||||
.layui-layer-title{padding:0 80px 0 20px; height:42px; line-height:42px; border-bottom:1px solid #eee; font-size:14px; color:#333; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; background-color: #F8F8F8; border-radius: 2px 2px 0 0;}
|
||||
.layui-layer-setwin{position:absolute; right:15px; *right:0; top:15px; font-size:0; line-height: initial;}
|
||||
.layui-layer-setwin a{position:relative; width: 16px; height:16px; margin-left:10px; font-size:12px; _overflow:hidden;}
|
||||
.layui-layer-setwin .layui-layer-min cite{position:absolute; width:14px; height:2px; left:0; top:50%; margin-top:-1px; background-color:#2E2D3C; cursor:pointer; _overflow:hidden;}
|
||||
.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA; }
|
||||
.layui-layer-setwin .layui-layer-max{background-position:-32px -40px;}
|
||||
.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px;}
|
||||
.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px;}
|
||||
.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px;}
|
||||
.layui-layer-setwin .layui-layer-close1{background-position: 1px -40px; cursor: pointer;}
|
||||
.layui-layer-setwin .layui-layer-close1:hover{opacity:0.7;}
|
||||
.layui-layer-setwin .layui-layer-close2{position:absolute; right:-28px; top:-28px; width:30px; height:30px; margin-left:0; background-position:-149px -31px; *right:-18px; _display:none;}
|
||||
.layui-layer-setwin .layui-layer-close2:hover{ background-position:-180px -31px;}
|
||||
|
||||
/* 按钮栏 */
|
||||
.layui-layer-btn{text-align: right; padding: 0 15px 12px; pointer-events: auto; user-select: none; -webkit-user-select: none;}
|
||||
.layui-layer-btn a{height: 28px; line-height: 28px; margin: 5px 5px 0; padding: 0 15px; border: 1px solid #dedede; background-color:#fff; color: #333; border-radius: 2px; font-weight:400; cursor:pointer; text-decoration: none;}
|
||||
.layui-layer-btn a:hover{opacity: 0.9; text-decoration: none;}
|
||||
.layui-layer-btn a:active{opacity: 0.8;}
|
||||
.layui-layer-btn .layui-layer-btn0{border-color: #1E9FFF; background-color: #1E9FFF; color:#fff;}
|
||||
.layui-layer-btn-l{text-align: left;}
|
||||
.layui-layer-btn-c{text-align: center;}
|
||||
|
||||
/* 定制化 */
|
||||
.layui-layer-dialog{min-width:260px;}
|
||||
.layui-layer-dialog .layui-layer-content{position: relative; padding:20px; line-height:24px; word-break: break-all; overflow:hidden; font-size:14px; overflow-x: hidden; overflow-y:auto;}
|
||||
.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute; top:16px; left:15px; _left:-40px; width:30px; height:30px;}
|
||||
.layui-layer-ico1{background-position:-30px 0 }
|
||||
.layui-layer-ico2{background-position:-60px 0;}
|
||||
.layui-layer-ico3{background-position:-90px 0;}
|
||||
.layui-layer-ico4{background-position:-120px 0;}
|
||||
.layui-layer-ico5{background-position:-150px 0;}
|
||||
.layui-layer-ico6{background-position:-180px 0;}
|
||||
.layui-layer-rim{border:6px solid #8D8D8D; border:6px solid rgba(0,0,0,.3); border-radius:5px; box-shadow: none;}
|
||||
.layui-layer-msg{min-width:180px; border:1px solid #D3D4D3; box-shadow: none;}
|
||||
.layui-layer-hui{min-width:100px; background-color: #000; filter:alpha(opacity=60); background-color: rgba(0,0,0,0.6); color: #fff; border:none;}
|
||||
.layui-layer-hui .layui-layer-content{padding:12px 25px; text-align:center;}
|
||||
.layui-layer-dialog .layui-layer-padding{padding: 20px 20px 20px 55px; text-align: left;}
|
||||
.layui-layer-page .layui-layer-content{position:relative; overflow:auto;}
|
||||
.layui-layer-page .layui-layer-btn,.layui-layer-iframe .layui-layer-btn{padding-top:10px;}
|
||||
.layui-layer-nobg{background:none;}
|
||||
.layui-layer-iframe iframe{display: block; width: 100%;}
|
||||
|
||||
.layui-layer-loading{border-radius:100%; background:none; box-shadow:none; border:none;}
|
||||
.layui-layer-loading .layui-layer-content{width:60px; height:24px; background:url(loading-0.gif) no-repeat;}
|
||||
.layui-layer-loading .layui-layer-loading1{width:37px; height:37px; background:url(loading-1.gif) no-repeat;}
|
||||
.layui-layer-loading .layui-layer-loading2, .layui-layer-ico16{width:32px; height:32px; background:url(loading-2.gif) no-repeat;}
|
||||
.layui-layer-tips{background: none; box-shadow:none; border:none;}
|
||||
.layui-layer-tips .layui-layer-content{position: relative; line-height: 22px; min-width: 12px; padding: 8px 15px; font-size: 12px; _float:left; border-radius: 2px; box-shadow: 1px 1px 3px rgba(0,0,0,.2); background-color: #000; color: #fff;}
|
||||
.layui-layer-tips .layui-layer-close{right:-2px; top:-1px;}
|
||||
.layui-layer-tips i.layui-layer-TipsG{ position:absolute; width:0; height:0; border-width:8px; border-color:transparent; border-style:dashed; *overflow:hidden;}
|
||||
.layui-layer-tips i.layui-layer-TipsT, .layui-layer-tips i.layui-layer-TipsB{left:5px; border-right-style:solid; border-right-color: #000;}
|
||||
.layui-layer-tips i.layui-layer-TipsT{bottom:-8px;}
|
||||
.layui-layer-tips i.layui-layer-TipsB{top:-8px;}
|
||||
.layui-layer-tips i.layui-layer-TipsR, .layui-layer-tips i.layui-layer-TipsL{top: 5px; border-bottom-style:solid; border-bottom-color: #000;}
|
||||
.layui-layer-tips i.layui-layer-TipsR{left:-8px;}
|
||||
.layui-layer-tips i.layui-layer-TipsL{right:-8px;}
|
||||
|
||||
/* skin */
|
||||
.layui-layer-lan[type="dialog"]{min-width:280px;}
|
||||
.layui-layer-lan .layui-layer-title{background:#4476A7; color:#fff; border: none;}
|
||||
.layui-layer-lan .layui-layer-btn{padding: 5px 10px 10px; text-align: right; border-top:1px solid #E9E7E7}
|
||||
.layui-layer-lan .layui-layer-btn a{background: #fff; border-color: #E9E7E7; color: #333;}
|
||||
.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5;}
|
||||
.layui-layer-molv .layui-layer-title{background: #009f95; color:#fff; border: none;}
|
||||
.layui-layer-molv .layui-layer-btn a{background: #009f95; border-color: #009f95;}
|
||||
.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1;}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@Name: layer拓展样式
|
||||
|
||||
*/
|
||||
|
||||
.layui-layer-iconext{background:url(icon-ext.png) no-repeat;}
|
||||
|
||||
/* prompt模式 */
|
||||
.layui-layer-prompt .layui-layer-input{display: block; width: 230px; height: 36px; margin: 0 auto; line-height: 30px; padding-left: 10px; border: 1px solid #e6e6e6; color: #333;}
|
||||
.layui-layer-prompt textarea.layui-layer-input{width: 300px; height: 100px; line-height: 20px; padding: 6px 10px;}
|
||||
.layui-layer-prompt .layui-layer-content{padding: 20px;}
|
||||
.layui-layer-prompt .layui-layer-btn{padding-top: 0;}
|
||||
|
||||
/* tab模式 */
|
||||
.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4);}
|
||||
.layui-layer-tab .layui-layer-title{padding-left:0; overflow: visible;}
|
||||
.layui-layer-tab .layui-layer-title span{position:relative; float:left; min-width:80px; max-width:260px; padding:0 20px; text-align:center; cursor:default; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; cursor: pointer;}
|
||||
.layui-layer-tab .layui-layer-title span.layui-this{height: 43px; border-left: 1px solid #eee; border-right: 1px solid #eee; background-color: #fff; z-index: 10;}
|
||||
.layui-layer-tab .layui-layer-title span:first-child{border-left:none;}
|
||||
.layui-layer-tabmain{line-height:24px; clear:both;}
|
||||
.layui-layer-tabmain .layui-layer-tabli{display:none;}
|
||||
.layui-layer-tabmain .layui-layer-tabli.layui-this{display: block;}
|
||||
|
||||
/* photo模式 */
|
||||
.layui-layer-photos{-webkit-animation-duration: .8s; animation-duration: .8s;}
|
||||
.layui-layer-photos .layui-layer-content{overflow:hidden; text-align: center;}
|
||||
.layui-layer-photos .layui-layer-phimg img{position: relative; width:100%; display: inline-block; *display:inline; *zoom:1; vertical-align:top;}
|
||||
.layui-layer-imguide,.layui-layer-imgbar{display:none;}
|
||||
.layui-layer-imgprev, .layui-layer-imgnext{position:absolute; top:50%; width:27px; _width:44px; height:44px; margin-top:-22px; outline:none;blr:expression(this.onFocus=this.blur());}
|
||||
.layui-layer-imgprev{left:10px; background-position:-5px -5px; _background-position:-70px -5px;}
|
||||
.layui-layer-imgprev:hover{background-position:-33px -5px; _background-position:-120px -5px;}
|
||||
.layui-layer-imgnext{right:10px; _right:8px; background-position:-5px -50px; _background-position:-70px -50px;}
|
||||
.layui-layer-imgnext:hover{background-position:-33px -50px; _background-position:-120px -50px;}
|
||||
.layui-layer-imgbar{position:absolute; left:0; bottom:0; width:100%; height:32px; line-height:32px; background-color:rgba(0,0,0,.8); background-color:#000\9; filter:Alpha(opacity=80); color:#fff; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size:0;}
|
||||
.layui-layer-imgtit{/*position:absolute; left:20px;*/}
|
||||
.layui-layer-imgtit *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
|
||||
.layui-layer-imgtit a{max-width:65%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; color:#fff;}
|
||||
.layui-layer-imgtit a:hover{color:#fff; text-decoration:underline;}
|
||||
.layui-layer-imgtit em{padding-left:10px; font-style: normal;}
|
||||
|
||||
/* 关闭动画 */
|
||||
@-webkit-keyframes layer-bounceOut {
|
||||
100% {opacity: 0; -webkit-transform: scale(.7); transform: scale(.7)}
|
||||
30% {-webkit-transform: scale(1.05); transform: scale(1.05)}
|
||||
0% {-webkit-transform: scale(1); transform: scale(1);}
|
||||
}
|
||||
@keyframes layer-bounceOut {
|
||||
100% {opacity: 0; -webkit-transform: scale(.7); -ms-transform: scale(.7); transform: scale(.7);}
|
||||
30% {-webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05);}
|
||||
0% {-webkit-transform: scale(1); -ms-transform: scale(1);transform: scale(1);}
|
||||
}
|
||||
.layer-anim-close{-webkit-animation-name: layer-bounceOut; animation-name: layer-bounceOut; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.2s; animation-duration:.2s;}
|
||||
|
||||
@media screen and (max-width: 1100px) {
|
||||
.layui-layer-iframe{overflow-y: auto; -webkit-overflow-scrolling: touch;}
|
||||
}
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 701 B |
|
After Width: | Height: | Size: 1.7 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/font/iconfont.eot
Normal file
459
sso/src/main/webapp/js/plugin/layui/font/iconfont.svg
Normal file
|
After Width: | Height: | Size: 231 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/font/iconfont.ttf
Normal file
BIN
sso/src/main/webapp/js/plugin/layui/font/iconfont.woff
Normal file
BIN
sso/src/main/webapp/js/plugin/layui/images/face/0.gif
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/1.gif
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/10.gif
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/11.gif
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/12.gif
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/13.gif
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/14.gif
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/15.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/16.gif
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/17.gif
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/18.gif
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/19.gif
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/2.gif
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/20.gif
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/21.gif
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/22.gif
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/23.gif
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/24.gif
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/25.gif
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/26.gif
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/27.gif
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/28.gif
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/29.gif
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/3.gif
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/30.gif
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/31.gif
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
sso/src/main/webapp/js/plugin/layui/images/face/32.gif
Normal file
|
After Width: | Height: | Size: 3.4 KiB |