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 + 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