Commit 0cb77423 authored by 李良停's avatar 李良停

llt

parents
.class
.classpath
.project
.settings
/.idea/
*.jar
*.war
*.ear
*.iml
.idea_modules/
out/
build/
logs/
classes/
target/
.DS_Store
MANIFEST.MF
overlays/
.gitignore
.idea/vcs.xml
target/generated-sources/
target/readingdata-1.0-SNAPSHOT/META-INF/
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chineseall.readingdata</groupId>
<artifactId>readingdata</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.16.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
<spring-version>4.3.19.RELEASE</spring-version>
<spring.version>4.3.19.RELEASE</spring.version>
<alpha-framework-version>2.0.6.0014</alpha-framework-version>
<spring-boot.version>1.5.16.RELEASE</spring-boot.version>
<mongodb.version>3.10.2</mongodb.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-api</artifactId>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-springboot-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-springboot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-dao-core</artifactId>
<version>${alpha-framework-version}</version>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-dao-mongo</artifactId>
<version>${alpha-framework-version}</version>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-dao-mysql</artifactId>
<version>${alpha-framework-version}</version>
</dependency>
<!--因配置外部TOMCAT 而配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-api</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-springboot-bootstrap</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-core</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-dao-mongo</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.sh.chineseall</groupId>
<artifactId>alpha-framework-springboot-starter</artifactId>
<version>${alpha-framework-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>public</id>
<url>http://180.167.91.206:5716/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
\ No newline at end of file
package com.chineseall.readingdata;
import cn.sh.chineseall.framework.starter.annotation.AlphaFrameworkApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@AlphaFrameworkApplication
@ComponentScan(basePackages = {"com.chineseall.readingdata"})
public class EdenAuthcenterAgentApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(EdenAuthcenterAgentApplication.class);
}
public static void main(String[] args) {
cn.sh.chineseall.framework.springboot.bootstrap.application.AlphaFrameworkSpringApplication.run(EdenAuthcenterAgentApplication.class, args);
}
}
package com.chineseall.readingdata.common.enums;
public enum BookType {
PAPER("PAPER", "纸质"),
DIGITAL("DIGITAL","数字");
private String code;
private String desc;
private BookType(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return this.code;
}
public String getDesc() {
return this.desc;
}
public static BookType findResultEnum(String code) {
for (BookType resultEnum : values()) {
if (resultEnum.getCode().equals(code)) {
return resultEnum;
}
}
return null;
}
}
package com.chineseall.readingdata.common.enums;
/**
* 结果枚举,作为消息信息
*/
public enum ResultEnum {
/**
* 所有失败的操作均指定为999,未知错误
*/
Error(999, "失败"),
/**
* 令牌不合法
*/
TokenUnValidate(998, "令牌不合法"),
/**
* 签名不合法
*/
SignUnValidate(997, "签名不合法"),
/**
* 签名丢失
*/
SignHeaderMiss(996, "必须传递签名、过期时间和appId"),
/**
* 签名过期
*/
SignTimeOver(995, "签名过期"),
/**
* 用户名或者密码不正确
*/
ErrorUserNameOrPassword(994, "用户名或者密码不正确"),
UserNameInvalid(9941, "用户名无效"),
PasswordIncorrect(9942, "密码不正确"),
AccountDisabled(9943, "账户已冻结"),
/**
* APPID缺失
*/
MissAppId(993, "APP_ID缺失或者不正确"),
UnSupportUserType(992,"不支持的用户类型"),
/**
* 签名时间错误
*/
DeviceLocalTimeError(991,"设备传递的CHINESEALL_SIGN_EXP错误"),
/**
* 成功
*/
Success(1, "成功"),
/**
* 数据库操作失败
*/
DBError(1015, "数据库操作错误"),
/**
* 参数不全
*/
ParamsNull(1002, "参数不全"),
/**
* 不支持的HTTP方法
*/
MethodNotSupport(1001, "不支持的HTTP方法"),
NoHandlerFoundException(1003, "请求的方法不存在"),
SaveAnnotationError(2001, "保存云笔记失败"),
SaveAttachError(2002, "保存附件信息失败"),
SaveAnnotationTagError(2003, "创建云笔记与标签关系失败"),
AnnotationNotExist(2004, "云笔记不存在"),
ShareAnnotationError(2005, "分享笔记失败"),
SaveTagError(2006, "保存标签失败"),
UpdateTagError(2007, "更新标签失败"),
DeleteTagError(2008, "删除标签失败"),
SaveFolderError(2009, "创建文件夹失败"),
FolderNotExist(2010, "文件夹不存在"),
FolderOverdue(2011, "文件夹过期"),
AnnotationIdNull(2012, "笔记id为空"),
AnnotationDeleteError(2013, "删除云笔记失败"),
ShareIdNull(2014, "分享笔记id为空"),
ShareAnnotationNotExist(2015, "分享笔记不存在"),
TagTooMuch(2016, "标签创建过多"),
RegionError(2017, "区域代码错误"),
OrgIdError(2018, "机构代码错误"),
ForbiddenRequest(4000, "不在网关放行许可内"),
ConfigAuthCodeNull(3100, "获取配置信息授权码为空"),
GetConfigError(3001, "获取配置信息失败"),
/**
* 请求数据错误
*/
DataInvalid(1500,"请求数据无效"),
ReadingDataInvalid(1501,"阅读数据无效");
private Integer code;
private String message;
private ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return this.code;
}
public String getMessage() {
return this.message;
}
public static ResultEnum findResultEnum(Integer code) {
for (ResultEnum resultEnum : values()) {
if (resultEnum.getCode().equals(code)) {
return resultEnum;
}
}
return null;
}
}
package com.chineseall.readingdata.common.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
\ No newline at end of file
package com.chineseall.readingdata.common.utils;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
public static Date getBeginTime(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
public static Date getEndTime(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
}
package com.chineseall.readingdata.common.utils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
public class EncodeUtil {
private static final String charset = "utf-8";
private static final String KEY_ALGORITHM = "AES";
private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
private static final String key = "ChineseAllShanghai!@#$%^&*()";
public static String encodePassword(String originPassword) {
return EncodeUtil.base64Encode(
EncodeUtil.md5(originPassword + key), "UTF-8").trim();
}
/**
* 根据指定的字符串生成密钥
* @param len 密钥长度;支持128、192、256三种长度,本项目采用128位。
*
* @return String 密钥
*/
public static String getKey(String key, int len) throws Exception {
if (len != 128 && len != 192 && len != 256)
return null;
key = EncodeUtil.md5(key);
key = key.substring(0, len / 8);
byte[] kb = key.getBytes(charset);
key = EncodeUtil.encodeBase64(kb);
return key;
}
private static Key toKey(byte[] key)
{
return new SecretKeySpec(key, KEY_ALGORITHM);
}
public static String encrypt(String data, String key) throws Exception
{
//Key k = toKey(Base64.decode(key));
Key k = toKey(EncodeUtil.decodeBase64(key).getBytes(charset));
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, k);
String content = parseByte2HexStr(Base64.encodeBase64((cipher.doFinal(data.getBytes(charset)))));
return content;
}
public static String decrypt(String data, String key) throws Exception
{
Key k = toKey(EncodeUtil.decodeBase64(key).getBytes(charset));
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, k);
String content = new String(cipher.doFinal(Base64.decodeBase64(parseHexStr2Byte(data))), charset);
return content;
}
/**将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**将二进制转换成16进制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
/**
* 传入字符串,返回一个加密串
*
* @param s
* @return
*/
public static String encode(String s , String key) {
try {
byte[] encryptedData = encrypt(s , HEXStringToByte(key));
s = byteToHEXString(encryptedData);
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
/**
* 传入加密串,返回解密串
*
* @param s
* @return
*/
public static String decode(String s , String key) {
try {
return decrypt(HEXStringToByte(s) , HEXStringToByte(key));
} catch (Exception e) {
}
return s;
}
/**
* 传入字符串,返回一个加密串
*
* @param s
* @return
*/
public static String encodeBase64(String s) {
byte[] binaryData = null;
try {
binaryData = s.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
return s;
}
// byte[] newbt = Base64.encodeBase64(binaryData);
return encodeBase64(binaryData);// new String(newbt);
}
public static String encodeBase64(byte[] binaryData) {
byte[] newbt = Base64.encodeBase64(binaryData);
return new String(newbt);
}
public static byte[] enBase64(byte[] binaryData) {
return Base64.encodeBase64(binaryData);
}
public static byte[] deBase64(byte[] bytes) throws IOException {
return Base64.decodeBase64(bytes);
}
public static String stringEncode(String str) {
try {
return java.net.URLEncoder.encode(str, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
/**
* 传入加密串,返回解密串
*
* @param s
* @return
*/
public static String decodeBase64(String s) {
try {
return decodeBase64(s.getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
return s;
}
}
public static String decodeBase64(byte[] bytes) {
byte[] oldbt = null;
String t = null;
try {
oldbt = Base64.decodeBase64(bytes);
t = new String(oldbt, "utf-8");
} catch (UnsupportedEncodingException e) {
}
return t;
}
public static String byteToHEXString(byte[] bArray) {
StringBuilder sb = new StringBuilder(100);
for (int i = 0; i < bArray.length; i++) {
String hex = Integer.toHexString(bArray[i] & 0xff);
if (hex.length() == 1) {
sb.append("0").append(hex);
} else {
sb.append(hex);
}
}
return sb.toString().toUpperCase();
}
public static byte[] HEXStringToByte(String strString) {
byte[] ret = new byte[strString.length() / 2];
for (int i = 0; i < ret.length; i++) {
ret[i] = Integer
.decode("#" + strString.substring(2 * i, 2 * i + 2))
.byteValue();
}
return ret;
}
/**
* 加密方法
*
* @param rawKeyData
* @param str
* @return
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws NoSuchPaddingException
* @throws InvalidKeySpecException
* @throws UnsupportedEncodingException
*/
public static byte[] encrypt(String str , byte [] rawKeyData) throws InvalidKeyException,
NoSuchAlgorithmException, IllegalBlockSizeException,
BadPaddingException, NoSuchPaddingException,
InvalidKeySpecException, UnsupportedEncodingException {
// DES算法要求有一个可信任的随机数源
// SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec(rawKeyData);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, key);
// 现在,获取数据并加密
byte data[] = str.getBytes("utf-8");
// 正式执行加密操作
byte[] encryptedData = cipher.doFinal(data);
return encryptedData;
}
/**
* 解密方法
*
* @param rawKeyData
* @param encryptedData
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeySpecException
* @throws UnsupportedEncodingException
*/
public static String decrypt(byte[] encryptedData , byte[] rawKeyData)
throws IllegalBlockSizeException, BadPaddingException,
InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeySpecException,
UnsupportedEncodingException {
// DES算法要求有一个可信任的随机数源
// SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec(rawKeyData);
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, key);
// 正式执行解密操作
byte decryptedData[] = cipher.doFinal(encryptedData);
return new String(decryptedData, "utf-8");
}
public String getCurrentMillyTime() {
return Long.valueOf(System.currentTimeMillis()).toString();
}
public static String md5(String content) {
return DigestUtils.md5Hex(content);
}
public static String sha(String content) {
return DigestUtils.shaHex(content);
}
public static String base64Encode(String content, String charset) {
byte[] bytes = null;
try {
bytes = Base64.encodeBase64(content.getBytes(charset), true);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new String(bytes);
}
public static String base64Decode(String content, String charset) {
byte[] bytes = null;
try {
bytes = Base64.decodeBase64(content.getBytes(charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new String(bytes);
}
}
package com.chineseall.readingdata.common.utils;
import cn.sh.chineseall.framework.core.repackaged.org.apache.commons.lang3.RandomStringUtils;
import cn.sh.chineseall.framework.core.repackaged.org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLDecoder;
import java.security.MessageDigest;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <li>描述:公用类</li><br>
*
* @author zhouxiying
* @date 2013-8-28
*/
public class Utils {
/**
* 取出字符串 [1,2,3]中最大值
* */
public static int getMaxValue(String str) {
int max = 0;
// String values=null;
str = str.replace("[", "");
str = str.replace("]", "");
String[] strs = str.split(",");
for (String s : strs) {
if (max < Integer.parseInt(Utils.trim(s))) {
max = Integer.parseInt(Utils.trim(s));
}
}
return max;
}
/**
* 判断字符串数组中是否包含某字符串元素
*
* @return
*/
public static boolean isIn(String substring, String[] source) {
for (int i = 0; i < source.length; i++) {
if (source[i].trim().equals(substring)) {
return true;
}
}
return false;
}
/**
* 对list检查是否包含某元素
*
* @throws Exception
*/
public static boolean isItEquals(List list, String str) throws Exception {
for (int i = 0; i < list.size(); i++) {
if (str.trim().equals(list.get(i).toString())) {
return true;
}
}
return false;
}
/**
* 返回一个整数
*
* @author liuy
* @param str
* @return
* @throws Exception
* @return Integer
* @date 2014-4-10 下午5:39:52
*/
public static Integer isInteger(double str) throws Exception {
int in = 0;
// double in2=1/(double)str;
if (str < 1) {
in = in + 1;
} else if (str >= 1) {
int ioo = (int) str;
in = ioo + 1;
}
return in;
}
/**
* 生成制定位随机数字
*/
public static String randomNumeric(int i) {
return RandomStringUtils.randomNumeric(i);
}
/**
* //保留小数点后3位(四舍五入),且不按科学计数法输出
* */
public static String FormatPrice(double price, int i) {
String revalue = null;
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(i);
df.setMinimumFractionDigits(i);
revalue = df.format(price);
revalue = revalue.replaceAll(",", "");
return revalue;
}
/**
* 生成制定位随机字母和数字 生成优惠券号用此(去除了‘0’,‘1’,‘I’,‘O’)
*/
public static String randomAlphanumeric(int i) {
return RandomStringUtils.random(i, new char[] { '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z' });
}
/**
* 判断字符串是否是GB2312编码的
* */
public static boolean isGB2312(String str) {
if (Utils.isObjectNotEmpty(str)) {
return java.nio.charset.Charset.forName("GB2312").newEncoder()
.canEncode(str);
} else {
return false;
}
}
/**
* 获得字符串的实际长度 GBK 编码格式 中文占两个字节
* */
public static int getStrLenth(String str) {
if (str == null || str.length() < 0) {
return 0;
}
int len = 0;
char c;
for (int i = str.length() - 1; i >= 0; i--) {
c = str.charAt(i);
if (c > 255) {
len += 2;
} else {
len++;
}
}
return len;
}
/**
* 冒泡排序
*
* @param list
* 需要排序的集合
* @param type
* 排序类型 0:正序 1:倒序
* */
public static List<String> setValue(List<String> list, int type) {
for (int i = 0; i < list.size(); i++) {// 循环List集合,开始于下标0
for (int j = i + 1; j < list.size(); j++) {// 循环List集合,开始于下标0+1
int a = Integer.parseInt(list.get(i));// 取List集合的第n个值
int b = Integer.parseInt(list.get(j));// 取List集合的第n+1个值
if (type == 0 ? a > b : a < b) {// 如果a比b大,则替换两个值的位置。
list.set(i, b + "");
list.set(j, a + "");
}
}
}
return list;
}
/**
* 返回两数之和
*
* @param a1
* @param a2
* @return a1+a2
*/
public static BigDecimal nwdBcadd(Object a1, Object a2) {
BigDecimal accrual1 = new BigDecimal(a1.toString());
BigDecimal accrual2 = new BigDecimal(a2.toString());
BigDecimal accrual = accrual1.add(accrual2);
return accrual;
}
/**
* 返回两数之差
*
* @param a1
* @param a2
* @return a1-a2
*/
public static BigDecimal nwdBcsub(Object a1, Object a2) {
BigDecimal accrual1 = new BigDecimal(a1.toString());
BigDecimal accrual2 = new BigDecimal(a2.toString());
BigDecimal accrual = accrual1.subtract(accrual2);
return accrual;
}
/**
* 返回两数之积
*
* @param a1
* @param a2
* @return a1*a2
*/
public static BigDecimal nwdMultiply(Object a1, Object a2) {
BigDecimal accrual1 = new BigDecimal(a1.toString());
BigDecimal accrual2 = new BigDecimal(a2.toString());
BigDecimal accrual = accrual1.multiply(accrual2);
return accrual;
}
/**
* 返回两数相除
*
* @param a1
* @param a2
* @return a1/a2
*/
public static BigDecimal nwdDivide(Object a1, Object a2) {
MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN); // 取字符个数为10
BigDecimal accrual1 = new BigDecimal(a1.toString());
BigDecimal accrual2 = new BigDecimal(a2.toString());
BigDecimal accrual = accrual1.divide(accrual2, mc);
return accrual;
}
/**
* 返回小数点后2位
*
* @param object
* @return .00
*/
public static BigDecimal setScale(Object object) {
BigDecimal bd = new BigDecimal(object.toString());
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); // 取小数点后2位 /ROUND_HALF_UP
return bd;
}
/**
* 将字符串数字转化为int型数字
*
* @param str被转化字符串
* @param defValue转化失败后的默认值
* @return int
*/
public static int parseInt(String str, int defValue) {
try {
return Integer.valueOf(str);
} catch (Exception e) {
return defValue;
}
}
public static long parseLong(String str, long defValue) {
try {
return Long.valueOf(str);
} catch (Exception e) {
return defValue;
}
}
public static Long strToLong(String str, Long defValue) {
try {
return Long.valueOf(str);
} catch (Exception e) {
return defValue;
}
}
/**
* 将字符串数字转化为double型数字
*
* @param str被转化字符串
* @param defValue转化失败后的默认值
* @return double
*/
public static double parseDouble(String str, double defValue) {
try {
return Double.parseDouble(str);
} catch (Exception e) {
return defValue;
}
}
/**
* 检测字符串是否为空
*/
public static boolean strIsNull(String str) {
return ((str == null) || "".equals(str) || "null".equalsIgnoreCase(str));
}
/**
* 去空格,如为null则转化为空字符串
*/
public static String trim(String str) {
if (str == null || "null".equalsIgnoreCase(str)
|| "undefined".equalsIgnoreCase(str)) {
return "";
}
return str.trim();
}
/**
* 将字符串数组转化成中间用逗号分割的字符串 "'a','b','c'"
*/
public static String getRecordIds(String[] recordIds) {
if (recordIds == null || recordIds.length == 0)
return "";
if (recordIds.length == 1)
return recordIds[0];
StringBuffer ids = new StringBuffer();
for (int i = 0; i < recordIds.length; i++) {
if (i == recordIds.length - 1) {
ids.append("'" + recordIds[i] + "'");
} else {
ids.append("'" + recordIds[i] + "'" + ",");
}
}
return ids.toString();
}
/**
* 将字符串数组转化成中间用逗号分割的字符串 "a,b,c"
*/
public static String getStrs(String[] strs) {
if (strs == null || strs.length == 0)
return "";
if (strs.length == 1)
return strs[0];
StringBuffer ids = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
if (i == strs.length - 1) {
ids.append(strs[i]);
} else {
ids.append(strs[i] + ",");
}
}
return ids.toString();
}
/**
* 将字符串数组转化成中间用逗号分割的字符串 "a,b,c"
*/
public static String getStrsRep(String[] strs, String rep, String newStr) {
if (strs == null || strs.length == 0)
return "";
if (strs.length == 1)
return strs[0];
StringBuffer ids = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
if (i == strs.length - 1) {
ids.append(strs[i].replace(rep, newStr));
} else {
ids.append(strs[i].replace(rep, newStr) + ",");
}
}
return ids.toString();
}
/**
* 将字符串数组转化成中间用逗号分割的字符串 "a,b,c"
*/
public static String getStrsBySplit(String[] strs, String split) {
if (strs == null || strs.length == 0)
return "";
if (strs.length == 1)
return strs[0];
StringBuffer ids = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
if (i == strs.length - 1) {
ids.append(strs[i]);
} else {
ids.append(strs[i] + split);
}
}
return ids.toString();
}
/**
* 验证EMAIL方法
*
* @param str
* 被验证的email字符串
* @return 成功返回true 失败返回false
*/
public static boolean isEmail(String str) {
if (str == null)
return false;
str = str.trim();
if (str.length() < 6)
return false;
return true;
}
public static boolean isEmail(String value, String expression) {
Pattern pattern = Pattern.compile(expression);
Matcher matcher = pattern.matcher(value);
return matcher.find();
}
/**
* 在不足len位的数字前面自动补零
*/
public static String getLimitLenStr(String str, int len) {
if (str == null) {
return "";
}
while (str.length() < len) {
str = "0" + str;
}
return str;
}
/**
* 字符串GBK到UTF-8码的转化
*
* @param inStr
* GBK编码的字符串
* @return UTF-8编码的字符串
*/
public static String wapGbkToUtf(String inStr) {
char temChr;
int ascInt;
int i;
String result = new String("");
if (inStr == null) {
inStr = "";
}
for (i = 0; i < inStr.length(); i++) {
temChr = inStr.charAt(i);
ascInt = temChr + 0;
if (ascInt > 255) {
result = result + "&#x" + Integer.toHexString(ascInt) + ";";
} else {
result = result + temChr;
}
}
return result;
}
/**
* 特殊字符替换
*/
public static String replaceStrHtml(String inStr) {
String result = inStr;
if (result != null && !("".equals(result))) {
result = result.replaceAll("\r\n", "<br>");
result = result.replaceAll(" ", " ");
}
return result;
}
/**
* 特殊字符&替换&
*/
public static String replaceStrForWap(String inStr) {
String result = inStr;
if (!Utils.strIsNull(inStr)) {
result = result.replaceAll("&", "&");
result = result.replaceAll("&", "&");
}
return result;
}
/**
* 判断对象是否为null或""(条件成立则返回ture,否则返回false)
*
* @param objects
* @return
*/
public static boolean isObjectEmpty(Object objects) {
if (objects == null || "".equals(objects)) {
return true;
}
return false;
}
/**
* 判断对象是否不为null或""(条件成立则返回ture,否则返回false)
*
* @param objects
* @return
*/
public static boolean isObjectNotEmpty(Object objects) {
return !isObjectEmpty(objects);
}
// ------------------------------用户请求数据-----------------------------------
/**
* 得到当前请求的URL
*
* @param request
* @return
*/
public static String getActionURL(HttpServletRequest req) {
// 请求地址
String hearderString = req.getHeader("referer");
String path = req.getContextPath();
Integer port = req.getServerPort();
StringBuffer sbf = new StringBuffer();
if (port.compareTo(80) != 0) {
sbf.append(req.getScheme()).append("://")
.append(req.getServerName()).append(":")
.append(req.getServerPort() + path).append("/");
} else {
sbf.append(req.getScheme()).append("://")
.append(req.getServerName()).append(path).append("/");
}
return hearderString.substring(sbf.length());
}
/**
* 得到客户端请求IP地址
*
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("x-real-ip");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
String[] ips = ip.split(",");
if (ips.length> 1) {
ip = ips[0];
}
return ip;
}
/***
* 获取IP
*
* @param request
* @return
*/
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (ip == null) {
ip = request.getRemoteAddr();
}
return ip;
}
// Cookie 数据获得
public static String getCookieValue(Cookie[] cookies, String str) {
String result = null;
if (Utils.isObjectNotEmpty(cookies)) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(str)) {
result = cookie.getValue();
break;
}
}
}
return result;
}
/**
* 获取指定名字的Cookie值,找不到则返回null
*
* @return 成功返回 Cookie的值, 否则返回 null
*/
public static String getCookie(HttpServletRequest req, String cookieName) {
String result = null;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
cookie.setPath("/");
if (cookieName.equals(cookie.getName())) {
result = cookie.getValue();
break;
}
}
}
return result;
}
/*
* // 根据Map输出JSON,返回null public static String ajaxJson(Map<String, String>
* jsonMap) { JSONObject jsonObject = JSONObject.fromObject(jsonMap); return
* ajax(jsonObject.toString(), "text/html"); }
*
* // 根据Map输出JSON,返回null public static String ajaxJsonObject(Map<String,
* Object> jsonMap) { JSONObject jsonObject =
* JSONObject.fromObject(jsonMap); return ajax(jsonObject.toString(),
* "text/html"); }
*
* // 根据Object输出JSON,返回null public static String ajaxJsonObj(Object obj) {
* JSONObject jsonObject = JSONObject.fromObject(obj); return
* ajax(jsonObject.toString(), "text/html"); }
*
* // 根据List输出JSON,返回NULL public static String ajaxJson(List list) {
* JSONArray jsonArray = new JSONArray(); if (Utils.isObjectNotEmpty(list))
* { jsonArray.addAll(list); } return ajax(jsonArray.toString(),
* "text/html"); }
*
* // AJAX输出,返回null public static String ajax(String content, String type) {
* try { HttpServletResponse response = ServletActionContext.getResponse();
* response.reset(); response.setContentType(type + ";charset=UTF-8");
* response.setHeader("Pragma", "No-cache");
* response.setHeader("Cache-Control", "no-cache");
* response.setDateHeader("Expires", 0);
* response.getWriter().write(content); response.getWriter().flush(); }
* catch (IOException e) { e.printStackTrace(); } return null; }
*/
// -------------------------日期处理----------------------------------------------
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
/**
* @param 输入日期
* @param 输入转换
* (规则)格式
* @return 返回日期字符串
*/
public static String format(Date date, String format) {
if (date == null || date.equals(""))
return null;
SimpleDateFormat sft = new SimpleDateFormat(format);
return sft.format(date);
}
/**
* @param 输入字符型日期
* ,如:2007-2-20
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
* @return 返回日期
* @throws ParseException
*/
public static Date parse(String date, String format){
SimpleDateFormat sft = new SimpleDateFormat(format);
try {
return sft.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 得到两个日期之间的天数 time1>time2
*
* @param time1yyyy
* -MM-dd
* @param time2yyyy
* -MM-dd
* @return
* @throws ParseException
*/
public static long getQuot(String time1, String time2)
throws ParseException {
long quot = 0;
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = ft.parse(time1);
Date date2 = ft.parse(time2);
quot = date1.getTime() - date2.getTime();
quot = quot / 1000 / 60 / 60 / 24;
return quot;
}
/**
* 得到两个日期之间的天数 time1>time2
*
* @param time1yyyy
* -MM-dd
* @param time2yyyy
* -MM-dd
* @return
* @throws ParseException
*/
public static long getQuot(Date time1, Date time2) {
long quot = 0;
quot = time1.getTime() - time2.getTime();
quot = quot / 1000 / 60 / 60 / 24;
return quot;
}
/**
* 获取两个日期相差的自然天数
*/
public static Integer dateDiff(Date date1, Date date2) throws Exception{
return Integer.valueOf(getQuot(format(date1, "yyyy-MM-dd"), format(date1, "yyyy-MM-dd"))+"");
}
/**
* 得到两个年之间的年数 time1>time2
*
* @param time1
* Date
* @param time2
* Date
* @return
* @throws ParseException
*/
public static Integer getQuotAge(Date date1, Date date2)
throws ParseException {
Integer quot = 0;
// SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
// Date date1 = ft.parse( time1 );
// Date date2 = ft.parse( time2 );
quot = date1.getYear() - date2.getYear();
return quot;
}
/**
* 得到日期字符串
*
* @param time
* @return
* @throws ParseException
*/
public static String getStrDatetime(Date time) throws ParseException {
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return ft.format(time);
}
/**
* 得到日期字符串
*
* @param time
* @return
* @throws ParseException
*/
public static String getStrDayDatetime(Date time, String str)
throws ParseException {
SimpleDateFormat ft = new SimpleDateFormat(str);
String a = ft.format(time);
a = a.substring(0, 8) + "01";
return a;
}
/**
* 获得系统当前时间,以分隔符"-"分开
*
* @return返回当前系统日期 如:当前时间是2007年10月15日 则通过该函数得到的字符串为"2007-10-15"
*/
public String getToday() {
GregorianCalendar gc = new GregorianCalendar();
return this.format(gc.getTime(), "yyyy-MM-dd");
}
/**
* 获得系统当前时间,以分隔符"-"分开
*
* @return返回当前系统时间 如:当前时间是2007年10月15日21点45分25秒
* 则通过该函数得到的字符串为"2007-10-15-21-45-25"
*/
public String getTimeNoSeparate() {
GregorianCalendar gc = new GregorianCalendar();
return this.format(gc.getTime(), "yyyy-MM-dd-HH-mm-ss");
}
/**
* 获得当前系统时间字符串
*
* @return 返回当前系统时间字符串,精确到秒 如:当前时间是2007年10月15日21点45分25秒
* 则通过该函数得到的字符串为"20071015214525"
*/
public static String getTime() {
GregorianCalendar gc = new GregorianCalendar();
return format(gc.getTime(), "yyyyMMddHHmmss");
}
/**
* 获得当前日期字符串,格式:20071015
*
* @return 当前日期字符串
*/
public String getNow() {
GregorianCalendar gc = new GregorianCalendar();
return this.format(gc.getTime(), "yyyyMMdd");
}
/**
* 获得当前日期Date
*
* @return Date
*/
public Date getDate() {
GregorianCalendar gc = new GregorianCalendar();
return gc.getTime();
}
/**
* 得到当前时间加上多少分钟以后的时间
*
* @param minute
* @return
*/
public long getTimeMillisOfAddMinute(Long num, int minute) {
Long t = num + minute * 1000 * 60;
return t;
}
/**
* 获得当前时间Timestamp类型
*/
public static Timestamp getNowTime() {
GregorianCalendar gc = new GregorianCalendar();
Timestamp time = new Timestamp(gc.getTimeInMillis());
return time;
}
/**
* @param 输入字符型日期
* ,如:2007-2-20
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
* @return 返回日期
*/
public static Date format(String str, String format) {
Date result = null;
try {
str += " ";
int endStr = str.indexOf(" ");
String dateString = str.substring(0, endStr);
result = parse(dateString, format);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
/**
* 得到当前时间
*
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getNow(String format) {
Calendar cal = Calendar.getInstance();
return this.format(cal.getTime(), format);
}
/**
* 得到多少天以前的日期(负数表示多少天以后的日期)
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getDayNumOfDate(int dayNum, String format) {
int day = -dayNum;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, day);
return this.format(cal.getTime(), format);
}
/**
* 得到多少天以前的日期(负数表示多少天以后的日期)
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public static Date getDayNumOfDate(int dayNum) {
int day = -dayNum;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, day);
return cal.getTime();
}
/**
* 得到指定的日期以前多少天
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public static String getDayNumOfAppointDate(Date appointDate, int dayNum,
String format) {
Calendar cal = Calendar.getInstance();
cal.setTime(appointDate);
cal.add(Calendar.DATE, -dayNum);
return format(cal.getTime(), format);
}
/**
* 得到指定的日期以前多少天
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public static Date getDayNumOfAppointDate(Date appointDate, int dayNum) {
Calendar cal = Calendar.getInstance();
cal.setTime(appointDate);
cal.add(Calendar.DATE, -dayNum);
return cal.getTime();
}
/**
* 得到指定的日期以前多少天
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getMonthNumOfAppointDate(Date appointDate, int monthNum,
String format) {
Calendar cal = Calendar.getInstance();
cal.setTime(appointDate);
cal.add(Calendar.MONTH, -monthNum);
return this.format(cal.getTime(), format);
}
/**
* 根据指定的日期得到多少个月以前的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public static Date getMonthNumOfAppointDate(Date appointDate, int monthNum) {
Calendar cal = Calendar.getInstance();
cal.setTime(appointDate);
cal.add(Calendar.MONTH, -monthNum);
return cal.getTime();
}
/**
* 根据指定的日期得到多少个月以后的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public static Date getMonthNumOfDate(Date appointDate, int monthNum) {
Calendar cal = Calendar.getInstance();
cal.setTime(appointDate);
cal.add(Calendar.MONTH, monthNum);
return cal.getTime();
}
/**
* 得到多少月以前的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getMonthNumOfMonth(int monthNum, String format) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, monthNum);
return this.format(cal.getTime(), format);
}
/**
* 得到多少月以前的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getMonthNumOfMonth(int monthNum, int dateNum, String format) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -monthNum);
cal.add(Calendar.DATE, -dateNum);
return this.format(cal.getTime(), format);
}
/**
* 得到多少月以前的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public Date getMonthNumOfMonth1(int monthNum, int dateNum, String format) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -monthNum);
cal.add(Calendar.DATE, -dateNum);
return cal.getTime();
}
/**
* 得到多少年以前的日期
*
* @param输入int型
* @param 输入字符型日期的排列规则
* ,如:yyyy-MM-dd,MM/dd/yyyy. 根据上述输入字符型日期,此处应填写的规则是:yyyy-MM-dd
*/
public String getYearNumOfYear(int yearNum, String format) {
int year = -yearNum;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, year);
return this.format(cal.getTime(), format);
}
// /**
// * 得到今天是当月的第几周 (一周的第一天是 周日)
// *
// * @param format
// * @return
// */
// public static int getWeekOfMonth() {
// GregorianCalendar calendar = new GregorianCalendar();
// return calendar.get(Calendar.WEEK_OF_MONTH);
// }
/**
* 判断
* 当前时间 和 指定本月第n天是否在本月同一周
* @param format
* @return
*/
public static boolean nowTodayWeekOfMonth(String value) {
GregorianCalendar calendar = new GregorianCalendar();
calendar.add(Calendar.DAY_OF_MONTH, -1);
int j = calendar.get(Calendar.WEEK_OF_MONTH);
calendar.set(calendar.DAY_OF_MONTH, Integer.parseInt(value));
calendar.add(Calendar.DAY_OF_MONTH, -1);
int k = calendar.get(Calendar.WEEK_OF_MONTH);
return j==k;
}
/**
* 得到上一月的第一天
*
* @param format
* @return
*/
public String getStartOfLastMonth(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1);
cal.set(Calendar.DATE, 1);
return this.format(cal.getTime(), format);
}
/**
* 得到第num个月后的第一天(负数表示前,正为后)
*
* @param format
* @return
*/
public String getStartOfMonth(int num, String format) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, num);
cal.set(Calendar.DATE, 1);
return this.format(cal.getTime(), format);
}
/**
* 获取当月第一天 00:00:00
*/
public static Date getStartTimeThisMon(){
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
return cal.getTime();
}
/**
* 获取当月最后一天 23:59:59
*/
public static Date getEndTimeThisMon(){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1); //加一个月
cal.set(Calendar.DATE, 1); //设置为该月第一天
cal.add(Calendar.DATE, -1); //再减一天即为上个月最后一天
cal.set(Calendar.HOUR_OF_DAY,23);
cal.set(Calendar.MINUTE,59);
cal.set(Calendar.SECOND,59);
cal.set(Calendar.MILLISECOND,999);
return cal.getTime();
}
public static void main(String[] args) {
System.out.println(format(getStartTimeThisMon(), "yyyy-MM-dd HH:mm:ss"));
System.out.println(format(getEndTimeThisMon(), "yyyy-MM-dd HH:mm:ss"));
}
/**
* 得到当月的第一天
*
* @param format
* @return
*/
public static String getStartOfMonth(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
return format(cal.getTime(), format);
}
/**
* 得到当月的最后一天
*
* @param format
* @return
*/
public static String getEndOfMonth(String format) {
Calendar ca = Calendar.getInstance();
ca.set(Calendar.DAY_OF_MONTH,
ca.getActualMaximum(Calendar.DAY_OF_MONTH));
return format(ca.getTime(), format);
}
/**
* 得到前月的后一天
*
* @param format
* @return
*/
public static String getEndOfPreMonth(String format) {
Calendar cale = Calendar.getInstance();
cale.set(Calendar.DAY_OF_MONTH, 0);// 设置为1号,当前日期既为本月第一天
return format(cale.getTime(), format);
}
/**
* 得到前月的前一天
*
* @param format
* @return
*/
public static String getStartOfPreMonth(String format) {
Calendar cal = Calendar.getInstance();// 获取当前日期
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
return format(cal.getTime(), format);
}
/**
* 得到当月的第一天
*
* @param format
* @return
*/
public String getStartOfMonth_test(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
return this.format(cal.getTime(), format);
}
/**
* 得到下一月的第一天
*
* @param format
* @return
*/
public String getStartOfNextMonth(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1);
cal.set(Calendar.DATE, 1);
return this.format(cal.getTime(), format);
}
/**
* 加一年
*
* @return
*/
public String getYears() {
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(gc.getTime());
gc.add(1, +1);
gc.set(gc.get(Calendar.YEAR), gc.get(Calendar.MONTH),
gc.get(Calendar.DATE));
return sf.format(gc.getTime());
}
/**
* 加半年
*
* @return
*/
public String getHalfYear() {
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(gc.getTime());
gc.add(2, +6);
gc.set(gc.get(Calendar.YEAR), gc.get(Calendar.MONTH),
gc.get(Calendar.DATE));
return sf.format(gc.getTime());
}
/**
* 加一个季度
*
* @return
*/
public String getQuarters() {
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(gc.getTime());
gc.add(2, +3);
gc.set(gc.get(Calendar.YEAR), gc.get(Calendar.MONTH),
gc.get(Calendar.DATE));
return sf.format(gc.getTime());
}
/**
* 返回yyyy-MM-dd格式的字符串
*
* @return
*/
public static String getLocalDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
GregorianCalendar gc = new GregorianCalendar();
return df.format(gc.getTime());
}
/**
* 日期转换("yyyy-MM-dd")
*/
public static final Date parseDate(String dateStr) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 日期转换("yyyy-MM-dd")
*/
public static final Date parseDate(String dateStr, String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
try {
return df.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 返回yyyy-MM-dd格式的字符串
*
* @return
*/
public static String getparseDate(Date dateStr, String format) {
SimpleDateFormat df = new SimpleDateFormat(format);
Calendar cal = Calendar.getInstance();
cal.setTime(dateStr);
return df.format(cal.getTime());
}
/**
* 判断两个日期的先后顺序
*
* @param dt1
* @param dt2
* @return
*/
public static int compare_date(Date dt1, Date dt2) {
try {
if (dt1.getTime() > dt2.getTime()) {
return 1;
} else if (dt1.getTime() <= dt2.getTime()) {
return -1;
} else {
return 0;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return 0;
}
/**
* 得到两个时间的秒数差 date1 - date2
* @param date1
* @param date2
* @return
*/
public static int getDateSecondsSub(String date1, String date2){
long a = parseDate(date1, "yyyy-MM-dd HH:mm:ss").getTime();
long b = parseDate(date2, "yyyy-MM-dd HH:mm:ss").getTime();
int c = (int)((a - b) / 1000);
return c;
}
/**
* 按照概率生成对应的随机数 <br>
* 例如: int[] arr = {70, 20, 10} 生成的随机数:0(概率为70%) 生成的随机数:1(概率为20%)
* 生成的随机数:2(概率为10%)
*
* @param arr
* @return i 返回下标: 0,1,2 ...
*/
public static int weightRandom(Integer[] arr) {
int x = (int) (Math.random() * 100);
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (sum > x) {
return i;
}
}
return -1;
}
/****
* 验证 Integer类型
*
* @param i
* @return
*/
public static boolean isBlank(Integer i) {
if (i == null) {
return true;
}
return false;
}
public static BigDecimal doubleToBigDecimal(Double d) {
try {
return new BigDecimal(d.toString());
} catch (Exception e) {
return new BigDecimal("0");
}
}
/***
* l == null || l.size() <= 0 返回 true
*
* @param l
* @return
*/
public static boolean isEmptyList(List<?> l) {
if (l == null || l.size() <= 0) {
return true;
}
return false;
}
/**
* 提供精确的加法运算。
*
* @param v1
* 被加数
* @param v2
* 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.add(b2)).doubleValue();
}
/**
* 提供精确的减法运算。
*
* @param v1
* 被减数
* @param v2
* 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.subtract(b2)).doubleValue();
}
/**
* 提供精确的乘法运算。
*
* @param v1
* 被乘数
* @param v2
* 乘数
* @return 两个参数的积
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.multiply(b2)).doubleValue();
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
*
* @param v1
* 被除数
* @param v2
* 除数
* @param scale
* 表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale) {
if (scale < 0) {
System.err.println("除法精度必须大于0!");
return 0;
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP)).doubleValue();
}
/***
* 获得当前时间和传入时间相隔的秒数
* */
public static long getSpacing(Date date1) {
Date date = new Date();
return (date.getTime() - date1.getTime()) / 1000;
}
/**
* 整理数据Double的小数位数
* */
public static double getDoubleByScale(Double v1, int scale) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
return b1.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/****
* 获取指定日期 minute分钟后的时间
*
* @param date
* @param hour
* @return
*/
public static Date getTimeAfterMinute(Date date, int minute) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.MINUTE, c.get(Calendar.MINUTE) + minute);
return c.getTime();
}
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
/***
* 判断是否是英文
*
* @param strName
*/
public static boolean isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length;) {
char c = ch[i];
if (isChinese(c) == true) {
return true;
} else {
return false;
}
}
return false;
}
/**
* @param s
* @return
*/
public static String toUTF8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0)
k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
/**
* 数字金额大写转换,思想先写个完整的然后将如零拾替换成零 要用到正则表达式
*/
public static String digitUppercase(double n) {
String fraction[] = { "角", "分" };
String digit[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
String unit[][] = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
String head = n < 0 ? "负" : "";
n = Math.abs(n);
String s = "";
for (int i = 0; i < fraction.length; i++) {
s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i])
.replaceAll("(零.)+", "");
}
if (s.length() < 1) {
s = "整";
}
int integerPart = (int) Math.floor(n);
for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
String p = "";
for (int j = 0; j < unit[1].length && n > 0; j++) {
p = digit[integerPart % 10] + unit[1][j] + p;
integerPart = integerPart / 10;
}
s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i]
+ s;
}
return head
+ s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "")
.replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
}
/**
* 获得配置文件所在目录<br>
*
* @param file
* @return
*/
public static File getResource(String file) {
URL url = Utils.class.getResource("");
String pkg = "";
if (Utils.class.getPackage() != null) {
pkg = Utils.class.getPackage().getName();
}
String path = url.getPath();
path = path.substring(0, path.length() - pkg.length() - 1);
String fileSeparator = System.getProperty("link.properties");
File rtn = new File(path + fileSeparator + file.trim());
return rtn;
}
public static String getMacAddr() {
String MacAddr = "";
try {
Enumeration<NetworkInterface> em = NetworkInterface
.getNetworkInterfaces();
while (em.hasMoreElements()) {
NetworkInterface nic = em.nextElement();
byte[] b = nic.getHardwareAddress();
if (b == null) {
continue;
}
for (int i = 0; i < b.length; i++) {
}
}
} catch (SocketException e) {
e.printStackTrace();
System.exit(-1);
}
return MacAddr;
}
public static String getLocalIP() {
String ip = "";
try {
Enumeration<?> e1 = (Enumeration<?>) NetworkInterface
.getNetworkInterfaces();
while (e1.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) e1.nextElement();
Enumeration<?> e2 = ni.getInetAddresses();
while (e2.hasMoreElements()) {
InetAddress ia = (InetAddress) e2.nextElement();
ip = ia.getHostAddress();
}
}
} catch (SocketException e) {
e.printStackTrace();
System.exit(-1);
}
return ip;
}
/* 一个将字节转化为十六进制ASSIC码的函数 */
public static String byteHEX(byte ib) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
'b', 'c', 'd', 'e', 'f' };
char[] ob = new char[2];
ob[0] = Digit[(ib >>> 4) & 0X0F];
ob[1] = Digit[ib & 0X0F];
String s = new String(ob);
return s;
}
/****
* 获取数组值
*
* @param array
* @param index
* @return
*/
public static String getArrayValue(String[] array, int index) {
try {
return array[index];
} catch (Exception e) {
return "";
}
}
public static String md5ByHex(String src) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte b[] = src.getBytes();
md.reset();
md.update(b);
byte hash[] = md.digest();
String hs = "";
String stmp = "";
for (int i = 0; i < hash.length; i++) {
stmp = Integer.toHexString(hash[i] & 0xff);
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
} catch (Exception e) {
return "";
}
}
public static long strToLong(String str) {
try {
return Long.valueOf(str);
} catch (Exception e) {
return 0L;
}
}
public static String UrlDecode(String param) {
try {
return URLDecoder.decode(param, "UTF-8");
} catch (UnsupportedEncodingException e) {
return "";
}
}
// 保持长度 替换最后一个元素
public static String[] repArray(String[] array, String newStr, int len) {
if (array == null || array.length <= 0) {
return new String[] { newStr };
}
List<String> list = new ArrayList<String>();
list.add(newStr);
for (int i = 0; i < array.length; i++) {
if (list.size() >= len) {
break;
}
if (!array[i].equals(newStr)) {
list.add(array[i]);
}
}
return list.toArray(new String[list.size()]);
}
public static String[] repArrayStr(String[] array) {
if (array == null || array.length <= 0) {
return array;
} else {
for (int i = 0; i < array.length; i++) {
array[0] = array[0].split("_")[0];
}
return array;
}
}
/****
* 数组分页
*
* @param strs
* 数组集合(ids)
* @param pageSize
* 每页显示数
* @param toPage
* 当前页
* @param order
* 排序 0 asc 1 desc
* @return
*/
public static String[] getArray(String[] strs, int pageSize, int toPage,
int order) {
if (strs == null) {
return new String[] {};
}
if (order == 1) {
strs = arraySort(strs);
}
int start = 0;
int end = 0;
end = toPage * pageSize;
if (end >= strs.length) {
end = strs.length - start;
}
start = (toPage - 1) * pageSize;
if (start > strs.length) {
return new String[] {};
}
String[] ns = new String[(end - start)];
System.arraycopy(strs, start, ns, 0, (end - start));
return ns;
}
/***
* 数组倒序
*
* @param strs
* @return
*/
public static String[] arraySort(String[] strs) {
if (strs == null || strs.length <= 0) {
return new String[] {};
}
String[] newstr = new String[strs.length];
int len = 0;
for (int i = strs.length - 1; i >= 0; i--) {
newstr[len] = strs[i];
len++;
}
return newstr;
}
/**
* 是否是数字
*/
public static boolean isNumber(String str) {
if (StringUtils.isEmpty(str)) {
return false;
}
char[] chars = str.toCharArray();
int sz = chars.length;
boolean hasExp = false;
boolean hasDecPoint = false;
boolean allowSigns = false;
boolean foundDigit = false;
int start = (chars[0] == '-') ? 1 : 0;
if (sz > start + 1) {
if (chars[start] == '0' && chars[start + 1] == 'x') {
int i = start + 2;
if (i == sz) {
return false; // str == "0x"
}
for (; i < chars.length; i++) {
if ((chars[i] < '0' || chars[i] > '9')
&& (chars[i] < 'a' || chars[i] > 'f')
&& (chars[i] < 'A' || chars[i] > 'F')) {
return false;
}
}
return true;
}
}
sz--;
int i = start;
while (i < sz || (i < sz + 1 && allowSigns && !foundDigit)) {
if (chars[i] >= '0' && chars[i] <= '9') {
foundDigit = true;
allowSigns = false;
} else if (chars[i] == '.') {
if (hasDecPoint || hasExp) {
return false;
}
hasDecPoint = true;
} else if (chars[i] == 'e' || chars[i] == 'E') {
if (hasExp) {
return false;
}
if (!foundDigit) {
return false;
}
hasExp = true;
allowSigns = true;
} else if (chars[i] == '+' || chars[i] == '-') {
if (!allowSigns) {
return false;
}
allowSigns = false;
foundDigit = false;
} else {
return false;
}
i++;
}
if (i < chars.length) {
if (chars[i] >= '0' && chars[i] <= '9') {
return true;
}
if (chars[i] == 'e' || chars[i] == 'E') {
return false;
}
if (!allowSigns
&& (chars[i] == 'd' || chars[i] == 'D' || chars[i] == 'f' || chars[i] == 'F')) {
return foundDigit;
}
if (chars[i] == 'l' || chars[i] == 'L') {
return foundDigit && !hasExp;
}
return false;
}
return !allowSigns && foundDigit;
}
/** 差集 */
public static Set<String> difference(Set<String> setA, Set<String> setB) {
Set<String> setDifference = new HashSet<String>();
String s = "";
Iterator<String> iterA = setA.iterator();
while (iterA.hasNext()) {
s = iterA.next();
if (!setB.contains(s)) {
setDifference.add(s);
}
}
return setDifference;
}
public static String[] sort(String[] list) {
for (int i = 0; i < list.length - 1; i++) {
for (int j = 1; j < list.length - i; j++) {
Integer a;
if ((Integer.valueOf(list[j - 1].trim())).compareTo(Integer
.valueOf(list[j].trim())) > 0) { // 比较两个整数的大小
a = Integer.valueOf(list[j - 1].trim());
list[j - 1] = list[j].trim();
list[j] = a.toString();
}
}
}
return list;
}
/**
* left-right的秒数
*
* @author 彭堃(penkee@163.com), 2013-10-11
*
*/
public static long calDateSecondVariation(Date left, Date right) {
long diff = left.getTime() - right.getTime();
return diff / 1000;
}
/**
* 返回小数点后2位
*
* @param object
* @return .00
*/
public static BigDecimal setScaleBidDecimal(BigDecimal bd) {
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); // 取小数点后2位 /ROUND_HALF_UP
return bd;
}
/**
* 汉字转拼音的方法
*
* @param name
* 汉字
* @return 拼音
*/
/*
* public static String getHanyuToPinyin(String name){ String pinyinName =
* ""; char[] nameChar = name.toCharArray(); HanyuPinyinOutputFormat
* defaultFormat = new HanyuPinyinOutputFormat();
* defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
* defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); for (int i =
* 0; i < nameChar.length; i++) { if (nameChar[i] > 128) { try { pinyinName
* += PinyinHelper.toHanyuPinyinStringArray (nameChar[i], defaultFormat)[0];
* } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace();
* } } } return pinyinName; }
*/
/**
* 随机返回一个小写字母
*
* @author liuy
* @return
* @return String
* @date 2014-3-10 下午5:58:52
*/
public static String getRecoNamemcod() {
//
// MassegeUtil.setLength(4);
String name = "";
Map<String, Object> param = new HashMap<String, Object>();
String[] beforeShuffle = new String[] { "a", "b", "c", "d", "e", "f",
"g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z" };
Random rd = new Random();
name = beforeShuffle[rd.nextInt(24)]; // 字母
return name;
}
/**
* 返回4个随机数
*
* @author liuy
* @return
* @return String
* @date 2014-3-10 下午5:58:06
*/
public static String getRandomNumber() {
StringBuilder randnum = new StringBuilder();// 验证码
// String[] c=new String[]{"2","3","4","5","6","7","8","9","6","8"};
for (int i = 0; i < 4; i++) {
Random rd = new Random();
int index = rd.nextInt(10);
do {
index = rd.nextInt(10);
} while (index == 0 || index == 1);
randnum.append(index);
}
return randnum.toString();
}
/**
* 返回6个随机数
*
* @author liuy
* @return
* @return String
* @date 2014-3-10 下午5:58:06
*/
public static String getRandomNumber6() {
StringBuilder randnum = new StringBuilder();// 验证码
// String[] c=new String[]{"2","3","4","5","6","7","8","9","6","8"};
for (int i = 0; i < 6; i++) {
Random rd = new Random();
int index = rd.nextInt(10);
do {
index = rd.nextInt(10);
} while (index == 0 || index == 1);
randnum.append(index);
}
return randnum.toString();
}
/**
* 判断是否为汉子
*
* @author liuy
* @return
* @return boolean
* @date 2014-3-10 下午6:36:51
*/
public static boolean getPatternHanzi(String str) {
Pattern p_str = Pattern.compile("[\\u4e00-\\u9fa5]+");
// String str="xzzc我是汉字";
Matcher m = p_str.matcher(str);
if (m.find() && m.group(0).equals(str)) {
// OK 是汉字
return true;
}
return false;
}
/**
* @about chengy
* @param str
* @return
* @date 2014-3-13 上午11:36:45 根据"$"符号切割字符串,返回一个字符串数组
*/
public static String[] subStringBY(String str) {
String[] a = str.split("\\$");
String[] strs = new String[a.length];
for (int i = 0; i < a.length; i++) {
strs[i] = a[i];
}
return strs;
}
public static BigDecimal getVipAmount(Integer vipLevel) {
if (vipLevel == 1) {
return new BigDecimal("100");
} else if (vipLevel == 2) {
return new BigDecimal("300");
} else if (vipLevel == 3) {
return new BigDecimal("500");
} else {
return BigDecimal.ZERO;
}
}
/**
* 输出JSON数据
* @param str
* @param response
* @param contextType
*/
public static void outJsonStr(String str,HttpServletResponse response,String contextType){
response.setContentType(contextType);
try {
response.getWriter().print(str);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 过滤html标签
* @param str
* @return
*/
public static String stripHtmlLabel(String str) {
if(Utils.strIsNull(str)){
return str;
}
str = str.replaceAll("<.*?>", "").replaceAll("\r\n", "");
return str;
}
/**
* 从map中取值赋值给对象
* @param obj 要赋值的对象
* @param map 数据源
*/
public static void getObjectFromMap(Object obj, Map<String,Object> map){
Class<?> cla = obj.getClass();//获得对象类型
Field field[] = cla.getDeclaredFields();//获得该类型中的所有属性
for(int i=0;i<field.length;i++) {//遍历属性列表
field[i].setAccessible(true);//禁用访问控制检查
Class<?> fieldType = field[i].getType();//获得属性类型
String attr = map.get(field[i].getName())==null?null:map.get(field[i].getName()).toString();//获得属性值
if(attr==null) {//如果属性值为null则不做任何处理,直接进入下一轮循环
continue;
}
/**
* 根据对象中属性类型的不同,将request对象中的字符串转换为相应的属性
*/
try {;
if(fieldType==String.class) {
field[i].set(obj,new String(attr));
}
else if(fieldType==Integer.class){//当转换失败时,设置0
field[i].set(obj,new Integer(attr));
}
else if(fieldType==Date.class) {//当转换失败时,设置为null
field[i].set(obj,new Date(attr));
}
else if(fieldType==BigDecimal.class) {//当转换失败时,设置为null
field[i].set(obj,new BigDecimal(attr));
}else if(fieldType==Short.class){
field[i].set(obj,new Short(attr));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0
* @param version1
* @param version2
* @return
*/
public static int compareVersion(String version1, String version2){
String[] versionArray1 = version1.split("\\.");//注意此处为正则匹配,不能用".";
String[] versionArray2 = version2.split("\\.");
int idx = 0;
int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
int diff = 0;
while (idx < minLength
&& (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
&& (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
++idx;
}
//如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
return diff;
}
/**
* String[]转int[]
* @param str
* @return
*/
public static Integer[] StringConvertInteger(String[] str){
Integer[] ig = new Integer[str.length];
for(int i=0;i<str.length;i++){
ig[i]=Integer.parseInt(str[i]);
}
return ig;
}
public static Map getParameterMap(HttpServletRequest request) {
// 参数Map
Map properties = request.getParameterMap();
// 返回值Map
Map returnMap = new HashMap();
Iterator entries = properties.entrySet().iterator();
Map.Entry entry;
String name = "";
String value = "";
while (entries.hasNext()) {
entry = (Map.Entry) entries.next();
name = (String) entry.getKey();
Object valueObj = entry.getValue();
if(null == valueObj){
value = "";
}else if(valueObj instanceof String[]){
String[] values = (String[])valueObj;
for(int i=0;i<values.length;i++){
value = values[i] + ",";
}
value = value.substring(0, value.length()-1);
}else{
value = valueObj.toString();
}
returnMap.put(name, value);
}
return returnMap;
}
public static int daysBetween(int counts,Date stime,Date etime) throws ParseException{
SimpleDateFormat sft = new SimpleDateFormat("yyyy-MM-dd");
String smdate = sft.format(stime);
String bdate = sft.format(new Date());
if(Utils.isObjectNotEmpty(etime)){
bdate = sft.format(etime);
}
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smdate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bdate));
cal.add(Calendar.DATE, counts);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* 判断是否在 0 点前minutes[0],后 minutes[1] 分钟, minutes[0] < 60 , minutes[1] < 60
* @param now
* @param minutes
* @return
*/
public static boolean nearDawnMinutes(Date now,String[] minutes){
boolean b = false;
try {
if(minutes != null && minutes.length==2){
Integer minute0 = Integer.valueOf(minutes[0]);
Integer minute1 = Integer.valueOf(minutes[1]);
if(Utils.isObjectNotEmpty(now) && minute0 <60 && minute1 < 60){
int nowHour = now.getHours();
int nowMinute = now.getMinutes();
if((nowHour == 23 && minute0>= 60-nowMinute) || ( nowHour ==0 && nowMinute<=minute1) ){
b = true;
}
}
}
} catch (Exception e) {
b = false;
}
return b;
}
/**
* 时间戳格式化
*/
public static String toString(String dateTime,String format){
SimpleDateFormat sdf=new SimpleDateFormat(format);
String sd = sdf.format(new Date(Long.parseLong(dateTime))); // 时间戳转换成时间
return sd;
}
}
\ No newline at end of file
package com.chineseall.readingdata.common.vo;
import lombok.Data;
import java.io.Serializable;
/**
* Created by yuchunlin on 2019/5/28.
*/
@Data
public class ClientItem implements Serializable{
private String clientName;
private String clientId;
private String clientSecret;
}
package com.chineseall.readingdata.common.vo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* Created by yuchunlin on 2019/5/28.
*/
@Data
@Component
@ConfigurationProperties(prefix = "oauthclient")
public class OauthClient {
private List<ClientItem> clients;
}
package com.chineseall.readingdata.common.vo;
import cn.sh.chineseall.framework.api.MapMessage;
import com.chineseall.readingdata.common.enums.ResultEnum;
/**
* 统一消息返回,<br>
* 目前只做错误消息返回
*
* @author yuchunlin
*/
public class TechMessage<T> extends MapMessage {
public Integer getCode() {
return (Integer) this.get("code");
}
public void setCode(Integer code) {
this.set("code", code);
}
public String getMsg() {
return (String) this.get("msg");
}
public void setMsg(String msg) {
this.set("msg", msg);
}
public T getData() {
return (T) this.get("data");
}
public void setData(T data) {
if (null != data){
this.put("data", data);
}
}
public TechMessage() {
this(ResultEnum.Success);
}
public TechMessage(Integer code, String msg) {
ResultEnum resultEnum = ResultEnum.findResultEnum(code);
if (resultEnum == ResultEnum.Success){
super.setSuccess(true);
}else {
super.setSuccess(false);
}
this.setCode(code);
this.setMsg(msg);
this.setInfo(msg);
}
public TechMessage(ResultEnum result) {
this(result.getCode(), result.getMessage());
}
public TechMessage(Integer code, String msg, T data) {
this(code, msg);
this.setData(data);
}
public TechMessage(ResultEnum result, T data) {
this(result);
this.setData(data);
}
}
package com.chineseall.readingdata.controller;
import cn.sh.chineseall.framework.lang.calendar.DateUtils;
import com.alibaba.fastjson.JSON;
import com.chineseall.readingdata.common.enums.ResultEnum;
import com.chineseall.readingdata.common.utils.DateUtil;
import com.chineseall.readingdata.common.vo.ClientItem;
import com.chineseall.readingdata.common.vo.OauthClient;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.model.DateStatData;
import com.chineseall.readingdata.model.SourceStatData;
import com.chineseall.readingdata.service.DataLogService;
import com.chineseall.readingdata.service.DataService;
import com.chineseall.readingdata.service.DateStatService;
import com.chineseall.readingdata.service.ReadingDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@RestController
@RequestMapping("stat")
public class StatController {
@Autowired
private DataLogService dataLogService;
@Autowired
private ReadingDataService readingDataService;
@Autowired
private DateStatService dateStatService;
@Autowired
private DataService dataService;
@Autowired
private OauthClient oauthClient;
@RequestMapping("index")
public TechMessage index(@RequestParam(value = "begin_date", required = false) String beginDate, @RequestParam(value = "end_date", required = false) String endDate){
Map<String, Object> data = new HashMap<>();
if(beginDate==null && endDate==null){
data.put("begin_date", DateUtils.dateToString(DateUtils.nextDay(new Date(), -6), "yyyy-MM-dd"));
data.put("end_date", DateUtils.dateToString(new Date(), "yyyy-MM-dd"));
beginDate = DateUtils.dateToString(DateUtils.nextDay(new Date(), -6), "yyyy-MM-dd");
endDate = DateUtils.dateToString(new Date(), "yyyy-MM-dd");
}
// 新增数据量
data.put("addDataCount", dateStatService.countByDate(beginDate, endDate));
// 入库数据总量
data.put("totalDataCount", dateStatService.countAll());
// 数据来源渠道数量
data.put("appCount", dateStatService.countSource());
// 调用接口次数
data.put("queryApiCount", dataLogService.countByDate(DateUtil.getBeginTime(DateUtils.stringToDate(beginDate, "yyyy-MM-dd")), DateUtil.getEndTime(DateUtils.stringToDate(endDate, "yyyy-MM-dd"))));
List<Map<String, Object>> appRanks = new ArrayList<>();
// 数据来源渠道排行
List<SourceStatData> topTen = dateStatService.queryTopTen();
Long topTenSum = topTen.stream().mapToLong(SourceStatData::getCount).sum();
topTen.forEach(vo->{
Map<String, Object> appRank1 = new HashMap<>();
appRank1.put("name", vo.getClientName());
appRank1.put("count", vo.getCount());
appRank1.put("percent", vo.getCount()/topTenSum*100);
appRanks.add(appRank1);
});
data.put("appRanks", appRanks);
List<String> sources = dateStatService.querySourceByDate(beginDate, endDate);
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
List<Map<String, Object>> dateDatas = new ArrayList<>();
for(String clientId : sources) {
Map<String, Object> source1 = new HashMap<>();
source1.put("source", clientId);
source1.put("name", clientItemMap.get(clientId).getClientName());
List<Map<String, Object>> sourceDatas = new ArrayList<>();
List<DateStatData> dateStatDataList = dateStatService.queryByTimeAndSource(beginDate, endDate, clientId);
dateStatDataList.forEach(dateStatData -> {
Map<String, Object> dateData1 = new HashMap<>();
dateData1.put("date", dateStatData.getDate());
dateData1.put("count", dateStatData.getCount());
sourceDatas.add(dateData1);
});
source1.put("data", sourceDatas);
dateDatas.add(source1);
}
data.put("dateDatas", dateDatas);
return new TechMessage(ResultEnum.Success, data);
}
private Map<String, String> getLatest7DatesMap(Date date){
Map<String, String> map = new LinkedHashMap<>();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
map.put(format.format(date), cal.get(Calendar.MONTH)+1 + "月" + (cal.get(Calendar.DAY_OF_MONTH)) + "日");
for(int i = 0; i<6 ;i++) {
cal.add(Calendar.DAY_OF_MONTH, -1);
Date newDate = cal.getTime();
map.put(format.format(newDate), cal.get(Calendar.MONTH)+1 + "月" + (cal.get(Calendar.DAY_OF_MONTH)) + "日");
}
return map;
}
}
package com.chineseall.readingdata.controller.api;
import com.alibaba.fastjson.JSON;
import com.chineseall.readingdata.common.enums.ResultEnum;
import com.chineseall.readingdata.common.vo.ClientItem;
import com.chineseall.readingdata.common.vo.OauthClient;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.model.DataLog;
import com.chineseall.readingdata.model.ReadingData;
import com.chineseall.readingdata.service.DataLogService;
import com.chineseall.readingdata.service.DateStatService;
import com.chineseall.readingdata.service.ReadingDataService;
import com.chineseall.readingdata.common.utils.EncodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
@RestController
@RequestMapping("api")
public class ReadingDataApi {
@Autowired
private OauthClient oauthClient;
@Autowired
private DataLogService dataLogService;
@Autowired
private ReadingDataService readingDataService;
@Autowired
private DateStatService dateStatService;
@RequestMapping(value = "save", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
public TechMessage save(HttpServletRequest request, HttpServletResponse response, @RequestBody ReadingData readingData){
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
System.out.println("clientItemMap.................................."+JSON.toJSONString(clientItemMap));
String clientId = request.getHeader("CLIENT_ID");
System.out.println("clientId.................................."+clientId);
ClientItem clientItem = clientItemMap.get(clientId);
System.out.println("clientItem.................................."+JSON.toJSONString(clientItem));
if (null == clientItem) {
return new TechMessage(ResultEnum.ParamsNull);
}
String sign = request.getHeader("SIGN");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
return new TechMessage(ResultEnum.SignUnValidate);
}
if(readingData==null){
return new TechMessage(ResultEnum.ReadingDataInvalid);
}
if(readingData.getId()==null||readingData.getActor()==null||readingData.getVerb()==null||readingData.getObject()==null){
return new TechMessage(ResultEnum.ReadingDataInvalid);
}
// 日志
DataLog dataLog = new DataLog();
dataLog.setClientId(clientId);
dataLog.setClientName(clientItem.getClientName());
try {
readingData.setId(clientId+readingData.getId());
readingData.setClientId(clientId);
readingData.setClientName(clientItem.getClientName());
readingDataService.save(readingData);
dataLog.setSuccess(true);
dataLog.setSuccessCount(1);
dataLogService.save(dataLog);
dateStatService.addDateStat(clientId, 1l);
dateStatService.addSourceStat(clientId, 1l);
}catch (Exception e){
e.printStackTrace();
dataLog.setSuccess(false);
dataLogService.save(dataLog);
return new TechMessage(ResultEnum.Error);
}
return new TechMessage(ResultEnum.Success);
}
@RequestMapping(value = "batch/save", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
public TechMessage batchSave(HttpServletRequest request, HttpServletResponse response, @RequestBody List<ReadingData> readingDatas){
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
String clientId = request.getHeader("CLIENT_ID");
ClientItem clientItem = clientItemMap.get(clientId);
if (null == clientItem) {
return new TechMessage(ResultEnum.ParamsNull);
}
String sign = request.getHeader("SIGN");
String signOrigin = clientItem.getClientId() + "$$" + clientItem.getClientSecret();
String md5Hex = EncodeUtil.md5(signOrigin);
if (!Objects.equals(sign, md5Hex)) {
return new TechMessage(ResultEnum.SignUnValidate);
}
if(readingDatas==null){
return new TechMessage(ResultEnum.ReadingDataInvalid);
}
for(ReadingData readingData : readingDatas) {
if (readingData.getId() == null || readingData.getActor() == null || readingData.getVerb() == null || readingData.getObject() == null) {
return new TechMessage(ResultEnum.ReadingDataInvalid);
}
}
// 日志
DataLog dataLog = new DataLog();
dataLog.setClientId(clientId);
dataLog.setClientName(clientItem.getClientName());
try {
for(ReadingData readingData : readingDatas) {
readingData.setId(clientId + readingData.getId());
readingData.setClientId(clientId);
readingData.setClientName(clientItem.getClientName());
readingDataService.save(readingData);
}
dataLog.setSuccess(true);
dataLog.setSuccessCount(readingDatas.size());
dataLogService.save(dataLog);
dateStatService.addDateStat(clientId, readingDatas.size()*1l);
dateStatService.addSourceStat(clientId, readingDatas.size()*1l);
}catch (Exception e){
e.printStackTrace();
dataLog.setSuccess(false);
dataLogService.save(dataLog);
return new TechMessage(ResultEnum.Error);
}
return new TechMessage(ResultEnum.Success);
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mongo.dao.StaticCacheDimensionDocumentMongoDao;
import com.chineseall.readingdata.model.DataLog;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
@Component
public class DataLogDao extends StaticCacheDimensionDocumentMongoDao<DataLog, String> {
public Long countByDate(Date beginDate, Date endDate){
return count(Query.query(Criteria.where("createTime").gte(beginDate).lt(endDate)));
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.core.repackaged.org.springframework.data.domain.Sort;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mongo.dao.StaticCacheDimensionDocumentMongoDao;
import com.chineseall.readingdata.model.DateStatData;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class DateStatDao extends StaticCacheDimensionDocumentMongoDao<DateStatData, String> {
public List<DateStatData> queryByTimeAndSource(String beginDate, String endDate, String clientId){
return query(Query.query(Criteria.where("date").gte(beginDate).lte(endDate).and("clientId").is(clientId)).with(new Sort(Sort.Direction.ASC, "date")));
}
public DateStatData queryByDateAndClientId(String date, String clientId){
return query(Query.query(Criteria.where("date").is(date).and("clientId").is(clientId))).stream().findFirst().orElse(null);
}
public Long countByDate(String beginDate, String endDate){
return query(Query.query(Criteria.where("date").gte(beginDate).lte(endDate))).stream().mapToLong(DateStatData::getCount).sum();
}
public List<String> querySourceByDate(String beginDate, String endDate){
return query(Query.query(Criteria.where("date").gte(beginDate).lte(endDate))).stream().map(DateStatData::getClientId).distinct().collect(Collectors.toList());
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.dao.mysql.jdbc.dao.AlphaStaticJdbcDao;
import com.chineseall.readingdata.model.ReadingBaseInfo;
import org.springframework.stereotype.Component;
import java.util.Collection;
@Component
public class ReadingBaseInfoDao extends AlphaStaticJdbcDao<ReadingBaseInfo, String> {
@Override
protected void calculateCacheDimensions(ReadingBaseInfo readingBaseInfo, Collection<String> collection) {
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.core.repackaged.org.springframework.data.domain.Sort;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mongo.dao.StaticCacheDimensionDocumentMongoDao;
import com.chineseall.readingdata.model.ReadingData;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
public class ReadingDataDao extends StaticCacheDimensionDocumentMongoDao<ReadingData, String> {
public List<ReadingData> queryDataByTime(Date beginTime, Date endTime){
Criteria criteria = Criteria.where("createTime").gte(beginTime).lt(endTime);
return query(new Query(criteria));
}
public List<ReadingData> queryDatas(Integer begin, Integer end){
return query(new Query(Criteria.where("id").gte(begin).lt(end)).with(new Sort(Sort.Direction.ASC, "id")));
}
public Long countByTime(Date beginTime, Date endTime){
Criteria criteria = Criteria.where("createTime").gte(beginTime).lt(endTime);
return count(new Query(criteria));
}
public ReadingData queryDataByTimeFirst(Date beginTime, Date endTime){
Criteria criteria = Criteria.where("createTime").gte(beginTime).lt(endTime);
return query(new Query(criteria).with(new Sort(Sort.Direction.ASC, "createTime")).limit(1)).stream().findFirst().orElse(null);
}
public ReadingData queryDataByTimeLast(Date beginTime, Date endTime){
Criteria criteria = Criteria.where("createTime").gte(beginTime).lt(endTime);
return query(new Query(criteria).with(new Sort(Sort.Direction.DESC, "createTime")).limit(1)).stream().findFirst().orElse(null);
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.core.repackaged.org.springframework.data.domain.Sort;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mysql.jdbc.dao.AlphaStaticJdbcDao;
import com.chineseall.readingdata.model.ReadingBaseInfo;
import com.chineseall.readingdata.model.ShangtuData;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.List;
@Component
public class ShangtuDataDao extends AlphaStaticJdbcDao<ShangtuData, Long> {
@Override
protected void calculateCacheDimensions(ShangtuData shangtuData, Collection<String> collection) {
}
public List<ShangtuData> queryDatas(Integer begin, Integer end){
return query(new Query(Criteria.where("id").gte(begin).lt(end)).with(new Sort(Sort.Direction.ASC, "id")));
}
}
package com.chineseall.readingdata.dao;
import cn.sh.chineseall.framework.core.repackaged.org.springframework.data.domain.Sort;
import cn.sh.chineseall.framework.dao.core.hql.Criteria;
import cn.sh.chineseall.framework.dao.core.hql.Query;
import cn.sh.chineseall.framework.dao.mongo.dao.StaticCacheDimensionDocumentMongoDao;
import com.chineseall.readingdata.model.SourceStatData;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SourceStatDao extends StaticCacheDimensionDocumentMongoDao<SourceStatData, String> {
public List<SourceStatData> queryTopTen(){
return query(Query.query(new Criteria()).with(new Sort(Sort.Direction.DESC, "count")).limit(10));
}
public SourceStatData queryByClientId(String clientId){
return query(Query.query(Criteria.where("clientId").is(clientId))).stream().findFirst().orElse(null);
}
public Long countAll(){
return query(Query.query(new Criteria())).stream().mapToLong(SourceStatData::getCount).sum();
}
public Long countSource(){
return count(Query.query(new Criteria()));
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import lombok.Data;
import java.util.Date;
@Data
@DocumentConnection(configName = "mongo")
@DocumentDatabase(database = "xapi")
@DocumentCollection(collection = "api_log")
public class DataLog implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentCreateTimestamp
private Date createTime;
@DocumentUpdateTimestamp
private Date updateTime;
@DocumentField
private String clientId;
@DocumentField
private String clientName;
@DocumentField
private Boolean success;
@DocumentField
private Integer successCount;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import lombok.Data;
import java.util.Date;
@Data
@DocumentConnection(configName = "mongo")
@DocumentDatabase(database = "xapi")
@DocumentCollection(collection = "date_stat")
public class DateStatData implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentCreateTimestamp
private Date createTime;
@DocumentUpdateTimestamp
private Date updateTime;
@DocumentField
private String clientId;
@DocumentField
private String clientName;
@DocumentField
private String date;
@DocumentField
private Long count;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import cn.sh.chineseall.framework.dao.core.annotation.mysql.DocumentTable;
import lombok.Data;
import java.util.Date;
import java.util.Map;
@Data
@DocumentConnection(configName = "mysql")
@DocumentTable(table = "reading_data")
public class ReadingBaseInfo implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentField("user_id")
private String userId;
@DocumentField("real_name")
private String realName;
@DocumentField
private String birthday;
@DocumentField
private String race;
@DocumentField("student_code")
private String studentCode;
@DocumentField
private String age;
@DocumentField("sex_code")
private String sexCode;
@DocumentField("sex_name")
private String sexName;
@DocumentField("grade_code")
private String gradeCode;
@DocumentField("grade_name")
private String gradeName;
@DocumentField("stage_code")
private String stageCode;
@DocumentField("stage_name")
private String stageName;
@DocumentField("school_code")
private String schoolCode;
@DocumentField("school_name")
private String schoolName;
@DocumentField("school_addr")
private String schoolAddr;
@DocumentField("region_code")
private String regionCode;
@DocumentField("region_name")
private String regionName;
@DocumentField("verb_type")
private String verbType;
@DocumentField("verb_name")
private String verbName;
@DocumentField("lend_type_name")
private String lendTypeName;
@DocumentField("lend_type_code")
private String lendTypeCode;
@DocumentField("lend_date")
private String lendDate;
@DocumentField("lend_expired_date")
private String lendExpiredDate;
@DocumentField("lend_addr")
private String lendAddr;
@DocumentField("book_id")
private String bookId;
@DocumentField("book_type_code")
private String bookTypeCode;
@DocumentField("book_type_name")
private String bookTypeName;
@DocumentField("bar_code")
private String barCode;
@DocumentField("book_name")
private String bookName;
@DocumentField("isbn")
private String isbn;
@DocumentField("pub_date")
private String pubDate;
@DocumentField("clc_code")
private String clcCode;
@DocumentField("words_count")
private String wordsCount;
@DocumentField("page_count")
private String pageCount;
@DocumentField
private String price;
@DocumentField
private String author;
@DocumentField("pub_name")
private String pubName;
@DocumentField("pub_code")
private String pubCode;
@DocumentField("subject_code")
private String subjectCode;
@DocumentField("subject_name")
private String subjectName;
@DocumentField("client_id")
private String clientId;
@DocumentField("client_name")
private String clientName;
@DocumentField("create_time")
private Date createTime;
@DocumentField
private Date timestamp;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import lombok.Data;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
@Data
@DocumentConnection(configName = "mongo")
@DocumentDatabase(database = "xapi")
@DocumentCollection(collection = "reading_data")
public class ReadingData implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentCreateTimestamp
private Date createTime;
@DocumentField
private Date timestamp;
@DocumentField
private Map<String, Object> actor;
@DocumentField
private Map<String, Object> verb;
@DocumentField
private Map<String, Object> object;
@DocumentField
private Boolean valid;
@DocumentField
private String clientId;
@DocumentField
private String clientName;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mysql.DocumentTable;
import com.chineseall.readingdata.common.enums.BookType;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
@DocumentConnection(configName = "mysql")
@DocumentTable(table = "st")
public class ShangtuData implements CacheDimensionDocument {
@DocumentId
private Long id;
@DocumentField
private String jhlx;//借还状态
@DocumentField
private String jhrq;//借还日期
@DocumentField
private String yhrq;//预还日期 只有外借才有值
@DocumentField
private String jhdd;//借还地点
@DocumentField
private String tstm;//图书条码
@DocumentField
private String sm ;//书名
@DocumentField
private String isbn;//isbn号
@DocumentField
private String zz ;//作者
@DocumentField
private String cbs ;//出版社
@DocumentField
private String cbrq;//出版日期
@DocumentField
private String flh ;//分类号 中图分类号
@DocumentField
private String ys ;//页数
@DocumentField
private String dj ;//定价
@DocumentField
private String xjh ;//学籍号
@DocumentField
private String xxdm;//学校代码
@DocumentField
private String xxmc;//学校名称
@DocumentField
private String zjlx;//
@DocumentField
private String xbm ;//性别
@DocumentField
private String csrq;//出生日期
@DocumentField
private String mz ;//民族
@DocumentField
private String gj ;//国籍
@DocumentField
private String xd ;//学段 1、小学,2、中学
@DocumentField
private String xm ;//姓名
@DocumentField
private String sfz ;//身份证
@DocumentField
private String qxdm;//区县代码
@DocumentField
private String student_id ;//学生ID
@DocumentField
private String school_id ;//学校ID
@DocumentField
private String area_id;//区县ID
@DocumentField
private String book_id;//图书ID
@DocumentField
private String auth_id;//作者ID
@DocumentField
private String pub_id ;//出版社ID
@DocumentField
private String date6_birth;//出生日期
@DocumentField
private String date6_enter ;//入学时间
@DocumentField
private String date6_lend ;//借还时间
@DocumentField
private String grade_id ;//年级ID
@DocumentField
private String age_id ;//年龄ID
@DocumentField
private String period_id ;//学段ID
@DocumentField
private String sex_id ;//性别ID
@DocumentField
private String zt_id;//性别ID
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
public ReadingData toReadingData(){
ReadingData readingData = new ReadingData();
Map<String, Object> actor = new HashMap<>();
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("userId", this.student_id);
userInfo.put("realName", this.xm);
userInfo.put("birthday", this.csrq);
userInfo.put("race", this.mz);
userInfo.put("studentCode", this.xjh);
userInfo.put("age", this.age_id);
Map<String, Object> sex = new HashMap<>();
sex.put("sexCode", this.xbm);
sex.put("sexName", null);
userInfo.put("sex", sex);
Map<String, Object> grade = new HashMap<>();
grade.put("gradeCode", this.grade_id);
grade.put("gradeName", null);
userInfo.put("grade", grade);
Map<String, Object> stage = new HashMap<>();
stage.put("stageCode", this.xd);
stage.put("stageName", null);
userInfo.put("stage", stage);
Map<String, Object> schoolInfo = new HashMap<>();
schoolInfo.put("schoolId", this.school_id);
schoolInfo.put("schoolCode", this.xxdm);
schoolInfo.put("schoolName", this.xxmc);
schoolInfo.put("schoolAddr", null);
userInfo.put("schoolInfo", schoolInfo);
Map<String, Object> regionInfo = new HashMap<>();
regionInfo.put("regionCode", this.qxdm);
regionInfo.put("regionName", null);
userInfo.put("regionInfo", regionInfo);
actor.put("userInfo", userInfo);
readingData.setActor(actor);
Map<String, Object> verb = new HashMap<>();
verb.put("verbType", null);
verb.put("verbName", this.jhlx);
readingData.setVerb(verb);
Map<String, Object> object = new HashMap<>();
Map<String, Object> lendInfo = new HashMap<>();
Map<String, Object> lendType = new HashMap<>();
lendType.put("typeCode", null);
lendType.put("typeName", this.jhlx);
lendInfo.put("lendType", lendType);
lendInfo.put("lendDate", this.jhrq);
lendInfo.put("lendExpiredDate", this.yhrq);
lendInfo.put("lendAddr", this.jhdd);
object.put("lendInfo", lendInfo);
Map<String, Object> bookInfo = new HashMap<>();
Map<String, Object> bookType = new HashMap<>();
bookType.put("typeCode", BookType.PAPER.getCode());
bookType.put("typeName", BookType.PAPER.getDesc());
bookInfo.put("bookType", bookType);
bookInfo.put("bookId", this.book_id);
bookInfo.put("barCode", this.tstm);
bookInfo.put("bookName", this.sm);
bookInfo.put("isbn", this.isbn);
bookInfo.put("pubDate", this.cbrq);
bookInfo.put("clcCode", this.flh);
bookInfo.put("wordsCount", null);
bookInfo.put("pageCount", this.ys);
bookInfo.put("price", this.dj);
bookInfo.put("author", this.zz);
bookInfo.put("authorId", this.auth_id);
Map<String, Object> pubInfo = new HashMap<>();
pubInfo.put("pubCode", this.pub_id);
pubInfo.put("pubName", this.cbs);
bookInfo.put("pubInfo", pubInfo);
Map<String, Object> subject = new HashMap<>();
subject.put("subjectCode", null);
subject.put("subjectName", null);
bookInfo.put("subject", subject);
object.put("bookInfo", bookInfo);
readingData.setObject(object);
return readingData;
}
}
package com.chineseall.readingdata.model;
import cn.sh.chineseall.framework.dao.core.CacheDimensionDocument;
import cn.sh.chineseall.framework.dao.core.annotation.*;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentCollection;
import cn.sh.chineseall.framework.dao.core.annotation.mongo.DocumentDatabase;
import lombok.Data;
import java.util.Date;
@Data
@DocumentConnection(configName = "mongo")
@DocumentDatabase(database = "xapi")
@DocumentCollection(collection = "source_stat")
public class SourceStatData implements CacheDimensionDocument {
@DocumentId
private String id;
@DocumentCreateTimestamp
private Date createTime;
@DocumentUpdateTimestamp
private Date updateTime;
@DocumentField
private String clientId;
@DocumentField
private String clientName;
@DocumentField
private Long count;
@Override
public String[] generateCacheDimensions() {
return new String[0];
}
}
package com.chineseall.readingdata.service;
import com.chineseall.readingdata.model.DataLog;
import java.util.Date;
import java.util.Map;
public interface DataLogService {
DataLog getById(String id);
void save(DataLog dataLog);
Long countByDate(Date beginDate, Date endDate);
}
package com.chineseall.readingdata.service;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.model.ShangtuData;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
public interface DataService {
@RequestMapping(value = "/init/shangtu", method = {RequestMethod.GET})
TechMessage initShangtuData();
List<ShangtuData> queryShangtuData(Integer begin, Integer end);
}
package com.chineseall.readingdata.service;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.model.DateStatData;
import com.chineseall.readingdata.model.SourceStatData;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
public interface DateStatService {
void save(DateStatData dateStatData);
List<DateStatData> queryByTimeAndSource(String beginDate, String endDate, String clientId);
List<SourceStatData> queryTopTen();
@RequestMapping(value = "/process/stat2", method = {RequestMethod.GET})
TechMessage processDateStatDate(@RequestParam(value = "begin_time", required = false) Date beginTime, @RequestParam(value = "end_time", required = false)Date endTime);
@RequestMapping(value = "/process/stat", method = {RequestMethod.GET})
TechMessage processDateStatDate2(@RequestParam(value = "date") String date);
Long countByDate(String beginDate, String endDate);
Long countAll();
Long countSource();
List<String> querySourceByDate(String beginDate, String endDate);
void addDateStat(String clientId, Long count);
void addSourceStat(String clientId, Long count);
}
package com.chineseall.readingdata.service;
import com.chineseall.readingdata.model.ReadingData;
public interface ReadingDataService {
ReadingData getById(String id);
void save(ReadingData readingData);
}
package com.chineseall.readingdata.service.impl;
import com.chineseall.readingdata.dao.DataLogDao;
import com.chineseall.readingdata.model.DataLog;
import com.chineseall.readingdata.service.DataLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@Service
public class DataLogServiceImpl implements DataLogService {
@Autowired
private DataLogDao dataLogDao;
@Override
public DataLog getById(String id) {
return dataLogDao.load(id);
}
@Override
public void save(DataLog dataLog) {
if(dataLog.getId() != null){
dataLog.setUpdateTime(new Date());
dataLogDao.replace(dataLog);
} else{
dataLog.setId(UUID.randomUUID().toString());
dataLog.setCreateTime(new Date());
dataLogDao.insert(dataLog);
}
}
@Override
public Long countByDate(Date beginDate, Date endDate) {
return dataLogDao.countByDate(beginDate, endDate);
}
}
package com.chineseall.readingdata.service.impl;
import cn.sh.chineseall.framework.lang.calendar.DateUtils;
import com.chineseall.readingdata.common.enums.ResultEnum;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.dao.ReadingBaseInfoDao;
import com.chineseall.readingdata.dao.ReadingDataDao;
import com.chineseall.readingdata.dao.ShangtuDataDao;
import com.chineseall.readingdata.model.ReadingData;
import com.chineseall.readingdata.model.ShangtuData;
import com.chineseall.readingdata.service.DataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RestController
public class DataServiceImpl implements DataService {
@Autowired
private ReadingDataDao readingDataDao;
@Autowired
private ShangtuDataDao shangtuDataDao;
@Override
public TechMessage initShangtuData() {
int count = 5000;
int i = 0;
System.out.println("..........开始执行跑上图数据入库"+DateUtils.dateToString(new Date()));
while(true) {
List<ShangtuData> shangtuDatas = shangtuDataDao.queryDatas(i*count, (i+1)*count);
if (shangtuDatas.size() == 0) {
break;
}
List<ReadingData> readingDatas = new ArrayList<>();
shangtuDatas.forEach(shangtuData -> {
ReadingData readingData = shangtuData.toReadingData();
readingData.setId(shangtuData.getId().toString());
readingData.setCreateTime(new Date());
Date timestamp = DateUtils.stringToDate(shangtuData.getJhrq(), "yyyyMMdd");
readingData.setTimestamp(timestamp);
readingData.setClientId("shangtuClentId");
readingData.setClientName("上图");
readingDatas.add(readingData);
});
readingDataDao.inserts(readingDatas);
i++;
}
System.out.println("..........执行跑上图数据入库结束"+DateUtils.dateToString(new Date()));
return new TechMessage(ResultEnum.Success);
}
@Override
public List<ShangtuData> queryShangtuData(Integer begin, Integer end) {
return shangtuDataDao.queryDatas(begin, end);
}
}
package com.chineseall.readingdata.service.impl;
import cn.sh.chineseall.framework.lang.calendar.DateUtils;
import com.chineseall.readingdata.common.enums.ResultEnum;
import com.chineseall.readingdata.common.utils.DateUtil;
import com.chineseall.readingdata.common.vo.ClientItem;
import com.chineseall.readingdata.common.vo.OauthClient;
import com.chineseall.readingdata.common.vo.TechMessage;
import com.chineseall.readingdata.dao.DateStatDao;
import com.chineseall.readingdata.dao.ReadingDataDao;
import com.chineseall.readingdata.dao.SourceStatDao;
import com.chineseall.readingdata.model.DateStatData;
import com.chineseall.readingdata.model.ReadingData;
import com.chineseall.readingdata.model.SourceStatData;
import com.chineseall.readingdata.service.DateStatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@RestController
public class DateStatServiceImpl implements DateStatService {
@Autowired
private DateStatDao dateStatDao;
@Autowired
private SourceStatDao sourceStatDao;
@Autowired
private ReadingDataDao readingDataDao;
@Autowired
private OauthClient oauthClient;
@Override
public void save(DateStatData dateStatData) {
if(dateStatData.getId() != null){
dateStatDao.replace(dateStatData);
} else {
dateStatDao.insert(dateStatData);
}
}
@Override
public List<DateStatData> queryByTimeAndSource(String beginDate, String endDate, String clientId) {
return dateStatDao.queryByTimeAndSource(beginDate, endDate, clientId);
}
@Override
public List<SourceStatData> queryTopTen() {
return sourceStatDao.queryTopTen();
}
//@Scheduled(cron="0 0 0 * * ?")
public void synDateStatDate(){
processDateStatDate(DateUtil.getBeginTime(DateUtils.nextDay(new Date(), -1)), DateUtil.getEndTime(new Date()));
}
@Override
public TechMessage processDateStatDate(@RequestParam(value = "begin_time") Date beginTime, @RequestParam(value = "end_time")Date endTime){
System.out.println("..........开始执行跑xapi每日统计表"+DateUtils.dateToString(new Date()));
try {
if(DateUtils.dayDiff(beginTime, endTime)<0){
Date bt = DateUtils.nextDay(beginTime, 1);
processDateStatDate(beginTime, bt);
return processDateStatDate(bt, endTime);
}
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
// 根据数据量判断是否拆分
Long count = readingDataDao.countByTime(beginTime, endTime);
if(count>20000l) {
Date bt = readingDataDao.queryDataByTimeFirst(beginTime, endTime).getCreateTime();
Date end = addOneMilli(readingDataDao.queryDataByTimeLast(beginTime, endTime).getCreateTime());
while (true) {
Date et = addTwentySec(bt);
boolean endFlag = false;
if (et.after(end)) {
et = end;
endFlag = true;
}
List<ReadingData> readingDataList = readingDataDao.queryDataByTime(bt, et);
System.out.println("............................................"+DateUtils.dateToString(bt));
List<String> clientIds = readingDataList.stream().map(vo -> vo.getClientId()).distinct().collect(Collectors.toList());
clientIds.forEach(clientId -> {
Long dataCount = readingDataList.stream().filter(vo->vo.getClientId()==null?false:(vo.getClientId().equals(clientId))).count();
// 每日统计
String date = DateUtils.dateToString(beginTime, "yyyy-MM-dd");
DateStatData dateStatData = dateStatDao.queryByDateAndClientId(date, clientId);
if(dateStatData == null) {
dateStatData = new DateStatData();
dateStatData.setDate(DateUtils.dateToString(beginTime, "yyyy-MM-dd"));
dateStatData.setClientId(clientId);
if (clientItemMap.get(clientId) != null) {
dateStatData.setClientName(clientItemMap.get(clientId).getClientName());
}
dateStatData.setCount(dataCount);
dateStatDao.insert(dateStatData);
}else{
dateStatData.setCount(dataCount+dateStatData.getCount());
dateStatDao.replace(dateStatData);
}
// 来源统计
SourceStatData sourceStatData = sourceStatDao.queryByClientId(clientId);
if(sourceStatData == null){
sourceStatData = new SourceStatData();
sourceStatData.setClientId(clientId);
if (clientItemMap.get(clientId) != null) {
sourceStatData.setClientName(clientItemMap.get(clientId).getClientName());
}
sourceStatData.setCount(dataCount);
sourceStatDao.insert(sourceStatData);
}else{
sourceStatData.setCount(sourceStatData.getCount()+dataCount);
sourceStatDao.replace(sourceStatData);
}
});
bt = et;
if (endFlag) {
break;
}
}
} else {
List<ReadingData> readingDataList = readingDataDao.queryDataByTime(beginTime, endTime);
List<String> clientIds = readingDataList.stream().map(vo -> vo.getClientId()).collect(Collectors.toList());
clientIds.forEach(clientId -> {
Long dataCount = readingDataList.stream().filter(vo->vo.getClientId()==null?null:(vo.getClientId().equals(clientId))).count();
// 每日统计
String date = DateUtils.dateToString(beginTime, "yyyy-MM-dd");
DateStatData dateStatData = dateStatDao.queryByDateAndClientId(date, clientId);
if(dateStatData == null) {
dateStatData = new DateStatData();
dateStatData.setDate(DateUtils.dateToString(beginTime, "yyyy-MM-dd"));
dateStatData.setClientId(clientId);
if (clientItemMap.get(clientId) != null) {
dateStatData.setClientName(clientItemMap.get(clientId).getClientName());
}
dateStatData.setCount(dataCount);
dateStatDao.insert(dateStatData);
}else{
dateStatData.setCount(dataCount+dateStatData.getCount());
dateStatDao.replace(dateStatData);
}
// 来源统计
SourceStatData sourceStatData = sourceStatDao.queryByClientId(clientId);
if(sourceStatData == null){
sourceStatData = new SourceStatData();
sourceStatData.setClientId(clientId);
if (clientItemMap.get(clientId) != null) {
sourceStatData.setClientName(clientItemMap.get(clientId).getClientName());
}
sourceStatData.setCount(dataCount);
sourceStatDao.insert(sourceStatData);
}else{
sourceStatData.setCount(sourceStatData.getCount()+dataCount);
sourceStatDao.replace(sourceStatData);
}
});
}
System.out.println("..........执行跑xapi每日统计表结束"+DateUtils.dateToString(new Date()));
return new TechMessage(ResultEnum.Success);
} catch (Exception e){
e.printStackTrace();
}
return new TechMessage(ResultEnum.Error);
}
@Override
public TechMessage processDateStatDate2(String date) {
return processDateStatDate(DateUtil.getBeginTime(DateUtils.stringToDate(date, "yyyy-MM-dd")), DateUtil.getEndTime(DateUtils.stringToDate(date, "yyyy-MM-dd")));
}
@Override
public Long countByDate(String beginDate, String endDate) {
return dateStatDao.countByDate(beginDate, endDate);
}
@Override
public Long countAll() {
return sourceStatDao.countAll();
}
@Override
public Long countSource() {
return sourceStatDao.countSource();
}
@Override
public List<String> querySourceByDate(String beginDate, String endDate) {
return dateStatDao.querySourceByDate(beginDate, endDate);
}
@Override
public void addDateStat(String clientId, Long count) {
DateStatData dateStatData = dateStatDao.queryByDateAndClientId(DateUtils.dateToString(new Date(), "yyyy-MM-dd"), clientId);
if(dateStatData == null){
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
dateStatData = new DateStatData();
dateStatData.setClientId(clientId);
dateStatData.setClientName(clientItemMap.get(clientId).getClientName());
dateStatData.setDate(DateUtils.dateToString(new Date(), "yyyy-MM-dd"));
dateStatData.setCount(count);
dateStatDao.insert(dateStatData);
} else {
dateStatData.setCount(dateStatData.getCount()+count);
dateStatDao.replace(dateStatData);
}
}
@Override
public void addSourceStat(String clientId, Long count) {
SourceStatData sourceStatData = sourceStatDao.queryByClientId(clientId);
if(sourceStatData == null){
Map<String, ClientItem> clientItemMap = oauthClient.getClients().stream().collect(Collectors.toMap(ClientItem::getClientId, Function.identity()));
sourceStatData = new SourceStatData();
sourceStatData.setClientId(clientId);
sourceStatData.setClientName(clientItemMap.get(clientId).getClientName());
sourceStatData.setCount(count);
sourceStatDao.insert(sourceStatData);
} else {
sourceStatData.setCount(sourceStatData.getCount()+count);
sourceStatDao.replace(sourceStatData);
}
}
private Date addTwentySec(Date date){
return new Date(date.getTime() + 4000);
}
private Date addOneMilli(Date date){
return new Date(date.getTime() + 1);
}
private Date addOneHundredSec(Date date){
return new Date(date.getTime() + 20000);
}
}
package com.chineseall.readingdata.service.impl;
import com.chineseall.readingdata.dao.ReadingDataDao;
import com.chineseall.readingdata.model.ReadingData;
import com.chineseall.readingdata.service.ReadingDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.UUID;
@Service
public class ReadingDataServiceImpl implements ReadingDataService {
@Autowired
private ReadingDataDao readingDataDao;
@Override
public ReadingData getById(String id) {
return readingDataDao.load(id);
}
@Override
public void save(ReadingData readingData) {
readingData.setCreateTime(new Date());
readingDataDao.insert(readingData);
}
}
server:
port: 9600
context-path: /authcenter
security:
user:
name: admin
password: 123456
ignored: /**
spring:
application:
name: eden-authcenter-agent
mvc:
static-path-pattern: /static/**
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
mode: LEGACYHTML5
encoding: UTF-8
enabled: true
content-type: text/html
jackson:
property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
default-property-inclusion: non_null
serialization: true
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
http:
multipart:
max-file-size: 200MB
max-request-size: 300MB
oauthclient:
clients:
- clientName: 上海数字教材
clientId: szjcClentId
clientSecret: szjcClientSecret
- clientName: 上图
clientId: shangtuClentId
clientSecret: shangtuClientSecret
{
"mongo": [
{
"connectionName": "mongo",
"host": "192.168.1.177",
"port": 27017,
"replicaSet": "192.168.1.177:27017",
"maxConnectionsPerHost": 3000,
"threadsAllowedToBlockForConnectionMultiplier": 10,
"authentication": true,
"connectTimeout": 10000,
"password": "123456",
"userName": "xapiUser",
"dbName": "xapi"
}
],
"mysql": [
{
"name": "mysql",
"masterConfig": {
"autoCommit": true,
"connectionTimeout": 30000,
"driverClass": "com.mysql.jdbc.Driver",
"idleTimeout": 600000,
"jdbcUrl": "jdbc:mysql://192.168.1.177:3306/st2020?characterEncoding=utf8",
"maxLifetime": 1800000,
"maximumPoolSize": 20,
"minimumIdle": 4,
"password": "chineseall",
"username": "root"
}
}
]
}
\ No newline at end of file
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big,
cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl,
dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, thead, tr, th, td, header {
margin: 0;
padding: 0;
border: 0;
}
ul li{ list-style:none;}
a{ text-decoration:none; outline:none;}
h1, h2, h3, h4 {
font-weight:normal;
}
html{
font-size:14px;
font-family:"Microsoft Yahei","微软雅黑"; color:#323232;
}
ul li{ list-style:none; margin: 0; padding: 0; border: 0;}
a{ text-decoration:none; -webkit-tap-highlight-color: transparent; }
.fl{ float:left; display:inline;}
.fr{ float:right; display:inline;}
.none{ display:none;}
.clearfix{overflow:hidden;_zoom:1;}
.clear{ clear:both;}
::-webkit-input-placeholder { /* WebKit browsers */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
::-moz-placeholder { /* Mozilla Firefox 19+ */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
:-ms-input-placeholder { /* Internet Explorer 10+ */
font-size:14px;
color:#c1c1c1;
font-family:"Microsoft Yahei","微软雅黑";
}
.top{ width:100%; height:115px; border-top:solid 5px #87abe0;}
.main{ width:1070px; height:auto; margin-left:auto; margin-right:auto;}
.bottom{ width:100%; height:239px; background:#fff url(../images/Login-b.jpg) no-repeat top center; }
.pbottom{ position:absolute; bottom:0px;}
.bottom > p{ color:#aab9c5; font-size:12px; line-height:75px; text-align:center; }
.login-c{ width:100%; height:603px; background:url(../images/login-bg.jpg) no-repeat center center;}
.login-list{ padding-top:95px; padding-left:62px; }
ul.login-list-ul{ width:442px; height:285px; padding-left:30px; padding-top:25px; background:url(../images/login-list-bg.png) no-repeat top left;}
ul.login-list-ul > li > a{ padding-left:26px; width:416px; display:block; height:35px; line-height:35px; background:url(../images/li-icon.png) no-repeat left center; color:#313131; font-size:14px; }
ul.login-list-ul > li > a:hover{ text-decoration:underline;}
.login-form{ background-color:#fbfbfb; border-radius:3px; box-shadow:0px 0px 3px rgba(0,0,0,.15); width:270px; margin-top:90px;}
.login-form-h2{ border-bottom:solid 1px #f2f2f2; text-align:center; color:#565656; font-size:16px; line-height:55px; }
.login-form-tip{ background:url(../images/tip-tline.jpg) repeat-x top left; padding-top:16px; padding-bottom:20px; width:260px; margin-left:auto; margin-right:auto; }
.login-form-tip > p{ color:#9b9b9b; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; line-height:1.8em;}
.login-form-tip > p > a{ color:#5c5c5b; text-decoration:underline;}
.login-jump{height:110px; padding-top:50px; padding-bottom:50px;}
dl.jump-select-dl{ width:213px; height:38px; border:solid 1px #c1c1c1; margin-left:auto; margin-right:auto;}
dl.jump-select-dl dt{ width:37px; height:28px; padding-top:5px; padding-bottom:5px; float:left; display:inline; background:url(../images/user.png) no-repeat center center;}
dl.jump-select-dl > dt >span{ display:block; width:36px; height:28px; border-right:solid 1px #c1c1c1;}
dl.jump-select-dl dd{ width:176px; height:38px; float:right; display:inline;}
select.jump-select {
width: 176px;
padding-left:15px;
padding-right:30px;
font-family:"Microsoft Yahei","微软雅黑";
font-size:14px;
color: #c1c1c1;
height:38px;
-moz-appearance:none;
appearance: none;
-webkit-appearance: none;
outline:none;
border:none;
background:url(../images/select-arrow.png) no-repeat center right;
/*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/
order: solid 1px #000;
}
.login-jump-btn{ width:215px; height:37px; margin-top:30px; margin-left:auto; margin-right:auto; }
select::-ms-expand { display: none; }
a.jump-btn{ width:135px; height:37px; display:block; background:url(../images/login-jump-btn1.jpg) no-repeat left center;}
a.help-btn{ width:65px; height:37px; display:block; background:url(../images/help-btn.jpg) no-repeat left center;}
.login-eduroam{ padding-top:65px; height:465px;}
.login-eduroam-form{ width:462px; height:465px; margin-left:auto; margin-right:auto; background-color:#fdfcfc; border-radius:3px; box-shadow:0px 0px 3px rgba(0,0,0,.15); }
.login-eduroam-form > h2{ color:#565656; font-size:18px; padding-top:12px; line-height:2em; text-align:center;}
.login-eduroam-form > h3{ width:100%; background:url(../images/line2.jpg) repeat-x left center; height:20px; text-align:center; }
.login-eduroam-form > h3 > span{color:#85b4ed; font-family:Arial; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; line-height:1.8em; text-transform:uppercase; background-color:#fcfcfc; display:inline-block; padding-left:10px; padding-right:10px;}
.login-eduroam-tip{background: url(../images/tip-tline.jpg) repeat-x top left; padding-top:15px; padding-bottom:15px; text-align:center;}
ul.eduroam-ul{ margin-left:60px; width:315px;}
ul.eduroam-ul > li > a{ width:300px; padding-left:15px; display:block; text-align:left; background:url(../images/eduroam-li.png) no-repeat left center; color:#959595; font-size:12px; line-height:20px;}
ul.eduroam-ul > li > a > span{ color:#729dd1; font-family:Arial; font-size:12px; -webkit-transform:scale(0.95,0.95) ; *font-size:11px; text-transform:uppercase; display:inline-block; padding-left:5px;}
.login-eduroam-line{ width:346px; height:auto; margin-left:auto; margin-right:auto; margin-top:10px;}
a.login-btn{ width:346px; height:44px; margin-bottom:25px; margin-top:35px; display:block; background:url(../images/login-btn.png) no-repeat top center; }
dl.login-eduroam-txt{ border:solid 1px #c1c1c1; height:38px; width:344px; margin-top:25px;}
dl.login-eduroam-txt dt{ width:37px; height:38px; float:left; display:inline;}
dl.login-eduroam-txt dd{ width:305px; height:28px; padding-top:5px; padding-bottom:5px; float:right; display:inline;}
dl.login-eduroam-txt-user dt{ background:url(../images/user.png) no-repeat center center;}
dl.login-eduroam-txt-password dt{ background:url(../images/password.png) no-repeat center center;}
.login-eduroam-input{ border-left:solid 1px #c1c1c1; width:284px; height:28px; padding:0px 10px; margin:0px; border-bottom:0px; border-right:0px; border-top:0px; outline:none; font-size:14px; line-height:28px; color:#565656;}
\ No newline at end of file
{
"files": {
"main.css": "./static/css/main.8fb69879.chunk.css",
"main.js": "./static/js/main.faed6ecd.chunk.js",
"main.js.map": "./static/js/main.faed6ecd.chunk.js.map",
"runtime~main.js": "./static/js/runtime~main.d653cc00.js",
"runtime~main.js.map": "./static/js/runtime~main.d653cc00.js.map",
"static/css/2.7ff19518.chunk.css": "./static/css/2.7ff19518.chunk.css",
"static/js/2.4b069f49.chunk.js": "./static/js/2.4b069f49.chunk.js",
"static/js/2.4b069f49.chunk.js.map": "./static/js/2.4b069f49.chunk.js.map",
"index.html": "./index.html",
"precache-manifest.08859a8352fb5070d8bcbb1663076631.js": "./precache-manifest.08859a8352fb5070d8bcbb1663076631.js",
"service-worker.js": "./service-worker.js",
"static/css/2.7ff19518.chunk.css.map": "./static/css/2.7ff19518.chunk.css.map",
"static/css/main.8fb69879.chunk.css.map": "./static/css/main.8fb69879.chunk.css.map",
"static/media/404.svg": "./static/media/404.1a80a0a4.svg",
"static/media/logo.svg": "./static/media/logo.d5589c12.svg"
}
}
\ No newline at end of file
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="./manifest.json"/><title>电教馆XAPI数据管理系</title><link href="./static/css/2.7ff19518.chunk.css" rel="stylesheet"><link href="./static/css/main.8fb69879.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(l){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],f=0,i=[];f<n.length;f++)t=n[f],p[t]&&i.push(p[t][0]),p[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(l[r]=o[r]);for(s&&s(e);i.length;)i.shift()();return c.push.apply(c,u||[]),a()}function a(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==p[u]&&(n=!1)}n&&(c.splice(r--,1),e=f(f.s=t[0]))}return e}var t={},p={1:0},c=[];function f(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return l[e].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=l,f.c=t,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(r,e){if(1&e&&(r=f(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)f.d(t,n,function(e){return r[e]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var r=window.webpackJsonp=window.webpackJsonp||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;a()}([])</script><script src="./static/js/2.4b069f49.chunk.js"></script><script src="./static/js/main.faed6ecd.chunk.js"></script></body></html>
\ No newline at end of file
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "64626c42c4304bd9fc8b5e69ad555cf4",
"url": "./index.html"
},
{
"revision": "85eda01238d071eb7192",
"url": "./static/css/2.7ff19518.chunk.css"
},
{
"revision": "f4479b5776a894543aaa",
"url": "./static/css/main.8fb69879.chunk.css"
},
{
"revision": "85eda01238d071eb7192",
"url": "./static/js/2.4b069f49.chunk.js"
},
{
"revision": "f4479b5776a894543aaa",
"url": "./static/js/main.faed6ecd.chunk.js"
},
{
"revision": "8c97409f0ee389fe75da",
"url": "./static/js/runtime~main.d653cc00.js"
},
{
"revision": "1a80a0a4f0fb36c0051a4dcb5482abd2",
"url": "./static/media/404.1a80a0a4.svg"
},
{
"revision": "d5589c12ae7768337d2745a6cfde2c0d",
"url": "./static/media/logo.d5589c12.svg"
}
]);
\ No newline at end of file
/**
* Welcome to your Workbox-powered service worker!
*
* You'll need to register this file in your web app and you should
* disable HTTP caching for this file too.
* See https://goo.gl/nhQhGp
*
* The rest of the code is auto-generated. Please don't update this file
* directly; instead, make changes to your Workbox build configuration
* and re-run your build process.
* See https://goo.gl/2aRDsh
*/
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"./precache-manifest.08859a8352fb5070d8bcbb1663076631.js"
);
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
workbox.core.clientsClaim();
/**
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
* requests for URLs in the manifest.
* See https://goo.gl/S9QRab
*/
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), {
blacklist: [/^\/_/,/\/[^\/]+\.[^\/]+$/],
});
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
html{font-size:16px}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.loginWrap{width:100%;height:100%}.loginWrap,.loginWrap .contentWrap{display:flex;flex-direction:row;align-items:center}.loginWrap .contentWrap{justify-content:space-around;width:75%;height:60%;margin:0 auto}.contentWrap .leftSide{display:flex;flex-direction:row;align-items:center;width:30%;height:100%}.leftSide .loginBg{width:100%;height:auto}.contentWrap .loginForm{width:50%;height:30rem;border-radius:.5rem;box-shadow:-2px -2px 45px #ddd}.loginForm .title{width:100%;height:5rem;padding:1rem 0;text-align:center;margin-top:2rem}.title .logo{height:100%}.title .name{height:50%;margin-left:.8rem}.loginForm .dataWrap{width:50%;height:auto;margin:3rem auto}#components-form-demo-normal-login .login-form{width:100%;margin-top:3rem}.dataWrap .ant-btn-primary{width:100%}.chartWrap{width:100%;height:100%;overflow:hidden;box-sizing:border-box;background-color:#f7fafc}.chartWrap .row{display:flex;flex-direction:row;flex-wrap:wrap}.chartWrap .chart{width:50%;float:left}.clearfix:after{content:".";height:0;display:block;clear:both}.Chart{float:left;width:67%;margin-top:20px;overflow:hidden;border-radius:6px;box-shadow:5px 1px 10px rgba(74,90,127,.5);margin-bottom:10px}.table{background:#fff;border-bottom:2px solid #f7fafc}.Chart p{display:inline-block;width:120px;height:40px;text-align:center;line-height:40px;cursor:pointer;position:relative;margin-bottom:0;display:none}.Chart .inner{position:relative;top:3px;left:0;display:inline-block;width:15px;height:15px;background-color:#d1e8ff;border:1px solid #d1e8ff;border-radius:2px;border-collapse:separate;-webkit-transition:all .3s;transition:all .3s;margin-right:5px}.Chart .inner:after{position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;-webkit-transform:rotate(45deg) scale(1) translate(-50%,-50%);transform:rotate(45deg) scale(1) translate(-50%,-50%);opacity:1;-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;content:" ";width:5.71428571px;height:9.14285714px;top:50%;left:21%}.Chart p.cur .inner{background-color:#1890ff;border-color:#1890ff}.ant-card-body{padding:0!important}.ant-card-bordered{border:none!important}.wrap{flex-direction:row;justify-content:space-around;background-color:#fff;padding:20px;margin-bottom:20px;font-size:12px;border-bottom-left-radius:6px;border-bottom-right-radius:6px}.box,.wrap{display:flex}.box{width:250px}.icon{width:65px;height:64px}.icon,.wrap-box{margin-right:10px}.wrap-box{border-radius:6px;box-shadow:5px 1px 10px rgba(74,90,127,.5)}.overview{background:#fff;height:60px;overflow:hidden;padding:15px;border-bottom:1px solid #dae4ec;border-top-left-radius:6px;border-top-right-radius:6px}.data-title{line-height:30px;font-size:16px;color:#232d50;font-weight:700}.level{font-size:16px}.level,.number{margin-bottom:0}.number{font-size:30px}.dan{font-size:12px;margin-left:5px}.data-right{float:right;display:inline-block}.rank{float:right;width:31%;background:#fff;border-radius:6px;box-shadow:5px 1px 10px rgba(74,90,127,.5);margin:20px 10px 10px}.line,.rank{padding:10px}.line{border-bottom:1px solid #f1f1f1;font-size:16px;font-weight:700;color:#232d50}table{border-collapse:collapse}th{width:100px;padding:10px 10px 10px 0;font-size:14px;color:#4a5a7f}tr{border-bottom:1px solid #f1f1f1}td{padding:10px 0}thead{text-align:center}td p{width:100px;background:rgba(251,98,96,.3);margin-bottom:0;margin-left:10px;position:relative}td p,td p .wid{height:10px;border-radius:10px;display:inline-block}td p .wid{background:#fb6260;position:absolute;top:0;left:0}table tbody tr td{font-size:12px;color:#9aa2b5}table tbody tr td .number{width:20px;height:20px;display:inline-block;border-radius:50%;background:#dcdcdc;color:#4a5a7f;text-align:center;line-height:20px;font-size:12px}tbody{text-align:center}tbody tr:first-child .number{background:#f34d4e;color:#fff}tbody tr:nth-child(2) .number{background:#fdd843;color:#fff}tbody tr:nth-child(3) .number{background:#25d096;color:#fff}.notFound{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%;min-height:45rem}.notFound .notFoundIcon{width:35%;height:auto}.notFound .tips{font-size:1.3rem;font-weight:700;color:#91ddff;word-wrap:.1rem}.routeWrap{display:flex;flex-direction:row;justify-content:center;align-items:center;background-color:#fff}.title{color:#fff;font-size:1.1rem;padding-left:.2rem}.userInfo{box-sizing:border-box;height:64px;display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-right:3rem;cursor:pointer}.userInfo .label{padding:0 .8rem}.userInfo .head-title{margin-bottom:0;font-weight:700;font-size:30px;color:#000}.ant-layout{height:100%;background-color:#f7fafc!important}.logoIcon{display:flex;justify-content:center;align-items:center;width:100%;height:64px}.logoIcon .Icon{width:35px;height:35px}.navTitle a{color:#fff}#components-layout-demo-responsive .logo{height:32px;background:hsla(0,0%,100%,.2);margin:16px}.clearfix:before{content:".";height:0;display:block;clear:both}.ant-layout-footer{background:#f7fafc}.entryWrap{position:absolute;top:0;bottom:0;min-width:900px;width:100vw;height:auto}.fade-enter{opacity:0}.fade-enter.fade-enter-active{opacity:1;-webkit-transition:opacity .8s ease-in-out;transition:opacity .8s ease-in-out}.ant-menu{background:none}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{width:162px;height:40px;border-radius:6px;background:-webkit-gradient(linear,left top,right top,from(#428dff),to(#397dff));background:-webkit-linear-gradient(left,#428dff,#397dff);background:linear-gradient(90deg,#428dff,#397dff);color:#fff;box-shadow:1px 4px 5px rgba(22,115,255,.4)}.ant-menu-item-selected>a{color:#fff}.navTitle{line-height:40px;margin-left:10px}.ant-layout-sider{position:relative;min-width:0;background:#f0f2f3;-webkit-transition:all .2s;transition:all .2s;height:97.2%;padding-top:24px;padding-left:15px}.ant-menu-item>a{color:#4a5a7f}.ant-menu-item.ant-menu-item-selected>a{color:#fff}.nav-icon{display:inline-block;height:18px;width:18px;vertical-align:text-bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNENzAxNEJERkUwQzExRUE4RURFRjQ3ODZGOTk5ODc5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNENzAxNEJFRkUwQzExRUE4RURFRjQ3ODZGOTk5ODc5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0Q3MDE0QkJGRTBDMTFFQThFREVGNDc4NkY5OTk4NzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0Q3MDE0QkNGRTBDMTFFQThFREVGNDc4NkY5OTk4NzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7dZka1AAABcUlEQVR42mKMLV/LQAKIAuJ6IFYD4ptA3L2oI2gusZqZSLCoEoiXQi0CAXUgnhNXsW4KtS3LBOI2HHLZQAtrqGVZKBATcn0z0MJoSi1zhwYdMY6aD7TQjlzLbIF4PRCzEhnUIHUbgRZqkGqZCRBvAWJOBtKAABBvB1ooRqxlOiANQMzHQB5QADkUaCEXIctUgHgHEIswUAZMQXENtJAZl2VSUIukGagDAoC4F5tl/EC8E4iVGagL8oG+y0O2jAuaGHQYaAP6gRb6wyzrBGIbBtoBkB3LQVkCxEhhoD0AZaFMkGVvGOgDfrJAy75+IJaECsoAMTOVLHgKxL+A+BIQd4EsOwHElkgKHgCxPJUsswHWdw/Iqc8oBiwkqt8NxN/QxLyJNYdUy9KgwYwMPkALBao2C6iS4UYtIwf8JWTZYypZ9B2IXxCybDaVLJsPzNC/CSX9RUAMUgSqFjjQ5L5hUb8ViLmR+H+A+BQQT0BXCBBgAN8zSnQ42pKGAAAAAElFTkSuQmCC);background-size:100% 100%}.ant-menu-item-selected .nav-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNEQkM4NUQzRkUwQzExRUFCREE0OENCMTRBQUEzQzI5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNEQkM4NUQ0RkUwQzExRUFCREE0OENCMTRBQUEzQzI5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0RCQzg1RDFGRTBDMTFFQUJEQTQ4Q0IxNEFBQTNDMjkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0RCQzg1RDJGRTBDMTFFQUJEQTQ4Q0IxNEFBQTNDMjkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz47VDqBAAABM0lEQVR42mL4//8/Awk4Cohv/oeAG0CcTIp+Uiyq/I8dTKG2ZZn/8YMaalkWCsR//xMG0ZRa5g7Ev/4TB0Dq7Mi1zBaIv/0nDbwHYg1SLTMB4o//yQP3gViMWMt0gPj1f8rAKSDmImSZChA/+U8dsB6ImXFZJgXEd/5TF0zAZhk/EF/+TxuQh2wZKGwP/6cdAOVRf5hlk//THoCykAYjkPjOwMDAwUB7MIkJSLxhoA/4CfKZBZDRD8SSUEEZIGamkgVPgfgXEF8C4hRGcMShggdALE8lyxSh5oEBEwMdAQuJ6ncD8Tc0MW9izSHVsjTkYIGCD0DMT4xmugbjqGXkgr+ELHtMJYtAxeALQpbNppJl84H4N6GkvwiqyB9LAf0Ni/qtQMyNxP8DxKeAeAK6QoAAAwD7S/58QladYQAAAABJRU5ErkJggg==);background-size:100% 100%}.ant-menu-inline .ant-menu-item{padding:0 10px!important}.ant-menu-inline .ant-menu-item:after{border:0}.ant-menu-item>a:hover{color:#fff}
/*# sourceMappingURL=main.8fb69879.chunk.css.map */
\ No newline at end of file
{"version":3,"sources":["index.css","App.css"],"names":[],"mappings":"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I,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,kBAAmB,CACnB,UAAW,CACX,WAAY,CACZ,gBACJ,CACA,wBACI,SAAU,CACV,WACJ,CACA,gBACI,gBAAiB,CACjB,eAAiB,CACjB,aAAc,CACd,eACJ,CAlBA,WACI,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,kBAAmB,CACnB,qBACJ,CANA,OACI,UAAW,CACX,gBAAiB,CACjB,kBAEJ,CALA,UACI,qBAAsB,CACtB,WAAY,CACZ,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,kBAAmB,CACnB,kBAAmB,CACnB,cACJ,CACA,iBACI,eACJ,CACA,sBACI,eAAgB,CAChB,eAAgB,CAChB,cAAe,CACf,UACJ,CAlBA,YACI,WAAY,CACZ,kCACJ,CAEA,UACI,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,UAAW,CACX,WACJ,CAEA,gBACI,UAAW,CACX,WACJ,CACA,YACI,UACJ,CACA,yCACI,WAAY,CACZ,6BAAoC,CACpC,WACJ,CACA,iBACI,WAAY,CACZ,QAAS,CACT,aAAc,CACd,UACJ,CACA,mBACI,kBACJ,CChCA,WACE,iBAAkB,CAClB,KAAK,CACL,QAAQ,CACR,eAAgB,CAChB,WAAY,CACZ,WACF,CACA,YACE,SACF,CACA,8BACE,SAAU,CACV,0CAAqC,CAArC,kCACF,CACA,UACE,eACF,CACA,4DACE,WAAY,CACZ,WAAY,CACZ,iBAAkB,CAClB,gFAAoD,CAApD,wDAAoD,CAApD,iDAAoD,CACpD,UAAU,CACV,0CACF,CACA,0BACE,UAEF,CACA,UACE,gBAAiB,CACjB,gBACF,CACA,kBACE,iBAAkB,CAClB,WAAY,CAEZ,kBAAmB,CACnB,0BAAoB,CAApB,kBAAoB,CACpB,YAAa,CACb,gBAAiB,CACjB,iBACF,CACA,iBACE,aACF,CACA,wCACE,UACF,CACA,UACE,oBAAqB,CACrB,WAAY,CACZ,UAAW,CACX,0BAA2B,CAC3B,wtDAAsD,CACtD,yBAEF,CACA,kCACE,woDAAwD,CACxD,yBACF,CACA,gCACE,wBACF,CACA,sCACE,QACF,CACA,uBACE,UACF","file":"main.8fb69879.chunk.css","sourcesContent":[".ant-layout {\r\n height: 100%;\r\n background-color:#f7fafc !important;\r\n}\r\n\r\n.logoIcon {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n height: 64px;\r\n}\r\n\r\n.logoIcon .Icon {\r\n width: 35px;\r\n height: 35px;\r\n}\r\n.navTitle a{\r\n color: #fff;\r\n}\r\n#components-layout-demo-responsive .logo {\r\n height: 32px;\r\n background: rgba(255, 255, 255, 0.2);\r\n margin: 16px;\r\n}\r\n.clearfix:before {\r\n content: '.';\r\n height: 0;\r\n display: block;\r\n clear: both;\r\n}\r\n.ant-layout-footer{\r\n background: #f7fafc ;\r\n}","@import '~antd/dist/antd.css';\r\n.entryWrap{\r\n position: absolute;\r\n top:0;\r\n bottom:0;\r\n min-width: 900px;\r\n width: 100vw;\r\n height: auto;\r\n}\r\n.fade-enter {\r\n opacity: 0;\r\n}\r\n.fade-enter.fade-enter-active {\r\n opacity: 1;\r\n transition: opacity 0.8s ease-in-out;\r\n}\r\n.ant-menu{\r\n background: none;\r\n}\r\n.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{\r\n width: 162px;\r\n height: 40px;\r\n border-radius: 6px;\r\n background:linear-gradient(to right,#428dff,#397dff);\r\n color:#fff;\r\n box-shadow:1px 4px 5px rgba(22,115,255,0.4) ;\r\n}\r\n.ant-menu-item-selected > a{\r\n color: #fff;\r\n\r\n}\r\n.navTitle{\r\n line-height: 40px;\r\n margin-left: 10px;\r\n}\r\n.ant-layout-sider {\r\n position: relative;\r\n min-width: 0;\r\n\r\n background: #f0f2f3;\r\n transition: all 0.2s;\r\n height: 97.2%;\r\n padding-top: 24px;\r\n padding-left: 15px;\r\n}\r\n.ant-menu-item > a {\r\n color: #4a5a7f;\r\n}\r\n.ant-menu-item.ant-menu-item-selected >a{\r\n color: #fff;\r\n}\r\n.nav-icon{\r\n display: inline-block;\r\n height: 18px;\r\n width: 18px;\r\n vertical-align: text-bottom;\r\n background-image: url(\"./assets/images/idex_icon.png\");\r\n background-size: 100% 100%;\r\n \r\n}\r\n.ant-menu-item-selected .nav-icon{\r\n background-image: url(\"./assets/images/idex_icon_p.png\");\r\n background-size: 100% 100%;\r\n}\r\n.ant-menu-inline .ant-menu-item{\r\n padding: 0 10px !important;\r\n}\r\n.ant-menu-inline .ant-menu-item::after{\r\n border:0;\r\n}\r\n.ant-menu-item > a:hover {\r\n color: #fff;\r\n}"]}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{380:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABPCAYAAAB8kULjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNEMjBBMzZGRkUwQzExRUFBQUQwRTYzQ0I3RjU2MDlBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNEMjBBMzcwRkUwQzExRUFBQUQwRTYzQ0I3RjU2MDlBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0QyMEEzNkRGRTBDMTFFQUFBRDBFNjNDQjdGNTYwOUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0QyMEEzNkVGRTBDMTFFQUFBRDBFNjNDQjdGNTYwOUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5QED/wAAAEAUlEQVR42uydS08TURTHz8x0OqUtYFUe8oikQGLUGCOPiAkb48YdRDRh5wfQhS4kfgETZaELXbBzT1SUhTtiwo6oqPERIhqNRR4Sqn1AX9N6T2eKnXboY0ScMuef/FO4vZDpr/fcc+6dyQw3NhUAHdmZB1T3MTepbVZSiNnHPMv8iPkxcyy3k03nDweZbzF3gLXlZj6keph5nnmE+WF2Jz7rZ4H5ptrB6vD0hEweqIwEvRF4g/kacSqqDKOR7BE4RPDKhjiUAYjJ4TYxKVt3kB0CPM/cQjzKVjPzBV4tVUjGNIAAe4iDYXUjwEbiYFgHEKBEHAzLzhODvxMBJIAEkAASQBIBJIAE0JqyVfLBH22xw8l2CfgCw+DbWgKevt6gEagnb52tIDxUs8cGNp5GoL445SUcTcHH5bhul6WfMiSSBLCggpEkzHyK5rW7JQ6iCUoihtTsEWC4zw3nepzAcRYZgQL7Oj0uoWAff1gGuYSQrKsR0uBqqnhw2TkIsTDf9QDPHnNCk6cwwEU2p03Orpc5V+IQtADA/dXFZxS9jLrHycOZI1XaNtfOzE6mTCJLv2R468u7DAWSKSWr5sohcuCt3/qjJJMpawEMsaz6eSWRNz9660UQBQ4icS0QnBPDUe3EKNk4kEQle1AZw9TVJsHxg3aWRJIwPhPWvPcjKMOTl9p5Efv2ev/96Z6KKWPcDmU0uSTOVMdFmwm7MYS9dSK09msPTeQ5AlhyWLC4kEwKrCIABjaSsOCX85ZmuKoggCVoJSDD9FxE03b6sMOUACmJEEACSGXMVsI5q9AGAS5RF9ZkiMspAqhXigx2O9Nr0kKaX47D1PsIhXDeN8PquGLwULkbAzQCdfTOF4O5pfyTE7jN5F9PEsBiCsdSsBrUFsa1bH7saBQhsRRPF84UwmXqVKcEXW329CuVMQYkqvOj3cZRCBtJKHxlc9tZgCdYqKJpJUL6PyMQz+UuB7RZuLNBNN32vGkB4iVmr75qT1M21goMoEAhbHURQAJIAAkglTHbKLw8rWWvDYSsCqWV/Z67ZKt28Juvve3KelhQlyf73MJmW0bYlumTeU/vf2TUUPMnw+OaG/dsfawa+O6Xt/XzcmNTgW3dkLvY7zbt+jaWSMH96ZC5Q/jLagJSJtwjxWPCYzN9CD/7EEmbkgiJABJAAkgASQSQABLA3Q4wSBiMrw4R4CJxMKxFBPiGOBjWcwQ4QRwMawIBjoNyw2lSeVpAdggQzzdeJR5l6wpzNFPG4CgcJSYla1RlpqkDrzPfJTZFdU9llVdI48mCy6DcYHqeOOUJmeAtoy+prNLS25HG+8VPqp3xwQRdoNwzWbQYsLiaKF6A8jSHcdB5msNvAQYAKSntKmvWrMAAAAAASUVORK5CYII="},381:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABPCAYAAAB8kULjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNDRDMxNjlDRkUwQzExRUE4RjMyRkNGNDc4RTNCNkYwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNDRDMxNjlERkUwQzExRUE4RjMyRkNGNDc4RTNCNkYwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0NEMzE2OUFGRTBDMTFFQThGMzJGQ0Y0NzhFM0I2RjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0NEMzE2OUJGRTBDMTFFQThGMzJGQ0Y0NzhFM0I2RjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz46x57zAAAGxklEQVR42uyd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"},382:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABPCAYAAAB8kULjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNDODhCRjk4RkUwQzExRUFCMDYzRjY1RTIyNjUxNjc3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNDODhCRjk5RkUwQzExRUFCMDYzRjY1RTIyNjUxNjc3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0M4OEJGOTZGRTBDMTFFQUIwNjNGNjVFMjI2NTE2NzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0M4OEJGOTdGRTBDMTFFQUIwNjNGNjVFMjI2NTE2NzciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7y8NX2AAAGNUlEQVR42uyd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"},383:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABPCAYAAAB8kULjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNDM0I0NzlGRkUwQzExRUE5RTExQTdBMkRDMEVDN0E5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNDM0I0N0EwRkUwQzExRUE5RTExQTdBMkRDMEVDN0E5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0MzQjQ3OURGRTBDMTFFQTlFMTFBN0EyREMwRUM3QTkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0MzQjQ3OUVGRTBDMTFFQTlFMTFBN0EyREMwRUM3QTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz78S/MFAAAGG0lEQVR42uyc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"},388:function(e,t,A){e.exports=A.p+"static/media/404.1a80a0a4.svg"},397:function(e,t,A){e.exports=A(877)},402:function(e,t,A){},423:function(e,t,A){},424:function(e,t){e.exports="data:image/png;base64,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"},539:function(e,t,A){},541:function(e,t,A){},846:function(e,t,A){},859:function(e,t,A){},860:function(e,t,A){},861:function(e,t,A){},862:function(e,t,A){e.exports=A.p+"static/media/logo.d5589c12.svg"},863:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNENzAxNEJERkUwQzExRUE4RURFRjQ3ODZGOTk5ODc5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNENzAxNEJFRkUwQzExRUE4RURFRjQ3ODZGOTk5ODc5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0Q3MDE0QkJGRTBDMTFFQThFREVGNDc4NkY5OTk4NzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0Q3MDE0QkNGRTBDMTFFQThFREVGNDc4NkY5OTk4NzkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7dZka1AAABcUlEQVR42mKMLV/LQAKIAuJ6IFYD4ptA3L2oI2gusZqZSLCoEoiXQi0CAXUgnhNXsW4KtS3LBOI2HHLZQAtrqGVZKBATcn0z0MJoSi1zhwYdMY6aD7TQjlzLbIF4PRCzEhnUIHUbgRZqkGqZCRBvAWJOBtKAABBvB1ooRqxlOiANQMzHQB5QADkUaCEXIctUgHgHEIswUAZMQXENtJAZl2VSUIukGagDAoC4F5tl/EC8E4iVGagL8oG+y0O2jAuaGHQYaAP6gRb6wyzrBGIbBtoBkB3LQVkCxEhhoD0AZaFMkGVvGOgDfrJAy75+IJaECsoAMTOVLHgKxL+A+BIQd4EsOwHElkgKHgCxPJUsswHWdw/Iqc8oBiwkqt8NxN/QxLyJNYdUy9KgwYwMPkALBao2C6iS4UYtIwf8JWTZYypZ9B2IXxCybDaVLJsPzNC/CSX9RUAMUgSqFjjQ5L5hUb8ViLmR+H+A+BQQT0BXCBBgAN8zSnQ42pKGAAAAAElFTkSuQmCC"},864:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAYAAACN1PRVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNEQkM4NUQzRkUwQzExRUFCREE0OENCMTRBQUEzQzI5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNEQkM4NUQ0RkUwQzExRUFCREE0OENCMTRBQUEzQzI5Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0RCQzg1RDFGRTBDMTFFQUJEQTQ4Q0IxNEFBQTNDMjkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0RCQzg1RDJGRTBDMTFFQUJEQTQ4Q0IxNEFBQTNDMjkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz47VDqBAAABM0lEQVR42mL4//8/Awk4Cohv/oeAG0CcTIp+Uiyq/I8dTKG2ZZn/8YMaalkWCsR//xMG0ZRa5g7Ev/4TB0Dq7Mi1zBaIv/0nDbwHYg1SLTMB4o//yQP3gViMWMt0gPj1f8rAKSDmImSZChA/+U8dsB6ImXFZJgXEd/5TF0zAZhk/EF/+TxuQh2wZKGwP/6cdAOVRf5hlk//THoCykAYjkPjOwMDAwUB7MIkJSLxhoA/4CfKZBZDRD8SSUEEZIGamkgVPgfgXEF8C4hRGcMShggdALE8lyxSh5oEBEwMdAQuJ6ncD8Tc0MW9izSHVsjTkYIGCD0DMT4xmugbjqGXkgr+ELHtMJYtAxeALQpbNppJl84H4N6GkvwiqyB9LAf0Ni/qtQMyNxP8DxKeAeAK6QoAAAwD7S/58QladYQAAAABJRU5ErkJggg=="},865:function(e,t,A){},872:function(e,t,A){},873:function(e,t,A){},874:function(e,t,A){},877:function(e,t,A){"use strict";A.r(t);var a=A(0),n=A.n(a),l=A(10),c=A.n(l),r=(A(402),A(71)),o=A(101),i=A(391),s=A(187),m={count:0};var b=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:m;switch((arguments.length>1?arguments[1]:void 0).type){case"INCREMENT":return{count:e.count+1};case"DECREMENT":return{count:e.count-1};case"RESET":return{count:0};default:return{count:e.count}}},u=Object(s.b)(b),d=A(888),p=A(29),h=A(25),E=A(31),R=A(30),N=A(32),g=A(102),y=A.n(g),I={authenticate:function(){return"admin"==sessionStorage.username&&123456==sessionStorage.token},setInfo:function(e,t){sessionStorage.setItem("token",t),sessionStorage.setItem("username",e)},signout:function(){sessionStorage.removeItem("token"),sessionStorage.removeItem("username")}},S=A(889),j=A(882),T=A(885),U=A(15),k=A(887),v=A(86),f=(A(423),A(424)),V=function(e){function t(){var e,A;Object(p.a)(this,t);for(var a=arguments.length,n=new Array(a),l=0;l<a;l++)n[l]=arguments[l];return(A=Object(E.a)(this,(e=Object(R.a)(t)).call.apply(e,[this].concat(n)))).handleSubmit=function(e){e.preventDefault(),A.props.form.validateFields(function(e,t){e||(I.setInfo(t.username,t.password),console.log(I.authenticate()),setTimeout(function(){return I.authenticate()?(A.props.history.push("/dataCount"),void S.a.success("\u767b\u9646\u6210\u529f",1)):void S.a.error("\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef!",2)},500))})},A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){var e=this.props.form.getFieldDecorator;return n.a.createElement("div",{className:"loginWrap"},n.a.createElement("div",{className:"contentWrap"},n.a.createElement("div",{className:"leftSide"},n.a.createElement("img",{src:f,className:"loginBg",alt:"login"})),n.a.createElement("div",{className:"loginForm"},n.a.createElement("div",{className:"title"},n.a.createElement("span",{style:{color:"#000",fontSize:"20px",fontWeight:"bold"}},"\u7535\u6559\u9986XAPI\u6570\u636e\u7ba1\u7406\u7cfb\u7edf")),n.a.createElement("div",{className:"dataWrap"},n.a.createElement(j.a,{onSubmit:this.handleSubmit,className:"login-form"},n.a.createElement(j.a.Item,null,e("username",{rules:[{required:!0,message:"\u8bf7\u8f93\u5165\u7528\u6237\u540d"}]})(n.a.createElement(T.a,{size:"large",prefix:n.a.createElement(U.a,{type:"user",style:{color:"rgba(0,0,0,.25)"}}),placeholder:"\u8bf7\u8f93\u5165\u7528\u6237\u8d26\u53f7"}))),n.a.createElement(j.a.Item,null,e("password",{rules:[{required:!0,message:"\u8bf7\u8f93\u5165\u5bc6\u7801"}]})(n.a.createElement(T.a,{size:"large",prefix:n.a.createElement(U.a,{type:"lock",style:{color:"rgba(0,0,0,.25)"}}),type:"password",placeholder:"\u8bf7\u8f93\u5165\u5bc6\u7801"}))),n.a.createElement(j.a.Item,null,e("remember",{valuePropName:"checked",initialValue:!0})(n.a.createElement(k.a,null,"\u8bb0\u4f4f\u5bc6\u7801"))),n.a.createElement(j.a.Item,null,n.a.createElement(v.a,{type:"primary",htmlType:"submit",className:"login-form-button",size:"large"},"\u767b\u5f55")))))))}}]),t}(a.Component),M=Object(o.f)(j.a.create({name:"loginForm"})(V)),w=function(e){function t(){return Object(p.a)(this,t),Object(E.a)(this,Object(R.a)(t).apply(this,arguments))}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){return I.authenticate()?n.a.createElement(o.a,{to:"/"}):n.a.createElement(M,null)}}]),t}(a.Component),O=A(879),C=A(376),z=function(e){var t=e.component,A=Object(C.a)(e,["component"]);return n.a.createElement(o.b,Object.assign({},A,{render:function(e){return I.authenticate()?n.a.createElement(t,e):n.a.createElement(o.a,{to:{pathname:"/login",state:{from:e.location}}})}}))},W=A(104),L=(a.Component,A(539),A(66)),Z=A.n(L),J=A(126),B=A(122),G=A(105),q=A.n(G),D=A(883),Y=(A(541),{color:["#3fb1e3","#6be6c1","#626c91","#a0a7e6","#c4ebad","#96dee8"],backgroundColor:"rgba(252,252,252,0)",textStyle:{},title:{textStyle:{color:"#666666"},subtextStyle:{color:"#999999"}},line:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"8",symbol:"emptyCircle",smooth:!1},radar:{itemStyle:{normal:{borderWidth:"2"}},lineStyle:{normal:{width:"3"}},symbolSize:"8",symbol:"emptyCircle",smooth:!1},bar:{itemStyle:{normal:{barBorderWidth:0,barBorderColor:"#ccc"},emphasis:{barBorderWidth:0,barBorderColor:"#ccc"}}},pie:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},scatter:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},boxplot:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},parallel:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},sankey:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},funnel:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},gauge:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"},emphasis:{borderWidth:0,borderColor:"#ccc"}}},candlestick:{itemStyle:{normal:{color:"#e6a0d2",color0:"transparent",borderColor:"#e6a0d2",borderColor0:"#3fb1e3",borderWidth:"2"}}},graph:{itemStyle:{normal:{borderWidth:0,borderColor:"#ccc"}},lineStyle:{normal:{width:"1",color:"#cccccc"}},symbolSize:"8",symbol:"emptyCircle",smooth:!1,color:["#3fb1e3","#6be6c1","#626c91","#a0a7e6","#c4ebad","#96dee8"],label:{normal:{textStyle:{color:"#ffffff"}}}},map:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#aaaaaa",borderWidth:.5},emphasis:{areaColor:"rgba(63,177,227,0.25)",borderColor:"#3fb1e3",borderWidth:1}},label:{normal:{textStyle:{color:"#ffffff"}},emphasis:{textStyle:{color:"rgb(63,177,227)"}}}},geo:{itemStyle:{normal:{areaColor:"#eeeeee",borderColor:"#aaaaaa",borderWidth:.5},emphasis:{areaColor:"rgba(63,177,227,0.25)",borderColor:"#3fb1e3",borderWidth:1}},label:{normal:{textStyle:{color:"#ffffff"}},emphasis:{textStyle:{color:"rgb(63,177,227)"}}}},categoryAxis:{axisLine:{show:!0,lineStyle:{color:"#cccccc"}},axisTick:{show:!1,lineStyle:{color:"#333"}},axisLabel:{show:!0,textStyle:{color:"#999999"}},splitLine:{show:!0,lineStyle:{color:["#eeeeee"]}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.05)","rgba(200,200,200,0.02)"]}}},valueAxis:{axisLine:{show:!0,lineStyle:{color:"#cccccc"}},axisTick:{show:!1,lineStyle:{color:"#333"}},axisLabel:{show:!0,textStyle:{color:"#999999"}},splitLine:{show:!0,lineStyle:{color:["#eeeeee"]}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.05)","rgba(200,200,200,0.02)"]}}},logAxis:{axisLine:{show:!0,lineStyle:{color:"#cccccc"}},axisTick:{show:!1,lineStyle:{color:"#333"}},axisLabel:{show:!0,textStyle:{color:"#999999"}},splitLine:{show:!0,lineStyle:{color:["#eeeeee"]}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.05)","rgba(200,200,200,0.02)"]}}},timeAxis:{axisLine:{show:!0,lineStyle:{color:"#cccccc"}},axisTick:{show:!1,lineStyle:{color:"#333"}},axisLabel:{show:!0,textStyle:{color:"#999999"}},splitLine:{show:!0,lineStyle:{color:["#eeeeee"]}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.05)","rgba(200,200,200,0.02)"]}}},toolbox:{iconStyle:{normal:{borderColor:"#999999"},emphasis:{borderColor:"#666666"}}},legend:{textStyle:{color:"#999999"}},tooltip:{axisPointer:{lineStyle:{color:"#cccccc",width:1},crossStyle:{color:"#cccccc",width:1}}},timeline:{lineStyle:{color:"#626c91",width:1},itemStyle:{normal:{color:"#626c91",borderWidth:1},emphasis:{color:"#626c91"}},controlStyle:{normal:{color:"#626c91",borderColor:"#626c91",borderWidth:.5},emphasis:{color:"#626c91",borderColor:"#626c91",borderWidth:.5}},checkpointStyle:{color:"#3fb1e3",borderColor:"rgba(63,177,227,0.15)"},label:{normal:{textStyle:{color:"#626c91"}},emphasis:{textStyle:{color:"#626c91"}}}},visualMap:{color:["#2a99c9","#afe8ff"]},dataZoom:{backgroundColor:"rgba(255,255,255,0)",dataBackgroundColor:"rgba(222,222,222,1)",fillerColor:"rgba(114,230,212,0.25)",handleColor:"#cccccc",handleSize:"100%",textStyle:{color:"#999999"}},markPoint:{label:{normal:{textStyle:{color:"#ffffff"}},emphasis:{textStyle:{color:"#ffffff"}}}}}),Q=A(7),H=A.n(Q),x=(A(314),A(321),A(325),A(228),A(329),A(377)),X=A.n(x);y.a.defaults.baseURL="http://192.168.1.26:9576",y.a.defaults.timeout=1e4;var F={get:function(e){return e=e||{},new Promise(function(t,A){y.a.get(y.a.defaults.baseURL+"/xapi/stat/index",{params:e}).then(function(e){t(e.data)}).catch(function(e){A(e)})})},post:function(e,t){return t=t||{},new Promise(function(A,a){y.a.post(e,t).then(function(e){A(e.data)}).catch(function(e){a(e)})})}},P={onObj:{},oneObj:{},on:function(e,t){void 0===this.onObj[e]&&(this.onObj[e]=[]);for(var A=[].concat(Array.prototype.slice.call(arguments,1)),a=0;a<A.length;a++)this.onObj[e].push(A[a])},one:function(e,t){void 0===this.oneObj[e]&&(this.oneObj[e]=[]),this.oneObj[e].push(t)},off:function(e){this.onObj[e]=[],this.oneObj[e]=[]},trigger:function(){var e,t;if(0==arguments.length)return!1;if(e=arguments[0],t=[].concat(Array.prototype.slice.call(arguments,1)),void 0!==this.onObj[e]&&this.onObj[e].length>0)for(var A in this.onObj[e])this.onObj[e][A].call(null,t[A]);if(void 0!==this.oneObj[e]&&this.oneObj[e].length>0){for(var a in this.oneObj[e])this.oneObj[e][a].apply(null,t),this.oneObj[e][a]=void 0;this.oneObj[e]=[]}}},K=(A(842),function(e){function t(e){var A;return Object(p.a)(this,t),(A=Object(E.a)(this,Object(R.a)(t).call(this,e))).getOption=function(){return{tooltip:{trigger:"axis"},legend:{},toolbox:{feature:{saveAsImage:{}}},xAxis:{type:"category",boundaryGap:!1,data:A.state.graphsData,splitLine:{show:!1},color:"#fff"},yAxis:{type:"value"},series:[{name:A.state.name,type:"line",lineStyle:{color:"#7BB0FF",width:5},smooth:!0,data:A.state.countlist},{name:A.state.name1,type:"line",lineStyle:{color:"#fff",width:.1},smooth:!0,data:A.state.countlist1}]}},A.state={graphsData:[],countlist:[],num:1,num1:0},A.getOption=A.getOption.bind(Object(B.a)(A)),A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"componentWillMount",value:function(){H.a.registerTheme("Imooc",Y)}},{key:"getMyIP",value:function(){var e=Object(J.a)(Z.a.mark(function e(t){var A,a,n,l,c,r,o,i;return Z.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,F.get(t);case 2:for(A=e.sent,a=A.data,n=[],l=[],c=a.dateDatas,console.log(c.length),1==c.length?(c[0].name="\u4e0a\u56fe")?q()("#table .shangtu").show():(c[0].name="\u6570\u5b57\u9605\u8bfb")&&q()("#table .szyd").show():(q()("#table .shangtu").show(),q()("#table .szyd").show()),r=a.dateDatas[0].data,o=a.dateDatas[0].name,i=0;i<r.length;i++)n.push(r[i].date),l.push(r[i].count);this.setState({DataList:a,graphsData:n,countlist:l,name:o});case 13:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()}]),Object(h.a)(t,[{key:"clicked",value:function(e,t){this.state.num++;var A=this.state.DataList,a=[],n=[];if(1==this.state.num){if("shangtu"===e){for(var l=A.dateDatas[0].data,c=A.dateDatas[0].name,r=0;r<l.length;r++)a.push(l[r].date),n.push(l[r].count);this.setState({graphsData:a,countlist:n,name:c}),this.state.num=-1}}else this.setState({countlist:"",name:""}),this.state.num=0;q()(t.currentTarget).toggleClass("cur")}},{key:"clicked1",value:function(e,t){this.state.num1++;var A=this.state.DataList,a=[],n=[];if(1==this.state.num1){if("szyd"===e){for(var l=A.dateDatas[1].data,c=A.dateDatas[1].name,r=0;r<l.length;r++)a.push(l[r].date),n.push(l[r].count);this.setState({graphsData:a,countlist1:n,name1:c}),this.state.num1=-1}}else this.setState({countlist1:"",name1:""});q()(t.currentTarget).toggleClass("cur")}},{key:"componentDidMount",value:function(){var e=this;this.getMyIP("shangtu"),P.on("Change",function(t){e.getMyIP(t)})}},{key:"render",value:function(){return n.a.createElement("div",{className:"Chart"},n.a.createElement("div",{className:"table",id:"table"},n.a.createElement("p",{onClick:this.clicked.bind(this,"shangtu"),className:"cur shangtu"},n.a.createElement("span",{className:"inner"}),n.a.createElement("span",null,"\u4e0a\u56fe\u6570\u636e")),n.a.createElement("p",{onClick:this.clicked1.bind(this,"szyd"),className:"szyd"},n.a.createElement("span",{className:"inner"}),n.a.createElement("span",null,"\u6570\u5b57\u9605\u8bfb\u6765\u6e90"))),n.a.createElement(D.a,null,n.a.createElement(X.a,{option:this.getOption(),theme:"Imooc",style:{height:"491px"}})))}}]),t}(n.a.Component)),_=(A(846),A(881)),$=(A(18),A(848),A(392)),ee=A(129),te=A.n(ee),Ae=A(380),ae=A.n(Ae),ne=A(381),le=A.n(ne),ce=A(382),re=A.n(ce),oe=A(383),ie=A.n(oe),se=(_.a.MonthPicker,_.a.RangePicker),me=(_.a.WeekPicker,function(e){function t(e){var A;return Object(p.a)(this,t),(A=Object(E.a)(this,Object(R.a)(t).call(this,e))).onChange=function(e,t){var a={begin_date:t[0],end_date:t[1]};P.trigger("Change",a),A.getMyIP(a)},A.state={number1:"",number2:"",number3:"",number4:""},A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"getMyIP",value:function(){var e=Object(J.a)(Z.a.mark(function e(t){var A,a;return Z.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,F.get(t);case 2:A=e.sent,a=A.data,console.log(a),this.setState({number1:a.addDataCount,number2:a.totalDataCount,number3:a.appCount,number4:a.queryApiCount});case 6:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()}]),Object(h.a)(t,[{key:"componentWillReceiveProps",value:function(){}},{key:"componentDidMount",value:function(){this.getMyIP()}},{key:"render",value:function(){return n.a.createElement("div",{className:"wrap-box"},n.a.createElement("div",{className:"overview"},n.a.createElement("span",{className:"data-title"},"\u6570\u636e\u6982\u51b5"),n.a.createElement("div",{className:"data-right"},n.a.createElement(se,{onChange:this.onChange.bind(this),locale:$.a}))),n.a.createElement("div",{className:"wrap"},n.a.createElement("div",{className:"box"},n.a.createElement("img",{src:ae.a,className:"icon"}),n.a.createElement("div",null,n.a.createElement("p",{className:"level"},"\u65b0\u589e\u6570\u636e"),n.a.createElement("p",null,n.a.createElement(te.a,{start:0,end:this.state.number1,duration:"4",useGrouping:"true",className:"number"}),n.a.createElement("span",{className:"dan"},"\u6761")))),n.a.createElement("div",{className:"box"},n.a.createElement("img",{src:le.a,className:"icon"}),n.a.createElement("div",null,n.a.createElement("p",{className:"level"},"\u6570\u636e\u603b\u91cf"),n.a.createElement("p",null,n.a.createElement(te.a,{start:0,end:this.state.number2,duration:"4",useGrouping:"true",className:"number"}),n.a.createElement("span",{className:"dan"},"\u6761")))),n.a.createElement("div",{className:"box"},n.a.createElement("img",{src:re.a,className:"icon"}),n.a.createElement("div",null,n.a.createElement("p",{className:"level"},"\u5df2\u63a5\u5165App ID\u6570\u91cf"),n.a.createElement("p",null,n.a.createElement(te.a,{start:0,end:this.state.number3,duration:"4",useGrouping:"true",className:"number"}),n.a.createElement("span",{className:"dan"})))),n.a.createElement("div",{className:"box"},n.a.createElement("img",{src:ie.a,className:"icon"}),n.a.createElement("div",null,n.a.createElement("p",{className:"level"},"\u63a5\u53e3\u8c03\u7528\u6b21\u6570"),n.a.createElement("p",null,n.a.createElement(te.a,{start:0,end:this.state.number4,duration:"4",useGrouping:"true",className:"number"}),n.a.createElement("span",{className:"dan"},"\u6b21"))))))}}]),t}(n.a.Component)),be=(A(859),function(e){function t(e){var A;return Object(p.a)(this,t),(A=Object(E.a)(this,Object(R.a)(t).call(this,e))).state={list3:[{rank:"1",source:"\u6765\u6e901",number:"9950",width:"100px"},{rank:"2",source:"\u6765\u6e901",number:"9950",width:"85px"},{rank:"3",source:"\u6765\u6e901",number:"9950",width:"70px"},{rank:"4",source:"\u6765\u6e901",number:"9950",width:"50px"}]},A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"getMyIP",value:function(){var e=Object(J.a)(Z.a.mark(function e(){var t,A,a;return Z.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,F.get();case 2:t=e.sent,A=t.data,(a=A.appRanks).map(function(e,t){e.percent>75&&e.percent<=100?(e.coloro="rgba(251, 98, 96,0.3)",e.color="rgb(251, 98, 96)"):e.percent>50&&e.percent<=75?(e.coloro="rgba(65,137,255,0.3)",e.color="rgb(65,137,255)"):e.percent>25&&e.percent<=50?(e.coloro="rgba(37,208,150,0.3)",e.color="rgb(37,208,150)"):e.percent>0&&e.percent<=25&&(e.coloro="rgba(65,137,255,0.3)",e.color="rgb(65,137,255)")}),this.setState({list3:a});case 7:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}()}]),Object(h.a)(t,[{key:"componentDidMount",value:function(){var e=this;this.getMyIP(),P.on("Change",function(t){e.getMyIP(t)})}},{key:"render",value:function(){return n.a.createElement("div",{className:"rank"},n.a.createElement("p",{className:"line"},"\u5404App ID \u6570\u636e\u603b\u91cf\u6392\u884c\uff08\u622a\u6b62\u81f3\u5f53\u65e5\uff09"),n.a.createElement("table",null,n.a.createElement("thead",null,n.a.createElement("tr",null,n.a.createElement("th",null,"\u6392\u540d"),n.a.createElement("th",{style:{width:"333px"}},"\u6570\u636e\u6765\u6e90"),n.a.createElement("th",{colspan:"2"},"\u6570\u636e\u6570"),n.a.createElement("th",{style:{width:"0px"}}))),n.a.createElement("tbody",null,this.state.list3.map(function(e,t){return n.a.createElement("tr",{key:t},n.a.createElement("td",null,n.a.createElement("span",{className:"number"},t+1)),n.a.createElement("td",null,e.name),n.a.createElement("td",{style:{textAlign:"left"}},n.a.createElement("span",null,e.count)),n.a.createElement("td",null,n.a.createElement("p",{style:{backgroundColor:e.coloro}},n.a.createElement("span",{className:"wid",style:{width:e.percent+"%",backgroundColor:e.color}}))))}))))}}]),t}(n.a.Component)),ue=function(e){function t(){return Object(p.a)(this,t),Object(E.a)(this,Object(R.a)(t).apply(this,arguments))}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){return n.a.createElement("div",{className:"chartWrap clearfix"},n.a.createElement(me,null),n.a.createElement(K,null),n.a.createElement(be,null))}}]),t}(a.Component),de=(a.Component,[{path:"/dataCount",component:ue}]),pe=A(388),he=A.n(pe),Ee=(A(860),function(e){function t(){return Object(p.a)(this,t),Object(E.a)(this,Object(R.a)(t).apply(this,arguments))}return Object(N.a)(t,e),Object(h.a)(t,[{key:"componentDidMount",value:function(){console.log("***",this.props)}},{key:"render",value:function(){return n.a.createElement("div",{className:"notFound"},n.a.createElement("img",{src:he.a,className:"notFoundIcon",alt:"not found"}),n.a.createElement("p",{className:"tips"},"\u6211\u4eec\u4e5f\u8ff7\u8def\u4e86\uff0c\u627e\u4e0d\u5230\u8fd9\u4e2a\u9875\u9762"))}}]),t}(a.Component)),Re=(A(861),function(e){function t(){return Object(p.a)(this,t),Object(E.a)(this,Object(R.a)(t).apply(this,arguments))}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){return n.a.createElement("div",{className:"routeWrap"},n.a.createElement(o.d,null,de.map(function(e,t){return e.path?n.a.createElement(z,{key:t,path:e.path,exact:!0,component:e.component}):n.a.createElement(o.b,{component:Ee})})))}}]),t}(a.Component)),Ne=Object(o.f)(Re),ge=A(884),ye=(A(862),A(863),A(864),A(865),O.a.Sider),Ie=(ge.b.SubMenu,[{path:"/dataCount",name:"\u8fd0\u8425\u6570\u636e"}]),Se=[{path:"/basic",name:"\u6570\u636e\u7ec4\u4ef6",icon:"desktop"},{path:"/form",name:"input\u76f8\u5173\u7ec4\u4ef6",icon:"inbox"},{path:"/checkbox",name:"\u591a\u91cd\u9009\u9879",icon:"folder"}],je=function(e){function t(){var e,A;Object(p.a)(this,t);for(var a=arguments.length,n=new Array(a),l=0;l<a;l++)n[l]=arguments[l];return(A=Object(E.a)(this,(e=Object(R.a)(t)).call.apply(e,[this].concat(n)))).state={collapsed:!1,data:Ie},A.toggle=function(){A.setState({collapsed:!A.state.collapsed})},A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"getUpdata",value:function(){var e=sessionStorage.username;"admin"===e?this.setState({data:JSON.parse(sessionStorage.RootOne)}):"classRoot"===e&&this.setState({data:Se})}},{key:"componentDidMount",value:function(){sessionStorage.RootOne=JSON.stringify(Ie),this.getUpdata()}},{key:"render",value:function(){return n.a.createElement(ye,{breakpoint:"lg",collapsedWidth:"80",onBreakpoint:function(e){console.log(e)},onCollapse:function(e,t){console.log(e,t)}},n.a.createElement(ge.b,{defaultSelectedKeys:["1"],defaultOpenKeys:["sub1","sub2"],mode:"inline",theme:"light",collapsed:this.state.collapsed.toString()},this.state.data.map(function(e,t){return n.a.createElement(ge.b.Item,{key:t+1},n.a.createElement(r.b,{to:e.path},n.a.createElement("i",{className:"nav-icon"}),n.a.createElement("span",{className:"navTitle"},e.name)))})))}}]),t}(a.Component),Te=A(886),Ue=A(880),ke=(A(872),function(e){function t(){var e,A;Object(p.a)(this,t);for(var a=arguments.length,n=new Array(a),l=0;l<a;l++)n[l]=arguments[l];return(A=Object(E.a)(this,(e=Object(R.a)(t)).call.apply(e,[this].concat(n)))).logout=function(){I.signout(),A.props.history.push("/login"),sessionStorage.clear()},A}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){var e=n.a.createElement(ge.b,null,n.a.createElement(ge.b.Item,null,n.a.createElement("div",null,n.a.createElement(U.a,{type:"home"}),n.a.createElement("span",{className:"label",onClick:this.logout},"\u9000\u51fa\u767b\u5f55"))));return n.a.createElement("div",{className:"userInfo"},n.a.createElement("p",{className:"head-title"},"\u4e0a\u6d77\u5e02\u7535\u6559\u9986\u6570\u636e\u7ba1\u7406\u7cfb\u7edf-\u6570\u636e\u770b\u677f"),n.a.createElement("div",null,n.a.createElement("span",{style:{marginRight:"10px"}},"\u7528\u6237\u540d"),n.a.createElement(Te.a,{overlay:e,placement:"bottomCenter",className:"dropMenu"},n.a.createElement(Ue.a,{src:"https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png",size:"large"}))))}}]),t}(a.Component)),ve=Object(o.f)(ke),fe=(A(873),O.a.Header),Ve=O.a.Content,Me=(O.a.Footer,function(e){function t(){return Object(p.a)(this,t),Object(E.a)(this,Object(R.a)(t).apply(this,arguments))}return Object(N.a)(t,e),Object(h.a)(t,[{key:"render",value:function(){return n.a.createElement(O.a,null,n.a.createElement(fe,{style:{background:"#fff",padding:0}},n.a.createElement(ve,null)),n.a.createElement(O.a,null,n.a.createElement(je,{style:{background:"#fff"}}),n.a.createElement(Ve,{style:{margin:"24px 16px 0"}},n.a.createElement(Ne,null))))}}]),t}(a.Component)),we=A(48),Oe=Object(we.a)({forceRefresh:!0});A(874);var Ce=function(){return n.a.createElement(i.a,{store:u},n.a.createElement(r.a,{basename:"/",history:Oe},n.a.createElement("div",{className:"entryWrap"},n.a.createElement(d.a,{classNames:"fade",timeout:1e3},n.a.createElement(o.d,null,n.a.createElement(o.b,{path:"/login",component:w,exact:!0}),n.a.createElement(z,{path:"/",component:Me}),n.a.createElement(o.b,{component:Ee}))))))};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));c.a.render(n.a.createElement(Ce,null),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()})}},[[397,1,2]]]);
//# sourceMappingURL=main.faed6ecd.chunk.js.map
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){function r(r){for(var n,f,i=r[0],l=r[1],a=r[2],c=0,s=[];c<i.length;c++)f=i[c],o[f]&&s.push(o[f][0]),o[f]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=f(f.s=t[0]))}return e}var n={},o={1:0},u=[];function f(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.m=e,f.c=n,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,r){if(1&r&&(e=f(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)f.d(t,n,function(r){return e[r]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var i=window.webpackJsonp=window.webpackJsonp||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var p=l;t()}([]);
//# sourceMappingURL=runtime~main.d653cc00.js.map
\ No newline at end of file
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice"],"mappings":"aACA,SAAAA,EAAAC,GAQA,IAPA,IAMAC,EAAAC,EANAC,EAAAH,EAAA,GACAI,EAAAJ,EAAA,GACAK,EAAAL,EAAA,GAIAM,EAAA,EAAAC,EAAA,GACQD,EAAAH,EAAAK,OAAoBF,IAC5BJ,EAAAC,EAAAG,GACAG,EAAAP,IACAK,EAAAG,KAAAD,EAAAP,GAAA,IAEAO,EAAAP,GAAA,EAEA,IAAAD,KAAAG,EACAO,OAAAC,UAAAC,eAAAC,KAAAV,EAAAH,KACAc,EAAAd,GAAAG,EAAAH,IAKA,IAFAe,KAAAhB,GAEAO,EAAAC,QACAD,EAAAU,OAAAV,GAOA,OAHAW,EAAAR,KAAAS,MAAAD,EAAAb,GAAA,IAGAe,IAEA,SAAAA,IAEA,IADA,IAAAC,EACAf,EAAA,EAAiBA,EAAAY,EAAAV,OAA4BF,IAAA,CAG7C,IAFA,IAAAgB,EAAAJ,EAAAZ,GACAiB,GAAA,EACAC,EAAA,EAAkBA,EAAAF,EAAAd,OAA2BgB,IAAA,CAC7C,IAAAC,EAAAH,EAAAE,GACA,IAAAf,EAAAgB,KAAAF,GAAA,GAEAA,IACAL,EAAAQ,OAAApB,IAAA,GACAe,EAAAM,IAAAC,EAAAN,EAAA,KAGA,OAAAD,EAIA,IAAAQ,EAAA,GAKApB,EAAA,CACAqB,EAAA,GAGAZ,EAAA,GAGA,SAAAS,EAAA1B,GAGA,GAAA4B,EAAA5B,GACA,OAAA4B,EAAA5B,GAAA8B,QAGA,IAAAC,EAAAH,EAAA5B,GAAA,CACAK,EAAAL,EACAgC,GAAA,EACAF,QAAA,IAUA,OANAhB,EAAAd,GAAAa,KAAAkB,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAnB,EAGAY,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACA1B,OAAA6B,eAAAT,EAAAM,EAAA,CAA0CI,YAAA,EAAAC,IAAAJ,KAK1CX,EAAAgB,EAAA,SAAAZ,GACA,qBAAAa,eAAAC,aACAlC,OAAA6B,eAAAT,EAAAa,OAAAC,YAAA,CAAwDC,MAAA,WAExDnC,OAAA6B,eAAAT,EAAA,cAAiDe,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,kBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAvC,OAAAwC,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAvC,OAAA6B,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAS,EAAAc,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAAtB,GACA,IAAAM,EAAAN,KAAAiB,WACA,WAA2B,OAAAjB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAgB,EAAAC,GAAsD,OAAA7C,OAAAC,UAAAC,eAAAC,KAAAyC,EAAAC,IAGtD7B,EAAA8B,EAAA,KAEA,IAAAC,EAAAC,OAAA,aAAAA,OAAA,iBACAC,EAAAF,EAAAhD,KAAA2C,KAAAK,GACAA,EAAAhD,KAAAX,EACA2D,IAAAG,QACA,QAAAvD,EAAA,EAAgBA,EAAAoD,EAAAlD,OAAuBF,IAAAP,EAAA2D,EAAApD,IACvC,IAAAU,EAAA4C,EAIAxC","file":"static/js/runtime~main.d653cc00.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
\ No newline at end of file
<?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 t="1559268364649" class="icon" style="" viewBox="0 0 2538 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5949" xmlns:xlink="http://www.w3.org/1999/xlink" width="317.25" height="128"><defs><style type="text/css"></style></defs><path d="M127.82465799 723.813699h2085.873972c35.068493 0 63.824658-29.457534 63.824658-65.227398 0-36.471233-28.756164-65.227397-63.824658-65.227397H127.82465799c-35.068493 0-63.824658 29.457534-63.824658 65.227397 0 36.471233 28.756164 65.227397 63.824658 65.227398zM453.96164399 953.863014h301.589041c20.339726 0 37.172603-16.832877 37.172603-37.873973 0-21.041096-16.832877-37.873973-37.172603-37.873973h-301.589041c-20.339726 0-37.172603 16.832877-37.172603 37.873973 0.70137 21.041096 16.832877 37.873973 37.172603 37.873973zM2325.21643799 650.871233h247.583562c16.832877 0 30.158904-14.027397 30.158904-31.561644s-13.326027-31.561644-30.158904-31.561644h-247.583562c-16.832877 0-30.158904 14.027397-30.158904 31.561644s13.326027 31.561644 30.158904 31.561644z" fill="#EBF7FF" p-id="5950"></path><path d="M210.58630099 848.657534h2186.169863c36.471233 0 65.227397-29.457534 65.227398-65.227397 0-36.471233-29.457534-65.227397-65.227398-65.227397H210.58630099c-36.471233 0-65.227397 29.457534-65.227397 65.227397-0.70137 35.769863 28.756164 65.227397 65.227397 65.227397z" fill="#EBF7FF" p-id="5951"></path><path d="M1040.59908632 335.254795h-16.131506V152.19726c0-37.873973 1.40274-60.317808 4.208219-93.282192H912.94977132c-14.728767 21.742466-25.249315 35.769863-52.602739 67.331507L738.30867532 268.624658c-28.756164 33.665753-28.756164 33.665753-54.005479 61.720547v100.997261c21.041096-1.40274 36.471233-2.10411 73.643836-2.10411h159.912328v27.353425c0 27.353425-1.40274 51.2-4.208219 70.136986h116.427397c-3.506849-21.742466-4.208219-37.873973-4.208219-69.435616v-28.054795h16.832877c17.534247 0 38.575342 1.40274 55.408219 3.506849V330.345205c-21.041096 2.805479-39.978082 4.909589-57.512329 4.90959z m-122.739726-64.526028v65.227397h-114.323287l82.060274-100.29589c15.430137-18.936986 23.846575-30.158904 35.068493-46.290411-2.10411 25.249315-2.805479 56.109589-2.80548 81.358904zM1504.90593632 163.419178c-8.416438-22.443836-22.443836-44.186301-41.380822-62.421918-34.367123-33.665753-82.060274-52.60274-137.468493-52.602739-70.838356 0-129.753425 31.561644-164.120548 89.073972-21.742466 35.769863-35.769863 96.789041-35.769863 155.70411 0 45.589041 7.013699 89.073973 21.742465 129.052055 8.416438 22.443836 22.443836 44.186301 41.380822 62.421917 34.367123 34.367123 81.358904 52.60274 136.767124 52.60274 71.539726 0 131.156164-31.561644 164.821917-87.671233 21.742466-35.769863 35.769863-97.490411 35.769863-156.405479 0.70137-46.290411-7.013699-89.775342-21.742465-129.753425zM1327.45936032 441.863014c-56.109589 0-84.865753-51.90137-84.865753-152.89863 0-91.879452 30.860274-145.183562 84.164384-145.183562 54.706849 0 84.164384 50.49863 84.164383 147.287671 0 99.594521-28.054795 150.794521-83.463014 150.794521zM1913.10319632 335.254795h-16.131507V152.19726c0-37.873973 1.40274-60.317808 4.208219-93.282192h-115.726027c-14.728767 21.742466-25.249315 35.769863-52.60274 67.331507l-122.739726 143.079452c-28.756164 33.665753-28.756164 33.665753-54.005479 61.720548v100.997261c21.041096-1.40274 36.471233-2.10411 73.643835-2.10411H1789.66210032v27.353425c0 27.353425-1.40274 51.2-4.208219 70.136986H1901.88127832c-3.506849-21.742466-4.208219-37.873973-4.208219-69.435616v-28.054795h16.832877c17.534247 0 38.575342 1.40274 55.408219 3.506849V330.345205c-20.339726 2.805479-39.276712 4.909589-56.810959 4.90959z m-122.739726-64.526028v65.227397h-114.323288l82.060274-100.29589c15.430137-18.936986 23.846575-30.158904 35.068493-46.290411-2.10411 25.249315-2.805479 56.109589-2.805479 81.358904zM2298.15525132 537.950685l-257.40274-0.70137V280.547945c142.378082 0 257.40274 115.024658 257.40274 257.40274zM234.72511432 537.950685c0-206.90411 167.627397-374.531507 375.232877-374.531507v373.128767l-375.232877 1.40274z" fill="#CFF0FF" p-id="5952"></path><path d="M952.460274 740.646575c42.082192-8.416438 73.643836-25.950685 71.539726-39.978082-2.805479-14.027397-39.276712-18.936986-81.358904-10.520548s-73.643836 25.950685-71.539726 39.978082m176.043835-142.378082c42.082192-8.416438 73.643836-25.950685 71.539727-39.978082-2.805479-14.027397-39.276712-18.936986-81.358905-10.520548-42.082192 8.416438-73.643836 25.950685-71.539726 39.978082m758.180822 218.126028c24.547945-9.117808 40.679452-21.041096 38.575343-31.561644-2.805479-14.027397-39.276712-18.936986-81.358904-10.520548-42.082192 8.416438-73.643836 25.950685-71.539726 39.978082m394.169863-49.79726c24.547945-9.117808 40.679452-21.041096 38.575342-31.561644-2.805479-14.027397-39.276712-18.936986-81.358904-10.520548-42.082192 8.416438-73.643836 25.950685-71.539726 39.978082m124.142466-75.747945c42.082192-8.416438 73.643836-25.950685 71.539726-39.978082-2.805479-14.027397-39.276712-18.936986-81.358904-10.520548-42.082192 8.416438-73.643836 25.950685-71.539726 39.978082" fill="#396B99" p-id="5953"></path><path d="M1069.589041 590.553425c0-88.372603-71.539726-159.912329-159.912329-159.912329s-159.912329 71.539726-159.912328 159.912329" fill="#F9DA3E" p-id="5954"></path><path d="M573.019178 318.421918l204.8 204.8-31.561644 31.561644-204.8-204.8 31.561644-31.561644z m-61.720548 58.915068L716.09863 582.136986l-31.561644 31.561644-204.8-204.8 31.561644-31.561644z m-63.123288 61.019178l204.8 204.8-31.561643 31.561644L416.613699 469.917808l31.561643-31.561644z m-61.019178 61.019178l204.8 204.8-31.561643 31.561644-204.8-204.8 31.561643-31.561644z m-51.901369 70.838357L540.054795 775.013699l-31.561644 31.561643-204.8-204.8 31.561644-31.561643z" fill="#CFF0FF" p-id="5955"></path><path d="M2054.89680366 665.6c0-129.753425-105.205479-234.958904-234.958904-234.958904s-234.958904 105.205479-234.958904 234.958904" fill="#568EC8" p-id="5956"></path><path d="M1102.553425 616.50411c0-28.756164-23.846575-51.90137-52.60274-51.90137-29.457534 0-52.60274 23.145205-52.60274 51.90137m509.895891-37.873973c0-37.873973-30.860274-68.032877-69.435617-68.032877s-69.435616 30.860274-69.435616 68.032877" fill="#396B99" p-id="5957"></path><path d="M1643.309589 741.347945c0-82.761644-68.734247-150.794521-152.89863-150.79452s-152.89863 67.331507-152.89863 150.79452" fill="#78C5FD" p-id="5958"></path><path d="M1723.265753 795.353425c0-44.186301-35.769863-79.956164-79.956164-79.956165s-79.956164 35.769863-79.956164 79.956165" fill="#396B99" p-id="5959"></path><path d="M651.572603 791.145205l-152.197261 0.70137c0-124.142466 100.29589-184.460274 224.438357-184.460274v138.871233" fill="#0E1D80" fill-opacity=".1" p-id="5960"></path><path d="M449.16894933 791.846575c0-124.142466 100.29589-224.438356 224.438357-224.438356v223.736986" fill="#78C5FD" p-id="5961"></path><path d="M1997.50137 744.854795c0-79.956164-64.526027-144.482192-144.482192-144.482192v143.780822" fill="#F9DA3E" p-id="5962"></path><path d="M1798.312329 627.726027c0 6.312329 4.208219 11.221918 9.117808 11.221918s9.117808-4.909589 9.117808-11.221918-4.208219-11.221918-9.117808-11.221917-9.117808 4.909589-9.117808 11.221917zM1763.243836 627.726027c0 6.312329 4.208219 11.221918 9.117808 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918s-4.208219-11.221918-9.117808-11.221917c-4.909589 0-9.117808 4.909589-9.117808 11.221917zM1728.175342 627.726027c0 6.312329 4.208219 11.221918 9.117809 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918 0-6.312329-4.208219-11.221918-9.117808-11.221917-4.909589 0-9.117808 4.909589-9.117809 11.221917zM1690.30137 627.726027c0 6.312329 4.208219 11.221918 9.117808 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918s-4.208219-11.221918-9.117808-11.221917c-4.909589 0-9.117808 4.909589-9.117808 11.221917zM1655.232877 627.726027c0 6.312329 4.208219 11.221918 9.117808 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918s-4.208219-11.221918-9.117808-11.221917c-4.909589 0-9.117808 4.909589-9.117808 11.221917zM1798.312329 594.761644c0 6.312329 4.208219 11.221918 9.117808 11.221918s9.117808-4.909589 9.117808-11.221918-4.208219-11.221918-9.117808-11.221918-9.117808 4.909589-9.117808 11.221918zM1763.243836 594.761644c0 6.312329 4.208219 11.221918 9.117808 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918s-4.208219-11.221918-9.117808-11.221918c-4.909589 0-9.117808 4.909589-9.117808 11.221918zM1728.175342 594.761644c0 6.312329 4.208219 11.221918 9.117809 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918 0-6.312329-4.208219-11.221918-9.117808-11.221918-4.909589 0-9.117808 4.909589-9.117809 11.221918zM1690.30137 594.761644c0 6.312329 4.208219 11.221918 9.117808 11.221918 4.909589 0 9.117808-4.909589 9.117808-11.221918s-4.208219-11.221918-9.117808-11.221918c-4.909589 0-9.117808 4.909589-9.117808 11.221918zM1798.312329 559.693151c0 6.312329 4.208219 11.221918 9.117808 11.221917s9.117808-4.909589 9.117808-11.221917-4.208219-11.221918-9.117808-11.221918-9.117808 4.909589-9.117808 11.221918zM1763.243836 559.693151c0 6.312329 4.208219 11.221918 9.117808 11.221917 4.909589 0 9.117808-4.909589 9.117808-11.221917s-4.208219-11.221918-9.117808-11.221918c-4.909589 0-9.117808 4.909589-9.117808 11.221918zM1728.175342 559.693151c0 6.312329 4.208219 11.221918 9.117809 11.221917 4.909589 0 9.117808-4.909589 9.117808-11.221917 0-6.312329-4.208219-11.221918-9.117808-11.221918-4.909589 0-9.117808 4.909589-9.117809 11.221918zM1798.312329 523.923288c0 6.312329 4.208219 11.221918 9.117808 11.221917s9.117808-4.909589 9.117808-11.221917-4.208219-11.221918-9.117808-11.221918-9.117808 5.610959-9.117808 11.221918zM1763.243836 523.923288c0 6.312329 4.208219 11.221918 9.117808 11.221917 4.909589 0 9.117808-4.909589 9.117808-11.221917s-4.208219-11.221918-9.117808-11.221918c-4.909589 0.70137-9.117808 5.610959-9.117808 11.221918zM1798.312329 488.854795c0 6.312329 4.909589 11.221918 11.221918 11.221917 6.312329 0 11.221918-4.909589 11.221917-11.221917s-4.909589-11.221918-11.221917-11.221918c-6.312329 0-11.221918 4.909589-11.221918 11.221918z" fill="#CFF0FF" p-id="5963"></path><path d="M1077.30411 851.463014c0 18.936986 65.227397 34.367123 145.884931 34.367123s145.884932-15.430137 145.884932-34.367123-65.227397-34.367123-145.884932-34.367124-145.884932 15.430137-145.884931 34.367124z" fill="#396B99" p-id="5964"></path><path d="M1173.391781 723.813699c11.221918 24.547945 0.70137 132.558904-2.80548 132.558904l-6.312328 0.70137-4.20822-52.60274s-12.624658-68.734247-13.326027-74.345206l18.235616-11.221917 8.416439 4.909589z" fill="#396B99" p-id="5965"></path><path d="M1139.024658 718.20274l12.624657 11.221918c4.909589 0.70137-13.326027 120.635616-21.041096 125.545205l-6.312329-0.70137v-60.317808c0-11.923288-6.312329-51.90137-2.805479-71.539726" fill="#396B99" p-id="5966"></path><path d="M1136.219178 640.350685l17.534247 4.909589-0.70137-10.520548-13.326028-10.520548c0 5.610959-3.506849 16.131507-3.506849 16.131507z" fill="#FFE4A8" p-id="5967"></path><path d="M1153.753425 635.441096s-7.715068-4.909589-9.819178-7.715069c-5.610959-4.909589 8.416438-23.145205 13.326027-23.145205l11.923288 5.610959 2.805479 7.013698-2.104109 11.221918-3.50685-0.70137-5.610959 9.117809-7.013698-1.40274z" fill="#FFE4A8" p-id="5968"></path><path d="M1171.989041 615.80274c-3.506849 0-14.728767-4.909589-14.728767-7.013699 0.70137 2.10411-3.506849 10.520548-7.013699 10.520548s-10.520548-9.117808-11.221917-3.506849c0.70137 1.40274 3.506849 15.430137 0 14.027397-14.027397-3.506849-8.416438-39.276712 18.235616-35.769863 36.471233 10.520548 18.235616 21.742466 14.728767 21.742466z" fill="#396B99" p-id="5969"></path><path d="M1139.024658 622.816438c-2.805479-3.506849 0-10.520548 3.506849-10.520548 2.10411 0 4.909589 1.40274 5.610959 3.50685 2.805479 12.624658-4.208219 15.430137-9.117808 7.013698z" fill="#FFE4A8" p-id="5970"></path><path d="M1162.871233 638.947945c4.208219 1.40274 9.117808 9.819178 9.117808 14.027397 0.70137 4.909589-0.70137 19.638356-0.70137 19.638357l18.936987-6.312329-0.70137 6.312329s-13.326027 9.819178-18.936987 11.923287c-2.10411 0.70137-5.610959 0-7.013698-0.70137-7.715068-4.208219-15.430137-19.638356-14.027398-30.860274 0-0.70137-2.10411-17.534247 13.326028-14.027397z" fill="#78C5FD" p-id="5971"></path><path d="M1119.386301 739.243836c10.520548 7.013699 49.79726 7.013699 56.810959-0.70137 4.909589-17.534247-5.610959-89.073973-12.624657-95.386302 0-1.40274-9.117808-5.610959-9.117808-5.610959s-14.728767-5.610959-19.638357-2.805479c-7.715068 9.117808-23.145205 86.969863-15.430137 104.50411z" fill="#568EC8" p-id="5972"></path><path d="M1109.567123 636.843836c-0.70137 3.506849 1.40274 4.208219 4.208219 5.610959 7.715068 3.506849 1.40274 21.041096-11.923287 35.068493-16.131507 16.832877 5.610959 47.693151 23.846575 33.665753 5.610959-4.208219 4.208219-16.832877 4.208219-16.832877v-48.39452l3.50685-2.10411 7.715068 4.208219c-4.909589 11.923288-4.909589 21.742466 0 24.547946 2.10411 1.40274 3.506849 1.40274 5.610959 0 0.70137-2.805479 4.208219-14.728767 1.40274-28.756165-4.909589-11.221918-37.172603-17.534247-38.575343-7.013698z" fill="#396B99" p-id="5973"></path><path d="M1131.309589 641.753425c-19.638356 14.728767-9.117808 58.213699-3.506849 59.616438 11.221918 2.10411 37.172603-12.624658 37.172602-12.624658l-0.701369-5.610958-26.652055-0.70137s8.416438-31.561644 2.805479-38.575343c-1.40274-1.40274-4.208219-2.10411-9.117808-2.104109z" fill="#78C5FD" p-id="5974"></path><path d="M1165.676712 667.00274c1.40274 2.10411 4.208219 2.10411 4.909589 0 0.70137 0-1.40274-27.353425-7.715068-29.457535-2.805479-2.10411-7.013699 0.70137-4.909589 2.10411 6.312329 1.40274 8.416438 28.756164 7.715068 27.353425z" fill="#396B99" p-id="5975"></path><path d="M1190.926027 657.884932l-21.742465-3.50685-3.50685 39.276713 21.742466 3.506849 11.221918-3.506849 7.013699-42.783562-14.728768 7.013699z" fill="#FFE4A8" p-id="5976"></path><path d="M1192.328767 657.884932l2.10411 0.701369-7.013699 39.276713-2.10411-0.70137 7.013699-39.276712z" fill="#F49130" p-id="5977"></path><path d="M1172.690411 682.432877c1.40274 2.10411 0.70137 4.208219-1.40274 5.610959-1.40274 1.40274-7.013699 1.40274-7.715068 0.701369-1.40274-1.40274-2.805479-3.506849-2.10411-5.610958 0.70137-2.805479 9.117808-4.208219 11.221918-0.70137z" fill="#FFE4A8" p-id="5978"></path><path d="M1143.934247 861.983562c1.40274-2.10411-7.715068-7.715068-12.624658-9.819178l-8.416438-0.70137c-0.70137 2.805479-4.909589 6.312329-3.50685 8.416438 2.10411 2.10411 22.443836 4.208219 24.547946 2.10411z m42.082191-2.10411c1.40274-2.10411-8.416438-5.610959-13.326027-7.013699l-8.416438-0.701369c-0.70137 2.10411-4.909589 4.909589-2.80548 7.013698 2.10411 2.10411 23.145205 2.805479 24.547945 0.70137zM1327.693151 859.879452c-3.506849 2.805479-25.249315 1.40274-26.652055 0-1.40274-1.40274 1.40274-9.819178 1.40274-9.819178h11.221917c0-0.70137 17.534247 6.312329 14.027398 9.819178z m-108.712329-7.013699c3.506849 0-1.40274-18.936986-1.40274-18.936986l-7.013698-6.312329s-8.416438 2.805479-8.416439 5.610959c-0.70137 2.805479 13.326027 19.638356 16.832877 19.638356z" fill="#F49130" p-id="5979"></path><path d="M1279.29863 732.931507l23.846575-2.80548c7.715068 18.235616 11.923288 39.978082 13.326028 62.421918l-3.506849 58.915069-10.520548 2.805479-4.20822-54.706849c0.70137 0.70137-19.638356-39.276712-18.936986-66.630137z" fill="#396B99" p-id="5980"></path><path d="M1247.736986 730.126027v58.915069l-38.575342 39.978082 6.312329 9.819178s46.991781-32.964384 56.810959-46.290411c4.208219-5.610959 14.027397-61.720548 14.027397-61.720548h-38.575343z" fill="#396B99" p-id="5981"></path><path d="M1290.520548 630.531507l4.909589-2.80548s8.416438 7.715068 7.715068 9.117809-4.909589 4.208219-7.013698 0.701369c-2.10411-2.805479-5.610959-7.013699-5.610959-7.013698z" fill="#FFE4A8" p-id="5982"></path><path d="M1295.430137 637.545205l8.416438-1.402739s8.416438 12.624658 7.013699 16.832876c-1.40274 4.208219-16.131507 15.430137-16.131507 15.430137l-8.416438-11.923287 12.624657-8.416439-3.506849-10.520548z" fill="#78C5FD" p-id="5983"></path><path d="M1263.868493 645.260274l18.936986 4.909589-1.402739-11.923288-16.131507-9.819178-1.40274 16.832877z" fill="#FFE4A8" p-id="5984"></path><path d="M1293.326027 675.419178c1.40274 2.10411 4.208219 2.10411 4.909589 0 0.70137 0-1.40274-26.652055-7.715068-29.457534-2.805479-2.10411-7.013699 0.70137-4.909589 2.104109 6.312329 1.40274 9.117808 28.054795 7.715068 27.353425z" fill="#396B99" p-id="5985"></path><path d="M1264.569863 643.857534c4.208219-1.40274 21.041096 2.10411 23.145205 4.208219 2.10411 2.10411 9.819178 21.041096 11.923288 28.756165 5.610959 17.534247 16.832877 65.928767 12.624658 70.838356-4.208219 5.610959-58.213699 7.013699-65.928767 2.805479-6.312329-3.506849-2.10411-61.019178 2.805479-80.657534 2.805479-7.715068 10.520548-24.547945 15.430137-25.950685z" fill="#568EC8" p-id="5986"></path><path d="M1218.279452 799.561644c-0.70137-0.70137-0.70137-1.40274 0-2.10411l101.69863-105.205479c0.70137-0.70137 1.40274-0.70137 2.10411 0 0.70137 0.70137 0.70137 1.40274 0 2.104109L1220.383562 799.561644h-2.10411z" fill="#1B5A89" p-id="5987"></path><path d="M1279.29863 704.876712h23.846575l0.70137 6.312329-24.547945 3.506849v-9.819178z" fill="#FFE4A8" p-id="5988"></path><path d="M1237.917808 648.065753c-0.70137 3.506849 1.40274 4.909589 4.909589 6.312329 9.117808 3.506849 2.10411 23.846575-12.624657 38.575343-17.534247 18.936986 7.715068 52.60274 27.353424 37.172602 6.312329-4.909589 4.208219-18.235616 4.20822-18.235616l-1.40274-53.30411 3.506849-2.805479 9.117808 4.208219c-4.909589 13.326027-4.909589 23.846575 0.70137 27.353425 2.10411 1.40274 3.506849 1.40274 5.610959 0 1.40274-3.506849 4.208219-16.131507 1.40274-31.561644-5.610959-14.027397-41.380822-19.638356-42.783562-7.715069z" fill="#396B99" p-id="5989"></path><path d="M1261.764384 652.273973c-6.312329 5.610959-9.117808 16.131507-11.221918 27.353424-2.805479 31.561644 7.013699 40.679452 11.221918 40.679452 4.208219 0 22.443836-2.805479 22.443835-2.805479l-0.70137-12.624658-16.131507-0.70137s8.416438-21.742466 7.013699-39.978082c0-4.909589-4.208219-15.430137-12.624657-11.923287z" fill="#78C5FD" p-id="5990"></path><path d="M1310.860274 701.369863c2.10411 0.70137 2.10411 3.506849 2.10411 3.506849-0.70137 2.10411-4.208219 7.715068-6.312329 7.715069-2.10411 0-7.715068-2.10411-4.909589-5.610959 2.10411-4.208219 7.013699-6.312329 9.117808-5.610959z m-24.547945-58.915068l5.610959-9.117809 4.208219-0.70137-1.40274-18.235616-13.326027-9.117808-16.131507 9.117808-0.70137 18.936986c6.312329 7.715068 21.742466 9.117808 21.742466 9.117809z" fill="#FFE4A8" p-id="5991"></path><path d="M1274.389041 596.865753c7.715068-1.40274 16.131507-0.70137 20.339726 3.50685 4.208219 4.208219 6.312329 11.923288 0 16.131507-7.013699 0.70137-7.715068 2.805479-14.728767-0.70137 0 0-0.70137 3.506849-2.805479 6.312328-2.10411 3.506849-8.416438 1.40274-8.416439 1.40274s0 9.819178-7.013698 9.819178c-12.624658-1.40274-9.117808-30.860274 12.624657-36.471233z" fill="#396B99" p-id="5992"></path><path d="M1275.090411 625.621918c0-2.10411 0-4.909589-2.10411-5.610959-2.805479-2.10411-5.610959 0-5.610959 2.805479-0.70137 2.805479 1.40274 5.610959 3.50685 6.312329 2.10411 1.40274 4.208219-0.70137 4.208219-3.506849z" fill="#FFDB73" p-id="5993"></path></svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="400px" height="400px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch -->
<title>Group 28 Copy 5</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="62.1023273%" y1="0%" x2="108.19718%" y2="37.8635764%" id="linearGradient-1">
<stop stop-color="#4285EB" offset="0%"></stop>
<stop stop-color="#2EC7FF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="69.644116%" y1="0%" x2="54.0428975%" y2="108.456714%" id="linearGradient-2">
<stop stop-color="#29CDFF" offset="0%"></stop>
<stop stop-color="#148EFF" offset="37.8600687%"></stop>
<stop stop-color="#0A60FF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="69.6908165%" y1="-12.9743587%" x2="16.7228981%" y2="117.391248%" id="linearGradient-3">
<stop stop-color="#FA816E" offset="0%"></stop>
<stop stop-color="#F74A5C" offset="41.472606%"></stop>
<stop stop-color="#F51D2C" offset="100%"></stop>
</linearGradient>
<linearGradient x1="68.1279872%" y1="-35.6905737%" x2="30.4400914%" y2="114.942679%" id="linearGradient-4">
<stop stop-color="#FA8E7D" offset="0%"></stop>
<stop stop-color="#F74A5C" offset="51.2635191%"></stop>
<stop stop-color="#F51D2C" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="logo" transform="translate(-20.000000, -20.000000)">
<g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)">
<g id="Group-27-Copy-3">
<g id="Group-25" fill-rule="nonzero">
<g id="2">
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-1)"></path>
<path d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z" id="Shape" fill="url(#linearGradient-2)"></path>
</g>
<path d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z" id="Shape" fill="url(#linearGradient-3)"></path>
</g>
<ellipse id="Combined-Shape" fill="url(#linearGradient-4)" cx="100.519339" cy="100.436681" rx="23.6001926" ry="23.580786"></ellipse>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title></title>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<span th:text="${message}"></span>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海教育认证平台</title>
<!-- <link type="text/css" rel="stylesheet" href="./css/css.css" />
<script src="./js/jquery.js" type="text/javascript"></script> -->
<link type="text/css" rel="stylesheet" th:href="@{/static/css/css.css}" />
<script th:src="@{/static/js/jquery.js}" type="text/javascript"></script>
</head>
<body>
<script th:inline="javascript">
/*<![CDATA[*/
var loginType = [[${loginType}]];
var ctxPath = /*[[@{/}]]*/ '';
/*]]>*/
</script>
<script>
//判断是否为金山教育阅读平台访问
if (loginType === "jsyd") {
var args = new Object();
var query = location.search.substring(1);
var param = query.split("&");
for (var i = 0; i < param.length; i++) {
var pos = param[i].indexOf('=');
if (pos == -1) {
continue;
}
var argname = param[i].substring(0, pos);
var value = param[i].substring(pos + 1);
args[argname] = unescape(value);
}
var url = unescape(args['return']) + "&entityID=https://idp.jsedu.sh.cn/idp/shibboleth";
var idp = '金山教育';
//document.location = url;
window.location.href = ctxPath + "auth/tologin?idp="+idp+"&loginUrl=" + encodeURIComponent(url);
}
// 列表选择idp跳转事件
function bfsubmit() {
if ($("#ddl_selectidp").val() != "0") {
var args = new Object();
var query = location.search.substring(1); //获取查询串
var param = query.split("&");
for (var i = 0; i < param.length; i++) {
var pos = param[i].indexOf('='); //查找name=value
if (pos == -1) { //如果没有找到就跳过
continue;
}
var argname = param[i].substring(0, pos); //提取name
var value = param[i].substring(pos + 1); //提取value
args[argname] = unescape(value); //存为属性
}
var url = unescape(args['return']) + "&entityID=" + $("#ddl_selectidp").val();
var idp = $("#ddl_selectidp").find("option:selected").html();
idp = idp.substr(3);
//document.location = url;
window.location.href = ctxPath + "auth/tologin?idp="+idp+"&loginUrl=" + encodeURIComponent(url);
} else {
alert("请选择您所在的学校");
}
}
</script>
<div class="top">
<div class="main">
<a><img th:src="@{/static/images/Rlogo.jpg}" /></a>
</div>
</div>
<div class="login-c">
<div class="main">
<div class="login-list fl">
<ul class="login-list-ul">
</ul>
</div>
<div class="login-form fr">
<h2 class="login-form-h2">用户登录</h2>
<div class="login-jump">
<div class="login-jump-select">
<dl class="jump-select-dl clearfix">
<dt>
<span></span>
</dt>
<dd>
<select name="ddl_selectidp" id="ddl_selectidp" class="jump-select">
<option value="0">选择您所在的学校</option>
<option value="https://idp.shec.edu.cn/idp/shibboleth">01:上海市教委</option>
<option value="https://idpfudan.fudan.edu.cn/idp/shibboleth">02:复旦大学</option>
<option value="https://idp.ecnu.edu.cn/idp/shibboleth">04:华东师范大学</option>
<option value="https://idp.ecust.edu.cn/idp/shibboleth">05:华东理工大学</option>
<option value="https://idp.shisu.edu.cn/idp/shibboleth">06:上海外国语大学</option>
<option value="https://idp.dhu.edu.cn/idp/shibboleth">07:东华大学</option>
<option value="https://idpcarsi.shufe.edu.cn/idp/shibboleth">08:上海财经大学</option>
<option value="https://idp.usst.edu.cn/idp/shibboleth">09:上海理工大学</option>
<option value="https://idp.shiep.edu.cn/idp/shibboleth">10:上海电力学院</option>
<option value="https://idp.shu.edu.cn/idp/shibboleth">11:上海大学</option>
<option value="https://idp.shnu.edu.cn/idp/shibboleth">12:上海师范大学</option>
<option value="https://jaccount.sjtu.edu.cn/idp/shibboleth">15:上海交通大学</option>
<option value="https://idp.shmtu.edu.cn/idp/shibboleth">16:上海海事大学</option>
<option value="https://idp-carsi.shou.edu.cn/idp/shibboleth">17:上海海洋大学</option>
<option value="https://idp.sspu.edu.cn/idp/shibboleth">18:上海第二工业大学</option>
<option value="https://idp.sandau.edu.cn/idp/shibboleth">19:上海杉达学院</option>
<option value="https://idp.sdju.edu.cn/idp/shibboleth">20:上海电机学院</option>
<option value="https://idp.shsmu.edu.cn/idp/shibboleth">21:上海交通大学医学院</option>
<option value="https://idp.shcc.edu.cn/idp/shibboleth">22:上海海关学院</option>
<option value="https://idp.sbs.edu.cn/idp/shibboleth">23:上海商学院</option>
<option value="https://idp.gench.edu.cn/idp/shibboleth">24:上海建桥学院</option>
<option value="https://idp.smmu.edu.cn/idp/shibboleth">25:海军军医大学</option>
<option value="https://idp-carsi.suibe.edu.cn/idp/shibboleth">26:上海对外经贸大学</option>
<option value="https://idp.sus.edu.cn/idp/shibboleth">27:上海体育学院</option>
<option value="https://idp.esu.edu.cn/idp/shibboleth">28:上海东海职业技术学院</option>
<option value="https://idp.shafc.edu.cn/idp/shibboleth">29:上海农林职业技术学院</option>
<option value="https://idp.sicfl.edu.cn/idp/shibboleth">30:上海工商外国语职业学院</option>
<option value="https://idp.shjgu.edu.cn/idp/shibboleth">31:上海济光职业技术学院</option>
<option value="https://idp.sou.edu.cn/idp/shibboleth">32:上海开放大学</option>
<option value="https://idp.sumhs.edu.cn/idp/shibboleth">33:上海健康医学院</option>
<option value="https://idp.ecupl.edu.cn/idp/shibboleth">34:华东政法大学</option>
<option value="https://idp-sma.cloud.sh.edu.cn/idp/shibboleth">35:上海海事职业技术学院</option>
<option value="https://idp.sitsh.edu.cn/idp/shibboleth">36:上海旅游高等专科学校</option>
<option value="https://idp.shpc.edu.cn/idp/shibboleth">37:上海公安学院</option>
<option value="https://idp-shec.cloud.sh.edu.cn/idp/shibboleth">38:认证中心测试子域</option>
<option value="https://idp-xwcb.cloud.sh.edu.cn/idp/shibboleth">39:上海新闻出版职业技术学校</option>
<option value="https://idp-shwmcj.cloud.sh.edu.cn/idp/shibboleth">40:上海市贸易学校</option>
<option value="https://idp-scasqhwz.cloud.sh.edu.cn/idp/shibboleth">41:上海商业会计学校</option>
<option value="https://idp-shnhzx.cloud.sh.edu.cn/idp/shibboleth">42:上海市南湖职校</option>
<option value="https://idp-sems.cloud.sh.edu.cn/idp/shibboleth">43:上海市经济管理学校</option>
<option value="https://idp-sthu.cloud.sh.edu.cn/idp/shibboleth">44:上海师范大学天华学院</option>
<option value="https://idp-sjxqzx.cloud.sh.edu.cn/idp/shibboleth">51:上海市松江区新桥职业技术学校</option>
<option value="https://idp-qpzx.cloud.sh.edu.cn/idp/shibboleth">52:上海市青浦区职业学校</option>
<option value="https://idp.sit.edu.cn/idp/shibboleth">53:上海应用技术大学</option>
<option value="https://idp.scst.edu.cn/idp/shibboleth">54:上海科学技术职业学院</option>
<option value="https://idp.xdsisu.edu.cn/idp/shibboleth">55:上海外国语大学贤达经济人文学院</option>
<option value="https://idp.firstjob.com.cn/idp/shibboleth">56:学生事务中心</option>
<option value="https://idp.hpe.cn/idp/shibboleth">57:黄浦区教育信息中心</option>
<option value="https://idp.chneic.sh.cn/idp/shibboleth">58:长宁区教育信息中心</option>
<option value="https://idp.sjedu.cn/idp/shibboleth">59:松江智慧教育</option>
<option value="https://idp.mhedu.sh.cn/idp/shibboleth">60:闵行区教育局信息中心</option>
<option value="https://idp.xhedu.sh.cn/idp/shibboleth">61:徐汇教育</option>
<option value="https://idp.qpedu.cn/idp/shibboleth">62:青浦教育</option>
<option value="https://idp.jsedu.sh.cn/idp/shibboleth">63:金山教育</option>
<option value="https://idp-cmjy.cloud.sh.edu.cn/idp/shibboleth">64:崇明教育</option>
<option value="https://idp.pte.sh.cn/idp/shibboleth">66:普陀教育</option>
<option value="https://idp-age03.cloud.sh.edu.cn/idp/shibboleth">70:学前03子域</option>
<option value="https://idp-huiyuan.cloud.sh.edu.cn/idp/shibboleth">72:慧源共享认证子域</option>
<option value="https://idp-age06.cloud.sh.edu.cn/idp/shibboleth">73:学前教育认证</option>
<option value="https://idp-zzyrz.cloud.sh.edu.cn/idp/shibboleth">75:中职开放课程云认证</option>
<option value="https://stu-idp.edu.sh.cn/idp/shibboleth">76:电教馆-idp</option>
</select>
</dd>
</dl>
</div>
<div class="login-jump-btn">
<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="left"><a href="#" class="jump-btn" onclick="bfsubmit();"></a></td>
<td align="right"><a href="#" class="help-btn"></a></td>
</tr>
</table>
</div>
</div>
<div class="login-form-tip">
<p>建议使用IE10.0及以上版本浏览器或同类浏览器,</p>
<p>建议使用1024×768及以上分辨率浏览,</p>
</div>
</div>
<div class="clear"></div>
</div>
</div>
<div class="bottom">
<p>版权所有&copy;上海教育认证中心</p>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海数字教材运营管理中心</title>
<link rel="stylesheet" th:href="@{/static/css/main_0216.css}"/>
<link rel="stylesheet" th:href="@{/static/css/bootstrap.min.css}"/>
<link rel="stylesheet" th:href="@{/static/css/normalize.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.10.2.min.js}"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a
href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<div class="bg">
<div class="bg-form">
<div class="loginContainer">
<!--<h1>上海数字教材运营管理中心</h1>-->
<div class="login-box">
<!-- <div class="bg-form" style="width: 80%;margin: 0 auto"></div> -->
<button onclick="toLogin(1)" accesskey="l" class="login-btn" id="login-button" name="button" style="outline:0;" type="button">登录
</button>
<div class="login-span"><span>如果您曾经参与上海市中小学数字教材试验项目,</span><span><a style="color:red;"onclick="toLogin(2)">请点击此处使用数字教材账号登录>></a></span></div> <!-- </div> -->
</div>
</div>
</div>
</div>
<script th:inline="javascript">
/*<![CDATA[*/
var loginUrl1 = [[${loginUrl1}]];
var loginUrl2 = [[${loginUrl2}]];
var logId = [[${logId}]];
var ctxPath = /*[[@{/}]]*/ '';
/*]]>*/
</script>
<script type="text/javascript">
function toLogin (num) {
var baseUrl = ctxPath + "auth/tologin?logId="+logId+"&oauthType=";
//var baseUrl = ctxPath + "auth/tologin?oauthType=";
if (num === 1) {
window.location.href = baseUrl+ "dianjiaoguan&loginUrl=" + encodeURIComponent(loginUrl1);
} else if (num === 2) {
window.location.href = baseUrl+ "edenoperation&loginUrl=" + encodeURIComponent(loginUrl2);
}
return false;
}
</script>
</body></html>
\ No newline at end of file
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<html class="no-js" xmlns:th="http://www.w3.org/1999/xhtml"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<meta content="" name="description" />
<meta content="width=device-width, initial-scale=1" name="viewport" />
<title>上海数字教材运营管理中心</title>
<script type="text/javascript" th:src="@{/static/js/jquery.js}"></script>
<!--<script src="../js/vendor/modernizr-2.6.2.min.js"></script>-->
</head>
<body>
<form th:action="${successPostUrl}" method="post" th:object="${clientDataInfo}">
<input type="hidden" th:value="${clientDataInfo.authUserInfo.id}" name="authUserInfo.id"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.loginName}" name="authUserInfo.loginName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.realName}" name="authUserInfo.realName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.userType}" name="authUserInfo.userType"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.source}" name="authUserInfo.source"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentId}" name="authUserInfo.studentId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentCode}" name="authUserInfo.studentCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentStage}" name="authUserInfo.studentStage"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentGrade}" name="authUserInfo.studentGrade"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentClass}" name="authUserInfo.studentClass"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentStageName}" name="authUserInfo.studentStageName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentGradeName}" name="authUserInfo.studentGradeName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentClassName}" name="authUserInfo.studentClassName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolId}" name="authUserInfo.studentSchoolId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentCodeStatus}" name="authUserInfo.studentCodeStatus"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolCode}" name="authUserInfo.studentSchoolCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentSchoolName}" name="authUserInfo.studentSchoolName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentRegionCode}" name="authUserInfo.studentRegionCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.studentRegionName}" name="authUserInfo.studentRegionName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingNo}" name="authUserInfo.teacherTrainingNo"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingUserName}" name="authUserInfo.teacherTrainingUserName"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherRegionCode}" name="authUserInfo.teacherRegionCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherCampusCode}" name="authUserInfo.teacherCampusCode"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherTrainingSchoolType}" name="authUserInfo.teacherTrainingSchoolType"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherStage}" name="authUserInfo.teacherStage"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherGrade}" name="authUserInfo.teacherGrade"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSubject}" name="authUserInfo.teacherSubject"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSchoolId}" name="authUserInfo.teacherSchoolId"/>
<input type="hidden" th:value="${clientDataInfo.authUserInfo.teacherSchoolName}" name="authUserInfo.teacherSchoolName"/>
<input type="hidden" th:value="${clientDataInfo.returnUrl}" name="returnUrl"/>
<input type="hidden" th:value="${clientDataInfo.oauthType}" name="oauthType"/>
</form>
<script type="text/javascript">
$(function(){
$("form").submit();
})
</script>
</body></html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment