From ee25a3383a95ceb132386bd78186b5bb4974c91c Mon Sep 17 00:00:00 2001
From: fuzhengwei <184172133@qq.com>
Date: Tue, 7 Jul 2020 22:23:47 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E5=82=85=E5=93=A5=20|=20=E9=87=8D?=
=?UTF-8?q?=E5=AD=A6=20Java=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?=
=?UTF-8?q?=EF=BC=9A=E5=AE=9E=E6=88=98=E6=A8=A1=E7=89=88=E6=A8=A1=E5=BC=8F?=
=?UTF-8?q?=E3=80=8C=E6=A8=A1=E6=8B=9F=E7=88=AC=E8=99=AB=E5=90=84=E7=B1=BB?=
=?UTF-8?q?=E7=94=B5=E5=95=86=E5=95=86=E5=93=81=EF=BC=8C=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E8=90=A5=E9=94=80=E6=8E=A8=E5=B9=BF=E6=B5=B7=E6=8A=A5=E5=9C=BA?=
=?UTF-8?q?=E6=99=AF=E3=80=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 1 +
README.md | 3 +-
itstack-demo-design-21-00/pom.xml | 27 +++++++
.../org/itstack/demo/design/HttpClient.java | 74 +++++++++++++++++++
.../java/org/itstack/demo/design/NetMall.java | 46 ++++++++++++
.../demo/design/impl/DangDangNetMall.java | 46 ++++++++++++
.../itstack/demo/design/impl/JDNetMall.java | 46 ++++++++++++
.../demo/design/impl/TaoBaoNetMall.java | 46 ++++++++++++
.../org/itstack/demo/design/test/ApiTest.java | 26 +++++++
pom.xml | 1 +
10 files changed, 315 insertions(+), 1 deletion(-)
create mode 100755 itstack-demo-design-21-00/pom.xml
create mode 100755 itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/HttpClient.java
create mode 100755 itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/NetMall.java
create mode 100755 itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/DangDangNetMall.java
create mode 100755 itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/JDNetMall.java
create mode 100755 itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/TaoBaoNetMall.java
create mode 100755 itstack-demo-design-21-00/src/test/java/org/itstack/demo/design/test/ApiTest.java
diff --git a/.gitignore b/.gitignore
index 3a545dc..d1b23a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,4 @@
/itstack-demo-design-19-01/itstack-demo-design-19-01.iml
/itstack-demo-design-19-00/itstack-demo-design-19-00.iml
/itstack-demo-design-20-01/itstack-demo-design-20-01.iml
+/itstack-demo-design-21-00/itstack-demo-design-21-00.iml
diff --git a/README.md b/README.md
index 6716374..a64a221 100644
--- a/README.md
+++ b/README.md
@@ -27,4 +27,5 @@
- [`5. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」`](https://bugstack.cn/itstack-demo-design/2020/06/28/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F.html)
- [`6. 重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」`](https://bugstack.cn/itstack-demo-design/2020/06/30/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F.html)
- [`7. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」`](https://bugstack.cn/itstack-demo-design/2020/07/02/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F.html)
-- [`8. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」`](https://bugstack.cn/itstack-demo-design/2020/07/05/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.html)
\ No newline at end of file
+- [`8. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」`](https://bugstack.cn/itstack-demo-design/2020/07/05/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.html)
+- [`9. 重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」`](https://bugstack.cn/itstack-demo-design/2020/07/07/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E6%A8%A1%E6%9D%BF%E6%A8%A1%E5%BC%8F.html)
\ No newline at end of file
diff --git a/itstack-demo-design-21-00/pom.xml b/itstack-demo-design-21-00/pom.xml
new file mode 100755
index 0000000..a095f42
--- /dev/null
+++ b/itstack-demo-design-21-00/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ itstack-demo-design
+ org.itstack
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ itstack-demo-design-21-00
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/HttpClient.java b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/HttpClient.java
new file mode 100755
index 0000000..b2cf587
--- /dev/null
+++ b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/HttpClient.java
@@ -0,0 +1,74 @@
+package org.itstack.demo.design;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class HttpClient {
+
+ public static String doGet(String httpurl) {
+ HttpURLConnection connection = null;
+ InputStream is = null;
+ BufferedReader br = null;
+ String result = null;// 返回结果字符串
+ try {
+ // 创建远程url连接对象
+ URL url = new URL(httpurl);
+ // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
+ connection = (HttpURLConnection) url.openConnection();
+ // 设置连接方式:get
+ connection.setRequestMethod("GET");
+ // 设置连接主机服务器的超时时间:15000毫秒
+ connection.setConnectTimeout(15000);
+ // 设置读取远程返回的数据时间:60000毫秒
+ connection.setReadTimeout(60000);
+ // 发送请求
+ connection.connect();
+ // 通过connection连接,获取输入流
+ if (connection.getResponseCode() == 200) {
+ is = connection.getInputStream();
+ // 封装输入流is,并指定字符集
+ br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+ // 存放数据
+ StringBuilder sbf = new StringBuilder();
+ String temp = null;
+ while ((temp = br.readLine()) != null) {
+ sbf.append(temp);
+ sbf.append("\r\n");
+ }
+ result = sbf.toString();
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ // 关闭资源
+ if (null != br) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ if (null != is) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ assert connection != null;
+ connection.disconnect();// 关闭远程连接
+ }
+
+ return result;
+ }
+
+}
diff --git a/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/NetMall.java b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/NetMall.java
new file mode 100755
index 0000000..2abb7f8
--- /dev/null
+++ b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/NetMall.java
@@ -0,0 +1,46 @@
+package org.itstack.demo.design;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+/**
+ * 基础电商推广服务
+ * 1. 生成最优价商品海报
+ * 2. 海报含带推广邀请码
+ */
+public abstract class NetMall {
+
+ protected Logger logger = LoggerFactory.getLogger(NetMall.class);
+
+ String uId; // 用户ID
+ String uPwd; // 用户密码
+
+ public NetMall(String uId, String uPwd) {
+ this.uId = uId;
+ this.uPwd = uPwd;
+ }
+
+ /**
+ * 生成商品推广海报
+ *
+ * @param skuUrl 商品地址(京东、淘宝、当当)
+ * @return 海报图片base64位信息
+ */
+ public String generateGoodsPoster(String skuUrl) {
+ if (!login(uId, uPwd)) return null; // 1. 验证登录
+ Map reptile = reptile(skuUrl); // 2. 爬虫商品
+ return createBase64(reptile); // 3. 组装海报
+ }
+
+ // 模拟登录
+ protected abstract Boolean login(String uId, String uPwd);
+
+ // 爬虫提取商品信息(登录后的优惠价格)
+ protected abstract Map reptile(String skuUrl);
+
+ // 生成商品海报信息
+ protected abstract String createBase64(Map goodsInfo);
+
+}
diff --git a/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/DangDangNetMall.java b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/DangDangNetMall.java
new file mode 100755
index 0000000..5728568
--- /dev/null
+++ b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/DangDangNetMall.java
@@ -0,0 +1,46 @@
+package org.itstack.demo.design.impl;
+
+import com.alibaba.fastjson.JSON;
+import org.itstack.demo.design.HttpClient;
+import org.itstack.demo.design.NetMall;
+import sun.misc.BASE64Encoder;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DangDangNetMall extends NetMall {
+
+ public DangDangNetMall(String uId, String uPwd) {
+ super(uId, uPwd);
+ }
+
+ @Override
+ public Boolean login(String uId, String uPwd) {
+ logger.info("模拟当当用户登录 uId:{} uPwd:{}", uId, uPwd);
+ return true;
+ }
+
+ @Override
+ public Map reptile(String skuUrl) {
+ String str = HttpClient.doGet(skuUrl);
+ Pattern p9 = Pattern.compile("(?<=title\\>).*(?= map = new ConcurrentHashMap();
+ if (m9.find()) {
+ map.put("name", m9.group());
+ }
+ map.put("price", "4548.00");
+ logger.info("模拟当当商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
+ return map;
+ }
+
+ @Override
+ public String createBase64(Map goodsInfo) {
+ BASE64Encoder encoder = new BASE64Encoder();
+ logger.info("模拟生成当当商品base64海报");
+ return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
+ }
+
+}
diff --git a/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/JDNetMall.java b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/JDNetMall.java
new file mode 100755
index 0000000..7b74d70
--- /dev/null
+++ b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/JDNetMall.java
@@ -0,0 +1,46 @@
+package org.itstack.demo.design.impl;
+
+import com.alibaba.fastjson.JSON;
+import org.itstack.demo.design.HttpClient;
+import org.itstack.demo.design.NetMall;
+import sun.misc.BASE64Encoder;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 模拟JD商城
+ */
+public class JDNetMall extends NetMall {
+
+ public JDNetMall(String uId, String uPwd) {
+ super(uId, uPwd);
+ }
+
+ public Boolean login(String uId, String uPwd) {
+ logger.info("模拟京东用户登录 uId:{} uPwd:{}", uId, uPwd);
+ return true;
+ }
+
+ public Map reptile(String skuUrl) {
+ String str = HttpClient.doGet(skuUrl);
+ Pattern p9 = Pattern.compile("(?<=title\\>).*(?= map = new ConcurrentHashMap();
+ if (m9.find()) {
+ map.put("name", m9.group());
+ }
+ map.put("price", "5999.00");
+ logger.info("模拟京东商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
+ return map;
+ }
+
+ public String createBase64(Map goodsInfo) {
+ BASE64Encoder encoder = new BASE64Encoder();
+ logger.info("模拟生成京东商品base64海报");
+ return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
+ }
+
+}
diff --git a/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/TaoBaoNetMall.java b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/TaoBaoNetMall.java
new file mode 100755
index 0000000..2c5dd32
--- /dev/null
+++ b/itstack-demo-design-21-00/src/main/java/org/itstack/demo/design/impl/TaoBaoNetMall.java
@@ -0,0 +1,46 @@
+package org.itstack.demo.design.impl;
+
+import com.alibaba.fastjson.JSON;
+import org.itstack.demo.design.HttpClient;
+import org.itstack.demo.design.NetMall;
+import sun.misc.BASE64Encoder;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class TaoBaoNetMall extends NetMall {
+
+ public TaoBaoNetMall(String uId, String uPwd) {
+ super(uId, uPwd);
+ }
+
+ @Override
+ public Boolean login(String uId, String uPwd) {
+ logger.info("模拟淘宝用户登录 uId:{} uPwd:{}", uId, uPwd);
+ return true;
+ }
+
+ @Override
+ public Map reptile(String skuUrl) {
+ String str = HttpClient.doGet(skuUrl);
+ Pattern p9 = Pattern.compile("(?<=title\\>).*(?= map = new ConcurrentHashMap();
+ if (m9.find()) {
+ map.put("name", m9.group());
+ }
+ map.put("price", "4799.00");
+ logger.info("模拟淘宝商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);
+ return map;
+ }
+
+ @Override
+ public String createBase64(Map goodsInfo) {
+ BASE64Encoder encoder = new BASE64Encoder();
+ logger.info("模拟生成淘宝商品base64海报");
+ return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());
+ }
+
+}
diff --git a/itstack-demo-design-21-00/src/test/java/org/itstack/demo/design/test/ApiTest.java b/itstack-demo-design-21-00/src/test/java/org/itstack/demo/design/test/ApiTest.java
new file mode 100755
index 0000000..23f08ee
--- /dev/null
+++ b/itstack-demo-design-21-00/src/test/java/org/itstack/demo/design/test/ApiTest.java
@@ -0,0 +1,26 @@
+package org.itstack.demo.design.test;
+
+import org.itstack.demo.design.NetMall;
+import org.itstack.demo.design.impl.JDNetMall;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ApiTest {
+
+ public Logger logger = LoggerFactory.getLogger(ApiTest.class);
+
+ /**
+ * 测试链接
+ * 京东;https://item.jd.com/100008348542.html
+ * 淘宝;https://detail.tmall.com/item.htm
+ * 当当;http://product.dangdang.com/1509704171.html
+ */
+ @Test
+ public void test_NetMall() {
+ NetMall netMall = new JDNetMall("1000001","*******");
+ String base64 = netMall.generateGoodsPoster("https://item.jd.com/100008348542.html");
+ logger.info("测试结果:{}", base64);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index b5f8b25..1622c9b 100755
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,7 @@
itstack-demo-design-19-02
itstack-demo-design-20-01
itstack-demo-design-20-02
+ itstack-demo-design-21-00
--
GitLab