From b9eb6e56eee53c2a8a96b1974b7d239546c32ee5 Mon Sep 17 00:00:00 2001 From: liuqingkun Date: Mon, 27 Feb 2023 16:45:58 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=BC=8F=E6=B4=9E=E4=BF=AE=E5=A4=8D]=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E9=9C=80=E8=A6=81=E7=9A=84controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 - .../common/event/ApiLogListener.java | 8 +- .../common/event/ErrorLogListener.java | 8 +- .../common/event/UsualLogListener.java | 8 +- .../auth/endpoint/BladeSocialEndpoint.java | 97 -------- .../service/impl/ApmConfigServiceImpl.java | 6 +- .../develop/controller/CodeController.java | 192 --------------- .../controller/DatasourceController.java | 128 ---------- .../develop/controller/ModelController.java | 229 ----------------- .../controller/ModelPrototypeController.java | 137 ---------- .../modules/develop/dto/ModelDTO.java | 42 ---- .../modules/develop/entity/Code.java | 180 -------------- .../modules/develop/entity/Datasource.java | 71 ------ .../modules/develop/entity/Model.java | 74 ------ .../develop/entity/ModelPrototype.java | 119 --------- .../modules/develop/mapper/CodeMapper.java | 29 --- .../modules/develop/mapper/CodeMapper.xml | 22 -- .../develop/mapper/DatasourceMapper.java | 29 --- .../develop/mapper/DatasourceMapper.xml | 22 -- .../modules/develop/mapper/ModelMapper.java | 29 --- .../modules/develop/mapper/ModelMapper.xml | 27 -- .../develop/mapper/ModelPrototypeMapper.java | 29 --- .../develop/mapper/ModelPrototypeMapper.xml | 35 --- .../modules/develop/service/ICodeService.java | 38 --- .../develop/service/IDatasourceService.java | 29 --- .../service/IModelPrototypeService.java | 47 ---- .../develop/service/IModelService.java | 29 --- .../develop/service/impl/CodeServiceImpl.java | 40 --- .../service/impl/DatasourceServiceImpl.java | 33 --- .../impl/ModelPrototypeServiceImpl.java | 55 ----- .../service/impl/ModelServiceImpl.java | 33 --- .../resource/controller/AttachController.java | 128 ---------- .../resource/controller/OssController.java | 152 ------------ .../resource/controller/SmsController.java | 153 ------------ .../resource/endpoint/OssEndpoint.java | 188 +------------- .../resource/endpoint/SmsEndpoint.java | 179 -------------- .../system/controller/DeptController.java | 12 - .../system/controller/ParamController.java | 108 -------- .../system/controller/PostController.java | 150 ----------- .../system/controller/SearchController.java | 99 -------- .../system/controller/TenantController.java | 233 ------------------ .../controller/TenantPackageController.java | 134 ---------- .../system/controller/TopMenuController.java | 137 ---------- src/main/resources/application.yml | 50 +--- src/main/resources/static/images/icon.png | Bin 41738 -> 0 bytes 45 files changed, 34 insertions(+), 3519 deletions(-) delete mode 100644 src/main/java/org/springblade/modules/auth/endpoint/BladeSocialEndpoint.java delete mode 100644 src/main/java/org/springblade/modules/develop/controller/CodeController.java delete mode 100644 src/main/java/org/springblade/modules/develop/controller/DatasourceController.java delete mode 100644 src/main/java/org/springblade/modules/develop/controller/ModelController.java delete mode 100644 src/main/java/org/springblade/modules/develop/controller/ModelPrototypeController.java delete mode 100644 src/main/java/org/springblade/modules/develop/dto/ModelDTO.java delete mode 100644 src/main/java/org/springblade/modules/develop/entity/Code.java delete mode 100644 src/main/java/org/springblade/modules/develop/entity/Datasource.java delete mode 100644 src/main/java/org/springblade/modules/develop/entity/Model.java delete mode 100644 src/main/java/org/springblade/modules/develop/entity/ModelPrototype.java delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/CodeMapper.java delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/CodeMapper.xml delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.java delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.xml delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/ModelMapper.java delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/ModelMapper.xml delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.java delete mode 100644 src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.xml delete mode 100644 src/main/java/org/springblade/modules/develop/service/ICodeService.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/IDatasourceService.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/IModelPrototypeService.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/IModelService.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/impl/CodeServiceImpl.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/impl/DatasourceServiceImpl.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/impl/ModelPrototypeServiceImpl.java delete mode 100644 src/main/java/org/springblade/modules/develop/service/impl/ModelServiceImpl.java delete mode 100644 src/main/java/org/springblade/modules/resource/controller/AttachController.java delete mode 100644 src/main/java/org/springblade/modules/resource/controller/OssController.java delete mode 100644 src/main/java/org/springblade/modules/resource/controller/SmsController.java delete mode 100644 src/main/java/org/springblade/modules/resource/endpoint/SmsEndpoint.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/ParamController.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/PostController.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/SearchController.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/TenantController.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/TenantPackageController.java delete mode 100644 src/main/java/org/springblade/modules/system/controller/TopMenuController.java delete mode 100644 src/main/resources/static/images/icon.png diff --git a/pom.xml b/pom.xml index 5801c63..fb9408b 100644 --- a/pom.xml +++ b/pom.xml @@ -119,11 +119,6 @@ org.springblade blade-starter-report - - - org.springblade - blade-starter-flowable - com.github.whvcse diff --git a/src/main/java/org/springblade/common/event/ApiLogListener.java b/src/main/java/org/springblade/common/event/ApiLogListener.java index bc23362..e6f9b76 100644 --- a/src/main/java/org/springblade/common/event/ApiLogListener.java +++ b/src/main/java/org/springblade/common/event/ApiLogListener.java @@ -51,10 +51,10 @@ public class ApiLogListener { @Order @EventListener(ApiLogEvent.class) public void saveApiLog(ApiLogEvent event) { - Map source = (Map) event.getSource(); - LogApi logApi = (LogApi) source.get(EventConstant.EVENT_LOG); - LogAbstractUtil.addOtherInfoToLog(logApi, bladeProperties, serverInfo); - logService.saveApiLog(logApi); +// Map source = (Map) event.getSource(); +// LogApi logApi = (LogApi) source.get(EventConstant.EVENT_LOG); +// LogAbstractUtil.addOtherInfoToLog(logApi, bladeProperties, serverInfo); +// logService.saveApiLog(logApi); } } diff --git a/src/main/java/org/springblade/common/event/ErrorLogListener.java b/src/main/java/org/springblade/common/event/ErrorLogListener.java index 19d2279..2fe2aff 100644 --- a/src/main/java/org/springblade/common/event/ErrorLogListener.java +++ b/src/main/java/org/springblade/common/event/ErrorLogListener.java @@ -49,9 +49,9 @@ public class ErrorLogListener { @Order @EventListener(ErrorLogEvent.class) public void saveErrorLog(ErrorLogEvent event) { - Map source = (Map) event.getSource(); - LogError logError = (LogError) source.get(EventConstant.EVENT_LOG); - LogAbstractUtil.addOtherInfoToLog(logError, bladeProperties, serverInfo); - logService.saveErrorLog(logError); +// Map source = (Map) event.getSource(); +// LogError logError = (LogError) source.get(EventConstant.EVENT_LOG); +// LogAbstractUtil.addOtherInfoToLog(logError, bladeProperties, serverInfo); +// logService.saveErrorLog(logError); } } diff --git a/src/main/java/org/springblade/common/event/UsualLogListener.java b/src/main/java/org/springblade/common/event/UsualLogListener.java index c8c357b..51ebb52 100644 --- a/src/main/java/org/springblade/common/event/UsualLogListener.java +++ b/src/main/java/org/springblade/common/event/UsualLogListener.java @@ -49,10 +49,10 @@ public class UsualLogListener { @Order @EventListener(UsualLogEvent.class) public void saveUsualLog(UsualLogEvent event) { - Map source = (Map) event.getSource(); - LogUsual logUsual = (LogUsual) source.get(EventConstant.EVENT_LOG); - LogAbstractUtil.addOtherInfoToLog(logUsual, bladeProperties, serverInfo); - logService.saveUsualLog(logUsual); +// Map source = (Map) event.getSource(); +// LogUsual logUsual = (LogUsual) source.get(EventConstant.EVENT_LOG); +// LogAbstractUtil.addOtherInfoToLog(logUsual, bladeProperties, serverInfo); +// logService.saveUsualLog(logUsual); } } diff --git a/src/main/java/org/springblade/modules/auth/endpoint/BladeSocialEndpoint.java b/src/main/java/org/springblade/modules/auth/endpoint/BladeSocialEndpoint.java deleted file mode 100644 index 707292e..0000000 --- a/src/main/java/org/springblade/modules/auth/endpoint/BladeSocialEndpoint.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.auth.endpoint; - -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthToken; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.social.props.SocialProperties; -import org.springblade.core.social.utils.SocialUtil; -import org.springblade.core.tenant.annotation.NonDS; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 第三方登陆端点 - * - * @author Chill - */ -@NonDS -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_AUTH_NAME) -@ConditionalOnProperty(value = "social.enabled", havingValue = "true") -@Api(value = "第三方登陆", tags = "第三方登陆端点") -public class BladeSocialEndpoint { - - private final SocialProperties socialProperties; - - /** - * 授权完毕跳转 - */ - @ApiOperation(value = "授权完毕跳转") - @RequestMapping("/oauth/render/{source}") - public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException { - AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); - String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); - response.sendRedirect(authorizeUrl); - } - - /** - * 获取认证信息 - */ - @ApiOperation(value = "获取认证信息") - @RequestMapping("/oauth/callback/{source}") - public Object login(@PathVariable("source") String source, AuthCallback callback) { - AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); - return authRequest.login(callback); - } - - /** - * 撤销授权 - */ - @ApiOperation(value = "撤销授权") - @RequestMapping("/oauth/revoke/{source}/{token}") - public Object revokeAuth(@PathVariable("source") String source, @PathVariable("token") String token) { - AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); - return authRequest.revoke(AuthToken.builder().accessToken(token).build()); - } - - /** - * 续期accessToken - */ - @ApiOperation(value = "续期令牌") - @RequestMapping("/oauth/refresh/{source}") - public Object refreshAuth(@PathVariable("source") String source, String token) { - AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); - return authRequest.refresh(AuthToken.builder().refreshToken(token).build()); - } - - -} diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java index c2a4fec..c7b5d93 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java @@ -230,7 +230,7 @@ public class ApmConfigServiceImpl extends ServiceImpl alreadyConfMap = new HashMap<>(); if (Func.isNotEmpty(alreadyConfList)) { for (ApmConfig config : alreadyConfList) { - String key = config.getProject() + config.getApmDay() + config.getPeriod() + config.getTimeFrame(); + String key = config.getProject() + DateUtil.format(config.getApmDay(), DateUtil.PATTERN_DATE) + config.getPeriod() + config.getTimeFrame(); if (alreadyConfMap.containsKey(key)) { continue; } @@ -259,9 +259,11 @@ public class ApmConfigServiceImpl extends ServiceImpl detail(Code code) { - Code detail = codeService.getOne(Condition.getQueryWrapper(code)); - return R.data(detail); - } - - /** - * 分页 - */ - @GetMapping("/list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "codeName", value = "模块名", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "tableName", value = "表名", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "modelName", value = "实体名", paramType = "query", dataType = "string") - }) - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入code") - public R> list(@ApiIgnore @RequestParam Map code, Query query) { - IPage pages = codeService.page(Condition.getPage(query), Condition.getQueryWrapper(code, Code.class)); - return R.data(pages); - } - - /** - * 新增或修改 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "新增或修改", notes = "传入code") - public R submit(@Valid @RequestBody Code code) { - return R.status(codeService.submit(code)); - } - - - /** - * 删除 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(codeService.removeByIds(Func.toLongList(ids))); - } - - /** - * 复制 - */ - @PostMapping("/copy") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "复制", notes = "传入id") - public R copy(@ApiParam(value = "主键", required = true) @RequestParam Long id) { - Code code = codeService.getById(id); - code.setId(null); - code.setCodeName(code.getCodeName() + "-copy"); - return R.status(codeService.save(code)); - } - - /** - * 代码生成 - */ - @PostMapping("/gen-code") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "代码生成", notes = "传入ids") - public R genCode(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - Collection codes = codeService.listByIds(Func.toLongList(ids)); - codes.forEach(code -> { - BladeCodeGenerator generator = new BladeCodeGenerator(); - // 设置基础模型 - Model model = modelService.getById(code.getModelId()); - generator.setModelCode(model.getModelCode()); - generator.setModelClass(model.getModelClass()); - // 设置模型集合 - List prototypes = modelPrototypeService.prototypeList(model.getId()); - generator.setModel(JsonUtil.readMap(JsonUtil.toJson(model))); - generator.setPrototypes(JsonUtil.readListMap(JsonUtil.toJson(prototypes))); - if (StringUtil.isNotBlank(code.getSubModelId())) { - Model subModel = modelService.getById(Func.toLong(code.getSubModelId())); - List subPrototypes = modelPrototypeService.prototypeList(subModel.getId()); - generator.setSubModel(JsonUtil.readMap(JsonUtil.toJson(subModel))); - generator.setSubPrototypes(JsonUtil.readListMap(JsonUtil.toJson(subPrototypes))); - } - // 设置数据源 - Datasource datasource = datasourceService.getById(model.getDatasourceId()); - generator.setDriverName(datasource.getDriverClass()); - generator.setUrl(datasource.getUrl()); - generator.setUsername(datasource.getUsername()); - generator.setPassword(datasource.getPassword()); - // 设置基础配置 - generator.setCodeStyle(code.getCodeStyle()); - generator.setCodeName(code.getCodeName()); - generator.setServiceName(code.getServiceName()); - generator.setPackageName(code.getPackageName()); - generator.setPackageDir(code.getApiPath()); - generator.setPackageWebDir(code.getWebPath()); - generator.setTablePrefix(Func.toStrArray(code.getTablePrefix())); - generator.setIncludeTables(Func.toStrArray(code.getTableName())); - // 设置模版信息 - generator.setTemplateType(code.getTemplateType()); - generator.setAuthor(code.getAuthor()); - generator.setSubModelId(code.getSubModelId()); - generator.setSubFkId(code.getSubFkId()); - generator.setTreeId(code.getTreeId()); - generator.setTreePid(code.getTreePid()); - generator.setTreeName(code.getTreeName()); - // 设置是否继承基础业务字段 - generator.setHasSuperEntity(code.getBaseMode() == 2); - // 设置是否开启包装器模式 - generator.setHasWrapper(code.getWrapMode() == 2); - // 设置是否开启远程调用模式 - generator.setHasFeign(code.getFeignMode() == 2); - // 设置控制器服务名前缀 - generator.setHasServiceName(Boolean.TRUE); - // 启动代码生成 - generator.run(); - }); - return R.success("代码生成成功"); - } - -} diff --git a/src/main/java/org/springblade/modules/develop/controller/DatasourceController.java b/src/main/java/org/springblade/modules/develop/controller/DatasourceController.java deleted file mode 100644 index 57fb9ec..0000000 --- a/src/main/java/org/springblade/modules/develop/controller/DatasourceController.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.develop.entity.Datasource; -import org.springblade.modules.develop.service.IDatasourceService; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 数据源配置表 控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_DEVELOP_NAME + "/datasource") -@Api(value = "数据源配置表", tags = "数据源配置表接口") -public class DatasourceController extends BladeController { - - private final IDatasourceService datasourceService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入datasource") - public R detail(Datasource datasource) { - Datasource detail = datasourceService.getOne(Condition.getQueryWrapper(datasource)); - return R.data(detail); - } - - /** - * 分页 数据源配置表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入datasource") - public R> list(Datasource datasource, Query query) { - IPage pages = datasourceService.page(Condition.getPage(query), Condition.getQueryWrapper(datasource)); - return R.data(pages); - } - - /** - * 新增 数据源配置表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入datasource") - public R save(@Valid @RequestBody Datasource datasource) { - return R.status(datasourceService.save(datasource)); - } - - /** - * 修改 数据源配置表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入datasource") - public R update(@Valid @RequestBody Datasource datasource) { - return R.status(datasourceService.updateById(datasource)); - } - - /** - * 新增或修改 数据源配置表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入datasource") - public R submit(@Valid @RequestBody Datasource datasource) { - datasource.setUrl(datasource.getUrl().replace("&", "&")); - return R.status(datasourceService.saveOrUpdate(datasource)); - } - - - /** - * 删除 数据源配置表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(datasourceService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 数据源列表 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "下拉数据源", notes = "查询列表") - public R> select() { - List list = datasourceService.list(); - return R.data(list); - } - -} diff --git a/src/main/java/org/springblade/modules/develop/controller/ModelController.java b/src/main/java/org/springblade/modules/develop/controller/ModelController.java deleted file mode 100644 index 58d8002..0000000 --- a/src/main/java/org/springblade/modules/develop/controller/ModelController.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.generator.config.DataSourceConfig; -import com.baomidou.mybatisplus.generator.config.StrategyConfig; -import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.core.tool.utils.StringPool; -import org.springblade.core.tool.utils.StringUtil; -import org.springblade.modules.develop.entity.Datasource; -import org.springblade.modules.develop.entity.Model; -import org.springblade.modules.develop.entity.ModelPrototype; -import org.springblade.modules.develop.service.IDatasourceService; -import org.springblade.modules.develop.service.IModelPrototypeService; -import org.springblade.modules.develop.service.IModelService; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 数据模型表 控制器 - * - * @author Chill - */ -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_DEVELOP_NAME + "/model") -@Api(value = "数据模型表", tags = "数据模型表接口") -public class ModelController extends BladeController { - - private final IModelService modelService; - private final IModelPrototypeService modelPrototypeService; - private final IDatasourceService datasourceService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入model") - public R detail(Model model) { - Model detail = modelService.getOne(Condition.getQueryWrapper(model)); - return R.data(detail); - } - - /** - * 分页 数据模型表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入model") - public R> list(Model model, Query query) { - IPage pages = modelService.page(Condition.getPage(query), Condition.getQueryWrapper(model)); - return R.data(pages); - } - - /** - * 新增 数据模型表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "新增", notes = "传入model") - public R save(@Valid @RequestBody Model model) { - return R.status(modelService.save(model)); - } - - /** - * 修改 数据模型表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "修改", notes = "传入model") - public R update(@Valid @RequestBody Model model) { - return R.status(modelService.updateById(model)); - } - - /** - * 新增或修改 数据模型表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "新增或修改", notes = "传入model") - public R submit(@Valid @RequestBody Model model) { - return R.status(modelService.saveOrUpdate(model)); - } - - /** - * 删除 数据模型表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(modelService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 模型列表 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "模型列表", notes = "模型列表") - public R> select() { - List list = modelService.list(); - list.forEach(model -> model.setModelName(model.getModelTable() + StringPool.COLON + StringPool.SPACE + model.getModelName())); - return R.data(list); - } - - /** - * 获取物理表列表 - */ - @GetMapping("/table-list") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "物理表列表", notes = "传入datasourceId") - public R> tableList(Long datasourceId) { - Datasource datasource = datasourceService.getById(datasourceId); - ConfigBuilder config = getConfigBuilder(datasource); - List tableInfoList = config.getTableInfoList().stream() - .filter(tableInfo -> !StringUtil.startsWithIgnoreCase(tableInfo.getName(), "ACT_")) - .map(tableInfo -> tableInfo.setComment(tableInfo.getName() + StringPool.COLON + tableInfo.getComment())) - .collect(Collectors.toList()); - return R.data(tableInfoList); - } - - /** - * 获取物理表信息 - */ - @GetMapping("/table-info") - @ApiOperationSupport(order = 9) - @ApiOperation(value = "物理表信息", notes = "传入model信息") - public R tableInfo(Long modelId, String tableName, Long datasourceId) { - if (StringUtil.isBlank(tableName)) { - Model model = modelService.getById(modelId); - tableName = model.getModelTable(); - } - TableInfo tableInfo = getTableInfo(tableName, datasourceId); - return R.data(tableInfo); - } - - /** - * 获取字段信息 - */ - @GetMapping("/model-prototype") - @ApiOperationSupport(order = 10) - @ApiOperation(value = "物理表字段信息", notes = "传入modelId与datasourceId") - public R modelPrototype(Long modelId, Long datasourceId) { - List modelPrototypeList = modelPrototypeService.list(Wrappers.query().lambda().eq(ModelPrototype::getModelId, modelId)); - if (modelPrototypeList.size() > 0) { - return R.data(modelPrototypeList); - } - Model model = modelService.getById(modelId); - String tableName = model.getModelTable(); - TableInfo tableInfo = getTableInfo(tableName, datasourceId); - if (tableInfo != null) { - return R.data(tableInfo.getFields()); - } else { - return R.fail("未获得相关表信息"); - } - } - - /** - * 获取表信息 - * - * @param tableName 表名 - * @param datasourceId 数据源主键 - */ - private TableInfo getTableInfo(String tableName, Long datasourceId) { - Datasource datasource = datasourceService.getById(datasourceId); - ConfigBuilder config = getConfigBuilder(datasource); - List tableInfoList = config.getTableInfoList(); - TableInfo tableInfo = null; - Iterator iterator = tableInfoList.stream().filter(table -> table.getName().equals(tableName)).collect(Collectors.toList()).iterator(); - if (iterator.hasNext()) { - tableInfo = iterator.next(); - tableInfo.setEntityName(tableInfo.getEntityName().replace(StringUtil.firstCharToUpper(tableName.split(StringPool.UNDERSCORE)[0]), StringPool.EMPTY)); - } - return tableInfo; - } - - /** - * 获取表配置信息 - * - * @param datasource 数据源信息 - */ - private ConfigBuilder getConfigBuilder(Datasource datasource) { - StrategyConfig strategyConfig = new StrategyConfig.Builder() - .entityBuilder() - .naming(NamingStrategy.underline_to_camel) - .columnNaming(NamingStrategy.underline_to_camel).build(); - DataSourceConfig datasourceConfig = new DataSourceConfig.Builder( - datasource.getUrl(), datasource.getUsername(), datasource.getPassword() - ).build(); - return new ConfigBuilder(null, datasourceConfig, strategyConfig, null, null, null); - } - - -} diff --git a/src/main/java/org/springblade/modules/develop/controller/ModelPrototypeController.java b/src/main/java/org/springblade/modules/develop/controller/ModelPrototypeController.java deleted file mode 100644 index fbe5dfe..0000000 --- a/src/main/java/org/springblade/modules/develop/controller/ModelPrototypeController.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.core.tool.utils.StringPool; -import org.springblade.modules.develop.entity.ModelPrototype; -import org.springblade.modules.develop.service.IModelPrototypeService; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 数据原型表 控制器 - * - * @author Chill - */ -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_DEVELOP_NAME + "/model-prototype") -@Api(value = "数据原型表", tags = "数据原型表接口") -public class ModelPrototypeController extends BladeController { - - private final IModelPrototypeService modelPrototypeService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入modelPrototype") - public R detail(ModelPrototype modelPrototype) { - ModelPrototype detail = modelPrototypeService.getOne(Condition.getQueryWrapper(modelPrototype)); - return R.data(detail); - } - - /** - * 分页 数据原型表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入modelPrototype") - public R> list(ModelPrototype modelPrototype, Query query) { - IPage pages = modelPrototypeService.page(Condition.getPage(query), Condition.getQueryWrapper(modelPrototype)); - return R.data(pages); - } - - /** - * 新增 数据原型表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入modelPrototype") - public R save(@Valid @RequestBody ModelPrototype modelPrototype) { - return R.status(modelPrototypeService.save(modelPrototype)); - } - - /** - * 修改 数据原型表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入modelPrototype") - public R update(@Valid @RequestBody ModelPrototype modelPrototype) { - return R.status(modelPrototypeService.updateById(modelPrototype)); - } - - /** - * 新增或修改 数据原型表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入modelPrototype") - public R submit(@Valid @RequestBody ModelPrototype modelPrototype) { - return R.status(modelPrototypeService.saveOrUpdate(modelPrototype)); - } - - /** - * 批量新增或修改 数据原型表 - */ - @PostMapping("/submit-list") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "批量新增或修改", notes = "传入modelPrototype集合") - public R submitList(@Valid @RequestBody List modelPrototypes) { - return R.status(modelPrototypeService.submitList(modelPrototypes)); - } - - /** - * 删除 数据原型表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(modelPrototypeService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 数据原型列表 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 9) - @ApiOperation(value = "数据原型列表", notes = "数据原型列表") - public R> select(@ApiParam(value = "数据模型Id", required = true) @RequestParam Long modelId) { - List list = modelPrototypeService.list(Wrappers.query().lambda().eq(ModelPrototype::getModelId, modelId)); - list.forEach(prototype -> prototype.setComment(prototype.getJdbcName() + StringPool.COLON + StringPool.SPACE + prototype.getComment())); - return R.data(list); - } - -} diff --git a/src/main/java/org/springblade/modules/develop/dto/ModelDTO.java b/src/main/java/org/springblade/modules/develop/dto/ModelDTO.java deleted file mode 100644 index bd40748..0000000 --- a/src/main/java/org/springblade/modules/develop/dto/ModelDTO.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.dto; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springblade.modules.develop.entity.Model; -import org.springblade.modules.develop.entity.ModelPrototype; - -import java.util.List; - -/** - * 代码模型DTO - * - * @author Chill - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class ModelDTO extends Model { - - private static final long serialVersionUID = 1L; - - /** - * 代码建模原型 - */ - private List prototypes; - -} diff --git a/src/main/java/org/springblade/modules/develop/entity/Code.java b/src/main/java/org/springblade/modules/develop/entity/Code.java deleted file mode 100644 index 0a161f7..0000000 --- a/src/main/java/org/springblade/modules/develop/entity/Code.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * 实体类 - * - * @author Chill - */ -@Data -@TableName("blade_code") -@ApiModel(value = "Code对象", description = "Code对象") -public class Code implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @JsonSerialize(using = ToStringSerializer.class) - @ApiModelProperty(value = "主键") - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 数据模型主键 - */ - @JsonSerialize(using = ToStringSerializer.class) - @ApiModelProperty(value = "数据模型主键") - private Long modelId; - - /** - * 模块名称 - */ - @ApiModelProperty(value = "服务名称") - private String serviceName; - - /** - * 模块名称 - */ - @ApiModelProperty(value = "模块名称") - private String codeName; - - /** - * 表名 - */ - @ApiModelProperty(value = "表名") - private String tableName; - - /** - * 实体名 - */ - @ApiModelProperty(value = "表前缀") - private String tablePrefix; - - /** - * 主键名 - */ - @ApiModelProperty(value = "主键名") - private String pkName; - - /** - * 后端包名 - */ - @ApiModelProperty(value = "后端包名") - private String packageName; - - /** - * 模版类型 - */ - @ApiModelProperty(value = "模版类型") - private String templateType; - - /** - * 作者信息 - */ - @ApiModelProperty(value = "作者信息") - private String author; - - /** - * 子表模型主键 - */ - @ApiModelProperty(value = "子表模型主键") - private String subModelId; - - /** - * 子表绑定外键 - */ - @ApiModelProperty(value = "子表绑定外键") - private String subFkId; - - /** - * 树主键字段 - */ - @ApiModelProperty(value = "树主键字段") - private String treeId; - - /** - * 树父主键字段 - */ - @ApiModelProperty(value = "树父主键字段") - private String treePid; - - /** - * 树名称字段 - */ - @ApiModelProperty(value = "树名称字段") - private String treeName; - - /** - * 基础业务模式 - */ - @ApiModelProperty(value = "基础业务模式") - private Integer baseMode; - - /** - * 包装器模式 - */ - @ApiModelProperty(value = "包装器模式") - private Integer wrapMode; - - /** - * 远程调用模式 - */ - @ApiModelProperty(value = "远程调用模式") - private Integer feignMode; - - /** - * 代码风格 - */ - @ApiModelProperty(value = "代码风格") - private String codeStyle; - - /** - * 后端路径 - */ - @ApiModelProperty(value = "后端路径") - private String apiPath; - - /** - * 前端路径 - */ - @ApiModelProperty(value = "前端路径") - private String webPath; - - /** - * 是否已删除 - */ - @TableLogic - @ApiModelProperty(value = "是否已删除") - private Integer isDeleted; - - -} diff --git a/src/main/java/org/springblade/modules/develop/entity/Datasource.java b/src/main/java/org/springblade/modules/develop/entity/Datasource.java deleted file mode 100644 index e0764cf..0000000 --- a/src/main/java/org/springblade/modules/develop/entity/Datasource.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springblade.core.mp.base.BaseEntity; - -/** - * 数据源配置表实体类 - * - * @author Chill - */ -@Data -@TableName("blade_datasource") -@EqualsAndHashCode(callSuper = true) -@ApiModel(value = "Datasource对象", description = "数据源配置表") -public class Datasource extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * 名称 - */ - @ApiModelProperty(value = "名称") - private String name; - /** - * 驱动类 - */ - @ApiModelProperty(value = "驱动类") - private String driverClass; - /** - * 连接地址 - */ - @ApiModelProperty(value = "连接地址") - private String url; - /** - * 用户名 - */ - @ApiModelProperty(value = "用户名") - private String username; - /** - * 密码 - */ - @ApiModelProperty(value = "密码") - private String password; - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; - - -} diff --git a/src/main/java/org/springblade/modules/develop/entity/Model.java b/src/main/java/org/springblade/modules/develop/entity/Model.java deleted file mode 100644 index e934d46..0000000 --- a/src/main/java/org/springblade/modules/develop/entity/Model.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springblade.core.mp.base.BaseEntity; - -/** - * 数据模型表实体类 - * - * @author Chill - */ -@Data -@TableName("blade_model") -@EqualsAndHashCode(callSuper = true) -@ApiModel(value = "Model对象", description = "数据模型表") -public class Model extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * 数据源主键 - */ - @ApiModelProperty(value = "数据源主键") - @JsonSerialize(using = ToStringSerializer.class) - private Long datasourceId; - /** - * 模型名称 - */ - @ApiModelProperty(value = "模型名称") - private String modelName; - /** - * 模型编号 - */ - @ApiModelProperty(value = "模型编号") - private String modelCode; - /** - * 物理表名 - */ - @ApiModelProperty(value = "物理表名") - private String modelTable; - /** - * 模型类名 - */ - @ApiModelProperty(value = "模型类名") - private String modelClass; - /** - * 模型备注 - */ - @ApiModelProperty(value = "模型备注") - private String modelRemark; - - -} diff --git a/src/main/java/org/springblade/modules/develop/entity/ModelPrototype.java b/src/main/java/org/springblade/modules/develop/entity/ModelPrototype.java deleted file mode 100644 index 5f8534e..0000000 --- a/src/main/java/org/springblade/modules/develop/entity/ModelPrototype.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springblade.core.mp.base.BaseEntity; - -/** - * 数据原型表实体类 - * - * @author Chill - */ -@Data -@TableName("blade_model_prototype") -@EqualsAndHashCode(callSuper = true) -@ApiModel(value = "ModelPrototype对象", description = "数据原型表") -public class ModelPrototype extends BaseEntity { - - private static final long serialVersionUID = 1L; - - /** - * 模型主键 - */ - @ApiModelProperty(value = "模型主键") - @JsonSerialize(using = ToStringSerializer.class) - private Long modelId; - /** - * 物理列名 - */ - @ApiModelProperty(value = "物理列名") - private String jdbcName; - /** - * 物理类型 - */ - @ApiModelProperty(value = "物理类型") - private String jdbcType; - /** - * 实体列名 - */ - @ApiModelProperty(value = "实体列名") - private String propertyName; - /** - * 实体类型 - */ - @ApiModelProperty(value = "实体类型") - private String propertyType; - /** - * 实体类型引用 - */ - @ApiModelProperty(value = "实体类型引用") - private String propertyEntity; - /** - * 注释说明 - */ - @ApiModelProperty(value = "注释说明") - private String comment; - /** - * 列表显示 - */ - @ApiModelProperty(value = "列表显示") - private Integer isList; - /** - * 表单显示 - */ - @ApiModelProperty(value = "表单显示") - private Integer isForm; - /** - * 独占一行 - */ - @ApiModelProperty(value = "独占一行") - private Integer isRow; - /** - * 组件类型 - */ - @ApiModelProperty(value = "组件类型") - private String componentType; - /** - * 字典编码 - */ - @ApiModelProperty(value = "字典编码") - private String dictCode; - /** - * 是否必填 - */ - @ApiModelProperty(value = "是否必填") - private Integer isRequired; - /** - * 查询配置 - */ - @ApiModelProperty(value = "查询配置") - private Integer isQuery; - /** - * 查询类型 - */ - @ApiModelProperty(value = "查询类型") - private String queryType; - - -} diff --git a/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.java b/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.java deleted file mode 100644 index 1003b67..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.springblade.modules.develop.entity.Code; - -/** - * Mapper 接口 - * - * @author Chill - */ -public interface CodeMapper extends BaseMapper { - -} diff --git a/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.xml b/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.xml deleted file mode 100644 index bec5490..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/CodeMapper.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.java b/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.java deleted file mode 100644 index ab9643d..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.springblade.modules.develop.entity.Datasource; - -/** - * 数据源配置表 Mapper 接口 - * - * @author Chill - */ -public interface DatasourceMapper extends BaseMapper { - -} diff --git a/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.xml b/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.xml deleted file mode 100644 index 0d58c20..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/DatasourceMapper.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.java b/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.java deleted file mode 100644 index 5671b33..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.springblade.modules.develop.entity.Model; - -/** - * 数据模型表 Mapper 接口 - * - * @author Chill - */ -public interface ModelMapper extends BaseMapper { - -} diff --git a/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.xml b/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.xml deleted file mode 100644 index d971420..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/ModelMapper.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.java b/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.java deleted file mode 100644 index 6db01c0..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.springblade.modules.develop.entity.ModelPrototype; - -/** - * 数据原型表 Mapper 接口 - * - * @author Chill - */ -public interface ModelPrototypeMapper extends BaseMapper { - -} diff --git a/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.xml b/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.xml deleted file mode 100644 index f7764bb..0000000 --- a/src/main/java/org/springblade/modules/develop/mapper/ModelPrototypeMapper.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/org/springblade/modules/develop/service/ICodeService.java b/src/main/java/org/springblade/modules/develop/service/ICodeService.java deleted file mode 100644 index f40e867..0000000 --- a/src/main/java/org/springblade/modules/develop/service/ICodeService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service; - - -import com.baomidou.mybatisplus.extension.service.IService; -import org.springblade.modules.develop.entity.Code; - -/** - * 服务类 - * - * @author Chill - */ -public interface ICodeService extends IService { - - /** - * 提交 - * - * @param code - * @return - */ - boolean submit(Code code); - -} diff --git a/src/main/java/org/springblade/modules/develop/service/IDatasourceService.java b/src/main/java/org/springblade/modules/develop/service/IDatasourceService.java deleted file mode 100644 index e23719e..0000000 --- a/src/main/java/org/springblade/modules/develop/service/IDatasourceService.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service; - -import org.springblade.core.mp.base.BaseService; -import org.springblade.modules.develop.entity.Datasource; - -/** - * 数据源配置表 服务类 - * - * @author Chill - */ -public interface IDatasourceService extends BaseService { - -} diff --git a/src/main/java/org/springblade/modules/develop/service/IModelPrototypeService.java b/src/main/java/org/springblade/modules/develop/service/IModelPrototypeService.java deleted file mode 100644 index a6b75ec..0000000 --- a/src/main/java/org/springblade/modules/develop/service/IModelPrototypeService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service; - -import org.springblade.core.mp.base.BaseService; -import org.springblade.modules.develop.entity.ModelPrototype; - -import java.util.List; - -/** - * 数据原型表 服务类 - * - * @author Chill - */ -public interface IModelPrototypeService extends BaseService { - - /** - * 批量提交 - * - * @param modelPrototypes 原型集合 - * @return boolean - */ - boolean submitList(List modelPrototypes); - - /** - * 原型列表 - * - * @param modelId 模型ID - * @return List - */ - List prototypeList(Long modelId); - -} diff --git a/src/main/java/org/springblade/modules/develop/service/IModelService.java b/src/main/java/org/springblade/modules/develop/service/IModelService.java deleted file mode 100644 index a5c2cb8..0000000 --- a/src/main/java/org/springblade/modules/develop/service/IModelService.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service; - -import org.springblade.core.mp.base.BaseService; -import org.springblade.modules.develop.entity.Model; - -/** - * 数据模型表 服务类 - * - * @author Chill - */ -public interface IModelService extends BaseService { - -} diff --git a/src/main/java/org/springblade/modules/develop/service/impl/CodeServiceImpl.java b/src/main/java/org/springblade/modules/develop/service/impl/CodeServiceImpl.java deleted file mode 100644 index 8ffb30d..0000000 --- a/src/main/java/org/springblade/modules/develop/service/impl/CodeServiceImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springblade.core.tool.constant.BladeConstant; -import org.springblade.modules.develop.entity.Code; -import org.springblade.modules.develop.mapper.CodeMapper; -import org.springblade.modules.develop.service.ICodeService; -import org.springframework.stereotype.Service; - -/** - * 服务实现类 - * - * @author Chill - */ -@Service -public class CodeServiceImpl extends ServiceImpl implements ICodeService { - - @Override - public boolean submit(Code code) { - code.setIsDeleted(BladeConstant.DB_NOT_DELETED); - return saveOrUpdate(code); - } - -} diff --git a/src/main/java/org/springblade/modules/develop/service/impl/DatasourceServiceImpl.java b/src/main/java/org/springblade/modules/develop/service/impl/DatasourceServiceImpl.java deleted file mode 100644 index d28b253..0000000 --- a/src/main/java/org/springblade/modules/develop/service/impl/DatasourceServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service.impl; - -import org.springblade.core.mp.base.BaseServiceImpl; -import org.springblade.modules.develop.entity.Datasource; -import org.springblade.modules.develop.mapper.DatasourceMapper; -import org.springblade.modules.develop.service.IDatasourceService; -import org.springframework.stereotype.Service; - -/** - * 数据源配置表 服务实现类 - * - * @author Chill - */ -@Service -public class DatasourceServiceImpl extends BaseServiceImpl implements IDatasourceService { - -} diff --git a/src/main/java/org/springblade/modules/develop/service/impl/ModelPrototypeServiceImpl.java b/src/main/java/org/springblade/modules/develop/service/impl/ModelPrototypeServiceImpl.java deleted file mode 100644 index 9228f87..0000000 --- a/src/main/java/org/springblade/modules/develop/service/impl/ModelPrototypeServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service.impl; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.springblade.core.mp.base.BaseServiceImpl; -import org.springblade.modules.develop.entity.ModelPrototype; -import org.springblade.modules.develop.mapper.ModelPrototypeMapper; -import org.springblade.modules.develop.service.IModelPrototypeService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 数据原型表 服务实现类 - * - * @author Chill - */ -@Service -public class ModelPrototypeServiceImpl extends BaseServiceImpl implements IModelPrototypeService { - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean submitList(List modelPrototypes) { - modelPrototypes.forEach(modelPrototype -> { - if (modelPrototype.getId() == null) { - this.save(modelPrototype); - } else { - this.updateById(modelPrototype); - } - }); - return true; - } - - @Override - public List prototypeList(Long modelId) { - return this.list(Wrappers.lambdaQuery().eq(ModelPrototype::getModelId, modelId)); - } - -} diff --git a/src/main/java/org/springblade/modules/develop/service/impl/ModelServiceImpl.java b/src/main/java/org/springblade/modules/develop/service/impl/ModelServiceImpl.java deleted file mode 100644 index 842117f..0000000 --- a/src/main/java/org/springblade/modules/develop/service/impl/ModelServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.develop.service.impl; - -import org.springblade.core.mp.base.BaseServiceImpl; -import org.springblade.modules.develop.entity.Model; -import org.springblade.modules.develop.mapper.ModelMapper; -import org.springblade.modules.develop.service.IModelService; -import org.springframework.stereotype.Service; - -/** - * 数据模型表 服务实现类 - * - * @author Chill - */ -@Service -public class ModelServiceImpl extends BaseServiceImpl implements IModelService { - -} diff --git a/src/main/java/org/springblade/modules/resource/controller/AttachController.java b/src/main/java/org/springblade/modules/resource/controller/AttachController.java deleted file mode 100644 index 90eeffc..0000000 --- a/src/main/java/org/springblade/modules/resource/controller/AttachController.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.resource.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.resource.entity.Attach; -import org.springblade.modules.resource.service.IAttachService; -import org.springblade.modules.resource.vo.AttachVO; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * 附件表 控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_RESOURCE_NAME + "/attach") -@Api(value = "附件", tags = "附件") -public class AttachController extends BladeController { - - private final IAttachService attachService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入attach") - public R detail(Attach attach) { - Attach detail = attachService.getOne(Condition.getQueryWrapper(attach)); - return R.data(detail); - } - - /** - * 分页 附件表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入attach") - public R> list(Attach attach, Query query) { - IPage pages = attachService.page(Condition.getPage(query), Condition.getQueryWrapper(attach)); - return R.data(pages); - } - - /** - * 自定义分页 附件表 - */ - @GetMapping("/page") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "分页", notes = "传入attach") - public R> page(AttachVO attach, Query query) { - IPage pages = attachService.selectAttachPage(Condition.getPage(query), attach); - return R.data(pages); - } - - /** - * 新增 附件表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入attach") - public R save(@Valid @RequestBody Attach attach) { - return R.status(attachService.save(attach)); - } - - /** - * 修改 附件表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入attach") - public R update(@Valid @RequestBody Attach attach) { - return R.status(attachService.updateById(attach)); - } - - /** - * 新增或修改 附件表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入attach") - public R submit(@Valid @RequestBody Attach attach) { - return R.status(attachService.saveOrUpdate(attach)); - } - - - /** - * 删除 附件表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(attachService.deleteLogic(Func.toLongList(ids))); - } - - -} diff --git a/src/main/java/org/springblade/modules/resource/controller/OssController.java b/src/main/java/org/springblade/modules/resource/controller/OssController.java deleted file mode 100644 index 9a97103..0000000 --- a/src/main/java/org/springblade/modules/resource/controller/OssController.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.resource.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.RoleConstant; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.resource.entity.Oss; -import org.springblade.modules.resource.service.IOssService; -import org.springblade.modules.resource.vo.OssVO; -import org.springblade.modules.resource.wrapper.OssWrapper; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; - -import static org.springblade.core.cache.constant.CacheConstant.RESOURCE_CACHE; - -/** - * 控制器 - * - * @author BladeX - */ -@NonDS -@ApiIgnore -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_RESOURCE_NAME + "/oss") -@PreAuth(RoleConstant.HAS_ROLE_ADMIN) -@Api(value = "对象存储接口", tags = "对象存储接口") -public class OssController extends BladeController { - - private final IOssService ossService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入oss") - public R detail(Oss oss) { - Oss detail = ossService.getOne(Condition.getQueryWrapper(oss)); - return R.data(OssWrapper.build().entityVO(detail)); - } - - /** - * 分页 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入oss") - public R> list(Oss oss, Query query) { - IPage pages = ossService.page(Condition.getPage(query), Condition.getQueryWrapper(oss)); - return R.data(OssWrapper.build().pageVO(pages)); - } - - /** - * 自定义分页 - */ - @GetMapping("/page") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "分页", notes = "传入oss") - public R> page(OssVO oss, Query query) { - IPage pages = ossService.selectOssPage(Condition.getPage(query), oss); - return R.data(pages); - } - - /** - * 新增 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入oss") - public R save(@Valid @RequestBody Oss oss) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(ossService.save(oss)); - } - - /** - * 修改 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入oss") - public R update(@Valid @RequestBody Oss oss) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(ossService.updateById(oss)); - } - - /** - * 新增或修改 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入oss") - public R submit(@Valid @RequestBody Oss oss) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(ossService.submit(oss)); - } - - - /** - * 删除 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(ossService.deleteLogic(Func.toLongList(ids))); - } - - - /** - * 启用 - */ - @PostMapping("/enable") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "配置启用", notes = "传入id") - public R enable(@ApiParam(value = "主键", required = true) @RequestParam Long id) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(ossService.enable(id)); - } - -} diff --git a/src/main/java/org/springblade/modules/resource/controller/SmsController.java b/src/main/java/org/springblade/modules/resource/controller/SmsController.java deleted file mode 100644 index 44acf4b..0000000 --- a/src/main/java/org/springblade/modules/resource/controller/SmsController.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.resource.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.RoleConstant; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.resource.entity.Sms; -import org.springblade.modules.resource.service.ISmsService; -import org.springblade.modules.resource.vo.SmsVO; -import org.springblade.modules.resource.wrapper.SmsWrapper; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; - -import static org.springblade.core.cache.constant.CacheConstant.RESOURCE_CACHE; - -/** - * 短信配置表 控制器 - * - * @author BladeX - */ -@NonDS -@ApiIgnore -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_RESOURCE_NAME + "/sms") -@PreAuth(RoleConstant.HAS_ROLE_ADMIN) -@Api(value = "短信配置表", tags = "短信配置表接口") -public class SmsController extends BladeController { - - private final ISmsService smsService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入sms") - public R detail(Sms sms) { - Sms detail = smsService.getOne(Condition.getQueryWrapper(sms)); - return R.data(SmsWrapper.build().entityVO(detail)); - } - - /** - * 分页 短信配置表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入sms") - public R> list(Sms sms, Query query) { - IPage pages = smsService.page(Condition.getPage(query), Condition.getQueryWrapper(sms)); - return R.data(SmsWrapper.build().pageVO(pages)); - } - - - /** - * 自定义分页 短信配置表 - */ - @GetMapping("/page") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "分页", notes = "传入sms") - public R> page(SmsVO sms, Query query) { - IPage pages = smsService.selectSmsPage(Condition.getPage(query), sms); - return R.data(pages); - } - - /** - * 新增 短信配置表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入sms") - public R save(@Valid @RequestBody Sms sms) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(smsService.save(sms)); - } - - /** - * 修改 短信配置表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入sms") - public R update(@Valid @RequestBody Sms sms) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(smsService.updateById(sms)); - } - - /** - * 新增或修改 短信配置表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入sms") - public R submit(@Valid @RequestBody Sms sms) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(smsService.submit(sms)); - } - - - /** - * 删除 短信配置表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(smsService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 启用 - */ - @PostMapping("/enable") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "配置启用", notes = "传入id") - public R enable(@ApiParam(value = "主键", required = true) @RequestParam Long id) { - CacheUtil.clear(RESOURCE_CACHE); - return R.status(smsService.enable(id)); - } - - -} diff --git a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java index 000d2ad..9b65429 100644 --- a/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java +++ b/src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java @@ -54,91 +54,6 @@ public class OssEndpoint { */ private final OssBuilder ossBuilder; - /** - * 附件表服务 - */ - private final IAttachService attachService; - - /** - * 创建存储桶 - * - * @param bucketName 存储桶名称 - * @return Bucket - */ - @SneakyThrows - @PostMapping("/make-bucket") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R makeBucket(@RequestParam String bucketName) { - ossBuilder.template().makeBucket(bucketName); - return R.success("创建成功"); - } - - /** - * 创建存储桶 - * - * @param bucketName 存储桶名称 - * @return R - */ - @SneakyThrows - @PostMapping("/remove-bucket") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R removeBucket(@RequestParam String bucketName) { - ossBuilder.template().removeBucket(bucketName); - return R.success("删除成功"); - } - - /** - * 拷贝文件 - * - * @param fileName 存储桶对象名称 - * @param destBucketName 目标存储桶名称 - * @param destFileName 目标存储桶对象名称 - * @return R - */ - @SneakyThrows - @PostMapping("/copy-file") - public R copyFile(@RequestParam String fileName, @RequestParam String destBucketName, String destFileName) { - ossBuilder.template().copyFile(fileName, destBucketName, destFileName); - return R.success("操作成功"); - } - - /** - * 获取文件信息 - * - * @param fileName 存储桶对象名称 - * @return InputStream - */ - @SneakyThrows - @GetMapping("/stat-file") - public R statFile(@RequestParam String fileName) { - return R.data(ossBuilder.template().statFile(fileName)); - } - - /** - * 获取文件相对路径 - * - * @param fileName 存储桶对象名称 - * @return String - */ - @SneakyThrows - @GetMapping("/file-path") - public R filePath(@RequestParam String fileName) { - return R.data(ossBuilder.template().filePath(fileName)); - } - - - /** - * 获取文件外链 - * - * @param fileName 存储桶对象名称 - * @return String - */ - @SneakyThrows - @GetMapping("/file-link") - public R fileLink(@RequestParam String fileName) { - return R.data(ossBuilder.template().fileLink(fileName)); - } - /** * 上传文件 * @@ -148,105 +63,16 @@ public class OssEndpoint { @SneakyThrows @PostMapping("/put-file") public R putFile(@RequestParam MultipartFile file) { + // 由于部署到服务器会被上传可执行文件, 故此处添加图片格式限制 png, jpeg + String suffix = StringUtils.substringAfterLast(file.getOriginalFilename(), "."); + + if (!"png".equals(suffix) && !"jpeg".equals(suffix)) { + return R.fail("上传失败, 文件格式错误!"); + } + BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream()); String domain = StringUtils.substringBeforeLast(bladeFile.getDomain(), "/"); bladeFile.setLink(bladeFile.getLink().replace(domain, BusinessConstant.STRING_EMPTY)); return R.data(bladeFile); } - - /** - * 上传文件 - * - * @param fileName 存储桶对象名称 - * @param file 文件 - * @return ObjectStat - */ - @SneakyThrows - @PostMapping("/put-file-by-name") - public R putFile(@RequestParam String fileName, @RequestParam MultipartFile file) { - BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); - return R.data(bladeFile); - } - - /** - * 上传文件并保存至附件表 - * - * @param file 文件 - * @return ObjectStat - */ - @SneakyThrows - @PostMapping("/put-file-attach") - public R putFileAttach(@RequestParam MultipartFile file) { - String fileName = file.getOriginalFilename(); - BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); - Long attachId = buildAttach(fileName, file.getSize(), bladeFile); - bladeFile.setAttachId(attachId); - return R.data(bladeFile); - } - - /** - * 上传文件并保存至附件表 - * - * @param fileName 存储桶对象名称 - * @param file 文件 - * @return ObjectStat - */ - @SneakyThrows - @PostMapping("/put-file-attach-by-name") - public R putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) { - BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); - Long attachId = buildAttach(fileName, file.getSize(), bladeFile); - bladeFile.setAttachId(attachId); - return R.data(bladeFile); - } - - /** - * 构建附件表 - * - * @param fileName 文件名 - * @param fileSize 文件大小 - * @param bladeFile 对象存储文件 - * @return attachId - */ - private Long buildAttach(String fileName, Long fileSize, BladeFile bladeFile) { - String fileExtension = FileUtil.getFileExtension(fileName); - Attach attach = new Attach(); - attach.setDomainUrl(bladeFile.getDomain()); - attach.setLink(bladeFile.getLink()); - attach.setName(bladeFile.getName()); - attach.setOriginalName(bladeFile.getOriginalName()); - attach.setAttachSize(fileSize); - attach.setExtension(fileExtension); - attachService.save(attach); - return attach.getId(); - } - - /** - * 删除文件 - * - * @param fileName 存储桶对象名称 - * @return R - */ - @SneakyThrows - @PostMapping("/remove-file") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R removeFile(@RequestParam String fileName) { - ossBuilder.template().removeFile(fileName); - return R.success("操作成功"); - } - - /** - * 批量删除文件 - * - * @param fileNames 存储桶对象名称集合 - * @return R - */ - @SneakyThrows - @PostMapping("/remove-files") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R removeFiles(@RequestParam String fileNames) { - ossBuilder.template().removeFiles(Func.toStrList(fileNames)); - return R.success("操作成功"); - } - } diff --git a/src/main/java/org/springblade/modules/resource/endpoint/SmsEndpoint.java b/src/main/java/org/springblade/modules/resource/endpoint/SmsEndpoint.java deleted file mode 100644 index 70f7fc3..0000000 --- a/src/main/java/org/springblade/modules/resource/endpoint/SmsEndpoint.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.resource.endpoint; - -import io.swagger.annotations.Api; -import lombok.AllArgsConstructor; -import lombok.SneakyThrows; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.sms.model.SmsCode; -import org.springblade.core.sms.model.SmsData; -import org.springblade.core.sms.model.SmsResponse; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.jackson.JsonUtil; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.resource.builder.sms.SmsBuilder; -import org.springblade.modules.resource.utils.SmsUtil; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.HashMap; -import java.util.Map; - -import static org.springblade.modules.resource.utils.SmsUtil.*; - -/** - * 短信服务端点 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_RESOURCE_NAME + "/sms/endpoint") -@Api(value = "短信服务端点", tags = "短信服务端点") -public class SmsEndpoint { - - /** - * 短信服务构建类 - */ - private final SmsBuilder smsBuilder; - - //================================= 短信服务校验 ================================= - - /** - * 短信验证码发送 - * - * @param phone 手机号 - */ - @SneakyThrows - @PostMapping("/send-validate") - public R sendValidate(@RequestParam String phone) { - Map params = SmsUtil.getValidateParams(); - SmsCode smsCode = smsBuilder.template().sendValidate(new SmsData(params).setKey(PARAM_KEY), phone); - return smsCode.isSuccess() ? R.data(smsCode, SEND_SUCCESS) : R.fail(SEND_FAIL); - } - - /** - * 校验短信 - * - * @param smsCode 短信校验信息 - */ - @SneakyThrows - @PostMapping("/validate-message") - public R validateMessage(SmsCode smsCode) { - boolean validate = smsBuilder.template().validateMessage(smsCode); - return validate ? R.success(VALIDATE_SUCCESS) : R.fail(VALIDATE_FAIL); - } - - //========== 通用短信自定义发送(支持自定义params参数传递, 推荐用于测试, 不推荐用于生产环境) ========== - - /** - * 发送信息 - * - * @param code 资源编号 - * @param params 自定义短信参数 - * @param phones 手机号集合 - */ - @SneakyThrows - @PostMapping("/send-message") - public R sendMessage(@RequestParam String code, @RequestParam String params, @RequestParam String phones) { - SmsData smsData = new SmsData(JsonUtil.readMap(params, String.class, String.class)); - return send(code, smsData, phones); - } - - //========== 指定短信服务发送(可根据各种场景自定拓展定制, 损失灵活性增加安全性, 推荐用于生产环境) ========== - - /** - * 短信通知 - * - * @param phones 手机号集合 - */ - @SneakyThrows - @PostMapping("/send-notice") - public R sendNotice(@RequestParam String phones) { - Map params = new HashMap<>(3); - params.put("title", "通知标题"); - params.put("content", "通知内容"); - params.put("date", "通知时间"); - SmsData smsData = new SmsData(params); - return send(smsData, phones); - } - - /** - * 订单通知 - * - * @param phones 手机号集合 - */ - @SneakyThrows - @PostMapping("/send-order") - public R sendOrder(@RequestParam String phones) { - Map params = new HashMap<>(3); - params.put("orderNo", "订单编号"); - params.put("packageNo", "快递单号"); - params.put("user", "收件人"); - SmsData smsData = new SmsData(params); - return send(smsData, phones); - } - - /** - * 会议通知 - * - * @param phones 手机号集合 - */ - @SneakyThrows - @PostMapping("/send-meeting") - public R sendMeeting(@RequestParam String phones) { - Map params = new HashMap<>(2); - params.put("roomId", "会议室"); - params.put("topic", "会议主题"); - params.put("date", "会议时间"); - SmsData smsData = new SmsData(params); - return send(smsData, phones); - } - - //================================= 通用短信发送接口 ================================= - - /** - * 通用短信发送接口 - * - * @param smsData 短信内容 - * @param phones 手机号列表 - * @return 是否发送成功 - */ - private R send(SmsData smsData, String phones) { - SmsResponse response = smsBuilder.template().sendMessage(smsData, Func.toStrList(phones)); - return response.isSuccess() ? R.success(SEND_SUCCESS) : R.fail(SEND_FAIL); - } - - /** - * 通用短信发送接口 - * - * @param code 资源编号 - * @param smsData 短信内容 - * @param phones 手机号列表 - * @return 是否发送成功 - */ - private R send(String code, SmsData smsData, String phones) { - SmsResponse response = smsBuilder.template(code).sendMessage(smsData, Func.toStrList(phones)); - return response.isSuccess() ? R.success(SEND_SUCCESS) : R.fail(SEND_FAIL); - } - -} diff --git a/src/main/java/org/springblade/modules/system/controller/DeptController.java b/src/main/java/org/springblade/modules/system/controller/DeptController.java index c01f46d..a648ac5 100644 --- a/src/main/java/org/springblade/modules/system/controller/DeptController.java +++ b/src/main/java/org/springblade/modules/system/controller/DeptController.java @@ -175,16 +175,4 @@ public class DeptController extends BladeController { return R.data(list); } - /** - * 列表-医院 - */ - @PreAuth("") - @GetMapping("/list-hospital") - @ApiOperationSupport(order = 9) - @ApiOperation(value = "列表-医院", notes = "列表-医院") - public R> listHospital() { - List list = deptService.list(Wrappers.lambdaQuery().eq(Dept::getDeptCategory, BusinessConstant.DEPT_CATEGORY_HOSPITAL)); - return R.data(DeptWrapper.build().listNodeVO(list)); - } - } diff --git a/src/main/java/org/springblade/modules/system/controller/ParamController.java b/src/main/java/org/springblade/modules/system/controller/ParamController.java deleted file mode 100644 index 491c024..0000000 --- a/src/main/java/org/springblade/modules/system/controller/ParamController.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.*; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.Param; -import org.springblade.modules.system.service.IParamService; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; -import java.util.Map; - -import static org.springblade.core.cache.constant.CacheConstant.PARAM_CACHE; - -/** - * 控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/param") -@Api(value = "参数管理", tags = "参数管理") -public class ParamController extends BladeController { - - private final IParamService paramService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入param") - public R detail(Param param) { - Param detail = paramService.getOne(Condition.getQueryWrapper(param)); - return R.data(detail); - } - - /** - * 分页 - */ - @GetMapping("/list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "paramName", value = "参数名称", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "paramKey", value = "参数键名", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "paramValue", value = "参数键值", paramType = "query", dataType = "string") - }) - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入param") - public R> list(@ApiIgnore @RequestParam Map param, Query query) { - IPage pages = paramService.page(Condition.getPage(query), Condition.getQueryWrapper(param, Param.class)); - return R.data(pages); - } - - /** - * 新增或修改 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "新增或修改", notes = "传入param") - public R submit(@Valid @RequestBody Param param) { - CacheUtil.clear(PARAM_CACHE); - CacheUtil.clear(PARAM_CACHE, Boolean.FALSE); - return R.status(paramService.saveOrUpdate(param)); - } - - - /** - * 删除 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - CacheUtil.clear(PARAM_CACHE); - CacheUtil.clear(PARAM_CACHE, Boolean.FALSE); - return R.status(paramService.deleteLogic(Func.toLongList(ids))); - } - - -} diff --git a/src/main/java/org/springblade/modules/system/controller/PostController.java b/src/main/java/org/springblade/modules/system/controller/PostController.java deleted file mode 100644 index dd30eec..0000000 --- a/src/main/java/org/springblade/modules/system/controller/PostController.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.BladeUser; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.Post; -import org.springblade.modules.system.service.IPostService; -import org.springblade.modules.system.vo.PostVO; -import org.springblade.modules.system.wrapper.PostWrapper; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; - -/** - * 岗位表 控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/post") -@Api(value = "岗位", tags = "岗位") -public class PostController extends BladeController { - - private final IPostService postService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入post") - public R detail(Post post) { - Post detail = postService.getOne(Condition.getQueryWrapper(post)); - return R.data(PostWrapper.build().entityVO(detail)); - } - - /** - * 分页 岗位表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入post") - public R> list(Post post, Query query) { - IPage pages = postService.page(Condition.getPage(query), Condition.getQueryWrapper(post)); - return R.data(PostWrapper.build().pageVO(pages)); - } - - - /** - * 自定义分页 岗位表 - */ - @GetMapping("/page") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "分页", notes = "传入post") - public R> page(PostVO post, Query query) { - IPage pages = postService.selectPostPage(Condition.getPage(query), post); - return R.data(pages); - } - - /** - * 新增 岗位表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入post") - public R save(@Valid @RequestBody Post post) { - CacheUtil.clear(SYS_CACHE); - return R.status(postService.save(post)); - } - - /** - * 修改 岗位表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入post") - public R update(@Valid @RequestBody Post post) { - CacheUtil.clear(SYS_CACHE); - return R.status(postService.updateById(post)); - } - - /** - * 新增或修改 岗位表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入post") - public R submit(@Valid @RequestBody Post post) { - CacheUtil.clear(SYS_CACHE); - return R.status(postService.saveOrUpdate(post)); - } - - - /** - * 删除 岗位表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - CacheUtil.clear(SYS_CACHE); - return R.status(postService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 下拉数据源 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "下拉数据源", notes = "传入post") - public R> select(String tenantId, BladeUser bladeUser) { - List list = postService.list(Wrappers.query().lambda().eq(Post::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId()))); - return R.data(list); - } - -} diff --git a/src/main/java/org/springblade/modules/system/controller/SearchController.java b/src/main/java/org/springblade/modules/system/controller/SearchController.java deleted file mode 100644 index 75694d7..0000000 --- a/src/main/java/org/springblade/modules/system/controller/SearchController.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.Post; -import org.springblade.modules.system.service.IDeptService; -import org.springblade.modules.system.service.IPostService; -import org.springblade.modules.system.service.IRoleService; -import org.springblade.modules.system.vo.DeptVO; -import org.springblade.modules.system.vo.PostVO; -import org.springblade.modules.system.vo.RoleVO; -import org.springblade.modules.system.wrapper.PostWrapper; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 查询控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/search") -@Api(value = "查询", tags = "查询") -public class SearchController { - - private final IRoleService roleService; - - private final IDeptService deptService; - - private final IPostService postService; - - /** - * 角色信息查询 - */ - @GetMapping("/role") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "角色信息查询", notes = "传入roleName或者parentId") - public R> roleSearch(String roleName, Long parentId) { - return R.data(roleService.search(roleName, parentId)); - } - - /** - * 部门信息查询 - */ - @GetMapping("/dept") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "部门信息查询", notes = "传入deptName或者parentId") - public R> deptSearch(String deptName, Long parentId) { - return R.data(deptService.search(deptName, parentId)); - } - - /** - * 岗位信息查询 - */ - @GetMapping("/post") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "岗位信息查询", notes = "传入postName") - public R> postSearch(String postName, Query query) { - LambdaQueryWrapper queryWrapper = Wrappers.query().lambda(); - if (Func.isNotBlank(postName)) { - queryWrapper.like(Post::getPostName, postName); - } - IPage pages = postService.page(Condition.getPage(query), queryWrapper); - return R.data(PostWrapper.build().pageVO(pages)); - } - -} diff --git a/src/main/java/org/springblade/modules/system/controller/TenantController.java b/src/main/java/org/springblade/modules/system/controller/TenantController.java deleted file mode 100644 index 589dc36..0000000 --- a/src/main/java/org/springblade/modules/system/controller/TenantController.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.*; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.BladeUser; -import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.BladeConstant; -import org.springblade.core.tool.constant.RoleConstant; -import org.springblade.core.tool.support.Kv; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.Tenant; -import org.springblade.modules.system.entity.TenantPackage; -import org.springblade.modules.system.service.ITenantPackageService; -import org.springblade.modules.system.service.ITenantService; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import static org.springblade.common.cache.SysCache.TENANT_PACKAGE_ID; -import static org.springblade.common.cache.SysCache.TENANT_TENANT_ID; -import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; -import static org.springblade.core.tenant.constant.TenantBaseConstant.TENANT_DATASOURCE_CACHE; -import static org.springblade.core.tenant.constant.TenantBaseConstant.TENANT_DATASOURCE_EXIST_KEY; - -/** - * 控制器 - * - * @author Chill - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/tenant") -@Api(value = "租户管理", tags = "租户管理") -public class TenantController extends BladeController { - - private final ITenantService tenantService; - private final ITenantPackageService tenantPackageService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R detail(Tenant tenant) { - Tenant detail = tenantService.getOne(Condition.getQueryWrapper(tenant)); - return R.data(detail); - } - - /** - * 分页 - */ - @GetMapping("/list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "tenantId", value = "参数名称", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "tenantName", value = "角色别名", paramType = "query", dataType = "string"), - @ApiImplicitParam(name = "contactNumber", value = "联系电话", paramType = "query", dataType = "string") - }) - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R> list(@ApiIgnore @RequestParam Map tenant, Query query, BladeUser bladeUser) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(tenant, Tenant.class); - IPage pages = tenantService.page(Condition.getPage(query), (!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(Tenant::getTenantId, bladeUser.getTenantId()) : queryWrapper); - return R.data(pages); - } - - /** - * 下拉数据源 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "下拉数据源", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R> select(Tenant tenant, BladeUser bladeUser) { - QueryWrapper queryWrapper = Condition.getQueryWrapper(tenant); - List list = tenantService.list((!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(Tenant::getTenantId, bladeUser.getTenantId()) : queryWrapper); - return R.data(list); - } - - /** - * 自定义分页 - */ - @GetMapping("/page") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "分页", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R> page(Tenant tenant, Query query) { - IPage pages = tenantService.selectTenantPage(Condition.getPage(query), tenant); - return R.data(pages); - } - - /** - * 新增或修改 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "新增或修改", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - public R submit(@Valid @RequestBody Tenant tenant) { - return R.status(tenantService.submitTenant(tenant)); - } - - - /** - * 删除 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(tenantService.removeTenant(Func.toLongList(ids))); - } - - /** - * 授权配置 - */ - @PostMapping("/setting") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "授权配置", notes = "传入ids,accountNumber,expireTime") - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - public R setting(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @ApiParam(value = "账号额度") Integer accountNumber, @ApiParam(value = "过期时间") Date expireTime) { - return R.status(tenantService.setting(accountNumber, expireTime, ids)); - } - - /** - * 数据源配置 - */ - @PostMapping("datasource") - @ApiOperationSupport(order = 8) - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - @ApiOperation(value = "数据源配置", notes = "传入datasource_id") - public R datasource(@ApiParam(value = "租户ID", required = true) @RequestParam String tenantId, @ApiParam(value = "数据源ID", required = true) @RequestParam Long datasourceId) { - CacheUtil.evict(TENANT_DATASOURCE_CACHE, TENANT_DATASOURCE_EXIST_KEY, tenantId, Boolean.FALSE); - return R.status(tenantService.update(Wrappers.update().lambda().set(Tenant::getDatasourceId, datasourceId).eq(Tenant::getTenantId, tenantId))); - } - - /** - * 根据名称查询列表 - * - * @param name 租户名称 - */ - @GetMapping("/find-by-name") - @ApiOperationSupport(order = 9) - @ApiOperation(value = "详情", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R> findByName(String name) { - List list = tenantService.list(Wrappers.query().lambda().like(Tenant::getTenantName, name)); - return R.data(list); - } - - /** - * 根据域名查询信息 - * - * @param domain 域名 - */ - @GetMapping("/info") - @ApiOperationSupport(order = 10) - @ApiOperation(value = "配置信息", notes = "传入domain") - public R info(String domain) { - Tenant tenant = tenantService.getOne(Wrappers.query().lambda().eq(Tenant::getDomainUrl, domain)); - Kv kv = Kv.create(); - if (tenant != null) { - kv.set("tenantId", tenant.getTenantId()) - .set("domain", tenant.getDomainUrl()) - .set("backgroundUrl", tenant.getBackgroundUrl()); - } - return R.data(kv); - } - - /** - * 根据租户ID查询产品包详情 - * - * @param tenantId 租户ID - */ - @GetMapping("/package-detail") - @ApiOperationSupport(order = 11) - @ApiOperation(value = "产品包详情", notes = "传入tenantId") - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - public R packageDetail(Long tenantId) { - Tenant tenant = tenantService.getById(tenantId); - return R.data(tenantPackageService.getById(tenant.getPackageId())); - } - - /** - * 产品包配置 - */ - @PostMapping("/package-setting") - @ApiOperationSupport(order = 12) - @PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR) - @ApiOperation(value = "产品包配置", notes = "传入packageId") - public R packageSetting(@ApiParam(value = "租户ID", required = true) @RequestParam String tenantId, @ApiParam(value = "产品包ID") Long packageId) { - CacheUtil.evict(SYS_CACHE, TENANT_TENANT_ID, tenantId, Boolean.FALSE); - CacheUtil.evict(SYS_CACHE, TENANT_PACKAGE_ID, tenantId, Boolean.FALSE); - return R.status(tenantService.update(Wrappers.update().lambda().set(Tenant::getPackageId, packageId).eq(Tenant::getTenantId, tenantId))); - } - - -} diff --git a/src/main/java/org/springblade/modules/system/controller/TenantPackageController.java b/src/main/java/org/springblade/modules/system/controller/TenantPackageController.java deleted file mode 100644 index 476800b..0000000 --- a/src/main/java/org/springblade/modules/system/controller/TenantPackageController.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.RoleConstant; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.TenantPackage; -import org.springblade.modules.system.service.ITenantPackageService; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; - -/** - * 租户产品表 控制器 - * - * @author BladeX - */ -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/tenant-package") -@Api(value = "租户产品表", tags = "租户产品表接口") -public class TenantPackageController extends BladeController { - - private final ITenantPackageService tenantPackageService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入tenantPackage") - public R detail(TenantPackage tenantPackage) { - TenantPackage detail = tenantPackageService.getOne(Condition.getQueryWrapper(tenantPackage)); - return R.data(detail); - } - - /** - * 分页 租户产品表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入tenantPackage") - public R> list(TenantPackage tenantPackage, Query query) { - IPage pages = tenantPackageService.page(Condition.getPage(query), Condition.getQueryWrapper(tenantPackage)); - return R.data(pages); - } - - /** - * 新增 租户产品表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 3) - @ApiOperation(value = "新增", notes = "传入tenantPackage") - public R save(@Valid @RequestBody TenantPackage tenantPackage) { - return R.status(tenantPackageService.save(tenantPackage)); - } - - /** - * 修改 租户产品表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "修改", notes = "传入tenantPackage") - public R update(@Valid @RequestBody TenantPackage tenantPackage) { - return R.status(tenantPackageService.updateById(tenantPackage)); - } - - /** - * 新增或修改 租户产品表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "新增或修改", notes = "传入tenantPackage") - public R submit(@Valid @RequestBody TenantPackage tenantPackage) { - CacheUtil.clear(SYS_CACHE, Boolean.FALSE); - return R.status(tenantPackageService.saveOrUpdate(tenantPackage)); - } - - - /** - * 删除 租户产品表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - CacheUtil.clear(SYS_CACHE, Boolean.FALSE); - return R.status(tenantPackageService.deleteLogic(Func.toLongList(ids))); - } - - - /** - * 下拉数据源 - */ - @GetMapping("/select") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "下拉数据源", notes = "传入tenant") - @PreAuth(RoleConstant.HAS_ROLE_ADMIN) - public R> select(TenantPackage tenantPackage) { - return R.data(tenantPackageService.list(Condition.getQueryWrapper(tenantPackage))); - } - - -} diff --git a/src/main/java/org/springblade/modules/system/controller/TopMenuController.java b/src/main/java/org/springblade/modules/system/controller/TopMenuController.java deleted file mode 100644 index 53a1b9d..0000000 --- a/src/main/java/org/springblade/modules/system/controller/TopMenuController.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the dreamlu.net developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: Chill 庄骞 (smallchill@163.com) - */ -package org.springblade.modules.system.controller; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.AllArgsConstructor; -import org.springblade.core.boot.ctrl.BladeController; -import org.springblade.core.cache.utils.CacheUtil; -import org.springblade.core.launch.constant.AppConstant; -import org.springblade.core.mp.support.Condition; -import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.annotation.PreAuth; -import org.springblade.core.tenant.annotation.NonDS; -import org.springblade.core.tool.api.R; -import org.springblade.core.tool.constant.RoleConstant; -import org.springblade.core.tool.utils.Func; -import org.springblade.modules.system.entity.TopMenu; -import org.springblade.modules.system.service.ITopMenuService; -import org.springblade.modules.system.vo.GrantVO; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -import static org.springblade.core.cache.constant.CacheConstant.MENU_CACHE; -import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; - -/** - * 顶部菜单表 控制器 - * - * @author BladeX - */ -@NonDS -@RestController -@AllArgsConstructor -@RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/topmenu") -@Api(value = "顶部菜单表", tags = "顶部菜单") -@PreAuth(RoleConstant.HAS_ROLE_ADMIN) -public class TopMenuController extends BladeController { - - private final ITopMenuService topMenuService; - - /** - * 详情 - */ - @GetMapping("/detail") - @ApiOperationSupport(order = 1) - @ApiOperation(value = "详情", notes = "传入topMenu") - public R detail(TopMenu topMenu) { - TopMenu detail = topMenuService.getOne(Condition.getQueryWrapper(topMenu)); - return R.data(detail); - } - - /** - * 分页 顶部菜单表 - */ - @GetMapping("/list") - @ApiOperationSupport(order = 2) - @ApiOperation(value = "分页", notes = "传入topMenu") - public R> list(TopMenu topMenu, Query query) { - IPage pages = topMenuService.page(Condition.getPage(query), Condition.getQueryWrapper(topMenu).lambda().orderByAsc(TopMenu::getSort)); - return R.data(pages); - } - - /** - * 新增 顶部菜单表 - */ - @PostMapping("/save") - @ApiOperationSupport(order = 4) - @ApiOperation(value = "新增", notes = "传入topMenu") - public R save(@Valid @RequestBody TopMenu topMenu) { - return R.status(topMenuService.save(topMenu)); - } - - /** - * 修改 顶部菜单表 - */ - @PostMapping("/update") - @ApiOperationSupport(order = 5) - @ApiOperation(value = "修改", notes = "传入topMenu") - public R update(@Valid @RequestBody TopMenu topMenu) { - return R.status(topMenuService.updateById(topMenu)); - } - - /** - * 新增或修改 顶部菜单表 - */ - @PostMapping("/submit") - @ApiOperationSupport(order = 6) - @ApiOperation(value = "新增或修改", notes = "传入topMenu") - public R submit(@Valid @RequestBody TopMenu topMenu) { - return R.status(topMenuService.saveOrUpdate(topMenu)); - } - - - /** - * 删除 顶部菜单表 - */ - @PostMapping("/remove") - @ApiOperationSupport(order = 7) - @ApiOperation(value = "逻辑删除", notes = "传入ids") - public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { - return R.status(topMenuService.deleteLogic(Func.toLongList(ids))); - } - - /** - * 设置顶部菜单 - */ - @PostMapping("/grant") - @ApiOperationSupport(order = 8) - @ApiOperation(value = "顶部菜单配置", notes = "传入topMenuId集合以及menuId集合") - public R grant(@RequestBody GrantVO grantVO) { - CacheUtil.clear(SYS_CACHE); - CacheUtil.clear(MENU_CACHE); - CacheUtil.clear(MENU_CACHE, Boolean.FALSE); - boolean temp = topMenuService.grant(grantVO.getTopMenuIds(), grantVO.getMenuIds()); - return R.status(temp); - } - -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2a7317c..dc38f76 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -120,6 +120,8 @@ blade: token: #是否有状态 state: false + # 令牌签名 + sign-key: QdscgsASDFQWERZXZCVHYGTNBJIOLKMUPabc123defghijkmalnopteqrstzuvwxhgrzy345 #redis序列化方式 redis: serializer-type: protostuff @@ -141,49 +143,19 @@ blade: big-num-to-string: true #支持text文本请求,与报文加密同时开启 support-text-plain: false - #xss配置 -# xss: -# enabled: true -# skip-url: -# - /blade-chat/weixin -# - /blade-desk/notice/submit #安全框架配置 secure: #接口放行 skip-url: - - /blade-test/** - - /blade-business/** - - /blade-system/** -# #授权认证配置 -# auth: -# - method: ALL -# pattern: /blade-chat/weixin/** -# expression: "hasAuth()" -# - method: POST -# pattern: /blade-desk/dashboard/upload -# expression: "hasTimeAuth(9, 17)" -# - method: POST -# pattern: /blade-desk/dashboard/submit -# expression: "hasAnyRole('administrator', 'admin', 'user')" -# #基础认证配置 -# basic: -# - method: ALL -# pattern: /blade-desk/dashboard/info -# username: "blade" -# password: "blade" -# #动态签名认证配置 -# sign: -# - method: ALL -# pattern: /blade-desk/dashboard/sign -# crypto: "sha1" -# #多终端认证配置 -# client: -# - client-id: sword -# path-patterns: -# - /blade-sword/** -# - client-id: saber -# path-patterns: -# - /blade-saber/** + - /blade-system/dept-hospital/list-hospital + - /blade-business/article/detail-publish + - /blade-business/blacklist/user-blacklist + - /blade-business/apm-config/already-config-day + - /blade-business/apm-config/detail-for-apm + - /blade-business/apm-record/save + - /blade-business/apm-record/page + - /blade-business/apm-record/cancel + - /blade-business/common-api/get-system-datetime #多租户配置 tenant: #多租户增强 diff --git a/src/main/resources/static/images/icon.png b/src/main/resources/static/images/icon.png deleted file mode 100644 index 633a2f09474652f89d44a041283862cb004a745f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41738 zcmXtfWl)<<+cpv)P$a?K-DxTA?(R_B9g0h_AVmvBio3f*ad(&ERswRn# zU|`5$WF81p|!|>_#lC@TNqo@{6P>9W?3!l z9P_FhD*l@9`TAm+yw>@bmG#G|3Xa-Wt=ZMLjn&kzZsybDESs6@&l}?`06%8{Hl(|( ze!jUB!Nm4+ZwYu?Dw16Vg0;}PnMfIp2?2NGVP|1qz-`GcIl0aR`0lK2E?F0gAO)hs zHH74a)NLNTr~i6u3sup;3bqAlsQzu;WDK^=6HDp|v<)!QFd~xI!v=6`4@`i`9jk=3 zjVyr`%z3$kT-0Ek1T<_}2sr_^Y$7Fr2ph~dOzlzv5m<_0cu}FkVfFe=som1{cwz3K zc^QLmtfbOgo`4qk?Q~IBpo*L(lWT4vAjG8K7zQ4;KrNCQCMW@GsT1xqDA*5%7baFT zlnSyl+>U(+q>y^9+nMKqYoh2TiEwzhT;QUt`NxdrWZz>9LZy{LHSK~$&A}GpO3<2j z6`Mxc;-QaK!HKQggze;Ubzm-4OUyGM(Eabf72`BcCfaIcT>sc1mKTuYCb1YzyD?l7Nd4np=U(9b@6st|sZ zKY`kFqc-jKjzsp&q zhGKLtC9$%C1&1ru4#qAQ6s&z3G^EyE!Tfqu5Dnu=uGSO_u+Z0)@V`0zr4Y!(;7mh5 zOHEIUC(8^6SO(}Q1}zY>*=MDTELjMW5yPrN=b%KPz0Ydki1SGya=|J5CC^Z`eUBfx zj&bs~D=k*@Q7$yQnD!^vfbA$w{Rg+F1beeThih3*Rc_+n$UnCV{X{wlHeLYM{1k8AZ#N>b?EkrFWs)d@%2V0k!3i8 zl|)2%sVwaK;{uqZ5(%UQnS+A|uGL2jW22wRp&No|DXqf+|DOv{pf5dpKbpoq<8L4= z95G^z4hcm0LH~PH^p-@^S`ZJ|-l|?tSK=?KgVztt7ch3uE+Ng%TJJr@6~Gf)u3W(T;%gHo&&NXU18Z;EF_v%Rn%$ zpC!+hk0>A(l==~r5_M<^eH<3mzqgMJ<}vA|RXXmi@bRrS+-hYEQ=&y+F93Fkc@;X| zCJBg~rwq<8PHv#C6mqyOYEk%am?T1hKHBX1N-`7~TR;Z|xuhJ^Gi6Q^4*>}x#w2%vOAr`} zCFww`eY+9cbl~Lxx-@i!!^Q0dL-v;4@M*k$swp&Np%{&Tf6&1}jG1!1tiKWRk}IPn zvVHa>$85N)Ga!^i^$NvYo7C@>n-(#kKA>=}qB&P98^lUwC|L83=B4BKZ}%e7&`s#d zmKF;kVFc|kYy|Yl=6vOH70m$y*lg4;_YK7Ob}1WX_jb`GC~*yQ^XsFrtJTRhDJfkz zc;FJm17Ua>gQfRvMm!U+CeaXf(EA6Zj8ess2uhB!%+jJHw@-NC>O=!U_9|EcoZLyo zNiowX*opigJOXzM@GVDEdIHRQ92_Cu_nu`}fO!-Q>lx(k(;fkpp!4IM%JRE`}oLveEP}^dqtJ|yK zfpZLkffYiz=%@N~L)qwjj!=9iJVJEh_1^OF>GwN6A%=9zF_DT$X)MxlDvi9AN0UFR@mGf z=m`Vh`+-I`0p0@sfZIDeDW&Ge``;jH0B{-*jP$9& zy!59IV*;8dxmMb(m0ZU^*9$KCv!(=q5iJ|n(#mUS0JBVFURPj$+aLASTp~kKwe0^qu=8aFsC1rt){E ztb^6%Q#pmL$0*wplI%VTl&oE4+yWi*m~(+qW=wDu@Of!lgRP|n(^`6GOGGz$?(8tXNGK64nXJQ75?2h11^iEf<3uon;j1vT!%#UHkL(*2#%`BHz`J4Hlpt| z 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
;2B3;a1rBzKtIWPR&Xbn=tW9r zYFG|jFrL1ciR3{$uno5_cGJT-hGbysY=k(CaCt3>d{qML=^g-I$G6?B*r3i5?+A`Qi=$%BJ7G zt_{4^1p1d{AQ7|BTFzfSMT5l@+I`(pabI5!xZCpCQGsiG4U_K4c#jq$vX}aT!pH6N zZKp?jCaCb1tb#@={m59*A0q8Wl$niP8#GZb!z<+nF7SEdrdC*RC!nfr?b=>530hb* zv>&;SoNOsIJqEr_b7;`!fVw%^op2-> zC;9ewe*(l$d=nrV|5U=h{95F8t#1@CoaNX9^tJYBT5&huCDeH#W6F&}OVeOi>Ang4 z7`aa0F?6RjgZ#G&B*06=LB;Vem-({WWRlQt?)c#JRana07Iuy7qCnJF z$G=+YIP|M$z(=X|CbT1Q>I)zXxtUF_ct{0*^C8!GwzG~?p6GeH^ew;%xae}&Y!V6) zg+6@GtC9P?hPA9G^ewvS<;{NPlw#ckG8`TYIq~>u)3uK|6gE(|4LOwILc&JYipoD< z3;{52Y|EGp70F=7U&F}P82XC&ewF=ET7{t>2gk%?_X7{kfCx%P7FS7o&3|qe`jTT|GLqUMTl5kcV$^vHW_I%e)QVv&@B5xEIK>y9-& zRSa?TDa}Gt3~yQq?z5y{Io!jchnHZ8iU?n1Is{GxJw0sZ7Ng*=pTE)88=^tZa6UxH zAB%dJQ-6_JC5{$HS{WQ1{f!M)%-_EGpC z%tw;pBIc&PRst*GRy}FKt`IAu2el~9-th|w-@5}#le1sP4aO+L3syEP#f+SOPCDWI!zZnt3B&$1}#mNf7jMf z)hsIi=$)bVj_80H2tjq?n5VShM{|v@O9k`_GclLn^%C2Il5>gk?p$k;y?x}}X)CLg z_X-wQOR2FGsqns^M)6(Z8mn#H42P;uhu0cQ)UmpF;HR1*9JvXqINCynZ)w`#|d#qhkD*j#)Am6 ztQ!FA1B-U2c2ytfYh3Cmz+vGfY@x@a)T_jcDZl$k4!I4we1KBchv=ZoheZBwsUx&- zZ2{QL;3quOveAPda=5;K9KkYtR2l*&Jgytl?L)gNcOrwG`0G95KxD^=rugNE8-1>K ze9WJIUS)v+vX8pk%eq$YGU#nz*J0wOiQ~EmO_x353aX#uQ)Ro1-4AtCR7JsiOBe-{ zYpcvl0ibNmzzz76Kbp05n~g5vTF$f_PW0fxc?y?7eX?E&bg_$&hr!ybk_SyM_v#im zWwwQ~Dnlq1RyG4Y+Z$2syhd>q|Ml^KR7{xJnQUaYi&#`V&4zVzTr~LZ8v<*U3uUgZ zR+YaDzLb@0yqVRv1VZ_IfgwZfl^^%m;}iEsLS{cwS?%xwO0hr6jAQhSMq-oyow-uw zFQVDAnt0&58&xZ%e|^N_pf(T8rg>D(6Rc=%7I`WJ`s25lk|)h%iQwI7lp;3HOcq(w zNVFr0%aVdh!+HM={0xg{a@rq=Rl4+X2$bLpnzqY8eYuT7<95^BkWcYBGn3*hE>t!R zHJmyX1G%w<;DEy?&3rH0hwE!Dpwve;Pj@LfKQ}BV5T?cqOg5F$?r1g`R20(vdq!?J z6~@a~{^sGz3C9?@U8mn+K}@NbM7pGR044%polhYj(7Jb}g{WtY3$>t*4HDI!b<-pf z`tktdYdL^_9OU=Ad>arKm(*tJPsFKw(4yl0{i`l98NcsBJeq~{{P-dX8M&bCN0vu& zTTSsMr|1HFy;#^@^SFbP>`I$(|Gg|$ToHG-7f;mH#&?X^_%mA z8P-`yn&vHyuMvnG5EKg?)-2%r5z2r{+*(MC-OU~no;$x*@0Wk;c%%6Lv;YsrN1q68 zX&H(oDg@2zbWqhIAsdbTL+@6VpI0Oa_5+YDRrq6VtJ)pRWc7@9+@R7zRE()~ldD$e z#w{4v%Me=c&l}~gC+z6)_hJgMXkK6Agr|&LLWy4)ty1W!+?<@@UjHN|@Z1ZBfc#5U z0s-?>vJxW`K>n4Y$6D0p8#8mPGwUrOa!;W_aNMhQcY4n!*rrDp*;`PnNkHrjZ{40^|ciThYE2*^e<*xh#4$Fd1>A8cVL&=@;7iu zzbU1}l59k(5_aNs>YvH`KxBW%Y3Ovm;|9Sy$XEhYK}neltRVstmKMmTQ(O;H(p==jCg5u*G@UOUh!(ubBl-z?@ppyk%R~KM*W+gMQhKup}Htjnb?s{0{_9ce4b97}IsaaNify#|t zGPs`+Y+1}CiYBV%Lw{nDP=Mo#b!M#Y)a@Te0QoIp0WEE0Q3{A^-ut*vl2jbf0u}F zC7PscqVM{s-S!3!(~1-{kU!mhInqm#jC}C<{TLG&PWUFpv+{LDWVWDZ;ZwPFk8#~E zpmtc3Uj!Nq_W+VCjrK=1TkNtWA^?JpEv-5a-8u`ETVtWDyBf;Ar(1_yk#~pCqU-}< zKKcIy_a6x0Saa-JEk)L+$8hGfI1dzaC1w;M`Yxf_QP;BNBQR))_3mw$7ZbZ&*XKFL zuwX}8H{LuL!$!uTo!syU*fF74>6;wRxkj54y>1Qc&!4Nrr)v&_l_- z1h?Ng3jGI0S)(gShPen3tjDa9Cj0OGEFoHyu-stkCbJr4JJp z<8kex0XDy1GIm}zZ9I?NJ1+`WXP5gA{9zKpBc&{B#^PzsdW0Z5Bn4BhCB(7mK@AMb z=?w_ee_bB!t{sA3v!#uD@}RGpg>EIuQab2WHkCEV|hmtaw~?SK94f4{xQ)ox#Otc^>J-2Bf9V}1SiTYCjBOe3QLIj<|Z z1)NLfYbM^38IjM{i036?H1I6Y(2?$@%+o6KGj^mUo|oKSF&>uALE)u3toq*p(YqT) zFVoM6959yZA+-mi*?%fMg}mY_Sh(C{bjb3pUo|zg++;g|2^YD{8JJGv)bXMdEY47M zyw_>SIJ@*)h374H^BdzfKFsbQB)_kTO;j~8BNHBFHZ?Z)pIc(ca1@8oNIWY?`QEf-<%eN%--(Zww^a< zl}`x1PFIqfomD>}yLJwDkkqh{11+kef&g$osEQERyru@ffu zu^EA(T?S=?PV|v%vOArJpP1}aJF7w!klO^5s{xe`@R9*x3ZPE_&_57xvgwvoFmtD~XgTaIg#S)$bjG zs+mvwZq57~rs(9%b@j!E3>qB6kv}@RFk`W;0w@tr0|S3KFe4I(voBkWNzlk-xHT<> zd~Q-BC#vky287|5vUt1C%#mYG6wuoV;~@#bGwDk5vI!p- zr>pAn281Cx;`y^5`o)K@WX?cf^gbO-tsK)&$7|9-`_uJrtZpY85b68}`x~pw$ziWM z=8RHsGJ3qZ&iR(?h>*I(O*X zRsT+1Ix%S1wNuS50CA$*|J{ijH>NH+cg2XS*V&@$c)Kk3ro2)>fP2YO=3GOcsLPjX z@!q@p^;R1^G!_}ROBcjlL1MeM|GcwL(6u)#+#ioTF~wm4hCi0+-+A<$Y=sQCIUWdf zt_ZR<8L8w>L+jVs-**cGGWtF06{f@{N-^8n0ryn>u4L{(OBMect*wtljvX$+`mE!6 zVP_H74?Sj|yBJrR|6hO3#rDm@B(S#586$=hyYu)(n9fZvw5fr>v@~;ioxc?A+@v>0u|d%qv3QRPdtk;cTJF8Q$Irh}^r*0kyH=4-oAQ{BuP0*kO`L8y^Y#${%-76$CzBcHF1LGfM$ zSl$beJNSu52u{lhCOcDFT7%%}so-EZEm57{cFr!^o3>&vC@fD1VO`ZcURuMME2!9d zQV@s#`^yZ3hT7()lVurv^{?CY=1pI8;~*}uQ7U`{81?%n9|#*@M;P9$BB04IgN)!* zULOlY*`N95sxAb$B9~#3D{x#H`&n=+1HuM9e=F^;(P1YAtd|(VSTv=2q6oBBH==0m zZo&7{Zyf)Uf78JMc1{pj;utG*^uE&ey^uzphS=H(%W?n8h$I zJ{S)^I?2{5T$R7Jusz~%!LP2vf&U^MSSY;K7GURy9dVGWn_%}ka1W=Lf6mra2noJHFi?u7&b6W$#CgGYbbeb0U2^3D~1@21A z#5%gx?9V|>b{(LRyq$ld`BTso*1(rY+0wNpaNyzv%FyZ za{nJDIYm+{TaMq=Wgk9x1z)chc7#}T<6umf)XU~W)KXym71J-$uZsap`J#Al4q=wMNy7%O7kN#6j|ea{lE(b--Ky+Kq}b zep=taARj#Or|EW~*)MAW*in{1T&f_5!$N?uq4vX<02&#=l4VM=!G66urYDauARR^| zO-t~pWJDaZ&^mj){K-ye>iLfRBSs})N%~O7Dkt@B5CP_lz|sy2m4!D9#Kb9m49c)Z zg<=)3wGwDCaG^dt7#L$m&TeKr2*GV>N|I%baXPyUk1-%@BIa(PH&Ti$={U=A%d-6E z<7mt&;VBRq8GuKhoa#8mq@ImN;J@$eN73b4UVWD1<%y@J*^SDcabg{<1M-^ybr(az zuF~Rtff1oVj2*eUxnnDWWuCC}=$w3yG9YZw>`sJId?Q_~8~wbnYQ?(amr%9qtbj~{ zr(c{6KR@Y|(W-#kKv-UGH9mY#*r{mQ@)35Y$Y=Cxb*;bAxd$r%ZUhoL z6GHI7BNNRP>#FS<)@XKyR9iSbAS!oXm0BFx2C3O2OwXO?PpD0pu(sE&VlJ?k1J zX3tgHS0Sl4vk*9SycC(A9TRMO=kLcMMQJ;VezO#|RipN7g7e)q&chIF9&11tFkHks z@T)|7VrZFI_x;eozp_)1Xfd^46jt2h0rN;u z4jJaUV}!Y}i^ii32xmmL(*A7}TOb1+DJ38Tr5#^ZeZroO;V(9S(gaOvU;`^gS1#jx|F|U5( zg%XtiBAlb+(LYW@WR$;of~8h=ML-|Zu|4?B>^j&kopn&MU+Ye+y5?dj8ITU-SUwTd z;VUUAmAOmF_;zh|DinUYL$JXuX~Q^@L#en10%A$00s_79?8xy1;O8CQ?L9wyhkZkS_-VxUOxf_A8dtA)yk{H@^Y}Kbg8%o0=2bjy!N*p zpdD$LyK0?r`$!BPYG(o}+rqY{pAx@!hfIRjf=MzU0!Yr@N}quaFIo#^Ne&-@((jL; zxqzRW)I;4sU3!VES)GmC^Od|Y^dAs~+wXFZ%XC8UY`T)Xg4t%69wAlCrI*ME{`lt^2o7;z8bAwY zfJK)R8SYF=A)i|)$}O8q21L)a&fQ9b;izqzmqrQaSB6#TmfCZJDWJF?$d ze|R1xQKO-F<>hUHX@lp^OT~;iDXxhJi}8@-#-&L__`=RLM`cy5B?DprPA)|*#Rf_- zz^cf5xG-I-1_keL5ll0?V9@|fnbz0C5pu2J|M1;8?A^t8&5n)<#2=oR;#z}g*Y=!3 zj>VqtrfX>8Bm-gyApqC!ra{du_=r;6WJGnTijfEuuHB8cYCbhM%a6|Tq)Wwh5GXBe z#5=DG=e&RPk5dsDgQXgFKMdpjh=4}W}mx)pkmMA#F7w_o3bvQqvt_nHO$Fnw0CJykKQFG8RN!C%r- z$SYQOU z`6U-yf6e8|N$eGZ`yO_Bg2hTALt1(YVdtt+F%kjEfEWo>*J>u zptZ6AMOk|U@mPMxC=41BEn($C2$U8#;GH*w=kt$G&p=3s9dpW>fEyvm?g$RNY(g`s zDgeoVn7IrV(Hc>NzcQC-E) zIBCypg{ELefDb~Hc;H$>T1;st)on*WG9VVNggIO2N(#IUia-lRd1UkAuMa|9T+JJM zQc5`PzIU8QV&ck!-n8*NcJI9C^z%u8Mk2$*X(?olE932G-6aEJg&CN)jVd)dd=3if ziDx37)q5_W_Gmt@mA8)q&%QJVL|UOHBI?-cmoL@gy?6KXl#t0}c;>~~@b+;E|C56X zg5^twUM|s<&~jq(^0|N4?Q*ov2oJI z&PXVorrO_M*oMYN{)v#oGfon)EM|X?OTqIq3DGzWU@okPWI(JudGj{YsTzV$LD9#` zqTN!Qrl|#&*K89U+v1ytVC;lMw;Z=S59*7xCvf6uF>i=dXC!0(bq>1MBDh3kxGg=I z>~d%9?L9WhfY<=>4r=)SQi^mNh<7`Ymp|GLO{1DOuF>NXanq6^ZZ}?cA5ivzB7F1Z zDc&#>5<+ml1M;O4f=oHVeG&z`^;e!`K&+4HRf%&q(_1Olip z5U}yHA6duW+F!H3fqTFGH34hGUOQ8H_2nI?t5fk*x^=}U3><9x_#Q&=t=tC>EbT?E zI1?`Jri*i}I(I|2%XsE)p-Xh_?!K{ZJWR8OrYfmH$yWyi+phfGSSV8?%#!O0jZPjf z#fC3WL#=MJin^Tf=`bwqMg|>5ro$+8F+f)hRX3y6#em5OLc{zpb$SvKdzrS0{xa(% zjvnSeyC+TUi|ekp9WN;%C?ymRr=^nhRsmEJq89 zs?p)%`@aG@%F}hu{C=1@+xdBv%mKN&N`*K7xeHn?a}ILe!g90x{=o@|PcYty9L+Aq zmtUOV4XRh~P~7{_1e*+&03QZ<#f(H(Y#;q$yS-(Rkka%!kA-?@um}j_3Y5$Erte1jwTVzspdPtwt*-RkR8M(hkHbFq$r8$zJMLt>)rJ9s`BlZWT?} z)IKdLcbq}}Nj?=(V4x5F^xRDQC}E{usE!>285XvCX8|^CvDW!ShRd5&ngX{bBOB9wh_f;3=Q8gASz{ya|d~4pzmX z-8Y^sM)?;0kq1-ii9bz8Sh$}<_3PR>^D-(bs>7ASI#g9Pqqatc`g%25TC~u#wexzh z)V%EICm_fh!9l(V3H3!(Odw)n1Cfvz%n=K^k^xz?cn~H`?rqW>eDK~ObJoQ+st+ok;p9#l! zEz1~=VI$+L2eyflC!O!0djBJwq z=yU+pb-wQSO#xlU-`I|ay$1MqNG1+dpgO^raS32SoyP2{x(e9z{dw%(!RN)AIHfNZ z-eBHEIyNj6wMHc5h|2uKFRQUtBoe#vR-U0Z@jbOcX>BFKuOT|yK~ajR?P zA9>i?b4LuEhWZv9I#2`_7$@YCYAaBuOiRLoMg7eZ-)T%Z!_#SexZmxDhZ!QyAhG}0 zYwmCD28w%4yT1+z@j+0qk6F5$I9h@))*k1z?VA*id+s-xHm(5#FDp{;=2Ajh%~D8e zWOW2217dYZEf;wGW*XBB{0+bgPvX@o`7Rr(%auF;6MKi^J{x)N2+dYwV=H!S%?G>W z)(B9|TRy}3C5)fg2iM;;(AM49Tz*A)6X#{tv-mKg%$MgF*FS-dP<%w?_;W@wDKoB- zRLfonNCw1SNSo2mye)K;2HgF~R5O~pT$7puxu`kBCrD*?3D3SX7jlJdmn-|0zHj$s zZ2dI{YPI9I_Tu7$@Zh79U2gt*D$I5>FFw5)t*v}4AA4#VA|m|tj*$@TA{39LrII5q z4~Cl#z_y=AHwDe!!@6b*U7!PAq7tcQa#5Y zAQ=$H;BHp09T)8{fMS?g0-U^&R^5h6tA$fi+cKjayBuGac>=91rtLap-d^yD4u)4q z0OY~Gko$T;rjWDHZ?ND<+NOb~xdqxrHCk($&|2Lnn0>M5wD|dXahy@^P}XOiz_G)8 zX5MQT4aDSW-3hA+!3i1goOD6%Ix{aB5Z9S2PE$%LnY#^3pu_VNaQ%bw9{3l2x(jV} zO}tqdJ~AFlGpuhn_wKrcAHHL;7{+)o5%|W3As{Il{(Yn16&7IH>Y?C_h`OW(sw>sp zeUGk%?=;{}24u^xx!C#(|5$R|gx-@F{&@VUX;xKa*Y=C}>4)Yr;v#U3cO#s&<|c)b7vE&qhFi zmsKorFa|^b8Xs@4TZOq)#J+gy@Ea5wsJHE z3=+9`H9@Ds%XL`w-viKU#J}`q+AbWYdVdaT1q_J4zZd@ECI+Ojp%s6B zv7Mrd5b~=`MqkhUYQfJYOqW#Ei4l+th!anaxvI_IOowR*wOk=yp;QN8a1Y7gi0^zirh z#$R4=k0UGqZ7=+Jb5^U4yms-cIl^2uMyv~|igO}h+fRsdj@e_hV#%yj1P>D(eoq10 z`M_Ek(JNmaKuZaqkz1J>iIu+_V^MEn^ctN)Lq{hge4>5wc31DYfZC&c1L6*Dyo8{R z0Po3s@V1oH$)Y9e)Qu$r;?&b)9p$dyO@mZw+^!?I2Nc7tBh_|Ns&=14-LV2*2aF@? znU~DJ8>p;o##{f~4ISh15GcXJ`XF+e{T$n>_Fh2U5g`NO1$N)#iiH4-yJVGrC_cF% ziZr<57$lvIM?f+l#$)9cHRo-imYN1NE`PjTu#20P4#nuP2_|>Xh!J1? z>kh%)hs;ZX#N|_<2=p~st|bks_MAuEQ2_%I=#4)==Mr}y2W7x2SqQS0Mw3QMu#noi zCIXTHam{(Ns@5Hs?)Ly#PAS5yD%?zAmp|ABjjDy$x@!QMDWZ35y@+2n3CDbdP3(uT z(e_W9Tea&P>W=e|>YO@>7C{XGKBqFQ%19>CrMM}J&<*QK2E+{~)!ZTdE}MGg*W()K zuoS>z3K*XR+uTk?+Liuz6wUd3^3~Y*U_A8bB$Io4=Z(E6E#~LmkokC__lg;idC5(d zX=wu&G9dLJ*gy!@r6%K-F@*5L=Pd<8YVVQ=NCw0ur_J_CFUX-jZH1T*ilr2|-rn~m zwb}Wo-hY8NP$DCE_N6)S_BQ^3UsubHueJ$-7CgK!BBz>{+{n^dsN8uL^(QXz#IXDu zPd($6L00j$_YeTyir1;sK@ETn+- z_&h|^R~1#GWP|X1?A`Z{M^cLMCv7K=mEw!fg)ik3Zk_<2xKP`JD9}UI&ajD{+K!=$>?r3Z9I?NJNcK@?D(qh-LviLdDT_v${lA=fAX@x z4#XEvJu}1T@mW-nAcp{(2=J542iuqSB9`atwMZeUu`3}U84y>REhp46jZMx*iRnxi;(hJT;pml%OK=DO>kB4$8>gMIO&jSNV~ zE@K-gHW45El-8T@$+#SZht#d>As`tL*PAn^)tKFzXfI)!j&M7ZS%hM!B`J9;x1L7* znL>-dp}+gaUX%!2pa&1>jmR18l;VykmD|p4s9qWX00M|fL_t)b{xp9F5**@#C!e;` z5mtLj*pmRZQaLt-CSj*^pW%qvcF#T~1LB_Z>J+0|u%8CEHDe;tVX}^3GNBkx0i&Y; z>(3OSa_cFveQ@y5-U#Y%dQhTKof=W8=5RimFY=Gp zfC3F~)MJP^#kdq)dK`1#P z_w_z;A#-M>Q6NZ_Bm``LfMh^y0IDR?G6bG~p2{*$|CHLQl?{cC4kLsP0gwWUzMa91 zeUrj)&;8?#>PYMk#Hhx0u0#M9w8z5J^C%^!AR{Nd<+_vUgXiZw|Gbp7&(6~!b!Pwp z$$&^p#HA1zyyT~FbsI_Y@{{#_?xi_NAm~del9+J;&<6r{EFY~tjGXfoPBKo?L_k^e zU;zlZNI(jxj9w&KQsC=FFP>gMzuHL@mDG?BFo=L;Kny}8Rd6K)HWpL=#%4r7fk>Ga z5tJfw)5Z%CyLJ>rQs^QGNCX8U2n&WJ@Szmm>^A}R2H*n_@Akh@c00$CL$v{D9AMP=-_yo!41Dno-Kst&(DMm&?1D*-L( eDk1Ry5%_=6b!R%Z*}q-@0000