From 88b023ca005e2735055961d6f65dfc1cfe378742 Mon Sep 17 00:00:00 2001
From: Krcia <1503175889@qq.com>
Date: Wed, 4 Feb 2026 11:13:42 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9EDeepseek=E5=B7=A5?=
=?UTF-8?q?=E5=85=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +-
.../common/component/deepseek/Deepseek.java | 65 +++
.../deepseek/bean/ChatRoomRecord.java | 29 ++
.../deepseek/bean/DeepSeekParam.java | 64 +++
.../common/config/MyBatisPlusConfig.java | 1 -
.../krcia/common/request/RequestHelper.java | 389 ++++++++++++++++++
.../top/krcia/common/request/WebRequest.java | 162 ++++++++
.../krcia/common/request/bean/HttpFile.java | 75 ++++
.../common/request/enums/RequestType.java | 5 +
.../request/interfaces/WebRequestOption.java | 24 ++
src/main/resources/application-dev.properties | 8 +
src/main/resources/application-res.properties | 0
src/main/resources/smart-doc.json | 20 +
13 files changed, 845 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/top/krcia/common/component/deepseek/Deepseek.java
create mode 100644 src/main/java/top/krcia/common/component/deepseek/bean/ChatRoomRecord.java
create mode 100644 src/main/java/top/krcia/common/component/deepseek/bean/DeepSeekParam.java
create mode 100644 src/main/java/top/krcia/common/request/RequestHelper.java
create mode 100644 src/main/java/top/krcia/common/request/WebRequest.java
create mode 100644 src/main/java/top/krcia/common/request/bean/HttpFile.java
create mode 100644 src/main/java/top/krcia/common/request/enums/RequestType.java
create mode 100644 src/main/java/top/krcia/common/request/interfaces/WebRequestOption.java
create mode 100644 src/main/resources/application-dev.properties
create mode 100644 src/main/resources/application-res.properties
create mode 100644 src/main/resources/smart-doc.json
diff --git a/pom.xml b/pom.xml
index f90b34e..d30e72a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,12 +82,14 @@
${fastjson.version}
compile
-
+
+ org.springframework
+ spring-web
+
org.springframework.boot
spring-boot-starter
-
org.springframework.boot
spring-boot-starter-test
diff --git a/src/main/java/top/krcia/common/component/deepseek/Deepseek.java b/src/main/java/top/krcia/common/component/deepseek/Deepseek.java
new file mode 100644
index 0000000..e70655f
--- /dev/null
+++ b/src/main/java/top/krcia/common/component/deepseek/Deepseek.java
@@ -0,0 +1,65 @@
+package top.krcia.common.component.deepseek;
+
+
+import com.alibaba.fastjson.JSON;
+import top.krcia.common.component.deepseek.bean.ChatRoomRecord;
+import top.krcia.common.component.deepseek.bean.DeepSeekParam;
+import top.krcia.common.request.WebRequest;
+import top.krcia.common.request.enums.RequestType;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+public class Deepseek {
+ private final String URL = "https://api.deepseek.com/chat/completions";
+ private DeepSeekParam deepSeekParam = null;
+ private String apiKey;
+
+ private Deepseek(DeepSeekParam deepSeekParam, String apiKey) {
+ this.deepSeekParam = deepSeekParam;
+ this.apiKey = apiKey;
+ }
+
+ public static Deepseek build(String apiKey, String model, String robotTemplate, int temperature) {
+ return new Deepseek(new DeepSeekParam(model, robotTemplate, temperature), apiKey);
+ }
+
+ public String sendChat(String systemPrompt, List message) {
+ deepSeekParam.setSystemPrompt(systemPrompt);
+ deepSeekParam.setContent(message);
+
+ try {
+ String result = WebRequest.Create(new URI(URL))
+ .setBody(JSON.parseObject(JSON.toJSONString(deepSeekParam)))
+ .setHeader(Map.of("Authorization", "Bearer ".concat(apiKey)))
+ .setRequestType(RequestType.POST)
+ .execute();
+ return JSON.parseObject(result)
+ .getJSONArray("choices")
+ .getJSONObject(0)
+ .getJSONObject("message")
+ .getString("content");
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public String sendEngine(String message) {
+ deepSeekParam.setContent(message);
+ try {
+ String result = WebRequest.Create(new URI(URL))
+ .setBody(JSON.parseObject(JSON.toJSONString(deepSeekParam)))
+ .setHeader(Map.of("Authorization", "Bearer ".concat(apiKey)))
+ .setRequestType(RequestType.POST)
+ .execute();
+ return JSON.parseObject(result)
+ .getJSONArray("choices")
+ .getJSONObject(0)
+ .getJSONObject("message")
+ .getString("content");
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/top/krcia/common/component/deepseek/bean/ChatRoomRecord.java b/src/main/java/top/krcia/common/component/deepseek/bean/ChatRoomRecord.java
new file mode 100644
index 0000000..c8269f3
--- /dev/null
+++ b/src/main/java/top/krcia/common/component/deepseek/bean/ChatRoomRecord.java
@@ -0,0 +1,29 @@
+package top.krcia.common.component.deepseek.bean;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * (ChatRoomRecord)表实体类
+ *
+ * @author admin
+ * @since 2025-09-11 11:14:00
+ */
+@SuppressWarnings("serial")
+@Data
+public class ChatRoomRecord extends Model {
+ @TableId
+ //消息ID
+ private String messageId;
+ //聊天时间
+ private Date chatDate;
+ //消息所属者(0:机器人|1用户)
+ private Integer from;
+ //消息内容
+ private String message;
+
+}
+
diff --git a/src/main/java/top/krcia/common/component/deepseek/bean/DeepSeekParam.java b/src/main/java/top/krcia/common/component/deepseek/bean/DeepSeekParam.java
new file mode 100644
index 0000000..12a499f
--- /dev/null
+++ b/src/main/java/top/krcia/common/component/deepseek/bean/DeepSeekParam.java
@@ -0,0 +1,64 @@
+package top.krcia.common.component.deepseek.bean;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class DeepSeekParam {
+ private String model;
+ private List messages;
+ private final Boolean stream = false;
+ private double temperature;
+
+ public DeepSeekParam(String model, String robotTemplate, double temperature) {
+ messages = new ArrayList<>();
+ MessagesDTO messagesDTO = new MessagesDTO();
+ messagesDTO.setRole("system");
+ messagesDTO.setContent(robotTemplate);
+ messages.add(messagesDTO);
+ this.model = model;
+ this.temperature = temperature;
+ }
+
+ public void setSystemPrompt(String systemPrompt) {
+ MessagesDTO messagesDTO = new MessagesDTO();
+ messagesDTO.setRole("system");
+ messagesDTO.setContent(systemPrompt);
+ messages.add(messagesDTO);
+ }
+
+ public void setContent(List message) {
+ List messagesDTOS = new ArrayList<>();
+ for (ChatRoomRecord crr : message) {
+ MessagesDTO messagesDTO = new MessagesDTO(crr.getFrom() == 0 ? "assistant" : "user",crr.getMessage());
+ messagesDTOS.add(messagesDTO);
+ }
+ messages.addAll(messagesDTOS);
+ }
+ public void setContent(String message) {
+ messages.add(new MessagesDTO("user",message));
+ }
+ public void setContent(int from,String message) {
+ List messagesDTOS = new ArrayList<>();
+ MessagesDTO messagesDTO = new MessagesDTO(from== 0 ? "assistant" : "user", message);
+ messagesDTOS.add(messagesDTO);
+ messages.addAll(messagesDTOS);
+ }
+
+
+ @Data
+ public static class MessagesDTO {
+ private String role;
+ private String content;
+
+ public MessagesDTO(String role, String content) {
+ this.role = role;
+ this.content = content;
+ }
+
+ public MessagesDTO() {
+ }
+ }
+}
diff --git a/src/main/java/top/krcia/common/config/MyBatisPlusConfig.java b/src/main/java/top/krcia/common/config/MyBatisPlusConfig.java
index 71b323d..838af03 100644
--- a/src/main/java/top/krcia/common/config/MyBatisPlusConfig.java
+++ b/src/main/java/top/krcia/common/config/MyBatisPlusConfig.java
@@ -11,7 +11,6 @@ public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- // 新版 MP 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
diff --git a/src/main/java/top/krcia/common/request/RequestHelper.java b/src/main/java/top/krcia/common/request/RequestHelper.java
new file mode 100644
index 0000000..5548e8f
--- /dev/null
+++ b/src/main/java/top/krcia/common/request/RequestHelper.java
@@ -0,0 +1,389 @@
+package top.krcia.common.request;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import io.micrometer.common.util.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.CookieStore;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.AuthSchemes;
+import org.apache.http.client.config.CookieSpecs;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.http.MediaType;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class RequestHelper {
+
+ /**
+ * get
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity get(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap, CookieStore cookies, int timeOut) throws IOException {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpGet request = null;
+ try {
+ request = new HttpGet(buildUrl(host, path, queryMap));
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ try {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ } catch (Exception e) {
+ }
+
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ HttpResponse response = null;
+ response = httpClient.execute(request);
+ return response.getEntity();
+ }
+
+ /**
+ * post form
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @param bodyMap
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity post(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap,
+ Map bodyMap, CookieStore cookies, int timeOut) throws IOException {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpPost request = null;
+ try {
+ request = new HttpPost(buildUrl(host, path, queryMap));
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ if (bodyMap != null && bodyMap.size() > 0) {
+ List nameValuePairList = new ArrayList();
+
+ for (String key : bodyMap.keySet()) {
+ nameValuePairList.add(new BasicNameValuePair(key, bodyMap.get(key).toString()));
+ }
+ UrlEncodedFormEntity formEntity = null;
+ try {
+ formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+ request.setEntity(formEntity);
+ }
+ HttpResponse response = httpClient.execute(request);return response.getEntity();
+
+ }
+
+ /**
+ * Post String
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity post(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap,
+ String body, CookieStore cookies, int timeOut) throws IOException {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpPost request = null;
+ try {
+ request = new HttpPost(buildUrl(host, path, queryMap));
+
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ try {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ } catch (Exception e) {
+ }
+ if (StringUtils.isNotBlank(body)) {
+ request.setEntity(new StringEntity(body, "utf-8"));
+ }
+ HttpResponse response = httpClient.execute(request);return response.getEntity();
+ }
+
+ /**
+ * Post String
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity post(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap, CookieStore cookies, int timeOut) throws IOException {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpPost request = null;
+ try {
+ request = new HttpPost(buildUrl(host, path, queryMap));
+
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ try {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ } catch (Exception e) {
+ }
+ HttpResponse response = httpClient.execute(request);return response.getEntity();
+ }
+
+ /**
+ * Put String
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity put(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap,
+ String body, CookieStore cookies, int timeOut)
+ throws Exception {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpPut request = new HttpPut(buildUrl(host, path, queryMap));
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ try {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ } catch (Exception e) {
+ }
+ ;
+ if (StringUtils.isNotBlank(body)) {
+ request.setEntity(new StringEntity(body, "utf-8"));
+ }
+ HttpResponse response = httpClient.execute(request);return response.getEntity();
+ }
+
+ /**
+ * Delete
+ *
+ * @param host
+ * @param path
+ * @param headers
+ * @param queryMap
+ * @return
+ * @throws Exception
+ */
+ public static HttpEntity delete(String host, String path, MediaType mediaType,
+ Map headers,
+ Map queryMap, CookieStore cookies, int timeOut)
+ throws Exception {
+ HttpClient httpClient = wrapClient(host, path, cookies);
+ HttpDelete request = new HttpDelete(buildUrl(host, path, queryMap));
+ request.setConfig(RequestConfig.custom().setConnectTimeout(timeOut).setConnectionRequestTimeout(timeOut).setSocketTimeout(timeOut).build());
+ request.setHeader("Content-Type", mediaType.getType() + "/" + mediaType.getSubtype());
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ HttpResponse response = httpClient.execute(request);return response.getEntity();
+ }
+
+ /**
+ * 构建请求的 url
+ *
+ * @param host
+ * @param path
+ * @param queryMap
+ * @return
+ * @throws UnsupportedEncodingException
+ */
+ private static String buildUrl(String host, String path, Map queryMap) throws UnsupportedEncodingException {
+ StringBuilder sbUrl = new StringBuilder();
+ if (!StringUtils.isBlank(host)) {
+ sbUrl.append(host);
+ }
+ if (!StringUtils.isBlank(path)) {
+ sbUrl.append(path);
+ }
+ if (null != queryMap) {
+ StringBuilder sbQuery = new StringBuilder();
+ for (Map.Entry query : queryMap.entrySet()) {
+ if (0 < sbQuery.length()) {
+ sbQuery.append("&");
+ }
+ if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue().toString())) {
+ sbQuery.append(query.getValue());
+ }
+ if (!StringUtils.isBlank(query.getKey())) {
+ sbQuery.append(query.getKey());
+ if (!StringUtils.isBlank(query.getValue().toString())) {
+ sbQuery.append("=");
+ sbQuery.append(URLEncoder.encode(query.getValue().toString(), "utf-8"));
+ }
+ }
+ }
+ if (0 < sbQuery.length()) {
+ sbUrl.append("?").append(sbQuery);
+ }
+ }
+ return sbUrl.toString();
+ }
+
+ /**
+ * 获取 HttpClient
+ *
+ * @param host
+ * @param path
+ * @return
+ */
+ private static HttpClient wrapClient(String host, String path, CookieStore cookies) {
+ HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+ if (cookies != null) {
+ httpClientBuilder.setDefaultCookieStore(cookies);
+ }
+ HttpClient httpClient = httpClientBuilder.build();
+ if (host != null && host.startsWith("https://")) {
+ return sslClient();
+ } else if (StringUtils.isBlank(host) && path != null && path.startsWith("https://")) {
+ return sslClient();
+ }
+ return httpClient;
+ }
+
+ /**
+ * 在调用SSL之前需要重写验证方法,取消检测SSL
+ * 创建ConnectionManager,添加Connection配置信息
+ *
+ * @return HttpClient 支持https
+ */
+ private static HttpClient sslClient() {
+ try {
+ // 在调用SSL之前需要重写验证方法,取消检测SSL
+ X509TrustManager trustManager = new X509TrustManager() {
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ @Override
+ public void checkClientTrusted(X509Certificate[] xcs, String str) {
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] xcs, String str) {
+ }
+ };
+ SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
+ ctx.init(null, new TrustManager[]{trustManager}, null);
+ SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
+ // 创建Registry
+ RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
+ .setExpectContinueEnabled(Boolean.TRUE).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
+ .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
+ Registry socketFactoryRegistry = RegistryBuilder.create()
+ .register("http", PlainConnectionSocketFactory.INSTANCE)
+ .register("https", socketFactory).build();
+ // 创建ConnectionManager,添加Connection配置信息
+ PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+ CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager)
+ .setDefaultRequestConfig(requestConfig).build();
+ return closeableHttpClient;
+ } catch (KeyManagementException ex) {
+ throw new RuntimeException(ex);
+ } catch (NoSuchAlgorithmException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+
+ /**
+ * 将结果转换成JSONObject
+ *
+ * @param httpResponse
+ * @return
+ * @throws IOException
+ */
+ public static JSONObject parseJson(HttpResponse httpResponse) throws IOException {
+ return JSON.parseObject(parseString(httpResponse));
+ }
+
+ /**
+ * 将结果转换成 String
+ *
+ * @param httpResponse
+ * @return
+ * @throws IOException
+ */
+ public static String parseString(HttpResponse httpResponse) throws IOException {
+ HttpEntity entity = httpResponse.getEntity();
+ String resp = EntityUtils.toString(entity, "UTF-8");
+ EntityUtils.consume(entity);
+ return resp;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/top/krcia/common/request/WebRequest.java b/src/main/java/top/krcia/common/request/WebRequest.java
new file mode 100644
index 0000000..f879f8b
--- /dev/null
+++ b/src/main/java/top/krcia/common/request/WebRequest.java
@@ -0,0 +1,162 @@
+package top.krcia.common.request;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.CookieStore;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.impl.cookie.BasicClientCookie;
+import org.apache.http.util.EntityUtils;
+import org.springframework.http.MediaType;
+import top.krcia.common.request.bean.HttpFile;
+import top.krcia.common.request.enums.RequestType;
+import top.krcia.common.request.interfaces.WebRequestOption;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Map;
+
+public class WebRequest implements WebRequestOption {
+ private Map headers;
+ private Map params;
+ private String body;
+ private Map bodyForm;
+ private RequestType requestType = RequestType.GET;
+ private MediaType mediaType = MediaType.APPLICATION_JSON;
+ private int timeout = -1;
+
+ private CookieStore cookies = new BasicCookieStore();
+
+ private URI url;
+
+ @Override
+ public WebRequest setHeader(Map headers) {
+ this.headers = headers;
+ return this;
+ }
+
+ @Override
+ public WebRequest setParam(Map params) {
+ this.params = params;
+ return this;
+ }
+
+ @Override
+ public WebRequest setBody(JSONObject body) {
+ this.body = body.toJSONString();
+ return this;
+ }
+
+ @Override
+ public WebRequest setBody(T body) {
+ this.body = JSON.toJSONString(body);
+ return this;
+ }
+
+ @Override
+ public WebRequest setBodyForm(Map bodyForm) {
+ this.bodyForm = bodyForm;
+ return this;
+ }
+
+ @Override
+ public WebRequest setCookie(Map cookies) {
+ for (var item : cookies.keySet()) {
+ BasicClientCookie cookie = new BasicClientCookie(item, cookies.get(item));
+ cookie.setDomain(url.getHost());
+ cookie.setPath("/");
+ this.cookies.addCookie(cookie);
+ }
+ return this;
+ }
+
+ @Override
+ public WebRequest setRequestType(RequestType requestType) {
+ this.requestType = requestType;
+ return this;
+ }
+
+ @Override
+ public WebRequest setTimeOut(int timeout) {
+ this.timeout = timeout;
+ return this;
+ }
+
+ @Override
+ public WebRequest setContentType(MediaType mediaType) {
+ this.mediaType = mediaType;
+ return this;
+ }
+
+ @Override
+ public String execute() throws Exception {
+ switch (requestType) {
+ case GET -> {
+ return EntityUtils.toString(RequestHelper.get(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout));
+ }
+ case POST -> {
+ if (bodyForm != null) {
+ return EntityUtils.toString(RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, bodyForm, cookies, timeout));
+ } else if (body != null) {
+ return EntityUtils.toString(RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, body, cookies, timeout));
+ } else {
+ return EntityUtils.toString(RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout));
+ }
+ }
+ case PUT -> {
+ return EntityUtils.toString(RequestHelper.put(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, body, cookies, timeout));
+ }
+ case DELETE -> {
+ return EntityUtils.toString(RequestHelper.delete(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public HttpFile executeFile() throws Exception {
+ HttpEntity entity=null;
+ switch (requestType) {
+ case GET -> {
+ entity= RequestHelper.get(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout);
+ }
+ case POST -> {
+ if (bodyForm != null) {
+ entity= RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, bodyForm, cookies, timeout);
+ } else if (body != null) {
+ entity= RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, body, cookies, timeout);
+ } else {
+ entity= RequestHelper.post(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout);
+ }
+ }
+ case PUT -> {
+ entity= RequestHelper.put(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, body, cookies, timeout);
+ }
+ case DELETE -> {
+ entity= RequestHelper.delete(url.getScheme() + "://" + url.getHost() + ":" + url.getPort(), url.getPath(), mediaType, headers, params, cookies, timeout);
+ }
+ }
+ if (entity != null) {
+ String contentType = entity.getContentType() != null ? entity.getContentType().getValue() : "application/octet-stream";
+ try (InputStream inputStream = entity.getContent();
+ ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+ byte[] tmp = new byte[8192];
+ int len;
+ while ((len = inputStream.read(tmp)) != -1) {
+ bos.write(tmp, 0, len);
+ }
+ return new HttpFile(bos, contentType);
+ }
+ }
+ return new HttpFile(new ByteArrayOutputStream(), "application/octet-stream");
+ }
+
+ public WebRequest(URI url) {
+ this.url = url;
+ }
+
+ public static WebRequest Create(URI url) {
+ return new WebRequest(url);
+ }
+}
diff --git a/src/main/java/top/krcia/common/request/bean/HttpFile.java b/src/main/java/top/krcia/common/request/bean/HttpFile.java
new file mode 100644
index 0000000..abde7f3
--- /dev/null
+++ b/src/main/java/top/krcia/common/request/bean/HttpFile.java
@@ -0,0 +1,75 @@
+package top.krcia.common.request.bean;
+
+
+import com.alibaba.fastjson.JSON;
+
+import java.io.*;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpFile {
+ private final ByteArrayOutputStream buffer;
+ public final long size;
+ public final FileFormat format;
+ private final String version="v 0.1";
+
+ public HttpFile(ByteArrayOutputStream buffer, String contentType) {
+ this.buffer = buffer;
+ this.size = buffer.size();
+ this.format = detectFormat(contentType);
+ }
+
+ public void saveAs(Path path) throws IOException {
+ try (FileOutputStream fos = new FileOutputStream(path.toString())) {
+ buffer.writeTo(fos);
+ }
+ }
+
+ // 获取 InputStream
+ public InputStream asStream() {
+ return new ByteArrayInputStream(buffer.toByteArray());
+ }
+
+ public byte[] asBytes() {
+ return buffer.toByteArray();
+ }
+
+ private FileFormat detectFormat(String contentType) {
+ if (contentType == null) {
+ return FileFormat.UNKNOWN;
+ }
+ if (contentType.contains("mpeg")) {
+ return FileFormat.MP3;
+ } else if (contentType.contains("mp4")) {
+ return FileFormat.MP4;
+ } else if (contentType.contains("png")) {
+ return FileFormat.PNG;
+ } else if (contentType.contains("jpeg") || contentType.contains("jpg")) {
+ return FileFormat.JPG;
+ } else if (contentType.contains("plain")) {
+ return FileFormat.TXT;
+ } else if (contentType.contains("pdf")) {
+ return FileFormat.PDF;
+ }
+ return FileFormat.UNKNOWN;
+ }
+
+ public enum FileFormat {
+ MP3("mp3"), MP4("mp4"), PNG("png"), JPG("jpg"), TXT("txt"), PDF("pdf"), UNKNOWN("bin");
+ private final String value;
+
+ FileFormat(String value) {
+ this.value = value;
+ }
+ }
+
+ @Override
+ public String toString() {
+ Map data = new HashMap<>();
+ data.put("size",size);
+ data.put("format",format.value);
+ data.put("version",version);
+ return JSON.toJSONString(data);
+ }
+}
diff --git a/src/main/java/top/krcia/common/request/enums/RequestType.java b/src/main/java/top/krcia/common/request/enums/RequestType.java
new file mode 100644
index 0000000..ec26bf0
--- /dev/null
+++ b/src/main/java/top/krcia/common/request/enums/RequestType.java
@@ -0,0 +1,5 @@
+package top.krcia.common.request.enums;
+
+public enum RequestType {
+ GET,POST,PUT,DELETE
+}
diff --git a/src/main/java/top/krcia/common/request/interfaces/WebRequestOption.java b/src/main/java/top/krcia/common/request/interfaces/WebRequestOption.java
new file mode 100644
index 0000000..934f914
--- /dev/null
+++ b/src/main/java/top/krcia/common/request/interfaces/WebRequestOption.java
@@ -0,0 +1,24 @@
+package top.krcia.common.request.interfaces;
+
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.http.MediaType;
+import top.krcia.common.request.WebRequest;
+import top.krcia.common.request.bean.HttpFile;
+import top.krcia.common.request.enums.RequestType;
+
+import java.util.Map;
+public interface WebRequestOption {
+ WebRequest setHeader(Map headers);
+ WebRequest setParam(Map params);
+ WebRequest setBody(JSONObject body);
+ WebRequest setBody(T body);
+ WebRequest setBodyForm(Map bodyForm);
+ WebRequest setCookie(Map cookie);
+ WebRequest setRequestType(RequestType requestType);
+ WebRequest setTimeOut(int timeout);
+ WebRequest setContentType(MediaType mediaType);
+ String execute() throws Exception;
+ HttpFile executeFile() throws Exception;
+}
diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties
new file mode 100644
index 0000000..8aea941
--- /dev/null
+++ b/src/main/resources/application-dev.properties
@@ -0,0 +1,8 @@
+#???
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://krcia.top:63306/elysia?serverTimezone=Asia/Shanghai
+spring.datasource.username=root
+spring.datasource.password=xiong990416.
+#??????
+spring.servlet.multipart.max-file-size=10MB
+spring.servlet.multipart.max-request-size=10MB
\ No newline at end of file
diff --git a/src/main/resources/application-res.properties b/src/main/resources/application-res.properties
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/resources/smart-doc.json b/src/main/resources/smart-doc.json
new file mode 100644
index 0000000..b3401a1
--- /dev/null
+++ b/src/main/resources/smart-doc.json
@@ -0,0 +1,20 @@
+{
+ "outPath": "./src/main/resources/static/doc",
+ "serverUrl": "/api",
+ "serverEnv": "http://{{server}}",
+ "allInOne": true,
+ "coverOld": true,
+ "createDebugPage": true,
+ "showAuthor": "true",
+ "allInOneDocFileName": "index.html",
+ "requestHeaders": [
+ {
+ "name": "Authorization",
+ "type": "string",
+ "value": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpZCI6MTAwMDAwfQ.yBaS2nSUJoD2kbhj3lXnHvkmc-qwJF_5djhQf_2A069j9HzYVmUObXcDwaAhHQf-",
+ "desc": "鉴权信息",
+ "required": true,
+ "excludePathPatterns": ""
+ }
+ ]
+}
\ No newline at end of file