list = this.selectList(wrapper);
- if (CollUtil.isEmpty(list)) {
- return CollUtil.newArrayList();
- }
- return BeanCopyUtil.copyList(list, voClass);
- }
-
- /**
- * 分页查询Vo
- *
- * @param page 分页对象
- * @param wrapper 条件
- * @param 泛型
- * @return IPage
- */
- default
> P selectVoPage(IPage page, Wrapper wrapper) {
- return selectVoPage(page, wrapper, this.currentVoClass());
- }
-
- /**
- * 分页查询Vo
- *
- * @param page 分页对象
- * @param wrapper 条件
- * @param voClass Vo
- * @param 泛型
- * @param 泛型
- * @return IPage
- */
- default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) {
- IPage pageData = this.selectPage(page, wrapper);
- IPage voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal());
- if (CollUtil.isEmpty(pageData.getRecords())) {
- return (P) voPage;
- }
- voPage.setRecords(BeanCopyUtil.copyList(pageData.getRecords(), voClass));
- return (P) voPage;
- }
-
-}
diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/monitor/DatasourceConnectionMonitor.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/monitor/DatasourceConnectionMonitor.java
index e22156e..945cc11 100644
--- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/monitor/DatasourceConnectionMonitor.java
+++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/monitor/DatasourceConnectionMonitor.java
@@ -2,6 +2,8 @@ package com.qiaoba.common.database.monitor;
import cn.hutool.core.io.IoUtil;
import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
import com.qiaoba.common.base.constants.TenantConstant;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
@@ -34,12 +36,16 @@ public class DatasourceConnectionMonitor {
private DynamicDataSourceConfig dynamicDataSourceConfig;
@Resource
private DynamicDatasourceService dynamicDatasourceService;
+ @Resource
+ private LockTemplate lockTemplate;
private static Map WAIT_UPDATE_DATASOURCE_STATUS = new ConcurrentHashMap<>();
+ private static final String LOCK_KEY = "lock4j:datasourceConnectionMonitor";
+
@PostConstruct
public void init() {
- // 1s钟运行一次
+ // 1s 运行一次
new Timer().schedule(new TimerTask() {
@Override
public void run() {
@@ -47,47 +53,77 @@ public class DatasourceConnectionMonitor {
if (!DynamicDataSourceConfig.COMPLETE_LOAD_DATASOURCE) {
return;
}
- log.trace("开始运行数据源监控线程, 时间: {}", new Date());
- for (String tenantId : DynamicDataSourceConfig.TENANT_IDS) {
- Object primary = DynamicDataSourceConfig.PRIMARY_DATASOURCE_MAP.get(tenantId);
- if (Objects.isNull(primary)) {
- // 说明初始化主要数据源的时候出错
- log.error("租户[{}]-目前主数据源异常, 开始切换备用数据源", tenantId);
- // 切换备用数据源
- changePrimary(tenantId);
- } else {
- DruidDataSource dataSource = (DruidDataSource) primary;
- try {
- Connection connection = dataSource.getConnection();
- if (check(connection, tenantId)) {
- // 说明数据源正常
- log.trace("租户[{}]-目前主数据源正常, 无需切换数据源", tenantId);
- // 主数据 处理任务
- if (TenantConstant.DEFAULT_TENANT_ID.equals(tenantId)) {
- handleJob();
- }
- IoUtil.close(connection);
- continue;
- }
- log.error("租户[{}]-目前主数据源异常, 开始切换备用数据源", tenantId);
- IoUtil.close(connection);
- // 主数据源异常 切换备用数据源
- if (changePrimary(tenantId)) {
- // 备用切换成功, 关闭原有异常数据源
- IoUtil.close(dataSource);
- }
- } catch (SQLException e) {
- //e.printStackTrace();
- }
- }
+ // expire = -1 锁自动续期, 防止数据源过多或异常等待, 超过默认锁 30s
+ final LockInfo lockInfo = lockTemplate.lock(LOCK_KEY, -1, 1000);
+ //申请锁失败 说明集群中其他设备正在执行监控
+ if (null == lockInfo) {
+ return;
+ }
+ //申请锁成功
+ try {
+ // 执行监控
+ datasourceConnectionMonitor();
+ } finally {
+ // 释放锁
+ lockTemplate.releaseLock(lockInfo);
}
- log.trace("结束运行数据源监控线程, 时间: {}", new Date());
}
}, 0, 1000);
}
+ /**
+ * 核心监控内容
+ */
+ private void datasourceConnectionMonitor() {
+ log.trace("开始运行数据源监控线程, 时间: {}", new Date());
+ for (String tenantId : DynamicDataSourceConfig.TENANT_IDS) {
+ Object primary = DynamicDataSourceConfig.PRIMARY_DATASOURCE_MAP.get(tenantId);
+ if (Objects.isNull(primary)) {
+ // 说明初始化主要数据源的时候出错
+ log.error("租户[{}]-目前主数据源异常, 开始切换备用数据源", tenantId);
+ // 切换备用数据源
+ changePrimary(tenantId);
+ } else {
+ DruidDataSource dataSource = (DruidDataSource) primary;
+ Connection connection = null;
+ try {
+ connection = dataSource.getConnection();
+ if (check(connection, tenantId)) {
+ // 说明数据源正常
+ log.trace("租户[{}]-目前主数据源正常, 无需切换数据源", tenantId);
+ // 主数据 处理任务
+ if (TenantConstant.DEFAULT_TENANT_ID.equals(tenantId)) {
+ handleJob();
+ }
+ continue;
+ }
+
+ log.error("租户[{}]-目前主数据源异常, 开始切换备用数据源", tenantId);
+ // 主数据源异常 切换备用数据源
+ if (changePrimary(tenantId)) {
+ // 备用切换成功, 关闭原有异常数据源
+ IoUtil.close(dataSource);
+ }
+ } catch (SQLException e) {
+
+ } finally {
+ IoUtil.close(connection);
+ }
+ }
+ }
+
+ log.trace("结束运行数据源监控线程, 时间: {}", new Date());
+ }
+
+ /**
+ * 检查数据源连接可用性
+ *
+ * @param conn 数据源
+ * @param tenantId 租户ID
+ * @return 结果
+ */
private Boolean check(Connection conn, String tenantId) {
Statement stmt = null;
ResultSet rs = null;
diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/DataSourceProperties.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/DataSourceProperties.java
index 2a0e2b7..3b0025a 100644
--- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/DataSourceProperties.java
+++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/properties/DataSourceProperties.java
@@ -8,7 +8,13 @@ import org.springframework.stereotype.Component;
import java.util.List;
-
+/**
+ * DataSourceProperties
+ *
+ * @author ailanyin
+ * @version 1.0
+ * @since 2022-09-22 04:20:28
+ */
@Component
@ConfigurationProperties(prefix = "qiaoba")
@Data
diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java
index 5096e69..b9d5ad4 100644
--- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java
+++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java
@@ -5,7 +5,8 @@ import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.exceptions.ServiceException;
import lombok.extern.slf4j.Slf4j;
-import java.sql.*;
+import java.sql.Connection;
+import java.sql.DriverManager;
/**
* JdbcUtil
diff --git a/qiaoba-commons/qiaoba-common-doc/pom.xml b/qiaoba-commons/qiaoba-common-doc/pom.xml
index 6f50280..b91c5f6 100644
--- a/qiaoba-commons/qiaoba-common-doc/pom.xml
+++ b/qiaoba-commons/qiaoba-common-doc/pom.xml
@@ -11,6 +11,8 @@
qiaoba-common-doc
+ 通用-文档(Knife4j)模块
+
com.github.xiaoymin
@@ -21,4 +23,4 @@
springdoc-openapi-ui
-
\ No newline at end of file
+
diff --git a/qiaoba-commons/qiaoba-common-poi/pom.xml b/qiaoba-commons/qiaoba-common-poi/pom.xml
index 4569924..6e0c751 100644
--- a/qiaoba-commons/qiaoba-common-poi/pom.xml
+++ b/qiaoba-commons/qiaoba-common-poi/pom.xml
@@ -11,6 +11,8 @@
qiaoba-common-poi
+ 通用-poi(Excel, Word, Pdf等)模块
+
diff --git a/qiaoba-commons/qiaoba-common-redis/pom.xml b/qiaoba-commons/qiaoba-common-redis/pom.xml
index 1baa64b..e5f4432 100644
--- a/qiaoba-commons/qiaoba-common-redis/pom.xml
+++ b/qiaoba-commons/qiaoba-common-redis/pom.xml
@@ -11,11 +11,13 @@
qiaoba-common-redis
+ 通用-Redis模块
+
com.baomidou
- lock4j-redis-template-spring-boot-starter
+ lock4j-redisson-spring-boot-starter
com.qiaoba
diff --git a/qiaoba-commons/qiaoba-common-web/pom.xml b/qiaoba-commons/qiaoba-common-web/pom.xml
index b8b0f39..2261c7a 100644
--- a/qiaoba-commons/qiaoba-common-web/pom.xml
+++ b/qiaoba-commons/qiaoba-common-web/pom.xml
@@ -11,6 +11,8 @@
qiaoba-common-web
+ 通用-Web模块(有controller的模块必须引入此模块)
+
com.qiaoba
diff --git a/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/BeanCopyUtil.java b/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/BeanCopyUtil.java
deleted file mode 100644
index cea92b5..0000000
--- a/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/BeanCopyUtil.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.qiaoba.common.web.utils;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.SimpleCache;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.springframework.cglib.beans.BeanCopier;
-import org.springframework.cglib.beans.BeanMap;
-import org.springframework.cglib.core.Converter;
-
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-/**
- * bean深拷贝工具(基于 cglib 性能优异)
- *
- * 重点 cglib 不支持 拷贝到链式对象
- * 例如: 源对象 拷贝到 目标(链式对象)
- * 请区分好`浅拷贝`和`深拷贝`再做使用
- *
- * @author ailanyin
- * @version 1.0
- * @since 2023-04-23 15:34:59
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class BeanCopyUtil {
-
- /**
- * 单对象基于class创建拷贝
- *
- * @param source 数据来源实体
- * @param desc 描述对象 转换后的对象
- * @return desc
- */
- public static V copy(T source, Class desc) {
- if (ObjectUtil.isNull(source)) {
- return null;
- }
- if (ObjectUtil.isNull(desc)) {
- return null;
- }
- final V target = ReflectUtil.newInstanceIfPossible(desc);
- return copy(source, target);
- }
-
- /**
- * 单对象基于对象创建拷贝
- *
- * @param source 数据来源实体
- * @param desc 转换后的对象
- * @return desc
- */
- public static V copy(T source, V desc) {
- if (ObjectUtil.isNull(source)) {
- return null;
- }
- if (ObjectUtil.isNull(desc)) {
- return null;
- }
- BeanCopier beanCopier = BeanCopierCache.INSTANCE.get(source.getClass(), desc.getClass(), null);
- beanCopier.copy(source, desc, null);
- return desc;
- }
-
- /**
- * 列表对象基于class创建拷贝
- *
- * @param sourceList 数据来源实体列表
- * @param desc 描述对象 转换后的对象
- * @return desc
- */
- public static List copyList(List sourceList, Class desc) {
- if (ObjectUtil.isNull(sourceList)) {
- return null;
- }
- if (CollUtil.isEmpty(sourceList)) {
- return CollUtil.newArrayList();
- }
- return toList(sourceList, source -> {
- V target = ReflectUtil.newInstanceIfPossible(desc);
- copy(source, target);
- return target;
- });
- }
-
- /**
- * bean拷贝到map
- *
- * @param bean 数据来源实体
- * @return map对象
- */
- @SuppressWarnings("unchecked")
- public static Map copyToMap(T bean) {
- if (ObjectUtil.isNull(bean)) {
- return null;
- }
- return BeanMap.create(bean);
- }
-
- /**
- * map拷贝到bean
- *
- * @param map 数据来源
- * @param beanClass bean类
- * @return bean对象
- */
- public static T mapToBean(Map map, Class beanClass) {
- if (MapUtil.isEmpty(map)) {
- return null;
- }
- if (ObjectUtil.isNull(beanClass)) {
- return null;
- }
- T bean = ReflectUtil.newInstanceIfPossible(beanClass);
- return mapToBean(map, bean);
- }
-
- /**
- * map拷贝到bean
- *
- * @param map 数据来源
- * @param bean bean对象
- * @return bean对象
- */
- public static T mapToBean(Map map, T bean) {
- if (MapUtil.isEmpty(map)) {
- return null;
- }
- if (ObjectUtil.isNull(bean)) {
- return null;
- }
- BeanMap.create(bean).putAll(map);
- return bean;
- }
-
- /**
- * map拷贝到map
- *
- * @param map 数据来源
- * @param clazz 返回的对象类型
- * @return map对象
- */
- public static Map mapToMap(Map map, Class clazz) {
- if (MapUtil.isEmpty(map)) {
- return null;
- }
- if (ObjectUtil.isNull(clazz)) {
- return null;
- }
- Map copyMap = new LinkedHashMap<>(map.size());
- map.forEach((k, v) -> copyMap.put(k, copy(v, clazz)));
- return copyMap;
- }
-
- /**
- * BeanCopier属性缓存
- * 缓存用于防止多次反射造成的性能问题
- *
- * @author Looly
- * @since 5.4.1
- */
- public enum BeanCopierCache {
- /**
- * BeanCopier属性缓存单例
- */
- INSTANCE;
-
- private final SimpleCache cache = new SimpleCache<>();
-
- /**
- * 获得类与转换器生成的key在{@link BeanCopier}的Map中对应的元素
- *
- * @param srcClass 源Bean的类
- * @param targetClass 目标Bean的类
- * @param converter 转换器
- * @return Map中对应的BeanCopier
- */
- public BeanCopier get(Class> srcClass, Class> targetClass, Converter converter) {
- final String key = genKey(srcClass, targetClass, converter);
- return cache.get(key, () -> BeanCopier.create(srcClass, targetClass, converter != null));
- }
-
- /**
- * 获得类与转换器生成的key
- *
- * @param srcClass 源Bean的类
- * @param targetClass 目标Bean的类
- * @param converter 转换器
- * @return 属性名和Map映射的key
- */
- private String genKey(Class> srcClass, Class> targetClass, Converter converter) {
- final StringBuilder key = StrUtil.builder()
- .append(srcClass.getName()).append('#').append(targetClass.getName());
- if (null != converter) {
- key.append('#').append(converter.getClass().getName());
- }
- return key.toString();
- }
- }
-
- /**
- * 将collection转化为List集合,但是两者的泛型不同
- * {@code Collection ------> List }
- *
- * @param collection 需要转化的集合
- * @param function collection中的泛型转化为list泛型的lambda表达式
- * @param collection中的泛型
- * @param List中的泛型
- * @return 转化后的list
- */
- private static List toList(Collection collection, Function function) {
- if (CollUtil.isEmpty(collection)) {
- return CollUtil.newArrayList();
- }
- return collection
- .stream()
- .map(function)
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- }
-
-}
diff --git a/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/ResponseUtil.java b/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/ResponseUtil.java
index e3c9989..a811b1c 100644
--- a/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/ResponseUtil.java
+++ b/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/utils/ResponseUtil.java
@@ -1,7 +1,6 @@
package com.qiaoba.common.web.utils;
import cn.hutool.http.ContentType;
-import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.qiaoba.common.base.result.AjaxResult;
diff --git a/qiaoba-modules/pom.xml b/qiaoba-modules/pom.xml
index bc11a97..ff7861b 100644
--- a/qiaoba-modules/pom.xml
+++ b/qiaoba-modules/pom.xml
@@ -20,4 +20,6 @@
qiaoba-module-demo
+ qiaoba-modules: 新建的模块, 统一放在这个模块下面
+
diff --git a/qiaoba-modules/qiaoba-module-demo/pom.xml b/qiaoba-modules/qiaoba-module-demo/pom.xml
index e3b71e2..a336de2 100644
--- a/qiaoba-modules/qiaoba-module-demo/pom.xml
+++ b/qiaoba-modules/qiaoba-module-demo/pom.xml
@@ -11,6 +11,10 @@
qiaoba-module-demo
+
+ 示例模块
+ 此模块主要用于典型案例的demo, 切勿引入到 qiaoba-application 模块中
+
com.qiaoba
@@ -24,5 +28,9 @@
com.qiaoba
qiaoba-common-web
+
+ com.qiaoba
+ qiaoba-common-doc
+
-
\ No newline at end of file
+
diff --git a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/DemoApplication.java b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/DemoApplication.java
new file mode 100644
index 0000000..b7643a1
--- /dev/null
+++ b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/DemoApplication.java
@@ -0,0 +1,18 @@
+package com.qiaoba.module.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * DemoApplication
+ *
+ * @author ailanyin
+ * @version 1.0
+ * @since 2023/6/25 8:52
+ */
+@SpringBootApplication
+public class DemoApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+}
diff --git a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/Lock4jController.java b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/DemoLock4jController.java
similarity index 56%
rename from qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/Lock4jController.java
rename to qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/DemoLock4jController.java
index 7ac818f..911369f 100644
--- a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/Lock4jController.java
+++ b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/controller/DemoLock4jController.java
@@ -2,22 +2,34 @@ package com.qiaoba.module.demo.controller;
import com.baomidou.lock.annotation.Lock4j;
import com.qiaoba.common.base.result.AjaxResult;
-import com.qiaoba.module.demo.service.Lock4jService;
+import com.qiaoba.module.demo.service.DemoLock4jService;
+import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+/**
+ * Demo-Lock4j web层
+ *
+ * @author ailanyin
+ * @version 1.0
+ * @since 2022-09-22 04:20:28
+ */
@RestController
@RequestMapping("/demo/lock4j")
@RequiredArgsConstructor
-public class Lock4jController {
+@Tag(name = "Demo-Lock4j")
+@Slf4j
+public class DemoLock4jController {
- private final Lock4jService lock4jService;
+ private final DemoLock4jService demoLock4JService;
@GetMapping("/api-lock")
public AjaxResult apiLock() {
- lock4jService.apiLock();
+ log.info("开始执行 apiLock, 当前线程{}", Thread.currentThread().getName());
+ demoLock4JService.apiLock();
return AjaxResult.success();
}
@@ -29,9 +41,10 @@ public class Lock4jController {
* @return AjaxResult
*/
@GetMapping("/annotation-lock")
- @Lock4j(keys = {"#accountId"}, expire = 20000, acquireTimeout = 10000)
+ @Lock4j(name = "annotationLock", acquireTimeout = 1000)
public AjaxResult annotationLock() {
- lock4jService.annotationLock();
+ log.info("开始执行 annotationLock, 当前线程{}", Thread.currentThread().getName());
+ demoLock4JService.annotationLock();
return AjaxResult.success();
}
}
diff --git a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/Lock4jService.java b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/DemoLock4jService.java
similarity index 58%
rename from qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/Lock4jService.java
rename to qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/DemoLock4jService.java
index 91e1904..ada38d1 100644
--- a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/Lock4jService.java
+++ b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/DemoLock4jService.java
@@ -1,6 +1,13 @@
package com.qiaoba.module.demo.service;
-public interface Lock4jService {
+/**
+ * Demo-Lock4j 业务层
+ *
+ * @author ailanyin
+ * @version 1.0
+ * @since 2022-09-22 04:20:28
+ */
+public interface DemoLock4jService {
/**
* 分布式锁-编程式加锁
diff --git a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/Lock4jServiceImpl.java b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/DemoLock4jServiceImpl.java
similarity index 62%
rename from qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/Lock4jServiceImpl.java
rename to qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/DemoLock4jServiceImpl.java
index 6581658..5df16f6 100644
--- a/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/Lock4jServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-demo/src/main/java/com/qiaoba/module/demo/service/impl/DemoLock4jServiceImpl.java
@@ -4,15 +4,22 @@ import cn.hutool.core.thread.ThreadUtil;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import com.qiaoba.common.base.exceptions.ServiceException;
-import com.qiaoba.module.demo.service.Lock4jService;
+import com.qiaoba.module.demo.service.DemoLock4jService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
+/**
+ * Demo-Lock4j 业务层实现
+ *
+ * @author ailanyin
+ * @version 1.0
+ * @since 2022-09-22 04:20:28
+ */
@Service
@RequiredArgsConstructor
@Slf4j
-public class Lock4jServiceImpl implements Lock4jService {
+public class DemoLock4jServiceImpl implements DemoLock4jService {
private final LockTemplate lockTemplate;
@@ -20,15 +27,16 @@ public class Lock4jServiceImpl implements Lock4jService {
public void apiLock() {
//... 各种不需要上锁的操作
String lockKey = "lock4j:apiLock";
- final LockInfo lockInfo = lockTemplate.lock(lockKey);
+ // expire = -1 锁自动续期
+ final LockInfo lockInfo = lockTemplate.lock(lockKey, -1, 1000);
//申请锁失败
if (null == lockInfo) {
throw new ServiceException("业务处理中,请稍后再试...");
}
//申请锁成功
try {
- ThreadUtil.sleep(10 * 1000);
- log.info("执行 apiLock, 当前线程{}", Thread.currentThread().getName());
+ ThreadUtil.sleep(30 * 1000);
+ log.info("执行完毕 apiLock, 当前线程{}", Thread.currentThread().getName());
} finally {
lockTemplate.releaseLock(lockInfo);
}
@@ -38,6 +46,6 @@ public class Lock4jServiceImpl implements Lock4jService {
public void annotationLock() {
// 休眠 10s
ThreadUtil.sleep(10 * 1000);
- log.info("执行 apiLock, 当前线程{}", Thread.currentThread().getName());
+ log.info("执行完毕 annotationLock, 当前线程{}", Thread.currentThread().getName());
}
}
diff --git a/qiaoba-modules/qiaoba-module-demo/src/main/resources/application.yml b/qiaoba-modules/qiaoba-module-demo/src/main/resources/application.yml
new file mode 100644
index 0000000..569bc21
--- /dev/null
+++ b/qiaoba-modules/qiaoba-module-demo/src/main/resources/application.yml
@@ -0,0 +1,15 @@
+server:
+ port: 8080
+
+springdoc:
+ swagger-ui:
+ path: /swagger-ui.html
+ tags-sorter: alpha
+ operations-sorter: alpha
+ api-docs:
+ path: /v3/api-docs
+ group-configs:
+ - group: 'Demo'
+ paths-to-match: '/**'
+ packages-to-scan: com.qiaoba.module.demo.controller
+
diff --git a/qiaoba-modules/qiaoba-module-file/pom.xml b/qiaoba-modules/qiaoba-module-file/pom.xml
index 635c010..f87c924 100644
--- a/qiaoba-modules/qiaoba-module-file/pom.xml
+++ b/qiaoba-modules/qiaoba-module-file/pom.xml
@@ -11,6 +11,8 @@
qiaoba-module-file
+ 文件模块
+
com.qiaoba
diff --git a/qiaoba-modules/qiaoba-module-job/pom.xml b/qiaoba-modules/qiaoba-module-job/pom.xml
index a0f3eb0..3ed04b3 100644
--- a/qiaoba-modules/qiaoba-module-job/pom.xml
+++ b/qiaoba-modules/qiaoba-module-job/pom.xml
@@ -11,5 +11,6 @@
qiaoba-module-job
+ 定时任务模块
-
\ No newline at end of file
+
diff --git a/qiaoba-modules/qiaoba-module-monitor/pom.xml b/qiaoba-modules/qiaoba-module-monitor/pom.xml
index a2e4d21..4ec7735 100644
--- a/qiaoba-modules/qiaoba-module-monitor/pom.xml
+++ b/qiaoba-modules/qiaoba-module-monitor/pom.xml
@@ -11,6 +11,8 @@
qiaoba-module-monitor
+ 监控模块
+
com.qiaoba
diff --git a/qiaoba-modules/qiaoba-module-system/pom.xml b/qiaoba-modules/qiaoba-module-system/pom.xml
index e5270cf..656cca1 100644
--- a/qiaoba-modules/qiaoba-module-system/pom.xml
+++ b/qiaoba-modules/qiaoba-module-system/pom.xml
@@ -11,6 +11,8 @@
qiaoba-module-system
+ 系统模块
+
com.qiaoba
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDictTypeController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDictTypeController.java
index fe0fa85..500e723 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDictTypeController.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDictTypeController.java
@@ -41,7 +41,7 @@ public class SysDictTypeController {
@PostMapping("/export")
public void export(HttpServletResponse response, SysDictTypeParam param) throws Exception {
List list = sysDictTypeService.selectList(param);
- ExcelUtil.exportExcel(list, SysDictType.class, "字典类型" , response);
+ ExcelUtil.exportExcel(list, SysDictType.class, "字典类型", response);
}
@PreAuthorize("hasAuthority('system:dict:query')")
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java
index 2c2ee06..625def7 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java
@@ -2,7 +2,6 @@ package com.qiaoba.module.system.controller;
import com.qiaoba.api.system.entity.SysMenu;
import com.qiaoba.api.system.entity.param.SysMenuParam;
-import com.qiaoba.api.system.entity.vo.SysMenuVo;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.module.system.service.SysMenuService;
import io.swagger.v3.oas.annotations.Operation;
@@ -32,7 +31,7 @@ public class SysMenuController {
@GetMapping("/list")
@Operation(summary = "获取列表")
public AjaxResult list(SysMenuParam param) {
- List menus = sysMenuService.selectVoList(param);
+ List menus = sysMenuService.selectList(param);
return AjaxResult.success(menus);
}
@@ -67,7 +66,7 @@ public class SysMenuController {
@GetMapping("/tree-select")
@Operation(summary = "构建菜单树")
public AjaxResult treeSelect(SysMenuParam param) {
- List menus = sysMenuService.selectVoList(param);
+ List menus = sysMenuService.selectList(param);
return AjaxResult.success(sysMenuService.buildMenuTree(menus));
}
@@ -76,7 +75,7 @@ public class SysMenuController {
public AjaxResult roleMenuTreeSelect(@PathVariable("roleId") String roleId) {
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", sysMenuService.selectMenuIdsByRoleId(roleId));
- ajax.put("menus", sysMenuService.buildMenuTree(sysMenuService.selectVoList(new SysMenuParam())));
+ ajax.put("menus", sysMenuService.buildMenuTree(sysMenuService.selectList(new SysMenuParam())));
return ajax;
}
}
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java
index e6cdc0f..c62cf79 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java
@@ -1,9 +1,9 @@
package com.qiaoba.module.system.mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.api.system.entity.SysMenu;
import com.qiaoba.api.system.entity.vo.SysMenuVo;
import com.qiaoba.common.database.annotations.SelectOneRow;
-import com.qiaoba.common.database.mapper.BaseMapperPlus;
import java.util.List;
import java.util.Set;
@@ -15,7 +15,7 @@ import java.util.Set;
* @version 1.0
* @since 2023/5/5 11:36
*/
-public interface SysMenuMapper extends BaseMapperPlus {
+public interface SysMenuMapper extends BaseMapper {
/**
* 校验菜单名称是否唯一
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysLoginService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysLoginService.java
index d459514..8856849 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysLoginService.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysLoginService.java
@@ -1,8 +1,6 @@
package com.qiaoba.module.system.service;
-import com.qiaoba.api.system.entity.SysUser;
import com.qiaoba.api.system.entity.dto.LoginDto;
-import com.qiaoba.common.base.result.AjaxResult;
import java.util.Map;
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java
index 3d329b8..7e3b4ab 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java
@@ -1,6 +1,7 @@
package com.qiaoba.module.system.service;
import cn.hutool.core.lang.tree.Tree;
+import com.qiaoba.api.system.entity.SysMenu;
import com.qiaoba.api.system.entity.vo.RouterVo;
import com.qiaoba.api.system.entity.vo.SysMenuVo;
import com.qiaoba.api.system.service.SysMenuApiService;
@@ -24,7 +25,7 @@ public interface SysMenuService extends SysMenuApiService {
* @param menus 菜单列表
* @return 下拉树结构列表
*/
- List> buildMenuTree(List menus);
+ List> buildMenuTree(List menus);
/**
* 根据角色ID查询菜单树信息
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java
index 61f97e7..4091f61 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java
@@ -56,8 +56,8 @@ public class SysMenuServiceImpl implements SysMenuService {
}
@Override
- public List selectVoList(SysMenuParam param) {
- return sysMenuMapper.selectVoList(param2Wrapper((param)));
+ public List selectList(SysMenuParam param) {
+ return sysMenuMapper.selectList(param2Wrapper((param)));
}
@Override
@@ -81,7 +81,7 @@ public class SysMenuServiceImpl implements SysMenuService {
}
@Override
- public List> buildMenuTree(List menus) {
+ public List> buildMenuTree(List menus) {
TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG.setNameKey(BaseConstant.TREE_KEY_NAME);
return TreeUtil.build(menus, BaseConstant.DEFAULT_PARENT_ID_VALUE, config, (menu, tree) ->
tree.setId(menu.getMenuId())
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java
index 94fe5a8..4f6c774 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java
@@ -11,7 +11,6 @@ import com.qiaoba.api.system.entity.dto.DataScopeDto;
import com.qiaoba.api.system.entity.dto.SysRoleDto;
import com.qiaoba.api.system.entity.param.SysRoleParam;
import com.qiaoba.auth.utils.SecurityUtil;
-import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java
index 266d923..0882871 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserDetailsServiceImpl.java
@@ -1,8 +1,8 @@
package com.qiaoba.module.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
-import com.qiaoba.api.system.entity.SysUser;
import com.qiaoba.api.auth.service.SysUserDetailsApiService;
+import com.qiaoba.api.system.entity.SysUser;
import com.qiaoba.auth.constants.SecurityConstant;
import com.qiaoba.auth.entity.LoginUser;
import com.qiaoba.auth.entity.SecurityUser;
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java
index 84009bc..ea10b98 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java
@@ -14,7 +14,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java
index 7caa2fd..fc913d5 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java
+++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java
@@ -103,7 +103,7 @@ public class SysUserServiceImpl implements SysUserService {
}
@Override
- @DataScope(userAlias = "u",deptAlias = "t2")
+ @DataScope(userAlias = "u", deptAlias = "t2")
public TableDataInfo selectVoPageList(SysUserParam param, PageQuery pageQuery) {
Page page = sysUserMapper.selectVoPageList(pageQuery.build(), param);
return TableDataInfo.build(page);
diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysConfigMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysConfigMapper.xml
index 603bd34..68134f6 100644
--- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysConfigMapper.xml
+++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysConfigMapper.xml
@@ -12,8 +12,9 @@