From 363e8412b8a6dbe38abd67597eaed7fd93212cc3 Mon Sep 17 00:00:00 2001 From: icanci Date: Mon, 9 Jan 2023 00:03:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=89=8D=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=BC=80=E5=8F=91done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/biz/service/ExceptionHolder.java | 17 ++ .../biz/service/NoticeConfigService.java | 12 ++ .../service/impl/NoticeConfigServiceImpl.java | 119 ++++++++++- .../dal/mapper/mapper/NoticeConfigMapper.java | 15 +- .../mybatis/mapper/NoticeConfigMapper.xml | 17 +- .../ddk/admin/views/AdminViewApplication.java | 2 + .../vueboot/src/api/noticeConfigApi.js | 58 +++++ .../resources/vueboot/src/router/index.js | 18 +- .../src/views/config/dialog/appConfigForm.vue | 4 +- .../views/config/dialog/noticeConfigForm.vue | 177 ++++++++++++++++ .../vueboot/src/views/config/noticeConfig.vue | 200 ++++++++++++++++++ .../ddk/web/config/ThrowableUtil.java | 64 ++++++ .../ddk/web/config/WebExceptionAdvice.java | 2 +- .../config/AppConfigController.java | 21 +- .../web/controller/config/AppController.java | 6 +- .../controller/config/GroupController.java | 6 +- .../config/NoticeConfigController.java | 124 +++++++++++ .../web/controller/config/TeamController.java | 6 +- .../ddk/web/form/AppConfigQueryForm.java | 2 +- .../ddk/web/form/NoticeConfigQueryForm.java | 22 ++ .../ddk/web/mapping/BaseWebMapping.java | 3 +- .../loopstack/ddk/web/model/NoticeConfig.java | 8 +- .../ddk/web/model/NoticeConfigListModel.java | 163 ++++++++++++++ .../model/config/NoticeConfigHolderVO.java | 21 ++ .../common/model/config/NoticeConfigVO.java | 24 +-- 25 files changed, 1059 insertions(+), 52 deletions(-) create mode 100644 admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/ExceptionHolder.java create mode 100644 admin/admin-views/src/main/resources/vueboot/src/api/noticeConfigApi.js create mode 100644 admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/noticeConfigForm.vue create mode 100644 admin/admin-views/src/main/resources/vueboot/src/views/config/noticeConfig.vue create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/ThrowableUtil.java create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/NoticeConfigController.java create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/NoticeConfigQueryForm.java create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfigListModel.java create mode 100644 common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigHolderVO.java diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/ExceptionHolder.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/ExceptionHolder.java new file mode 100644 index 0000000..fa28f16 --- /dev/null +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/ExceptionHolder.java @@ -0,0 +1,17 @@ +package cn.icanci.loopstack.ddk.admin.biz.service; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/08 23:18 + */ +public class ExceptionHolder { + private Exception exception; + + public Exception getException() { + return exception; + } + + public void setException(Exception exception) { + this.exception = exception; + } +} diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java index 51d7fa2..8959fa3 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/NoticeConfigService.java @@ -1,9 +1,21 @@ package cn.icanci.loopstack.ddk.admin.biz.service; +import cn.icanci.loopstack.ddk.common.model.PageList; +import cn.icanci.loopstack.ddk.common.model.config.NoticeConfigVO; + +import java.util.List; + /** * @author icanci * @since 1.0 Created in 2023/01/05 21:40 */ public interface NoticeConfigService { + PageList> queryPage(NoticeConfigVO vo, int currentPage, int pageSize); + + void save(List vo,List appUuid); + + List queryByNoticeConfigName(String noticeConfigName); + + List queryByNoticeConfigResource(String noticeConfigResource); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java index 29aa3a5..ccfd3cd 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/NoticeConfigServiceImpl.java @@ -1,13 +1,130 @@ package cn.icanci.loopstack.ddk.admin.biz.service.impl; +import cn.icanci.loopstack.ddk.admin.biz.mapping.config.NoticeConfigMapping; +import cn.icanci.loopstack.ddk.admin.biz.service.BaseService; +import cn.icanci.loopstack.ddk.admin.biz.service.ExceptionHolder; import cn.icanci.loopstack.ddk.admin.biz.service.NoticeConfigService; +import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.NoticeConfigDO; +import cn.icanci.loopstack.ddk.admin.dal.mapper.mapper.NoticeConfigMapper; +import cn.icanci.loopstack.ddk.common.model.PageList; +import cn.icanci.loopstack.ddk.common.model.Paginator; +import cn.icanci.loopstack.ddk.common.model.config.NoticeConfigVO; +import cn.icanci.loopstack.ddk.common.utils.PaginatorUtils; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; /** * @author icanci * @since 1.0 Created in 2023/01/06 21:07 */ @Service -public class NoticeConfigServiceImpl implements NoticeConfigService { +public class NoticeConfigServiceImpl extends BaseService implements NoticeConfigService { + + private static final Logger logger = LoggerFactory.getLogger(NoticeConfigServiceImpl.class); + + @Resource + private NoticeConfigMapper noticeConfigMapper; + @Resource + private NoticeConfigMapping noticeConfigMapping; + @Resource + protected TransactionTemplate transactionTemplate; + + @Override + public PageList> queryPage(NoticeConfigVO vo, int currentPage, int pageSize) { + NoticeConfigDO noticeConfig = new NoticeConfigDO(); + noticeConfig.setEnv(getEnv()); + List noticeConfigList = noticeConfigMapping.dos2vos(noticeConfigMapper.selectList(noticeConfig)); + if (CollectionUtils.isEmpty(noticeConfigList)) { + return new PageList<>(Lists.newArrayList(), new Paginator(0, pageSize, currentPage)); + } + Map> noticeConfigMap = noticeConfigList.stream().collect(Collectors.groupingBy(NoticeConfigVO::getNoticeConfigResource)); + + currentPage = Math.max(currentPage - 1, 0); + + List> ret = noticeConfigMap.values().stream().skip(currentPage).limit(pageSize).collect(Collectors.toList()); + return PaginatorUtils.formatPaginator(ret, currentPage, pageSize); + } + + @Override + public void save(List newNoticeConfigList, List appUuid) { + // 针对集合的需要特殊处理,通过唯一资源进行数据的更新删除插入处理。不根据数据库id + if (CollectionUtils.isEmpty(newNoticeConfigList)) { + return; + } + + NoticeConfigVO noticeConfig = newNoticeConfigList.iterator().next(); + String noticeConfigResource = noticeConfig.getNoticeConfigResource(); + List oldNoticeConfigList = noticeConfigMapping.dos2vos(noticeConfigMapper.queryByNoticeConfigResource(noticeConfigResource, getEnv())); + + Map newMap = newNoticeConfigList.stream().collect(Collectors.toMap(NoticeConfigVO::getAppUuid, x -> x)); + Map oldMap = oldNoticeConfigList.stream().collect(Collectors.toMap(NoticeConfigVO::getAppUuid, x -> x)); + + // 全部 appUuid + Set uuids = Sets.newHashSet(appUuid); + uuids.addAll(oldNoticeConfigList.stream().map(NoticeConfigVO::getAppUuid).collect(Collectors.toList())); + + final ExceptionHolder holder = new ExceptionHolder(); + // 使用声明式事务 + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + protected void doInTransactionWithoutResult(TransactionStatus status) { + try { + for (String uuid : uuids) { + // 数据库有,但是新的vo没有,删除 + if (oldMap.get(uuid) != null && newMap.get(uuid) == null) { + noticeConfigMapper.delete(oldMap.get(uuid).getId()); + } + // 数据库有,新的vo也有,更新 + if (oldMap.get(uuid) != null && newMap.get(uuid) != null) { + NoticeConfigVO noticeConfigVO = newMap.get(uuid); + beforeUpdate(noticeConfigVO); + noticeConfigMapper.update(noticeConfigMapping.vo2do(noticeConfigVO)); + } + // 数据库没有,则插入 + if (oldMap.get(uuid) == null && newMap.get(uuid) != null) { + NoticeConfigVO noticeConfigVO = newMap.get(uuid); + beforeInsert(noticeConfigVO); + noticeConfigMapper.insert(noticeConfigMapping.vo2do(noticeConfigVO)); + } + // 数据库没有,并且新的vo也没有 无需操作 这种情况不可能出现~~~ + // no op + } + } catch (Exception e) { + logger.error("[NoticeConfigService][save] 保存异常,事务回滚"); + status.setRollbackOnly(); + holder.setException(e); + } + } + }); + + if (holder.getException() != null) { + throw new RuntimeException(holder.getException()); + } + } + + @Override + public List queryByNoticeConfigName(String noticeConfigName) { + return noticeConfigMapping.dos2vos(noticeConfigMapper.queryByNoticeConfigName(noticeConfigName, getEnv())); + } + + @Override + public List queryByNoticeConfigResource(String noticeConfigResource) { + return noticeConfigMapping.dos2vos(noticeConfigMapper.queryByNoticeConfigResource(noticeConfigResource, getEnv())); + } } diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/NoticeConfigMapper.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/NoticeConfigMapper.java index a06db4c..c1fe88e 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/NoticeConfigMapper.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/NoticeConfigMapper.java @@ -1,11 +1,12 @@ package cn.icanci.loopstack.ddk.admin.dal.mapper.mapper; -import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.*; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; +import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.NoticeConfigDO; import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + /** * DdkNoticeConfigMapper * ⚠️ 修改之后请勿使用生成器再次生成,否则会覆盖修改 @@ -63,7 +64,7 @@ public interface NoticeConfigMapper { * * @param ddkNoticeConfig 查询条件 **/ - List selectList (NoticeConfigDO ddkNoticeConfig); + List selectList(NoticeConfigDO ddkNoticeConfig); /** * 分页条件查询 @@ -72,7 +73,7 @@ public interface NoticeConfigMapper { * @param page 页 * @param pageSize 每页大小 **/ - List selectPage (@Param("ddkNoticeConfig") NoticeConfigDO ddkNoticeConfig, @Param("page") Integer page, @Param("pageSize") Integer pageSize); + List selectPage(@Param("ddkNoticeConfig") NoticeConfigDO ddkNoticeConfig, @Param("page") Integer page, @Param("pageSize") Integer pageSize); /** * 总量查询 @@ -80,4 +81,8 @@ public interface NoticeConfigMapper { * @param ddkNoticeConfig 查询条件 **/ int total(NoticeConfigDO ddkNoticeConfig); + + List queryByNoticeConfigName(@Param("noticeConfigName") String noticeConfigName, @Param("env") String env); + + List queryByNoticeConfigResource(@Param("noticeConfigResource") String noticeConfigResource, @Param("env") String env); } diff --git a/admin/admin-dal/src/main/resources/mybatis/mapper/NoticeConfigMapper.xml b/admin/admin-dal/src/main/resources/mybatis/mapper/NoticeConfigMapper.xml index d46b402..b481f16 100644 --- a/admin/admin-dal/src/main/resources/mybatis/mapper/NoticeConfigMapper.xml +++ b/admin/admin-dal/src/main/resources/mybatis/mapper/NoticeConfigMapper.xml @@ -144,7 +144,7 @@ `notice_value` = #{noticeValue}, `app_uuid` = #{appUuid} - WHERE `id` = #{id} + WHERE `app_uuid` = #{appUuid} and `notice_config_resource` = #{noticeConfigResource} and `env` = #{env} @@ -209,6 +209,7 @@ and `app_uuid` = #{appUuid} + order by update_time desc @@ -293,4 +294,18 @@ + + + + \ No newline at end of file diff --git a/admin/admin-views/src/main/java/cn/icanci/loopstack/ddk/admin/views/AdminViewApplication.java b/admin/admin-views/src/main/java/cn/icanci/loopstack/ddk/admin/views/AdminViewApplication.java index b8a1205..72c58aa 100644 --- a/admin/admin-views/src/main/java/cn/icanci/loopstack/ddk/admin/views/AdminViewApplication.java +++ b/admin/admin-views/src/main/java/cn/icanci/loopstack/ddk/admin/views/AdminViewApplication.java @@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author icanci @@ -12,6 +13,7 @@ import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = { "cn.icanci.loopstack.ddk" }) @MapperScan(basePackages = { "cn.icanci.loopstack.ddk.admin.dal.mapper" }) @SpringBootApplication +@EnableTransactionManagement public class AdminViewApplication { public static void main(String[] args) { SpringApplication.run(AdminViewApplication.class, args); diff --git a/admin/admin-views/src/main/resources/vueboot/src/api/noticeConfigApi.js b/admin/admin-views/src/main/resources/vueboot/src/api/noticeConfigApi.js new file mode 100644 index 0000000..95bf12b --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/api/noticeConfigApi.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +/** + * 分页查询 + * + * @param noticeConfig noticeConfig + * @param paginator paginator + * @returns {*} + */ +export async function noticeConfigQuery(noticeConfig, paginator) { + return await request({ + url: '/ddk/noticeConfig/query', + method: 'post', + data: { + 'noticeConfig': noticeConfig, + 'paginator': paginator + } + }) +} + +/** + * 保存 + * + * @param noticeConfig noticeConfig + * @returns {*} + */ +export async function saveNoticeConfig(noticeConfig) { + return await request({ + url: '/ddk/noticeConfig/save', + method: 'post', + data: noticeConfig + }) +} + +/** + * remoteValidateNoticeConfigName + * + * @param noticeConfigName noticeConfigName + * @returns {*} + */ +export async function remoteValidateNoticeConfigName(noticeConfigName) { + return await request({ + url: '/ddk/noticeConfig/validateNoticeConfigName/' + noticeConfigName, + method: 'get' + }) +} +/** + * remoteValidateNoticeConfigResource + * + * @param noticeConfigSource noticeConfigSource + * @returns {*} + */ +export async function remoteValidateNoticeConfigResource(noticeConfigSource) { + return await request({ + url: '/ddk/noticeConfig/validateNoticeConfigSource/' + noticeConfigSource, + method: 'get' + }) +} diff --git a/admin/admin-views/src/main/resources/vueboot/src/router/index.js b/admin/admin-views/src/main/resources/vueboot/src/router/index.js index dcccf1c..c120509 100644 --- a/admin/admin-views/src/main/resources/vueboot/src/router/index.js +++ b/admin/admin-views/src/main/resources/vueboot/src/router/index.js @@ -90,15 +90,15 @@ export const constantRouterMap = [ icon: 'form' } }, - // { - // path: 'dataSource', - // name: 'dataSource', - // component: () => import('@/views/ruleConfig/dataSource'), - // meta: { - // title: '数据源配置', - // icon: 'guide' - // } - // }, + { + path: 'noticeConfig', + name: '通知配置', + component: () => import('@/views/config/noticeConfig'), + meta: { + title: '通知配置', + icon: 'guide' + } + }, ] }, // { diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue index 444aff7..ceed157 100644 --- a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue @@ -36,7 +36,7 @@ - + @@ -63,7 +63,7 @@ export default { if (this.saveData.id) { callback() } - let ret = await remoteValidateAppConfigName(this.saveData.app); + let ret = await remoteValidateAppConfigName(this.saveData.appConfigName); if (ret.data.result) { callback() } else { diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/noticeConfigForm.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/noticeConfigForm.vue new file mode 100644 index 0000000..cbe9263 --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/noticeConfigForm.vue @@ -0,0 +1,177 @@ + + + diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/noticeConfig.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/noticeConfig.vue new file mode 100644 index 0000000..92abbdc --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/noticeConfig.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/ThrowableUtil.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/ThrowableUtil.java new file mode 100644 index 0000000..e055e6a --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/ThrowableUtil.java @@ -0,0 +1,64 @@ +package cn.icanci.loopstack.ddk.web.config; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; + +public final class ThrowableUtil { + + private ThrowableUtil() { + } + + /** + * Set the {@link StackTraceElement} for the given {@link Throwable}, using the {@link Class} and method name. + */ + public static T unknownStackTrace(T cause, Class clazz, String method) { + cause.setStackTrace(new StackTraceElement[] { new StackTraceElement(clazz.getName(), method, null, -1) }); + return cause; + } + + /** + * Gets the stack trace from a Throwable as a String. + * + * @param cause the {@link Throwable} to be examined + * @return the stack trace as generated by {@link Throwable#printStackTrace(java.io.PrintWriter)} method. + */ + public static String stackTraceToString(Throwable cause) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream pout = new PrintStream(out); + cause.printStackTrace(pout); + pout.flush(); + try { + return new String(out.toByteArray()); + } finally { + try { + out.close(); + } catch (IOException ignore) { + // ignore as should never happen + } + } + } + + public static boolean haveSuppressed() { + return true; + } + + public static void addSuppressed(Throwable target, Throwable suppressed) { + if (!haveSuppressed()) { + return; + } + target.addSuppressed(suppressed); + } + + public static void addSuppressedAndClear(Throwable target, List suppressed) { + addSuppressed(target, suppressed); + suppressed.clear(); + } + + public static void addSuppressed(Throwable target, List suppressed) { + for (Throwable t : suppressed) { + addSuppressed(target, t); + } + } +} diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/WebExceptionAdvice.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/WebExceptionAdvice.java index c08d5bc..6f46359 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/WebExceptionAdvice.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/config/WebExceptionAdvice.java @@ -24,7 +24,7 @@ public class WebExceptionAdvice { @ExceptionHandler(value = Exception.class) @ResponseBody public R jsonHandlerException(Exception e) { - return R.builderFail().message(e.getMessage()).build(); + return R.builderFail().message(ThrowableUtil.stackTraceToString(e)).build(); } } diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java index c4b9b58..c0bc5dc 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java @@ -1,12 +1,7 @@ package cn.icanci.loopstack.ddk.web.controller.config; -import java.util.List; - -import javax.annotation.Resource; - -import org.springframework.web.bind.annotation.*; - import cn.icanci.loopstack.ddk.admin.biz.service.AppConfigService; +import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.TextValue; import cn.icanci.loopstack.ddk.common.model.config.AppConfigVO; import cn.icanci.loopstack.ddk.common.result.R; @@ -14,6 +9,12 @@ import cn.icanci.loopstack.ddk.web.form.AppConfigQueryForm; import cn.icanci.loopstack.ddk.web.mapping.AppConfigWebMapping; import cn.icanci.loopstack.ddk.web.model.AppConfig; +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.*; + /** * @author icanci * @since 1.0 Created in 2023/01/06 21:11 @@ -29,9 +30,11 @@ public class AppConfigController { @PostMapping("query") public R query(@RequestBody AppConfigQueryForm form) { - return R.builderOk() - .data("queryPage", appConfigService.queryPage(appConfigWebMapping.web2vo(form.getAppConfig()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())) - .build(); + PageList queryPage = appConfigService.queryPage(appConfigWebMapping.web2vo(form.getAppConfig()), form.getPaginator().getCurrentPage(), + form.getPaginator().getPageSize()); + PageList ret = new PageList<>(appConfigWebMapping.vos2webs(queryPage.getData()), queryPage.getPaginator()); + + return R.builderOk().data("queryPage", ret).build(); } @PostMapping("save") diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppController.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppController.java index c290b93..1f8bc35 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppController.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppController.java @@ -1,6 +1,7 @@ package cn.icanci.loopstack.ddk.web.controller.config; import cn.icanci.loopstack.ddk.admin.biz.service.AppService; +import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.TextValue; import cn.icanci.loopstack.ddk.common.model.config.AppVO; import cn.icanci.loopstack.ddk.common.result.R; @@ -29,8 +30,9 @@ public class AppController { @PostMapping("query") public R query(@RequestBody AppQueryForm form) { - return R.builderOk().data("queryPage", appService.queryPage(appWebMapping.web2vo(form.getApp()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())) - .build(); + PageList queryPage = appService.queryPage(appWebMapping.web2vo(form.getApp()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize()); + PageList ret = new PageList<>(appWebMapping.vos2webs(queryPage.getData()), queryPage.getPaginator()); + return R.builderOk().data("queryPage", ret).build(); } @PostMapping("save") diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/GroupController.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/GroupController.java index b1953ed..8d920e6 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/GroupController.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/GroupController.java @@ -1,6 +1,7 @@ package cn.icanci.loopstack.ddk.web.controller.config; import cn.icanci.loopstack.ddk.admin.biz.service.GroupService; +import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.TextValue; import cn.icanci.loopstack.ddk.common.model.config.GroupVO; import cn.icanci.loopstack.ddk.common.result.R; @@ -29,8 +30,9 @@ public class GroupController { @PostMapping("query") public R query(@RequestBody GroupQueryForm form) { - return R.builderOk() - .data("queryPage", groupService.queryPage(groupWebMapping.web2vo(form.getGroup()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())).build(); + PageList queryPage = groupService.queryPage(groupWebMapping.web2vo(form.getGroup()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize()); + PageList ret = new PageList<>(groupWebMapping.vos2webs(queryPage.getData()), queryPage.getPaginator()); + return R.builderOk().data("queryPage", ret).build(); } @PostMapping("save") diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/NoticeConfigController.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/NoticeConfigController.java new file mode 100644 index 0000000..c9948b0 --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/NoticeConfigController.java @@ -0,0 +1,124 @@ +package cn.icanci.loopstack.ddk.web.controller.config; + +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.ddk.admin.biz.event.log.LogEvent; +import cn.icanci.loopstack.ddk.admin.biz.service.NoticeConfigService; +import cn.icanci.loopstack.ddk.common.enums.LogOperatorTypeEnum; +import cn.icanci.loopstack.ddk.common.enums.ModuleTypeEnum; +import cn.icanci.loopstack.ddk.common.model.PageList; +import cn.icanci.loopstack.ddk.common.model.Paginator; +import cn.icanci.loopstack.ddk.common.model.config.NoticeConfigVO; +import cn.icanci.loopstack.ddk.common.result.R; +import cn.icanci.loopstack.ddk.web.form.NoticeConfigQueryForm; +import cn.icanci.loopstack.ddk.web.mapping.NoticeConfigWebMapping; +import cn.icanci.loopstack.ddk.web.model.NoticeConfig; +import cn.icanci.loopstack.ddk.web.model.NoticeConfigListModel; +import cn.icanci.loopstack.lsi.event.EventDispatcher; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import com.google.common.collect.Lists; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/06 21:11 + */ +@RestController +@RequestMapping("/ddk/noticeConfig") +public class NoticeConfigController { + @Resource + private NoticeConfigService noticeConfigService; + @Resource + private NoticeConfigWebMapping noticeConfigWebMapping; + @Resource + private EventDispatcher eventDispatcher; + + @PostMapping("query") + public R query(@RequestBody NoticeConfigQueryForm form) { + PageList> ret = noticeConfigService.queryPage(noticeConfigWebMapping.web2vo(form.getNoticeConfig()), form.getPaginator().getCurrentPage(), + form.getPaginator().getPageSize()); + Paginator paginator = ret.getPaginator(); + Collection> datas = ret.getData(); + List resp = Lists.newArrayList(); + if (CollectionUtils.isEmpty(datas)) { + return R.builderOk().data("queryPage", new PageList<>(resp, paginator)).build(); + } + for (List data : datas) { + resp.add(buildResp(data)); + } + return R.builderOk().data("queryPage", new PageList<>(resp, paginator)).build(); + } + + /** + * 此处设计的比较尴尬 + * + * @param data data + * @return 返回数据 + */ + private NoticeConfigListModel buildResp(List data) { + NoticeConfigListModel config = new NoticeConfigListModel(); + NoticeConfigVO noticeConfig = data.iterator().next(); + config.setId(noticeConfig.getId()); + config.setUuid(noticeConfig.getUuid()); + config.setDesc(noticeConfig.getDesc()); + config.setCreateTime(noticeConfig.getCreateTime()); + config.setUpdateTime(noticeConfig.getUpdateTime()); + config.setIsDelete(noticeConfig.getIsDelete()); + config.setEnv(noticeConfig.getEnv()); + config.setNoticeConfigName(noticeConfig.getNoticeConfigName()); + config.setNoticeConfigResource(noticeConfig.getNoticeConfigResource()); + config.setNoticeValue(noticeConfig.getNoticeValue()); + config.setAppUuid(data.stream().map(NoticeConfigVO::getAppUuid).collect(Collectors.toList())); + return config; + } + + @PostMapping("save") + public R save(@RequestBody NoticeConfigListModel noticeConfig) { + List request = Lists.newArrayList(); + + if (CollectionUtils.isNotEmpty(noticeConfig.getAppUuid())) { + for (String uuid : noticeConfig.getAppUuid()) { + request.add(mapper2NoticeConfig(noticeConfig, uuid)); + } + } + + noticeConfigService.save(noticeConfigWebMapping.webs2vos(request), noticeConfig.getAppUuid()); + eventDispatcher.fire(new LogEvent(noticeConfig.getNoticeConfigResource(), ModuleTypeEnum.DDK_NOTICE_CONFIG, JSONUtil.toJsonStr(noticeConfig), LogOperatorTypeEnum.UPDATE), + false); + return R.builderOk().build(); + } + + private NoticeConfig mapper2NoticeConfig(NoticeConfigListModel noticeConfig, String uuid) { + NoticeConfig config = new NoticeConfig(); + config.setId(noticeConfig.getId()); + config.setUuid(noticeConfig.getUuid()); + config.setDesc(noticeConfig.getDesc()); + config.setCreateTime(noticeConfig.getCreateTime()); + config.setUpdateTime(noticeConfig.getUpdateTime()); + config.setIsDelete(noticeConfig.getIsDelete()); + config.setEnv(noticeConfig.getEnv()); + config.setNoticeConfigName(noticeConfig.getNoticeConfigName()); + config.setNoticeConfigResource(noticeConfig.getNoticeConfigResource()); + config.setNoticeValue(noticeConfig.getNoticeValue()); + config.setAppUuid(uuid); + return config; + } + + @GetMapping("validateNoticeConfigName/{noticeConfigName:.*}") + public R validateNoticeConfigName(@PathVariable("noticeConfigName") String noticeConfigName) { + return R.builderOk().data("result", CollectionUtils.isEmpty(noticeConfigService.queryByNoticeConfigName(noticeConfigName))).build(); + } + + @GetMapping("validateNoticeConfigSource/{noticeConfigResource:.*}") + public R validateNoticeConfigSource(@PathVariable("noticeConfigResource") String noticeConfigResource) { + return R.builderOk().data("result", CollectionUtils.isEmpty(noticeConfigService.queryByNoticeConfigResource(noticeConfigResource))).build(); + } + +} diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/TeamController.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/TeamController.java index 16b401e..09edda3 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/TeamController.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/TeamController.java @@ -1,6 +1,7 @@ package cn.icanci.loopstack.ddk.web.controller.config; import cn.icanci.loopstack.ddk.admin.biz.service.TeamService; +import cn.icanci.loopstack.ddk.common.model.PageList; import cn.icanci.loopstack.ddk.common.model.TextValue; import cn.icanci.loopstack.ddk.common.model.config.TeamVO; import cn.icanci.loopstack.ddk.common.result.R; @@ -29,8 +30,9 @@ public class TeamController { @PostMapping("query") public R query(@RequestBody TeamQueryForm form) { - return R.builderOk() - .data("queryPage", teamService.queryPage(teamWebMapping.web2vo(form.getTeam()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize())).build(); + PageList queryPage = teamService.queryPage(teamWebMapping.web2vo(form.getTeam()), form.getPaginator().getCurrentPage(), form.getPaginator().getPageSize()); + PageList ret = new PageList<>(teamWebMapping.vos2webs(queryPage.getData()), queryPage.getPaginator()); + return R.builderOk().data("queryPage", ret).build(); } @PostMapping("save") diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java index 9d12693..81df44e 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java @@ -6,7 +6,7 @@ import cn.icanci.loopstack.ddk.web.model.AppConfig; * @author icanci * @since 1.0 Created in 2023/01/08 11:28 */ -public class AppConfigQueryForm extends BaseQueryForm { +public class AppConfigQueryForm extends BaseQueryForm { /** * appConfig 查询信息 */ diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/NoticeConfigQueryForm.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/NoticeConfigQueryForm.java new file mode 100644 index 0000000..fe68f1a --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/NoticeConfigQueryForm.java @@ -0,0 +1,22 @@ +package cn.icanci.loopstack.ddk.web.form; + +import cn.icanci.loopstack.ddk.web.model.NoticeConfig; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/08 14:29 + */ +public class NoticeConfigQueryForm extends BaseQueryForm { + /** + * noticeConfig 查询信息 + */ + private NoticeConfig noticeConfig; + + public NoticeConfig getNoticeConfig() { + return noticeConfig; + } + + public void setNoticeConfig(NoticeConfig noticeConfig) { + this.noticeConfig = noticeConfig; + } +} diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/mapping/BaseWebMapping.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/mapping/BaseWebMapping.java index 7f47617..f1c8ab3 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/mapping/BaseWebMapping.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/mapping/BaseWebMapping.java @@ -1,5 +1,6 @@ package cn.icanci.loopstack.ddk.web.mapping; +import java.util.Collection; import java.util.List; /** @@ -38,5 +39,5 @@ public interface BaseWebMapping { * @param rs R * @return T */ - List vos2webs(List rs); + List vos2webs(Collection rs); } diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfig.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfig.java index 86aad50..3685f2a 100644 --- a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfig.java +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfig.java @@ -152,11 +152,11 @@ public class NoticeConfig implements Serializable { return this.noticeValue; } - public void setAppUuid(String appUuid) { - this.appUuid = appUuid; + public String getAppUuid() { + return appUuid; } - public String getAppUuid() { - return this.appUuid; + public void setAppUuid(String appUuid) { + this.appUuid = appUuid; } } \ No newline at end of file diff --git a/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfigListModel.java b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfigListModel.java new file mode 100644 index 0000000..7c80615 --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/model/NoticeConfigListModel.java @@ -0,0 +1,163 @@ +package cn.icanci.loopstack.ddk.web.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +/** +* DdkNoticeConfig +* +* @author icanci +* @since 1.0 Created in 2023/01/04 20:34 +*/ +public class NoticeConfigListModel implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id 主键 + */ + private Long id; + + /** + * uuid 雪花算法随机UUID + */ + private String uuid; + + /** + * desc 功能描述 + */ + private String desc; + + /** + * create_time 创建时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * update_time 更新时间 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * is_delete 状态 1无效,0有效 + */ + private Integer isDelete; + + /** + * env 环境 + */ + private String env; + + /** + * notice_config_name 通知配置名称 + */ + private String noticeConfigName; + + /** + * notice_config_resource 通知配置资源 + */ + private String noticeConfigResource; + + /** + * notice_value 测试配置值,因为可能通过配置值进行特殊处理 + */ + private String noticeValue; + + /** + * app_uuid 项目关联uuid,多个则会有多条记录 + */ + private List appUuid; + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return this.id; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getUuid() { + return this.uuid; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getDesc() { + return this.desc; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getCreateTime() { + return this.createTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Date getUpdateTime() { + return this.updateTime; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public Integer getIsDelete() { + return this.isDelete; + } + + public void setEnv(String env) { + this.env = env; + } + + public String getEnv() { + return this.env; + } + + public void setNoticeConfigName(String noticeConfigName) { + this.noticeConfigName = noticeConfigName; + } + + public String getNoticeConfigName() { + return this.noticeConfigName; + } + + public void setNoticeConfigResource(String noticeConfigResource) { + this.noticeConfigResource = noticeConfigResource; + } + + public String getNoticeConfigResource() { + return this.noticeConfigResource; + } + + public void setNoticeValue(String noticeValue) { + this.noticeValue = noticeValue; + } + + public String getNoticeValue() { + return this.noticeValue; + } + + public List getAppUuid() { + return appUuid; + } + + public void setAppUuid(List appUuid) { + this.appUuid = appUuid; + } +} \ No newline at end of file diff --git a/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigHolderVO.java b/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigHolderVO.java new file mode 100644 index 0000000..1a6dc96 --- /dev/null +++ b/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigHolderVO.java @@ -0,0 +1,21 @@ +package cn.icanci.loopstack.ddk.common.model.config; + +import java.io.Serializable; +import java.util.List; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/08 14:56 + */ +public class NoticeConfigHolderVO implements Serializable { + + private List noticeConfigVOList; + + public List getNoticeConfigVOList() { + return noticeConfigVOList; + } + + public void setNoticeConfigVOList(List noticeConfigVOList) { + this.noticeConfigVOList = noticeConfigVOList; + } +} diff --git a/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigVO.java b/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigVO.java index 2231712..11392d1 100644 --- a/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigVO.java +++ b/common/src/main/java/cn/icanci/loopstack/ddk/common/model/config/NoticeConfigVO.java @@ -18,11 +18,11 @@ public class NoticeConfigVO extends BaseVO { /** * 测试配置值,可选;因为可能通过配置值进行特殊处理 */ - private String noticeTestValue; + private String noticeValue; /** * 项目关联uuid,多个以,分割 */ - private String appUuids; + private String appUuid; public String getNoticeConfigName() { return noticeConfigName; @@ -40,25 +40,25 @@ public class NoticeConfigVO extends BaseVO { this.noticeConfigResource = noticeConfigResource; } - public String getNoticeTestValue() { - return noticeTestValue; + public String getNoticeValue() { + return noticeValue; } - public void setNoticeTestValue(String noticeTestValue) { - this.noticeTestValue = noticeTestValue; + public void setNoticeValue(String noticeValue) { + this.noticeValue = noticeValue; } - public String getAppUuids() { - return appUuids; + public String getAppUuid() { + return appUuid; } - public void setAppUuids(String appUuids) { - this.appUuids = appUuids; + public void setAppUuid(String appUuid) { + this.appUuid = appUuid; } @Override public String toString() { - return new StringJoiner(",").add("noticeConfigName=" + noticeConfigName).add("noticeConfigResource=" + noticeConfigResource).add("noticeTestValue=" + noticeTestValue) - .add("appUuids=" + appUuids).toString(); + return new StringJoiner(",").add("noticeConfigName=" + noticeConfigName).add("noticeConfigResource=" + noticeConfigResource).add("noticeValue=" + noticeValue) + .add("appUuid=" + appUuid).toString(); } } -- Gitee