From 66c5aa1c049d9060ad4ddc79dded386f4d1a9cd9 Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Tue, 20 May 2025 09:59:57 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=E7=AC=AC=E4=B8=89=E6=96=B9=E5=85=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/RemoteSubscribeService.java | 8 ++ .../api/domain/vo/RemoteSubscribeApiVo.java | 49 +++++++ dk-auth/pom.xml | 5 + .../auth/controller/TokenController.java | 76 ++++++++++- .../org/dromara/auth/form/CasLoginBody.java | 22 +++ .../auth/service/impl/CasAuthStrategy.java | 56 ++++++++ .../org/dromara/auth/util/HttpClientUtil.java | 108 +++++++++++++++ .../system/SubscribeApiController.java | 64 +++++++++ .../dromara/system/domain/SubscribeApi.java | 59 ++++++++ .../system/domain/bo/SubscribeApiBo.java | 55 ++++++++ .../dubbo/RemoteSubscribeServiceImpl.java | 27 ++++ .../system/handle/ListTypeHandler.java | 51 +++++++ .../system/mapper/SubscribeApiMapper.java | 7 + .../system/service/ISubscribeApiService.java | 14 ++ .../impl/ISubscribeApiServiceImpl.java | 51 +++++++ .../org/dromara/system/utils/JsonUtil.java | 126 ++++++++++++++++++ .../mapper/system/SubscribeApiMapper.xml | 7 + 17 files changed, 781 insertions(+), 4 deletions(-) create mode 100644 dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java create mode 100644 dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java create mode 100644 dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java create mode 100644 dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java create mode 100644 dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/system/SubscribeApiController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/SubscribeApi.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/bo/SubscribeApiBo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteSubscribeServiceImpl.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/handle/ListTypeHandler.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/mapper/SubscribeApiMapper.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/ISubscribeApiService.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/impl/ISubscribeApiServiceImpl.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/JsonUtil.java create mode 100644 dk-modules/system/src/main/resources/mapper/system/SubscribeApiMapper.xml diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java new file mode 100644 index 0000000..9a2f9a0 --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteSubscribeService.java @@ -0,0 +1,8 @@ +package org.dromara.system.api; + +import org.dromara.system.api.domain.vo.RemoteSubscribeApiVo; + +public interface RemoteSubscribeService { + RemoteSubscribeApiVo getPrivateKey(String subscribeApiCode); + +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java new file mode 100644 index 0000000..8ac4002 --- /dev/null +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSubscribeApiVo.java @@ -0,0 +1,49 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class RemoteSubscribeApiVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + private Long id; + + /** + * 订阅名称 + */ + private String subscribeName; + + /** + * 订阅编码 + */ + private String subscribeCode; + + /** + * 订阅人 + */ + private List subscribeUser; + + /** + * 公钥 + */ + private String publicKey; + + /** + *私钥 + */ + private String privateKey; + + /** + *是否开启 + */ + private Boolean isEnable; + + +} diff --git a/dk-auth/pom.xml b/dk-auth/pom.xml index 9a64994..585d0ec 100644 --- a/dk-auth/pom.xml +++ b/dk-auth/pom.xml @@ -86,6 +86,11 @@ api-resource + + org.dromara + api-system + + diff --git a/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 0930841..e192e64 100644 --- a/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/dk-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -21,11 +23,13 @@ import org.dromara.auth.form.RegisterBody; import org.dromara.auth.form.SocialLoginBody; import org.dromara.auth.service.IAuthStrategy; import org.dromara.auth.service.SysLoginService; +import org.dromara.auth.util.HttpClientUtil; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.utils.*; import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.encrypt.utils.EncryptUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.social.config.properties.SocialLoginConfigProperties; @@ -33,14 +37,13 @@ import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.resource.api.RemoteMessageService; -import org.dromara.system.api.RemoteClientService; -import org.dromara.system.api.RemoteConfigService; -import org.dromara.system.api.RemoteSocialService; -import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.*; import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.domain.vo.RemoteSubscribeApiVo; import org.dromara.system.api.domain.vo.RemoteTenantVo; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.HashMap; @@ -74,6 +77,8 @@ public class TokenController { private final RemoteSocialService remoteSocialService; @DubboReference(stub = "true") private final RemoteMessageService remoteMessageService; + @DubboReference + private final RemoteSubscribeService remoteSubscribeService; /** * 登录方法 @@ -238,4 +243,67 @@ public class TokenController { return R.ok(result); } + /** + * 负责根据调用方传入的url和参数,还有用户名进行免登录执行redirect_url + */ + @PostMapping("/thirdParty/{subscribeApiCode}") + public R getAuthThirdParty(@RequestBody String param, @PathVariable("subscribeApiCode") String subscribeApiCode) { + //根据订阅组和用户获取私钥 + RemoteSubscribeApiVo remoteSubscribeApiVo = remoteSubscribeService.getPrivateKey(subscribeApiCode); + + //解密 + String decrypt = null; + try { + decrypt = EncryptUtils.decryptByRsa(param, remoteSubscribeApiVo.getPrivateKey()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + if (ObjectUtil.isEmpty(decrypt)){ + throw new RuntimeException("解析内容失败,请检查公钥是否正确!"); + } + + //解析传过来的参数 + JSONObject body = JSON.parseObject(decrypt); + + if (!remoteSubscribeApiVo.getSubscribeUser().contains(body.getString("username"))){ + throw new RuntimeException("当前用户没有权限!"); + } + + //获取接口请求方式 + String method = body.getString("method"); + + //获取客户端id + String clientId = body.getString("clientId"); + + // 授权类型和客户端id + RemoteClientVo clientVo = remoteClientService.queryByClientId(clientId); + + //获取token + JSONObject result = new JSONObject(); + result.put("username", body.getString("username")); + LoginVo loginVo = IAuthStrategy.login(result.toJSONString(), clientVo, "cas"); + + //构建请求header添加token、header + Map header = new HashMap<>(); + header.put("Authorization", "Bearer " + loginVo.getAccessToken()); + header.put("clientId", clientId); + + //发送 + try { + switch (method.toLowerCase()){ + case "post": + HttpClientUtil.sendPost(body.getString("redirectUrl"),body.toJSONString(),header); + break; + case "get": + HttpClientUtil.sendGet(body.getString("redirectUrl"),header); + break; + } + } catch (IOException e) { + log.error(e.getMessage(),e); + } + + return R.ok(); + } + } diff --git a/dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java b/dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java new file mode 100644 index 0000000..d2924d9 --- /dev/null +++ b/dk-auth/src/main/java/org/dromara/auth/form/CasLoginBody.java @@ -0,0 +1,22 @@ +package org.dromara.auth.form; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.LoginBody; + +/** + * 免密登录对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class CasLoginBody extends LoginBody { + + /** + * 用户名 + */ + private String username; + + +} diff --git a/dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java b/dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java new file mode 100644 index 0000000..4360b85 --- /dev/null +++ b/dk-auth/src/main/java/org/dromara/auth/service/impl/CasAuthStrategy.java @@ -0,0 +1,56 @@ +package org.dromara.auth.service.impl; + + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.form.CasLoginBody; +import org.dromara.auth.service.IAuthStrategy; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteClientVo; +import org.dromara.system.api.model.LoginUser; +import org.springframework.stereotype.Service; + +@Slf4j +@Service("cas" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class CasAuthStrategy implements IAuthStrategy{ + + @DubboReference + private RemoteUserService remoteUserService; + + @Override + public LoginVo login(String body, RemoteClientVo client) { + CasLoginBody loginBody = JsonUtils.parseObject(body, CasLoginBody.class); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + + LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + return remoteUserService.getUserInfo(username, tenantId); + }); + + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + + // 生成token + LoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } +} diff --git a/dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java b/dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java new file mode 100644 index 0000000..ddf2249 --- /dev/null +++ b/dk-auth/src/main/java/org/dromara/auth/util/HttpClientUtil.java @@ -0,0 +1,108 @@ +package org.dromara.auth.util; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.*; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.Map; + +public class HttpClientUtil { + + // 默认超时时间 + private static final int TIMEOUT = 5000; + + // 创建默认的 HttpClient + private static CloseableHttpClient createHttpClient() { + RequestConfig config = RequestConfig.custom() + .setConnectTimeout(TIMEOUT) + .setConnectionRequestTimeout(TIMEOUT) + .setSocketTimeout(TIMEOUT) + .build(); + return HttpClients.custom() + .setDefaultRequestConfig(config) + .build(); + } + + // 发送 GET 请求 + public static String sendGet(String url, Map headers) throws IOException { + HttpGet httpGet = new HttpGet(url); + if (headers != null) { + headers.forEach(httpGet::addHeader); + } + + try (CloseableHttpClient httpClient = createHttpClient(); + CloseableHttpResponse response = httpClient.execute(httpGet)) { + + return handleResponse(response); + } + } + + // 发送 POST 请求 + public static String sendPost(String url, String body, Map headers) throws IOException { + HttpPost httpPost = new HttpPost(url); + if (headers != null) { + headers.forEach(httpPost::addHeader); + } + if (body != null) { + HttpEntity entity = new StringEntity(body, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + } + + try (CloseableHttpClient httpClient = createHttpClient(); + CloseableHttpResponse response = httpClient.execute(httpPost)) { + + return handleResponse(response); + } + } + + // 发送 PUT 请求 + public static String sendPut(String url, String body, Map headers) throws IOException { + HttpPut httpPut = new HttpPut(url); + if (headers != null) { + headers.forEach(httpPut::addHeader); + } + if (body != null) { + HttpEntity entity = new StringEntity(body, ContentType.APPLICATION_JSON); + httpPut.setEntity(entity); + } + + try (CloseableHttpClient httpClient = createHttpClient(); + CloseableHttpResponse response = httpClient.execute(httpPut)) { + + return handleResponse(response); + } + } + + // 发送 DELETE 请求 + public static String sendDelete(String url, Map headers) throws IOException { + HttpDelete httpDelete = new HttpDelete(url); + if (headers != null) { + headers.forEach(httpDelete::addHeader); + } + + try (CloseableHttpClient httpClient = createHttpClient(); + CloseableHttpResponse response = httpClient.execute(httpDelete)) { + + return handleResponse(response); + } + } + + // 处理响应 + private static String handleResponse(HttpResponse response) throws IOException { + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode >= 200 && statusCode < 300) { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + } else { + throw new ClientProtocolException("Unexpected response status: " + statusCode); + } + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SubscribeApiController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SubscribeApiController.java new file mode 100644 index 0000000..2dd45a5 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SubscribeApiController.java @@ -0,0 +1,64 @@ +package org.dromara.system.controller.system; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.encrypt.utils.EncryptUtils; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SubscribeApi; +import org.dromara.system.domain.bo.SubscribeApiBo; +import org.dromara.system.service.ISubscribeApiService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/subscribe") +public class SubscribeApiController extends BaseController { + + private final ISubscribeApiService iSubscribeApiService; + + + @Log(title = "订阅添加", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SubscribeApiBo bo) { + return R.ok(iSubscribeApiService.addSubscribeApi(bo)); + } + + + @Log(title = "订阅编辑", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SubscribeApiBo bo) { + return R.ok(iSubscribeApiService.editSubscribeApi(bo)); + } + + + @Log(title = "订阅删除", businessType = BusinessType.DELETE) + @DeleteMapping("/delete/{id}") + public R remove(@PathVariable Long id) { + return R.ok(iSubscribeApiService.deleteSubscribeApi(id)); + } + + + /** + * 生成秘钥(公钥和私钥) + */ + @GetMapping("/generate") + public R> generateRsaKey() { + + return R.ok(EncryptUtils.generateRsaKey()); + } + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SubscribeApi.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SubscribeApi.java new file mode 100644 index 0000000..2a7694f --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SubscribeApi.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.dromara.system.handle.ListTypeHandler; + +import java.util.List; + +/** + * 第三方接口订阅类 + */ +@Data +@TableName(value = "subscribe_api",autoResultMap = true) +public class SubscribeApi { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 订阅名称 + */ + @TableField(value = "subscribe_name") + private String subscribeName; + + /** + * 订阅编码 + */ + @TableField(value = "subscribe_code") + private String subscribeCode; + + /** + * 订阅人 + */ + @TableField(value = "subscribe_user",typeHandler = ListTypeHandler.class) + private List subscribeUser; + + /** + * 公钥 + */ + @TableField(value = "public_key") + private String publicKey; + + /** + *私钥 + */ + @TableField(value = "private_key") + private String privateKey; + + /** + *是否开启 + */ + @TableField(value = "is_enable") + private Boolean isEnable; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SubscribeApiBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SubscribeApiBo.java new file mode 100644 index 0000000..7098cee --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SubscribeApiBo.java @@ -0,0 +1,55 @@ +package org.dromara.system.domain.bo; + + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.system.domain.SubscribeApi; + +import java.util.List; + +@Data +@AutoMapper(target = SubscribeApi.class, reverseConvertGenerate = false) +public class SubscribeApiBo { + + + private Long id; + + /** + * 订阅名称 + */ + @NotNull(message = "订阅名称不能为空", groups = { EditGroup.class, AddGroup.class }) + private String subscribeName; + + /** + * 订阅编码 + */ + @NotNull(message = "订阅编码不能为空", groups = { EditGroup.class, AddGroup.class }) + private String subscribeCode; + + /** + * 订阅人 + */ + private List subscribeUser; + + /** + * 公钥 + */ + @NotNull(message = "公钥不能为空", groups = { EditGroup.class, AddGroup.class }) + private String publicKey; + + /** + *私钥 + */ + @NotNull(message = "私钥不能为空", groups = { EditGroup.class, AddGroup.class }) + private String privateKey; + + /** + *是否开启 + */ + private Boolean isEnable; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteSubscribeServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteSubscribeServiceImpl.java new file mode 100644 index 0000000..273b027 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteSubscribeServiceImpl.java @@ -0,0 +1,27 @@ +package org.dromara.system.dubbo; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.api.RemoteSubscribeService; +import org.dromara.system.api.domain.vo.RemoteSubscribeApiVo; +import org.dromara.system.domain.SubscribeApi; +import org.dromara.system.service.ISubscribeApiService; +import org.springframework.stereotype.Service; + + +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteSubscribeServiceImpl implements RemoteSubscribeService { + + private final ISubscribeApiService subscribeApiService; + + + @Override + public RemoteSubscribeApiVo getPrivateKey(String subscribeApiCode) { + SubscribeApi subscribeApi = subscribeApiService.getPrivateKey(subscribeApiCode); + return MapstructUtils.convert(subscribeApi, RemoteSubscribeApiVo.class); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/handle/ListTypeHandler.java b/dk-modules/system/src/main/java/org/dromara/system/handle/ListTypeHandler.java new file mode 100644 index 0000000..8ae1f87 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/handle/ListTypeHandler.java @@ -0,0 +1,51 @@ +package org.dromara.system.handle; + +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; +import org.dromara.system.utils.JsonUtil; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@MappedJdbcTypes(JdbcType.VARCHAR) // 数据库类型 +@MappedTypes({List.class}) // java数据类型 +public class ListTypeHandler implements TypeHandler> { + + @Override + public void setParameter(PreparedStatement preparedStatement, int i, List alertTypeList, JdbcType jdbcType) throws SQLException { + preparedStatement.setString(i, JsonUtil.toJson(alertTypeList)); + } + + @Override + public List getResult(ResultSet resultSet, String s) throws SQLException { + if (StringUtils.isBlank(resultSet.getString(s))) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(resultSet.getString(s), String.class); + } + + @Override + public List getResult(ResultSet resultSet, int i) throws SQLException { + if (StringUtils.isBlank(resultSet.getString(i))) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(resultSet.getString(i), String.class); + } + + @Override + public List getResult(CallableStatement callableStatement, int i) throws SQLException { + String value = callableStatement.getString(i); + + if (StringUtils.isBlank(value)) { + return new ArrayList<>(); + } + return JsonUtil.jsonToList(value, String.class); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SubscribeApiMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SubscribeApiMapper.java new file mode 100644 index 0000000..bd4ab40 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SubscribeApiMapper.java @@ -0,0 +1,7 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.system.domain.SubscribeApi; + +public interface SubscribeApiMapper extends BaseMapper { +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISubscribeApiService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISubscribeApiService.java new file mode 100644 index 0000000..7fd3c79 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISubscribeApiService.java @@ -0,0 +1,14 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SubscribeApi; +import org.dromara.system.domain.bo.SubscribeApiBo; + +public interface ISubscribeApiService { + SubscribeApi addSubscribeApi(SubscribeApiBo bo); + + SubscribeApi editSubscribeApi(SubscribeApiBo bo); + + Boolean deleteSubscribeApi(Long id); + + SubscribeApi getPrivateKey(String subscribeApiCode); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/ISubscribeApiServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/ISubscribeApiServiceImpl.java new file mode 100644 index 0000000..06b9f33 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/ISubscribeApiServiceImpl.java @@ -0,0 +1,51 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.system.domain.SubscribeApi; +import org.dromara.system.domain.bo.SubscribeApiBo; +import org.dromara.system.mapper.SubscribeApiMapper; +import org.dromara.system.service.ISubscribeApiService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ISubscribeApiServiceImpl extends ServiceImpl implements ISubscribeApiService { + + + @Override + public SubscribeApi addSubscribeApi(SubscribeApiBo bo) { + SubscribeApi convert = MapstructUtils.convert(bo, SubscribeApi.class); + + this.baseMapper.insert(convert); + + return convert; + } + + @Override + public SubscribeApi editSubscribeApi(SubscribeApiBo bo) { + SubscribeApi subscribeApi = this.baseMapper.selectById(bo.getId()); + + BeanUtils.copyProperties(bo, subscribeApi); + + this.baseMapper.updateById(subscribeApi); + + return subscribeApi; + } + + @Override + public Boolean deleteSubscribeApi(Long id) { + return this.baseMapper.deleteById(id) > 0; + } + + @Override + public SubscribeApi getPrivateKey(String subscribeApiCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SubscribeApi::getSubscribeCode, subscribeApiCode); + + return this.baseMapper.selectOne(wrapper); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/JsonUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/JsonUtil.java new file mode 100644 index 0000000..a6eea9b --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/JsonUtil.java @@ -0,0 +1,126 @@ +package org.dromara.system.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 定义响应结构 + */ +public class JsonUtil { + + private static ObjectMapper MAPPER; + static{ + MAPPER=new ObjectMapper(); + } + + /** + * 将对象转换成json字符串。 + * @param data + * @return + */ + public static String toJson(Object data){ + String string = null; + try { + string = MAPPER.writeValueAsString(data); + if(StringUtils.isEmpty(string)){ + return null; + } + return string; + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将json结果集转化为对象 + * + * @param jsonData json数据 + * @return + */ + public static T jsonToPojo(String jsonData, Class beanType) { + try { + T t = MAPPER.readValue(jsonData, beanType); + return t; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将json数据转换成pojo对象list + *

Title: jsonToList

+ *

Description:

+ * @param jsonData + * @param beanType + * @return + */ + public static List jsonToList(String jsonData, Class beanType) { + JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); + try { + List list = MAPPER.readValue(jsonData, javaType); + return list; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 将Object对象里面的属性和值转化成Map对象 + * + * @param obj + * @return + * @throws IllegalAccessException + */ + public static Map objectToMap(Object obj){ + try { + Map map = new HashMap(); + Class clazz = obj.getClass(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + String fieldName = field.getName(); + if(ObjectUtil.isNotEmpty(field.get(obj))){ + Object value = field.get(obj); + map.put(fieldName, value); + }else{ + map.put(fieldName, ""); + } + } + return map; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Map jsonToMap(String json){ + try { + return MAPPER.readValue(json, new TypeReference>(){}); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static LinkedHashMap jsonToStrMap(String json){ + try { + return MAPPER.readValue(json, new TypeReference>(){}); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/dk-modules/system/src/main/resources/mapper/system/SubscribeApiMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SubscribeApiMapper.xml new file mode 100644 index 0000000..d81c0ee --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/system/SubscribeApiMapper.xml @@ -0,0 +1,7 @@ + + + + +