diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java index fbe205c7f..28f5d33e1 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java @@ -43,7 +43,7 @@ public interface Authentication extends Serializable { * //如果权限信息不存在将抛出{@link NoSuchElementException}建议使用下面的方式获取 * Authentication auth=Authentication.current().orElse(null); * //或者 - * Authentication auth=Authentication.current().orElseThrow(AuthorizeException::new); + * Authentication auth=Authentication.current().orElseThrow(UnAuthorizedException::new); * * * @return 返回Optional对象进行操作 diff --git a/hsweb-authorization/hsweb-authorization-cloud/pom.xml b/hsweb-authorization/hsweb-authorization-cloud/pom.xml new file mode 100644 index 000000000..dd4580bc8 --- /dev/null +++ b/hsweb-authorization/hsweb-authorization-cloud/pom.xml @@ -0,0 +1,32 @@ + + + + hsweb-authorization + org.hswebframework.web + 3.0-SNAPSHOT + + 4.0.0 + + hsweb-authorization-cloud + + + + org.hswebframework.web + hsweb-authorization-api + ${project.version} + + + org.springframework.cloud + spring-cloud-netflix-core + 1.3.1.RELEASE + true + + + org.springframework + spring-web + true + + + \ No newline at end of file diff --git a/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/feign/FeignUserTokenManager.java b/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/feign/FeignUserTokenManager.java new file mode 100644 index 000000000..7a66c0a10 --- /dev/null +++ b/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/feign/FeignUserTokenManager.java @@ -0,0 +1,69 @@ +package org.hswebframework.web.authorization.cloud.feign; + +import org.hswebframework.web.authorization.token.TokenState; +import org.hswebframework.web.authorization.token.UserToken; +import org.hswebframework.web.authorization.token.UserTokenManager; +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author zhouhao + * @since + */ +@FeignClient(name = "${hsweb.cloud.user-center.name:user-center}") +public interface FeignUserTokenManager extends UserTokenManager { + + @Override + @GetMapping("/user-token/token/{token}") + UserToken getByToken(@PathVariable String token); + + @Override + @GetMapping("/user-token/user/{userId}") + List getByUserId(@PathVariable String userId); + + @Override + @GetMapping("/user-token/user/{userId}/logged") + boolean userIsLoggedIn(@PathVariable String userId); + + @Override + @GetMapping("/user-token/token/{token}/logged") + boolean tokenIsLoggedIn(@PathVariable String token); + + @Override + @GetMapping("/user-token/user/total") + long totalUser(); + + @Override + @GetMapping("/user-token/token/total") + long totalToken(); + + @Override + @GetMapping("/user-token}") + List allLoggedUser(); + + @Override + @DeleteMapping("/user-token/user/{userId}") + void signOutByUserId(@PathVariable String userId); + + @Override + @DeleteMapping("/user-token/token/{token}") + void signOutByToken(@PathVariable String token); + + @Override + @PutMapping("/user-token/user/{userId}/{state}") + void changeUserState(@PathVariable String userId, @PathVariable TokenState state); + + @Override + @PutMapping("/user-token/token/{token}/{state}") + void changeTokenState(String token, TokenState state); + + @Override + @PostMapping("/user-token/{token}/{userId}/{maxInactiveInterval}") + UserToken signIn(@PathVariable String token, @PathVariable String userId, @PathVariable long maxInactiveInterval); + + @Override + @GetMapping("/user-token/{token}/touch") + void touch(String token); +} diff --git a/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/redis/RedisUserTokenManager.java b/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/redis/RedisUserTokenManager.java new file mode 100644 index 000000000..c8b1e200c --- /dev/null +++ b/hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/redis/RedisUserTokenManager.java @@ -0,0 +1,12 @@ +package org.hswebframework.web.authorization.cloud.redis; + +import org.hswebframework.web.authorization.token.UserTokenManager; + +/** + * TODO 完成注释 + * + * @author zhouhao + * @since + */ +public abstract class RedisUserTokenManager implements UserTokenManager { +} diff --git a/hsweb-authorization/pom.xml b/hsweb-authorization/pom.xml index 76bc23df4..dbd3963d3 100644 --- a/hsweb-authorization/pom.xml +++ b/hsweb-authorization/pom.xml @@ -16,6 +16,7 @@ hsweb-authorization-oauth2 hsweb-authorization-basic hsweb-authorization-jwt + hsweb-authorization-cloud diff --git a/hsweb-examples/pom.xml b/hsweb-examples/pom.xml index ce489609e..8a2932259 100644 --- a/hsweb-examples/pom.xml +++ b/hsweb-examples/pom.xml @@ -33,6 +33,7 @@ hsweb-examples-oauth2 hsweb-examples-custom-entity hsweb-examples-workflow + hsweb-examples-cloud diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java index d8c2570c7..43264800c 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/DefaultLocalTransactionExecutor.java @@ -23,7 +23,7 @@ import java.util.function.Consumer; import java.util.stream.Collectors; /** - * TODO 完成注释 + * 默认的事务执行器 * * @author zhouhao */ @@ -51,6 +51,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { private volatile boolean running = false; + /* 线程循环开始等待sql进入的时候执行一次,sql进入的时候执行一次,然后唤醒线程开始执行sql */ private CyclicBarrier waitToReady = new CyclicBarrier(2); private CountDownLatch waitClose = new CountDownLatch(1); @@ -83,8 +84,10 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { try { logger.debug("wait transaction {} close", transactionId); if (!running) { + //先唤醒执行,继续执行任务 waitToReady.await(); } + //等待执行结束 waitClose.await(); } catch (Exception e) { throw new RuntimeException(e); @@ -136,18 +139,20 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { if (datasourceId != null) { DataSourceHolder.switcher().use(datasourceId); } + //开启事务 transactionStatus = transactionTemplate.getTransactionManager().getTransaction(transactionTemplate); if (sqlRequestExecutor == null) { buildDefaultSqlRequestExecutor(); } while (!shutdown) { logger.debug("wait sql execute request {}", transactionId); - waitToReady.await(); - waitToReady.reset(); + waitToReady.await();//等待有新的sql进来 + waitToReady.reset();//重置,下一次循环继续等待 + //执行sql doExecute(); } } catch (Exception e) { - rollback(); + rollback();//回滚 logger.error("execute sql error {}", transactionId, e); } finally { try { @@ -158,6 +163,7 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { logger.debug("Roll Back transaction {}", transactionId); transactionTemplate.getTransactionManager().rollback(transactionStatus); } + //结束事务 waitClose.countDown(); } finally { DataSourceHolder.switcher().reset(); @@ -171,15 +177,18 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { running = true; logger.debug("start execute sql {}", transactionId); try { - List requests = execution.request.getSql().stream() + List requests = execution.request.getSql() + .stream() .map(sqlInfo -> { try { + //执行sql return sqlRequestExecutor.apply(sqlExecutor, sqlInfo); } catch (SQLException e) { throw new RuntimeException(e); } }) .collect(Collectors.toList()); + //通过回调返回执行结果 execution.callback.accept(requests); } catch (Exception e) { rollback(); @@ -194,9 +203,11 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { if (shutdown) { throw new UnsupportedOperationException("transaction is close"); } + //执行倒计时,执行sql是异步的,通过此方式等待sql执行完毕 CountDownLatch countDownLatch = new CountDownLatch(1); List results = new ArrayList<>(); + //异常信息 Exception[] exceptions = new Exception[1]; Execution execution = new Execution(); @@ -213,9 +224,12 @@ public class DefaultLocalTransactionExecutor implements TransactionExecutor { logger.debug("submit sql execute job {}", transactionId); executionQueue.add(execution); try { + //当前没有在执行sql,说明现在正在等待新的sql进入,唤醒之 if (!running) waitToReady.await(); + //等待sql执行完毕 countDownLatch.await(); + //判断是否有异常 Exception exception; if ((exception = exceptions[0]) != null) { if (exception instanceof RuntimeException) { diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java index f5e424be9..dad999463 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java @@ -95,6 +95,7 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService { @Override public Map> getMetas(String datasourceId) { + return null; } } diff --git a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/TransactionExecutor.java b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/TransactionExecutor.java index 815bcabc0..f34330509 100644 --- a/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/TransactionExecutor.java +++ b/hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/TransactionExecutor.java @@ -6,8 +6,6 @@ import org.hswebframework.web.database.manager.SqlExecuteResult; import java.util.List; /** - * TODO 完成注释 - * * @author zhouhao */ public interface TransactionExecutor extends Runnable { diff --git a/pom.xml b/pom.xml index 9763bc10d..c88333197 100644 --- a/pom.xml +++ b/pom.xml @@ -43,8 +43,7 @@ pom - - ${project.groupId}:${project.artifactId} + hsweb framework http://www.hswebframework.org hsweb (haʊs wɛb) 是一个用于快速搭建企业后台管理系统的基础项目,集成一揽子便捷功能如:通用增删改查,在线代码生成,权限管理(可控制到列和行),动态多数据源分布式事务,动态脚本,动态定时任务,在线数据库维护等等 @@ -160,6 +159,18 @@ + + + sonatype-releases + sonatype repository + https://oss.sonatype.org/service/local/staging/deploy/maven2 + + + sonatype-snapshots + Nexus Snapshot Repository + https://oss.sonatype.org/content/repositories/snapshots + + @@ -190,36 +201,36 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -375,29 +386,17 @@ http://maven.aliyun.com/nexus/content/groups/public/ - - - - - - - - - - - - - sonatype-releases - sonatype repository - https://oss.sonatype.org/service/local/staging/deploy/maven2 + releases + Nexus Release Repository + http://nexus.hsweb.me/content/repositories/releases/ - sonatype-snapshots + snapshots Nexus Snapshot Repository - https://oss.sonatype.org/content/repositories/snapshots + http://nexus.hsweb.me/content/repositories/snapshots/ @@ -411,9 +410,9 @@ - aliyun-nexus - aliyun - http://maven.aliyun.com/nexus/content/groups/public/ + aliyun-nexus + aliyun + http://maven.aliyun.com/nexus/content/groups/public/ \ No newline at end of file