pythoning—— 5:实战篇(购物车)

要求

1、实现多用户登录,注册功能。

2、实现商场购物,查询历史购物详单。

3、实现商品分类。

4、商品可一次购买多个,可重复购买,购买后查看已购买商品时,只显示一条

5、实现充值、更改密码功能

分析

  从题目要求和当前所掌握的知识来看,要实现该功能会用到文本操作,用来存储用户信息,多用户登录使用字典的key值作为用户名,其他如密码、历史购买信息、余额等统一作为values较为合理。注册功能便是在用户登录时做判断,如果没有该用户,则会提示注册,注册时只需添加一个以用户名为key,密码、历史购物、余额为子字典的values的键值对即可。历史购物则使用列表较为妥当,其实使用元组比列表要合理一些,但无奈json中元组是会报错的。剩下的就是对字典、列表的操作,so,come on。

流程图

数据存储格式

 数据存储格式以下例为准。

{
    "fukuda":{
        "money": 184280,
        "passwd": "king123",
         "oldshoping": [
            ["冰箱", 3, 15000, "2016-05-20 21:59:28"],
            ["休闲裤", 4, 720, "2016-05-20 21:59:38"]
            ]
        }
}

用到的知识

会用到json、datetime、文本操作等新知识。

json主要用到其两个函数dumps和loads,dumps主要是将其他数据类型(元组、列表、字典等的结合体)转换为字符串,而loads则是反着来。这对本题的文本操作有很大的作用。

datetime主要会用到datetime.now,来获取当前时间,并截取字段,将值转换为YYYY-MM-DD hh:mm:ss的格式,以完善丰富用户购买信息。

文本的话会用到open,open的用法是f = open(‘textname‘,‘[r|a|w]‘),r代表只读,w代表写入,且如果没有该文本,则会创建,a则是二者结合。

模块编写

额。本来是应该有这块的吧,可惜代码实现的略糙,没法拿出来现了,直接全贴到下面拉倒。

实现

#!/user/bin/evn python
# -*- coding:utf-8 -*-
# Author : hft
import json
import datetime

def get_time():#获取当前时间
    time_now = datetime.datetime.now()
    time_now = str(time_now)
    time_now = time_now[:time_now.index(".")]
    return time_now
def recode_shop(user_msg):#记录购买日志
    f = open("test.txt","w")
    user_msg = json.dumps(user_msg)
    f.write(user_msg)
    f.close()
def shopcar_to_old(shop_car,oldshopping):#将购物车添加至历史购物信息中
    if len(shop_car) == 0:
        return oldshopping
    else:
        oldshopping.extend(shop_car)
        return oldshopping
def show_shopping(shopping):#显示购买信息
    print("商品\t\t数目\t\t金额\t\t时间")
    for item in shopping:
        print(item[0],"\t\t",item[1],"\t\t\t",item[2],"\t\t",item[3])

pro_list = [["家电类",["电视机",1500],["冰箱",5000],["空调",3000]],
            ["衣服类",["衬衫",100],["卫衣",150],["休闲裤",180]],
            ["手机类",["小米",1120],["苹果",5888],["魅族",2000]]]

format = ‘%s%-*s%*s%s‘#定义格式化输出,如“+商品名:   电视机+”为format%("+",20,"商品名:",20,"电视机","+")

if __name__ == "__main__":#主函数
    f = open("test.txt","r")#读入文本
    user_msg = f.read()
    f.close()
    user_msg = json.loads(user_msg)
    print("登录".center(20,"*"))
    while True:
        input_name = input("username:")
        if input_name in user_msg:
            input_pass = input("password:")
            if input_pass == user_msg[input_name]["passwd"]:
                print("登录成功!".center(20,"*"))
                break
            else:
                print("密码错误!")
        else:
            user_new = input("该用户不存在,是否需要注册该用户(Y/N):")
            if user_new == ‘Y‘ or user_new == ‘y‘:
                print("注册-[%s]-".center(20,"#")%input_name)
                input_pass = input("请输入密码:")
                user_msg[input_name] = {"passwd":input_pass,"money":0,"oldshoping":[]}
                break
            else:
                login_con = input("继续登录(Y/N):")
                if login_con == ‘N‘ or login_con == ‘n‘:
                    exit("欢迎下次光临")
                elif login_con == ‘Y‘ or login_con == ‘y‘:
                    continue
                else:
                    print("输入有误")
    while True:
        print("欢迎光临".center(50,"*"))
        user_cho = input("A:充值、C:更改密码、O:查看历史购物、S:购物、Q:结束\n%s请选择:"%("*"*20))#用户输入去向
        shop_car = []#定义购物车
        if user_cho == ‘A‘ or user_cho == ‘a‘:#充费
            while True:
                input_add = input("请输入充值金额:")
                if input_add.isdigit():
                    user_msg[input_name]["money"] = user_msg[input_name]["money"] + int(input_add)
                    print("充值成功,充值金额为:[%s],余额为:[%s]"%(input_add,user_msg[input_name]["money"]))
                    break
                else:
                    print("输入有误,请重新输入(输入必须为数字):")
        elif user_cho == ‘C‘ or user_cho == ‘c‘:#变更密码
            change_pass = input("请输入变更后的密码:")
            change_pass_sure = input("请确认密码:")
            if change_pass == change_pass_sure:
                user_msg[input_name]["passwd"] = change_pass
            else:
                print("两次输入不一致!")
        elif user_cho == ‘S‘ or user_cho == ‘s‘:#购物,你妹夫的,终于写到这了。
            break_flat = False#定义跳出购物参数
            while break_flat == False:#购物开始,这次真的开始

                print ("购物".center(40,"="))
                for item in pro_list:
                    print(pro_list.index(item)+1,".\t",item[0])
                cho_menu = input("请输入您要购买的商品类型(按Q退出,按C查看已购商品,按E退出程序):")
                if cho_menu.isdigit() and int(cho_menu) in range(1,len(pro_list)+1):
                    while True:#分类购物
                        cho_menu = int(cho_menu)
                        print(str(pro_list[cho_menu-1][0]).center(30,"="))
                        for items in pro_list[cho_menu-1][1:]:
                            a = 15-len(items[0])
                            print(("=%-2s.%-*s%10s¥ =")%(pro_list[cho_menu-1].index(items),a,items[0],items[1]))
                        print("="*33)
                        cho_shop = input("请输入您要购买的商品(按Q退出,按C查看已购商品,按B返回上级目录,按E退出程序):")
                        if cho_shop.isdigit():
                            cho_shop = int(cho_shop)
                            if cho_shop <= len(pro_list) and cho_shop > 0:
                                items = pro_list[cho_menu-1][cho_shop]
                                while True:
                                    cho_count = input("请输入要购买的件数:")
                                    if cho_count.isdigit() and int(cho_count) > 0:
                                        cho_count = int(cho_count)
                                        if cho_count*items[1] <= user_msg[input_name]["money"]:
                                            user_msg[input_name]["money"] = user_msg[input_name]["money"] -                                                                             cho_count*items[1]#求余额
                                            print("购买成功".center(30,"+"))
                                            print(format % ("+", 20, "商品名",10-int(len(items[0]))-1,items[0], "+"))
                                            print(format % ("+", 20, "数量", 10,cho_count, "+"))
                                            print(format % ("+", 20, "花费", 10,items[1]*cho_count, "+"))
                                            print(format % ("+", 20, "余额", 10,user_msg[input_name]["money"], "+"))
                                            print("end".center(34,"+"))
                                            shop_car_pro = []
                                            for i in shop_car:
                                                shop_car_pro.append(i[0])
                                            if items[0] in shop_car_pro:
                                                shop_car[shop_car_pro.index(items[0])][1] = shop_car[shop_car_pro.index(items[0])][1] + cho_count
                                                shop_car[shop_car_pro.index(items[0])][2] = shop_car[shop_car_pro.index(items[0])][1]*items[1]
                                                shop_car[shop_car_pro.index(items[0])][3] = get_time()
                                            else:
                                                a = [items[0],cho_count,items[1]*cho_count,get_time()]
                                                shop_car.append(a)
                                        else:
                                            print("余额不足,余额为[%s]"%(user_msg[input_name]["money"]))
                                        break
                                    else:
                                        print("输入需为大于0数字!")
                            else:
                                print("请输入正确的数字")
                        elif cho_shop == ‘Q‘ or cho_shop == ‘q‘:
                            user_msg[input_name]["oldshoping"] = shopcar_to_old(shop_car,user_msg[input_name]["oldshoping"])
                            print ("退出购物")
                            break_flat = True
                            recode_shop(user_msg)
                            break
                        elif cho_shop == ‘C‘ or cho_shop == ‘c‘:
                            show_shopping(shop_car)
                        elif cho_shop == ‘E‘ or cho_shop == ‘e‘:
                            user_msg[input_name]["oldshoping"] = shopcar_to_old(shop_car,user_msg[input_name]["oldshoping"])
                            recode_shop(user_msg)
                            exit ("欢迎下次光临!")
                        elif cho_shop == ‘B‘ or cho_shop == ‘b‘:
                            break
                        else:
                            print("输入有误")
                elif cho_menu == ‘Q‘ or cho_menu == ‘q‘:
                    user_msg[input_name]["oldshoping"] = shopcar_to_old(shop_car,user_msg[input_name]["oldshoping"])
                    print("退出购物")
                    break_flat = True
                elif cho_menu == ‘E‘ or cho_menu == ‘e‘:
                    user_msg[input_name]["oldshoping"] = shopcar_to_old(shop_car,user_msg[input_name]["oldshoping"])
                    recode_shop(user_msg)
                    exit("欢迎下次光临!")
                elif cho_menu == ‘C‘ or cho_menu == ‘c‘:
                    show_shopping(shop_car)
                else:
                    print("输入有误,重新输入!")
        elif user_cho == ‘O‘ or user_cho == ‘o‘:
            show_shopping(user_msg[input_name]["oldshoping"])
        elif user_cho == ‘Q‘ or user_cho == ‘q‘:
            print("欢迎下次光临!")
            recode_shop(user_msg)
            break
时间: 2024-10-12 15:54:55

pythoning—— 5:实战篇(购物车)的相关文章

《黑客攻防技术宝典Web实战篇》.Dafydd.Stuttard.第2版中文高清版pdf

下载地址:网盘下载 内容简介 编辑 <黑客攻防技术宝典(Web实战篇第2版)>从介绍当前Web应用程序安全概况开始,重点讨论渗透测试时使用的详细步骤和技巧,最后总结书中涵盖的主题.每章后还附有习题,便于读者巩固所学内容. <黑客攻防技术宝典(Web实战篇第2版)>适合各层次计算机安全人士和Web开发与管理领域的技术人员阅读.本书由斯图塔德.平托著. 目录 编辑 第1章 Web应用程序安全与风险 1.1 Web应用程序的发展历程 [1] 1.1.1 Web应用程序的常见功能 1.1.

caffe框架下目标检测——faster-rcnn实战篇操作

原有模型 1.下载fasrer-rcnn源代码并安装 git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git 1)  经常断的话,可以采取两步: git clone https://github.com/rbgirshick/py-faster-rcnn.git 2)  到py-faster-rcnn中,继续下载caffe-faster-rcnn,采取后台跑: git submodule update --in

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

XenApp_XenDesktop_7.6实战篇之十九:安装、升级和配置StoreFront 3.0

CitrixXenDesktop7.6 Feature Pack 2中发布了StoreFront 3.0,本章节为大家分享如何全新部署.升级和配置StoreFront 3.0.默认XenDesktop 7.6光盘自带的StoreFront版本为2.6.0.5031.注意升级和全新部署StoreFront 3.0使用的安装程序是一致的. 1.  全新部署StoreFront 3.0 1.1   将CTXSF01服务器加入域,并使用具备本地管理员权限的域账户进行登录 1.2   运行StoreFro

2天驾驭DIV+CSS (实战篇)(转)

这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是实战篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” 将你引入两大误区[知识三] 什么是W3C标准?[基础一] CSS如何控制页面[基础二] CSS选择器[基础三] CSS选择器命名及常用命名[基础四] 盒子模型[基础五] 块状元素和内联元素 实战篇[第一课] 实战小热身[第二课] 浮动[第三课] 清除浮动[第四课] 导航条(上) | 导航条(下)[大练

Java 基础:认识&理解关键字 native 实战篇

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个navicat呢?这是我所要学习的地方.所以今天泥瓦匠想要总结下navicat. 一.认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这

漫游kafka实战篇之搭建Kafka开发环境

转载注明出处:http://blog.csdn.net/honglei915/article/details/37563647 上篇文章中我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息.下面我们来搭建kafka的开发环境. 添加依赖 搭建开发环境需要引入kafka的jar包,一种方式是将Kafka安装包中lib下的jar包加入到项目的classpath中,这种比较简单了.不过我们使用另一种更加流行的方式:使用maven管理jar包依赖. 创建好mav

Systemd 入门教程:实战篇

Systemd 入门教程:实战篇 上一篇文章,介绍了 Systemd 的主要命令,这篇文章主要介绍如何使用 Systemd 来管理我们的服务,以及各项的含义: 一.开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件,如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例). $ sudo systemctl enable httpd 上面的命令相当于在/etc/systemd/system目

javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

引言: 此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  --> javamail模拟邮箱功能发送电子邮件-基础实战篇 上一篇章简单讲解了javamail发送邮件的基本基础和用到的几个类,并且所有初始化和发送方法都封装在一个类里面(为了代码方便演示),本章节将对各个模块进行拆分和优化,并且引入附件发送的方法 要想邮件发送附件,就要引入两个新类  Multipart 和 BodyPart 两类 Multipart(报文部件容器) 实则为一个报文容器,而邮件消息  Msage 是由各个子

Linux 命令详解(八)Systemd 入门教程:实战篇

Systemd 入门教程:实战篇 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html