初始化项目

This commit is contained in:
root
2024-04-01 09:20:31 +08:00
commit fefd704e6e
4694 changed files with 1869737 additions and 0 deletions

98
sso/pom.xml Normal file
View 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>

View 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";
}
}

View 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;
}
}

View 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);
}
}

View 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());
}
}
}

View 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=

View 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

View 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>

View File

@@ -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>

View File

@@ -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 &lt; #{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 &lt; #{endTime} order by UPDATETIME LIMIT 1 )
</delete>
</mapper>

View 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.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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View 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;
}

View 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"; }

Binary file not shown.

View 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="&#xe601;"
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="&#xe736;"
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="&#xe639;"
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="&#xe603;"
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="&#xe678;"
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="&#xe6e7;"
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="&#xe630;"
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="&#xe64a;"
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="&#xe624;"
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="&#xe623;" horiz-adv-x="1042"
d="M-15 47zM743 832h262v-894h-262v894zM383 385h262v-447h-262v447zM22 569h263v-631h-263v631zM1041 47z" />
<glyph glyph-name="yichang" unicode="&#xe660;"
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="&#xe600;"
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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View 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";/*柱状图最大宽度*/

View 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);
}
})();

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View 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));

File diff suppressed because one or more lines are too long

View 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);
}

View 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);

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View 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;}

View 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;}

View File

@@ -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;
}

View File

@@ -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;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -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;}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Some files were not shown because too many files have changed in this diff Show More