@@ -1,8 +0,0 @@ | |||
### IDEA ### | |||
*.iml | |||
*/target/* | |||
*/*.iml | |||
/.gradle/ | |||
*.pid | |||
logs | |||
/.idea/ |
@@ -0,0 +1 @@ | |||
FROM irsfactoryrepository.zj.gov.cn/base/base_image:1.0 |
@@ -1 +1,2 @@ | |||
# README | |||
柯桥增值式服务 |
@@ -0,0 +1,2 @@ | |||
artifactType=1 | |||
artifactFile=kqapi/target/kqapi.jar |
@@ -0,0 +1,446 @@ | |||
2023-10-27 11:11:07.300 [main] ERROR o.s.boot.SpringApplication -Application run failed | |||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) | |||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) | |||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) | |||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 47 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 61 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||
... 76 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||
... 87 common frames omitted | |||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 100 common frames omitted | |||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||
... 114 common frames omitted | |||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.util.Assert.state(Assert.java:97) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||
at java.lang.reflect.Method.invoke(Method.java:498) | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||
... 115 common frames omitted | |||
2023-10-27 11:11:08.114 [main] ERROR o.s.boot.SpringApplication -Application run failed | |||
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.outputConditionEvaluationReport(SpringBootDependencyInjectionTestExecutionListener.java:53) | |||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:46) | |||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 46 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 60 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||
... 75 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||
... 86 common frames omitted | |||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 99 common frames omitted | |||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||
... 113 common frames omitted | |||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.util.Assert.state(Assert.java:97) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||
at java.lang.reflect.Method.invoke(Method.java:498) | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||
... 114 common frames omitted | |||
2023-10-27 11:11:08.118 [main] ERROR o.s.test.context.TestContextManager -Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@54504ecd] to prepare test instance [com.ningdatech.kqapi.menu.MenuTest@2ef14fe] | |||
java.lang.IllegalStateException: Failed to load ApplicationContext | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) | |||
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) | |||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) | |||
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) | |||
at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) | |||
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) | |||
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) | |||
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) | |||
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) | |||
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) | |||
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) | |||
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) | |||
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) | |||
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) | |||
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) | |||
at org.junit.runners.ParentRunner.run(ParentRunner.java:413) | |||
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) | |||
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) | |||
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) | |||
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) | |||
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) | |||
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) | |||
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqController' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\controller\DscSxAdsShareItemQltQlsxCommonIDVKqController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) | |||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) | |||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) | |||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) | |||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) | |||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) | |||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) | |||
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) | |||
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) | |||
... 28 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'matterManage' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\manage\MatterManage.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 47 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) | |||
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 61 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dscSxAdsShareItemQltQlsxCommonIDVKqMapper' defined in file [D:\ningda\kq-value-added-project\kqapi\target\classes\com\ningdatech\kqapi\zzsfw\mapper\DscSxAdsShareItemQltQlsxCommonIDVKqMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) | |||
... 76 common frames omitted | |||
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) | |||
... 87 common frames omitted | |||
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) | |||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) | |||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) | |||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) | |||
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) | |||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) | |||
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) | |||
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) | |||
... 100 common frames omitted | |||
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) | |||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) | |||
... 114 common frames omitted | |||
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.kingbase8.Driver | |||
at org.springframework.util.Assert.state(Assert.java:97) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:241) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.initializeDataSourceBuilder(DataSourceProperties.java:193) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) | |||
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |||
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) | |||
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |||
at java.lang.reflect.Method.invoke(Method.java:498) | |||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) | |||
... 115 common frames omitted |
@@ -0,0 +1,92 @@ | |||
2023-11-17 10:49:40.856 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||
2023-11-17 10:49:40.871 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 1660 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||
2023-11-17 10:49:40.872 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||
2023-11-17 10:49:43.409 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||
2023-11-17 10:49:43.422 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 10:49:43.422 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||
2023-11-17 10:49:43.423 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||
2023-11-17 10:49:43.548 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||
2023-11-17 10:49:43.548 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2619 ms | |||
2023-11-17 10:49:45.799 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||
2023-11-17 10:49:46.978 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||
2023-11-17 10:49:47.437 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||
2023-11-17 10:49:47.819 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||
2023-11-17 10:49:48.370 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 10:49:48.405 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 8882 (http) with context path '/kq' | |||
2023-11-17 10:49:48.406 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||
2023-11-17 10:49:48.412 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||
2023-11-17 10:49:48.459 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||
2023-11-17 10:49:48.662 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 8.343 seconds (JVM running for 9.853) | |||
2023-11-17 10:49:50.027 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||
2023-11-17 10:49:50.550 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||
2023-11-17 10:50:09.079 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||
2023-11-17 10:50:09.088 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||
2023-11-17 10:53:13.468 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||
2023-11-17 10:53:13.482 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 25504 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||
2023-11-17 10:53:13.483 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||
2023-11-17 10:53:15.962 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||
2023-11-17 10:53:15.973 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 10:53:15.973 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||
2023-11-17 10:53:15.973 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||
2023-11-17 10:53:16.096 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||
2023-11-17 10:53:16.097 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2552 ms | |||
2023-11-17 10:53:18.302 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||
2023-11-17 10:53:19.393 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||
2023-11-17 10:53:19.765 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||
2023-11-17 10:53:19.992 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||
2023-11-17 10:53:20.272 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 10:53:20.303 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 9130 (http) with context path '/kq' | |||
2023-11-17 10:53:20.304 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||
2023-11-17 10:53:20.309 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||
2023-11-17 10:53:20.357 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||
2023-11-17 10:53:20.526 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.616 seconds (JVM running for 8.671) | |||
2023-11-17 10:53:21.705 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||
2023-11-17 10:53:22.183 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||
2023-11-17 10:58:52.050 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||
2023-11-17 10:58:52.057 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||
2023-11-17 11:21:22.316 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||
2023-11-17 11:21:22.329 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 31264 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||
2023-11-17 11:21:22.329 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||
2023-11-17 11:21:24.781 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||
2023-11-17 11:21:24.801 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 11:21:24.802 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||
2023-11-17 11:21:24.802 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||
2023-11-17 11:21:24.953 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||
2023-11-17 11:21:24.954 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2564 ms | |||
2023-11-17 11:21:27.791 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||
2023-11-17 11:21:28.932 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||
2023-11-17 11:21:29.324 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||
2023-11-17 11:21:29.572 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||
2023-11-17 11:21:29.847 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 11:21:29.873 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 1891 (http) with context path '/kq' | |||
2023-11-17 11:21:29.875 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||
2023-11-17 11:21:29.879 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||
2023-11-17 11:21:29.915 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||
2023-11-17 11:21:30.057 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 8.307 seconds (JVM running for 9.268) | |||
2023-11-17 11:21:30.482 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||
2023-11-17 11:21:30.894 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||
2023-11-17 11:21:34.814 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||
2023-11-17 11:21:34.821 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. | |||
2023-11-17 11:22:30.687 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||
2023-11-17 11:22:30.699 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 33544 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||
2023-11-17 11:22:30.700 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||
2023-11-17 11:22:33.079 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||
2023-11-17 11:22:33.094 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 11:22:33.095 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||
2023-11-17 11:22:33.096 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||
2023-11-17 11:22:33.228 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||
2023-11-17 11:22:33.228 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2476 ms | |||
2023-11-17 11:22:35.478 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||
2023-11-17 11:22:36.643 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||
2023-11-17 11:22:37.045 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||
2023-11-17 11:22:37.263 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||
2023-11-17 11:22:37.506 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-17 11:22:37.532 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 1929 (http) with context path '/kq' | |||
2023-11-17 11:22:37.533 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||
2023-11-17 11:22:37.536 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||
2023-11-17 11:22:37.572 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||
2023-11-17 11:22:37.707 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.587 seconds (JVM running for 8.526) | |||
2023-11-17 11:22:38.105 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||
2023-11-17 11:22:38.584 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||
2023-11-17 11:23:16.073 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||
2023-11-17 11:23:16.081 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. |
@@ -0,0 +1,23 @@ | |||
2023-11-22 16:34:54.722 [background-preinit] INFO o.h.validator.internal.util.Version -HV000001: Hibernate Validator 6.2.4.Final | |||
2023-11-22 16:34:54.736 [main] INFO c.n.kqapi.menu.DuplicationTest -Starting DuplicationTest using Java 1.8.0_131 on LAPTOP-NQGEQP03 with PID 7560 (started by PoffyZhang in D:\ningda\kq-value-added-project\kqapi) | |||
2023-11-22 16:34:54.736 [main] INFO c.n.kqapi.menu.DuplicationTest -The following 1 profile is active: "dev" | |||
2023-11-22 16:34:57.112 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat initialized with port(s): 0 (http) | |||
2023-11-22 16:34:57.123 [main] INFO o.a.coyote.http11.Http11NioProtocol -Initializing ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-22 16:34:57.124 [main] INFO o.a.catalina.core.StandardService -Starting service [Tomcat] | |||
2023-11-22 16:34:57.124 [main] INFO o.a.catalina.core.StandardEngine -Starting Servlet engine: [Apache Tomcat/9.0.65] | |||
2023-11-22 16:34:57.241 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/kq] -Initializing Spring embedded WebApplicationContext | |||
2023-11-22 16:34:57.241 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext -Root WebApplicationContext: initialization completed in 2454 ms | |||
2023-11-22 16:34:59.543 [main] INFO com.ningdatech.swagger.SwaggerConfig -swagger文档加载…… | |||
2023-11-22 16:35:00.675 [main] INFO c.n.kqapi.common.config.BeanConfig ------restTemplate-----初始化完成 | |||
2023-11-22 16:35:01.087 [main] INFO s.d.s.w.WebMvcPropertySourcedRequestMappingHandlerMapping -Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#getDocumentation(String, HttpServletRequest)] | |||
2023-11-22 16:35:01.309 [main] WARN o.s.b.a.f.FreeMarkerAutoConfiguration -Cannot find template location(s): [classpath:/templates/] (please add some templates, check your FreeMarker configuration, or set spring.freemarker.checkTemplateLocation=false) | |||
2023-11-22 16:35:01.562 [main] INFO o.a.coyote.http11.Http11NioProtocol -Starting ProtocolHandler ["http-nio-auto-1"] | |||
2023-11-22 16:35:01.588 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer -Tomcat started on port(s): 32509 (http) with context path '/kq' | |||
2023-11-22 16:35:01.589 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Documentation plugins bootstrapped | |||
2023-11-22 16:35:01.592 [main] INFO s.d.s.w.p.DocumentationPluginsBootstrapper -Found 1 custom documentation plugin(s) | |||
2023-11-22 16:35:01.629 [main] INFO s.d.s.w.s.ApiListingReferenceScanner -Scanning for api listing references | |||
2023-11-22 16:35:01.772 [main] INFO c.n.kqapi.menu.DuplicationTest -Started DuplicationTest in 7.554 seconds (JVM running for 8.94) | |||
2023-11-22 16:35:02.189 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Starting... | |||
2023-11-22 16:35:02.677 [main] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Start completed. | |||
2023-11-22 16:35:46.625 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown initiated... | |||
2023-11-22 16:35:46.634 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -HikariPool-1 - Shutdown completed. |
@@ -122,36 +122,24 @@ | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-configuration-processor</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.ningdatech</groupId> | |||
<artifactId>nd-basic</artifactId> | |||
<exclusions> | |||
<exclusion> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-log4j12</artifactId> | |||
</exclusion> | |||
<exclusion> | |||
<artifactId>spring-boot-starter-security</artifactId> | |||
<groupId>org.springframework.boot</groupId> | |||
</exclusion> | |||
</exclusions> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.ningdatech</groupId> | |||
<artifactId>nd-swagger2-starter</artifactId> | |||
<exclusions> | |||
<exclusion> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-log4j12</artifactId> | |||
</exclusion> | |||
</exclusions> | |||
</dependency> | |||
<!-- MYSQL --> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>io.swagger</groupId> | |||
<artifactId>swagger-models</artifactId> | |||
<version>1.6.5</version> | |||
</dependency> | |||
<!--配置文件加密--> | |||
<dependency> | |||
<groupId>com.github.ulisesbocchio</groupId> | |||
<artifactId>jasypt-spring-boot-starter</artifactId> | |||
<version>3.0.4</version> | |||
</dependency> | |||
</dependencies> | |||
<!-- 打包 --> | |||
<!--配置环境的profile--> | |||
@@ -1,7 +1,7 @@ | |||
package com.ningdatech.kqapi; | |||
import com.ningdatech.basic.util.SpringUtils; | |||
import com.ningdatech.kqapi.common.util.SpringContextHolder; | |||
import com.ningdatech.kqapi.common.util.SpringUtils; | |||
import org.mybatis.spring.annotation.MapperScan; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
@@ -1,5 +1,13 @@ | |||
package com.ningdatech.kqapi.common.config; | |||
import com.fasterxml.jackson.core.JsonParser; | |||
import com.fasterxml.jackson.core.json.JsonReadFeature; | |||
import com.fasterxml.jackson.databind.DeserializationFeature; | |||
import com.fasterxml.jackson.databind.ObjectMapper; | |||
import com.fasterxml.jackson.databind.SerializationFeature; | |||
import com.ningdatech.kqapi.common.util.NdDateUtils; | |||
import com.ningdatech.kqapi.common.util.NdJacksonModule; | |||
import com.ningdatech.kqapi.common.util.SpringUtils; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.http.Header; | |||
import org.apache.http.client.HttpClient; | |||
@@ -9,20 +17,34 @@ import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; | |||
import org.apache.http.impl.client.HttpClientBuilder; | |||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | |||
import org.apache.http.message.BasicHeader; | |||
import org.springframework.boot.autoconfigure.AutoConfigureBefore; | |||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | |||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | |||
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; | |||
import org.springframework.context.ApplicationContext; | |||
import org.springframework.context.annotation.Bean; | |||
import org.springframework.context.annotation.Configuration; | |||
import org.springframework.context.annotation.Primary; | |||
import org.springframework.core.convert.converter.Converter; | |||
import org.springframework.http.MediaType; | |||
import org.springframework.http.client.ClientHttpRequestFactory; | |||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||
import org.springframework.http.converter.HttpMessageConverter; | |||
import org.springframework.http.converter.StringHttpMessageConverter; | |||
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; | |||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | |||
import org.springframework.lang.NonNull; | |||
import org.springframework.web.client.RestTemplate; | |||
import org.springframework.web.servlet.config.annotation.CorsRegistry; | |||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||
import java.nio.charset.StandardCharsets; | |||
import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
import java.text.SimpleDateFormat; | |||
import java.time.LocalDate; | |||
import java.time.LocalDateTime; | |||
import java.time.LocalTime; | |||
import java.time.ZoneId; | |||
import java.util.*; | |||
import java.util.concurrent.TimeUnit; | |||
/** | |||
@@ -31,9 +53,10 @@ import java.util.concurrent.TimeUnit; | |||
* @Date 2023/3/2 9:42 | |||
* @Created by PoffyZhang | |||
*/ | |||
@AutoConfigureBefore(JacksonAutoConfiguration.class) | |||
@Configuration | |||
@Slf4j | |||
public class BeanConfig { | |||
public class BeanConfig implements WebMvcConfigurer { | |||
@Bean | |||
@@ -106,4 +129,67 @@ public class BeanConfig { | |||
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true)) | |||
.build(); | |||
} | |||
/** | |||
* 全局配置 序列化和反序列化规则 | |||
* addSerializer:序列化 (Controller 返回 给前端的json) | |||
* 1. Long -> string | |||
* 2. BigInteger -> string | |||
* 3. BigDecimal -> string | |||
* 4. date -> string | |||
* 5. LocalDateTime -> "yyyy-MM-dd HH:mm:ss" | |||
* 6. LocalDate -> "yyyy-MM-dd" | |||
* 7. LocalTime -> "HH:mm:ss" | |||
* 8. BaseEnum -> {"code": "xxx", "desc": "xxx"} | |||
* | |||
* <p> | |||
* addDeserializer: 反序列化 (前端调用接口时,传递到后台的json) | |||
* 1. {"code": "xxx"} -> BaseEnum | |||
* 2. "yyyy-MM-dd HH:mm:ss" -> LocalDateTime | |||
* 3. "yyyy-MM-dd" -> LocalDate | |||
* 4. "HH:mm:ss" -> LocalTime | |||
* | |||
* @param builder 构造器 | |||
* @return 全局 ObjectMapper | |||
*/ | |||
@Bean | |||
@Primary | |||
@ConditionalOnClass(ObjectMapper.class) | |||
@ConditionalOnMissingBean | |||
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { | |||
ObjectMapper objectMapper = builder.createXmlMapper(false).build(); | |||
objectMapper.setLocale(Locale.CHINA) | |||
//去掉默认的时间戳格式 | |||
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) | |||
// 时区 | |||
.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault())) | |||
//Date参数日期格式 | |||
.setDateFormat(new SimpleDateFormat(NdDateUtils.DEFAULT_DATE_TIME_FORMAT, Locale.CHINA)) | |||
//该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性 | |||
.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true) | |||
// 忽略不能转义的字符 | |||
.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true) | |||
//在使用spring boot + jpa/hibernate,如果实体字段上加有FetchType.LAZY,并使用jackson序列化为json串时,会遇到SerializationFeature.FAIL_ON_EMPTY_BEANS异常 | |||
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) | |||
//忽略未知字段 | |||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) | |||
//单引号处理 | |||
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); | |||
// 注册自定义模块 | |||
objectMapper.registerModule(new NdJacksonModule()).findAndRegisterModules(); | |||
return objectMapper; | |||
} | |||
//解决跨域方式二 | |||
static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE","OPTIONS"}; | |||
@Override | |||
public void addCorsMappings(CorsRegistry registry) { | |||
registry.addMapping("/**") // 所有的当前站点的请求地址,都支持跨域访问。 | |||
.allowedOriginPatterns("*") // 所有的外部域都可跨域访问。 如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名 | |||
.allowCredentials(true) // 是否支持跨域用户凭证 | |||
.allowedMethods(ORIGINS) // 当前站点支持的跨域请求类型是什么 | |||
.maxAge(3600); // 超时时长设置为1小时。 时间单位是秒。 | |||
} | |||
} |
@@ -1,6 +1,6 @@ | |||
package com.ningdatech.kqapi.common.constant; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||
import java.math.BigDecimal; | |||
@@ -1,7 +1,7 @@ | |||
package com.ningdatech.kqapi.common.constant; | |||
import com.ningdatech.basic.util.StrPool; | |||
import cn.hutool.core.text.StrPool; | |||
/** | |||
* 默认值 | |||
@@ -0,0 +1,42 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import java.util.Map; | |||
import java.util.Set; | |||
import java.util.function.Function; | |||
/** | |||
* 解决入参为 Date类型 | |||
* | |||
* @author WendyYang | |||
* @date 2019-04-30 | |||
*/ | |||
public abstract class BaseDateConverter<T> { | |||
/** | |||
* 值转换 | |||
* | |||
* @param source 源数据 | |||
* @param function 回调 | |||
* @return 转换后的数据 | |||
*/ | |||
public T convert(String source, Function<String, T> function) { | |||
if (source == null || source.isEmpty()) { | |||
return null; | |||
} | |||
String sourceTrim = source.trim(); | |||
Set<Map.Entry<String, String>> entries = getFormat().entrySet(); | |||
for (Map.Entry<String, String> entry : entries) { | |||
if (sourceTrim.matches(entry.getValue())) { | |||
return function.apply(entry.getKey()); | |||
} | |||
} | |||
throw new IllegalArgumentException("无效的日期参数格式:'" + sourceTrim + "'"); | |||
} | |||
/** | |||
* 获取子类 具体的格式化表达式 | |||
* | |||
* @return 格式化 | |||
*/ | |||
protected abstract Map<String, String> getFormat(); | |||
} |
@@ -0,0 +1,185 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import com.fasterxml.jackson.annotation.JsonFormat; | |||
import com.fasterxml.jackson.core.JsonParser; | |||
import com.fasterxml.jackson.core.JsonToken; | |||
import com.fasterxml.jackson.core.JsonTokenId; | |||
import com.fasterxml.jackson.databind.DeserializationContext; | |||
import com.fasterxml.jackson.databind.DeserializationFeature; | |||
import com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase; | |||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; | |||
import java.io.IOException; | |||
import java.time.*; | |||
import java.time.format.DateTimeFormatter; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||
/** | |||
* 字段类型是LocalDateTime时,可以按照以下6种格式反序列化: | |||
* 1. yyyy-MM-dd | |||
* 2. yyyy年MM月dd日 | |||
* 3. yyyy/MM/dd | |||
* 4. yyyy-MM-dd HH:mm:ss | |||
* 5. yyyy年MM月dd日HH时mm分ss秒 | |||
* 6. yyyy/MM/dd HH:mm:ss | |||
* | |||
* @author WendyYang | |||
* @date 2020/6/18 上午10:50 | |||
*/ | |||
@SuppressWarnings("ALL") | |||
public class NdLocalDateTimeDeserializer extends JSR310DateTimeDeserializerBase<LocalDateTime> { | |||
public static final NdLocalDateTimeDeserializer INSTANCE = new NdLocalDateTimeDeserializer(); | |||
private static final long serialVersionUID = 1L; | |||
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; | |||
/** | |||
* 以下是支持的6种参数格式 | |||
*/ | |||
private static final DateTimeFormatter DEFAULT_DATE_FORMAT_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT); | |||
private static final DateTimeFormatter DEFAULT_DATE_FORMAT_EN_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT_EN); | |||
private static final DateTimeFormatter SLASH_DATE_FORMAT_DTF = DateTimeFormatter.ofPattern(SLASH_DATE_FORMAT); | |||
private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMAT_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT); | |||
private static final DateTimeFormatter DEFAULT_DATE_TIME_FORMAT_EN_DTF = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT_EN); | |||
private static final DateTimeFormatter SLASH_DATE_TIME_FORMAT_DTF = DateTimeFormatter.ofPattern(SLASH_DATE_TIME_FORMAT); | |||
@Override | |||
protected JSR310DateTimeDeserializerBase<LocalDateTime> withShape(JsonFormat.Shape shape) { | |||
return this; | |||
} | |||
private NdLocalDateTimeDeserializer() { | |||
this(DEFAULT_FORMATTER); | |||
} | |||
public NdLocalDateTimeDeserializer(DateTimeFormatter formatter) { | |||
super(LocalDateTime.class, formatter); | |||
} | |||
protected NdLocalDateTimeDeserializer(NdLocalDateTimeDeserializer base, Boolean leniency) { | |||
super(base, leniency); | |||
} | |||
@Override | |||
protected NdLocalDateTimeDeserializer withLeniency(Boolean leniency) { | |||
return new NdLocalDateTimeDeserializer(this, leniency); | |||
} | |||
@Override | |||
protected JSR310DateTimeDeserializerBase<LocalDateTime> withDateFormat(DateTimeFormatter formatter) { | |||
return new LocalDateTimeDeserializer(formatter); | |||
} | |||
private LocalDateTime convert(String source) { | |||
if (source.matches(DEFAULT_DATE_FORMAT_MATCHES)) { | |||
return LocalDateTime.of(LocalDate.parse(source, DEFAULT_DATE_FORMAT_DTF), LocalTime.MIN); | |||
} | |||
if (source.matches(DEFAULT_DATE_FORMAT_EN_MATCHES)) { | |||
return LocalDateTime.of(LocalDate.parse(source, DEFAULT_DATE_FORMAT_EN_DTF), LocalTime.MIN); | |||
} | |||
if (source.matches(SLASH_DATE_FORMAT_MATCHES)) { | |||
return LocalDateTime.of(LocalDate.parse(source, SLASH_DATE_FORMAT_DTF), LocalTime.MIN); | |||
} | |||
if (source.matches(DEFAULT_DATE_TIME_FORMAT_MATCHES)) { | |||
return LocalDateTime.parse(source, DEFAULT_DATE_TIME_FORMAT_DTF); | |||
} | |||
if (source.matches(DEFAULT_DATE_TIME_FORMAT_EN_MATCHES)) { | |||
return LocalDateTime.parse(source, DEFAULT_DATE_TIME_FORMAT_EN_DTF); | |||
} | |||
if (source.matches(SLASH_DATE_TIME_FORMAT_MATCHES)) { | |||
return LocalDateTime.parse(source, SLASH_DATE_TIME_FORMAT_DTF); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { | |||
// 字符串 | |||
if (parser.hasTokenId(JsonTokenId.ID_STRING)) { | |||
String string = parser.getText().trim(); | |||
if (string.length() == 0) { | |||
return null; | |||
} | |||
try { | |||
if (_formatter == null) { | |||
return convert(string); | |||
} | |||
if (_formatter == DEFAULT_FORMATTER) { | |||
// JavaScript by default includes time and zone in JSON serialized Dates (UTC/ISO instant format). | |||
if (string.length() > 10 && string.charAt(10) == 'T') { | |||
if (string.endsWith("Z")) { | |||
return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC); | |||
} else { | |||
return LocalDateTime.parse(string, DEFAULT_FORMATTER); | |||
} | |||
} | |||
return convert(string); | |||
} | |||
return LocalDateTime.parse(string, this._formatter); | |||
} catch (DateTimeException e) { | |||
return _handleDateTimeException(context, e, string); | |||
} | |||
} | |||
// 数组 | |||
if (parser.isExpectedStartArrayToken()) { | |||
JsonToken t = parser.nextToken(); | |||
if (t == JsonToken.END_ARRAY) { | |||
return null; | |||
} | |||
if ((t == JsonToken.VALUE_STRING || t == JsonToken.VALUE_EMBEDDED_OBJECT) | |||
&& context.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { | |||
final LocalDateTime parsed = deserialize(parser, context); | |||
if (parser.nextToken() != JsonToken.END_ARRAY) { | |||
handleMissingEndArrayForSingle(parser, context); | |||
} | |||
return parsed; | |||
} | |||
if (t == JsonToken.VALUE_NUMBER_INT) { | |||
LocalDateTime result; | |||
int year = parser.getIntValue(); | |||
int month = parser.nextIntValue(-1); | |||
int day = parser.nextIntValue(-1); | |||
int hour = parser.nextIntValue(-1); | |||
int minute = parser.nextIntValue(-1); | |||
t = parser.nextToken(); | |||
if (t == JsonToken.END_ARRAY) { | |||
result = LocalDateTime.of(year, month, day, hour, minute); | |||
} else { | |||
int second = parser.getIntValue(); | |||
t = parser.nextToken(); | |||
if (t == JsonToken.END_ARRAY) { | |||
result = LocalDateTime.of(year, month, day, hour, minute, second); | |||
} else { | |||
int partialSecond = parser.getIntValue(); | |||
if (partialSecond < 1_000 && | |||
!context.isEnabled(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)) { | |||
// value is milliseconds, convert it to nanoseconds | |||
partialSecond *= 1_000_000; | |||
} | |||
if (parser.nextToken() != JsonToken.END_ARRAY) { | |||
throw context.wrongTokenException(parser, handledType(), JsonToken.END_ARRAY, "Expected array to end"); | |||
} | |||
result = LocalDateTime.of(year, month, day, hour, minute, second, partialSecond); | |||
} | |||
} | |||
return result; | |||
} | |||
context.reportInputMismatch(handledType(), "Unexpected token (%s) within Array, expected VALUE_NUMBER_INT", t); | |||
} | |||
// 数字 | |||
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { | |||
return Instant.ofEpochMilli(parser.getLongValue()).atZone(ZoneOffset.ofHours(8)).toLocalDateTime(); | |||
} | |||
// 没看懂这个是啥 | |||
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) { | |||
return (LocalDateTime) parser.getEmbeddedObject(); | |||
} | |||
return _handleUnexpectedToken(context, parser, "当前参数需要数组、字符串、时间戳。"); | |||
} | |||
} |
@@ -0,0 +1,77 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import com.ningdatech.kqapi.common.exception.BizException; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.core.convert.converter.Converter; | |||
import org.springframework.lang.NonNull; | |||
import org.springframework.lang.Nullable; | |||
import java.text.DateFormat; | |||
import java.text.ParseException; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Date; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
import static com.ningdatech.kqapi.common.exception.BaseException.BASE_VALID_PARAM; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||
/** | |||
* 解决入参为 Date类型 | |||
* | |||
* @author WendyYang | |||
* @date 2019-04-30 | |||
*/ | |||
@Slf4j | |||
public class String2DateConverter extends BaseDateConverter<Date> implements Converter<String, Date> { | |||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(15); | |||
static { | |||
FORMAT.put(DEFAULT_YEAR_FORMAT, "^\\d{4}"); | |||
FORMAT.put(DEFAULT_MONTH_FORMAT, "^\\d{4}-\\d{1,2}$"); | |||
FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||
FORMAT.put("yyyy-MM-dd HH", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}"); | |||
FORMAT.put("yyyy-MM-dd HH:mm", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$"); | |||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT, DEFAULT_DATE_TIME_FORMAT_MATCHES); | |||
FORMAT.put(DEFAULT_MONTH_FORMAT_SLASH, "^\\d{4}/\\d{1,2}$"); | |||
FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||
FORMAT.put("yyyy/MM/dd HH", "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}"); | |||
FORMAT.put("yyyy/MM/dd HH:mm", "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$"); | |||
FORMAT.put(SLASH_DATE_TIME_FORMAT, SLASH_DATE_TIME_FORMAT_MATCHES); | |||
FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT_EN, DEFAULT_DATE_TIME_FORMAT_EN_MATCHES); | |||
} | |||
/** | |||
* 格式化日期 | |||
* | |||
* @param dateStr String 字符型日期 | |||
* @param format String 格式 | |||
* @return Date 日期 | |||
*/ | |||
protected static Date parseDate(String dateStr, String format) { | |||
try { | |||
DateFormat dateFormat = new SimpleDateFormat(format); | |||
//严格模式 | |||
dateFormat.setLenient(false); | |||
return dateFormat.parse(dateStr); | |||
} catch (ParseException e) { | |||
log.info("转换日期失败, date={}, format={}", dateStr, format, e); | |||
throw new BizException(BASE_VALID_PARAM, e.getMessage(), e); | |||
} | |||
} | |||
@Override | |||
protected Map<String, String> getFormat() { | |||
return FORMAT; | |||
} | |||
@Override | |||
@Nullable | |||
public Date convert(@NonNull String source) { | |||
return super.convert(source, key -> parseDate(source, key)); | |||
} | |||
} |
@@ -0,0 +1,40 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import org.springframework.core.convert.converter.Converter; | |||
import org.springframework.lang.NonNull; | |||
import java.time.LocalDate; | |||
import java.time.format.DateTimeFormatter; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||
/** | |||
* 解决入参为 Date类型 | |||
* | |||
* @author WendyYang | |||
* @date 2019-04-30 | |||
*/ | |||
public class String2LocalDateConverter extends BaseDateConverter<LocalDate> implements Converter<String, LocalDate> { | |||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||
static { | |||
FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||
FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||
FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||
} | |||
@Override | |||
protected Map<String, String> getFormat() { | |||
return FORMAT; | |||
} | |||
@Override | |||
public LocalDate convert(@NonNull String source) { | |||
return super.convert(source, (key) -> LocalDate.parse(source, DateTimeFormatter.ofPattern(key))); | |||
} | |||
} | |||
@@ -0,0 +1,38 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import org.springframework.core.convert.converter.Converter; | |||
import org.springframework.lang.NonNull; | |||
import java.time.LocalDateTime; | |||
import java.time.format.DateTimeFormatter; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||
/** | |||
* 解决入参为 Date类型 | |||
* | |||
* @author WendyYang | |||
* @date 2019-04-30 | |||
*/ | |||
public class String2LocalDateTimeConverter extends BaseDateConverter<LocalDateTime> implements Converter<String, LocalDateTime> { | |||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||
static { | |||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT, DEFAULT_DATE_TIME_FORMAT_MATCHES); | |||
FORMAT.put(SLASH_DATE_TIME_FORMAT, SLASH_DATE_TIME_FORMAT_MATCHES); | |||
FORMAT.put(DEFAULT_DATE_TIME_FORMAT_EN, DEFAULT_DATE_TIME_FORMAT_EN_MATCHES); | |||
} | |||
@Override | |||
protected Map<String, String> getFormat() { | |||
return FORMAT; | |||
} | |||
@Override | |||
public LocalDateTime convert(@NonNull String source) { | |||
return super.convert(source, (key) -> LocalDateTime.parse(source, DateTimeFormatter.ofPattern(key))); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
package com.ningdatech.kqapi.common.converter; | |||
import org.springframework.core.convert.converter.Converter; | |||
import java.time.LocalTime; | |||
import java.time.format.DateTimeFormatter; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.DEFAULT_TIME_FORMAT; | |||
/** | |||
* 解决入参为 Date类型 | |||
* | |||
* @author WendyYang | |||
* @date 2019-04-30 | |||
*/ | |||
@SuppressWarnings("all") | |||
public class String2LocalTimeConverter extends BaseDateConverter<LocalTime> implements Converter<String, LocalTime> { | |||
protected static final Map<String, String> FORMAT = new LinkedHashMap<>(5); | |||
static { | |||
FORMAT.put(DEFAULT_TIME_FORMAT, "^\\d{1,2}:\\d{1,2}:\\d{1,2}$"); | |||
} | |||
@Override | |||
protected Map<String, String> getFormat() { | |||
return FORMAT; | |||
} | |||
@Override | |||
public LocalTime convert(String source) { | |||
return super.convert(source, (key) -> LocalTime.parse(source, DateTimeFormatter.ofPattern(key))); | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||
/** | |||
* 业务参数异常 | |||
* 用于在业务中,检测到非法参数时,进行抛出的异常。 | |||
* | |||
* @author WendyYang | |||
* @version 3.5.0 | |||
*/ | |||
public class ArgumentException extends BaseUncheckedException { | |||
private static final long serialVersionUID = -3843907364558373817L; | |||
public ArgumentException(Throwable cause) { | |||
super(cause); | |||
} | |||
public ArgumentException(String message) { | |||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), message); | |||
} | |||
public ArgumentException(String message, Throwable cause) { | |||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), message, cause); | |||
} | |||
public ArgumentException(final String format, Object... args) { | |||
super(ExceptionCode.BASE_VALID_PARAM.getCode(), format, args); | |||
} | |||
@Override | |||
public String toString() { | |||
return "ArgumentException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||
} | |||
} |
@@ -0,0 +1,57 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
/** | |||
* 运行期异常基类 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
*/ | |||
public abstract class BaseCheckedException extends Exception implements BaseException { | |||
private static final long serialVersionUID = 2706069899924648586L; | |||
/** | |||
* 异常信息 | |||
*/ | |||
private String message; | |||
/** | |||
* 具体异常码 | |||
*/ | |||
private int code; | |||
public BaseCheckedException(final int code, final String message) { | |||
super(message); | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public BaseCheckedException(final int code, final String format, Object... args) { | |||
super(String.format(format, args)); | |||
this.code = code; | |||
this.message = String.format(format, args); | |||
} | |||
/** | |||
* 获取 异常消息 | |||
* | |||
* @return 异常消息 | |||
*/ | |||
@Override | |||
public String getMessage() { | |||
return message; | |||
} | |||
/** | |||
* 获取 错误码 | |||
* | |||
* @return 错误码 | |||
*/ | |||
@Override | |||
public int getCode() { | |||
return code; | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
/** | |||
* 异常接口类 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
*/ | |||
public interface BaseException { | |||
/** | |||
* 统一参数验证异常码 | |||
*/ | |||
int BASE_VALID_PARAM = -9; | |||
/** | |||
* 返回异常信息 | |||
* | |||
* @return 异常信息 | |||
*/ | |||
String getMessage(); | |||
/** | |||
* 返回异常编码 | |||
* | |||
* @return 异常编码 | |||
*/ | |||
int getCode(); | |||
} |
@@ -0,0 +1,65 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import cn.hutool.core.util.StrUtil; | |||
import com.ningdatech.kqapi.common.util.StrPool; | |||
/** | |||
* 非运行期异常基类,所有自定义非运行时异常继承该类 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
* @see RuntimeException | |||
*/ | |||
public class BaseUncheckedException extends RuntimeException implements BaseException { | |||
private static final long serialVersionUID = -778887391066124051L; | |||
/** | |||
* 异常信息 | |||
*/ | |||
private String message; | |||
/** | |||
* 具体异常码 | |||
*/ | |||
private int code; | |||
public BaseUncheckedException(Throwable cause) { | |||
super(cause); | |||
} | |||
public BaseUncheckedException(final int code, Throwable cause) { | |||
super(cause); | |||
this.code = code; | |||
} | |||
public BaseUncheckedException(final int code, final String message) { | |||
super(message); | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public BaseUncheckedException(final int code, final String message, Throwable cause) { | |||
super(cause); | |||
this.code = code; | |||
this.message = message; | |||
} | |||
public BaseUncheckedException(final int code, final String format, Object... args) { | |||
super(StrUtil.contains(format, StrPool.BRACE) ? StrUtil.format(format, args) : String.format(format, args)); | |||
this.code = code; | |||
this.message = StrUtil.contains(format, StrPool.BRACE) ? StrUtil.format(format, args) : String.format(format, args); | |||
} | |||
@Override | |||
public String getMessage() { | |||
return message; | |||
} | |||
@Override | |||
public int getCode() { | |||
return code; | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.BaseExceptionCode; | |||
/** | |||
* 业务异常 | |||
* 用于在处理业务逻辑时,进行抛出的异常。 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
*/ | |||
public class BizException extends BaseUncheckedException { | |||
private static final long serialVersionUID = -3843907364558373817L; | |||
public BizException(Throwable cause) { | |||
super(cause); | |||
} | |||
public BizException(int code, Throwable cause) { | |||
super(code, cause); | |||
} | |||
public BizException(String message) { | |||
super(-1, message); | |||
} | |||
public BizException(String message, Throwable cause) { | |||
super(-1, message, cause); | |||
} | |||
public BizException(int code, String message) { | |||
super(code, message); | |||
} | |||
public BizException(int code, String message, Throwable cause) { | |||
super(code, message, cause); | |||
} | |||
public BizException(int code, String message, Object... args) { | |||
super(code, message, args); | |||
} | |||
/** | |||
* 实例化异常 | |||
* | |||
* @param code 自定义异常编码 | |||
* @param message 自定义异常消息 | |||
* @param args 已定义异常参数 | |||
* @return 异常实例 | |||
*/ | |||
public static BizException wrap(int code, String message, Object... args) { | |||
return new BizException(code, message, args); | |||
} | |||
public static BizException wrap(String message, Object... args) { | |||
return new BizException(-1, message, args); | |||
} | |||
public static BizException validFail(String message, Object... args) { | |||
return new BizException(-9, message, args); | |||
} | |||
public static BizException wrap(BaseExceptionCode ex) { | |||
return new BizException(ex.getCode(), ex.getMsg()); | |||
} | |||
public static BizException wrap(BaseExceptionCode ex, Throwable cause) { | |||
return new BizException(ex.getCode(), ex.getMsg(), cause); | |||
} | |||
@Override | |||
public String toString() { | |||
return "BizException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
/** | |||
* 非业务异常 | |||
* 用于在处理非业务逻辑时,进行抛出的异常。 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
* @see Exception | |||
*/ | |||
public class CommonException extends BaseCheckedException { | |||
public CommonException(int code, String message) { | |||
super(code, message); | |||
} | |||
public CommonException(int code, String format, Object... args) { | |||
super(code, format, args); | |||
} | |||
public CommonException wrap(int code, String format, Object... args) { | |||
return new CommonException(code, format, args); | |||
} | |||
@Override | |||
public String toString() { | |||
return "BizException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||
/** | |||
* <p> | |||
* DownloadException | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 16:02 2024/1/8 | |||
*/ | |||
public class DownloadException extends BaseUncheckedException { | |||
public DownloadException(Throwable cause) { | |||
super(cause); | |||
} | |||
public DownloadException(String message, Object... args) { | |||
super(ExceptionCode.BAD_REQUEST.getCode(), message, args); | |||
} | |||
public static DownloadException wrap(String message, Object... args) { | |||
return new DownloadException(message, args); | |||
} | |||
} |
@@ -0,0 +1,28 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||
/** | |||
* <p> | |||
* ExportException | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 16:02 2024/1/8 | |||
*/ | |||
public class ExportException extends BaseUncheckedException { | |||
public ExportException(Throwable cause) { | |||
super(cause); | |||
} | |||
public ExportException(String message, Object... args) { | |||
super(ExceptionCode.BAD_REQUEST.getCode(), message, args); | |||
} | |||
public static ExportException wrap(String message, Object... args) { | |||
return new ExportException(message, args); | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.BaseExceptionCode; | |||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||
/** | |||
* 403 禁止访问 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
*/ | |||
public class ForbiddenException extends BaseUncheckedException { | |||
private static final long serialVersionUID = 1L; | |||
public ForbiddenException(int code, String message) { | |||
super(code, message); | |||
} | |||
public static ForbiddenException wrap(BaseExceptionCode ex) { | |||
return new ForbiddenException(ex.getCode(), ex.getMsg()); | |||
} | |||
public static ForbiddenException wrap(String msg) { | |||
return new ForbiddenException(ExceptionCode.FORBIDDEN.getCode(), msg); | |||
} | |||
@Override | |||
public String toString() { | |||
return "ForbiddenException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
package com.ningdatech.kqapi.common.exception; | |||
import com.ningdatech.kqapi.common.exception.code.ExceptionCode; | |||
/** | |||
* 401 未认证 未登录 | |||
* | |||
* @author WendyYang | |||
* @version 1.0 | |||
*/ | |||
public class UnauthorizedException extends BaseUncheckedException { | |||
private static final long serialVersionUID = 1L; | |||
public UnauthorizedException(int code, String message) { | |||
super(code, message); | |||
} | |||
public UnauthorizedException(int code, String message, Throwable cause) { | |||
super(code, message, cause); | |||
} | |||
public static UnauthorizedException wrap(String msg) { | |||
return new UnauthorizedException(ExceptionCode.UNAUTHORIZED.getCode(), msg); | |||
} | |||
@Override | |||
public String toString() { | |||
return "UnauthorizedException [message=" + getMessage() + ", code=" + getCode() + "]"; | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
package com.ningdatech.kqapi.common.exception.code; | |||
/** | |||
* 异常编码 | |||
* | |||
* @author WendyYang | |||
* @date 2017-12-25 13:46 | |||
*/ | |||
public interface BaseExceptionCode { | |||
/** | |||
* 异常编码 | |||
* | |||
* @return 异常编码 | |||
*/ | |||
int getCode(); | |||
/** | |||
* 异常消息 | |||
* | |||
* @return 异常消息 | |||
*/ | |||
String getMsg(); | |||
} |
@@ -0,0 +1,103 @@ | |||
package com.ningdatech.kqapi.common.exception.code; | |||
/** | |||
* 异常编码 | |||
* | |||
* @author WendyYang | |||
* @date 2017-12-13 16:22 | |||
*/ | |||
public enum ExceptionCode implements BaseExceptionCode { | |||
//系统相关 start | |||
SUCCESS(0, "成功"), | |||
SYSTEM_BUSY(-1, "系统繁忙~请稍后再试~"), | |||
SYSTEM_TIMEOUT(-2, "系统维护中~请稍后再试~"), | |||
PARAM_EX(-3, "参数类型解析异常"), | |||
SQL_EX(-4, "运行SQL出现异常"), | |||
NULL_POINT_EX(-5, "空指针异常"), | |||
ILLEGAL_ARGUMENT_EX(-6, "无效参数异常"), | |||
MEDIA_TYPE_EX(-7, "请求类型异常"), | |||
LOAD_RESOURCES_ERROR(-8, "加载资源出错"), | |||
BASE_VALID_PARAM(-9, "统一验证参数异常"), | |||
OPERATION_EX(-10, "操作异常"), | |||
SERVICE_MAPPER_ERROR(-11, "Mapper类转换异常"), | |||
CAPTCHA_ERROR(-12, "验证码校验失败"), | |||
JSON_PARSE_ERROR(-13, "JSON解析异常"), | |||
OK(200, "OK"), | |||
BAD_REQUEST(400, "错误的请求"), | |||
/** | |||
* {@code 401 Unauthorized}. 需要重新登录。 | |||
* 该HTTP状态码表示认证错误,它是为了认证设计的,而不是为了授权设计的。收到401响应,表示请求没有被认证—压根没有认证或者认证不正确—但是请重新认证和重试。(一般在响应头部包含一个WWW-Authenticate来描述如何认证)。通常由web服务器返回,而不是web应用。从性质上来说是临时的东西。(服务器要求客户端重试) | |||
* | |||
* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a> | |||
*/ | |||
UNAUTHORIZED(401, "未认证"), | |||
/** 该HTTP状态码是关于授权方面的。从性质上来说是永久的东西,和应用的业务逻辑相关联。它比401更具体,更实际。收到403响应表示服务器完成认证过程,但是客户端请求没有权限去访问要求的资源。 */ | |||
FORBIDDEN(403, "禁止访问"), | |||
/** | |||
* {@code 404 Not Found}. | |||
* | |||
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a> | |||
*/ | |||
NOT_FOUND(404, "没有找到资源"), | |||
METHOD_NOT_ALLOWED(405, "不支持当前请求类型"), | |||
TOO_MANY_REQUESTS(429, "请求超过次数限制"), | |||
INTERNAL_SERVER_ERROR(500, "内部服务错误"), | |||
BAD_GATEWAY(502, "网关错误"), | |||
GATEWAY_TIMEOUT(504, "网关超时"), | |||
//系统相关 end | |||
REQUIRED_FILE_PARAM_EX(1001, "请求中必须至少包含一个有效文件"), | |||
DATA_SAVE_ERROR(2000, "新增数据失败"), | |||
DATA_UPDATE_ERROR(2001, "修改数据失败"), | |||
TOO_MUCH_DATA_ERROR(2002, "批量新增数据过多"), | |||
//jwt token 相关 start | |||
JWT_BASIC_INVALID(40000, "无效的基本身份验证令牌"), | |||
JWT_TOKEN_EXPIRED(40001, "会话超时,请重新登录"), | |||
JWT_SIGNATURE(40002, "不合法的token,请认真比对 token 的签名"), | |||
JWT_ILLEGAL_ARGUMENT(40003, "缺少token参数"), | |||
JWT_GEN_TOKEN_FAIL(40004, "生成token失败"), | |||
JWT_PARSER_TOKEN_FAIL(40005, "解析用户身份错误,请重新登录!"), | |||
JWT_USER_INVALID(40006, "用户名或密码错误"), | |||
JWT_USER_ENABLED(40007, "用户已经被禁用!"), | |||
JWT_OFFLINE(40008, "您已在另一个设备登录!"), | |||
JWT_NOT_LOGIN(40009, "登录超时,请重新登录!"), | |||
//jwt token 相关 end | |||
; | |||
private final int code; | |||
private String msg; | |||
ExceptionCode(int code, String msg) { | |||
this.code = code; | |||
this.msg = msg; | |||
} | |||
@Override | |||
public int getCode() { | |||
return code; | |||
} | |||
@Override | |||
public String getMsg() { | |||
return msg; | |||
} | |||
public ExceptionCode build(String msg, Object... param) { | |||
this.msg = String.format(msg, param); | |||
return this; | |||
} | |||
public ExceptionCode param(Object... param) { | |||
msg = String.format(msg, param); | |||
return this; | |||
} | |||
} |
@@ -1,7 +1,7 @@ | |||
package com.ningdatech.kqapi.common.handler; | |||
import com.ningdatech.basic.enumeration.Status; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||
import com.ningdatech.kqapi.common.model.Status; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.context.support.DefaultMessageSourceResolvable; | |||
import org.springframework.http.HttpStatus; | |||
@@ -1,6 +1,6 @@ | |||
package com.ningdatech.kqapi.common.handler; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.kqapi.common.model.ApiResponse; | |||
import org.springframework.core.MethodParameter; | |||
import org.springframework.http.MediaType; | |||
import org.springframework.http.converter.HttpMessageConverter; | |||
@@ -0,0 +1,123 @@ | |||
package com.ningdatech.kqapi.common.model; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import java.io.Serializable; | |||
/** | |||
* <p> | |||
* ApiResponse - 统一的接口返回值封装 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 14:29 2022/9/29 | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
public class ApiResponse<T> implements Serializable { | |||
private static final long serialVersionUID = 532384723325394156L; | |||
public static final int SUCCESS_CODE = 200; | |||
public static final String SUCCESS_MSG = "success"; | |||
public static final int ERROR_CODE = 500; | |||
public static final String ERROR_MSG = "Internal server error"; | |||
/** | |||
* 状态码 | |||
*/ | |||
private Integer code; | |||
/** | |||
* 返回内容 | |||
*/ | |||
private String message; | |||
/** | |||
* 返回数据 | |||
*/ | |||
private T data; | |||
/** | |||
* 全参构造函数 | |||
* | |||
* @param code 状态码 | |||
* @param message 返回内容 | |||
* @param data 返回数据 | |||
*/ | |||
private ApiResponse(Integer code, String message, T data) { | |||
this.code = code; | |||
this.message = message; | |||
this.data = data; | |||
} | |||
/** | |||
* 构造一个自定义的API返回 | |||
* | |||
* @param code 状态码 | |||
* @param message 返回内容 | |||
* @param data 返回数据 | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> of(Integer code, String message, T data) { | |||
return new ApiResponse<T>(code, message, data); | |||
} | |||
public static <T> ApiResponse<T> of(Integer code, String message) { | |||
return of(code, message, null); | |||
} | |||
/** | |||
* 构造一个成功且不带数据的API返回 | |||
* | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> ofSuccess() { | |||
return ofSuccess(null); | |||
} | |||
/** | |||
* 构造一个成功且带数据的API返回 | |||
* | |||
* @param data 返回数据 | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> ofSuccess(T data) { | |||
return ofStatus(Status.OK, data); | |||
} | |||
/** | |||
* 构造一个成功且自定义消息的API返回 | |||
* | |||
* @param message 返回内容 | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> ofMessage(String message) { | |||
return of(Status.OK.getCode(), message, null); | |||
} | |||
/** | |||
* 构造一个有状态的API返回 | |||
* | |||
* @param status 状态 {@link Status} | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> ofStatus(ApiStatus status) { | |||
return ofStatus(status, null); | |||
} | |||
/** | |||
* 构造一个有状态且带数据的API返回 | |||
* | |||
* @param status 状态 {@link Status} | |||
* @param data 返回数据 | |||
* @return ApiResponse | |||
*/ | |||
public static <T> ApiResponse<T> ofStatus(ApiStatus status, T data) { | |||
return of(status.getCode(), status.getReasonPhrase(), data); | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
package com.ningdatech.kqapi.common.model; | |||
/** | |||
* <p> | |||
* ApiStatus - 通用api状态 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 14:44 2022/9/29 | |||
*/ | |||
public interface ApiStatus { | |||
/** | |||
* 获取code | |||
* | |||
* @return code | |||
*/ | |||
Integer getCode(); | |||
/** | |||
* 获取短语 | |||
* | |||
* @return 短语 | |||
*/ | |||
String getReasonPhrase(); | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.ningdatech.kqapi.common.model; | |||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
import lombok.Data; | |||
/** | |||
* <p> | |||
* PagePo - 分页请求参数类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 16:29 2022/9/14 | |||
*/ | |||
@Data | |||
public class PagePo { | |||
private Integer pageNumber = 1; | |||
private Integer pageSize = 10; | |||
public void page(Integer pageNumber, Integer pageSize) { | |||
this.pageNumber = pageNumber; | |||
this.pageSize = pageSize; | |||
} | |||
public <T> Page<T> page() { | |||
return Page.of(pageNumber, pageSize); | |||
} | |||
} |
@@ -0,0 +1,63 @@ | |||
package com.ningdatech.kqapi.common.model; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import java.util.Collection; | |||
import java.util.Collections; | |||
/** | |||
* <p> | |||
* PageVo - 分页返回的包装对象 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 14:43 2022/9/29 | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
public class PageVo<T> { | |||
private Collection<T> records; | |||
private Long total; | |||
private Boolean hasNextPage; | |||
public PageVo(Collection<T> records, Boolean hasNextPage) { | |||
this.records = records; | |||
this.hasNextPage = hasNextPage; | |||
} | |||
public PageVo(Collection<T> records, Long total) { | |||
this.records = records; | |||
this.total = total; | |||
} | |||
public void setTotal(Long total) { | |||
this.total = total; | |||
} | |||
public static <T> PageVo<T> of(Collection<T> data, Long total) { | |||
return new PageVo<>(data, total); | |||
} | |||
public static <T> PageVo<T> of(Collection<T> data, Integer total) { | |||
return new PageVo<>(data, (long) total); | |||
} | |||
/** | |||
* 移动端无需展示总页码使用 | |||
* | |||
* @param data 分页数据 | |||
* @param hasNextPage 是否有下一页 | |||
* @author WendyYang | |||
**/ | |||
public static <T> PageVo<T> of(Collection<T> data, Boolean hasNextPage) { | |||
return new PageVo<>(data, hasNextPage); | |||
} | |||
public static <T> PageVo<T> empty() { | |||
return new PageVo<>(Collections.emptyList(), 0L); | |||
} | |||
} |
@@ -0,0 +1,123 @@ | |||
package com.ningdatech.kqapi.common.model; | |||
import lombok.Getter; | |||
/** | |||
* @description: | |||
* @author: liushuai | |||
* @date: 2022/3/25 11:31 | |||
*/ | |||
@Getter | |||
public enum Status implements ApiStatus { | |||
/** | |||
* 正常 | |||
*/ | |||
OK(200, "正常"), | |||
/** | |||
* 请求错误 | |||
*/ | |||
BAD_REQUEST(400, "请求错误"), | |||
/** | |||
* Unauthorized | |||
*/ | |||
NO_AUTHORIZATION(401, "未经授权的"), | |||
/** | |||
* 服务器解析不到用户请求的服务名称 | |||
*/ | |||
REQUEST_NOT_FOUND(404, "服务不存在"), | |||
/** | |||
* 未知异常 | |||
*/ | |||
UNKNOWN_ERROR(500, "服务器内部错误"), | |||
/** | |||
* 未定义异常 | |||
*/ | |||
UNDEFINED(501, "未定义"), | |||
/** | |||
* 未定义异常 | |||
*/ | |||
ERROR_PARAM(502, "您输入的参数有非法字符,请输入正确的参数"), | |||
/** | |||
* 该服务已下线 | |||
*/ | |||
SERVICES_DISABLED(1, "服务未启用"), | |||
/** | |||
* 请求参数不能为空 | |||
*/ | |||
PARAM_NOT_NULL(101, "请求参数不能为空"), | |||
/** | |||
* 字段名重复 | |||
*/ | |||
COLUMN_REPEAT(112, "字段名重复,请重新填写"), | |||
/** | |||
* 参数不匹配 | |||
*/ | |||
PARAM_NOT_MATCH(102, "参数不匹配"), | |||
/** | |||
* 权限认证参数 | |||
*/ | |||
NO_AUT_PARAM(103, "权限参数不存在"), | |||
/** | |||
* 日期格式错误 | |||
*/ | |||
DATE_FORMAT_EXCEPTION(104, "日期格式错误"), | |||
/** | |||
* 网络连接异常 | |||
*/ | |||
CONNECTION_REFUSED(105, "连接拒绝"), | |||
/** | |||
* 登录失败 | |||
*/ | |||
LOGIN_BAD(107, "用户登录失败,请确认用户信息"), | |||
/** | |||
* 流程删除失败 | |||
*/ | |||
BAD_DELETE_PROCESS(106,"文件已进入流转流程,删除失败"), | |||
/** | |||
* 无可用端口 | |||
*/ | |||
NO_PORT_AVAILABLE(111, "无可用端口"), | |||
/** | |||
* 文件下载异常 | |||
*/ | |||
FILE_DOWNLOAD_EXCEPTION(607, "文件下载异常"), | |||
/** | |||
* 文件传输异常 | |||
*/ | |||
FILE_TRANS_EXCEPTION(608, "文件传输异常"), | |||
/** | |||
* 文件名不存在 | |||
*/ | |||
FILE_NAME_EXCEPTION(609, "文件名不存在"), | |||
/** | |||
* 文件名不存在 | |||
*/ | |||
FILE_NAME_REPEAT(610, "文件名重复,请重新上传"), | |||
/** | |||
* 文件名不存在 | |||
*/ | |||
FILE_DELETE_FAIL(611, "文件删除异常"), | |||
/** | |||
* 文件名不存在 | |||
*/ | |||
FILE_NOT_SUPPORT(612, "不支持的文件类型,请重新上传"), | |||
/** | |||
* 文件名不存在 | |||
*/ | |||
FILE_NOT_EXIT(613, "业务文件未上传,请上传业务文件"); | |||
/** | |||
* 状态码 | |||
*/ | |||
private final Integer code; | |||
/** | |||
* 内容 | |||
*/ | |||
private final String reasonPhrase; | |||
Status(Integer code, String reasonPhrase) { | |||
this.code = code; | |||
this.reasonPhrase = reasonPhrase; | |||
} | |||
} |
@@ -1,7 +1,7 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import cn.hutool.core.text.StrPool; | |||
import cn.hutool.core.util.StrUtil; | |||
import com.ningdatech.basic.util.StrPool; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.springframework.util.NumberUtils; | |||
@@ -109,10 +109,6 @@ public class BizUtils { | |||
}))); | |||
} | |||
public static String inSqlJoin(List<String> strings) { | |||
return strings.stream().map(w -> "'" + w + "'").collect(Collectors.joining(StrPool.COMMA, StrPool.LEFT_BRACKET, StrPool.RIGHT_BRACKET)); | |||
} | |||
public static LocalDateTime convertDate(Date date) { | |||
if (Objects.nonNull(date)) { | |||
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); | |||
@@ -1,6 +1,6 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import com.ningdatech.basic.util.StrPool; | |||
import cn.hutool.core.text.StrPool; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
@@ -1,104 +0,0 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import cn.hutool.core.io.IoUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import freemarker.template.Configuration; | |||
import freemarker.template.Template; | |||
import freemarker.template.TemplateException; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.http.entity.ContentType; | |||
import org.springframework.core.io.ByteArrayResource; | |||
import javax.servlet.ServletOutputStream; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.*; | |||
import java.math.BigDecimal; | |||
import java.net.URLEncoder; | |||
import java.nio.charset.StandardCharsets; | |||
import java.nio.file.Files; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.zip.ZipEntry; | |||
import java.util.zip.ZipOutputStream; | |||
/** | |||
* <p> | |||
* FreemarkerWordUtil | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 2023/7/24 | |||
**/ | |||
@Slf4j | |||
public class FreemarkerWordUtil { | |||
private static void setDownFileName(HttpServletResponse response, String fileName) { | |||
String fileNameEncoded; | |||
try { | |||
fileNameEncoded = URLEncoder.encode(fileName, "UTF-8"); | |||
} catch (UnsupportedEncodingException e) { | |||
throw new RuntimeException("文件名编码异常"); | |||
} | |||
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileNameEncoded); | |||
} | |||
private static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_31); | |||
static { | |||
CONFIGURATION.setDefaultEncoding("UTF-8"); | |||
CONFIGURATION.setClassForTemplateLoading(FreemarkerWordUtil.class, "/template"); | |||
} | |||
/** | |||
* 生成word文件 | |||
* | |||
* @param dataMap word中需要展示的动态数据,用map集合来保存 | |||
* @param templateName word模板名称,例如:test.ftl | |||
* @param filePath 文件生成的目标路径,例如:D:/wordFile/ | |||
* @param fileName 生成的文件名称,例如:test.doc | |||
*/ | |||
public static void create(Object dataMap, String templateName, String filePath, String fileName) { | |||
try { | |||
Template template = CONFIGURATION.getTemplate(templateName); | |||
//输出文件 | |||
File outFile = new File(filePath + File.separator + fileName); | |||
//如果输出目标文件夹不存在,则创建 | |||
if (!outFile.getParentFile().exists()) { | |||
boolean ignore = outFile.getParentFile().mkdirs(); | |||
} | |||
//将模板和数据模型合并生成文件 | |||
Writer out = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(outFile.toPath()), StandardCharsets.UTF_8)); | |||
//生成文件 | |||
template.process(dataMap, out); | |||
IoUtil.flush(out); | |||
IoUtil.close(out); | |||
} catch (Exception e) { | |||
log.error("根据模版生成Word文件失败:", e); | |||
throw BizException.wrap("根据模版生成Word文件失败"); | |||
} | |||
} | |||
public static void export(String fileName, Object data, HttpServletResponse response, String templateName) throws TemplateException, IOException { | |||
Template template = CONFIGURATION.getTemplate(templateName); | |||
response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); | |||
response.setContentType(ContentType.APPLICATION_JSON.getMimeType()); | |||
setDownFileName(response, fileName); | |||
try (StringWriter out = new StringWriter(); | |||
Writer writer = new BufferedWriter(out, 4096)) { | |||
template.process(data, writer); | |||
try (InputStream is = new ByteArrayResource(out.toString().getBytes(StandardCharsets.UTF_8)).getInputStream(); | |||
ServletOutputStream outputStream = response.getOutputStream()) { | |||
// 缓冲区 | |||
byte[] buffer = new byte[1024]; | |||
int bytesToRead; | |||
// 通过循环将读入的Word文件的内容输出到浏览器中 | |||
while ((bytesToRead = is.read(buffer)) != -1) { | |||
outputStream.write(buffer, 0, bytesToRead); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -1,89 +0,0 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import java.io.ByteArrayInputStream; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.IOException; | |||
import java.util.zip.GZIPInputStream; | |||
import java.util.zip.GZIPOutputStream; | |||
/** | |||
* <p> | |||
* 压缩为Gzip | |||
* </p> | |||
* | |||
* @author WendyYang | |||
*/ | |||
public class GzipUtils { | |||
/** | |||
* 使用gzip进行压缩 | |||
*/ | |||
public static String compress(String primStr) { | |||
if (primStr == null || primStr.length() == 0) { | |||
return primStr; | |||
} | |||
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||
GZIPOutputStream gzip = null; | |||
try { | |||
gzip = new GZIPOutputStream(out); | |||
gzip.write(primStr.getBytes()); | |||
} catch (IOException e) { | |||
throw new RuntimeException(e); | |||
} finally { | |||
if (gzip != null) { | |||
try { | |||
gzip.close(); | |||
} catch (IOException e) { | |||
throw new RuntimeException(e); | |||
} | |||
} | |||
} | |||
return new sun.misc.BASE64Encoder().encode(out.toByteArray()); | |||
} | |||
/** | |||
* 使用gzip进行解压缩 | |||
*/ | |||
public static String uncompress(String compressedStr) { | |||
if (compressedStr == null) { | |||
return null; | |||
} | |||
ByteArrayOutputStream out = new ByteArrayOutputStream(); | |||
ByteArrayInputStream in = null; | |||
GZIPInputStream ginzip = null; | |||
byte[] compressed = null; | |||
String decompressed = null; | |||
try { | |||
compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr); | |||
in = new ByteArrayInputStream(compressed); | |||
ginzip = new GZIPInputStream(in); | |||
byte[] buffer = new byte[1024]; | |||
int offset = -1; | |||
while ((offset = ginzip.read(buffer)) != -1) { | |||
out.write(buffer, 0, offset); | |||
} | |||
decompressed = out.toString(); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} finally { | |||
if (ginzip != null) { | |||
try { | |||
ginzip.close(); | |||
} catch (IOException e) { | |||
} | |||
} | |||
if (in != null) { | |||
try { | |||
in.close(); | |||
} catch (IOException e) { | |||
} | |||
} | |||
try { | |||
out.close(); | |||
} catch (IOException e) { | |||
} | |||
} | |||
return decompressed; | |||
} | |||
} |
@@ -8,23 +8,15 @@ import org.apache.http.client.methods.CloseableHttpResponse; | |||
import org.apache.http.client.methods.HttpGet; | |||
import org.apache.http.client.methods.HttpPost; | |||
import org.apache.http.conn.ssl.DefaultHostnameVerifier; | |||
import org.apache.http.conn.ssl.NoopHostnameVerifier; | |||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||
import org.apache.http.conn.ssl.TrustStrategy; | |||
import org.apache.http.conn.util.PublicSuffixMatcher; | |||
import org.apache.http.conn.util.PublicSuffixMatcherLoader; | |||
import org.apache.http.entity.StringEntity; | |||
import org.apache.http.impl.client.CloseableHttpClient; | |||
import org.apache.http.impl.client.HttpClientBuilder; | |||
import org.apache.http.impl.client.HttpClients; | |||
import org.apache.http.message.BasicNameValuePair; | |||
import org.apache.http.ssl.SSLContexts; | |||
import org.apache.http.util.EntityUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||
import javax.net.ssl.SSLContext; | |||
import java.io.IOException; | |||
import java.net.URL; | |||
import java.util.ArrayList; | |||
@@ -51,7 +43,7 @@ public class HttpUtil { | |||
* 发送 post 请求 | |||
* @param httpUrl 地址 | |||
*/ | |||
public String sendHttpPost(String httpUrl) { | |||
public String sendHttpPost(String httpUrl) throws IOException { | |||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||
return sendHttpPost(httpPost); | |||
} | |||
@@ -61,7 +53,7 @@ public class HttpUtil { | |||
* @param httpUrl 地址 | |||
* @param params 参数(格式:key1=value1&key2=value2) | |||
*/ | |||
public String sendHttpPost(String httpUrl, String params) { | |||
public String sendHttpPost(String httpUrl, String params) throws IOException { | |||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||
try { | |||
//设置参数 | |||
@@ -69,7 +61,7 @@ public class HttpUtil { | |||
stringEntity.setContentType("application/x-www-form-urlencoded"); | |||
httpPost.setEntity(stringEntity); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} | |||
return sendHttpPost(httpPost); | |||
} | |||
@@ -79,7 +71,7 @@ public class HttpUtil { | |||
* @param httpUrl 地址 | |||
* @param maps 参数 | |||
*/ | |||
public String sendHttpPost(String httpUrl, Map<String, String> maps) { | |||
public String sendHttpPost(String httpUrl, Map<String, String> maps) throws IOException { | |||
HttpPost httpPost= new HttpPost(httpUrl);// 创建 httpPost | |||
// 创建参数队列 | |||
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); | |||
@@ -89,7 +81,7 @@ public class HttpUtil { | |||
try { | |||
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8")); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} | |||
return sendHttpPost(httpPost); | |||
} | |||
@@ -99,7 +91,7 @@ public class HttpUtil { | |||
* @param httpPost | |||
*@return | |||
*/ | |||
private String sendHttpPost(HttpPost httpPost) { | |||
private String sendHttpPost(HttpPost httpPost) throws IOException { | |||
CloseableHttpClient httpClient = null; | |||
CloseableHttpResponse response = null; | |||
HttpEntity entity = null; | |||
@@ -113,18 +105,19 @@ public class HttpUtil { | |||
entity = response.getEntity(); | |||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} finally { | |||
httpClient.close(); | |||
try { | |||
// 关闭连接,释放资源 | |||
if (response != null) { | |||
response.close(); | |||
response.close(); | |||
} | |||
if (httpClient != null) { | |||
httpClient.close(); | |||
httpClient.close(); | |||
} | |||
} catch (IOException e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} | |||
} | |||
return responseContent; | |||
@@ -134,7 +127,7 @@ public class HttpUtil { | |||
* 发送 get 请求 | |||
* @param httpUrl | |||
*/ | |||
public String sendHttpGet(String httpUrl) { | |||
public String sendHttpGet(String httpUrl) throws IOException { | |||
HttpGet httpGet = new HttpGet(httpUrl);// 创建 get 请求 | |||
return sendHttpGet(httpGet); | |||
} | |||
@@ -153,7 +146,7 @@ public class HttpUtil { | |||
* @param httpGet | |||
*@return | |||
*/ | |||
private String sendHttpGet(HttpGet httpGet) { | |||
private String sendHttpGet(HttpGet httpGet) throws IOException { | |||
CloseableHttpClient httpClient = null; | |||
CloseableHttpResponse response = null; | |||
HttpEntity entity = null; | |||
@@ -167,8 +160,9 @@ public class HttpUtil { | |||
entity = response.getEntity(); | |||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} finally { | |||
httpClient.close(); | |||
try { | |||
// 关闭连接,释放资源 | |||
if (response != null) { | |||
@@ -178,7 +172,7 @@ public class HttpUtil { | |||
httpClient.close(); | |||
} | |||
} catch (IOException e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} | |||
} | |||
return responseContent; | |||
@@ -205,7 +199,7 @@ public class HttpUtil { | |||
entity = response.getEntity(); | |||
responseContent = EntityUtils.toString(entity, "UTF-8"); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} finally { | |||
try { | |||
// 关闭连接,释放资源 | |||
@@ -216,31 +210,9 @@ public class HttpUtil { | |||
httpClient.close(); | |||
} | |||
} catch (IOException e) { | |||
logger.error(e.getMessage(),e); | |||
logger.error(e.getMessage()); | |||
} | |||
} | |||
return responseContent; | |||
} | |||
/** | |||
* 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证 | |||
* @return 工厂 | |||
*/ | |||
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory(){ | |||
try{ | |||
TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true); | |||
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); | |||
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); | |||
HttpClientBuilder httpClientBuilder = HttpClients.custom(); | |||
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); | |||
CloseableHttpClient httpClient = httpClientBuilder.build(); | |||
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); | |||
factory.setHttpClient(httpClient); | |||
return factory; | |||
}catch (Exception e){ | |||
e.printStackTrace(); | |||
} | |||
return null; | |||
} | |||
} |
@@ -17,7 +17,7 @@ public class Md5Utils { | |||
algorithm.update(s.getBytes(StandardCharsets.UTF_8)); | |||
return algorithm.digest(); | |||
} catch (Exception e) { | |||
LOGGER.error("MD5 Error...", e); | |||
LOGGER.error("MD5 Error...",e.getMessage()); | |||
} | |||
return null; | |||
} | |||
@@ -45,7 +45,7 @@ public class Md5Utils { | |||
} | |||
return new String(hex.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); | |||
} catch (Exception e) { | |||
LOGGER.error("not supported charset:", e); | |||
LOGGER.error("not supported charset:", e.getMessage()); | |||
return s; | |||
} | |||
} |
@@ -0,0 +1,898 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import cn.hutool.core.convert.Convert; | |||
import cn.hutool.core.date.LocalDateTimeUtil; | |||
import cn.hutool.core.util.StrUtil; | |||
import com.ningdatech.kqapi.common.exception.BizException; | |||
import lombok.extern.slf4j.Slf4j; | |||
import java.text.ParseException; | |||
import java.text.SimpleDateFormat; | |||
import java.time.*; | |||
import java.time.format.DateTimeFormatter; | |||
import java.time.temporal.ChronoUnit; | |||
import java.util.*; | |||
import java.util.stream.Stream; | |||
import static cn.hutool.core.date.DatePattern.*; | |||
/** | |||
* 描述:日期工具类 | |||
* | |||
* @author WendyYang | |||
* 修改时间:2018/4/24 | |||
*/ | |||
@Slf4j | |||
public final class NdDateUtils { | |||
public static final String DEFAULT_YEAR_FORMAT = "yyyy"; | |||
public static final String DEFAULT_MONTH_FORMAT = "yyyy-MM"; | |||
public static final String DEFAULT_MONTH_FORMAT_SLASH = "yyyy/MM"; | |||
public static final String DEFAULT_MONTH_FORMAT_EN = "yyyy年MM月"; | |||
public static final String DEFAULT_WEEK_FORMAT = "yyyy-ww"; | |||
public static final String DEFAULT_WEEK_FORMAT_EN = "yyyy年ww周"; | |||
public static final String DEFAULT_DATE_FORMAT = NORM_DATE_PATTERN; | |||
public static final String DEFAULT_DATE_FORMAT_EN = CHINESE_DATE_PATTERN; | |||
public static final String DEFAULT_DATE_TIME_FORMAT = NORM_DATETIME_PATTERN; | |||
public static final String DEFAULT_DATE_TIME_START_FORMAT = "yyyy-MM-dd 00:00:00"; | |||
public static final String DEFAULT_DATE_TIME_END_FORMAT = "yyyy-MM-dd 23:59:59"; | |||
public static final String DEFAULT_DATE_TIME_FORMAT_EN = CHINESE_DATE_TIME_PATTERN; | |||
public static final String DEFAULT_TIME_FORMAT = NORM_TIME_PATTERN; | |||
public static final String DAY = "DAY"; | |||
public static final String MONTH = "MONTH"; | |||
public static final String WEEK = "WEEK"; | |||
public static final String DEFAULT_DATE_FORMAT_MATCHES = "^\\d{4}-\\d{1,2}-\\d{1,2}$"; | |||
public static final String DEFAULT_DATE_TIME_FORMAT_MATCHES = "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$"; | |||
public static final String DEFAULT_DATE_FORMAT_EN_MATCHES = "^\\d{4}年\\d{1,2}月\\d{1,2}日$"; | |||
public static final String DEFAULT_DATE_TIME_FORMAT_EN_MATCHES = "^\\d{4}年\\d{1,2}月\\d{1,2}日\\d{1,2}时\\d{1,2}分\\d{1,2}秒$"; | |||
public static final String SLASH_DATE_FORMAT_MATCHES = "^\\d{4}/\\d{1,2}/\\d{1,2}$"; | |||
public static final String SLASH_DATE_TIME_FORMAT_MATCHES = "^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$"; | |||
public static final String SLASH_DATE_FORMAT = "yyyy/MM/dd"; | |||
public static final String SLASH_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss"; | |||
public static final String CRON_FORMAT = "ss mm HH dd MM ? yyyy"; | |||
/** | |||
* 一个月平均天数 | |||
*/ | |||
public static final long MAX_MONTH_DAY = 30; | |||
/** | |||
* 3个月平均天数 | |||
*/ | |||
public static final long MAX_3_MONTH_DAY = 90; | |||
/** | |||
* 一年平均天数 | |||
*/ | |||
public static final long MAX_YEAR_DAY = 365; | |||
private static final Map<String, String> DATE_FORMAT = new LinkedHashMap<>(5); | |||
//---------------------------------------------------格式化日期start------------------------------------------------- | |||
static { | |||
DATE_FORMAT.put(DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_MATCHES); | |||
DATE_FORMAT.put(SLASH_DATE_FORMAT, SLASH_DATE_FORMAT_MATCHES); | |||
DATE_FORMAT.put(DEFAULT_DATE_FORMAT_EN, DEFAULT_DATE_FORMAT_EN_MATCHES); | |||
} | |||
private NdDateUtils() { | |||
} | |||
/** | |||
* 将字符串解析LocalDate | |||
* | |||
* @param source 源参数 | |||
* 支持以下格式: | |||
* yyyy-MM-dd | |||
* yyyy/MM/dd | |||
* yyyy年MM月dd日 | |||
* @return 日期 | |||
*/ | |||
public static LocalDate parse(String source) { | |||
String sourceTrim = source.trim(); | |||
Set<Map.Entry<String, String>> entries = DATE_FORMAT.entrySet(); | |||
for (Map.Entry<String, String> entry : entries) { | |||
if (sourceTrim.matches(entry.getValue())) { | |||
return LocalDate.parse(source, DateTimeFormatter.ofPattern(entry.getKey())); | |||
} | |||
} | |||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||
} | |||
/** | |||
* 转换 Date 为 cron , eg: "0 07 10 15 1 ? 2016" | |||
* | |||
* @param date 时间点 | |||
* @return cron 表达式 | |||
*/ | |||
public static String getCron(Date date) { | |||
return format(date, CRON_FORMAT); | |||
} | |||
/** | |||
* 转换 LocalDateTime 为 cron , eg. "0 07 10 15 1 ? 2016" | |||
* | |||
* @param date 时间点 | |||
* @return cron 表达式 | |||
*/ | |||
public static String getCron(LocalDateTime date) { | |||
return format(date, CRON_FORMAT); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-MM | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String format(LocalDateTime date, String pattern) { | |||
if (date == null) { | |||
date = LocalDateTime.now(); | |||
} | |||
if (pattern == null) { | |||
pattern = DEFAULT_MONTH_FORMAT; | |||
} | |||
return date.format(DateTimeFormatter.ofPattern(pattern)); | |||
} | |||
public static String format(LocalDate date, String pattern) { | |||
if (date == null) { | |||
date = LocalDate.now(); | |||
} | |||
if (pattern == null) { | |||
pattern = DEFAULT_MONTH_FORMAT; | |||
} | |||
return date.format(DateTimeFormatter.ofPattern(pattern)); | |||
} | |||
/** | |||
* 根据传入的格式格式化日期.默认格式为MM月dd日 | |||
* | |||
* @param d 日期 | |||
* @param f 格式 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String format(Date d, String f) { | |||
Date date = d; | |||
String format = f; | |||
if (date == null) { | |||
date = new Date(); | |||
} | |||
if (format == null) { | |||
format = DEFAULT_DATE_TIME_FORMAT; | |||
} | |||
SimpleDateFormat df = new SimpleDateFormat(format); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-MM-dd | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsDate(LocalDateTime date) { | |||
return format(date, DEFAULT_DATE_FORMAT); | |||
} | |||
public static String formatAsDate(LocalDate date) { | |||
return format(date, DEFAULT_DATE_FORMAT); | |||
} | |||
public static String formatAsDateEn(LocalDateTime date) { | |||
return format(date, DEFAULT_DATE_FORMAT_EN); | |||
} | |||
public static String formatAsYearMonth(LocalDateTime date) { | |||
return format(date, DEFAULT_MONTH_FORMAT); | |||
} | |||
public static String formatAsYearMonthEn(LocalDateTime date) { | |||
return format(date, DEFAULT_MONTH_FORMAT_EN); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-ww | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsYearWeek(LocalDateTime date) { | |||
return format(date, DEFAULT_WEEK_FORMAT); | |||
} | |||
public static String formatAsYearWeekEn(LocalDateTime date) { | |||
return format(date, DEFAULT_WEEK_FORMAT_EN); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-MM | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsYearMonth(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_MONTH_FORMAT); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-ww | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsYearWeek(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_WEEK_FORMAT); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 HH:mm:ss 例:12:24:24 | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsTime(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_TIME_FORMAT); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-MM-dd | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsDate(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_FORMAT); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 yyyy-MM-dd HH:mm:ss | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsDateTime(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT); | |||
return df.format(date); | |||
} | |||
/** | |||
* 格式化日期,返回格式为 dd ,即对应的天数. | |||
* | |||
* @param date 日期 | |||
* @return 格式化后的字符串 | |||
*/ | |||
public static String formatAsDay(Date date) { | |||
SimpleDateFormat df = new SimpleDateFormat("dd"); | |||
return df.format(date); | |||
} | |||
//--格式化日期end----------------------------------------- | |||
//--解析日期start----------------------------------------- | |||
/** | |||
* 将字符转换成日期 | |||
* | |||
* @param dateStr 日期字符串 | |||
* @param format 解析格式 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date parse(String dateStr, String format) { | |||
Date date = null; | |||
SimpleDateFormat dateFormat = new SimpleDateFormat(format); | |||
dateFormat.setLenient(false); | |||
try { | |||
date = dateFormat.parse(dateStr); | |||
} catch (Exception e) { | |||
log.info("DateUtils error", e); | |||
} | |||
return date; | |||
} | |||
/** | |||
* 获取当月最后一天 | |||
* | |||
* @param date 日期 | |||
* @return 当月最后一天 | |||
*/ | |||
public static Date getLastDateOfMonth(Date date) { | |||
Calendar calendar = Calendar.getInstance(); | |||
calendar.setTime(date); | |||
calendar.add(Calendar.MONTH, 1); | |||
calendar.set(Calendar.DAY_OF_MONTH, 0); | |||
return calendar.getTime(); | |||
} | |||
/** | |||
* 根据传入的String返回对应的date | |||
* | |||
* @param source 日期字符串 | |||
* @return 日期 | |||
*/ | |||
public static Date parseAsDate(String source) { | |||
String sourceTrim = source.trim(); | |||
Set<Map.Entry<String, String>> entries = DATE_FORMAT.entrySet(); | |||
try { | |||
for (Map.Entry<String, String> entry : entries) { | |||
if (sourceTrim.matches(entry.getValue())) { | |||
return new SimpleDateFormat(entry.getKey()).parse(source); | |||
} | |||
} | |||
} catch (ParseException e) { | |||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||
} | |||
throw BizException.wrap("解析日期失败, 请传递正确的日期格式"); | |||
} | |||
/** | |||
* 按给定参数返回Date对象 | |||
* | |||
* @param dateTime 时间对象格式为("yyyy-MM-dd HH:mm:ss"); | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date parseAsDateTime(String dateTime) { | |||
SimpleDateFormat simpledateformat = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT); | |||
try { | |||
return simpledateformat.parse(dateTime); | |||
} catch (ParseException e) { | |||
return null; | |||
} | |||
} | |||
/** | |||
* 获取指定日期的开始时间 | |||
* 如:00:00:00 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate0000(LocalDateTime value) { | |||
return getDate0000(value.toLocalDate()); | |||
} | |||
/** | |||
* 获取指定日期的开始时间 | |||
* 如:00:00:00 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate0000(Date value) { | |||
return getDate0000(NdDateUtils.date2LocalDate(value)); | |||
} | |||
/** | |||
* 获取指定日期的开始时间 | |||
* 如:00:00:00 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate0000(LocalDate value) { | |||
LocalDateTime todayStart = LocalDateTime.of(value, LocalTime.MIN); | |||
return NdDateUtils.localDateTime2Date(todayStart); | |||
} | |||
/** | |||
* 获取指定日期的结束时间 | |||
* 如:23:59:59 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate2359(LocalDateTime value) { | |||
return getDate2359(value.toLocalDate()); | |||
} | |||
/** | |||
* 获取指定日期的结束时间 | |||
* 如:23:59:59 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate2359(Date value) { | |||
return getDate2359(NdDateUtils.date2LocalDate(value)); | |||
} | |||
/** | |||
* 获取指定日期的结束时间 | |||
* 如:23:59:59 | |||
* | |||
* @param value 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date getDate2359(LocalDate value) { | |||
LocalDateTime dateEnd = LocalDateTime.of(value, LocalTime.MAX); | |||
return NdDateUtils.localDateTime2Date(dateEnd); | |||
} | |||
/** | |||
* LocalDateTime转换为Date | |||
* | |||
* @param localDateTime 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static Date localDateTime2Date(LocalDateTime localDateTime) { | |||
ZoneId zoneId = ZoneId.systemDefault(); | |||
ZonedDateTime zdt = localDateTime.atZone(zoneId); | |||
return Date.from(zdt.toInstant()); | |||
} | |||
//--解析日期 end----------------------------------------- | |||
/** | |||
* Date转换为LocalDateTime | |||
* | |||
* @param date 日期 | |||
*/ | |||
public static LocalDateTime date2LocalDateTime(Date date) { | |||
if (date == null) { | |||
return LocalDateTime.now(); | |||
} | |||
Instant instant = date.toInstant(); | |||
ZoneId zoneId = ZoneId.systemDefault(); | |||
return instant.atZone(zoneId).toLocalDateTime(); | |||
} | |||
/** | |||
* 日期转 LocalDate | |||
* | |||
* @param date 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static LocalDate date2LocalDate(Date date) { | |||
if (date == null) { | |||
return LocalDate.now(); | |||
} | |||
Instant instant = date.toInstant(); | |||
ZoneId zoneId = ZoneId.systemDefault(); | |||
return instant.atZone(zoneId).toLocalDate(); | |||
} | |||
/** | |||
* 日期转 LocalTime | |||
* | |||
* @param date 日期 | |||
* @return 解析后的日期 | |||
*/ | |||
public static LocalTime date2LocalTime(Date date) { | |||
if (date == null) { | |||
return LocalTime.now(); | |||
} | |||
Instant instant = date.toInstant(); | |||
ZoneId zoneId = ZoneId.systemDefault(); | |||
return instant.atZone(zoneId).toLocalTime(); | |||
} | |||
/** | |||
* 毫秒转日期 | |||
* | |||
* @param epochMilli 毫秒 | |||
* @return 解析后的日期 | |||
*/ | |||
public static LocalDateTime getDateTimeOfTimestamp(long epochMilli) { | |||
Instant instant = Instant.ofEpochMilli(epochMilli); | |||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); | |||
} | |||
/** | |||
* 秒转日期 | |||
* | |||
* @param epochSecond 秒 | |||
* @return 解析后的日期 | |||
*/ | |||
public static LocalDateTime getDateTimeOfSecond(long epochSecond) { | |||
Instant instant = Instant.ofEpochSecond(epochSecond); | |||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); | |||
} | |||
//-计算日期 start------------------------------------------ | |||
/** | |||
* 计算结束时间与当前时间间隔的天数 | |||
* | |||
* @param endDate 结束日期 | |||
* @return 计算结束时间与当前时间间隔的天数 | |||
*/ | |||
public static long until(Date endDate) { | |||
return LocalDateTime.now().until(date2LocalDateTime(endDate), ChronoUnit.DAYS); | |||
} | |||
/** | |||
* 计算结束时间与开始时间间隔的天数 | |||
* | |||
* @param startDate 开始日期 | |||
* @param endDate 结束日期 | |||
* @return 计算结束时间与开始时间间隔的天数 | |||
*/ | |||
public static long until(Date startDate, Date endDate) { | |||
return date2LocalDateTime(startDate).until(date2LocalDateTime(endDate), ChronoUnit.DAYS); | |||
} | |||
/** | |||
* 计算结束时间与开始时间间隔的天数 | |||
* | |||
* @param startDate 开始日期 | |||
* @param endDate 结束日期 | |||
* @return 计算结束时间与开始时间间隔的天数 | |||
*/ | |||
public static long until(LocalDateTime startDate, LocalDateTime endDate) { | |||
return startDate.until(endDate, ChronoUnit.DAYS); | |||
} | |||
public static long until(LocalDate startDate, LocalDate endDate) { | |||
return startDate.until(endDate, ChronoUnit.DAYS); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||
* 含头含尾 | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
* @return 日期区间的所有日期 | |||
*/ | |||
public static List<String> getBetweenDay(Date start, Date end) { | |||
return getBetweenDay(date2LocalDate(start), date2LocalDate(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||
* 含头含尾 | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
*/ | |||
public static List<String> getBetweenDay(String start, String end) { | |||
return getBetweenDay(LocalDate.parse(start), LocalDate.parse(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的日期 yyyy-MM-dd | |||
* 含头含尾 | |||
* | |||
* @param startDate yyyy-MM-dd | |||
* @param endDate yyyy-MM-dd | |||
*/ | |||
public static List<String> getBetweenDay(LocalDate startDate, LocalDate endDate) { | |||
return getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT); | |||
} | |||
public static List<String> getBetweenDayEn(LocalDate startDate, LocalDate endDate) { | |||
return getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT_EN); | |||
} | |||
public static List<String> getBetweenDay(LocalDate startDate, LocalDate endDate, String pattern) { | |||
if (pattern == null) { | |||
pattern = DEFAULT_DATE_FORMAT; | |||
} | |||
List<String> list = new ArrayList<>(); | |||
long distance = ChronoUnit.DAYS.between(startDate, endDate); | |||
if (distance < 1) { | |||
return list; | |||
} | |||
String finalPattern = pattern; | |||
Stream.iterate(startDate, d -> d.plusDays(1)). | |||
limit(distance + 1) | |||
.forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(finalPattern)))); | |||
return list; | |||
} | |||
/** | |||
* 计算2个日期之间的所有的周 yyyy-ww | |||
* 含头含尾 | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
*/ | |||
public static List<String> getBetweenWeek(Date start, Date end) { | |||
return getBetweenWeek(date2LocalDate(start), date2LocalDate(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的周 yyyy-ww | |||
* 含头含尾 | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
* @return 2个日期之间的所有的周 | |||
*/ | |||
public static List<String> getBetweenWeek(String start, String end) { | |||
return getBetweenWeek(LocalDate.parse(start), LocalDate.parse(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的周 yyyy-ww | |||
* 含头含尾 | |||
* | |||
* @param startDate yyyy-MM-dd | |||
* @param endDate yyyy-MM-dd | |||
* @return 2个日期之间的所有的周 | |||
*/ | |||
public static List<String> getBetweenWeek(LocalDate startDate, LocalDate endDate) { | |||
return getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT); | |||
} | |||
public static List<String> getBetweenWeek(LocalDate startDate, LocalDate endDate, String pattern) { | |||
List<String> list = new ArrayList<>(); | |||
long distance = ChronoUnit.WEEKS.between(startDate, endDate); | |||
if (distance < 1) { | |||
return list; | |||
} | |||
Stream.iterate(startDate, d -> d.plusWeeks(1)). | |||
limit(distance + 1).forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(pattern)))); | |||
return list; | |||
} | |||
/** | |||
* 计算2个日期之间的所有的月 yyyy-MM | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
* @return 2个日期之间的所有的月 | |||
*/ | |||
public static List<String> getBetweenMonth(Date start, Date end) { | |||
return getBetweenMonth(date2LocalDate(start), date2LocalDate(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的月 yyyy-MM | |||
* | |||
* @param start yyyy-MM-dd | |||
* @param end yyyy-MM-dd | |||
* @return 2个日期之间的所有的月 | |||
*/ | |||
public static List<String> getBetweenMonth(String start, String end) { | |||
return getBetweenMonth(LocalDate.parse(start), LocalDate.parse(end)); | |||
} | |||
/** | |||
* 计算2个日期之间的所有的月 yyyy-MM | |||
* | |||
* @param startDate yyyy-MM-dd | |||
* @param endDate yyyy-MM-dd | |||
* @return 2个日期之间的所有的月 | |||
*/ | |||
public static List<String> getBetweenMonth(LocalDate startDate, LocalDate endDate) { | |||
return getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT); | |||
} | |||
public static List<String> getBetweenMonth(LocalDate startDate, LocalDate endDate, String pattern) { | |||
List<String> list = new ArrayList<>(); | |||
long distance = ChronoUnit.MONTHS.between(startDate, endDate); | |||
if (distance < 1) { | |||
return list; | |||
} | |||
Stream.iterate(startDate, d -> d.plusMonths(1)) | |||
.limit(distance + 1) | |||
.forEach(f -> list.add(f.format(DateTimeFormatter.ofPattern(pattern)))); | |||
return list; | |||
} | |||
/** | |||
* 计算时间区间内的日期列表,并返回 | |||
* | |||
* @param startTime 开始 | |||
* @param endTime 结束 | |||
* @param dateList 日期 | |||
* @return 计算时间区间内的日期列表 | |||
*/ | |||
public static String calculationEn(LocalDateTime startTime, LocalDateTime endTime, List<String> dateList) { | |||
if (startTime == null) { | |||
startTime = LocalDateTime.now(); | |||
} | |||
if (endTime == null) { | |||
endTime = LocalDateTime.now().plusDays(30); | |||
} | |||
return calculationEn(startTime.toLocalDate(), endTime.toLocalDate(), dateList); | |||
} | |||
public static String calculation(LocalDate startDate, LocalDate endDate, List<String> dateList) { | |||
if (startDate == null) { | |||
startDate = LocalDate.now(); | |||
} | |||
if (endDate == null) { | |||
endDate = LocalDate.now().plusDays(30); | |||
} | |||
if (dateList == null) { | |||
dateList = new ArrayList<>(); | |||
} | |||
long day = until(startDate, endDate); | |||
String dateType; | |||
if (day >= 0 && day <= MAX_MONTH_DAY) { | |||
dateType = DAY; | |||
dateList.addAll(NdDateUtils.getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT)); | |||
} else if (day > MAX_MONTH_DAY && day <= MAX_3_MONTH_DAY) { | |||
dateType = WEEK; | |||
dateList.addAll(NdDateUtils.getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT)); | |||
} else if (day > MAX_3_MONTH_DAY && day <= MAX_YEAR_DAY) { | |||
dateType = MONTH; | |||
dateList.addAll(NdDateUtils.getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT)); | |||
} else { | |||
throw new BizException("日期参数只能介于0-365天之间"); | |||
} | |||
return dateType; | |||
} | |||
public static String calculationEn(LocalDate startDate, LocalDate endDate, List<String> dateList) { | |||
if (startDate == null) { | |||
startDate = LocalDate.now(); | |||
} | |||
if (endDate == null) { | |||
endDate = LocalDate.now().plusDays(30); | |||
} | |||
if (dateList == null) { | |||
dateList = new ArrayList<>(); | |||
} | |||
long day = until(startDate, endDate); | |||
String dateType; | |||
if (day >= 0 && day <= MAX_MONTH_DAY) { | |||
dateType = DAY; | |||
dateList.addAll(NdDateUtils.getBetweenDay(startDate, endDate, DEFAULT_DATE_FORMAT_EN)); | |||
} else if (day > MAX_MONTH_DAY && day <= MAX_3_MONTH_DAY) { | |||
dateType = WEEK; | |||
dateList.addAll(NdDateUtils.getBetweenWeek(startDate, endDate, DEFAULT_WEEK_FORMAT_EN)); | |||
} else if (day > MAX_3_MONTH_DAY && day <= MAX_YEAR_DAY) { | |||
dateType = MONTH; | |||
dateList.addAll(NdDateUtils.getBetweenMonth(startDate, endDate, DEFAULT_MONTH_FORMAT_EN)); | |||
} else { | |||
throw new BizException("日期参数只能介于0-365天之间"); | |||
} | |||
return dateType; | |||
} | |||
//----------//----------//----------//----------//----------//----------//----------//----------//----------//----------//---------- | |||
/** | |||
* 计算开始时间 | |||
* | |||
* @param time 日期 | |||
* @return 计算开始时间 | |||
*/ | |||
public static LocalDateTime getStartTime(String time) { | |||
String startTime = time; | |||
if (time.matches("^\\d{4}-\\d{1,2}$")) { | |||
startTime = time + "-01 00:00:00"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { | |||
startTime = time + " 00:00:00"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$")) { | |||
startTime = time + ":00"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}Z$")) { | |||
startTime = time.replace("T", " ").substring(0, time.indexOf('.')); | |||
} | |||
return LocalDateTimeUtil.beginOfDay(LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||
} | |||
/** | |||
* 计算结束时间 | |||
* | |||
* @param time 日期 | |||
* @return 结束时间 精确到毫秒 | |||
*/ | |||
public static LocalDateTime getEndTime(String time) { | |||
String startTime = time; | |||
if (time.matches("^\\d{4}-\\d{1,2}$")) { | |||
Date date = NdDateUtils.parse(time, "yyyy-MM"); | |||
date = NdDateUtils.getLastDateOfMonth(date); | |||
startTime = NdDateUtils.formatAsDate(date) + " 23:59:59"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { | |||
startTime = time + " 23:59:59"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$")) { | |||
startTime = time + ":59"; | |||
} else if (time.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}Z$")) { | |||
time = time.replace("T", " ").substring(0, time.indexOf('.')); | |||
startTime = time; | |||
} | |||
return endOfDay(LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||
} | |||
public static LocalDateTime endOfDay(LocalDateTime time) { | |||
return time.with(LocalTime.of(23, 59, 59, 999_999_000)); | |||
} | |||
/** | |||
* 判断当前时间是否在指定时间范围 | |||
* | |||
* @param from 开始时间 | |||
* @param to 结束时间 | |||
* @return 结果 | |||
*/ | |||
public static boolean between(LocalTime from, LocalTime to) { | |||
if (from == null) { | |||
throw new IllegalArgumentException("开始时间不能为空"); | |||
} | |||
if (to == null) { | |||
throw new IllegalArgumentException("结束时间不能为空"); | |||
} | |||
LocalTime now = LocalTime.now(); | |||
return now.isAfter(from) && now.isBefore(to); | |||
} | |||
/** | |||
* 转换日期 | |||
* <p> | |||
* 0: 今天结束的日期 | |||
* 1m: 1分钟后的日期 | |||
* 1h: 1小时后的日期 | |||
* 4d: 4天后的日期 | |||
* 2w: 2周后的日期 | |||
* 3M: 3个月后的日期 | |||
* 5y: 5年后的日期 | |||
* | |||
* @param dateTime 待转换日期 | |||
* @param time 转换格式 如: | |||
* 0 当天23:59:59 | |||
* 1s 1秒后 | |||
* 3m 3分钟后 | |||
* 2w 2周后 | |||
* 1h 1小时后 | |||
* 2H 2小时后 | |||
* 4d 4天后 | |||
* 5M 5月后 | |||
* 6y 6年后 | |||
* @return 日期 | |||
*/ | |||
public static LocalDateTime conversionDateTime(LocalDateTime dateTime, String time) { | |||
if (StrUtil.isEmpty(time)) { | |||
return LocalDateTime.MAX; | |||
} | |||
if (dateTime == null) { | |||
return endOfDay(LocalDateTime.now()); | |||
} | |||
// 今天的23:59:59 | |||
if (StrPool.ZERO.equals(time)) { | |||
return endOfDay(dateTime); | |||
} | |||
char unit = Character.toLowerCase(time.charAt(time.length() - 1)); | |||
if (time.length() == 1) { | |||
unit = 'd'; | |||
} | |||
Long lastTime = Convert.toLong(time.substring(0, time.length() - 1)); | |||
switch (unit) { | |||
//秒 | |||
case 's': | |||
return dateTime.plusSeconds(lastTime); | |||
//分 | |||
case 'm': | |||
return dateTime.plusMinutes(lastTime); | |||
//时 | |||
case 'h' | 'H': | |||
return dateTime.plusHours(lastTime); | |||
//周 | |||
case 'w': | |||
return dateTime.plusWeeks(lastTime); | |||
//月 | |||
case 'M': | |||
return dateTime.plusMonths(lastTime); | |||
//年 | |||
case 'y': | |||
return dateTime.plusYears(lastTime); | |||
//天 | |||
case 'd': | |||
default: | |||
return dateTime.plusDays(lastTime); | |||
} | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import com.fasterxml.jackson.databind.module.SimpleModule; | |||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; | |||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; | |||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; | |||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; | |||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; | |||
import com.ningdatech.kqapi.common.converter.NdLocalDateTimeDeserializer; | |||
import java.time.LocalDate; | |||
import java.time.LocalDateTime; | |||
import java.time.LocalTime; | |||
import java.time.format.DateTimeFormatter; | |||
import static com.ningdatech.kqapi.common.util.NdDateUtils.*; | |||
/** | |||
* jackson 自定义序列化 & 反序列化 规则 | |||
* | |||
* @author WendyYang | |||
*/ | |||
public class NdJacksonModule extends SimpleModule { | |||
public NdJacksonModule() { | |||
super(); | |||
this.addDeserializer(LocalDateTime.class, NdLocalDateTimeDeserializer.INSTANCE); | |||
this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))); | |||
this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); | |||
this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); | |||
this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))); | |||
this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); | |||
} | |||
} |
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.JSONObject; | |||
import lombok.extern.slf4j.Slf4j; | |||
import java.io.IOException; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import java.util.Objects; | |||
@@ -16,7 +17,7 @@ import java.util.Objects; | |||
*/ | |||
@Slf4j | |||
public class RefreshKeyUtil { | |||
public static String getRequestSecret(String appKey, String appSecret,Long requestTime) { | |||
public static String getRequestSecret(String appKey, String appSecret,Long requestTime) throws IOException { | |||
// 刷新秘钥 | |||
HttpUtil httpUtil = HttpUtil.getInstance(); | |||
log.info("请求密钥" + appSecret); | |||
@@ -36,7 +37,7 @@ public class RefreshKeyUtil { | |||
return result; | |||
} | |||
public static String refreshSecret(String appKey, String refreshSecret,Long requestTime) { | |||
public static String refreshSecret(String appKey, String refreshSecret,Long requestTime) throws IOException { | |||
// 刷新秘钥 | |||
HttpUtil httpUtil = HttpUtil.getInstance(); | |||
log.info("刷新密钥" + refreshSecret); | |||
@@ -0,0 +1,95 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
import org.springframework.context.ApplicationContext; | |||
import org.springframework.util.Assert; | |||
import java.util.Map; | |||
/** | |||
* Spring工具类 | |||
* | |||
* @author WendyYang | |||
* @date 2017-12-25 16:27 | |||
*/ | |||
public final class SpringUtils { | |||
private SpringUtils() { | |||
} | |||
/** | |||
* 单例Holder模式: 优点:将懒加载和线程安全完美结合的一种方式(无锁)。(推荐) | |||
* | |||
* @return 实实例 | |||
*/ | |||
public static SpringUtils getInstance() { | |||
return SpringUtilsHolder.INSTANCE; | |||
} | |||
private static ApplicationContext applicationContext; | |||
private static ApplicationContext parentApplicationContext; | |||
public static ApplicationContext getApplicationContext() { | |||
return applicationContext; | |||
} | |||
public static void setApplicationContext(ApplicationContext ctx) { | |||
Assert.notNull(ctx, "SpringUtil injection ApplicationContext is null"); | |||
applicationContext = ctx; | |||
parentApplicationContext = ctx.getParent(); | |||
} | |||
public static Object getBean(String name) { | |||
Assert.hasText(name, "SpringUtil name is null or empty"); | |||
try { | |||
return applicationContext.getBean(name); | |||
} catch (Exception e) { | |||
return parentApplicationContext.getBean(name); | |||
} | |||
} | |||
public static <T> T getBean(String name, Class<T> type) { | |||
Assert.hasText(name, "SpringUtil name is null or empty"); | |||
Assert.notNull(type, "SpringUtil type is null"); | |||
try { | |||
return applicationContext.getBean(name, type); | |||
} catch (Exception e) { | |||
return parentApplicationContext.getBean(name, type); | |||
} | |||
} | |||
public static <T> T getBean(Class<T> type) { | |||
Assert.notNull(type, "SpringUtil type is null"); | |||
try { | |||
return applicationContext.getBean(type); | |||
} catch (Exception e) { | |||
return parentApplicationContext.getBean(type); | |||
} | |||
} | |||
public static <T> Map<String, T> getBeansOfType(Class<T> type) { | |||
Assert.notNull(type, "SpringUtil type is null"); | |||
try { | |||
return applicationContext.getBeansOfType(type); | |||
} catch (Exception e) { | |||
return parentApplicationContext.getBeansOfType(type); | |||
} | |||
} | |||
public static ApplicationContext publishEvent(Object event) { | |||
applicationContext.publishEvent(event); | |||
return applicationContext; | |||
} | |||
/** | |||
* <p> | |||
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 | |||
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 | |||
*/ | |||
private static class SpringUtilsHolder { | |||
/** | |||
* 静态初始化器,由JVM来保证线程安全 | |||
*/ | |||
private static final SpringUtils INSTANCE = new SpringUtils(); | |||
} | |||
} |
@@ -0,0 +1,148 @@ | |||
package com.ningdatech.kqapi.common.util; | |||
/** | |||
* <p> | |||
* 常用字符串 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @date 2019/07/25 | |||
*/ | |||
public interface StrPool { | |||
String AMPERSAND = "&"; | |||
String AND = "and"; | |||
String AT = "@"; | |||
String ASTERISK = "*"; | |||
String STAR = "*"; | |||
String BACK_SLASH = "\\"; | |||
String COLON = ":"; | |||
String COMMA = ","; | |||
String DASH = "-"; | |||
String DOLLAR = "$"; | |||
String DOT = "."; | |||
String DOTDOT = ".."; | |||
String DOT_CLASS = ".class"; | |||
String DOT_JAVA = ".java"; | |||
String DOT_XML = ".xml"; | |||
String EMPTY = ""; | |||
String EQUALS = "="; | |||
String FALSE = "false"; | |||
String SLASH = "/"; | |||
String HASH = "#"; | |||
String HAT = "^"; | |||
String LEFT_BRACE = "{"; | |||
String BRACE = "{}"; | |||
String LEFT_BRACKET = "("; | |||
char LEFT_BRACKET_CHAR = '('; | |||
String LEFT_CHEV = "<"; | |||
String NEWLINE = "\n"; | |||
String N = "n"; | |||
String NO = "no"; | |||
String NULL = "null"; | |||
String OFF = "off"; | |||
String ON = "on"; | |||
String PERCENT = "%"; | |||
String PIPE = "|"; | |||
String PLUS = "+"; | |||
String QUESTION_MARK = "?"; | |||
String EXCLAMATION_MARK = "!"; | |||
String QUOTE = "\""; | |||
String RETURN = "\r"; | |||
String TAB = "\t"; | |||
String RIGHT_BRACE = "}"; | |||
String RIGHT_BRACKET = ")"; | |||
String RIGHT_CHEV = ">"; | |||
String SEMICOLON = ";"; | |||
String SEMICOLON_CHINA = ";"; | |||
String SINGLE_QUOTE = "'"; | |||
String BACKTICK = "`"; | |||
String SPACE = " "; | |||
String TILDA = "~"; | |||
String LEFT_SQ_BRACKET = "["; | |||
String RIGHT_SQ_BRACKET = "]"; | |||
String TRUE = "true"; | |||
String UNDERSCORE = "_"; | |||
String UTF_8 = "UTF-8"; | |||
String GBK = "GBK"; | |||
String US_ASCII = "US-ASCII"; | |||
String ISO_8859_1 = "ISO-8859-1"; | |||
String Y = "y"; | |||
String YES = "yes"; | |||
String ONE = "1"; | |||
String ZERO = "0"; | |||
String DOLLAR_LEFT_BRACE = "${"; | |||
String HASH_LEFT_BRACE = "#{"; | |||
String CRLF = "\r\n"; | |||
String HTML_NBSP = " "; | |||
String HTML_AMP = "&"; | |||
String HTML_QUOTE = """; | |||
String HTML_LT = "<"; | |||
String HTML_GT = ">"; | |||
String STRING_TYPE_NAME = "java.lang.String"; | |||
String LONG_TYPE_NAME = "java.lang.Long"; | |||
String BYTE_TYPE_NAME = "java.lang.Byte"; | |||
String CHARACTER_TYPE_NAME = "java.lang.Character"; | |||
String INTEGER_TYPE_NAME = "java.lang.Integer"; | |||
String SHORT_TYPE_NAME = "java.lang.Short"; | |||
String DOUBLE_TYPE_NAME = "java.lang.Double"; | |||
String FLOAT_TYPE_NAME = "java.lang.Float"; | |||
String BOOLEAN_TYPE_NAME = "java.lang.Boolean"; | |||
String SET_TYPE_NAME = "java.util.Set"; | |||
String LIST_TYPE_NAME = "java.util.List"; | |||
String COLLECTION_TYPE_NAME = "java.util.Collection"; | |||
String DATE_TYPE_NAME = "java.util.Date"; | |||
String LOCAL_DATE_TIME_TYPE_NAME = "java.time.LocalDateTime"; | |||
String LOCAL_DATE_TYPE_NAME = "java.time.LocalDate"; | |||
String LOCAL_TIME_TYPE_NAME = "java.time.LocalTime"; | |||
String JAVA_TEMP_DIR = "java.io.tmpdir"; | |||
String ARRAY = "Array"; | |||
String INTEGER = "Integer"; | |||
String FLOAT = "Float"; | |||
String DATETIME = "DateTime"; | |||
String DATE = "Date"; | |||
String TIME = "Time"; | |||
String BOOLEAN = "Boolean"; | |||
String HTTPS_PREFIX = "https://"; | |||
String HTTP_PREFIX = "http://"; | |||
String HTTPS = "https"; | |||
String HTTP = "http"; | |||
/** | |||
* 编码 | |||
*/ | |||
String UTF8 = "UTF-8"; | |||
/** | |||
* JSON 资源 | |||
*/ | |||
String CONTENT_TYPE = "application/json; charset=utf-8"; | |||
/** | |||
* 用于随机选的字符 | |||
*/ | |||
String BASE_UPPER_CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |||
String TEST_TOKEN = "Bearer test"; | |||
String TEST = "test"; | |||
String PROD = "prod"; | |||
String DEV = "dev"; | |||
/** | |||
* 默认的父id | |||
*/ | |||
Long DEF_PARENT_ID = 0L; | |||
String UNKNOWN = "unknown"; | |||
/** | |||
* 日期 个位数前面补0 | |||
*/ | |||
String FORMAT_DATE_SINGLE_DIGITS = "%02d"; | |||
/** | |||
* 不足三位的数字前面补0 | |||
*/ | |||
String FORMAT_NUMBER_THREE = "%03d"; | |||
} |
@@ -0,0 +1,40 @@ | |||
package com.ningdatech.kqapi.open.controller; | |||
import com.alibaba.fastjson.JSONObject; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.jasypt.util.text.BasicTextEncryptor; | |||
import org.springframework.validation.annotation.Validated; | |||
import org.springframework.web.bind.annotation.*; | |||
import java.time.LocalDateTime; | |||
import java.time.format.DateTimeFormatter; | |||
/** | |||
* <p> | |||
* 前端控制器 | |||
* </p> | |||
* | |||
* @author ZPF | |||
* @since 2023-10-27 | |||
*/ | |||
@Slf4j | |||
@Validated | |||
@RestController | |||
@RequestMapping | |||
@RequiredArgsConstructor | |||
public class HealthController { | |||
@GetMapping("/health") | |||
public JSONObject health() { | |||
JSONObject json = new JSONObject(); | |||
json.put("code","200"); | |||
json.put("area","柯桥区"); | |||
json.put("chargePerson","李*"); | |||
json.put("appName","企业线上平台"); | |||
json.put("mobile","156*****306"); | |||
json.put("time",LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); | |||
json.put("dept","产业发展科"); | |||
return json; | |||
} | |||
} |
@@ -5,23 +5,17 @@ import com.ningdatech.kqapi.scheduler.manage.SynManage; | |||
import com.ningdatech.kqapi.scheduler.task.CheckMattersUrlTask; | |||
import com.ningdatech.kqapi.scheduler.task.RemoveMattersTask; | |||
import com.ningdatech.kqapi.scheduler.task.SynTask; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.validation.annotation.Validated; | |||
import org.springframework.web.bind.annotation.GetMapping; | |||
import org.springframework.web.bind.annotation.PostMapping; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import java.net.MalformedURLException; | |||
import java.net.UnknownHostException; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
@@ -1,29 +1,35 @@ | |||
package com.ningdatech.kqapi.scheduler.task; | |||
import cn.hutool.core.date.StopWatch; | |||
import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.JSONObject; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.google.common.collect.Lists; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.kqapi.common.model.entity.Item; | |||
import com.ningdatech.kqapi.common.util.HttpUtil; | |||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMenuService; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.http.conn.ssl.NoopHostnameVerifier; | |||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; | |||
import org.apache.http.conn.ssl.TrustStrategy; | |||
import org.apache.http.impl.client.CloseableHttpClient; | |||
import org.apache.http.impl.client.HttpClientBuilder; | |||
import org.apache.http.impl.client.HttpClients; | |||
import org.apache.http.ssl.SSLContexts; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.beans.factory.annotation.Value; | |||
import org.springframework.http.HttpEntity; | |||
import org.springframework.http.HttpHeaders; | |||
import org.springframework.http.MediaType; | |||
import org.springframework.http.ResponseEntity; | |||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||
import org.springframework.scheduling.annotation.Scheduled; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.util.LinkedMultiValueMap; | |||
import org.springframework.util.MultiValueMap; | |||
import org.springframework.web.client.RestTemplate; | |||
import javax.net.ssl.SSLContext; | |||
import java.io.BufferedReader; | |||
import java.io.IOException; | |||
import java.io.InputStreamReader; | |||
@@ -77,7 +83,7 @@ public class CheckMattersUrlTask { | |||
List<String> errUrls = Lists.newArrayList(); | |||
for (NdKqZzsfwMenu menu : menus) { | |||
RestTemplate restTemplate = new RestTemplate(HttpUtil.generateHttpRequestFactory()); | |||
RestTemplate restTemplate = new RestTemplate(generateHttpRequestFactory()); | |||
String url = "https://www.zjzwfw.gov.cn/jpaas-zjservice-server/open-api/item/getItemDetail"; | |||
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); | |||
@@ -93,6 +99,7 @@ public class CheckMattersUrlTask { | |||
ResponseEntity<Item> response = restTemplate.postForEntity(url, formEntity, Item.class); | |||
System.out.println(response.getBody()); | |||
Item body = response.getBody(); | |||
assert body != null; | |||
Item.ItemData itemData = body.getData(); | |||
//如果是空的 | |||
if(Objects.isNull(itemData.getItem())){ | |||
@@ -137,4 +144,26 @@ public class CheckMattersUrlTask { | |||
} | |||
return queryPairs; | |||
} | |||
/** | |||
* 通过该工厂类创建的RestTemplate发送请求时,可忽略https证书认证 | |||
* @return 工厂 | |||
*/ | |||
public static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory(){ | |||
try{ | |||
TrustStrategy acceptingTrustStrategy = ((x509Certificates, authType) -> true); | |||
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build(); | |||
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()); | |||
HttpClientBuilder httpClientBuilder = HttpClients.custom(); | |||
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory); | |||
CloseableHttpClient httpClient = httpClientBuilder.build(); | |||
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); | |||
factory.setHttpClient(httpClient); | |||
return factory; | |||
}catch (Exception e){ | |||
e.printStackTrace(); | |||
} | |||
return null; | |||
} | |||
} |
@@ -2,10 +2,7 @@ package com.ningdatech.kqapi.zzsfw.controller; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.DscSxAdsShareItemQltQlsxCommonIDVKqDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||
import com.ningdatech.kqapi.zzsfw.manage.QlManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.validation.annotation.Validated; | |||
@@ -28,13 +25,11 @@ import java.util.List; | |||
@Validated | |||
@RestController | |||
@RequestMapping("/api/v1/zzsfw/") | |||
@Api(value = "DscSxAdsShareItemQltQlsxCommonIDVKqController", tags = "柯桥-政务数据") | |||
@RequiredArgsConstructor | |||
public class DscSxAdsShareItemQltQlsxCommonIDVKqController { | |||
private final QlManage qlManage; | |||
@ApiOperation(value = "获取政务事项数据列表", notes = "获取政务事项数据列表") | |||
@GetMapping("/search") | |||
public List<DscSxAdsShareItemQltQlsxCommonIDVKq> search(@ModelAttribute DscSxAdsShareItemQltQlsxCommonIDVKqDTO dto) { | |||
return qlManage.search(dto); | |||
@@ -1,42 +0,0 @@ | |||
package com.ningdatech.kqapi.zzsfw.controller; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.validation.annotation.Validated; | |||
import org.springframework.web.bind.annotation.*; | |||
import java.time.LocalDateTime; | |||
import java.time.format.DateTimeFormatter; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 前端控制器 | |||
* </p> | |||
* | |||
* @author ZPF | |||
* @since 2023-10-27 | |||
*/ | |||
@Slf4j | |||
@Validated | |||
@RestController | |||
@RequestMapping | |||
@Api(value = "NdKqZzsfwMenuController", tags = "柯桥-政务数据") | |||
@RequiredArgsConstructor | |||
public class HealthController { | |||
private final MatterManage matterManage; | |||
@ApiOperation(value = "健康检测", notes = "健康检测") | |||
@GetMapping("/health") | |||
public String health() { | |||
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); | |||
} | |||
} |
@@ -1,15 +1,10 @@ | |||
package com.ningdatech.kqapi.zzsfw.controller; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.MattersVO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | |||
import com.ningdatech.kqapi.zzsfw.manage.MatterManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.validation.annotation.Validated; | |||
@@ -29,42 +24,35 @@ import java.util.List; | |||
@Validated | |||
@RestController | |||
@RequestMapping("/api/v1/zzsfw/") | |||
@Api(value = "NdKqZzsfwMenuController", tags = "柯桥-政务数据") | |||
@RequiredArgsConstructor | |||
public class NdKqZzsfwMenuController { | |||
private final MatterManage matterManage; | |||
@ApiOperation(value = "获取政务事项数据列表", notes = "获取政务事项数据列表") | |||
@GetMapping("/matters") | |||
public List<TreeVO> getMatters() { | |||
return matterManage.getMatters(); | |||
} | |||
@ApiOperation(value = "top10事项", notes = "top10事项") | |||
@GetMapping("/top10") | |||
public List<MatterTopVO> topTen() { | |||
return matterManage.topTen(); | |||
} | |||
@ApiOperation(value = "政务事项数据保存", notes = "政务事项数据保存") | |||
@PostMapping("/save") | |||
public String save(@RequestBody NdKqZzsfwMenuDTO dto) { | |||
return matterManage.save(dto); | |||
} | |||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||
@GetMapping("/remove-all") | |||
public String removeAll() { | |||
return matterManage.removeAll(); | |||
} | |||
@ApiOperation(value = "政务事项去重保存", notes = "政务事项去重保存") | |||
@PostMapping("/save-dup") | |||
public String saveDup(@RequestBody NdKqZzsfwMattersDeduplicateDTO dto) { | |||
return matterManage.saveDup(dto); | |||
} | |||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||
@GetMapping("/remove-all-dup") | |||
public String removeAllDup() { | |||
return matterManage.removeAllDup(); | |||
@@ -1,11 +1,9 @@ | |||
package com.ningdatech.kqapi.zzsfw.controller; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.kqapi.common.model.PageVo; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | |||
import com.ningdatech.kqapi.zzsfw.manage.PolicyManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.validation.annotation.Validated; | |||
@@ -23,24 +21,20 @@ import java.util.List; | |||
@Validated | |||
@RestController | |||
@RequestMapping("/api/v1/poclicy/") | |||
@Api(value = "PolicyRegulationsController", tags = "柯桥-政策条例") | |||
@RequiredArgsConstructor | |||
public class PolicyRegulationsController { | |||
private final PolicyManage policyManage; | |||
@ApiOperation(value = "政策条例分页列表", notes = "政策条例分页列表") | |||
@GetMapping("/list") | |||
public PageVo<NdKqZzsfwPolicyVO> list(@RequestParam(defaultValue = "1") long pageNumber, @RequestParam(defaultValue = "10") long pageSize) { | |||
return policyManage.list(pageNumber,pageSize); | |||
} | |||
@ApiOperation(value = "政策条例保存", notes = "政策条例保存") | |||
@PostMapping("/save") | |||
public String save(@RequestBody NdKqZzsfwPolicyDTO dto) { | |||
return policyManage.save(dto); | |||
} | |||
@ApiOperation(value = "政策条例保存", notes = "政策条例保存") | |||
@PostMapping("/save-batch") | |||
public String saveBatch(@RequestBody List<NdKqZzsfwPolicyDTO> dtos) { | |||
@@ -48,7 +42,6 @@ public class PolicyRegulationsController { | |||
} | |||
@ApiOperation(value = "政务事项数据清空", notes = "政务事项数据清空") | |||
@GetMapping("/remove-all") | |||
public String removeAll() { | |||
return policyManage.removeAll(); | |||
@@ -1,6 +1,5 @@ | |||
package com.ningdatech.kqapi.zzsfw.entity.dto; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@@ -16,7 +15,6 @@ import java.time.LocalDateTime; | |||
* @since 2023-10-25 | |||
*/ | |||
@Data | |||
@ApiModel(value = "DscSxAdsShareItemQltQlsxCommonIDVKqDTO", description = "省回流_政务服务_数据共享_事项基本信息表") | |||
public class DscSxAdsShareItemQltQlsxCommonIDVKqDTO implements Serializable { | |||
private static final long serialVersionUID = 1L; | |||
@@ -4,9 +4,8 @@ import cn.hutool.core.bean.BeanUtil; | |||
import cn.hutool.core.collection.CollUtil; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.kqapi.common.model.PageVo; | |||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwPolicyDTO; | |||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | |||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwPolicy; | |||
import com.ningdatech.kqapi.zzsfw.entity.vo.NdKqZzsfwPolicyVO; | |||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwPolicyService; | |||
@@ -43,9 +43,9 @@ spring: | |||
datasource: | |||
type: com.zaxxer.hikari.HikariDataSource | |||
driver-class-name: com.mysql.cj.jdbc.Driver | |||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||
url: ENC(aMGW3+FFqxyutRz9liYjAg+A72b6IQ7/ygtxO0DmQJ/LLFZkx8r4MhN8quv9L62nQ4sH55qFg+LnQoor/t8IqBACrbfNg462YNKnRyMsBmdHHxJm7i57flIQfePLDW93Omz4LZ2PbRZTvPcLLYtnQyxXSDPwDnjexHNVXTdxwuTJPBqthsVpvyA2mnn5Szef) | |||
username: root | |||
password: NingdaKeji123! | |||
password: ENC(NHFdgnNk7opRJpNnZOJs51OTXb72zU//) | |||
# 数据源 | |||
hikari: | |||
# 是客户端等待连接池连接的最大毫秒数 | |||
@@ -120,4 +120,12 @@ swagger: | |||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||
jasypt: | |||
encryptor: | |||
password: CodeSheep | |||
# 指定解密算法,需要和加密时使用的算法一致 | |||
algorithm: PBEWithMD5AndDES | |||
# 指定initialization vector类型 | |||
iv-generator-classname: org.jasypt.iv.NoIvGenerator | |||
@@ -43,7 +43,7 @@ spring: | |||
datasource: | |||
type: com.zaxxer.hikari.HikariDataSource | |||
driver-class-name: com.mysql.cj.jdbc.Driver | |||
url: jdbc:mysql://47.98.125.47:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||
url: ENC(aMGW3+FFqxyutRz9liYjAg+A72b6IQ7/ygtxO0DmQJ/LLFZkx8r4MhN8quv9L62nQ4sH55qFg+LnQoor/t8IqBACrbfNg462YNKnRyMsBmdHHxJm7i57flIQfePLDW93Omz4LZ2PbRZTvPcLLYtnQyxXSDPwDnjexHNVXTdxwuTJPBqthsVpvyA2mnn5Szef) | |||
username: root | |||
password: NingdaKeji123! | |||
# 数据源 | |||
@@ -118,4 +118,11 @@ log: | |||
swagger: | |||
enabled: true | |||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||
jasypt: | |||
encryptor: | |||
password: CodeSheep | |||
algorithm: PBEWithMD5AndDES | |||
# 指定initialization vector类型 | |||
iv-generator-classname: org.jasypt.iv.NoIvGenerator |
@@ -43,9 +43,10 @@ spring: | |||
datasource: | |||
type: com.zaxxer.hikari.HikariDataSource | |||
driver-class-name: com.mysql.cj.jdbc.Driver | |||
url: jdbc:mysql://10.42.248.27:3306/kqzzsfw?serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false | |||
url: ENC(gtE4OUrpgtFsh6B3aLiSp2sVSX1BYDET9Uii/wRP2RboRK0NDaYu1S7Vx30cHXFE7vecQzY1UbrSFW/BaWJvQ3XJxfDiaUxdrIDND5e+DMTjx1pUkfS8/RbXHQDE+QoOVZV1UKEtdq+khr32tlQXqkTnzmZGuZjctVmjdQxUnmI2YNpoeNlIAkDXiaCvcVYc) | |||
username: root | |||
password: Nd@20231116 | |||
# 数据源 | |||
hikari: | |||
# 是客户端等待连接池连接的最大毫秒数 | |||
@@ -120,4 +121,11 @@ swagger: | |||
hostname: iZut201mqskxt0mwme4tjfZ | |||
jasypt: | |||
encryptor: | |||
password: CodeSheep | |||
algorithm: PBEWithMD5AndDES | |||
# 指定initialization vector类型 | |||
iv-generator-classname: org.jasypt.iv.NoIvGenerator | |||
@@ -1,741 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |||
<?mso-application progid="Word.Document"?> | |||
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" | |||
xmlns:w10="urn:schemas-microsoft-com:office:word" | |||
xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" | |||
xmlns:aml="http://schemas.microsoft.com/aml/2001/core" | |||
xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" | |||
xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" | |||
w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve" | |||
xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData"> | |||
<w:fonts> | |||
<w:defaultFonts w:ascii="Arial" w:fareast="Arial" w:h-ansi="Arial" w:cs="Arial"/> | |||
<w:font w:name="Times New Roman"> | |||
<w:panose-1 w:val="02020603050405020304"/> | |||
<w:charset w:val="00"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="宋体"> | |||
<w:altName w:val="汉仪书宋二KW"/> | |||
<w:panose-1 w:val="00000000000000000000"/> | |||
<w:charset w:val="86"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Wingdings"> | |||
<w:panose-1 w:val="05000000000000000000"/> | |||
<w:charset w:val="02"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Arial"> | |||
<w:panose-1 w:val="020B0604020202020204"/> | |||
<w:charset w:val="01"/> | |||
<w:family w:val="SWiss"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="黑体"> | |||
<w:altName w:val="汉仪中黑KW"/> | |||
<w:panose-1 w:val="02010609060101010101"/> | |||
<w:charset w:val="86"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="800002BF" w:usb-1="38CF7CFA" w:usb-2="00000016" w:usb-3="00000000" w:csb-0="00040001" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Courier New"> | |||
<w:panose-1 w:val="02070309020205020404"/> | |||
<w:charset w:val="01"/> | |||
<w:family w:val="Modern"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Symbol"> | |||
<w:altName w:val="Kingsoft Sign"/> | |||
<w:panose-1 w:val="05050102010706020507"/> | |||
<w:charset w:val="02"/> | |||
<w:family w:val="Roman"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Calibri"> | |||
<w:altName w:val="Helvetica Neue"/> | |||
<w:panose-1 w:val="020F0502020204030204"/> | |||
<w:charset w:val="00"/> | |||
<w:family w:val="SWiss"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000001" w:usb-3="00000000" w:csb-0="0000019F" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Helvetica Neue"> | |||
<w:panose-1 w:val="02000503000000020004"/> | |||
<w:charset w:val="00"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="汉仪书宋二KW"> | |||
<w:panose-1 w:val="00020600040101010101"/> | |||
<w:charset w:val="86"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00160000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="微软雅黑"> | |||
<w:altName w:val="汉仪旗黑"/> | |||
<w:panose-1 w:val="00000000000000000000"/> | |||
<w:charset w:val="00"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="汉仪旗黑"> | |||
<w:panose-1 w:val="00020600040101010101"/> | |||
<w:charset w:val="86"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00060000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="汉仪中黑KW"> | |||
<w:panose-1 w:val="00020600040101010101"/> | |||
<w:charset w:val="86"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00160000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
<w:font w:name="Kingsoft Sign"> | |||
<w:panose-1 w:val="05050102010706020507"/> | |||
<w:charset w:val="00"/> | |||
<w:family w:val="Auto"/> | |||
<w:pitch w:val="Default"/> | |||
<w:sig w:usb-0="00000000" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000000" | |||
w:csb-1="00000000"/> | |||
</w:font> | |||
</w:fonts> | |||
<w:styles> | |||
<w:latentStyles w:defLockedState="off" w:latentStyleCount="260"> | |||
<w:lsdException w:name="Normal"/> | |||
<w:lsdException w:name="heading 1"/> | |||
<w:lsdException w:name="heading 2"/> | |||
<w:lsdException w:name="heading 3"/> | |||
<w:lsdException w:name="heading 4"/> | |||
<w:lsdException w:name="heading 5"/> | |||
<w:lsdException w:name="heading 6"/> | |||
<w:lsdException w:name="heading 7"/> | |||
<w:lsdException w:name="heading 8"/> | |||
<w:lsdException w:name="heading 9"/> | |||
<w:lsdException w:name="index 1"/> | |||
<w:lsdException w:name="index 2"/> | |||
<w:lsdException w:name="index 3"/> | |||
<w:lsdException w:name="index 4"/> | |||
<w:lsdException w:name="index 5"/> | |||
<w:lsdException w:name="index 6"/> | |||
<w:lsdException w:name="index 7"/> | |||
<w:lsdException w:name="index 8"/> | |||
<w:lsdException w:name="index 9"/> | |||
<w:lsdException w:name="toc 1"/> | |||
<w:lsdException w:name="toc 2"/> | |||
<w:lsdException w:name="toc 3"/> | |||
<w:lsdException w:name="toc 4"/> | |||
<w:lsdException w:name="toc 5"/> | |||
<w:lsdException w:name="toc 6"/> | |||
<w:lsdException w:name="toc 7"/> | |||
<w:lsdException w:name="toc 8"/> | |||
<w:lsdException w:name="toc 9"/> | |||
<w:lsdException w:name="Normal Indent"/> | |||
<w:lsdException w:name="footnote text"/> | |||
<w:lsdException w:name="annotation text"/> | |||
<w:lsdException w:name="header"/> | |||
<w:lsdException w:name="footer"/> | |||
<w:lsdException w:name="index heading"/> | |||
<w:lsdException w:name="caption"/> | |||
<w:lsdException w:name="table of figures"/> | |||
<w:lsdException w:name="envelope address"/> | |||
<w:lsdException w:name="envelope return"/> | |||
<w:lsdException w:name="footnote reference"/> | |||
<w:lsdException w:name="annotation reference"/> | |||
<w:lsdException w:name="line number"/> | |||
<w:lsdException w:name="page number"/> | |||
<w:lsdException w:name="endnote reference"/> | |||
<w:lsdException w:name="endnote text"/> | |||
<w:lsdException w:name="table of authorities"/> | |||
<w:lsdException w:name="macro"/> | |||
<w:lsdException w:name="toa heading"/> | |||
<w:lsdException w:name="List"/> | |||
<w:lsdException w:name="List Bullet"/> | |||
<w:lsdException w:name="List Number"/> | |||
<w:lsdException w:name="List 2"/> | |||
<w:lsdException w:name="List 3"/> | |||
<w:lsdException w:name="List 4"/> | |||
<w:lsdException w:name="List 5"/> | |||
<w:lsdException w:name="List Bullet 2"/> | |||
<w:lsdException w:name="List Bullet 3"/> | |||
<w:lsdException w:name="List Bullet 4"/> | |||
<w:lsdException w:name="List Bullet 5"/> | |||
<w:lsdException w:name="List Number 2"/> | |||
<w:lsdException w:name="List Number 3"/> | |||
<w:lsdException w:name="List Number 4"/> | |||
<w:lsdException w:name="List Number 5"/> | |||
<w:lsdException w:name="Title"/> | |||
<w:lsdException w:name="Closing"/> | |||
<w:lsdException w:name="Signature"/> | |||
<w:lsdException w:name="Default Paragraph Font"/> | |||
<w:lsdException w:name="Body Text"/> | |||
<w:lsdException w:name="Body Text Indent"/> | |||
<w:lsdException w:name="List Continue"/> | |||
<w:lsdException w:name="List Continue 2"/> | |||
<w:lsdException w:name="List Continue 3"/> | |||
<w:lsdException w:name="List Continue 4"/> | |||
<w:lsdException w:name="List Continue 5"/> | |||
<w:lsdException w:name="Message Header"/> | |||
<w:lsdException w:name="Subtitle"/> | |||
<w:lsdException w:name="Salutation"/> | |||
<w:lsdException w:name="Date"/> | |||
<w:lsdException w:name="Body Text First Indent"/> | |||
<w:lsdException w:name="Body Text First Indent 2"/> | |||
<w:lsdException w:name="Note Heading"/> | |||
<w:lsdException w:name="Body Text 2"/> | |||
<w:lsdException w:name="Body Text 3"/> | |||
<w:lsdException w:name="Body Text Indent 2"/> | |||
<w:lsdException w:name="Body Text Indent 3"/> | |||
<w:lsdException w:name="Block Text"/> | |||
<w:lsdException w:name="Hyperlink"/> | |||
<w:lsdException w:name="FollowedHyperlink"/> | |||
<w:lsdException w:name="Strong"/> | |||
<w:lsdException w:name="Emphasis"/> | |||
<w:lsdException w:name="Document Map"/> | |||
<w:lsdException w:name="Plain Text"/> | |||
<w:lsdException w:name="E-mail Signature"/> | |||
<w:lsdException w:name="Normal (Web)"/> | |||
<w:lsdException w:name="HTML Acronym"/> | |||
<w:lsdException w:name="HTML Address"/> | |||
<w:lsdException w:name="HTML Cite"/> | |||
<w:lsdException w:name="HTML Code"/> | |||
<w:lsdException w:name="HTML Definition"/> | |||
<w:lsdException w:name="HTML Keyboard"/> | |||
<w:lsdException w:name="HTML Preformatted"/> | |||
<w:lsdException w:name="HTML Sample"/> | |||
<w:lsdException w:name="HTML Typewriter"/> | |||
<w:lsdException w:name="HTML Variable"/> | |||
<w:lsdException w:name="Normal Table"/> | |||
<w:lsdException w:name="annotation subject"/> | |||
<w:lsdException w:name="Table Simple 1"/> | |||
<w:lsdException w:name="Table Simple 2"/> | |||
<w:lsdException w:name="Table Simple 3"/> | |||
<w:lsdException w:name="Table Classic 1"/> | |||
<w:lsdException w:name="Table Classic 2"/> | |||
<w:lsdException w:name="Table Classic 3"/> | |||
<w:lsdException w:name="Table Classic 4"/> | |||
<w:lsdException w:name="Table Colorful 1"/> | |||
<w:lsdException w:name="Table Colorful 2"/> | |||
<w:lsdException w:name="Table Colorful 3"/> | |||
<w:lsdException w:name="Table Columns 1"/> | |||
<w:lsdException w:name="Table Columns 2"/> | |||
<w:lsdException w:name="Table Columns 3"/> | |||
<w:lsdException w:name="Table Columns 4"/> | |||
<w:lsdException w:name="Table Columns 5"/> | |||
<w:lsdException w:name="Table Grid 1"/> | |||
<w:lsdException w:name="Table Grid 2"/> | |||
<w:lsdException w:name="Table Grid 3"/> | |||
<w:lsdException w:name="Table Grid 4"/> | |||
<w:lsdException w:name="Table Grid 5"/> | |||
<w:lsdException w:name="Table Grid 6"/> | |||
<w:lsdException w:name="Table Grid 7"/> | |||
<w:lsdException w:name="Table Grid 8"/> | |||
<w:lsdException w:name="Table List 1"/> | |||
<w:lsdException w:name="Table List 2"/> | |||
<w:lsdException w:name="Table List 3"/> | |||
<w:lsdException w:name="Table List 4"/> | |||
<w:lsdException w:name="Table List 5"/> | |||
<w:lsdException w:name="Table List 6"/> | |||
<w:lsdException w:name="Table List 7"/> | |||
<w:lsdException w:name="Table List 8"/> | |||
<w:lsdException w:name="Table 3D effects 1"/> | |||
<w:lsdException w:name="Table 3D effects 2"/> | |||
<w:lsdException w:name="Table 3D effects 3"/> | |||
<w:lsdException w:name="Table Contemporary"/> | |||
<w:lsdException w:name="Table Elegant"/> | |||
<w:lsdException w:name="Table Professional"/> | |||
<w:lsdException w:name="Table Subtle 1"/> | |||
<w:lsdException w:name="Table Subtle 2"/> | |||
<w:lsdException w:name="Table Web 1"/> | |||
<w:lsdException w:name="Table Web 2"/> | |||
<w:lsdException w:name="Table Web 3"/> | |||
<w:lsdException w:name="Balloon Text"/> | |||
<w:lsdException w:name="Table Grid"/> | |||
<w:lsdException w:name="Table Theme"/> | |||
<w:lsdException w:name="Light Shading"/> | |||
<w:lsdException w:name="Light List"/> | |||
<w:lsdException w:name="Light Grid"/> | |||
<w:lsdException w:name="Medium Shading 1"/> | |||
<w:lsdException w:name="Medium Shading 2"/> | |||
<w:lsdException w:name="Medium List 1"/> | |||
<w:lsdException w:name="Medium List 2"/> | |||
<w:lsdException w:name="Medium Grid 1"/> | |||
<w:lsdException w:name="Medium Grid 2"/> | |||
<w:lsdException w:name="Medium Grid 3"/> | |||
<w:lsdException w:name="Dark List"/> | |||
<w:lsdException w:name="Colorful Shading"/> | |||
<w:lsdException w:name="Colorful List"/> | |||
<w:lsdException w:name="Colorful Grid"/> | |||
<w:lsdException w:name="Light Shading Accent 1"/> | |||
<w:lsdException w:name="Light List Accent 1"/> | |||
<w:lsdException w:name="Light Grid Accent 1"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 1"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 1"/> | |||
<w:lsdException w:name="Medium List 1 Accent 1"/> | |||
<w:lsdException w:name="Medium List 2 Accent 1"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 1"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 1"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 1"/> | |||
<w:lsdException w:name="Dark List Accent 1"/> | |||
<w:lsdException w:name="Colorful Shading Accent 1"/> | |||
<w:lsdException w:name="Colorful List Accent 1"/> | |||
<w:lsdException w:name="Colorful Grid Accent 1"/> | |||
<w:lsdException w:name="Light Shading Accent 2"/> | |||
<w:lsdException w:name="Light List Accent 2"/> | |||
<w:lsdException w:name="Light Grid Accent 2"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 2"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 2"/> | |||
<w:lsdException w:name="Medium List 1 Accent 2"/> | |||
<w:lsdException w:name="Medium List 2 Accent 2"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 2"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 2"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 2"/> | |||
<w:lsdException w:name="Dark List Accent 2"/> | |||
<w:lsdException w:name="Colorful Shading Accent 2"/> | |||
<w:lsdException w:name="Colorful List Accent 2"/> | |||
<w:lsdException w:name="Colorful Grid Accent 2"/> | |||
<w:lsdException w:name="Light Shading Accent 3"/> | |||
<w:lsdException w:name="Light List Accent 3"/> | |||
<w:lsdException w:name="Light Grid Accent 3"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 3"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 3"/> | |||
<w:lsdException w:name="Medium List 1 Accent 3"/> | |||
<w:lsdException w:name="Medium List 2 Accent 3"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 3"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 3"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 3"/> | |||
<w:lsdException w:name="Dark List Accent 3"/> | |||
<w:lsdException w:name="Colorful Shading Accent 3"/> | |||
<w:lsdException w:name="Colorful List Accent 3"/> | |||
<w:lsdException w:name="Colorful Grid Accent 3"/> | |||
<w:lsdException w:name="Light Shading Accent 4"/> | |||
<w:lsdException w:name="Light List Accent 4"/> | |||
<w:lsdException w:name="Light Grid Accent 4"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 4"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 4"/> | |||
<w:lsdException w:name="Medium List 1 Accent 4"/> | |||
<w:lsdException w:name="Medium List 2 Accent 4"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 4"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 4"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 4"/> | |||
<w:lsdException w:name="Dark List Accent 4"/> | |||
<w:lsdException w:name="Colorful Shading Accent 4"/> | |||
<w:lsdException w:name="Colorful List Accent 4"/> | |||
<w:lsdException w:name="Colorful Grid Accent 4"/> | |||
<w:lsdException w:name="Light Shading Accent 5"/> | |||
<w:lsdException w:name="Light List Accent 5"/> | |||
<w:lsdException w:name="Light Grid Accent 5"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 5"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 5"/> | |||
<w:lsdException w:name="Medium List 1 Accent 5"/> | |||
<w:lsdException w:name="Medium List 2 Accent 5"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 5"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 5"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 5"/> | |||
<w:lsdException w:name="Dark List Accent 5"/> | |||
<w:lsdException w:name="Colorful Shading Accent 5"/> | |||
<w:lsdException w:name="Colorful List Accent 5"/> | |||
<w:lsdException w:name="Colorful Grid Accent 5"/> | |||
<w:lsdException w:name="Light Shading Accent 6"/> | |||
<w:lsdException w:name="Light List Accent 6"/> | |||
<w:lsdException w:name="Light Grid Accent 6"/> | |||
<w:lsdException w:name="Medium Shading 1 Accent 6"/> | |||
<w:lsdException w:name="Medium Shading 2 Accent 6"/> | |||
<w:lsdException w:name="Medium List 1 Accent 6"/> | |||
<w:lsdException w:name="Medium List 2 Accent 6"/> | |||
<w:lsdException w:name="Medium Grid 1 Accent 6"/> | |||
<w:lsdException w:name="Medium Grid 2 Accent 6"/> | |||
<w:lsdException w:name="Medium Grid 3 Accent 6"/> | |||
<w:lsdException w:name="Dark List Accent 6"/> | |||
<w:lsdException w:name="Colorful Shading Accent 6"/> | |||
<w:lsdException w:name="Colorful List Accent 6"/> | |||
<w:lsdException w:name="Colorful Grid Accent 6"/> | |||
</w:latentStyles> | |||
<w:style w:type="paragraph" w:styleId="a1" w:default="on"> | |||
<w:name w:val="Normal"/> | |||
<w:semiHidden/> | |||
<w:pPr> | |||
<w:kinsoku w:val="off"/> | |||
<w:autoSpaceDE w:val="off"/> | |||
<w:autoSpaceDN w:val="off"/> | |||
<w:adjustRightInd w:val="off"/> | |||
<w:snapToGrid w:val="off"/> | |||
<w:spacing w:line="240" w:line-rule="auto"/> | |||
<w:jc w:val="left"/> | |||
<w:textAlignment w:val="baseline"/> | |||
</w:pPr> | |||
<w:rPr> | |||
<w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:fareast="Arial" w:cs="Arial" w:hint="default"/> | |||
<w:snapToGrid w:val="off"/> | |||
<w:color w:val="000000"/> | |||
<w:kern w:val="0"/> | |||
<w:sz w:val="21"/> | |||
<w:sz-cs w:val="21"/> | |||
<w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/> | |||
</w:rPr> | |||
</w:style> | |||
<w:style w:type="character" w:styleId="a4" w:default="on"> | |||
<w:name w:val="Default Paragraph Font"/> | |||
<w:semiHidden/> | |||
</w:style> | |||
<w:style w:type="table" w:styleId="a3" w:default="on"> | |||
<w:name w:val="Normal Table"/> | |||
<w:semiHidden/> | |||
<w:tblPr> | |||
<w:tblCellMar> | |||
<w:top w:w="0" w:type="dxa"/> | |||
<w:left w:w="108" w:type="dxa"/> | |||
<w:bottom w:w="0" w:type="dxa"/> | |||
<w:right w:w="108" w:type="dxa"/> | |||
</w:tblCellMar> | |||
</w:tblPr> | |||
</w:style> | |||
<w:style w:type="paragraph" w:styleId="a2"> | |||
<w:name w:val="Body Text"/> | |||
<w:basedOn w:val="a1"/> | |||
<w:semiHidden/> | |||
<w:rPr> | |||
<w:rFonts w:ascii="Arial" w:h-ansi="Arial" w:fareast="Arial" w:cs="Arial" w:hint="default"/> | |||
<w:sz w:val="21"/> | |||
<w:sz-cs w:val="21"/> | |||
<w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/> | |||
</w:rPr> | |||
</w:style> | |||
<w:style w:type="table" w:styleId="a5"> | |||
<w:name w:val="Table Normal"/> | |||
<w:semiHidden/> | |||
<w:tblPr> | |||
<w:tblCellMar> | |||
<w:top w:w="0" w:type="dxa"/> | |||
<w:left w:w="0" w:type="dxa"/> | |||
<w:bottom w:w="0" w:type="dxa"/> | |||
<w:right w:w="0" w:type="dxa"/> | |||
</w:tblCellMar> | |||
</w:tblPr> | |||
</w:style> | |||
</w:styles> | |||
<w:bgPict> | |||
<w:background/> | |||
<v:background id="_x0000_s1025"> | |||
<v:fill on="f" focussize="0,0"/> | |||
</v:background> | |||
</w:bgPict> | |||
<w:docPr> | |||
<w:view w:val="print"/> | |||
<w:zoom w:percent="170"/> | |||
<w:characterSpacingControl w:val="DontCompress"/> | |||
<w:documentProtection w:enforcement="off"/> | |||
<w:displayBackgroundShape w:val="1"/> | |||
<w:punctuationKerning/> | |||
<w:doNotEmbedSystemFonts/> | |||
<w:bordersDontSurroundHeader/> | |||
<w:bordersDontSurroundFooter/> | |||
<w:defaultTabStop w:val="500"/> | |||
<w:displayHorizontalDrawingGridEvery w:val="1"/> | |||
<w:displayVerticalDrawingGridEvery w:val="1"/> | |||
<w:compat> | |||
<w:ulTrailSpace/> | |||
<w:useFELayout/> | |||
<w:spaceForUL/> | |||
<w:wrapTextWithPunct/> | |||
<w:breakWrappedTables/> | |||
<w:useAsianBreakRules/> | |||
<w:dontGrowAutofit/> | |||
<w:useFELayout/> | |||
</w:compat> | |||
</w:docPr> | |||
<w:body> | |||
<wx:sect> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="279" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="279" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:spacing w:before="193" w:line="176" w:line-rule="auto"/> | |||
<w:jc w:val="center"/> | |||
<w:outlineLvl w:val="0"/> | |||
<w:rPr> | |||
<w:rFonts w:fareast="微软雅黑" w:hint="default"/> | |||
<w:lang w:val="EN-US"/> | |||
</w:rPr> | |||
</w:pPr> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:spacing w:val="-4"/> | |||
<w:sz w:val="45"/> | |||
<w:sz-cs w:val="45"/> | |||
</w:rPr> | |||
<w:t>${projectName}</w:t> | |||
</w:r> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="fareast"/> | |||
<w:spacing w:val="-4"/> | |||
<w:sz w:val="45"/> | |||
<w:sz-cs w:val="45"/> | |||
<w:lang w:val="EN-US"/> | |||
</w:rPr> | |||
<w:t>专家评审意见</w:t> | |||
</w:r> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="257" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="257" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="257" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:ind w:first-line="500" w:first-line-chars="0"/> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="fareast"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
</w:pPr> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="fareast"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t>${meetingTime},${holdOrg}组织专家在${meetingAddress}对${projectName} | |||
进行评审。专家组认真听取了项目业主方、建设方的情况汇报,审阅了项目材料,实地查看了设备及平台演示,专家组织质询、讨论后提出以下意见: | |||
</w:t> | |||
</w:r> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="257" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:ind w:first-line="500" w:first-line-chars="0"/> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="fareast"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
</w:pPr> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="fareast"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t>${(reviewResult)!}</w:t> | |||
</w:r> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="244" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="245" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:pStyle w:val="a2"/> | |||
<w:spacing w:line="245" w:line-rule="auto"/> | |||
</w:pPr> | |||
</w:p> | |||
<w:p> | |||
<w:pPr> | |||
<w:spacing w:before="129" w:line="175" w:line-rule="auto"/> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
</w:pPr> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:spacing w:val="-8"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t>专家组</w:t> | |||
</w:r> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:spacing w:val="-61"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t></w:t> | |||
</w:r> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:spacing w:val="-8"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t>(签名</w:t> | |||
</w:r> | |||
<w:r> | |||
<w:rPr> | |||
<w:rFonts w:ascii="微软雅黑" w:h-ansi="微软雅黑" w:fareast="微软雅黑" w:cs="微软雅黑" | |||
w:hint="default"/> | |||
<w:spacing w:val="-14"/> | |||
<w:sz w:val="30"/> | |||
<w:sz-cs w:val="30"/> | |||
</w:rPr> | |||
<w:t>):</w:t> | |||
</w:r> | |||
</w:p> | |||
<w:sectPr> | |||
<w:pgSz w:w="11900" w:h="16839"/> | |||
<w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="0" w:footer="0" | |||
w:gutter="0"/> | |||
<w:cols w:space="720"/> | |||
</w:sectPr> | |||
</wx:sect> | |||
</w:body></w:wordDocument> |
@@ -1,294 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html | |||
xmlns="http://www.w3.org/1999/xhtml" | |||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||
> | |||
<head> | |||
<meta charset="UTF-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>Document</title> | |||
<style> | |||
html, | |||
body,p { | |||
padding: 0; | |||
margin: 0; | |||
font-family: SimSun; | |||
} | |||
.pdf { | |||
margin: 0 auto; | |||
padding: 10px 0 30px; | |||
text-align: center; | |||
} | |||
.title { | |||
padding: 0 0 20px 0; | |||
font-size: 34px; | |||
margin: 0; | |||
font-family: SimSun; | |||
word-break: break-all; | |||
height: 80px; | |||
} | |||
.tit { | |||
word-break: break-all; | |||
} | |||
.tab { | |||
padding: 0 20px; | |||
} | |||
.projectId { | |||
color: #999999; | |||
text-align: left; | |||
margin-bottom: 8px; | |||
margin-top: 0; | |||
} | |||
.projectId > .time { | |||
float: right; | |||
} | |||
table { | |||
width: 100%; | |||
border-collapse: collapse; | |||
font-size: 16px; | |||
table-layout: fixed; | |||
word-break: break-all; | |||
word-wrap: break-word; | |||
text-align: left; | |||
} | |||
td { | |||
padding: 15px 8px; | |||
border: 1px solid; | |||
} | |||
.tabTit { | |||
background-color: #eee; | |||
} | |||
.label { | |||
width: 150px; | |||
} | |||
.sealTd { | |||
height: 200px; | |||
position: relative; | |||
} | |||
.seal { | |||
position: absolute; | |||
right: 20px; | |||
bottom: 30px; | |||
width: 150px; | |||
} | |||
.seal > .time { | |||
text-align: right; | |||
} | |||
.content { | |||
height: 210px; | |||
} | |||
.textDiv{ | |||
display: flex; | |||
align-items: center; | |||
height: 100%; | |||
position: relative; | |||
} | |||
.textDiv > .right { | |||
position: absolute; | |||
bottom: 4px; | |||
right: 4px; | |||
} | |||
.h-80{ | |||
height: 80px; | |||
} | |||
.h-100{ | |||
height: 100px; | |||
} | |||
.h-400{ | |||
height: 400px; | |||
} | |||
.h-1200{ | |||
height: 1200px; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="pdf"> | |||
<p class="title"> | |||
<span class="tit">#title#</span> | |||
</p> | |||
<div class="tab"> | |||
<p class="projectId"> | |||
<span> | |||
项目编号: | |||
<span>#projectCode#</span> | |||
</span> | |||
<span class="time">#time#</span> | |||
</p> | |||
<table> | |||
<tbody> | |||
<tr> | |||
<td class="tabTit" colspan="4">项目基本信息</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目名称</td> | |||
<td colspan="3" align="center">#projectName#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否临时增补</td> | |||
<td align="center">#isTemporaryAugment#</td> | |||
<td class="label">是否一地创新全省共享项目</td> | |||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目负责人</td> | |||
<td align="center">#responsibleMan#</td> | |||
<td class="label">负责人手机号</td> | |||
<td align="center">#responsibleManMobile#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目联系人</td> | |||
<td align="center">#contactName#</td> | |||
<td class="label">项目联系人手机号</td> | |||
<td align="center">#contactPhone#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">建设单位</td> | |||
<td align="center">#buildOrgName#</td> | |||
<td class="label">建设单位统一社会信用代码</td> | |||
<td align="center">#orgCreditCode#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目类型</td> | |||
<td align="center">#projectType#</td> | |||
<td class="label">是否首次新建</td> | |||
<td align="center">#isFirst#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">预算年度</td> | |||
<td align="center">#projectYear#</td> | |||
<td class="label">建设起止时间</td> | |||
<td align="center">#beginAndEndTime#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">四大体系</td> | |||
<td colspan="3" align="center">#fourSystems#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否数字化改革项目</td> | |||
<td align="center">#isDigitalReform#</td> | |||
<td class="label">综合业务领域</td> | |||
<td align="center">#bizDomain#</td> | |||
</tr> | |||
<tr class="h-400"> | |||
<td class="label">立项依据</td> | |||
<td colspan="3" align="center">#buildBasisList#</td> | |||
</tr> | |||
<tr class="h-100"> | |||
<td class="label">是否上云</td> | |||
<td align="center">#isCloud#</td> | |||
<td class="label">云类型</td> | |||
<td align="center">#cloudType#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目简介</td> | |||
<td colspan="3" align="center"> | |||
<p class="h-1200">#projectIntroduction#</p> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金申报情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">申报金额</td> | |||
<td colspan="3" align="center">#declareAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#declareHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#declareBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">本年计划投资(万元)</td> | |||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金分配情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">软件开发</td> | |||
<td align="center">#softwareDevelopmentAmount#</td> | |||
<td class="label">云资源、硬件购置</td> | |||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">第三方服务</td> | |||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">年度支付计划</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">年度支付金额</td> | |||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#annualPlanHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#annualPlanBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">备注</td> | |||
</tr> | |||
<tr> | |||
<td class="label">备注</td> | |||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">单位意见</td> | |||
</tr> | |||
<tr> | |||
<td class="label">本级主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="textDiv"> | |||
<div class="left"> | |||
<span>#superOrgOpinion#</span> | |||
</div> | |||
<div class="right"> | |||
<span>#superOrgAuditDate#</span> | |||
</div> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="label">上级主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="textDiv"> | |||
<div class="left"> | |||
<span>#higherOrgOpinion#</span> | |||
</div> | |||
<div class="right"> | |||
<span>#higherOrgAuditDate#</span> | |||
</div> | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</body> | |||
</html> |
@@ -1,281 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html | |||
xmlns="http://www.w3.org/1999/xhtml" | |||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||
> | |||
<head> | |||
<meta charset="UTF-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>Document</title> | |||
<style> | |||
html, | |||
body,p { | |||
padding: 0; | |||
margin: 0; | |||
font-family: SimSun; | |||
} | |||
.pdf { | |||
margin: 0 auto; | |||
padding: 10px 0 30px; | |||
text-align: center; | |||
} | |||
.title { | |||
padding: 0 0 20px 0; | |||
font-size: 34px; | |||
margin: 0; | |||
font-family: SimSun; | |||
word-break: break-all; | |||
height: 80px; | |||
} | |||
.tit { | |||
word-break: break-all; | |||
} | |||
.tab { | |||
padding: 0 20px; | |||
} | |||
.projectId { | |||
color: #999999; | |||
text-align: left; | |||
margin-bottom: 8px; | |||
margin-top: 0; | |||
} | |||
.projectId > .time { | |||
float: right; | |||
} | |||
table { | |||
width: 100%; | |||
border-collapse: collapse; | |||
font-size: 16px; | |||
table-layout: fixed; | |||
word-break: break-all; | |||
word-wrap: break-word; | |||
text-align: left; | |||
} | |||
td { | |||
padding: 15px 8px; | |||
border: 1px solid; | |||
} | |||
.tabTit { | |||
background-color: #eee; | |||
} | |||
.label { | |||
width: 150px; | |||
} | |||
.sealTd { | |||
height: 200px; | |||
position: relative; | |||
} | |||
.seal { | |||
position: absolute; | |||
right: 20px; | |||
bottom: 30px; | |||
width: 150px; | |||
} | |||
.seal > .time { | |||
text-align: right; | |||
} | |||
.content { | |||
height: 210px; | |||
} | |||
.textDiv{ | |||
display: flex; | |||
align-items: center; | |||
height: 100%; | |||
position: relative; | |||
} | |||
.textDiv > .right { | |||
position: absolute; | |||
bottom: 4px; | |||
right: 4px; | |||
} | |||
.h-80{ | |||
height: 80px; | |||
} | |||
.h-100{ | |||
height: 100px; | |||
} | |||
.h-400{ | |||
height: 400px; | |||
} | |||
.h-1200{ | |||
height: 1200px; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="pdf"> | |||
<p class="title"> | |||
<span class="tit">#title#</span> | |||
</p> | |||
<div class="tab"> | |||
<p class="projectId"> | |||
<span> | |||
项目编号: | |||
<span>#projectCode#</span> | |||
</span> | |||
<span class="time">#time#</span> | |||
</p> | |||
<table> | |||
<tbody> | |||
<tr> | |||
<td class="tabTit" colspan="4">项目基本信息</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目名称</td> | |||
<td colspan="3" align="center">#projectName#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否临时增补</td> | |||
<td align="center">#isTemporaryAugment#</td> | |||
<td class="label">是否一地创新全省共享项目</td> | |||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目负责人</td> | |||
<td align="center">#responsibleMan#</td> | |||
<td class="label">负责人手机号</td> | |||
<td align="center">#responsibleManMobile#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目联系人</td> | |||
<td align="center">#contactName#</td> | |||
<td class="label">项目联系人手机号</td> | |||
<td align="center">#contactPhone#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">建设单位</td> | |||
<td align="center">#buildOrgName#</td> | |||
<td class="label">建设单位统一社会信用代码</td> | |||
<td align="center">#orgCreditCode#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目类型</td> | |||
<td align="center">#projectType#</td> | |||
<td class="label">是否首次新建</td> | |||
<td align="center">#isFirst#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">预算年度</td> | |||
<td align="center">#projectYear#</td> | |||
<td class="label">建设起止时间</td> | |||
<td align="center">#beginAndEndTime#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">四大体系</td> | |||
<td colspan="3" align="center">#fourSystems#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否数字化改革项目</td> | |||
<td align="center">#isDigitalReform#</td> | |||
<td class="label">综合业务领域</td> | |||
<td align="center">#bizDomain#</td> | |||
</tr> | |||
<tr class="h-400"> | |||
<td class="label">立项依据</td> | |||
<td colspan="3" align="center">#buildBasisList#</td> | |||
</tr> | |||
<tr class="h-100"> | |||
<td class="label">是否上云</td> | |||
<td align="center">#isCloud#</td> | |||
<td class="label">云类型</td> | |||
<td align="center">#cloudType#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目简介</td> | |||
<td colspan="3" align="center"> | |||
<p class="h-1200">#projectIntroduction#</p> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金申报情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">申报金额</td> | |||
<td colspan="3" align="center">#declareAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#declareHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#declareBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">本年计划投资(万元)</td> | |||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金分配情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">软件开发</td> | |||
<td align="center">#softwareDevelopmentAmount#</td> | |||
<td class="label">云资源、硬件购置</td> | |||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">第三方服务</td> | |||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">年度支付计划</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">年度支付金额</td> | |||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#annualPlanHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#annualPlanBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">备注</td> | |||
</tr> | |||
<tr> | |||
<td class="label">备注</td> | |||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">单位意见</td> | |||
</tr> | |||
<tr> | |||
<td class="label">本级主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="textDiv"> | |||
<div class="left"> | |||
<span>#superOrgOpinion#</span> | |||
</div> | |||
<div class="right"> | |||
<span>#superOrgAuditDate#</span> | |||
</div> | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</body> | |||
</html> |
@@ -1,281 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html | |||
xmlns="http://www.w3.org/1999/xhtml" | |||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||
> | |||
<head> | |||
<meta charset="UTF-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>Document</title> | |||
<style> | |||
html, | |||
body,p { | |||
padding: 0; | |||
margin: 0; | |||
font-family: SimSun; | |||
} | |||
.pdf { | |||
margin: 0 auto; | |||
padding: 10px 0 30px; | |||
text-align: center; | |||
} | |||
.title { | |||
padding: 0 0 20px 0; | |||
font-size: 34px; | |||
margin: 0; | |||
font-family: SimSun; | |||
word-break: break-all; | |||
height: 80px; | |||
} | |||
.tit { | |||
word-break: break-all; | |||
} | |||
.tab { | |||
padding: 0 20px; | |||
} | |||
.projectId { | |||
color: #999999; | |||
text-align: left; | |||
margin-bottom: 8px; | |||
margin-top: 0; | |||
} | |||
.projectId > .time { | |||
float: right; | |||
} | |||
table { | |||
width: 100%; | |||
border-collapse: collapse; | |||
font-size: 16px; | |||
table-layout: fixed; | |||
word-break: break-all; | |||
word-wrap: break-word; | |||
text-align: left; | |||
} | |||
td { | |||
padding: 15px 8px; | |||
border: 1px solid; | |||
} | |||
.tabTit { | |||
background-color: #eee; | |||
} | |||
.label { | |||
width: 150px; | |||
} | |||
.sealTd { | |||
height: 200px; | |||
position: relative; | |||
} | |||
.seal { | |||
position: absolute; | |||
right: 20px; | |||
bottom: 30px; | |||
width: 150px; | |||
} | |||
.seal > .time { | |||
text-align: right; | |||
} | |||
.content { | |||
height: 210px; | |||
} | |||
.textDiv{ | |||
display: flex; | |||
align-items: center; | |||
height: 100%; | |||
position: relative; | |||
} | |||
.textDiv > .right { | |||
position: absolute; | |||
bottom: 4px; | |||
right: 4px; | |||
} | |||
.h-80{ | |||
height: 80px; | |||
} | |||
.h-100{ | |||
height: 100px; | |||
} | |||
.h-400{ | |||
height: 400px; | |||
} | |||
.h-1200{ | |||
height: 1200px; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="pdf"> | |||
<p class="title"> | |||
<span class="tit">#title#</span> | |||
</p> | |||
<div class="tab"> | |||
<p class="projectId"> | |||
<span> | |||
项目编号: | |||
<span>#projectCode#</span> | |||
</span> | |||
<span class="time">#time#</span> | |||
</p> | |||
<table> | |||
<tbody> | |||
<tr> | |||
<td class="tabTit" colspan="4">项目基本信息</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目名称</td> | |||
<td colspan="3" align="center">#projectName#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否临时增补</td> | |||
<td align="center">#isTemporaryAugment#</td> | |||
<td class="label">是否一地创新全省共享项目</td> | |||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目负责人</td> | |||
<td align="center">#responsibleMan#</td> | |||
<td class="label">负责人手机号</td> | |||
<td align="center">#responsibleManMobile#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目联系人</td> | |||
<td align="center">#contactName#</td> | |||
<td class="label">项目联系人手机号</td> | |||
<td align="center">#contactPhone#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">建设单位</td> | |||
<td align="center">#buildOrgName#</td> | |||
<td class="label">建设单位统一社会信用代码</td> | |||
<td align="center">#orgCreditCode#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">项目类型</td> | |||
<td align="center">#projectType#</td> | |||
<td class="label">是否首次新建</td> | |||
<td align="center">#isFirst#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">预算年度</td> | |||
<td align="center">#projectYear#</td> | |||
<td class="label">建设起止时间</td> | |||
<td align="center">#beginAndEndTime#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">四大体系</td> | |||
<td colspan="3" align="center">#fourSystems#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">是否数字化改革项目</td> | |||
<td align="center">#isDigitalReform#</td> | |||
<td class="label">综合业务领域</td> | |||
<td align="center">#bizDomain#</td> | |||
</tr> | |||
<tr class="h-400"> | |||
<td class="label">立项依据</td> | |||
<td colspan="3" align="center">#buildBasisList#</td> | |||
</tr> | |||
<tr class="h-100"> | |||
<td class="label">是否上云</td> | |||
<td align="center">#isCloud#</td> | |||
<td class="label">云类型</td> | |||
<td align="center">#cloudType#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目简介</td> | |||
<td colspan="3" align="center"> | |||
<p class="h-1200">#projectIntroduction#</p> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金申报情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">申报金额</td> | |||
<td colspan="3" align="center">#declareAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#declareHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#declareBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">本年计划投资(万元)</td> | |||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金分配情况</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">软件开发</td> | |||
<td align="center">#softwareDevelopmentAmount#</td> | |||
<td class="label">云资源、硬件购置</td> | |||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">第三方服务</td> | |||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">年度支付计划</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">年度支付金额</td> | |||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">自有资金</td> | |||
<td align="center">#annualPlanHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#annualPlanBankLendingAmount#</td> | |||
</tr> | |||
<tr class="h-80"> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">备注</td> | |||
</tr> | |||
<tr> | |||
<td class="label">备注</td> | |||
<td colspan="3" align="center"><p class="h-1200">#projectRemarks#</p></td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">单位意见</td> | |||
</tr> | |||
<tr> | |||
<td class="label">大数据局主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="textDiv"> | |||
<div class="left"> | |||
<span>#bigDataBureauOpinion#</span> | |||
</div> | |||
<div class="right"> | |||
<span>#bigDataBureauAuditDate#</span> | |||
</div> | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</body> | |||
</html> |
@@ -1,286 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html | |||
xmlns="http://www.w3.org/1999/xhtml" | |||
xmlns:font-family="http://www.w3.org/1999/xhtml" | |||
> | |||
<head> | |||
<meta charset="UTF-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>Document</title> | |||
<style> | |||
html, | |||
body { | |||
padding: 0; | |||
margin: 0; | |||
font-family: SimSun; | |||
} | |||
.pdf { | |||
margin: 0 auto; | |||
padding: 10px 0 30px; | |||
text-align: center; | |||
} | |||
.title { | |||
padding: 0 0 40px 0; | |||
font-size: 34px; | |||
margin: 40px 0 0 0; | |||
font-family: SimSun; | |||
} | |||
.tab { | |||
padding: 0 20px; | |||
} | |||
.projectId { | |||
color: #999999; | |||
text-align: left; | |||
margin-bottom: 8px; | |||
} | |||
.projectId > .time { | |||
float: right; | |||
} | |||
table { | |||
width: 100%; | |||
border-collapse: collapse; | |||
font-size: 16px; | |||
table-layout: fixed; | |||
word-break: break-all; | |||
word-wrap: break-word; | |||
text-align: left; | |||
} | |||
td { | |||
padding: 15px 8px; | |||
border: 1px solid; | |||
} | |||
.tabTit { | |||
background-color: #eee; | |||
} | |||
.label { | |||
width: 150px; | |||
} | |||
.sealTd { | |||
height: 200px; | |||
position: relative; | |||
} | |||
.seal { | |||
position: absolute; | |||
right: 20px; | |||
bottom: 30px; | |||
width: 150px; | |||
} | |||
.seal > .time { | |||
text-align: right; | |||
} | |||
.content { | |||
height: 150px; | |||
} | |||
.text { | |||
min-height: 150px; | |||
} | |||
.content > .right { | |||
float: right; | |||
margin-right: 10px; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="pdf"> | |||
<p class="title"> | |||
<span>#title#</span> | |||
</p> | |||
<div class="tab"> | |||
<p class="projectId"> | |||
<span> | |||
项目编号: | |||
<span>#projectNo#</span> | |||
</span> | |||
<span class="time">#time#</span> | |||
</p> | |||
<table> | |||
<tbody> | |||
<tr> | |||
<td class="tabTit" colspan="4">项目基本信息</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目名称</td> | |||
<td colspan="3" align="center">#projectName#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">是否临时增补</td> | |||
<td align="center">#isTemporaryAugment#</td> | |||
<td class="label">是否一地创新全省共享项目</td> | |||
<td align="center">#isInnovateWholeProvinceShare#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目负责人</td> | |||
<td align="center">#responsibleMan#</td> | |||
<td class="label">负责人手机号</td> | |||
<td align="center">#responsibleManMobile#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目联系人</td> | |||
<td align="center">#contactName#</td> | |||
<td class="label">项目联系人手机号</td> | |||
<td align="center">#contactPhone#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">建设单位</td> | |||
<td align="center">#buildOrgName#</td> | |||
<td class="label">建设单位统一社会信用代码</td> | |||
<td align="center">#orgCreditCode#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目类型</td> | |||
<td align="center">#projectType#</td> | |||
<td class="label">是否首次新建</td> | |||
<td align="center">#isFirst#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">预算年度</td> | |||
<td align="center">#projectYear#</td> | |||
<td class="label">建设起止时间</td> | |||
<td align="center">#beginAndEndTime#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">四大体系</td> | |||
<td colspan="3" align="center">#fourSystems#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">是否数字化改革项目</td> | |||
<td align="center">#isDigitalReform#</td> | |||
<td class="label">综合业务领域</td> | |||
<td align="center">#bizDomain#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">立项依据</td> | |||
<td colspan="3" align="center">#buildBasisList#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">是否上云</td> | |||
<td align="center">#isCloud#</td> | |||
<td class="label">云类型</td> | |||
<td align="center">#cloudType#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">项目简介</td> | |||
<td colspan="3" align="center">#projectIntroduction#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金申报情况</td> | |||
</tr> | |||
<tr> | |||
<td class="label">申报金额</td> | |||
<td colspan="3" align="center">#declareAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">自有资金</td> | |||
<td align="center">#declareHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#declareGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#declareGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#declareBankLendingAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#declareOtherAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">本年计划投资(万元)</td> | |||
<td colspan="3" align="center">#yearPlanInvest#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">资金分配情况</td> | |||
</tr> | |||
<tr> | |||
<td class="label">软件开发</td> | |||
<td align="center">#softwareDevelopmentAmount#</td> | |||
<td class="label">云资源、硬件购置</td> | |||
<td align="center">#cloudHardwarePurchaseAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">第三方服务</td> | |||
<td colspan="3" align="center">#thirdPartyAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">年度支付计划</td> | |||
</tr> | |||
<tr> | |||
<td class="label">年度支付金额</td> | |||
<td colspan="3" align="center">#annualPlanAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">自有资金</td> | |||
<td align="center">#annualPlanHaveAmount#</td> | |||
<td class="label">政府投资-本级财政资金</td> | |||
<td align="center">#annualPlanGovOwnFinanceAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">政府投资-上级补助资金</td> | |||
<td align="center">#annualPlanGovSuperiorFinanceAmount#</td> | |||
<td class="label">银行贷款</td> | |||
<td align="center">#annualPlanBankLendingAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="label">其他资金</td> | |||
<td colspan="3" align="center">#annualPlanOtherAmount#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">备注</td> | |||
</tr> | |||
<tr> | |||
<td class="label">备注</td> | |||
<td colspan="3" align="center">#projectRemarks#</td> | |||
</tr> | |||
<tr> | |||
<td class="tabTit" colspan="4">单位意见</td> | |||
</tr> | |||
<tr> | |||
<td class="label">本级主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="right"> | |||
<p> | |||
<span>#superOrgOpinion#</span> | |||
</p> | |||
<p> | |||
<span>#superOrgAuditDate#</span> | |||
</p> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="label">上级主管单位意见(盖章)</td> | |||
<td colspan="3" class="text content"> | |||
<div class="right"> | |||
<p> | |||
<span>#higherOrgOpinion#</span> | |||
</p> | |||
<p> | |||
<span>#higherOrgAuditDate#</span> | |||
</p> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td class="label"> | |||
<span>#bigDataBureauName#</span> | |||
意见(盖章) | |||
</td> | |||
<td colspan="3" class="text content"> | |||
<div class="right"> | |||
<p> | |||
<span>#bigDataBureauOpinion#</span> | |||
</p> | |||
<p> | |||
<span>#bigDataBureauAuditDate#</span> | |||
</p> | |||
</div> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</body> | |||
</html> |