diff --git a/.gitignore b/.gitignore
index f1e9957cf..fa9bcb882 100644
--- a/.gitignore
+++ b/.gitignore
@@ -280,6 +280,23 @@ target
 liuxin/.DS_Store
 liuxin/src/.DS_Store
 
+students/1005475328/*
+students/1329920463/*
+students/1452302762/*
+students/14703250/*
+students/2842295913/*
+students/383117348/*
+students/404481481/*
+students/406400373/*
+students/549739951/*
+students/582161208/*
+students/592146505/*
+students/740707954/*
+students/844620174/*
+students/87049319/*
+students/183549495/*
+
+
 
 
 
diff --git a/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
index 590e60306..3da4625fa 100644
--- a/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
+++ b/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -104,5 +104,7 @@ public void testIsValid() {
 	public void testGetNodesBetween(){
 		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
 		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
+		numbers = this.tree.getNodesBetween(1,  8);
+		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 8]",numbers.toString());
 	}
 }
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..0d0d01098
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..aca173e66
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 000000000..59d77649a
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 000000000..fab4cd01b
--- /dev/null
+++ b/liuxin/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/1049843090/ood/build.gradle b/students/1049843090/ood/build.gradle
new file mode 100644
index 000000000..adca958b3
--- /dev/null
+++ b/students/1049843090/ood/build.gradle
@@ -0,0 +1,28 @@
+group 'com.yangdd'
+version '1.0-SNAPSHOT'
+description = '面向对象设计'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenLocal()
+    mavenCentral()
+}
+
+//项目布局，下面是Java plugin的默认布局
+sourceSets {
+    main.java.srcDir('src/main/java')
+    main.resources.srcDir('src/main/resources')
+    test.java.srcDir('src/test/java')
+    test.resources.srcDir('src/test/resources')
+}
+
+dependencies {
+    testCompile('junit:junit:4.12')
+}
+
+tasks.withType(JavaCompile) {
+    options.encoding = 'UTF-8'
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/settings.gradle b/students/1049843090/ood/settings.gradle
new file mode 100644
index 000000000..4ffc61b06
--- /dev/null
+++ b/students/1049843090/ood/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = 'ood'
+
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..70759b547
--- /dev/null
+++ b/students/1049843090/ood/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<String,String> 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);
+	}
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..c57f37c4c
--- /dev/null
+++ b/students/1049843090/ood/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";
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..27b3f180a
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+
+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;
+    }
+
+
+    public static List<UserInfo> querySubscriber(String productId) {
+
+        List<UserInfo> list = new ArrayList<>();
+
+        Random random = new Random();
+        int number = random.nextInt(3);
+
+        for (int i = 1; i <= number; i++) {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setName("User" + productId + i);
+            userInfo.setMail(userInfo.getName() + "@" + productId + ".com");
+            list.add(userInfo);
+        }
+        return list;
+    }
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java
new file mode 100644
index 000000000..6bcf25cc9
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java
@@ -0,0 +1,73 @@
+package com.coderising.ood.srp;
+
+/**
+ * 邮件数据
+ *
+ * @author yangdd
+ */
+public class MailData {
+
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+    private boolean debug;
+
+    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 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() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public boolean isDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9948734ff
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,45 @@
+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());
+
+    }
+
+
+    public static void sendEmail(MailData mailData) {
+        //假装发了一封邮件
+        try {
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("Smtp:").append(mailData.getSmtpHost()).append("\n");
+            buffer.append("From:").append(mailData.getFromAddress()).append("\n");
+            buffer.append("To:").append(mailData.getToAddress()).append("\n");
+            buffer.append("Subject:").append(mailData.getSubject()).append("\n");
+            buffer.append("Content:").append(mailData.getMessage()).append("\n");
+            System.out.println(buffer.toString());
+        } catch (Exception e) {
+            try {
+                StringBuilder buffer = new StringBuilder();
+                buffer.append("Smtp:").append(mailData.getAltSmtpHost()).append("\n");
+                buffer.append("From:").append(mailData.getFromAddress()).append("\n");
+                buffer.append("To:").append(mailData.getToAddress()).append("\n");
+                buffer.append("Subject:").append(mailData.getSubject()).append("\n");
+                buffer.append("Content:").append(mailData.getMessage()).append("\n");
+                System.out.println(buffer.toString());
+            } catch (Exception e1) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e1.getMessage());
+            }
+        }
+
+
+    }
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 000000000..c699da54a
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * 产品信息
+ *
+ * @author yangdd
+ */
+public class ProductInfo {
+
+    private String id;
+
+    private String description;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java
new file mode 100644
index 000000000..5f91b05c3
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yangdd
+ */
+public class ProductInfoService {
+
+    public List<ProductInfo> getPromotionProducts() {
+        List<ProductInfo> list = new ArrayList<>();
+        //可以抽取出一个读取文件的Util
+        BufferedReader br = null;
+        try {
+            String path = "/Users/yangdd/Documents/code/GitHub/coding2017-Q2/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+            File file = new File(path);
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            String[] data = null;
+            while ((temp = br.readLine()) != null) {
+                data = temp.split(" ");
+                ProductInfo productInfo = new ProductInfo();
+                productInfo.setId(data[0]);
+                productInfo.setDescription(data[1]);
+                list.add(productInfo);
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return list;
+    }
+
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..d8accbd79
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,58 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class PromotionMail {
+
+
+    public static void main(String[] args) throws Exception {
+        new PromotionMail().sendEMails();
+
+    }
+
+
+    private void setMessage(ProductInfo productInfo, UserInfo userInfo, MailData mailData) {
+
+
+        mailData.setSubject("您关注的产品降价了");
+        String message = "尊敬的 " + userInfo.getName() + ", 您关注的产品 " + productInfo.getDescription() + " 降价了，欢迎购买!";
+        mailData.setMessage(message);
+
+    }
+
+
+    private void sendEMails() throws Exception {
+        ProductInfoService productInfoService = new ProductInfoService();
+        UserInfoService userInfoService = new UserInfoService();
+        List<ProductInfo> productInfos = productInfoService.getPromotionProducts();
+
+        System.out.println("开始发送邮件");
+        MailData mailData = getMailData();
+        productInfos.forEach(e -> {
+            List<UserInfo> userInfos = userInfoService.getuserInfoByProduceId(e.getId());
+            userInfos.forEach(userInfo -> {
+                if (userInfo.getMail().length() > 0) {
+                    mailData.setToAddress(userInfo.getMail());
+                    setMessage(e, userInfo, mailData);
+                    MailUtil.sendEmail(mailData);
+                } else {
+                    System.out.println(userInfo.getName() + "邮件格式不正确");
+                }
+
+            });
+        });
+
+
+    }
+
+
+    private MailData getMailData() {
+        Configuration config = new Configuration();
+        MailData mailData = new MailData();
+        mailData.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        mailData.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+        mailData.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        return mailData;
+    }
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 000000000..98b04b338
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp;
+
+/**
+ * 用户信息
+ *
+ * @author yangdd
+ */
+public class UserInfo {
+
+    private String name;
+
+    private String mail;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMail() {
+        return mail;
+    }
+
+    public void setMail(String mail) {
+        this.mail = mail;
+    }
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java
new file mode 100644
index 000000000..d320d4149
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * @author yangdd
+ */
+public class UserInfoService {
+
+    public List<UserInfo> getuserInfoByProduceId(String productId) {
+        return DBUtil.querySubscriber(productId);
+    }
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1049843090/ood/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/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java b/students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f1fe384d9
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class Configuration {
+	
+	public static final String SMTP_SERVER = "smtp.163.com";
+	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+	public static final String EMAIL_ADMIN = "admin@company.com";
+	public static final String PRODUCTS_FILE_PATH = "D:\\workspace\\design-pattern\\newMail\\src\\com\\coderising\\ood\\srp\\product_promotion.txt";
+	
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/DBUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..ec4dd0fdd
--- /dev/null
+++ b/students/1058267830/newMail/src/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;
+
+@SuppressWarnings("all")
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> queryUserList(String sql){
+		
+		List<User> userList = new ArrayList();
+		
+		for (int i = 1; i <= 3; i++) {
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..77f769982
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailUtil {
+	
+	public static void sendEmail(List<Product> products, List<User> users){
+		
+		for(Product p : products){
+			for(User u : users){
+				sendEmailToUser(p, u);
+			}
+		}
+		
+	}
+
+	private static void sendEmailToUser(Product product, User user) {
+
+		String message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+		
+		String fromAddress = Configuration.EMAIL_ADMIN;
+		String subject = "您关注的产品降价了";
+		String smtpHost = Configuration.SMTP_SERVER;
+		String altSmtpHost = Configuration.ALT_SMTP_SERVER;
+		
+		try{
+			_sendEmailReal(user.getEmail(), fromAddress, subject, message, smtpHost, false);
+		}catch(Exception e){
+			_sendEmailReal(user.getEmail(), fromAddress, subject, message, altSmtpHost, false);
+		}
+		
+	}
+	
+	private static void _sendEmailReal(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/1058267830/newMail/src/com/coderising/ood/srp/Product.java b/students/1058267830/newMail/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..4712c8f0f
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String productId;
+	private String productDesc;
+	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/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java
new file mode 100644
index 000000000..d49f51dc5
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+@SuppressWarnings("all")
+public class ProductUtil {
+	/**
+	 * 得到促销产品列表,至于从哪里读取，由该方法内部决定，外部不需要知道
+	 * @throws IOException 
+	 */
+	public static List<Product> getProducts() throws IOException{
+		return readFile(new File(Configuration.PRODUCTS_FILE_PATH));
+	}
+
+	private static List<Product> readFile(File file) throws IOException {
+		List<Product> products = new ArrayList<Product>();
+		FileInputStream fis = new FileInputStream(file);
+		BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
+		for( String line = br.readLine(); line != null; line = br.readLine() ){
+			Product product = new Product(line.split(" ")[0], line.split(" ")[1]);
+			products.add(product);
+		}
+		
+		return products;
+		
+	}
+		
+}	
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java b/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..0f6baa324
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMail {
+
+	public static void main(String[] args) {
+		
+		/**
+		 * 整体步骤大概有3步：
+		 * 1、读取配置文件，得到促销的商品列表
+		 * 2、调用DBUtil读取DB，得到订阅的用户列表
+		 * 3、调用MailUtil发送邮件
+		 */
+		List<Product> products = new ArrayList<Product>();
+		List<User> users = new ArrayList<User>();
+		try {
+			
+			products = ProductUtil.getProducts();
+			users = DBUtil.queryUserList("select *** from t_user");
+			MailUtil.sendEmail(products, users);
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		
+	}
+
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/User.java b/students/1058267830/newMail/src/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..6a7bc1595
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/User.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+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/1058267830/newMail/src/com/coderising/ood/srp/product_promotion.txt b/students/1058267830/newMail/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1058267830/newMail/src/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/108847244/ood/ood-assignment/pom.xml b/students/108847244/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/108847244/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/108847244/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<String,String> 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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/108847244/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
diff --git a/students/115615290/ood-assignment/config/product_promotion.txt b/students/115615290/ood-assignment/config/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/115615290/ood-assignment/config/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/115615290/ood-assignment/pom.xml b/students/115615290/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/115615290/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..d11d29787
--- /dev/null
+++ b/students/115615290/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<String,String> configurations = new HashMap<String,String>();
+	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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/115615290/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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..9f7cd5433
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..22584f3d9
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+			boolean debug) {
+		if(toAddress==null||toAddress.equals("")){
+			throw new RuntimeException("发送地址不能为空！");
+		}
+		//假装发了一封邮件
+		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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..4208ee6d3
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class Product {
+	
+	private String productID;
+	private String productDesc;
+	
+	public Product (File file) throws IOException{
+		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();
+		}
+	}
+	
+	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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..e14524f66
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+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 subject = null;
+	protected String message = null;
+	
+
+	private static Configuration config; 
+	
+	
+	
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("config/product_promotion.txt");
+		PromotionMail pe = new PromotionMail();
+		List<User> users = DBUtil.query(pe.sendMailQuery);
+		Product product = new Product(f);
+		pe.sendEMails(users, product);
+		
+	}
+
+	
+	public PromotionMail() throws Exception {
+		config = new Configuration();
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();
+	}
+	
+	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); 
+	}
+
+	public void setMessage(User user,Product product){
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+	}
+
+	public void sendEMails(User user,Product product){
+		setMessage(user,product);
+		System.out.println("开始发送邮件");
+		MailUtil.sendEmail(user.getEmail(), fromAddress, subject, message, smtpHost, true);
+		System.out.println("邮件发送完毕");
+	}
+	
+	public void sendEMails(List<User> users,Product product){
+		System.out.println("开始发送邮件");
+		for(User user:users){
+			setMessage(user,product);
+			MailUtil.sendEmail(user.getEmail(), fromAddress, subject, message, smtpHost, true);
+		}
+		System.out.println("邮件发送完毕");
+	}
+}
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..42e4c81f8
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class User {
+	
+	private String name;
+	private String 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/1158154002/pom.xml b/students/1158154002/pom.xml
new file mode 100644
index 000000000..1be81576c
--- /dev/null
+++ b/students/1158154002/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..9471308b5
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+import java.util.Date;
+
+public class DateUtil {
+	
+	public static String getCurrentDateAsString() {
+		
+		return new Date().toString();
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java
new file mode 100644
index 000000000..197f08d2d
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class EmailLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("Email send "+msg);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java
new file mode 100644
index 000000000..f813444cd
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface LogMethod {
+	void send(String msg);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 000000000..ed2b6fc7e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface LogType {
+	String getMsg(String msg);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..09fae4009
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+	LogType type;
+	LogMethod method;
+
+	public Logger(LogType logType, LogMethod logMethod) {
+		this.type = logType;
+		this.method = logMethod;
+	}
+
+	public void log(String msg) {
+		method.send(type.getMsg(msg));
+	}
+	
+	public static void main(String[] args) {
+		Logger logger=new Logger(new RawLog(), new EmailLog());
+		logger.log("hello world !");
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java
new file mode 100644
index 000000000..6f1b37970
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class PrintLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("Print Log "+msg);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java
new file mode 100644
index 000000000..88f1811f2
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawLog implements LogType {
+
+	@Override
+	public String getMsg(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java
new file mode 100644
index 000000000..c791fe142
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithDate implements LogType {
+
+	@Override
+	public String getMsg(String msg) {
+		String txtDate = DateUtil.getCurrentDateAsString();
+		msg = txtDate + ": " + msg;
+		return msg;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java
new file mode 100644
index 000000000..8bca6372b
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SmsLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("SMS send "+msg);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java b/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java
new file mode 100644
index 000000000..8294670ff
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.Map;
+
+import com.coderising.ood.srp.api.FileLoader;
+
+public abstract class BaseFileLoader implements FileLoader {
+	public abstract  Map readFile(File file);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1158154002/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..927c7155c
--- /dev/null
+++ b/students/1158154002/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<String,String> 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/1158154002/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1158154002/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..868a03ff8
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1158154002/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..65383e4db
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java b/students/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java
new file mode 100644
index 000000000..75c0bf495
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java
@@ -0,0 +1,39 @@
+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.Map;
+
+public class FileLoaderImpl extends BaseFileLoader{
+
+	@Override
+	public  Map readFile(File file) {
+		BufferedReader br = null;
+		Map map=new HashMap<String,String>();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			map.put("productID", data[0]);
+			map.put("productDesc", data[1]);
+			
+			System.out.println("产品ID = " + data[0] + "\n");
+			System.out.println("产品描述 = " + data[1] + "\n");
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		return map;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java
new file mode 100644
index 000000000..f9ec8061e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.model.Constant;
+import com.coderising.ood.srp.model.Mail;
+
+public class HandlerEmail {
+	
+	protected String sendMailQuery;
+
+	protected Configuration config = new Configuration();
+	
+	protected Mail mail=new Mail();
+
+	protected FileLoaderImpl fileLoader=new FileLoaderImpl();
+	
+	public HandlerEmail(File file) {
+		Map map=fileLoader.readFile(file);
+		mail.setProductDesc((String)map.get("productDesc"));
+		mail.setProductID((String)map.get("productID"));
+		mail.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mail.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+	}
+
+	protected void setLoadQuery() throws Exception {
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + mail.getProductID() + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+
+	protected void setMessage(HashMap userInfo) throws IOException {
+		String name = (String) userInfo.get(Constant.NAME_KEY);
+		mail.setSubject("您关注的产品降价了");
+		mail.setMessage("尊敬的 " + name + ", 您关注的产品 " + mail.getProductDesc() + " 降价了，欢迎购买!");
+	}
+
+	protected void configureEMail(HashMap userInfo) throws IOException {
+		mail.setToAddress((String) userInfo.get(Constant.EMAIL_KEY));
+		if (mail.getToAddress().length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1158154002/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..373f3ee30
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..91a5c0328
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+	protected HandlerEmail hanlder;
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File(
+				"D:\\mygit\\coding2017\\students\\1158154002\\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 {
+		
+		hanlder = new HandlerEmail(file);
+		hanlder.setLoadQuery();
+		sendEMails(mailDebug, hanlder.loadMailingList());
+
+	}
+
+	protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				hanlder.configureEMail((HashMap) iter.next());
+				try {
+					if (hanlder.mail.getToAddress().length() > 0)
+						MailUtil.sendEmail(hanlder.mail.getToAddress(), hanlder.mail.getFromAddress(), hanlder.mail.getSubject(),
+								hanlder.mail.getMessage(), hanlder.mail.getSmtpHost(), debug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(hanlder.mail.getToAddress(), hanlder.mail.getFromAddress(), hanlder.mail.getSubject(),
+								hanlder.mail.getMessage(), hanlder.mail.getAltSmtpHost(), debug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java b/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java
new file mode 100644
index 000000000..d864d5e74
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp.api;
+
+import java.io.File;
+import java.util.Map;
+
+public interface FileLoader {
+	Map  readFile(File file);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java
new file mode 100644
index 000000000..ad6258531
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.srp.model;
+
+public class Constant {	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 000000000..c6715e438
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp.model;
+
+public class Mail {
+	private String smtpHost;
+	private String altSmtpHost; 
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	private String productID;
+	private String productDesc;
+	
+	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 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() {
+		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 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/1158154002/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1158154002/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1158154002/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/1170794299/README.MD b/students/1170794299/README.MD
new file mode 100644
index 000000000..f29dee609
--- /dev/null
+++ b/students/1170794299/README.MD
@@ -0,0 +1 @@
+测试
diff --git a/students/1204187480/.gitignore b/students/1204187480/.gitignore
new file mode 100644
index 000000000..2a5296f90
--- /dev/null
+++ b/students/1204187480/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/students/1204187480/code/homework/.gitignore b/students/1204187480/code/homework/.gitignore
new file mode 100644
index 000000000..2a5296f90
--- /dev/null
+++ b/students/1204187480/code/homework/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/students/1204187480/code/homework/coderising/pom.xml b/students/1204187480/code/homework/coderising/pom.xml
new file mode 100644
index 000000000..d7d922d4d
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/pom.xml
@@ -0,0 +1,26 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>coderising</artifactId>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
+    </parent>
+
+    <properties>
+        <commons-digester.version>2.1</commons-digester.version>
+
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-digester</groupId>
+            <artifactId>commons-digester</artifactId>
+            <version>${commons-digester.version}</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java
new file mode 100644
index 000000000..6b60e0bed
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class AccessFlag {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java
new file mode 100644
index 000000000..855bf9c7e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassFile {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java
new file mode 100644
index 000000000..7b177aa12
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassIndex {
+
+    String minorVersion;
+    String majorVersion;
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
new file mode 100644
index 000000000..1c5f8196e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,114 @@
+package com.coderising.jvm.loader;
+
+
+import com.coding.common.util.FileUtils2;
+import org.apache.commons.lang3.StringUtils;
+import strman.Strman;
+
+import java.io.File;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.coding.common.util.FileUtils2.getCanonicalPath;
+import static org.apache.commons.lang3.StringUtils.replace;
+import static org.apache.commons.lang3.StringUtils.substringAfter;
+
+/**
+ * Created by luoziyihao on 4/27/17.
+ */
+public class ClassFileLoader {
+
+    private List<String> clzPaths;
+
+    private Map<String, byte[]> clzContext;
+
+    public void addClassPath(String path) {
+        if (clzPaths == null) {
+            clzPaths = new ArrayList<>(5);
+        }
+        if (StringUtils.isBlank(path)) {
+            return;
+        }
+        File file = new File(path);
+        if (!file.isDirectory()) {
+            return;
+        }
+        String canonicalName = getCanonicalPath(file);
+        if (clzPaths.contains(canonicalName)) {
+            return;
+        }
+        clzPaths.add(getCanonicalPath(file));
+    }
+
+
+    private static final String SPLIT = ";";
+
+    public String getClassPath() {
+        StringBuilder classPath = new StringBuilder();
+
+        for (String e : clzPaths) {
+            classPath.append(e)
+                    .append(SPLIT);
+        }
+        if (classPath.length() > 1) {
+            classPath.deleteCharAt(classPath.length() - 1);
+        }
+        return classPath.toString();
+    }
+
+    private static final String CLZ_SUFFIX = ".class";
+
+    public byte[] readBinaryCode(String className) {
+        if (StringUtils.isBlank(className)) {
+            throw new IllegalStateException("className is blank");
+        }
+        byte[] binaryCode = getClzContext().get(Strman.append(className, CLZ_SUFFIX));
+        if (binaryCode == null) {
+            throw new IllegalStateException(
+                    Strman.format("className={0} is not found in classpath", className));
+        }
+        return binaryCode;
+    }
+
+    private Map<String, byte[]> getClzContext() {
+        if (clzContext == null) {
+            clzContext = createClzContextWithClzPaths(clzPaths);
+        }
+        return clzContext;
+    }
+
+    private Map<String, byte[]> createClzContextWithClzPaths(List<String> clzPaths) {
+        Map<String, byte[]> clzContext = new ConcurrentHashMap<>(60);
+        for (String e : clzPaths) {
+            File file = new File(e);
+            if (file.isDirectory()) {
+                List<File> files = FileUtils2.listAllFiles(file);
+                clzContext = addClassElements(clzContext, e, files);
+            }
+        }
+        return clzContext;
+    }
+
+    private Map<String, byte[]> addClassElements(Map<String, byte[]> clzContext, String classpath, List<File> files) {
+        for (File classFile : files) {
+            String filePath = getCanonicalPath(classFile);
+            String canonicalName = getCanonicalName(classpath, filePath);
+            byte[] bytes = FileUtils2.getBytes(classFile);
+            clzContext.put(canonicalName, bytes);
+        }
+        return clzContext;
+    }
+
+    /**
+     * 将classpath 下的文件路径转成 a.b.c.class 的格式
+     */
+    private static final String POINT = ".";
+
+    private String getCanonicalName(String classpath, String filePath) {
+        String tmp = replace(substringAfter(filePath, classpath), File.separator, POINT);
+        if (tmp.startsWith(POINT)) {
+            tmp = StringUtils.removeStart(tmp, POINT);
+        }
+        return tmp;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100644
index 000000000..9c7782134
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.loader;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassFileParser {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 000000000..dcdbe226e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 000000000..0b238b2db
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,121 @@
+package com.coderising.litestruts;
+
+import com.coderising.litestruts.parser.ActionConfig;
+import com.coderising.litestruts.parser.DefaultStrutsParser;
+import com.coderising.litestruts.parser.StrutsConfig;
+import com.coderising.litestruts.parser.StrutsParser;
+import com.coding.common.util.BeanUtils;
+
+import java.util.Map;
+
+
+public class Struts {
+
+    private static StrutsParser strutsParser = new DefaultStrutsParser();
+
+    private static final String STRUTS_CONFIG_PATH = "struts.xml";
+    private static final BeanUtils beanUtils = new BeanUtils();
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+
+        */
+
+        /**
+         * 0. 读取配置文件struts.xml
+         */
+        StrutsConfig strutsConfig = strutsParser.parser(STRUTS_CONFIG_PATH);
+        ActionConfig actionConfig = strutsConfig.getActions().get(actionName);
+        /**
+         * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+         据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+         ("name"="test" ,  "password"="1234") ,
+         那就应该调用 setName和setPassword方法
+         */
+        Object action = setPropertiesForAction(actionConfig, actionName, parameters);
+
+        /**
+         * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+         */
+        String resultName = doExecute(action);
+        /**
+         * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+         通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+         放到View对象的parameters
+         */
+        View view = createViewAndSetParameters(action);
+        /**
+         * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+         放到View对象的jsp字段中。
+         */
+        setViewValue(view, resultName, actionConfig);
+        return view;
+    }
+
+    private static void setViewValue(View view, String resultName, ActionConfig config) {
+        view.setJsp(config.getResults().get(resultName).getView());
+    }
+
+    private static View createViewAndSetParameters(Object action) {
+        View view = new View();
+        view.setParameters(beanUtils.describe(action));
+        return view;
+    }
+
+    private static String doExecute(Object action) {
+        return (String) beanUtils.invokeWithNoParamter("execute", action);
+    }
+
+    private static Object setPropertiesForAction(ActionConfig actionConfig, String actionName, Map<String, String> parameters) {
+        Object action = createInstance(findActionClass(actionConfig.getClassName()));
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            setProperty(entry.getKey(), entry.getValue(), action);
+        }
+        return action;
+    }
+
+    /**
+     * todo 校验 key 是否存在
+     *
+     * @param key
+     * @param value
+     * @param action
+     */
+    private static void setProperty(String key, String value, Object action) {
+        beanUtils.setPara(value, key, action);
+    }
+
+    private static Object createInstance(Class classValue) {
+        try {
+            return classValue.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private static Class findActionClass(String className) {
+        try {
+            return Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 000000000..b8c81faf3
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 000000000..07df2a5da
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
new file mode 100644
index 000000000..4aaba284f
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.litestruts.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ActionConfig {
+    private String name;
+    private String className;
+    private Map<String, Result> results = new HashMap<>(10);
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map<String, Result> getResults() {
+        return results;
+    }
+
+    public void setResults(Map<String, Result> results) {
+        this.results = results;
+    }
+
+    public void addResult(Result result) {
+        this.results.put(result.getName(), result);
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
new file mode 100644
index 000000000..ea5850773
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
@@ -0,0 +1,52 @@
+package com.coderising.litestruts.parser;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 解析 struts.xml 文件
+ * @apiNote 借鉴 http://www.everycoding.com/coding/78.html; http://blog.csdn.net/caihaijiang/article/details/5944955
+ * Created by luoziyihao on 3/5/17.
+ */
+public class DefaultStrutsParser implements StrutsParser {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Override
+    public StrutsConfig parser(String filePathInClasspath) {
+        String path = this.getClass().getClassLoader().getResource(filePathInClasspath).getPath();
+        File input = new File(path);
+        Digester digester = new Digester();
+        // 创建 StrutsConfig 对象
+        digester.addObjectCreate("struts", StrutsConfig.class);
+        // 将 struts 节点上的attribute属性映射到 StrutsConfig 对象的属性上
+        digester.addSetProperties("struts");
+        digester.addObjectCreate("struts/action", ActionConfig.class);
+        // 将 struts/action 节点上的attribute属性映射到 Action 对象的属性上, 并自定义属性映射
+        digester.addSetProperties("struts/action"
+                , new String[]{"name", "class"}, new String[]{"name", "className"});
+        digester.addObjectCreate("struts/action/result", Result.class);
+        digester.addSetProperties("struts/action/result"
+                , new String[]{"name"}, new String[]{"name"});
+        // 将 struts/action/result 节点上的body属性映射到 Result 对象的属性上
+        digester.addCallMethod("struts/action/result", "setView", 0);
+        // 对应struts/action/result 生成的对象添加到 Action中
+        digester.addSetNext("struts/action/result", "addResult");
+        // 对应struts/action 生成的对象添加到 Struts中
+        digester.addSetNext("struts/action", "addAction");
+
+        try {
+            StrutsConfig strutsConfig = (StrutsConfig) digester.parse(input);
+            logger.debug("strutsConfig={}", JSON.toJSONString(strutsConfig));
+            return strutsConfig;
+        } catch (IOException | SAXException e) {
+            throw new IllegalStateException(e);
+        }
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
new file mode 100644
index 000000000..c402418e6
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
@@ -0,0 +1,22 @@
+package com.coderising.litestruts.parser;
+
+public class Result {
+    private String name;
+    private String view;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getView() {
+        return view;
+    }
+
+    public void setView(String view) {
+        this.view = view;
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
new file mode 100644
index 000000000..88f769157
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StrutsConfig {
+    public Map<String, ActionConfig> actions = new HashMap<>(10);
+
+    public Map<String, ActionConfig> getActions() {
+        return actions;
+    }
+
+    public void setActions(Map<String, ActionConfig> actions) {
+        this.actions = actions;
+    }
+
+    public void addAction(ActionConfig action) {
+        this.actions.put(action.getName(), action);
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
new file mode 100644
index 000000000..ab7358c77
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
@@ -0,0 +1,8 @@
+package com.coderising.litestruts.parser;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public interface StrutsParser {
+    StrutsConfig parser(String filePathInClasspath);
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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<String,String> 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
new file mode 100644
index 000000000..3aef29508
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * 产品对象
+ * Created by luoziyihao on 6/12/17.
+ */
+
+public class Product {
+    private String productID;
+    private String 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
new file mode 100644
index 000000000..080c999ff
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.coding.common.util.FileUtils2.openStream;
+import static com.coding.common.util.IOUtils2.readToStringList;
+
+/**
+ * 产品文件解析器
+ * Created by luoziyihao on 6/12/17.
+ */
+public class ProductParser {
+
+    public List<Product> parse(String productClassPath) {
+        List<String> stringList = readToStringList(openStream(productClassPath));
+        return stringList.stream()
+                .map(String::trim)
+                .filter(s -> !s.isEmpty())
+                .filter(s -> s.contains(SPLIT_STRING))
+                .map(this::parseLine)
+                .collect(Collectors.toList());
+
+    }
+
+    private static final String SPLIT_STRING = " ";
+
+    private Product parseLine(String s) {
+        int index = s.indexOf(SPLIT_STRING);
+        String productID = s.substring(0, index);
+        String productDesc = s.substring(index);
+        Product product = new Product();
+        product.setProductDesc(productDesc);
+        product.setProductID(productID);
+        return product;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
new file mode 100644
index 000000000..6ee832307
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+
+/**
+ * main 函数启动类
+ * Created by luoziyihao on 6/12/17.
+ */
+public class PromotionMailApp {
+
+    public static void main(String args[]) {
+        List<Product> products = new ProductParser().parse("product_promotion.txt");
+
+        List<User> users = new UserService().loadMailingList();
+
+        List<PromotionMailClaim> promotionMailClaims = new PromotionMailClaim()
+                .load(products, users, new SmptPropeties(), true);
+
+        new PromotionMailableBehavior().send(promotionMailClaims);
+
+    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
new file mode 100644
index 000000000..189b3ced1
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
@@ -0,0 +1,99 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 发发送邮件的必要参数 vo
+ * Created by luoziyihao on 6/12/17.
+ */
+public class PromotionMailClaim {
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private String smtpHost;
+    private String altSmtpHost;
+    private Boolean mailDebug;
+
+    private PromotionMailClaim init(Product product, User user, SmptPropeties smptPropeties, Boolean mailDebug) {
+        this.toAddress = user.getEmail();
+        this.fromAddress = smptPropeties.getFromAddress();
+        this.subject = "您关注的产品降价了";
+        this.message = "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        this.smtpHost = smptPropeties.getSmtpHost();
+        this.altSmtpHost = smptPropeties.getAltSmtpHost();
+        this.mailDebug = mailDebug;
+        return this;
+    }
+
+    public List<PromotionMailClaim> load(List<Product> products, List<User> users, SmptPropeties smptPropeties
+            , boolean mailDebug) {
+        List<PromotionMailClaim> promotionMailClaims = new ArrayList<>();
+        for (Product product : products) {
+            for (User user : users) {
+                PromotionMailClaim promotionMailClaim = new PromotionMailClaim()
+                        .init(product, user, smptPropeties, mailDebug);
+                promotionMailClaims.add(promotionMailClaim);
+            }
+        }
+        return promotionMailClaims;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public void setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+    }
+
+    public Boolean getMailDebug() {
+        return mailDebug;
+    }
+
+    public void setMailDebug(Boolean mailDebug) {
+        this.mailDebug = mailDebug;
+    }
+
+    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;
+    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
new file mode 100644
index 000000000..ad37998e4
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+
+/**
+ * 发邮件的行为类
+ * Created by luoziyihao on 6/12/17.
+ */
+public class PromotionMailableBehavior {
+
+    public void send(List<PromotionMailClaim> emailSendClaimList) {
+        for (PromotionMailClaim promotionMailClaim : emailSendClaimList) {
+            sendEmailForOneClaim(promotionMailClaim);
+        }
+    }
+
+    private void sendEmailForOneClaim(PromotionMailClaim promotionMailClaim) {
+        System.out.println("开始发送邮件");
+
+        try {
+            doSendMail(promotionMailClaim);
+        } catch (Exception e) {
+            try {
+                promotionMailClaim.setSmtpHost(promotionMailClaim.getAltSmtpHost());
+                doSendMail(promotionMailClaim);
+            } catch (Exception e1) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e.getMessage());
+            }
+        }
+    }
+
+    private void doSendMail(PromotionMailClaim promotionMailClaim) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(promotionMailClaim.getFromAddress()).append("\n");
+        buffer.append("To:").append(promotionMailClaim.getToAddress()).append("\n");
+        buffer.append("Subject:").append(promotionMailClaim.getSubject()).append("\n");
+        buffer.append("Content:").append(promotionMailClaim.getMessage()).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
new file mode 100644
index 000000000..c6664fafc
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * 邮件服务器配置类
+ * Created by luoziyihao on 6/12/17.
+ */
+public class SmptPropeties {
+    private String smtpHost =  "smtp.server";;
+    private String altSmtpHost = "smtp1.163.com";
+    private String fromAddress = " admin@company.com";
+
+    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 fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
new file mode 100644
index 000000000..996efadbb
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * 用户类
+ * Created by luoziyihao on 6/12/17.
+ */
+public class User {
+    private String name;
+    private String 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
new file mode 100644
index 000000000..f5da2d390
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用户service, 管理用户的数据
+ * Created by luoziyihao on 6/12/17.
+ */
+public class UserService {
+
+    List<User> loadMailingList() {
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User user = new User();
+            user.setName("User" + i);
+            user.setEmail("aa@bb.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt b/students/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/resources/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/1204187480/code/homework/coderising/src/main/resources/struts.xml b/students/1204187480/code/homework/coderising/src/main/resources/struts.xml
new file mode 100644
index 000000000..876156eb4
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
new file mode 100644
index 000000000..f02816a55
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
@@ -0,0 +1,21 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ComputeTest {
+
+    @Test
+    public void testDivisionExactly(){
+        System.out.println( 7 >> 1);
+        System.out.println( -5 >> 2);
+        System.out.println( -5 << 2);
+    }
+
+    @Test
+    public void testSqrt() {
+        System.out.println(Math.sqrt(10));
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
new file mode 100644
index 000000000..6abb5d925
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
@@ -0,0 +1,25 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class CycleTest {
+
+    /**
+     * checkIndex will be excuted in each cycle
+     */
+    @Test
+    public void  testForSize() {
+        int[] arr = new int[]{1, 2, 3, 4, 54};
+        for (int i = 0; checkIndex(i, arr); i++ ) {
+
+        }
+    }
+
+    private boolean checkIndex(int i, int[] arr) {
+        System.out.println(i);
+        return i < arr.length;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java
new file mode 100644
index 000000000..bd918a011
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java
@@ -0,0 +1,32 @@
+package com.coderising.api;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+@Slf4j
+public class FileTest {
+
+    @Test
+    public void testFile() {
+        File file = new File("./hahah");
+        Assert.assertFalse(file.isDirectory());
+
+    }
+
+    @Test
+    public void  testAbsolutePath() throws IOException {
+        File file = new File("../src");
+        log.info("isDirectory={}", file.isDirectory());
+        log.info(file.getAbsolutePath());
+        log.info(file.getCanonicalPath());
+        log.info(file.getName());
+        log.info(file.getPath());
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java
new file mode 100644
index 000000000..06cd373de
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java
@@ -0,0 +1,18 @@
+package com.coderising.api;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+@Slf4j
+public class ObjectTest {
+    @Test
+    public void test(){
+        Object a[] = {1};
+      log.info(a.getClass().getName());
+      log.info(a.getClass().getCanonicalName());
+      log.info(a.getClass().getSimpleName());
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java
new file mode 100644
index 000000000..6831eb0ad
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java
@@ -0,0 +1,17 @@
+package com.coderising.api;
+
+import org.junit.Test;
+import strman.Strman;
+
+/**
+ * Created by luoziyihao on 5/3/17.
+ */
+public class StrmanTest {
+
+    @Test
+    public void testFormat() {
+
+        System.out.println(Strman.format("className is not found in classpath, className={1}", ",333 ","cccc"));
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java
new file mode 100644
index 000000000..b7c5bab54
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java
@@ -0,0 +1,354 @@
+package com.coderising.jvm.test;
+
+import java.io.File;
+import java.util.List;
+
+import ch.qos.logback.core.encoder.ByteArrayUtil;
+import com.coding.common.util.ByteUtils;
+import com.coding.common.util.FileUtils2;
+import org.junit.After;
+import  org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+//import com.coderising.jvm.clz.ClassFile;
+//import com.coderising.jvm.clz.ClassIndex;
+//import com.coderising.jvm.cmd.BiPushCmd;
+//import com.coderising.jvm.cmd.ByteCodeCommand;
+//import com.coderising.jvm.cmd.OneOperandCmd;
+//import com.coderising.jvm.cmd.TwoOperandCmd;
+//import com.coderising.jvm.constant.ClassInfo;
+//import com.coderising.jvm.constant.ConstantPool;
+//import com.coderising.jvm.constant.MethodRefInfo;
+//import com.coderising.jvm.constant.NameAndTypeInfo;
+//import com.coderising.jvm.constant.UTF8Info;
+//import com.coderising.jvm.field.Field;
+import com.coderising.jvm.loader.ClassFileLoader;
+
+import static com.coding.common.util.FileUtils2.getCanonicalPath;
+//import com.coderising.jvm.method.Method;
+
+
+
+
+
+public class ClassFileloaderTest {
+
+	
+	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+	
+	static String path1 = "target/classes";
+	static String path2 = "target/test-classes";
+	
+//	static ClassFile clzFile = null;
+//	static {
+//		ClassFileLoader loader = new ClassFileLoader();
+//		loader.addClassPath(path1);
+//		String className = "com.coderising.jvm.test.EmployeeV1";
+//
+//		clzFile = loader.loadClass(className);
+//
+//	}
+
+	
+	@Before
+	public void setUp() throws Exception {		 
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	private void addClassPath(ClassFileLoader loader) {
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+	}
+
+	@Test
+	public void testClassPath(){		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		String clzPath = loader.getClassPath();
+		
+		Assert.assertEquals(getCanonicalPath(new File(path1))+";"+getCanonicalPath(new File(path2)),clzPath);
+		
+	}
+
+	@Test
+	public void testClassFileLength() {		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		
+		String className = "com.coderising.jvm.test.EmployeeV1";
+
+		byte[] byteCodes = loader.readBinaryCode(className);
+		
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1056, byteCodes.length);
+		
+	}
+	
+	
+    @Test	
+	public void testMagicNumber(){
+    	ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+		
+		
+		String acctualValue = this.byteToHexString(codes);
+		
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+    
+    
+
+   	private String byteToHexString(byte[] codes ){
+		return ByteUtils.byteToHexString(codes);
+   	}
+
+//    add comment for behind test
+//    /**
+//     * ----------------------------------------------------------------------
+//     */
+//
+//
+//    @Test
+//    public void testVersion(){
+//
+//		Assert.assertEquals(0, clzFile.getMinorVersion());
+//		Assert.assertEquals(52, clzFile.getMajorVersion());
+//
+//    }
+//
+//    @Test
+//    public void testConstantPool(){
+//
+//
+//		ConstantPool pool = clzFile.getConstantPool();
+//
+//		Assert.assertEquals(53, pool.getSize());
+//
+//		{
+//			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+//			Assert.assertEquals(2, clzInfo.getUtf8Index());
+//
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+//			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+//		}
+//		{
+//			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+//			Assert.assertEquals(4, clzInfo.getUtf8Index());
+//
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+//			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+//		}
+//		{
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+//			Assert.assertEquals("name", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+//			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+//			Assert.assertEquals("age", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+//			Assert.assertEquals("I", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+//			Assert.assertEquals("<init>", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+//			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+//			Assert.assertEquals("Code", utf8Info.getValue());
+//		}
+//
+//		{
+//			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+//			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+//			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+//		}
+//
+//		{
+//			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+//			Assert.assertEquals(9, nameAndType.getIndex1());
+//			Assert.assertEquals(14, nameAndType.getIndex2());
+//		}
+//		//抽查几个吧
+//		{
+//			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+//			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+//			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+//		}
+//
+//		{
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+//			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+//		}
+//    }
+//    @Test
+//    public void testClassIndex(){
+//
+//    	ClassIndex clzIndex = clzFile.getClzIndex();
+//    	ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+//    	ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+//
+//
+//    	Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+//    	Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+//    }
+//
+//    /**
+//     * 下面是第三次JVM课应实现的测试用例
+//     */
+//    @Test
+//    public void testReadFields(){
+//
+//    	List<Field> fields = clzFile.getFields();
+//    	Assert.assertEquals(2, fields.size());
+//    	{
+//    		Field f = fields.get(0);
+//    		Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+//    	}
+//    	{
+//    		Field f = fields.get(1);
+//    		Assert.assertEquals("age:I", f.toString());
+//    	}
+//    }
+//    @Test
+//    public void testMethods(){
+//
+//    	List<Method> methods = clzFile.getMethods();
+//    	ConstantPool pool = clzFile.getConstantPool();
+//
+//    	{
+//    		Method m = methods.get(0);
+//    		assertMethodEquals(pool,m,
+//    				"<init>",
+//    				"(Ljava/lang/String;I)V",
+//    				"2ab7000c2a2bb5000f2a1cb50011b1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(1);
+//    		assertMethodEquals(pool,m,
+//    				"setName",
+//    				"(Ljava/lang/String;)V",
+//    				"2a2bb5000fb1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(2);
+//    		assertMethodEquals(pool,m,
+//    				"setAge",
+//    				"(I)V",
+//    				"2a1bb50011b1");
+//    	}
+//    	{
+//    		Method m = methods.get(3);
+//    		assertMethodEquals(pool,m,
+//    				"sayHello",
+//    				"()V",
+//    				"b2001c1222b60024b1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(4);
+//    		assertMethodEquals(pool,m,
+//    				"main",
+//    				"([Ljava/lang/String;)V",
+//    				"bb000159122b101db7002d4c2bb6002fb1");
+//    	}
+//    }
+//
+//    private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
+//    	String methodName = pool.getUTF8String(m.getNameIndex());
+//		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+//		String code = m.getCodeAttr().getCode();
+//		Assert.assertEquals(expectedName, methodName);
+//		Assert.assertEquals(expectedDesc, methodDesc);
+//		Assert.assertEquals(expectedCode, code);
+//    }
+//
+//    @Test
+//    public void testByteCodeCommand(){
+//    	{
+//	    	Method initMethod = this.clzFile.getMethod("<init>", "(Ljava/lang/String;I)V");
+//	    	ByteCodeCommand [] cmds = initMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: aload_0", cmds[0]);
+//	    	assertOpCodeEquals("1: invokespecial #12", cmds[1]);
+//	    	assertOpCodeEquals("4: aload_0", cmds[2]);
+//	    	assertOpCodeEquals("5: aload_1", cmds[3]);
+//	    	assertOpCodeEquals("6: putfield #15", cmds[4]);
+//	    	assertOpCodeEquals("9: aload_0", cmds[5]);
+//	    	assertOpCodeEquals("10: iload_2", cmds[6]);
+//	    	assertOpCodeEquals("11: putfield #17", cmds[7]);
+//	    	assertOpCodeEquals("14: return", cmds[8]);
+//    	}
+//
+//    	{
+//	    	Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V");
+//	    	ByteCodeCommand [] cmds = setNameMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: aload_0", cmds[0]);
+//	    	assertOpCodeEquals("1: aload_1", cmds[1]);
+//	    	assertOpCodeEquals("2: putfield #15", cmds[2]);
+//	    	assertOpCodeEquals("5: return", cmds[3]);
+//
+//    	}
+//
+//    	{
+//	    	Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V");
+//	    	ByteCodeCommand [] cmds = sayHelloMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: getstatic #28", cmds[0]);
+//	    	assertOpCodeEquals("3: ldc #34", cmds[1]);
+//	    	assertOpCodeEquals("5: invokevirtual #36", cmds[2]);
+//	    	assertOpCodeEquals("8: return", cmds[3]);
+//
+//    	}
+//
+//    	{
+//	    	Method mainMethod = this.clzFile.getMainMethod();
+//
+//	    	ByteCodeCommand [] cmds = mainMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: new #1", cmds[0]);
+//	    	assertOpCodeEquals("3: dup", cmds[1]);
+//	    	assertOpCodeEquals("4: ldc #43", cmds[2]);
+//	    	assertOpCodeEquals("6: bipush 29", cmds[3]);
+//	    	assertOpCodeEquals("8: invokespecial #45", cmds[4]);
+//	    	assertOpCodeEquals("11: astore_1", cmds[5]);
+//	    	assertOpCodeEquals("12: aload_1", cmds[6]);
+//	    	assertOpCodeEquals("13: invokevirtual #47", cmds[7]);
+//	    	assertOpCodeEquals("16: return", cmds[8]);
+//    	}
+//
+//    }
+//
+//    private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){
+//
+//    	String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText();
+//
+//    	if(cmd instanceof OneOperandCmd){
+//    		if(cmd instanceof BiPushCmd){
+//    			acctual += " " + ((OneOperandCmd)cmd).getOperand();
+//    		} else{
+//    			acctual += " #" + ((OneOperandCmd)cmd).getOperand();
+//    		}
+//    	}
+//    	if(cmd instanceof TwoOperandCmd){
+//    		acctual += " #" + ((TwoOperandCmd)cmd).getIndex();
+//    	}
+//    	Assert.assertEquals(expected, acctual);
+//    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java
new file mode 100644
index 000000000..12e3d7efd
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.test;
+
+public class EmployeeV1 {
+	
+	
+	private String name;
+    private int age;
+    
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }    
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setAge(int age){
+    	this.age = age;
+    }
+    public void sayHello() {        
+    	System.out.println("Hello , this is class Employee ");    	
+    }
+    public static void main(String[] args){
+    	EmployeeV1 p = new EmployeeV1("Andy",29);
+    	p.sayHello();    
+    	
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
new file mode 100644
index 000000000..72e841a23
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
@@ -0,0 +1,14 @@
+package com.coderising.litestruts.parser;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StructsParserTest {
+    @Test
+    public void parser() throws Exception {
+        new DefaultStrutsParser().parser("struts.xml");
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/pom.xml b/students/1204187480/code/homework/coding/pom.xml
new file mode 100644
index 000000000..08acfc352
--- /dev/null
+++ b/students/1204187480/code/homework/coding/pom.xml
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>coding</artifactId>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
+    </parent>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 000000000..d7ac82019
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 000000000..06ef6311b
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java
new file mode 100644
index 000000000..ef939ae2c
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,10 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+	public Iterator iterator();
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java
new file mode 100644
index 000000000..e33349619
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java
@@ -0,0 +1,24 @@
+package com.coding.basic;
+
+import com.coding.basic.linklist.LinkedList;
+
+public class Queue {
+
+	private LinkedList elementData = new LinkedList();
+
+	public void enQueue(Object o){
+		elementData.add(o);
+	}
+	
+	public Object deQueue(){
+		return elementData.remove(0);
+	}
+	
+	public boolean isEmpty(){
+		return size() == 0;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java
new file mode 100644
index 000000000..7336dccfe
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		if (isEmpty()) {
+			throw new IllegalStateException("the stack is empty");
+		}
+		return elementData.remove(elementData.size() - 1);
+	}
+	
+	public Object peek(){
+		if (isEmpty()) {
+			throw new IllegalStateException("the stack is empty");
+		}
+		return elementData.get(elementData.size() - 1);
+	}
+
+	public boolean isEmpty(){
+		return size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 000000000..cbe1f87a0
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,111 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+
+    private int size = 0;
+
+    private Object[] elementData = new Object[100];
+
+    private Iterator iterator = new ArrayListIterator();
+
+    private int length() {
+        return elementData.length;
+    }
+
+    private static final int ENLARGE_LENGTH = 100;
+
+    private Object[] enlarge(Object[] origin) {
+        return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH);
+    }
+
+    private void enLargeElementData() {
+        if (size == length()) {
+            elementData = enlarge(elementData);
+        }
+    }
+
+    public void add(Object o) {
+        enLargeElementData();
+        elementData[size] = o;
+        size++;
+    }
+
+    public void add(int index, Object o) {
+        checkForAdd(index);
+        enLargeElementData();
+        // 备份 index 处及后面的数据
+        Object[] elementsBehindIndex = backBehindElements(elementData, index);
+        // 给index处 设值
+        elementData[index] = o;
+        // 追加 备份的数据
+        appendElement(elementData, index, elementsBehindIndex);
+        size++;
+    }
+
+    private void appendElement(Object[] origin, int pos, Object[] append) {
+        System.arraycopy(append, 0, origin, pos, append.length);
+    }
+
+    private Object[] backBehindElements(Object[] elementData, int index) {
+        int backSize = size - index;
+        Object[] back = new Object[backSize];
+        System.arraycopy(elementData, index, back, 0, backSize);
+        return back;
+    }
+
+    public Object get(int index) {
+        checkIndex(index);
+        return elementData[index];
+    }
+
+    private void checkIndex(int index) {
+        if (index < 0 || index >= size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    private void checkForAdd(int index) {
+        if (index < 0 || index > size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    public Object remove(int index) {
+        checkIndex(index);
+        Object[] back = backBehindElements(elementData, index + 1);
+        System.arraycopy(back, 0, elementData, index, back.length);
+        Object ret = elementData[index];
+        elementData[index] = null;
+        size--;
+        return ret;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public Iterator iterator() {
+        return iterator;
+    }
+
+    private class ArrayListIterator implements Iterator {
+
+        int next = 0;
+
+        @Override
+        public boolean hasNext() {
+           return next < size;
+        }
+
+        @Override
+        public Object next() {
+            return elementData[next++];
+        }
+    }
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 000000000..42ec6efe5
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,252 @@
+package com.coding.basic.array;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ArrayUtil {
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+	    int length = origin.length;
+	    int mid = length >> 1;
+		for (int i = 0; i < mid; i++) {
+		    int hIndex = length - 1 -i;
+		    int l = origin[i];
+		    int h = origin[hIndex];
+		    origin[hIndex] = l;
+		    origin[i] = h;
+        }
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+	    int removeValue = 0;
+	    return removeValue(oldArray, removeValue);
+	}
+
+    private int[] removeValue(int[] oldArray, int removeValue) {
+	    int length = oldArray.length;
+	    int[] dest = new int[length];
+	    int j = 0;
+	    for(int i = 0; i < length; i++) {
+	        int v = oldArray[i];
+	        if (v != removeValue) {
+	            dest[j++] = v;
+            }
+        }
+
+        int[] retArray = new int[j];
+	    System.arraycopy(dest, 0, retArray, 0, j);
+        return retArray;
+    }
+
+    /**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * todo 数组 a1, b1 自身去重
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int length1 = array1.length;
+		int length2 = array2.length;
+		int length = length1 + length2;
+	    int[] newArray = new int[length];
+
+	    return findAndSetLeastWithOutDuplicate(array1, array2, 0, 0, 0, 0, newArray);
+	}
+
+    /**
+     * todo 优化递归出口判断, 优化三个条件判断为一个
+     * @param array1
+     * @param array2
+     * @param i
+     * @param j
+     * @param k
+     * @param duplicate
+     * @param newArray
+     * @return
+     */
+    private int[] findAndSetLeastWithOutDuplicate(int[] array1, int[] array2, int i, int j, int k, int duplicate, int[] newArray) {
+
+	        if (i == array1.length && j < array2.length) {
+	            System.arraycopy(array2, j, newArray, k, array2.length - j);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i < array1.length) {
+                System.arraycopy(array1, i, newArray, k, array1.length - i);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i == array1.length) {
+                return copyLastValues(newArray, duplicate);
+            }
+
+            int v1 = array1[i];
+            int v2 = array2[j];
+            if (v1 < v2) {
+                newArray [k] = v1;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, j,  ++k, duplicate, newArray);
+            } else if (v1 > v2){
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, i, ++j,  ++k, duplicate, newArray);
+            } else {
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, ++j,  ++k, ++duplicate, newArray);
+            }
+
+    }
+
+    private int[] copyLastValues(int[] newArray, int duplicate) {
+        int[] retArray = new int[newArray.length - duplicate];
+        System.arraycopy(newArray, 0, retArray, 0, retArray.length);
+        return retArray;
+    }
+
+
+    /**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+	    int[] newArray = new int[oldArray.length + size];
+	    System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+	    if (max <= 1) {
+	        return new int[]{};
+        }
+        int [] newArray = new int[max];
+	    newArray[0] = 1;
+	    return fibonacciN(1, 1, 1, max, newArray);
+	}
+
+    private int[] fibonacciN(int size, int current, int next, int max, int[] newArray) {
+        if (next >= max) {
+            int[] retArray = new int[size];
+            System.arraycopy(newArray, 0, retArray, 0, size);
+            return retArray;
+        } else {
+            newArray[++size - 1] = next;
+            return fibonacciN(size, next, current + next,  max, newArray);
+        }
+    }
+
+    /**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * todo 使用已有的质数序列 优化质数验证
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+	    if (max <= 2) {
+	        return new int[]{};
+        }
+
+	    int[] newArray = new int[max];
+	    int j = 0;
+	    for (int i = 2; i < max; i++) {
+	        if (isPrime(i)) {
+	            newArray[j++] = i;
+            }
+        }
+        int[] retArray = new int[j];
+	    System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPrime(int number) {
+        int limit = Double.valueOf(Math.sqrt(number)).intValue();
+        for(int i = 2; i <= limit; i++) {
+            if (number % i == 0 ) {
+                return false;
+            }
+        }
+        return true;
+
+    }
+
+    /**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+	    int[] newArray = new int[48];   // 经过不少数学家研究，到2013年2月6日为止，一共找到了48个完全数。
+        int j = 0;
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                if (j >= newArray.length) {
+                    newArray = this.grow(newArray, 1);
+                }
+                newArray[j++] = i;
+
+            }
+        }
+        int[] retArray = new int[j];
+        System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPerfectNumber(int number) {
+	    int sum = 0;
+	    for (int i = 1; i < number; i++) {
+	        if (number % i == 0) {
+	            sum += i;
+            }
+        }
+
+        return sum == number;
+    }
+
+    /**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+	    StringBuilder builder = new StringBuilder(20);
+	    int length = array.length;
+	    for (int i = 0; i< length; i++) {
+	        builder.append(array[i]).append(seperator);
+        }
+        builder.deleteCharAt(builder.length() - seperator.length());
+		return builder.toString();
+	}
+	
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 000000000..96c2e2cda
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,169 @@
+package com.coding.basic.linklist;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 定长链表
+ * 命中后更新 pageNumber的位置
+ * 随时要考虑 first, node 的变化
+ */
+@Slf4j
+public class LRUPageFrame {
+
+    private static class Node {
+
+        Node prev;
+        Node next;
+        int pageNum;
+
+        public Node(Node next, int pageNum) {
+            this.next = next;
+            this.pageNum = pageNum;
+        }
+
+        public Node(int pageNum) {
+            this.pageNum = pageNum;
+        }
+
+        Node() {
+        }
+
+        public String debug() {
+            return new StringBuilder().
+                    append("\n##########################pre: ")
+                    .append(prev)
+                    .append("\n##########################node: ")
+                    .append(this)
+                    .append("\n##########################next: ")
+                    .append(next)
+                    .append("\n##########################pageNum: ")
+                    .append(pageNum)
+
+                    .toString();
+        }
+    }
+
+
+    private int capacity;
+
+    private int currentSize;
+    private Node first;// 链表头
+    private Node last;// 链表尾
+
+
+    public LRUPageFrame(int capacity) {
+        this.currentSize = 0;
+        this.capacity = capacity;
+
+    }
+
+    /**
+     * 获取缓存中对象
+     * 新的对象应该放在前面
+     *
+     * @param pageNum
+     * @return
+     */
+    public void access(int pageNum) {
+        if (capacity == 0) {
+            return;
+        }
+
+        // 如果已经存在, 删除已经存在的
+        removeContainedNode(pageNum);
+
+        /**
+         * 向前追加
+         */
+        // 如果 first 为空,   first=last=newNode
+        if (first == null && last == null) {
+            first = last = new Node(pageNum);
+            // 如果不为空 , first=newNode, first.next.pre = first
+        } else {
+            first = new Node(first, pageNum);
+            first.next.prev = first;
+        }
+        // 修改 size
+        currentSize++;
+        debugContent("addNewNode");
+
+        // 如果 size = capacity + 1, 去除last (额外考虑 capacity 为 1 的情况), last.next=null
+        if (currentSize == capacity + 1) {
+            last = last.prev;
+            last.next = null;
+            currentSize--;
+            debugContent("rmSpareNode");
+        }
+    }
+
+    private Node removeContainedNode(int pageNum) {
+        Node node = first;
+        while (node != null) {
+
+            if (node.pageNum == pageNum) {
+                Node nodePre = node.prev;
+                Node nodeNext = node.next;
+                if (nodePre == null) {  // 说明在第一个节点就 hit了
+                    first = nodeNext;
+                    first.prev = null;
+                } else {
+                    nodePre.next = nodeNext;
+                    if (nodeNext != null) {
+                        nodeNext.prev = nodePre;
+                    } else {
+                        last = nodePre; // 如果 nodeNext 为空, 说明原先 last 是 node, 现在是 nodePre
+                    }
+                }
+                currentSize--;
+                return node;
+            }
+            node = node.next;
+        }
+        debugContent("removeContainedNode");
+        return null;
+    }
+
+    private void debugContent(String tag) {
+        log.debug("tag={}, currentSize={}, toString={}", tag, currentSize, debug());
+    }
+
+
+    public String toString() {
+        StringBuilder buffer = new StringBuilder();
+        Node node = first;
+        while (node != null) {
+            buffer.append(node.pageNum);
+
+            node = node.next;
+            if (node != null) {
+                buffer.append(",");
+            }
+        }
+        return buffer.toString();
+    }
+
+    public String debug() {
+        StringBuilder buffer = new StringBuilder();
+        Node node = first;
+        while (node != null) {
+            buffer
+                    .append(node.debug())
+                    .append("\n##########################last: ")
+                    .append(last)
+                    .append("\n##########################capacity: ")
+                    .append(capacity)
+                    .append("\n##########################toString: ")
+                    .append(toString())
+
+            ;
+
+            node = node.next;
+            if (node != null) {
+                buffer.append("\n,");
+            }
+        }
+        return buffer.toString() + "\n";
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 000000000..7fd72fc2b
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 000000000..d9c4ee3c7
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,351 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+
+    private Node head;
+    private int size = 0;
+
+    public void add(Object o) {
+        Node newNode = new Node(o, null);
+        if (head == null) {
+            head = newNode;
+        } else {
+            node(size - 1).next = newNode;
+        }
+        size++;
+    }
+
+    public void add(int index, Object o) {
+        checkForAdd(index);
+        if (index == size) {
+            add(o);
+        } else {
+            Node newNode = new Node(o, null);
+            if (index == 0) {
+                addFirst(o);
+            } else {
+                Node preNode = node(index - 1);
+                Node now = preNode.next;
+                preNode.next = newNode;
+                newNode.next = now;
+                size++;
+            }
+        }
+
+    }
+
+    private Node node(int index) {
+        Node x = head;
+        for (int i = 0; i < index; i++) {
+            x = x.next;
+        }
+        return x;
+    }
+
+    public Object get(int index) {
+        checkIndex(index);
+        return node(index).data;
+    }
+
+    /**
+     * 让被删除的引用的持有者指向下一个节点
+     *
+     * @param index
+     * @return
+     */
+    public Object remove(int index) {
+        final Object ret;
+        checkIndex(index);
+        if (index == 0) {
+            Node removeNode = head;
+            ret = head.data;
+            head = removeNode.next;
+        } else {
+            Node pre = node(index - 1);
+            Node removeNode = pre.next;
+            ret = removeNode.data;
+            pre.next = removeNode.next;
+        }
+        size--;
+        return ret;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public void addFirst(Object o) {
+        head = new Node(o, head);
+        ;
+        size++;
+    }
+
+    public void addLast(Object o) {
+        add(o);
+    }
+
+    public Object removeFirst() {
+        if (size == 0) {
+            return null;
+        } else {
+            return remove(0);
+        }
+    }
+
+    public Object removeLast() {
+        return remove(size - 1);
+    }
+
+    public LinkedListIterator iterator() {
+        return new LinkedListIterator(head);
+    }
+
+    private void checkIndex(int index) {
+        if (index < 0 || index >= size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    private void checkForAdd(int index) {
+        if (index < 0 || index > size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+
+    @Override
+    public String toString() {
+        Iterator iterator = iterator();
+        StringBuilder builder = new StringBuilder("[");
+        while ((iterator.hasNext())) {
+            builder.append(iterator.next()).append(',');
+        }
+        if (size() > 0) {
+            builder.deleteCharAt(builder.length() - 1);
+        }
+        return builder
+                .append(']')
+                .toString();
+    }
+
+    /**
+     * 把该链表逆置
+     * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+     */
+    public void reverse() {
+        if (size == 0) {
+            return;
+        }
+        Object[] datas = new Object[size];
+        int i = 0;
+        // 迭代链表的数据生成数组
+        Iterator iterator = iterator();
+        while (iterator.hasNext()) {
+            datas[i++] = iterator.next();
+        }
+        // 遍历数组越生成新的 链表
+        Node newHead = new Node(datas[--i], null);
+        Node next = newHead;
+        for (int j = --i; j >= 0; j--) {
+            next.next = new Node(datas[j], null);
+            next = next.next;
+
+        }
+        this.head = newHead;
+
+    }
+
+    /**
+     * 删除一个单链表的前半部分
+     * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+     * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+     */
+    public void removeFirstHalf() {
+        removeFirstSize(size >> 1);
+    }
+
+    public void removeFirstSize(int firstSize) {
+        firstSize = firstSize > size() ? size() : firstSize;
+        LinkedListIterator iterator = iterator();
+        int i = 1;
+        while (i++ <= firstSize) {
+            iterator.nextNode();
+        }
+        if (size > 0) {
+            head = iterator.nextNode();
+            size = size() - firstSize;
+        }
+    }
+
+
+    /**
+     * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+     *
+     * @param i
+     * @param length
+     */
+    public void remove(int i, int length) {
+        if (i == 0) {
+            removeFirstSize(length);
+            return;
+        }
+        if (i >= size || length == 0) {
+            return;
+        }
+
+        int lastLenth = size - i;
+        length = length <= lastLenth ? length : lastLenth;
+        Node pre = node(i - 1);
+        int j = 0;
+
+        Node next = pre;
+        while (j++ < length) {
+            next = next.next;
+        }
+        pre.next = next.next;
+        size = size - length;
+
+
+    }
+
+    /**
+     * 假定当前链表和listB均包含已升序排列的整数
+     * 从当前链表中取出那些listB所指定的元素
+     * 例如当前链表 = 11->101->201->301->401->501->601->701
+     * listB = 1->3->4->6
+     * 返回的结果应该是[101,301,401,601]
+     *
+     * @param list
+     */
+    public int[] getElements(LinkedList list) {
+        if (size() == 0) {
+            return new int[0];
+        }
+        Iterator iterator = list.iterator();
+        Node fromNode = iterator().nextNode();
+        int fromIndex = 0;
+
+        int[] retArray = new int[list.size()];
+        int retIndex = 0;
+        while (iterator.hasNext()) {
+            int index = (int) iterator.next();
+            Node node = node(fromNode, fromIndex, index);
+            fromIndex = index;
+            fromNode = node;
+            if (node == null) {
+                return retArray;
+            } else {
+                retArray[retIndex++] = (int)node.data;
+            }
+        }
+        return retArray;
+    }
+
+    private Node node(Node fromNode, int fromIndex, int index) {
+        Node next = fromNode;
+        int nextIndex = fromIndex;
+        while (next != null && nextIndex < index) {
+            next = next.next;
+            nextIndex++;
+        }
+        if (nextIndex == index) {
+            return next;
+        } else {
+            return null;
+        }
+    }
+
+
+    /**
+     * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 从当前链表中中删除在listB中出现的元素
+     *
+     * @param list
+     */
+
+    public void subtract(LinkedList list) {
+
+    }
+
+    /**
+     * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+     */
+    public void removeDuplicateValues() {
+
+    }
+
+    /**
+     * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+     *
+     * @param min
+     * @param max
+     */
+    public void removeRange(int min, int max) {
+
+    }
+
+    /**
+     * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+     * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+     *
+     * @param list
+     */
+    public LinkedList intersection(LinkedList list) {
+        return null;
+    }
+
+    private static class Node {
+        Object data;
+        Node next;
+
+        public Node() {
+        }
+
+        public Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+    private class LinkedListIterator implements Iterator {
+
+        private Node next;
+
+        public LinkedListIterator() {
+        }
+
+        private LinkedListIterator(Node next) {
+            this.next = next;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return next != null;
+        }
+
+        @Override
+        public Object next() {
+            if (next == null) {
+                throw new IndexOutOfBoundsException("there is no node in list");
+            }
+            Node ret = next;
+            next = next.next;
+            return ret.data;
+        }
+
+
+        private Node nextNode() {
+            if (next == null) {
+                throw new IndexOutOfBoundsException("there is no node in list");
+            }
+            Node ret = next;
+            next = next.next;
+            return ret;
+        }
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java
new file mode 100644
index 000000000..eb41a7e26
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java
@@ -0,0 +1,22 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArraysTest {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    @Test
+    public void testCopyOf(){
+        Object[] a = new Object[]{1, 2, 3, 4};
+        Object[] b = Arrays.copyOf(a, 10);
+        logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b));
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java
new file mode 100644
index 000000000..efc402237
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java
@@ -0,0 +1,24 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class SystemTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+        @Test
+    public void testArrayCopy() {
+        int[] a = new int[]{1, 2, 3, 4, 5, 6, 7};
+        int[] b = new int[]{11, 22, 33, 44, 55, 66, 77};
+        System.arraycopy(a, 2, b, 4, 3);
+        logger.info("b={}", Arrays.toString(b));
+
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java
new file mode 100644
index 000000000..9e951354e
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java
@@ -0,0 +1,202 @@
+package com.coding.basic;
+
+import com.coding.basic.linklist.LinkedList;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 3/23/17.
+ */
+public class LinkedListTest {
+
+    @Test
+    public void add() throws Exception {
+
+    }
+
+    @Test
+    public void add1() throws Exception {
+
+    }
+
+    @Test
+    public void get() throws Exception {
+
+    }
+
+    @Test
+    public void remove() throws Exception {
+
+    }
+
+    @Test
+    public void size() throws Exception {
+
+    }
+
+    @Test
+    public void addFirst() throws Exception {
+
+    }
+
+    @Test
+    public void addLast() throws Exception {
+
+    }
+
+    @Test
+    public void removeFirst() throws Exception {
+
+    }
+
+    @Test
+    public void removeLast() throws Exception {
+
+    }
+
+    @Test
+    public void removeFirstHalf() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(0);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf1() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(1);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[1]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf2() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(2);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[2]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf3() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(3);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[2,3]", linkedList.toString());
+    }
+
+    private LinkedList createAndFillLinkedList() {
+        return createAndFillLinkedList(4);
+    }
+
+    private LinkedList createAndFillLinkedList(int length) {
+        return createAndFillLinkedList(1, length);
+    }
+
+    private LinkedList createAndFillLinkedList(int start, int length) {
+        LinkedList linkedList = new LinkedList();
+        for (int i = start; i <= length; i++) {
+            linkedList.add(i);
+        }
+        return linkedList;
+    }
+
+    @Test
+    public void remove1() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(0, 0);
+        Assert.assertEquals("[1,2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove2() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(0, 1);
+        Assert.assertEquals("[2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove3() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 0);
+        Assert.assertEquals("[1,2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove4() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 1);
+        Assert.assertEquals("[1,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove5() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 3);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void remove6() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 4);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void remove7() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 5);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void getElements() throws Exception {
+//        LinkedList listA = createAndFillLinkedList(0, 8);
+//        LinkedList listB = createAndFillLinkedList(4, 4);
+//        Assert.assertEquals("[4,5,6,7]", Arrays.toString(listA.getElements(listB)));
+
+    }
+
+    @Test
+    public void subtract() throws Exception {
+
+    }
+
+    @Test
+    public void removeDuplicateValues() throws Exception {
+
+    }
+
+    @Test
+    public void removeRange() throws Exception {
+
+    }
+
+    @Test
+    public void intersection() throws Exception {
+
+    }
+
+    @Test
+    public void iterator() throws Exception {
+
+        List linkedList = new LinkedList();
+        linkedList.add("1");
+        linkedList.add("2");
+        linkedList.add("3");
+        linkedList.add("4");
+        Assert.assertEquals("[1,2,3,4]", linkedList.toString());
+    }
+
+    @Test
+    public void reverse() throws Exception {
+        LinkedList linkedList = new LinkedList();
+        linkedList.add("1");
+        linkedList.add("2");
+        linkedList.add("3");
+        linkedList.add("4");
+        linkedList.reverse();
+        Assert.assertEquals("[4,3,2,1]", linkedList.toString());
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java
new file mode 100644
index 000000000..e70c52a72
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java
@@ -0,0 +1,37 @@
+package com.coding.basic.array;
+
+import com.coding.basic.List;
+import com.coding.basic.array.ArrayList;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArrayListTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    private List list = new ArrayList();
+
+    @Before
+    public void before() {
+
+    }
+
+    @Test
+    public void add() throws Exception {
+        list.add(1);
+    }
+
+    @Test
+    public void get() throws Exception {
+        add();
+        logger.info("{}", list.get(0));
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java
new file mode 100644
index 000000000..04c8b5154
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package com.coding.basic.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil creatArrayUtil(){
+        return new ArrayUtil();
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] origin = new int[]{1, 2, 3};
+        int[] destArray = new int[]{3, 2, 1};
+        creatArrayUtil().reverseArray(origin);
+        Assert.assertArrayEquals(destArray, origin);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[] origin = new int[]{1, 2, 3, 0, 10};
+        int[] destArray = new int[]{1, 2, 3, 10};
+        int[] retArray = creatArrayUtil().removeZero(origin);
+        Assert.assertArrayEquals(destArray, retArray);
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a = new int[]{1, 2, 3};
+        int[] b = new int[]{2, 3};
+
+        int[] newArray = creatArrayUtil().merge(a, b);
+        info(newArray);
+        assertArrayEquals(new int[]{1, 2, 3}, newArray);
+    }
+
+    @Test
+    public void grow() throws Exception {
+        assertArrayEquals(new int[]{1, 2, 0, 0}, creatArrayUtil().grow(new int[]{1, 2}, 2));
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8}, creatArrayUtil().fibonacci(10));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 4)).intValue();
+        assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13}, creatArrayUtil().getPrimes(max));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 8)).intValue();
+        assertArrayEquals(new int[]{6, 28}, creatArrayUtil().getPerfectNumbers(max));
+
+    }
+
+    @Test
+    public void join() throws Exception {
+        assertEquals("1_2_3_10", creatArrayUtil().join(new int[]{1, 2, 3, 10}, "_"));
+    }
+
+    private void info(int[] array) {
+        System.out.println(Arrays.toString(array));
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/pom.xml b/students/1204187480/code/homework/common/pom.xml
new file mode 100644
index 000000000..3cbad444b
--- /dev/null
+++ b/students/1204187480/code/homework/common/pom.xml
@@ -0,0 +1,13 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>common</artifactId>
+    <packaging>jar</packaging>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent-dependencies</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent-dependencies/pom.xml</relativePath>
+    </parent>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java
new file mode 100755
index 000000000..67dd8fd1f
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java
@@ -0,0 +1,144 @@
+package com.coding.common.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 5/25/16.
+ */
+public class BeanUtils {
+
+
+    public static final String SET = "set";
+    public static final String GET = "get";
+    // 日志输出类
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final StringUtils2 stringUtils = new StringUtils2();
+
+    public Object setInvoke(Object para, String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+
+            method = obj.getClass().getMethod(methodName, para.getClass());
+            returnObj = method.invoke(obj, para);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object getInvoke(String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object invokeWithNoParamter(String methodName, Object obj) {
+        Method method;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+
+
+    public Object getPara(String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(GET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return getInvoke(methodName, object);
+    }
+
+
+
+    public Object setPara(Object para, String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(SET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return setInvoke(para, methodName, object);
+    }
+
+    public <T> T get(String paraName, Object object, Class<T> clazz) {
+        return (T) getPara(paraName, object);
+    }
+
+    public Integer getInt(String paraName, Object object) {
+        return (Integer) getPara(paraName, object);
+    }
+
+    public Long getLong(String paraName, Object object) {
+        return (Long) getPara(paraName, object);
+    }
+
+    public Double getDouble(String paraName, Object object) {
+        return (Double) getPara(paraName, object);
+    }
+
+    public BigDecimal getBigDecimal(String paraName, Object object) {
+        return (BigDecimal) getPara(paraName, object);
+    }
+
+    public String getString(String paraName, Object object) {
+        return getPara(paraName, object).toString();
+    }
+
+    public Date getDate(String paraName, Object object) {
+        return (Date) getPara(paraName, object);
+    }
+
+    public Long getLongByString(String paraName, Object object) {
+        return Long.parseLong(getString(paraName, object));
+    }
+
+    public Integer getIntByString(String paraName, Object object) {
+        return Integer.parseInt(getString(paraName, object));
+    }
+
+    public Double getDoubleByString(String paraName, Object object) {
+        return Double.parseDouble(getString(paraName, object));
+    }
+
+    public BigDecimal getBigDecimalByString(String paraName, Object object) {
+        return new BigDecimal(getString(paraName, object));
+    }
+
+    private final static String GETTER_PRE = "get";
+    public Map<String, Object> describe(Object model) {
+        Method[] methods = model.getClass().getDeclaredMethods(); //获取实体类的所有属性，返回Field数组
+        Map<String, Object> properties = new HashMap<>();
+        for (Method method : methods) {
+            String methodName = method.getName();
+            if (methodName.startsWith(GETTER_PRE)) {
+                try {
+                    Object o = method.invoke(model);
+                    String valueName = stringUtils.toLowwerCase(methodName.substring(GETTER_PRE.length()), 0);
+                    properties.put(valueName, o);
+                } catch (IllegalAccessException | InvocationTargetException e) {
+                   throw new IllegalStateException(e);
+                }
+            }
+        }
+        return properties;
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java
new file mode 100644
index 000000000..4126765ff
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java
@@ -0,0 +1,21 @@
+package com.coding.common.util;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public abstract class ByteUtils {
+
+    public static String byteToHexString(byte[] codes ){
+        StringBuffer buffer = new StringBuffer();
+        for(int i=0;i<codes.length;i++){
+            byte b = codes[i];
+            int value = b & 0xFF;
+            String strHex = Integer.toHexString(value);
+            if(strHex.length()< 2){
+                strHex = "0" + strHex;
+            }
+            buffer.append(strHex);
+        }
+        return buffer.toString();
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
new file mode 100644
index 000000000..08e42fb61
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
@@ -0,0 +1,73 @@
+package com.coding.common.util;
+
+import com.google.common.base.Preconditions;
+
+import java.io.*;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+public abstract class FileUtils2 {
+
+    public static List<File> listAllFiles(File directory) {
+        Preconditions.checkNotNull(directory);
+        Preconditions.checkArgument(directory.isDirectory()
+                , "file=%s is not directory", directory.getPath());
+        return listAllFiles(new ArrayList<>(), directory);
+    }
+
+    private static List<File> listAllFiles(List<File> files, File directory) {
+        File[] fileArr = directory.listFiles();
+        if (fileArr == null) {
+            return files;
+        }
+        for (File file : fileArr) {
+            if (file.isDirectory()) {
+                files = listAllFiles(files, file);
+            } else {
+                files.add(file);
+            }
+        }
+        return files;
+    }
+
+
+    public static String getCanonicalPath(File file) {
+        Preconditions.checkNotNull(file);
+        try {
+            return file.getCanonicalPath();
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    public static byte[] getBytes(File classFile) {
+        // byteArrayOutputStream, 可写的动长数组
+        ByteArrayOutputStream baos = null;
+        BufferedInputStream bis = null;
+        try {
+            baos = new ByteArrayOutputStream();
+            bis = new BufferedInputStream(new FileInputStream(classFile));
+            int intTmp = bis.read();
+            while (intTmp != -1) {
+                baos.write(intTmp);
+                intTmp = bis.read();
+            }
+            return baos.toByteArray();
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        } finally {
+            IOUtils2.close(baos);
+            IOUtils2.close(bis);
+        }
+    }
+
+    public static InputStream openStream(String classPath) {
+        return ClassLoader.getSystemResourceAsStream(classPath);
+    }
+
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
new file mode 100644
index 000000000..889c6cefb
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
@@ -0,0 +1,35 @@
+package com.coding.common.util;
+
+import java.io.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public abstract class IOUtils2 {
+
+    public static void close(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                throw new IllegalStateException(e);
+
+            }
+        }
+    }
+
+
+    public static List<String> readToStringList(InputStream inputStream) {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new InputStreamReader(inputStream));
+            return br.lines().collect(Collectors.toList());
+        } finally {
+            close(br);
+        }
+
+    }
+
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java
new file mode 100644
index 000000000..088335169
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java
@@ -0,0 +1,34 @@
+package com.coding.common.util;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StringUtils2 {
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toUpperCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length) {
+            throw new RuntimeException("the char at the index don't exist");
+        }
+        chars[index] = Character.toUpperCase(chars[index]);
+        return new String(chars);
+    }
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toLowwerCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length ) {throw new RuntimeException("the char at the index don't exist");}
+        chars[index] = Character.toLowerCase(chars[index]);
+        return new String(chars);
+    }
+
+    public boolean isSpaceOrNull(String paraName) {
+        return (paraName == null || paraName.trim().isEmpty());
+    }
+
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java
new file mode 100644
index 000000000..eb41a7e26
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java
@@ -0,0 +1,22 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArraysTest {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    @Test
+    public void testCopyOf(){
+        Object[] a = new Object[]{1, 2, 3, 4};
+        Object[] b = Arrays.copyOf(a, 10);
+        logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b));
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java
new file mode 100644
index 000000000..efc402237
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java
@@ -0,0 +1,24 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class SystemTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+        @Test
+    public void testArrayCopy() {
+        int[] a = new int[]{1, 2, 3, 4, 5, 6, 7};
+        int[] b = new int[]{11, 22, 33, 44, 55, 66, 77};
+        System.arraycopy(a, 2, b, 4, 3);
+        logger.info("b={}", Arrays.toString(b));
+
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java
new file mode 100644
index 000000000..62dd4907c
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java
@@ -0,0 +1,20 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public class ByteUtilsTest {
+
+    @Test
+    public void testByteToHexString(){
+        byte[] bytes = new byte[]{
+                1,
+                (byte) 255
+        };
+        System.out.println(ByteUtils.byteToHexString(bytes));
+        System.out.println(Integer.toHexString(255));
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java
new file mode 100644
index 000000000..cb58cf99c
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java
@@ -0,0 +1,35 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+public class FileUtils2Test {
+    @Test
+    public void getCanonicalPath() throws Exception {
+        System.out.println(FileUtils2.getCanonicalPath(new File("")));
+    }
+
+    @Test
+    public void getBytes() throws Exception {
+        byte[] bytes = FileUtils2.getBytes(new File("pom.xml"));
+        System.out.println(new String(bytes));
+        System.out.println(ByteUtils.byteToHexString(bytes));
+
+    }
+
+
+    @Test
+    public void listAllFiles() throws Exception {
+        String currentPath = new File("").getCanonicalPath();
+        List<File> files = FileUtils2.listAllFiles(new File(currentPath ));
+        for (File file : files) {
+            System.out.println(file.getCanonicalPath());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java
new file mode 100644
index 000000000..687091903
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java
@@ -0,0 +1,26 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static com.coding.common.util.FileUtils2.openStream;
+import static com.coding.common.util.IOUtils2.readToStringList;
+import static org.junit.Assert.*;
+
+/**
+ * <p>
+ * <p>
+ *
+ * @author raoxiang <xiangrao@qilin99.com>
+ * @version 6/13/17
+ * @since 1.8
+ */
+public class IOUtils2Test {
+    @Test
+    public void readToStringListTest() throws Exception {
+        List<String> poms = readToStringList(openStream("test.json"));
+        System.out.println(poms);
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/test/resources/test.json b/students/1204187480/code/homework/common/src/test/resources/test.json
new file mode 100644
index 000000000..ccc0682ac
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/resources/test.json
@@ -0,0 +1,4 @@
+{
+  "key1": "value1"
+  , "key2": "value2"
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/parent-dependencies/pom.xml b/students/1204187480/code/homework/parent-dependencies/pom.xml
new file mode 100644
index 000000000..b961e90c5
--- /dev/null
+++ b/students/1204187480/code/homework/parent-dependencies/pom.xml
@@ -0,0 +1,169 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coding</groupId>
+    <artifactId>parent-dependencies</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-SNAPSHOT</version>
+    <url>https://github.com/luoziyihao/coding2017</url>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>alimaven</id>
+            <name>aliyun maven</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+    <repositories>
+        <repository>
+            <id>alimaven</id>
+            <name>aliyun maven</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>spring-snapshots</id>
+            <name>Spring Snapshots</name>
+            <url>https://repo.spring.io/libs-snapshot</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version>
+        <logback.version>1.1.7</logback.version>
+        <logback-classic.version>1.1.7</logback-classic.version>
+        <commons-logging.version>1.2</commons-logging.version>
+        <log4j.version>1.2.17</log4j.version>
+        <junit.version>4.12</junit.version>
+        <commons-lang3.version>3.4</commons-lang3.version>
+        <commons-collections4.version>4.1</commons-collections4.version>
+        <commons-io.version>2.5</commons-io.version>
+        <commons-beanutils.version>1.9.2</commons-beanutils.version>
+        <guava.version>19.0</guava.version>
+        <rxjava.version>1.1.6</rxjava.version>
+        <lombok.version>1.16.10</lombok.version>
+        <fastjson.version>1.2.22</fastjson.version>
+        <strman.version>0.2.0</strman.version>
+        <joda-time.version>2.9.4</joda-time.version>
+
+    </properties>
+
+    <dependencies>
+        <!-- 日志 -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-classic.version}</version>
+        </dependency>
+        <!-- 配置所有依赖库的日志依赖 start-->
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>${commons-logging.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${log4j.version}</version>
+        </dependency>
+        <!-- 配置所有依赖库的日志依赖 end-->
+        <!--  utils 相关jar包 start -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons-collections4.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons-beanutils.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>${joda-time.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.reactivex</groupId>
+            <artifactId>rxjava</artifactId>
+            <version>${rxjava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.shekhargulati</groupId>
+            <artifactId>strman</artifactId>
+            <version>${strman.version}</version>
+        </dependency>
+        <!--  utils 相关jar包 end -->
+
+        <!-- 测试 -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <!-- 编译插件 制定编译级别 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/parent/pom.xml b/students/1204187480/code/homework/parent/pom.xml
new file mode 100644
index 000000000..e6a94a2e4
--- /dev/null
+++ b/students/1204187480/code/homework/parent/pom.xml
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>parent</artifactId>
+    <packaging>pom</packaging>
+    <description>manage the dependencies for modules</description>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent-dependencies</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent-dependencies/pom.xml</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.coding</groupId>
+            <artifactId>common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/pom.xml b/students/1204187480/code/homework/pom.xml
new file mode 100644
index 000000000..28ac74f15
--- /dev/null
+++ b/students/1204187480/code/homework/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.coding</groupId>
+    <artifactId>coding2017</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <modules>
+        <module>parent-dependencies</module>
+        <module>common</module>
+        <module>parent</module>
+        <module>coding</module>
+        <module>coderising</module>
+    </modules>
+
+
+</project>
diff --git "a/students/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" "b/students/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272"
new file mode 100644
index 000000000..e69de29bb
diff --git a/students/1204187480/note/todo/homework.md b/students/1204187480/note/todo/homework.md
new file mode 100644
index 000000000..5f111a9ea
--- /dev/null
+++ b/students/1204187480/note/todo/homework.md
@@ -0,0 +1,8 @@
+# 0326 操作系统中的lru算法
+
+ClassFileLoader
+
+LRUPageFrame
+
+深入理解java虚拟机 第6章
+
diff --git a/students/1241588932/pom.xml b/students/1241588932/pom.xml
new file mode 100644
index 000000000..ad245eee9
--- /dev/null
+++ b/students/1241588932/pom.xml
@@ -0,0 +1,54 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment-enan</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ood-assignment-enan</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.16</version>
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..e46879531
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static final String CONFIG_FILE_NAME = "email_config.properties";
+
+	static Map<String,String> configurations = new HashMap<>();
+	static{
+		// TODO 从配置文件中加载配置到 map 中
+		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/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..7fe226d1b
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.config;
+
+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/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 000000000..fb6970cee
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+public class UserDao {
+
+    private static UserDao INSTANCE;
+
+    public static UserDao getInstance() {
+        if (INSTANCE == null) {
+            synchronized (UserDao.class) {
+                INSTANCE = new UserDao();
+            }
+        }
+        return INSTANCE;
+    }
+
+    private UserDao() {}
+
+    public List<User> querySubscriptedUsersByProductID(String productID) {
+        String sql = "Select name, email from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 000000000..70b2c7870
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+@Data
+@Builder
+public class Product {
+
+    private String productID;
+    private String productDesc;
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 000000000..0f79352cf
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.entity;
+
+import lombok.Data;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+@Data
+public class User {
+
+    private String name;
+    private String email;
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/main.java b/students/1241588932/src/main/java/com/coderising/ood/srp/main.java
new file mode 100644
index 000000000..af2b5ce8f
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/main.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.service.IPromotionMail;
+import com.coderising.ood.srp.service.impl.PromotionMailImpl;
+import com.coderising.ood.srp.service.impl.ReadProductConfigImpl;
+import com.coderising.ood.srp.service.impl.UserServiceImpl;
+
+import java.io.File;
+import java.net.URL;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class main {
+
+    public static void main(String[] args) {
+        IPromotionMail promotionMail = new PromotionMailImpl(new UserServiceImpl(), new ReadProductConfigImpl());
+        URL base = Thread.currentThread().getContextClassLoader().getResource("");
+        promotionMail.send(new File(base.getFile(), "product_promotion.txt"));
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java
new file mode 100644
index 000000000..ba940b09d
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IPromotionMail {
+
+    void send(File file);
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java
new file mode 100644
index 000000000..1b2c45d1e
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.entity.Product;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IReadProductConfig {
+
+    Collection<Product> read(File file) throws IOException;
+
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java
new file mode 100644
index 000000000..652ba08fb
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.entity.User;
+
+import java.util.Collection;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IUserService {
+
+    Collection<User> querySubscriptedUsersByProductID(String productID);
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java
new file mode 100644
index 000000000..497f16ccf
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java
@@ -0,0 +1,66 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.IPromotionMail;
+import com.coderising.ood.srp.service.IReadProductConfig;
+import com.coderising.ood.srp.service.IUserService;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class PromotionMailImpl implements IPromotionMail {
+
+    private IUserService userService;
+    private IReadProductConfig readProductConfig;
+
+    private static final String SUBJECT = "您关注的产品降价了";
+    private static final String MESSAGE = "尊敬的 %s, 您关注的产品 %s 降价了，欢迎购买!";
+
+    public PromotionMailImpl (IUserService iUserService, IReadProductConfig iReadProductConfig) {
+        this.userService = iUserService;
+        this.readProductConfig = iReadProductConfig;
+    }
+
+    @Override
+    public void send(File file) {
+        Collection<Product> products;
+        try {
+            products = readProductConfig.read(file);
+        } catch (IOException e) {
+            throw new RuntimeException("读取降价商品失败，终止发送降价邮件提醒");
+        }
+        for (Product product : products) {
+            List<User> users = (List<User>) userService.querySubscriptedUsersByProductID(product.getProductID());
+
+            for (User user : users) {
+                try {
+                    if (user.getEmail().length() > 0)
+                        MailUtil.sendEmail(user.getEmail(),
+                                Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN),
+                                SUBJECT,
+                                String.format(MESSAGE, user.getName(), product.getProductDesc()),
+                                Configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+                } catch (Exception e) {
+                    try {
+                        MailUtil.sendEmail(user.getEmail(),
+                                Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN),
+                                SUBJECT,
+                                String.format(MESSAGE, user.getName(), product.getProductDesc()),
+                                Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java
new file mode 100644
index 000000000..9360be24a
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.service.IReadProductConfig;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class ReadProductConfigImpl implements IReadProductConfig {
+    @Override
+    public Collection<Product> read(File file) throws IOException {
+        List<Product> products = new ArrayList<>();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+
+                System.out.println("产品ID = " + data[0] + "\n");
+                System.out.println("产品描述 = " + data[1] + "\n");
+
+                products.add(Product.builder().productID(data[0]).productDesc(data[1]).build());
+            }
+            return products;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java
new file mode 100644
index 000000000..f38ce0f77
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.IUserService;
+
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class UserServiceImpl implements IUserService {
+
+    private UserDao userDao = UserDao.getInstance();
+
+    @Override
+    public List<User> querySubscriptedUsersByProductID(String productID) {
+        return userDao.querySubscriptedUsersByProductID(productID);
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..a6e495ab0
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+import com.coderising.ood.srp.entity.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List query(String sql){
+		
+		List<User> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/1241588932/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..dd640423c
--- /dev/null
+++ b/students/1241588932/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(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/1241588932/src/main/resources/email_config.properties b/students/1241588932/src/main/resources/email_config.properties
new file mode 100644
index 000000000..6f5615d18
--- /dev/null
+++ b/students/1241588932/src/main/resources/email_config.properties
@@ -0,0 +1,3 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
\ No newline at end of file
diff --git a/students/1241588932/src/main/resources/product_promotion.txt b/students/1241588932/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1241588932/src/main/resources/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/1299310140/src/com/coderising/ood/srp/CheckUtil.java b/students/1299310140/src/com/coderising/ood/srp/CheckUtil.java
new file mode 100644
index 000000000..657c4c810
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/CheckUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp;
+
+public class CheckUtil {
+	protected static boolean checkEmail(String emailAddress){
+		if(emailAddress.length() > 0){
+			return true;
+		}else{
+			return false;
+		}
+	}
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/Configuration.java b/students/1299310140/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..927c7155c
--- /dev/null
+++ b/students/1299310140/src/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<String,String> 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/1299310140/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/1299310140/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..868a03ff8
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/DBUtil.java b/students/1299310140/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..65383e4db
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/MailUtil.java b/students/1299310140/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..373f3ee30
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/Product.java b/students/1299310140/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..4d1706b42
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String id;
+	
+	private String desc;
+
+	public Product(String id, String desc) {
+		super();
+		this.id = id;
+		this.desc = desc;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+	
+	
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..aa40bc625
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,96 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+	
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	
+	protected String toAddress = null;
+	protected String subject = null;
+	protected String message = null;
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+
+	public static void main(String[] args) throws Exception {
+
+		//C:\\my Program Files\\mygit\\second\\coding2017\\students\\1299310140\\src\\com\\coderising\\ood\\srp
+		String productFilePath = "C:\\my Program Files\\mygit\\second\\coding2017\\students\\1299310140\\src\\com\\coderising\\ood\\srp\\product_promotion.txt";
+		Product product = ReadFile.readProductFile(productFilePath);
+		
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getId() +"' "
+				+ "and send_mail=1 ";
+		List list = DBUtil.query(sendMailQuery);
+		
+		if(list == null){
+			System.out.println("没有邮件发送");
+			return;
+		}
+		
+		Configuration config = new Configuration();
+		PromotionMail pe = new PromotionMail(config);
+		boolean emailDebug = false;
+		
+		Iterator iter = list.iterator();
+		while (iter.hasNext()) {
+			HashMap userInfo = (HashMap) iter.next();
+			if(CheckUtil.checkEmail((String) userInfo.get(EMAIL_KEY))){
+				pe.setMessageAndToAddress(userInfo,product);
+				pe.sendEMails(emailDebug);
+			}
+		}
+		
+	}
+
+	
+	public PromotionMail(Configuration config){
+		
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		
+	}
+
+	protected void setMessageAndToAddress(HashMap userInfo,Product product)
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+		
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!" ;		
+		
+	}
+	
+	protected void sendEMails(boolean debug) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+		try 
+		{
+			
+				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()); 
+			}
+		}
+	}
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/ReadFile.java b/students/1299310140/src/com/coderising/ood/srp/ReadFile.java
new file mode 100644
index 000000000..15aadf91b
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/ReadFile.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ReadFile {
+	
+	protected static Product readProductFile(String productFilePath) throws IOException
+	{
+		File file = new File(productFilePath);
+		
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			Product product = new Product(data[0],data[1]);
+			
+			System.out.println("产品ID = " + product.getId() + "\n");
+			System.out.println("产品描述 = " + product.getDesc() + "\n");
+			
+			return product;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/product_promotion.txt b/students/1299310140/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1299310140/src/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/1329920463/src/com/tm/test/Test.java b/students/1329920463/src/com/tm/test/Test.java
new file mode 100644
index 000000000..1e4ea2843
--- /dev/null
+++ b/students/1329920463/src/com/tm/test/Test.java
@@ -0,0 +1,8 @@
+package com.tm.test;
+
+public class Test {
+
+	public static void main(String[] args) {
+		System.out.println("Hello World!");
+	}
+}
diff --git a/students/1363044717/ood-assignment/pom.xml b/students/1363044717/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1363044717/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/1363044717/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<String,String> 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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/1363044717/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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..dbf48911d
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,23 @@
+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<User> query(String sql) {
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User userInfo = new User("User" + i, "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..e7b12edd3
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class FileUtil {
+
+    public static String readFile(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            return temp;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..c18227852
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class Mail {
+    private String subject;
+    private String 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;
+    }
+    protected void setPromotionMessage(String userName, String productDesc) {
+        this.setSubject("您关注的产品降价了");
+        this.setMessage("尊敬的 " + userName + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!");
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..129ffdd20
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress,Mail mail, 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(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+	}
+
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..5ff6a9665
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+
+    public Product() {
+    }
+
+    public Product(String productID, String productDesc) {
+        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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..43d0b264b
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,97 @@
+﻿package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected Mail mail = new Mail();
+    protected Product product = null;
+    protected boolean debug = false;
+    protected List<User> mailingList = null;
+
+    private static Configuration config;
+
+    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);
+        pe.sendEMails();
+    }
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+        debug = mailDebug;
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        loadProduct(file);
+        loadConfig();
+        loadMailingList();
+    }
+
+    protected void loadProduct(File file) throws Exception {
+        String fileStr = FileUtil.readFile(file);
+        String data[] = fileStr.split(" ");
+        product = new Product(data[0], data[1]);
+    }
+
+    protected void loadMailingList() {
+        mailingList = UserService.loadMailingListByProductId(product.getProductID());
+    }
+
+    protected void loadConfig() {
+        config = new Configuration();
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+    }
+
+    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 boolean validateToAddress() {
+        return toAddress.length() > 0;
+    }
+
+    protected void setToAddress(String address) {
+        toAddress = address;
+    }
+
+    protected void sendEMails() throws IOException {
+        System.out.println("开始发送邮件");
+        if (mailingList == null) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        for (User user : mailingList) {
+            this.setToAddress(user.getEmail());
+            if (!this.validateToAddress()) {
+                continue;
+            }
+            //设置促销消息
+            mail.setPromotionMessage(user.getName(), product.getProductDesc());
+            try {
+                MailUtil.sendEmail(toAddress, fromAddress, mail, smtpHost, debug);
+            } catch (Exception e) {
+                try {
+                    MailUtil.sendEmail(toAddress, fromAddress, mail, altSmtpHost, debug);
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..71fcd1ea8
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class User {
+
+    private String email;
+    private String name;
+
+    public User() {
+    }
+
+    public User(String email, String name) {
+        this.email = email;
+        this.name = name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
new file mode 100644
index 000000000..3b2bd5aac
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class UserService {
+
+    public static List<User> loadMailingListByProductId(String productID) {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1363044717/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/1377699408/README.md b/students/1377699408/README.md
new file mode 100644
index 000000000..bf3d9bbc9
--- /dev/null
+++ b/students/1377699408/README.md
@@ -0,0 +1,2 @@
+## 1377699408的文件夹
+测试
diff --git a/students/1377699408/data-structure/answer/pom.xml b/students/1377699408/data-structure/answer/pom.xml
new file mode 100644
index 000000000..ac6ba882d
--- /dev/null
+++ b/students/1377699408/data-structure/answer/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-answer</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-answer</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 000000000..900a3ad35
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 000000000..c3c8a3f27
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 000000000..4ff7f46ae
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 000000000..0957eaf7f
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 000000000..1551a80b3
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 000000000..ce045393b
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 000000000..bf9807b30
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 000000000..36a9d2ce1
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 000000000..172371dd5
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 000000000..dcdbe226e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 000000000..85e2e22de
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 000000000..b8c81faf3
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 000000000..07df2a5da
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 000000000..e5d9aebba
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 000000000..06ef6311b
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java
new file mode 100644
index 000000000..10d13b583
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 000000000..4576c016a
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 000000000..45740e6d5
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 000000000..24b9d8b15
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,164 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		Node node = find(pageNum);
+		//在该队列中存在， 则提到队列头
+		if (node != null) {
+			
+			moveExistingNodeToHead(node);		
+			
+		} else{
+			
+			node = new Node();
+			node.pageNum = pageNum;
+			
+			// 缓存容器是否已经超过大小.
+			if (currentSize >= capacity) {			
+				removeLast();
+							
+			} 
+			
+			addNewNodetoHead(node);
+			
+			
+			
+						
+		}
+	}
+	
+	private void addNewNodetoHead(Node node) {
+		
+		if(isEmpty()){
+			
+			node.prev = null;
+			node.next = null;
+			first = node;
+			last = node;
+			
+		} else{
+			node.prev = null;
+			node.next = first;
+			first.prev = node;
+			first = node;
+		}
+		this.currentSize ++;
+	}
+
+	private Node find(int data){
+		
+		Node node = first;
+		while(node != null){
+			if(node.pageNum == data){
+				return node;
+			}
+			node = node.next;
+		}
+		return null;
+		
+	}
+
+	
+
+	
+	
+
+	/**
+	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
+	 */
+	private void removeLast() {
+		Node prev = last.prev;
+		prev.next = null;
+		last.prev = null;
+		last = prev;
+		this.currentSize --;
+	}
+
+	/**
+	 * 移动到链表头，表示这个节点是最新使用过的
+	 * 
+	 * @param node
+	 */
+	private void moveExistingNodeToHead(Node node) {
+		
+		if (node == first) {
+			
+			return;
+		}
+		else if(node == last){
+			//当前节点是链表尾， 需要放到链表头
+			Node prevNode = node.prev;
+			prevNode.next = null;	
+			last.prev = null;
+			last  = prevNode;				
+			
+		} else{
+			//node 在链表的中间， 把node 的前后节点连接起来
+			Node prevNode = node.prev;
+			prevNode.next = node.next;
+			
+			Node nextNode = node.next;
+			nextNode.prev = prevNode;
+			
+			
+		}
+		
+		node.prev = null;
+		node.next = first;
+		first.prev = node;
+		first = node;	
+		
+	}
+	private boolean isEmpty(){		
+		return (first == null) && (last == null);
+	}
+
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 000000000..7fd72fc2b
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 000000000..f4c7556a2
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 000000000..f169d5f8e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+public class CircleQueue <E> {
+
+	//用数组来保存循环队列的元素
+	private Object[] elementData ;
+	int size = 0;
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public CircleQueue(int capacity){
+		elementData = new Object[capacity];
+	}
+	public boolean isEmpty() {
+		return (front == rear) && !isFull();
+        
+    }
+	
+	public boolean isFull(){
+		return  size == elementData.length;
+	}
+    public int size() {
+        return size;
+    }
+
+    public void enQueue(E data) {
+        if(isFull()){
+        	throw new RuntimeException("The queue is full");
+        }
+        rear = (rear+1) % elementData.length;
+        elementData[rear++] = data;
+        size++;
+    }
+
+    public E deQueue() {
+        if(isEmpty()){
+        	throw new RuntimeException("The queue is empty");
+        }
+        E data = (E)elementData[front];
+        elementData[front] = null;
+        front = (front+1) % elementData.length;
+        size --;
+        return data;
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
new file mode 100644
index 000000000..7307eb77d
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
@@ -0,0 +1,44 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class CircleQueueTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		CircleQueue<String> queue = new CircleQueue<String>(5);		
+		Assert.assertTrue(queue.isEmpty());
+		Assert.assertFalse(queue.isFull());
+		
+		queue.enQueue("a");
+		queue.enQueue("b");
+		queue.enQueue("c");
+		queue.enQueue("d");
+		queue.enQueue("e");
+		
+		Assert.assertTrue(queue.isFull());
+		Assert.assertFalse(queue.isEmpty());
+		Assert.assertEquals(5, queue.size());
+		
+		Assert.assertEquals("a", queue.deQueue());
+		Assert.assertEquals("b", queue.deQueue());
+		Assert.assertEquals("c", queue.deQueue());
+		Assert.assertEquals("d", queue.deQueue());
+		Assert.assertEquals("e", queue.deQueue());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 000000000..36ec615d3
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){
+		
+		Queue<Integer> queue = new Queue<Integer>();
+        for (int i = 0; i < n; i++){
+        	queue.enQueue(i);
+        }
+        
+        List<Integer> result = new ArrayList<Integer>();
+        int i = 0;
+
+        while (!queue.isEmpty()) {
+
+            int x = queue.deQueue();            
+
+            if (++i % m == 0){
+            	result.add(x);
+            } else{
+            	queue.enQueue(x);
+            }
+        }
+
+        
+        return result;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 000000000..7d90318b5
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 000000000..c4c4b7325
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 000000000..bc97df080
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,55 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+import java.util.Stack;
+
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    private void moveStack1ToStack2() {
+        while (!stack1.isEmpty()){
+        	stack2.push(stack1.pop());
+        }
+            
+    }
+
+
+    public boolean isEmpty() {
+        return stack1.isEmpty() && stack2.isEmpty();
+    }
+
+
+    
+    public int size() {
+        return stack1.size() + stack2.size();     
+    }
+
+
+
+    public void enQueue(E item) {
+        stack1.push(item);
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue is empty");
+        }
+        if (stack2.isEmpty()) {
+        	moveStack1ToStack2();
+        }
+        
+        return stack2.pop();
+    }
+
+
+
+ }
+
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 000000000..faf2644ab
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,44 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	
+	private Stack<Integer> normalStack = new Stack<Integer>();
+	private Stack<Integer> minNumStack = new Stack<Integer>();
+	
+	public void push(int data){
+		
+		normalStack.push(data);
+		
+		if(minNumStack.isEmpty()){
+			minNumStack.push(data);
+		} else{
+			if(minNumStack.peek() >= data) {
+				minNumStack.push(data);
+	        }
+		}
+		
+	}
+	public int pop(){
+		if(normalStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		int value = normalStack.pop();
+		if(value == minNumStack.peek()){
+			minNumStack.pop();
+		}
+		return value;
+	}
+	public int findMin(){
+		if(minNumStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		return minNumStack.peek();
+	}
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
new file mode 100644
index 000000000..efe41a9f8
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
@@ -0,0 +1,39 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class QuickMinStackTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		QuickMinStack stack = new QuickMinStack();
+		stack.push(5);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(6);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		
+		stack.pop();
+		Assert.assertEquals(4, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 000000000..fedb24360
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 000000000..7c86d22fe
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,168 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	public static void bad_reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack<Integer> tmpStack = new Stack();
+		while(!s.isEmpty()){
+			tmpStack.push(s.pop());
+		}
+		
+		s = tmpStack;
+		
+	}
+	
+	
+	
+	public static void reverse_247565311(Stack<Integer> s){
+        if(s == null || s.isEmpty()) {
+        	return;
+        }
+        
+        int size = s.size();
+        Stack<Integer> tmpStack = new Stack<Integer>();        
+        
+        for(int i=0;i<size;i++){
+            Integer top = s.pop();
+            while(s.size()>i){
+                tmpStack.push(s.pop());
+            }
+            s.push(top);
+            while(tmpStack.size()>0){
+                s.push(tmpStack.pop());
+            }
+        }
+    }
+
+
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		
+		Stack<Integer> tmp = new Stack<Integer>();
+		while(!s.isEmpty()){
+			tmp.push(s.pop());
+		}
+		while(!tmp.isEmpty()){
+			Integer top = tmp.pop();
+			addToBottom(s,top);
+		}	
+		
+		
+	}
+	public static void addToBottom(Stack<Integer> s,  Integer value){
+		if(s.isEmpty()){
+			s.push(value);
+		} else{
+			Integer top = s.pop();
+			addToBottom(s,value);
+			s.push(top);
+		}
+		
+	}
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack tmpStack = new Stack();
+		
+		while(!s.isEmpty()){
+			Object value = s.pop();
+			if(!value.equals(o)){
+				tmpStack.push(value);
+			} 			
+		}
+		
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		
+		if(s == null || s.isEmpty() || s.size()<len || len <=0 ){
+			return null;
+		}
+		
+		Stack tmpStack = new Stack();
+		int i = 0;
+		Object[] result = new Object[len];
+		while(!s.isEmpty()){
+			Object value = s.pop();			
+			tmpStack.push(value);
+			result[i++] = value;
+			if(i == len){
+				break;
+			}
+		}
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+		return result;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		
+		Stack<Character> stack = new Stack();
+		for(int i=0;i<s.length();i++){
+			char c = s.charAt(i);
+			
+			if(c == '(' || c =='[' || c == '{'){
+				
+				stack.push(c);
+				
+			} else if( c == ')'){
+				
+				char topChar = stack.pop();
+				if(topChar != '('){
+					return false;
+				}
+				
+			} else if( c == ']'){
+				
+				char topChar = stack.pop();
+				if(topChar != '['){
+					return false;
+				}
+					
+			} else if( c == '}'){
+				
+				char topChar = stack.pop();
+				if(topChar != '{'){
+					return false;
+				}
+				
+			}
+		}
+		return stack.size() == 0;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 000000000..ae0210ff4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,86 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddToBottom() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		StackUtil.addToBottom(s, 0);
+		
+		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+		
+	}
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testReverse_247565311() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		Assert.assertEquals("[1, 2, 3]", s.toString());
+		StackUtil.reverse_247565311(s);
+		Assert.assertEquals("[3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 000000000..7a58fbff5
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,53 @@
+package com.coding.basic.stack;
+
+import java.util.ArrayDeque;
+import java.util.Queue;
+
+public class StackWithTwoQueues {
+	Queue<Integer> queue1 = new ArrayDeque<>();
+    Queue<Integer> queue2 = new ArrayDeque<>();
+
+    public void push(int data) {
+        //两个栈都为空时，优先考虑queue1
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+       
+        if (queue1.isEmpty()) {
+            queue2.add(data);
+            return;
+        }
+
+        if (queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+
+    }
+
+    public int pop() {
+        
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+        	throw new RuntimeException("stack is empty");
+        } 
+        
+        if (queue1.isEmpty()) {
+            while (queue2.size()>1) {
+                queue1.add(queue2.poll());
+            }
+            return queue2.poll();
+        } 
+        
+        if (queue2.isEmpty()) {
+            while (queue1.size()>1) {
+                queue2.add(queue1.poll());
+            }
+            return queue1.poll();
+        }
+        
+        throw new RuntimeException("no queue is empty, this is not allowed");
+        
+
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
new file mode 100644
index 000000000..4541b1f04
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
@@ -0,0 +1,36 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class StackWithTwoQueuesTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		StackWithTwoQueues stack = new StackWithTwoQueues();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        Assert.assertEquals(4, stack.pop());
+        Assert.assertEquals(3, stack.pop());
+      
+        stack.push(5);
+        Assert.assertEquals(5, stack.pop());
+        Assert.assertEquals(2, stack.pop());
+        Assert.assertEquals(1, stack.pop());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
new file mode 100644
index 000000000..7f30ce55c
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
@@ -0,0 +1,5 @@
+package com.coding.basic.stack;
+
+public class Tail {
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 000000000..a532fd6e6
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,117 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	private Object[] data = new Object[10];
+	private int size;
+    private int top1, top2;
+    
+    public TwoStackInOneArray(int n){
+    	data = new Object[n];
+    	size = n;
+    	top1 = -1;
+        top2 = data.length;
+    }
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		ensureCapacity();
+		data[++top1] = o;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		ensureCapacity();
+		data[--top2] = o;
+	}
+	public void ensureCapacity(){
+		if(top2-top1>1){
+			return;
+		} else{
+			
+			Object[] newArray = new Object[data.length*2];
+			System.arraycopy(data, 0, newArray, 0, top1+1);
+			
+			int stack2Size = data.length-top2;
+			int newTop2 = newArray.length-stack2Size;
+			System.arraycopy(data, top2, newArray, newTop2, stack2Size);
+			
+			top2 = newTop2;
+			data = newArray;
+		}
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		Object o = data[top1];
+		data[top1] = null;
+		top1--;
+		return o;
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		Object o = data[top2];
+		data[top2] = null;
+		top2++;
+		return o;
+	}
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		return data[top1];
+	}
+	
+	
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		return data[top2];
+	}
+	
+	public Object[] stack1ToArray(){
+		return Arrays.copyOf(data, top1+1);
+	}
+	public Object[] stack2ToArray(){
+		int size = data.length-top2;
+		Object [] stack2Data = new Object[size];
+		int j=0;
+		for(int i=data.length-1; i>=top2 ;i--){
+			stack2Data[j++] = data[i];
+		}
+		return stack2Data;	
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
new file mode 100644
index 000000000..b743d422c
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class TwoStackInOneArrayTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test1() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(10);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		stack.push2(5);
+		
+		for(int i=1;i<=5;i++){
+			Assert.assertEquals(stack.peek1(), stack.peek2());
+			Assert.assertEquals(stack.pop1(), stack.pop2());
+		}
+		
+		
+	}
+	@Test
+	public void test2() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(5);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		stack.push1(6);
+		stack.push1(7);	
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		
+		
+		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray()));
+		Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray()));
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 000000000..cebef21fa
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,72 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Token> opStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		
+		for(Token token : tokens){
+			
+			if (token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					Token prevOperator = opStack.pop();
+					Float f2 = numStack.pop();
+					Float f1 = numStack.pop();
+					Float result = calculate(prevOperator.toString(), f1,f2);
+					numStack.push(result);						
+					
+				}
+				opStack.push(token);
+			} 
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			Token token = opStack.pop();
+			Float f2 = numStack.pop();
+			Float f1 = numStack.pop();
+			numStack.push(calculate(token.toString(), f1,f2));
+		}
+		
+		
+		return numStack.pop().floatValue();
+	}
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 000000000..20e34e885
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 000000000..9e501eda2
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,43 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class InfixToPostfix {
+
+	public static List<Token> convert(String expr) {
+		List<Token> inFixTokens = new TokenParser().parse(expr);
+		
+		List<Token> postFixTokens = new ArrayList<>();
+		
+		Stack<Token> opStack = new Stack<Token>();
+		for(Token token : inFixTokens){
+			
+			if(token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					postFixTokens.add(opStack.pop());					
+					
+				}
+				opStack.push(token);		
+				
+			}
+			if(token.isNumber()){
+				
+				postFixTokens.add(token);
+				
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			postFixTokens.add(opStack.pop());	
+		}
+		
+		return postFixTokens;
+	}
+
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
new file mode 100644
index 000000000..f879f55f1
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class InfixToPostfixTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testConvert() {
+		{
+			List<Token> tokens = InfixToPostfix.convert("2+3");
+			Assert.assertEquals("[2, 3, +]", tokens.toString());
+		}
+		{
+		
+			List<Token> tokens = InfixToPostfix.convert("2+3*4");
+			Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString());
+		}
+		
+		{
+			
+			List<Token> tokens = InfixToPostfix.convert("2-3*4+5");
+			Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString());
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 000000000..c54eb69e2
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,46 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			} else{
+				Float f2 = numStack.pop();
+				Float f1 = numStack.pop();
+				numStack.push(calculate(token.toString(),f1,f2));
+			}
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 000000000..c0435a2db
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 000000000..f811fd6d9
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		Stack<Token> exprStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			exprStack.push(token);
+		}
+		
+		while(!exprStack.isEmpty()){
+			Token t = exprStack.pop();
+			if(t.isNumber()){
+				numStack.push(new Float(t.getIntValue()));
+			}else{
+				Float f1 = numStack.pop();
+				Float f2 = numStack.pop();
+				numStack.push(calculate(t.toString(),f1,f2));
+				
+			}		
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 000000000..5cec210e7
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 000000000..8579743fe
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 000000000..d3b0f167e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 000000000..399d3e857
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 000000000..284e5b001
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,189 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		if(root == null){
+			return null;
+		}
+		return findMin(root).data;
+	}
+	public T findMax(){
+		if(root == null){
+			return null;
+		}
+		return findMax(root).data;
+	}
+	public int height() {
+	    return height(root);
+	}
+	public int size() {
+		return size(root);
+	}
+	public void remove(T e){
+		remove(e, root);
+	}
+	
+	private BinaryTreeNode<T> remove(T x, BinaryTreeNode<T> t){
+		if(t == null){
+			return t;
+		}
+		int compareResult = x.compareTo(t.data);
+		
+		if(compareResult< 0 ){			
+			t.left = remove(x,t.left);			
+			
+		} else if(compareResult > 0){			
+			t.right = remove(x, t.right);
+			
+		} else {
+			if(t.left != null && t.right != null){
+			
+				t.data = findMin(t.right).data;
+				t.right = remove(t.data,t.right);
+				
+			} else{
+				t = (t.left != null) ? t.left : t.right;
+			}
+		}
+		return t;
+	}
+	
+	private BinaryTreeNode<T> findMin(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		} else if (p.left == null){
+			return p;
+		} else{
+			return findMin(p.left);
+		}
+	}
+	private BinaryTreeNode<T> findMax(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		}else if (p.right==null){
+			return p;
+		} else{
+			return findMax(p.right);
+		}
+	}
+	private int height(BinaryTreeNode<T> t){
+	    if (t==null){
+	        return 0;
+	    }else {
+	        int leftChildHeight=height(t.left);
+	        int rightChildHeight=height(t.right);
+	        if(leftChildHeight > rightChildHeight){
+	        	return leftChildHeight+1;
+	        } else{
+	        	return rightChildHeight+1;
+	        }
+	    }
+	}
+	private int size(BinaryTreeNode<T> t){
+		if (t == null){
+			return 0;
+		}
+		return size(t.left) + 1 + size(t.right);
+       
+   }
+	
+	public List<T> levelVisit(){		
+		List<T> result = new ArrayList<T>();
+		if(root == null){
+			return result;
+		}
+		Queue<BinaryTreeNode<T>> queue = new Queue<BinaryTreeNode<T>>();  
+		BinaryTreeNode<T> node = root;		
+		queue.enQueue(node); 
+        while (!queue.isEmpty()) {  
+            node = queue.deQueue(); 
+            result.add(node.data); 
+            if (node.left != null){
+                queue.enQueue(node.left);  
+            }
+            if (node.right != null){
+                queue.enQueue(node.right);  
+            }
+        }   
+		return result;
+	}
+	public boolean isValid(){
+		return isValid(root);
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		if (root == null){
+            return null;
+		}
+		return lowestCommonAncestor(root,n1,n2);
+        
+	}
+	public List<T> getNodesBetween(T n1, T n2){
+		List<T> elements = new ArrayList<>();
+		getNodesBetween(elements,root,n1,n2);
+		return elements;
+	}
+	
+	public void  getNodesBetween(List<T> elements ,BinaryTreeNode<T> node, T n1, T n2){
+		
+        if (node == null) {
+            return;
+        } 
+  
+        if (n1.compareTo(node.data) < 0) {
+        	getNodesBetween(elements,node.left, n1, n2);
+        } 
+       
+        if ((n1.compareTo(node.data) <= 0 )
+        		&& (n2.compareTo(node.data) >= 0  )) {
+        	elements.add(node.data);            
+        } 
+        if (n2.compareTo(node.data)>0) {
+        	getNodesBetween(elements,node.right, n1, n2);
+        }
+	}
+	private T lowestCommonAncestor(BinaryTreeNode<T> node,T n1, T n2){
+		if(node == null){
+			return null;
+		}
+		// 如果n1和n2都比 node的值小， LCA在左孩子
+        if (node.data.compareTo(n1) > 0 && node.data.compareTo(n2) >0){
+            return lowestCommonAncestor(node.left, n1, n2);
+        }
+  
+        // 如果n1和n2都比 node的值小， LCA在右孩子
+        if (node.data.compareTo(n1) < 0 && node.data.compareTo(n2) <0) 
+            return lowestCommonAncestor(node.right, n1, n2);
+  
+        return node.data;
+	}
+	private boolean isValid(BinaryTreeNode<T> t){
+		if(t == null){
+			return true;
+		}
+		if(t.left != null && findMax(t.left).data.compareTo(t.data) >0){
+			return false;
+		}
+		if(t.right !=null && findMin(t.right).data.compareTo(t.data) <0){
+			return false;
+		}
+		if(!isValid(t.left) || !isValid(t.right)){
+			return false;
+		}
+		return true;
+	}
+}
+
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 000000000..590e60306
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,108 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 000000000..3f6f4d2b4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,36 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 000000000..f2a6515fa
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,116 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		preOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		inOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		postOrderVisit(root, result);
+		return result;
+	}
+
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+		
+		BinaryTreeNode<T> node = root;
+		
+		if(node != null){
+			stack.push(node);
+		}
+		
+		while(!stack.isEmpty()){
+			node = stack.pop();
+			result.add(node.data);
+			
+			if(node.right != null){
+				stack.push(node.right);
+			}
+			
+			if(node.left != null){
+				stack.push(node.right);
+			}			
+		}
+		return result;
+	}
+
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		BinaryTreeNode<T> node = root;
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+
+		while (node != null || !stack.isEmpty()) {
+
+			while (node != null) {
+				stack.push(node);
+				node = node.left;
+			}
+			BinaryTreeNode<T> currentNode = stack.pop();
+			result.add(currentNode.data);			
+			node = currentNode.right;
+		}
+		return result;
+	}
+	
+	private static <T> void preOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		result.add(node.getData());
+		preOrderVisit(node.getLeft(), result);
+		preOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void inOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		inOrderVisit(node.getLeft(), result);
+		result.add(node.getData());
+		inOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void postOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		postOrderVisit(node.getLeft(), result);
+		postOrderVisit(node.getRight(), result);
+		result.add(node.getData());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 000000000..41857e137
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 000000000..85fb8ab2a
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,34 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {
+		list(f, 0);
+	}
+
+	public void list(File f, int depth) {
+		printName(f, depth);
+		if (f.isDirectory()) {
+			File[] files = f.listFiles();
+			for (File i : files)
+				list(i, depth + 1);
+		}
+	}
+
+	void printName(File f, int depth) {
+		String name = f.getName();
+		for (int i = 0; i < depth; i++)
+			System.out.print("+");
+		if (f.isDirectory())
+			System.out.println("Dir: " + name);
+		else
+			System.out.println(f.getName() + " " + f.length());
+	}
+
+	public static void main(String args[]) {
+		FileList L = new FileList();
+		File f = new File("C:\\coderising\\tmp");
+		L.list(f);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/pom.xml b/students/1377699408/data-structure/assignment/pom.xml
new file mode 100644
index 000000000..5024466d1
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 000000000..900a3ad35
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 000000000..c3c8a3f27
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 000000000..4ff7f46ae
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 000000000..0957eaf7f
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 000000000..1551a80b3
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 000000000..ce045393b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 000000000..bf9807b30
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 000000000..36a9d2ce1
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 000000000..172371dd5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 000000000..dcdbe226e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 000000000..85e2e22de
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 000000000..b8c81faf3
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 000000000..07df2a5da
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 000000000..e5d9aebba
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 000000000..436d092f5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 000000000..ab8c76458
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 000000000..8c34bad0c
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 000000000..a651923ef
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 000000000..aefc9692b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 000000000..8660ec810
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 000000000..22ba4a545
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 000000000..2c7e128b2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..b6cf28c09
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..0357c4d91
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 000000000..ec54b839c
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 000000000..13cf80241
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/1377699408/data-structure/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<String,String> 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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 000000000..06ef6311b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java
new file mode 100644
index 000000000..10d13b583
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 000000000..4576c016a
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 000000000..45740e6d5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 000000000..994a241a3
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 000000000..7fd72fc2b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 000000000..f4c7556a2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 000000000..2e0550c67
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 000000000..6a3ea639b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 000000000..7d90318b5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 000000000..c4c4b7325
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 000000000..cef19a8b5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 000000000..f391d92b8
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 000000000..fedb24360
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 000000000..b0ec38161
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 000000000..76f2cb766
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 000000000..d0ab4387d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 000000000..e86d056a2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 000000000..ef85ff007
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 000000000..20e34e885
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 000000000..96a2194a6
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 000000000..dcbb18be4
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 000000000..c0435a2db
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 000000000..956927e2d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 000000000..5cec210e7
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 000000000..8579743fe
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 000000000..d3b0f167e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 000000000..399d3e857
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 000000000..4536ee7a2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 000000000..4a53dbe2f
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 000000000..c1421cd39
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 000000000..b033cbe1d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 000000000..41857e137
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 000000000..6e65192e4
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/1377699408/ood/ood-assignment/pom.xml b/students/1377699408/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..ccffce577
--- /dev/null
+++ b/students/1377699408/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<String,String> configurations = new HashMap<String,String>();
+	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/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/1377699408/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/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java
new file mode 100644
index 000000000..1be735e5f
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp;
+
+public class EmailException extends Exception {
+    public EmailException(String message) {
+        super(message);
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..4397366a1
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.dao.EmailDAO;
+
+import java.io.IOException;
+import java.util.*;
+
+public class PromotionMail {
+    private static EmailDAO emailDAO = new EmailDAO();
+
+    public static void main(String[] args) throws Exception {
+        List<Email> emailList = getEmails("product_promotion.txt");
+        for (Email email : emailList) {
+            sendEmail(email);
+        }
+
+    }
+
+    public static List<Email> getEmails(String file) throws IOException {
+        List<Email> emailList = new ArrayList<Email>();
+        List<Product> list = Product.getProductByFile(file);
+
+        for (Product p : list) {
+            String productId = p.getProductID();
+            List<Map<String, String>> l = emailDAO.listSubscriptionsByProdoctId(productId);
+            for (Map<String, String> userInfo : l) {
+                String username = userInfo.get("NAME");
+                String productDesc = p.getProductDesc();
+                String fromAddr = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+                List<String> toAddr = new ArrayList<String>();
+                toAddr.add(userInfo.get("EMAIL"));
+                String smtpServer = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+                Email email = new Email(fromAddr, toAddr, "\"您关注的产品降价了\"", "尊敬的 " + username + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!", smtpServer, fromAddr);
+                emailList.add(email);
+            }
+        }
+        return emailList;
+    }
+
+    public static void sendEmail(Email email) {
+        if (email == null) {
+            System.out.println("没有邮件发送");
+        }
+        try {
+            email.send();
+        } catch (EmailException e) {
+            email.setSmtpServer(Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+            try {
+                email.send();
+            } catch (EmailException e1) {
+                System.out.println("使用备用服务器发送失败");
+            }
+        }
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
new file mode 100644
index 000000000..de6cfe163
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
@@ -0,0 +1,102 @@
+package com.coderising.ood.srp.bean;
+
+
+import com.coderising.ood.srp.utils.CollectionUtils;
+import com.coderising.ood.srp.EmailException;
+import com.coderising.ood.srp.utils.StringUtils;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Email {
+    private String fromAddress;
+    private List<String> toAddresses;
+    private String subject;
+    private String content;
+    private String smtpServer;
+    private String email_admin;
+
+    public Email(String fromAddress, List<String> toAddresses, String subject, String content, String smtpServer, String email_admin) {
+        this.fromAddress = fromAddress;
+        this.toAddresses = toAddresses;
+        this.subject = subject;
+        this.content = content;
+        this.smtpServer = smtpServer;
+        this.email_admin = email_admin;
+    }
+
+    public void send() throws EmailException {
+        //假装发了一封邮件
+        check_send();
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(this.getFromAddress()).append("\n");
+        buffer.append("To:").append(Arrays.toString(this.getToAddresses().toArray())).append("\n");
+        buffer.append("Subject:").append(this.getSubject()).append("\n");
+        buffer.append("Content:").append(this.getContent()).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+    private void check_send() throws EmailException {
+        if (StringUtils.isBlank(this.fromAddress)) {
+            throw new EmailException("fromAddress is empty");
+        }
+        if (CollectionUtils.isEmpty(this.toAddresses)) {
+            throw new EmailException("toAddresses is empty");
+        }
+        if (StringUtils.isBlank(this.subject)) {
+            throw new EmailException("subject is empty");
+        }
+    }
+
+    public Email() {
+    }
+
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    public List<String> getToAddresses() {
+        return toAddresses;
+    }
+
+    public void setToAddresses(List<String> toAddresses) {
+        this.toAddresses = toAddresses;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getSmtpServer() {
+        return smtpServer;
+    }
+
+    public void setSmtpServer(String smtpServer) {
+        this.smtpServer = smtpServer;
+    }
+
+    public String getEmail_admin() {
+        return email_admin;
+    }
+
+    public void setEmail_admin(String email_admin) {
+        this.email_admin = email_admin;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 000000000..c3872c33b
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,66 @@
+package com.coderising.ood.srp.bean;
+
+import com.coderising.ood.srp.utils.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public static List<Product> getProductByFile(String f) throws IOException {
+        List<Product> list = new ArrayList<Product>();
+        File file = new File(f);
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String s = "";
+            while (!StringUtils.isBlank((s=br.readLine()))) {
+                String[] data = s.split(" ");
+                Product p = new Product(data[0], data[1]);
+                System.out.println("产品ID = " + data[0] + "\n");
+                System.out.println("产品描述 = " + data[1] + "\n");
+                list.add(p);
+            }
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return list;
+    }
+
+    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;
+    }
+
+    public Product() {
+
+    }
+
+    public Product(String productID, String productDesc) {
+
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java
new file mode 100644
index 000000000..39975b927
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class EmailDAO {
+    public List<Map<String, String>> listSubscriptionsByProdoctId(String productId) {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        List<Map<String, String>> userList = new ArrayList<Map<String, String>>();
+        for (int i = 1; i <= 3; i++) {
+            Map<String, String> userInfo = new HashMap<String, String>();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1377699408/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
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java
new file mode 100644
index 000000000..ff6068347
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.utils;
+
+import java.util.List;
+
+public class CollectionUtils {
+    public static boolean isEmpty(List list) {
+        return list == null || list.size() == 0;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java
new file mode 100644
index 000000000..4d86f4ba0
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp.utils;
+
+public class StringUtils {
+    public static boolean isBlank(String s) {
+        return s == null || "".equals(s.trim());
+    }
+}
diff --git a/students/1395844061/.gitignore b/students/1395844061/.gitignore
new file mode 100644
index 000000000..d41523dfd
--- /dev/null
+++ b/students/1395844061/.gitignore
@@ -0,0 +1,26 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+1395844061.iml
diff --git a/students/1395844061/README.md b/students/1395844061/README.md
new file mode 100644
index 000000000..32243de0c
--- /dev/null
+++ b/students/1395844061/README.md
@@ -0,0 +1,2 @@
+### 1395844061 ood 
+1. ood代码优化
diff --git a/students/1395844061/build.gradle b/students/1395844061/build.gradle
new file mode 100644
index 000000000..db1cbf8de
--- /dev/null
+++ b/students/1395844061/build.gradle
@@ -0,0 +1,18 @@
+group 'peng-test'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.5
+
+repositories {
+    maven{
+        url "http://maven.oschina.net/content/groups/public/"
+    }
+}
+
+dependencies {
+
+    compile 'org.htmlparser:htmlparser:2.1'
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+}
diff --git a/students/1395844061/course-pro-1/build.gradle b/students/1395844061/course-pro-1/build.gradle
new file mode 100644
index 000000000..939cf6ccb
--- /dev/null
+++ b/students/1395844061/course-pro-1/build.gradle
@@ -0,0 +1,14 @@
+group 'peng-test'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 000000000..1ba8cf2db
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+/**
+ * ProductInfo
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:41
+ */
+public class ProductInfo {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public ProductInfo(){}
+
+    public ProductInfo(String productID, String productDesc){
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..0be9b165c
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,99 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.utils.DBUtil;
+import com.coderising.ood.srp.utils.MailUtil;
+import com.coderising.ood.srp.utils.ArgsUtil;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * PromotionMail
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:33
+ */
+public class PromotionMail {
+
+    private ProductInfo productInfo;
+    private List<MailInfo> mailInfoList = new ArrayList<>();
+
+    private static final String NAME_KEY    = "NAME";
+    private static final String EMAIL_KEY   = "EMAIL";
+
+    public PromotionMail(){}
+
+    public PromotionMail(ProductInfo productInfo) throws Exception {
+        this.productInfo = productInfo;
+        initMailInfoList(loadMailingList());
+    }
+
+    /**
+     * 获取每个型号的手机关注的人员信息列表
+     * @return
+     * @throws Exception
+     */
+    private List<Map<String, String>> loadMailingList() throws Exception {
+        String sql = "select name from subscriptions "
+                        + "where product_id= '" + productInfo.getProductID() +"' "
+                        + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+
+    /**
+     * 组装促销邮件的内容信息
+     * @param mailingList
+     */
+    private void initMailInfoList(List<Map<String, String>> mailingList) {
+        if (ArgsUtil.isNotEmpty(mailingList)){
+            for (Map<String, String> map : mailingList){
+                // 初始化 mailInfoList
+                mailInfoList.add(buildMailInfo(map));
+            }
+        }
+    }
+
+    /**
+     * 组装邮件内容信息
+     * @param userInfo
+     * @return
+     */
+    private MailInfo buildMailInfo(Map<String, String> userInfo){
+        String name = userInfo.get(NAME_KEY);
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!" ;
+        String toAddress = userInfo.get(EMAIL_KEY);
+        return new MailInfo(toAddress, subject, message);
+    }
+
+    /**
+     * 发送促销邮件
+     * @param debug
+     * @throws IOException
+     */
+    public void sendEMails(boolean debug) throws IOException {
+        System.out.println("开始发送邮件... ...");
+        if (ArgsUtil.isNotEmpty(mailInfoList)) {
+            for (MailInfo mailInfo : mailInfoList){
+                MailUtil.sendEmail(mailInfo.toAddress, mailInfo.subject, mailInfo.message, debug);
+            }
+        }else {
+            System.out.println("没有邮件发送... ...");
+        }
+    }
+
+    class MailInfo{
+
+        private String toAddress = null;
+        private String subject = null;
+        private String message = null;
+
+        MailInfo(String toAddress, String subject, String message){
+            this.toAddress = toAddress;
+            this.subject = subject;
+            this.message = message;
+        }
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..931e93ab3
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Configuration
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:30
+ */
+public class Configuration {
+
+    static Map<String,String> 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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..702c8cce3
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp.config;
+
+/**
+ * ConfigurationKeys
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:31
+ */
+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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java
new file mode 100644
index 000000000..b329a9ade
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.utils;
+
+import java.util.List;
+
+/**
+ * ArgsUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp.utils
+ * @date 2017/6/17/11:56
+ */
+public final class ArgsUtil {
+
+    private ArgsUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    public static boolean isNotNull(Object object){
+
+        return object != null;
+    }
+
+    public static boolean isNotEmpty(List list){
+
+        return isNotNull(list) && !list.isEmpty();
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
new file mode 100644
index 000000000..2b4e0410a
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * DBUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:32
+ */
+public final class DBUtil {
+
+    private DBUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     * @param sql
+     * @return
+     */
+    public static List<Map<String, String>> query(String sql){
+        System.out.println("sql: "+sql);
+        List<Map<String, String>> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            Map<String, String> userInfo = new HashMap<>();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
new file mode 100644
index 000000000..43af9df5e
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.ProductInfo;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * FileUtils
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:43
+ */
+public final class FileUtil {
+
+    private FileUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
+
+        if (!ArgsUtil.isNotNull(filePath))
+            throw new IllegalArgumentException("illegal arguments");
+
+        File file = new File(filePath);
+        BufferedReader br = null;
+        List<ProductInfo> productInfoList = new ArrayList<>();
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp;
+            while((temp = br.readLine()) != null){
+                String[] data = temp.split(" ");
+                productInfoList.add(new ProductInfo(data[0], data[1]));
+            }
+            return productInfoList;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null)
+                br.close();
+        }
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
new file mode 100644
index 000000000..cff76d7bf
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+
+/**
+ * MailUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:28
+ */
+public final class MailUtil {
+
+    private static String smtpHost      = null;
+    private static String altSmtpHost   = null;
+    private static String fromAddress   = null;
+
+    static{
+        Configuration config = new Configuration();
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    private MailUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    public static void sendEmail(String toAddress, String subject, String message, boolean debug) {
+
+        //假装发了一封邮件
+        System.out.println("debug: " + debug);
+        try {
+            System.out.println("使用默认host发送邮件");
+            sendDefaultMail(toAddress, subject, message);
+        }catch (Exception e){
+            System.out.println("使用备用host发送邮件");
+            sendAltMail(toAddress,subject, message);
+        }
+    }
+
+    private static void sendDefaultMail(String toAddress, String subject, String message){
+        System.out.println("smtpHost: " + 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());
+    }
+
+    private static void sendAltMail(String toAddress, String subject, String message){
+        System.out.println("altSmtpHost: " + altSmtpHost);
+        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/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
new file mode 100644
index 000000000..2bf0df107
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.utils.ArgsUtil;
+import com.coderising.ood.srp.utils.FileUtil;
+
+import java.util.List;
+
+/**
+ * MainTest
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:45
+ */
+public class MainTest {
+
+    public static void main(String[] args) throws Exception{
+        String filePath = MainTest.class.getClassLoader().getResource("product_promotion.txt").getFile();
+        List<ProductInfo> productInfoList = FileUtil.readProductInfoFromFile(filePath);
+        if (ArgsUtil.isNotEmpty(productInfoList)){
+            for (ProductInfo productInfo: productInfoList){
+                new PromotionMail(productInfo)
+                        .sendEMails(false);
+            }
+        }
+    }
+}
diff --git a/students/1395844061/course-pro-1/src/test/resources/product_promotion.txt b/students/1395844061/course-pro-1/src/test/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/test/resources/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/1395844061/settings.gradle b/students/1395844061/settings.gradle
new file mode 100644
index 000000000..f66e41c2f
--- /dev/null
+++ b/students/1395844061/settings.gradle
@@ -0,0 +1,2 @@
+include 'course-pro-1'
+
diff --git a/students/1398524980/README.md b/students/1398524980/README.md
new file mode 100644
index 000000000..a652ad5ec
--- /dev/null
+++ b/students/1398524980/README.md
@@ -0,0 +1 @@
+作业
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/README.md b/students/1398524980/second phase/once/README.md
new file mode 100644
index 000000000..4a2bb84fe
--- /dev/null
+++ b/students/1398524980/second phase/once/README.md	
@@ -0,0 +1 @@
+面向对象设计
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/ood_assignment/pom.xml b/students/1398524980/second phase/once/ood_assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/pom.xml	
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..0fb3dcfa7
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java	
@@ -0,0 +1,34 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static Configuration config;
+
+	static Map<String, String> 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");
+	}
+
+	private Configuration() {
+	}
+
+	protected static Configuration getConfig() {
+		return config;
+	}
+
+	/**
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+
+		return configurations.get(key);
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..e63eb922a
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java	
@@ -0,0 +1,9 @@
+package main.java.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/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..1a88f401f
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java	
@@ -0,0 +1,24 @@
+package main.java.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<HashMap<String, String>> query(String sql){
+		
+		List<HashMap<String, String>> userList = new ArrayList<HashMap<String, String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<String, String>();
+			userInfo.put("NAME", "User" + i);			
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java
new file mode 100644
index 000000000..1a71da260
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java	
@@ -0,0 +1,15 @@
+package main.java.com.coderising.ood.srp;
+
+public class FromAddress {
+
+	private String fromAddress = null;
+	
+	protected void setFromAddress() {
+		fromAddress = Configuration.getConfig().getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public String getFromAddress() {
+		return fromAddress;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java
new file mode 100644
index 000000000..1eac48983
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java	
@@ -0,0 +1,22 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.List;
+
+public class LoadInformation {
+
+	private String productID = new ProductInfo().getproductID();
+	
+	private String sendMailQuery = null;
+	
+	protected List<?> loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+	protected void setLoadQuery() throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..84dbffa75
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java	
@@ -0,0 +1,16 @@
+package main.java.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/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 000000000..a678d2987
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java	
@@ -0,0 +1,52 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductInfo {
+
+	private String productID = null;
+	private String productDesc = null;
+
+	/**
+	 * 
+	 * @throws IOException
+	 */
+	public void readProductInfo(String pomotionInfoAddress) throws IOException {
+
+		File f = new File(pomotionInfoAddress);
+		
+		readFile(f);
+	}
+
+	private void readFile(File file) throws IOException {
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			productID = data[0];
+			productDesc = data[1];
+
+			System.out.println("��ƷID = " + productID + "\n");
+			System.out.println("��Ʒ���� = " + productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	protected String getproductID() {
+		return productID;
+	}
+
+	protected String getProductDesc() {
+		return productDesc;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..c94ac5a08
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java	
@@ -0,0 +1,36 @@
+package main.java.com.coderising.ood.srp;
+
+public class PromotionMail {
+
+	private static ProductInfo productInfo = new ProductInfo();
+	private static SetProtocol setprotocol = new SetProtocol();
+	private static LoadInformation loadInformation = new LoadInformation();
+	private static FromAddress fromAddress = new FromAddress();
+	private static SendEMails sendEmails = new SendEMails();
+
+	public static void main(String[] args) throws Exception {
+
+		boolean emailDebug = false;
+		new PromotionMail(emailDebug,
+				"C:\\Users\\123\\Documents\\workspace\\ood_assignment\\src\\com\\coderising\\ood\\srp\\product_promotion.txt");
+	}
+
+	PromotionMail(boolean emailDebug, String pomotionInfoAddress) throws Exception {
+
+		// ��ȡ��Ʒ��Ϣ
+		productInfo.readProductInfo(pomotionInfoAddress);
+
+		// ���÷��ͷ���Э��
+		setprotocol.setProtocol();
+
+		// ���ö�ȡ��Ϣ
+		loadInformation.setLoadQuery();
+
+		// ���÷��͵�ַ
+		fromAddress.setFromAddress();
+
+		// �����ʼ����� �� �����ʼ�
+		sendEmails.sendEMails(emailDebug);
+	}
+
+}
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java
new file mode 100644
index 000000000..29bb0f136
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java	
@@ -0,0 +1,51 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class SendEMails {
+
+	private ToAddressAndMessage message = new ToAddressAndMessage();
+	
+	private String smtpHost = new SetProtocol().getSMTPHost();
+	private String altSmtpHost = new SetProtocol().getAltSMTPHost();
+	
+	private LoadInformation load = new LoadInformation();
+
+	/**
+	 * 
+	 * @param debug
+	 * @param mailingList
+	 * @throws Exception
+	 */
+	protected void sendEMails(boolean debug) throws Exception {
+
+		System.out.println("开始发送邮件");
+
+		if (load.loadMailingList() != null) {
+			Iterator<?> iter = load.loadMailingList().iterator();
+			while (iter.hasNext()) {
+				message.configureEMail((HashMap<?, ?>) iter.next());
+				try {
+					if (message.toAddress.length() > 0) {
+						message.sendSMTPHostWay(smtpHost, debug);
+					}
+				} catch (Exception e) {
+					try {
+						message.sendAltSMTPHostWay(altSmtpHost, debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+	
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java
new file mode 100644
index 000000000..98e0151fb
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java	
@@ -0,0 +1,32 @@
+package main.java.com.coderising.ood.srp;
+
+public class SetProtocol {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+
+	private Configuration config;
+
+	protected void setProtocol() {
+		config = Configuration.getConfig();
+		setSMTPHost();
+		setAltSMTPHost();
+	}
+
+	private void setSMTPHost() {
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+	private void setAltSMTPHost() {
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	}
+
+	protected String getSMTPHost() {
+		return smtpHost;
+	}
+
+	protected String getAltSMTPHost() {
+		return altSmtpHost;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java
new file mode 100644
index 000000000..c99bbc683
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java	
@@ -0,0 +1,52 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class ToAddressAndMessage {
+
+	private String productDesc = new ProductInfo().getProductDesc();
+
+	protected String toAddress = null;
+	private	String fromAddress = new FromAddress().getFromAddress();
+
+	private String subject = null;
+	private String message = null;
+
+	private static final String EMAIL_KEY = "EMAIL";
+	private static final String NAME_KEY = "NAME";
+
+	/**
+	 * 
+	 * @param userInfo
+	 * @throws IOException
+	 */
+	protected void addressAndMessage(HashMap<?, ?> userInfo) throws IOException {
+		configureEMail(userInfo);
+		setMessage(userInfo);
+	}
+
+	protected void configureEMail(HashMap<?, ?> userInfo) throws IOException {
+
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+		if (toAddress.length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected void setMessage(HashMap<?, ?> userInfo) throws IOException {
+
+		String name = (String) userInfo.get(NAME_KEY);
+
+		subject = "您关注的产品降价了";
+		message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+	}
+
+	protected void sendSMTPHostWay(String smtpHost, boolean debug) {
+		MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+	}
+
+	protected void sendAltSMTPHostWay(String altSmtpHost, boolean debug) {
+		MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1398524980/second phase/once/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/1417442485/out/production/1417442485/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1417442485/out/production/1417442485/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1417442485/out/production/1417442485/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/1417442485/pom.xml b/students/1417442485/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1417442485/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..70b861717
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package main.java.com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static Map<String,String> 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/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..e63eb922a
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package main.java.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/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..c34751d34
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,20 @@
+package main.java.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<UserInfo> query(final String sql){
+		final List<UserInfo> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			userList.add(new UserInfo("User" + i, "aa@bb.com"));
+		}
+		return userList;
+	}
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..aa288e279
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,25 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+    public static String[] readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        String[] data;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return data;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java
new file mode 100644
index 000000000..7e499b7d6
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java
@@ -0,0 +1,9 @@
+package main.java.com.coderising.ood.srp;
+
+public interface MailMessage {
+
+    String getFromAddress();
+    String getToAddress();
+    String getSubject();
+    String getMessageBody();
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java
new file mode 100644
index 000000000..2b8bdf73e
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java
@@ -0,0 +1,19 @@
+package main.java.com.coderising.ood.srp;
+
+public class MailService {
+
+    public static void send(final MailMessage message, final MailSetting mailSetting) {
+        if(message.getToAddress().length() == 0) return;
+        try {
+            MailUtil.sendEmail(message.getToAddress(), message.getFromAddress(), message.getSubject(),
+                    message.getMessageBody(), MailSetting.smtpHost, mailSetting.emailDebug);
+        } catch (Exception e) {
+            try {
+                MailUtil.sendEmail(message.getToAddress(), message.getFromAddress(), message.getSubject(),
+                        message.getMessageBody(), MailSetting.altSmtpHost, mailSetting.emailDebug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java
new file mode 100644
index 000000000..0991bbae0
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class MailSetting {
+    static String smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    static String altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    final boolean emailDebug;
+
+    public MailSetting(boolean emailDebug) {
+        this.emailDebug = emailDebug;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..59cc73476
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package main.java.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/1417442485/src/main/java/com/coderising/ood/srp/Product.java b/students/1417442485/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..2e807c9d5
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class Product {
+    final String productId;
+    final String productDesc;
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java b/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java
new file mode 100644
index 000000000..770baa7af
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java
@@ -0,0 +1,30 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ProductDataStore {
+
+    private final File mFileDataSource;
+
+    public ProductDataStore(final File file) {
+        mFileDataSource = file;
+    }
+
+    public Product getProduct() {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] data = null;
+        try {
+            data = FileUtil.readFile(mFileDataSource);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        Product product = null;
+        if(data != null && data.length >= 2) {
+            product = new Product(data[0], data[1]);
+            System.out.println("产品ID = " + product.productId + "\n");
+            System.out.println("产品描述 = " + product.productDesc + "\n");
+        }
+        return product;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..881bdb0f7
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+
+	private static final String PRODUCT_FILE = "src/main/java/com/coderising/ood/srp/product_promotion.txt";
+	
+	public static void main(String[] args) throws Exception {
+
+		final Product product = new ProductDataStore(new File(PRODUCT_FILE)).getProduct();
+        final List<UserInfo> userList = UserDataStore.getMailingList(product.productId);
+        final MailSetting mailSetting = new MailSetting(false);
+
+		PromotionMail.sendEmails(product, userList, mailSetting);
+	}
+
+	protected static void sendEmails(final Product product, final List<UserInfo> userList, final MailSetting mailSetting) throws IOException
+	{
+        if(userList == null || userList.isEmpty()) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        System.out.println("开始发送邮件");
+        for (UserInfo userInfo : userList) {
+            final PromotionMailMessage message = new PromotionMailMessage(userInfo.email, userInfo.name, product.productDesc);
+            MailService.send(message, mailSetting);
+        }
+	}
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java
new file mode 100644
index 000000000..e6f154855
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java
@@ -0,0 +1,37 @@
+package main.java.com.coderising.ood.srp;
+
+public class PromotionMailMessage implements MailMessage {
+    private final static String FROM_ADDRESS = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    private final static String SUBJECT = "您关注的产品降价了";
+    private final String toAddress;
+    private final String message;
+
+    public PromotionMailMessage(final String toAddress, final String userName, final String productDesc){
+        this.toAddress = toAddress;
+        if (toAddress.length() > 0) {
+            message = "尊敬的 "+userName+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+        } else {
+            message = null;
+        }
+    }
+
+    @Override
+    public String getFromAddress() {
+        return FROM_ADDRESS;
+    }
+
+    @Override
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    @Override
+    public String getSubject() {
+        return SUBJECT;
+    }
+
+    @Override
+    public String getMessageBody() {
+        return message;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java b/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java
new file mode 100644
index 000000000..b62d9b007
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java
@@ -0,0 +1,15 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserDataStore {
+
+    public static List<UserInfo> getMailingList(String productId) throws Exception {
+        final String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productId +"' "
+                + "and send_mail=1 ";
+
+        return DBUtil.query(sendMailQuery);
+    }
+
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 000000000..26272ef01
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class UserInfo {
+    final String name;
+    final String email;
+
+    public UserInfo(final String name, final String email) {
+        this.name = name;
+        this.email = email;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1417442485/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1417442485/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/1418243288/readme.md b/students/1418243288/readme.md
new file mode 100644
index 000000000..fcb796bde
--- /dev/null
+++ b/students/1418243288/readme.md
@@ -0,0 +1,5 @@
+﻿测试下新上传的值
+#test 
+
+#试试对不对#
+public void main
diff --git a/students/1425809544/ood-assignment/pom.xml b/students/1425809544/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1425809544/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
new file mode 100644
index 000000000..a3f51236b
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String,String>();
+	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/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
new file mode 100644
index 000000000..e7c449f10
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.config;
+
+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/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/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/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
new file mode 100644
index 000000000..ed92dfec0
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class Email {
+
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email() {
+    }
+
+    public Email(String toAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public Email setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+        return this;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public Email setSubject(String subject) {
+        this.subject = subject;
+        return this;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Email setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
new file mode 100644
index 000000000..091583b3e
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 10:00
+ **/
+public class EmailServiceConfig {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+
+    public EmailServiceConfig(String smtpHost, String altSmtpHost, String fromAddress) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public EmailServiceConfig setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+        return this;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public EmailServiceConfig setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+        return this;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public EmailServiceConfig setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
new file mode 100644
index 000000000..f869bf1f1
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.pojo;
+
+/**
+ * 产品类
+ *
+ * @author xyy
+ * @create 2017-06-19 9:30
+ **/
+public class Product {
+
+
+    private String productID;
+    private String productDesc;
+
+
+
+
+
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public Product setProductID(String productID) {
+        this.productID = productID;
+        return this;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public Product setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
new file mode 100644
index 000000000..69975f6cb
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class User {
+
+    private String name;
+    private String email;
+
+    public String getName() {
+        return name;
+    }
+
+    public User setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public User setEmail(String email) {
+        this.email = email;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
new file mode 100644
index 000000000..2fece21ec
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.IOException;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class EmailService {
+
+
+    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());
+
+    }
+
+
+    public static Email configureEMail(User user, Product product) throws IOException {
+        String toAddress = user.getEmail();
+        String name = "";
+        if (toAddress.length() > 0) {
+            name = user.getName();
+        }
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        Email email = new Email(toAddress, subject, message);
+        return email;
+    }
+
+    public static void sendEmail(EmailServiceConfig emailServiceConfig, Email email, boolean debug) {
+        try {
+            if (email.getToAddress().length() > 0) {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getSmtpHost(), debug);
+            }
+        } catch (Exception e) {
+            try {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getAltSmtpHost(), debug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
new file mode 100644
index 000000000..ccacef7bc
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:34
+ **/
+public class ProductService {
+
+
+    public static List<Product> getAllProductFromFile(File file) throws IOException {
+        List productList = new ArrayList();
+        BufferedReader br = null;
+
+        try {
+
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+                System.out.println("产品ID = " + product.getProductID() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+                productList.add(product);
+            }
+
+            return productList;
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+        return null;
+    }
+
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
new file mode 100644
index 000000000..f89aff500
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.config.Configuration;
+import com.coderising.ood.config.ConfigurationKeys;
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        File file = new File("D:\\product_promotion.txt");
+        //1.获得产品信息
+        ProductService productService = new ProductService();
+        List productList = productService.getAllProductFromFile(file);
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(productList, emailDebug);
+    }
+
+
+
+    public PromotionMail(List productList, boolean mailDebug) throws Exception {
+        //2.邮件服务器配置
+        Configuration config = new Configuration();
+        EmailServiceConfig emailServiceConfig = new EmailServiceConfig(config.getProperty(ConfigurationKeys.SMTP_SERVER), config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER), config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        //3.发送邮件
+        sendEMails(mailDebug, productList, emailServiceConfig);
+
+    }
+
+
+    public void sendEMails(boolean debug, List<Product> productList, EmailServiceConfig emailServiceConfig) throws Exception {
+        System.out.println("开始发送邮件");
+        if (productList != null) {
+            for (Product product : productList) {
+                List<User> userList = UserService.getSendEmailUser(product);
+                if (null != userList && userList.size() > 0) {
+                    for (User user : userList) {
+                        Email email = EmailService.configureEMail((user), product);
+                        if (email.getToAddress().length() > 0) {
+                            EmailService.sendEmail(emailServiceConfig,email,debug);
+                        }
+                    }
+                }
+            }
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+
+}
+
+
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
new file mode 100644
index 000000000..a7c6d8fe3
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class UserService {
+
+
+    public static List getSendEmailUser(Product product) throws Exception {
+
+
+        setLoadQuery(product);
+
+        List<User> userList = new ArrayList();
+
+        for (int i = 0; i < 3; i++) {
+            User user = new User();
+            user.setName("user" + i);
+            user.setEmail(user.getName() + "@qq.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+
+
+    //通过产品id获取关注了产品的用户
+    public static void setLoadQuery(Product product) throws Exception {
+
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+    }
+
+
+}
diff --git a/students/1452302762/ood/ood-assignment/pom.xml b/students/1452302762/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..20657ee74
--- /dev/null
+++ b/students/1452302762/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<String,String> 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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/1452302762/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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java
new file mode 100644
index 000000000..02807c7a3
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp;
+
+public class Constant {
+	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/1452302762/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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..3d386ee7f
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+	public static String[] readFile(File file) throws IOException
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			return data;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..22389dcb5
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,66 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+	private static String smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);;
+	private static String altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); ; 
+	private static String fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); ;
+	private static String toAddress = null;
+	private static String subject = null;
+	private static String message = null;
+	protected void setMessage(String name,String productDesc) throws IOException{
+		if(toAddress.length()>0){
+			subject = "您关注的产品降价了";
+			message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
+		}
+	}
+	private static  List loadMailingList(String productID) throws Exception {
+		String sendMailQuery = "Select name from subscriptions where product_id= '" + productID +"and send_mail=1 ";
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+	protected static void configureEMail(HashMap<String,String> userInfo) throws IOException{
+		toAddress =userInfo.get(Constant.EMAIL_KEY); 
+	}
+	public  static void sendEMails(boolean debug,String productID) throws Exception{
+		System.out.println("开始发送邮件");
+		List mailingList=loadMailingList(productID);
+		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("没有邮件发送");
+			
+		}
+	}
+	private 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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..2ba503eae
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+
+public class Product {
+	private String productID ;
+	private String productDesc;
+	
+	public Product(String productID, String productDesc) {
+		this.productID = productID;
+		this.productDesc = productDesc;
+	}
+	public Product(String[] data) {
+		this.productID =data[0];
+		this.productDesc = data[1];
+		System.out.println("产品ID = " + productID + "\n");
+		System.out.println("产品描述 = " + productDesc + "\n");
+	}
+	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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..f70095e45
--- /dev/null
+++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class PromotionMail {
+
+	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;
+		Product product=new Product(FileUtil.readFile(f));
+		MailUtil.sendEMails(emailDebug,product.getProductID()); 
+	}
+}
diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/1452302762/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
diff --git a/students/14703250/readme.md b/students/14703250/readme.md
index 2e9f08553..19422f702 100644
--- a/students/14703250/readme.md
+++ b/students/14703250/readme.md
@@ -1 +1 @@
-愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去
+愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去
diff --git a/students/1753179526/readme.md b/students/1753179526/readme.md
new file mode 100644
index 000000000..0eb59149a
--- /dev/null
+++ b/students/1753179526/readme.md
@@ -0,0 +1,5 @@
+﻿Test git commit. push-wary
+
+第二次提交内容，更改编码问题。
+
+增加new line 测试命令行
\ No newline at end of file
diff --git a/students/183549495 b/students/183549495
new file mode 100644
index 000000000..f29dee609
--- /dev/null
+++ b/students/183549495
@@ -0,0 +1 @@
+测试
diff --git a/students/251822722/srp/DBUtil.java b/students/251822722/srp/DBUtil.java
new file mode 100644
index 000000000..87eef4980
--- /dev/null
+++ b/students/251822722/srp/DBUtil.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.product.Product;
+
+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;
+    }
+
+
+    public static Product queryProduct(
+            String productDesc,
+
+            String productID) {
+
+        //TODO
+
+        return new Product();
+    }
+
+
+}
diff --git a/students/251822722/srp/MailUtil.java b/students/251822722/srp/MailUtil.java
new file mode 100644
index 000000000..22b08893f
--- /dev/null
+++ b/students/251822722/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
+                                 ) {
+        //假装发了一封邮件
+        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/251822722/srp/PromotionMailTest.java b/students/251822722/srp/PromotionMailTest.java
new file mode 100644
index 000000000..3f70beac6
--- /dev/null
+++ b/students/251822722/srp/PromotionMailTest.java
@@ -0,0 +1,62 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.product.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMailTest {
+
+
+    public static void main(String[] args) throws Exception {
+
+
+        //load change info
+        File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        List<Product> products = getUpdateProduct(file);
+
+
+        //update message for user
+        products.stream().forEach(p -> {
+            p.notifyUserPriceChange();
+        });
+
+
+    }
+
+
+    protected static List<Product> getUpdateProduct(File file) throws IOException // @02C
+    {
+
+        List<Product> productMap = new ArrayList<Product>();
+
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+
+
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            Product product = DBUtil.queryProduct(data[0], data[1]);
+            productMap.add(product);
+
+            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 productMap;
+    }
+
+
+}
diff --git a/students/251822722/srp/mail/Mail.java b/students/251822722/srp/mail/Mail.java
new file mode 100644
index 000000000..6e0d145c0
--- /dev/null
+++ b/students/251822722/srp/mail/Mail.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.mail;
+
+import com.coderising.ood.srp.product.Product;
+import com.coderising.ood.srp.user.User;
+
+
+/**
+ * com.coderising.ood.srp
+ * Created by Eric Wang on 6/19/17.
+ */
+public interface Mail {
+
+
+    void sendPriceChangeEmail(User user, Product product);
+}
diff --git a/students/251822722/srp/mail/PromotionMail.java b/students/251822722/srp/mail/PromotionMail.java
new file mode 100644
index 000000000..a6bbc98bf
--- /dev/null
+++ b/students/251822722/srp/mail/PromotionMail.java
@@ -0,0 +1,94 @@
+package com.coderising.ood.srp.mail;
+
+import com.coderising.ood.srp.product.Product;
+import com.coderising.ood.srp.server.SmtpMailServer;
+import com.coderising.ood.srp.setting.SystemSetting;
+import com.coderising.ood.srp.user.User;
+
+import java.io.File;
+
+/**
+ * com.coderising.ood.srp.mail
+ * Created by Eric Wang on 6/19/17.
+ */
+public class PromotionMail implements Mail {
+
+    String form;
+    String to;
+    String subject;
+    String message;
+
+    SmtpMailServer smtpMailServer = new SmtpMailServer();
+
+
+    private void createPriceChangeEmailBody(User user, Product product) {
+
+
+            subject = "您关注的产品降价了";
+            message = "尊敬的 " + user.getUserName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+
+        }
+
+    @Override
+    public void sendPriceChangeEmail(User user, Product product) {
+
+        createPriceChangeEmailBody(user, product);
+        setFrom();
+        setTo(user);
+
+        smtpMailServer.sendEmail(this);
+
+
+
+    }
+
+    private void setTo(User user) {
+        to=user.getUserEmail();
+    }
+
+    private void setFrom() {
+        form= SystemSetting.getAdmin();
+    }
+
+
+    public String getForm() {
+        return form;
+    }
+
+    public void setForm(String form) {
+        this.form = form;
+    }
+
+    public String getTo() {
+        return to;
+    }
+
+    public void setTo(String to) {
+        this.to = to;
+    }
+
+    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 SmtpMailServer getSmtpMailServer() {
+        return smtpMailServer;
+    }
+
+    public void setSmtpMailServer(SmtpMailServer smtpMailServer) {
+        this.smtpMailServer = smtpMailServer;
+    }
+}
diff --git a/students/251822722/srp/product/Product.java b/students/251822722/srp/product/Product.java
new file mode 100644
index 000000000..4aafee363
--- /dev/null
+++ b/students/251822722/srp/product/Product.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.srp.product;
+
+import com.coderising.ood.srp.DBUtil;
+import com.coderising.ood.srp.user.User;
+
+import java.util.List;
+
+/**
+ * com.coderising.ood.srp.product
+ * Created by Eric Wang on 6/19/17.
+ */
+public class Product {
+    String productDesc = null;
+
+    String productID = null;
+
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+
+    public void notifyUserPriceChange() {
+
+
+        List<User> userList = DBUtil.query(setLoadQuery(this.productID));
+
+        userList.stream().forEach(user -> {
+            user.sendPriceChangeEmail(this);
+        });
+
+    }
+
+    private String setLoadQuery(String productID) {
+
+        System.out.println("loadQuery set");
+
+        return "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+
+
+    }
+
+}
diff --git a/students/251822722/srp/product_promotion.txt b/students/251822722/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/251822722/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/251822722/srp/server/SmtpMailServer.java b/students/251822722/srp/server/SmtpMailServer.java
new file mode 100644
index 000000000..d7ff26058
--- /dev/null
+++ b/students/251822722/srp/server/SmtpMailServer.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.server;
+
+import com.coderising.ood.srp.MailUtil;
+import com.coderising.ood.srp.mail.PromotionMail;
+import com.coderising.ood.srp.setting.SystemSetting;
+import com.coderising.ood.srp.setting.config.ConfigurationKeys;
+
+/**
+ * com.coderising.ood.srp
+ * Created by Eric Wang on 6/19/17.
+ */
+public class SmtpMailServer {
+
+
+    private static final String smtpHost = SystemSetting.getConfig().getProperty(ConfigurationKeys.SMTP_SERVER);
+    ;
+    private static final  String altSmtpHost = SystemSetting.getConfig().getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+
+    public void sendEmail(PromotionMail promotionMail) {
+
+
+        System.out.println("开始发送邮件");
+
+        try {
+            MailUtil.sendEmail(promotionMail.getTo(), promotionMail.getForm(), promotionMail.getSubject(), promotionMail.getMessage(), smtpHost);
+        } catch (Exception e) {
+
+            try {
+                MailUtil.sendEmail(promotionMail.getTo(), promotionMail.getForm(), promotionMail.getSubject(), promotionMail.getMessage(), altSmtpHost);
+
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+
+}
+
+
+
diff --git a/students/251822722/srp/setting/SystemSetting.java b/students/251822722/srp/setting/SystemSetting.java
new file mode 100644
index 000000000..6e99d923f
--- /dev/null
+++ b/students/251822722/srp/setting/SystemSetting.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.setting;
+
+import com.coderising.ood.srp.setting.config.Configuration;
+import com.coderising.ood.srp.setting.config.ConfigurationKeys;
+
+/**
+ * com.coderising.ood.srp.setting
+ * Created by Eric Wang on 6/19/17.
+ */
+public class SystemSetting {
+
+
+    private static Configuration config = new Configuration();
+
+
+
+    public static Configuration getConfig() {
+        return config;
+    }
+
+    public static String getAdmin() {
+
+        return config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+}
diff --git a/students/251822722/srp/setting/config/Configuration.java b/students/251822722/srp/setting/config/Configuration.java
new file mode 100644
index 000000000..c81fc885e
--- /dev/null
+++ b/students/251822722/srp/setting/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.setting.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap<String, String>();
+
+    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/251822722/srp/setting/config/ConfigurationKeys.java b/students/251822722/srp/setting/config/ConfigurationKeys.java
new file mode 100644
index 000000000..3a5d230e7
--- /dev/null
+++ b/students/251822722/srp/setting/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.setting.config;
+
+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/251822722/srp/user/User.java b/students/251822722/srp/user/User.java
new file mode 100644
index 000000000..da7d3ecbb
--- /dev/null
+++ b/students/251822722/srp/user/User.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp.user;
+
+import com.coderising.ood.srp.mail.Mail;
+import com.coderising.ood.srp.mail.PromotionMail;
+import com.coderising.ood.srp.product.Product;
+
+
+/**
+ * com.coderising.ood.srp.user
+ * Created by Eric Wang on 6/19/17.
+ */
+public class User {
+
+    Mail mail = new PromotionMail();
+
+    String userName ;
+
+    String userEmail;
+
+    public void sendPriceChangeEmail(Product product) {
+
+        mail.sendPriceChangeEmail(this, product);
+
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserEmail() {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail) {
+        this.userEmail = userEmail;
+    }
+}
diff --git a/students/252705978/ood/srp/pom.xml b/students/252705978/ood/srp/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/252705978/ood/srp/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Configuration.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/252705978/ood/srp/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<String,String> 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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/252705978/ood/srp/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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java
new file mode 100644
index 000000000..3f5d95cc5
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+
+/**
+ * 邮件配置工具类
+ * 
+ * @author lin
+ * @since
+ */
+public class ConfigurationUtil {
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    public static void configure(PromotionMail mail, Configuration config) {
+        mail.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        mail.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        mail.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+
+    }
+
+    public static void configure2(PromotionMail mail, HashMap userInfo, Product product) {
+        mail.toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (mail.toAddress.length() > 0) {
+            String name = (String) userInfo.get(NAME_KEY);
+
+            mail.subject = "您关注的产品降价了";
+            mail.message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        }
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/252705978/ood/srp/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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..f9c67fea1
--- /dev/null
+++ b/students/252705978/ood/srp/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 lin
+ * @since
+ */
+public class FileUtil {
+    public static String[] readFile(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..04bab2b8a
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+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());
+
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static void sendEMails(PromotionMail mail, Configuration config, boolean debug, Product product, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件");
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                ConfigurationUtil.configure2(mail, (HashMap) iter.next(), product);
+                try {
+                    if (mail.toAddress.length() > 0)
+                        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, mail.smtpHost, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, mail.altSmtpHost, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+        }
+
+        else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..833b2a98f
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+
+/**
+ * 产品实体类
+ * 
+ * @author lin
+ * @since
+ */
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public Product() {
+    }
+
+    public Product(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public Product(String[] strs) {
+        setProductID(strs[0]);
+        setProductDesc(strs[1]);
+    }
+
+    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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..83af138d3
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+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;
+
+    public PromotionMail() {
+    };
+
+    public static void main(String[] args) throws Exception {
+        PromotionMail mail = new PromotionMail();
+        Product product = new Product(FileUtil.readFile(new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt")));
+        Configuration config = new Configuration();
+        ConfigurationUtil.configure(mail, config);
+        MailUtil.sendEMails(mail, config, false, product, DBUtil.query(mail.sendMailQuery));
+    }
+
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/252705978/ood/srp/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/254647832/src/com/coderising/ood/bean/MailBean.java b/students/254647832/src/com/coderising/ood/bean/MailBean.java
new file mode 100644
index 000000000..2befb197f
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/MailBean.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.bean;
+
+/**
+ * <p>Title: MailBean</p>
+ * <p>Description: 邮件信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class MailBean {
+	
+	/**
+	 * 收件箱地址
+	 */
+	private String toAddress;
+	
+	/**
+	 * 邮件主题
+	 */
+	private String subject;
+	
+	/**
+	 * 邮件内容
+	 */
+	private String message;
+
+	public String getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+
+	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;
+	}
+
+	@Override
+	public String toString() {
+		return "MailBean [toAddress=" + toAddress + ", subject=" + subject
+				+ ", message=" + message + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/bean/ProductBean.java b/students/254647832/src/com/coderising/ood/bean/ProductBean.java
new file mode 100644
index 000000000..f8ae0bfb0
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/ProductBean.java
@@ -0,0 +1,56 @@
+package com.coderising.ood.bean;
+
+import java.util.List;
+
+/**
+ * <p>Title: ProductBean</p>
+ * <p>Description: 产品信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class ProductBean {
+	
+	/**
+	 * 产品编号
+	 */
+	private String productID;
+	
+	/**
+	 * 产品描述
+	 */
+	private String productDesc;
+
+	private List<UserBean> users;
+	
+	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;
+	}
+
+	public List<UserBean> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<UserBean> users) {
+		this.users = users;
+	}
+
+	@Override
+	public String toString() {
+		return "ProductBean [productID=" + productID + ", productDesc="
+				+ productDesc + ", users=" + users + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/bean/UserBean.java b/students/254647832/src/com/coderising/ood/bean/UserBean.java
new file mode 100644
index 000000000..c1f36a3ef
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/UserBean.java
@@ -0,0 +1,85 @@
+package com.coderising.ood.bean;
+
+import java.util.List;
+
+/**
+ * <p>Title: UserBean</p>
+ * <p>Description: 用户信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class UserBean {
+	
+	/**
+	 * 用户ID
+	 */
+	private String userid;
+	
+	/**
+	 * 用户姓名
+	 */
+	private String name;
+	
+	/**
+	 * 邮箱
+	 */
+	private String email;
+	
+	/**
+	 * 邮件推送标识 0-不推送;1-推送
+	 */
+	private String sendFlag;
+	
+	/**
+	 * 关注的产品
+	 */
+	private List<ProductBean> pros;
+
+	public String getUserid() {
+		return userid;
+	}
+
+	public void setUserid(String userid) {
+		this.userid = userid;
+	}
+
+	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 String getSendFlag() {
+		return sendFlag;
+	}
+
+	public void setSendFlag(String sendFlag) {
+		this.sendFlag = sendFlag;
+	}
+
+	public List<ProductBean> getPros() {
+		return pros;
+	}
+
+	public void setPros(List<ProductBean> pros) {
+		this.pros = pros;
+	}
+
+	@Override
+	public String toString() {
+		return "UserBean [userid=" + userid + ", name=" + name + ", email="
+				+ email + ", sendFlag=" + sendFlag + ", pros=" + pros + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/Configuration.java b/students/254647832/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..5e384821d
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>Title: Configuration</p>
+ * <p>Description: 获取配置信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class Configuration {
+	//封装成私有变量
+	private static Map<String,String> 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/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..70606dda9
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+/**
+ * <p>Title: ConfigurationKeys</p>
+ * <p>Description: 邮件服务器配置参数</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+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/254647832/src/com/coderising/ood/srp/DBUtil.java b/students/254647832/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..4cb4d8ac3
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import com.coderising.ood.bean.ProductBean;
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: DBUtil</p>
+ * <p>Description: 数据库操作</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 用户和关注的产品，应该是多对多的关系，应该有张多对多的表[用户id + 产品id]
+	 * 先根据产品id查询出用户id，再根据用户id查询出用户信息。此处省略这部分的处理
+	 * @param sql
+	 * @return
+	 */
+	public static List<UserBean> query(Set<String> proIds){
+		
+		/**
+		 *  SELECT name, email FROM user WHERE userid IN(
+		 *  	SELECT userid FROM user_pro WHERE proId in(proIds))
+		 */
+		StringBuilder sendMailQuery = new StringBuilder();
+		sendMailQuery.append("Select name from subscriptions where send_mail=1 and product_id in(");
+		
+		Iterator<String> iter = proIds.iterator();
+		while(iter.hasNext()){
+			sendMailQuery.append("'" + iter.next() + "',");
+		}
+		sendMailQuery.delete(sendMailQuery.length()-1, sendMailQuery.length()).append(")");
+		
+		List<ProductBean> proList = new ArrayList<ProductBean>();
+		ProductBean proBean = null;
+		List<UserBean> userList = new ArrayList<UserBean>();
+		UserBean userInfo = null;
+		for (int i = 1; i <= 3; i++) {
+			userInfo = new UserBean();
+			userInfo.setName("User_" + i);			
+			userInfo.setEmail("aa@bb.com_" + i);
+			proBean = new ProductBean();
+			proBean.setProductID("pro_" + i);
+			proBean.setProductDesc("proDesc_" + i);
+			proList.add(proBean);
+			userInfo.setPros(proList);
+			userList.add(userInfo);
+		}
+		
+		return userList;
+	}
+	
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/MailUtil.java b/students/254647832/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9763abc62
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,108 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.bean.MailBean;
+import com.coderising.ood.bean.ProductBean;
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: MailUtil</p>
+ * <p>Description: 邮件工具类</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class MailUtil {
+
+	/**
+	 * 获取邮件正文信息
+	 * @param user 用户信息
+	 * @return 邮件正文
+	 */
+	private static String getMassege(UserBean user){
+		List<ProductBean> list = user.getPros();
+		StringBuilder s = new StringBuilder();
+		s.append("尊敬的 ");
+		s.append(user.getName());
+		s.append(", 您关注的产品 ");
+		for(ProductBean pro : list){
+			s.append(pro.getProductDesc()).append("、");
+		}
+		s.delete(s.length()-1, s.length());
+		s.append(" 降价了，欢迎购买!");
+		return s.toString();
+	}
+	
+	/**
+	 * 获取待发送的邮件信息列表
+	 * @param users 用户信息
+	 * @return 待发送邮件列表
+	 */
+	private static List<MailBean> getMailInf(List<UserBean> users){
+		List<MailBean> retList = new ArrayList<MailBean>();
+		MailBean mailInf;
+		//获取邮件服务器配置信息
+		if (!users.isEmpty()) {
+			for(UserBean bean : users){
+				mailInf = new MailBean();
+				mailInf.setToAddress(bean.getEmail());
+				mailInf.setSubject("您关注的产品降价了");
+				mailInf.setMessage(getMassege(bean));
+				retList.add(mailInf);
+			}
+		}
+		return retList;
+	}
+	
+	/**
+	 * 发送邮件
+	 * @param users 待发送的用户
+	 */
+	public static void sendEmail(List<UserBean> users) {
+		List<MailBean> mailList = getMailInf(users);
+		if(!mailList.isEmpty()){
+			//获取邮件服务器信息
+			Configuration config = new Configuration();
+			String server = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+			String altServer = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+			
+			System.out.println("开始发送邮件...");
+			System.out.println("发件箱：" + config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+			
+			for(MailBean mailInf : mailList){
+				try{
+					send(server, mailInf);
+				}catch (Exception e){
+					try {
+						send(altServer, mailInf);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			System.out.println("邮件发送结束...");
+		}else{
+			System.out.println("没有邮件发送");
+		}
+		
+	}
+	
+	/**
+	 * 邮件发送主方法
+	 * @param server 发送服务器
+	 */
+	public static void send(String server, MailBean mailInf){
+		
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		
+		buffer.append("To:").append(mailInf.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mailInf.getSubject()).append("\n");
+		buffer.append("Content:").append(mailInf.getMessage()).append("\n");
+		
+		System.out.println(buffer.toString());
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/PromotionMail.java b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..9af969c77
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,65 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: PromotionMail</p>
+ * <p>Description: 邮件发送处理</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		
+		//1、获取降价产品信息
+		File f = new File("E:\\gitpro\\liuxin\\coding2017\\liuxin\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		Set<String> proIds = readFile(f);
+		
+		//2、根据降价产品的ID获取关注该产品的用户信息
+		List<UserBean> users = DBUtil.query(proIds);
+		
+		//3、向这些用户发送邮件
+		MailUtil.sendEmail(users);
+	}
+
+	/**
+	 * 读取文件，获取降价产品信息
+	 * @param file
+	 * @return 产品信息的ID
+	 * @throws IOException
+	 */
+	private static Set<String> readFile(File file) throws IOException{
+		Set<String> proIds = new HashSet<String>();
+		BufferedReader br = null;
+		boolean flag = true;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			while(flag){
+				String temp = br.readLine();
+				if(temp != null && !"".equals(temp)){
+					String[] data = temp.split(" ");
+					proIds.add(data[0]);
+					System.out.println("产品ID = " + data[0]);
+					System.out.println("产品描述 = " + data[1] + "\n");
+				}else{
+					flag = false;
+				}
+			}
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return proIds;
+	}
+}
diff --git a/students/254647832/src/pom.xml b/students/254647832/src/pom.xml
new file mode 100644
index 000000000..1be81576c
--- /dev/null
+++ b/students/254647832/src/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/275677638/1.txt b/students/275677638/1.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/students/275677638/README.md b/students/275677638/README.md
new file mode 100644
index 000000000..aa7a31b81
--- /dev/null
+++ b/students/275677638/README.md
@@ -0,0 +1,3 @@
+愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去
+
+diff
diff --git a/students/276137509/276137509Learning/readme.md b/students/276137509/276137509Learning/readme.md
new file mode 100644
index 000000000..7c847014a
--- /dev/null
+++ b/students/276137509/276137509Learning/readme.md
@@ -0,0 +1 @@
+### This is my first project just for testing
\ No newline at end of file
diff --git a/students/276137509/readme.md b/students/276137509/readme.md
new file mode 100644
index 000000000..065efcdbb
--- /dev/null
+++ b/students/276137509/readme.md
@@ -0,0 +1 @@
+#### Nightn (杭州-莱顿) 代码仓库
\ No newline at end of file
diff --git a/students/277093528/ood-assignment/pom.xml b/students/277093528/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/277093528/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/277093528/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<String,String> 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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..1cd9f713c
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,12 @@
+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";
+	public static final String MESSAGE_FILE_PATH = "D:\\BaiduYunDownload\\Second_Season\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/277093528/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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java
new file mode 100644
index 000000000..e206b0aa2
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtils {
+	/**
+	 * 解析文件内容
+	 * @return
+	 * @throws IOException
+	 */
+	public static Product readFile() throws IOException {
+		
+		BufferedReader br = null;
+		try {
+			Product product = new Product();
+			File file = new File( ConfigurationKeys.MESSAGE_FILE_PATH );
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			product.setProductID(data[0]); 
+			product.setProductDesc(data[1]); 
+			
+			System.out.println("产品ID = " + data[0] + "\n");
+			System.out.println("产品描述 = " + data[1] + "\n");
+			return product;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		
+	}
+	
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..5765cb007
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,82 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+	private static String smtpHost = null;
+	private static String altSmtpHost = null; 
+	private static String fromAddress = null;
+	private static String toAddress = null;
+	private static String subject = null;
+	private static String message = null;
+	
+	static {
+		Configuration config = new Configuration();
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+	
+	protected static void sendEmail(String toAddress, String subject, String message,
+			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());
+		
+	}
+	
+	protected static void sendEMails(boolean debug,Product product, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				configureEMail((HashMap) iter.next(),product);  
+				try 
+				{
+					if ( toAddress.length() > 0 )
+						sendEmail(toAddress,  subject,  message,  debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(toAddress, subject, message, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	
+	private static void setMessage( HashMap userInfo,Product product) throws IOException {
+		String name = (String) userInfo.get( ConfigurationKeys.NAME_KEY );
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+	}
+
+	private static void configureEMail(HashMap userInfo,Product product) throws IOException 
+	{
+		toAddress = (String) userInfo.get( ConfigurationKeys.EMAIL_KEY ); 
+		if (toAddress.length() > 0) 
+			setMessage( userInfo, product ); 
+	}
+
+	
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..ba93dd2f1
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+
+public class Product {
+	
+	private String productID = null;
+	
+	private String productDesc = null;
+	
+	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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..5c10796db
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class PromotionMail {
+	
+	protected String sendMailQuery = null;
+	private Product product = null;
+	
+	public static void main(String[] args) throws Exception {
+		
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail( emailDebug );
+		
+	}
+	
+	public PromotionMail( boolean mailDebug ) throws Exception {
+		
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		product = FileUtils.readFile();
+		
+		setLoadQuery();
+		
+		MailUtil.sendEMails(mailDebug, product ,loadMailingList()); 
+		
+	}
+	
+	protected void setLoadQuery() throws Exception {
+		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+	}
+	
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/277093528/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/279069328/readme.md b/students/279069328/readme.md
new file mode 100644
index 000000000..e84336bfe
--- /dev/null
+++ b/students/279069328/readme.md
@@ -0,0 +1,3 @@
+# Coding 2017
+
+KevinSmile@coderising
\ No newline at end of file
diff --git a/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/2831099157/ood-assignment/out/production/main/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/2831099157/ood-assignment/pom.xml b/students/2831099157/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/2831099157/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..9eb1b21f2
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.service.GoodsArrivalNotice;
+import com.coderising.ood.srp.service.Notice;
+
+/**
+ * 可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+ */
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //降价促销
+//      Notice notice = new PricePromotion();
+        //到货通知
+        Notice notice = new GoodsArrivalNotice();
+        notice.sendMail(notice.getProducts());
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
new file mode 100644
index 000000000..5c0697782
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.configure;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
new file mode 100644
index 000000000..c9cfba497
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.configure;
+
+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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
new file mode 100644
index 000000000..c0e7f6508
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.dao;
+import com.coderising.ood.srp.model.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.seteMail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
new file mode 100644
index 000000000..f0894ea3c
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface GetProductsFunction {
+
+    List<Product> getProducts();
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
new file mode 100644
index 000000000..cd27a4576
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface SendMailFunction {
+
+    void sendMail(List<Product> products);
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 000000000..b94f27b29
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,112 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.configure.Configuration;
+import com.coderising.ood.srp.configure.ConfigurationKeys;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Mail {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String content;
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+
+    public Mail() {
+        Configuration config = new Configuration();
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+    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() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+
+    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 void send() {
+        if(null==toAddress){
+            System.out.println("发送地址不能为空");
+            return;
+        }
+        try {
+            sendMailBySmtpHost();
+        } catch (Exception e) {
+            try {
+                sendMailBySmtpHost();
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+
+        }
+    }
+
+    private void sendMailBySmtpHost() {
+        System.out.println("通过SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+    private void sendMailByAlSmtpHost() {
+        System.out.println("通过备用SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
new file mode 100644
index 000000000..f9f5b5a14
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.dao.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Product {
+    String id;
+    String description;
+
+    public Product(String id, String descript) {
+        this.id = id;
+        this.description = descript;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public List<User> getSubscribers() {
+        List<User> userList = null;
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + id + "' "
+                + "and send_mail=1 ";
+        userList = DBUtil.query(sendMailQuery);
+        return userList;
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
new file mode 100644
index 000000000..38bec29f5
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class User {
+    String name;
+    String 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/2831099157/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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
new file mode 100644
index 000000000..92a1090c5
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class GetProductsFromFile implements GetProductsFunction {
+    public String filePath = "E:\\StudyProjects\\Java\\Workspace\\HomeWork\\coding2017\\liuxin\\ood\\ood-assignment\\" +
+            "src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+    @Override
+    public List<Product> getProducts() {
+        BufferedReader br = null;
+        List<Product> products = new ArrayList<>();
+        try {
+            File file = new File(filePath);
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product(data[0], data[1]);
+                System.out.println("促销产品ID = " + product.getId());
+                System.out.println("促销产品描述 = " + product.getDescription());
+                products.add(product);
+            }
+
+        } catch (IOException e) {
+            System.out.println("读取文件失败");
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return products;
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
new file mode 100644
index 000000000..ee4723ec0
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 到货通知
+ */
+public class GoodsArrivalNotice extends Notice {
+    public GoodsArrivalNotice() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendGoodsArrivalMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
new file mode 100644
index 000000000..6ac8e6240
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 各类通知（降价促销，抢购活动，到货通知等等）
+ */
+public abstract class Notice {
+    GetProductsFunction getProductsFunction;
+    SendMailFunction sendMailFunction;
+
+    public List<Product> getProducts() {
+        return getProductsFunction.getProducts();
+    }
+
+    public void sendMail(List<Product> products) {
+        sendMailFunction.sendMail(products);
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
new file mode 100644
index 000000000..ebb59571c
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class PricePromotion extends Notice {
+    public PricePromotion() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendPriceMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
new file mode 100644
index 000000000..79f3a6985
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendGoodsArrivalMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现到货的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅" + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品到货了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 到货了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
new file mode 100644
index 000000000..bae4803e3
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendPriceMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现需要促销的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅 " + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品降价了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 降价了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git "a/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md" "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
new file mode 100644
index 000000000..33634cb9a
--- /dev/null
+++ "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
@@ -0,0 +1,23 @@
+# 第一次OOD练习 #
+
+## 需求 ##
+### 原项目已经实现根据产品列表文件发送促销Mail，需求一直在变化，比如通过数据库获取促销产品或者促销活动改为到货通知，抢购等；为了应变各种变化，需重构代码。 ###
+## 需求分析 ##
+需求可变因素:</br>
+
+1. 促销产品列表文件可能会变更，或者变更获取方式（如通过数据库获取）
+2. 促销活动会根据运营情况变更
+## 重构方案 ##
+1. 提取GetProductsFunction，SendMailFunction接口
+2. 添加Notice抽象类，针对接口添加getProducts,sendMai方法 -------各类通知（降价促销，抢购活动，到货通知等等）
+3. 添加Mail,Product,User实体类
+4. Mail初始化设置smtpHost,alSmtpHost,fromAddress参数，添加sendMail功能
+5. Product添加getSubscribers功能
+6. 添加GetProductsFunction，SendMailFunction接口实现类
+7. 添加PricePromotion继承Promotion，实现降价促销功能，实例化GetProductsFunction，SendMailFunction接口    
+8. 主函数调用sendMail方法
+
+## 重构后 ##
+重构后项目，可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+
+
diff --git a/students/2842295913/Readme.md b/students/2842295913/Readme.md
new file mode 100644
index 000000000..fdae662c3
--- /dev/null
+++ b/students/2842295913/Readme.md
@@ -0,0 +1 @@
+### 学着使用git
\ No newline at end of file
diff --git a/students/2842295913/ood-assignment/pom.xml b/students/2842295913/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/2842295913/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..1faff3f68
--- /dev/null
+++ b/students/2842295913/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<String,String> 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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
new file mode 100644
index 000000000..6e9f1c2e8
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..e31d8a9b7
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 000000000..8029d24a4
--- /dev/null
+++ b/students/2842295913/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("E:\\Workspace-Sourcetree\\coding2017\\students\\2842295913\\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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..a773d878e
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/2842295913/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/294022181/ood-assignment/product_promotion.txt b/students/294022181/ood-assignment/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/294022181/ood-assignment/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/294022181/ood-assignment/src/com/coderising/ood/srp/Configuration.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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<String,String> 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/294022181/ood-assignment/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/DBUtil.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java
new file mode 100644
index 000000000..956cb5749
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java
@@ -0,0 +1,85 @@
+package com.coderising.ood.srp;
+
+public class Email {
+	private String smtpHost;
+	private String altSmtpHost; 
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	private boolean debug;
+	
+	public Email() {
+		
+	}
+	
+	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 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() {
+		return subject;
+	}
+
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public boolean isDebug() {
+		return debug;
+	}
+
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+
+	public void sendToTarget() {
+		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()); 
+			}
+		}
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/MailUtil.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..fbb4f29db
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	private String productID;
+	private String 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/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java
new file mode 100644
index 000000000..ad5c53356
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductDao {
+
+	public Product getProduct(String productFileName) throws IOException {
+		BufferedReader br = null;
+		Product product = null;
+		
+		try {
+			File file = new File(productFileName);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			String productID = data[0];
+			String productDesc = data[1];
+			
+			System.out.println("产品ID = " + productID + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+			product = new Product();
+			product.setProductID(productID);
+			product.setProductDesc(productDesc);
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		
+		return product;
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..1cda5d585
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,70 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	private Configuration config;
+	private ProductDao productDao;
+	private SubscriptionDao subscriptionDao;
+	
+	public static void main(String[] args) throws Exception {
+		boolean emailDebug = false;
+		String productFileName = "./product_promotion.txt";
+		PromotionMail pe = new PromotionMail(productFileName, emailDebug);
+	}
+	
+	public PromotionMail(String productFileName, boolean mailDebug) throws Exception {
+		config = new Configuration();
+		productDao = new ProductDao();
+		subscriptionDao = new SubscriptionDao();
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		Product product = productDao.getProduct(productFileName);
+		
+		if (product == null) {
+			return;
+		}
+		
+		sendEMails(mailDebug, product, subscriptionDao.loadMailingList(product.getProductID())); 
+	}
+
+	protected void sendEMails(boolean debug, Product product, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+	
+		if (mailingList != null) {
+			Email email = new Email();
+			String smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+			String altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+			String fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+			Iterator iter = mailingList.iterator();
+			
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY); 
+				
+				if (toAddress.length() > 0) {
+					String name = (String) userInfo.get(NAME_KEY);
+					String subject = "您关注的产品降价了";
+					String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+					email.setFromAddress(fromAddress);
+					email.setToAddress(toAddress);
+					email.setSmtpHost(smtpHost);
+					email.setAltSmtpHost(altSmtpHost);
+					email.setSubject(subject);
+					email.setMessage(message);
+					email.setDebug(debug);
+					email.sendToTarget();
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java
new file mode 100644
index 000000000..2cd57ed64
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class SubscriptionDao {
+	
+	public List loadMailingList(String productID) throws Exception {
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/product_promotion.txt b/students/294022181/ood-assignment/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/303252800/.gitignore b/students/303252800/.gitignore
new file mode 100644
index 000000000..41e8fd6dd
--- /dev/null
+++ b/students/303252800/.gitignore
@@ -0,0 +1,22 @@
+target/
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.idea
+*.iws
+*.iml
+*.ipr
+*.zip
+*.class
+*.jar
+*.war
+rebel.xml
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/students/303252800/practice13-ood-srp/pom.xml b/students/303252800/practice13-ood-srp/pom.xml
new file mode 100644
index 000000000..7c3a37204
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coding2017</groupId>
+    <artifactId>practice13-ood-srp</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <java.version>1.6</java.version>
+        <java.encoding>UTF-8</java.encoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${java.encoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/students/303252800/practice13-ood-srp/readme.md b/students/303252800/practice13-ood-srp/readme.md
new file mode 100644
index 000000000..e5f4455a1
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/readme.md
@@ -0,0 +1,8 @@
+# practice13-ood-srp
+
+　　重构一个项目使之符合 SRP （单一职责原则）
+
+- `EmailConfiguration` 邮件配置职责类
+- `PromotionProduct` 促销产品职责类
+- `PromotionSubscriber` 促销订阅职责类
+- `PromotionNotifier` 促销通知职责类
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java
new file mode 100644
index 000000000..3dde0cb7b
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java
@@ -0,0 +1,47 @@
+package com.coding2017.practice13;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+// 邮件配置职责类
+public final class EmailConfiguration {
+
+    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";
+
+    private static final Map<String, String> configurations = new HashMap<String, String>();
+
+    static {
+        configurations.put(SMTP_SERVER, "smtp.163.com");
+        configurations.put(ALT_SMTP_SERVER, "smtp1.163.com");
+        configurations.put(EMAIL_ADMIN, "admin@company.com");
+    }
+
+    // 外部不能创建实例
+    private EmailConfiguration() {
+    }
+
+    // 外部不能更改配置
+    public static Map<String, String> getInstance() {
+        return Collections.unmodifiableMap(configurations);
+    }
+
+
+    public static String getProperty(String key) {
+        return configurations.get(key);
+    }
+
+    public static String getFromAddress() {
+        return configurations.get(EmailConfiguration.EMAIL_ADMIN);
+    }
+
+    public static String getSmtpServer() {
+        return configurations.get(EmailConfiguration.SMTP_SERVER);
+    }
+
+    public static String getAltSmtpServer() {
+        return configurations.get(EmailConfiguration.ALT_SMTP_SERVER);
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java
new file mode 100644
index 000000000..b04ed0f0a
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java
@@ -0,0 +1,17 @@
+package com.coding2017.practice13;
+
+import java.util.List;
+
+public class MainApplication {
+
+    public static void main(String[] args) throws Exception {
+        List<PromotionProduct> products = PromotionProduct.readFromFile("com/coderising/ood/srp/product_promotion.txt");
+
+        for (PromotionProduct product : products) {
+            List<PromotionSubscriber> subscribers = PromotionSubscriber.querySubscribers(product.getProductId());
+            for (PromotionSubscriber subscriber : subscribers) {
+                PromotionNotifier.sendEmail(product, subscriber);
+            }
+        }
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java
new file mode 100644
index 000000000..30c8a44f0
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java
@@ -0,0 +1,54 @@
+package com.coding2017.practice13;
+
+import java.text.MessageFormat;
+
+// 促销通知职责类
+public class PromotionNotifier {
+
+    private static String subject = "您关注的产品降价了";
+    private static String message = "尊敬的 {1} , 您关注的产品 {2} 降价了，欢迎购买!";
+
+    /**
+     * 发送邮件通知
+     *
+     * @param product    促销产品
+     * @param subscriber 订阅人
+     */
+    public static void sendEmail(PromotionProduct product, PromotionSubscriber subscriber) {
+        System.out.println("开始发送邮件");
+        String content = MessageFormat.format(message, subscriber.getSubscriber(), product.getProductDesc());
+        if (subscriber.getToAddress().length() > 0) {
+            try {
+                sendEmail(EmailConfiguration.getFromAddress(), subscriber.getToAddress(), subject, content, EmailConfiguration.getSmtpServer());
+            } catch (Exception e1) {
+                try {
+                    sendEmail(EmailConfiguration.getFromAddress(), subscriber.getToAddress(), subject, content, EmailConfiguration.getAltSmtpServer());
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+    /**
+     * 执行发送邮件
+     *
+     * @param fromAddress 发件人地址
+     * @param toAddress   收件人地址
+     * @param subject     邮件标题
+     * @param content     邮件内容
+     * @param smtpHost    smtp服务器地址
+     */
+    private static void sendEmail(String fromAddress, String toAddress, String subject, String content, 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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java
new file mode 100644
index 000000000..59200d05b
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java
@@ -0,0 +1,52 @@
+package com.coding2017.practice13;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+// 促销产品职责类
+public class PromotionProduct {
+
+    /** 产品ID */
+    private String productId;
+    /** 产品描述 */
+    private String productDesc;
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public static List<PromotionProduct> readFromFile(String filepath) throws IOException {
+        List<PromotionProduct> products = new ArrayList<PromotionProduct>();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(new File(filepath)));
+            String line = null;
+            while ((line = br.readLine()) != null) {
+                String[] data = line.split(" ");
+                PromotionProduct product = new PromotionProduct();
+                product.productId = data[0];
+                product.productDesc = data[1];
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return products;
+    }
+
+
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java
new file mode 100644
index 000000000..e58760e6c
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java
@@ -0,0 +1,35 @@
+package com.coding2017.practice13;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// 促销订阅人职责类
+public class PromotionSubscriber {
+
+    /** 订阅人邮件地址 */
+    private String toAddress;
+    /** 订阅人姓名 */
+    private String subscriber;
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubscriber() {
+        return subscriber;
+    }
+
+    /**
+     * 查询促销产品订阅人列表
+     *
+     * @param productId 产品ID
+     * @return 订阅人列表
+     */
+    public static List<PromotionSubscriber> querySubscribers(String productId) {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return new ArrayList<PromotionSubscriber>();
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/Configuration.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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<String,String> 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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/ConfigurationKeys.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/DBUtil.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/MailUtil.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/PromotionMail.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/product_promotion.txt b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/309229350/readme.md b/students/309229350/readme.md
new file mode 100644
index 000000000..48b857086
--- /dev/null
+++ b/students/309229350/readme.md
@@ -0,0 +1 @@
+#测试git，第一次提交
diff --git a/students/315863321/ood/ood-assignment/pom.xml b/students/315863321/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java
new file mode 100644
index 000000000..e8ea1476c
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public abstract class Build {
+    Reader reader = null;
+
+    abstract void build();
+
+    public Reader getReader() {
+        return reader;
+    }
+
+    public void setReader(Reader reader) {
+        this.reader = reader;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java
new file mode 100644
index 000000000..b1176d9ef
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java
@@ -0,0 +1,59 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildMail extends Build{
+    List mailList;
+    Product product;
+    Mail mail;
+    Configuration config = new Configuration();
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    public BuildMail(List mailList, Product product) {
+        this.mailList = mailList;
+        this.product = product;
+    }
+    void build() {
+        List list = reader.read();
+        if (list != null) {
+            Iterator iter = list.iterator();
+            while (iter.hasNext()) {
+                mail = new Mail();
+                mail.setSubject(config.getProperty(ConfigurationKeys.SUBJECT));
+                mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+                try {
+                    configureEMail((HashMap) iter.next());
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                this.mailList.add(mail);
+            }
+
+        }
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+        if (mail.getToAddress().length() > 0)
+            setMessage(userInfo);
+    }
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+
+        String name = (String) userInfo.get(NAME_KEY);
+
+        mail.setMessage("尊敬的 "+name+", 您关注的产品 " + this.product.getProductDesc() + " 降价了，欢迎购买!");
+
+
+    }
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java
new file mode 100644
index 000000000..eebc5946c
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildMailServer extends Build{
+    private MailServer mailServer;
+
+    public BuildMailServer(MailServer mailServer) {
+        this.mailServer = mailServer;
+    }
+    void build() {
+        List data = reader.read();
+        mailServer.setSmtpHost((String) data.get(0));
+        mailServer.setAltSmtpHost((String) data.get(1));
+    }
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java
new file mode 100644
index 000000000..0c8a66942
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildProduct extends Build{
+    private Product product;
+
+    public BuildProduct(Product product) {
+        this.product = product;
+    }
+    void build() {
+        List data = reader.read();
+        product.setProductID((String) data.get(0));
+        product.setProductDesc((String) data.get(1));
+    }
+
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..815afc310
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap();
+    static final String QUERY = "Select name from subscriptions "
+            + "where product_id= '" + "%s" +"' "
+            + "and send_mail=1 ";
+
+    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");
+        configurations.put(ConfigurationKeys.SEND_MAIL_QUERY, QUERY);
+        configurations.put(ConfigurationKeys.SUBJECT, "您关注的产品降价了");
+
+    }
+
+    /**
+     * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+     *
+     * @param key
+     * @return
+     */
+    public String getProperty(String key) {
+
+        return configurations.get(key);
+    }
+
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..afda0b749
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,11 @@
+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";
+    public static final String SEND_MAIL_QUERY = "email.query";
+	public static final String SUBJECT = "email.subject";
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/315863321/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/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..5d8d222ae
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+
+public class Mail {
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    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() {
+        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/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java
new file mode 100644
index 000000000..07a8d588e
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class MailServer {
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+
+    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;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..3346dfb59
--- /dev/null
+++ b/students/315863321/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(Mail mail, MailServer mailServer,
+			boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..a3027a26c
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class Product {
+    private String productID = null;
+    private String productDesc = null;
+
+    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/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..93fce8bbb
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,76 @@
+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;
+
+public class PromotionMail {
+
+    private Product product = new Product();
+    private MailServer mailServer = new MailServer();
+    private List<Mail> mailList = new ArrayList<Mail>();
+    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/john/Documents/mygit_2/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+        boolean emailDebug = false;
+
+        PromotionMail promotionMail = new PromotionMail();
+        //配置产品
+        Build build = new BuildProduct(promotionMail.product);
+        build.setReader(new ReadFromFile(f));
+        build.build();
+
+        //配置邮件服务器
+        build = new BuildMailServer(promotionMail.mailServer);
+        build.setReader(new ReadFromMap());
+        build.build();
+
+        //配置邮件
+        build = new BuildMail(promotionMail.mailList, promotionMail.product);
+        build.setReader(new ReadFromDatabase(promotionMail.product));
+        build.build();
+        //发送邮件
+        promotionMail.sendEMails(emailDebug, promotionMail.mailList);
+
+
+    }
+
+
+    protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件");
+
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                Mail mail = (Mail) iter.next();
+                try {
+                    if (mail.getToAddress().length() > 0) {
+						MailUtil.sendEmail(mail, mailServer, debug);
+
+                    }
+                } catch (Exception e) {
+
+                    try {
+						MailUtil.sendEmail(mail, mailServer, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java
new file mode 100644
index 000000000..e3f6f2bae
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class ReadFromDatabase extends Reader {
+    Configuration config = new Configuration();
+    Product product = null;
+
+    public ReadFromDatabase(Product product) {
+        this.product = product;
+    }
+
+    List read() {
+        System.out.println("loadQuery set");
+        return DBUtil.query(config.getProperty(String.format(ConfigurationKeys.SEND_MAIL_QUERY, product.getProductID())));
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java
new file mode 100644
index 000000000..a3a7eb2d5
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/13.
+ */
+public class ReadFromFile  extends Reader{
+
+
+    public ReadFromFile(File file) {
+        super(file);
+    }
+
+    List read() {
+        BufferedReader br = null;
+        List data = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = Arrays.asList(temp.split(" "));
+        } catch (IOException e) {
+            try {
+                throw new IOException(e.getMessage());
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        System.out.println("产品ID = " + data.get(0) + "\n");
+        System.out.println("产品描述 = " + data.get(1) + "\n");
+        return data;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java
new file mode 100644
index 000000000..880f29741
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class ReadFromMap extends Reader{
+    Configuration config = new Configuration();
+
+    List read() {
+        List list = new ArrayList();
+        list.add(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        list.add(config.getProperty((ConfigurationKeys.ALT_SMTP_SERVER)));
+        return list;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java
new file mode 100644
index 000000000..7e59a0bb6
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public abstract class Reader {
+    File file;
+
+    public Reader(File file) {
+        this.file = file;
+    }
+
+    public Reader() {
+
+    }
+
+    abstract List read();
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/315863321/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
diff --git a/students/329866097/.gitignore b/students/329866097/.gitignore
new file mode 100644
index 000000000..bf58d0a16
--- /dev/null
+++ b/students/329866097/.gitignore
@@ -0,0 +1,80 @@
+######################
+# 解决java产生文件
+######################
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+######################
+# 解决maven产生的文件
+######################
+
+target/
+**/target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+
+######################
+# 解决各类编辑器自动产生的文件
+######################
+
+*.iml
+
+## Directory-based project format:
+.idea/
+# if you remove the above rule, at least ignore the following:
+
+# User-specific stuff:
+# .idea/workspace.xml
+# .idea/tasks.xml
+# .idea/dictionaries
+
+# Sensitive or high-churn files:
+# .idea/dataSources.ids
+# .idea/dataSources.xml
+# .idea/sqlDataSources.xml
+# .idea/dynamic.xml
+# .idea/uiDesigner.xml
+
+# Gradle:
+# .idea/gradle.xml
+# .idea/libraries
+
+# Mongo Explorer plugin:
+# .idea/mongoSettings.xml
+
+## File-based project format:
+*.ipr
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+/target/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
diff --git a/students/329866097/README.md b/students/329866097/README.md
new file mode 100644
index 000000000..87f2e553d
--- /dev/null
+++ b/students/329866097/README.md
@@ -0,0 +1 @@
+Mr.Who 作业提交
\ No newline at end of file
diff --git a/students/329866097/pom.xml b/students/329866097/pom.xml
new file mode 100644
index 000000000..b1b8d4d41
--- /dev/null
+++ b/students/329866097/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment-txh</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/Configuration.java b/students/329866097/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/329866097/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<String,String> 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/329866097/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/329866097/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/329866097/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/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..2c5d9dd96
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,22 @@
+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<User> query(String sql){
+		
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
+		}
+		return userList;
+	}
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/Email.java b/students/329866097/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 000000000..ced66562d
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by tianxianhu on 2017/6/18.
+ */
+public class Email {
+
+    private static String smtpHost;
+    private static String altSmtpHost;
+    private static String fromAddress;
+
+    private static Configuration config;
+
+    static  {
+        config = new Configuration();
+        setDefaultConfig(config);
+    }
+
+    private static void setDefaultConfig(Configuration config) {
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public void send(User user, String product, String host) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+
+        if(user.getEmail().length() > 0) {
+            String name = user.getName();
+            String subject = "您关注的产品降价了";
+            String message = "尊敬的 " + name + ", 您关注的产品 " + product + " 降价了，欢迎购买!";
+
+            buffer.append("From:").append(fromAddress).append("\n");
+            buffer.append("To:").append(user.getEmail()).append("\n");
+            buffer.append("Subject:").append(subject).append("\n");
+            buffer.append("Content:").append(message).append("\n");
+            System.out.println(buffer.toString());
+        }
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..e8cdb97e9
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,36 @@
+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.Map;
+
+public class FileUtil {
+
+	public static Map<String, String> readFile(String filePath) throws IOException {
+		File file = new File(filePath);
+		BufferedReader br = null;
+		Map<String, String> productMap = new HashMap<>();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String content;
+			while((content = br.readLine()) != null) {
+				String[] data = content.split(" ");
+				String productId = data[0];
+				String productDesc = data[1];
+				productMap.put(productId, productDesc);
+				System.out.println("产品ID = " + productId + "\n");
+				System.out.println("产品描述 = " + productDesc + "\n");
+			}
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+
+		return productMap;
+	}
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..1273603cb
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		Email email = new Email();
+
+		Map<String, String> productMap = FileUtil.readFile( "src/main/resources/product_promotion.txt");
+		for (Map.Entry<String, String> entry : productMap.entrySet()) {
+			String productId = entry.getKey();
+			String productDesc = entry.getValue();
+			List<User> userList = DBUtil.query(setLoadQuery(productId));
+			for(User user : userList) {
+				try {
+					email.send(user, productDesc, email.getSmtpHost());
+				} catch (Exception e) {
+					try {
+						email.send(user, productDesc, email.getAltSmtpHost());
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+		}
+	}
+
+	private static String setLoadQuery(String productID) throws Exception {
+		
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+
+		return sendMailQuery;
+	}
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/User.java b/students/329866097/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..c1df43bc4
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by tianxianhu on 2017/6/18.
+ */
+public class User {
+
+    private String name;
+    private String email;
+
+    public User(String name, String email) {
+        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/329866097/src/main/resources/product_promotion.txt b/students/329866097/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/329866097/src/main/resources/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/335402763/pom.xml b/students/335402763/pom.xml
new file mode 100644
index 000000000..d73cd6275
--- /dev/null
+++ b/students/335402763/pom.xml
@@ -0,0 +1,6 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.coderising</groupId>
+  <artifactId>335402763Learning</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..4e777b5cd
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.impl.PromotionMailServiceImpl;
+
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) throws Exception {
+		
+		File f = new File("D:\\Program Files\\mygit\\coding2017\\students\\335402763\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
+		
+		PromotionMailService promotionMailService = new PromotionMailServiceImpl();
+		promotionMailService.sendPromotionMail(f, emailDebug);
+	}
+	
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java b/students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
new file mode 100644
index 000000000..21f143ff1
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+public interface PromotionMailDao {
+
+	/**
+	 * 读取用户信息
+	 */
+	List loadMailingList(String productID);
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java b/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java
new file mode 100644
index 000000000..339f5b648
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.dao.impl;
+
+import java.util.List;
+
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.utils.DBUtil;
+
+public class PromotionMailDaoImpl implements PromotionMailDao {
+
+	protected String productID = null;
+	protected String sendMailQuery = null;
+	
+	/**
+	 * 读取用户信息
+	 */
+	@Override
+	public List loadMailingList(String productID) {
+		try {
+			setLoadQuery(productID);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return DBUtil.query(this.sendMailQuery);
+
+	}
+
+	protected void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/335402763/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/335402763/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/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 000000000..9d1db0cd7
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+
+public interface PromotionMailService {
+
+	void sendPromotionMail(File file, boolean mailDebug) throws Exception;
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java b/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java
new file mode 100644
index 000000000..2d1e8b491
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java
@@ -0,0 +1,86 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.dao.impl.PromotionMailDaoImpl;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.utils.FileUtil;
+import com.coderising.ood.srp.utils.MailUtil;
+import com.coderising.ood.srp.utils.PropertiesUtils;
+
+public class PromotionMailServiceImpl implements PromotionMailService {
+
+	private PromotionMailDao promotionMailDao = new PromotionMailDaoImpl();
+
+	protected String smtpHost = (String) PropertiesUtils.get(PropertiesUtils.SMTP_SERVER);;
+	protected String altSmtpHost = (String) PropertiesUtils.get(PropertiesUtils.ALT_SMTP_SERVER);;
+	protected String fromAddress = (String) PropertiesUtils.get(PropertiesUtils.EMAIL_ADMIN);
+
+	@Override
+	public void sendPromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 读取商品信息
+		String[] productData = FileUtil.readFile(file);
+		String productID = productData[0];
+		String productDesc = productData[1];
+
+		List mailingList = promotionMailDao.loadMailingList(productID);
+
+		sendEMails(mailDebug, mailingList, productDesc);
+
+	}
+
+	
+	/**
+	 * 发送邮件
+	 * @param debug
+	 * @param mailingList
+	 * @param productDesc
+	 * @throws IOException
+	 */
+	protected void sendEMails(boolean debug, List mailingList, String productDesc) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+
+				HashMap usrInfo = (HashMap) iter.next();
+
+				HashMap eMailInfo = MailUtil.configureEMail(usrInfo, productDesc);
+				String toAddress = (String) eMailInfo.get("toAddress");
+				String subject = (String) eMailInfo.get("subject");
+				String message = (String) eMailInfo.get("message");
+				
+				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/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
new file mode 100644
index 000000000..2a7002ded
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.utils;
+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/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
new file mode 100644
index 000000000..d0a53ec6a
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class FileUtil {
+
+		public static String[] readFile(File file) throws IOException // @02C
+		{
+			HashMap map = new HashMap();
+			BufferedReader br = null;
+			String[] data = null;
+			try {
+				br = new BufferedReader(new FileReader(file));
+				String temp = br.readLine();
+				data = temp.split(" ");
+			} catch (IOException e) {
+				throw new IOException(e.getMessage());
+			} finally {
+				br.close();
+			}
+			return data;
+		}
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
new file mode 100644
index 000000000..5e72b2e16
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class MailUtil {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	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());
+		
+	}
+	
+	//配置发送地址及内容
+	public static HashMap configureEMail(HashMap userInfo , String productDesc) throws IOException {
+		HashMap map = new HashMap();
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) {
+			map = setMessage(userInfo,productDesc); 
+		}
+		map.put("toAddress", toAddress);
+		return map;
+	}
+
+	//设置信息内容
+	public static HashMap setMessage(HashMap userInfo , String productDesc) throws IOException 
+	{
+		HashMap map = new HashMap();
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
+		
+		map.put("subject", subject);
+		map.put("message", message);
+		
+		return map;
+
+	}
+	
+	
+	
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java
new file mode 100644
index 000000000..e8b94b20e
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class PropertiesUtils {
+	
+	private static Map<String,Object> props=new HashMap<String,Object>();
+	private static Properties properties=new Properties();
+	
+	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";
+	static{
+		try {
+			InputStream inStream=PropertiesUtils.class.getClassLoader().getResourceAsStream("configurationKeys.properties");
+			properties.load(inStream);
+
+			props.put(SMTP_SERVER, properties.get(SMTP_SERVER));
+			props.put(ALT_SMTP_SERVER, properties.get(ALT_SMTP_SERVER));
+			props.put(EMAIL_ADMIN, properties.get(EMAIL_ADMIN));
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	
+	public static Object get(String key){
+		return props.get(key);
+	}
+	
+	public static void set(String key,Object obj){
+		props.put(key, obj);
+	}
+	
+}
diff --git a/students/335402763/src/main/resources/configurationKeys.properties b/students/335402763/src/main/resources/configurationKeys.properties
new file mode 100644
index 000000000..acde908d1
--- /dev/null
+++ b/students/335402763/src/main/resources/configurationKeys.properties
@@ -0,0 +1,3 @@
+SMTP_SERVER=smtp.server
+ALT_SMTP_SERVER=alt.smtp.server
+EMAIL_ADMIN=email.admin
\ No newline at end of file
diff --git a/students/34594980/ood/ood-assignment/pom.xml b/students/34594980/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..a7e504164
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.coderising</groupId>
+	<artifactId>ood-assignment</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>ood-assignment</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
+
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>aliyunmaven</id>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+	</repositories>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/34594980/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<String,String> 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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/34594980/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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..b40eb5347
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,34 @@
+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<HashMap<String, String>> query(String sql) {
+
+		List<HashMap<String, String>> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<>();
+			userInfo.put("NAME", "User" + i);
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+
+	public static List<HashMap<String, String>> loadMailingList(Product product) {
+		
+		String sendMailQuery = "Select name from subscriptions " + "where product_id= '"
+				+ product.getId() + "' " + "and send_mail=1 ";
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 000000000..e5e6a2907
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+public class Email {
+
+	private String smtpHost ;
+	private String altSmtpHost ; 
+	private String fromAddress ;
+	private String toAddress ;
+	private String subject ;
+	private String message ;
+	
+	
+	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 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() {
+		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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..6abdc05eb
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+	private static final String FILENAME="product_promotion.txt";
+	
+	//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+	public static Product readFile()// @02C
+	{
+		Product product = null;
+		BufferedReader br = null;
+		try {
+			String filePath = FileUtil.class.getResource(FILENAME).getPath();
+			File file = new File(filePath);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product = new Product(data[0], data[1]);
+
+		} catch (IOException e) {
+				e.printStackTrace();
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return product;
+	}
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..ef1eb60c5
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,77 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+	
+	private static Configuration config; 
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+
+	public static void sendEMails(boolean debug)
+	{
+
+		Product product = FileUtil.readFile();
+		System.out.println(product.toString());
+		
+		System.out.println("开始发送邮件");
+
+		List<HashMap<String, String>> mailingList = DBUtil.loadMailingList(product);
+		
+		if (mailingList == null){
+			System.out.println("没有邮件发送");
+			return ;
+		}
+
+		Iterator<HashMap<String, String>> iter = mailingList.iterator();
+		while (iter.hasNext()) {
+			HashMap<String, String> userInfo = iter.next();
+			Email email = MailUtil.configureEMail(userInfo,product);
+			try {
+				sendEmail(email.getToAddress(),email.getFromAddress(),email.getSubject(),email.getMessage(),email.getSmtpHost(),debug);
+			} catch (Exception e1) {
+				try {
+					sendEmail(email.getToAddress(),email.getFromAddress(),email.getSubject(),email.getMessage(),email.getAltSmtpHost(),debug);
+				} catch (Exception e2) {
+					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+				}
+			}
+		}
+
+	}
+	
+	
+	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());
+
+	}
+	
+	public static Email configureEMail(HashMap<String, String> userInfo,Product product){
+				
+		Email email = new Email();
+		config = new Configuration();
+		email.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		email.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		email.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		email.setSubject("您关注的产品降价了");
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		email.setToAddress(toAddress);
+		String name = (String) userInfo.get(NAME_KEY);
+		email.setMessage("尊敬的 "+name+", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!");
+		
+		return email;
+		
+	}	
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..e96809d49
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String id;  //产品ID
+	private String 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;
+	}
+	
+	
+	public Product() {
+	}
+	public Product(String id, String desc) {
+		this.id = id;
+		this.desc = desc;
+	}
+	@Override
+	public String toString() {
+		return "产品ID=" + id + "\n产品描述 = " + desc;
+	}
+
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..cf5b0879a
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) {
+		
+		boolean emailDebug = false;
+		
+		MailUtil.sendEMails(emailDebug);
+
+	}	
+	
+	
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/34594980/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
diff --git a/students/346154295/ood-assignment/pom.xml b/students/346154295/ood-assignment/pom.xml
new file mode 100644
index 000000000..0853e4c18
--- /dev/null
+++ b/students/346154295/ood-assignment/pom.xml
@@ -0,0 +1,46 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/346154295/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<String,String> 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/346154295/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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..ad72a12c2
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param productID
+	 * @return
+	 */
+	public static List<HashMap<String,String>> loadMailingList(String productID){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+		List<HashMap<String,String>> 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..f9627d307
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+	private static String smtpHost;
+	private static String altSmtpHost;
+	private static String fromAddress;
+
+	public static void init() {
+		Configuration config = new Configuration();
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	private static void sendEmail(String toAddress, 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());
+		
+	}
+	public static void sendEmail(String toAddress, String subject, String message, boolean debug) {
+		if(toAddress == null || toAddress.length() == 0) {
+			return;
+		}
+		try {
+			sendEmail(toAddress,subject,message,smtpHost,debug);
+		} catch (Exception e) {
+			try {
+				sendEmail(toAddress, subject, message, altSmtpHost, debug);
+			} catch (Exception e2){
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+}
diff --git a/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 000000000..e3719a503
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by xiaoyj on 2017/6/15.
+ */
+public class ProductInfo {
+    private String productID;
+    private String 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..e7530dbc5
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,73 @@
+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;
+
+public class PromotionMail {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+
+	public static void main(String[] args) throws Exception {
+		boolean emailDebug = false;
+        File file = new File("src/main/resource/product_promotion.txt");
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        ProductInfo productInfo = getProductInfo(file);
+        List<HashMap<String, String>> mailingList = DBUtil.loadMailingList(productInfo.getProductID());
+        sendEMails(emailDebug, mailingList, productInfo);
+
+	}
+
+	private static String getMessage(HashMap<String,String> userInfo, ProductInfo productInfo) throws IOException
+	{
+		String name = userInfo.get(NAME_KEY);
+		return "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!" ;
+	}
+	private static String getSubject() {
+	    return "您关注的产品降价了";
+    }
+
+	protected static void sendEMails(boolean debug, List<HashMap<String,String>> mailingList, ProductInfo productInfo) throws IOException {
+		System.out.println("开始发送邮件");
+        MailUtil.init();
+		if (mailingList != null) {
+            for (HashMap<String, String> userInfo : mailingList) {
+                String toAddress = userInfo.get(EMAIL_KEY);
+                if (toAddress == null || toAddress.length() == 0) {
+                    continue;
+                }
+                String subject = getSubject();
+                String message =getMessage(userInfo, productInfo);
+                MailUtil.sendEmail(toAddress, subject, message, debug);
+            }
+
+		} else {
+			System.out.println("没有邮件发送");
+			
+		}
+	}
+    private static ProductInfo getProductInfo(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            ProductInfo productInfo = new ProductInfo();
+            productInfo.setProductID(data[0]);
+            productInfo.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + productInfo.getProductID() + "\n");
+            System.out.println("产品描述 = " + productInfo.getProductDesc() + "\n");
+            return productInfo;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/346154295/ood-assignment/src/main/resource/product_promotion.txt b/students/346154295/ood-assignment/src/main/resource/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/resource/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/349166103/ood/ood-assignment/pom.xml b/students/349166103/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..80d83d3a8
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	private String fromAddress = null;
+	
+	static Map<String,String> 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);
+	}
+	
+	public Configuration(){
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+	
+	
+	private void setSMTPHost() 
+	{
+		smtpHost = ConfigurationKeys.SMTP_SERVER; 
+	}
+	
+	private void setAltSMTPHost() 
+	{
+		altSmtpHost = ConfigurationKeys.ALT_SMTP_SERVER; 
+
+	}
+
+	private void setFromAddress()
+	{
+		fromAddress = ConfigurationKeys.EMAIL_ADMIN;
+	}
+	
+	public String getFromAddress() 
+	{
+		return fromAddress;
+	}
+	
+	public String getSMTPHost()
+	{
+		return smtpHost;
+	}
+	
+	public String getAltSMTPHost()
+	{
+		return altSmtpHost;
+	}
+
+	
+
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/349166103/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/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..1c9afcdfb
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,93 @@
+package com.coderising.ood.srp;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	private String sendMailQuery = null;
+	private String productID = null;
+	private String productDesc = null;
+	private File f = null;
+	
+	DBUtil(File f){
+		try {
+			readFile(f);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @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;
+	}
+	
+	public List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+	
+	private void setLoadQuery() throws Exception {
+		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + getProductID() +"' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+	}
+	
+	
+	private 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 setProductID(String productID) 
+		{ 
+			this.productID = productID; 
+		}
+		
+		public String getProductDesc() {
+			return productDesc;		
+		}
+		
+		public String getProductID() {
+			return productID;
+		}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
new file mode 100644
index 000000000..e1abf927f
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
@@ -0,0 +1,54 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class MailContent {
+
+	private String subject = null;
+	private String message = null;
+	private String toAddress = null;
+	private final String NAME_KEY = "NAME";
+	private final String EMAIL_KEY = "EMAIL";
+	
+	public MailContent(File f, HashMap userInfo, String prodInfo){
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		try {
+			configureEMail(userInfo, prodInfo);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	
+	private void setMessage(HashMap userInfo, String prodInfo) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + prodInfo + " 降价了，欢迎购买!" ;		
+				
+	}
+	
+	protected void configureEMail(HashMap userInfo, String prodInfo) throws IOException 
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			setMessage(userInfo, prodInfo); 
+	}
+	
+	public String getToAddress() {
+		return toAddress;
+	}
+	
+	public String getSubject() {
+		return subject;
+	}
+	
+	public String getMessage() {
+		return message;
+	}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..f676fd5fd
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.HashMap;
+
+public class MailUtil {
+
+	private MailContent mc = null;
+	private String toAddress = null;
+	private String fromAddress = null;
+	private String subject = null;
+	private String message = null;
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	
+	public MailUtil(Configuration config, File f, HashMap userInfo, String prodInfo){
+		mc = new MailContent(f, userInfo, prodInfo);
+		toAddress = mc.getToAddress();
+		subject = mc.getSubject();
+		message = mc.getMessage();
+		fromAddress = config.getFromAddress();
+		smtpHost = config.getSMTPHost();
+		altSmtpHost = config.getAltSMTPHost();
+	}
+	public void sendEmail(boolean debug) {
+		try 
+		{
+			if (toAddress.length() > 0)
+				sendEmail(smtpHost);
+		} 
+		catch (Exception e) 
+		{
+			try {
+				sendEmail(altSmtpHost); 
+				
+			} catch (Exception e2) 
+			{
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+			}
+		}
+	}
+
+	private void sendEmail(String server){
+		//假装发了一封邮件
+		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/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..86e5abaa0
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		File f = new File(System.getProperty("user.dir")+"/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(emailDebug, f);
+	}
+		
+	public PromotionMail(boolean debug, File f) throws Exception 
+	{
+		Configuration config = new Configuration(); 
+		DBUtil dbu = new DBUtil(f);
+		List mailingList = dbu.loadMailingList();
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) { 
+				MailUtil mu = new MailUtil(config, f, (HashMap)iter.next(), dbu.getProductDesc());
+				mu.sendEmail(debug);
+			}
+		}
+		else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/349166103/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
diff --git a/students/360682644/ood-assignment/pom.xml b/students/360682644/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/360682644/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..e17b664d4
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	public static final String EMAIL_ADMIN = "email.admin";
+	private Map<String,String> configurations = new HashMap();
+	private static Configuration configuration = new Configuration();
+	{
+		configurations.put(EMAIL_ADMIN, "admin@company.com");
+	}
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		return configurations.get(key);
+	}
+
+	public static Configuration getInstance(){
+		return configuration;
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..e6f0ca21c
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<MailReceiver> query(String sql, Product product){
+		List<MailReceiver> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			MailReceiver receiver = new MailReceiver();
+			receiver.setName("User" + i);
+			receiver.setEmail("aa@bb.com");
+			receiver.setMessage(product);
+			receiver.setSubject(product);
+			userList.add(receiver);
+		}
+		return userList;
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java
new file mode 100644
index 000000000..019a96394
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public interface IMailable {
+
+    String toEmailText(String... params);
+    String toEmailSubject(String... params);
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java
new file mode 100644
index 000000000..72a39d060
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class MailHosts {
+
+    private List<String> hosts = new ArrayList();
+    {
+        hosts.add("smtp.163.com");
+        hosts.add("smtp1.163.com");
+    }
+
+    public List<String> getHosts() {
+        return hosts;
+    }
+    public void setHosts(List<String> hosts) {
+        this.hosts = hosts;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java
new file mode 100644
index 000000000..250f594a8
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class MailReceiver {
+    private String name;
+    private String email;
+    private String message;
+    private String subject;
+    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 String getMessage() {
+        return message;
+    }
+    public void setMessage(IMailable IMailable) {
+        message = IMailable.toEmailText(name);
+    }
+    public void setSubject(IMailable IMailable) {
+        subject = IMailable.toEmailSubject(null);
+    }
+    public void setMessage(String message) {
+        this.message = message;
+    }
+    public String getSubject() {
+        return subject;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java
new file mode 100644
index 000000000..4d22aff9c
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java
@@ -0,0 +1,87 @@
+package com.coderising.ood.srp;
+
+import org.junit.Assert;
+
+import java.io.*;
+import java.util.*;
+
+public class MailSender {
+
+    protected MailHosts hosts = null;
+    protected String fromAddress = null;
+    protected InputStream is = null;
+    protected List<MailReceiver> receivers = null;
+    private Configuration config = Configuration.getInstance();
+
+    public void init() throws Exception {
+        setSMTPHost();
+        setFromAddress();
+    }
+
+    protected MailSender setEmailInput(InputStream is) throws IOException {
+        this.is = is;
+        return this;
+    }
+
+    protected MailSender setReceiver() throws IOException {
+        Assert.assertNotNull("is cannot be null", is);
+        List<Product> products = read(is);
+        receivers = new ArrayList();
+        for (Product product : products) {
+            receivers.addAll(ReceiverService.getInstance().loadMailingList(product));
+        }
+        return this;
+    }
+
+    protected void setSMTPHost() {
+        hosts = new MailHosts();
+    }
+
+    protected void setFromAddress() {
+        fromAddress = config.getProperty(Configuration.EMAIL_ADMIN);
+    }
+
+    protected List<Product> read(InputStream is) throws IOException {
+        BufferedReader br = null;
+        List<Product> products = new ArrayList();
+        try {
+            br = new BufferedReader(new InputStreamReader(is));
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductID() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            br.close();
+        }
+        return products;
+    }
+
+    protected void send() throws IOException {
+        System.out.println("开始发送邮件");
+        if (receivers == null || receivers.isEmpty()) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        for (MailReceiver receiver : receivers) {
+            MailUtil.sendEmail(receiver.getEmail(), fromAddress, receiver.getSubject(), receiver.getMessage(), hosts);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("D:\\coding2017\\students\\360682644\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        MailSender pe = new MailSender();
+        pe.init();
+        pe.setEmailInput(new FileInputStream(f))
+                .setReceiver()
+                .send();
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..2d4545cf0
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, MailHosts smtpHosts) {
+		for(String hosts : smtpHosts.getHosts()) {
+			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());
+				break;
+			} catch (Exception e) {
+				System.err.println(String.format("通过SMTP服务器(%s)发送邮件失败: %s", hosts,e.getMessage()));
+			}
+		}
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..51dc9ea46
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class Product implements IMailable {
+    private String productID = null;
+    private String productDesc = null;
+
+    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;
+    }
+    public String toEmailText(String... params) {
+        return "尊敬的 "+ params[0] +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+    }
+    public String toEmailSubject(String... params) {
+        return "您关注的产品降价了";
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java
new file mode 100644
index 000000000..f5ea86338
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class ReceiverService {
+
+    private final static ReceiverService service = new ReceiverService();
+    public static ReceiverService getInstance(){return service;}
+
+    public List<MailReceiver> loadMailingList(Product product){
+        return DBUtil.query(getLoadQuery(), product);
+    }
+
+    public String getLoadQuery(){
+        String query = "Select name from subscriptions "
+                + "where product_id= ? "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return query;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/360682644/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/382266293/src/ood/srp/MailSender.java b/students/382266293/src/ood/srp/MailSender.java
new file mode 100644
index 000000000..83e3fbef8
--- /dev/null
+++ b/students/382266293/src/ood/srp/MailSender.java
@@ -0,0 +1,52 @@
+package ood.srp;
+
+import ood.srp.bean.Mail;
+import ood.srp.bean.Product;
+import ood.srp.config.Configuration;
+import ood.srp.config.ServerConfig;
+import ood.srp.dao.MailDAO;
+import ood.srp.dao.ProductDAO;
+import ood.srp.util.MailUtil;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public abstract class MailSender {
+
+    protected static ServerConfig sc = new Configuration().config().getServerConfig();
+    protected static MailDAO mailDAO = new MailDAO();
+    protected static ProductDAO productDAO = new ProductDAO();
+    protected boolean debug;
+
+    protected List<Mail> prepareMails(File productFile) throws Exception {
+
+        List<Product> products = productDAO.list(productFile);
+        List<Mail> mailingList = mailDAO.loadMailingList(products);
+        setMailContext(mailingList);
+
+        return mailingList;
+    }
+
+    protected abstract void setMailContext(List<Mail> mailingList);
+
+    protected void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    protected void sendEMails(List<Mail> mailingList) {
+
+        if (mailDAO.isValide(mailingList)) {
+            System.out.println("开始发送邮件");
+
+            for (Mail mail : mailingList) {
+                MailUtil.send(mail, sc);
+            }
+        }
+
+    }
+
+
+}
diff --git a/students/382266293/src/ood/srp/PromotionMail.java b/students/382266293/src/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..c3d6520a6
--- /dev/null
+++ b/students/382266293/src/ood/srp/PromotionMail.java
@@ -0,0 +1,40 @@
+package ood.srp;
+
+import ood.srp.bean.Mail;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail extends MailSender {
+
+    private static final String EMAIL_ADMIN = "email.admin";
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("E:\\git\\coding2017\\students\\382266293\\src\\com\\coderising\\ood\\srp\\data\\product_promotion.txt");
+        MailSender pm = new PromotionMail();
+        pm.setDebug(false);
+        List<Mail> mailList = pm.prepareMails(f);
+        pm.sendEMails(mailList);
+
+    }
+
+    @Override
+    protected void setMailContext(List<Mail> mailingList) {
+
+        String subject = "您关注的产品降价了";
+
+        for (Mail mail : mailingList) {
+            mail.setFromAddress(EMAIL_ADMIN);
+            mail.setSubject(subject);
+            String name = mail.getSubscriber().getName();
+            String productDesc = mail.getProduct().getProductDesc();
+            String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+            mail.setSubject(subject);
+            mail.setMessage(message);
+        }
+
+    }
+
+
+}
diff --git a/students/382266293/src/ood/srp/bean/Mail.java b/students/382266293/src/ood/srp/bean/Mail.java
new file mode 100644
index 000000000..91e136314
--- /dev/null
+++ b/students/382266293/src/ood/srp/bean/Mail.java
@@ -0,0 +1,53 @@
+package ood.srp.bean;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Mail {
+
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private Product product;
+    private Subscriber subscriber;
+
+    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 Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
+}
diff --git a/students/382266293/src/ood/srp/bean/Product.java b/students/382266293/src/ood/srp/bean/Product.java
new file mode 100644
index 000000000..3b879b274
--- /dev/null
+++ b/students/382266293/src/ood/srp/bean/Product.java
@@ -0,0 +1,38 @@
+package ood.srp.bean;
+
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+    private List<Subscriber> subscribers;
+
+    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;
+    }
+
+    public List<Subscriber> getSubscribers() {
+        return subscribers;
+    }
+
+    public void setSubscribers(List<Subscriber> subscribers) {
+        this.subscribers = subscribers;
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/bean/Subscriber.java b/students/382266293/src/ood/srp/bean/Subscriber.java
new file mode 100644
index 000000000..a2a264162
--- /dev/null
+++ b/students/382266293/src/ood/srp/bean/Subscriber.java
@@ -0,0 +1,27 @@
+package ood.srp.bean;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Subscriber {
+
+    private String name;
+    private String mailAddress;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMailAddress() {
+        return mailAddress;
+    }
+
+    public void setMailAddress(String mailAddress) {
+        this.mailAddress = mailAddress;
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/config/Configuration.java b/students/382266293/src/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..59bf7bfbd
--- /dev/null
+++ b/students/382266293/src/ood/srp/config/Configuration.java
@@ -0,0 +1,37 @@
+package ood.srp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    private static final String SMTP_SERVER = "smtp.server";
+    private static final String ALT_SMTP_SERVER = "alt.smtp.server";
+
+
+    private static Map<String, String> configurations = null;
+
+    public Configuration config() {
+
+        configurations = new HashMap<>();
+        configurations.put(SMTP_SERVER, "smtp.163.com");
+        configurations.put(ALT_SMTP_SERVER, "smtp1.163.com");
+
+        return this;
+    }
+
+    public ServerConfig getServerConfig() {
+
+        ServerConfig sc = new ServerConfig();
+
+        sc.setSmtpHost(getProperty(SMTP_SERVER));
+        sc.setAltSmtpHost(getProperty(ALT_SMTP_SERVER));
+
+        return sc;
+    }
+
+    private String getProperty(String key) {
+        return configurations.get(key);
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/config/ServerConfig.java b/students/382266293/src/ood/srp/config/ServerConfig.java
new file mode 100644
index 000000000..2c8c52a79
--- /dev/null
+++ b/students/382266293/src/ood/srp/config/ServerConfig.java
@@ -0,0 +1,32 @@
+package ood.srp.config;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class ServerConfig {
+
+    private String smtpHost;
+    private String altSmtpHost;
+
+    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;
+    }
+
+
+}
+
+
+
+
diff --git a/students/382266293/src/ood/srp/dao/MailDAO.java b/students/382266293/src/ood/srp/dao/MailDAO.java
new file mode 100644
index 000000000..c80eb7f7b
--- /dev/null
+++ b/students/382266293/src/ood/srp/dao/MailDAO.java
@@ -0,0 +1,39 @@
+package ood.srp.dao;
+
+import ood.srp.bean.Mail;
+import ood.srp.bean.Product;
+import ood.srp.bean.Subscriber;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class MailDAO {
+
+    public List<Mail> loadMailingList(List<Product> products) throws Exception {
+
+        List<Mail> mails = new ArrayList<>();
+
+        for (Product p : products) {
+            List<Subscriber> subscribers = new UserDAO().list(p);
+
+            for (Subscriber s : subscribers) {
+                Mail mail = new Mail();
+                mail.setProduct(p);
+                mail.setSubscriber(s);
+                mails.add(mail);
+            }
+        }
+        return mails;
+    }
+
+    public boolean isValide(List<Mail> mailingList) {
+        if (null == mailingList || mailingList.isEmpty()) {
+            throw new RuntimeException("没有邮件发送");
+        }
+        return true;
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/dao/ProductDAO.java b/students/382266293/src/ood/srp/dao/ProductDAO.java
new file mode 100644
index 000000000..39312cf24
--- /dev/null
+++ b/students/382266293/src/ood/srp/dao/ProductDAO.java
@@ -0,0 +1,49 @@
+package ood.srp.dao;
+
+import ood.srp.bean.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class ProductDAO {
+
+    public List<Product> list(File productFile) throws IOException // @02C
+    {
+
+        System.out.println(productFile);
+        List<Product> products = new ArrayList<>();
+
+        System.out.println("开始导入产品清单");
+        try (BufferedReader br = new BufferedReader(new FileReader(productFile))) {
+            String temp = null;
+            while (null != (temp = br.readLine())) {
+                String[] data = temp.split(" ");
+
+                String productID = data[0];
+                String productDesc = data[1];
+
+                Product p = new Product();
+                p.setProductID(productID);
+                p.setProductDesc(productDesc);
+                System.out.println("产品ID = " + productID);
+                System.out.println("产品描述 = " + productDesc + "\r\n");
+
+                products.add(p);
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        }
+
+
+        return products;
+    }
+
+
+}
diff --git a/students/382266293/src/ood/srp/dao/UserDAO.java b/students/382266293/src/ood/srp/dao/UserDAO.java
new file mode 100644
index 000000000..91ebd5cd2
--- /dev/null
+++ b/students/382266293/src/ood/srp/dao/UserDAO.java
@@ -0,0 +1,31 @@
+package ood.srp.dao;
+
+import ood.srp.bean.Product;
+import ood.srp.bean.Subscriber;
+import ood.srp.util.DBUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class UserDAO {
+
+    public List<Subscriber> list(Product p) throws Exception {
+
+        DBUtil.setLoadQuery(p);
+
+        List<Subscriber> subscribers = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            Subscriber s = new Subscriber();
+            s.setName("user" + i);
+            s.setMailAddress(s.getName() + "@amazon.com");
+            subscribers.add(s);
+
+        }
+        return subscribers;
+
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/data/product_promotion.txt b/students/382266293/src/ood/srp/data/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/382266293/src/ood/srp/data/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/382266293/src/ood/srp/util/DBUtil.java b/students/382266293/src/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..9d14f02cb
--- /dev/null
+++ b/students/382266293/src/ood/srp/util/DBUtil.java
@@ -0,0 +1,16 @@
+package ood.srp.util;
+
+import ood.srp.bean.Product;
+
+public class DBUtil {
+
+    public static void setLoadQuery(Product p) {
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + p.getProductID() + "' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+    }
+
+}
diff --git a/students/382266293/src/ood/srp/util/MailUtil.java b/students/382266293/src/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..d41af6667
--- /dev/null
+++ b/students/382266293/src/ood/srp/util/MailUtil.java
@@ -0,0 +1,32 @@
+package ood.srp.util;
+
+import ood.srp.bean.Mail;
+import ood.srp.config.ServerConfig;
+
+public class MailUtil {
+
+    public static void send(Mail mail, ServerConfig sc) {
+        try {
+            sendEmail(mail, sc.getSmtpHost());
+        } catch (Exception e) {
+            try {
+                sendEmail(mail, sc.getAltSmtpHost());
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+    public static void sendEmail(Mail mail, String SmtpHost) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(mail.getFromAddress()).append("\n");
+        buffer.append("To:").append(mail.getSubscriber().getMailAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSubject()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        System.out.println(buffer.toString());
+
+    }
+
+
+}
diff --git a/students/382266293/src/pom.xml b/students/382266293/src/pom.xml
new file mode 100644
index 000000000..2bf55e64c
--- /dev/null
+++ b/students/382266293/src/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ood-assignment</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..db20a8a5d
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,27 @@
+package src.main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> 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/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..4946f09f3
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..6edf953e1
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..3b6716de7
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..e23638c4b
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,172 @@
+package src.main.java.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.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+    private static Configuration config;
+    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;
+
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        readFile(file);
+
+
+        config = new Configuration();
+
+        setSMTPHost();
+        setAltSMTPHost();
+
+
+        setFromAddress();
+
+
+        setLoadQuery();
+
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("E:\\git\\coding2017\\students\\382266293\\src\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(f, emailDebug);
+
+    }
+
+    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/382266293/src/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/382266293/src/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/382266293/src/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/382266293/src/test.java b/students/382266293/src/test.java
new file mode 100644
index 000000000..56d4d4396
--- /dev/null
+++ b/students/382266293/src/test.java
@@ -0,0 +1,9 @@
+/**
+ * Created by onlyLYJ on 2017/6/11.
+ */
+
+
+public class test {
+
+
+}
diff --git a/students/383117348/ood-assignment/pom.xml b/students/383117348/ood-assignment/pom.xml
new file mode 100644
index 000000000..1be81576c
--- /dev/null
+++ b/students/383117348/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..715b5a23d
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,Object> configurations = new HashMap<String, Object>();
+	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");
+		configurations.put(ConfigurationKeys.IS_EMAIL_DEBUG, false);
+	}
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public Object getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+}
diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..ddc77c756
--- /dev/null
+++ b/students/383117348/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";
+	public static final String IS_EMAIL_DEBUG = "is_email_debug";
+}
diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..65383e4db
--- /dev/null
+++ b/students/383117348/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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..275edf2ab
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,61 @@
+package com.coderising.ood.srp;
+
+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.List;
+
+public class FileUtil {
+	
+	/**
+	 * 根据文件路径获取文件,如果文件不存在,抛出异常
+	 * @param path
+	 * @return
+	 * @throws FileNotFoundException
+	 */
+	public static File readFile(String path) throws FileNotFoundException {
+		File file = new File(path);
+		if (!file.exists()) {
+			throw new FileNotFoundException("文件不存在");
+		}
+		return file;
+	}
+
+	/**
+	 * 根据正则,将文件中的数据解析成字符串数组形式返回
+	 * 
+	 * @param file
+	 * @param regex
+	 * @return
+	 */
+	public static List<String[]> parseToString(File file, String regex) {
+		List<String[]> list = new ArrayList<String[]>();
+		BufferedReader br = null;
+		try {
+			if (file != null && file.exists()) {
+
+				br = new BufferedReader(new FileReader(file));
+				String temp = null;
+				while ((temp = br.readLine()) != null) {
+					String[] strs = temp.split(regex);
+					list.add(strs);
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (br != null) {
+				try {
+					br.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return list;
+	}
+}
diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..d5ed2e536
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	private static String fromAddress = "";
+	private static String smtpHost = "";
+	private static String altSmtpHost = "";
+	private static boolean debug = false;
+
+	private static Configuration config = new Configuration();
+
+	private 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);
+		debug = (Boolean) config.getProperty(ConfigurationKeys.IS_EMAIL_DEBUG);
+	}
+	/**
+	 * 发送单条邮件
+	 * @param toAddress
+	 * @param subject
+	 * @param message
+	 */
+	public static void sendEmail(String toAddress,String subject,String message) {
+		ConfigureEmail();
+		if(debug){
+			System.out.println("测试环境");
+		}else{
+			System.out.println("正式环境");
+		}
+		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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..d00b43876
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,101 @@
+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;
+
+public class PromotionMail {
+
+	protected String subject = null;
+	protected String message = null;
+
+	private static List<String[]> products = new ArrayList<String[]>();
+
+	private static String filePath = "E:\\coding2017\\students\\383117348\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+	private UserInfoService uis = new UserInfoServiceImpl();
+
+	public PromotionMail(File file) throws Exception {
+		// 读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		readFile(file);
+	}
+
+	public static void main(String[] args) throws Exception {
+		File f = FileUtil.readFile(filePath);
+		PromotionMail pe = new PromotionMail(f);
+		// 遍历每条产品信息
+		for (String[] data : products) {
+			List<Map<String, String>> list = pe.loadUserInfoList(data[0]);
+			if (list != null && list.size() > 0) {
+				pe.sendEMails(list, data[1]);
+			}
+		}
+	}
+
+	/**
+	 * 读取产品文件,获得所有的产品信息
+	 * 
+	 * @param file
+	 */
+	protected void readFile(File file) {
+		List<String[]> datas = FileUtil.parseToString(file, " ");
+		if (datas != null && datas.size() > 0) {
+			products = datas;
+			for (String[] data : products) {
+				System.out.print("产品ID = " + data[0] + "\n");
+				System.out.println("产品描述 = " + data[1] + "\n");
+			}
+		}
+	}
+
+	/**
+	 * 根据产品id获取需要发送的用户信息,暂未考虑sql注入的安全问题
+	 * 
+	 * @return
+	 * @throws Exception
+	 */
+	protected List<Map<String, String>> loadUserInfoList(String productID) throws Exception {
+		return uis.getList(productID);
+	}
+
+	/**
+	 * 设置发送的消息体
+	 * 
+	 * @param name
+	 * @throws IOException
+	 */
+	protected void setMessage(String name, String productDesc) throws IOException {
+		this.subject = "您关注的产品降价了";
+		this.message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+	}
+
+	/**
+	 * 发送邮件
+	 * 
+	 * @param mailingList
+	 * @throws IOException
+	 */
+	protected void sendEMails(List<Map<String, String>> mailingList, String productDesc) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator<Map<String, String>> iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Map<String, String> 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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java
new file mode 100644
index 000000000..9dea3e28d
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserInfoService {
+	/**
+	 * 根据产品id获取订阅信息用户
+	 * @param productID
+	 * @return
+	 */
+	public List<Map<String,String>> getList(String productID);
+	
+}
diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java
new file mode 100644
index 000000000..07427ac13
--- /dev/null
+++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class UserInfoServiceImpl implements UserInfoService {
+
+	public List<Map<String, String>> getList(String productID) {
+		// TODO Auto-generated method stub
+		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
+		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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/383117348/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/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java b/students/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java
new file mode 100644
index 000000000..931f1f536
--- /dev/null
+++ b/students/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java
@@ -0,0 +1,38 @@
+package com.coderising.ood_assignment;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+    extends TestCase
+{
+    /**
+     * Create the test case
+     *
+     * @param testName name of the test case
+     */
+    public AppTest( String testName )
+    {
+        super( testName );
+    }
+
+    /**
+     * @return the suite of tests being tested
+     */
+    public static Test suite()
+    {
+        return new TestSuite( AppTest.class );
+    }
+
+    /**
+     * Rigourous Test :-)
+     */
+    public void testApp()
+    {
+        assertTrue( true );
+    }
+}
diff --git a/students/395860968/ood-assignment/Configuration.java b/students/395860968/ood-assignment/Configuration.java
new file mode 100644
index 000000000..44c566fca
--- /dev/null
+++ b/students/395860968/ood-assignment/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/395860968/ood-assignment/ConfigurationKeys.java b/students/395860968/ood-assignment/ConfigurationKeys.java
new file mode 100644
index 000000000..868a03ff8
--- /dev/null
+++ b/students/395860968/ood-assignment/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/395860968/ood-assignment/DBUtil.java b/students/395860968/ood-assignment/DBUtil.java
new file mode 100644
index 000000000..65383e4db
--- /dev/null
+++ b/students/395860968/ood-assignment/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/395860968/ood-assignment/FileUtil.java b/students/395860968/ood-assignment/FileUtil.java
new file mode 100644
index 000000000..9a1a468c1
--- /dev/null
+++ b/students/395860968/ood-assignment/FileUtil.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by kenhuang on 2017/6/15.
+ */
+public class FileUtil {
+    private static final String FILE_PATH="/Users/kenhuang/Desktop/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+    private static File f = new File(FileUtil.FILE_PATH);
+    protected static Product readFile() throws IOException // @02C
+    {
+        BufferedReader br = null;
+        Product resultProduct;
+        try {
+            br = new BufferedReader(new FileReader(f));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            resultProduct = new Product(data[0],data[1]);
+            System.out.println("产品ID = " + resultProduct.productID + "\n");
+            System.out.println("产品描述 = " + resultProduct.productDesc + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return resultProduct;
+    }
+}
diff --git a/students/395860968/ood-assignment/MailUtil.java b/students/395860968/ood-assignment/MailUtil.java
new file mode 100644
index 000000000..e62f40ead
--- /dev/null
+++ b/students/395860968/ood-assignment/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+
+
+public class MailUtil {
+	protected String smtpHost = null;
+	protected String altSmtpHost = null;
+	public MailUtil(String smtpHost, String altSmtpHost) {
+		this.smtpHost = smtpHost;
+		this.altSmtpHost = altSmtpHost;
+	}
+	private 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());
+
+	}
+	public  void sendPromotionMail(boolean debug, PromotionMail mail) throws IOException {
+		System.out.println("开始发送邮件");
+		String toAddress;
+		String message;
+		if (mail.toAddressList != null) {
+			while (mail.hasNextToAddress()) {
+				toAddress = mail.getNextToAddress();
+				if (toAddress.length() > 0){
+					message = mail.generateMessageToCurrentToAddress();
+					try {
+							MailUtil.sendEmail(toAddress, mail.fromAddress, mail.subject, message, this.smtpHost, debug);
+					}
+					catch (Exception e) {
+						try {
+							MailUtil.sendEmail(toAddress, mail.fromAddress, mail.subject, message, this.altSmtpHost, debug);
+
+						} catch (Exception e2) {
+							System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+						}
+					}
+				}else {
+					System.out.println("目标地址为空");
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/395860968/ood-assignment/Product.java b/students/395860968/ood-assignment/Product.java
new file mode 100644
index 000000000..27ce7b0ef
--- /dev/null
+++ b/students/395860968/ood-assignment/Product.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by kenhuang on 2017/6/15.
+ */
+public class Product {
+    protected String productID = null;
+    protected String productDesc = null;
+   // protected String sendMailQuery = null;
+    public Product(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+    protected String generateLoadQuery() {
+        System.out.println("loadQuery set");
+        return  "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+    }
+}
diff --git a/students/395860968/ood-assignment/PromotionMail.java b/students/395860968/ood-assignment/PromotionMail.java
new file mode 100644
index 000000000..f62a56c29
--- /dev/null
+++ b/students/395860968/ood-assignment/PromotionMail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+public class PromotionMail {
+	protected String fromAddress = null;
+	protected List toAddressList = null;
+	protected String subject = "您关注的产品降价了";
+	protected String message = null;
+	private Product product;
+	private int toAddressListIndex = -1 ;
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	public static void main(String[] args) throws Exception {
+		Product product = FileUtil.readFile();
+		if (product != null) {
+			boolean emailDebug = false;
+			Configuration config = new Configuration();
+			MailUtil mailUtil = new MailUtil(config.getProperty(ConfigurationKeys.SMTP_SERVER),
+					config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+			PromotionMail mail = new PromotionMail(config.getProperty(ConfigurationKeys.EMAIL_ADMIN),product);
+			mailUtil.sendPromotionMail(emailDebug,mail);
+		}
+	}
+	public PromotionMail(String fromAddress,Product product) throws Exception {
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		this.fromAddress = fromAddress;
+		this.product = product;
+		this.toAddressList = DBUtil.query(this.product.generateLoadQuery());
+	}
+	public boolean hasNextToAddress(){
+		return this.toAddressListIndex < this.toAddressList.size() - 1;
+	}
+	public String getNextToAddress(){
+		HashMap map = (HashMap)this.toAddressList.get(++this.toAddressListIndex);
+		return (String)map.get(EMAIL_KEY);
+	}
+	protected String generateMessageToCurrentToAddress() throws IOException {
+		HashMap map = (HashMap)this.toAddressList.get(this.toAddressListIndex);
+		String name = (String) map.get(NAME_KEY);
+		return  "尊敬的 "+name+", 您关注的产品 " + this.product.productDesc + " 降价了，欢迎购买!" ;
+	}
+}
diff --git a/students/395860968/ood-assignment/product_promotion.txt b/students/395860968/ood-assignment/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/395860968/ood-assignment/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/395860968/ood-assignment/src b/students/395860968/ood-assignment/src
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/students/395860968/ood-assignment/src
@@ -0,0 +1 @@
+
diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
new file mode 100644
index 000000000..129bccd49
--- /dev/null
+++ b/students/402246209/learning/pom.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.mimieye</groupId>
+    <artifactId>learning</artifactId>
+    <version>RELEASE</version>
+    <packaging>jar</packaging>
+
+
+</project>
\ No newline at end of file
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java
new file mode 100644
index 000000000..d4e3c6fe1
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.mimieye.odd.srp.config;
+import com.mimieye.odd.srp.util.PropertiesUtil;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class Configuration {
+	private static final String CONFIG_FILENAME = "config.properties";
+	static Properties configurations = null;
+	static{
+        try {
+            configurations = PropertiesUtil.getInstance(CONFIG_FILENAME);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+	/**
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		return configurations.getProperty(key);
+	}
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..7f1a264d0
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java
@@ -0,0 +1,11 @@
+package com.mimieye.odd.srp.config;
+
+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";
+	public static final String PROMOTION_FILEPATH = "promotion.filepath";
+	public static final String EMAIL_DEBUG = "emailDebug";
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java
new file mode 100644
index 000000000..eb7544b4f
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java
@@ -0,0 +1,108 @@
+package com.mimieye.odd.srp.controller;
+
+import com.mimieye.odd.srp.config.Configuration;
+import com.mimieye.odd.srp.config.ConfigurationKeys;
+import com.mimieye.odd.srp.dao.impl.UserInfoDAOImpl;
+import com.mimieye.odd.srp.service.PromotionInfoService;
+import com.mimieye.odd.srp.service.UserInfoService;
+import com.mimieye.odd.srp.service.impl.PromotionInfoServiceImpl;
+import com.mimieye.odd.srp.service.impl.UserInfoServiceImpl;
+import com.mimieye.odd.srp.util.MailUtil;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public abstract class PromotionAbstractMail {
+
+    protected static Configuration config;
+    protected static final String NAME_KEY = "NAME";
+    protected static final String EMAIL_KEY = "EMAIL";
+    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 filePath;
+    protected boolean mailDebug;
+    protected List userInfos;
+    protected String productID;
+    protected String productDesc;
+
+    public void init() throws Exception{
+        config = new Configuration();
+        setFilePath(config.getProperty(ConfigurationKeys.PROMOTION_FILEPATH));
+        setMailDebug(Boolean.parseBoolean(ConfigurationKeys.EMAIL_DEBUG));
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+        // 降价商品service
+        PromotionInfoService promotionInfoService = new PromotionInfoServiceImpl();
+        // 邮件接收人service
+        UserInfoService userInfoService = new UserInfoServiceImpl(new UserInfoDAOImpl());
+        // 获取第一条降价商品
+        Map<String,String> promotion = promotionInfoService.listPromotions(filePath).get(0);
+        setProductID(promotion.get("productID"));
+        setProductDesc(promotion.get("productDesc"));
+        // 获取邮件接收人
+        setUserInfos(userInfoService.loadMailingList(productID));
+    }
+
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0)
+            setMessage(userInfo);
+    }
+
+    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("没有邮件发送");
+        }
+
+    }
+
+    public void send() throws IOException { sendEMails(mailDebug, userInfos); }
+
+    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 setFilePath(String filePath) { this.filePath = filePath; }
+
+    protected void setMailDebug(boolean mailDebug) { this.mailDebug = mailDebug; }
+
+    protected void setUserInfos(List userInfos) { this.userInfos = userInfos; }
+
+    protected void setProductID(String productID) { this.productID = productID; }
+
+    protected void setProductDesc(String productDesc) { this.productDesc = productDesc; }
+
+    protected abstract void setMessage(HashMap userInfo) throws IOException ;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java
new file mode 100644
index 000000000..983126e4d
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java
@@ -0,0 +1,19 @@
+package com.mimieye.odd.srp.controller;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class PromotionMail extends PromotionAbstractMail{
+
+    /**
+     * 自定义邮件内容
+     * @param userInfo
+     * @throws IOException
+     */
+    protected void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+    }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java
new file mode 100644
index 000000000..00ef1860b
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java
@@ -0,0 +1,13 @@
+package com.mimieye.odd.srp.dao;
+
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface UserInfoDAO {
+
+    List loadMailingList(String productID) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java
new file mode 100644
index 000000000..c59b4bde9
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java
@@ -0,0 +1,20 @@
+package com.mimieye.odd.srp.dao.impl;
+
+import com.mimieye.odd.srp.dao.UserInfoDAO;
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class UserInfoDAOImpl implements UserInfoDAO {
+
+    public List loadMailingList(String productID) throws Exception {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return DBUtil.query(sendMailQuery);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java
new file mode 100644
index 000000000..4a6c4366b
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java
@@ -0,0 +1,17 @@
+package com.mimieye.odd.srp.main;
+
+import com.mimieye.odd.srp.controller.PromotionAbstractMail;
+import com.mimieye.odd.srp.controller.PromotionMail;
+
+/**
+ * Created by Pierreluo on 2017/6/17.
+ */
+public class PromotionEmailMain {
+    public static void main(String[] args) throws Exception {
+        PromotionAbstractMail mail = new PromotionMail();
+        // 初始化数据
+        mail.init();
+        // 发送邮件
+        mail.send();
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java
new file mode 100644
index 000000000..bfcb50810
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java
@@ -0,0 +1,13 @@
+package com.mimieye.odd.srp.service;
+
+import com.mimieye.odd.srp.util.FileReadUtil;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface PromotionInfoService {
+    List<Map<String, String>> listPromotions(String filePath) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java
new file mode 100644
index 000000000..57747f298
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java
@@ -0,0 +1,12 @@
+package com.mimieye.odd.srp.service;
+
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface UserInfoService {
+    List loadMailingList(String productID) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java
new file mode 100644
index 000000000..20aa392ea
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java
@@ -0,0 +1,41 @@
+package com.mimieye.odd.srp.service.impl;
+
+import com.mimieye.odd.srp.service.PromotionInfoService;
+import com.mimieye.odd.srp.util.FileReadUtil;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class PromotionInfoServiceImpl implements PromotionInfoService {
+
+    @Override
+    public List<Map<String, String>> listPromotions(String filePath) throws Exception {
+        List<Map<String,String>> list = null;
+        List<String> results = FileReadUtil.readFile(filePath);
+        if(results != null && results.size()>0){
+            list = new ArrayList<>();
+            String temp = null;
+            String[] data = null;
+            Map<String,String> map = null;
+            Iterator<String> iterator = results.iterator();
+            int i=1;
+            while(iterator.hasNext()){
+                temp = iterator.next();
+                data = temp.split(" ");
+                map = new HashMap<>();
+                map.put("productID",data[0]);
+                map.put("productDesc",data[1]);
+                list.add(map);
+                System.out.println("产品"+(i)+"ID = " + data[0] );
+                System.out.println("产品"+(i++)+"描述 = " + data[1] + "\n");
+            }
+        }else{
+            throw new IOException("No Records.");
+        }
+        return list;
+    }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java
new file mode 100644
index 000000000..39d7613a6
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java
@@ -0,0 +1,24 @@
+package com.mimieye.odd.srp.service.impl;
+
+import com.mimieye.odd.srp.dao.UserInfoDAO;
+import com.mimieye.odd.srp.service.UserInfoService;
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class UserInfoServiceImpl implements UserInfoService {
+
+    private UserInfoDAO dao;
+
+    public UserInfoServiceImpl(){}
+    public UserInfoServiceImpl(UserInfoDAO dao){
+        this.dao = dao;
+    }
+
+    public List loadMailingList(String productID) throws Exception {
+        return dao.loadMailingList(productID);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java
new file mode 100644
index 000000000..c3e16050f
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java
@@ -0,0 +1,25 @@
+package com.mimieye.odd.srp.util;
+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/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java
new file mode 100644
index 000000000..0c0a8f58c
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java
@@ -0,0 +1,42 @@
+package com.mimieye.odd.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/13.
+ */
+public class FileReadUtil {
+
+    public static List<String> readFile(String fileName) throws IOException {
+        File file = new File(fileName);
+        BufferedReader reader = null;
+        List<String> results = null;
+        try {
+            reader = new BufferedReader(new FileReader(file));
+            String tempString = null;
+            while ((tempString = reader.readLine()) != null) {
+                if(results == null){
+                    results = new ArrayList<>();
+                }
+                results.add(tempString);
+            }
+            reader.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw e;
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e1) {
+                }
+            }
+        }
+        return results;
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java
new file mode 100644
index 000000000..b576aac1e
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.srp.util;
+
+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/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java
new file mode 100644
index 000000000..b40c49447
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.srp.util;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * Created by Pierreluo on 2017/6/17.
+ */
+public class PropertiesUtil {
+
+    public static Properties getInstance(String fileName) throws Exception {
+        InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
+        Properties properties = new Properties();
+        properties.load(in);
+        return properties;
+    }
+}
diff --git a/students/402246209/learning/src/main/resources/config.properties b/students/402246209/learning/src/main/resources/config.properties
new file mode 100644
index 000000000..290d819f1
--- /dev/null
+++ b/students/402246209/learning/src/main/resources/config.properties
@@ -0,0 +1,5 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
+promotion.filepath=F:/projectL/coding2017/students/402246209/learning/src/main/resources/product_promotion.txt
+emailDebug=false
diff --git a/students/402246209/learning/src/main/resources/product_promotion.txt b/students/402246209/learning/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/402246209/learning/src/main/resources/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/404481481/day01/src/com/coderising/ood/srp/Configuration.java b/students/404481481/day01/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f2d42038a
--- /dev/null
+++ b/students/404481481/day01/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+	
+	public static void init(PromotionMail promotion){
+		Configuration config = new Configuration();
+		promotion.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		promotion.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		promotion.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+}
diff --git a/students/404481481/day01/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/404481481/day01/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/404481481/day01/src/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/404481481/day01/src/com/coderising/ood/srp/DBUtil.java b/students/404481481/day01/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/404481481/day01/src/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/404481481/day01/src/com/coderising/ood/srp/FileUtil.java b/students/404481481/day01/src/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..dca25210f
--- /dev/null
+++ b/students/404481481/day01/src/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+	
+	public static void readFile(File file,PromotionMail promotion) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			promotion.productID = data[0]; 
+			promotion.productDesc = data[1]; 
+			
+			System.out.println("产品ID = " + promotion.productID + "\n");
+			System.out.println("产品描述 = " + promotion.productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/404481481/day01/src/com/coderising/ood/srp/MailUtil.java b/students/404481481/day01/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..da0ccb315
--- /dev/null
+++ b/students/404481481/day01/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+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());
+
+	}
+
+	public static void sendEMails(boolean debug, List mailingList, PromotionMail promotion) throws IOException {
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				promotion.configureEMail((HashMap) iter.next());
+				try {
+					if (promotion.toAddress.length() > 0)
+						MailUtil.sendEmail(promotion.toAddress, promotion.fromAddress, promotion.subject,
+								promotion.message, promotion.smtpHost, debug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(promotion.toAddress, promotion.fromAddress, promotion.subject,
+								promotion.message, promotion.altSmtpHost, debug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		} else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/404481481/day01/src/com/coderising/ood/srp/PromotionMail.java b/students/404481481/day01/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..2472e23d3
--- /dev/null
+++ b/students/404481481/day01/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,67 @@
+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 final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("G:\\Java\\github\\coding2017\\students\\404481481\\day01\\src\\product_promotion.txt");
+		boolean emailDebug = false;
+
+		PromotionMail pe = new PromotionMail(f, emailDebug);
+
+	}
+
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		FileUtil.readFile(file, this);
+		Configuration.init(this);
+		setLoadQuery();
+
+		MailUtil.sendEMails(mailDebug, loadMailingList(), this);
+
+	}
+
+	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 setMessage(HashMap userInfo) throws IOException {
+		String name = (String) userInfo.get(NAME_KEY);
+		subject = "您关注的产品降价了";
+		message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+	}
+
+	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);
+	}
+
+}
diff --git a/students/404481481/day01/src/product_promotion.txt b/students/404481481/day01/src/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/404481481/day01/src/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/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md" "b/students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md"
new file mode 100644
index 000000000..32dab3b3d
--- /dev/null
+++ "b/students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md"
@@ -0,0 +1,72 @@
+整个发送的流程主要是以下步骤
+1. 从配置文件中读取，生成要发送的产品信息。
+2. 设置邮件发送需要的SMTPHOST,ALTSMTPHOST,FROMADDRESS
+3. 查询出需要发送的用户列表
+4. 设置发送邮件需要的 信息，从用户列表中读取要发送去的地址，用产品信息拼凑出Message
+5. 发送邮件。
+其实Promotion就是一个job，衔接各个Handler，不自己做逻辑，完成发信的一个任务。
+
+所以我理解首先可以独立出来的一堆职责就是邮件发送的类，它能够被初始化，然后接受参数发送邮件。
+
+所以首先抽取出的职责就是和邮件发送相关的职责。EmailHandler。
+smtphost和altSmtpHost是定死的，应该设定成系统初始化时就设定好，至于From address在发送企业推送邮件时，也是统一的，也考虑封装在EmailHandler内部。
+在初始化一个EmailHandler时，即完成了邮件系统的相关设置。
+然后将发信的逻辑封装在EmailHandler内部。
+然后在PromotionMail中移除邮件系统相关的配置，引入EmailHandler。
+现在所有和发送相关以及邮件系统初始化的逻辑，全部移动到了EmailHandler内部。
+```java
+public PromotionMail(File file, boolean mailDebug) throws Exception {
+		// 读文件，获得要推送的商品信息
+		readFile(file);
+		// 查询用户
+		setLoadQuery();
+		// 初始化邮件发送Handler
+		EmailHandler emailHandler = new EmailHandler();
+		// 对私有函数增加一个参数。
+		sendEMails(mailDebug, loadMailingList(), emailHandler);
+	}
+```
+
+ok，接下来，邮件发送需要的主体信息是来自外部的，但它可以是一个纯数据类，存放着发送者，主题，message，一个pojo类，sendEMails应该只需要接受pojo的list，然后直接调emailHandler的发送函数即可，而不需要在里面还要进行取值的操作。
+```java
+		configureEMail((HashMap) iter.next());
+	    boolean result = emailHandler.sendMail(toAddress, subject, message, debug);
+```
+一个简单的pojo类，emailHandler应该接受这个作为参数，修改代码如下
+```java
+  private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+```
+新的发送邮件的函数
+```java
+private void sendEMails(boolean debug, List<EmailEntity> emailEntities, EmailHandler emailHandler)
+			throws IOException {
+
+		System.out.println("开始发送邮件");
+		if (CollectionUtils.isNotEmpty(emailEntities)) {
+			for (EmailEntity emailEntity : emailEntities) {
+				boolean result = emailHandler.sendMail(emailEntity, debug);
+				System.out.println("发送邮件结果: " + result);
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+```
+emailHandler直接和emailEntity交互。
+接下来就是说我们怎么去构造emailEntities这个list了。
+然后这个商品信息的文件读取出来是一个list，首先对原有的读文件函数进行改动，用一个pojo类去代表商品的信息。同样的，用户的返回我们也用一个pojo类存储，因为这些东西以后的加字段可能是比较高的，通过一个统一的实体来管理会比较好。
+然后在job类里少用this，通过传参的方式，首先改变查询用户的函数，传入参数查询语句，返回的是user的list。
+分别构造出用来查询商品和用来处理用户的私有方法，准备下一步的重构。
+将查询商品相关的处理，封装到ProductHandler内部，只对外暴露获得商品列表的接口。
+```java
+// 查询商品
+List<Product> products = new ProductHandler().fetchProducts();
+```
+用户是根据订阅了商品的来查的，所以处理用户的UserHandler接受一个sql语句查询，和商品之间解耦。
+
+最终总结就是通过三个处理器负责商品，用户，邮件的处理，原有的PromotionMail则相当于是衔接各个处理器的job，具体的业务逻辑放在各个handler内部完成处理。
+
+重构完毕。
diff --git a/students/406400373/ood_assignment/refactor_odd/pom.xml b/students/406400373/ood_assignment/refactor_odd/pom.xml
new file mode 100644
index 000000000..ecba4bc53
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>ood-assignment</groupId>
+    <artifactId>refactor-odd</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.5.1</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/Configuration.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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<String,String> 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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..b161fa469
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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", "UserEntity" + i);
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..00b12fb44
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+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.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("/Users/cenkailun/codelab/coding2017/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
new file mode 100644
index 000000000..5f41aaad7
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
@@ -0,0 +1,60 @@
+package com.coderising.refactor_odd;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.refactor_odd.entity.EmailEntity;
+import com.coderising.refactor_odd.entity.ProductEntity;
+import com.coderising.refactor_odd.entity.UserEntity;
+import com.coderising.refactor_odd.handler.EmailHandler;
+import com.coderising.refactor_odd.handler.ProductHandler;
+import com.coderising.refactor_odd.handler.UserHandler;
+import org.apache.commons.collections4.CollectionUtils;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		// 初始化处理器
+		EmailHandler emailHandler = new EmailHandler();
+		ProductHandler productHandler = new ProductHandler();
+		UserHandler userHandler = new UserHandler();
+
+		// 构造数据
+		List<EmailEntity> emailEntities = new ArrayList<>();
+		List<ProductEntity> products = productHandler.fetchProducts();
+		for (ProductEntity product : products) {
+			List<UserEntity> users = userHandler.fetchUser(buildUserQuery(product.getProductId()));
+			for (UserEntity user : users) {
+				EmailEntity emailEntity = new EmailEntity();
+				emailEntity.setToAddress(user.getEmail());
+				emailEntity.setSubject("您关注的产品降价了");
+				emailEntity.setMessage("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductName() + " 降价了，欢迎购买!");
+				emailEntities.add(emailEntity);
+			}
+		}
+		// 发送邮件
+		sendEMails(false, emailEntities, emailHandler);
+
+	}
+
+	private static String buildUserQuery(String productID) throws Exception {
+
+		return "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+	}
+
+	private static void sendEMails(boolean debug, List<EmailEntity> emailEntities, EmailHandler emailHandler)
+			throws IOException {
+
+		System.out.println("开始发送邮件");
+		if (CollectionUtils.isNotEmpty(emailEntities)) {
+			for (EmailEntity emailEntity : emailEntities) {
+				System.out.println("发送邮件:");
+				emailHandler.sendMail(emailEntity, debug);
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java
new file mode 100644
index 000000000..4f4e9b560
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java
@@ -0,0 +1,12 @@
+package com.coderising.refactor_odd.constant;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:01
+ */
+public class Constant {
+
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java
new file mode 100644
index 000000000..1fb9278f4
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java
@@ -0,0 +1,46 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:43
+ */
+public class EmailEntity {
+
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    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() {
+        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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java
new file mode 100644
index 000000000..a92910a60
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java
@@ -0,0 +1,27 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:53
+ */
+public class ProductEntity {
+	private String ProductId;
+	private String ProductName;
+
+	public String getProductId() {
+		return ProductId;
+	}
+
+	public void setProductId(String productId) {
+		ProductId = productId;
+	}
+
+	public String getProductName() {
+		return ProductName;
+	}
+
+	public void setProductName(String productName) {
+		ProductName = productName;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java
new file mode 100644
index 000000000..b5d5f45d0
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java
@@ -0,0 +1,29 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:55
+ */
+public class UserEntity {
+
+	private String name;
+
+	private String 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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java
new file mode 100644
index 000000000..b55997038
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java
@@ -0,0 +1,51 @@
+package com.coderising.refactor_odd.handler;
+
+import com.coderising.refactor_odd.entity.EmailEntity;
+import org.apache.commons.lang3.StringUtils;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.ConfigurationKeys;
+import com.coderising.ood.srp.MailUtil;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/16
+ * @Time 下午5:40
+ */
+public class EmailHandler {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	private String fromAddress = null;
+
+	public EmailHandler() {
+		initEmailHandler();
+	}
+
+	private void initEmailHandler() {
+		Configuration configuration = new Configuration();
+		smtpHost = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public void sendMail(EmailEntity emailEntity, boolean debug) {
+		// TODO 校验
+		send(emailEntity.getToAddress(),
+				StringUtils.isEmpty(emailEntity.getFromAddress()) ? this.fromAddress : emailEntity.getFromAddress(),
+				emailEntity.getSubject(), emailEntity.getMessage(), debug);
+	}
+
+	private void send(String toAddress, String fromAddress, String subject, String message, boolean debug) {
+		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());
+			}
+		}
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
new file mode 100644
index 000000000..03a5b74e2
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
@@ -0,0 +1,49 @@
+package com.coderising.refactor_odd.handler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.refactor_odd.entity.ProductEntity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:13
+ */
+public class ProductHandler {
+
+	private List<ProductEntity> products = new ArrayList<>();
+
+	public ProductHandler() throws IOException {
+		File f = new File(this.getClass().getClassLoader().getResource("product_promotion.txt").getFile());
+		initProducts(f);
+	}
+
+	private List<ProductEntity> initProducts(File file) throws IOException {
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = null;
+			while ((temp = br.readLine()) != null) {
+				String[] data = temp.split(" ");
+				ProductEntity product = new ProductEntity();
+				product.setProductId(data[0]);
+				product.setProductName(data[1]);
+				products.add(product);
+			}
+			return products;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	public List<ProductEntity> fetchProducts() {
+		return products;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java
new file mode 100644
index 000000000..b26439c5e
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java
@@ -0,0 +1,29 @@
+package com.coderising.refactor_odd.handler;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp.DBUtil;
+import com.coderising.refactor_odd.constant.Constant;
+import com.coderising.refactor_odd.entity.UserEntity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:18
+ */
+public class UserHandler {
+
+	public List<UserEntity> fetchUser(String sql) {
+		List<HashMap> temp = DBUtil.query(sql);
+		List<UserEntity> result = new ArrayList<>();
+		for (HashMap hashMap : temp) {
+			UserEntity user = new UserEntity();
+			user.setEmail((String) hashMap.get(Constant.EMAIL_KEY));
+			user.setName((String) hashMap.get(Constant.NAME_KEY));
+			result.add(user);
+		}
+		return result;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/resources/product_promotion.txt b/students/406400373/ood_assignment/refactor_odd/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/resources/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/406400373/readme.md b/students/406400373/readme.md
new file mode 100644
index 000000000..0fc025be2
--- /dev/null
+++ b/students/406400373/readme.md
@@ -0,0 +1,2 @@
+406400373(上海-凯伦)
+第二季的代码仓库
diff --git a/students/429301805/ood-assignment/pom.xml b/students/429301805/ood-assignment/pom.xml
new file mode 100644
index 000000000..1be81576c
--- /dev/null
+++ b/students/429301805/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..927c7155c
--- /dev/null
+++ b/students/429301805/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<String,String> 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/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..33e1d29f7
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,13 @@
+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";
+	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..605d19631
--- /dev/null
+++ b/students/429301805/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", "user"+i+"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java
new file mode 100644
index 000000000..ccb5041ca
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+public class HostService {
+	
+	private static String smtpHost; 
+	
+	private static String altSmtpHost;
+	
+	public static void setSMTPHost(Configuration config) 
+	{
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	public static void setAltSMTPHost(Configuration config) 
+	{
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+
+
+	public static String getSmtpHost() {
+		return smtpHost;
+	}
+
+
+	public static String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+	
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..f437e0e65
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+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());
+		
+	}
+	
+	public static boolean configureEMail(HashMap userInfo,String toAddress) //throws IOException 
+	{
+		if (toAddress.length() > 0){ 
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	public static String setFromAddress(Configuration config) 
+	{
+			String fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+			return fromAddress;
+	}
+	
+	public static String setToAddress(HashMap userInfo){
+	     String toAddress = (String) userInfo.get(ConfigurationKeys.EMAIL_KEY);
+	     return toAddress;
+	}
+	
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..5881e903b
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String productID;
+	private String productDesc;
+	
+	public Product(String productID,String productDesc){
+		this.productID = productID;
+		this.productDesc = productDesc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+	
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..54e494a37
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,144 @@
+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; 
+		
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("C:\\Users\\CHS\\Desktop\\ood-assignment1\\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();
+		
+		initService(config);
+					
+		setLoadQuery();
+		
+		sendEMails(mailDebug, loadMailingList()); 
+
+		
+	}
+
+	protected void initService(Configuration config) {
+		HostService.setSMTPHost(config);
+		HostService.setAltSMTPHost(config);
+		smtpHost = HostService.getSmtpHost();
+		altSmtpHost = HostService.getAltSmtpHost();
+		fromAddress = MailUtil.setFromAddress(config);
+	}
+
+	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 setMessage(HashMap userInfo) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(ConfigurationKeys.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(" ");
+			
+			Product p = new Product(data[0], data[1]);
+			productID = p.getProductID();
+			productDesc = p.getProductDesc();
+			
+			System.out.println("产品ID = " + productID + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	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()) {
+				HashMap userInfo = (HashMap) iter.next();
+				toAddress = MailUtil.setToAddress(userInfo);
+				if(MailUtil.configureEMail(userInfo,toAddress))
+					setMessage(userInfo);
+				else
+					System.out.println("用户信息不正确！");
+				try 
+				{
+						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/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/429301805/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/429301805/src/gz/sychs/cn/test.java b/students/429301805/src/gz/sychs/cn/test.java
new file mode 100644
index 000000000..9fa342b44
--- /dev/null
+++ b/students/429301805/src/gz/sychs/cn/test.java
@@ -0,0 +1,10 @@
+package gz.sychs.cn;
+
+public class test {
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		System.out.println("This is a test");
+	}
+
+}
diff --git a/students/463256809/ood-assignment/pom.xml b/students/463256809/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/463256809/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/463256809/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<String,String> 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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/463256809/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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/463256809/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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..fad6f3219
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by wenwei on 2017/6/14.
+ */
+public class FileUtil {
+
+    private static Product product = new Product();
+
+    public static 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(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..73e822f36
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,138 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+
+	private static String sendMailQuery = null;
+	private static String smtpHost = null;
+	private static String altSmtpHost = null;
+	private static String fromAddress = null;
+	private static String toAddress = null;
+	private static String subject = null;
+	private static String message = null;
+
+
+	private static Configuration config = new Configuration();
+	private static Product product = new Product();
+
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	protected static void setLoadQuery() throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+	}
+
+
+	protected static void setSMTPHost()
+	{
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+
+	protected static void setAltSMTPHost()
+	{
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+	}
+
+
+	protected static void setFromAddress()
+	{
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	protected static void setMessage(HashMap userInfo) throws IOException
+	{
+
+		String name = (String) userInfo.get(NAME_KEY);
+
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+
+
+
+	}
+
+
+
+	protected static void configureEMail(HashMap userInfo) throws IOException
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+		if (toAddress.length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected static List loadMailingList() throws Exception {
+		return DBUtil.query(sendMailQuery);
+	}
+
+
+	public static void sendEMails(boolean debug, List mailingList) throws Exception
+	{
+
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+		setLoadQuery();
+
+		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("没有邮件发送");
+
+		}
+
+	}
+
+	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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..4420dfc60
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by wenwei on 2017/6/14.
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..e4241217a
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+
+//		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		File f = new File("/Users/wenwei/mygit/coding2017/students/463256809/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
+		FileUtil.readFile(file);
+
+		MailUtil.sendEMails(mailDebug, MailUtil.loadMailingList());
+	}
+
+
+}
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/463256809/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/465034663/README.md b/students/465034663/README.md
new file mode 100644
index 000000000..773f79ced
--- /dev/null
+++ b/students/465034663/README.md
@@ -0,0 +1 @@
+OOD面向对象
\ No newline at end of file
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java b/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java
new file mode 100644
index 000000000..cc492d23b
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class AltSMTPHost implements Host {
+
+    @Override
+    public String setHost() {
+        return this.configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java
new file mode 100644
index 000000000..ae74eda7b
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.mytest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java b/students/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java
new file mode 100644
index 000000000..ae9234e56
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.mytest;
+
+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/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java b/students/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java
new file mode 100644
index 000000000..cb8b8d492
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.mytest;
+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;
+	}
+
+	public static String loadQuery(String productID) throws Exception {
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+		return sendMailQuery;
+	}
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java
new file mode 100644
index 000000000..208fb59b2
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java
@@ -0,0 +1,64 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class Email {
+
+    String toAddress;
+    String fromAddress;
+    String subject;
+    String message;
+    String smtpHost;
+
+    public Email() {}
+
+    public Email(String toAddress, String fromAddress, String subject, String message, String smtpHost) {
+        this.toAddress = toAddress;
+        this.fromAddress = fromAddress;
+        this.subject = subject;
+        this.message = message;
+        this.smtpHost = smtpHost;
+    }
+
+    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;
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java
new file mode 100644
index 000000000..3c87232ab
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public interface Host {
+
+    Configuration configuration = new Configuration();
+
+    String setHost();
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java b/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java
new file mode 100644
index 000000000..2d44ca482
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.mytest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class IOUtils {
+
+    protected static String[] readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+
+        try {
+
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java b/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java
new file mode 100644
index 000000000..b29261e05
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.mytest;
+
+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/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java b/students/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java
new file mode 100644
index 000000000..19f8e6622
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java
@@ -0,0 +1,128 @@
+package com.coderising.ood.mytest;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+    protected String sendMailQuery;
+
+
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+
+    protected String productID;
+    protected String productDesc;
+
+    private Email email;
+
+    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:\\IdeaWorspace\\works\\coding2017\\students\\465034663\\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
+        IOUtils.readFile(file);
+
+
+        config = new Configuration();
+
+        /*setSMTPHost();
+        setAltSMTPHost();*/
+        this.smtpHost = new SMTPHost().setHost();
+        this.altSmtpHost = new AltSMTPHost().setHost();
+
+        setFromAddress();
+
+
+        //setLoadQuery();
+
+        DBUtil.loadQuery(this.productID);
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+    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 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());
+                setEmail();
+                try {
+                    if (toAddress.length() > 0)
+                        MailUtil.sendEmail(this.email, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(this.email, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+    private void setEmail(){
+        this.email = new Email(this.toAddress, this.fromAddress, this.subject, this.message, this.altSmtpHost);
+    }
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java b/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java
new file mode 100644
index 000000000..3d2ab58ac
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.mytest;
+
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class SMTPHost implements Host {
+
+    @Override
+    public String setHost() {
+        return this.configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/srp/Configuration.java b/students/465034663/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/465034663/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<String,String> 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/465034663/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/465034663/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/465034663/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/465034663/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..d29c2d3dc
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,181 @@
+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:\\IdeaWorspace\\works\\coding2017\\students\\465034663\\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/465034663/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/465034663/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/465034663/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/466199956/ood/ood-assignment/pom.xml b/students/466199956/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..af199815a
--- /dev/null
+++ b/students/466199956/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<String,String> configurations = new HashMap<String, String>();
+	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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/466199956/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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/466199956/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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..5d59ae261
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class FileUtil {
+    public static String readFile (File file)  throws IOException{
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            return br.readLine();
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..cd2bb049d
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,124 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class Mail {
+
+    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 sendMailQuery = null;
+
+
+    protected static final String NAME_KEY = "NAME";
+    protected static final String EMAIL_KEY = "EMAIL";
+
+    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 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() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+
+
+    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(this, debug);
+                }
+                catch (Exception e)
+                {
+
+                    try {
+                        MailUtil.sendEmail(this, debug);
+
+                    } catch (Exception e2)
+                    {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        }
+
+        else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException
+    {
+    }
+
+    protected List loadMailingList() throws Exception {
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..c2d46495a
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail, boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..6587491c3
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+
+
+    public void setProductID(String productID)
+    {
+        this.productID = productID;
+
+    }
+
+    public String getproductID()
+    {
+        return productID;
+    }
+
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..1d054470e
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,85 @@
+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 extends Mail {
+    protected Product product;
+    private static Configuration config;
+
+    public static void main(String[] args) throws Exception {
+        File f = new File("E:\\LandWolf\\coding2017\\students\\466199956\\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 {
+        product = new Product();
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        readFile(file);
+        config = new Configuration();
+
+        setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+
+
+        setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+        setLoadQuery();
+
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+
+    protected void setLoadQuery() throws Exception {
+
+        sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getproductID() + "' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+    }
+
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+
+        String name = (String) userInfo.get(NAME_KEY);
+
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+
+    }
+
+
+    protected void readFile(File file) throws IOException // @02C
+    {
+        String temp = FileUtil.readFile(file);
+        String[] data = temp.split(" ");
+
+        product.setProductID(data[0]);
+        product.setProductDesc(data[1]);
+
+        System.out.println("产品ID = " + product.getproductID() + "\n");
+        System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+    }
+
+
+    @Override
+    protected void configureEMail(HashMap userInfo) throws IOException {
+
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0)
+            this.setMessage(userInfo);
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/466199956/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
diff --git a/students/466199956/readme.md b/students/466199956/readme.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/students/469880403/ood-assignment/pom.xml b/students/469880403/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/469880403/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..a6791a7cf
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,104 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.dao.SubscriptionDao;
+import com.coderising.ood.srp.entity.MailSetting;
+import com.coderising.ood.srp.entity.ProductInfo;
+import com.coderising.ood.srp.properties.Configuration;
+import com.coderising.ood.srp.properties.ConfigurationKeys;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+public class PromotionMail {
+
+	private boolean mailDebug;
+
+
+	private static SubscriptionDao subscriptionDao = new SubscriptionDao();
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	public static void main(String[] args) throws Exception {
+		// 1 读取配置文件，加载产品信息
+		File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		boolean emailDebug = false;
+		ProductInfo productInfo = new ProductInfo();
+		FileUtil.readFileAndSetProductInfo(file, productInfo);
+
+		// 2 设置邮箱服务信息
+		Configuration config = new Configuration();
+		MailSetting mailSetting = new MailSetting();
+		loadMailSetting(config, mailSetting);
+
+		// 3 查询意向用户信息
+		subscriptionDao.setLoadQuery(productInfo.getProductID());
+		List sendMailList = subscriptionDao.loadMailingList();
+
+		// 4 发送邮件
+		PromotionMail pe = new PromotionMail(emailDebug);
+		pe.sendEMails(mailSetting, sendMailList, productInfo);
+
+	}
+
+	public PromotionMail( boolean mailDebug) throws Exception {
+
+		this.mailDebug = mailDebug;
+	}
+
+	private static void loadMailSetting(Configuration config, MailSetting mailSetting) {
+
+		mailSetting.setAltSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mailSetting.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mailSetting.setFromAddress(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+	}
+
+
+
+	protected void sendEMails(MailSetting mailSetting, List mailingList, ProductInfo productInfo) throws IOException {
+
+		System.out.println("开始发送邮件");
+		String subject = "您关注的产品降价了";
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Map userInfo = (HashMap) iter.next();
+				String userName = (String) userInfo.get(NAME_KEY);
+				String toAddress = (String) userInfo.get(EMAIL_KEY);
+				String productDesc = productInfo.getProductDesc();
+				String message = "尊敬的 " + userName + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+
+				try {
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(toAddress, mailSetting.getFromAddress(), subject, message,
+								mailSetting.getSmtpHost(), this.mailDebug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(toAddress, mailSetting.getFromAddress(), subject, message,
+								mailSetting.getAltSmtpHost(), this.mailDebug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+
+
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java
new file mode 100644
index 000000000..f5360f037
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+public class SubscriptionDao {
+	
+	protected static String sendMailQuery = null;
+	public  List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+	public  void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+	
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java
new file mode 100644
index 000000000..c3db877aa
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp.entity;
+
+public class MailSetting {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	
+	
+	public String getToAddress() {
+		return toAddress;
+	}
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+	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 fromAddress;
+	}
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+	
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java
new file mode 100644
index 000000000..0a6a569f2
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.entity;
+
+public class ProductInfo {
+	private  String productID = null;
+	private  String productDesc = null;
+	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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java
new file mode 100644
index 000000000..73aaa9166
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.properties;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String, String>();
+	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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java
new file mode 100644
index 000000000..8b09c9912
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.properties;
+
+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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/product_promotion.txt b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..a23198fce
--- /dev/null
+++ b/students/469880403/ood-assignment/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.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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 000000000..a0bb0f3a8
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.entity.ProductInfo;
+
+public class FileUtil {
+	
+	public static void readFileAndSetProductInfo(File file,ProductInfo productInfo) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			productInfo.setProductID( data[0]);
+			productInfo.setProductDesc( 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();
+		}
+	}
+
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..bb028c690
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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/469880403/readme.md b/students/469880403/readme.md
new file mode 100644
index 000000000..8fc153b34
--- /dev/null
+++ b/students/469880403/readme.md
@@ -0,0 +1 @@
+说明文件
\ No newline at end of file
diff --git a/students/472779948/helloworld.txt b/students/472779948/helloworld.txt
new file mode 100644
index 000000000..fe51499bb
--- /dev/null
+++ b/students/472779948/helloworld.txt
@@ -0,0 +1 @@
+helloworld!
\ No newline at end of file
diff --git a/students/472779948/ood-assignment/pom.xml b/students/472779948/ood-assignment/pom.xml
new file mode 100644
index 000000000..06d60721b
--- /dev/null
+++ b/students/472779948/ood-assignment/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+      <maven.compiler.source>1.8</maven.compiler.source>
+      <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/472779948/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<String,String> 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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/472779948/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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..930ab2805
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+	protected String sendMailQuery = null;
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param productID
+	 * @return
+	 */
+	public static List query(String productID){
+		
+		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;
+	}
+
+	protected void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+	}
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java
new file mode 100644
index 000000000..a280c09d6
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileManager {
+    //读取配置文件方法，单独提出来，其他的类需要时可复用
+    public static String[] readFile(File file) throws IOException // @02C
+    {
+        String data[] = null;
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return data;
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..42da2ec0b
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,83 @@
+package com.coderising.ood.srp;
+
+public class Mail {
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+    private String toAddress = null;
+    private String subject = null;
+    private String message = null;
+
+
+    public Mail() {
+    }
+
+    public Mail(String smtpHost, String altSmtpHost, String fromAddress, String toAddress, String subject, String message) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    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 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() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public String toString() {
+        return "Mail{" +
+                "smtpHost='" + smtpHost + '\'' +
+                ", altSmtpHost='" + altSmtpHost + '\'' +
+                ", fromAddress='" + fromAddress + '\'' +
+                ", toAddress='" + toAddress + '\'' +
+                ", subject='" + subject + '\'' +
+                ", message='" + message + '\'' +
+                '}';
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..ff00545c9
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail, boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+
+	}
+
+	public static List loadMailingList(String productID) throws Exception {
+		return DBUtil.query(productID);
+	}
+
+	
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..e4074ba44
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by lenovo on 2017/6/13.
+ */
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public Product(String productID, String productDesc) {
+        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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..f7e083ec4
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,85 @@
+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 Mail mail = null;
+    protected Product product = 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("E:\\workspace\\private\\projects\\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 {
+        config = new Configuration();
+
+        //构造Mail对象
+        mail = new Mail();
+        mail.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        mail.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+        mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] data = FileManager.readFile(file);
+        product = new Product(data[0],data[1]);
+
+        sendEMails(mailDebug, MailUtil.loadMailingList(product.getproductID()));//MailUtil
+    }
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        mail.setSubject("您关注的产品降价了");
+        mail.setMessage("尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+        if (mail.getToAddress().length() > 0)
+            setMessage(userInfo);
+    }
+
+    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 (mail.getToAddress().length() > 0)
+                        MailUtil.sendEmail(mail, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(mail, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/472779948/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/494800949/pom.xml b/students/494800949/pom.xml
new file mode 100644
index 000000000..521e154bc
--- /dev/null
+++ b/students/494800949/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>season2</groupId>
+    <artifactId>season2</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/494800949/src/main/java/ood/assignment/srp/Configuration.java b/students/494800949/src/main/java/ood/assignment/srp/Configuration.java
new file mode 100644
index 000000000..858e86069
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/Configuration.java
@@ -0,0 +1,24 @@
+package ood.assignment.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java b/students/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..c41514a2f
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/DBUtil.java b/students/494800949/src/main/java/ood/assignment/srp/DBUtil.java
new file mode 100644
index 000000000..26ba6bb52
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/MailUtil.java b/students/494800949/src/main/java/ood/assignment/srp/MailUtil.java
new file mode 100644
index 000000000..03aca56c1
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/MailUtil.java
@@ -0,0 +1,19 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/PromotionMail.java b/students/494800949/src/main/java/ood/assignment/srp/PromotionMail.java
new file mode 100644
index 000000000..326f56a3d
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+package ood.assignment.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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("I:\\sourceCode\\coding2017_2\\students\\494800949\\src\\main\\java\\ood\\assignment\\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/494800949/src/main/java/ood/assignment/srp/product_promotion.txt b/students/494800949/src/main/java/ood/assignment/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/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/494800949/src/main/java/ood/work/srp/Configuration.java b/students/494800949/src/main/java/ood/work/srp/Configuration.java
new file mode 100644
index 000000000..878ae499c
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Configuration.java
@@ -0,0 +1,24 @@
+package ood.work.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java b/students/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..6127d61f8
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.work.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/494800949/src/main/java/ood/work/srp/DBUtil.java b/students/494800949/src/main/java/ood/work/srp/DBUtil.java
new file mode 100644
index 000000000..48f108e05
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package ood.work.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setName("User" + i);
+			userInfo.setEmail("aa"+ i +"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Email.java b/students/494800949/src/main/java/ood/work/srp/Email.java
new file mode 100644
index 000000000..2d3c4a499
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Email.java
@@ -0,0 +1,41 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class Email {
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email(String toAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Emails.java b/students/494800949/src/main/java/ood/work/srp/Emails.java
new file mode 100644
index 000000000..768e513c8
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Emails.java
@@ -0,0 +1,38 @@
+package ood.work.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class Emails {
+
+    public static Email newEmail(User user, Product product) {
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        return new Email(user.getEmail(), subject, message);
+    }
+
+    public static List<Email> createEmails(String path) throws IOException {
+        List<Product> products = ProductInfoLoader.readFile(path);
+        List<Email> mails = new ArrayList<>();
+        for (Product product : products) {
+            String sql = getSql(product.getProductId());
+            List<User> users = DBUtil.query(sql);
+            for (User user : users) {
+                Email mail = Emails.newEmail(user, product);
+                mails.add(mail);
+            }
+        }
+        return mails;
+    }
+
+    private static String getSql(String productId) {
+        System.out.println("loadQuery set");
+        return "Select name from subscriptions "
+                + "where product_id= '" + productId +"' "
+                + "and send_mail=1 ";
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/MailUtil.java b/students/494800949/src/main/java/ood/work/srp/MailUtil.java
new file mode 100644
index 000000000..43ab9a433
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/MailUtil.java
@@ -0,0 +1,24 @@
+package ood.work.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());
+		
+	}
+
+	public static void sendEmail(Email mailInfo, String fromAddress, String smtphost, boolean debug) {
+		String toAddress = mailInfo.getToAddress();
+		String subject = mailInfo.getSubject();
+		String message = mailInfo.getMessage();
+		sendEmail(toAddress, fromAddress, subject, message, smtphost, debug);
+	}
+
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Product.java b/students/494800949/src/main/java/ood/work/srp/Product.java
new file mode 100644
index 000000000..b3b440001
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Product.java
@@ -0,0 +1,26 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ * 商品类
+ */
+public class Product {
+    private String productId;
+    private String 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/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java b/students/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java
new file mode 100644
index 000000000..8a484e952
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java
@@ -0,0 +1,35 @@
+package ood.work.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class ProductInfoLoader {
+
+    public static List<Product> readFile(String path) throws IOException // @02C
+    {
+        File file = new File(path);
+        List<Product> products = new ArrayList<>();
+        try(BufferedReader br = new BufferedReader(new FileReader(file))) {
+            String line;
+            while ((line = br.readLine()) != null) {
+                String[] data = line.split(" ");
+                Product product = new Product();
+                product.setProductId(data[0]);
+                product.setProductDesc(data[1]);
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        }
+        return products;
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/PromotionMail.java b/students/494800949/src/main/java/ood/work/srp/PromotionMail.java
new file mode 100644
index 000000000..fb9e5e077
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package ood.work.srp;
+
+import java.io.IOException;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class PromotionMail {
+
+    private String path;
+
+    public PromotionMail(String path) {
+        this.path = path;
+    }
+
+    public void execute() throws IOException {
+        SMTPClient client = new SMTPClient();
+        client.sendEmails(false, Emails.createEmails(path));
+    }
+
+
+
+    public static void main(String[] args) {
+        String path = "I:\\sourceCode\\coding2017_2\\students\\494800949\\src\\main\\java\\ood\\assignment\\srp\\product_promotion.txt";
+        PromotionMail mail = new PromotionMail(path);
+        try {
+            mail.execute();
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/SMTPClient.java b/students/494800949/src/main/java/ood/work/srp/SMTPClient.java
new file mode 100644
index 000000000..dda491e02
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/SMTPClient.java
@@ -0,0 +1,71 @@
+package ood.work.srp;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ *
+ */
+public class SMTPClient {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String emailAdmin;
+
+    public void config() {
+        Configuration configuration = new Configuration();
+        this.smtpHost = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+        this.altSmtpHost = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        this.emailAdmin = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public SMTPClient() {
+        config();
+    }
+
+    /**
+     * 发送一封邮件
+     * @param debug
+     * @param mailInfo
+     */
+    public void sendEmail(boolean debug, Email mailInfo) {
+        try
+        {
+            if (mailInfo.getToAddress().length() > 0)
+                MailUtil.sendEmail(mailInfo, emailAdmin, smtpHost, debug);
+        }
+        catch (Exception e)
+        {
+
+            try {
+                MailUtil.sendEmail(mailInfo, emailAdmin, altSmtpHost, debug);
+
+            } catch (Exception e2)
+            {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+
+
+    /**
+     * 发送多封邮件
+     */
+
+    public void sendEmails(boolean debug, List<Email> mailingList){
+        if (mailingList != null) {
+            Iterator<Email> iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                sendEmail(debug, iter.next());
+            }
+        }
+        else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+
+
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/User.java b/students/494800949/src/main/java/ood/work/srp/User.java
new file mode 100644
index 000000000..091f59419
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/User.java
@@ -0,0 +1,25 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class User {
+    private String name;
+    private String 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/501917623/src/work/Test/Test.java b/students/501917623/src/work/Test/Test.java
new file mode 100644
index 000000000..3da24e1f2
--- /dev/null
+++ b/students/501917623/src/work/Test/Test.java
@@ -0,0 +1,10 @@
+package work.Test;
+
+public class Test {
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		System.out.println("hello world");
+	}
+
+}
diff --git a/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java b/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..efd3c5882
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package main.java.com.coderising.ood.srp;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}
+ 
\ No newline at end of file
diff --git a/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..b927dbac2
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..3f7760a6e
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,28 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..f422fd908
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,19 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..6796f3585
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,202 @@
+package main.java.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("E:/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 {
+			System.out.println("进入");
+			br = new BufferedReader(new FileReader(file));
+			System.out.println("br");
+			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/505217361/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/505217361/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/505217361/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/505217361/src/test/java/org/coderising/liteaop/Configuration.java b/students/505217361/src/test/java/org/coderising/liteaop/Configuration.java
new file mode 100644
index 000000000..06dde1014
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Configuration.java
@@ -0,0 +1,55 @@
+package test.java.org.coderising.liteaop;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Configuration {
+
+	
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	static Map<String,String> 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);
+	}
+	
+	protected String setSMTPHost() 
+	{
+		smtpHost =  getProperty(ConfigurationKeys.SMTP_SERVER); 
+		return smtpHost;
+	}
+
+	
+	protected String setAltSMTPHost() 
+	{
+		altSmtpHost = getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+		return altSmtpHost;
+	}
+
+	
+	protected String setFromAddress() 
+	{
+			fromAddress = getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+			return fromAddress;
+	}
+
+
+
+}
+ 
\ No newline at end of file
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java b/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java
new file mode 100644
index 000000000..8471dcf4a
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java
@@ -0,0 +1,12 @@
+package test.java.org.coderising.liteaop;
+
+
+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/505217361/src/test/java/org/coderising/liteaop/DBUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/DBUtil.java
new file mode 100644
index 000000000..23ec85320
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/DBUtil.java
@@ -0,0 +1,29 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	/* 
+	 * 数据库交互类
+	 * */
+	
+	// 假设这个是获取人员的数据库交互
+	public List executeQuery(String sql){
+		System.out.println("execute sql ");
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			
+			User user = new User();
+			user.setUsername("User"+i);
+			user.setEmailadd("aa@bb.com");
+			userList.add(user);
+			
+		}
+
+		return userList;
+		
+	}
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java
new file mode 100644
index 000000000..0e1d84fa6
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java
@@ -0,0 +1,96 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+
+
+public class EmailUtil {
+	
+	private static final String EMAIL_KEY = "EMAIL";
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	protected String subject  = null;
+	protected String message  = null;
+	
+	
+	
+	public void sendEmail(List users,Production product){
+		boolean debugs = false;
+		// 获取配置信息
+		Configuration config = new Configuration(); 	
+		smtpHost = config.setSMTPHost();
+		altSmtpHost = config.setAltSMTPHost();
+		fromAddress = config.setFromAddress();
+		System.out.println("开始发送邮件");
+		if(users != null){
+			Iterator iter = users.iterator();
+			while(iter.hasNext()){
+				User user = (User) iter.next();
+				String userEmail = user.getEmailadd();
+				String userName = user.getUsername();
+				
+				// 获取输入值
+				setMessage(userName,product);
+				
+				try{
+					if(userEmail.length()>0){
+						Mail mail = new Mail();
+						mail.setFromAddress(fromAddress);
+						mail.setUserEmail(userEmail);
+						mail.setSmtpHost(altSmtpHost);
+						mail.setSubject(subject);
+						mail.setMessage(message);
+						
+						mail.sendEmail(debugs);
+						
+					}
+				}catch(Exception e ){
+					try{
+						
+							Mail mail = new Mail();
+							mail.setFromAddress(fromAddress);
+							mail.setUserEmail(userEmail);
+							mail.setSmtpHost(altSmtpHost);
+							mail.setSubject(subject);
+							mail.setMessage(message);
+							
+							System.out.println("使用备用服务器地址发送邮件!");
+							mail.sendEmail(debugs);
+							
+						
+					}catch(Exception e2){
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+				
+				
+			}
+		}else {
+			System.out.println("没有邮件发送");
+			
+		}
+		
+		
+	}
+
+	
+
+	protected void setMessage(String username,Production product) 
+	{
+	
+		String name = username;		
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+		
+	}
+
+
+
+
+
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/Mail.java b/students/505217361/src/test/java/org/coderising/liteaop/Mail.java
new file mode 100644
index 000000000..ddb5fa8bc
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Mail.java
@@ -0,0 +1,80 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+
+public class Mail {
+	String fromAddress;
+	String userEmail;
+	String smtpHost;
+	String subject;
+	String message;
+	
+	
+	public String getFromAddress() {
+		return fromAddress;
+	}
+
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+
+	public String getUserEmail() {
+		return userEmail;
+	}
+
+
+	public void setUserEmail(String userEmail) {
+		this.userEmail = userEmail;
+	}
+
+
+	public String getSmtpHost() {
+		return smtpHost;
+	}
+
+
+	public void setSmtpHost(String smtpHost) {
+		this.smtpHost = smtpHost;
+	}
+
+
+	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  void sendEmail(boolean debug) {
+		
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(fromAddress).append("\n");
+		buffer.append("To:").append(userEmail).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/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java
new file mode 100644
index 000000000..40434158f
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java
@@ -0,0 +1,33 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.File;
+
+public class ProductUtil {
+	/* 
+	获取促销产品
+	*/
+	
+	// 存放产品信息文本
+	
+	Production product ;
+	
+	public Production getPromotionalProduct(){
+		
+	//	filepath 产品信息路径
+		String filepath = "E:/product_promotion.txt";
+		
+		try{
+			fileUtil fu = new fileUtil();
+			
+			product  = fu.readFile(filepath);
+						
+		}catch(Exception e){
+			
+			e.printStackTrace();
+		}
+		
+		return product;
+		
+	}
+
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/Production.java b/students/505217361/src/test/java/org/coderising/liteaop/Production.java
new file mode 100644
index 000000000..c148a98fa
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Production.java
@@ -0,0 +1,20 @@
+package test.java.org.coderising.liteaop;
+
+public class Production {
+	String productID;
+	String ProductDesc;
+	public String getProductID() {
+		return productID;
+	}
+	public void setProductID(String productID) {
+		this.productID = productID;
+	}
+	public String getProductDesc() {
+		return ProductDesc;
+	}
+	public void setProductDesc(String productDesc) {
+		ProductDesc = productDesc;
+	}
+
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/User.java b/students/505217361/src/test/java/org/coderising/liteaop/User.java
new file mode 100644
index 000000000..683733054
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/User.java
@@ -0,0 +1,21 @@
+package test.java.org.coderising.liteaop;
+
+public class User {
+	public String username ;
+	public String emailadd;
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public String getEmailadd() {
+		return emailadd;
+	}
+	public void setEmailadd(String emailadd) {
+		this.emailadd = emailadd;
+	}
+	
+	
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java
new file mode 100644
index 000000000..66e4f63e2
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java
@@ -0,0 +1,24 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class UserUtil {
+	
+	// 获取有关注相关产品信息的用户
+	public List getSubscriptionUser(String productID){
+		String sql = "Select name from subscriptions "
+			+ "where product_id= '" + productID +"' "
+			+ "and send_mail=1 ";
+		
+		DBUtil dbu = new DBUtil();
+		List users = dbu.executeQuery(sql);
+		
+		System.out.println("loadQuery set");
+		return users;
+		
+	}
+	
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java
new file mode 100644
index 000000000..2bc83a021
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java
@@ -0,0 +1,39 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class fileUtil {
+	
+	Production product;
+	
+	public Production  readFile (String filepath) throws IOException // @02C
+	{
+		File file_product = new File("E:/product_promotion.txt");
+		
+		BufferedReader br = null;
+		try {
+			
+			br = new BufferedReader(new FileReader(file_product));
+			
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product = new Production();
+			product.setProductID(data[0]); 
+			product.setProductDesc(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 product;
+		
+	}
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java b/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java
new file mode 100644
index 000000000..87e143863
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java
@@ -0,0 +1,26 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.List;
+
+public class promotionMail {
+	
+		public static void main(String[] args) {
+			// 促销邮件
+			
+			// 促销产品 
+			ProductUtil pp = new ProductUtil();
+			Production product = pp.getPromotionalProduct();
+			
+			// 获得订阅人员		
+			UserUtil uu = new UserUtil();
+			List userlist = uu.getSubscriptionUser(product.getProductID());
+			
+			// 发送邮件
+			EmailUtil eu = new EmailUtil();
+			eu.sendEmail(userlist,product);
+				
+		}	
+		
+		
+	
+}
diff --git a/students/506359831/src/com/coderising/ood/srp/Configuration.java b/students/506359831/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/506359831/src/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<String,String> 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/506359831/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/506359831/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/DBUtil.java b/students/506359831/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/MailUtil.java b/students/506359831/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/PromotionMail.java b/students/506359831/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/product_promotion.txt b/students/506359831/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/506359831/src/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/511134962/ood-assignment/pom.xml b/students/511134962/ood-assignment/pom.xml
new file mode 100644
index 000000000..542d8e08e
--- /dev/null
+++ b/students/511134962/ood-assignment/pom.xml
@@ -0,0 +1,40 @@
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~ Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                      ~
+  ~ Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                       ~
+  ~ Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                  ~
+  ~ Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                    ~
+  ~ Vestibulum commodo. Ut rhoncus gravida arcu.                                                                      ~
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..aae91db28
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,147 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.common.ConfigurationKeys;
+import com.coderising.ood.srp.dao.ProductPromotionDAO;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.vo.ProductInfo;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail
+{
+    private static final String              NAME_KEY            = "NAME";
+    private static final String              EMAIL_KEY           = "EMAIL";
+    private              ProductPromotionDAO productPromotionDAO = new ProductPromotionDAO();
+    private              Configuration       config              = new Configuration();
+    private              ProductInfo         productInfo         = new ProductInfo();
+    private              FileUtil            fileUtil            = new FileUtil();
+    private              boolean             emailDebug          = false;
+    private              String              smtpHost            = null;
+    private              String              altSmtpHost         = null;
+    private              String              fromAddress         = null;
+    private              String              toAddress           = null;
+    private              String              subject             = null;
+    private              String              message             = null;
+    private              List< HashMap >     mailingList         = null;
+
+
+    public PromotionMail( File file, boolean mailDebug ) throws Exception
+    {
+        this.emailDebug = mailDebug;
+        readProductInfos( file );
+        configuringEMAILSetting();
+        mailingList = queryMailingList();
+    }
+
+    private void readProductInfos( File file ) throws IOException
+    {//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] productInfos = fileUtil.readFile( file );
+        productInfo.setProductID( productInfos[ 0 ] );
+        productInfo.setProductDesc( productInfos[ 1 ] );
+        System.out.println( "产品ID = " + productInfo.getProductID() + "\n" );
+        System.out.println( "产品描述 = " + productInfo.getProductDesc() + "\n" );
+    }
+
+    private void configuringEMAILSetting()
+    {
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+    }
+
+    private List< HashMap > queryMailingList() throws Exception
+    {
+        productPromotionDAO.setLoadQuery( productInfo.getProductID() );
+        return productPromotionDAO.loadMailingList();
+    }
+
+    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 );
+    }
+
+    public static void main( String[] args ) throws Exception
+    {
+        File productPromotionFile = new File( "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\resources\\product_promotion.txt" );
+        boolean       emailDebug = false;
+        PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
+        pe.sendEMails();
+    }
+
+    protected void sendEMails() 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, emailDebug );
+                    }
+                }
+                catch ( Exception e )
+                {
+                    try
+                    {
+                        MailUtil.sendEmail( toAddress, fromAddress, subject, message, altSmtpHost, emailDebug );
+                    }
+                    catch ( Exception e2 )
+                    {
+                        System.out.println( "通过备用 SMTP服务器发送邮件失败: " + e2.getMessage() );
+                    }
+                }
+            }
+        }
+        else
+        {
+            System.out.println( "没有邮件发送" );
+        }
+
+    }
+
+    protected void configureEMail( HashMap userInfo ) throws IOException
+    {
+        toAddress = ( String ) userInfo.get( EMAIL_KEY );
+        if ( toAddress.length() > 0 )
+        {
+            setMessage( userInfo );
+        }
+    }
+
+    protected void setMessage( HashMap userInfo ) throws IOException
+    {
+        String name = ( String ) userInfo.get( NAME_KEY );
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!";
+    }
+
+}
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java
new file mode 100644
index 000000000..331f204e5
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java
@@ -0,0 +1,36 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration
+{
+    static Map< String, String > 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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java
new file mode 100644
index 000000000..fa6b1ec04
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java
@@ -0,0 +1,15 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.common;
+
+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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java
new file mode 100644
index 000000000..62b8c0571
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java
@@ -0,0 +1,33 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class ProductPromotionDAO
+{
+    private String sendMailQuery = null;
+
+    public ProductPromotionDAO() { }
+
+    public void setLoadQuery( String productID ) throws Exception
+    {
+        sendMailQuery
+                = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+        System.out.println( "loadQuery set" );
+    }
+
+    public List<HashMap > loadMailingList() throws Exception
+    {
+        return DBUtil.query( this.sendMailQuery );
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..832ba0408
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,37 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil
+{
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @param sql
+     *
+     * @return
+     */
+    public static List< HashMap > query( String sql )
+    {
+        List< HashMap > userList = new ArrayList();
+        for ( int i = 1; i <= 3; i++ )
+        {
+            HashMap< String, String > userInfo = new HashMap();
+            userInfo.put( "NAME", "User" + i );
+            userInfo.put( "EMAIL", "aa@bb.com" );
+            userList.add( userInfo );
+        }
+        return userList;
+    }
+}
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 000000000..963eb7200
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,43 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil
+{
+    public FileUtil() { }
+
+    public String[] readFile( File file ) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        try
+        {
+            br = new BufferedReader( new FileReader( file ) );
+            String   temp = br.readLine();
+            String[] data = temp.split( " " );
+            br.close();
+            return data;
+        }
+        catch ( IOException e )
+        {
+            throw new IOException( e.getMessage() );
+        }
+        finally
+        {
+            if ( null != br )
+            {
+                br.close();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..cac1a23f8
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,23 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.util;
+
+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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java
new file mode 100644
index 000000000..3bd52e942
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java
@@ -0,0 +1,72 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.vo;
+
+import java.util.Objects;
+
+public class ProductInfo
+{
+    private String productID = null;
+    private String productDesc = null;
+
+    public ProductInfo() { }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash( getProductID(), getProductDesc() );
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if ( this == o )
+        {
+            return true;
+        }
+        if ( !( o instanceof ProductInfo ) )
+        {
+            return false;
+        }
+        ProductInfo that = ( ProductInfo ) o;
+        return Objects.equals( getProductID(), that.getProductID() ) && Objects.equals( getProductDesc(),
+                                                                                        that.getProductDesc() );
+    }
+
+    public String getProductID()
+    {
+        return productID;
+    }
+
+    public String getProductDesc()
+    {
+
+        return productDesc;
+    }
+
+    public void setProductDesc( String productDesc )
+    {
+        this.productDesc = productDesc;
+    }
+
+    public void setProductID( String productID )
+    {
+        this.productID = productID;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder( "ProductInfo{" );
+        sb.append( "                productDesc='" ).append( productDesc ).append( '\'' );
+        sb.append( ",                 productID='" ).append( productID ).append( '\'' );
+        sb.append( '}' );
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/resources/product_promotion.txt b/students/511134962/ood-assignment/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/resources/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/511739113/6.11/ood-assignment/pom.xml b/students/511739113/6.11/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..bf4202102
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.service.MessageService;
+import com.coderising.ood.srp.service.UserService;
+import com.coderising.ood.srp.util.FileUtil;
+
+/**
+ * 模拟 商品促销通知系统
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:43:57
+*/
+public class PromotionMail {
+	
+	/** 模拟注入userService */
+	private UserService userService = new UserService();
+	
+	/** 模拟注入messageService */
+	private MessageService messageService = new MessageService();
+
+	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;
+		new PromotionMail(f, emailDebug);
+	}
+	
+	/**
+	 * 商品促销通知系统
+	 * <p>标题: </p>
+	 * <p>描述: </p>
+	 * @param file
+	 * @param mailDebug
+	 * @throws Exception
+	*/
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		Product product = FileUtil.readFile(file);
+		messageService.sendEMails(mailDebug, userService.queryUserInfo(product.getProductId()),product); 
+	}
+	
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java
new file mode 100644
index 000000000..01cd33b04
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * 推送的消息 实体
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午2:01:17
+*/
+public class Message extends ServerBean{
+	
+	/**  */
+	private static final long serialVersionUID = 3850050693864793038L;
+
+	/** 标题 */
+	private String subject;
+	
+	/** 消息 */
+	private String 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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 000000000..ed841c4f7
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.bean;
+
+import java.io.Serializable;
+
+/**
+ * 商品类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:29:56
+*/
+public class Product implements Serializable{
+	
+	/**  */
+	private static final long serialVersionUID = 2966621699675433678L;
+
+	/** 商品Id */
+	private String productId;
+	
+	/** 商品描述 */
+	private String 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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java
new file mode 100644
index 000000000..948f501f0
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java
@@ -0,0 +1,61 @@
+package com.coderising.ood.srp.bean;
+
+import java.io.Serializable;
+
+/**
+ * 服务配置
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午1:22:38
+*/
+public class ServerBean implements Serializable{
+	
+	/**  */
+	private static final long serialVersionUID = -1842399098772577584L;
+
+	/** 服务器地址 */
+	private String smtpHost;
+	
+	/** 备用服务器地址 */
+	private String altSmtpHost;
+	
+	/** 发送地址 */
+	private String fromAddress;
+	
+	/** 接受地址 */
+	private String toAddress;
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	public String getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..45cbf41c1
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.config;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 配置类，模拟从配置文件中读取参数
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:44:36
+*/
+public class Configuration {
+
+	private static Map<String,String> configurations = new HashMap<String,String>();
+	
+	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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..0e8c889f2
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp.config;
+
+/**
+ * 常量类 存放配置文件key
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:45:43
+*/
+public class ConfigurationKeys {
+
+	/** 服务器地址 */
+	public static final String SMTP_SERVER = "smtp.server";
+	
+	/** 备用服务器地址 */
+	public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+	
+	/** email地址 */
+	public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java
new file mode 100644
index 000000000..b0382b21a
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.jdbc;
+
+import java.util.List;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+/**
+ * 用户 jdbc
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:51:00
+*/
+public class UserJDBC {
+	
+	/**
+	 * 根据商品Id 获取用户信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param productId
+	 * @return
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:51:14
+	 */
+	public List selectUserId(String sql){
+		return DBUtil.query(sql);
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/511739113/6.11/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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java
new file mode 100644
index 000000000..61202c0a6
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java
@@ -0,0 +1,83 @@
+package com.coderising.ood.srp.service;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.bean.Message;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.util.MailUtil;
+
+/**
+ * 推送消息 
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午1:10:27
+*/
+public class MessageService {
+	
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	private static final String NAME_KEY = "NAME";
+	
+	private Configuration configuration = new Configuration();
+	
+	/**
+	 * 推送消息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param debug
+	 * @param mailingList
+	 * @param product
+	 * @throws IOException
+	 * @autho zx
+	 * @time 2017年6月13日 上午1:59:31
+	 */
+	public void sendEMails(boolean debug, List mailingList,Product product) throws IOException{
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Message message = configureEMail((HashMap) iter.next(),product.getProductDesc());  
+				try {
+					if (message!=null)
+						MailUtil.sendEmail(message, debug);
+				}catch (Exception e){
+					try {
+						MailUtil.sendEmail(message, debug); 
+					} catch (Exception e2){
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}else {
+			System.out.println("没有邮件发送");
+		}
+	}
+	
+	private Message configureEMail(HashMap userInfo,String productDesc) throws IOException{
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			return getMessage(userInfo,productDesc,toAddress); 
+		return null;
+	}
+	
+	private Message getMessage(HashMap userInfo,String productDesc,String toAddress) throws IOException{
+		String name = (String) userInfo.get(NAME_KEY);
+		Message messageBean = new Message();
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
+		messageBean.setMessage(message);
+		messageBean.setSubject(subject);
+		messageBean.setToAddress(toAddress);
+		messageBean.setAltSmtpHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		messageBean.setSmtpHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+		messageBean.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		return messageBean;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 000000000..99161f934
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.jdbc.UserJDBC;
+
+/**
+ * 用户 service
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:53:30
+*/
+public class UserService {
+	
+	/** 模拟注入userJDBC */
+	private UserJDBC userJDBC = new UserJDBC();
+	
+	/**
+	 * 获取用户信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param productId
+	 * @return
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:56:45
+	 */
+	public List queryUserInfo(String productId){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productId +"' "
+				+ "and send_mail=1 ";
+		return userJDBC.selectUserId(sendMailQuery);
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..e466fcb0d
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.util;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 模拟获取数据库
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:47:21
+*/
+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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 000000000..01eeef322
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.bean.Product;
+
+/**
+ * file工具类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午2:04:59
+*/
+public class FileUtil {
+	
+	/**
+	 * 读取商品信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:39:06
+	 */
+	public static Product readFile(File file) throws IOException{
+		BufferedReader br = null;
+		Product product = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			String productId = data[0];
+			String productDesc = data[1];
+			product.setProductId(productId);
+			product.setProductDesc(productDesc);
+			
+			System.out.println("产品ID = " + productId + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return product;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..a7ecb7f21
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.bean.Message;
+
+/**
+ * 消息推送工具类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zhangxu
+ * @time 2017年6月13日 上午2:03:46
+*/
+public class MailUtil {
+
+	public static void sendEmail(Message message,boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(message.getFromAddress()).append("\n");
+		buffer.append("To:").append(message.getToAddress()).append("\n");
+		buffer.append("Subject:").append(message.getSubject()).append("\n");
+		buffer.append("Content:").append(message.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+	}
+
+	
+}
diff --git a/students/513274874/ood/ood-assignment/pom.xml b/students/513274874/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..b4cacc195
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.constants.ConfigurationKeys;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	protected String smtpHost = null;
+	protected String altSmtpHost = null;
+	protected String fromAddress = null;
+
+	private static Configuration configuration = null;
+	static Map<String,String> configurations = new HashMap<String,String>();
+	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");
+	}
+
+
+	public static Configuration getInstance(){
+
+		if(configuration == null) {
+			return new Configuration();
+		}
+		return configuration;
+	}
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+	private Configuration() {
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+
+	protected void setSMTPHost()
+	{
+		smtpHost = getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+
+	protected void setAltSMTPHost()
+	{
+		altSmtpHost = getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+	}
+
+	protected void setFromAddress() {
+		fromAddress = getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public String getSmtpHost() {
+		return smtpHost;
+	}
+
+	public String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+
+	public String getFromAddress() {
+		return fromAddress;
+	}
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..3f7d7bbee
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,89 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.dto.Mail;
+import com.coderising.ood.srp.dto.Product;
+import com.coderising.ood.srp.dto.User;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+    protected Product product = new Product();
+
+    private static Configuration config;
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("/Users/guodongchow/Desktop/coding2017/projects/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 = Configuration.getInstance();
+
+        sendEMails(mailDebug, loadMailingList());
+    }
+
+    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(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID());
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+    protected Mail configureEMail(User user, Product product) throws IOException {
+        return new Mail(user, product);
+    }
+
+    protected List loadMailingList() throws Exception {
+        return DBUtil.query();
+    }
+
+
+    protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件"+ ":\n");
+
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                Mail mail = configureEMail((User) iter.next(), product);
+                if (mail.getToAddress().length() > 0)
+                    MailUtil.sendEmail(mail, config, debug);
+            }
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java
new file mode 100644
index 000000000..9932bf60f
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.constants;
+
+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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java
new file mode 100644
index 000000000..e160e3903
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.dto;
+
+import java.io.IOException;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class Mail {
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    protected void setMessage(User userInfo,Product product) throws IOException
+    {
+
+        String name = userInfo.getName();
+
+        subject = "您关注的产品降价了";
+        message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        
+    }
+
+    public Mail(User userInfo,Product product){
+        try {
+            setMessage(userInfo,product);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        toAddress = userInfo.getMailAddress();
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java
new file mode 100644
index 000000000..0684794a7
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.dto;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class Product {
+
+    String productID;
+    String productDesc;
+
+    public void setProductID(String productID)
+    {
+        this.productID = productID;
+
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java
new file mode 100644
index 000000000..89b98d226
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp.dto;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class User {
+    String name;
+    String mailAddress;
+
+    public User(String name, String mailAddress) {
+        this.name = name;
+        this.mailAddress = mailAddress;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMailAddress() {
+        return mailAddress;
+    }
+
+    public void setMailAddress(String mailAddress) {
+        this.mailAddress = mailAddress;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/513274874/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
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..d2848fe5b
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.dto.Product;
+import com.coderising.ood.srp.dto.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	protected String sendMailQuery = null;
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @return
+	 */
+	public static List query(){
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			HashMap userInfo = new HashMap();
+
+			userList.add(new User("User"+i,"aa@bb.com"));
+		}
+
+		return userList;
+	}
+
+	protected void setLoadQuery( Product product) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set"+ "\n");
+	}
+
+
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..5d6ec25bb
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.dto.Mail;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail,Configuration config,
+			boolean debug) {
+
+		StringBuilder buffer = new StringBuilder();
+		try {
+			//假装发了一封邮件
+			buffer.append("With SmtpHost:").append(config.getSmtpHost()).append("\n");
+
+		}catch (Exception e){
+			try {
+				//假装发了一封邮件
+				buffer.append("With AltSmtpHost:").append(config.getAltSmtpHost()).append(":\n");
+
+			} catch (Exception e2)
+			{
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+
+		buffer.append("From:").append(config.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/515868058/.gitignore b/students/515868058/.gitignore
new file mode 100644
index 000000000..d1651ea2f
--- /dev/null
+++ b/students/515868058/.gitignore
@@ -0,0 +1,16 @@
+/target/
+/bin/
+.classpath
+.project
+/.project
+.idea/libraries/Maven__junit_junit_4_12.xml
+.idea/libraries/Maven__org_apache_ant_ant_1_9_6.xml
+.idea/libraries/Maven__org_apache_ant_ant_launcher_1_9_6.xml
+.idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml
+.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
+.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_24.xml
+.idea/sonarlint/
+.idea/workspace.xml
+logfile.log
+logfile1.log
+/.idea/
diff --git a/students/515868058/ood-assignment/pom.xml b/students/515868058/ood-assignment/pom.xml
new file mode 100644
index 000000000..1a0471dcc
--- /dev/null
+++ b/students/515868058/ood-assignment/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/515868058/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<String,String> 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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/515868058/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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..fcaa1dd3e
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<UserInfo> query(String sql){
+		
+		List<UserInfo> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+
+			userList.add(new UserInfo("User" + i, "aa@bb.com"));
+		}
+
+		return userList;
+	}
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..32571d350
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by James on 6/15/2017.
+ */
+public class Mail {
+
+    private Configuration config;
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    public Mail(Configuration config) {
+        this.config =config;
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+
+    }
+
+    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);
+    }
+
+    public void sendEmail(String toAddress, String subject, String message, boolean debug) throws Exception {
+        MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+
+
+    }
+
+    public void sendAltEmail(String toAddress, String subject, String message, boolean debug) throws Exception{
+        MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+    }
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/515868058/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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..820f63cac
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,54 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by James on 6/16/2017.
+ */
+public class Product {
+
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public Product(String id, String desc) {
+        this.productID = id;
+        this.productDesc = desc;
+    }
+
+    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;
+    }
+
+    public static Product buildProduct(File file) throws IOException {
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            return new Product(data[0], data[1]);
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+
+    }
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..c61f0afdb
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,105 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+    private Product product;
+    private Mail mail = null;
+    private List<UserInfo> mailList;
+
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File(PromotionMail.class.getClassLoader().getResource("product_promotion.txt").getPath());
+
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(f, emailDebug);
+        pe.sendEMails(emailDebug);
+
+    }
+
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        mail = new Mail(new Configuration());
+        product = Product.buildProduct(file);
+
+    }
+
+
+    public void sendEMails(boolean debug) throws IOException {
+
+        System.out.println("开始发送邮件");
+        if (getMailList() != null) {
+            getMailList().forEach(
+                    userInfo -> {
+                        if (userInfo.getEmail().length() > 0) {
+                            try {
+                                mail.sendEmail(userInfo.getEmail(), getSubject(), getMessage(userInfo.getName(), getProduct().getProductDesc()), debug);
+                            } catch (Exception e) {
+                                try {
+                                    mail.sendAltEmail(userInfo.getEmail(), getSubject(), getMessage(userInfo.getName(), getProduct().getProductDesc()), debug);
+                                } catch (Exception e1) {
+                                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e1.getMessage());
+                                }
+                            }
+                        }
+                    }
+            );
+        } else {
+            System.out.println("没有邮件发送");
+        }
+
+
+    }
+
+    private String getSubject() {
+        return "您关注的产品降价了";
+    }
+
+    private String getMessage(String username, String productDesc) {
+        return "尊敬的 " + username + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+
+    }
+
+    public List<UserInfo> getMailList() {
+        if (mailList == null) {
+            try {
+                return loadMailingList(loadQuery(getProduct().getProductID()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return null;
+        } else {
+            return this.mailList;
+        }
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    private String loadQuery(String productID) throws Exception {
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+        return sendMailQuery;
+    }
+
+
+    private List<UserInfo> loadMailingList(String queryString) throws Exception {
+        return DBUtil.query(queryString);
+    }
+
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 000000000..8bbd72f03
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by James on 6/15/2017.
+ */
+public class UserInfo {
+
+    private String name;
+    private String email;
+
+    public UserInfo(String name, String email){
+        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/515868058/ood-assignment/src/main/resources/product_promotion.txt b/students/515868058/ood-assignment/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/resources/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/542194147/pom.xml b/students/542194147/pom.xml
new file mode 100644
index 000000000..dfd96c336
--- /dev/null
+++ b/students/542194147/pom.xml
@@ -0,0 +1,6 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.coding2017</groupId>
+  <artifactId>season2</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..8474097a7
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..7fe226d1b
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.config;
+
+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/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java
new file mode 100644
index 000000000..85b73ef7a
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.domain;
+
+import java.io.Serializable;
+/**
+ * 邮件实体类
+ * @author 小摩托
+ *
+ */
+public class Email implements Serializable {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	private String subject = null;
+	private String message = null;
+	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 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() {
+		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/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java
new file mode 100644
index 000000000..9976f9f09
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.domain;
+
+import java.io.Serializable;
+
+/**
+ * 产品实体类
+ * @author 小摩托
+ *
+ */
+public class Product implements Serializable {
+
+	private String productID = null;
+	private String productDesc = null;
+	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/542194147/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/542194147/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/542194147/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/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java b/students/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java
new file mode 100644
index 000000000..53aa4b77d
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java
@@ -0,0 +1,89 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.domain.Email;
+import com.coderising.ood.srp.domain.Product;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+/**
+ * 消息发布接口
+ * @author 小摩托
+ *
+ */
+public class NoticeService {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	private static Configuration config = new Configuration();; 
+	
+	public void sendEMails(File file, boolean mailDebug) throws IOException 
+	{
+
+		String[] data=FileUtil.readFile(file);
+		Product product=new Product();
+		product.setProductID(data[0]);
+		product.setProductDesc(data[1]);
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		List list=DBUtil.query(sendMailQuery);
+		System.out.println("开始发送邮件");
+		Email email=new Email();
+		if (list != null) {
+			Iterator iter = list.iterator();
+			while (iter.hasNext()) {
+				Map userInfo=(HashMap) iter.next();
+				String toAddress = (String)userInfo.get(EMAIL_KEY); 
+				email.setToAddress(toAddress);
+				email.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+				email.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+				email.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+				if (toAddress.length() > 0){
+					String name = (String)userInfo.get(NAME_KEY);
+					email.setSubject("您关注的产品降价了");
+					email.setMessage("尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");	
+				}
+				try 
+				{
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(email);
+				} 
+				catch (Exception e) 
+				{
+					try {
+						MailUtil.sendEmail(email); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("C:\\Users\\john\\Documents\\GitHub\\coding2017-2ndSeason\\students\\542194147\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
+		NoticeService ns = new NoticeService();
+		ns.sendEMails(f, emailDebug);
+
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..886477c67
--- /dev/null
+++ b/students/542194147/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.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"+i+"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 000000000..035ec8749
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+	public static String[] readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			return data;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..817ca9646
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.domain.Email;
+
+public class MailUtil {
+
+	public static void sendEmail(Email email) {
+		//假装发了一封邮件
+		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/549739951/src/main/java/srp/Main.java b/students/549739951/src/main/java/srp/Main.java
new file mode 100644
index 000000000..617f64e3e
--- /dev/null
+++ b/students/549739951/src/main/java/srp/Main.java
@@ -0,0 +1,58 @@
+package srp;
+
+import srp.model.Product;
+import srp.model.User;
+import srp.service.ProductService;
+import srp.service.PromotionService;
+import srp.service.UserService;
+import srp.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * @version V1.0
+ * @Title： Main
+ * @Package： srp
+ * @Description： 主程序
+ * @author： 南来
+ * @date： 2017-06-12 9:22
+ */
+public class Main {
+
+    /**
+     * //TODO 写的crud项目太多，作业越写越懵逼，最后我也不知道写成啥了，也不知道是否符合SRP原则。。。总之……欢迎老师和同学们批评指正！
+     */
+    public static void main(String[] args) throws InterruptedException {
+        //模拟业务场景
+        for (; ; ) {
+            start();
+            Thread.sleep(Long.parseLong(RandomUtils.randomNumber(3)));
+        }
+    }
+
+    private static void start() {
+        //region 模拟自动装配
+        UserService userService = new UserService();
+        ProductService productService = new ProductService();
+        PromotionService promotionService = new PromotionService();
+        //endregion
+
+        // 1 遍历商品 是否降价
+        List<Product> products = productService.getProduct();
+        if (null != products) {
+            for (Product product : products) {
+                // 2 商品降价
+                if (product.getDown()) {
+                    // 3 获取所有关注这个产品的用户
+                    List<User> watchProductUsers = userService.getWatchProductUsers(product.getId());
+                    if (null != watchProductUsers && watchProductUsers.size() > 0)
+                        // 4 发送促销邮件
+                        for (User user : watchProductUsers)
+                            promotionService.promotionMail(user.getName(), user.getEmail(), product.getDesc());
+                }
+            }
+        }
+
+        //TODO 以上代码有明显线程问题。。。大家无视就好。。。。。¯\_(ツ)_/¯
+    }
+}
diff --git a/students/549739951/src/main/java/srp/config/Config.java b/students/549739951/src/main/java/srp/config/Config.java
new file mode 100644
index 000000000..df81a9758
--- /dev/null
+++ b/students/549739951/src/main/java/srp/config/Config.java
@@ -0,0 +1,21 @@
+package srp.config;
+
+/**
+ * @version V1.0
+ * @Title： Config
+ * @Package： srp.config
+ * @Description： 配置对象 模拟读取配置文件 //todo 或者应该封装成对象？
+ * @author： 南来
+ * @date： 2017-06-12 9:21
+ */
+public class Config {
+    /**
+     * 主邮件服务器
+     */
+    public static final String smtpHost = "smtp.server";
+    /**
+     * 备用邮件服务器
+     */
+    public static final String altSmtpHost = "alt.smtp.server";
+
+}
diff --git a/students/549739951/src/main/java/srp/config/Constant.java b/students/549739951/src/main/java/srp/config/Constant.java
new file mode 100644
index 000000000..33983c7c0
--- /dev/null
+++ b/students/549739951/src/main/java/srp/config/Constant.java
@@ -0,0 +1,26 @@
+package srp.config;
+
+/**
+ * @version V1.0
+ * @Title： Constant
+ * @Package： srp.config
+ * @Description： 存放项目常量，避免写死代码，便于后期维护。
+ * @author： 南来
+ * @date： 2017-06-12 9:17
+ */
+public class Constant {
+    /**
+     * from address
+     */
+    public static final String EMAIL_ADMIN = "email.admin";
+
+    /**
+     * 促销邮件主题
+     */
+    public static final String SUBJECT = "您关注的产品降价了";
+
+    /**
+     * 促销邮件内容
+     */
+    public static final String MESSAGE = "尊敬的 %s, 您关注的产品 %s 降价了，欢迎购买!";
+}
diff --git a/students/549739951/src/main/java/srp/dao/DB.java b/students/549739951/src/main/java/srp/dao/DB.java
new file mode 100644
index 000000000..0b273333b
--- /dev/null
+++ b/students/549739951/src/main/java/srp/dao/DB.java
@@ -0,0 +1,86 @@
+package srp.dao;
+
+import srp.model.Product;
+import srp.model.User;
+import srp.util.RandomUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @version V1.0
+ * @Title： DB
+ * @Package： srp.dao
+ * @Description： 伪dao层 持续输出数据 没有细分每个对象单独dao层的部分
+ * @author： 南来
+ * @date： 2017-06-12 9:20
+ */
+public class DB {
+
+    /**
+     * 模拟在数据库中查询用户
+     *
+     * @return 所有用户
+     */
+    public List<User> getUsers() {
+        List<User> users = new ArrayList<>();
+        for (int i = 0; i < 10; i++) {
+            User user = new User();
+            user.setName(RandomUtils.randomName());
+            user.setEmail(RandomUtils.randomMail());
+            //region 模拟关注商品
+            try {
+                List<Product> products = getProducts();
+                if (null != products && products.size() > 0)
+                    user.setWatchProductId(RandomUtils.randomOne(products).getId());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            //endregion
+            users.add(user);
+        }
+        return users;
+    }
+
+    /**
+     * @param productId 商品id
+     * @return 所有关注该商品的用户集
+     */
+    public List<User> getWatchProductUsers(String productId) {
+        if (0 == productId.length()) return null;
+        List<User> users = getUsers();
+        List<User> temp = new ArrayList<>();
+        for (User user : users) {
+            if (null != user.getWatchProductId() && productId.equals(user.getWatchProductId()))
+                temp.add(user);
+        }
+        return temp;
+    }
+
+    /**
+     * 模拟在数据库中查询商品
+     *
+     * @return 所有商品
+     */
+    public List<Product> getProducts() throws IOException {
+        List<Product> products = new ArrayList<>();
+        try (BufferedReader br = new BufferedReader(new FileReader(new File("D:\\product_promotion.txt")))) {
+            String temp;
+            while (null != (temp = br.readLine())) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setId(data[0]);
+                product.setDesc(data[1]);
+                //region 模拟降价
+                product.setDown(RandomUtils.randomBoolean());
+                //endregion
+                products.add(product);
+            }
+        }
+        return products;
+    }
+}
diff --git a/students/549739951/src/main/java/srp/model/Email.java b/students/549739951/src/main/java/srp/model/Email.java
new file mode 100644
index 000000000..a316b6cd5
--- /dev/null
+++ b/students/549739951/src/main/java/srp/model/Email.java
@@ -0,0 +1,71 @@
+package srp.model;
+
+/**
+ * @version V1.0
+ * @Title： Email
+ * @Package： srp.model
+ * @Description： Email 对象
+ * @author： 南来
+ * @date： 2017-06-12 10:32
+ */
+public class Email {
+
+    /**
+     * from address
+     */
+    private String from;
+    /**
+     * to address
+     */
+    private String to;
+    /**
+     * 主题
+     */
+    private String subject;
+    /**
+     * 内容
+     */
+    private String content;
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public String getTo() {
+        return to;
+    }
+
+    public void setTo(String to) {
+        this.to = to;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "Email{" +
+                "from='" + from + '\'' +
+                ", to='" + to + '\'' +
+                ", subject='" + subject + '\'' +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/students/549739951/src/main/java/srp/model/Product.java b/students/549739951/src/main/java/srp/model/Product.java
new file mode 100644
index 000000000..6a6cfab5a
--- /dev/null
+++ b/students/549739951/src/main/java/srp/model/Product.java
@@ -0,0 +1,58 @@
+package srp.model;
+
+/**
+ * @version V1.0
+ * @Title： Product
+ * @Package： srp.model
+ * @Description： 商品对象
+ * @author： 南来
+ * @date： 2017-06-12 9:46
+ */
+public class Product {
+
+    /**
+     * 商品主键
+     */
+    private String Id;
+    /**
+     * 商品描述
+     */
+    private String Desc;
+    /**
+     * 是否降价
+     */
+    private boolean down;
+
+    public String getId() {
+        return Id;
+    }
+
+    public void setId(String id) {
+        Id = id;
+    }
+
+    public String getDesc() {
+        return Desc;
+    }
+
+    public void setDesc(String desc) {
+        Desc = desc;
+    }
+
+    public boolean getDown() {
+        return down;
+    }
+
+    public void setDown(boolean down) {
+        this.down = down;
+    }
+
+    @Override
+    public String toString() {
+        return "Product{" +
+                "Id='" + Id + '\'' +
+                ", Desc='" + Desc + '\'' +
+                ", down='" + down + '\'' +
+                '}';
+    }
+}
diff --git a/students/549739951/src/main/java/srp/model/User.java b/students/549739951/src/main/java/srp/model/User.java
new file mode 100644
index 000000000..f45c81897
--- /dev/null
+++ b/students/549739951/src/main/java/srp/model/User.java
@@ -0,0 +1,58 @@
+package srp.model;
+
+/**
+ * @version V1.0
+ * @Title： User
+ * @Package： srp.model
+ * @Description： 用户对象
+ * @author： 南来
+ * @date： 2017-06-12 10:07
+ */
+public class User {
+
+    /**
+     * 用户名
+     */
+    private String name;
+    /**
+     * e-mail
+     */
+    private String email;
+    /**
+     * 关注的商品Id
+     */
+    private String watchProductId;
+
+    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 String getWatchProductId() {
+        return watchProductId;
+    }
+
+    public void setWatchProductId(String watchProductId) {
+        this.watchProductId = watchProductId;
+    }
+
+    @Override
+    public String toString() {
+        return "User{" +
+                "name='" + name + '\'' +
+                ", email='" + email + '\'' +
+                ", watchProductId='" + watchProductId + '\'' +
+                '}';
+    }
+}
diff --git a/students/549739951/src/main/java/srp/service/MailService.java b/students/549739951/src/main/java/srp/service/MailService.java
new file mode 100644
index 000000000..60c79117d
--- /dev/null
+++ b/students/549739951/src/main/java/srp/service/MailService.java
@@ -0,0 +1,36 @@
+package srp.service;
+
+import srp.model.Email;
+import srp.util.MailUtil;
+
+import static srp.config.Config.altSmtpHost;
+import static srp.config.Config.smtpHost;
+
+/**
+ * @version V1.0
+ * @Title： MailService
+ * @Package： srp.service
+ * @Description： e-mail服务类 省去接口部分
+ * @author： 南来
+ * @date： 2017-06-12 10:26
+ */
+public class MailService {
+
+    /**
+     * 负责发送邮件对象
+     *
+     * @param email email对象
+     */
+    public void send(Email email) {
+        if (MailUtil.send(email, smtpHost)) {
+            System.out.println(String.format("ServerHost： %s , 邮件内容： %s ", smtpHost, email));
+        } else {
+            System.out.println("主邮件服务器发送失败，尝试使用备用服务器发送……");
+            if (MailUtil.send(email, altSmtpHost)) {
+                System.out.println(String.format("ServerHost： %s , 邮件内容： %s ", altSmtpHost, email));
+            } else {
+                System.err.println("使用备用服务器发送失败……(╯°Д°)╯︵┻━┻");
+            }
+        }
+    }
+}
diff --git a/students/549739951/src/main/java/srp/service/ProductService.java b/students/549739951/src/main/java/srp/service/ProductService.java
new file mode 100644
index 000000000..bcc10ee36
--- /dev/null
+++ b/students/549739951/src/main/java/srp/service/ProductService.java
@@ -0,0 +1,35 @@
+package srp.service;
+
+import srp.dao.DB;
+import srp.model.Product;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @version V1.0
+ * @Title： ProductService
+ * @Package： srp.service
+ * @Description： 商品service
+ * @author： 南来
+ * @date： 2017-06-12 11:11
+ */
+public class ProductService {
+
+    //模拟自动装配
+    private DB db = new DB();
+
+    /**
+     * 获取所有商品
+     *
+     * @return 所有商品
+     */
+    public List<Product> getProduct() {
+        try {
+            return db.getProducts();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/students/549739951/src/main/java/srp/service/PromotionService.java b/students/549739951/src/main/java/srp/service/PromotionService.java
new file mode 100644
index 000000000..f888d3d67
--- /dev/null
+++ b/students/549739951/src/main/java/srp/service/PromotionService.java
@@ -0,0 +1,46 @@
+package srp.service;
+
+import srp.config.Constant;
+import srp.model.Email;
+
+/**
+ * @version V1.0
+ * @Title： PromotionService
+ * @Package： srp.service
+ * @Description： Promotion服务类 省去接口部分
+ * @author： 南来
+ * @date： 2017-06-12 10:24
+ */
+public class PromotionService {
+
+    private MailService mailService = new MailService();
+
+    /**
+     * 发送促销邮件
+     *
+     * @param name
+     * @param toAddress 邮箱地址
+     * @param desc
+     */
+    public void promotionMail(String name, String toAddress, String desc) {
+        mailService.send(build(name, toAddress, desc));
+    }
+
+    /**
+     * 构建Email对象
+     *
+     * @param name      姓名
+     * @param toAddress 邮箱地址
+     * @param desc      商品描述
+     * @return Email对象
+     */
+    private Email build(String name, String toAddress, String desc) {
+        Email email = new Email();
+        email.setFrom(Constant.EMAIL_ADMIN);
+        email.setTo(toAddress);
+        email.setSubject(Constant.SUBJECT);
+        email.setContent(String.format(Constant.MESSAGE, name, desc));
+        return email;
+    }
+
+}
diff --git a/students/549739951/src/main/java/srp/service/UserService.java b/students/549739951/src/main/java/srp/service/UserService.java
new file mode 100644
index 000000000..96f9d42bf
--- /dev/null
+++ b/students/549739951/src/main/java/srp/service/UserService.java
@@ -0,0 +1,36 @@
+package srp.service;
+
+import srp.dao.DB;
+import srp.model.User;
+
+import java.util.List;
+
+/**
+ * @version V1.0
+ * @Title： UserService
+ * @Package： srp.service
+ * @Description： User服务类 省去接口部分
+ * @author： 南来
+ * @date： 2017-06-12 10:25
+ */
+public class UserService {
+    //模拟自动装配
+    private DB db = new DB();
+
+    /**
+     * 获取所有用户
+     *
+     * @return 所有用户
+     */
+    protected List<User> getUser() {
+        return db.getUsers();
+    }
+
+    /**
+     * @param productId 商品id
+     * @return 所有关注该商品的用户集
+     */
+    public List<User> getWatchProductUsers(String productId) {
+        return db.getWatchProductUsers(productId);
+    }
+}
diff --git a/students/549739951/src/main/java/srp/util/MailUtil.java b/students/549739951/src/main/java/srp/util/MailUtil.java
new file mode 100644
index 000000000..5bb87b37d
--- /dev/null
+++ b/students/549739951/src/main/java/srp/util/MailUtil.java
@@ -0,0 +1,25 @@
+package srp.util;
+
+import srp.model.Email;
+
+/**
+ * @version V1.0
+ * @Title： MailUtil
+ * @Package： srp.util
+ * @Description： 邮件工具类
+ * @author： 南来
+ * @date： 2017-06-12 10:50
+ */
+public class MailUtil {
+
+    /**
+     * 模拟发送 随机失败
+     *
+     * @param email      email
+     * @param serverHost 邮件服务配置
+     * @return 成功失败
+     */
+    public static boolean send(Email email, String serverHost) {
+        return RandomUtils.randomBoolean();
+    }
+}
diff --git a/students/549739951/src/main/java/srp/util/RandomUtils.java b/students/549739951/src/main/java/srp/util/RandomUtils.java
new file mode 100644
index 000000000..caa37fb99
--- /dev/null
+++ b/students/549739951/src/main/java/srp/util/RandomUtils.java
@@ -0,0 +1,61 @@
+package srp.util;
+
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * @version V1.0
+ * @Title： RandomUtils
+ * @Package： srp.util
+ * @Description： 随机工具类
+ * @author： 南来
+ * @date： 2017-06-12 13:04
+ */
+public class RandomUtils {
+
+    public static boolean randomBoolean() {
+        return new Random().nextBoolean();
+    }
+
+    public static Exception randomException() {
+        if (RandomUtils.randomBoolean())
+            return new RuntimeException();
+        return null;
+    }
+
+    public static String randomMail() {
+        return randomNumber(9) + "@qq.com";
+    }
+
+    public static <T> T randomOne(List<T> list) {
+        return list.get(new Random().nextInt(list.size()));
+    }
+
+    public static String randomNumber(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++)
+            sb.append(new Random().nextInt(10));
+        return sb.toString();
+    }
+
+    public static String randomName() {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 3; i++) {
+            int highCode, lowCode;
+
+            highCode = (176 + Math.abs(new Random().nextInt(39)));
+            lowCode = (161 + Math.abs(new Random().nextInt(93)));
+
+            byte[] b = new byte[]{(Integer.valueOf(highCode)).byteValue()
+                    , (Integer.valueOf(lowCode)).byteValue()};
+
+            try {
+                sb.append(new String(b, "GBK"));
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/students/549739951/src/main/resources/product_promotion.txt b/students/549739951/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/549739951/src/main/resources/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/550727632/pom.xml b/students/550727632/pom.xml
new file mode 100644
index 000000000..3483fcca1
--- /dev/null
+++ b/students/550727632/pom.xml
@@ -0,0 +1,37 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.codering.ood</groupId>
+	<artifactId>coderising</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<name>ood-assignment</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.4</version>
+		</dependency>
+
+
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>aliyunmaven</id>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+	</repositories>
+</project>
\ No newline at end of file
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java b/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..689b130f0
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.logs.ILogType;
+
+public class Logger {
+
+	private ILogType logType;
+	private ILogMethod logMethod;
+
+	public Logger(ILogType logType, ILogMethod logMethod) {
+		this.logType = logType;
+		this.logMethod = logMethod;
+	}
+
+	public void log(String msg) {
+		String logMsg = this.logType.formatMessage(msg);
+		this.logMethod.sendLog(logMsg);
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
new file mode 100644
index 000000000..0dd74248e
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.logs;
+
+public interface ILogMethod {
+	/**
+	 * 发送log信息
+	 * 
+	 * @param msg
+	 */
+	void sendLog(String msg);
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
new file mode 100644
index 000000000..bdf07869a
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs;
+
+public interface ILogType {
+
+	/**
+	 * 格式化log信息
+	 * 
+	 * @param msg
+	 * @return
+	 */
+	String formatMessage(String msg);
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
new file mode 100644
index 000000000..8e185560a
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.util.MailUtil;
+
+public class EmailLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		MailUtil.send(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
new file mode 100644
index 000000000..81ad2e79e
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+
+public class PrintLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		System.out.println(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
new file mode 100644
index 000000000..a9aecfdfa
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogType;
+import com.coderising.ood.ocp.util.DateUtil;
+
+public class RowLog implements ILogType {
+
+	@Override
+	public String formatMessage(String msg) {
+		return DateUtil.getCurrentDateAsString() + ":" + msg;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
new file mode 100644
index 000000000..423cea620
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogType;
+
+public class RowLogWithDate implements ILogType {
+
+	@Override
+	public String formatMessage(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
new file mode 100644
index 000000000..e0b2c4c3e
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.util.SMSUtil;
+
+public class SMSLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		SMSUtil.send(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
new file mode 100644
index 000000000..df8d253d9
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
new file mode 100644
index 000000000..d95779b07
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
new file mode 100644
index 000000000..ae2359de9
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java b/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/550727632/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<String,String> 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/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/550727632/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/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..3b73afe42
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql) {
+
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+	
+	public static List<User> loadProductUsers(Product product){
+		String sql = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		return query(sql);
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 000000000..0054feb8e
--- /dev/null
+++ b/students/550727632/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;
+
+public class FileUtil {
+
+	public static Product readProductFile(File file) throws IOException {
+		BufferedReader br = null;
+		Product product = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			System.out.println(product.toString());
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return product;
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..a61ab7e52
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,56 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class MailUtil {
+
+	private static String fromAddress;
+	private static String smtpHost;
+	private static String altSmtpHost;
+
+	static {
+		Configuration config = new Configuration();
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	}
+
+	public static void sendPromotionEmail(PromotionMail mail, Product product, boolean debug) {
+		System.out.println("开始发送邮件");
+		List<User> userList = DBUtil.loadProductUsers(product);
+		if(userList != null && !userList.isEmpty()){
+			for (User user : userList) {
+				mail.setMessage(user, product);
+				if (StringUtils.isNotEmpty(user.getEmail())){
+					sendEmail(mail.getSubject(), mail.getMessage(), user.getEmail(), debug);
+				}
+			}
+		} else {
+			System.out.println("没有需要发送的邮件");
+		}
+	}
+	
+	public static void sendEmail(String subject, String message,String toAddress,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");
+		// 先用smtpHost发送
+		// 如果失败用altSmtpHost发送
+		// 如果还失败，则记录日志
+		try {
+			buffer.append("smtpHost:").append(smtpHost).append("\n");
+		} catch (Exception e) {
+			try {
+				buffer.append("smtpHost:").append(altSmtpHost).append("\n");
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+		System.out.println(buffer.toString());
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Product.java b/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..fd107fa4f
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp;
+
+public class Product {
+
+	private String productID;
+	private String 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;
+	}
+
+	@Override
+	public String toString() {
+		return "Product [productID=" + productID + ", productDesc=" + productDesc + "]";
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..23d48b0ae
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class PromotionMail {
+	private String subject;
+	private String message;
+
+	public PromotionMail() {
+		subject = "您关注的产品降价了";
+	}
+
+	public static void main(String[] args) throws Exception {
+		File f = new File("src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		boolean emailDebug = false;
+		Product product = FileUtil.readProductFile(f);
+		PromotionMail mail = new PromotionMail();
+		MailUtil.sendPromotionEmail(mail, product, emailDebug);
+	}
+
+	public String getSubject() {
+		return subject;
+	}
+
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	public void setMessage(User user, Product product) {
+		message = "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/User.java b/students/550727632/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..b63f655e7
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+public class User {
+
+	private String name;
+	private String email;
+
+	public User() {
+		super();
+	}
+
+	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/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/550727632/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/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..d8bbcd124
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class DateUtil {
+public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java
new file mode 100644
index 000000000..be360ccdd
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java
@@ -0,0 +1,6 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public interface Logger {
+
+	public void send(String msg);
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java
new file mode 100644
index 000000000..c658bd33e
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java
@@ -0,0 +1,20 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoggerManagement {
+
+	public void log(String msg){
+		
+		List<RawLogger> rawlog = new ArrayList<RawLogger>();
+		for (RawLogger r : rawlog){
+			r.log(msg);
+		}
+		
+		List<Logger> logger = new ArrayList<Logger>();
+		for (Logger l : logger){
+			l.send(msg);
+		}
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java
new file mode 100644
index 000000000..8cfd91064
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class MailUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java
new file mode 100644
index 000000000..d83397c1d
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class PrintUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java
new file mode 100644
index 000000000..ad6cbb751
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java
@@ -0,0 +1,7 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class RawLog implements RawLogger{
+	public void log(String msg){
+		String logMsg = msg;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java
new file mode 100644
index 000000000..f9640769e
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class RawLogWithDate implements RawLogger{
+	public void log(String msg){
+		String txtDate = DateUtil.getCurrentDateAsString();
+		String logMsg = txtDate + ": " + msg;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java
new file mode 100644
index 000000000..d4ad9eacd
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java
@@ -0,0 +1,5 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public interface RawLogger {
+	public void log(String msg);
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java
new file mode 100644
index 000000000..82eb15bed
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class SMSUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
new file mode 100644
index 000000000..bf9902bf9
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.github.orajavac.coding2017.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..94eb56e6e
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.github.orajavac.coding2017.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/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
new file mode 100644
index 000000000..528ff9321
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
@@ -0,0 +1,35 @@
+package com.github.orajavac.coding2017.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;
+	}
+	
+	public static void setLoadQuery(String productID) throws Exception {
+		
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		
+		System.out.println("loadQuery set");
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java
new file mode 100644
index 000000000..14f6443bb
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java
@@ -0,0 +1,31 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+	public static Product readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		Product p = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			p.setProductID(data[0]); 
+			p.setProductDesc(data[1]); 
+			
+			System.out.println("产品ID = " + p.getProductID() + "\n");
+			System.out.println("产品描述 = " + p.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return p;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java
new file mode 100644
index 000000000..46f5a92db
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java
@@ -0,0 +1,49 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class Mail {
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	private String subject = null;
+	private String message = null;
+	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 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() {
+		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/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
new file mode 100644
index 000000000..aa1629306
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
@@ -0,0 +1,97 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	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());
+		
+	}
+	
+	public static String setSMTPHost(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	public static String setAltSMTPHost(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+
+	
+	public static String setFromAddress(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+	
+	public static void setMessage(HashMap userInfo,Product p,Mail mail) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		mail.setSubject("您关注的产品降价了");
+		
+		String message = "尊敬的 "+name+", 您关注的产品 " + p.getProductDesc() + " 降价了，欢迎购买!" ;		
+		mail.setMessage(message);		
+		
+
+	}
+	
+	public static void sendEMails(boolean debug, List mailingList,Product p,Mail mail) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+		
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY); 
+				if (toAddress.length() > 0) 
+					setMessage(userInfo,p,mail);
+				try 
+				{
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(toAddress, mail.getFromAddress(), mail.getSubject(), mail.getMessage(), mail.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(toAddress, mail.getFromAddress(), mail.getSubject(), mail.getMessage(), mail.getAltSmtpHost(), debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java
new file mode 100644
index 000000000..02345d790
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java
@@ -0,0 +1,18 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+public class Product {
+	private String productID = null;
+	private String productDesc = null;
+	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/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..53e7e2747
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
@@ -0,0 +1,67 @@
+package com.github.orajavac.coding2017.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 Mail mail = new Mail();
+
+	
+
+	private static Configuration config; 
+	
+	
+	
+	
+	
+
+	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
+		Product p = FileUtil.readFile(file);
+
+		
+		config = new Configuration();
+		
+		mail.setSmtpHost(MailUtil.setSMTPHost(config));
+		mail.setAltSmtpHost(MailUtil.setAltSMTPHost(config)); 
+	
+
+		mail.setFromAddress(MailUtil.setFromAddress(config));
+
+		
+		DBUtil.setLoadQuery(p.getProductID());
+		
+		MailUtil.sendEMails(mailDebug, loadMailingList(),p,mail); 
+
+		
+	}
+
+	
+
+
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/product_promotion.txt b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/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/582161208/ood-assignment/pom.xml b/students/582161208/ood-assignment/pom.xml
new file mode 100644
index 000000000..a24289ffa
--- /dev/null
+++ b/students/582161208/ood-assignment/pom.xml
@@ -0,0 +1,47 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.coderising</groupId>
+	<artifactId>ood-assignment</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>ood-assignment</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.14.8</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.1</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-collections</groupId>
+			<artifactId>commons-collections</artifactId>
+			<version>3.2</version>
+		</dependency>
+
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>aliyunmaven</id>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+	</repositories>
+</project>
diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..3985daf8b
--- /dev/null
+++ b/students/582161208/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<String,String> 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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..0a96deeb9
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,8 @@
+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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..cf0b00a91
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,24 @@
+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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
new file mode 100644
index 000000000..8a82cad4f
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+import lombok.Data;
+
+/**
+ * 邮件基本信息
+ *
+ * @author ida 2017/6/12
+ */
+@Data
+public class MailInfo {
+
+	private String smtpHost;
+
+	private String altSmtpHost;
+
+	private String fromAddress;
+
+	private String toAddress;
+	
+	private String subject;
+
+	private String message;
+
+}
diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..06005966e
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,15 @@
+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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 000000000..0d77a94f9
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp;
+
+import lombok.Data;
+
+/**
+ * 产品信息
+ *
+ * @author ida 2017/6/12
+ */
+@Data
+public class ProductInfo {
+	
+	/** 产品id */
+	private String productId;
+	/** 产品描述 */
+	private String productDesc;
+}
diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..0df36f30c
--- /dev/null
+++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,183 @@
+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.Iterator;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 邮件发送处理类
+ *
+ * @author ida 2017/6/12
+ */
+public class PromotionMail {
+
+	protected static String sendMailQuery = "";
+
+	private static Configuration config;
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	/**
+	 * 发送邮件公有方法
+	 * 
+	 * @param file
+	 * @param mailDebug
+	 */
+	public void sendMails(File file, boolean mailDebug) {
+		try {
+			config = new Configuration();
+			sendEMails(file, mailDebug);
+		} catch (IOException e) {
+			System.out.println(e.getMessage());
+		}
+	}
+
+	/**
+	 * 发送邮件
+	 * 
+	 * @param file
+	 * @param debug
+	 * @throws IOException
+	 */
+	private static void sendEMails(File file, boolean debug) throws IOException {
+
+		ProductInfo product = readFile(file);
+
+		MailInfo mailInfo = setMailInfo();
+
+		System.out.println("开始发送邮件");
+
+		List<?> mailingList = DBUtil.query(sendMailQuery);
+		if (CollectionUtils.isNotEmpty(mailingList)) {
+			Iterator<?> iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				MailInfo newMail = configureEMail((HashMap<?, ?>) iter.next(), mailInfo, product);
+				try {
+					if (StringUtils.isNotBlank(newMail.getToAddress()))
+						sendMail(mailInfo, debug);
+				} catch (Exception e) {
+					try {
+						sendMail(mailInfo, debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+
+	}
+
+	/**
+	 * 设置邮件部分信息
+	 * 
+	 * @return
+	 */
+	private static MailInfo setMailInfo() {
+		MailInfo mailInfo = new MailInfo();
+		mailInfo.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mailInfo.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mailInfo.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		return mailInfo;
+	}
+
+	/**
+	 * 设置邮件message
+	 * 
+	 * @param userInfo
+	 * @param mailInfo
+	 * @param product
+	 * @return
+	 * @throws IOException
+	 */
+	private static MailInfo setMessage(HashMap<?, ?> userInfo, MailInfo mailInfo, ProductInfo product)
+			throws IOException {
+		String name = (String) userInfo.get(NAME_KEY);
+		mailInfo.setSubject("您关注的产品降价了");
+		mailInfo.setMessage("尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");
+		return mailInfo;
+	}
+
+	/**
+	 * 读取文件
+	 * 
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 */
+	private static ProductInfo readFile(File file) throws IOException {
+		ProductInfo product = setProductInfo(file);
+		System.out.println("产品ID = " + product.getProductId() + "\n");
+		System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + product.getProductId() + "' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+		return product;
+	}
+
+	/**
+	 * 设置peoduct信息
+	 * 
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 */
+	private static ProductInfo setProductInfo(File file) throws IOException {
+		ProductInfo product = null;
+		BufferedReader br = null;
+		try {
+			product = new ProductInfo();
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product.setProductId(data[0]);
+			product.setProductDesc(data[1]);
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return product;
+	}
+
+	/**
+	 * 读取邮件数据
+	 * 
+	 * @param userInfo
+	 * @param mailInfo
+	 * @param product
+	 * @return
+	 * @throws IOException
+	 */
+	private static MailInfo configureEMail(HashMap<?, ?> userInfo, MailInfo mailInfo, ProductInfo product)
+			throws IOException {
+		String toAddress = (String) userInfo.get(EMAIL_KEY);
+		mailInfo.setToAddress(toAddress);
+		if (toAddress.length() > 0)
+			return setMessage(userInfo, mailInfo, product);
+		return mailInfo;
+	}
+
+	private static void sendMail(MailInfo mailInfo, Boolean debug) {
+		MailUtil.sendEmail(mailInfo.getToAddress(), mailInfo.getFromAddress(), mailInfo.getSubject(),
+				mailInfo.getMessage(), mailInfo.getSmtpHost(), debug);
+	}
+
+	public static void main(String[] args) throws Exception {
+		File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+//		File file = new File("/Users/myhome/Desktop/product_promotion.txt");
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail();
+		pe.sendMails(file, emailDebug);
+	}
+
+}
diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/582161208/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/592146505/data-structure/assignment/pom.xml b/students/592146505/data-structure/assignment/pom.xml
new file mode 100644
index 000000000..5024466d1
--- /dev/null
+++ b/students/592146505/data-structure/assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 000000000..900a3ad35
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 000000000..c3c8a3f27
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 000000000..4ff7f46ae
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 000000000..0957eaf7f
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 000000000..1551a80b3
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 000000000..ce045393b
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 000000000..bf9807b30
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 000000000..36a9d2ce1
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 000000000..172371dd5
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 000000000..dcdbe226e
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 000000000..85e2e22de
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 000000000..b8c81faf3
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 000000000..07df2a5da
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 000000000..e5d9aebba
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 000000000..436d092f5
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 000000000..ab8c76458
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 000000000..8c34bad0c
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 000000000..a651923ef
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 000000000..aefc9692b
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 000000000..8660ec810
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 000000000..22ba4a545
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 000000000..2c7e128b2
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..b6cf28c09
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..0357c4d91
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 000000000..ec54b839c
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 000000000..13cf80241
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/592146505/data-structure/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<String,String> 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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/592146505/data-structure/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 000000000..06ef6311b
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/List.java
new file mode 100644
index 000000000..10d13b583
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 000000000..4576c016a
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 000000000..45740e6d5
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 000000000..994a241a3
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 000000000..7fd72fc2b
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 000000000..f4c7556a2
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 000000000..2e0550c67
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 000000000..6a3ea639b
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 000000000..7d90318b5
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 000000000..c4c4b7325
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 000000000..cef19a8b5
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 000000000..f391d92b8
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 000000000..fedb24360
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 000000000..b0ec38161
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 000000000..76f2cb766
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 000000000..d0ab4387d
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 000000000..e86d056a2
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 000000000..ef85ff007
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 000000000..20e34e885
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 000000000..96a2194a6
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 000000000..dcbb18be4
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 000000000..c0435a2db
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 000000000..956927e2d
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 000000000..5cec210e7
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 000000000..8579743fe
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 000000000..d3b0f167e
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 000000000..399d3e857
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 000000000..4536ee7a2
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 000000000..4a53dbe2f
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 000000000..c1421cd39
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 000000000..b033cbe1d
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 000000000..41857e137
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 000000000..6e65192e4
--- /dev/null
+++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/592146505/ood/ood-assignment/pom.xml b/students/592146505/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/592146505/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/592146505/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<String,String> 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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/592146505/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
diff --git a/students/605159467/ood-assignment/pom.xml b/students/605159467/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/605159467/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
new file mode 100644
index 000000000..b8c16c509
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
@@ -0,0 +1,98 @@
+package com.coderising.ood.srp.bean;
+
+import com.coderising.ood.srp.resource.ConfigurationKeys;
+import com.coderising.ood.srp.utils.MailUtil;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  22:04
+ * Description:
+ */
+public class Email
+{
+
+
+
+
+
+
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private String smtpHost;
+
+    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()
+    {
+        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;
+    }
+
+    /**
+     *  具有发送的行为
+     */
+    public  void sendMessage(){
+        MailUtil.sendEmail(this.toAddress,
+                ConfigurationKeys.EMAIL_ADMIN,
+                this.subject,
+                this.message,
+                ConfigurationKeys.ALT_SMTP_SERVER,
+                true);
+    }
+
+    /**
+     *  备用发送
+     */
+    public  void  standbySendMessage(){
+        MailUtil.sendEmail(this.toAddress,
+                ConfigurationKeys.EMAIL_ADMIN,
+                this.subject,
+                this.message,
+                ConfigurationKeys.SMTP_SERVER,
+                true);
+    }
+
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java
new file mode 100644
index 000000000..942b24615
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  15:21
+ * Description:
+ */
+public class Person
+{
+    private Long id;
+    private String name;
+    private String email;
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 000000000..1fe6c40ef
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  11:19
+ * Description: 产品实体
+ */
+public class Product
+{
+    private String productID ;
+    private String productDesc;
+
+    public Product()
+    {
+    }
+
+    public Product(String productID, String productDesc)
+    {
+        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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
new file mode 100644
index 000000000..8b79dfac5
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  14:07
+ * Description:
+ */
+public interface PromotionMailDao
+{
+
+    /**
+     *  从数据库中读取信息，人员信息
+     */
+    public  List loadMailingList() throws Exception;
+
+
+
+
+}
+
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java
new file mode 100644
index 000000000..a730c3c18
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.utils.DBUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  14:48
+ * Description:
+ */
+public class PromotionMailDaoImpl implements PromotionMailDao
+{
+    public List loadMailingList() throws Exception
+    {
+        List userList = new ArrayList<Person>();
+        for (int i = 1; i <= 3; i++) {
+            Person person=new Person();
+            person.setId(Long.valueOf(i));
+            person.setName("User" + i);
+            person.setEmail("aa@bb.com");
+            userList.add(person);
+        }
+        return userList;
+    }
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
new file mode 100644
index 000000000..e946ece82
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.main;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.resource.ConfigurationKeys;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.PromotionMailServiceImpl;
+
+import javax.xml.ws.Service;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail
+{
+
+   public  static 	PromotionMailService mailService = new PromotionMailServiceImpl();
+	public static void main(String[] args) throws Exception
+	{
+
+		String src = mailService.getClass().getResource("../resource") + "/product_promotion.txt";
+		List<Product> productList = mailService.readFile(src);
+		List<Person> personList = mailService.querySendPerons();
+
+        List<Email>  emailList=getEmailList(productList,personList);
+
+        mailService.sendMessage(emailList);
+	}
+
+	private static List getEmailList( List<Product> productList, List<Person> personList) throws Exception
+	{
+		List  emailList=new ArrayList<Email>();
+		for (Person person : personList)
+		{
+			for (Product product : productList)
+			{
+				Email email = new Email();
+				String message=mailService.jointMessage(person, product);
+				email.setToAddress(person.getEmail());
+				email.setMessage(message);
+				emailList.add(email);
+			}
+		}
+		return  emailList;
+	}
+
+
+}
\ No newline at end of file
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java
new file mode 100644
index 000000000..c6fac0201
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp.resource;
+
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/product_promotion.txt b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 000000000..f520e1743
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+
+import java.io.IOException;
+import java.util.List;
+
+
+public interface PromotionMailService
+{
+
+
+
+
+
+
+
+     public  List readFile(String src)  throws IOException;
+
+
+
+    public  List querySendPerons() throws Exception;
+
+
+    public String jointMessage(Person person, Product product)throws Exception;
+
+    public void sendMessage(List<Email> emailList) throws IOException;
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java
new file mode 100644
index 000000000..ed57cb2e9
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.dao.PromotionMailDaoImpl;
+import com.coderising.ood.srp.utils.FileUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  15:04
+ * Description:
+ */
+public class PromotionMailServiceImpl implements PromotionMailService
+{
+     private  static  PromotionMailDao promotionMailDao=new PromotionMailDaoImpl();
+     private  List<Person> persons;
+     private  List<Product> products;
+
+
+
+    public void sendMessage(List<Email> emailList) throws IOException
+    {
+        for (Email email:emailList){
+            try
+            {
+                email.sendMessage();
+            }catch (Exception e){
+
+                try {
+                    email.standbySendMessage();
+                } catch (Exception e2){
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+
+            }
+        }
+    }
+
+
+    public List readFile(String src) throws IOException
+    {
+        File file=new File(src);
+       return  FileUtil.readFile(file);  // 获得 产品
+    }
+
+    public List querySendPerons() throws Exception
+    {
+        return  promotionMailDao.loadMailingList(); //获得人员
+    }
+
+
+    public String jointMessage(Person person, Product product)
+    {
+        StringBuffer  message=new StringBuffer();
+        String personName=person.getName();
+        String productDesc=product.getProductDesc();
+        message.append("您关注的产品降价了").append(" 尊敬的 ").append(personName)
+                .append(" 您关注的产品").append(productDesc).append("降价了，欢迎购买!");
+        return  message.toString();
+    }
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
new file mode 100644
index 000000000..2449bf202
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.utils;
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
new file mode 100644
index 000000000..9ee29078b
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.bean.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  11:08
+ * Description:
+ */
+public class FileUtil
+{
+
+    /**
+     *  读取文件内容，返回List<Product>
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static List  readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        List list = null;
+        try
+        {
+            br = new BufferedReader(new FileReader(file));
+            String line = null;
+            Product product = null;
+            list = new ArrayList<Product>();
+            while ((line = br.readLine()) != null)
+            {
+                String[] data = line.split(" ");
+                product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+
+                list.add(product);
+            }
+            return  list;
+        } catch (IOException e)
+        {
+            throw new IOException(e.getMessage());
+        } finally
+        {
+            br.close();
+        }
+    }
+
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
new file mode 100644
index 000000000..557234d95
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.utils;
+
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java
new file mode 100644
index 000000000..3c1226ffb
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java
@@ -0,0 +1,79 @@
+package com.coderising.ood.srp.utils;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  16:27
+ * Description:
+ */
+public class PropertiesUtil
+{
+    private Properties props;
+    private URI uri;
+
+    public PropertiesUtil(String fileName){
+        readProperties(fileName);
+    }
+    private void readProperties(String fileName) {
+        try {
+            props = new Properties();
+            InputStream fis =getClass().getResourceAsStream(fileName);
+            props.load(fis);
+            uri = this.getClass().getResource("/dbConfig.properties").toURI();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    /**
+     * 获取某个属性
+     */
+    public String getProperty(String key){
+        return props.getProperty(key);
+    }
+    /**
+     * 获取所有属性，返回一个map,不常用
+     * 可以试试props.putAll(t)
+     */
+    public Map getAllProperty(){
+        Map map=new HashMap();
+        Enumeration enu = props.propertyNames();
+        while (enu.hasMoreElements()) {
+            String key = (String) enu.nextElement();
+            String value = props.getProperty(key);
+            map.put(key, value);
+        }
+        return map;
+    }
+    /**
+     * 在控制台上打印出所有属性，调试时用。
+     */
+    public void printProperties(){
+        props.list(System.out);
+    }
+    /**
+     * 写入properties信息
+     */
+    public void writeProperties(String key, String value) {
+        try {
+            OutputStream fos = new FileOutputStream(new File(uri));
+            props.setProperty(key, value);
+            // 将此 Properties 表中的属性列表（键和元素对）写入输出流
+            props.store(fos, "『comments』Update key：" + key);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java
new file mode 100644
index 000000000..90785c61a
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java
@@ -0,0 +1,16 @@
+package edu.coerscnu.ood.ocp.client;
+
+import edu.coerscnu.ood.ocp.logger.Logger;
+import edu.coerscnu.ood.ocp.logger.method.Mail;
+import edu.coerscnu.ood.ocp.logger.method.LogMethod;
+import edu.coerscnu.ood.ocp.logger.type.RawWithDate;
+import edu.coerscnu.ood.ocp.logger.type.LogType;
+
+public class Client {
+	public static void main(String[] args) {
+		LogType type = new RawWithDate();
+		LogMethod method = new Mail();
+		Logger logger = new Logger(type, method);
+		logger.log("Hello World");
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java
new file mode 100644
index 000000000..6db868df9
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java
@@ -0,0 +1,21 @@
+package edu.coerscnu.ood.ocp.logger;
+
+import edu.coerscnu.ood.ocp.logger.method.LogMethod;
+import edu.coerscnu.ood.ocp.logger.type.LogType;
+
+public class Logger {
+
+	public LogType logType; // 日志类型
+	public LogMethod logMethod; // 日志方法
+
+	public Logger(LogType logType, LogMethod logMethod) {
+		this.logType = logType;
+		this.logMethod = logMethod;
+	}
+
+	public void log(String msg) {
+		String logMsg = msg;
+		logMsg = logMsg + logType.getMsg();
+		logMethod.send(logMsg);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java
new file mode 100644
index 000000000..13f1e66a6
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+/**
+ * 日志方法接口
+ * @author xujie
+ *
+ */
+public interface LogMethod {
+	public void send(String logMsg);
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java
new file mode 100644
index 000000000..1468ef48f
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Mail implements LogMethod{
+
+	@Override
+	public void send(String logMsg) {
+		System.out.println("Mail:" + logMsg);
+	}
+	
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java
new file mode 100644
index 000000000..d8c7e0806
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java
@@ -0,0 +1,9 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Print implements LogMethod {
+
+	@Override
+	public void send(String logMsg) {
+		System.out.println("Print:" + logMsg);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java
new file mode 100644
index 000000000..8efc05ea7
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Sms implements LogMethod{
+
+	@Override
+	public void send(String logMsg) {
+		System.err.println("Sms:" + logMsg);
+	}
+	
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java
new file mode 100644
index 000000000..99443d1a9
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java
@@ -0,0 +1,11 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+/**
+ * 日志类型接口
+ * 
+ * @author xujie
+ *
+ */
+public interface LogType {
+	public String getMsg();
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java
new file mode 100644
index 000000000..2053abd46
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+public class Raw implements LogType{
+
+	@Override
+	public String getMsg() {
+		return "";
+	}
+
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java
new file mode 100644
index 000000000..3c15b93df
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java
@@ -0,0 +1,12 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+import edu.coerscnu.ood.ocp.utils.DateUtil;
+
+public class RawWithDate implements LogType{
+
+	@Override
+	public String getMsg() {
+		return " " + DateUtil.getCurrentDate();
+	}
+
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java
new file mode 100644
index 000000000..1cfec691e
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java
@@ -0,0 +1,16 @@
+package edu.coerscnu.ood.ocp.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 获取当前时间
+ * @author xujie
+ *
+ */
+public class DateUtil {
+	public static String getCurrentDate() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		return sdf.format(new Date());
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java
new file mode 100644
index 000000000..b6a82c425
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, Object> 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");
+		configurations.put(ConfigurationKeys.IS_DEBUG, true);
+	}
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public Object getProperty(String key) {
+		return configurations.get(key);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..b7cecc897
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package edu.coerscnu.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";
+	public static final String IS_DEBUG = "debug";
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java
new file mode 100644
index 000000000..6632d110f
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java
@@ -0,0 +1,26 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+	/**
+	 * 获取用户列表，应该从数据库读， 但是简化为直接生成。
+	 * 
+	 * @param sql
+	 * @return
+	 */
+	public static List<HashMap<String, String>> query(String sql) {
+
+		List<HashMap<String, String>> userList = new ArrayList<HashMap<String, String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<String, String>();
+			userInfo.put(UserService.NAME_KEY, "User" + i);
+			userInfo.put(UserService.MAIL_KEY, i + "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java
new file mode 100644
index 000000000..fd474c2da
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java
@@ -0,0 +1,37 @@
+package edu.coerscnu.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * FileUtil类负责读取.txt文件内容，并以List<String[]>（产品id，产品描述）形式返回。
+ * 
+ * @author xujie
+ *
+ */
+public class FileUtil {
+
+	public static List<String[]> readFile(String path) throws IOException {
+		BufferedReader br = null;
+		List<String[]> list = new ArrayList<>();
+		try {
+			File file = new File(path);
+			FileReader fr = new FileReader(file);
+			br = new BufferedReader(fr);
+			String temp;
+			while ((temp = br.readLine()) != null) {
+				String[] data = temp.split(" ");
+				list.add(data);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			br.close();
+		}
+		return list;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
new file mode 100644
index 000000000..1dd007b3d
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
@@ -0,0 +1,73 @@
+package edu.coerscnu.ood.srp;
+
+/**
+ * 邮件公共类 1、配置服务器 2、发送邮件
+ * 
+ * @author xujie
+ *
+ */
+public class MailUtil {
+
+	private static String smtpHost; // 主服务器
+	private static String altSmtpHost; // 备用服务器
+	private static String fromAddress; // 发件人
+	private static boolean isDebug; // 是否为调试环境
+
+	/**
+	 * 配置服务器
+	 */
+	public static void configureHost() {
+		Configuration config = new Configuration();
+		smtpHost = (String) config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = (String) config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = (String) config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		isDebug = (boolean) config.getProperty(ConfigurationKeys.IS_DEBUG);
+	}
+
+	/**
+	 * 发送邮件，对外不可见
+	 * 
+	 * @param toAddress
+	 * @param fromAddress
+	 * @param subject
+	 * @param message
+	 * @param smtpHost
+	 * @param debug
+	 */
+	private static void sendMail(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());
+	}
+
+	/**
+	 * 发送邮件，对外可见
+	 * 
+	 * @param toAddress
+	 * @param subject
+	 * @param message
+	 */
+	public static void sendMail(String toAddress, String subject, String message) {
+		configureHost();
+		if (isDebug) {
+			System.out.println("调试环境");
+		} else {
+			System.out.println("正式环境");
+		}
+		if (smtpHost != null) {
+			System.out.println("使用主服务器发送邮件");
+			sendMail(toAddress, fromAddress, subject, message, smtpHost, isDebug);
+		} else if (altSmtpHost != null) {
+			System.out.println("使用备用服务器发送邮件");
+			sendMail(toAddress, fromAddress, subject, message, altSmtpHost, isDebug);
+		} else {
+			System.out.println("服务器异常，无法发送邮件");
+		}
+
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java
new file mode 100644
index 000000000..64cbcc6d0
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java
@@ -0,0 +1,33 @@
+package edu.coerscnu.ood.srp;
+
+/**
+ * 产品类，包含id和描述两个属性
+ * 
+ * @author xujie
+ *
+ */
+public class Product {
+	protected String productID = null;
+	protected String productDesc = null;
+
+	public Product(String id, String desc) {
+		productID = id;
+		productDesc = desc;
+	}
+
+	public void setProductID(String id) {
+		productID = id;
+	}
+
+	public void setProductDesc(String desc) {
+		productDesc = desc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..5a77a2406
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
@@ -0,0 +1,97 @@
+package edu.coerscnu.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 促销邮件类
+ * 
+ * 1、设置邮件主题
+ * 
+ * 2、设置邮件正文
+ * 
+ * 3、设置邮件收件人列表
+ * 
+ * 4、发送邮件
+ * 
+ * @author xujie
+ *
+ */
+public class PromotionMail {
+
+	protected String subject = null;
+	protected String message = null;
+	protected List<HashMap<String, String>> mailList;
+
+	public static void main(String[] args) throws Exception {
+
+		// 降价产品文件路径
+		String path = "src/edu/coerscnu/ood/srp/product_promotion.txt";
+		// 获得降价产品列表
+		List<String[]> productList = FileUtil.readFile(path);
+		// 对于每个降价产品，挨个向关注该产品的用户发送邮件
+		for (String[] prod : productList) {
+			Product product = new Product(prod[0], prod[1]);
+			PromotionMail pm = new PromotionMail();
+			pm.setMailList(product);
+			pm.sendMails(product);
+		}
+	}
+
+	/**
+	 * 设置邮件主题
+	 * 
+	 * @param subject
+	 */
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	/**
+	 * 设置邮件正文
+	 * 
+	 * @param userInfo
+	 * @param product
+	 * @throws IOException
+	 */
+	protected void setMessage(HashMap<String, String> userInfo, Product product) throws IOException {
+		String name = (String) userInfo.get(UserService.NAME_KEY);
+		String desc = product.getProductDesc();
+		message = "尊敬的 " + name + ", 您关注的产品 " + desc + " 降价了，欢迎购买!";
+	}
+
+	/**
+	 * 设置收件人列表
+	 * 
+	 * @param product
+	 * @throws Exception
+	 */
+	protected void setMailList(Product product) throws Exception {
+		UserService userService = new UserService();
+		userService.setLoadQuery(product);
+		mailList = userService.loadMailingList();
+	}
+
+	/**
+	 * 发送邮件
+	 * 
+	 * @throws IOException
+	 */
+	protected void sendMails(Product product) throws IOException {
+		if (mailList != null) {
+			Iterator<HashMap<String, String>> iter = mailList.iterator();
+			while (iter.hasNext()) {
+				HashMap<String, String> user = iter.next();
+				String toAddress = (String) user.get(UserService.MAIL_KEY);
+				// 用户邮箱地址有效则设置邮件主题和正文，并发送
+				if (toAddress.length() > 0) {
+					setSubject("您关注的产品降价了");
+					setMessage(user, product);
+					MailUtil.sendMail(toAddress, subject, message);
+				}
+			}
+		}
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java
new file mode 100644
index 000000000..af04bf570
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java
@@ -0,0 +1,28 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 用户类，获取关注降价产品的客户的名字和邮箱地址
+ * 
+ * @author xujie
+ *
+ */
+public class UserService {
+
+	protected static final String NAME_KEY = "NAME";
+	protected static final String MAIL_KEY = "EMAIL";
+	
+	protected String query = "";
+
+	protected void setLoadQuery(Product product) {
+		query = "Select name from subscriptions " + "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set\n");
+	}
+
+	protected List<HashMap<String, String>> loadMailingList() throws Exception {
+		return DBUtil.query(query);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/product_promotion.txt b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/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/617314917/readme.md b/students/617314917/readme.md
new file mode 100644
index 000000000..d620ba5b0
--- /dev/null
+++ b/students/617314917/readme.md
@@ -0,0 +1 @@
+这是“广州-许洁”提交代码的qq命名文件夹。
\ No newline at end of file
diff --git a/students/63072784/README.md b/students/63072784/README.md
new file mode 100644
index 000000000..f5e57e7b7
--- /dev/null
+++ b/students/63072784/README.md
@@ -0,0 +1 @@
+这是我的目录
diff --git a/students/643449856/ood-assignment/pom.xml b/students/643449856/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/643449856/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/643449856/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<String,String> 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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/643449856/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/643449856/readme.md b/students/643449856/readme.md
new file mode 100644
index 000000000..b8e87ead7
--- /dev/null
+++ b/students/643449856/readme.md
@@ -0,0 +1 @@
+first pull request
\ No newline at end of file
diff --git a/students/675554906/readme.md b/students/675554906/readme.md
new file mode 100644
index 000000000..a51b977d6
--- /dev/null
+++ b/students/675554906/readme.md
@@ -0,0 +1 @@
+第一次提交    仅为学习
\ No newline at end of file
diff --git a/students/675554906/src/lilei/com/cn/Configuration.java b/students/675554906/src/lilei/com/cn/Configuration.java
new file mode 100644
index 000000000..c8020595f
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/Configuration.java
@@ -0,0 +1,27 @@
+package lilei.com.cn;
+import java.util.HashMap;
+import java.util.Map;
+/**
+ * Configuration 读取/获取配置信息类
+ * 唯一能引起此类变化的是配置文件的改变
+ * 
+ * */
+public class Configuration {
+
+	static Map<String,String> 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/675554906/src/lilei/com/cn/ConfigurationKeys.java b/students/675554906/src/lilei/com/cn/ConfigurationKeys.java
new file mode 100644
index 000000000..ddcaeb4de
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/ConfigurationKeys.java
@@ -0,0 +1,13 @@
+package lilei.com.cn;
+/**
+ * ConfigurationKeys 配置信息定义类
+ * 个人理解，唯一能引发变化的是“需求”比如，要增加一个KEY
+ * 
+ * */
+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/675554906/src/lilei/com/cn/DBUtil.java b/students/675554906/src/lilei/com/cn/DBUtil.java
new file mode 100644
index 000000000..9ae43cc7d
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/DBUtil.java
@@ -0,0 +1,29 @@
+package lilei.com.cn;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+ /**
+  * DBUtil 连接数据库，获取数据
+  * 个人理解，此类只是负责数据库的连接，和数据的读取，存储，修改
+  * 
+  * */
+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/675554906/src/lilei/com/cn/MailAssemble.java b/students/675554906/src/lilei/com/cn/MailAssemble.java
new file mode 100644
index 000000000..8c17e5f3b
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/MailAssemble.java
@@ -0,0 +1,100 @@
+package lilei.com.cn;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+/**
+ * MailAssemble 组装邮件类
+ * 个人理解， 此类的职责是组装邮件，而邮件是根据Configuration(配置信息类)、ReadFile(读取信息类)来组成的，这两个类也是引起变化的因素
+ * 
+ * */
+public class MailAssemble {
+	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 = new Configuration(); 
+	private static ReadFile rf = new ReadFile();;
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	//组装信息
+	public void assembleMail() throws Exception{
+		String data[] = rf.readFile();
+		setProductID(data[0]); 
+		setProductDesc(data[1]); 
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();
+		setLoadQuery();
+	}
+	
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+	
+	protected void configureEMail(HashMap userInfo) throws IOException 
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			setMessage(userInfo); 
+	}
+	
+	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 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); 
+
+	}
+	
+	private void setProductDesc(String desc) {
+		this.productDesc = desc;		
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/MailUtil.java b/students/675554906/src/lilei/com/cn/MailUtil.java
new file mode 100644
index 000000000..2bd129dc7
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/MailUtil.java
@@ -0,0 +1,60 @@
+package lilei.com.cn;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * MailUtil 邮件方法类   
+ * 个人理解，唯一引起变化的就是邮件发送方法的改变
+ * 
+ * */
+public class MailUtil {
+
+	private static MailAssemble assembleMail = new MailAssemble();
+	
+	public static void sendEmail(MailAssemble assembleMail , boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(assembleMail.fromAddress).append("\n");
+		buffer.append("To:").append(assembleMail.toAddress).append("\n");
+		buffer.append("Subject:").append(assembleMail.subject).append("\n");
+		buffer.append("Content:").append(assembleMail.message).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+	
+	protected void sendEMails(boolean debug) throws Exception 
+	{	
+		assembleMail.assembleMail();
+		List mailingList = assembleMail.loadMailingList();
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				assembleMail.configureEMail((HashMap) iter.next());  
+				try 
+				{
+					if (assembleMail.toAddress.length() > 0)
+						sendEmail(assembleMail, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(assembleMail, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/PromotionMail.java b/students/675554906/src/lilei/com/cn/PromotionMail.java
new file mode 100644
index 000000000..7522bab6b
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/PromotionMail.java
@@ -0,0 +1,29 @@
+package lilei.com.cn;
+
+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;
+/**
+ * PromotionMail 推送邮件类  
+ * 个人理解， 此类唯一能引起变化的就是发送邮件的方法变化
+ * 
+ * */
+public class PromotionMail {
+
+	private static MailUtil mailUtil;
+	public static void main(String[] args) throws Exception {
+
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(emailDebug);
+	}
+
+	public PromotionMail(boolean mailDebug) throws Exception {
+		mailUtil = new MailUtil();
+		mailUtil.sendEMails(mailDebug); 
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/ReadFile.java b/students/675554906/src/lilei/com/cn/ReadFile.java
new file mode 100644
index 000000000..e13a9d644
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/ReadFile.java
@@ -0,0 +1,33 @@
+package lilei.com.cn;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+/**
+ * ReadFile 读取文件类  
+ * 个人理解， 唯一能引发变化的就是文件路径的变动
+ * 
+ * */
+public class ReadFile {
+	
+	private File file;
+	private String filePath = "F:\\product_promotion.txt";
+	
+	protected String[] readFile() throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			file = new File(filePath);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			return data;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/product_promotion.txt b/students/675554906/src/lilei/com/cn/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/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/702282822/ood-assignment/pom.xml b/students/702282822/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/702282822/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/702282822/ood-assignment/product_promotion.txt b/students/702282822/ood-assignment/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/702282822/ood-assignment/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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..44e38129c
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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");
+	}
+	static final String NAME_KEY = "NAME";
+	static final String EMAIL_KEY = "EMAIL";
+	
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public static String getProperty(String key) 
+	{		   
+		return configurations.get(key); 
+	}
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..d131ff0c7
--- /dev/null
+++ b/students/702282822/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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..97909cf56
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,29 @@
+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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java
new file mode 100644
index 000000000..4e3a7d237
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.LinkedList;
+
+public class FileProdUtil {
+	//if other files, need polymorphically present file reading
+	public static void readFile(File file, LinkedList<Theme> themes) throws IOException // @02C
+	{	
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String sCurrentLine = "";
+
+			while ((sCurrentLine = br.readLine()) != null) 
+			{
+				Theme prod = new Product();
+				String[] data = sCurrentLine.split(" ");			
+				prod.setID(data[0]); 
+				prod.setDesc(data[1]); 
+				
+				System.out.println("产品ID = " + prod.getID() + "\n");
+				System.out.println("产品描述 = " + prod.getDesc() + "\n");			
+				themes.add(prod);
+			}			
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..4820d10a1
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,128 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public abstract class Mail {
+	
+	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 sendMailQuery = null;
+	protected LinkedList<Theme> theme;
+	public Mail(File file, boolean emailDebug) throws Exception
+	{
+		theme = new LinkedList<>();
+		FileProdUtil.readFile(file, theme);	
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();						
+		sendEMails(emailDebug, theme);
+	}
+	//protected abstract void readFile(File fie, LinkedList<Theme> theme) throws IOException;	
+		
+	protected void setSMTPHost() 
+	{
+		smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+	
+	
+	protected void setAltSMTPHost() 
+	{
+		altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+	}
+	
+	
+	protected void setFromAddress() 
+	{
+		fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+	
+	protected void setToAddress(HashMap userInfo){
+		toAddress = (String) userInfo.get(Configuration.EMAIL_KEY); 		
+	}	
+			
+	protected List loadMailingList() throws Exception {			//user information, name and email address
+		return DBUtil.query(this.sendMailQuery);
+	}
+		
+		
+	//protected abstract void setMessage(String name) throws IOException;			
+	
+	abstract protected void setSendMailQuery(Theme theme) throws Exception;
+	
+
+	abstract protected void setMessage(String name, Theme theme) throws IOException;
+	
+	
+	protected void emailProcessing(List mailingList, boolean debug, Theme theme) throws Exception	
+	{			
+		if (mailingList != null) 
+		{
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) 
+			{
+				HashMap userInfo = (HashMap) iter.next();				
+				setToAddress(userInfo);				
+				if (toAddress.length() > 0) 
+					setMessage((String)userInfo.get(Configuration.NAME_KEY), theme); 
+				
+				try 
+				{
+					if (toAddress.length() > 0)
+						sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}		
+		}
+		else {
+			System.out.println("没有邮件发送");			
+		}		
+	}
+	
+	
+	
+	protected void sendEMails(boolean debug, LinkedList<Theme> theme) throws Exception 
+	{
+		for(Theme topic : theme)
+		{		
+			setSendMailQuery(topic);	
+			List mailingList = loadMailingList();	//persons
+			
+			System.out.println("开始发送邮件");
+			emailProcessing(mailingList, debug, topic);
+		}
+	}
+	
+	public 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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..1f84e2f08
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp;
+
+public class Product extends Theme {
+
+	
+	
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..d6ef4b8c2
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+
+public class PromotionMail extends Mail {			//inheritance from mail	
+	
+	
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("./product_promotion.txt");		
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(f, emailDebug);
+		
+	}
+	
+	public PromotionMail(File file, boolean mailDebug) throws Exception 
+	{				
+		super(file, mailDebug);		
+	}
+	
+	protected void setSendMailQuery(Theme theme) throws Exception {		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + theme.getID() +"' "
+				+ "and send_mail=1 ";
+				
+		System.out.println("loadQuery set");
+	}
+	
+
+	protected void setMessage(String name, Theme theme) throws IOException 
+	{				
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+ name +", 您关注的产品 " + theme.getDesc() + " 降价了，欢迎购买!" ;						
+	}
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java
new file mode 100644
index 000000000..e2bf2f5e0
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java
@@ -0,0 +1,31 @@
+/**
+ * 
+ */
+package com.coderising.ood.srp;
+
+/**
+ * @author funkyxym
+ *
+ */
+public abstract class Theme {
+	private String ID = ""; 
+	private String Desc = "";
+		
+	protected void setID(String ID) 
+	{ 
+		this.ID = ID; 		
+	} 
+	
+	protected String getID() 
+	{
+		return ID; 
+	}
+		
+	protected void setDesc(String desc) {
+		this.Desc = desc;		
+	}
+	
+	protected String getDesc(){
+		return Desc;		
+	}
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/702282822/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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java"
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/ConfigurationKeys.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/ConfigurationKeys.java"
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java"
new file mode 100644
index 000000000..c3107056d
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java"
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	private String sql;
+	
+	
+    public void setLoadQuery(String productID) throws Exception {
+		
+		 String sql = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		 this.setSql(sql);
+		System.out.println("loadQuery set");
+	}
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public List queryForList(){
+		String query=this.getSql();
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setNAME("User" + i);			
+			userInfo.setEMAIL("aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+	public String getSql() {
+		return sql;
+	}
+	public void setSql(String sql) {
+		this.sql = sql;
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java"
new file mode 100644
index 000000000..53834eba0
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java"
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+
+public class EMail {
+	
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	
+	
+	
+	public EMail(String fromAddress, String toAddress, String subject, String message) {
+		this.fromAddress = fromAddress;
+		this.toAddress = toAddress;
+		this.subject = subject;
+		this.message = message;
+	}
+	
+	
+	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() {
+		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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java"
new file mode 100644
index 000000000..86def7681
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java"
@@ -0,0 +1,20 @@
+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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java"
new file mode 100644
index 000000000..93ec68aae
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java"
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * 产品类
+ * @author Administrator
+ *
+ */
+public class Product {
+	
+	/**
+	 * 产品ID
+	 */
+	private String productID;
+	
+	/**
+	 * 产品描述
+	 */
+	private String 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;
+	}
+	
+	public static Product readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]); 
+			System.out.println("产品ID = " + product.getProductID() + "\n");
+			System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+			return product;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java"
new file mode 100644
index 000000000..1c6225abd
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java"
@@ -0,0 +1,80 @@
+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;
+
+	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
+		Product product=Product.readFile(file);
+		config = new Configuration();
+		Server server =new Server(); 
+		server.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		server.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER)); 
+	    DBUtil dbUtil = new DBUtil();
+	    dbUtil.setLoadQuery(product.getProductID());
+	    List mailingList= dbUtil.queryForList();
+		if (mailingList != null) {
+			System.out.println("开始发送邮件");
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY);
+				String name = (String) userInfo.get(NAME_KEY);
+				String subject = "您关注的产品降价了";
+				String message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+				String fromAddress=config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+				EMail eMail = new EMail(toAddress,fromAddress,subject,message);
+		        sendEMails(eMail,server,mailDebug); 
+		}
+      }else{
+    	  System.out.println("没有邮件发送");
+		}
+	}
+	
+	protected void sendEMails(EMail eMail,Server server,boolean debug) throws IOException {
+				try 
+				{
+					if (eMail.getToAddress().length() > 0)
+						MailUtil.sendEmail(eMail.getToAddress(), eMail.getFromAddress(), eMail.getSubject(), eMail.getMessage(), server.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(eMail.getToAddress(), eMail.getFromAddress(), eMail.getSubject(), eMail.getMessage(), server.getAltSmtpHost(), debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+}
+
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java"
new file mode 100644
index 000000000..37776d9aa
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java"
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp;
+
+
+public class Server {
+	
+	private String smtpHost;
+	private String altSmtpHost;
+	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;
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java"
new file mode 100644
index 000000000..69d901024
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java"
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+public class User {
+	
+	private String NAME;
+	
+	private String EMAIL;
+
+	public String getNAME() {
+		return NAME;
+	}
+
+	public void setNAME(String nAME) {
+		NAME = nAME;
+	}
+
+	public String getEMAIL() {
+		return EMAIL;
+	}
+
+	public void setEMAIL(String eMAIL) {
+		EMAIL = eMAIL;
+	}
+	
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt"
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/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/709960951/ood/ood-assignment/pom.xml b/students/709960951/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..837d9eeed
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/pom.xml
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java
new file mode 100644
index 000000000..b31c6040a
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java
@@ -0,0 +1,40 @@
+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;
+
+import com.coderising.ood.srp.domainlogic.Product;
+import com.coderising.ood.srp.domainlogic.ProductRepository;
+
+public class ConfigProductRepository extends ProductRepository {
+
+	private static final String PRODUCT_PROMOTION_FILE = "com/coderising/ood/srp/product_promotion.txt";
+	@Override
+	public List<Product> getPromotionProducts() throws IOException {
+		BufferedReader br = null;
+		List<Product> products = new ArrayList<>();
+		try {
+			String fileName = Thread.currentThread().getContextClassLoader().getResource(PRODUCT_PROMOTION_FILE)
+					.getFile();
+			br = new BufferedReader(new FileReader(fileName));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			products.add(product);
+			System.out.println("产品ID = " + product.getProductID() + "\n");
+			System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return products;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..868a03ff8
--- /dev/null
+++ b/students/709960951/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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java
new file mode 100644
index 000000000..b47406cc1
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.domainlogic.Email;
+import com.coderising.ood.srp.domainlogic.EmailService;
+
+public class EmailServiceImpl implements EmailService {
+	private boolean debugMode = false; // 调试模式，默认关闭
+	private String priorSmtpHost;
+	private String altSmtpHost;
+
+	public EmailServiceImpl(String priorSmtpHost, String altSmtpHost) {
+		this.priorSmtpHost = priorSmtpHost;
+		this.altSmtpHost = altSmtpHost;
+	}
+
+	@Override
+	public void sendEmail(Email email) {
+
+		try {
+			sendEmail(email, priorSmtpHost);
+		} catch (Exception e) {
+
+			try {
+				sendEmail(email, altSmtpHost);
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+
+	private void sendEmail(Email email,String smtpHost)
+	{
+		// TODO: send email
+		if (isDebugMode()) {
+			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());
+		}
+	}
+
+	public boolean isDebugMode() {
+		return debugMode;
+	}
+
+	public void setDebugMode(boolean debugMode) {
+		this.debugMode = debugMode;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java
new file mode 100644
index 000000000..98c70a6ff
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.domainlogic.User;
+import com.coderising.ood.srp.domainlogic.UserRepository;
+
+public class MockUserRepository extends UserRepository {
+
+	@Override
+	public List<User> getPromotionUsers() {
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..f57df29b3
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.Properties;
+
+import com.coderising.ood.srp.domainlogic.PromotionEmailService;
+
+public class PromotionMail {
+
+	private static final String EMAIL_CONFIG = "com/coderising/ood/srp/emailconfig.properties";
+
+	public static void main(String[] args) throws Exception {
+		// 读取email配置文件
+		Properties emailConfig = new Properties();
+		emailConfig.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(EMAIL_CONFIG));
+		// 获取配置项
+		String priorSmtpHost = ConfigurationKeys.SMTP_SERVER;
+		String altSmtpHost = ConfigurationKeys.ALT_SMTP_SERVER;
+		String fromEmailAddress = ConfigurationKeys.SMTP_SERVER;
+		// 邮件服务的实现
+		EmailServiceImpl emailService = new EmailServiceImpl(priorSmtpHost, altSmtpHost);
+		emailService.setDebugMode(true);
+		// 从配置文件中获取产品信息
+		ConfigProductRepository configProductRepository = new ConfigProductRepository();
+		// 模拟生成邮件的目标用户
+		MockUserRepository mockUserRepository = new MockUserRepository();
+
+		// 促销邮件发送服务
+		PromotionEmailService pes = new PromotionEmailService(emailService, configProductRepository,
+				mockUserRepository);
+		pes.setFromAddress(fromEmailAddress);
+		System.out.println("开始发送邮件");
+		pes.sendEmail();
+	}
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java
new file mode 100644
index 000000000..4c018874e
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The Email domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class Email {
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+
+	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() {
+		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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java
new file mode 100644
index 000000000..9b8f9ac6a
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * the interface of email service.
+ * 
+ * @author silencehe09
+ *
+ */
+public interface EmailService {
+	void sendEmail(Email email);
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java
new file mode 100644
index 000000000..ae1d2353c
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The Product domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class Product {
+	private String productID;
+	private String 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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java
new file mode 100644
index 000000000..0d1e2d2ac
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.io.IOException;
+import java.util.List;
+
+public abstract class ProductRepository {
+	public abstract List<Product> getPromotionProducts() throws IOException;
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java
new file mode 100644
index 000000000..e5b585277
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 促销邮件发送服务，实现具体的邮件发送业务逻辑
+ * 
+ * @author silencehe09
+ *
+ */
+public class PromotionEmailService {
+	private EmailService emailService;
+	private ProductRepository productRepository;
+	private UserRepository userRepository;
+	private String fromAddress;
+
+	public PromotionEmailService(EmailService emailService, ProductRepository productRepository,
+			UserRepository userRepository) {
+		this.emailService = emailService;
+		this.productRepository = productRepository;
+		this.userRepository = userRepository;
+	}
+
+	public void sendEmail() throws IOException {
+		List<User> users = userRepository.getPromotionUsers();
+		List<Product> products = productRepository.getPromotionProducts();
+		for (Product product : products) {
+			for (User user : users) {
+				Email email = new Email();
+				email.setFromAddress(fromAddress);
+				email.setToAddress(user.getEmail());
+				email.setSubject(getEmailSubject());
+				email.setMessage(getEmailMessage(user, product));
+				emailService.sendEmail(email);
+			}
+		}
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	private String getEmailSubject() {
+		return "您关注的产品降价了";
+	}
+
+	private String getEmailMessage(User user, Product product) {
+		return "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+	}
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java
new file mode 100644
index 000000000..1dbe849d3
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The User domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class User {
+	private String name;
+	private String 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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java
new file mode 100644
index 000000000..55274b79f
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.util.List;
+
+public abstract class UserRepository {
+	public abstract List<User> getPromotionUsers();
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties
new file mode 100644
index 000000000..6f5615d18
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties
@@ -0,0 +1,3 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
\ No newline at end of file
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/709960951/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
diff --git a/students/734473301/coding2017jyz/product_promotion.txt b/students/734473301/coding2017jyz/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/734473301/coding2017jyz/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/734473301/coding2017jyz/readme.txt b/students/734473301/coding2017jyz/readme.txt
new file mode 100644
index 000000000..746bb1fdc
--- /dev/null
+++ b/students/734473301/coding2017jyz/readme.txt
@@ -0,0 +1,4 @@
+因为内容不多，也就没有分包，全部放在了一起。
+
+发送邮件的实现方法，最后是放在了host上，可以直接new一个host发送，
+这个方法应该实现在哪个类，这个还需结合实际考虑。
\ No newline at end of file
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java
new file mode 100644
index 000000000..01dbf8d40
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java
@@ -0,0 +1,32 @@
+package homework.jyz.coding2017;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *  主机配置类
+ */
+public class Configuration {
+
+	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";
+
+	private  Map<String,String> configurations = new HashMap<>();
+
+	public Configuration() {
+		configurations.put(SMTP_SERVER, "smtp.163.com");
+		configurations.put(ALT_SMTP_SERVER, "smtp1.163.com");
+		configurations.put(EMAIL_ADMIN, "admin@company.com");
+	}
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+}
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java
new file mode 100644
index 000000000..8e33d1e4d
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java
@@ -0,0 +1,54 @@
+package homework.jyz.coding2017;
+
+/**
+ * 邮件实体信息
+ * Created by jyz on 2017/6/13.
+ */
+public class Email {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email() {
+    }
+
+    public Email(String fromAddress, String toAddress, String subject, String message) {
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    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() {
+        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/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java
new file mode 100644
index 000000000..4299d466f
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java
@@ -0,0 +1,57 @@
+package homework.jyz.coding2017;
+
+/**
+ * 邮件服务器主机类
+ * Created by jyz on 2017/6/13.
+ */
+public class EmailHost {
+    private Configuration config;
+    private String host;
+    private String altHost;
+    private String hostAdmin;
+
+    /**
+     * 构建主机
+     * @param config 主机配置
+     */
+    public EmailHost(Configuration config) {
+        this.config = config;
+        host = this.config.getProperty(Configuration.SMTP_SERVER);
+        altHost = this.config.getProperty(Configuration.ALT_SMTP_SERVER);
+        hostAdmin = this.config.getProperty(Configuration.EMAIL_ADMIN);
+    }
+
+    public boolean send(Email email){
+
+        if(email != null){
+            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");
+            if(send(host,buffer.toString())){
+                return true;
+            }
+            System.out.println("启用备用主机发送..");
+            if(send(altHost,buffer.toString())){
+                return true;
+            }
+            System.out.println("发送失败");
+            return false;
+        }
+        System.out.println("邮件为空，发送失败");
+        return false;
+    }
+
+    public boolean send(String host,String message){
+        try {
+            System.out.println("使用主机"+host+"发送邮件");
+            System.out.println(message);
+            return true;
+        } catch (Exception e) {
+            System.out.println("使用主机"+host+"发送邮件失败");
+            e.printStackTrace();
+            return false;
+        }
+    }
+}
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java
new file mode 100644
index 000000000..2d3a56aac
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java
@@ -0,0 +1,68 @@
+package homework.jyz.coding2017;
+
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 配置邮件信息类
+ * Created by jyz on 2017/6/13.
+ */
+public class MailConfig {
+    private MailDao dao;
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    private String productID = "";
+    private String productDesc = "";
+
+    public MailConfig(MailDao dao) {
+        this.dao = dao;
+    }
+
+    public List getEmails() {
+        List<HashMap> mails = dao.getMails(productID);
+        List<Email> list = new ArrayList<>();
+        for (HashMap map : mails) {
+            Email email = new Email();
+            setMessage(map, email);
+            list.add(email);
+        }
+        return list;
+    }
+
+    private void setMessage(HashMap userInfo, Email email) {
+        String name = (String) userInfo.get(NAME_KEY);
+        email.setSubject("您关注的产品降价了");
+        String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+        email.setMessage(message);
+    }
+
+
+    public  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(" ");
+            productID = data[0];
+            productDesc =  data[1];
+            System.out.println("产品ID = " + productID + "\n");
+            System.out.println("产品描述 = " + productDesc + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if(br != null){
+                br.close();
+            }
+        }
+    }
+}
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java
new file mode 100644
index 000000000..def540076
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java
@@ -0,0 +1,34 @@
+package homework.jyz.coding2017;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 邮件Dao
+ * Created by jyz on 2017/6/13.
+ */
+public class MailDao {
+
+    public List getMails(String productID){
+      String  sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+        return query(sendMailQuery);
+    }
+
+    public static List query(String sql){
+
+        List userList = new ArrayList();
+        for (int i = 1; i <= 3; i++) {
+            HashMap userInfo = new HashMap<String,String>();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+
+        return userList;
+    }
+}
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java
new file mode 100644
index 000000000..d9658cb22
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java
@@ -0,0 +1,41 @@
+package homework.jyz.coding2017;
+
+import java.util.List;
+
+/**
+ * 发送邮件的工作类
+ * Created by jyz on 2017/6/13.
+ */
+public class MailSend {
+
+    private EmailHost host;
+
+    public MailSend(EmailHost host){
+        this.host = host;
+    }
+
+    public MailSend() {
+    }
+
+    /**
+     * 默认主机发送
+     * @param emails
+     */
+    public  void  send(List<Email> emails){
+        emails.forEach(email -> host.send(email));
+    }
+    public  void  send(Email email){
+        host.send(email);
+    }
+    /**
+     * 指定主机发送
+     * @param host
+     * @param emails
+     */
+    public void send(EmailHost host,List<Email> emails){
+        for (Email email : emails) {
+            host.send(email);
+        }
+    }
+
+}
diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java
new file mode 100644
index 000000000..9759223a9
--- /dev/null
+++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java
@@ -0,0 +1,26 @@
+package homework.jyz.coding2017;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ *  主程序类
+ * Created by jyz on 2017/6/13.
+ */
+public class WorkStart {
+    public static void main(String args[]) throws IOException {
+        // 发送邮件程序入口
+        Configuration confg = new Configuration();// 加载配置
+        MailSend ms = new MailSend(new EmailHost(confg));// 创建邮件工作类
+        MailConfig mc  = new MailConfig(new MailDao());// 组织待发送邮件
+        mc.readFile(new File("product_promotion.txt"));// 获取产品信息
+        ms.send(mc.getEmails());// 批量发送
+
+        Email email = new Email("from@qq.com","to@qq.com","coding2017","hello,world!");
+        ms.send(email); // 单个发送
+
+    }
+
+
+
+}
diff --git a/students/740707954/readMe b/students/740707954/readMe
new file mode 100644
index 000000000..f83157926
--- /dev/null
+++ b/students/740707954/readMe
@@ -0,0 +1,2 @@
+TEST1
+2017.06.17
\ No newline at end of file
diff --git a/students/740707954/src/ood/newSrp/MailSender.java b/students/740707954/src/ood/newSrp/MailSender.java
new file mode 100644
index 000000000..14604b2c1
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/MailSender.java
@@ -0,0 +1,73 @@
+package ood.newSrp;
+
+import ood.newSrp.entity.Email;
+import ood.newSrp.entity.Product;
+import ood.newSrp.server.MainSmtpFactory;
+import ood.newSrp.server.SmtpServer;
+import ood.newSrp.server.TempSmtpFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 邮件发送器
+ * Created by lx on 2017/6/17.
+ */
+public class MailSender {
+
+    protected SmtpServer mainServer = new MainSmtpFactory().createSmtp();
+    protected SmtpServer tempServer = new TempSmtpFactory().createSmtp();
+    public static final String NAME_KEY = "NAME";
+
+    /**
+     * 批量发送邮件
+     * @param p 产品信息
+     * @param sendUserList 用户信息
+     * @param d
+     * @throws IOException
+     */
+    public void batchSendEMail(Product p, List<Map> sendUserList, boolean d) throws IOException {
+        System.out.println("--------开始发送邮件-------");
+        if (null == sendUserList || sendUserList.size() == 0) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+
+        for (Map userInfo : sendUserList) {
+            Email email = new Email();
+            String toAddr = userInfo.get("EMAIL").toString();
+            email.setToAddress(toAddr);
+            email.setFromAddress(mainServer.address);
+            email.setSubject("您关注的产品降价了");
+            email.setMessage("尊敬的 " + userInfo.get(NAME_KEY).toString() + ", 您关注的产品 " + p.getProductDesc() + " 降价了，欢迎购买!");
+            try {
+                sendEmail(email, d);
+            } catch (Exception e) {
+                try {
+                    email.setFromAddress(tempServer.address);
+                    sendEmail(email, d);
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 发送邮件
+     * @param n
+     * @param debug
+     */
+    public static void sendEmail(Email n, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(n.getFromAddress()).append("\n");
+        buffer.append("To:").append(n.getToAddress()).append("\n");
+        buffer.append("Subject:").append(n.getSubject()).append("\n");
+        buffer.append("Content:").append(n.getMessage()).append("\n");
+        System.out.println(buffer.toString());
+
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/PromotionMail.java b/students/740707954/src/ood/newSrp/PromotionMail.java
new file mode 100644
index 000000000..74cb9741d
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/PromotionMail.java
@@ -0,0 +1,32 @@
+package ood.newSrp;
+
+import ood.newSrp.entity.Product;
+import ood.newSrp.server.UserServer;
+import ood.newSrp.server.ProductServer;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  promotion 提升
+ */
+public class PromotionMail {
+    // 用户信息
+    private static UserServer ms = new UserServer();
+    // 邮件发送器
+    private static MailSender mSend = new MailSender();
+
+    public static void main(String[] args) throws Exception {
+        // 获取产品信息
+        List<Product> pList = ProductServer.getUserProduct();
+
+        for (Product p : pList) {
+            System.out.println("产品ID： " + p.getProductId() + "\n" + "产品描述：" + p.getProductDesc());
+            // 获取接收产品用户列表
+            List<Map> sendUserList = ms.querySendUser(p.getProductId());
+            // 发送邮件
+            mSend.batchSendEMail(p, sendUserList, false);
+        }
+
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/conf/Configuration.java b/students/740707954/src/ood/newSrp/conf/Configuration.java
new file mode 100644
index 000000000..37bf3f3a5
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/conf/Configuration.java
@@ -0,0 +1,26 @@
+package ood.newSrp.conf;
+
+import ood.oldSrp.ConfigurationKeys;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/740707954/src/ood/newSrp/entity/Email.java b/students/740707954/src/ood/newSrp/entity/Email.java
new file mode 100644
index 000000000..17159b916
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/Email.java
@@ -0,0 +1,57 @@
+package ood.newSrp.entity;
+
+/**
+ * 邮件
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class Email {
+    private String subject;
+    private String message;
+    private String toAddress;
+    private String fromAddress;
+    private String smtpHost;
+
+    public Email() {
+
+    }
+
+    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 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 getSmtpHost() {
+        return smtpHost;
+    }
+
+    public void setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/entity/Product.java b/students/740707954/src/ood/newSrp/entity/Product.java
new file mode 100644
index 000000000..4fc38aacb
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/Product.java
@@ -0,0 +1,35 @@
+package ood.newSrp.entity;
+
+/**
+ * 产品信息
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class Product {
+    private String productId = null;
+    private String productDesc = null;
+
+    public Product() {
+
+    }
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/product_promotion.txt b/students/740707954/src/ood/newSrp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/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/740707954/src/ood/newSrp/server/MainSmtpFactory.java b/students/740707954/src/ood/newSrp/server/MainSmtpFactory.java
new file mode 100644
index 000000000..5dcfdc5a5
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/MainSmtpFactory.java
@@ -0,0 +1,11 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class MainSmtpFactory implements SmtpFactory {
+    @Override
+    public SmtpServer createSmtp() {
+        return new MainSmtpServer();
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/MainSmtpServer.java b/students/740707954/src/ood/newSrp/server/MainSmtpServer.java
new file mode 100644
index 000000000..6e9be0a9a
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/MainSmtpServer.java
@@ -0,0 +1,30 @@
+package ood.newSrp.server;
+
+import ood.newSrp.conf.Configuration;
+import ood.oldSrp.ConfigurationKeys;
+
+/**
+ * 主要服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class MainSmtpServer extends SmtpServer {
+
+    public MainSmtpServer() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        host = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+
+    /**
+     * 设置服务器地址
+     */
+    public void setServerAddr() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    /**
+     * 设置服务器host
+     */
+    public void setServerHost() {
+        host = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/ProductServer.java b/students/740707954/src/ood/newSrp/server/ProductServer.java
new file mode 100644
index 000000000..db8efa8bc
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/ProductServer.java
@@ -0,0 +1,55 @@
+package ood.newSrp.server;
+
+import ood.newSrp.entity.Product;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *产品服务
+ * Created by lx on 2017/6/17.
+ */
+public class ProductServer {
+    private static List<Product> pList = new ArrayList<>();
+    static {
+        try {
+            initSpecialProductList();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 生成优惠产品信息
+     * @return
+     * @throws IOException
+     */
+    private static void initSpecialProductList() throws IOException {
+        String filePath = System.getProperty("user.dir") + "/src/ood/oldSrp/product_promotion.txt";
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(filePath));
+            String pInfo;
+            while ((pInfo  = br.readLine()) != null) {
+                String[] data = pInfo.split(" ");
+                pList.add(new Product(data[0], data[1]));
+            }
+        } catch (IOException e) {
+            throw new IOException( "读取文件内容失败 " + e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+    }
+
+    /**
+     * 获取用户的产品
+     * @return
+     */
+    public static List<Product> getUserProduct() {
+        return pList;
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/SmtpFactory.java b/students/740707954/src/ood/newSrp/server/SmtpFactory.java
new file mode 100644
index 000000000..efdf3ec25
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/SmtpFactory.java
@@ -0,0 +1,8 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public interface SmtpFactory {
+    public SmtpServer createSmtp();
+}
\ No newline at end of file
diff --git a/students/740707954/src/ood/newSrp/server/SmtpServer.java b/students/740707954/src/ood/newSrp/server/SmtpServer.java
new file mode 100644
index 000000000..ff35288d1
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/SmtpServer.java
@@ -0,0 +1,19 @@
+package ood.newSrp.server;
+
+/**
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public abstract class SmtpServer {
+    public String address = "";
+    public String host = "";
+
+    /**
+     * 设置服务器地址
+     */
+    abstract void setServerAddr();
+
+    /**
+     * 设置服务器host
+     */
+    abstract void setServerHost();
+}
diff --git a/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java b/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java
new file mode 100644
index 000000000..ae16252fd
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java
@@ -0,0 +1,11 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class TempSmtpFactory implements SmtpFactory {
+    @Override
+    public SmtpServer createSmtp() {
+        return new TempSmtpServer();
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/TempSmtpServer.java b/students/740707954/src/ood/newSrp/server/TempSmtpServer.java
new file mode 100644
index 000000000..417cd8acd
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/TempSmtpServer.java
@@ -0,0 +1,29 @@
+package ood.newSrp.server;
+
+import ood.newSrp.conf.Configuration;
+import ood.oldSrp.ConfigurationKeys;
+
+/**
+ * 备用服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class TempSmtpServer extends SmtpServer {
+
+    public TempSmtpServer() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        host = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+    /**
+     * 设置服务器地址
+     */
+    public void setServerAddr() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    /**
+     * 设置服务器host
+     */
+    public void setServerHost() {
+        host = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/UserServer.java b/students/740707954/src/ood/newSrp/server/UserServer.java
new file mode 100644
index 000000000..0c9864eab
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/UserServer.java
@@ -0,0 +1,19 @@
+package ood.newSrp.server;
+
+import ood.newSrp.util.DBUtil;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class UserServer {
+
+    /**
+     * 查询发送人
+     * @return
+     */
+    public List<Map> querySendUser(String productId){
+        return DBUtil.query("Select name from subscriptions where product_id= '" + productId + "' and send_mail=1 ");
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/util/DBUtil.java b/students/740707954/src/ood/newSrp/util/DBUtil.java
new file mode 100644
index 000000000..c1866fd92
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/util/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.newSrp.util;
+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/740707954/src/ood/oldSrp/Configuration.java b/students/740707954/src/ood/oldSrp/Configuration.java
new file mode 100644
index 000000000..9a1a4d075
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/Configuration.java
@@ -0,0 +1,23 @@
+package ood.oldSrp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/740707954/src/ood/oldSrp/ConfigurationKeys.java b/students/740707954/src/ood/oldSrp/ConfigurationKeys.java
new file mode 100644
index 000000000..154ea2c77
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.oldSrp;
+
+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/740707954/src/ood/oldSrp/DBUtil.java b/students/740707954/src/ood/oldSrp/DBUtil.java
new file mode 100644
index 000000000..2397e15ad
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.oldSrp;
+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/740707954/src/ood/oldSrp/MailUtil.java b/students/740707954/src/ood/oldSrp/MailUtil.java
new file mode 100644
index 000000000..71c229b37
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/MailUtil.java
@@ -0,0 +1,18 @@
+package ood.oldSrp;
+
+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/740707954/src/ood/oldSrp/PromotionMail.java b/students/740707954/src/ood/oldSrp/PromotionMail.java
new file mode 100644
index 000000000..2edbd5bf4
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/PromotionMail.java
@@ -0,0 +1,180 @@
+package ood.oldSrp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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(System.getProperty("user.dir") + "/src/ood/oldSrp/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/740707954/src/ood/oldSrp/product_promotion.txt b/students/740707954/src/ood/oldSrp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/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/75939388/.gitignore b/students/75939388/.gitignore
new file mode 100644
index 000000000..d3a81f6bd
--- /dev/null
+++ b/students/75939388/.gitignore
@@ -0,0 +1,10 @@
+target/
+.idea/
+ood/target/
+datastrure/target/
+
+*.class
+*.jar
+*.war
+*.zip
+*.iml
diff --git a/students/75939388/datastrure/pom.xml b/students/75939388/datastrure/pom.xml
new file mode 100644
index 000000000..b17b9fe45
--- /dev/null
+++ b/students/75939388/datastrure/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>season2</artifactId>
+        <groupId>learning2017</groupId>
+        <version>2.0-SEASON2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datastrure</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java b/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java
new file mode 100644
index 000000000..f0802fdce
--- /dev/null
+++ b/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java
@@ -0,0 +1,10 @@
+package tree;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class BinaryTreeNode {
+    /**
+     * 二叉树
+     */
+}
diff --git a/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
new file mode 100644
index 000000000..90705ddca
--- /dev/null
+++ b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
@@ -0,0 +1,22 @@
+package tree;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class BinaryTreeNodeTest {
+
+    BinaryTreeNode tree;
+
+    @Before
+    public void init(){
+        tree = new BinaryTreeNode();
+    }
+
+    @Test
+    public void test1(){
+
+    }
+}
diff --git a/students/75939388/ood/pom.xml b/students/75939388/ood/pom.xml
new file mode 100644
index 000000000..e6a1b1de5
--- /dev/null
+++ b/students/75939388/ood/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>season2</artifactId>
+        <groupId>learning2017</groupId>
+        <version>2.0-SEASON2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ood</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/original/PromotionMail.java b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
new file mode 100644
index 000000000..8deec6016
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
@@ -0,0 +1,202 @@
+package srp.original;
+
+import srp.refactor.configuration.Configuration;
+import srp.refactor.configuration.ConfigurationKeys;
+import srp.refactor.util.DBUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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){}
+//						MailContentUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+//						MailContentUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java
new file mode 100644
index 000000000..6335f4f86
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java
@@ -0,0 +1,72 @@
+package srp.refactor;
+
+import srp.refactor.configuration.Configuration;
+import srp.refactor.configuration.ConfigurationKeys;
+import srp.refactor.domain.Product;
+import srp.refactor.domain.User;
+import srp.refactor.mail.MailClient;
+import srp.refactor.services.ProductService;
+import srp.refactor.services.UserService;
+
+import java.util.List;
+
+/**
+ * 在原有的MailClient邮件功能的基础上修改而来的促销邮件发送端
+ *
+ * 根据SRP原则，这个邮件客户端只有两个职责：
+ *     解析传进来的List<Product>，然后批量保存至超类的待发送邮件列表中
+ *     全部解析完成(数据量较大时需要设置阈值)后
+ *     由用户发起发送请求
+ *
+ * Created by Tee on 2017/6/15.
+ */
+public class PromotionMailClient extends MailClient {
+
+    private static Configuration config = new Configuration();
+
+    private UserService userService = new UserService();
+    private ProductService productService = new ProductService();
+
+    private void init(){
+        super.initMailSettings(
+                config.getProperty(ConfigurationKeys.SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.EMAIL_ADMIN)
+        );
+    }
+
+    public PromotionMailClient(){
+        init();
+    }
+
+    @Override
+    public void createMail(String toAddress, String subject, String message){
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+        super.addToMailList();
+    }
+
+    /**
+     * 批量编写邮件
+     * @param promotionProducts 促销中的所有产品
+     * @throws Exception 查询sql时报的异常，这里选择不处理
+     */
+    public void batchWrite(List<Product> promotionProducts) throws Exception{
+        if(promotionProducts.isEmpty()){
+            throw new RuntimeException("没有商品待促销不能为空");
+        }
+        for(Product product : promotionProducts){
+            String querySql = productService.getLoadQuerySql(product.getProductId());
+            List<User> userList = userService.getUserList(querySql);
+            for(User user : userList){
+                String add = user.getEmail();
+                String subj = "您关注的" + product.getProductDesc() + "已降价";
+                String msg = "尊敬的 "+ user.getName() +", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+                createMail(add, subj, msg);
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java
new file mode 100644
index 000000000..b3b24944d
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java
@@ -0,0 +1,23 @@
+package srp.refactor.configuration;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java
new file mode 100644
index 000000000..9b1cfe8dc
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package srp.refactor.configuration;
+
+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/75939388/ood/src/main/java/srp/refactor/domain/Product.java b/students/75939388/ood/src/main/java/srp/refactor/domain/Product.java
new file mode 100644
index 000000000..955ab2849
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/domain/Product.java
@@ -0,0 +1,30 @@
+package srp.refactor.domain;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class Product {
+    private String productId;
+    private String productDesc;
+
+    public Product(String productId, String productDesc){
+        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/75939388/ood/src/main/java/srp/refactor/domain/User.java b/students/75939388/ood/src/main/java/srp/refactor/domain/User.java
new file mode 100644
index 000000000..4167396f8
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/domain/User.java
@@ -0,0 +1,30 @@
+package srp.refactor.domain;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class User {
+    private String name;
+    private String email;
+
+    public User(String name, String email){
+        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/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java b/students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java
new file mode 100644
index 000000000..3ca783fe0
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java
@@ -0,0 +1,95 @@
+package srp.refactor.mail;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.services.MailService;
+import srp.refactor.util.Constants;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 具有初始化设置、可以批量发送邮件的邮件客户端
+ *
+ * Created by Tee on 2017/6/15.
+ */
+public abstract class MailClient {
+    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 List<HashMap> mailList;
+
+    private MailService mailService = new MailService();
+    /**
+     * 初始化邮件设置
+     *
+     * @param smtpHost smtp主机
+     * @param altSmtpHost 备用smtp主机
+     * @param fromAddress 发件人地址
+     */
+    protected void initMailSettings(String smtpHost, String altSmtpHost, String fromAddress){
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.mailList = new ArrayList<>();
+    }
+
+    public abstract void createMail(String toAddress, String subject, String message);
+
+    /**
+     * 撰写邮件
+     */
+    protected void addToMailList(){
+        HashMap<String, Object> mailToSend = new HashMap<>();
+        mailToSend.put(Constants.EmailInfo.TO_ADDRESS_KEY.getKey(), this.toAddress);
+        mailToSend.put(Constants.EmailInfo.SUBJECT_KEY.getKey(), this.subject);
+        mailToSend.put(Constants.EmailInfo.MESSAGE_KEY.getKey(), this.message);
+        this.mailList.add(mailToSend);
+    }
+
+    private boolean isInit(){
+        return StringUtils.isNotBlank(this.smtpHost) &&
+                StringUtils.isNotBlank(this.altSmtpHost) &&
+                StringUtils.isNotBlank(this.fromAddress);
+    }
+
+    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 fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    /**
+     * 调用邮件邮件服务器来收发邮件
+     * @param debug
+     */
+    public void batchSend(boolean debug){
+        if(!isInit()){
+            throw new RuntimeException("邮件客户端还未做配置");
+        }
+
+        mailService.batchSend(debug, this, this.mailList);
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java b/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java
new file mode 100644
index 000000000..27bcb3838
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java
@@ -0,0 +1,66 @@
+package srp.refactor.services;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.mail.MailClient;
+import srp.refactor.util.Constants;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 邮件收发服务
+ *
+ * Created by Tee on 2017/6/16.
+ */
+public class MailService {
+
+
+    /**
+     * 批量发送
+     */
+    public void batchSend(boolean debug, MailClient mailClient, List<HashMap> mailList){
+        if(mailList.isEmpty()){
+            System.out.println("没有邮件要发送");
+            return;
+        }
+        int size = mailList.size();
+        System.out.println("开始发送邮件, 总邮件数=" + size);
+        int i = 0;
+        for(HashMap mail : mailList){
+            i++;
+            String toAddress = (String)mail.get(Constants.EmailInfo.TO_ADDRESS_KEY.getKey());
+            if(StringUtils.isBlank(toAddress)){
+                System.out.println("收件人地址为空，此邮件发送中止");
+                continue;
+            }
+
+            String subject = (String)mail.get(Constants.EmailInfo.SUBJECT_KEY.getKey());
+            String message = (String)mail.get(Constants.EmailInfo.MESSAGE_KEY.getKey());
+
+            System.out.println("\n正在发送第[" + i + "]封邮件");
+            System.out.println("==========================================================");
+            try{
+                sendEmail(toAddress, mailClient.getFromAddress(), subject, message, mailClient.getSmtpHost(), debug);
+            }catch(Exception e){
+                sendEmail(toAddress, mailClient.getFromAddress(), subject, message, mailClient.getAltSmtpHost(), debug);
+            }
+            System.out.println("==========================================================");
+            System.out.println("第[" + i + "]封邮件发送完成");
+        }
+    }
+
+    /**
+     * 发送邮件客户端的功能和责任，所以移入邮件客户端，但是只能被基础客户端调用
+     * 子类只能通过batchSend来发送邮件
+     */
+    public 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.print(buffer.toString());
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java b/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java
new file mode 100644
index 000000000..a1484520d
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java
@@ -0,0 +1,38 @@
+package srp.refactor.services;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.domain.Product;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class ProductService {
+
+    public Product setPromotionInfo(String productId, String productDesc){
+        return new Product(productId, productDesc);
+    }
+
+    public String getLoadQuerySql(String productID){
+        if(StringUtils.isBlank(productID)){
+            throw new RuntimeException("没有获取到productID");
+        }
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set, productID -> " + productID);
+        return sendMailQuery;
+    }
+
+    public List<Product> getPromotionInfoList(List<String> data){
+        List<Product> list = new ArrayList<>();
+        for(int i = 0; i < data.size(); i += 2){
+            list.add(setPromotionInfo(data.get(i), data.get(i + 1)));
+        }
+        return list;
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java b/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java
new file mode 100644
index 000000000..403c9d8a9
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java
@@ -0,0 +1,31 @@
+package srp.refactor.services;
+
+import srp.refactor.domain.User;
+import srp.refactor.util.DBUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class UserService {
+
+    public User setUser(String userName, String email){
+        return new User(userName, email);
+    }
+
+    public List<User> getUserList(String sql){
+        List<HashMap> userMapList = DBUtil.query(sql);
+        List<User> userList = new ArrayList<>();
+        for(HashMap map : userMapList){
+            userList.add(setUser(
+                    (String)map.get("NAME"),
+                    (String)map.get("EMAIL"))
+            );
+        }
+
+        return userList;
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java b/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java
new file mode 100644
index 000000000..88633b1fa
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java
@@ -0,0 +1,21 @@
+package srp.refactor.util;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class Constants {
+    public enum EmailInfo{
+        TO_ADDRESS_KEY("toAddress"),
+        SUBJECT_KEY("subject"),
+        MESSAGE_KEY("message");
+
+        private String key;
+        EmailInfo(String key){
+            this.key = key;
+        }
+
+        public String getKey(){
+            return this.key;
+        }
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java
new file mode 100644
index 000000000..00aa26360
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java
@@ -0,0 +1,25 @@
+package srp.refactor.util;
+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<HashMap> 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/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java
new file mode 100644
index 000000000..a1fbdca90
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java
@@ -0,0 +1,39 @@
+package srp.refactor.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class FileUtil {
+
+    public static List<String> readFile(File file)throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String tmp = null;
+            List<String> data = new ArrayList<>();
+            while((tmp = br.readLine()) != null){
+                String[] temp = tmp.split(" ");
+                data.add(temp[0]);
+                data.add(temp[1]);
+            }
+
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e);
+        } finally {
+            try{
+                br.close();
+            }catch(Exception e){
+                e.printStackTrace();
+            }
+
+        }
+    }
+}
diff --git a/students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt b/students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/75939388/ood/src/main/resources/ood_demo_file/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/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java
new file mode 100644
index 000000000..c55f54b1d
--- /dev/null
+++ b/students/75939388/ood/src/test/java/srp/SrpTest.java
@@ -0,0 +1,41 @@
+package srp;
+
+import org.junit.Before;
+import org.junit.Test;
+import srp.refactor.PromotionMailClient;
+import srp.refactor.domain.Product;
+import srp.refactor.services.ProductService;
+import srp.refactor.util.FileUtil;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class SrpTest {
+
+    PromotionMailClient promotionMail = null;
+
+    private static int in = 0;
+
+    @Before
+    public void init(){
+
+    }
+
+    /**
+     * 重构后的代码尝试运行
+     */
+    @Test
+    public void runTrial() throws Exception{
+        File file = new File("/Users/Tee/Code/learning2017/season2/coding2017/" +
+                "students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt");
+        List<String> data = FileUtil.readFile(file);
+
+        PromotionMailClient promotionMail = new PromotionMailClient();
+        List<Product> promotionProducts = new ProductService().getPromotionInfoList(data);
+        promotionMail.batchWrite(promotionProducts);
+        promotionMail.batchSend(false);
+    }
+}
diff --git a/students/75939388/pom.xml b/students/75939388/pom.xml
new file mode 100644
index 000000000..e5dd20227
--- /dev/null
+++ b/students/75939388/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>learning2017</groupId>
+    <artifactId>season2</artifactId>
+    <version>2.0-SEASON2</version>
+
+    <modules>
+        <!-- 数据结构模块 -->
+        <module>datastrure</module>
+        <!-- 面向对象设计 -->
+        <module>ood</module>
+    </modules>
+
+    <url>https://github.com/macvis/coding2017</url>
+    <description>
+        2017编程能力提高，第二季。
+        teacher：刘欣
+        gitHub:  https://github.com/onlyliuxin/coding2017.git
+        student: TerrenceWen
+    </description>
+
+    <developers>
+        <developer>
+            <name>TerrenceWen</name>
+            <url>https://github.com/macvis/</url>
+            <email>macvis@126.com</email>
+        </developer>
+    </developers>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.targetJdk>1.8</project.build.targetJdk>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+    </properties>
+
+    <!-- 阿里云镜像 -->
+    <repositories>
+        <repository>
+            <id>aliyun</id>
+            <name>aliyun</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+            <releases>
+                <enabled>true</enabled>
+                <updatePolicy>never</updatePolicy>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <!--junit-->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+        <!--dom4j-->
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+
+        <!--jaxen-->
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+            <version>1.1.6</version>
+        </dependency>
+
+        <!--apache工具类包-->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/students/759412759/ood-assignment/pom.xml b/students/759412759/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/759412759/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java
new file mode 100644
index 000000000..18b61a77b
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp;
+
+/**
+ * 日期类型格式化模板
+ * Created by Tudou on 2017/6/19.
+ */
+public class DateFormater extends Formater {
+
+    @Override
+    public String formatMessage(String message) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return txtDate + " : " + message;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..b6cf28c09
--- /dev/null
+++ b/students/759412759/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/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java
new file mode 100644
index 000000000..7a94fea74
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * 格式化打印参数基类
+ * Created by Tudou on 2017/6/19.
+ */
+public class Formater {
+
+    public String formatMessage(String message){
+        return message;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..a9f62d6a6
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+    private Printer printer;
+    private Formater formater;
+
+
+    public Logger(Printer printer, Formater formater) {
+        this.printer = printer;
+        this.formater = formater;
+    }
+
+
+    public void log(String msg) {
+        String logMsg = formater.formatMessage(msg);
+        printer.print(logMsg);
+    }
+}
+
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java
new file mode 100644
index 000000000..d522e5e7d
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+
+public class MailPrintUtil extends Printer {
+
+	@Override
+	public void print(String msg) {
+
+	}
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java
new file mode 100644
index 000000000..caa28fbf0
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by Tudou on 2017/6/19.
+ */
+public class Printer {
+
+    public void print(String msg){
+        System.out.println(msg);
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java
new file mode 100644
index 000000000..204256f44
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class SMSPrintUtil extends Printer {
+
+	@Override
+	public void print(String msg) {
+
+	}
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..7616041c0
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String,String>();
+
+	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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/759412759/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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..0bef2d57c
--- /dev/null
+++ b/students/759412759/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<HashMap<String,String>> query(String sql){
+		List<HashMap<String,String>> userList = new ArrayList<HashMap<String,String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String,String> userInfo = new HashMap<String,String>();
+			userInfo.put("NAME", "User" + i);			
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+
+
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 000000000..49f0db842
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,81 @@
+package com.coderising.ood.srp;
+
+
+public class Mail {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+
+    private String toAddress;
+    private String subject;
+    private String message;
+    private boolean debug;
+
+
+    public Mail() {
+
+    }
+
+    public void init() {
+        smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    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 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() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public boolean getDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..2820127c4
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+
+
+public class MailUtil {
+
+    public static boolean sendEmail(Mail mail) {
+        //假装发了一封邮件
+        if(mail.getToAddress().length() < 0){
+            return Boolean.FALSE;
+        }
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(mail.getFromAddress()).append("\n");
+        buffer.append("To:").append(mail.getToAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSmtpHost()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        buffer.append("smtpHost:").append(mail.getSmtpHost()).append("\n");
+        buffer.append("isDebug:").append(mail.getDebug() ? "1" : "0").append("\n");
+        System.out.println(buffer.toString());
+        return Boolean.TRUE;
+    }
+
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..860f584fa
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+
+
+    public Product() {
+
+    }
+
+    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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
new file mode 100644
index 000000000..18674e010
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class ProductService {
+
+    public static Product loadProductFromFile(String filePath) throws IOException {
+        Product product = new Product();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(new File(filePath)));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return product;
+    }
+
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..015b68ff1
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+import java.util.*;
+
+public class PromotionMail {
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    public static void main(String[] args) throws Exception {
+
+        UserService userService = new UserService();
+        PromotionMail pe = new PromotionMail();
+
+        String path = "F:\\IDEA_PRO_01\\coderrising\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+        Product product = ProductService.loadProductFromFile(path);
+        List<HashMap<String, String>> list = userService.loadMailingList(product.getProductID());
+
+        pe.sendEMails(list,product,Boolean.FALSE);
+    }
+
+    private void sendEMails(List<HashMap<String, String>> mailingList, Product product, boolean debug) throws IOException {
+        System.out.println("开始发送邮件");
+        if (mailingList != null) {
+            Iterator<HashMap<String, String>> iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                HashMap<String, String> userInfo = iter.next();
+                Mail mail = getMail(product, debug, userInfo);
+                try {
+                    boolean flag = MailUtil.sendEmail(mail);
+                    if (!flag) {
+                        mail.setSmtpHost(mail.getAltSmtpHost());
+                        MailUtil.sendEmail(mail);
+                    }
+                } catch (Exception e) {
+                    try {
+                        mail.setSmtpHost(mail.getAltSmtpHost());
+                        MailUtil.sendEmail(mail);
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP 服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+    private Mail getMail(Product product, boolean debug, HashMap<String, String> userInfo) {
+        Mail mail = new Mail();
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 " + userInfo.get(NAME_KEY) + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+        mail.init();
+        mail.setToAddress(userInfo.get(EMAIL_KEY));
+        mail.setSubject(subject);
+        mail.setMessage(message);
+        mail.setDebug(debug);
+        return mail;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
new file mode 100644
index 000000000..80dc46eda
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class UserService {
+
+    public List<HashMap<String, String>> loadMailingList(String productId) throws Exception {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..46c64c6e6
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1 @@
+P8756 iPhone8
\ No newline at end of file
diff --git a/students/765324639/ood/ood-assignment/pom.xml b/students/765324639/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..cb72faa5f
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/765324639/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<String,String> 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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/765324639/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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..60c50b34f
--- /dev/null
+++ b/students/765324639/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<UserInfo> query(String sql){
+		
+		List<UserInfo> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			UserInfo userInfo = new UserInfo();
+			userInfo.setUsername("User" + i);
+			userInfo.setEmail("aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
new file mode 100644
index 000000000..dcb42dcc9
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+public class MailInfo {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    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() {
+        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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..614de5a43
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailUtil {
+
+	public static void sendEmail(List<MailInfo> mailInfoList, boolean debug) {
+	    if (mailInfoList == null && mailInfoList.size() == 0) {
+            System.out.println("无邮件发送");
+            return;
+        }
+        System.out.println("开始发送邮件");
+        for (MailInfo mailInfo : mailInfoList) {
+	        sendEmail(mailInfo, debug);
+        }
+    }
+
+	public static void sendEmail(MailInfo mailInfo, boolean debug) {
+	    Configuration configuration = new Configuration();
+	    String smtpServer = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+	    String altSmtpServer = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        String emailAdmin = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        try {
+            send(mailInfo.getToAddress(), emailAdmin, mailInfo.getSubject(), mailInfo.getMessage(), smtpServer, debug);
+        } catch (Exception e) {
+            try {
+                send(mailInfo.getToAddress(), emailAdmin, mailInfo.getSubject(), mailInfo.getMessage(), altSmtpServer, debug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+    public static void send(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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..888787054
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+public class Product {
+    private String id;
+    private String 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;
+    }
+
+    @Override
+    public String toString() {
+        return "Product{" +
+            "id='" + id + '\'' +
+            ", desc='" + desc + '\'' +
+            '}';
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java
new file mode 100644
index 000000000..3e1660608
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ProductInfoReader {
+
+    protected static List<Product> readProductInfo() {
+        File file = new File("E:\\coding2017\\students\\765324639\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        List<Product> productList = new ArrayList<>();
+        try (BufferedReader br = new BufferedReader(new FileReader(file));) {
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setId(data[0]);
+                product.setDesc(data[1]);
+                productList.add(product);
+                System.out.println("产品ID = " + data[0]);
+                System.out.println("产品描述 = " + data[1] + "\n");
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return productList;
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..b47f45163
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,40 @@
+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 {
+
+	public static void main(String[] args) throws Exception {
+
+        List<Product> productList = ProductInfoReader.readProductInfo();
+
+        for (Product product : productList) {
+            List<UserInfo> userInfoList = UserInfoReader.readUserInfo(product.getId());
+            List<MailInfo> mailInfoList = generateEmails(product, userInfoList);
+            boolean emailDebug = false;
+            MailUtil.sendEmail(mailInfoList, emailDebug);
+        }
+
+	}
+
+    public static List<MailInfo> generateEmails(Product product, List<UserInfo> userInfoList) {
+	    List<MailInfo> mailInfoList = new ArrayList<>();
+	    for (UserInfo userInfo : userInfoList) {
+            MailInfo mailInfo = new MailInfo();
+            mailInfo.setToAddress(userInfo.getEmail());
+            mailInfo.setSubject("您关注的产品降价了");
+            mailInfo.setMessage("尊敬的 "+ userInfo.getUsername() +", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!");
+            mailInfoList.add(mailInfo);
+        }
+        return mailInfoList;
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 000000000..c4f501a3f
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+public class UserInfo {
+    private String username;
+    private String email;
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "UserInfo{" +
+            "username='" + username + '\'' +
+            ", email='" + email + '\'' +
+            '}';
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java
new file mode 100644
index 000000000..edfe66d82
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserInfoReader {
+
+    public static List<UserInfo> readUserInfo(String productID) {
+        String sendMailQuery = "Select name from subscriptions "
+            + "where product_id= '" + productID +"' "
+            + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return DBUtil.query(sendMailQuery);
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/765324639/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
diff --git a/students/769232552/season_two/pom.xml b/students/769232552/season_two/pom.xml
new file mode 100644
index 000000000..e71b8c044
--- /dev/null
+++ b/students/769232552/season_two/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com</groupId>
+    <artifactId>season_two</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+</project>
\ No newline at end of file
diff --git a/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java b/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java
new file mode 100644
index 000000000..89801f662
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package work01.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/769232552/season_two/src/main/java/work01/srp/Mail.java b/students/769232552/season_two/src/main/java/work01/srp/Mail.java
new file mode 100644
index 000000000..79ddb9c94
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/Mail.java
@@ -0,0 +1,73 @@
+package work01.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+public class Mail {
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    private Product product;
+    private String toAddress;
+    private String subject;
+    private String message;
+    private String sendMailQuery;
+
+
+    public Mail(Product product){
+        this.product = product;
+    }
+
+    public List loadMailingList() throws Exception {
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+    public void generateMail(HashMap userInfo) throws IOException {
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0){
+            setMessage(userInfo);
+            setLoadQuery();
+            setToAddress(toAddress);
+        }
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        this.message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        this.subject = "您关注的产品降价了";
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setLoadQuery()  {
+        this.sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() +"' "
+                + "and send_mail=1 ";
+    }
+
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/MailBox.java b/students/769232552/season_two/src/main/java/work01/srp/MailBox.java
new file mode 100644
index 000000000..a7fccfaae
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/MailBox.java
@@ -0,0 +1,43 @@
+package work01.srp;
+
+public class MailBox {
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    public void setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+
+    public void setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public void sendEmail(Mail mail, String smtpHost, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(fromAddress).append("\n");
+        buffer.append("To:").append(mail.getToAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSubject()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        buffer.append("SMTPHost:").append(smtpHost).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java b/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java
new file mode 100644
index 000000000..024119cd1
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java
@@ -0,0 +1,62 @@
+package work01.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MailBoxConfiguration {
+
+	static Map<String,String> configurations = new HashMap<String, String>();
+	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");
+
+	}
+
+	private MailBox mailBox;
+
+	public MailBoxConfiguration(){}
+
+	public void config(){
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+
+	public void setMailBox(MailBox mailBox) {
+		this.mailBox = mailBox;
+	}
+
+	private void setSMTPHost() {
+		this.mailBox.setSmtpHost(getProperty(ConfigurationKeys.SMTP_SERVER));
+	}
+
+
+	private void setAltSMTPHost() {
+		this.mailBox.setAltSmtpHost(getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+	}
+
+
+	private void setFromAddress() {
+		this.mailBox.setFromAddress(getProperty(ConfigurationKeys.EMAIL_ADMIN));
+	}
+
+
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	private String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+	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/769232552/season_two/src/main/java/work01/srp/Product.java b/students/769232552/season_two/src/main/java/work01/srp/Product.java
new file mode 100644
index 000000000..2eff922d2
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/Product.java
@@ -0,0 +1,28 @@
+package work01.srp;
+
+
+public class Product {
+
+    protected String productID = null;
+
+
+    protected String productDesc = null;
+
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java b/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java
new file mode 100644
index 000000000..52222aea0
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java
@@ -0,0 +1,92 @@
+package work01.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("D:\\worksapce\\gitRepo\\coding2017\\students\\769232552\\season_two\\src\\main\\resources\\work01\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
+
+		//配置邮箱
+		MailBox mailBox = new MailBox();
+		MailBoxConfiguration mailBoxConfiguration = new MailBoxConfiguration();
+		mailBoxConfiguration.setMailBox(mailBox);
+		mailBoxConfiguration.config();
+
+		//将促销信息发送邮件
+		List<Product> products = readProductFile(f);//获取促销产品信息
+		for (Product product : products){
+			Mail mail = new Mail(product);		//生成邮件（邮件内容，收发人信息）
+			sendPromotionMails(emailDebug,mail,mailBox);
+		}
+
+	}
+
+
+
+	public static void sendPromotionMails(boolean debug, Mail mail, MailBox mailBox) throws Exception {
+
+		System.out.println("开始发送邮件");
+
+		List mailingList = mail.loadMailingList(); //获取收件人列表
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				mail.generateMail((HashMap) iter.next()); //生成邮件内容
+				try {
+					if (mail.getToAddress().length() > 0)
+						mailBox.sendEmail(mail, mailBox.getSmtpHost(), debug);
+				} catch (Exception e) {
+					try {
+						mailBox.sendEmail(mail, mailBox.getAltSmtpHost(), debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		} else {
+			System.out.println("没有邮件发送");
+
+		}
+	}
+
+
+	public static List<Product> readProductFile(File file) throws IOException
+	{
+		List<Product> list = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp;
+			while ((temp = br.readLine()) != null){
+				String[] data = temp.split(" ");
+
+				Product product = new Product();
+				product.setProductID(data[0]);
+				product.setProductDesc(data[1]);
+				list.add(product);
+
+				System.out.println("产品ID = " + product.getProductID() + "\n");
+				System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+			}
+
+			return list;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+}
diff --git a/students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt b/students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/769232552/season_two/src/main/resources/work01/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/785396327/first/ood/srp/ConfigParser.java b/students/785396327/first/ood/srp/ConfigParser.java
new file mode 100644
index 000000000..87e00e707
--- /dev/null
+++ b/students/785396327/first/ood/srp/ConfigParser.java
@@ -0,0 +1,9 @@
+package first.ood.srp;
+
+/**
+ * Created by william on 2017/6/14.
+ */
+public abstract class ConfigParser {
+
+   abstract void parseInfoFromConfig(Email email);
+}
diff --git a/students/785396327/first/ood/srp/Configuration.java b/students/785396327/first/ood/srp/Configuration.java
new file mode 100644
index 000000000..2d4130423
--- /dev/null
+++ b/students/785396327/first/ood/srp/Configuration.java
@@ -0,0 +1,28 @@
+package first.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap<String, String>();
+
+
+    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/785396327/first/ood/srp/ConfigurationKeys.java b/students/785396327/first/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..28de2ced0
--- /dev/null
+++ b/students/785396327/first/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package first.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";
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/785396327/first/ood/srp/DBParser.java b/students/785396327/first/ood/srp/DBParser.java
new file mode 100644
index 000000000..3e49e6abd
--- /dev/null
+++ b/students/785396327/first/ood/srp/DBParser.java
@@ -0,0 +1,24 @@
+package first.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by william on 2017/6/14.
+ */
+public abstract class DBParser<T extends Email> {
+    protected String sql;
+    protected Object[] params;
+
+    protected DBParser(String sql, Object[] params) {
+        this.sql = sql;
+        this.params = params;
+    }
+
+    protected List<T> parseInfoFromDB(T email) {
+        List<HashMap<String, String>> data = DBUtil.query(sql, params);
+        return convertData(email, data);
+    }
+
+    abstract List<T> convertData(T email, List<HashMap<String, String>> data);
+}
diff --git a/students/785396327/first/ood/srp/DBUtil.java b/students/785396327/first/ood/srp/DBUtil.java
new file mode 100644
index 000000000..473b8b1ca
--- /dev/null
+++ b/students/785396327/first/ood/srp/DBUtil.java
@@ -0,0 +1,43 @@
+package first.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @param sql
+     * @return
+     */
+    public static List<HashMap<String, String>> query(String sql, Object[] params) {
+        formateSQL(sql, params);
+
+        List userList = new ArrayList();
+        for (int i = 1; i <= 3; i++) {
+            Map<String, String> userInfo = new HashMap();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+
+        return userList;
+    }
+
+    private static String formateSQL(String sql, Object[] params) {
+        if (StringUtils.isEmpty(sql))
+            throw new RuntimeException("empty sql");
+        String[] sqlFaction = sql.split("\\?");
+        if (sqlFaction.length - 1 != params.length)
+            throw new RuntimeException("wrong number of parameters");
+        for (int i = 0; i < params.length; i++) {
+            sql = sql.replaceFirst("\\?", "'" + params[i].toString() + "'");
+        }
+
+        return sql;
+    }
+
+}
diff --git a/students/785396327/first/ood/srp/Email.java b/students/785396327/first/ood/srp/Email.java
new file mode 100644
index 000000000..ebca19e57
--- /dev/null
+++ b/students/785396327/first/ood/srp/Email.java
@@ -0,0 +1,46 @@
+package first.ood.srp;
+
+/**
+ * Created by william on 2017/6/12.
+ */
+public class Email {
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+
+    protected void setSMTPHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+
+    protected void setAltSMTPHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+
+    }
+
+    protected void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    protected void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+}
diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
new file mode 100644
index 000000000..e6f422b52
--- /dev/null
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -0,0 +1,26 @@
+package first.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by william on 2017/6/12.
+ */
+public class EmailParser {
+    private ConfigParser configParser;
+    private FileParser fileParser;
+    private DBParser dbParser;
+
+    public EmailParser(ConfigParser configParser,FileParser fileParser,DBParser dbParser) {
+        this.configParser = configParser;
+        this.fileParser = fileParser;
+        this.dbParser = dbParser;
+    }
+
+    public List<Email> parseEmailList() {
+        PromotionMail promotionMail = new PromotionMail();
+        configParser.parseInfoFromConfig(promotionMail);
+        fileParser.parseInfoFromFile(promotionMail);
+        return dbParser.parseInfoFromDB(promotionMail);
+    }
+
+}
diff --git a/students/785396327/first/ood/srp/FileParser.java b/students/785396327/first/ood/srp/FileParser.java
new file mode 100644
index 000000000..1f14c1138
--- /dev/null
+++ b/students/785396327/first/ood/srp/FileParser.java
@@ -0,0 +1,38 @@
+package first.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public abstract class FileParser {
+    protected String[] data;
+
+    protected FileParser(String filePath) {
+        try {
+            if (StringUtils.isEmpty(filePath))
+                throw new RuntimeException("init file parser must contains a legal file");
+            readFile(filePath);
+        } catch (IOException e) {
+            throw new RuntimeException("parse file cause errors");
+        }
+    }
+
+    private void readFile(String filePath) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(filePath));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+    protected abstract void parseInfoFromFile(Email email);
+
+}
diff --git a/students/785396327/first/ood/srp/MailSender.java b/students/785396327/first/ood/srp/MailSender.java
new file mode 100644
index 000000000..a2ed82db4
--- /dev/null
+++ b/students/785396327/first/ood/srp/MailSender.java
@@ -0,0 +1,33 @@
+package first.ood.srp;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by william on 2017/6/12.
+ */
+public class MailSender<T extends Email> {
+
+    private void sendMail(Email mail, boolean isDebug) {
+        if (!StringUtils.isEmpty(mail.toAddress))
+            try {
+                MailUtil.sendEmail(
+                        mail.toAddress,
+                        mail.fromAddress,
+                        mail.subject,
+                        mail.message,
+                        StringUtils.isEmpty(mail.smtpHost) == true ? mail.smtpHost : mail.altSmtpHost,
+                        isDebug);
+            } catch (Exception e) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e.getMessage());
+            }
+    }
+
+    public void sendMailList(List<T> mailList, boolean isDebug) {
+        if (mailList != null) {
+            for (Iterator<T> iterator = mailList.iterator(); iterator.hasNext(); ) {
+                sendMail(iterator.next(), isDebug);
+            }
+        }
+    }
+}
diff --git a/students/785396327/first/ood/srp/MailUtil.java b/students/785396327/first/ood/srp/MailUtil.java
new file mode 100644
index 000000000..2ec9de8c4
--- /dev/null
+++ b/students/785396327/first/ood/srp/MailUtil.java
@@ -0,0 +1,16 @@
+package first.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/785396327/first/ood/srp/PromotionFileParser.java b/students/785396327/first/ood/srp/PromotionFileParser.java
new file mode 100644
index 000000000..1d57b8de2
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionFileParser.java
@@ -0,0 +1,27 @@
+package first.ood.srp;
+
+/**
+ * Created by william on 2017/6/14.
+ */
+public class PromotionFileParser extends FileParser {
+
+
+    public PromotionFileParser(String filePath) {
+        super(filePath);
+    }
+
+    @Override
+    protected void parseInfoFromFile(Email email) {
+        PromotionMail promotionMail = (PromotionMail) email;
+        promotionMail.setProductID(parseProductID());
+        promotionMail.setProductDesc(parseProductDesc());
+    }
+
+    private String parseProductID() {
+        return super.data[0];
+    }
+
+    private String parseProductDesc() {
+        return super.data[1];
+    }
+}
diff --git a/students/785396327/first/ood/srp/PromotionMail.java b/students/785396327/first/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..48096fa54
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMail.java
@@ -0,0 +1,22 @@
+package first.ood.srp;
+
+public class PromotionMail extends Email {
+    private String productID;
+    private String productDesc;
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public String getproductID() {
+        return productID;
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+    public String getProductDesc() {
+        return this.productDesc;
+    }
+}
diff --git a/students/785396327/first/ood/srp/PromotionMailConfigParser.java b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
new file mode 100644
index 000000000..6fd8feb08
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
@@ -0,0 +1,15 @@
+package first.ood.srp;
+
+/**
+ * Created by william on 2017/6/14.
+ */
+public class PromotionMailConfigParser extends ConfigParser {
+
+    @Override
+    void parseInfoFromConfig(Email email) {
+        Configuration configuration = new Configuration();
+        email.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+        email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        email.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+    }
+}
diff --git a/students/785396327/first/ood/srp/PromotionMailDBParser.java b/students/785396327/first/ood/srp/PromotionMailDBParser.java
new file mode 100644
index 000000000..55e740474
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMailDBParser.java
@@ -0,0 +1,48 @@
+package first.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by william on 2017/6/14.
+ */
+public class PromotionMailDBParser extends DBParser<PromotionMail> {
+
+    protected PromotionMailDBParser(String sql, Object[] params) {
+        super(sql, params);
+    }
+
+    /**
+     * 由于sql参数需要运行时提供所以重写parseInfoFromDB方法
+     * @param email
+     * @return
+     */
+    @Override
+    protected List<PromotionMail> parseInfoFromDB(PromotionMail email) {
+        List<HashMap<String, String>> data = DBUtil.query(super.sql, new Object[]{email.getproductID()});
+        return convertData(email, data);
+    }
+
+    @Override
+    List<PromotionMail> convertData(PromotionMail email, List<HashMap<String, String>> data) {
+        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
+        for (HashMap<String, String> map : data) {
+            email.setToAddress(parseToAddress(map));
+            email.setMessage(parseMessage(map, email));
+            email.setSubject("您关注的产品降价了");
+            mailList.add(email);
+        }
+        return mailList;
+    }
+
+    private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
+        String name = map.get(ConfigurationKeys.NAME_KEY);
+        String message = "尊敬的 " + name + ", 您关注的产品 " + promotionMail.getProductDesc() + " 降价了，欢迎购买!";
+        return message;
+    }
+
+    private String parseToAddress(HashMap<String, String> map) {
+        return map.get(ConfigurationKeys.EMAIL_KEY);
+    }
+}
diff --git a/students/785396327/first/ood/srp/SendMailTest.java b/students/785396327/first/ood/srp/SendMailTest.java
new file mode 100644
index 000000000..2b54947c0
--- /dev/null
+++ b/students/785396327/first/ood/srp/SendMailTest.java
@@ -0,0 +1,24 @@
+package first.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by william on 2017/6/12.
+ */
+public class SendMailTest {
+
+    public static void main(String[] args) {
+        String sql = "Select name from subscriptions where product_id= ? and send_mail=1";
+        String filepath = "D:\\workspace\\IDEA\\homework\\coding2017_section2\\coding2017\\students\\785396327\\first\\ood\\srp\\product_promotion.txt";
+        boolean isDebug = false;
+
+        ConfigParser configParser = new PromotionMailConfigParser();
+        FileParser fileParser = new PromotionFileParser(filepath);
+        DBParser<PromotionMail> DBParser = new PromotionMailDBParser(sql, null);
+
+        EmailParser emailParser = new EmailParser(configParser, fileParser, DBParser);
+        List promotionMails = emailParser.parseEmailList();
+        MailSender<PromotionMail> mailSender = new MailSender();
+        mailSender.sendMailList(promotionMails, isDebug);
+    }
+}
diff --git a/students/785396327/first/ood/srp/StringUtils.java b/students/785396327/first/ood/srp/StringUtils.java
new file mode 100644
index 000000000..ec0483fa8
--- /dev/null
+++ b/students/785396327/first/ood/srp/StringUtils.java
@@ -0,0 +1,17 @@
+package first.ood.srp;
+
+/**
+ * Created by william on 2017/6/12.
+ */
+public class StringUtils {
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isEmpty(String str) {
+        return str == null || str.trim().isEmpty();
+    }
+}
diff --git a/students/785396327/first/ood/srp/product_promotion.txt b/students/785396327/first/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/785396327/first/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/799298900/src/com/leipengzj/Configuration.java b/students/799298900/src/com/leipengzj/Configuration.java
new file mode 100644
index 000000000..26665ad1a
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/Configuration.java
@@ -0,0 +1,31 @@
+package com.leipengzj;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}
+
+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/799298900/src/com/leipengzj/DBUtil.java b/students/799298900/src/com/leipengzj/DBUtil.java
new file mode 100644
index 000000000..ec8ae4aba
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/DBUtil.java
@@ -0,0 +1,25 @@
+package com.leipengzj;
+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/799298900/src/com/leipengzj/MailInfo.java b/students/799298900/src/com/leipengzj/MailInfo.java
new file mode 100644
index 000000000..ecaa0dac9
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/MailInfo.java
@@ -0,0 +1,92 @@
+package com.leipengzj;
+
+/**
+ * Created by pl on 2017/6/19.
+ */
+public class MailInfo {
+
+    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;
+
+    public String getSendMailQuery() {
+        return sendMailQuery;
+    }
+
+    public void setSendMailQuery(String sendMailQuery) {
+        this.sendMailQuery = sendMailQuery;
+    }
+
+    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 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() {
+        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 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/799298900/src/com/leipengzj/MailUtil.java b/students/799298900/src/com/leipengzj/MailUtil.java
new file mode 100644
index 000000000..42d4329f9
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/MailUtil.java
@@ -0,0 +1,18 @@
+package com.leipengzj;
+
+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/799298900/src/com/leipengzj/PromotionMail.java b/students/799298900/src/com/leipengzj/PromotionMail.java
new file mode 100644
index 000000000..5d152ac3c
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/PromotionMail.java
@@ -0,0 +1,139 @@
+package com.leipengzj;
+
+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 {
+		MailInfo mi = new MailInfo();
+
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		readFile(mi,file);
+
+
+		config = new Configuration();
+
+		mi.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mi.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mi.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+		String sql = "Select name from subscriptions "
+				+ "where product_id= '" + mi.getProductID() +"' "
+				+ "and send_mail=1 ";
+		//查询出邮件列表
+		List query = DBUtil.query(sql);
+
+		sendEMails(mi,mailDebug, query);
+
+		
+	}
+
+
+	//读取产品信息
+	protected void readFile(MailInfo mi,File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			mi.setProductID(data[0]);
+			mi.setProductDesc(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();
+		}
+	}
+
+    //配置邮件并设置发送的邮件内容
+	protected void configureEMail(HashMap userInfo,MailInfo mi) throws IOException
+	{
+		String toAddress = (String) userInfo.get(EMAIL_KEY);
+		String name = (String) userInfo.get(NAME_KEY);
+		if (toAddress.length() > 0){
+		   mi.setSubject("您关注的产品降价了");
+		   mi.setMessage("尊敬的 "+name+", 您关注的产品 " + mi.getProductDesc() + " 降价了，欢迎购买!");
+		}
+
+	}
+
+
+	protected void sendEMails(MailInfo mi,boolean debug, List mailingList) throws IOException
+	{
+
+		System.out.println("开始发送邮件");
+	
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				configureEMail((HashMap) iter.next(),mi);
+				try 
+				{
+					if (mi.getToAddress().length() > 0)
+						MailUtil.sendEmail(mi.getToAddress(), mi.getToAddress(), mi.getSubject(), mi.getMessage(), mi.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(mi.getToAddress(), mi.getToAddress(), mi.getSubject(), mi.getMessage(), mi.getAltSmtpHost(), debug);
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}
+		else {
+			System.out.println("没有邮件发送");
+		}
+
+	}
+}
diff --git a/students/799298900/src/com/leipengzj/myfirstGitFork.java b/students/799298900/src/com/leipengzj/myfirstGitFork.java
new file mode 100644
index 000000000..a87099c22
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/myfirstGitFork.java
@@ -0,0 +1,10 @@
+package com.leipengzj;
+
+/**
+ * Created by tyrion on 2017/6/15.
+ */
+public class myfirstGitFork {
+    public static void main(String[] args) {
+        System.out.println("myfirst git");
+    }
+}
diff --git a/students/799298900/src/com/leipengzj/product_promotion.txt b/students/799298900/src/com/leipengzj/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/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/81681981/first_OOP_homework/ood-assignment/pom.xml b/students/81681981/first_OOP_homework/ood-assignment/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/81681981/first_OOP_homework/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/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..0af0155e3
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setUserName("User" + i);
+			user.setMail(i+"aa@bb.com");		
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 000000000..b6d62acbe
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,80 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+/*
+ * email
+ */
+
+public class Email {
+	
+	static Map<String,String> 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");
+	}
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	protected String subject = null;
+	protected String message = null;
+	
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+	
+	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 fromAddress;
+	}
+
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	protected void setSMTPHost() 
+	{
+		smtpHost = this.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	protected void setAltSMTPHost() 
+	{
+		altSmtpHost = this.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+
+	
+	protected void setFromAddress() 
+	{
+			fromAddress = this.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..f0adff0ab
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp;
+
+
+public class MailUtil {
+	public static void sendEmail(String toAddress,Message mes,boolean debug) {
+		Email email = new Email();
+				//假装发了一封邮件
+				StringBuilder buffer = new StringBuilder();
+				buffer.append("From:").append(email.getFromAddress()).append("\n");
+				buffer.append("To:").append(toAddress).append("\n");
+				buffer.append("Subject:").append(mes.getSubject()).append("\n");
+				buffer.append("Content:").append(mes.getMessageDesc()).append("\n");
+				System.out.println(buffer.toString());
+			}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 000000000..59d916286
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp;
+
+public class Message {
+	private String subject;
+	private String messageDesc;
+	public String getSubject() {
+		return subject;
+	}
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	public String getMessageDesc() {
+		return messageDesc;
+	}
+	public void setMessageDesc(String messageDesc) {
+		this.messageDesc = messageDesc;
+	}
+	
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 000000000..236f61d13
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Product {
+	
+	protected String productID = null;
+	protected String productDesc = null;
+	
+	protected void setProductID(String productID) 
+	{ 
+		this.productID = productID; 
+		
+	} 
+
+	protected String getproductID() 
+	{
+		return productID; 
+	} 
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+
+	public void setProductDesc(String productDesc) {
+		this.productDesc = productDesc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	//获得该产品的所有订阅者
+	protected List<User> getLoadQuery(String productID){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		System.out.println("loadQuery set");
+		return  DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..b0641c978
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,103 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMail {
+
+	protected String sendMailQuery = null;
+
+	protected String toAddress = null;
+
+	protected String subject = null;
+	protected String message = null;
+	/**
+	 * 1.读产品信息 2.获取发送地址 3.组织内容 4.发送
+	 * 
+	 * */
+	// 1.获取产品信息
+	protected List<Product> readFile(File file) throws IOException // @02C
+	{
+		List<Product> productlist = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			productlist.add(product);
+			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 productlist;
+	}
+
+	// 获取产品信息
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		List<Product> productlist = readFile(file);
+		if (productlist != null) {
+			for (int i = 0; i < productlist.size(); i++) {
+				Product product = (Product) productlist.get(i);
+				if(product != null){
+					this.consistAndSend(product);
+				}
+			}
+
+		}
+	}
+
+	//获取某产品的所有订阅用户，并推送对应内容
+	public void consistAndSend(Product product){
+		List<User> toAddressList = product.getLoadQuery(product
+				.getproductID());// 获取该产品的订阅者
+		if (toAddressList != null){
+			for (int j = 0; j < toAddressList.size(); j++) {
+				User user = (User) toAddressList.get(j);
+				Message mes = this.setMessage(user.getUserName(),
+						product.getProductDesc());
+				this.sendEMails(true, mes, user.getMail());
+			}
+		}
+	}
+	
+	
+	protected Message setMessage(String name, String productDesc){
+		Message mes = new Message();
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc
+				+ " 降价了，欢迎购买!";
+		mes.setSubject(subject);
+		mes.setMessageDesc(message);
+		return mes;
+	}
+
+	protected void sendEMails(boolean debug, Message mes, String toAddress){
+		System.out.println("开始发送邮件");
+		if (null != toAddress && !toAddress.equals("")) {
+			try{
+			 MailUtil.sendEmail(toAddress, mes, debug);
+		
+			}catch(Exception e){
+				
+			}
+		} else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java
new file mode 100644
index 000000000..88b43c18a
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class TestMain {
+
+	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);
+		
+
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..cb03ec5d2
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class User {
+	private String userName;
+	private String mail;
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public String getMail() {
+		return mail;
+	}
+	public void setMail(String mail) {
+		this.mail = mail;
+	}
+	
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/81681981/first_OOP_homework/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/81681981/first_OOP_homework/readme.txt b/students/81681981/first_OOP_homework/readme.txt
new file mode 100644
index 000000000..0330532c8
--- /dev/null
+++ b/students/81681981/first_OOP_homework/readme.txt
@@ -0,0 +1,11 @@
+作业说明
+
+类及功能
+1.conifgurationKeys.java 邮件发送服务器配置信息
+2.新增User.java  对应订阅用户信息（用户名，邮箱） 
+3.修改DBUtil.java 数据库操作类，把键值 修改为User对象
+4.新增Email.java 维护邮件发送的前置信息和邮件标题，邮件内容，smtphost,altSmtpHost,fromAddress,subject,message
+5.新增Product.java 维护产品信息及订阅用户
+6.新增Message.java　维护要发送的内容
+7.修改PromotionMail.java 功能：读取产品信息，组织要发送的内容封装为Message对象，获取该产品对应的订阅用户，调用MailUtil.java 发送邮件
+8.MailUtil.java 负责发送
\ No newline at end of file
diff --git a/students/82180735/ood/ood-assignment/README.md b/students/82180735/ood/ood-assignment/README.md
new file mode 100644
index 000000000..c425e5170
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/README.md
@@ -0,0 +1,6 @@
+
+[TOC]
+## 面向对象相关的作业
+
+### 第一周作业 重构一个发送邮件的程序，使之符合SRP
+
diff --git a/students/82180735/ood/ood-assignment/pom.xml b/students/82180735/ood/ood-assignment/pom.xml
new file mode 100644
index 000000000..b55d53ffe
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.yue</groupId>
+	<artifactId>ood-assignment</artifactId>
+	<version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..d11d29787
--- /dev/null
+++ b/students/82180735/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<String,String> configurations = new HashMap<String,String>();
+	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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/82180735/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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 000000000..72dccf53e
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.domain.mail.MailConfigInfo;
+import com.coderising.ood.srp.domain.mail.MailInfo;
+import com.coderising.ood.srp.domain.product.ProductInfo;
+import com.coderising.ood.srp.service.ProductInfoService;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.UserService;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class Main {
+
+	public static void main(String[] args) {
+		//查询商品信息
+		ProductInfoService productInfoService = new ProductInfoService();
+		ProductInfo productInfo = productInfoService.selectProduct();
+
+		//查询用户信息
+		UserService userService = new UserService();
+		List<Map<String,String>> userList = userService.querySubscriptions(productInfo.getProductID());
+
+		//构造邮件配置及发件人信息
+		Configuration configuration = new Configuration();
+		MailConfigInfo mailConfigInfo = new MailConfigInfo();
+		mailConfigInfo.setSmtpHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mailConfigInfo.setAltSmtpHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mailConfigInfo.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+		//构造邮件内容及收件人信息
+		List<MailInfo> mailInfos = new ArrayList<MailInfo>(userList.size());
+		for (Map<String,String> map : userList) {
+			MailInfo mailInfo = new MailInfo();
+			mailInfo.setMessage("尊敬的 "+map.get("NAME")+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!");
+			mailInfo.setSubject("您关注的产品降价了");
+			mailInfo.setToAddress(map.get("EMAIL"));
+
+			mailInfos.add(mailInfo);
+		}
+
+		PromotionMailService promotionMailService = new PromotionMailService();
+
+		promotionMailService.sendEMails(mailConfigInfo,mailInfos,true);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 000000000..89137e35d
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class UserDao {
+
+	public List querySubscriptions(String productId) {
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productId +"' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java
new file mode 100644
index 000000000..bcfd9aa85
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.domain.mail;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class MailConfigInfo {
+	private String smtpHost;
+	private String altSmtpHost;
+	private String fromAddress;
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java
new file mode 100644
index 000000000..07aa58602
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.domain.mail;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class MailInfo {
+	private String toAddress;
+	private String subject;
+	private String message;
+
+
+	public String getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+
+	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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java
new file mode 100644
index 000000000..2bc2be9d1
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.domain.product;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class ProductInfo {
+	private String productID;
+	private String 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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/82180735/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
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java
new file mode 100644
index 000000000..32b173356
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.domain.product.ProductInfo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class ProductInfoService {
+
+	public ProductInfo selectProduct() {
+//		File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		URL base = Thread.currentThread().getContextClassLoader().getResource("");
+		File file = new File(base.getFile(),"product_promotion.txt");
+		BufferedReader br = null;
+		ProductInfo productInfo = new ProductInfo();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			productInfo.setProductID(data[0]);
+			productInfo.setProductDesc(data[1]);
+
+			System.out.println("产品ID = " + productInfo.getProductID() + "\n");
+			System.out.println("产品描述 = " + productInfo.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+//			throw new IOException(e.getMessage());
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return productInfo;
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 000000000..248d0b7a6
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.domain.mail.MailConfigInfo;
+import com.coderising.ood.srp.domain.mail.MailInfo;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class PromotionMailService {
+
+	public void sendEMails(MailConfigInfo mailConfigInfo, List<MailInfo> mailInfos, boolean debug)
+	{
+
+		System.out.println("开始发送邮件");
+
+
+		if (mailInfos != null) {
+			Iterator iter = mailInfos.iterator();
+			while (iter.hasNext()) {
+				MailInfo mailInfo = (MailInfo) iter.next();
+
+				try
+				{
+					if (mailInfo.getToAddress().length() > 0)
+						MailUtil.sendEmail(mailInfo.getToAddress(), mailConfigInfo.getFromAddress(), mailInfo.getSubject(), mailInfo.getMessage(),
+								mailConfigInfo.getSmtpHost(), debug);
+				}
+				catch (Exception e)
+				{
+					try {
+						MailUtil.sendEmail(mailInfo.getToAddress(), mailConfigInfo.getFromAddress(), mailInfo.getSubject(), mailInfo.getMessage(),
+								mailConfigInfo.getAltSmtpHost(), debug);
+
+					} catch (Exception e2)
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 000000000..bed06d430
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.dao.UserDao;
+
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class UserService {
+
+	public List querySubscriptions(String productId) {
+		return new UserDao().querySubscriptions(productId);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..f18e81295
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<Map<String,String>> 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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..bb028c690
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt b/students/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/resources/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/840145455/readme.md b/students/840145455/readme.md
new file mode 100644
index 000000000..6afb392c2
--- /dev/null
+++ b/students/840145455/readme.md
@@ -0,0 +1 @@
+﻿愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去
diff --git a/students/844620174/readme.md b/students/844620174/readme.md
new file mode 100644
index 000000000..ead67b854
--- /dev/null
+++ b/students/844620174/readme.md
@@ -0,0 +1,14 @@
+﻿# 新上传的内容
+### Git 命令行使用
+git 拉取主仓库步骤
+1. fork
+2. clone
+3. 上传代码
+
+git 上传代码分为三步
+1. 新增文件 add
+1. 本地提交 commit
+1. 远程提交 push 
+
+更新代码 
+使用 git pull 命令
\ No newline at end of file
diff --git a/students/861924479/src/com/learning/test/Test.java b/students/861924479/src/com/learning/test/Test.java
new file mode 100644
index 000000000..df9a26ef2
--- /dev/null
+++ b/students/861924479/src/com/learning/test/Test.java
@@ -0,0 +1,5 @@
+package com.learning.test;
+
+public class Test {
+
+}
diff --git a/students/862726639/pom.xml b/students/862726639/pom.xml
new file mode 100644
index 000000000..cac49a532
--- /dev/null
+++ b/students/862726639/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Email.java b/students/862726639/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 000000000..fd2d231ec
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,145 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
+/**
+ * 只提交发送邮件的功能，主邮箱，备用邮箱需要赋予
+ * @author gaohuan
+ *
+ */
+public class Email {
+	public static final String ENCODEING = "UTF-8";  
+	  
+    private String host; // 服务器地址  
+  
+    private String sender; // 发件人的邮箱  
+  
+    private String receiver; // 收件人的邮箱  
+  
+    private String name; // 发件人昵称  
+  
+    private String username; // 账号  
+  
+    private String password; // 密码  
+  
+    private String subject; // 主题  
+  
+    private String message; // 信息(支持HTML)  
+	
+	public boolean send2(Email mail) {  
+		if ("".equals(mail.getReceiver())&&null == mail.getReceiver()) {
+			return false;
+		}
+		System.out.println("开始发送邮件");
+        // 发送email  
+        HtmlEmail email = new HtmlEmail();  
+        try {  
+            // 这里是SMTP发送服务器的名字：163的如下："smtp.163.com"  
+            email.setHostName(mail.getHost());  
+            // 字符编码集的设置  
+            email.setCharset("utf-8");  
+            // 收件人的邮箱  
+            email.addTo(mail.getReceiver());  
+            // 发送人的邮箱  
+            email.setFrom(mail.getSender(), mail.getName());  
+            // 如果需要认证信息的话，设置认证：用户名-密码。分别为发件人在邮件服务器上的注册名称和密码  
+            email.setAuthentication(mail.getUsername(), mail.getPassword());  
+            // 要发送的邮件主题  
+            email.setSubject(mail.getSubject());  
+            // 要发送的信息，由于使用了HtmlEmail，可以在邮件内容中使用HTML标签  
+            email.setMsg(mail.getMessage());  
+            // 发送  
+            email.send();  
+        	System.out.println(mail.getSender() + " 发送邮件到 " + mail.getReceiver());  
+            return true;  
+        } catch (EmailException e) {  
+            e.printStackTrace();  
+            System.out.println(mail.getSender() + " 发送邮件到 " + mail.getReceiver()  
+                    + " 失败");  
+            return false;  
+        }  
+    }
+
+
+	public String getHost() {
+		return host;
+	}
+
+
+	public void setHost(String host) {
+		this.host = host;
+	}
+
+
+	public String getSender() {
+		return sender;
+	}
+
+
+	public void setSender(String sender) {
+		this.sender = sender;
+	}
+
+
+	public String getReceiver() {
+		return receiver;
+	}
+
+
+	public void setReceiver(String receiver) {
+		this.receiver = receiver;
+	}
+
+
+	public String getName() {
+		return name;
+	}
+
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	public String getUsername() {
+		return username;
+	}
+
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+
+	public String getPassword() {
+		return password;
+	}
+
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+
+	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/862726639/src/main/java/com/coderising/ood/srp/Goods.java b/students/862726639/src/main/java/com/coderising/ood/srp/Goods.java
new file mode 100644
index 000000000..376bc87de
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Goods.java
@@ -0,0 +1,79 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+/**
+ * 这个类的作用只是用于获取资源文件中的降价商品
+ * @author gaohuan
+ *
+ */
+public class Goods {
+	private String productID;
+	private String productDesc;
+	
+	/**
+	 * 获得降价
+	 * @return
+	 * @throws IOException
+	 */
+	@SuppressWarnings("finally")
+	public ArrayList<Goods>  getSaleGoods() throws IOException {
+		ArrayList<Goods> goodsList = new ArrayList<Goods>();
+		File file = new File("src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Goods goods = new Goods(data[0], data[1]);
+			goodsList.add(goods);
+			System.out.println("产品ID = " + goods.getProductID() + "\n");
+			System.out.println("产品描述 = " + goods.getProductDesc() + "\n");
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			br.close();
+			return goodsList;
+		}
+	}
+
+	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;
+	}
+
+	public Goods() {
+		super();
+	}
+
+	public Goods(String productID, String productDesc) {
+		super();
+		this.productID = productID;
+		this.productDesc = productDesc;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Main.java b/students/862726639/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 000000000..1e347cdd1
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Main.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.junit.Test;
+
+public class Main {
+	//发送邮件
+	@Test
+	public void test() throws Exception{
+		//获得降价商品
+		Goods goods = new Goods();
+		ArrayList<Goods> saleGoods = goods.getSaleGoods();
+		//获得对应用户
+		for (Goods goods2 : saleGoods) {
+			User user = new User();
+			ArrayList<User> userById = user.getUserById(goods2.getProductID());
+			for (User user2 : userById) {
+				//发送邮件
+				Email email = new Email();
+				email.setHost("smtp.163.com"); // 设置邮件服务器,如果不用163的,自己找找看相关的  
+				email.setSender("15237140070@163.com");  
+				email.setReceiver(user2.getEmail()); // 接收人  
+				email.setUsername("15237140070@163.com"); // 登录账号,一般都是和邮箱名一样吧  
+				email.setPassword("sudan521"); // 发件人邮箱的登录密码  
+				email.setSubject("降价了降价了");  
+				email.setMessage(Message.saleMessage(user2.getName(), goods2.getProductDesc())+"");  
+				email.send2(email);  
+				
+			}
+		}
+	}
+
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Message.java b/students/862726639/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 000000000..af0977531
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp;
+
+public class Message {
+	
+	public static StringBuilder saleMessage(String userName ,String goodsName){
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+		buffer.append("Content:").append("尊敬的 "+userName+", 您关注的产品 " + goodsName + " 降价了，欢迎购买!").append("\n");
+		return buffer;
+	}
+
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/User.java b/students/862726639/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 000000000..8821a9749
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+public class User {
+	private String name;
+	private String email;
+
+	
+	/**
+	 * 通过降价商品的id 获取需要返回的用户
+	 * @param productID
+	 * @return
+	 */
+	public ArrayList<User> getUserById(String productID){
+		ArrayList<User> userList = new ArrayList<User>();
+		userList.add(new User("高欢1","15582372277@163.com"));
+		userList.add(new User("高欢2"));
+		userList.add(new User("高欢3"));
+		return userList;
+	}
+	
+	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 User(String name) {
+		super();
+		this.name = name;
+	}
+
+	public User() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/862726639/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/862726639/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/87049319/README.md b/students/87049319/README.md
new file mode 100644
index 000000000..56d6816ac
--- /dev/null
+++ b/students/87049319/README.md
@@ -0,0 +1,3 @@
+PULL LIST
+* 2017/06/11
+first pull
\ No newline at end of file
diff --git a/students/89460886/ood/srp/Configuration.java b/students/89460886/ood/srp/Configuration.java
new file mode 100644
index 000000000..20cb68558
--- /dev/null
+++ b/students/89460886/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String,String> 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/89460886/ood/srp/ConfigurationKeys.java b/students/89460886/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..47cf4153b
--- /dev/null
+++ b/students/89460886/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package 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/89460886/ood/srp/DBUtil.java b/students/89460886/ood/srp/DBUtil.java
new file mode 100644
index 000000000..89dbacc9b
--- /dev/null
+++ b/students/89460886/ood/srp/DBUtil.java
@@ -0,0 +1,43 @@
+package ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     * @param sql
+     * @return
+     */
+    public static List<User> query(String sql){
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User user = new User();
+            user.setName("User" + i);
+            user.setEmail("aa@bb.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+
+    public static List<User> queryValidUserList(String sql) {
+        List<User> userList = query(sql);
+        List<User> resultList = new ArrayList<>();
+        for (int i = 0, len = userList.size(); i < len; i++) {
+            String email = userList.get(i).getEmail();
+            if (email != null && email.length() > 0) {
+                resultList.add(userList.get(i));
+            }
+        }
+        return resultList;
+    }
+
+    public static List<User> queryUserListByProduct(Product product) {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+        return queryValidUserList(sendMailQuery);
+    }
+
+}
diff --git a/students/89460886/ood/srp/IRequest.java b/students/89460886/ood/srp/IRequest.java
new file mode 100644
index 000000000..5d15088f6
--- /dev/null
+++ b/students/89460886/ood/srp/IRequest.java
@@ -0,0 +1,16 @@
+package ood.srp;
+
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public interface IRequest {
+
+    Map<String, String> getHeaders();
+
+    Map<String, String> getParams();
+
+    String getUrl();
+
+}
diff --git a/students/89460886/ood/srp/MailRequest.java b/students/89460886/ood/srp/MailRequest.java
new file mode 100644
index 000000000..62b9c6ed5
--- /dev/null
+++ b/students/89460886/ood/srp/MailRequest.java
@@ -0,0 +1,57 @@
+package ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public class MailRequest implements IRequest {
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    @Override
+    public Map<String, String> getHeaders() {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getParams() {
+        Map<String, String> map = new HashMap<>();
+        map.put("toAddress", toAddress);
+        map.put("subject", subject);
+        map.put("message", message);
+        return map;
+    }
+
+    @Override
+    public String getUrl() {
+        return null;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+}
diff --git a/students/89460886/ood/srp/Product.java b/students/89460886/ood/srp/Product.java
new file mode 100644
index 000000000..f92235f0a
--- /dev/null
+++ b/students/89460886/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package ood.srp;
+
+/**
+ * @author jiaxun
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/89460886/ood/srp/ProductRepository.java b/students/89460886/ood/srp/ProductRepository.java
new file mode 100644
index 000000000..0c987504a
--- /dev/null
+++ b/students/89460886/ood/srp/ProductRepository.java
@@ -0,0 +1,38 @@
+package ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * @author jiaxun
+ */
+public class ProductRepository {
+
+    public static Product getProductFromFile(File file) throws IOException {
+        Product product = null;
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String line = br.readLine();
+            String[] data = line.split(" ");
+
+            product = new Product();
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return product;
+    }
+
+}
diff --git a/students/89460886/ood/srp/PromotionMail.java b/students/89460886/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..199a80a7c
--- /dev/null
+++ b/students/89460886/ood/srp/PromotionMail.java
@@ -0,0 +1,42 @@
+package ood.srp;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+
+        File file = new File("/Users/jiaxun/OpenSource/Algorithm/src/ood/srp/product_promotion.txt");
+        boolean emailDebug = false;
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        Product product = ProductRepository.getProductFromFile(file);
+
+        List<User> userList = DBUtil.queryUserListByProduct(product);
+
+        PromotionMail pe = new PromotionMail();
+
+        pe.sendEMails(emailDebug, userList, product);
+    }
+
+    protected void sendEMails(boolean debug, List<User> userList, Product product) {
+
+        System.out.println("开始发送邮件");
+
+        if (userList != null) {
+            for (int i = 0, len = userList.size(); i < len; i++) {
+                MailRequest mailRequest = new MailRequest();
+
+                mailRequest.setSubject("您关注的产品降价了");
+                mailRequest.setMessage("尊敬的 " + userList.get(i).getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");
+                mailRequest.setToAddress(userList.get(i).getEmail());
+
+                SmtpClient.sharedInstance().sendEmail(mailRequest, debug);
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+}
diff --git a/students/89460886/ood/srp/SmtpClient.java b/students/89460886/ood/srp/SmtpClient.java
new file mode 100644
index 000000000..a0c52b6fc
--- /dev/null
+++ b/students/89460886/ood/srp/SmtpClient.java
@@ -0,0 +1,45 @@
+package ood.srp;
+
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public class SmtpClient {
+
+    private static volatile SmtpClient instance = null;
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    private SmtpClient() {
+        Configuration config = new Configuration();
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public static SmtpClient sharedInstance() {
+        if (instance == null) {
+            synchronized (SmtpClient.class) {
+                if (instance == null) {
+                    return new SmtpClient();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void sendEmail(IRequest request, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(fromAddress).append("\n");
+        Map<String, String> params = request.getParams();
+        // 这里为了演示方便，直接根据请求的 key 获取内容
+        buffer.append("To:").append(params.get("toAddress")).append("\n");
+        buffer.append("Subject:").append(params.get("subject")).append("\n");
+        buffer.append("Content:").append(params.get("message")).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/89460886/ood/srp/User.java b/students/89460886/ood/srp/User.java
new file mode 100644
index 000000000..71bc2b770
--- /dev/null
+++ b/students/89460886/ood/srp/User.java
@@ -0,0 +1,26 @@
+package ood.srp;
+
+/**
+ * @author jiaxun
+ */
+public class User {
+
+    private String name;
+    private String email;
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/students/89460886/ood/srp/product_promotion.txt b/students/89460886/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/89460886/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/932235900/src/com/coderising/ood/srp/PromotaionTest.java b/students/932235900/src/com/coderising/ood/srp/PromotaionTest.java
new file mode 100644
index 000000000..04bc17a43
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/PromotaionTest.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.entity.Email;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.EmailService;
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.UserService;
+
+public class PromotaionTest {
+
+	public static void main(String[] args) {
+		//1.获得客户集合
+		List<User> users = new UserService().getUsers();
+		//2.获得促销商品
+		List<Product> products = new ProductService().getPromotionProducts("src\\com\\coderising\\ood\\srp\\common\\product_promotion.txt");
+		//3.配置
+		Configuration conf = new Configuration();
+		//给每个用户发邮件
+		EmailService emailService = new EmailService();
+		for(User user:users ){
+				
+				Email email = emailService.generateEmail(user, products, conf );
+				
+				emailService.sendEmail(email);
+				
+			
+		}
+		
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/common/Configuration.java b/students/932235900/src/com/coderising/ood/srp/common/Configuration.java
new file mode 100644
index 000000000..4565927da
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.common;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java b/students/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java
new file mode 100644
index 000000000..a0064e0e4
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.common;
+
+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/932235900/src/com/coderising/ood/srp/common/DBUtil.java b/students/932235900/src/com/coderising/ood/srp/common/DBUtil.java
new file mode 100644
index 000000000..6e333a508
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.common;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.User;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setUserName("User" + i);
+			user.setEmailAddress("aa"+i+"@bb.com");
+			userList.add(user);
+		}
+		return userList;
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/common/product_promotion.txt b/students/932235900/src/com/coderising/ood/srp/common/product_promotion.txt
new file mode 100644
index 000000000..0c0124cc6
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/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/932235900/src/com/coderising/ood/srp/entity/Email.java b/students/932235900/src/com/coderising/ood/srp/entity/Email.java
new file mode 100644
index 000000000..dd13c4fab
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/Email.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.entity;
+/**
+ * 
+ * @author liubin
+ *电子邮件实体类
+ */
+public class Email {
+	
+	private String toAddress;
+	private String fromAddress; 
+	private String subject; 
+	private String message; 
+	private String smtpHost;
+	
+	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;
+	}
+	
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/entity/Product.java b/students/932235900/src/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 000000000..dffa59339
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.entity;
+/**
+ * 
+ * @author liubin
+ * 产品实体类
+ *
+ */
+public class Product {
+	
+	private String productId;
+	private String 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;
+	}
+	@Override
+	public String toString() {
+		return "Product [产品ID = " + productId + ", 产品描述 = " + productDesc + "]";
+	}
+	
+	
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/entity/User.java b/students/932235900/src/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 000000000..bd85ceac8
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.entity;
+
+public class User {
+	private String userId;
+	private String userName;
+	private String emailAddress;
+	
+	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 getEmailAddress() {
+		return emailAddress;
+	}
+	public void setEmailAddress(String emailAddress) {
+		this.emailAddress = emailAddress;
+	}
+	
+	
+
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/EmailService.java b/students/932235900/src/com/coderising/ood/srp/service/EmailService.java
new file mode 100644
index 000000000..9455ba57a
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.common.ConfigurationKeys;
+import com.coderising.ood.srp.entity.Email;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class EmailService {
+	
+	public Email generateEmail(User user,List<Product> products,Configuration configuration){
+		Email email = new Email();
+		email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		email.setToAddress(user.getEmailAddress());
+		email.setSubject("您关注的产品降价了");
+		StringBuffer message=new StringBuffer("尊敬的 "+user.getUserName()+", 您关注的产品:");
+		for(Product product:products){
+			message.append(product.getProductDesc()+" ");
+		}
+		message.append("降价了，欢迎购买!");
+		email.setMessage(message.toString());
+		return email;
+	}
+	/**
+	 * 发送一封Email
+	 * @param email
+	 */
+	public void sendEmail(Email email){
+		if(email != null ){
+			//假装发了一封邮件
+			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());
+		}else{
+			System.out.println("email 为空，发送邮件失败！");
+		}
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/ProductService.java b/students/932235900/src/com/coderising/ood/srp/service/ProductService.java
new file mode 100644
index 000000000..1762527fa
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/ProductService.java
@@ -0,0 +1,59 @@
+package com.coderising.ood.srp.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.Product;
+
+public class ProductService {
+	
+	/**
+	 * 从给定的路径文件获取打折商品信息
+	 * @param path
+	 * @return
+	 */
+	public List<Product> getPromotionProducts(String path){
+		List<Product> products = new ArrayList<Product>();
+		if(path != null && !"".equals(path)){
+			File file = new File(path);
+			try {
+				products = readFile(file);
+			} catch (IOException e) {
+				System.out.println("获取打折商品信息出错："+ e.getMessage());
+			}
+		}
+		return products;
+	}
+	
+	private List<Product> readFile(File file) throws IOException // @02C
+	{
+		List<Product> products = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = null;
+			while((temp = br.readLine()) !=  null){
+				
+				String[] data = temp.split(" ");
+				
+				Product product = new Product();
+				product.setProductId(data[0]);
+				product.setProductDesc(data[1]);
+				System.out.println(product);
+				
+				products.add(product);
+			}
+			return products;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			if(br != null){
+				br.close();
+			}
+		}
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/UserService.java b/students/932235900/src/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 000000000..d8bc1b67d
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.DBUtil;
+import com.coderising.ood.srp.entity.User;
+
+public class UserService {
+	/**
+	 * 获取客户列表
+	 */
+	public List<User> getUsers(){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where send_mail=1 ";
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png"
new file mode 100644
index 000000000..638b75e7e
Binary files /dev/null and "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png" differ
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java"
new file mode 100644
index 000000000..7e1c102f2
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java"
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp_restructure_1;
+
+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;
+
+import com.coderising.ood.srp_restructure_1.pojo.Configuration;
+import com.coderising.ood.srp_restructure_1.pojo.ConfigurationKeys;
+import com.coderising.ood.srp_restructure_1.pojo.Mail;
+import com.coderising.ood.srp_restructure_1.pojo.MailServiceConfiguration;
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+import com.coderising.ood.srp_restructure_1.pojo.User;
+import com.coderising.ood.srp_restructure_1.service.ProductService;
+import com.coderising.ood.srp_restructure_1.service.UserService;
+import com.coderising.ood.srp_restructure_1.util.DBUtil;
+import com.coderising.ood.srp_restructure_1.util.MailUtil;
+
+public class PromotionMail {
+
+	UserService userService = new UserService();
+	ProductService productService = new ProductService();
+
+	public static void main(String[] args) throws Exception {
+		File file = new File("src/main/java/com/coderising/ood/srp_restructure_1/product_promotion.txt");
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(file, emailDebug);
+	}
+
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+		MailServiceConfiguration configuration = new MailServiceConfiguration()
+				.setAltSMTPHost(ConfigurationKeys.SMTP_SERVER).setSMTPHost(ConfigurationKeys.ALT_SMTP_SERVER)
+				.setFromAddress(ConfigurationKeys.SMTP_SERVER);
+		List<Product> plist = productService.getProductDescList(file);
+		sendEMails(mailDebug, configuration, plist);
+	}
+
+	protected void sendEMails(boolean debug, MailServiceConfiguration configuration, List<Product> plist)
+			throws IOException {
+		System.out.println("开始发送邮件");
+		if (plist != null) {
+			Iterator<Product> piterator = plist.iterator();
+			while (piterator.hasNext()) {
+				Product product = piterator.next();
+				List<User> ulist = userService.getSendMailUser(product);
+				if (ulist != null) {
+					Iterator<User> uiterator = ulist.iterator();
+					while (uiterator.hasNext()) {
+						User user = uiterator.next();
+						Mail mail = new Mail("您关注的产品降价了",
+								"尊敬的 " + user.getName() + ", 您关注的产品 " + plist.get(0).getProductDesc() + " 降价了，欢迎购买!",
+								user.getEmail());
+						MailUtil.sendEmail(debug, configuration, mail);
+					}
+				} else {
+					System.out.println("没有邮件发送");
+				}
+			}
+		} else {
+			System.out.println("没有降价商品");
+		}
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java"
new file mode 100644
index 000000000..56182957f
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java"
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, String> 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java"
new file mode 100644
index 000000000..6a5cdb35f
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java"
new file mode 100644
index 000000000..560809a8c
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java"
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class Mail {
+
+	private String subject;
+	private String message;
+	private String toAddress;
+
+	public Mail(String subject, String message, String toAddress) {
+		this.subject = subject;
+		this.message = message;
+		this.toAddress = toAddress;
+	}
+
+	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 getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java"
new file mode 100644
index 000000000..cbdaaec27
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java"
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class MailServiceConfiguration {
+
+	private String SMTPHost;
+	private String AltSMTPHost;
+	private String FromAddress;
+
+	public String getSMTPHost() {
+		return SMTPHost;
+	}
+
+	public MailServiceConfiguration setSMTPHost(String sMTPHost) {
+		SMTPHost = sMTPHost;
+		return this;
+	}
+
+	public String getAltSMTPHost() {
+		return AltSMTPHost;
+	}
+
+	public MailServiceConfiguration setAltSMTPHost(String altSMTPHost) {
+		AltSMTPHost = altSMTPHost;
+		return this;
+	}
+
+	public String getFromAddress() {
+		return FromAddress;
+	}
+
+	public MailServiceConfiguration setFromAddress(String fromAddress) {
+		FromAddress = fromAddress;
+		return this;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java"
new file mode 100644
index 000000000..38de6f12e
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class Product {
+
+	private String productID;
+	private String 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java"
new file mode 100644
index 000000000..ebe5d134f
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class User {
+
+	private String name;
+	private String 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/product_promotion.txt" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/product_promotion.txt"
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java"
new file mode 100644
index 000000000..d1353bc72
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java"
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp_restructure_1.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+
+public class ProductService {
+
+	public List<Product> getProductDescList(File file) throws IOException {
+		List<Product> plist = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			Product p = new Product();
+			p.setProductID(data[0]);
+			p.setProductDesc(data[1]);
+
+			System.out.println("产品ID = " + p.getProductID() + "\n");
+			System.out.println("产品描述 = " + p.getProductDesc() + "\n");
+
+			plist.add(p);
+			return plist;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+
+	}
+
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java"
new file mode 100644
index 000000000..799f713cc
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java"
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp_restructure_1.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+import com.coderising.ood.srp_restructure_1.pojo.User;
+import com.coderising.ood.srp_restructure_1.util.DBUtil;
+
+public class UserService {
+
+	public List<User> getSendMailUser(Product product) {
+		String sql = "Select name from subscriptions " + "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+		return DBUtil.query(sql);
+	}
+
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java"
new file mode 100644
index 000000000..086893ec6
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java"
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp_restructure_1.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.User;
+
+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);
+			 */
+			/*
+			 * 因为在重构的时候使用了bean，所以为了方便直接改为返回beanlist
+			 */
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java"
new file mode 100644
index 000000000..ca4441782
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java"
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp_restructure_1.util;
+
+import com.coderising.ood.srp_restructure_1.pojo.Mail;
+import com.coderising.ood.srp_restructure_1.pojo.MailServiceConfiguration;
+
+public class MailUtil {
+
+	private 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());
+	}
+
+	public static void sendEmail(boolean debug, MailServiceConfiguration configuration, Mail mail) {
+		try {
+			if (mail.getToAddress().length() > 0)
+				sendEmail(mail.getToAddress(), configuration.getFromAddress(), mail.getSubject(), mail.getMessage(),
+						configuration.getSMTPHost(), debug);
+		} catch (Exception e) {
+			try {
+				sendEmail(mail.getToAddress(), configuration.getFromAddress(), mail.getSubject(), mail.getMessage(),
+						configuration.getAltSMTPHost(), debug);
+
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png"
new file mode 100644
index 000000000..c2d8aceb8
Binary files /dev/null and "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png" differ
diff --git a/students/986547781/README.md b/students/986547781/README.md
new file mode 100644
index 000000000..f568850ce
--- /dev/null
+++ b/students/986547781/README.md
@@ -0,0 +1,2 @@
+﻿##第一次尝试
+##解决编码问题
\ No newline at end of file
diff --git a/students/992331664/data-structure/data-structure/build.gradle b/students/992331664/data-structure/data-structure/build.gradle
new file mode 100644
index 000000000..e8037fb1c
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/build.gradle
@@ -0,0 +1,12 @@
+apply plugin: 'java'
+
+repositories {
+    jcenter()
+}
+
+dependencies {
+    compile 'org.slf4j:slf4j-api:1.7.21'
+	compile 'org.apache.poi:poi:3.16'
+	compile 'org.apache.poi:poi-ooxml:3.16'
+    testCompile 'junit:junit:4.12'
+}
diff --git a/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties b/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..d4aaec595
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 13 11:30:56 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/students/992331664/data-structure/data-structure/gradlew b/students/992331664/data-structure/data-structure/gradlew
new file mode 100644
index 000000000..9aa616c27
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/students/992331664/data-structure/data-structure/gradlew.bat b/students/992331664/data-structure/data-structure/gradlew.bat
new file mode 100644
index 000000000..f9553162f
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/students/992331664/data-structure/data-structure/settings.gradle b/students/992331664/data-structure/data-structure/settings.gradle
new file mode 100644
index 000000000..e5c7e2779
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/settings.gradle
@@ -0,0 +1,19 @@
+/*
+ * This settings file was auto generated by the Gradle buildInit task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/3.0/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'data-structure'
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 000000000..900a3ad35
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 000000000..c3c8a3f27
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 000000000..4ff7f46ae
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 000000000..0957eaf7f
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 000000000..1551a80b3
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 000000000..ce045393b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 000000000..bf9807b30
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 000000000..36a9d2ce1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 000000000..172371dd5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 000000000..dcdbe226e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 000000000..85e2e22de
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 000000000..b8c81faf3
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 000000000..07df2a5da
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 000000000..e5d9aebba
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 000000000..436d092f5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 000000000..ab8c76458
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 000000000..8c34bad0c
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 000000000..a651923ef
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 000000000..aefc9692b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 000000000..8660ec810
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 000000000..22ba4a545
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 000000000..2c7e128b2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 000000000..b6cf28c09
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/Logger.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 000000000..0357c4d91
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 000000000..ec54b839c
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 000000000..13cf80241
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/Configuration.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 000000000..f328c1816
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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<String,String> 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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 000000000..8695aed64
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 000000000..82e9261d1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 000000000..9f9e749af
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..781587a84
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..a98917f82
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 000000000..06ef6311b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java
new file mode 100644
index 000000000..10d13b583
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 000000000..4576c016a
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 000000000..c17e6def4
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,159 @@
+package com.coding.basic.array;
+
+import java.util.Arrays;
+
+import javax.management.RuntimeErrorException;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+		if (origin != null && origin.length > 1) {
+			for (int i = 0; i < origin.length / 2; i++) {
+				int temp = origin[i];
+				origin[i] = origin[origin.length - 1 - i];
+				origin[origin.length - 1 - i] = temp;
+			}
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		// JDK 1.8
+		// int[] newArray = Arrays.stream(oldArray).filter(item->item
+		// !=0).toArray();
+
+		int[] newArray = new int[oldArray.length];
+
+		int zeroCount = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				zeroCount++;
+			} else {
+				newArray[i - zeroCount] = oldArray[i];
+			}
+		}
+		if (zeroCount == 0) {
+			return Arrays.copyOf(oldArray, oldArray.length);
+		} else {
+			return Arrays.copyOf(newArray, oldArray.length - zeroCount);
+		}
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		if (oldArray.length + size < 0) {
+			throw new RuntimeErrorException(null, "size + oldArray.length 不能小于0");
+		}
+		int[] newArray = new int[oldArray.length + size];
+
+		if (size < 0) {
+			for (int i = 0; i < newArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		} else {
+			for (int i = 0; i < oldArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		}
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		if (max <= 1) {
+			return new int[0];
+		}
+		int a = 1;
+		int count = 1;
+		for (int i = 1; i <= max; i += a) {
+			a += i;
+			count+=2;
+		}
+		
+		int[] result = new int[count];
+
+		a = 1;
+		count = 0;
+		result[count++] = 1;
+
+		for (int i = 1; i <= max; i += a) {
+			a += i;
+			result[count++] = i;
+			result[count++] = a;
+		}
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		return null;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		return null;
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 000000000..994a241a3
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 000000000..7fd72fc2b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 000000000..f4c7556a2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 000000000..2e0550c67
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 000000000..6a3ea639b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 000000000..7d90318b5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 000000000..c4c4b7325
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 000000000..cef19a8b5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 000000000..f391d92b8
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 000000000..fedb24360
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 000000000..b0ec38161
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 000000000..76f2cb766
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 000000000..d0ab4387d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 000000000..e86d056a2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 000000000..ef85ff007
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 000000000..20e34e885
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 000000000..96a2194a6
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 000000000..dcbb18be4
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 000000000..c0435a2db
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 000000000..956927e2d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 000000000..5cec210e7
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 000000000..8579743fe
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 000000000..d3b0f167e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 000000000..399d3e857
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 000000000..4536ee7a2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 000000000..4a53dbe2f
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 000000000..c1421cd39
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 000000000..b033cbe1d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 000000000..41857e137
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 000000000..6e65192e4
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java b/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java
new file mode 100644
index 000000000..255267ce2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.array;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	ArrayUtil arrayUtil;
+	
+	int[] resultArray ;
+	
+	@Before
+	public void before(){
+		arrayUtil = new ArrayUtil();
+	}
+	
+	@After
+	public void printArray(){
+		System.out.println(Arrays.toString(resultArray));
+	}
+	
+	@Test
+	public void testReverseArray(){
+		int[] arr = {12,344,5,6,0,4,65,4,};
+		arrayUtil.reverseArray(arr);
+		resultArray = arr;
+	}
+	
+	@Test
+	public void testRemoveZero(){
+		int[] arr = {};
+		resultArray = arrayUtil.removeZero(arr);
+	}
+	
+	@Test
+	public void testMerge(){
+	}
+	
+	@Test
+	public void testGrow(){
+		int[] arr = {1,6,4,2,0};
+		resultArray = arrayUtil.grow(arr, 2);
+	}
+	
+	@Test
+	public void testFibonacci(){
+		resultArray = arrayUtil.fibonacci(15);
+	}
+}
diff --git a/students/992331664/ood/ood/build.gradle b/students/992331664/ood/ood/build.gradle
new file mode 100644
index 000000000..588e5e86a
--- /dev/null
+++ b/students/992331664/ood/ood/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * This build file was auto generated by running the Gradle 'init' task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * This generated file contains a sample Java project to get you started.
+ * For more details take a look at the Java Quickstart chapter in the Gradle
+ * user guide available at https://docs.gradle.org/3.0/userguide/tutorial_java_projects.html
+ */
+
+// Apply the java plugin to add support for Java
+apply plugin: 'java'
+
+// In this section you declare where to find the dependencies of your project
+repositories {
+    // Use 'jcenter' for resolving your dependencies.
+    // You can declare any Maven/Ivy/file repository here.
+    jcenter()
+}
+
+// In this section you declare the dependencies for your production and test code
+dependencies {
+    // The production code uses the SLF4J logging API at compile time
+    compile 'org.slf4j:slf4j-api:1.7.21'
+
+    // Declare the dependency for your favourite test framework you want to use in your tests.
+    // TestNG is also supported by the Gradle Test task. Just change the
+    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
+    // 'test.useTestNG()' to your build script.
+    testCompile 'junit:junit:4.12'
+}
diff --git a/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties b/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..5a2cbbeea
--- /dev/null
+++ b/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 13 11:30:26 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/students/992331664/ood/ood/gradlew b/students/992331664/ood/ood/gradlew
new file mode 100644
index 000000000..9aa616c27
--- /dev/null
+++ b/students/992331664/ood/ood/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/students/992331664/ood/ood/gradlew.bat b/students/992331664/ood/ood/gradlew.bat
new file mode 100644
index 000000000..f9553162f
--- /dev/null
+++ b/students/992331664/ood/ood/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/students/992331664/ood/ood/settings.gradle b/students/992331664/ood/ood/settings.gradle
new file mode 100644
index 000000000..f98d8fb6d
--- /dev/null
+++ b/students/992331664/ood/ood/settings.gradle
@@ -0,0 +1,19 @@
+/*
+ * This settings file was auto generated by the Gradle buildInit task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/3.0/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'ood'
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 000000000..9df4e1c77
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,91 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConnectionConfig;
+import com.coderising.ood.srp.model.MailInfo;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.util.MailUtil;
+
+public class PromotionMail {
+
+	protected SubscriptionsService subscriptionsService;
+
+	protected ProductService productService;
+
+	public PromotionMail(SubscriptionsService subscriptionsService, ProductService productService) {
+		this.subscriptionsService = subscriptionsService;
+		this.productService = productService;
+	}
+
+	/**
+	 * 发送促销邮件
+	 * 
+	 * @param file
+	 *            促销产品文件
+	 * @param mailDebug
+	 * @throws Exception
+	 */
+	public void sendPromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 得到促销的产品
+		List<Product> products = productService.doFindPromotionalProducts(file);
+
+		// 得到促销产品的订阅信息
+		List<Subscriptions> subscriptions = subscriptionsService.doFindByProducts(products);
+
+		// 得到订阅人的邮箱和名称，邮箱内容
+		List<MailInfo> mails = getMails(subscriptions);
+
+		// 发送邮箱
+		sendEMails(new ConnectionConfig(new Configuration()), mails, mailDebug);
+	}
+
+	// 得到发送的邮箱对象
+	protected List<MailInfo> getMails(List<Subscriptions> subscriptions) {
+
+		List<MailInfo> mails = new ArrayList<MailInfo>();
+		String subject = "您关注的产品降价了";
+
+		for (Subscriptions sub : subscriptions) {
+			String productDesc = sub.getProduct().getProductDesc();
+			String message = "尊敬的 " + sub.getName() + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+			mails.add(new MailInfo(subject, message, sub.getEmail()));
+		}
+		return mails;
+	}
+
+	// 发送邮件
+	protected void sendEMails(ConnectionConfig config, List<MailInfo> mails, boolean debug) {
+		if (mails == null) {
+			System.out.println("没有邮件需要发送");
+			return;
+		}
+		System.out.println("开始发送邮件");
+		Iterator<MailInfo> iter = mails.iterator();
+		while (iter.hasNext()) {
+			MailInfo mail = iter.next();
+			if (mail.getToAddress().length() <= 0) {
+				continue;
+			}
+			try {
+				MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(), mail.getMessage(),config.getSmtpHost(), debug);
+			} catch (Exception e) {
+				try {
+					MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(),mail.getMessage(), config.getAltSmtpHost(), debug);
+
+				} catch (Exception e2) {
+					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+				}
+			}
+		}
+		System.out.println("发送邮件结束");
+	}
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 000000000..bbed12280
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 000000000..cadb23ed2
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp.config;
+
+
+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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
new file mode 100644
index 000000000..531efe251
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp.config;
+
+/**
+ * 邮箱连接配置类
+ *
+ */
+public class ConnectionConfig {
+	private String smtpHost;
+	private String altSmtpHost;
+	private String fromAddress;
+
+	public ConnectionConfig(Configuration config) {
+		this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java
new file mode 100644
index 000000000..2744e2fd1
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * 邮箱信息
+ *
+ */
+public class MailInfo {
+	private String subject;
+	private String message;
+	private String toAddress;
+
+	public MailInfo() {
+		super();
+	}
+
+	public MailInfo(String subject, String message, String toAddress) {
+		super();
+		this.subject = subject;
+		this.message = message;
+		this.toAddress = toAddress;
+	}
+
+	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 getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+
+	@Override
+	public String toString() {
+		return "Mail [subject=" + subject + ", message=" + message + ", toAddress=" + toAddress + "]";
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
new file mode 100644
index 000000000..fcfc5f7cf
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * 产品信息
+ */
+public class Product {
+
+	private String productID;
+
+	private String productDesc;
+
+	public Product() {
+	}
+
+	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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
new file mode 100644
index 000000000..8a25fe19e
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * 订阅信息，主要有订阅产品，订阅用户
+ * 
+ */
+public class Subscriptions {
+
+	// name 和 email 应该存放在用户信息中，如叫订阅用户，
+	private String name;
+	private String email;
+	private String productId;
+	private Product product;
+
+	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 String getProductId() {
+		return productId;
+	}
+
+	public void setProductId(String productId) {
+		this.productId = productId;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+	@Override
+	public String toString() {
+		return "Subscriptions [name=" + name + ", email=" + email + ", productId=" + productId + ", product=" + product
+				+ "]";
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 000000000..b7a974adb
--- /dev/null
+++ b/students/992331664/ood/ood/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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
new file mode 100644
index 000000000..aae01818f
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+
+public interface ProductService {
+
+	/**
+	 * 查询促销产品
+	 * @return 促销产品
+	 * @throws IOException 
+	 */
+	List<Product> doFindPromotionalProducts(File file) throws IOException;
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
new file mode 100644
index 000000000..c31c25c08
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+
+public interface SubscriptionsService {
+
+	/**
+	 * 查询产品的订阅人
+	 * 
+	 * @param products
+	 *            产品
+	 * @return 订阅信息
+	 */
+	List<Subscriptions> doFindByProducts(List<Product> products);
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java
new file mode 100644
index 000000000..66fe9b6d9
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.service.ProductService;
+
+public class ProductServiceImpl implements ProductService {
+
+	@Override
+	public List<Product> doFindPromotionalProducts(File file) throws IOException {
+
+		List<Product> products = new ArrayList<Product>();
+		
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			while (br.read() != -1) {
+				Product product = new Product();
+				String temp = br.readLine();
+				String[] data = temp.split(" ");
+				product.setProductID(data[0]);
+				product.setProductDesc(data[1]);
+				products.add(product);
+			}
+			
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return products;
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java
new file mode 100644
index 000000000..164621e2e
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.util.DBUtil;
+
+public class SubscriptionsServiceImpl implements SubscriptionsService {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	@SuppressWarnings({ "unused", "rawtypes" })
+	@Override
+	public List<Subscriptions> doFindByProducts(List<Product> products) {
+
+		List<String> productIds = products.stream().map(Product::getProductID).collect(Collectors.toList());
+		String sendMailQuery = "Select name from subscriptions where product_id in( productIds ) and send_mail = 1 ";
+		List list = DBUtil.query(sendMailQuery);
+
+		// 这里只是模拟数据
+		List<Subscriptions> subscriptions = new ArrayList<Subscriptions>();
+		for (int i = 0; i < list.size(); i++) {
+			HashMap userInfo = (HashMap) list.get(i);
+			Subscriptions ss = new Subscriptions();
+			ss.setName((String) userInfo.get(NAME_KEY));
+			ss.setEmail((String) userInfo.get(EMAIL_KEY));
+			ss.setProduct(products.get(i));
+			subscriptions.add(ss);
+		}
+
+		return subscriptions;
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 000000000..33bb5cfd4
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 
+	 * @param sql
+	 * @return
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 000000000..bb028c690
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java b/students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java
new file mode 100644
index 000000000..a3c91dc4b
--- /dev/null
+++ b/students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.service.impl.ProductServiceImpl;
+import com.coderising.ood.srp.service.impl.SubscriptionsServiceImpl;
+
+public class PromotionMailTest {
+
+	PromotionMail promotionMail;
+
+	@Before
+	public void before() {
+		SubscriptionsService subscriptionsService = new SubscriptionsServiceImpl();
+		ProductService productService = new ProductServiceImpl();
+		promotionMail = new PromotionMail(subscriptionsService, productService);
+	}
+
+	@Test
+	public void testSendPromotionMail() throws Exception {
+		String path = System.getProperty("user.dir");
+
+		path += "\\bin\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+		File file = new File(path);
+
+		promotionMail.sendPromotionMail(file, false);
+	}
+}
