以前写的商城购物车练习,内容比较少,代码也比较初级~~,记录下来,以后可以查看。
#-*-coding:utf-8-*- ''' 网上银行 功能: 1.新注册用户提供额度15000 2.主要功能:查询、购物、充值、流水账 3.购物车功能、结算功能、充值消费功能 ''' import time,sys,os,json,re,collections,md5,hashlib import cPickle as p import xml.dom.minidom as xmls from xml.etree.ElementTree import Element,ElementTree defaulten = sys.getdefaultencoding() reload(sys) sys.setdefaultencoding(defaulten) class bankCount: #global nameUser #global moneyToPay def __init__(self): self.shopList = '' self.payMoney = 0 self.nameUser = '' self.moneyToPay = '' self.no = [u'查询',u'购物',u'还款',u'账单'] self.countDict = collections.OrderedDict()#总购物清单 self.nowDict = collections.OrderedDict()#临时清单 self.times = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) def login(self,username,password): '''登录网上银行''' #print '--登录--' try: #print '如果可以获取username的 name 和 password属性值' name = self.xmlAttr(username,'name') paswd = self.xmlAttr(username,'password') except: #print '获取username的属性失败,需要注册' self.loginError() if name and password: #print 'name:',name #print 'paswd:',paswd #print 'username:',username #print 'password:',paswd hashs = hashlib.md5() hashs.update(password) passwords = hashs.hexdigest() if username == name and passwords==paswd: self.hello(username) else: self.loginError() def hello(self,username): '''登录进银行界面''' time.sleep(0.5) print '登陆成功!' self.nameUser = username time.sleep(0.5) print '欢迎来到世纪银行,很高兴为您服务!' print '请选择您的业务!' self.cmd(username) def cmd(self,username): message = zip(['1','2','3','4'],self.no) print '='*40 print ' '*2,'-*-序 号-*-' + ' ' +'-*-业 务-*-' for i in range(len(message)): print ' '*7,message[i][0] + ' ' +message[i][1] print '='*40 cmds = raw_input('请选择您的业务序号:').strip() if cmds: if ord(cmds)==49: print '+'*45 print '| 个人信息查询中心! |' print '+'*45 time.sleep(1) self.chaXun(username) elif ord(cmds)==50: print '+'*45 print '| 欢迎进入购物中心! |' print '+'*45 time.sleep(1) self.shop(username) elif ord(cmds)==51: print '+'*45 print '| 欢迎进入充值中心! |' print '+'*45 time.sleep(1) self.huanKuan() elif ord(cmds)==52: print '+'*45 print '| 账号收支记录中心! |' print '+'*45 time.sleep(1) self.detial() else: print '您输入的指令有误,请确认后重新输入!' time.sleep(0.5) self.cmd(username) else: print '您的序号输入有误,请重新输入!' def yon(self,username): '''每个指令的返回和重新执行动作''' while 1: print '下一步操作:\n 1 返回主菜单\n 2 退出系统' num = raw_input('请输入指令:').strip() if num: if ord(num)==49: self.cmd(username) break elif ord(num)==50: self.close() else: print '您输入的指令有误,请确认后输入!' time.sleep(0.5) else: print '您的指令有误,请重新输入!' time.sleep(0.5) def chaXun(self,username): '''查询余额''' print '以下为您的最新余额信息:' print '~'*80 counts = self.xmlAttr(username,'count') times = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #print 'counts:',counts comment = u'%s%s%s%s'% (u'截止',str(times),u',您的账户余额是:' ,str(counts)) for i in comment: print i, time.sleep(0.1) print print '~'*80 time.sleep(2) self.yon(username) def shop(self,username): '''购物''' fruit = {'苹果':5.52,'香蕉':3.20,'梨':2.81,'樱桃':4.32,'香瓜':3.52,'火龙果':5.52,'香橙':2.63} vagetables = {'萝卜':0.63,'芹菜':0.82,'韭菜':0.24,'南瓜':0.64,'土豆':0.35,'番茄':0.54,'黄瓜':0.61,'香菇':1.02} sock = {'薯片':8.5,'巧克力':25,'布丁':5,'罐头':8,'果冻':12,'麦片':10,'水果糖':18} tools = {'卫生纸':2,'毛巾':15,'垃圾袋':10,'洗发水':20,'拖布':15,'收纳盒':18} dress = {'西服':204,'T恤':85,'裙子':245,'短裤':152,'风衣':180,'羽绒服':208} shopList = {'水果':fruit,'蔬菜':vagetables,'零食':sock,'日用品':tools,'服装':dress} print '您好,欢迎来到购物中心,请选择要购买的物品!' lists = zip([i for i in range(len(shopList.keys()))],shopList.keys()) while 1: print '*'*40 print ' '*6,'< 序 号 >',' ','< 类 别 >' for i in range(len(lists)): print ' '*9,lists[i][0],' '*10,lists[i][1] print '*'*40 num = raw_input('请输入序号进入相应的购物区:').strip() if num and ord(num)<ord(str(len(shopList.keys()))): num = int(num) #print 'shopList[lists[num][1]]:',shopList[lists[num][1]] self.shopping(lists[num][1],shopList[lists[num][1]])#shopList[lists[num][1]]是对应的物品list else: print '您输入的序号不正确,请重新输入!' time.sleep(0.5) def shopping(self,name,nameList): '''购物区,根据不同的商品列表返回相应的内容''' #name:选择的商品区域 #nameList:选择的商品列表 print '欢迎来到%s购物区,请浏览商品列表,并输入你需要购物的物品序号!'%name while 1: n_v_list = zip([i for i in range(len(nameList))],nameList.keys(),nameList.values()) print '-'*80 print ' '*6,'序号',' '*4,'价格',' '*4,'名称' for i in range(len(n_v_list)): n = 0 a = n_v_list[i][0],' '*2,n_v_list[i][1],' '*2,n_v_list[i][2] for j in a: n += len(str(j)) print ' %-9s¥%-9s%-10s'%(a[0],a[4],a[2]) #print ' '*6,a[0],' '*6,a[2],' '*4,a[4] print '-'*80 num = raw_input('请输入商品序号:').strip() #n_v_list[num][1] 是商品的名字,也是nameList的key if num.isdigit() and int(num)<len(nameList.keys()): a = 1 num = int(num) while a ==1: num2 = raw_input('请输入你需要多少数量/斤:').strip() if num2 and num2.isdigit(): keyName = n_v_list[num][1] print '您好,您本次购物:\n 名称:%s 数量:%s'%(keyName,num2) times = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()) #print 'keyName:',keyName #print 'num2:',num2 dicts = collections.OrderedDict() dicts[keyName]=num2 self.countDict[times]=dicts self.nowDict[times]=dicts #print 'self.countDict:',self.countDict self.jiSuan(self.nowDict,nameList) while 1: cmd = raw_input('您是否需要继续购物:\n 1:是\n 2:否\n输入指令:').strip() if cmd: if ord(cmd)==49: return elif ord(cmd)==50: print '进入结算系统!' self.pay() return else: print '您的操作有误,请重新输入!' time.sleep(0.5) else: print '请输入有效指令!' time.sleep(0.5) break else: print '您好,请输入正确的数字!' time.sleep(0.5) else: print '您好,您输入的商品号不存在,请重新输入!' time.sleep(0.5) def pay(self): '''结算支付系统''' #shopList:购物清单 #payMoney:支付金额 print '欢迎进入支付系统!您的购物清单如下:' print self.shopList print '您总共需要支付¥%s的费用!'%self.payMoney self.moneyToPay = self.payMoney print '结算中', for i in '.'*5: print i, time.sleep(0.5) print self.total(self.payMoney,False) def jiSuan(self,items,nameList): '''数据处理中心''' #items={ 时间 :{ 物品 : 数量 } } #keyName:商品名,用来从商品列表中获取价格 #nameList:商品列表 print print '您目前的购物车信息如下:' keysList = items.keys() keysList2 = self.countDict.keys() # print 'items:',items # print 'keysList:',keysList for i in keysList2: name2 = self.countDict[i].keys()[0] num2 = self.countDict[i].values()[0] print ' %s 数量: %s'%(name2,num2) print for i in keysList: #print 'items[i].keys()',items[i].keys() shopName = items[i].keys()[0] shopNums = items[i].values()[0] #print 'nameList:',nameList #print 'shopName:',shopName values = nameList[shopName] a = i +' '+shopName+' 数量 '+shopNums+'\n' self.shopList += a self.payMoney += int(shopNums)*int(values) self.nowDict = collections.OrderedDict() return def total(self,menoy,how=True): '''改动余额,如果how为True,则充值;如果how为False,则扣款,不足时提示;均返回最后余额''' #menoy:改动的金额 #how:True则充值,False则扣款 #print 'self.nameUser:',self.nameUser nameusers = self.nameUser count = self.xmlAttr(nameusers,'count') if how: self.changeXml(nameusers,'count',(int(count)+int(menoy))) time.sleep(1) self.write('充值金额:%s'%int(menoy)) print '充值成功!' time.sleep(1) print '您目前的余额是%s'%(int(count)+int(menoy)) self.yon(nameusers) else: if int(count) > int(menoy): self.changeXml(self.nameUser,'count',(int(count)-int(menoy))) print '支付成功,您目前的余额是%s'%(int(count)-int(menoy)) detials = '' # print 'self.countDict:',self.countDict for i in self.countDict.keys(): #print 'self.countDict[i][0]:',self.countDict[i].keys()[0] #print 'self.countDict[i][1]:',self.countDict[i].values()[0] detials += ' %s*%s '%(self.countDict[i].keys()[0],self.countDict[i].values()[0]) # print 'detials:',detials self.write('支付 %s,总共%s元'%(detials,menoy)) self.countDict = collections.OrderedDict() self.shopList = '' self.payMoney = 0 self.yon(self.nameUser) else: print '抱歉,您的余额不足,你需要支付的金额是%s,您的账户余额是%s'%(menoy,count) while 1: cmd = raw_input('请问您需要去充值页面吗?选择1进入充值页面,选择2停留在当前页面:').strip() if cmd: if ord(cmd) == 49: self.moreMoney() n =1 while n == 1: cmd = raw_input('您是否需要继续支付?\n 按1继续支付\n 按2退出支付\n选择:').strip() if cmd and cmd.isdigit(): if ord(cmd)==49: n =2 self.total(self.moneyToPay,False) elif ord(cmd) == 50: n =2 self.yon(self.nameUser) else: print '你的输入指令有误,请重新输入!' time.sleep(0.5) else: print '您好,您输入的指令无效!' time.sleep(0.5) elif ord(cmd)==50: self.yon(self.nameUser) else: print '您的输入有误,请重新选择!' time.sleep(0.5) else: print '请输入指令!' time.sleep(0.5) break def write(self,detials,files='data.xml'): '''记录交易''' detial1 = self.xmlAttr2(self.nameUser,'countDetial') times = time.strftime("%y-%m-%d %H:%M:%S",time.localtime()) detial1[times] = detials self.changeXml(self.nameUser,'countDetial',detial1) def moreMenoy(self): '''存款充值页面''' money = raw_input('请输入您要充值的金额(一次最多10000元,总金额上限100000元):').strip() if money and money.isdigit(): if int(money) <= 10000: now = self.xmlAttr(self.nameUser,'count') now2 = int(now)+int(money) if int(now2) <= 100000: self.changeXml(self.nameUser,'count',now2) print '充值成功,您目前的余额是:%s元'%now2 self.write('充值%s元'%now2) return else: print '对不起,您(穷)的(逼)余(你)额(有)已(这)超(多)上(钱)限(么)!' time.sleep(1) self.moreMenoy() else: print '您好,单次充值金额不能大于10000,请重新输入金额!' time.sleep(1) self.moreMenoy() else: print '对不起,您输入的金额无效,如果有钱就请输入合理的数字,如果没钱就请滚粗!' time.sleep(1) self.moreMenoy() def huanKuan(self): '''存款系统''' print print '~'*50 money = raw_input('请输入您要充值的金额:').strip() print '~'*50 print if money and money.isdigit(): self.total(money) return else: print '请输入合法的金额!' self.huanKuan() self.yon(self.nameUser) def detial(self): '''账号消费充值记录''' print '以下为您的最新交易信息:\n' print '~'*100 detials = self.xmlAttr2(self.nameUser,'countDetial') for i in detials.keys(): print i, ' ',detials[i] print '~'*100 print self.yon(self.nameUser) def loginError(self): '''登录失败''' #print '--登录失败--' print '登录失败!' while 1: order = raw_input('您好,你的账号或密码错误,\n 选择1可重新输入\n 选择2可进行注册\n请选择:').strip() if order and len(order)==1 and order.isdigit(): if ord(order) == 49: print '--重新输入--' self.start() return elif ord(order) == 50: print '--注册--' self.regist() return else: print '您好,您的指令输入有误,请确认后输入!' time.sleep(0.5) else: print '您好,您的指令输入有误,请确认后输入!' time.sleep(0.5) def start(self): '''程序开始''' #print '--开始--' cmds = raw_input(' 登录请按1\n 注册请按2\n指令:').strip() if cmds and cmds.isdigit(): if ord(cmds)==49: #print '--输入账户--' username = raw_input(u'请输入您的账户:').strip() if username: while 1: #print '--输入密码--' password = raw_input(u'请输入您的6位数字密码:').strip() if password and password.isdigit() and len(password)==6: if os.path.exists('data.xml'): #print '如果存在data.xml' self.login(username,password) return else: #print '如果不存在data.xml' self.files() #print 'data.xml文件创建完毕,进行登录' self.login(username,password) return else: print '您的密码无效,请重新输入,有效密码为6位数字!' time.sleep(0.5) else: self.start() elif ord(cmds)==50: self.regist() self.start() else: print '您输入的指令有误!' time.sleep(0.5) self.start() else: print '您输入的指令有误!' time.sleep(0.5) self.start() def files(self,files='data.xml'): '''创建xml''' impl = xmls.getDOMImplementation() dom = impl.createDocument(None,'eBank',None) ele = dom.createElement('countDetial') root = dom.documentElement root.appendChild(ele) f = open(files,'w') dom.writexml(f,addindent=' ',newl='\n') f.close() #print 'data.xml文件创建完毕,进行登录' return def regist(self): '''注册''' if os.path.exists('data.xml'): #print '如果存在data.xml' userName = raw_input('请输入您的账户名,以字母开头:').strip() if not self.xmlTag(userName): while userName[0].isalpha(): password = raw_input('请输入6位数字密码:').strip() if len(password)==6 and password.isdigit(): hashs = hashlib.md5() hashs.update(password) passwords = hashs.hexdigest() self.writeXml(userName,'name',userName) self.changeXml(userName,'password',passwords) self.changeXml(userName,'count','15000') self.changeXml(userName,'countDetial',"collections.OrderedDict([])") print '注册完成,自动进行登录' self.login(userName,password) break else: print '请输入6位数字密码!' time.sleep(0.5) else: print '您输入的账号格式有误,请重新输入!' time.sleep(0.5) self.regist() else: print '你输入的账号已存在,请直接登录或重新输入!' time.sleep(0.5) while 1: num = raw_input('1 登录\n2 重新注册').strip() if num and num.isdigit(): if ord(num)==49: self.start() break elif ord(num)==50: self.regist() break else: print '您输入的指令有误,请重新输入!' time.sleep(0.5) else: print '您输入的指令有误,请重新输入!' time.sleep(0.5) else: #print '如果不存在data.xml' self.files() self.regist() def changeXml(self,tagName,Name,values,files='data.xml'): '''修改xml属性''' #tagName:标签名 #Name:属性名 #values:属性值 tree = ElementTree() #打开文件 tree.parse(files) notes = tree.findall('countDetial/%s'%tagName) #获取符合条件的所有节点 if len(notes) != 0: if type(values) is not str and type(values) is not int: notes[0].set(Name,'collections.%s'%values) else: notes[0].set(Name,'%s'%values) tree.write('data.xml', encoding="utf-8",xml_declaration=True) def writeXml(self,tagName,Name,values,files='data.xml'): '''写入xml''' #tagName:标签名 #Name:属性名 #values:属性值 tree = ElementTree() tree.parse(files) #打开文件 first = tree.find('countDetial') #print 'first',first notes = tree.findall('countDetial/%s'%tagName) #获取符合条件的所有节点 #print 'notes',notes if len(notes) != 0: if type(values) is not str and type(values) is not int: notes[0].set(Name,'collections.%s'%values) else: notes[0].set(Name,'%s'%values) else: if type(values) is not str and type(values) is not int: note = Element(tagName,{'%s'%Name:'collections.%s'%values}) else: note = Element(tagName,{'%s'%Name:'%s'%values}) first.append(note) tree.write('data.xml', encoding="utf-8",xml_declaration=True) def xmldata(self,tagName,files='data.xml'): '''从XML文件中查找对应的text数据''' dom = xmls.parse(files) data = dom.getElementsByTagName(tagName) name = data[0].firstChild.data return name def xmlAttr(self,tagName,attr,files='data.xml'): '''获取xml文件中的属性值''' #tagName:标签名 #attr:属性名 #print '--获取%s的%s属性--'%(tagName,attr) dom = xmls.parse(files) data = dom.getElementsByTagName(tagName) value = data[0].getAttribute(attr) #print '获取到的属性值',value return value def xmlAttr2(self,tagName,attr,files='data.xml'): '''获取xml文件中的属性值''' #tagName:标签名 #attr:属性名 #print '--获取%s的%s属性--'%(tagName,attr) dom = xmls.parse(files) data = dom.getElementsByTagName(tagName) value = data[0].getAttribute(attr) #print '获取到的属性值',value return eval(value) def xmlTag(self,userName,files='data.xml'): '''从xml中获取标签''' #userName:标签名,也是用户名 dom = xmls.parse(files) data = dom.getElementsByTagName(userName) return data def close(self): '''系统退出''' self.countDict = collections.OrderedDict() self.shopList = '' self.payMoney = 0 print '欢迎下次光临,再见!' time.sleep(2) sys.exit() a = bankCount() a.start()