From 4cd3a7847841a1102047ed14549827b58cc84125 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Fri, 23 Jun 2017 09:40:17 +0800 Subject: [PATCH 01/26] =?UTF-8?q?=E6=96=B0=E5=BB=BAknowledge-point?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liuxin/knowledge-point/pom.xml | 32 ++++++++++++++++ .../src/main/java/cas/CASSequence.java | 18 +++++++++ .../src/main/java/cas/NoBlockingStack.java | 34 +++++++++++++++++ .../src/main/java/cas/Sequence.java | 11 ++++++ .../src/main/java/threadlocal/Context.java | 20 ++++++++++ .../java/threadlocal/TransactionManager.java | 22 +++++++++++ .../main/java/threadpool/BlockingQueue.java | 35 ++++++++++++++++++ .../src/main/java/threadpool/Task.java | 5 +++ .../src/main/java/threadpool/ThreadPool.java | 37 +++++++++++++++++++ .../main/java/threadpool/WorkerThread.java | 33 +++++++++++++++++ 10 files changed, 247 insertions(+) create mode 100644 liuxin/knowledge-point/pom.xml create mode 100644 liuxin/knowledge-point/src/main/java/cas/CASSequence.java create mode 100644 liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java create mode 100644 liuxin/knowledge-point/src/main/java/cas/Sequence.java create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/Context.java create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/Task.java create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java diff --git a/liuxin/knowledge-point/pom.xml b/liuxin/knowledge-point/pom.xml new file mode 100644 index 0000000000..3dc438c7d9 --- /dev/null +++ b/liuxin/knowledge-point/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + knowledge-point + 0.0.1-SNAPSHOT + jar + + knowledge-point + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/liuxin/knowledge-point/src/main/java/cas/CASSequence.java b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java new file mode 100644 index 0000000000..dcff77d9bf --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/cas/CASSequence.java @@ -0,0 +1,18 @@ +package cas; + +import java.util.concurrent.atomic.AtomicInteger; + +public class CASSequence{ + + private AtomicInteger count = new AtomicInteger(0); + + public int next(){ + while(true){ + int current = count.get(); + int next = current +1; + if(count.compareAndSet(current, next)){ + return next; + } + } + } +} \ No newline at end of file diff --git a/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java new file mode 100644 index 0000000000..d7be44c69a --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java @@ -0,0 +1,34 @@ +package cas; + +import java.util.concurrent.atomic.AtomicReference; + +public class NoBlockingStack { + static class Node { + final E item; + Node next; + public Node(E item) { this.item = item; } + } + + AtomicReference> head = new AtomicReference>(); + + public void push(E item) { + Node newHead = new Node(item); + Node oldHead; + do { + oldHead = head.get(); + newHead.next = oldHead; + } while (!head.compareAndSet(oldHead, newHead)); + } + public E pop() { + Node oldHead; + Node newHead; + do { + oldHead = head.get(); + if (oldHead == null) + return null; + newHead = oldHead.next; + } while (!head.compareAndSet(oldHead,newHead)); + return oldHead.item; + } + +} diff --git a/liuxin/knowledge-point/src/main/java/cas/Sequence.java b/liuxin/knowledge-point/src/main/java/cas/Sequence.java new file mode 100644 index 0000000000..688224e251 --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/cas/Sequence.java @@ -0,0 +1,11 @@ +package cas; + +public class Sequence{ + + private int value; + + public int next(){ + return value ++; + } + +} diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/Context.java b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java new file mode 100644 index 0000000000..d84584397b --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/threadlocal/Context.java @@ -0,0 +1,20 @@ +package threadlocal; +import java.util.HashMap; +import java.util.Map; + +public class Context { + + private static final ThreadLocal txThreadLocal + = new ThreadLocal(); + + public static void setTransactionID(String txID) { + txThreadLocal.set(txID); + + } + + public static String getTransactionId() { + return txThreadLocal.get(); + } + +} + diff --git a/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java new file mode 100644 index 0000000000..8a5283fcab --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java @@ -0,0 +1,22 @@ +package threadlocal; + +public class TransactionManager { + private static final ThreadLocal context = new ThreadLocal(); + + public static void startTransaction() { + // logic to start a transaction + // ... + String txID = null; + context.set(txID); + } + + public static String getTransactionId() { + return context.get(); + } + + public static void endTransaction() { + // logic to end a transaction + // … + context.remove(); + } +} diff --git a/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java new file mode 100644 index 0000000000..faca2d2c70 --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java @@ -0,0 +1,35 @@ +package threadpool; +import java.util.LinkedList; +import java.util.List; + +public class BlockingQueue { + + private List queue = new LinkedList(); + private int limit = 10; + + public BlockingQueue(int limit) { + this.limit = limit; + } + + public synchronized void enqueue(Object item) throws InterruptedException { + while (this.queue.size() == this.limit) { + wait(); + } + if (this.queue.size() == 0) { + notifyAll(); + } + this.queue.add(item); + } + + public synchronized Object dequeue() throws InterruptedException { + while (this.queue.size() == 0) { + wait(); + } + if (this.queue.size() == this.limit) { + notifyAll(); + } + + return this.queue.remove(0); + } + +} diff --git a/liuxin/knowledge-point/src/main/java/threadpool/Task.java b/liuxin/knowledge-point/src/main/java/threadpool/Task.java new file mode 100644 index 0000000000..07413d9798 --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/threadpool/Task.java @@ -0,0 +1,5 @@ +package threadpool; + +public interface Task { + public void execute(); +} diff --git a/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java new file mode 100644 index 0000000000..f508f76eb5 --- /dev/null +++ b/liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java @@ -0,0 +1,37 @@ +package threadpool; +import java.util.ArrayList; +import java.util.List; + + +public class ThreadPool { + + private BlockingQueue taskQueue = null; + private List threads = new ArrayList(); + private boolean isStopped = false; + + public ThreadPool(int numOfThreads, int maxNumOfTasks){ + taskQueue = new BlockingQueue(maxNumOfTasks); + + for(int i=0; i Date: Fri, 23 Jun 2017 23:28:03 +0800 Subject: [PATCH 02/26] refactor the sample of SRP in OOD. --- .../com/coderising/ood/srp/Configuration.java | 22 ++ .../coderising/ood/srp/ConfigurationKeys.java | 9 + .../java/com/coderising/ood/srp/DBUtil.java | 25 +++ .../com/coderising/ood/srp/EmailMessage.java | 36 ++++ .../java/com/coderising/ood/srp/MailUtil.java | 18 ++ .../java/com/coderising/ood/srp/Product.java | 44 ++++ .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++ .../java/com/coderising/ood/srp/UserInfo.java | 46 ++++ .../coderising/ood/srp/product_promotion.txt | 4 + 9 files changed, 403 insertions(+) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..d2205cdbe7 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,22 @@ +package com.coderising.ood.srp; + +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + + static { + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + */ + public String getProperty(String key) { + return configurations.get(key); + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java new file mode 100644 index 0000000000..48d90a624f --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java @@ -0,0 +1,36 @@ +package com.coderising.ood.srp; + +/** + * the email message content will be sent to user. + * + * @author Thomson Tang + * @version Created: 23/06/2017. + */ +public class EmailMessage { + private String subject; + private String message; + + public EmailMessage() { + } + + public EmailMessage(String subject, String message) { + this.subject = subject; + this.message = message; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..9f9e749af7 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,18 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost, + boolean debug) { + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + + } + + +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java new file mode 100644 index 0000000000..471863d48e --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java @@ -0,0 +1,44 @@ +package com.coderising.ood.srp; + +/** + * Product entity class. + * + * @author Thomson Tang + * @version Created: 23/06/2017. + */ +public class Product { + private String productId; + private String productName; + + private Product() { + } + + private Product(String productId, String productName) { + this.productId = productId; + this.productName = productName; + } + + public static Product newInstance(String productId, String productName) { + return new Product(productId, productName); + } + + public static Product newInstance() { + return new Product(); + } + + public String getProductId() { + return productId; + } + + public void setProductId(String productId) { + this.productId = productId; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..781587a846 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,199 @@ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class PromotionMail { + + + protected String sendMailQuery = null; + + + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String fromAddress = null; + protected String toAddress = null; + protected String subject = null; + protected String message = null; + + protected String productID = null; + protected String productDesc = null; + + private static Configuration config; + + + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + + public static void main(String[] args) throws Exception { + + File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt"); + boolean emailDebug = false; + + PromotionMail pe = new PromotionMail(f, emailDebug); + + } + + + public PromotionMail(File file, boolean mailDebug) throws Exception { + + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + readFile(file); + + + config = new Configuration(); + + setSMTPHost(); + setAltSMTPHost(); + + + setFromAddress(); + + + setLoadQuery(); + + sendEMails(mailDebug, loadMailingList()); + + + } + + + + + protected void setProductID(String productID) + { + this.productID = productID; + + } + + protected String getproductID() + { + return productID; + } + + protected void setLoadQuery() throws Exception { + + sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID +"' " + + "and send_mail=1 "; + + + System.out.println("loadQuery set"); + } + + + protected void setSMTPHost() + { + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + + protected void setAltSMTPHost() + { + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + + } + + + protected void setFromAddress() + { + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + protected void setMessage(HashMap userInfo) throws IOException + { + + String name = (String) userInfo.get(NAME_KEY); + + subject = "您关注的产品降价了"; + message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ; + + + + } + + + protected void readFile(File file) throws IOException // @02C + { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + String[] data = temp.split(" "); + + setProductID(data[0]); + setProductDesc(data[1]); + + System.out.println("产品ID = " + productID + "\n"); + System.out.println("产品描述 = " + productDesc + "\n"); + + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } + + private void setProductDesc(String desc) { + this.productDesc = desc; + } + + + protected void configureEMail(HashMap userInfo) throws IOException + { + toAddress = (String) userInfo.get(EMAIL_KEY); + if (toAddress.length() > 0) + setMessage(userInfo); + } + + protected List loadMailingList() throws Exception { + return DBUtil.query(this.sendMailQuery); + } + + + protected void sendEMails(boolean debug, List mailingList) throws IOException + { + + System.out.println("开始发送邮件"); + + + if (mailingList != null) { + Iterator iter = mailingList.iterator(); + while (iter.hasNext()) { + configureEMail((HashMap) iter.next()); + try + { + if (toAddress.length() > 0) + MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug); + } + catch (Exception e) + { + + try { + MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); + + } catch (Exception e2) + { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + + } + + else { + System.out.println("没有邮件发送"); + + } + + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java new file mode 100644 index 0000000000..f680c0ecd8 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java @@ -0,0 +1,46 @@ +package com.coderising.ood.srp; + +/** + * the user info entity class. + * + * @author Thomson Tang + * @version Created: 23/06/2017. + */ +public class UserInfo { + private String userId; + private String userName; + private String email; + + public UserInfo() { + } + + public UserInfo(String userId, String userName, String email) { + this.userId = userId; + this.userName = userName; + this.email = email; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file From 592e60bb315eae752606291947a696ee3855786b Mon Sep 17 00:00:00 2001 From: ThomsonTang Date: Fri, 23 Jun 2017 23:31:19 +0800 Subject: [PATCH 03/26] refactor the sample --- students/395135865/ood/ood-assignment/pom.xml | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 students/395135865/ood/ood-assignment/pom.xml diff --git a/students/395135865/ood/ood-assignment/pom.xml b/students/395135865/ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/395135865/ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + From 3a5dd120bf3ab4d4c5ced4eb02c9413dd67c99c2 Mon Sep 17 00:00:00 2001 From: ISmallBlack <1132643730@qq.com> Date: Sun, 25 Jun 2017 21:00:17 +0800 Subject: [PATCH 04/26] first --- students/1132643730/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 students/1132643730/readme.md diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md new file mode 100644 index 0000000000..793aa682b0 --- /dev/null +++ b/students/1132643730/readme.md @@ -0,0 +1 @@ +This is a test \ No newline at end of file From c6249796be9fcbdaddafc8635dfbc319fce4dadf Mon Sep 17 00:00:00 2001 From: ISmallBlack <1132643730@qq.com> Date: Sun, 25 Jun 2017 21:15:42 +0800 Subject: [PATCH 05/26] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- students/1132643730/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md index 793aa682b0..a9142ea24d 100644 --- a/students/1132643730/readme.md +++ b/students/1132643730/readme.md @@ -1 +1 @@ -This is a test \ No newline at end of file +This is a test 斤斤计较 \ No newline at end of file From bf6493be2511272a1d8f6ed203106e241ced52b4 Mon Sep 17 00:00:00 2001 From: ISmallBlack <1132643730@qq.com> Date: Sun, 25 Jun 2017 22:00:32 +0800 Subject: [PATCH 06/26] =?UTF-8?q?=E5=89=8D=E9=9D=A2=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- students/1132643730/ood-assignment/pom.xml | 32 ++++++++++ .../java/com/coderising/ood/ocp/Logger.java | 28 ++++++++ .../java/com/coderising/ood/ocp/Main.java | 29 +++++++++ .../ood/ocp/formatter/DateUtil.java | 20 ++++++ .../ood/ocp/formatter/LogFormatter.java | 15 +++++ .../ood/ocp/handler/LogHandler.java | 17 +++++ .../coderising/ood/ocp/handler/MailUtil.java | 9 +++ .../coderising/ood/ocp/handler/PrintUtil.java | 21 ++++++ .../coderising/ood/ocp/handler/SMSUtil.java | 9 +++ .../com/coderising/ood/srp/Configuration.java | 23 +++++++ .../coderising/ood/srp/ConfigurationKeys.java | 9 +++ .../java/com/coderising/ood/srp/DBUtil.java | 25 ++++++++ .../com/coderising/ood/srp/DataGenerator.java | 64 +++++++++++++++++++ .../java/com/coderising/ood/srp/MailUtil.java | 41 ++++++++++++ .../java/com/coderising/ood/srp/Main.java | 34 ++++++++++ .../com/coderising/ood/srp/PromotionMail.java | 26 ++++++++ .../coderising/ood/srp/product_promotion.txt | 4 ++ students/1132643730/readme.md | 2 +- 18 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 students/1132643730/ood-assignment/pom.xml create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt diff --git a/students/1132643730/ood-assignment/pom.xml b/students/1132643730/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/1132643730/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java new file mode 100644 index 0000000000..9a4cbb0f0c --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java @@ -0,0 +1,28 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.ocp; + +import com.coderising.ood.ocp.formatter.LogFormatter; +import com.coderising.ood.ocp.handler.LogHandler; + +/** + * @Description: + * @author palmshe + * @date 2017年6月19日 下午9:10:02 + */ +public class Logger { + + private LogHandler logHandler; + private LogFormatter logFormatter; + + public Logger(LogHandler handler, LogFormatter formatter){ + this.logHandler= handler; + this.logFormatter= formatter; + } + + public void log(String msg){ + this.logHandler.handleLog(this.logFormatter.formatMsg(msg)); + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java new file mode 100644 index 0000000000..9a072602b0 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java @@ -0,0 +1,29 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.ocp; + +import com.coderising.ood.ocp.formatter.DateUtil; +import com.coderising.ood.ocp.formatter.LogFormatter; +import com.coderising.ood.ocp.handler.LogHandler; +import com.coderising.ood.ocp.handler.MailUtil; +import com.coderising.ood.ocp.handler.SMSUtil; + +/** + * @Description: + * @author palmshe + * @date 2017年6月19日 下午9:36:38 + */ +public class Main { + + public static void main(String[] args) { + LogHandler sms= new SMSUtil(); + LogHandler mail= new MailUtil(); + LogFormatter date= new DateUtil(); + Logger log= new Logger(sms, date); + log.log("hello world"); + log= new Logger(mail, date); + log.log("hello coder"); + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java new file mode 100644 index 0000000000..7b45fd15dd --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java @@ -0,0 +1,20 @@ +package com.coderising.ood.ocp.formatter; + +import java.util.Date; + +public class DateUtil implements LogFormatter{ + + private String getCurrentDateAsString() { + + return "current date: "+ new Date(); + } + + /* (non-Javadoc) + * @see com.coderising.ood.ocp.LogFormatter#formatMsg(java.lang.String) + */ + @Override + public String formatMsg(String msg) { + return getCurrentDateAsString()+ ", "+ msg; + } + +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java new file mode 100644 index 0000000000..0be87702f2 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java @@ -0,0 +1,15 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.ocp.formatter; + +/** + * @Description: + * @author palmshe + * @date 2017年6月19日 下午9:07:00 + */ +public interface LogFormatter { + + String formatMsg(String msg); +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java new file mode 100644 index 0000000000..e86cebba24 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java @@ -0,0 +1,17 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.ocp.handler; + +import java.io.Serializable; + +/** + * @Description: + * @author palmshe + * @date 2017年6月19日 下午9:08:04 + */ +public interface LogHandler extends Serializable{ + + void handleLog(String msg); +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java new file mode 100644 index 0000000000..e9fb2d90da --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java @@ -0,0 +1,9 @@ +package com.coderising.ood.ocp.handler; + +public class MailUtil implements LogHandler{ + + public void handleLog(String logMsg) { + System.out.println("MailUtil handle, msg= "+ logMsg); + } + +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java new file mode 100644 index 0000000000..8f2ab2b697 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java @@ -0,0 +1,21 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.ocp.handler; + +/** + * @Description: + * @author palmshe + * @date 2017年6月19日 下午9:22:49 + */ +public class PrintUtil implements LogHandler{ + + /* (non-Javadoc) + * @see com.coderising.ood.ocp.LogHandler#send(java.lang.String) + */ + @Override + public void handleLog(String msg) { + System.out.println("PrintUtil handle, msg= "+ msg); + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java new file mode 100644 index 0000000000..4bd916587d --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java @@ -0,0 +1,9 @@ +package com.coderising.ood.ocp.handler; + +public class SMSUtil implements LogHandler{ + + public void handleLog(String logMsg) { + System.out.println("SMSUtil handle, msg= "+ logMsg); + } + +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..ccffce577d --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public static String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java new file mode 100644 index 0000000000..6e9f1c2e84 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java @@ -0,0 +1,64 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description: + * @author palmshe + * @date 2017年6月11日 下午10:24:46 + */ +public class DataGenerator { + + /** + * @Description:获取商品 + * @param file + * @return + * @throws IOException + */ + public static Map generateGoods(File file) throws IOException{ + Map good= new HashMap(); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + String[] data = temp.split(" "); + + good.put(PromotionMail.ID_KEY, data[0]); + good.put(PromotionMail.DESC_KEY, data[1]); + + System.out.println("产品ID = " + data[0] + "\n"); + System.out.println("产品描述 = " + data[1] + "\n"); + + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + return good; + } + + /** + * @Description:获取客户 + * @param good + * @return + * @throws Exception + */ + public static List loadMailingList(Map good) throws Exception { + String id= (String)good.get(PromotionMail.ID_KEY); + String sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + id +"' " + + "and send_mail=1 "; + + return DBUtil.query(sendMailQuery); + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..e31d8a9b75 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,41 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + private static String fromAddress; + private static String smtpServer; + private static String altSmtpServer; + + public MailUtil(String fromAddress, String smtpServer, String altSmtpServer){ + this.fromAddress= fromAddress; + this.smtpServer= smtpServer; + this.altSmtpServer= altSmtpServer; + } + + /** + * @Description:发送邮件 + * @param pm + * @param debug + */ + public void sendEmail(PromotionMail pm, boolean debug){ + try { + sendEmail(fromAddress, pm.toAddress, pm.subject, pm.message, smtpServer, debug); + } catch (Exception e1) { + try { + sendEmail(fromAddress, pm.toAddress, pm.subject, pm.message, altSmtpServer, debug); + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + private void sendEmail(String from, String to, String subject, String message, String server, boolean debug){ +// 假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(from).append("\n"); + buffer.append("To:").append(to).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java new file mode 100644 index 0000000000..9e8a514191 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java @@ -0,0 +1,34 @@ +/** + * 版权 (c) 2017 palmshe.com + * 保留所有权利。 + */ +package com.coderising.ood.srp; + +import java.io.File; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * @Description: + * @author palmshe + * @date 2017年6月12日 下午10:07:23 + */ +public class Main { + public static void main(String[] args) { + try { + File f = new File("C:\\Users\\Administrator.PC-20170125UBDJ\\Desktop\\coder2017\\coding2017\\students\\1132643730\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt"); + MailUtil maiUtil= new MailUtil(Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN), Configuration.getProperty(ConfigurationKeys.SMTP_SERVER), Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER)); + Map good = DataGenerator.generateGoods(f); + List users= DataGenerator.loadMailingList(good); + if (!users.isEmpty()) { + Iterator it= users.iterator(); + while (it.hasNext()) { + maiUtil.sendEmail(new PromotionMail((Map)it.next(), good), true); + } + } + } catch (Exception e) { + System.out.println("构造发送邮件数据失败:"+ e.getMessage()); + } + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..a773d878ee --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,26 @@ +package com.coderising.ood.srp; + +import java.util.Map; + +public class PromotionMail { + + protected String toAddress = null; + protected String subject = null; + protected String message = null; + protected String productID = null; + protected String productDesc = null; + + protected static final String NAME_KEY = "NAME"; + protected static final String EMAIL_KEY = "EMAIL"; + protected static final String ID_KEY = "ID"; + protected static final String DESC_KEY = "DESC"; + + public PromotionMail(Map user, Map good){ + String name = (String)user.get(NAME_KEY); + this.productDesc= (String)good.get(DESC_KEY); + this.productID= (String)good.get(ID_KEY); + this.toAddress= (String)user.get(EMAIL_KEY); + this.subject = "您关注的产品降价了"; + this.message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ; + } +} diff --git a/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md index a9142ea24d..fdae662c31 100644 --- a/students/1132643730/readme.md +++ b/students/1132643730/readme.md @@ -1 +1 @@ -This is a test 斤斤计较 \ No newline at end of file +### 学着使用git \ No newline at end of file From b9dcd702ec4102d08c1047f72821488e8f0f7fb2 Mon Sep 17 00:00:00 2001 From: Liu Zengzeng Date: Tue, 27 Jun 2017 10:33:56 +0800 Subject: [PATCH 07/26] srp homework --- .../2816977791/ood/ood-assignment/pom.xml | 32 +++++ .../com/coderising/ood/srp/Configuration.java | 23 +++ .../coderising/ood/srp/ConfigurationKeys.java | 9 ++ .../java/com/coderising/ood/srp/DBUtil.java | 25 ++++ .../java/com/coderising/ood/srp/FileUtil.java | 28 ++++ .../com/coderising/ood/srp/MailService.java | 44 ++++++ .../java/com/coderising/ood/srp/MailUtil.java | 14 ++ .../com/coderising/ood/srp/PromotionMail.java | 131 ++++++++++++++++++ .../coderising/ood/srp/product_promotion.txt | 4 + 9 files changed, 310 insertions(+) create mode 100644 students/2816977791/ood/ood-assignment/pom.xml create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt diff --git a/students/2816977791/ood/ood-assignment/pom.xml b/students/2816977791/ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..f328c1816a --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java new file mode 100644 index 0000000000..eeb6d38d46 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java @@ -0,0 +1,28 @@ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +/** + * @author nvarchar + * date 2017/6/26 + */ +public class FileUtil { + + protected static String[] readFile(File file) throws IOException // @02C + { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + return temp.split(" "); + + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java new file mode 100644 index 0000000000..36195d18ff --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java @@ -0,0 +1,44 @@ +package com.coderising.ood.srp; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +/** + * 发送邮件 + * + * @author nvarchar + * date 2017/6/26 + */ +public class MailService { + protected static void sendEMails(boolean debug, List mailingList, PromotionMail promotionMail) throws IOException { + + System.out.println("开始发送邮件"); + + if (mailingList != null) { + Iterator iter = mailingList.iterator(); + while (iter.hasNext()) { + promotionMail.configureEMail((HashMap) iter.next()); + try { + if (promotionMail.hasValidToAddress()) + MailUtil.sendEmail(promotionMail, debug); + } catch (Exception e) { + + try { + MailUtil.sendEmail(promotionMail, debug); + + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + + } else { + System.out.println("没有邮件发送"); + + } + + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..16866bf3f7 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,14 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + public static void sendEmail(PromotionMail promotionMail, boolean debug) { + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(promotionMail.fromAddress).append("\n"); + buffer.append("To:").append(promotionMail.toAddress).append("\n"); + buffer.append("Subject:").append(promotionMail.subject).append("\n"); + buffer.append("Content:").append(promotionMail.message).append("\n"); + System.out.println(buffer.toString()); + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..ea151ddfc9 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,131 @@ +package com.coderising.ood.srp; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +public class PromotionMail { + + + protected String sendMailQuery = null; + + + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String fromAddress = null; + protected String toAddress = null; + protected String subject = null; + protected String message = null; + + protected String productID = null; + protected String productDesc = null; + + private static Configuration config; + + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + + public static void main(String[] args) throws Exception { + + File f = new File("/Users/nvarchar/Documents/github/coding2017-2/" + + "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt"); + boolean emailDebug = false; + + PromotionMail pe = new PromotionMail(f); + + MailService.sendEMails(emailDebug, pe.loadMailingList(), pe); + } + + + public PromotionMail(File file) throws Exception { + + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + String[] data = FileUtil.readFile(file); + + setProductID(data[0]); + setProductDesc(data[1]); + + config = new Configuration(); + + setSMTPHost(); + + setAltSMTPHost(); + + setFromAddress(); + + setLoadQuery(); + + } + + + protected void setProductID(String productID) { + this.productID = productID; + System.out.println("产品ID = " + productID + "\n"); + } + + protected String getproductID() { + return productID; + } + + protected void setLoadQuery() throws Exception { + + sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID + "' " + + "and send_mail=1 "; + + + System.out.println("loadQuery set"); + } + + + protected void setSMTPHost() { + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + + protected void setAltSMTPHost() { + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + } + + + protected void setFromAddress() { + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + protected void setMessage(HashMap userInfo) throws IOException { + + String name = (String) userInfo.get(NAME_KEY); + + subject = "您关注的产品降价了"; + message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; + + } + + private void setProductDesc(String desc) { + this.productDesc = desc; + System.out.println("产品描述 = " + productDesc + "\n"); + } + + + public void configureEMail(HashMap userInfo) throws IOException { + toAddress = (String) userInfo.get(EMAIL_KEY); + if (toAddress.length() > 0) + setMessage(userInfo); + } + + protected boolean hasValidToAddress() { + if (toAddress.length() > 0) { + return true; + } + return false; + } + + protected List loadMailingList() throws Exception { + return DBUtil.query(this.sendMailQuery); + } + + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file From 46f1749369fc1ec2342319c2325f0598b39c77a3 Mon Sep 17 00:00:00 2001 From: ThomsonTang Date: Tue, 27 Jun 2017 23:49:47 +0800 Subject: [PATCH 08/26] read the file and resolve a line to a product. --- .../com/coderising/ood/srp/EmailMessage.java | 36 ++++++++++---- .../ood/srp/ProductFileServiceImpl.java | 47 +++++++++++++++++++ .../coderising/ood/srp/ProductService.java | 13 +++++ 3 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java index 48d90a624f..1872552c29 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java @@ -1,21 +1,41 @@ package com.coderising.ood.srp; /** - * the email message content will be sent to user. + * the email message entity class. * * @author Thomson Tang * @version Created: 23/06/2017. */ public class EmailMessage { + private String fromAddress; + private String toAddress; private String subject; - private String message; + private String content; public EmailMessage() { } - public EmailMessage(String subject, String message) { + public EmailMessage(String fromAddress, String toAddress, String subject, String content) { + this.fromAddress = fromAddress; + this.toAddress = toAddress; this.subject = subject; - this.message = message; + this.content = content; + } + + public String getFromAddress() { + return fromAddress; + } + + public void setFromAddress(String fromAddress) { + this.fromAddress = fromAddress; + } + + public String getToAddress() { + return toAddress; + } + + public void setToAddress(String toAddress) { + this.toAddress = toAddress; } public String getSubject() { @@ -26,11 +46,11 @@ public void setSubject(String subject) { this.subject = subject; } - public String getMessage() { - return message; + public String getContent() { + return content; } - public void setMessage(String message) { - this.message = message; + public void setContent(String content) { + this.content = content; } } diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java new file mode 100644 index 0000000000..024afaf705 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java @@ -0,0 +1,47 @@ +package com.coderising.ood.srp; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * the implementation of product service which listing the products by reading from a file. + * + * @author Thomson Tang + * @version Created: 24/06/2017. + */ +public class ProductFileServiceImpl implements ProductService { + private String fileName; + + public ProductFileServiceImpl(String fileName) { + this.fileName = fileName; + } + + @Override + public List listProduct() throws Exception { + List products = new ArrayList<>(); + Path path = Paths.get(getClass().getResource(fileName).toURI()); + Stream lines = Files.lines(path); + lines.forEach(line -> products.add(resolveProduct(line))); + return products; + } + + private Product resolveProduct(String line) { + String[] items = line.split(" "); + if (items.length > 2) { + return Product.newInstance(items[0], items[1]); + } + return Product.newInstance(); + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java new file mode 100644 index 0000000000..2cfce64b10 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java @@ -0,0 +1,13 @@ +package com.coderising.ood.srp; + +import java.util.List; + +/** + * the business service of product. + * + * @author Thomson Tang + * @version Created: 23/06/2017. + */ +public interface ProductService { + List listProduct() throws Exception; +} From 8bfc3ed12371413e9c6398e0e325d55cc362e374 Mon Sep 17 00:00:00 2001 From: ThomsonTang Date: Tue, 27 Jun 2017 23:53:41 +0800 Subject: [PATCH 09/26] add a resource directory. --- .../com/coderising/ood/srp/product_promotion.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename students/395135865/ood/ood-assignment/src/main/{java => resources}/com/coderising/ood/srp/product_promotion.txt (100%) diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt similarity index 100% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt rename to students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt From adea855d8e3203bd81ea3f7e1c823474fd3f146b Mon Sep 17 00:00:00 2001 From: Liu Zengzeng Date: Wed, 28 Jun 2017 14:07:02 +0800 Subject: [PATCH 10/26] ocp homework --- .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++++++ .../com/coderising/ood/ocp/LogMsgConvert.java | 9 ++++++++ .../java/com/coderising/ood/ocp/Logger.java | 22 +++++++++++++++++++ .../com/coderising/ood/ocp/MailSender.java | 12 ++++++++++ .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++++++ .../com/coderising/ood/ocp/PrintSender.java | 12 ++++++++++ .../java/com/coderising/ood/ocp/RawLog.java | 14 ++++++++++++ .../com/coderising/ood/ocp/RawLogFactory.java | 17 ++++++++++++++ .../coderising/ood/ocp/RawLogWtihDate.java | 15 +++++++++++++ .../com/coderising/ood/ocp/SMSSender.java | 12 ++++++++++ .../java/com/coderising/ood/ocp/SMSUtil.java | 10 +++++++++ .../java/com/coderising/ood/ocp/Sender.java | 9 ++++++++ .../com/coderising/ood/ocp/SenderFactory.java | 19 ++++++++++++++++ 13 files changed, 171 insertions(+) create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java new file mode 100644 index 0000000000..0d0d01098f --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class DateUtil { + + public static String getCurrentDateAsString() { + + return null; + } + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java new file mode 100644 index 0000000000..a2c2d82a98 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java @@ -0,0 +1,9 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public interface LogMsgConvert { + String getLogFromMsg(String msg); +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java new file mode 100644 index 0000000000..532dc9a611 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java @@ -0,0 +1,22 @@ +package com.coderising.ood.ocp; + +public class Logger { + + Sender sender; + LogMsgConvert convert; + + public Logger(int logType, int logMethod) { + convert = RawLogFactory.createFormatter(logType); + sender = SenderFactory.createSenderFormat(logMethod); + } + + public void log(String msg) { + sender.send(convert.getLogFromMsg(msg)); + } + + public static void main(String[] args) { + Logger logger = new Logger(1, 3); + logger.log("123"); + } +} + diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java new file mode 100644 index 0000000000..5fa0c23759 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class MailSender implements Sender { + @Override + public void send(String logMsg) { + MailUtil.send(logMsg); + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java new file mode 100644 index 0000000000..59d77649a2 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class MailUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java new file mode 100644 index 0000000000..7e69eb15d9 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class PrintSender implements Sender { + @Override + public void send(String logMsg) { + System.out.println(logMsg); + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java new file mode 100644 index 0000000000..ebcfce56b9 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java @@ -0,0 +1,14 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class RawLog implements LogMsgConvert{ + + @Override + public String getLogFromMsg(String msg) { + String logMsg = msg; + return logMsg; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java new file mode 100644 index 0000000000..c593ae3ace --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java @@ -0,0 +1,17 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class RawLogFactory { + public static LogMsgConvert createFormatter(int type) { + if (type == 1) { + return new RawLog(); + } + if (type == 2) { + return new RawLogWtihDate(); + } + return null; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java new file mode 100644 index 0000000000..a30ad24665 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java @@ -0,0 +1,15 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class RawLogWtihDate implements LogMsgConvert { + + @Override + public String getLogFromMsg(String msg) { + String txtDate = DateUtil.getCurrentDateAsString(); + String logMsg = txtDate + ": " + msg; + return logMsg; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java new file mode 100644 index 0000000000..9a5f4a572a --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class SMSSender implements Sender { + @Override + public void send(String logMsg) { + SMSUtil.send(logMsg); + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java new file mode 100644 index 0000000000..fab4cd01b7 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class SMSUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java new file mode 100644 index 0000000000..7d0c47ed22 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java @@ -0,0 +1,9 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public interface Sender { + void send(String logMsg); +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java new file mode 100644 index 0000000000..32c09afb78 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java @@ -0,0 +1,19 @@ +package com.coderising.ood.ocp; + +/** + * @author nvarchar + * date 2017/6/28 + */ +public class SenderFactory { + + public static Sender createSenderFormat(int method) { + if (method == 1) { + return new MailSender(); + } else if (method == 2) { + return new SMSSender(); + } else if (method == 3) { + return new PrintSender(); + } + return null; + } +} From 171e3488e63d5b48c22639e0a450ab6243b3ae4f Mon Sep 17 00:00:00 2001 From: MIMIEYES Date: Wed, 28 Jun 2017 16:36:35 +0800 Subject: [PATCH 11/26] =?UTF-8?q?UML=E4=BD=9C=E4=B8=9A(dice=20game=20/=20s?= =?UTF-8?q?hopping)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- students/402246209/learning/pom.xml | 20 +++----- .../java/com/mimieye/odd/uml/dice/Dice.java | 37 ++++++++++++++ .../com/mimieye/odd/uml/dice/DiceGame.java | 25 ++++++++++ .../java/com/mimieye/odd/uml/dice/Player.java | 47 ++++++++++++++++++ .../com/mimieye/odd/uml/dice/diceClass.jpg | Bin 0 -> 63872 bytes .../com/mimieye/odd/uml/dice/diceSequence.jpg | Bin 0 -> 35679 bytes .../odd/uml/shopping/shoppingUseCase.jpg | Bin 0 -> 45811 bytes 7 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml index 435c8fd478..8e4668829c 100644 --- a/students/402246209/learning/pom.xml +++ b/students/402246209/learning/pom.xml @@ -40,21 +40,17 @@ - - org.apache.maven.plugins - maven-jar-plugin - 2.6 - - - - com.mimieye.odd.srp.main.PromotionEmailMain - - - - + + + + org.apache.commons + commons-lang3 + 3.5 + + \ No newline at end of file diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java new file mode 100644 index 0000000000..c791c8f900 --- /dev/null +++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java @@ -0,0 +1,37 @@ +package com.mimieye.odd.uml.dice; + +/** + * Created by Pierreluo on 2017/6/27. + */ +public class Dice { + private int[] values; + private int currentValueIndex; + private int capacity; + + public Dice(int capacity) { + this.capacity = capacity; + init(); + } + + private void init() { + this.values = new int[capacity]; + int i = 0; + int judge = capacity - 1; + while(true) { + values[i] = i; + if(i == judge) { + break; + } + i++; + } + this.currentValueIndex = 0; + } + + public int getCurrentValue() { + return values[currentValueIndex]; + } + + public void setCurrentValueIndex(int currentValueIndex) { + this.currentValueIndex = currentValueIndex; + } +} diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java new file mode 100644 index 0000000000..439b5f7c7b --- /dev/null +++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java @@ -0,0 +1,25 @@ +package com.mimieye.odd.uml.dice; + +/** + * Created by Pierreluo on 2017/6/27. + */ +public class DiceGame { + private int winValue; + + public DiceGame(int winValue) { + this.winValue = winValue; + } + + public boolean result(Dice... dices) { + int resultValue = 0; + for(Dice dice : dices) { + resultValue += dice.getCurrentValue(); + } + if(resultValue == winValue) { + return true; + } else { + return false; + } + } + +} diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java new file mode 100644 index 0000000000..e6387788b6 --- /dev/null +++ b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java @@ -0,0 +1,47 @@ +package com.mimieye.odd.uml.dice; + +import org.apache.commons.lang3.RandomUtils; + +/** + * Created by Pierreluo on 2017/6/27. + */ +public class Player { + private Dice[] dices; + private DiceGame diceGame; + + public Player(int diceSize, int diceCapacity, int winValue) { + init(diceSize, diceCapacity, winValue); + } + + private void init(int diceSize, int diceCapacity, int winValue) { + dices = new Dice[diceSize]; + for(int i = 0; i < diceSize; i++) { + dices[i] = new Dice(diceCapacity); + } + diceGame = new DiceGame(winValue); + } + + public boolean play() { + for(Dice dice : dices) { + dice.setCurrentValueIndex(RandomUtils.nextInt(0,6)); + } + return diceGame.result(dices); + } + + public static void main(String[] args) { + Player player = new Player(2, 6, 7); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + System.out.println(player.play()); + } + +} diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg new file mode 100644 index 0000000000000000000000000000000000000000..845c31c1caab3448de599c3ffc5298febc65f5a5 GIT binary patch literal 63872 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 literal 0 HcmV?d00001 diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg new file mode 100644 index 0000000000000000000000000000000000000000..168baadc21ead4f80185cc1a029a54387109affb GIT binary patch literal 35679 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 literal 0 HcmV?d00001 diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg b/students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33e6ac55ae6a6b713da34b1bc975ed2074e517fc GIT binary patch literal 45811 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 Date: Thu, 29 Jun 2017 14:12:16 +0800 Subject: [PATCH 12/26] refactor srp --- .../java/com/coderising/ood/srp/FileUtil.java | 14 +- .../java/com/coderising/ood/srp/Mail.java | 33 +++++ .../com/coderising/ood/srp/MailService.java | 58 ++++---- .../java/com/coderising/ood/srp/MailUtil.java | 14 -- .../java/com/coderising/ood/srp/Product.java | 31 +++++ .../coderising/ood/srp/ProductService.java | 32 +++++ .../com/coderising/ood/srp/PromotionMail.java | 131 ------------------ .../com/coderising/ood/srp/PromotionMain.java | 39 ++++++ .../java/com/coderising/ood/srp/User.java | 27 ++++ .../com/coderising/ood/srp/UserService.java | 15 ++ 10 files changed, 208 insertions(+), 186 deletions(-) create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java delete mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java delete mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java index eeb6d38d46..eb8896e527 100644 --- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java @@ -1,8 +1,6 @@ package com.coderising.ood.srp; -import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; import java.io.IOException; /** @@ -13,16 +11,6 @@ public class FileUtil { protected static String[] readFile(File file) throws IOException // @02C { - BufferedReader br = null; - try { - br = new BufferedReader(new FileReader(file)); - String temp = br.readLine(); - return temp.split(" "); - - } catch (IOException e) { - throw new IOException(e.getMessage()); - } finally { - br.close(); - } + return null; } } diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java new file mode 100644 index 0000000000..9a72ea60d6 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java @@ -0,0 +1,33 @@ +package com.coderising.ood.srp; + +import java.util.List; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class Mail { + private User user; + + public Mail(User u) { + this.user = u; + } + + public String getAddress() { + return user.getEMailAddress(); + } + + public String getSubject() { + return "您关注的产品降价了"; + } + + public String getBody() { + return "尊敬的 " + user.getName() + ", 您关注的产品 " + this.buildProductDescList() + " 降价了,欢迎购买!"; + } + + private String buildProductDescList() { + List products = user.getSubscribedProducts(); + //.... 实现略... + return null; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java index 36195d18ff..3e6788915d 100644 --- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java @@ -1,10 +1,5 @@ package com.coderising.ood.srp; -import java.io.IOException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - /** * 发送邮件 * @@ -12,33 +7,40 @@ * date 2017/6/26 */ public class MailService { - protected static void sendEMails(boolean debug, List mailingList, PromotionMail promotionMail) throws IOException { - - System.out.println("开始发送邮件"); - - if (mailingList != null) { - Iterator iter = mailingList.iterator(); - while (iter.hasNext()) { - promotionMail.configureEMail((HashMap) iter.next()); - try { - if (promotionMail.hasValidToAddress()) - MailUtil.sendEmail(promotionMail, debug); - } catch (Exception e) { - - try { - MailUtil.sendEmail(promotionMail, debug); + private String fromAddress; + private String smtpHost; + private String altSmtpHost; + + public MailService(Configuration config) { + this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + } - } catch (Exception e2) { - System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); - } - } + public void sendMail(Mail mail) { + try { + sendEmail(mail, this.smtpHost); + } catch (Exception e) { + try { + sendEmail(mail, this.altSmtpHost); + } catch (Exception ex) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + ex.getMessage()); } - - } else { - System.out.println("没有邮件发送"); - } + } + private void sendEmail(Mail mail, String smtpHost) { + String toAddress = mail.getAddress(); + String subject = mail.getSubject(); + String msg = mail.getBody(); + //发送邮件 + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(msg).append("\n"); + System.out.println(buffer.toString()); } } diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java deleted file mode 100644 index 16866bf3f7..0000000000 --- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.coderising.ood.srp; - -public class MailUtil { - - public static void sendEmail(PromotionMail promotionMail, boolean debug) { - //假装发了一封邮件 - StringBuilder buffer = new StringBuilder(); - buffer.append("From:").append(promotionMail.fromAddress).append("\n"); - buffer.append("To:").append(promotionMail.toAddress).append("\n"); - buffer.append("Subject:").append(promotionMail.subject).append("\n"); - buffer.append("Content:").append(promotionMail.message).append("\n"); - System.out.println(buffer.toString()); - } -} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java new file mode 100644 index 0000000000..45cd069953 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java @@ -0,0 +1,31 @@ +package com.coderising.ood.srp; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class Product { + private String id; + private String desc; + + public Product(String id, String desc) { + this.id = id; + this.desc = desc; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java new file mode 100644 index 0000000000..b5c801e1a8 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java @@ -0,0 +1,32 @@ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class ProductService { + + public List getProductLists(String filePath) throws IOException { + List products = new ArrayList<>(); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(filePath)); + String temp; + while ((temp = br.readLine()) != null) { + String[] data = temp.split(" "); + products.add(new Product(data[0], data[1])); + } + return products; + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java deleted file mode 100644 index ea151ddfc9..0000000000 --- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.coderising.ood.srp; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; - -public class PromotionMail { - - - protected String sendMailQuery = null; - - - protected String smtpHost = null; - protected String altSmtpHost = null; - protected String fromAddress = null; - protected String toAddress = null; - protected String subject = null; - protected String message = null; - - protected String productID = null; - protected String productDesc = null; - - private static Configuration config; - - - private static final String NAME_KEY = "NAME"; - private static final String EMAIL_KEY = "EMAIL"; - - - public static void main(String[] args) throws Exception { - - File f = new File("/Users/nvarchar/Documents/github/coding2017-2/" + - "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt"); - boolean emailDebug = false; - - PromotionMail pe = new PromotionMail(f); - - MailService.sendEMails(emailDebug, pe.loadMailingList(), pe); - } - - - public PromotionMail(File file) throws Exception { - - //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 - String[] data = FileUtil.readFile(file); - - setProductID(data[0]); - setProductDesc(data[1]); - - config = new Configuration(); - - setSMTPHost(); - - setAltSMTPHost(); - - setFromAddress(); - - setLoadQuery(); - - } - - - protected void setProductID(String productID) { - this.productID = productID; - System.out.println("产品ID = " + productID + "\n"); - } - - protected String getproductID() { - return productID; - } - - protected void setLoadQuery() throws Exception { - - sendMailQuery = "Select name from subscriptions " - + "where product_id= '" + productID + "' " - + "and send_mail=1 "; - - - System.out.println("loadQuery set"); - } - - - protected void setSMTPHost() { - smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); - } - - - protected void setAltSMTPHost() { - altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); - } - - - protected void setFromAddress() { - fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); - } - - protected void setMessage(HashMap userInfo) throws IOException { - - String name = (String) userInfo.get(NAME_KEY); - - subject = "您关注的产品降价了"; - message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; - - } - - private void setProductDesc(String desc) { - this.productDesc = desc; - System.out.println("产品描述 = " + productDesc + "\n"); - } - - - public void configureEMail(HashMap userInfo) throws IOException { - toAddress = (String) userInfo.get(EMAIL_KEY); - if (toAddress.length() > 0) - setMessage(userInfo); - } - - protected boolean hasValidToAddress() { - if (toAddress.length() > 0) { - return true; - } - return false; - } - - protected List loadMailingList() throws Exception { - return DBUtil.query(this.sendMailQuery); - } - - -} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java new file mode 100644 index 0000000000..aea2699c2c --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java @@ -0,0 +1,39 @@ +package com.coderising.ood.srp; + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class PromotionMain { + private ProductService productService = new ProductService(); + private UserService userService = new UserService(); + + public void run(String filepath) throws IOException { + + Configuration cfg = new Configuration(); + + List productList = productService.getProductLists(filepath); + + Set users = new HashSet<>(); + for (Product product : productList) { + List userList = userService.getUsers(product); + //todo 将userlist中的user和对应的product添加到users中 + } + MailService mailService = new MailService(cfg); + for (User user : users) { + mailService.sendMail(new Mail(user)); + } + } + + public static void main(String[] args) throws Exception { + String filePath = "/Users/nvarchar/Documents/github/coding2017-2/" + + "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt"; + PromotionMain main = new PromotionMain(); + main.run(filePath); + } +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java new file mode 100644 index 0000000000..4d2ea42edc --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java @@ -0,0 +1,27 @@ +package com.coderising.ood.srp; + +import java.util.List; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class User { + private String name; + private String emailAddress; + + private List products; + + public String getName() { + return name; + } + + public String getEMailAddress() { + return emailAddress; + } + + public List getSubscribedProducts() { + return this.products; + } + +} diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java new file mode 100644 index 0000000000..3b2e68fb31 --- /dev/null +++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java @@ -0,0 +1,15 @@ +package com.coderising.ood.srp; + +import java.util.List; + +/** + * @author nvarchar + * date 2017/6/29 + */ +public class UserService { + + public List getUsers(Product product){ + //调用DAO相关的类从数据库中读取订阅产品的用户列表 + return null; + } +} From 0ab140ff4026aed00b83f8e6feb32d967dba9c80 Mon Sep 17 00:00:00 2001 From: ThomsonTang Date: Thu, 29 Jun 2017 23:56:24 +0800 Subject: [PATCH 13/26] refactor the promotion email project. --- .../coderising/ood/srp/Email.java} | 8 ++-- .../coderising/ood/srp/Product.java | 2 +- .../coderising/ood/srp/UserInfo.java | 15 +++++++- .../ood/srp/service/EmailService.java | 13 +++++++ .../ood/srp/service}/ProductService.java | 4 +- .../ood/srp/service/UserService.java | 15 ++++++++ .../srp/service/impl/EmailServiceImpl.java | 37 +++++++++++++++++++ .../service/impl}/ProductFileServiceImpl.java | 5 ++- .../ood/srp/service/impl/UserServiceImpl.java | 26 +++++++++++++ 9 files changed, 117 insertions(+), 8 deletions(-) rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp/EmailMessage.java => thomsom/coderising/ood/srp/Email.java} (84%) rename students/395135865/ood/ood-assignment/src/main/java/com/{ => thomsom}/coderising/ood/srp/Product.java (95%) rename students/395135865/ood/ood-assignment/src/main/java/com/{ => thomsom}/coderising/ood/srp/UserInfo.java (73%) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp => thomsom/coderising/ood/srp/service}/ProductService.java (69%) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp => thomsom/coderising/ood/srp/service/impl}/ProductFileServiceImpl.java (88%) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java similarity index 84% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java index 1872552c29..7943a5581a 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java @@ -1,4 +1,4 @@ -package com.coderising.ood.srp; +package com.thomsom.coderising.ood.srp; /** * the email message entity class. @@ -6,16 +6,16 @@ * @author Thomson Tang * @version Created: 23/06/2017. */ -public class EmailMessage { +public class Email { private String fromAddress; private String toAddress; private String subject; private String content; - public EmailMessage() { + public Email() { } - public EmailMessage(String fromAddress, String toAddress, String subject, String content) { + public Email(String fromAddress, String toAddress, String subject, String content) { this.fromAddress = fromAddress; this.toAddress = toAddress; this.subject = subject; diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java similarity index 95% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java index 471863d48e..9fca6b61db 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java @@ -1,4 +1,4 @@ -package com.coderising.ood.srp; +package com.thomsom.coderising.ood.srp; /** * Product entity class. diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java similarity index 73% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java index f680c0ecd8..bf653eb20d 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java @@ -1,4 +1,7 @@ -package com.coderising.ood.srp; +package com.thomsom.coderising.ood.srp; + +import java.util.ArrayList; +import java.util.List; /** * the user info entity class. @@ -11,6 +14,8 @@ public class UserInfo { private String userName; private String email; + List products = new ArrayList<>(); + public UserInfo() { } @@ -43,4 +48,12 @@ public String getEmail() { public void setEmail(String email) { this.email = email; } + + public List getProducts() { + return products; + } + + public void setProducts(List products) { + this.products = products; + } } diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java new file mode 100644 index 0000000000..c6211eb49f --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java @@ -0,0 +1,13 @@ +package com.thomsom.coderising.ood.srp.service; + +import com.thomsom.coderising.ood.srp.Email; + +/** + * + * + * @author Thomson Tang + * @version Created: 29/06/2017. + */ +public interface EmailService { + Email newEmail() throws Exception; +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java similarity index 69% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java index 2cfce64b10..2d4b10e14f 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java @@ -1,4 +1,6 @@ -package com.coderising.ood.srp; +package com.thomsom.coderising.ood.srp.service; + +import com.thomsom.coderising.ood.srp.Product; import java.util.List; diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java new file mode 100644 index 0000000000..5e9716ae6d --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java @@ -0,0 +1,15 @@ +package com.thomsom.coderising.ood.srp.service; + +import com.thomsom.coderising.ood.srp.UserInfo; + +import java.util.List; + +/** + * the user service + * + * @author Thomson Tang + * @version Created: 29/06/2017. + */ +public interface UserService { + List listUser() throws Exception; +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000000..4e5f1a90b4 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java @@ -0,0 +1,37 @@ +package com.thomsom.coderising.ood.srp.service.impl; + +import com.thomsom.coderising.ood.srp.Email; +import com.thomsom.coderising.ood.srp.Product; +import com.thomsom.coderising.ood.srp.UserInfo; +import com.thomsom.coderising.ood.srp.service.EmailService; +import com.thomsom.coderising.ood.srp.service.UserService; + +import java.util.List; + +/** + * 类说明 + * + * @author Thomson Tang + * @version Created: 29/06/2017. + */ +public class EmailServiceImpl implements EmailService { + + private UserService userService; + + @Override + public Email newEmail() throws Exception { + List userInfoList = userService.listUser(); + for (UserInfo userInfo : userInfoList) { + Email email = new Email(); + email.setToAddress(userInfo.getEmail()); + email.setSubject("您关注的产品降价了..."); + email.setContent(""); + } + + return null; + } + + private String generateContent(UserInfo userInfo, Product product) { + return String.format("尊敬的%s,您关注的产品%s降价了,欢迎购买!", userInfo.getUserName(), product.getProductName()); + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java similarity index 88% rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java index 024afaf705..f8625cb2ea 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java @@ -1,4 +1,7 @@ -package com.coderising.ood.srp; +package com.thomsom.coderising.ood.srp.service.impl; + +import com.thomsom.coderising.ood.srp.Product; +import com.thomsom.coderising.ood.srp.service.ProductService; import java.nio.file.Files; import java.nio.file.Path; diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000..56bcb3be6e --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java @@ -0,0 +1,26 @@ +package com.thomsom.coderising.ood.srp.service.impl; + +import com.thomsom.coderising.ood.srp.UserInfo; +import com.thomsom.coderising.ood.srp.service.UserService; + +import java.util.ArrayList; +import java.util.List; + +/** + * the implementation of user service. + * + * @author Thomson Tang + * @version Created: 29/06/2017. + */ +public class UserServiceImpl implements UserService { + + @Override + public List listUser() throws Exception { + List userInfos = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + UserInfo userInfo = new UserInfo(String.valueOf(i), "user" + i, String.format("user%d@qq.com", i)); + userInfos.add(userInfo); + } + return userInfos; + } +} From 2bc74afaa65159a2332859a1d08a253e3df8678b Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 1 Jul 2017 00:28:18 +0800 Subject: [PATCH 14/26] =?UTF-8?q?=E5=8D=95=E4=B8=80=E8=81=8C=E8=B4=A3?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- students/282692248/ood/ood-assignment/pom.xml | 32 +++ .../java/com/coderising/ood/ocp/DateUtil.java | 10 + .../java/com/coderising/ood/ocp/Logger.java | 38 ++++ .../java/com/coderising/ood/ocp/MailUtil.java | 10 + .../java/com/coderising/ood/ocp/SMSUtil.java | 10 + .../coderising/ood/ocp/good/Formatter.java | 7 + .../ood/ocp/good/FormatterFactory.java | 13 ++ .../ood/ocp/good/HtmlFormatter.java | 11 + .../com/coderising/ood/ocp/good/Logger.java | 18 ++ .../coderising/ood/ocp/good/RawFormatter.java | 11 + .../com/coderising/ood/ocp/good/Sender.java | 7 + .../com/coderising/ood/srp/Configuration.java | 23 ++ .../coderising/ood/srp/ConfigurationKeys.java | 9 + .../java/com/coderising/ood/srp/DBUtil.java | 25 +++ .../java/com/coderising/ood/srp/MailUtil.java | 18 ++ .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++ .../ood/srp/chasing/Configuration.java | 23 ++ .../ood/srp/chasing/ConfigurationKeys.java | 9 + .../ood/srp/chasing/PromotionMail.java | 45 ++++ .../ood/srp/chasing/model/Product.java | 27 +++ .../ood/srp/chasing/model/User.java | 25 +++ .../ood/srp/chasing/product_promotion.txt | 4 + .../ood/srp/chasing/service/MailService.java | 62 ++++++ .../srp/chasing/service/ProductService.java | 32 +++ .../srp/chasing/service/PromotionService.java | 18 ++ .../ood/srp/chasing/service/UserService.java | 18 ++ .../ood/srp/chasing/util/DBUtil.java | 21 ++ .../ood/srp/chasing/util/MailUtil.java | 14 ++ .../coderising/ood/srp/product_promotion.txt | 4 + 29 files changed, 743 insertions(+) create mode 100644 students/282692248/ood/ood-assignment/pom.xml create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt diff --git a/students/282692248/ood/ood-assignment/pom.xml b/students/282692248/ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/282692248/ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java new file mode 100644 index 0000000000..b6cf28c096 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class DateUtil { + + public static String getCurrentDateAsString() { + + return null; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java new file mode 100644 index 0000000000..0357c4d912 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java @@ -0,0 +1,38 @@ +package com.coderising.ood.ocp; + +public class Logger { + + public final int RAW_LOG = 1; + public final int RAW_LOG_WITH_DATE = 2; + public final int EMAIL_LOG = 1; + public final int SMS_LOG = 2; + public final int PRINT_LOG = 3; + + int type = 0; + int method = 0; + + public Logger(int logType, int logMethod){ + this.type = logType; + this.method = logMethod; + } + public void log(String msg){ + + String logMsg = msg; + + if(this.type == RAW_LOG){ + logMsg = msg; + } else if(this.type == RAW_LOG_WITH_DATE){ + String txtDate = DateUtil.getCurrentDateAsString(); + logMsg = txtDate + ": " + msg; + } + + if(this.method == EMAIL_LOG){ + MailUtil.send(logMsg); + } else if(this.method == SMS_LOG){ + SMSUtil.send(logMsg); + } else if(this.method == PRINT_LOG){ + System.out.println(logMsg); + } + } +} + diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java new file mode 100644 index 0000000000..ec54b839c5 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class MailUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java new file mode 100644 index 0000000000..13cf802418 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp; + +public class SMSUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java new file mode 100644 index 0000000000..b6e2ccbc16 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java @@ -0,0 +1,7 @@ +package com.coderising.ood.ocp.good; + +public interface Formatter { + + String format(String msg); + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java new file mode 100644 index 0000000000..3c2009a674 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java @@ -0,0 +1,13 @@ +package com.coderising.ood.ocp.good; + +public class FormatterFactory { + public static Formatter createFormatter(int type){ + if(type == 1){ + return new RawFormatter(); + } + if (type == 2){ + return new HtmlFormatter(); + } + return null; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java new file mode 100644 index 0000000000..3d375f5acc --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java @@ -0,0 +1,11 @@ +package com.coderising.ood.ocp.good; + +public class HtmlFormatter implements Formatter { + + @Override + public String format(String msg) { + + return null; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java new file mode 100644 index 0000000000..f206472d0d --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java @@ -0,0 +1,18 @@ +package com.coderising.ood.ocp.good; + +public class Logger { + + private Formatter formatter; + private Sender sender; + + public Logger(Formatter formatter,Sender sender){ + this.formatter = formatter; + this.sender = sender; + } + public void log(String msg){ + sender.send(formatter.format(msg)) ; + } + + +} + diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java new file mode 100644 index 0000000000..7f1cb4ae30 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java @@ -0,0 +1,11 @@ +package com.coderising.ood.ocp.good; + +public class RawFormatter implements Formatter { + + @Override + public String format(String msg) { + + return null; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java new file mode 100644 index 0000000000..aaa46c1fb7 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java @@ -0,0 +1,7 @@ +package com.coderising.ood.ocp.good; + +public interface Sender { + + void send(String msg); + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..f328c1816a --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..9f9e749af7 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,18 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost, + boolean debug) { + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + + } + + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..402c4f6f97 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,199 @@ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class PromotionMail { + + + protected String sendMailQuery = null; + + + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String fromAddress = null; + protected String toAddress = null; + protected String subject = null; + protected String message = null; + + protected String productID = null; + protected String productDesc = null; + + private static Configuration config; + + + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + + public static void main(String[] args) throws Exception { + + File f = new File("D:\\jp\\study\\coding2017-master\\students\\282692248\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt"); + boolean emailDebug = false; + + PromotionMail pe = new PromotionMail(f, emailDebug); + + } + + + public PromotionMail(File file, boolean mailDebug) throws Exception { + + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + readFile(file); + + + config = new Configuration(); + + setSMTPHost(); + setAltSMTPHost(); + + + setFromAddress(); + + + setLoadQuery(); + + sendEMails(mailDebug, loadMailingList()); + + + } + + + + + protected void setProductID(String productID) + { + this.productID = productID; + + } + + protected String getproductID() + { + return productID; + } + + protected void setLoadQuery() throws Exception { + + sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID +"' " + + "and send_mail=1 "; + + + System.out.println("loadQuery set"); + } + + + protected void setSMTPHost() + { + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + + protected void setAltSMTPHost() + { + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + + } + + + protected void setFromAddress() + { + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + protected void setMessage(HashMap userInfo) throws IOException + { + + String name = (String) userInfo.get(NAME_KEY); + + subject = "您关注的产品降价了"; + message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ; + + + + } + + + protected void readFile(File file) throws IOException // @02C + { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + String[] data = temp.split(" "); + + setProductID(data[0]); + setProductDesc(data[1]); + + System.out.println("产品ID = " + productID + "\n"); + System.out.println("产品描述 = " + productDesc + "\n"); + + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } + + private void setProductDesc(String desc) { + this.productDesc = desc; + } + + + protected void configureEMail(HashMap userInfo) throws IOException + { + toAddress = (String) userInfo.get(EMAIL_KEY); + if (toAddress.length() > 0) + setMessage(userInfo); + } + + protected List loadMailingList() throws Exception { + return DBUtil.query(this.sendMailQuery); + } + + + protected void sendEMails(boolean debug, List mailingList) throws IOException + { + + System.out.println("开始发送邮件"); + + + if (mailingList != null) { + Iterator iter = mailingList.iterator(); + while (iter.hasNext()) { + configureEMail((HashMap) iter.next()); + try + { + if (toAddress.length() > 0) + MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug); + } + catch (Exception e) + { + + try { + MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); + + } catch (Exception e2) + { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + + } + + else { + System.out.println("没有邮件发送"); + + } + + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java new file mode 100644 index 0000000000..a34fd144aa --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp.chasing; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java new file mode 100644 index 0000000000..9d0f0caa1b --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp.chasing; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java new file mode 100644 index 0000000000..8008f6b11b --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java @@ -0,0 +1,45 @@ +package com.coderising.ood.srp.chasing; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import com.coderising.ood.srp.chasing.model.Product; +import com.coderising.ood.srp.chasing.model.User; +import com.coderising.ood.srp.chasing.service.MailService; +import com.coderising.ood.srp.chasing.service.ProductService; +import com.coderising.ood.srp.chasing.service.PromotionService; +import com.coderising.ood.srp.chasing.service.UserService; + +public class PromotionMail { + private MailService mailServer = new MailService(new Configuration());; + private ProductService productService = null; + private UserService userService = new UserService(); + private PromotionService promptService = new PromotionService(); + + public static void main(String[] args) throws Exception { + File f = new File("D:\\coding2017\\students\\282692248\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\chasing\\product_promotion.txt"); + PromotionMail pe = new PromotionMail(f); + pe.sendPromptMails(); + } + + public PromotionMail(File file){ + productService = new ProductService(file); + } + + /** 主要业务逻辑:发送促销信息 */ + protected void sendPromptMails() throws IOException { + System.out.println("开始发送邮件"); + Product product = productService.loadProduct(); + List users = userService.loadUserByProduct(product); + if (users != null) { + for(User user:users){ + mailServer.sendMail(user.getEmail(), promptService.getPromptProfile(), + promptService.buildPromptMessageForUser(product, user)); + } + } + else { + System.out.println("没有邮件发送"); + } + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java new file mode 100644 index 0000000000..a4843a26c6 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java @@ -0,0 +1,27 @@ +package com.coderising.ood.srp.chasing.model; + +public class Product { + protected String productID = null; + protected String productDesc = null; + + public Product() {} + + public Product(String productID, String productDesc) { + super(); + this.productID = productID; + this.productDesc = productDesc; + } + + public String getProductID() { + return productID; + } + public void setProductID(String productID) { + this.productID = productID; + } + public String getProductDesc() { + return productDesc; + } + public void setProductDesc(String productDesc) { + this.productDesc = productDesc; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java new file mode 100644 index 0000000000..aed750d6ce --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp.chasing.model; + +public class User { + private String name; + private String email; + + public User(String name, String email) { + super(); + this.name = name; + this.email = email; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java new file mode 100644 index 0000000000..957eac2928 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java @@ -0,0 +1,62 @@ +package com.coderising.ood.srp.chasing.service; + +import com.coderising.ood.srp.chasing.Configuration; +import com.coderising.ood.srp.chasing.ConfigurationKeys; +import com.coderising.ood.srp.chasing.util.MailUtil; + +public class MailService { + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String systemAddress = null; + + public MailService(Configuration config){ + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + systemAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + /** + * 发送邮件 + * @param toAddress 收信人 + * @param subject 主题 + * @param message 正文 + */ + public void sendMail(String toAddress, String subject, String message){ + if(toAddress == null || toAddress.length() <= 0){ + return; + } + try{ + MailUtil.sendEmail(toAddress, systemAddress, subject, message, smtpHost); + }catch(Exception e){ + try{ + MailUtil.sendEmail(toAddress, systemAddress, subject, message, altSmtpHost); + }catch(Exception e2){ + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + public String getSmtpHost() { + return smtpHost; + } + + public void setSmtpHost(String smtpHost) { + this.smtpHost = smtpHost; + } + + public String getAltSmtpHost() { + return altSmtpHost; + } + + public void setAltSmtpHost(String altSmtpHost) { + this.altSmtpHost = altSmtpHost; + } + + public String getFromAddress() { + return systemAddress; + } + + public void setFromAddress(String fromAddress) { + this.systemAddress = fromAddress; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java new file mode 100644 index 0000000000..00e55a806b --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java @@ -0,0 +1,32 @@ +package com.coderising.ood.srp.chasing.service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import com.coderising.ood.srp.chasing.model.Product; + +public class ProductService { + File f; + public ProductService(File f){ + this.f = f; + } + /** 获取促销商品 */ + public Product loadProduct() throws IOException // @02C + { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(f)); + String temp = br.readLine(); + String[] data = temp.split(" "); + System.out.println("产品ID = " + data[0] + "\n"); + System.out.println("产品描述 = " + data[1] + "\n"); + return new Product(data[0], data[1]); + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java new file mode 100644 index 0000000000..a4f3aa0a12 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java @@ -0,0 +1,18 @@ +package com.coderising.ood.srp.chasing.service; + +import java.io.IOException; + +import com.coderising.ood.srp.chasing.model.Product; +import com.coderising.ood.srp.chasing.model.User; + +public class PromotionService { + /** 促销信息概要 */ + public String getPromptProfile(){ + return "您关注的产品降价了"; + } + + /** 为指定用户生成促销信息 */ + public String buildPromptMessageForUser(Product product, User userInfo) throws IOException { + return "尊敬的 "+userInfo.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!" ; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java new file mode 100644 index 0000000000..ccc8a44b31 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java @@ -0,0 +1,18 @@ +package com.coderising.ood.srp.chasing.service; + +import java.util.List; + +import com.coderising.ood.srp.chasing.model.Product; +import com.coderising.ood.srp.chasing.model.User; +import com.coderising.ood.srp.chasing.util.DBUtil; + +public class UserService { + /** 获取关注指定商品的用户 */ + public List loadUserByProduct(Product product){ + String sql = "Select name from subscriptions " + + "where product_id= '" + product.getProductID() +"' " + + "and send_mail=1 "; + System.out.println("loadQuery set"); + return DBUtil.query(sql); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java new file mode 100644 index 0000000000..a1f5faf1f4 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java @@ -0,0 +1,21 @@ +package com.coderising.ood.srp.chasing.util; +import java.util.ArrayList; +import java.util.List; + +import com.coderising.ood.srp.chasing.model.User; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + List userList = new ArrayList<>(); + for (int i = 1; i <= 3; i++) { + userList.add(new User("User" + i,"aa@bb.com")); + } + return userList; + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java new file mode 100644 index 0000000000..6bc230b7bb --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java @@ -0,0 +1,14 @@ +package com.coderising.ood.srp.chasing.util; + +public class MailUtil { + + public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost) { + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + } +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file From 52f16e2338e7d7d5787bb7eb51c32530d2491740 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 1 Jul 2017 09:39:08 +0800 Subject: [PATCH 15/26] =?UTF-8?q?=E5=BC=80=E9=97=AD=E5=8E=9F=E5=88=99?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/ood/ocp/chasing/DateUtil.java | 10 ++++++++++ .../coderising/ood/ocp/chasing/Logger.java | 19 +++++++++++++++++++ .../coderising/ood/ocp/chasing/MailUtil.java | 10 ++++++++++ .../coderising/ood/ocp/chasing/SMSUtil.java | 10 ++++++++++ .../ocp/chasing/formatter/ILogFormatter.java | 5 +++++ .../formatter/LogWithDateFormatter.java | 12 ++++++++++++ .../ood/ocp/chasing/formatter/RawLog.java | 10 ++++++++++ .../ood/ocp/chasing/sender/ILogSender.java | 5 +++++ .../ood/ocp/chasing/sender/MailSender.java | 12 ++++++++++++ .../ood/ocp/chasing/sender/SMSSender.java | 10 ++++++++++ .../ood/ocp/chasing/sender/StdoutSender.java | 12 ++++++++++++ 11 files changed, 115 insertions(+) create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java new file mode 100644 index 0000000000..7d0b475c45 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp.chasing; + +public class DateUtil { + + public static String getCurrentDateAsString() { + + return null; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java new file mode 100644 index 0000000000..9ee56868e2 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java @@ -0,0 +1,19 @@ +package com.coderising.ood.ocp.chasing; + +import com.coderising.ood.ocp.chasing.formatter.ILogFormatter; +import com.coderising.ood.ocp.chasing.sender.ILogSender; + +public class Logger { + + private ILogFormatter formatter; + private ILogSender sender; + + public Logger(ILogFormatter formatter, ILogSender sender){ + this.formatter = formatter; + this.sender = sender; + } + public void log(String msg){ + sender.send(formatter.format(msg)); + } +} + diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java new file mode 100644 index 0000000000..3ebf73ec62 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp.chasing; + +public class MailUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java new file mode 100644 index 0000000000..5f649d963b --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp.chasing; + +public class SMSUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java new file mode 100644 index 0000000000..0c713dde7d --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java @@ -0,0 +1,5 @@ +package com.coderising.ood.ocp.chasing.formatter; + +public interface ILogFormatter { + String format(String txt); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java new file mode 100644 index 0000000000..fb9555db9a --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp.chasing.formatter; + +import com.coderising.ood.ocp.chasing.DateUtil; + +public class LogWithDateFormatter implements ILogFormatter { + + @Override + public String format(String txt) { + return DateUtil.getCurrentDateAsString() + ": " + txt; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java new file mode 100644 index 0000000000..fdf2008c54 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp.chasing.formatter; + +public class RawLog implements ILogFormatter { + + @Override + public String format(String txt) { + return txt; + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java new file mode 100644 index 0000000000..339584d6e4 --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java @@ -0,0 +1,5 @@ +package com.coderising.ood.ocp.chasing.sender; + +public interface ILogSender { + void send(String msg); +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java new file mode 100644 index 0000000000..37652883ae --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp.chasing.sender; + +import com.coderising.ood.ocp.chasing.MailUtil; + +public class MailSender implements ILogSender { + + @Override + public void send(String msg) { + MailUtil.send(msg); + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java new file mode 100644 index 0000000000..2c7f92bf3b --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java @@ -0,0 +1,10 @@ +package com.coderising.ood.ocp.chasing.sender; + +public class SMSSender implements ILogSender { + + @Override + public void send(String msg) { + System.out.println(msg); + } + +} diff --git a/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java new file mode 100644 index 0000000000..7e10d45b4f --- /dev/null +++ b/students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java @@ -0,0 +1,12 @@ +package com.coderising.ood.ocp.chasing.sender; + +import com.coderising.ood.ocp.chasing.SMSUtil; + +public class StdoutSender implements ILogSender { + + @Override + public void send(String msg) { + SMSUtil.send(msg); + } + +} From 8d716de2496be733e19e6fb4107003cbf5c5740d Mon Sep 17 00:00:00 2001 From: ThomsonTang Date: Sun, 2 Jul 2017 18:31:11 +0800 Subject: [PATCH 16/26] refactor the promotion email project. --- .../coderising/ood/srp/PromotionTask.java | 24 +++++++++++++ .../ood/srp/service/EmailService.java | 19 ++++++++-- .../ood/srp/service/MailSender.java | 20 +++++++++++ .../ood/srp/service/ProductService.java | 16 ++++++++- .../srp/service/impl/EmailServiceImpl.java | 32 ++++++++++++----- .../ood/srp/service/impl/MailSenderImpl.java | 35 +++++++++++++++++++ .../service/impl/ProductFileServiceImpl.java | 5 +++ 7 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java new file mode 100644 index 0000000000..91fd78926a --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java @@ -0,0 +1,24 @@ +package com.thomsom.coderising.ood.srp; + +import com.thomsom.coderising.ood.srp.service.EmailService; +import com.thomsom.coderising.ood.srp.service.impl.EmailServiceImpl; + +import java.util.List; + +/** + * 应用场景类: 促销任务 + * + * @author Thomson Tang + * @version Created: 02/07/2017. + */ +public class PromotionTask { + public static void main(String[] args) { + try { + EmailService emailService = new EmailServiceImpl(); + List emails = emailService.createEmails(); + emailService.sendEmails(emails); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java index c6211eb49f..d922b9fe0f 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java @@ -2,12 +2,27 @@ import com.thomsom.coderising.ood.srp.Email; +import java.util.List; + /** - * + * 邮件服务 * * @author Thomson Tang * @version Created: 29/06/2017. */ public interface EmailService { - Email newEmail() throws Exception; + /** + * 创建要发送的邮件,相当于写邮件 + * + * @return 返回若干邮件 + * @throws Exception if error + */ + List createEmails() throws Exception; + + /** + * 发送邮件 + * @param emails 要发送的邮件 + * @throws Exception if error occurs + */ + void sendEmails(List emails) throws Exception; } diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java new file mode 100644 index 0000000000..163db708e7 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java @@ -0,0 +1,20 @@ +package com.thomsom.coderising.ood.srp.service; + +import com.thomsom.coderising.ood.srp.Email; + +import java.util.List; + +/** + * 邮件发送服务 + * + * @author Thomson Tang + * @version Created: 30/06/2017. + */ +public interface MailSender { + + String getSenderAddress(); + + String getSmtpHost(); + + void sendMail(List emails); +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java index 2d4b10e14f..da39ee967e 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java @@ -5,11 +5,25 @@ import java.util.List; /** - * the business service of product. + * 商品业务逻辑接口 * * @author Thomson Tang * @version Created: 23/06/2017. */ public interface ProductService { + /** + * 查询所有的商品 + * + * @return 商品列表 + * @throws Exception if error + */ List listProduct() throws Exception; + + /** + * 根据用户查询该用户关注的商品 + * + * @param userId 用户标示符 + * @return 用户关注的商品 + */ + List listSubscriptProduct(String userId); } diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java index 4e5f1a90b4..4906b714e3 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java @@ -3,13 +3,16 @@ import com.thomsom.coderising.ood.srp.Email; import com.thomsom.coderising.ood.srp.Product; import com.thomsom.coderising.ood.srp.UserInfo; +import com.thomsom.coderising.ood.srp.service.MailSender; import com.thomsom.coderising.ood.srp.service.EmailService; +import com.thomsom.coderising.ood.srp.service.ProductService; import com.thomsom.coderising.ood.srp.service.UserService; +import java.util.ArrayList; import java.util.List; /** - * 类说明 + * 邮件服务的实现类 * * @author Thomson Tang * @version Created: 29/06/2017. @@ -17,21 +20,34 @@ public class EmailServiceImpl implements EmailService { private UserService userService; + private ProductService productService; + private MailSender mailSender; @Override - public Email newEmail() throws Exception { + public List createEmails() throws Exception { + List emailList = new ArrayList<>(); List userInfoList = userService.listUser(); - for (UserInfo userInfo : userInfoList) { + userInfoList.forEach(userInfo -> { Email email = new Email(); email.setToAddress(userInfo.getEmail()); email.setSubject("您关注的产品降价了..."); - email.setContent(""); - } + productService.listSubscriptProduct(userInfo.getUserId()); + email.setContent(buildContent(userInfo)); + emailList.add(email); + }); - return null; + return emailList; } - private String generateContent(UserInfo userInfo, Product product) { - return String.format("尊敬的%s,您关注的产品%s降价了,欢迎购买!", userInfo.getUserName(), product.getProductName()); + @Override + public void sendEmails(List emails) throws Exception { + mailSender.sendMail(emails); + } + + private String buildContent(UserInfo userInfo) { + List products = productService.listSubscriptProduct(userInfo.getUserId()); + StringBuilder allProduct = new StringBuilder(); + products.stream().forEach(product -> allProduct.append(product).append(",")); + return String.format("尊敬的%s,您关注的产品%s降价了,欢迎购买!", userInfo.getUserName(), allProduct.toString()); } } diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java new file mode 100644 index 0000000000..741f4e2b08 --- /dev/null +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java @@ -0,0 +1,35 @@ +package com.thomsom.coderising.ood.srp.service.impl; + +import com.coderising.ood.srp.Configuration; +import com.coderising.ood.srp.ConfigurationKeys; +import com.thomsom.coderising.ood.srp.Email; +import com.thomsom.coderising.ood.srp.service.MailSender; + +import java.util.List; + +/** + * 发送邮件的实现类 + * + * @author Thomson Tang + * @version Created: 01/07/2017. + */ +public class MailSenderImpl implements MailSender { + + private Configuration configuration; + + @Override + public String getSenderAddress() { + return configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + @Override + public String getSmtpHost() { + return configuration.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + @Override + public void sendMail(List emails) { + //模拟发送邮件 + emails.forEach(email -> email.setFromAddress(getSenderAddress())); + } +} diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java index f8625cb2ea..1434d92967 100644 --- a/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java +++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java @@ -32,6 +32,11 @@ public List listProduct() throws Exception { return products; } + @Override + public List listSubscriptProduct(String userId) { + return null; + } + private Product resolveProduct(String line) { String[] items = line.split(" "); if (items.length > 2) { From f69a583f4fa55f4bbc4562d0dff86db9a387056a Mon Sep 17 00:00:00 2001 From: LiuWen Date: Sun, 2 Jul 2017 21:49:48 +0800 Subject: [PATCH 17/26] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1srp=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- students/2756638003/srp/pom.xml | 32 +++++ .../com/coderising/ood/srp/PromotionMail.java | 131 ++++++++++++++++++ .../ood/srp/conf/Configuration.java | 29 ++++ .../ood/srp/conf/ConfigurationKeys.java | 9 ++ .../coderising/ood/srp/conf/EmailStatus.java | 31 +++++ .../ood/srp/conf/product_promotion.txt | 4 + .../coderising/ood/srp/domain/Product.java | 43 ++++++ .../coderising/ood/srp/domain/Subscriber.java | 74 ++++++++++ .../coderising/ood/srp/util/ConfigUtil.java | 33 +++++ .../com/coderising/ood/srp/util/DBUtil.java | 25 ++++ .../com/coderising/ood/srp/util/Email.java | 75 ++++++++++ .../com/coderising/ood/srp/util/MailUtil.java | 17 +++ .../ood/srp/util/SubscriberUtil.java | 17 +++ 13 files changed, 520 insertions(+) create mode 100644 students/2756638003/srp/pom.xml create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java diff --git a/students/2756638003/srp/pom.xml b/students/2756638003/srp/pom.xml new file mode 100644 index 0000000000..5024466d17 --- /dev/null +++ b/students/2756638003/srp/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ds-assignment + 0.0.1-SNAPSHOT + jar + + ds-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..6f743552bb --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,131 @@ +package com.coderising.ood.srp; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import com.coderising.ood.srp.conf.Configuration; +import com.coderising.ood.srp.conf.ConfigurationKeys; +import com.coderising.ood.srp.conf.EmailStatus; +import com.coderising.ood.srp.domain.Product; +import com.coderising.ood.srp.domain.Subscriber; +import com.coderising.ood.srp.util.ConfigUtil; +import com.coderising.ood.srp.util.Email; +import com.coderising.ood.srp.util.MailUtil; +import com.coderising.ood.srp.util.SubscriberUtil; + +public class PromotionMail { + + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String fromAddress = null; + + private static Configuration config; + + public static void main(String[] args) throws Exception { + File file = new File("XX/product_promotion.txt"); + boolean emailDebug = false; + new PromotionMail(file, emailDebug); + } + + /** + * 从配置文件中读取商品信息 + */ + private List loadFile(File file) throws IOException { + Map conf = ConfigUtil.readTextFile(file); + List productList = new ArrayList(16); + Set> entrySet = conf.entrySet(); + for (Entry entry : entrySet) { + productList.add(new Product(entry.getKey(), entry.getValue())); + } + return productList; + } + + /** + * 根据商品查询订阅的用户信息 + */ + private List querySubscribersFormFile(List productList) + throws IOException { + StringBuilder query = new StringBuilder( + "Select name from Subscriber where product_id in( "); + for (int i = 0, len = productList.size(); i < len - 1; i++) { + query.append(productList.get(i).getProductID() + " ,"); + } + query.append(productList.get(productList.size() - 1).getProductID()); + query.append(") and send_mail = ?"); + return SubscriberUtil.loadSubscriberList(query.toString(), + EmailStatus.READY); + } + + /** + * 根据订阅者信息生成邮件 + */ + private Email generatorEmail(Subscriber subscriber, String host) { + String subject = "您关注的产品降价了"; + String message = "尊敬的 " + subscriber.getName() + ", 您关注的产品 " + + subscriber.getProduct().getProductDesc() + " 降价了,欢迎购买!"; + return new Email(subscriber.getEmail(), fromAddress, subject, message, + host); + } + + public PromotionMail(File file, boolean mailDebug) throws Exception { + config = new Configuration(); + setSMTPHost(); + setAltSMTPHost(); + setFromAddress(); + // 从配置文件中读取商品信息 + List productList = loadFile(file); + // 根据商品查询订阅的用户信息 + List subscriberList = querySubscribersFormFile(productList); + // 发送邮件 + sendEMails(mailDebug, subscriberList); + } + + /** + * 发送邮件 + */ + protected void sendEMails(boolean debug, List subscriberList) + throws IOException { + System.out.println("开始发送邮件"); + if (subscriberList != null && subscriberList.size() > 0) { + Iterator iter = subscriberList.iterator(); + Subscriber subscriber = null; + + while (iter.hasNext()) { + subscriber = iter.next(); + try { + MailUtil.sendEmail(generatorEmail(subscriber, smtpHost), + debug); + } catch (Exception e) { + try { + MailUtil.sendEmail( + generatorEmail(subscriber, altSmtpHost), debug); + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + + e2.getMessage()); + } + } + } + } else { + System.out.println("没有邮件发送"); + } + } + + protected void setSMTPHost() { + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + protected void setAltSMTPHost() { + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + } + + protected void setFromAddress() { + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java new file mode 100644 index 0000000000..444e4cf912 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java @@ -0,0 +1,29 @@ +package com.coderising.ood.srp.conf; + +import java.util.HashMap; +import java.util.Map; + +/** + * 邮件服务器配置文件 + */ +public class Configuration { + + static Map configurations = new HashMap<>(); + + static { + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * + * @param key + * @return + */ + public String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java new file mode 100644 index 0000000000..36009abc3d --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp.conf; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java new file mode 100644 index 0000000000..3245a8d468 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java @@ -0,0 +1,31 @@ +package com.coderising.ood.srp.conf; + +/** + * 邮件发送状态常量 + */ +public enum EmailStatus { + /** + * 未发送 + */ + READY(0), + /** + * 已发送 + */ + SEND(1), + /** + * 已查阅 + */ + RECEIVED(2), + /** + * 被退回 + */ + REJECTED(3); + + @SuppressWarnings("unused") + private int value; + + private EmailStatus(int value) { + this.value = value; + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt new file mode 100644 index 0000000000..a98917f829 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo R15 +P4955 Vivo X20 \ No newline at end of file diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java new file mode 100644 index 0000000000..52656e0389 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java @@ -0,0 +1,43 @@ +package com.coderising.ood.srp.domain; + +/** + * 商品类 + */ +public class Product { + + private String productID; + private String productDesc; + + public Product(String productID, String productDesc) { + super(); + this.productID = productID; + this.productDesc = productDesc; + } + + public Product() { + super(); + } + + public String getProductID() { + return productID; + } + + public void setProductID(String productID) { + this.productID = productID; + } + + public String getProductDesc() { + return productDesc; + } + + public void setProductDesc(String productDesc) { + this.productDesc = productDesc; + } + + @Override + public String toString() { + return "Product [productID=" + productID + ", productDesc=" + + productDesc + "]"; + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java new file mode 100644 index 0000000000..cdef11498f --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java @@ -0,0 +1,74 @@ +package com.coderising.ood.srp.domain; + +/** + * 订阅者 + */ +public class Subscriber { + + private String subscriberId; + private String name; + private String email; + private Product product; + private Integer sendStatus; + + public Subscriber(String subscriberId, String name, String email, + Product product) { + super(); + this.subscriberId = subscriberId; + this.name = name; + this.email = email; + this.product = product; + } + + public Subscriber() { + super(); + } + + public String getSubscriberId() { + return subscriberId; + } + + public void setSubscriberId(String subscriberId) { + this.subscriberId = subscriberId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Product getProduct() { + return product; + } + + public void setProduct(Product product) { + this.product = product; + } + + public Integer getSendStatus() { + return sendStatus; + } + + public void setSendStatus(Integer sendStatus) { + this.sendStatus = sendStatus; + } + + @Override + public String toString() { + return "Subscriber [subscriberId=" + subscriberId + ", name=" + name + + ", email=" + email + ", product=" + product + ", sendStatus=" + + sendStatus + "]"; + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java new file mode 100644 index 0000000000..4494739dd6 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java @@ -0,0 +1,33 @@ +package com.coderising.ood.srp.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * 配置文件读写工具类 + * + */ +public class ConfigUtil { + + public static Map readTextFile(File file) + throws IOException { + Map conf = new HashMap(); + try (BufferedReader br = new BufferedReader(new FileReader(file));) { + String temp = null; + while ((temp = br.readLine()) != null) { + int indexOf = temp.indexOf(' '); + if (indexOf > -1) { + conf.put(temp.substring(0, indexOf), + temp.substring(indexOf)); + } + } + } catch (IOException e) { + throw new IOException(e.getMessage()); + } + return conf; + } +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java new file mode 100644 index 0000000000..a4facaff0b --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp.util; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.ood.srp.domain.Product; +import com.coderising.ood.srp.domain.Subscriber; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * + * @param sql + * @return + */ + public static List query(String sql, Object... args) { + List list = new ArrayList(16); + for (int i = 1; i <= 3; i++) { + list.add(new Subscriber(String.valueOf(i), "User" + i, "user-" + i + + "@bb.com", new Product("P8756", " iPhone8"))); + } + return list; + } +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java new file mode 100644 index 0000000000..3422aebb2a --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java @@ -0,0 +1,75 @@ +package com.coderising.ood.srp.util; + +/** + * 邮件类 + */ +public class Email { + + private String toAddress; + private String fromAddress; + private String subject; + private String message; + private String smtpHost; + + public Email(String toAddress, String fromAddress, String subject, + String message, String smtpHost) { + super(); + this.toAddress = toAddress; + this.fromAddress = fromAddress; + this.subject = subject; + this.message = message; + this.smtpHost = smtpHost; + } + + public Email() { + super(); + } + + public String getToAddress() { + return toAddress; + } + + public void setToAddress(String toAddress) { + this.toAddress = toAddress; + } + + public String getFromAddress() { + return fromAddress; + } + + public void setFromAddress(String fromAddress) { + this.fromAddress = fromAddress; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getSmtpHost() { + return smtpHost; + } + + public void setSmtpHost(String smtpHost) { + this.smtpHost = smtpHost; + } + + @Override + public String toString() { + return "Email [toAddress=" + toAddress + ", fromAddress=" + fromAddress + + ", subject=" + subject + ", message=" + message + + ", smtpHost=" + smtpHost + "]"; + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java new file mode 100644 index 0000000000..7994870bef --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java @@ -0,0 +1,17 @@ +package com.coderising.ood.srp.util; + +/** + * 邮件发送工具类 + */ +public class MailUtil { + public static void sendEmail(Email email, boolean debug) { + // 假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(email.getFromAddress()).append("\n"); + buffer.append("To:").append(email.getToAddress()).append("\n"); + buffer.append("Subject:").append(email.getSubject()).append("\n"); + buffer.append("Content:").append(email.getMessage()).append("\n"); + System.out.println(buffer.toString()); + } + +} diff --git a/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java new file mode 100644 index 0000000000..2410a45950 --- /dev/null +++ b/students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java @@ -0,0 +1,17 @@ +package com.coderising.ood.srp.util; + +import java.util.List; + +import com.coderising.ood.srp.domain.Subscriber; + +/** + * 订阅者查询工具类 + */ +public class SubscriberUtil { + + public static List loadSubscriberList(String sql, + Object... args) { + return DBUtil.query(sql); + } + +} From 431217dc60fc052eaa600f6ff75a8b213df4104f Mon Sep 17 00:00:00 2001 From: Vito Date: Sun, 2 Jul 2017 22:49:38 +0800 Subject: [PATCH 18/26] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../729693763/1.ood/ood-assignment/pom.xml | 32 ++++++ .../com/coderising/ood/srp/Configuration.java | 23 ++++ .../coderising/ood/srp/ConfigurationKeys.java | 9 ++ .../java/com/coderising/ood/srp/DBUtil.java | 25 ++++ .../java/com/coderising/ood/srp/FileUtil.java | 64 +++++++++++ .../java/com/coderising/ood/srp/MailUtil.java | 48 ++++++++ .../com/coderising/ood/srp/PromotionMail.java | 108 ++++++++++++++++++ .../com/coderising/ood/srp/ServerDAO.java | 31 +++++ .../coderising/ood/srp/product_promotion.txt | 4 + 9 files changed, 344 insertions(+) create mode 100644 students/729693763/1.ood/ood-assignment/pom.xml create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt diff --git a/students/729693763/1.ood/ood-assignment/pom.xml b/students/729693763/1.ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..f328c1816a --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.coderising.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java new file mode 100644 index 0000000000..a02504fd05 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java @@ -0,0 +1,64 @@ + +package com.coderising.ood.srp; +/** + * @author 作者 Denny + * @date 创建时间:Jun 25, 2017 10:27:58 AM + * @version 1.0 + * @parameter + * @since + * @return */ + +import java.util.List; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedList; + +public class FileUtil { + + /** + * 根据文件路径获取文件,如果文件不存在,抛出异常 + * @param fileName + * @return + * @throws FileNotFoundException + */ + public static File readFile(String fileName) throws FileNotFoundException{ + File file = new File(fileName); + if(!file.exists()){ + throw new FileNotFoundException(); + } + return file; + } + + public static List parseToString(File file, String regex) { + List list = new ArrayList(); + BufferedReader bf= null; + try { + if(file != null && file.exists( )){ + bf = new BufferedReader(new FileReader(file)); + String temp = null; + while ((temp = bf.readLine()) != null) { + String[] strs = temp.split(regex); + list.add(strs); + } + } + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + }finally { + if(bf != null){ + try { + bf.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + return list; + } + +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..3c367759c4 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,48 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + + /** + * 邮件单元是需要管理邮件的,包括发送到哪,端口主机等等 + */ + private static String fromAddress = ""; + private static String smtpHost = ""; + private static String altSmtpHost = ""; + + + private static Configuration config = new Configuration(); + + public static void ConfigureEmail() { + altSmtpHost = (String) config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + fromAddress = (String) config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + smtpHost = (String) config.getProperty(ConfigurationKeys.SMTP_SERVER); + + } + + + public static void sendEmail(String toAddress,String subject,String message) { + ConfigureEmail(); + //假装发了一封邮件 + try{ + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + } catch (Exception e) { + try { + System.out.println("备用SMTP服务器: "); + MailUtil.sendEmail(toAddress, subject, message); + + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + + + } + + +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..902b6ff341 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,108 @@ +package com.coderising.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class PromotionMail { + + protected String subject = null; + protected String message = null; + + private static List products = new ArrayList(); + + private static String filePath = "/Users/vi/Desktop/ood/ood-assignment/bin/src/main/java/com/coderising/ood/srp/product_promotion.txt"; + + private static ServerDAO server = new ServerDAO(); + + public static void main(String[] args) throws Exception { + + File f = new File(filePath); + boolean emailDebug = false; + + PromotionMail pe = new PromotionMail(f); + for (String[] data : products) { + List> list = pe.loadMailingList(data[0]); + if (list != null && list.size() > 0) { + pe.sendEMails(list, data[1]); + } + } + + + + } + + /** + * 构造器,初始化应该加载商品的详细信息。 + * @param file + * @throws IOException + */ + public PromotionMail(File file) throws IOException { + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + readFile(file); + } + +// /** +// * 促销邮件; +// * @param file +// * @param mailDebug +// * @throws Exception +// */ +// public PromotionMail(File file, boolean mailDebug) throws Exception { +// +// setLoadQuery(); +// +// sendEMails(mailDebug, loadMailingList()); +// } +// + + protected void setMessage(String name, String productDesc) throws IOException { + this.subject = "您关注的产品降价了"; + this.message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; + } + + protected void readFile(File file) throws IOException // @02C + { + List list = FileUtil.parseToString(file, " "); + if(list != null && !list.isEmpty()){ + products = list; + for (String[] data: products) { + System.out.println("产品ID = " + data[0] + "\n"); + System.out.println("产品描述 = " + data[1] + "\n"); + } + } + } + + + + protected List loadMailingList(String productID) throws Exception { + return server.getList(productID); + } + + + protected void sendEMails(List> mailingList,String productDesc) throws IOException + { + System.out.println("开始发送邮件"); + + if (mailingList != null) { + Iterator> iter = mailingList.iterator(); + while (iter.hasNext()) { + Map map = iter.next(); + String toAddress = (String) map.get("EMAIL"); + String name = (String) map.get("NAME"); + setMessage(name, productDesc); + if (toAddress != null && toAddress.length() > 0) + MailUtil.sendEmail(toAddress, subject, message); + } + } else { + System.out.println("没有邮件发送"); + } + } +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java new file mode 100644 index 0000000000..30a4c5bdde --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java @@ -0,0 +1,31 @@ + +package com.coderising.ood.srp; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author 作者 Denny + * @date 创建时间:Jun 25, 2017 2:20:04 PM + * @version 1.0 + * @parameter + * @since + * @return */ +public class ServerDAO { + public List> getList(String productID) { + // TODO Auto-generated method stub + List> list = new ArrayList>(); + String sql = "Select name from subscriptions " + "where product_id= '" + productID + "' " + + "and send_mail=1 "; + + System.out.println("loadQuery set"); + try { + list = DBUtil.query(sql); + } catch (Exception e) { + e.printStackTrace(); + } + + return list; + } +} diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file From 616cf8d9aee4a04c13015f5c6b25e5e9c0662519 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Tue, 4 Jul 2017 09:29:39 +0800 Subject: [PATCH 19/26] payroll --- .../com/coderising/payroll/Affiliation.java | 5 +++ .../java/com/coderising/payroll/Employee.java | 42 +++++++++++++++++++ .../java/com/coderising/payroll/Paycheck.java | 35 ++++++++++++++++ .../payroll/PaymentClassification.java | 5 +++ .../com/coderising/payroll/PaymentMethod.java | 5 +++ .../coderising/payroll/PaymentSchedule.java | 8 ++++ .../com/coderising/payroll/SalesReceipt.java | 14 +++++++ .../java/com/coderising/payroll/TimeCard.java | 15 +++++++ 8 files changed, 129 insertions(+) create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java new file mode 100644 index 0000000000..091165a2af --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface Affiliation { + public double calculateDeductions(Paycheck pc); +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java new file mode 100644 index 0000000000..923297c91a --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java @@ -0,0 +1,42 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class Employee { + String id; + String name; + String address; + Affiliation affiliation; + + + PaymentClassification classification; + PaymentSchedule schedule; + PaymentMethod paymentMethod; + + public Employee(String name, String address){ + this.name = name; + this.address = address; + } + public boolean isPayDay(Date d) { + return false; + } + + public Date getPayPeriodStartDate(Date d) { + return null; + } + + public void payDay(Paycheck pc){ + + } + + public void setClassification(PaymentClassification classification) { + this.classification = classification; + } + public void setSchedule(PaymentSchedule schedule) { + this.schedule = schedule; + } + public void setPaymentMethod(PaymentMethod paymentMethod) { + this.paymentMethod = paymentMethod; + } +} + diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java new file mode 100644 index 0000000000..802c8b5c45 --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java @@ -0,0 +1,35 @@ +package com.coderising.payroll; + +import java.util.Date; +import java.util.Map; + +public class Paycheck { + private Date payPeriodStart; + private Date payPeriodEnd; + private double grossPay; + private double netPay; + private double deductions; + + public Paycheck(Date payPeriodStart, Date payPeriodEnd){ + this.payPeriodStart = payPeriodStart; + this.payPeriodEnd = payPeriodEnd; + } + public void setGrossPay(double grossPay) { + this.grossPay = grossPay; + + } + public void setDeductions(double deductions) { + this.deductions = deductions; + } + public void setNetPay(double netPay){ + this.netPay = netPay; + } + public Date getPayPeriodEndDate() { + + return this.payPeriodEnd; + } + public Date getPayPeriodStartDate() { + + return this.payPeriodStart; + } +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java new file mode 100644 index 0000000000..f2bf2e26e9 --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface PaymentClassification { + public double calculatePay(Paycheck pc); +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java new file mode 100644 index 0000000000..5e549916b6 --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java @@ -0,0 +1,5 @@ +package com.coderising.payroll; + +public interface PaymentMethod { + public void pay(Paycheck pc); +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java new file mode 100644 index 0000000000..500d72404d --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java @@ -0,0 +1,8 @@ +package com.coderising.payroll; + +import java.util.Date; + +public interface PaymentSchedule { + public boolean isPayDate(Date date); + public Date getPayPeriodStartDate( Date payPeriodEndDate); +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java new file mode 100644 index 0000000000..fcd3b506fc --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java @@ -0,0 +1,14 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class SalesReceipt { + private Date saleDate; + private double amount; + public Date getSaleDate() { + return saleDate; + } + public double getAmount() { + return amount; + } +} diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java new file mode 100644 index 0000000000..735cc17ac1 --- /dev/null +++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java @@ -0,0 +1,15 @@ +package com.coderising.payroll; + +import java.util.Date; + +public class TimeCard { + private Date date; + private int hours; + + public Date getDate() { + return date; + } + public int getHours() { + return hours; + } +} From 16fbe95c285389186e80c67668cae8593a3027d7 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 16:49:30 +0800 Subject: [PATCH 20/26] desktop commit commit from github desktop first! --- .../coding2017/basic/ood/ocp/DateUtil.java | 10 + .../coding2017/basic/ood/ocp/Logger.java | 38 ++++ .../coding2017/basic/ood/ocp/MailUtil.java | 10 + .../coding2017/basic/ood/ocp/SMSUtil.java | 10 + .../basic/ood/ocp/good/Formatter.java | 7 + .../basic/ood/ocp/good/FormatterFactory.java | 13 ++ .../basic/ood/ocp/good/HtmlFormatter.java | 11 + .../coding2017/basic/ood/ocp/good/Logger.java | 18 ++ .../basic/ood/ocp/good/RawFormatter.java | 11 + .../coding2017/basic/ood/ocp/good/Sender.java | 7 + .../basic/ood/payroll/Affiliation.java | 5 + .../basic/ood/payroll/Employee.java | 42 ++++ .../basic/ood/payroll/Paycheck.java | 35 +++ .../ood/payroll/PaymentClassification.java | 5 + .../basic/ood/payroll/PaymentMethod.java | 5 + .../basic/ood/payroll/PaymentSchedule.java | 8 + .../basic/ood/payroll/SalesReceipt.java | 14 ++ .../basic/ood/payroll/TimeCard.java | 15 ++ .../basic/ood/srp/Configuration.java | 23 ++ .../basic/ood/srp/ConfigurationKeys.java | 9 + .../coding2017/basic/ood/srp/DBUtil.java | 25 +++ .../coding2017/basic/ood/srp/MailUtil.java | 18 ++ .../basic/ood/srp/PromotionMail.java | 199 ++++++++++++++++++ .../srp/good/template/MailBodyTemplate.java | 5 + .../good/template/TextMailBodyTemplate.java | 19 ++ .../basic/ood/srp/good1/Configuration.java | 23 ++ .../ood/srp/good1/ConfigurationKeys.java | 9 + .../coding2017/basic/ood/srp/good1/Mail.java | 27 +++ .../basic/ood/srp/good1/MailSender.java | 35 +++ .../basic/ood/srp/good1/Product.java | 14 ++ .../basic/ood/srp/good1/ProductService.java | 9 + .../basic/ood/srp/good1/PromotionJob.java | 24 +++ .../coding2017/basic/ood/srp/good1/User.java | 24 +++ .../basic/ood/srp/good1/UserService.java | 11 + .../basic/ood/srp/good2/ProductService.java | 12 ++ .../basic/ood/srp/good2/UserService.java | 13 ++ .../basic/ood/srp/product_promotion.txt | 4 + 37 files changed, 767 insertions(+) create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java new file mode 100644 index 0000000000..df610e556d --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java @@ -0,0 +1,10 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class DateUtil { + + public static String getCurrentDateAsString() { + + return null; + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java new file mode 100644 index 0000000000..34907a0ed9 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java @@ -0,0 +1,38 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class Logger { + + public final int RAW_LOG = 1; + public final int RAW_LOG_WITH_DATE = 2; + public final int EMAIL_LOG = 1; + public final int SMS_LOG = 2; + public final int PRINT_LOG = 3; + + int type = 0; + int method = 0; + + public Logger(int logType, int logMethod){ + this.type = logType; + this.method = logMethod; + } + public void log(String msg){ + + String logMsg = msg; + + if(this.type == RAW_LOG){ + logMsg = msg; + } else if(this.type == RAW_LOG_WITH_DATE){ + String txtDate = DateUtil.getCurrentDateAsString(); + logMsg = txtDate + ": " + msg; + } + + if(this.method == EMAIL_LOG){ + MailUtil.send(logMsg); + } else if(this.method == SMS_LOG){ + SMSUtil.send(logMsg); + } else if(this.method == PRINT_LOG){ + System.out.println(logMsg); + } + } +} + diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java new file mode 100644 index 0000000000..d2b51e3abd --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java @@ -0,0 +1,10 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class MailUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java new file mode 100644 index 0000000000..b499c47efb --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java @@ -0,0 +1,10 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class SMSUtil { + + public static void send(String logMsg) { + // TODO Auto-generated method stub + + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java new file mode 100644 index 0000000000..642fbb35d6 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java @@ -0,0 +1,7 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public interface Formatter { + + String format(String msg); + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java new file mode 100644 index 0000000000..e0542f7be6 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java @@ -0,0 +1,13 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public class FormatterFactory { + public static Formatter createFormatter(int type){ + if(type == 1){ + return new RawFormatter(); + } + if (type == 2){ + return new HtmlFormatter(); + } + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java new file mode 100644 index 0000000000..d901191524 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java @@ -0,0 +1,11 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public class HtmlFormatter implements Formatter { + + @Override + public String format(String msg) { + + return null; + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java new file mode 100644 index 0000000000..8b0dce72b6 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java @@ -0,0 +1,18 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public class Logger { + + private Formatter formatter; + private Sender sender; + + public Logger(Formatter formatter,Sender sender){ + this.formatter = formatter; + this.sender = sender; + } + public void log(String msg){ + sender.send(formatter.format(msg)) ; + } + + +} + diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java new file mode 100644 index 0000000000..ecc8daff9e --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java @@ -0,0 +1,11 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public class RawFormatter implements Formatter { + + @Override + public String format(String msg) { + + return null; + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java new file mode 100644 index 0000000000..407ac9f2c2 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java @@ -0,0 +1,7 @@ +package com.github.wluqing.coding2017.basic.ood.ocp.good; + +public interface Sender { + + void send(String msg); + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java new file mode 100644 index 0000000000..587ce68f29 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java @@ -0,0 +1,5 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +public interface Affiliation { + public double calculateDeductions(Paycheck pc); +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java new file mode 100644 index 0000000000..8c7ee3a469 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java @@ -0,0 +1,42 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +import java.util.Date; + +public class Employee { + String id; + String name; + String address; + Affiliation affiliation; + + + PaymentClassification classification; + PaymentSchedule schedule; + PaymentMethod paymentMethod; + + public Employee(String name, String address){ + this.name = name; + this.address = address; + } + public boolean isPayDay(Date d) { + return false; + } + + public Date getPayPeriodStartDate(Date d) { + return null; + } + + public void payDay(Paycheck pc){ + + } + + public void setClassification(PaymentClassification classification) { + this.classification = classification; + } + public void setSchedule(PaymentSchedule schedule) { + this.schedule = schedule; + } + public void setPaymentMethod(PaymentMethod paymentMethod) { + this.paymentMethod = paymentMethod; + } +} + diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java new file mode 100644 index 0000000000..c6ed31d5e3 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java @@ -0,0 +1,35 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +import java.util.Date; +import java.util.Map; + +public class Paycheck { + private Date payPeriodStart; + private Date payPeriodEnd; + private double grossPay; + private double netPay; + private double deductions; + + public Paycheck(Date payPeriodStart, Date payPeriodEnd){ + this.payPeriodStart = payPeriodStart; + this.payPeriodEnd = payPeriodEnd; + } + public void setGrossPay(double grossPay) { + this.grossPay = grossPay; + + } + public void setDeductions(double deductions) { + this.deductions = deductions; + } + public void setNetPay(double netPay){ + this.netPay = netPay; + } + public Date getPayPeriodEndDate() { + + return this.payPeriodEnd; + } + public Date getPayPeriodStartDate() { + + return this.payPeriodStart; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java new file mode 100644 index 0000000000..af249d9557 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java @@ -0,0 +1,5 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +public interface PaymentClassification { + public double calculatePay(Paycheck pc); +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java new file mode 100644 index 0000000000..9b25d28fed --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java @@ -0,0 +1,5 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +public interface PaymentMethod { + public void pay(Paycheck pc); +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java new file mode 100644 index 0000000000..63791efbb8 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java @@ -0,0 +1,8 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +import java.util.Date; + +public interface PaymentSchedule { + public boolean isPayDate(Date date); + public Date getPayPeriodStartDate( Date payPeriodEndDate); +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java new file mode 100644 index 0000000000..79c0d8882b --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java @@ -0,0 +1,14 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +import java.util.Date; + +public class SalesReceipt { + private Date saleDate; + private double amount; + public Date getSaleDate() { + return saleDate; + } + public double getAmount() { + return amount; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java new file mode 100644 index 0000000000..7860212a4d --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java @@ -0,0 +1,15 @@ +package com.github.wluqing.coding2017.basic.ood.payroll; + +import java.util.Date; + +public class TimeCard { + private Date date; + private int hours; + + public Date getDate() { + return date; + } + public int getHours() { + return hours; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java new file mode 100644 index 0000000000..d431224c09 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.github.wluqing.coding2017.basic.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..87749f5066 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.github.wluqing.coding2017.basic.ood.srp; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java new file mode 100644 index 0000000000..d4df5ad069 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java @@ -0,0 +1,25 @@ +package com.github.wluqing.coding2017.basic.ood.srp; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List query(String sql){ + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java new file mode 100644 index 0000000000..82c1a3279a --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java @@ -0,0 +1,18 @@ +package com.github.wluqing.coding2017.basic.ood.srp; + +public class MailUtil { + + public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost, + boolean debug) { + //假装发了一封邮件 + StringBuilder buffer = new StringBuilder(); + buffer.append("From:").append(fromAddress).append("\n"); + buffer.append("To:").append(toAddress).append("\n"); + buffer.append("Subject:").append(subject).append("\n"); + buffer.append("Content:").append(message).append("\n"); + System.out.println(buffer.toString()); + + } + + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..0dba90c8ec --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java @@ -0,0 +1,199 @@ +package com.github.wluqing.coding2017.basic.ood.srp; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class PromotionMail { + + + protected String sendMailQuery = null; + + + protected String smtpHost = null; + protected String altSmtpHost = null; + protected String fromAddress = null; + protected String toAddress = null; + protected String subject = null; + protected String message = null; + + protected String productID = null; + protected String productDesc = null; + + private static Configuration config; + + + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + + public static void main(String[] args) throws Exception { + + File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt"); + boolean emailDebug = false; + + PromotionMail pe = new PromotionMail(f, emailDebug); + + } + + + public PromotionMail(File file, boolean mailDebug) throws Exception { + + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + readFile(file); + + + config = new Configuration(); + + setSMTPHost(); + setAltSMTPHost(); + + + setFromAddress(); + + + setLoadQuery(); + + sendEMails(mailDebug, loadMailingList()); + + + } + + + + + protected void setProductID(String productID) + { + this.productID = productID; + + } + + protected String getproductID() + { + return productID; + } + + protected void setLoadQuery() throws Exception { + + sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID +"' " + + "and send_mail=1 "; + + + System.out.println("loadQuery set"); + } + + + protected void setSMTPHost() + { + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + } + + + protected void setAltSMTPHost() + { + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + + } + + + protected void setFromAddress() + { + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + } + + protected void setMessage(HashMap userInfo) throws IOException + { + + String name = (String) userInfo.get(NAME_KEY); + + subject = "您关注的产品降价了"; + message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ; + + + + } + + + protected void readFile(File file) throws IOException // @02C + { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + String[] data = temp.split(" "); + + setProductID(data[0]); + setProductDesc(data[1]); + + System.out.println("产品ID = " + productID + "\n"); + System.out.println("产品描述 = " + productDesc + "\n"); + + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + } + + private void setProductDesc(String desc) { + this.productDesc = desc; + } + + + protected void configureEMail(HashMap userInfo) throws IOException + { + toAddress = (String) userInfo.get(EMAIL_KEY); + if (toAddress.length() > 0) + setMessage(userInfo); + } + + protected List loadMailingList() throws Exception { + return DBUtil.query(this.sendMailQuery); + } + + + protected void sendEMails(boolean debug, List mailingList) throws IOException + { + + System.out.println("开始发送邮件"); + + + if (mailingList != null) { + Iterator iter = mailingList.iterator(); + while (iter.hasNext()) { + configureEMail((HashMap) iter.next()); + try + { + if (toAddress.length() > 0) + MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug); + } + catch (Exception e) + { + + try { + MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); + + } catch (Exception e2) + { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + + + } + + else { + System.out.println("没有邮件发送"); + + } + + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java new file mode 100644 index 0000000000..87ef5a8c8b --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java @@ -0,0 +1,5 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good.template; + +public interface MailBodyTemplate { + public String render(); +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java new file mode 100644 index 0000000000..e515229473 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java @@ -0,0 +1,19 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good.template; + +import java.util.Map; + +public class TextMailBodyTemplate implements MailBodyTemplate { + + private MapparamMap ; + + public TextMailBodyTemplate(Map map){ + paramMap = map; + } + + @Override + public String render() { + //使用某种模板技术实现Render + return null; + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java new file mode 100644 index 0000000000..71a78aae1e --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java @@ -0,0 +1,23 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java new file mode 100644 index 0000000000..928978a1b8 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +public class ConfigurationKeys { + + public static final String SMTP_SERVER = "smtp.server"; + public static final String ALT_SMTP_SERVER = "alt.smtp.server"; + public static final String EMAIL_ADMIN = "email.admin"; + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java new file mode 100644 index 0000000000..3d10b3d64a --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java @@ -0,0 +1,27 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +import java.util.List; + +public class Mail { + + private User user; + + public Mail(User u){ + this.user = u; + } + public String getAddress(){ + return user.getEMailAddress(); + } + public String getSubject(){ + return "您关注的产品降价了"; + } + public String getBody(){ + + return "尊敬的 "+user.getName()+", 您关注的产品 " + this.buildProductDescList() + " 降价了,欢迎购买!" ; + } + private String buildProductDescList() { + List products = user.getSubscribedProducts(); + //.... 实现略... + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java new file mode 100644 index 0000000000..02487cbbd9 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java @@ -0,0 +1,35 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +public class MailSender { + + private String fromAddress ; + private String smtpHost; + private String altSmtpHost; + + public MailSender(Configuration config){ + this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + } + + public void sendMail(Mail mail){ + try{ + sendEmail(mail,this.smtpHost); + }catch(Exception e){ + try{ + sendEmail(mail,this.altSmtpHost); + }catch (Exception ex){ + System.out.println("通过备用 SMTP服务器发送邮件失败: " + ex.getMessage()); + } + + } + } + + private void sendEmail(Mail mail, String smtpHost){ + + String toAddress = mail.getAddress(); + String subject = mail.getSubject(); + String msg = mail.getBody(); + //发送邮件 + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java new file mode 100644 index 0000000000..1f19b2fe65 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java @@ -0,0 +1,14 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + + + +public class Product { + + private String id; + private String desc; + public String getDescription(){ + return desc; + } + + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java new file mode 100644 index 0000000000..0b3e061f51 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java @@ -0,0 +1,9 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + + +public class ProductService { + public Product getPromotionProduct(){ + //从文本文件中读取文件列表 + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java new file mode 100644 index 0000000000..4dbe9fdd29 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java @@ -0,0 +1,24 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +import java.util.List; + +public class PromotionJob { + + private ProductService productService = null ; //获取production service + private UserService userService = null ;// 获取UserService + + public void run(){ + + Configuration cfg = new Configuration(); + + Product p = productService.getPromotionProduct(); + + List users = userService.getUsers(p); + + MailSender mailSender = new MailSender(cfg); + + for(User user : users){ + mailSender.sendMail(new Mail(user)); + } + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java new file mode 100644 index 0000000000..b5193a4755 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java @@ -0,0 +1,24 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +import java.util.List; + + + +public class User { + + private String name; + private String emailAddress; + + private List subscribedProducts; + + public String getName(){ + return name; + } + public String getEMailAddress() { + return emailAddress; + } + public List getSubscribedProducts(){ + return this.subscribedProducts; + } + +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java new file mode 100644 index 0000000000..aaa6a58a0d --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java @@ -0,0 +1,11 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good1; + +import java.util.List; + +public class UserService { + + public List getUsers(Product product){ + //调用DAO相关的类从数据库中读取订阅产品的用户列表 + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java new file mode 100644 index 0000000000..c5439cac5e --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java @@ -0,0 +1,12 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good2; + +import java.util.List; + +import com.github.wluqing.coding2017.basic.ood.srp.good1.Product; + +public class ProductService { + public List getPromotionProducts(){ + //从文本文件中读取文件列表 + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java new file mode 100644 index 0000000000..7813fb663c --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java @@ -0,0 +1,13 @@ +package com.github.wluqing.coding2017.basic.ood.srp.good2; + +import java.util.List; + +import com.github.wluqing.coding2017.basic.ood.srp.good1.Product; +import com.github.wluqing.coding2017.basic.ood.srp.good1.User; + +public class UserService { + public List getUsers(List products){ + //调用DAO相关的类从数据库中读取订阅产品的用户列表 + return null; + } +} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt @@ -0,0 +1,4 @@ +P8756 iPhone8 +P3946 XiaoMi10 +P8904 Oppo_R15 +P4955 Vivo_X20 \ No newline at end of file From 731e7e1e7a357e275b3ff9389508dc93234ce65a Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:28:01 +0800 Subject: [PATCH 21/26] commit test --- .../coding2017/basic/ood/ocp/DateUtil.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java index df610e556d..6693aa91b3 100644 --- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java @@ -1,10 +1,11 @@ -package com.github.wluqing.coding2017.basic.ood.ocp; - -public class DateUtil { - - public static String getCurrentDateAsString() { - - return null; - } - -} +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class DateUtil { + + public static String getCurrentDateAsString() { + + return null; + } + +} +//commit test \ No newline at end of file From f20bea2809f823671694bb20eb39ab27a157132f Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:29:53 +0800 Subject: [PATCH 22/26] commit test2 --- .../com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java index 6693aa91b3..bbbb4aef06 100644 --- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java @@ -3,7 +3,7 @@ public class DateUtil { public static String getCurrentDateAsString() { - + // commit test return null; } From f03f7ba8d9382e290a4c97a8c43fc115f1dc3e12 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:30:31 +0800 Subject: [PATCH 23/26] commit test undo --- .../github/wluqing/coding2017/basic/ood/ocp/DateUtil.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java index bbbb4aef06..8defe31480 100644 --- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java @@ -1,11 +1,10 @@ package com.github.wluqing.coding2017.basic.ood.ocp; public class DateUtil { - + public static String getCurrentDateAsString() { - // commit test + return null; } } -//commit test \ No newline at end of file From 9c5a25dc366e37d4d40d8e80c5c95e9581dccc1f Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:33:54 +0800 Subject: [PATCH 24/26] commit test --- .../wluqing/coding2017/basic/ood/ocp/CommitTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java new file mode 100644 index 0000000000..6734e098e9 --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java @@ -0,0 +1,8 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class CommitTest { + + public static void main(String[] args) { + System.out.println("commit test"); + } +} From 048230a67e32d373a7b11afec0a4ad10829fc240 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:35:23 +0800 Subject: [PATCH 25/26] commit and push test --- .../wluqing/coding2017/basic/ood/ocp/CommitTest2.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java new file mode 100644 index 0000000000..79dc87ed0e --- /dev/null +++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java @@ -0,0 +1,8 @@ +package com.github.wluqing.coding2017.basic.ood.ocp; + +public class CommitTest2 { + + public static void main(String[] args) { + System.out.println("commit and push test"); + } +} From fd74ffc69eea0b8d31867f8ea5911cb2e64301c6 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 5 Jul 2017 17:37:08 +0800 Subject: [PATCH 26/26] undo commit --- .../wluqing/coding2017/basic/ood/ocp/CommitTest.java | 8 -------- .../wluqing/coding2017/basic/ood/ocp/CommitTest2.java | 8 -------- 2 files changed, 16 deletions(-) delete mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java delete mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java deleted file mode 100644 index 6734e098e9..0000000000 --- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.wluqing.coding2017.basic.ood.ocp; - -public class CommitTest { - - public static void main(String[] args) { - System.out.println("commit test"); - } -} diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java deleted file mode 100644 index 79dc87ed0e..0000000000 --- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.wluqing.coding2017.basic.ood.ocp; - -public class CommitTest2 { - - public static void main(String[] args) { - System.out.println("commit and push test"); - } -}