Merge remote-tracking branch 'origin/3.0.x' into 3.0.x

This commit is contained in:
zhou-hao
2018-10-18 21:52:17 +08:00
181 changed files with 1062 additions and 513 deletions

View File

@@ -3,7 +3,7 @@ sudo: false
jdk:
- oraclejdk8
script:
- mvn test
- mvn -q test
after_success:
- bash <(curl -s https://codecov.io/bash)
cache:

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -42,8 +42,7 @@
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

View File

@@ -4,7 +4,20 @@
2. 实现数据权限控制
3. 可动态进行权限配置设置
默认仅提供了aop方式的权限控制,控制逻辑如下:
## 授权
使用`hsweb-authorization-api`提供的监听器,类`UserOnSignIn`监听用户授权事件`AuthorizationSuccessEvent`
当用户完成授权(授权方式可自行实现或者使用框架默认的授权方式,主要触发该事件即可).授权通过后会触发该事件.流程如下
1. 完成授权,触发`AuthorizationSuccessEvent`
2. `UserOnSignIn` 收到`AuthorizationSuccessEvent`事件,获取参数`token_type`(默认为`sessionId`),以及授权信息
3. 根据`token_type` 生成token.
4. 将token和授权信息中的userId注册到`UserTokenManager`
5. 将token返回给授权接口
![授权](./img/autz-flow.png "授权")
## 权限控制
1. `AopAuthorizingController` aop拦截所有controller方法(注解了:`Controller`或者`RestController`的类的方法)
2. 在客户端发起请求的时候,将拦截到的方法信息(`MethodInterceptorContext`)传给权限定义解析器(`AopMethodAuthorizeDefinitionParser`)
进行解析
@@ -14,15 +27,9 @@
5. 默认的权限控制实现`DefaultAuthorizingHandler`,将分别进行RBAC,数据权限,表达式方式的权限控制.
6. 如果授权未通过,则抛出`AccessDenyException`异常
## 授权
使用`hsweb-authorization-api`提供的监听器,类`UserOnSignIn`监听用户授权事件`AuthorizationSuccessEvent`
当用户完成授权(授权方式可自行实现或者使用框架默认的授权方式,主要触发该事件即可).授权通过后会触发该事件.流程如下
![权限控制](./img/autz-handle-flow.png "权限控制")
1. 完成授权,触发`AuthorizationSuccessEvent`
2. `UserOnSignIn` 收到`AuthorizationSuccessEvent`事件,获取参数`token_type`(默认为`sessionId`),以及授权信息
3. 根据`token_type` 生成token.
4. 将token和授权信息中的userId注册到`UserTokenManager`
5. 将token返回给授权接口
## 注销
与授权同理,类`UserOnSignOut`监听`AuthorizationExitEvent` ,当触发事件后,调用`UserTokenManager`移除当前登录的token信息

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -81,8 +81,7 @@
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>

View File

@@ -29,13 +29,13 @@ public class DefaultAopMethodAuthorizeDefinitionParser implements AopMethodAutho
private Map<CacheKey, AuthorizeDefinition> cache = new ConcurrentHashMap<>();
private List<AopMethodAuthorizeDefinitionCustomizerParser> parserCustomers;
private List<AopMethodAuthorizeDefinitionCustomizerParser> parserCustomizers;
private static Set<String> excludeMethodName = new HashSet<>(Arrays.asList("toString", "clone", "hashCode", "getClass"));
@Autowired(required = false)
public void setParserCustomers(List<AopMethodAuthorizeDefinitionCustomizerParser> parserCustomers) {
this.parserCustomers = parserCustomers;
public void setParserCustomizers(List<AopMethodAuthorizeDefinitionCustomizerParser> parserCustomizers) {
this.parserCustomizers = parserCustomizers;
}
@Override
@@ -59,9 +59,9 @@ public class DefaultAopMethodAuthorizeDefinitionParser implements AopMethodAutho
return definition;
}
//使用自定义
if (!CollectionUtils.isEmpty(parserCustomers)) {
definition = parserCustomers.stream()
.map(customer -> customer.parse(target, method, context))
if (!CollectionUtils.isEmpty(parserCustomizers)) {
definition = parserCustomizers.stream()
.map(customizer -> customizer.parse(target, method, context))
.filter(Objects::nonNull)
.findAny().orElse(null);
if (definition instanceof EmptyAuthorizeDefinition) {

View File

@@ -91,6 +91,9 @@ public class AuthorizationController {
return doLogin(username, password, WebUtil.getParameters(request));
}
/**
* <img src="https://raw.githubusercontent.com/hs-web/hsweb-framework/3.0.x/hsweb-authorization/hsweb-authorization-basic/img/autz-flow.png">
*/
@SneakyThrows
protected ResponseMessage<Map<String, Object>> doLogin(String username, String password, Map<String, ?> parameter) {
Assert.hasLength(username, "用户名不能为空");

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -35,8 +35,7 @@
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-authorization-oauth2</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -44,8 +44,7 @@
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-authorization-oauth2</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-authorization-oauth2</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<!--<relativePath>../../pom.xml</relativePath>-->
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-boost</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-boost</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-boost</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -30,5 +30,23 @@
<artifactId>spring-boot-starter</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.athaydes</groupId>
<artifactId>spock-reports</artifactId>
<version>1.2.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,43 @@
package org.hswebframework.web.commons.bean
import org.hibernate.validator.constraints.NotBlank
import org.hswebframework.web.validator.group.CreateGroup
import org.hswebframework.web.validator.group.UpdateGroup
/**
* @author zhouhao
* @since 3.0.2
*/
class BeanValidatorTest extends spock.lang.Specification {
def "测试初始化验证器"() {
given: "初始化"
def validator = BeanValidator.getValidator();
expect: "成功"
null != validator
}
def doValidate(TestBean bean, Class group) {
try {
bean.tryValidate(group);
return null;
} catch (Exception e) {
return e.message;
}
}
def "测试group验证"() {
expect: "验证多个group"
doValidate(new TestBean(name: name), group as Class) == message
where:
name | group | message
null | CreateGroup.class | "姓名不能为空"
"" | CreateGroup.class | "姓名不能为空"
null | UpdateGroup.class | null
"" | UpdateGroup.class | "长度必须在2-20之间"
"张三" | UpdateGroup.class | null
}
}

View File

@@ -0,0 +1,20 @@
package org.hswebframework.web.commons.bean;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hswebframework.web.validator.group.CreateGroup;
import org.hswebframework.web.validator.group.UpdateGroup;
/**
* @author zhouhao
* @since 3.0.2
*/
@Data
public class TestBean implements ValidateBean {
@NotBlank(groups = CreateGroup.class, message = "姓名不能为空")
@Length(min = 2, max = 20, message = "长度必须在2-20之间", groups = UpdateGroup.class)
private String name;
}

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons-dao</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons-dao</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -20,7 +20,7 @@ package org.hswebframework.web.dao.mybatis;
import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
import org.hswebframework.web.dao.Dao;
import org.hswebframework.web.dao.mybatis.mapper.SqlTermCustomer;
import org.hswebframework.web.dao.mybatis.mapper.SqlTermCustomizer;
import org.hswebframework.web.dao.mybatis.mapper.dict.DictInTermTypeMapper;
import org.hswebframework.web.dao.mybatis.mapper.dict.DictTermTypeMapper;
import org.mybatis.spring.annotation.MapperScan;
@@ -34,7 +34,6 @@ import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
@Configuration
@ComponentScan("org.hswebframework.web.dao.mybatis")
@@ -65,7 +64,7 @@ public class MybatisDaoAutoConfiguration {
}
@Bean
public BeanPostProcessor SqlTermCustomerRegister() {
public BeanPostProcessor sqlTermCustomizerRegister() {
List<Dialect> dialects = Arrays.asList(
Dialect.H2
@@ -82,14 +81,14 @@ public class MybatisDaoAutoConfiguration {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof SqlTermCustomer) {
SqlTermCustomer customer = ((SqlTermCustomer) bean);
if (customer.forDialect() != null) {
for (Dialect dialect : customer.forDialect()) {
dialect.setTermTypeMapper(customer.getTermType(), customer);
if (bean instanceof SqlTermCustomizer) {
SqlTermCustomizer customizer = ((SqlTermCustomizer) bean);
if (customizer.forDialect() != null) {
for (Dialect dialect : customizer.forDialect()) {
dialect.setTermTypeMapper(customizer.getTermType(), customizer);
}
} else {
dialects.forEach(dialect -> dialect.setTermTypeMapper(customer.getTermType(), customer));
dialects.forEach(dialect -> dialect.setTermTypeMapper(customizer.getTermType(), customizer));
}
}
return bean;

View File

@@ -6,7 +6,7 @@ package org.hswebframework.web.dao.mybatis;
* @author zhouhao
* @since 3.0
*/
public interface MybatisMapperCustomer {
public interface MybatisMapperCustomizer {
String[] getExcludes();
String[] getIncludes();

View File

@@ -61,10 +61,10 @@ public class MybatisProperties extends org.mybatis.spring.boot.autoconfigure.Myb
*/
private boolean useJpa = true;
private List<MybatisMapperCustomer> mybatisMappers;
private List<MybatisMapperCustomizer> mybatisMappers;
@Autowired(required = false)
public void setMybatisMappers(List<MybatisMapperCustomer> mybatisMappers) {
public void setMybatisMappers(List<MybatisMapperCustomizer> mybatisMappers) {
this.mybatisMappers = mybatisMappers;
}
@@ -107,7 +107,7 @@ public class MybatisProperties extends org.mybatis.spring.boot.autoconfigure.Myb
if (mybatisMappers != null) {
mybatisMappers.stream()
.map(MybatisMapperCustomer::getIncludes)
.map(MybatisMapperCustomizer::getIncludes)
.flatMap(Arrays::stream)
.forEach(locations::add);
}
@@ -125,7 +125,7 @@ public class MybatisProperties extends org.mybatis.spring.boot.autoconfigure.Myb
Set<String> excludes = new HashSet<>();
if (mybatisMappers != null) {
mybatisMappers.stream()
.map(MybatisMapperCustomer::getExcludes)
.map(MybatisMapperCustomizer::getExcludes)
.flatMap(Arrays::stream)
.forEach(excludes::add);
}

View File

@@ -15,7 +15,7 @@ import java.util.List;
* @since 3.0.0-RC
*/
@AllArgsConstructor
public abstract class AbstractSqlTermCustomer implements SqlTermCustomer {
public abstract class AbstractSqlTermCustomizer implements SqlTermCustomizer {
@Getter
protected final String termType;

View File

@@ -6,7 +6,7 @@ import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
* @author zhouhao
* @since 3.0.0-RC
*/
public interface SqlTermCustomer extends Dialect.TermTypeMapper {
public interface SqlTermCustomizer extends Dialect.TermTypeMapper {
String getTermType();
Dialect[] forDialect();

View File

@@ -18,12 +18,12 @@ import java.util.stream.Collectors;
* @since 3.0.0-RC
*/
@Slf4j
public abstract class TreeStructureSqlTermCustomer extends AbstractSqlTermCustomer {
public abstract class TreeStructureSqlTermCustomizer extends AbstractSqlTermCustomizer {
boolean not = false;
boolean parent = false;
public TreeStructureSqlTermCustomer(String termType, boolean not,boolean parent) {
public TreeStructureSqlTermCustomizer(String termType, boolean not, boolean parent) {
super(termType);
this.not = not;
}

View File

@@ -9,21 +9,20 @@ import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
import org.hswebframework.ezorm.rdb.render.dialect.RenderPhase;
import org.hswebframework.ezorm.rdb.render.dialect.function.SqlFunction;
import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomizer;
import org.hswebframework.web.dao.mybatis.mapper.ChangedTermValue;
import org.hswebframework.web.dict.EnumDict;
import java.sql.JDBCType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author zhouhao
* @since 3.0.0-RC
*/
public class DictInTermTypeMapper extends AbstractSqlTermCustomer {
public class DictInTermTypeMapper extends AbstractSqlTermCustomizer {
private boolean not;

View File

@@ -6,17 +6,14 @@ import org.hswebframework.ezorm.core.param.TermType;
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
import org.hswebframework.ezorm.rdb.render.SqlAppender;
import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
import org.hswebframework.ezorm.rdb.render.dialect.RenderPhase;
import org.hswebframework.ezorm.rdb.render.dialect.function.SqlFunction;
import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomizer;
import org.hswebframework.web.dao.mybatis.mapper.ChangedTermValue;
import org.hswebframework.web.dict.EnumDict;
import java.sql.JDBCType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.hswebframework.web.dao.mybatis.mapper.dict.DictInTermTypeMapper.USE_DICT_MASK_FLAG;
@@ -25,7 +22,7 @@ import static org.hswebframework.web.dao.mybatis.mapper.dict.DictInTermTypeMappe
* @author zhouhao
* @since 3.0.0-RC
*/
public class DictTermTypeMapper extends AbstractSqlTermCustomer {
public class DictTermTypeMapper extends AbstractSqlTermCustomizer {
private boolean not;

View File

@@ -22,4 +22,5 @@ spring:
hibernate:
ddl-auto: update
mybatis:
mapper-locations: org/hswebframework/web/dao/test/*.xml
mapper-locations: org/hswebframework/web/dao/test/*.xml
dynamic-datasource: true

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons-service</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-commons-service</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons-service</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-commons</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -33,10 +33,10 @@
<description>通用模块-工具类</description>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-concurrent</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,91 +0,0 @@
package org.hswebframework.web.async;
import lombok.SneakyThrows;
import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
import org.hswebframework.web.tests.SimpleWebApplicationTests;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @author zhouhao
*/
public class TransactionSupportAsyncJobServiceTest extends SimpleWebApplicationTests {
@Autowired
private SqlExecutor sqlExecutor;
@Autowired
private AsyncJobService asyncJobService;
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public static class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
@Before
@SneakyThrows
public void init() {
sqlExecutor.exec("create table test(id varchar(32))");
}
@After
@SneakyThrows
public void cleanup() {
sqlExecutor.exec("drop table test");
}
@Test
public void test() throws Exception {
try {
BatchAsyncJobContainer jobContainer = asyncJobService.batch();
jobContainer.submit(() -> {
Thread.sleep(50);
throw new RuntimeException("1234");
}, true);
for (int i = 0; i < 100; i++) {
jobContainer.submit(() -> sqlExecutor.insert("insert into test values('test')", null), true);
}
System.out.println(jobContainer.getResult().size());
} catch (Exception ignore) {
ignore.printStackTrace();
}
Assert.assertTrue(sqlExecutor.list("select * from test").isEmpty());
}
@Test
public void testSimple() throws Exception {
try {
BatchAsyncJobContainer jobContainer = asyncJobService.batch();
jobContainer.submit(() -> {
Thread.sleep(10);
jobContainer.cancel();
throw new RuntimeException();
}, false);
for (int i = 0; i < 100; i++) {
jobContainer.submit(() -> sqlExecutor.insert("insert into test values('test')", null), false);
}
System.out.println(jobContainer.getResult().size());
} catch (Exception ignore) {
ignore.printStackTrace();
}
Assert.assertTrue(sqlExecutor.list("select * from test").size() > 0);
}
}

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-concurrent</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-concurrent-counter</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -18,8 +18,6 @@
package org.hswebframework.web.concurrent.counter;
/**
* TODO 完成注释
*
* @author zhouhao
*/
public interface CounterManager {

View File

@@ -1,25 +0,0 @@
package org.hswebframework.web.concurrent.counter;
import org.junit.Assert;
import org.junit.Test;
/**
* TODO 完成注释
*
* @author zhouhao
*/
public class SimpleCounterTest {
private CounterManager counterManager = new SimpleCounterManager();
@Test
public void testSimple() throws InterruptedException {
for (int i = 0; i < 100; i++) {
new Thread(() -> counterManager.getCounter("test").increment()).start();
}
Thread.sleep(500);
Assert.assertEquals(counterManager.getCounter("test").get(), 100);
}
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-concurrent-counter</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,34 +0,0 @@
package org.hswebframework.web.counter.redis;
import org.hswebframework.web.concurrent.counter.CounterManager;
import org.junit.Assert;
import org.redisson.Redisson;
import org.redisson.config.Config;
/**
* TODO 完成注释
*
* @author zhouhao
*/
public class RedissonCounterTest {
public static void main(String[] args) throws InterruptedException {
Config config = new Config();
// config.setUseLinuxNativeEpoll(true);
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
Redisson redisson = (Redisson) Redisson.create(config);
CounterManager counterManager = new RedissonCounterManager(redisson);
//重置
counterManager.getCounter("test").set(0);
for (int i = 0; i < 100; i++) {
new Thread(() -> counterManager.getCounter("test").increment()).start();
}
Thread.sleep(500);
Assert.assertEquals(counterManager.getCounter("test").get(), 100);
redisson.shutdown();
}
}

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-concurrent</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-concurrent-lock</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-concurrent-lock</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-concurrent-lock</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-concurrent</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -36,9 +36,28 @@
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -37,13 +37,7 @@ public final class FastBeanCopier {
@SuppressWarnings("all")
public static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
private static BeanFactory BEAN_FACTORY = new BeanFactory() {
@Override
@SneakyThrows
public <T> T newInstance(Class<T> beanType) {
return beanType == Map.class ? (T) new HashMap<>() : beanType.newInstance();
}
};
private static BeanFactory BEAN_FACTORY;
public static final DefaultConverter DEFAULT_CONVERT;

View File

@@ -22,19 +22,23 @@ import java.util.ArrayList;
import java.util.List;
/**
*
* @author zhouhao
*/
public class SimpleValidateResults implements ValidateResults {
private static final long serialVersionUID = -3355828475840578917L;
private List<ValidateResults.Result> results = new ArrayList<>();
private static final long serialVersionUID = -3355828475840578917L;
private List<ValidateResults.Result> results = new ArrayList<>();
public SimpleValidateResults addResult(String field, String message) {
results.add(new Result(field, message));
return this;
}
public SimpleValidateResults addResult(ValidateResults.Result result) {
results.add(result);
return this;
}
@Override
public boolean isSuccess() {
return results == null || results.isEmpty();
@@ -46,9 +50,9 @@ public class SimpleValidateResults implements ValidateResults {
}
class Result implements ValidateResults.Result {
private static final long serialVersionUID = -4717219071013488363L;
private String field;
private String message;
private static final long serialVersionUID = -4717219071013488363L;
private String field;
private String message;
public Result(String field, String message) {
this.field = field;

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-datasource</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-datasource</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-datasource</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-logging</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -53,8 +53,7 @@
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-logging</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-message</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-message</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-message</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-message</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-starter</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -41,6 +41,8 @@ import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.sql.SQLException;
import java.util.List;
@@ -97,6 +99,19 @@ public class RestControllerExceptionTranslator {
return ResponseMessage.error(404, exception.getMessage());
}
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
ResponseMessage handleConstraintViolationException(ConstraintViolationException e) {
SimpleValidateResults results = new SimpleValidateResults();
for (ConstraintViolation<?> violation : e.getConstraintViolations()) {
results.addResult(violation.getPropertyPath().toString(), violation.getMessage());
}
List<ValidateResults.Result> errorResults = results.getResults();
return ResponseMessage
.error(400, errorResults.isEmpty() ? "" : errorResults.get(0).getMessage())
.result(errorResults);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
ResponseMessage handleException(MethodArgumentNotValidException e) {
@@ -152,11 +167,11 @@ public class RestControllerExceptionTranslator {
/**
* 404异常Spring MVC DispatcherServlet 当没找到 Handler处理请求时
* 如果配置了 throwExceptionIfNoHandlerFound 为 true时会抛出此异常
*
* <p>
* 在配置文件中使用:
* spring:
* mvc:
* throw-exception-if-no-handler-found: true
* spring:
* mvc:
* throw-exception-if-no-handler-found: true
*
* @see org.springframework.web.servlet.DispatcherServlet#noHandlerFound(HttpServletRequest, HttpServletResponse)
*/
@@ -189,5 +204,4 @@ public class RestControllerExceptionTranslator {
}
}

View File

@@ -24,8 +24,8 @@ public class EntityFactoryInitConfiguration implements BeanPostProcessor {
} else if (bean instanceof PropertyCopier) {
mapperEntityFactory.addCopier(((PropertyCopier) bean));
}
if (bean instanceof EntityMappingCustomer) {
((EntityMappingCustomer) bean).customize(mapperEntityFactory);
if (bean instanceof EntityMappingCustomizer) {
((EntityMappingCustomizer) bean).customize(mapperEntityFactory);
}
return bean;
}

View File

@@ -5,6 +5,6 @@ import org.hswebframework.web.commons.entity.factory.MapperEntityFactory;
/**
* @author zhouhao
*/
public interface EntityMappingCustomer {
public interface EntityMappingCustomizer {
void customize(MapperEntityFactory entityFactory);
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-framework</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,8 +3,6 @@ package org.hswebframework.web.entity.authorization;
import org.hswebframework.web.commons.entity.CloneableEntity;
/**
* TODO 完成注释
*
* @author zhouhao
*/
public class DataAccessEntity implements CloneableEntity {

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -4,7 +4,7 @@ import org.hswebframework.ezorm.core.param.Term;
import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
import org.hswebframework.ezorm.rdb.render.SqlAppender;
import org.hswebframework.ezorm.rdb.render.dialect.term.BoostTermTypeMapper;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomer;
import org.hswebframework.web.dao.mybatis.mapper.AbstractSqlTermCustomizer;
import org.hswebframework.web.dao.mybatis.mapper.ChangedTermValue;
import java.util.List;
@@ -13,7 +13,7 @@ import java.util.List;
* @author zhouhao
* @since 3.0
*/
public class UserInRoleSqlTerm extends AbstractSqlTermCustomer {
public class UserInRoleSqlTerm extends AbstractSqlTermCustomizer {
private boolean not;

View File

@@ -22,7 +22,7 @@
<parent>
<artifactId>hsweb-system-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -3,6 +3,8 @@ package org.hswebframework.web.authorization.starter
import com.alibaba.fastjson.JSON
import org.hswebframework.web.authorization.Authentication
import org.hswebframework.web.authorization.AuthenticationInitializeService
import org.hswebframework.web.authorization.access.DataAccessConfig
import org.hswebframework.web.tests.HswebCrudWebApiSpecification
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
@@ -27,32 +29,26 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
/**
* @author zhouhao
* @since
* @since 3.0
*/
@WebAppConfiguration
@ContextConfiguration
@SpringBootTest(classes = [TestApplication.class], properties = ["classpath:application.yml"])
class UserSettingControllerTest extends Specification {
@Autowired
private ConfigurableApplicationContext context;
@Shared
private MockMvc mockMvc;
class UserSettingControllerTest extends HswebCrudWebApiSpecification {
@Autowired
private AuthenticationInitializeService initializeService;
void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
@Override
protected String getBaseApi() {
return "/autz-setting"
}
def "Add Permission"() {
def permissions = [
[
"id" : "user",
"name" : "用户管理",
"actions": [["action": "query", "describe": "查询"], ["action": "update", "describe": "修改"]]
"id" : "user",
"name" : "用户管理",
"actions" : [["action": "query", "describe": "查询"], ["action": "update", "describe": "修改"]],
"supportDataAccessTypes": [DataAccessConfig.DefaultType.DENY_FIELDS]
],
[
"id" : "role",
@@ -99,45 +95,52 @@ class UserSettingControllerTest extends Specification {
"Add Permission"()
def userId = "Add User"()
//添加用户权限
mockMvc.perform(
post("/autz-setting")
.contentType(MediaType.APPLICATION_JSON)
.content(JSON.toJSONString
([
type : "user", //设置类型:user
settingFor: userId, //设置给具体的user
describe : "测试",
details :
doAddRequest(JSON.toJSONString
([
type : "user", //设置类型:user
settingFor: userId, //设置给具体的user
describe : "测试",
details :
[
[
[
permissionId: "user", //赋予user权限
actions : ["query", "update"],
status : 1
],
[
permissionId: "role", //赋予role权限
actions : ["query", "get"],
status : 1
permissionId: "user", //赋予user权限
actions : ["query", "update"],
status : 1,
dataAccesses: [ //数据权限,控制查询的时候不能查询password字段
[
type : DataAccessConfig.DefaultType.DENY_FIELDS,
action: "query",
config: """{"fields": ["password"]}"""
]
]
],
menus :
[
[
menuId: "user-menu"
],
[
menuId: "role-menu"
]
permissionId: "role", //赋予role权限
actions : ["query", "get"],
status : 1
]
])
)).andDo({ result -> println result.response.contentAsString })
// .andExpect(status().is(201))
],
menus :
[
[
menuId: "user-menu"
],
[
menuId: "role-menu"
]
]
]))
expect:
userId != null
def autz = initializeService.initUserAuthorization(userId)
autz != null
autz.hasPermission("user", "query")
autz.hasPermission("role", "query", "get")
autz.getPermission("user")
.map({ per -> per.findDenyFields("query") })
.map({ fields -> fields.contains("password") })
.orElse(false)
}
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-authorization</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-system-config</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-system-config</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-config</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-system-config</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -23,7 +23,7 @@
<parent>
<artifactId>hsweb-system</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-dashboard</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-dashboard</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-dashboard</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -68,8 +68,7 @@
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<artifactId>javax.servlet-api</artifactId>
<scope>test</scope>
</dependency>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-dashboard</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-database-manager</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-database-manager</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-database-manager</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-database-manager</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>hsweb-system-datasource</artifactId>
<groupId>org.hswebframework.web</groupId>
<version>3.0.2-SNAPSHOT</version>
<version>3.0.3-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

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