diff --git a/BlackList.java b/BlackList.java new file mode 100644 index 0000000..07ac6f8 --- /dev/null +++ b/BlackList.java @@ -0,0 +1,220 @@ +package com.chuanke.pay.proofread; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.SimpleEmail; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MainService { + protected static final Logger logger = LoggerFactory.getLogger(MainService.class); + + static String DRIVER = ""; + static String HOST = ""; + static String USER_NAME = ""; + static String PASSWORD = ""; + static String TIMES = "5"; + + static String SMTPHost = ""; + static String SMTPUsername = ""; + static String SMTPPassword = ""; + static String SEND_TO = ""; + + static Connection conn; + static PreparedStatement pst; + + static { + InputStream is = MainService.class.getClassLoader().getResourceAsStream("config.properties"); + Properties prop = new Properties(); + try { + prop.load(is); + } catch (Exception ex) { + logger.error("读取config.properties配置文件出错", ex); + } + DRIVER = prop.getProperty("jdbc.driver"); + HOST = prop.getProperty("jdbc.url"); + USER_NAME = prop.getProperty("jdbc.username"); + PASSWORD = prop.getProperty("jdbc.password"); + TIMES = prop.getProperty("order.times"); + SMTPHost = prop.getProperty("mail.SMTPHost"); + SMTPUsername = prop.getProperty("mail.SMTPUsername"); + SMTPPassword = prop.getProperty("mail.SMTPPassword"); + SEND_TO = prop.getProperty("mail.sendTo"); + } + + public static void sendMail(List memberList) throws EmailException { + SimpleEmail email = new SimpleEmail(); + email.setHostName(SMTPHost); + email.setAuthentication(SMTPUsername, SMTPPassword); + if(!"".equals(SEND_TO)) { + String[] sendTos = SEND_TO.split(";"); + if(sendTos != null && sendTos.length > 0) { + for(String sendTo : sendTos) { + email.addTo(sendTo); + } + } + } + email.setFrom(SMTPUsername, "民生商城公共邮箱"); + email.setSubject("信用卡商城以下用户已被加入黑名单"); + email.setCharset("UTF-8"); + email.setMsg("以下用户" + memberList.toString() + "已被自动加入黑名"); + email.send(); + } + + public static final Connection getConnection() { + Connection con = null; + try { + Class.forName(DRIVER); + con = DriverManager.getConnection(HOST, USER_NAME, PASSWORD); + } catch (Exception e) { + logger.error("数据库连接失", e); + } + return con; + } + + /** + * 查询符合条件的订单列" + * + * @return 返回订单列表 + */ + public static List queryOrders() { + conn = getConnection(); + try { + String sql = "SELECT o.member,o.consignee,o.address,o.phone FROM xx_order o, xx_order_item oi WHERE o.create_date > date_sub(CURDATE(), INTERVAL 1 DAY) AND o.create_date < CURDATE() AND o.id=oi.orders AND oi.product IN (SELECT pl.product_id FROM xx_product_limit pl WHERE pl.start_date < NOW() AND pl.end_date > NOW())"; + logger.info("查询订单sql" + sql); + pst = conn.prepareStatement(sql); + ResultSet rs = pst.executeQuery(sql); + List orderList = new ArrayList(); + while (rs.next()) { + String[] order = new String[4]; + order[0] = rs.getString("member"); + order[1] = rs.getString("consignee"); + order[2] = rs.getString("address"); + order[3] = rs.getString("phone"); + orderList.add(order); + } + return orderList; + } catch (SQLException e) { + logger.error("查询数据库失", e); + try { + pst.close(); + conn.close(); + } catch (SQLException e1) { + } + } + return null; + } + + /** + * 处理订单列表 + * + * @param orderList + * @return 返回"��插入黑名单表的用户ID集合 + */ + public static List handleMemberBlacklist(List orderList) { + List orderInnerList = new ArrayList(); // 拷贝列表 + orderInnerList.addAll(orderList); + List memberBlacklist = new ArrayList(); + for (int i=0; i orderTempList = new ArrayList(); + // 内层循环 + for (int j=i+1; j= Integer.valueOf(TIMES)) { + memberBlacklist.add(order[0]); + if (orderTempList != null && orderTempList.size() > 0) { + for (String[] orderTemp : orderTempList) { + if (!memberBlacklist.contains(orderTemp[0])) { + memberBlacklist.add(orderTemp[0]); + } + } + } + } + if (orderTempList != null && orderTempList.size() > 0) { + // 内层循环完毕,剔除已参与判断的order记录 + orderInnerList.removeAll(orderTempList); + orderTempList.clear(); + } + } + logger.info("加入黑名单的用户列表" + memberBlacklist.toString()); + return memberBlacklist; + } + + /** + * 将过滤后的用户id插入黑名单表" + * + * @param memberList + */ + public static void insertMemberBlacklist(List memberList) { + try { + conn.setAutoCommit(false); + String sql = "SELECT userId FROM xx_member_blacklist"; + pst = conn.prepareStatement(sql); + ResultSet rs = pst.executeQuery(sql); + List userIdList = new ArrayList(); + while (rs.next()) { + String userId = rs.getString("userId"); + userIdList.add(userId); + } + if (memberList != null && memberList.size() > 0 + && userIdList != null && userIdList.size() > 0) { + memberList.removeAll(userIdList); + logger.info("用户ID为:" + userIdList.toString() + + "的用户已经在黑名单表中存在,本次不做数据插入"); + } + String insertSql = "insert into xx_member_blacklist(userId,create_date,modify_date) values(?,?,?)"; + pst = conn.prepareStatement(insertSql); + for (String memberId : memberList) { + pst.setString(1, memberId); + pst.setTimestamp(2, new Timestamp(new Date().getTime())); + pst.setTimestamp(3, new Timestamp(new Date().getTime())); + pst.addBatch(); + } + pst.executeBatch(); + conn.commit(); + logger.info("已成功将用户ID为:" + memberList.toString() + "的用户插入到黑名单表"); + } catch (SQLException e) { + logger.error("插入黑名单用户出现异", e); + } finally { + try { + pst.close(); + conn.close(); + } catch (SQLException e) { + } + } + } + + public static void main(String[] args) { + // 方法入口 + List orderList = queryOrders(); + List memberList = handleMemberBlacklist(orderList); + insertMemberBlacklist(memberList); + if(memberList != null && memberList.size() > 0) { + try { + sendMail(memberList); + } catch (EmailException e) { + e.printStackTrace(); + } + } + } +} diff --git a/gitCommand.txt b/gitCommand.txt new file mode 100644 index 0000000..8647913 --- /dev/null +++ b/gitCommand.txt @@ -0,0 +1,127 @@ +创建版本库 + +初始化一个Git仓库,使用git init命令。 +添加文件到Git仓库,分两步: +第一步,使用命令git add ,注意,可反复多次使用,添加多个文件; +可能会出现错误:windows中的换行符为 CRLF, 而在Linux下的换行符为LF,所以在执行add . 时出现提示,解决办法: +rm -rf .git // 删除.git +git config --global core.autocrlf false //禁用自动转换 +第二步,使用命令git commit,完成。 + + +版本回退 + +要随时掌握工作区的状态,使用git status命令。 +如果git status告诉你有文件被修改过,用git diff可以查看修改内容。 +HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令gitreset--hard commit_id。 + 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。 +要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本 + + +工作区和暂存区 + +每次修改,如果不add到暂存区,那就不会加入到commit中。 + + +撤销修改 + +场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout-- file。 +场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。 + + +删除文件 + +命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容 + + +添加远程库 + +要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的所有内容; +此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改; + + +从远程库克隆 + +要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。 + + +创建与合并分支 + +Git鼓励大量使用分支: +查看分支:git branch +创建分支:git branch +切换分支:git checkout +创建+切换分支:git checkout -b +合并某分支到当前分支:git merge +删除分支:git branch -d + + +解决冲突 + +当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 +用git log --graph命令可以看到分支合并图。 + + +分支管理策略 + +合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。 + + +BUG分支 + +修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; +当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stashpop,回到工作现场。 + + +Feature分支 + +开发一个新feature,最好新建一个分支; +如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。 + + +多人协作 + +查看远程库信息,使用git remote -v; +本地新建的分支如果不推送到远程,对其他人就是不可见的; +从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; +在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; +建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name; +从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。 + + +创建标签 + +命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id; +git tag -a -m "blablabla..."可以指定标签信息; +git tag -s -m "blablabla..."可以用PGP签名标签; +命令git tag可以查看所有标签。 + + +操作标签 + +命令git push origin 可以推送一个本地标签; +命令git push origin --tags可以推送全部未推送过的本地标签; +命令git tag -d 可以删除一个本地标签; +命令git push origin :refs/tags/可以删除一个远程标签。 + + +使用Github + +在GitHub上,可以任意Fork开源仓库; +自己拥有Fork后的仓库的读写权限; +可以推送pull request给官方仓库来贡献代码。 + + +忽略特殊文件 + +忽略某些文件时,需要编写.gitignore; +.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理! + + +搭建Git服务器 + +搭建Git服务器非常简单,通常10分钟即可完成; +要方便管理公钥,用Gitosis; +要像SVN那样变态地控制权限,用Gitolite。 + + diff --git a/taobaomm.py b/taobaomm.py new file mode 100644 index 0000000..bfe4d0c --- /dev/null +++ b/taobaomm.py @@ -0,0 +1,30 @@ +#encoding=utf-8 +import urllib2 + +mmurl = 'http://mm.taobao.com/json/request_top_list.htm?type=0&page=' +i = 0 +while i < 1: + url = mmurl + str(i) + i += 1 + up = urllib2.urlopen(url) + content = up.read() + + ahref = '