From abdc9c6b39f8fabdc0f2dc756d8a1de56080a684 Mon Sep 17 00:00:00 2001 From: icanci Date: Sun, 8 Jan 2023 11:44:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/biz/service/AppConfigService.java | 13 ++ .../service/impl/AppConfigServiceImpl.java | 82 ++++++- .../dal/mapper/mapper/AppConfigMapper.java | 16 +- .../mybatis/mapper/AppConfigMapper.xml | 13 +- .../resources/vueboot/src/api/appConfigApi.js | 46 ++++ .../resources/vueboot/src/router/index.js | 17 +- .../vueboot/src/views/config/appConfig.vue | 218 ++++++++++++++++++ .../src/views/config/dialog/appConfigForm.vue | 149 ++++++++++++ .../src/views/config/dialog/appForm.vue | 2 +- .../src/views/config/dialog/groupForm.vue | 2 +- .../src/views/config/dialog/teamForm.vue | 2 +- .../config/AppConfigController.java | 54 +++++ .../ddk/web/form/AppConfigQueryForm.java | 22 ++ 13 files changed, 617 insertions(+), 19 deletions(-) create mode 100644 admin/admin-views/src/main/resources/vueboot/src/api/appConfigApi.js create mode 100644 admin/admin-views/src/main/resources/vueboot/src/views/config/appConfig.vue create mode 100644 admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java create mode 100644 admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java index 905730b..b9083a3 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppConfigService.java @@ -1,9 +1,22 @@ package cn.icanci.loopstack.ddk.admin.biz.service; +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 java.util.List; + /** * @author icanci * @since 1.0 Created in 2023/01/05 21:40 */ public interface AppConfigService { + PageList queryPage(AppConfigVO vo, int currentPage, int pageSize); + + void save(AppConfigVO vo); + + AppConfigVO queryByAppConfigName(String appConfigName); + + List loadSelector(); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java index 20101ff..52e5a86 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppConfigServiceImpl.java @@ -1,18 +1,96 @@ package cn.icanci.loopstack.ddk.admin.biz.service.impl; +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.ddk.admin.biz.event.log.LogEvent; +import cn.icanci.loopstack.ddk.admin.biz.mapping.config.AppConfigMapping; import cn.icanci.loopstack.ddk.admin.biz.service.AppConfigService; +import cn.icanci.loopstack.ddk.admin.biz.service.BaseService; +import cn.icanci.loopstack.ddk.admin.biz.utils.EnvUtils; +import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.AppConfigDO; import cn.icanci.loopstack.ddk.admin.dal.mapper.mapper.AppConfigMapper; +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.TextValue; +import cn.icanci.loopstack.ddk.common.model.config.AppConfigVO; +import cn.icanci.loopstack.ddk.common.utils.PaginatorUtils; + +import java.util.List; import javax.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Lists; + /** * @author icanci * @since 1.0 Created in 2023/01/06 09:45 */ @Service -public class AppConfigServiceImpl implements AppConfigService { +public class AppConfigServiceImpl extends BaseService implements AppConfigService { @Resource - private AppConfigMapper appConfigMapper; + private AppConfigMapper appConfigMapper; + @Resource + private AppConfigMapping appConfigMapping; + + @Override + public PageList queryPage(AppConfigVO vo, int currentPage, int pageSize) { + vo.setEnv(getEnv()); + vo.setIsDelete(null); + + currentPage = Math.max(currentPage - 1, 0); + + List ret = appConfigMapper.selectPage(appConfigMapping.vo2do(vo), currentPage, pageSize); + + return PaginatorUtils.formatPaginator(appConfigMapping.dos2vos(ret), currentPage, pageSize); + } + + @Override + public void save(AppConfigVO vo) { + if (doInsert(vo)) { + beforeInsert(vo); + AppConfigDO appConfigDO = appConfigMapping.vo2do(vo); + appConfigMapper.insert(appConfigDO); + eventDispatcher.fire(new LogEvent(vo.getUuid(), ModuleTypeEnum.DDK_APP_CONFIG, JSONUtil.toJsonStr(appConfigDO), LogOperatorTypeEnum.CREATE), false); + } else { + beforeUpdate(vo); + AppConfigDO appConfigDO = appConfigMapping.vo2do(vo); + appConfigMapper.update(appConfigDO); + eventDispatcher.fire(new LogEvent(vo.getUuid(), ModuleTypeEnum.DDK_APP_CONFIG, JSONUtil.toJsonStr(appConfigDO), LogOperatorTypeEnum.UPDATE), false); + } + } + + @Override + public AppConfigVO queryByAppConfigName(String appConfigName) { + AppConfigDO config = appConfigMapper.queryByAppConfigName(appConfigName, EnvUtils.getEnv()); + return appConfigMapping.do2vo(config); + } + + @Override + public List loadSelector() { + AppConfigDO appConfigDO = new AppConfigDO(); + appConfigDO.setEnv(getEnv()); + + List apps = appConfigMapper.selectList(appConfigDO); + + if (CollectionUtils.isEmpty(apps)) { + return Lists.newArrayList(); + } + + List appConfigVOS = appConfigMapping.dos2vos(apps); + List textValues = Lists.newArrayList(); + for (AppConfigVO appConfigVO : appConfigVOS) { + String label; + if (isDeleted(appConfigVO)) { + label = String.format(DELETED_FORMAT, appConfigVO.getAppConfigName()); + } else { + label = String.format(NOT_DELETED_FORMAT, appConfigVO.getAppConfigName()); + } + String value = appConfigVO.getUuid(); + textValues.add(new TextValue(label, value)); + } + return textValues; + } } diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppConfigMapper.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppConfigMapper.java index 8270f02..e2eb633 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppConfigMapper.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppConfigMapper.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.AppConfigDO; import java.util.List; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + /** * DdkAppConfigMapper * ⚠️ 修改之后请勿使用生成器再次生成,否则会覆盖修改 @@ -80,4 +81,13 @@ public interface AppConfigMapper { * @param ddkAppConfig 查询条件 **/ int total(AppConfigDO ddkAppConfig); + + /** + * queryByAppConfigName + * + * @param appConfigName appConfigName + * @param env env + * @return AppConfigDO + */ + AppConfigDO queryByAppConfigName(@Param("appConfigName")String appConfigName,@Param("env") String env); } diff --git a/admin/admin-dal/src/main/resources/mybatis/mapper/AppConfigMapper.xml b/admin/admin-dal/src/main/resources/mybatis/mapper/AppConfigMapper.xml index 59259de..0858682 100644 --- a/admin/admin-dal/src/main/resources/mybatis/mapper/AppConfigMapper.xml +++ b/admin/admin-dal/src/main/resources/mybatis/mapper/AppConfigMapper.xml @@ -239,18 +239,19 @@ and `env` = #{ddkAppConfig.env} - and `app_config_name` = #{ddkAppConfig.appConfigName} + and `app_config_name` like CONCAT('%',#{ddkAppConfig.appConfigName},'%') - and `app_config_value` = #{ddkAppConfig.appConfigValue} + and `app_config_value` like CONCAT('%',#{ddkAppConfig.appConfigValue},'%') and `app_config_type` = #{ddkAppConfig.appConfigType} - and `app_uuid` = #{ddkAppConfig.appUuid} + and `app_uuid` like CONCAT('%',#{ddkAppConfig.appUuid},'%') + order by create_time desc limit #{page,jdbcType=INTEGER}, #{pageSize,jdbcType=INTEGER} @@ -293,4 +294,10 @@ + \ No newline at end of file diff --git a/admin/admin-views/src/main/resources/vueboot/src/api/appConfigApi.js b/admin/admin-views/src/main/resources/vueboot/src/api/appConfigApi.js new file mode 100644 index 0000000..c9e9b32 --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/api/appConfigApi.js @@ -0,0 +1,46 @@ +import request from '@/utils/request' + +/** + * 分页查询 + * + * @param app app + * @param paginator paginator + * @returns {*} + */ +export async function appConfigQuery(appConfig, paginator) { + return await request({ + url: '/ddk/appConfig/query', + method: 'post', + data: { + 'appConfig': appConfig, + 'paginator': paginator + } + }) +} + +/** + * 保存 + * + * @param appConfig appConfig + * @returns {*} + */ +export async function saveAppConfig(appConfig) { + return await request({ + url: '/ddk/appConfig/save', + method: 'post', + data: appConfig + }) +} + +/** + * remoteValidateAppConfigName + * + * @param appConfigName appConfigName + * @returns {*} + */ +export async function remoteValidateAppConfigName(appConfigName) { + return await request({ + url: '/ddk/appConfig/validateAppConfigName/' + appConfigName, + 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 2bf1e9a..dcccf1c 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 @@ -81,15 +81,16 @@ export const constantRouterMap = [ icon: 'exit-fullscreen' } }, + { + path: 'baseData', + name: '项目配置', + component: () => import('@/views/config/appConfig'), + meta: { + title: '项目配置', + icon: 'form' + } + }, // { - // path: 'baseData', - // name: 'baseData', - // component: () => import('@/views/ruleConfig/baseData'), - // meta: { - // title: '基础数据配置', - // icon: 'form' - // } - // }, { // path: 'dataSource', // name: 'dataSource', // component: () => import('@/views/ruleConfig/dataSource'), diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/appConfig.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/appConfig.vue new file mode 100644 index 0000000..0140ff4 --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/appConfig.vue @@ -0,0 +1,218 @@ + + + + + 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 new file mode 100644 index 0000000..444aff7 --- /dev/null +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appConfigForm.vue @@ -0,0 +1,149 @@ + + + diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appForm.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appForm.vue index f142771..5cf5bb2 100644 --- a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appForm.vue +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/appForm.vue @@ -38,7 +38,7 @@ - + diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/groupForm.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/groupForm.vue index e8bcc91..32608d8 100644 --- a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/groupForm.vue +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/groupForm.vue @@ -22,7 +22,7 @@ - + diff --git a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/teamForm.vue b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/teamForm.vue index 2b300a0..d5585fb 100644 --- a/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/teamForm.vue +++ b/admin/admin-views/src/main/resources/vueboot/src/views/config/dialog/teamForm.vue @@ -38,7 +38,7 @@ - + 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 new file mode 100644 index 0000000..c4b9b58 --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/controller/config/AppConfigController.java @@ -0,0 +1,54 @@ +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.TextValue; +import cn.icanci.loopstack.ddk.common.model.config.AppConfigVO; +import cn.icanci.loopstack.ddk.common.result.R; +import cn.icanci.loopstack.ddk.web.form.AppConfigQueryForm; +import cn.icanci.loopstack.ddk.web.mapping.AppConfigWebMapping; +import cn.icanci.loopstack.ddk.web.model.AppConfig; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/06 21:11 + */ +@RestController +@RequestMapping("/ddk/appConfig") +public class AppConfigController { + @Resource + private AppConfigService appConfigService; + + @Resource + private AppConfigWebMapping appConfigWebMapping; + + @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(); + } + + @PostMapping("save") + public R save(@RequestBody AppConfig appConfig) { + appConfigService.save(appConfigWebMapping.web2vo(appConfig)); + return R.builderOk().build(); + } + + @GetMapping("validateAppConfigName/{appConfigName:.*}") + public R validateAppConfigName(@PathVariable("appConfigName") String appConfigName) { + AppConfigVO appConfigVO = appConfigService.queryByAppConfigName(appConfigName); + return R.builderOk().data("result", appConfigVO == null).build(); + } + + @GetMapping("loadSelector") + public R loadSelector() { + List textValues = appConfigService.loadSelector(); + return R.builderOk().data("textValues", textValues).build(); + } +} 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 new file mode 100644 index 0000000..9d12693 --- /dev/null +++ b/admin/admin-web/src/main/java/cn/icanci/loopstack/ddk/web/form/AppConfigQueryForm.java @@ -0,0 +1,22 @@ +package cn.icanci.loopstack.ddk.web.form; + +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 { + /** + * appConfig 查询信息 + */ + private AppConfig appConfig; + + public AppConfig getAppConfig() { + return appConfig; + } + + public void setAppConfig(AppConfig appConfig) { + this.appConfig = appConfig; + } +} -- Gitee