main: update java demo and instructions
216
JavaClientDemo/pom.xml
Normal file
@@ -0,0 +1,216 @@
|
||||
<?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>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.0.1.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.yc.inter</groupId>
|
||||
<artifactId>vx-inter-client</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>vx-inter-client</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>com.vaadin.external.google</groupId>
|
||||
<artifactId>android-json</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>1.3.5</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-jasper</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
<artifactId>commons-lang</artifactId>
|
||||
<version>2.6</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>2.8.6</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk16</artifactId>
|
||||
<version>1.46</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.72</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 七牛获取token,依赖包 -->
|
||||
<dependency>
|
||||
<groupId>com.qiniu</groupId>
|
||||
<artifactId>qiniu-java-sdk</artifactId>
|
||||
<version>[7.2.0, 7.2.99]</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.31</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- protobuf插件 -->
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
<version>3.8.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-core</artifactId>
|
||||
<version>1.4.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-runtime</artifactId>
|
||||
<version>1.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--WebSocket核心依赖包-->
|
||||
<dependency>
|
||||
<groupId>org.java-websocket</groupId>
|
||||
<artifactId>Java-WebSocket</artifactId>
|
||||
<version>1.3.8</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.websocket</groupId>
|
||||
<artifactId>javax.websocket-api</artifactId>
|
||||
<version>1.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<mainClass>
|
||||
com.yc.inter.websocket.client.WwWebSocketDemoClient
|
||||
</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugin</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.1</version>
|
||||
<configuration>
|
||||
<skip>true</skip>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
||||
28
JavaClientDemo/src/main/java/com/yc/inter/Application.java
Normal file
@@ -0,0 +1,28 @@
|
||||
package com.yc.inter;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableCaching
|
||||
public class Application extends SpringBootServletInitializer {
|
||||
@Override
|
||||
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
|
||||
return application.sources(Application.class);
|
||||
}
|
||||
@Bean
|
||||
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
|
||||
PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer();
|
||||
c.setIgnoreUnresolvablePlaceholders(true);
|
||||
return c;
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(Application.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.yc.inter.common;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
@Component
|
||||
@Order(1)
|
||||
public class Interceptor implements HandlerInterceptor {
|
||||
|
||||
private Logger log = LoggerFactory.getLogger(this.getClass());
|
||||
|
||||
private List<Integer> errorCodeList = Arrays.asList(401, 404, 403, 500);
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
||||
throws Exception {
|
||||
|
||||
String origin = request.getHeader("Origin");
|
||||
response.setHeader("Access-Control-Allow-Origin", origin);
|
||||
response.setHeader("Access-Control-Allow-Methods", "*");
|
||||
response.setHeader("Access-Control-Allow-Headers","Origin,Content-Type,Accept,token,X-Requested-With,X-Cookie");
|
||||
response.setHeader("Access-Control-Allow-Credentials", "true");
|
||||
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
|
||||
ModelAndView modelAndView) throws Exception {
|
||||
log.debug("拦截器正在进行后处理....");
|
||||
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
|
||||
throws Exception {
|
||||
log.debug("拦截器处理完成....");
|
||||
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.yc.inter.common;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Configuration
|
||||
public class SpringMvcConfig implements WebMvcConfigurer {
|
||||
|
||||
@Autowired
|
||||
private Interceptor interceptor;
|
||||
|
||||
/**
|
||||
* 自定义资源映射addResourceHandlers
|
||||
*/
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
WebMvcConfigurer.super.addResourceHandlers(registry);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.yc.inter.websocket.client;
|
||||
|
||||
import com.yc.inter.websocket.linkserver.WwHookerApis;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class WwWebSocketDemoClient {
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
WwHookerApis.getInstance().connect();
|
||||
Scanner input = new Scanner(System.in);
|
||||
String val = null; // 记录输入度的字符串
|
||||
do {
|
||||
val = input.next(); // 等待输入值
|
||||
WwHookerApis.getInstance().sendMessage(val);
|
||||
} while (!val.equals("#")); // 如果输入的值不版是#就继续输入
|
||||
input.close(); // 关闭资源
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
package com.yc.inter.websocket.client.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
public class PropertiesUtil {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);
|
||||
|
||||
/**
|
||||
* <p>描述:根据相对路径获取一个Properties对象 </p>
|
||||
* <p>日期:2014-12-3 上午08:33:51 </p>
|
||||
* @param filePath 文件相对于项目根路径的相对路径,如:src/jdbc.properties
|
||||
* @return 返回Properties对象,可使用返回对象进行属性获取
|
||||
*/
|
||||
public static Properties getProperties(String filePath) {
|
||||
Properties properties = null;
|
||||
FileInputStream in = null;
|
||||
try {
|
||||
in = new FileInputStream(filePath);
|
||||
properties = new Properties();
|
||||
|
||||
//加载文件
|
||||
properties.load(in);
|
||||
} catch (Exception e) {
|
||||
logger.error("读取配置文件出错:"+e.getMessage(), e);
|
||||
} finally {
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("关闭文件流出错:"+e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* <p>描述:根据相对路径和配置属性获取一个properties文件中某一个属性值 </p>
|
||||
* <p>日期:2014-12-3 上午08:40:54 </p>
|
||||
* @param filePath 文件相对于项目根路径的相对路径,如:src/jdbc.properties
|
||||
* @param key 配置文件中的属性名字,如:配置文件中存在键值对user=admin,则传入user
|
||||
* @return 返回目标配置文件中属性为参数传入key的属性值
|
||||
*/
|
||||
public static String getProperty(String filePath, String key){
|
||||
Properties properties = getProperties(filePath);
|
||||
String property = null;
|
||||
if(properties!=null){
|
||||
property = properties.getProperty(key);
|
||||
}
|
||||
return property;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* <p>描述:web环境读取配置文件 </p>
|
||||
* <p>日期:2014-12-22 下午03:09:24 </p>
|
||||
* @param clz 类
|
||||
* @param fileName 文件名,不用加后缀
|
||||
* @return 返回配置文件对象
|
||||
* @throws Exception
|
||||
*/
|
||||
public static Properties getProperties(Class<?> clz, String fileName) {
|
||||
Properties properties = null;
|
||||
InputStream input = null;
|
||||
try {
|
||||
input = clz.getClassLoader().getResourceAsStream(fileName+".properties");
|
||||
properties = new Properties();
|
||||
properties.load(input);
|
||||
} catch (Exception e) {
|
||||
logger.error("读取配置文件出错:"+e.getMessage(), e);
|
||||
} finally{
|
||||
try {
|
||||
if (input != null) {
|
||||
input.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("关闭文件流出错:"+e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* <p>描述:web环境读取配置文件的属性值 </p>
|
||||
* <p>日期:2014-12-22 下午03:09:24 </p>
|
||||
* @param clz 类
|
||||
* @param fileName 文件名,不用加后缀
|
||||
* @param key 要获取的键
|
||||
* @return 返回属性值
|
||||
* @throws Exception
|
||||
*/
|
||||
public static String getProperty(Class<?> clz, String fileName, String key) {
|
||||
String property = null;
|
||||
InputStream input = null;
|
||||
try {
|
||||
input = clz.getClassLoader().getResourceAsStream(fileName+".properties");
|
||||
Properties properties = new Properties();
|
||||
properties.load(input);
|
||||
property = properties.getProperty(key);
|
||||
} catch (Exception e) {
|
||||
logger.error("读取配置文件出错:"+e.getMessage(), e);
|
||||
} finally{
|
||||
try {
|
||||
if (input != null) {
|
||||
input.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.error("关闭文件流出错:"+e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return property;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
package com.yc.inter.websocket.linkserver;
|
||||
|
||||
public class WwCmdConfigs {
|
||||
|
||||
public final static String wsHost = "ws://121.36.244.11:8099/im-server/client";
|
||||
public final static String username = ""; // 插件首页显示的测试账号
|
||||
public final static String password = ""; // 插件首页显示的测试账号下显示的数据两次MD5(32位大写)
|
||||
|
||||
// 执行指令的插件端id
|
||||
public final static Long wid = 0L; // 请输入插件首页显示的登录Wid
|
||||
|
||||
// 外部联系人
|
||||
public final static Long outterId = 0L; // 通过3411获取到所有好友(必填)
|
||||
// 内部联系人
|
||||
public final static Long innerId = 0L; // 通过3410获取到的内部成员
|
||||
// 被邀请的联系人
|
||||
public final static Long invitedId = 0L; // 可以配置为好友或者成员
|
||||
|
||||
// 需要被删除人的id
|
||||
public final static Long delOutterId = 0L; // 仅能配置为外部联系人3411获取
|
||||
|
||||
// 小程序id
|
||||
public final static String weappid = "wx84dd50b996d3d862";
|
||||
|
||||
// 搜索的手机号码
|
||||
public final static String phone = ""; // 需要添加的好友
|
||||
|
||||
// 测试的id(可以是群聊也可以是单聊)
|
||||
public final static Long convId = 0L; // 发送消息的群或者用户id
|
||||
|
||||
// 部门id
|
||||
public final static Long deptId = 0L; // 348 获取的数据
|
||||
|
||||
public final static String CmdWw321 = "CmdWw321";
|
||||
|
||||
public final static String CmdWw331 = "CmdWw331";
|
||||
public final static String CmdWw332 = "CmdWw332";
|
||||
public final static String CmdWw333 = "CmdWw333";
|
||||
public final static String CmdWw334 = "CmdWw334";
|
||||
public final static String CmdWw335 = "CmdWw335";
|
||||
public final static String CmdWw336 = "CmdWw336";
|
||||
public final static String CmdWw337 = "CmdWw337";
|
||||
public final static String CmdWw338 = "CmdWw338";
|
||||
|
||||
public final static String CmdWw341 = "CmdWw341";
|
||||
public final static String CmdWw342 = "CmdWw342";
|
||||
public final static String CmdWw343 = "CmdWw343";
|
||||
public final static String CmdWw344 = "CmdWw344";
|
||||
public final static String CmdWw345 = "CmdWw345";
|
||||
public final static String CmdWw346 = "CmdWw346";
|
||||
public final static String CmdWw347 = "CmdWw347";
|
||||
public final static String CmdWw348 = "CmdWw348";
|
||||
public final static String CmdWw349 = "CmdWw349";
|
||||
public final static String CmdWw3410 = "CmdWw3410";
|
||||
public final static String CmdWw3411 = "CmdWw3411";
|
||||
public final static String CmdWw3412 = "CmdWw3412";
|
||||
public final static String CmdWw3413 = "CmdWw3413";
|
||||
public final static String CmdWw3414 = "CmdWw3414";
|
||||
public final static String CmdWw3415 = "CmdWw3415";
|
||||
public final static String CmdWw3416 = "CmdWw3416";
|
||||
public final static String CmdWw3417 = "CmdWw3417";
|
||||
public final static String CmdWw3418 = "CmdWw3418";
|
||||
public final static String CmdWw3419 = "CmdWw3419";
|
||||
|
||||
public final static String CmdWw351 = "CmdWw351";
|
||||
public final static String CmdWw352 = "CmdWw352";
|
||||
public final static String CmdWw353 = "CmdWw353";
|
||||
public final static String CmdWw354 = "CmdWw354";
|
||||
public final static String CmdWw355 = "CmdWw355";
|
||||
public final static String CmdWw356 = "CmdWw356";
|
||||
public final static String CmdWw357 = "CmdWw357";
|
||||
public final static String CmdWw358 = "CmdWw358";
|
||||
public final static String CmdWw359 = "CmdWw359";
|
||||
public final static String CmdWw3510 = "CmdWw3510";
|
||||
public final static String CmdWw3511 = "CmdWw3511";
|
||||
public final static String CmdWw3512 = "CmdWw3512";
|
||||
public final static String CmdWw3513 = "CmdWw3513";
|
||||
public final static String CmdWw3514 = "CmdWw3514";
|
||||
public final static String CmdWw3515 = "CmdWw3515";
|
||||
public final static String CmdWw3516 = "CmdWw3516";
|
||||
public final static String CmdWw3517 = "CmdWw3517";
|
||||
public final static String CmdWw3518 = "CmdWw3518";
|
||||
public final static String CmdWw3519 = "CmdWw3519";
|
||||
public final static String CmdWw3520 = "CmdWw3520";
|
||||
public final static String CmdWw3521 = "CmdWw3521";
|
||||
public final static String CmdWw3522 = "CmdWw3522";
|
||||
public final static String CmdWw3523 = "CmdWw3523";
|
||||
public final static String CmdWw3524 = "CmdWw3524";
|
||||
public final static String CmdWw3525 = "CmdWw3525";
|
||||
public final static String CmdWw3526 = "CmdWw3526";
|
||||
|
||||
public final static String CmdWw361 = "CmdWw361";
|
||||
public final static String CmdWw362 = "CmdWw362";
|
||||
public final static String CmdWw363 = "CmdWw363";
|
||||
public final static String CmdWw364 = "CmdWw364";
|
||||
public final static String CmdWw365 = "CmdWw365";
|
||||
public final static String CmdWw366 = "CmdWw366";
|
||||
public final static String CmdWw367 = "CmdWw367";
|
||||
public final static String CmdWw368 = "CmdWw368";
|
||||
public final static String CmdWw369 = "CmdWw369";
|
||||
public final static String CmdWw3610 = "CmdWw3610";
|
||||
public final static String CmdWw3611 = "CmdWw3611";
|
||||
public final static String CmdWw3612 = "CmdWw3612";
|
||||
public final static String CmdWw3613 = "CmdWw3613";
|
||||
public final static String CmdWw3614 = "CmdWw3614";
|
||||
|
||||
public final static String CmdWw371 = "CmdWw371";
|
||||
public final static String CmdWw372 = "CmdWw372";
|
||||
public final static String CmdWw373 = "CmdWw373";
|
||||
public final static String CmdWw374 = "CmdWw374";
|
||||
public final static String CmdWw375 = "CmdWw375";
|
||||
public final static String CmdWw376 = "CmdWw376";
|
||||
public final static String CmdWw377 = "CmdWw377";
|
||||
public final static String CmdWw378 = "CmdWw378";
|
||||
public final static String CmdWw379 = "CmdWw379";
|
||||
public final static String CmdWw3710 = "CmdWw3710";
|
||||
public final static String CmdWw3711 = "CmdWw3711";
|
||||
public final static String CmdWw3712 = "CmdWw3712";
|
||||
public final static String CmdWw3713 = "CmdWw3713";
|
||||
public final static String CmdWw3714 = "CmdWw3714";
|
||||
public final static String CmdWw3715 = "CmdWw3715";
|
||||
public final static String CmdWw3716 = "CmdWw3716";
|
||||
public final static String CmdWw3717 = "CmdWw3717";
|
||||
public final static String CmdWw3718 = "CmdWw3718";
|
||||
public final static String CmdWw3719 = "CmdWw3719";
|
||||
public final static String CmdWw3720 = "CmdWw3720";
|
||||
public final static String CmdWw3721 = "CmdWw3721";
|
||||
public final static String CmdWw3722 = "CmdWw3722";
|
||||
public final static String CmdWw3723 = "CmdWw3723";
|
||||
|
||||
public final static String CmdWw381 = "CmdWw381";
|
||||
public final static String CmdWw382 = "CmdWw382";
|
||||
public final static String CmdWw383 = "CmdWw383";
|
||||
public final static String CmdWw384 = "CmdWw384";
|
||||
public final static String CmdWw385 = "CmdWw385";
|
||||
|
||||
public final static String CmdWw3101 = "CmdWw3101";
|
||||
public final static String CmdWw3102 = "CmdWw3102";
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.yc.inter.websocket.linkserver;
|
||||
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import javax.servlet.http.HttpSession;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WwServerClient extends WebSocketClient {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(WwServerClient.class);
|
||||
|
||||
public WwServerClient(URI serverUri) {
|
||||
super(serverUri);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake serverHandshake) {
|
||||
logger.info("WwServerClient握手。。。");
|
||||
}
|
||||
|
||||
public void onMessage(String message) {
|
||||
try {
|
||||
logger.info("客户端接收服务端回调标识"+message);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onMessage(ByteBuffer message) {
|
||||
try {
|
||||
byte[] bytes = new byte[message.limit() - message.position()];
|
||||
message.get(bytes);
|
||||
WwHookerApis.getInstance().receiveMessage(bytes);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClose(int i, String s, boolean b) {
|
||||
WwHookerApis.getInstance().reconnect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception e) {
|
||||
WwHookerApis.getInstance().reconnect();
|
||||
}
|
||||
|
||||
}
|
||||
188487
JavaClientDemo/src/main/java/com/yc/inter/websocket/protobuf/WwCmdPb.java
Normal file
@@ -0,0 +1,39 @@
|
||||
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
// source: WxCmd.proto
|
||||
|
||||
package com.yc.inter.websocket.client.protobuf;
|
||||
|
||||
public final class WxCmdPb {
|
||||
private WxCmdPb() {}
|
||||
public static void registerAllExtensions(
|
||||
com.google.protobuf.ExtensionRegistry registry) {
|
||||
}
|
||||
|
||||
public static com.google.protobuf.Descriptors.FileDescriptor
|
||||
getDescriptor() {
|
||||
return descriptor;
|
||||
}
|
||||
private static com.google.protobuf.Descriptors.FileDescriptor
|
||||
descriptor;
|
||||
static {
|
||||
java.lang.String[] descriptorData = {
|
||||
"\n\013WxCmd.proto\022\005protoB5\n\037com.yc.inter.web" +
|
||||
"socket.protobufB\007WxCmdPbZ\t.;WwCmdPbb\006pro" +
|
||||
"to3"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
|
||||
public com.google.protobuf.ExtensionRegistry assignDescriptors(
|
||||
com.google.protobuf.Descriptors.FileDescriptor root) {
|
||||
descriptor = root;
|
||||
return null;
|
||||
}
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor
|
||||
.internalBuildGeneratedFileFrom(descriptorData,
|
||||
new com.google.protobuf.Descriptors.FileDescriptor[] {
|
||||
}, assigner);
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(outer_class_scope)
|
||||
}
|
||||
31
JavaClientDemo/src/main/resources/application.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
debug: true
|
||||
server:
|
||||
port: 8081
|
||||
servlet:
|
||||
session:
|
||||
timeout: 86400
|
||||
context-path: /wwclient
|
||||
tomcat:
|
||||
max-http-post-size: -1
|
||||
|
||||
|
||||
spring:
|
||||
jackson:
|
||||
time-zone: GMT+8
|
||||
mvc:
|
||||
view:
|
||||
suffix: /WEB-INF/jsp/
|
||||
throw-exception-if-no-handler-found: true
|
||||
resources:
|
||||
add-mappings: true
|
||||
|
||||
mybatis:
|
||||
mapper-locations:
|
||||
- classpath:mapper/*/*.xml
|
||||
#实体扫描,多个package用逗号或者分号分隔
|
||||
type-aliases-package: com.yc.inter.**.entity
|
||||
|
||||
|
||||
logging:
|
||||
config: classpath:logback-spring.xml
|
||||
11
JavaClientDemo/src/main/resources/general-conf.properties
Normal file
@@ -0,0 +1,11 @@
|
||||
#服务器IP
|
||||
server_ip=106.12.3.102
|
||||
#server_ip=127.0.0.1
|
||||
#服务器端口
|
||||
server_port=8092
|
||||
#server_port=8086
|
||||
#服务器工程名称
|
||||
server_item=inter
|
||||
#websocket 名称
|
||||
server_name=wwserver
|
||||
|
||||
53
JavaClientDemo/src/main/resources/log4j.properties
Normal file
@@ -0,0 +1,53 @@
|
||||
### set log levels - for more verbose logging change 'info' to 'debug' ###
|
||||
|
||||
log4j.rootLogger=debug, stdout,R
|
||||
|
||||
### direct log messages to stdout ###
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
|
||||
# %d{ABSOLUTE} %5p %c:%L - %m%n
|
||||
|
||||
#log4j.appender.R.File=d:/log4j.log
|
||||
#linux
|
||||
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
|
||||
log4j.appender.R.File=/web/fomstsprobe_cq/tomcat-fomstsprobe-38080/logs/log4j.log
|
||||
#log4j.appender.R.MaxFileSize=1000KB
|
||||
#log4j.appender.R.MaxBackupIndex=10
|
||||
log4j.appender.R.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
|
||||
|
||||
# SqlMap logging configuration...
|
||||
log4j.logger.org.springframework=ERROR
|
||||
log4j.logger.org.apache.ibatis=DEBUG
|
||||
log4j.logger.org.mybatis.spring=INFO
|
||||
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
|
||||
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
|
||||
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
|
||||
log4j.logger.java.sql.Connection=DEBUG
|
||||
log4j.logger.java.sql.Statement=INFO
|
||||
log4j.logger.java.sql.PreparedStatement=INFO
|
||||
log4j.logger.java.sql.ResultSet=DEBUG
|
||||
|
||||
log4j.logger.org.quartz.core=INFO
|
||||
log4j.logger.org.quartz.impl.jdbcjobstore.StdRowLockSemaphore=INFO
|
||||
|
||||
log4j.logger.org.hibernate=error
|
||||
|
||||
log4j.logger.com.zaxxer.hikari.pool = INFO
|
||||
|
||||
### log HQL query parser activity
|
||||
#log4j.logger.org.hibernate.hql.ast.AST=debug
|
||||
|
||||
### log just the SQL
|
||||
#log4j.logger.org.hibernate.SQL=debug
|
||||
|
||||
### log JDBC bind parameters ###
|
||||
log4j.logger.org.hibernate.type=debug
|
||||
|
||||
### log schema export/update ###
|
||||
log4j.logger.org.hibernate.tool.hbm2ddl=debug
|
||||
|
||||
|
||||
|
||||
86
JavaClientDemo/src/main/resources/logback-spring.xml
Normal file
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
|
||||
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
|
||||
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
|
||||
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
|
||||
<configuration scan="true" scanPeriod="10 seconds">
|
||||
|
||||
<!-- 动态日志级别 -->
|
||||
<jmxConfigurator/>
|
||||
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
|
||||
|
||||
<!-- 自定义名字 -->
|
||||
<contextName>veteran-admin</contextName>
|
||||
<!-- 定义日志位置变量,定义变量后,可以使“${}”来使用变量。 -->
|
||||
<property name="LOG_HOME" value="D://logs" />
|
||||
<!--<springProperty scope="context" name="LOG_HOME" source="logging.path"/>
|
||||
<springProperty scope="context" name="LOG_LEVEL" source="logging.level"/>-->
|
||||
|
||||
<!--输出到控制台-->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<!--<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%class]-[%-5level] %logger{50} - %msg%n</Pattern>-->
|
||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%logger{50}]-[%-5level] %msg%n</Pattern>
|
||||
<!-- 设置字符集 -->
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
|
||||
<!--输出到文件-->
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文件的路径及文件名 -->
|
||||
<file>${LOG_HOME}/log.log</file>
|
||||
<!--日志文件输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%logger{50}]-[%-5level] %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天日志归档路径以及格式 -->
|
||||
<fileNamePattern>${LOG_HOME}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
</appender>
|
||||
|
||||
<!--
|
||||
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
|
||||
以及指定<appender>。<logger>仅有一个name属性,
|
||||
一个可选的level和一个可选的addtivity属性。
|
||||
name:用来指定受此logger约束的某一个包或者具体的某一个类。
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
|
||||
如果未设置此属性,那么当前logger将会继承上级的级别。
|
||||
addtivity:是否向上级logger传递打印信息。默认是true,建议配置为false不传递,如果传递则本身打印一次日志,root打印一次日志。
|
||||
-->
|
||||
<!--<logger name="org.springframework.web" level="info"/>-->
|
||||
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
|
||||
<!--
|
||||
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
|
||||
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
|
||||
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
|
||||
-->
|
||||
<logger name="com.zaxxer.hikari.pool" level="debug" additivity="false"/>
|
||||
<logger name="org.springframework" level="debug" additivity="false"/>
|
||||
<logger name="org.hibernate" level="debug" additivity="false"/>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
不能设置为INHERITED或者同义词NULL。默认是DEBUG
|
||||
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
|
||||
-->
|
||||
<root level="debug">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="FILE" />
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
31
JavaClientDemo/target/classes/application.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
debug: true
|
||||
server:
|
||||
port: 8081
|
||||
servlet:
|
||||
session:
|
||||
timeout: 86400
|
||||
context-path: /wwclient
|
||||
tomcat:
|
||||
max-http-post-size: -1
|
||||
|
||||
|
||||
spring:
|
||||
jackson:
|
||||
time-zone: GMT+8
|
||||
mvc:
|
||||
view:
|
||||
suffix: /WEB-INF/jsp/
|
||||
throw-exception-if-no-handler-found: true
|
||||
resources:
|
||||
add-mappings: true
|
||||
|
||||
mybatis:
|
||||
mapper-locations:
|
||||
- classpath:mapper/*/*.xml
|
||||
#实体扫描,多个package用逗号或者分号分隔
|
||||
type-aliases-package: com.yc.inter.**.entity
|
||||
|
||||
|
||||
logging:
|
||||
config: classpath:logback-spring.xml
|
||||
11
JavaClientDemo/target/classes/general-conf.properties
Normal file
@@ -0,0 +1,11 @@
|
||||
#服务器IP
|
||||
server_ip=106.12.3.102
|
||||
#server_ip=127.0.0.1
|
||||
#服务器端口
|
||||
server_port=8092
|
||||
#server_port=8086
|
||||
#服务器工程名称
|
||||
server_item=inter
|
||||
#websocket 名称
|
||||
server_name=wwserver
|
||||
|
||||
53
JavaClientDemo/target/classes/log4j.properties
Normal file
@@ -0,0 +1,53 @@
|
||||
### set log levels - for more verbose logging change 'info' to 'debug' ###
|
||||
|
||||
log4j.rootLogger=debug, stdout,R
|
||||
|
||||
### direct log messages to stdout ###
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
|
||||
# %d{ABSOLUTE} %5p %c:%L - %m%n
|
||||
|
||||
#log4j.appender.R.File=d:/log4j.log
|
||||
#linux
|
||||
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
|
||||
log4j.appender.R.File=/web/fomstsprobe_cq/tomcat-fomstsprobe-38080/logs/log4j.log
|
||||
#log4j.appender.R.MaxFileSize=1000KB
|
||||
#log4j.appender.R.MaxBackupIndex=10
|
||||
log4j.appender.R.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
|
||||
|
||||
# SqlMap logging configuration...
|
||||
log4j.logger.org.springframework=ERROR
|
||||
log4j.logger.org.apache.ibatis=DEBUG
|
||||
log4j.logger.org.mybatis.spring=INFO
|
||||
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
|
||||
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
|
||||
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
|
||||
log4j.logger.java.sql.Connection=DEBUG
|
||||
log4j.logger.java.sql.Statement=INFO
|
||||
log4j.logger.java.sql.PreparedStatement=INFO
|
||||
log4j.logger.java.sql.ResultSet=DEBUG
|
||||
|
||||
log4j.logger.org.quartz.core=INFO
|
||||
log4j.logger.org.quartz.impl.jdbcjobstore.StdRowLockSemaphore=INFO
|
||||
|
||||
log4j.logger.org.hibernate=error
|
||||
|
||||
log4j.logger.com.zaxxer.hikari.pool = INFO
|
||||
|
||||
### log HQL query parser activity
|
||||
#log4j.logger.org.hibernate.hql.ast.AST=debug
|
||||
|
||||
### log just the SQL
|
||||
#log4j.logger.org.hibernate.SQL=debug
|
||||
|
||||
### log JDBC bind parameters ###
|
||||
log4j.logger.org.hibernate.type=debug
|
||||
|
||||
### log schema export/update ###
|
||||
log4j.logger.org.hibernate.tool.hbm2ddl=debug
|
||||
|
||||
|
||||
|
||||
86
JavaClientDemo/target/classes/logback-spring.xml
Normal file
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
|
||||
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
|
||||
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
|
||||
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
|
||||
<configuration scan="true" scanPeriod="10 seconds">
|
||||
|
||||
<!-- 动态日志级别 -->
|
||||
<jmxConfigurator/>
|
||||
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
|
||||
|
||||
<!-- 自定义名字 -->
|
||||
<contextName>veteran-admin</contextName>
|
||||
<!-- 定义日志位置变量,定义变量后,可以使“${}”来使用变量。 -->
|
||||
<property name="LOG_HOME" value="D://logs" />
|
||||
<!--<springProperty scope="context" name="LOG_HOME" source="logging.path"/>
|
||||
<springProperty scope="context" name="LOG_LEVEL" source="logging.level"/>-->
|
||||
|
||||
<!--输出到控制台-->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<!--<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%class]-[%-5level] %logger{50} - %msg%n</Pattern>-->
|
||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss} [%logger{50}]-[%-5level] %msg%n</Pattern>
|
||||
<!-- 设置字符集 -->
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
|
||||
<!--输出到文件-->
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 正在记录的日志文件的路径及文件名 -->
|
||||
<file>${LOG_HOME}/log.log</file>
|
||||
<!--日志文件输出格式-->
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%logger{50}]-[%-5level] %msg%n</pattern>
|
||||
<charset>UTF-8</charset>
|
||||
</encoder>
|
||||
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 每天日志归档路径以及格式 -->
|
||||
<fileNamePattern>${LOG_HOME}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!--日志文件保留天数-->
|
||||
<maxHistory>15</maxHistory>
|
||||
</rollingPolicy>
|
||||
</appender>
|
||||
|
||||
<!--
|
||||
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
|
||||
以及指定<appender>。<logger>仅有一个name属性,
|
||||
一个可选的level和一个可选的addtivity属性。
|
||||
name:用来指定受此logger约束的某一个包或者具体的某一个类。
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
|
||||
如果未设置此属性,那么当前logger将会继承上级的级别。
|
||||
addtivity:是否向上级logger传递打印信息。默认是true,建议配置为false不传递,如果传递则本身打印一次日志,root打印一次日志。
|
||||
-->
|
||||
<!--<logger name="org.springframework.web" level="info"/>-->
|
||||
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
|
||||
<!--
|
||||
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
|
||||
第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
|
||||
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
|
||||
-->
|
||||
<logger name="com.zaxxer.hikari.pool" level="debug" additivity="false"/>
|
||||
<logger name="org.springframework" level="debug" additivity="false"/>
|
||||
<logger name="org.hibernate" level="debug" additivity="false"/>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
|
||||
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
|
||||
不能设置为INHERITED或者同义词NULL。默认是DEBUG
|
||||
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
|
||||
-->
|
||||
<root level="debug">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="FILE" />
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
118
JavaClientDemo/vx-inter-client.iml
Normal file
@@ -0,0 +1,118 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/target/classes" />
|
||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.10.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.9.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.9.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.4.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.unbescape:unbescape:1.1.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.9.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.1" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.7.11" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.11" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:2.7.8" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.29" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.29" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.29" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-jasper:8.5.29" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.eclipse.jdt:ecj:3.12.3" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.20" level="project" />
|
||||
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk16:1.46" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.31" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.qiniu:qiniu-java-sdk:7.2.29" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okhttp3:okhttp:3.14.4" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
|
||||
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:5.1.46" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.0.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.0.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.0.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.0.3.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.1.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.23.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.8.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.protostuff:protostuff-core:1.4.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.protostuff:protostuff-api:1.4.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.protostuff:protostuff-runtime:1.4.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.protostuff:protostuff-collectionschema:1.4.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.0.1.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.0.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.java-websocket:Java-WebSocket:1.3.8" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.websocket:javax.websocket-api:1.1" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
31
README.md
@@ -9,7 +9,7 @@
|
||||
|
||||
### 全部功能文档列表,持续更新
|
||||
|
||||
当前适配版本从2.8.12 ~ **3.1.0**最新版
|
||||
当前适配版本从2.8.12 ~ **3.1.6**最新版
|
||||
|
||||
**主要功能列表**
|
||||
|
||||
@@ -36,24 +36,6 @@
|
||||
> - 接收消息:包括但不限于文字、图片、语音、视频、文件、小程序、链接、地理位置等
|
||||
> - 文件消息自动下载:图片、语音、文件、视频
|
||||
|
||||
- 企业微信与微信公用
|
||||
|
||||
> - Activity
|
||||
> - 文件操作(写入、读取)
|
||||
> - 数据库操作(增删改查)
|
||||
|
||||
- 基础核心功能
|
||||
|
||||
> - APK自动解析
|
||||
> - 异步批处理
|
||||
> - 二级缓存
|
||||
> - 网络请求
|
||||
> - 重试策略
|
||||
> - 文件下载
|
||||
> - 自动缓存
|
||||
> - 反射查找
|
||||
> - silk音频编解码
|
||||
|
||||
|
||||
当然还有更多的功能不仅限于上述,更多可以查阅我针对企业微信的xposed学习的成果,这些成果的部分我将在后续通过讲解并上传
|
||||
|
||||
@@ -61,21 +43,18 @@
|
||||
|
||||
如果需要查阅具体接口文档可以与我联系申请查看,我将毫无保留的开放设计理念和文档
|
||||
|
||||
### SDK已经可以使用了
|
||||
以下是根据SDK开发出来的demo,欢迎交流
|
||||
|
||||

|
||||

|
||||
|
||||
### 注意:
|
||||
为了避免某些xxx风险,我只是持续做一些分享,但并不会将完整代码上传,我所上传的基础核心,基本上你都可以在我所写的文章及有Android基础之上一步一步的去实现
|
||||
|
||||
### 直接玩儿教程
|
||||
|
||||
|
||||
### 联系我
|
||||
|
||||
如果你在学习过程中遇到问题,你可以直接提交issue,或者直接联系我
|
||||
QQ交流群:**596725067**
|
||||
|
||||
请添加时备注:xposed、wework+姓
|
||||
请添加时备注:xposed/wework+姓
|
||||
|
||||
<img src="sources/qq_group_chat_qr_code.png" width="250" height="256"/>
|
||||
|
||||
|
||||
76
README_Java.md
Normal file
@@ -0,0 +1,76 @@
|
||||
|
||||
###前期准备
|
||||
1、对xposed有一定的了解,知道如何安装及试用
|
||||
|
||||
2、由于做了版本自动化适配,99%功能通过自动查找方式匹配,所以需要你去下载[官网的【安装包】](https://work.weixin.qq.com/#indexDownload)
|
||||
|
||||
3、下载与官网APK版本一致的[release测玩包](),测玩包支持5.0及以上的**【真机】**、**【模拟器】**、**【各类云手机】**
|
||||
|
||||
###如何测玩
|
||||
|
||||
1、安装好[release测玩包]()后,重启手机,如果看到Logo下方显示**【准备就绪】** 即视为安装好
|
||||
|
||||
<img src="sources/trail_000.png" width="220" height="400"/>
|
||||
|
||||
|
||||
2、保证当前SELinux处于Premissive,如果非Premissive,需点击左上角设置
|
||||
|
||||
<img src="sources/trail_001.png" width="220" height="400"/>
|
||||
|
||||
|
||||
3、打开企微并登陆,重新切换至[release测玩包]()界面,如下图,点击激活即可
|
||||
|
||||
<img src="sources/trail_002.png" width="220" height="380"/>
|
||||
|
||||
|
||||
4、下载项目中的 [JavaClientDemo](JavaClientDemo) ,准备好后需要你在[WwCmdConfigs](JavaClientDemo/src/main/java/com/yc/inter/websocket/linkserver/WwCmdConfigs.java)中配置三个重要参数
|
||||
|
||||
- username: 即为release包界面上显示的【测试账号的值】
|
||||
- password: 几位release包界面上显示的【测试账号的值】两次MD5,注意在第一次MD5后需要使用32位大写再次MD5,取最终的32位大写MD5作为密码
|
||||
- wid:为release包界面上显示的【登录Wid】
|
||||
|
||||
上述数据配置好后,可以直接在IDE运行,结果如下即表示初步配置成功
|
||||
|
||||
<img src="sources/trail_java_000.png" width="440" height="220"/>
|
||||
|
||||
5、接下来是配置其他参数的问题
|
||||
|
||||
- 5.1 如果是需要测试创建群聊或者外部群聊相关,则需要配置outterId、innerId,这两个参数可以分别在控制台输入3411 及 3410获取
|
||||
- 5.2 测试被邀请好友则可以通过3411或者3410获取之后得到一个用户信息配置即可
|
||||
- 5.3 如果需要测试删除好友则需通过3411获取外部联系人,选择一个即可
|
||||
- 5.4 测试添加好友则需要配置手机号码
|
||||
- 5.5 测试群聊相关则可以通过配置好上述数据之后重启client,通过指令355创建一个,返回的数据中会有群聊id,或者通过353获取已有的群聊
|
||||
|
||||
6、关于指令的执行测玩
|
||||
|
||||
> 目前是配置固定的参数,测试时只需要发送对应文档目录的指令即可,指令执行方从3.3.1开始,目录与指令对应关系为:
|
||||
|
||||
> 3.3.1 对应 331
|
||||
>
|
||||
> 3.3.2 对应 332
|
||||
>
|
||||
> ...
|
||||
>
|
||||
> 3.6.6 对应 366
|
||||
>
|
||||
> ...
|
||||
>
|
||||
> 以此类推
|
||||
>
|
||||
> 建议demo里面不要先测试 退出群聊和解散群聊,这个可以在所有功能测试完毕之后再来验证(因为demo参数是固定配置的群聊id)
|
||||
|
||||
|
||||
<img src="sources/trail_java_001.png" width="440" height="220"/>
|
||||
|
||||
|
||||
关于每个指令集是代表什么功能,可以直接申请[文档查看权限](https://docs.qq.com/doc/DS2JLYVpOY2ZJRFJI),在申请权限时请写明备注,无备注不会处理,或者可以通过一下群与我们交流
|
||||
|
||||
### 与我们进行交流
|
||||
|
||||
如果你在学习过程中遇到问题,你可以直接提交issue,或者直接联系我
|
||||
QQ交流群:**596725067**
|
||||
|
||||
请添加时备注:xposed/wework+姓
|
||||
|
||||
<img src="sources/qq_group_chat_qr_code.png" width="250" height="256"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |