From e566b25168c6eb4171d82f3c458c295f0cffe734 Mon Sep 17 00:00:00 2001
From: hjhcos <3140546263@qq.com>
Date: Wed, 4 May 2022 16:41:08 +0800
Subject: [PATCH 01/74] =?UTF-8?q?=F0=9F=94=A2HttpClientFluent=E8=A3=81?=
=?UTF-8?q?=E5=89=AA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 14 +
.../pearadmin/modules/cra/tools/Content.java | 62 +++
.../cra/tools/ContentResponseHandler.java | 28 ++
.../pearadmin/modules/cra/tools/Executor.java | 183 +++++++++
.../com/pearadmin/modules/cra/tools/Form.java | 35 ++
.../pearadmin/modules/cra/tools/Https.java | 57 +++
.../pearadmin/modules/cra/tools/Request.java | 370 ++++++++++++++++++
.../pearadmin/modules/cra/tools/Response.java | 140 +++++++
src/main/resources/application-dev.yml | 1 +
9 files changed, 890 insertions(+)
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Content.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/ContentResponseHandler.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Executor.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Form.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Https.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Request.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/tools/Response.java
diff --git a/pom.xml b/pom.xml
index 4a75fa7c..229c8a20 100644
--- a/pom.xml
+++ b/pom.xml
@@ -70,6 +70,8 @@
3.8.0
3.0.5
+
+ 5.1.3
8
8
@@ -78,6 +80,18 @@
+
+
+ org.apache.httpcomponents.client5
+ httpclient5
+ ${httpClient-components.version}
+
+
+ org.slf4j
+ slf4j-api
+
+
+
org.springframework.boot
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Content.java b/src/main/java/com/pearadmin/modules/cra/tools/Content.java
new file mode 100644
index 00000000..a50f2ae1
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Content.java
@@ -0,0 +1,62 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import org.apache.hc.core5.http.ContentType;
+
+public class Content {
+ public static final Content NO_CONTENT;
+ private final byte[] raw;
+ private final ContentType type;
+
+ public Content(byte[] raw, ContentType type) {
+ this.raw = raw;
+ this.type = type;
+ }
+
+ public ContentType getType() {
+ return this.type;
+ }
+
+ public byte[] asBytes() {
+ return (byte[])this.raw.clone();
+ }
+
+ public String asString() {
+ Charset charset = this.type.getCharset();
+ if (charset == null) {
+ charset = StandardCharsets.ISO_8859_1;
+ }
+
+ return this.asString(charset);
+ }
+
+ public String asString(Charset charset) {
+ return new String(this.raw, charset);
+ }
+
+ public InputStream asStream() {
+ return new ByteArrayInputStream(this.raw);
+ }
+
+ @Override
+ public String toString() {
+ return this.asString();
+ }
+
+ static {
+ NO_CONTENT = new Content(new byte[0], ContentType.DEFAULT_BINARY);
+ }
+}
+
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/ContentResponseHandler.java b/src/main/java/com/pearadmin/modules/cra/tools/ContentResponseHandler.java
new file mode 100644
index 00000000..07657696
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/ContentResponseHandler.java
@@ -0,0 +1,28 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.io.IOException;
+
+import org.apache.hc.client5.http.impl.classic.AbstractHttpClientResponseHandler;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+
+public class ContentResponseHandler extends AbstractHttpClientResponseHandler {
+ public ContentResponseHandler() {
+ }
+
+ @Override
+ public Content handleEntity(HttpEntity entity) throws IOException {
+ return entity != null ? new Content(EntityUtils.toByteArray(entity), ContentType.parse(entity.getContentType())) : Content.NO_CONTENT;
+ }
+}
+
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Executor.java b/src/main/java/com/pearadmin/modules/cra/tools/Executor.java
new file mode 100644
index 00000000..a3d2ffe1
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Executor.java
@@ -0,0 +1,183 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import org.apache.hc.client5.http.auth.AuthCache;
+import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.Credentials;
+import org.apache.hc.client5.http.auth.CredentialsStore;
+import org.apache.hc.client5.http.auth.NTCredentials;
+import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
+import org.apache.hc.client5.http.cookie.CookieStore;
+import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
+import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
+import org.apache.hc.client5.http.impl.auth.BasicScheme;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
+import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.apache.hc.core5.util.TimeValue;
+
+public class Executor {
+ static final CloseableHttpClient CLIENT = HttpClientBuilder.create().setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create().useSystemProperties().setMaxConnPerRoute(100).setMaxConnTotal(200).setValidateAfterInactivity(TimeValue.ofSeconds(10L)).build()).useSystemProperties().evictExpiredConnections().evictIdleConnections(TimeValue.ofMinutes(1L)).build();
+ private final CloseableHttpClient httpclient;
+ private final AuthCache authCache;
+ private volatile CredentialsStore credentialsStore;
+ private volatile CookieStore cookieStore;
+
+ public static Executor newInstance() {
+ return new Executor(CLIENT);
+ }
+
+ public static Executor newInstance(CloseableHttpClient httpclient) {
+ return new Executor(httpclient != null ? httpclient : CLIENT);
+ }
+
+ Executor(CloseableHttpClient httpclient) {
+ this.httpclient = httpclient;
+ this.authCache = new BasicAuthCache();
+ }
+
+ public Executor use(CredentialsStore credentialsStore) {
+ this.credentialsStore = credentialsStore;
+ return this;
+ }
+
+ public Executor auth(AuthScope authScope, Credentials credentials) {
+ CredentialsStore credentialsStoreSnapshot = this.credentialsStore;
+ if (credentialsStoreSnapshot == null) {
+ credentialsStoreSnapshot = new BasicCredentialsProvider();
+ this.credentialsStore = (CredentialsStore)credentialsStoreSnapshot;
+ }
+
+ ((CredentialsStore)credentialsStoreSnapshot).setCredentials(authScope, credentials);
+ return this;
+ }
+
+ public Executor auth(HttpHost host, Credentials credentials) {
+ return this.auth(new AuthScope(host), credentials);
+ }
+
+ public Executor auth(String host, Credentials credentials) {
+ HttpHost httpHost;
+ try {
+ httpHost = HttpHost.create(host);
+ } catch (URISyntaxException var5) {
+ throw new IllegalArgumentException("Invalid host: " + host);
+ }
+
+ return this.auth(httpHost, credentials);
+ }
+
+ public Executor authPreemptive(HttpHost host) {
+ CredentialsStore credentialsStoreSnapshot = this.credentialsStore;
+ if (credentialsStoreSnapshot != null) {
+ Credentials credentials = credentialsStoreSnapshot.getCredentials(new AuthScope(host), (HttpContext)null);
+ if (credentials != null) {
+ BasicScheme basicScheme = new BasicScheme();
+ basicScheme.initPreemptive(credentials);
+ this.authCache.put(host, basicScheme);
+ }
+ }
+
+ return this;
+ }
+
+ public Executor authPreemptive(String host) {
+ HttpHost httpHost;
+ try {
+ httpHost = HttpHost.create(host);
+ } catch (URISyntaxException var4) {
+ throw new IllegalArgumentException("Invalid host: " + host);
+ }
+
+ return this.authPreemptive(httpHost);
+ }
+
+ public Executor authPreemptiveProxy(HttpHost proxy) {
+ CredentialsStore credentialsStoreSnapshot = this.credentialsStore;
+ if (credentialsStoreSnapshot != null) {
+ Credentials credentials = credentialsStoreSnapshot.getCredentials(new AuthScope(proxy), (HttpContext)null);
+ if (credentials != null) {
+ BasicScheme basicScheme = new BasicScheme();
+ basicScheme.initPreemptive(credentials);
+ this.authCache.put(proxy, basicScheme);
+ }
+ }
+
+ return this;
+ }
+
+ public Executor authPreemptiveProxy(String proxy) {
+ HttpHost httpHost;
+ try {
+ httpHost = HttpHost.create(proxy);
+ } catch (URISyntaxException var4) {
+ throw new IllegalArgumentException("Invalid host: " + proxy);
+ }
+
+ return this.authPreemptiveProxy(httpHost);
+ }
+
+ public Executor auth(HttpHost host, String username, char[] password) {
+ return this.auth((HttpHost)host, new UsernamePasswordCredentials(username, password));
+ }
+
+ public Executor auth(HttpHost host, String username, char[] password, String workstation, String domain) {
+ return this.auth((HttpHost)host, new NTCredentials(username, password, workstation, domain));
+ }
+
+ public Executor clearAuth() {
+ CredentialsStore credentialsStoreSnapshot = this.credentialsStore;
+ if (credentialsStoreSnapshot != null) {
+ credentialsStoreSnapshot.clear();
+ }
+
+ return this;
+ }
+
+ public Executor use(CookieStore cookieStore) {
+ this.cookieStore = cookieStore;
+ return this;
+ }
+
+ public Executor clearCookies() {
+ CookieStore cookieStoreSnapshot = this.cookieStore;
+ if (cookieStoreSnapshot != null) {
+ cookieStoreSnapshot.clear();
+ }
+
+ return this;
+ }
+
+ public Response execute(Request request) throws IOException {
+ HttpClientContext localContext = HttpClientContext.create();
+ CredentialsStore credentialsStoreSnapshot = this.credentialsStore;
+ if (credentialsStoreSnapshot != null) {
+ localContext.setAttribute("http.auth.credentials-provider", credentialsStoreSnapshot);
+ }
+
+ if (this.authCache != null) {
+ localContext.setAttribute("http.auth.auth-cache", this.authCache);
+ }
+
+ CookieStore cookieStoreSnapshot = this.cookieStore;
+ if (cookieStoreSnapshot != null) {
+ localContext.setAttribute("http.cookie-store", cookieStoreSnapshot);
+ }
+
+ return new Response(request.internalExecute(this.httpclient, localContext));
+ }
+}
+
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Form.java b/src/main/java/com/pearadmin/modules/cra/tools/Form.java
new file mode 100644
index 00000000..b2c1eac5
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Form.java
@@ -0,0 +1,35 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.hc.core5.http.NameValuePair;
+import org.apache.hc.core5.http.message.BasicNameValuePair;
+
+public class Form {
+ private final List params = new ArrayList<>();
+
+ public static Form form() {
+ return new Form();
+ }
+
+ Form() {
+ }
+
+ public Form add(String name, String value) {
+ this.params.add(new BasicNameValuePair(name, value));
+ return this;
+ }
+
+ public List build() {
+ return new ArrayList<>(this.params);
+ }
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Https.java b/src/main/java/com/pearadmin/modules/cra/tools/Https.java
new file mode 100644
index 00000000..715c99dd
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Https.java
@@ -0,0 +1,57 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.NameValuePair;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+public class Https extends Request{
+
+ Https(ClassicHttpRequest request) {
+ super(request);
+ }
+
+ /**
+ * 获取内容
+ * @param method 请求方式
+ * @param url 请求网址
+ * @param formParams 请求参数
+ * @param formHeaders 请求头
+ * @return Content
+ */
+ public static Content request(String method, String url, Iterable extends NameValuePair> formParams, Iterable extends NameValuePair> formHeaders){
+ try {
+ Request req = Request.create(method, url);
+ if(formParams != null){
+ if ("GET".equalsIgnoreCase(method)) {
+ req.addParams(formParams, StandardCharsets.UTF_8);
+ } else {
+ req.bodyForm(formParams);
+ }
+ }
+ if(formHeaders != null){
+ for (NameValuePair parameter : formHeaders) {
+ req.setHeader(parameter.getName(), parameter.getValue());
+ }
+ }
+ return req.execute().returnContent();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ public static Content get(String url, Iterable extends NameValuePair> formParams){
+ return request("GET", url, formParams, null);
+ }
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Request.java b/src/main/java/com/pearadmin/modules/cra/tools/Request.java
new file mode 100644
index 00000000..9365b72f
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Request.java
@@ -0,0 +1,370 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
+import org.apache.hc.client5.http.config.Configurable;
+import org.apache.hc.client5.http.config.RequestConfig;
+import org.apache.hc.client5.http.config.RequestConfig.Builder;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.Header;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.HttpVersion;
+import org.apache.hc.core5.http.Method;
+import org.apache.hc.core5.http.NameValuePair;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.core5.http.io.entity.FileEntity;
+import org.apache.hc.core5.http.io.entity.InputStreamEntity;
+import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
+import org.apache.hc.core5.net.WWWFormCodec;
+import org.apache.hc.core5.util.Timeout;
+
+public class Request {
+ public static final String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss zzz";
+ public static final Locale DATE_LOCALE;
+ public static final TimeZone TIME_ZONE;
+ private final ClassicHttpRequest request;
+ private Boolean useExpectContinue;
+ private Timeout connectTimeout;
+ private Timeout responseTimeout;
+ private HttpHost proxy;
+ private SimpleDateFormat dateFormatter;
+
+ public static Request create(Method method, URI uri) {
+ return new Request(new HttpUriRequestBase(method.name(), uri));
+ }
+
+ public static Request create(String methodName, String uri) {
+ return new Request(new HttpUriRequestBase(methodName, URI.create(uri)));
+ }
+
+ public static Request create(String methodName, URI uri) {
+ return new Request(new HttpUriRequestBase(methodName, uri));
+ }
+
+ public static Request get(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.GET, uri));
+ }
+
+ public static Request get(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.GET, uri));
+ }
+
+ public static Request head(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.HEAD, uri));
+ }
+
+ public static Request head(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.HEAD, uri));
+ }
+
+ public static Request post(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.POST, uri));
+ }
+
+ public static Request post(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.POST, uri));
+ }
+
+ public static Request patch(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.PATCH, uri));
+ }
+
+ public static Request patch(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.PATCH, uri));
+ }
+
+ public static Request put(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.PUT, uri));
+ }
+
+ public static Request put(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.PUT, uri));
+ }
+
+ public static Request trace(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.TRACE, uri));
+ }
+
+ public static Request trace(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.TRACE, uri));
+ }
+
+ public static Request delete(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.DELETE, uri));
+ }
+
+ public static Request delete(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.DELETE, uri));
+ }
+
+ public static Request options(URI uri) {
+ return new Request(new BasicClassicHttpRequest(Method.OPTIONS, uri));
+ }
+
+ public static Request options(String uri) {
+ return new Request(new BasicClassicHttpRequest(Method.OPTIONS, uri));
+ }
+
+ Request(ClassicHttpRequest request) {
+ this.request = request;
+ }
+
+ ClassicHttpResponse internalExecute(CloseableHttpClient client, HttpClientContext localContext) throws IOException {
+ Builder builder;
+ if (client instanceof Configurable) {
+ builder = RequestConfig.copy(((Configurable)client).getConfig());
+ } else {
+ builder = RequestConfig.custom();
+ }
+
+ if (this.useExpectContinue != null) {
+ builder.setExpectContinueEnabled(this.useExpectContinue);
+ }
+
+ if (this.connectTimeout != null) {
+ builder.setConnectTimeout(this.connectTimeout);
+ }
+
+ if (this.responseTimeout != null) {
+ builder.setResponseTimeout(this.responseTimeout);
+ }
+
+ if (this.proxy != null) {
+ builder.setProxy(this.proxy);
+ }
+
+ RequestConfig config = builder.build();
+ localContext.setRequestConfig(config);
+ return client.execute(this.request, localContext);
+ }
+
+ public Response execute() throws IOException {
+ return this.execute(Executor.CLIENT);
+ }
+
+ public Response execute(CloseableHttpClient client) throws IOException {
+ return new Response(this.internalExecute(client, HttpClientContext.create()));
+ }
+
+ public Request addHeader(Header header) {
+ this.request.addHeader(header);
+ return this;
+ }
+
+ public Request setHeader(Header header) {
+ this.request.setHeader(header);
+ return this;
+ }
+
+ public Request addHeader(String name, String value) {
+ this.request.addHeader(name, value);
+ return this;
+ }
+
+ public Request setHeader(String name, String value) {
+ this.request.setHeader(name, value);
+ return this;
+ }
+
+ public Request removeHeader(Header header) {
+ this.request.removeHeader(header);
+ return this;
+ }
+
+ public Request removeHeaders(String name) {
+ this.request.removeHeaders(name);
+ return this;
+ }
+
+ public Request setHeaders(Header... headers) {
+ this.request.setHeaders(headers);
+ return this;
+ }
+
+ public Request setCacheControl(String cacheControl) {
+ this.request.setHeader("Cache-Control", cacheControl);
+ return this;
+ }
+
+ private SimpleDateFormat getDateFormat() {
+ if (this.dateFormatter == null) {
+ this.dateFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", DATE_LOCALE);
+ this.dateFormatter.setTimeZone(TIME_ZONE);
+ }
+
+ return this.dateFormatter;
+ }
+
+ ClassicHttpRequest getRequest() {
+ return this.request;
+ }
+
+ public Request setDate(Date date) {
+ this.request.setHeader("Date", this.getDateFormat().format(date));
+ return this;
+ }
+
+ public Request setIfModifiedSince(Date date) {
+ this.request.setHeader("If-Modified-Since", this.getDateFormat().format(date));
+ return this;
+ }
+
+ public Request setIfUnmodifiedSince(Date date) {
+ this.request.setHeader("If-Unmodified-Since", this.getDateFormat().format(date));
+ return this;
+ }
+
+ public Request version(HttpVersion version) {
+ this.request.setVersion(version);
+ return this;
+ }
+
+ public Request useExpectContinue() {
+ this.useExpectContinue = Boolean.TRUE;
+ return this;
+ }
+
+ public Request userAgent(String agent) {
+ this.request.setHeader("User-Agent", agent);
+ return this;
+ }
+
+ public Request connectTimeout(Timeout timeout) {
+ this.connectTimeout = timeout;
+ return this;
+ }
+
+ public Request responseTimeout(Timeout timeout) {
+ this.responseTimeout = timeout;
+ return this;
+ }
+
+ public Request viaProxy(HttpHost proxy) {
+ this.proxy = proxy;
+ return this;
+ }
+
+ public Request viaProxy(String proxy) {
+ try {
+ this.proxy = HttpHost.create(proxy);
+ return this;
+ } catch (URISyntaxException var3) {
+ throw new IllegalArgumentException("Invalid host");
+ }
+ }
+
+
+ /**
+ * 将参数添加到url里面 适用于 get
+ * @param formParams 参数列表
+ * @return Request
+ */
+ public void addParams(Iterable extends NameValuePair> formParams, Charset charset){
+ List paramList = new ArrayList<>();
+
+ for (NameValuePair param : formParams) {
+ paramList.add(param);
+ }
+
+ ContentType contentType = charset != null ? ContentType.APPLICATION_JSON.withCharset(charset) : ContentType.APPLICATION_JSON;
+ String s = WWWFormCodec.format(paramList, contentType.getCharset());
+ request.setPath(request.getPath()+"?"+s);
+ }
+
+ public Request body(HttpEntity entity) {
+ this.request.setEntity(entity);
+ return this;
+ }
+
+ public Request bodyForm(Iterable extends NameValuePair> formParams, Charset charset) {
+ List paramList = new ArrayList<>();
+
+ for (NameValuePair param : formParams) {
+ paramList.add(param);
+ }
+
+ ContentType contentType = charset != null ? ContentType.APPLICATION_FORM_URLENCODED.withCharset(charset) : ContentType.APPLICATION_FORM_URLENCODED;
+ String s = WWWFormCodec.format(paramList, contentType.getCharset());
+ return this.bodyString(s, contentType);
+ }
+
+ public Request bodyForm(Iterable extends NameValuePair> formParams) {
+ return this.bodyForm(formParams, StandardCharsets.UTF_8);
+ }
+
+ public Request bodyForm(NameValuePair... formParams) {
+ return this.bodyForm(Arrays.asList(formParams), StandardCharsets.UTF_8);
+ }
+
+ public Request bodyString(String s, ContentType contentType) {
+ Charset charset = contentType != null ? contentType.getCharset() : null;
+ byte[] raw = charset != null ? s.getBytes(charset) : s.getBytes();
+ return this.body(new ByteArrayEntity(raw, contentType));
+ }
+
+ public Request bodyFile(File file, ContentType contentType) {
+ return this.body(new FileEntity(file, contentType));
+ }
+
+ public Request bodyByteArray(byte[] b) {
+ return this.body(new ByteArrayEntity(b, (ContentType)null));
+ }
+
+ public Request bodyByteArray(byte[] b, ContentType contentType) {
+ return this.body(new ByteArrayEntity(b, contentType));
+ }
+
+ public Request bodyByteArray(byte[] b, int off, int len) {
+ return this.body(new ByteArrayEntity(b, off, len, (ContentType)null));
+ }
+
+ public Request bodyByteArray(byte[] b, int off, int len, ContentType contentType) {
+ return this.body(new ByteArrayEntity(b, off, len, contentType));
+ }
+
+ public Request bodyStream(InputStream inStream) {
+ return this.body(new InputStreamEntity(inStream, -1L, (ContentType)null));
+ }
+
+ public Request bodyStream(InputStream inStream, ContentType contentType) {
+ return this.body(new InputStreamEntity(inStream, -1L, contentType));
+ }
+
+ @Override
+ public String toString() {
+ return this.request.toString();
+ }
+
+ static {
+ DATE_LOCALE = Locale.US;
+ TIME_ZONE = TimeZone.getTimeZone("GMT");
+ }
+}
+
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Response.java b/src/main/java/com/pearadmin/modules/cra/tools/Response.java
new file mode 100644
index 00000000..9969f797
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Response.java
@@ -0,0 +1,140 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.tools;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.hc.client5.http.ClientProtocolException;
+import org.apache.hc.client5.http.HttpResponseException;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpResponse;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+
+public class Response {
+ private final ClassicHttpResponse response;
+ private boolean consumed;
+
+ Response(ClassicHttpResponse response) {
+ this.response = response;
+ }
+
+ private void assertNotConsumed() {
+ if (this.consumed) {
+ throw new IllegalStateException("Response content has been already consumed");
+ }
+ }
+
+ private void dispose() {
+ if (!this.consumed) {
+ try {
+ HttpEntity entity = this.response.getEntity();
+ if (entity != null) {
+ InputStream content = entity.getContent();
+ if (content != null) {
+ content.close();
+ }
+ }
+ } catch (Exception var6) {
+ } finally {
+ this.consumed = true;
+ }
+
+ }
+ }
+
+ public void discardContent() {
+ this.dispose();
+ }
+
+ public T handleResponse(HttpClientResponseHandler handler) throws IOException {
+ this.assertNotConsumed();
+
+ T var2;
+ try {
+ var2 = handler.handleResponse(this.response);
+ } catch (HttpException var6) {
+ throw new ClientProtocolException(var6);
+ } finally {
+ this.dispose();
+ }
+
+ return var2;
+ }
+
+ public Content returnContent() throws IOException {
+ return (Content)this.handleResponse(new ContentResponseHandler());
+ }
+
+ public HttpResponse returnResponse() throws IOException {
+ this.assertNotConsumed();
+
+ ClassicHttpResponse var6;
+ try {
+ HttpEntity entity = this.response.getEntity();
+ if (entity != null) {
+ ByteArrayEntity byteArrayEntity = new ByteArrayEntity(EntityUtils.toByteArray(entity), ContentType.parse(entity.getContentType()));
+ this.response.setEntity(byteArrayEntity);
+ }
+
+ var6 = this.response;
+ } finally {
+ this.consumed = true;
+ }
+
+ return var6;
+ }
+
+ public void saveContent(File file) throws IOException {
+ this.assertNotConsumed();
+ int status = this.response.getCode();
+ if (status >= 300) {
+ throw new HttpResponseException(status, this.response.getReasonPhrase());
+ } else {
+ try {
+ FileOutputStream out = new FileOutputStream(file);
+ Throwable var4 = null;
+
+ try {
+ HttpEntity entity = this.response.getEntity();
+ if (entity != null) {
+ entity.writeTo(out);
+ }
+ } catch (Throwable var20) {
+ var4 = var20;
+ throw var20;
+ } finally {
+ if (out != null) {
+ if (var4 != null) {
+ try {
+ out.close();
+ } catch (Throwable var19) {
+ var4.addSuppressed(var19);
+ }
+ } else {
+ out.close();
+ }
+ }
+
+ }
+ } finally {
+ this.consumed = true;
+ }
+
+ }
+ }
+}
+
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 5b5de9b6..acd43079 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,3 +1,4 @@
+debug: true
spring:
redis:
# 主 机 地 址
--
Gitee
From 18a26e0b168462190fed2d1854761077b8d2ea76 Mon Sep 17 00:00:00 2001
From: hjhcos <3140546263@qq.com>
Date: Sun, 15 May 2022 22:32:42 +0800
Subject: [PATCH 02/74] =?UTF-8?q?=F0=9F=95=B7=E7=88=AC=E8=99=AB=E7=AE=A1?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/pearadmin/EntranceApplication.java | 29 +-
.../cra/controller/CraTaskController.java | 112 ++++++++
.../pearadmin/modules/cra/domain/CraTask.java | 71 +++++
.../modules/cra/mapper/CraTaskMapper.java | 24 ++
.../modules/cra/mapper/xml/CraTaskMapper.xml | 29 ++
.../modules/cra/service/ICraTaskService.java | 25 ++
.../cra/service/impl/CraTaskServiceImpl.java | 40 +++
src/main/resources/crawler.yml | 22 ++
.../resources/templates/cra/task/add.html | 108 ++++++++
.../resources/templates/cra/task/edit.html | 109 ++++++++
.../resources/templates/cra/task/main.html | 247 ++++++++++++++++++
src/main/resources/templates/footer.html | 0
12 files changed, 814 insertions(+), 2 deletions(-)
create mode 100644 src/main/java/com/pearadmin/modules/cra/controller/CraTaskController.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/domain/CraTask.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/mapper/CraTaskMapper.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/mapper/xml/CraTaskMapper.xml
create mode 100644 src/main/java/com/pearadmin/modules/cra/service/ICraTaskService.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/service/impl/CraTaskServiceImpl.java
create mode 100644 src/main/resources/crawler.yml
create mode 100644 src/main/resources/templates/cra/task/add.html
create mode 100644 src/main/resources/templates/cra/task/edit.html
create mode 100644 src/main/resources/templates/cra/task/main.html
create mode 100644 src/main/resources/templates/footer.html
diff --git a/src/main/java/com/pearadmin/EntranceApplication.java b/src/main/java/com/pearadmin/EntranceApplication.java
index 77877b67..0d21cf16 100644
--- a/src/main/java/com/pearadmin/EntranceApplication.java
+++ b/src/main/java/com/pearadmin/EntranceApplication.java
@@ -1,18 +1,43 @@
package com.pearadmin;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import lombok.extern.slf4j.Slf4j;
import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.env.Environment;
+
+import java.io.IOException;
+import java.net.InetAddress;
/**
* Pear Admin Boot 入口
* */
+@Slf4j
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class, org.activiti.spring.boot.SecurityAutoConfiguration.class})
public class EntranceApplication {
- public static void main(String[] args) {
- SpringApplication.run(EntranceApplication.class, args);
+ public static void main(String[] args) throws IOException {
+ ConfigurableApplicationContext app = SpringApplication.run(EntranceApplication.class, args);
+ Environment env = app.getEnvironment();
+ String ip = InetAddress.getLocalHost().getHostAddress();
+ String port = env.getProperty("server.port");
+ String dataBseUrl = env.getProperty("spring.datasource.dynamic.datasource.master.url");
+ String envSign = env.getProperty("spring.profiles.active");
+
+ log.info("\n-------------------------------\n" +
+ "当前启动环境:\t" + envSign + "\n" +
+ "项目启动地址:\t" + ip + ":" + port + "\n" +
+ "后端请求地址:\t" + ip + ":" + port + "\n" +
+ "数据库访问地址:\t" + dataBseUrl + "\n" +
+ "-------------------------------"
+ );
+
+ if ("dev".equals(envSign)) {
+ Runtime.getRuntime().exec("cmd /c start http://" + ip + ":" + port);
+ }
+
}
}
diff --git a/src/main/java/com/pearadmin/modules/cra/controller/CraTaskController.java b/src/main/java/com/pearadmin/modules/cra/controller/CraTaskController.java
new file mode 100644
index 00000000..b8cc7bd4
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/controller/CraTaskController.java
@@ -0,0 +1,112 @@
+package com.pearadmin.modules.cra.controller;
+
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.modules.cra.domain.CraTask;
+import com.pearadmin.common.web.base.BaseController;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import com.pearadmin.common.web.domain.response.Result;
+import com.pearadmin.common.web.domain.response.module.ResultTable;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import com.pearadmin.modules.cra.service.ICraTaskService;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+
+/**
+ * 数据任务管理Controller
+ *
+ * @author hjhcos
+ * @date 2022-05-08
+ */
+@RestController
+@RequestMapping("/cra/task")
+@Api(tags = {"爬虫任务"})
+public class CraTaskController extends BaseController {
+
+ private String prefix = "cra/task";
+
+ @Autowired
+ private ICraTaskService craTaskService;
+
+ @GetMapping("/main")
+ @PreAuthorize("hasPermission('/cra/task/main','cra:task:main')")
+ public ModelAndView main() {
+ return jumpPage(prefix + "/main");
+ }
+
+ /**
+ * 查询数据任务管理列表
+ */
+ @ResponseBody
+ @GetMapping("/data")
+ @PreAuthorize("hasPermission('/cra/task/data','cra:task:data')")
+ public ResultTable list(@ModelAttribute CraTask craTask, PageDomain pageDomain) {
+ PageInfo pageInfo = craTaskService.selectCraTaskPage(craTask, pageDomain);
+ return pageTable(pageInfo.getList(), pageInfo.getTotal());
+ }
+
+ /**
+ * 新增数据任务管理
+ */
+ @GetMapping("/add")
+ @PreAuthorize("hasPermission('/cra/task/add','cra:task:add')")
+ public ModelAndView add() {
+ return jumpPage(prefix + "/add");
+ }
+
+ /**
+ * 新增数据任务管理
+ */
+ @ResponseBody
+ @PostMapping("/save")
+ @PreAuthorize("hasPermission('/cra/task/add','cra:task:add')")
+ public Result save(@RequestBody CraTask craTask) {
+ return decide(craTaskService.save(craTask));
+ }
+
+ /**
+ * 修改数据任务管理
+ */
+ @GetMapping("/edit")
+ @PreAuthorize("hasPermission('/cra/task/edit','cra:task:edit')")
+ public ModelAndView edit(String craId, ModelMap map) {
+ CraTask craTask =craTaskService.getById(craId);
+ map.put("craTask", craTask);
+ return jumpPage(prefix + "/edit");
+ }
+
+ /**
+ * 修改数据任务管理
+ */
+ @ResponseBody
+ @PutMapping("/update")
+ @PreAuthorize("hasPermission('/cra/task/edit','cra:task:edit')")
+ public Result update(@RequestBody CraTask craTask) {
+ return decide(craTaskService.updateById(craTask));
+ }
+
+ /**
+ * 删除数据任务管理
+ */
+ @ResponseBody
+ @DeleteMapping("/batchRemove")
+ @PreAuthorize("hasPermission('/cra/task/remove','cra:task:remove')")
+ public Result batchRemove(String ids) {
+ return decide(craTaskService.removeByIds(Arrays.asList(ids.split(","))));
+ }
+
+ /**
+ * 删除数据任务管理
+ */
+ @ResponseBody
+ @DeleteMapping("/remove/{craId}")
+ @PreAuthorize("hasPermission('/cra/task/remove','cra:task:remove')")
+ public Result remove(@PathVariable("craId") String craId) {
+ return decide(craTaskService.removeById(craId));
+ }
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/domain/CraTask.java b/src/main/java/com/pearadmin/modules/cra/domain/CraTask.java
new file mode 100644
index 00000000..c25ef8ea
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/domain/CraTask.java
@@ -0,0 +1,71 @@
+package com.pearadmin.modules.cra.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 数据任务管理实体
+ *
+ * @author hjhcos
+ * @date 2022-05-08
+ */
+@Data
+@TableName("cra_task")
+public class CraTask implements Serializable {
+
+ /** 任务id */
+ @TableId
+ private String craId;
+
+ /** 数据名称 */
+ private String craName;
+
+ /** 数据标签 */
+ private String craTag;
+
+ /** 是否可用 */
+ private Integer enable;
+
+ /** 主机 */
+ private String host;
+
+ /** 请求网址 */
+ private String url;
+
+ /**
+ * 创建时间
+ */
+ @TableField(value = "create_time", fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ /**
+ * 创建人
+ */
+ @TableField(value = "create_by", fill = FieldFill.INSERT)
+ private String createBy;
+
+ /**
+ * 创建人名称
+ */
+ @TableField(exist = false)
+ private String createName;
+
+ /**
+ * 修改时间
+ */
+ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ /**
+ * 修改人
+ */
+ @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+ private String updateBy;
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/mapper/CraTaskMapper.java b/src/main/java/com/pearadmin/modules/cra/mapper/CraTaskMapper.java
new file mode 100644
index 00000000..ffd7f90a
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/mapper/CraTaskMapper.java
@@ -0,0 +1,24 @@
+package com.pearadmin.modules.cra.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+import com.pearadmin.modules.cra.domain.CraTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 数据任务管理Mapper接口
+ *
+ * @author hjhcos
+ * @date 2022-05-08
+ */
+@Mapper
+public interface CraTaskMapper extends BaseMapper {
+ /**
+ * 查询数据任务管理列表
+ *
+ * @param craTask 数据任务管理
+ * @return 数据任务管理集合
+ */
+ List selectCraTaskList(CraTask craTask);
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraTaskMapper.xml b/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraTaskMapper.xml
new file mode 100644
index 00000000..89836c62
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraTaskMapper.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/pearadmin/modules/cra/service/ICraTaskService.java b/src/main/java/com/pearadmin/modules/cra/service/ICraTaskService.java
new file mode 100644
index 00000000..5d576432
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/service/ICraTaskService.java
@@ -0,0 +1,25 @@
+package com.pearadmin.modules.cra.service;
+
+import java.util.List;
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import com.pearadmin.modules.cra.domain.CraTask;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 数据任务管理Service接口
+ *
+ * @author hjhcos
+ * @date 2022-05-08
+ */
+public interface ICraTaskService extends IService {
+
+ /**
+ * 查询数据任务管理
+ * @param craTask 数据任务管理
+ * @param pageDomain
+ * @return 数据任务管理 分页集合
+ * */
+ PageInfo selectCraTaskPage(CraTask craTask, PageDomain pageDomain);
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/service/impl/CraTaskServiceImpl.java b/src/main/java/com/pearadmin/modules/cra/service/impl/CraTaskServiceImpl.java
new file mode 100644
index 00000000..430c4e18
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/service/impl/CraTaskServiceImpl.java
@@ -0,0 +1,40 @@
+package com.pearadmin.modules.cra.service.impl;
+
+import java.util.List;
+import java.util.ArrayList;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.pearadmin.modules.cra.mapper.CraTaskMapper;
+import com.pearadmin.modules.cra.domain.CraTask;
+import com.pearadmin.modules.cra.service.ICraTaskService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import java.util.Arrays;
+/**
+ * 数据任务管理Service业务层处理
+ *
+ * @author hjhcos
+ * @date 2022-05-08
+ */
+@Service
+public class CraTaskServiceImpl extends ServiceImpl implements ICraTaskService {
+
+
+ /**
+ * 查询数据任务管理
+ * @param craTask 数据任务管理
+ * @param pageDomain
+ * @return 数据任务管理 分页集合
+ * */
+ @Override
+ public PageInfo selectCraTaskPage(CraTask craTask, PageDomain pageDomain) {
+ PageHelper.startPage(pageDomain.getPage(), pageDomain.getLimit());
+ List data = baseMapper.selectCraTaskList(craTask);
+ return new PageInfo<>(data);
+ }
+
+}
diff --git a/src/main/resources/crawler.yml b/src/main/resources/crawler.yml
new file mode 100644
index 00000000..32e442ff
--- /dev/null
+++ b/src/main/resources/crawler.yml
@@ -0,0 +1,22 @@
+# 数据获取
+cra:
+ # 作者
+ author: cos
+ # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
+ packageName: com.pearadmin.modules.cra
+ # 自动去除表前缀,默认是false
+ autoRemovePre: false
+ # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
+ tablePrefix: cra_
+# 请求标头
+headers:
+ # 用户代理浏览器
+ User-Agent: Chrome/100.0.4896.75
+ # 代理服务器
+ proxy: null
+ # 内容类型
+ Content-Type: application/json
+ # 字符集
+ charset: utf-8
+ # 缓存控制
+ Cache-Control: no-cache
diff --git a/src/main/resources/templates/cra/task/add.html b/src/main/resources/templates/cra/task/add.html
new file mode 100644
index 00000000..c3cb3983
--- /dev/null
+++ b/src/main/resources/templates/cra/task/add.html
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/task/edit.html b/src/main/resources/templates/cra/task/edit.html
new file mode 100644
index 00000000..f888e0c3
--- /dev/null
+++ b/src/main/resources/templates/cra/task/edit.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/task/main.html b/src/main/resources/templates/cra/task/main.html
new file mode 100644
index 00000000..dc574b30
--- /dev/null
+++ b/src/main/resources/templates/cra/task/main.html
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/footer.html b/src/main/resources/templates/footer.html
new file mode 100644
index 00000000..e69de29b
--
Gitee
From 5f5663653d403cecd9bdfc4dfc657ba5b36c0beb Mon Sep 17 00:00:00 2001
From: hjhcos <3140546263@qq.com>
Date: Tue, 17 May 2022 20:23:32 +0800
Subject: [PATCH 03/74] =?UTF-8?q?=F0=9F=95=B7=E6=96=87=E7=AB=A0=E7=AE=A1?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +
.../cra/controller/CraArticleController.java | 120 ++++++++++
.../modules/cra/domain/CraArticle.java | 71 ++++++
.../modules/cra/mapper/CraArticleMapper.java | 34 +++
.../cra/mapper/xml/CraArticleMapper.xml | 31 +++
.../cra/service/ICraArticleService.java | 33 +++
.../service/impl/CraArticleServiceImpl.java | 46 ++++
.../modules/cra/task/CrawlerArticle.java | 31 +++
.../pearadmin/modules/cra/tools/Https.java | 6 +
src/main/resources/application-dev.yml | 6 +-
.../resources/templates/cra/article/add.html | 120 ++++++++++
.../resources/templates/cra/article/edit.html | 121 ++++++++++
.../resources/templates/cra/article/main.html | 224 ++++++++++++++++++
.../resources/templates/cra/task/main.html | 108 ++++++---
14 files changed, 929 insertions(+), 28 deletions(-)
create mode 100644 src/main/java/com/pearadmin/modules/cra/controller/CraArticleController.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/domain/CraArticle.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/mapper/CraArticleMapper.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/mapper/xml/CraArticleMapper.xml
create mode 100644 src/main/java/com/pearadmin/modules/cra/service/ICraArticleService.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/service/impl/CraArticleServiceImpl.java
create mode 100644 src/main/java/com/pearadmin/modules/cra/task/CrawlerArticle.java
create mode 100644 src/main/resources/templates/cra/article/add.html
create mode 100644 src/main/resources/templates/cra/article/edit.html
create mode 100644 src/main/resources/templates/cra/article/main.html
diff --git a/pom.xml b/pom.xml
index 229c8a20..41071783 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,6 +80,12 @@
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
org.apache.httpcomponents.client5
diff --git a/src/main/java/com/pearadmin/modules/cra/controller/CraArticleController.java b/src/main/java/com/pearadmin/modules/cra/controller/CraArticleController.java
new file mode 100644
index 00000000..a7fc7bf1
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/controller/CraArticleController.java
@@ -0,0 +1,120 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.controller;
+
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.modules.cra.domain.CraArticle;
+import com.pearadmin.common.web.base.BaseController;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import com.pearadmin.common.web.domain.response.Result;
+import com.pearadmin.common.web.domain.response.module.ResultTable;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import com.pearadmin.modules.cra.service.ICraArticleService;
+
+import java.util.Arrays;
+
+/**
+ * 文章管理Controller
+ *
+ * @author hjhcos
+ * @date 2022-05-16
+ */
+@RestController
+@RequestMapping("/cra/article")
+@Api(tags = {"文章管理"})
+public class CraArticleController extends BaseController {
+
+ private String prefix = "cra/article";
+
+ @Autowired
+ private ICraArticleService craArticleService;
+
+ @GetMapping("/main")
+ @PreAuthorize("hasPermission('/cra/article/main','cra:article:main')")
+ public ModelAndView main() {
+ return jumpPage(prefix + "/main");
+ }
+
+ /**
+ * 查询文章管理列表
+ */
+ @ResponseBody
+ @GetMapping("/data")
+ @PreAuthorize("hasPermission('/cra/article/data','cra:article:data')")
+ public ResultTable list(@ModelAttribute CraArticle craArticle, PageDomain pageDomain) {
+ PageInfo pageInfo = craArticleService.selectCraArticlePage(craArticle, pageDomain);
+ return pageTable(pageInfo.getList(), pageInfo.getTotal());
+ }
+
+ /**
+ * 新增文章管理
+ */
+ @GetMapping("/add")
+ @PreAuthorize("hasPermission('/cra/article/add','cra:article:add')")
+ public ModelAndView add() {
+ return jumpPage(prefix + "/add");
+ }
+
+ /**
+ * 新增文章管理
+ */
+ @ResponseBody
+ @PostMapping("/save")
+ @PreAuthorize("hasPermission('/cra/article/add','cra:article:add')")
+ public Result save(@RequestBody CraArticle craArticle) {
+ return decide(craArticleService.save(craArticle));
+ }
+
+ /**
+ * 修改文章管理
+ */
+ @GetMapping("/edit")
+ @PreAuthorize("hasPermission('/cra/article/edit','cra:article:edit')")
+ public ModelAndView edit(String articleId, ModelMap map) {
+ CraArticle craArticle =craArticleService.getById(articleId);
+ map.put("craArticle", craArticle);
+ return jumpPage(prefix + "/edit");
+ }
+
+ /**
+ * 修改文章管理
+ */
+ @ResponseBody
+ @PutMapping("/update")
+ @PreAuthorize("hasPermission('/cra/article/edit','cra:article:edit')")
+ public Result update(@RequestBody CraArticle craArticle) {
+ return decide(craArticleService.updateById(craArticle));
+ }
+
+ /**
+ * 删除文章管理
+ */
+ @ResponseBody
+ @DeleteMapping("/batchRemove")
+ @PreAuthorize("hasPermission('/cra/article/remove','cra:article:remove')")
+ public Result batchRemove(String ids) {
+ return decide(craArticleService.removeByIds(Arrays.asList(ids.split(","))));
+ }
+
+ /**
+ * 删除文章管理
+ */
+ @ResponseBody
+ @DeleteMapping("/remove/{articleId}")
+ @PreAuthorize("hasPermission('/cra/article/remove','cra:article:remove')")
+ public Result remove(@PathVariable("articleId") String articleId) {
+ return decide(craArticleService.removeById(articleId));
+ }
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/domain/CraArticle.java b/src/main/java/com/pearadmin/modules/cra/domain/CraArticle.java
new file mode 100644
index 00000000..cfeccece
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/domain/CraArticle.java
@@ -0,0 +1,71 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.domain;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+/**
+ * 文章管理实体
+ *
+ * @author hjhcos
+ * @date 2022-05-16
+ */
+public class CraArticle {
+ /** 文章 id */
+ @TableId
+ private String articleId;
+
+ /** 文章作者 */
+ private String articleAuthor;
+
+ /** 文章标题 */
+ private String articleTitle;
+
+ /** 文章描述 */
+ private String articleDesc;
+
+ /** 发布时间 */
+ private Date postTime;
+
+ /** 数据地址 */
+ private String url;
+
+ /** 状态码 */
+ private Long code;
+
+ /**
+ * 创建时间
+ */
+ @TableField(value = "create_time", fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ /**
+ * 创建人
+ */
+ @TableField(value = "create_by", fill = FieldFill.INSERT)
+ private String createBy;
+
+ /**
+ * 修改时间
+ */
+ @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ /**
+ * 修改人
+ */
+ @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+ private String updateBy;
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/mapper/CraArticleMapper.java b/src/main/java/com/pearadmin/modules/cra/mapper/CraArticleMapper.java
new file mode 100644
index 00000000..4be018c3
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/mapper/CraArticleMapper.java
@@ -0,0 +1,34 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pearadmin.modules.cra.domain.CraArticle;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 文章管理Mapper接口
+ *
+ * @author hjhcos
+ * @date 2022-05-16
+ */
+@Mapper
+public interface CraArticleMapper extends BaseMapper {
+ /**
+ * 查询文章管理列表
+ *
+ * @param craArticle 文章管理
+ * @return 文章管理集合
+ */
+ List selectCraArticleList(CraArticle craArticle);
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraArticleMapper.xml b/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraArticleMapper.xml
new file mode 100644
index 00000000..1f55d7db
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/mapper/xml/CraArticleMapper.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/pearadmin/modules/cra/service/ICraArticleService.java b/src/main/java/com/pearadmin/modules/cra/service/ICraArticleService.java
new file mode 100644
index 00000000..ba8778c3
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/service/ICraArticleService.java
@@ -0,0 +1,33 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import com.pearadmin.modules.cra.domain.CraArticle;
+
+/**
+ * 文章管理Service接口
+ *
+ * @author hjhcos
+ * @date 2022-05-16
+ */
+public interface ICraArticleService extends IService {
+
+ /**
+ * 查询文章管理
+ * @param craArticle 文章管理
+ * @param pageDomain
+ * @return 文章管理 分页集合
+ * */
+ PageInfo selectCraArticlePage(CraArticle craArticle, PageDomain pageDomain);
+
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/service/impl/CraArticleServiceImpl.java b/src/main/java/com/pearadmin/modules/cra/service/impl/CraArticleServiceImpl.java
new file mode 100644
index 00000000..da02f909
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/service/impl/CraArticleServiceImpl.java
@@ -0,0 +1,46 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.service.impl;
+
+import java.util.List;
+import java.util.ArrayList;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.pearadmin.common.web.domain.request.PageDomain;
+import org.springframework.stereotype.Service;
+import com.pearadmin.modules.cra.mapper.CraArticleMapper;
+import com.pearadmin.modules.cra.domain.CraArticle;
+import com.pearadmin.modules.cra.service.ICraArticleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 文章管理Service业务层处理
+ *
+ * @author hjhcos
+ * @date 2022-05-16
+ */
+@Service
+public class CraArticleServiceImpl extends ServiceImpl implements ICraArticleService {
+
+
+ /**
+ * 查询文章管理
+ * @param craArticle 文章管理
+ * @param pageDomain
+ * @return 文章管理 分页集合
+ * */
+ @Override
+ public PageInfo selectCraArticlePage(CraArticle craArticle, PageDomain pageDomain) {
+ PageHelper.startPage(pageDomain.getPage(), pageDomain.getLimit());
+ List data = baseMapper.selectCraArticleList(craArticle);
+ return new PageInfo<>(data);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/pearadmin/modules/cra/task/CrawlerArticle.java b/src/main/java/com/pearadmin/modules/cra/task/CrawlerArticle.java
new file mode 100644
index 00000000..15b8595c
--- /dev/null
+++ b/src/main/java/com/pearadmin/modules/cra/task/CrawlerArticle.java
@@ -0,0 +1,31 @@
+// +----------------------------------------------------------------------
+// | HJHCOS [ Laziness is creativity ]
+// +----------------------------------------------------------------------
+// | Copyright (c) https://hjhcos.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: hjhcos
+// +----------------------------------------------------------------------
+package com.pearadmin.modules.cra.task;
+
+import com.pearadmin.modules.cra.tools.Content;
+import com.pearadmin.modules.cra.tools.Https;
+import org.apache.hc.core5.http.NameValuePair;
+
+/**
+ * @author hjhcos
+ * @date 2022/05/16
+ * 爬取文章
+ */
+public class CrawlerArticle implements Runnable{
+
+ public static Content getArticle(String url, Iterable extends NameValuePair> formParams){
+ return Https.get(url, formParams);
+ }
+
+ @Override
+ public void run() {
+
+ }
+}
diff --git a/src/main/java/com/pearadmin/modules/cra/tools/Https.java b/src/main/java/com/pearadmin/modules/cra/tools/Https.java
index 715c99dd..06453021 100644
--- a/src/main/java/com/pearadmin/modules/cra/tools/Https.java
+++ b/src/main/java/com/pearadmin/modules/cra/tools/Https.java
@@ -15,6 +15,11 @@ import org.apache.hc.core5.http.NameValuePair;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+/**
+ * @author hjhcos
+ * @date 2022/05/12
+ * 网络请求工具
+ */
public class Https extends Request{
Https(ClassicHttpRequest request) {
@@ -44,6 +49,7 @@ public class Https extends Request{
req.setHeader(parameter.getName(), parameter.getValue());
}
}
+ Content content = req.execute().returnContent();
return req.execute().returnContent();
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index acd43079..82d5d66e 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -71,4 +71,8 @@ spring:
# Quartz 配置
quartz:
properties:
- tablePrefix: schedule_
\ No newline at end of file
+ tablePrefix: schedule_
+ # 热部署
+ devtools:
+ restart:
+ enabled: true
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/article/add.html b/src/main/resources/templates/cra/article/add.html
new file mode 100644
index 00000000..e303590c
--- /dev/null
+++ b/src/main/resources/templates/cra/article/add.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/article/edit.html b/src/main/resources/templates/cra/article/edit.html
new file mode 100644
index 00000000..dc4f8d40
--- /dev/null
+++ b/src/main/resources/templates/cra/article/edit.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/article/main.html b/src/main/resources/templates/cra/article/main.html
new file mode 100644
index 00000000..ec415264
--- /dev/null
+++ b/src/main/resources/templates/cra/article/main.html
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/templates/cra/task/main.html b/src/main/resources/templates/cra/task/main.html
index dc574b30..84b0185f 100644
--- a/src/main/resources/templates/cra/task/main.html
+++ b/src/main/resources/templates/cra/task/main.html
@@ -4,7 +4,62 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+ })
+