Commit 9ca0a396 by 王仕雄

Merge branch 'wangsx' into 105

Conflicts:
	khdo/src/main/java/com/bootdo/BootdoApplication.java
2 parents 00f773e8 05ac5dd5
Showing with 783 additions and 0 deletions
...@@ -29,6 +29,13 @@ ...@@ -29,6 +29,13 @@
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
</dependency> </dependency>
...@@ -159,6 +166,21 @@ ...@@ -159,6 +166,21 @@
<dependency> <dependency>
<groupId>com.asprise.ocr</groupId>
<artifactId>java-ocr-api</artifactId>
<version>15.3.0.3</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId> <groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId> <artifactId>quartz</artifactId>
<version>2.2.1</version> <version>2.2.1</version>
...@@ -224,12 +246,26 @@ ...@@ -224,12 +246,26 @@
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> </dependency>
<!-- hutool工具大全 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.2</version>
</dependency>
<dependency> <dependency>
<groupId>redis.clients</groupId> <groupId>redis.clients</groupId>
<artifactId>jedis</artifactId> <artifactId>jedis</artifactId>
<version>2.9.0</version> <version>2.9.0</version>
</dependency> </dependency>
<!-- ureport2报表引擎 -->
<dependency>
<groupId>com.bstek.ureport</groupId>
<artifactId>ureport2-console</artifactId>
<version>2.2.8</version>
</dependency>
<!-- xss过滤组件 --> <!-- xss过滤组件 -->
<dependency> <dependency>
...@@ -238,6 +274,19 @@ ...@@ -238,6 +274,19 @@
<version>1.9.2</version> <version>1.9.2</version>
</dependency> </dependency>
<!-- 多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!--war包部署需要--> <!--war包部署需要-->
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>--> <!--<groupId>org.springframework.boot</groupId>-->
......
...@@ -6,7 +6,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; ...@@ -6,7 +6,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableAutoConfiguration(exclude = { @EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
...@@ -20,5 +22,22 @@ public class BootdoApplication { ...@@ -20,5 +22,22 @@ public class BootdoApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(BootdoApplication.class, args); SpringApplication.run(BootdoApplication.class, args);
System.out.println("启动咯,wangsx105........12345"); System.out.println("启动咯,wangsx105........12345");
System.out.println("启动咯,wangsx333........");
System.out.println("启动咯,wangsx222........");
System.out.println("启动咯,wangsx1111");
System.out.println("启动咯,wangsx9999");
System.out.println("启动咯,wangsx9999");
System.out.println("启动咯,我是105添加的哦----");
}
@Bean
public Object testBean(PlatformTransactionManager platformTransactionManager){
System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
System.out.println("111");
System.out.println("000411");
System.out.println("0002");
System.out.println("0001");
return new Object();
} }
} }
package com.bootdo.common;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
public class ABcv {
public static void main(String[] args)throws Exception {
String url11 = "https://cdn1.yxvzb.com/saas_app_tmp/1567244171282.jpg";
String url22 = "https://cdn1.yxvzb.com/saas_app_tmp/1567231942667.jpg";
String [] fileNames = new String[2];
fileNames[0] = url11.substring(url11.lastIndexOf("/")+1,url11.length());
fileNames[1] = url22.substring(url11.lastIndexOf("/")+1,url11.length());
InputStream [] ins = new InputStream[2];
ins[0]=new URL(url11).openStream();
ins[1]=new URL(url22).openStream();
String tempDir ="D:\\1991.zip";
ZipUtil.zip(new File(tempDir), fileNames, ins);
System.out.println(99);
}
}
package com.bootdo.common.utils;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class CommonRedisHelper {
public static final String LOCK_PREFIX = "redis_lock_saas_cso_job";
public static final int LOCK_EXPIRE = 1000*30; // ms 此处默认设置为30秒
@SuppressWarnings("rawtypes")
@Autowired
private RedisTemplate redisTemplate;
/**
* 分布式锁
* 如果锁持有者,在超时时间之后都没有释放锁(死锁),那么后续拿锁一样会成功
* @param key 键
* @param lockExpire 超时时间(单位毫秒)
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public boolean lock(String key,int lockExpire){
String lock = LOCK_PREFIX + key;
// 利用lambda表达式
return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
long expireAt = System.currentTimeMillis() + lockExpire + 1;
Boolean acquire = connection.setNX(lock.getBytes(), String.valueOf(expireAt).getBytes());
if (acquire) {
return true;
} else {
byte[] value = connection.get(lock.getBytes());
if (Objects.nonNull(value) && value.length > 0) {
long expireTime = Long.parseLong(new String(value));
if (expireTime < System.currentTimeMillis()) {
// 如果锁已经过期
byte[] oldValue = connection.getSet(lock.getBytes(), String.valueOf(System.currentTimeMillis() + lockExpire + 1).getBytes());
// 防止死锁
return Long.parseLong(new String(oldValue)) < System.currentTimeMillis();
}
}
}
return false;
});
}
/**
* 删除锁
*
* @param key
*/
@SuppressWarnings("unchecked")
public void delete(String key) {
redisTemplate.delete(LOCK_PREFIX + key);
}
// public static void main(String[] args) throws InterruptedException {
//
// System.out.println(new String(String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes()));
// Thread.sleep(3000);
// byte [] ss = String.valueOf(System.currentTimeMillis() + LOCK_EXPIRE + 1).getBytes();
// System.out.println(ss);
// String value =new String(ss);
// System.out.println(value);
// System.out.println(Long.parseLong(value));
// }
}
package com.bootdo.common.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
*
* @ClassName: TestJoba
* @Description: redis分布式锁的测试类,可保留参照
* @author wangsx
* @date 2019年12月4日
*
*/
@Component
public class TestJoba {
@Autowired
private CommonRedisHelper commonRedisHelper;
public final static String timer_key = "xsbftimer";
@Scheduled(cron = "1 02 15 * * ?")
public void xsbfTimeTaskOfEnableDt()throws Exception{
try {
if(commonRedisHelper.lock(timer_key,1000*30)) {
System.out.println("job-1 开始工作了,拿锁成功...");
Thread.sleep(3000);//休眠3秒
}else {
System.out.println("job-1 拿锁失败...");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
commonRedisHelper.delete(timer_key);
System.out.println("job-1 工作结束了,释放锁...");
}
}
@Scheduled(cron = "52 02 15 * * ?")
public void xsbfTimeTaskOfEnableDt2()throws Exception{
try {
if(commonRedisHelper.lock(timer_key,1000*30)) {
System.out.println("job-2 开始工作了,拿锁成功...");
Thread.sleep(3000);//休眠3秒
}else {
System.out.println("job-2 拿锁失败...");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
commonRedisHelper.delete(timer_key);
System.out.println("job-2 工作结束了,释放锁...");
}
}
@Scheduled(cron = "3 02 15 * * ?")
public void xsbfTimeTaskOfEnableDt3()throws Exception{
try {
if(commonRedisHelper.lock(timer_key,1000*30)) {
System.out.println("job-3 开始工作了,拿锁成功...");
Thread.sleep(3000);//休眠3秒
}else {
System.out.println("job-3 拿锁失败...");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
commonRedisHelper.delete(timer_key);
System.out.println("job-3 工作结束了,释放锁...");
}
}
@Scheduled(cron = "4 02 15 * * ?")
public void xsbfTimeTaskOfEnableDt4()throws Exception{
try {
if(commonRedisHelper.lock(timer_key,1000*30)) {
System.out.println("job-4 开始工作了,拿锁成功...");
Thread.sleep(3000);//休眠3秒
}else {
System.out.println("job-4 拿锁失败...");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
commonRedisHelper.delete(timer_key);
System.out.println("job-4 工作结束了,释放锁...");
}
}
@Scheduled(cron = "5 02 15 * * ?")
public void xsbfTimeTaskOfEnableDt5()throws Exception{
try {
if(commonRedisHelper.lock(timer_key,1000*30)) {
System.out.println("job-5 开始工作了,拿锁成功...");
Thread.sleep(3000);//休眠3秒
}else {
System.out.println("job-5 拿锁失败...");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
commonRedisHelper.delete(timer_key);
System.out.println("job-5 工作结束了,释放锁...");
}
}
}
package com.bootdo.common.utils.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGLIBDynamicProxy implements MethodInterceptor {
/**
*
*   * 生成代理对象   * @param cla 被代理的类   * @return 代理对象  
*/
public Object bind(Class cla) {
// 获取CGLIB增强类对象
Enhancer enhancer = new Enhancer();
// 设置对哪个类进行增强
enhancer.setSuperclass(cla);
// 设置哪个类为代理类,代理类必须实现MethodInterceptor接口
enhancer.setCallback(this);
// 生成代理对象并返回(根据之前的设置来生成代理对象)
return enhancer.create();
}
/**
*
*   * 代理类逻辑方法   * @param proxy 被代理对象   * @param method 代理类执行的方法对象   * @param
* args 方法传参   * @param methodProxy 方法代理对象   * @return 方法执行结果   * @throws
* Throwable  
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("开始执行代理类逻辑");
System.out.println("执行完代理类逻辑,准备执行真实对象方法");
// 调用真实对象的方法
Object result = methodProxy.invokeSuper(proxy, args);
System.out.println("真实对象方法执行完毕");
return null;
}
}
package com.bootdo.common.utils.proxy.cglib;
public class CglibTest {
public void justSayHello(){
System.out.println("我打印啦!");
}
}
package com.bootdo.common.utils.proxy.cglib;
/**
*
* @ClassName: Client
* @Description: 代理测试类-動態代理-cglib
* @author wangsx
* @date 2020年5月21日
*
*/
public class Client {
public static void main(String[] args) throws Exception{
try {
//创建代理类对象
CGLIBDynamicProxy cglibProxyExample = new CGLIBDynamicProxy();
//通过代理类获取CglibTest类的代理对象
CglibTest cglibTest =(CglibTest)cglibProxyExample.bind(CglibTest.class);//绑定管理,确定代理哪个类
//由代理类执行真实对象方法
cglibTest.justSayHello();
}catch(Exception e){
e.printStackTrace();
}
}
}
package com.bootdo.common.utils.proxy.jdk;
/**
*
* @ClassName: Client
* @Description: 代理测试类-動態代理-jdk
* @author wangsx
* @date 2020年5月21日
*
*/
public class Client {
public static void main(String[] args) {
// // 保存生成的代理类的字节码文件
// System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
// jdk动态代理测试
Subject subject = new JDKDynamicProxy(new RealSubject()).getProxy();
subject.doSomething();
}
}
package com.bootdo.common.utils.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target) {
this.target = target;
}
/**
* 获取被代理接口实例对象
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Do something before");
Object result = method.invoke(target, args);
System.out.println("Do something after");
return result;
}
}
package com.bootdo.common.utils.proxy.jdk;
public class RealSubject implements Subject {
@Override
public void doSomething() {
System.out.println("RealSubject do something");
}
}
package com.bootdo.common.utils.proxy.jdk;
public interface Subject {
void doSomething();
}
package com.bootdo.common.utils.proxy.staticcls;
/**
* 注意事项,代理增强时,不能改变原有业务代码的封装,继承方式..缺点:类爆炸
*
* @ClassName: ProxyTest
* @Description: 代理测试类-靜態代理-類繼承
* @author wangsx
* @date 2020年5月6日
*
*/
public class Client {
public static void main(String[] args) {
UserDaoImpl userDao = new UserDaoImpl();
userDao.query("张三");
System.out.println();
//静态代理-继承方式 增加查询时间
UserDaoImpl userDao2 = new LogUserDaoImpl();
userDao2.query("张三");
System.out.println();
//静态代理-继承方式 增加查询人
UserDaoImpl userDao3 = new LogFinalUserDaoImpl();
userDao3.query("张三");
System.out.println();
}
}
package com.bootdo.common.utils.proxy.staticcls;
public class LogFinalUserDaoImpl extends LogUserDaoImpl {
@Override
public void query(String name) {
System.out.println("当前查询人="+name);
super.query(name);
}
}
package com.bootdo.common.utils.proxy.staticcls;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogUserDaoImpl extends UserDaoImpl {
@Override
public void query(String name) {
System.out.println("代理增强,当前查询时间="+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
super.query(name);
}
}
package com.bootdo.common.utils.proxy.staticcls;
public class UserDaoImpl {
//默认查询只打印查询姓名
public void query(String name) {
System.out.println("name="+name);
}
}
package com.bootdo.common.utils.proxy.statiinterface;
/**
* 注意事项,代理增强时,不能改变原有业务代码的封装,接口方式..缺点:类爆炸
*
* @ClassName: ProxyTest
* @Description: 代理测试类-靜態代理-接口實現
* @author wangsx
* @date 2020年5月6日
*
*/
public class Client {
public static void main(String[] args) {
UserDaoImpl userDao = new UserDaoImpl();
userDao.query("张三");
System.out.println();
//静态代理-接口方式,增加查询时间
UserDao userDao2 = new LogUserDaoImpl(userDao);
userDao2.query("张三");
System.out.println();
//静态代理-接口方式,增加查询人
UserDao userDao3 = new LogFinalUserDaoImpl(userDao2);
userDao3.query("张三");
System.out.println();
}
}
package com.bootdo.common.utils.proxy.statiinterface;
public class LogFinalUserDaoImpl implements UserDao {
private UserDao userDao;
public LogFinalUserDaoImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void query(String name) {
System.out.println("当前查询人="+name);
userDao.query(name);
}
}
package com.bootdo.common.utils.proxy.statiinterface;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogUserDaoImpl implements UserDao {
private UserDao userDao;
public LogUserDaoImpl(UserDao userDao) {
this.userDao = userDao;
}
public void query(String name) {
System.out.println("当前查询时间="+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
userDao.query(name);
}
}
package com.bootdo.common.utils.proxy.statiinterface;
public interface UserDao {
public void query(String name);
}
package com.bootdo.common.utils.proxy.statiinterface;
public class UserDaoImpl implements UserDao{
//默认查询只打印查询姓名
public void query(String name) {
System.out.println("name="+name);
}
}
package com.bootdo.common.utils.search;
public class FibonacciSearch {
/**
* @param args
*/
public final static int MAXSIZE = 20;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] f = fibonacci();
for (int i : f) {
System.out.print(i + " ");
}
System.out.println();
int[] data = { 1, 5, 15, 22, 25, 31, 39, 42, 47, 49, 59, 68, 88 };
int search = 42;
int position = fibonacciSearch(data, search);
System.out.println("值" + search + "的元素位置为:" + position);
}
/**
* 斐波那契数列
*
* @return
*/
public static int[] fibonacci() {
int[] f = new int[20];
int i = 0;
f[0] = 1;
f[1] = 1;
for (i = 2; i < MAXSIZE; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f;
}
public static int fibonacciSearch(int[] data, int key) {
int low = 0;
int high = data.length - 1;
int mid = 0;
// 斐波那契分割数值下标
int k = 0;
// 序列元素个数
int i = 0;
// 获取斐波那契数列
int[] f = fibonacci();
// 获取斐波那契分割数值下标
while (data.length > f[k] - 1) {
k++;
}
// 创建临时数组
int[] temp = new int[f[k] - 1];
for (int j = 0; j < data.length;j++) {
temp[j] = data[j];
}
// 序列补充至f[k]个元素
// 补充的元素值为最后一个元素的值
for (i = data.length; i < f[k] - 1; i++) {
temp[i] = temp[high];
}
for (int j : temp) {
System.out.print(j + " ");
}
System.out.println();
while (low <= high) {
// low:起始位置
// 前半部分有f[k-1]个元素,由于下标从0开始
// 则-1 获取 黄金分割位置元素的下标
mid = low + f[k - 1] - 1;
if (temp[mid] > key) {
// 查找前半部分,高位指针移动
high = mid - 1;
// (全部元素) = (前半部分)+(后半部分)
// f[k] = f[k-1] + f[k-1]
// 因为前半部分有f[k-1]个元素,所以 k = k-1
k = k - 1;
} else if (temp[mid] < key) {
// 查找后半部分,高位指针移动
low = mid + 1;
// (全部元素) = (前半部分)+(后半部分)
// f[k] = f[k-1] + f[k-1]
// 因为后半部分有f[k-1]个元素,所以 k = k-2
k = k - 2;
} else {
// 如果为真则找到相应的位置
if (mid <= high) {
return mid;
} else {
// 出现这种情况是查找到补充的元素
// 而补充的元素与high位置的元素一样
return high;
}
}
}
return -1;
}
}
package com.bootdo.common.utils.search;
import java.util.Date;
public class SearchTest {
public static void main(String[] args) {
int [] a = randomCommon(1,10000,8000);
int b = 4889;
Date d1 = new Date();
System.out.println("普通查找,结果为:"+sequentialSearch(a,b));
Date d2 = new Date();
System.out.println("普通查找,耗时:"+(d2.getTime()-d1.getTime()));
Date d3 = new Date();
System.out.println("哨兵查找,结果为:"+sequentialSearchSentry(a,b));
Date d4 = new Date();
System.out.println("哨兵查找,耗时:"+(d4.getTime()-d3.getTime()));
// int k=0;
// for(int i=0;i<10;i++) {
// System.out.println("外循环.."+i);
// for(int j=i;j<10;j++) {
// System.out.println((k++)+"..."+j);
// }
// }
}
//顺序查找---普通,找到了返回数组中的下标,没找到返回-1
private static int sequentialSearch(int [] a, int key) {
for(int i=0;i<a.length;i++) {
if(a[i]==key) {
return i;
}
}
return -1;
}
//顺序查找---哨兵,找到了返回数组中的下标,没找到返回-1
private static int sequentialSearchSentry(int [] a, int key) {
a[0]=key;
int i= a.length-1;
while(a[i]!=key) {
i--;
}
return i==0?i-1:i;
}
/**
* 随机指定范围内N个不重复的数
* 最简单最基本的方法
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
*/
public static int[] randomCommon(int min, int max, int n){
if (n > (max - min + 1) || max < min) {
return null;
}
int[] result = new int[n];
int count = 0;
while(count < n) {
int num = (int) (Math.random() * (max - min)) + min;
boolean flag = true;
for (int j = 0; j < n; j++) {
if(num == result[j]){
flag = false;
break;
}
}
if(flag){
result[count] = num;
count++;
}
}
return result;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!