【编程之美07期】将优惠码保存到 MySQL 关系型数据库中

上周我们进行了酷炫的优惠码生成:

叶神给大家的建议:
从产品角度看激活码,一般需要涉及到
1. 要随机,不能简单,否则容易被人爆破
2. 不要有混淆的字母,比如数字零0和字母欧,爱(I)和小写的L,2和Z等等,否则输入容易出错
ps:因为上周有牛友问我们这个有没有要求,我说的是无限发挥,但是后来想了想确实不能这样,我们做项目或者写代码也好,终究是要做成产品的,还是要有需求的,没有需求的程序员跟咸鱼有什么区别~~~~

于是我们以后会更贴近生活和产品,所以大家也尽量优化自己的代码哦,养成这种把这些需求都考虑进去的习惯~#人人都是产品经理#

我们在使用app的过程经常能够看到激活码,优惠券,邀请码这些东西,总是感觉自己受制于人,想不想用自己的代码来生成优惠券呢,酷酷的!!



本周我们继续上周进行,将优惠码保存到 MySQL 关系型数据库中!

“编程之美,让你爱上编程的美。”

挑战下面编程题目,

一起体验编程的乐趣!

本期题目:

做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),并将上周的优惠券保存到MySQL 关系型数据库中!

编程之美独有福利

这个栏目就是为了培养大家编程动手习惯并且提高编程能力的一个平台,我们现如今给参与这个栏目的提供如下福利:
  • 源码分享
  • 每周评比编程之星(奖励牛客大礼包一份,这回是充满惊喜,每个大礼包里不一定包括什么)
  • 企业实习工作机会
  • 独家名誉及待遇
  • 参与开源项目
  • 定期的分享讲座
等等等等!我们想进行一些不一样的玩法,让学习变得更有趣!无论你找到工作与否,即使是已经工作了,你也要有一个练手交流的平台~


当然啦,重要的是来练习自己的编程能力,分享代码,交流技术的过程,这个过程中,你提升的不只是一点点~

为了让牛友能够更高效,更好的学习,特意为大家建了一个群:牛客编程之美源码群 595665246,只给真正想参与这个栏目和真正想学习的人开放,会在群里定期分享源码,只让真正想学习的人来参加,所以只有参与栏目(在本栏目下发出自己的代码的)才能加,加的时候备注一下牛客昵称~

编程之星

每一期的玩法都不一样!每一期的编程之星的规则也不一样~~重要的是人人都参与进来
本期编程之星评比规则:由工程师来评选~

注:因为目前群成员比较多,本着只让真正想参与的人进来的原则,可能后期会整理群啦,对这个没有兴趣的我们就会把位置让给真正有兴趣参加的人啦~

栏目介绍

编程之美,是牛客网推出的新栏目,每周推出一个项目供大家练手讨论交流。

如果你有想实现的项目问题,欢迎私信牛妹~

另外!另外!如果有好玩的项目题目可以私信牛妹,一经采用有奖励哦~~

如果你有写博客或者公众号的习惯,也欢迎加牛妹qq:1037532015私信。

参考代码:

import mysql.connector
 
 def write_to_mysql(filename):
   f = open(filename, 'r')
   conn = mysql.connector.connect(user='root', password='******', database='test')
    print('登录数据库成功')
   conn = mysql.connector.connect(user='root', password='986535', database='test')
     cursor = conn.cursor()
     cursor.execute("DROP TABLE IF EXISTS user")
     cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
   print('创建表成功')
   a = 1
   for line in f.readlines():
    f = open(filename, 'r').readlines()
   for line, num in zip(f, range(1, len(f)+1)):
         line = line[:-1]                     #直接除去最后一个字符的所有字符,这里去除\n符号
       cursor.execute('insert into user (id, name) values (%s, %s)', [str(a), line])
        cursor.execute('insert into user (id, name) values (%s, %s)', [str(num), line])
         conn.commit()
       a += 1
    cursor.close()
    print('插入数据结束')
     return 0
 
 def search_mysql():
    b = input('查询第几号(1-200)激活码:')
    conn = mysql.connector.connect(user='root', password='******', database='test')
    b = input('Search Active code(1-200):')
    conn = mysql.connector.connect(user='root', password='986535', database='test')
     cursor = conn.cursor()
     cursor.execute('select * from user where id = %s', (b,))
     values = cursor.fetchall()

关于礼物寄送:https://www.nowcoder.com/discuss/19871  
全部评论
今天做了一下午才做完 用到了JDBC和反射,虽然以前学过,但是没真正用过所以做的挺费劲 首先是表设计: id为用户id promo_code为优惠码 value为面值(可以是具体价值或折扣) condition为使用条件 expire_data为优惠码过期时间 思路:把优惠码信息封装成一个javaBean,然后读取和写入都用bean对象,字段和赋值都是用反射完成的 下面是代码: package nowcoder; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * 用来连接数据库,查询以及执行SQL语句 * @author Matrix42 * */ public class JDBCConnector { private Connection conn; private String JDBCUrl; private String driverUrl; public JDBCConnector(String JDBCUrl,String driverUrl,String username,String password) { this.JDBCUrl = JDBCUrl; this.driverUrl = driverUrl; conn = getConnection(JDBCUrl,driverUrl,username,password); } /** * 与数据库建立连接 * @param JDBCUrl * @param driverUrl * @param username * @param password * @return */ private Connection getConnection(String JDBCUrl,String driverUrl,String username,String password){ try { //加载驱动 Class.forName(JDBCUrl); } catch (ClassNotFoundException e) { System.out.println("驱动加载失败!"); e.printStackTrace(); } Connection connection = null; try { //建立连接 connection = DriverManager.getConnection(driverUrl,username,password); } catch (SQLException e) { System.out.println("建立连接失败!"); e.printStackTrace(); } return connection; } /** * 插入一条数据 * @param object * @param table * @return */ public int insert(Object object,String table){ int rows = 0; String sql = "insert into "+table + " values" +getValue(object); System.out.println(sql); PreparedStatement statement = null; try { statement = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } try { rows = statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return rows; } /** * 所有结果封装到List里 * @param primaryKey * @param table * @return */ public List queryAll(Class<?> clazz,String table){ List<Object> resultList = new ArrayList<Object>(); PreparedStatement statement = null; String sql = "select * from "+table; try { statement = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } ResultSet resultSet = null; try { resultSet = statement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } ResultSetMetaData metaData = null; int colCount = 0; try { metaData = resultSet.getMetaData(); colCount = metaData.getColumnCount(); } catch (SQLException e1) { e1.printStackTrace(); } //获取字段的个数 Field[] fields = clazz.getDeclaredFields(); try{ while (resultSet.next()) { //构造实例 Object object = clazz.newInstance(); for(int i=1;i<=colCount;i++){ //获取单个结果 Object value = resultSet.getObject(i); //遍历字段,如果相同则赋值 for(int j=0;j<fields.length;j++){ Field f = fields[j]; if(f.getName().equalsIgnoreCase(metaData.getColumnName(i))){ f.setAccessible(true); f.set(object, value); } } } //存入list resultList.add(object); } }catch(Exception e){ e.printStackTrace(); } return resultList; } /** * 获取列 * @param object * @return */ public static String getColomns(Object object){ String colomns = "("; Class<?> clazz = object.getClass(); Field[] fields = clazz.getDeclaredFields(); for(int i=0;i<fields.length;i++){ if(i<fields.length-1){ colomns+=fields[i].getName()+","; }else { colomns+=fields[i].getName(); } } colomns+=") "; return colomns; } /** * 获取值 * @param object * @return */ public static String getValue(Object object){ String colomns = "("; Class<?> clazz = object.getClass(); Field[] fields = clazz.getDeclaredFields(); try { for(int i=0;i<fields.length;i++){ fields[i].setAccessible(true); if(i<fields.length-1){ colomns+="'"+fields[i].get(object)+"'"+","; }else { colomns+="'"+fields[i].get(object)+"'"; } } } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } colomns+=")"; return colomns; } /** * 获取方法 * @param clazz * @return */ public static Method[] getSetFunc(Class<?> clazz){ Method[] methods = clazz.getDeclaredMethods(); for(int i=0;i<methods.length;i++){ methods[i].setAccessible(true); } return methods; } } javaBean package nowcoder; import java.sql.Timestamp; public class CodeBean { private int id; private String promo_code; private double value; private double condition; private Timestamp expire_data; public CodeBean() { super(); } public CodeBean(int id, String promo_code, double value, double condition, Timestamp expire_data) { super(); this.id = id; this.promo_code = promo_code; this.value = value; this.condition = condition; this.expire_data = expire_data; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPromo_code() { return promo_code; } public void setPromo_code(String promo_code) { this.promo_code = promo_code; } public double getValue() { return value; } public void setValue(double value) { this.value = value; } public double getCondition() { return condition; } public void setCondition(double condition) { this.condition = condition; } public Timestamp getExpire_data() { return expire_data; } public void setExpire_data(Timestamp expire_data) { this.expire_data = expire_data; } @Override public String toString() { return "CodeBean [id=" + id + ", promo_code=" + promo_code + ", value=" + value + ", condition=" + condition + ", expire_data=" + expire_data + "]"; } } package nowcoder; import java.sql.Timestamp; public class Client { public static void main(String[] args) { JDBCConnector connector = new JDBCConnector("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/nowcoder","root","123456"); //插入操作 CodeBean bean = new CodeBean(); bean.setCondition(12); bean.setExpire_data(new Timestamp(System.currentTimeMillis())); bean.setId(4); bean.setPromo_code("121"); bean.setValue(2333); connector.insert(bean, "code"); //查询所有数据 for (Object object : connector.queryAll(CodeBean.class, "code")) { System.out.println(object); } } } 下面是输出结果,就几条数据
点赞 回复
分享
发布于 2016-12-11 17:43
#!/usr/bin/env python # -*- encoding: utf-8 -*- # @Date : 2015-03-05 16:51:15 # @Author : NSSimacer # @Email : wuxiaoqiang1020@gmail.com # @Version : 1.0 import MySQLdb import string import random def connect(): ''' 创建数据库连接 ''' try: conn = MySQLdb.connect( host='127.0.0.1', user='user', # 你的数据库用户名 passwd='passwd', # 你的数据库密码 db='db', # 你的数据库名 port=3306) except MySQLdb.Error, e: print 'MySQL Error %d: %s' % (e.args[0], e.args[1]) return conn def save_coupon_to_db(coupon_list): ''' 把激活码/优惠券保存到数据库 ''' try: conn = connect() cursor = conn.cursor() cursor.execute('drop database if exists py_db') cursor.execute('create database py_db') conn.select_db('py_db') cursor.execute('drop table if exists t_coupon') cursor.execute('create table t_coupon(\ id int(3) primary key,\ coupon varchar(8))') values = [] for i in xrange(len(coupon_list)): values.append((i + 1, coupon_list[i])) cursor.executemany('insert into t_coupon values(%s, %s)', values) print 'Finish!' conn.commit() cursor.close() conn.close() except MySQLdb.Error, e: print 'MySQL Error %d: %s' % (e.args[0], e.args[1]) def load_coupon(): ''' 从数据库中载入激活码/优惠券 ''' try: conn = connect() cursor = conn.cursor() print 'Loading data …' count = cursor.execute('select * from t_coupon') result = cursor.fetchall() for r in result: print r[1] print 'There are %s rows.' % count conn.commit() cursor.close() conn.close() except MySQLdb.Error, e: print 'MySQL Error %d: %s' % (e.args[0], e.args[1]) def generate_coupon(coupon_num, coupon_length): ''' 产生激活码/优惠券 ''' coupon_list = [] coupon_character_list = list(string.uppercase + string.digits) for i in xrange(coupon_num): coupon_str = '' for j in xrange(coupon_length): coupon_str += random.choice(coupon_character_list) coupon_list.append(coupon_str) return coupon_list if __name__ == '__main__': coupon_num = 200 coupon_length = 8 save_coupon_to_db(generate_coupon(coupon_num, coupon_length)) load_coupon()
点赞 回复
分享
发布于 2016-12-09 08:37
滴滴
校招火热招聘中
官网直投
因为这次只要保存,所以比较简单,主要代码用的上一期的。 数据库用的是Mysql; 直接上代码: public class MD5Util { public static void main(String[] args) { final int ACTIVATECODENUM = 200; Random random = new Random(); String candicateCode = "abcdefghijklmnopqrstuvwxyz"; candicateCode += candicateCode.toUpperCase(); candicateCode += "1234567890"; for (int i = 0; i < ACTIVATECODENUM; i++) { String res = ""; for (int j = 0; j < 6; j++) { res += candicateCode.charAt(random.nextInt(candicateCode .length())); } String pwd = MD5Util.getMD5(MD5Util.getMD5(res)); boolean x = insertToMysql(pwd); System.out.println(pwd); } } private static boolean insertToMysql(String pwd) { int n=0; try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection( "jdbc:mysql://127.0.0.1/new2017", "root", "admin"); String sql = "insert into checkNum(value) values(?)"; PreparedStatement ps = connection.prepareStatement(sql); ps.setObject(1, pwd); n = ps.executeUpdate(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return n>0?true:false; } private static String byteHEX(byte ib) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] ob = new char[2]; ob[0] = Digit[(ib >>> 4) & 0X0F]; ob[1] = Digit[ib & 0X0F]; String s = new String(ob); return s; } // 字符串加密 public static String getMD5(String source) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } messageDigest.update(source.getBytes()); byte[] b = messageDigest.digest(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < b.length; i++) { sb.append(byteHEX(b[i])); } // sb.setCharAt(sb.length()-1, (char)(sb.charAt(sb.length()-1)+1)); return sb.toString(); } } 运行效果:(数据库中)
点赞 回复
分享
发布于 2017-01-21 02:45
# db ''' 数据库设计 create table coupon_code (id int(32) not null primary key auto_increment, code varchar(256) not null unique, expire_data char(50) not null, status tinyint not null default 0); ''' import string import random import datetime import mysql.connector all_chars = string.ascii_letters + string.digits exc_chars = ['0', 'O', 'o', '2', 'Z', 'z', '1', 'l'] coupon_chars = list(set(all_chars).difference(set(exc_chars))) def generate_coupon(length): ''' 生成优惠码 length为优惠码长度 ''' return ''.join([random.choice(coupon_chars) for i in range(length)]) def get_connection(config): ''' 获取数据库连接 config为数据库配置信息 ''' try: conn = mysql.connector.connect(**config) return conn except mysql.connector.Error as e: print('connection failed!{}'.format(e)) def save_coupon_to_db(conn, coupon, expire_time): ''' 将优惠码存入数据库 ''' try: cursor = conn.cursor() sql = "insert into coupon_code(code, expire_data, status) VALUES (%s,%s,%s)" data = [coupon, expire_time, 0] cursor.execute(sql, data) conn.commit() cursor.close() except mysql.connector.Error as e: print('save coupon failed!{}'.format(e)) def get_coupon_from_db(id): ''' 从数据库中查询优惠码 ''' try: cursor = conn.cursor() sql = "select * from coupon_code where id = (%s)" data = [id] cursor.execute(sql, data) values = cursor.fetchall() cursor.close() return values except mysql.connector.Error as e: print('get coupon failed!{}'.format(e)) if __name__ == '__main__': coupon_num = 10 coupon_len = 8 coupon_list = [] db_conf = { 'host':'127.0.0.1', 'user':'root', 'password':'123456', 'port':3306 , 'database':'coupon_test', 'charset':'utf8' } for i in range(coupon_num): coupon_list.append(generate_coupon(coupon_len)) dt = (datetime.datetime.now()+datetime.timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S") for coupon in coupon_list: conn = get_connection(db_conf) save_coupon_to_db(conn, coupon, dt) for i in range(1,10): print(get_coupon_from_db(i)) 输出结果: [(1, 'wTvHn4pM', '2016-12-16 17:08:26', 0)] [(2, 'rXvdLg8F', '2016-12-16 17:08:26', 0)] [(3, 'UdhnyuFJ', '2016-12-16 17:08:26', 0)] [(4, 'whtGYsFL', '2016-12-16 17:08:26', 0)] [(5, 'k6gGBsxH', '2016-12-16 17:08:26', 0)] [(6, 'nYWdjfh8', '2016-12-16 17:08:26', 0)] [(7, 'yImQQWxf', '2016-12-16 17:08:26', 0)] [(8, '4ii8qc8e', '2016-12-16 17:08:26', 0)] [(9, 'cMhVDtYJ', '2016-12-16 17:08:26', 0)]
点赞 回复
分享
发布于 2016-12-13 17:23
不错 不错
点赞 回复
分享
发布于 2016-12-14 17:35
既然是优惠券, 那么要也要有存使用范围的字段吧, 比如是饮食券或运动券, 还有面值呢?满多少减多少等.
点赞 回复
分享
发布于 2016-12-14 19:15
Matrix42 :恭喜本期这位牛友再一次获得编程之星!~
点赞 回复
分享
发布于 2016-12-15 17:00

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务