#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : user_login_register_shopping.py
# @Author: Anthony.waa
# @Date : 2018/5/23 0023
# @Desc : # 用户登录状态
flag_user = False # 用户登录
def login():
'''
:param name: 用户名
:param passwd: 用户登录密码
:return: 实现三次登录成功
''' count = 1 login_name_passwd = {} with open('user_pwd.txt', 'r', encoding='utf-8')as f:
for line in f.readlines(): login_name = line.split(',')[0].strip()
login_pwd = int(line.rsplit(',')[-1].strip())
login_name_passwd[login_name] = login_pwd name = input('请输入用户名:').strip()
passwd = int(input('请输入密码:').strip())
while True:
if name in login_name_passwd and passwd == login_name_passwd.get(name):
flag_user = True
else:
flag_user = False if flag_user == True:
print('登录成功')
shopping()
else:
print('用户名或密码错误,请重新输入')
name = input('请输入用户名:').strip()
passwd = int(input('请输入密码:').strip())
count += 1 if count == 3:
print('用户名、密码输入错误超过3次,账户已锁定')
exit() # 用户注册
def register():
'''
:param name: 用户注册
:param passwd: 用户注册使用的密码
:return:
'''
flag_register = True
register_name_passwd = {}
with open('user_pwd.txt', 'r', encoding='utf-8')as f, open('user_pwd.txt', 'a', encoding='utf-8') as f1:
for line in f.readlines():
register_name = line.split(',')[0].strip()
register_passwd = line.split(',')[1].strip()
register_name_passwd[register_name] = register_passwd name = input('请输入注册用户名:').strip()
passwd = int(input('请输入注册密码:').strip()) while True:
if name in register_name_passwd:
flag_register = True # 该用户已经存在,请重新注册
else:
flag_register = False # 该用户不存在,注册成功 if flag_register == False:
f1.write(name), f1.write(','), f1.write(str(passwd)), f1.write('\n'),
f1.close()
print('用户注册成功')
print('请登录...')
break else:
print('用户已存在,请重新注册')
name = input('请输入用户名:').strip()
passwd = int(input('请输入密码:').strip()) # 购物车
def shopping():
'''
:return:返回商品清单
'''
# 原始购物清单
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]
# 购物车
shopping_car = {}
# 购物车遍历
shopping_car_list = [] # 商品个数
good_count = 1 # 商品单价
shopping_price = {} # 输入不合法是打印
def return_error():
print("\033[1;31m 输入不合法,请重新输入 \033[0m") # 打印购物车商品和剩余金额
def end_shopping(): # 获取原始列表中的名称和价格
for list_goods_price in goods:
shopping_price[list_goods_price['name']] = list_goods_price['price']
with open('shopping_list.txt', 'w', encoding='utf-8') as shoppingf:
# 获取购物车中的名称和个数,并从中找到与原始列表中名称所对应的价格
for list_shopping_name, list_shopping_count in shopping_car.items():
shoppingf.writelines('商品名称:{0},商品个数:{1}个,商品价格:{2}元\n'.format(list_shopping_name, list_shopping_count,
shopping_price[list_shopping_name]))
# 格式化购物车商品名称和个数
for list_name in shopping_car:
print('\033[1;32m 商品名称:{0} 商品个数:{1} \033[0m'.format(list_name, shopping_car[list_name]))
print("\033[1;32m 剩余金额为:{0}\033[0m".format(all_money)) while True:
# 用户输入总资产
all_money = input("\033[1;32m 请输入总资产: \033[0m").strip()
if all_money.isdigit():
all_money = int(all_money)
# 显示购物商品列表
print('\033[1;32m ========== 商 品 清 单 ========== \033[0m'.center(20))
for good_index, good in enumerate(goods, 1):
print('\033[1;32m {0} {1} {2} \033[0m'.format(good_index, good['name'],
good['price']).center(20))
print('\033[1;32m 选择"q"退出 \033[0m'.center(20))
while True:
# 选择商品序号,或选择退出购物
choice_count = input("\033[1;32m 请输入商品序号: \033[0m").strip()
if choice_count.isdigit():
choice_count = int(choice_count)
# 商品序号小于商品列表长度
if choice_count > 0 and choice_count <= len(goods):
good_price = goods[choice_count - 1]['price']
# 用户资产大于商品价格,否则提示充值
if all_money > good_price:
good_name = goods[choice_count - 1]['name']
all_money -= good_price
# 商品是否存在购物车中
if good_name not in shopping_car:
shopping_car[good_name] = good_count
else:
for shopping_index, shopping_name in enumerate(shopping_car):
if shopping_name == good_name:
shopping_car[shopping_name] += 1 end_shopping() else:
print('\033[1;31m 余额不足,请充值: \033[0m'.center(17))
add_money = input("请输入总资产:").strip()
if add_money.isdigit():
add_money = int(add_money)
all_money += add_money
print('\033[1;32m 充值成功,剩余金额为: \033[0m'.center(17), all_money)
continue
elif choice_count.lower() == 'q':
print("\033[1;32m 购物结束,欢迎下次光临 \033[0m")
end_shopping()
exit()
return_error() # 主体函数
def main_menu():
# 打印选项菜单
print('{0}\n{1}\n{2}\n{3}'.format('选项菜单如下:', '1.注册', '2.登录', '3.购物车'))
while True:
choice = int(input('请输入菜单序号:').strip())
if choice == 1:
print('欢迎进入用户注册界面:')
register()
continue
elif choice == 2:
login()
elif choice == 3:
if flag_user == True:
login()
else:
print('请登录后,再试...')
else:
print('输入有误,请重新输入..') main_menu()

User_Login_Register_Shopping 1.0的更多相关文章

  1. User_Login_Register_Shopping+装饰器 3.0

    #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/5/27 0027 14:07# @Author : Anthony.Waa# @ ...

  2. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  3. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  4. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  5. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  6. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  7. Elasticsearch 5.0 中term 查询和match 查询的认识

    Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...

  8. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  9. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

随机推荐

  1. map 和 for

    一.map 函数封装. ; [,,,,,,,].map(function(elem){ sum += elem; }) console.log('sum='+sum); 二.平时用for的写法. ,, ...

  2. RAP开发入门-布局管理

    布局类继承关系 FillLayout  new FillLayout(SWT.VERTICAL/HORIZONTAL)设置竖直/水平填充 RowLayout wrap折行显示.pack自适应布局(布局 ...

  3. (转)shiro权限框架详解03-shiro介绍

    http://blog.csdn.net/facekbook/article/details/54893740 shiro介绍 本文正式进入主题.本文将介绍如下内容: 什么是shiro 为什么需要学习 ...

  4. SpringMVC(五)@RequestHeader和@CookieValue

    通过使用@RequestHeader获取请求头 通过使用@CookieValue获取cookie值 代码: 1: @Controller 2: public class TestHeader_Cook ...

  5. 如何使用Matlab做数字信号处理的仿真1

    例如 第三版数字信号处理P51 -1.14习题时域离散信号的相关性研究x(n)=Asin(ωn)+u(n),其中ω=π/16,u(n)是白噪声,现要求 ⑴.产生均值为0,功率P=0.1的均匀分布白噪声 ...

  6. vue 面试题 2019

    vue核心知识点 1.对于Vue是一套渐进式框架的理解 渐进式代表的含义是:主张最少. Vue可能有些方面是不如React,不如Angular,但它是渐进的,没有强主张,你可以在原有大系统的上面,把一 ...

  7. Mysql学习总结(37)——Mysql Limit 分页查询优化

    select * from table LIMIT 5,10; #返回第6-15行数据 select * from table LIMIT 5; #返回前5行 select * from table ...

  8. JavaScript(DOM编程一)

    在什么位置编写js代码 一般把js代码写在window.onload方法中 执行该方法时页面已经加载完毕,可以获取到所有的dom元素 --------------------------------- ...

  9. ie7 text-indent input影响

    IE6/IE7中text-indent对input背景的影响 在text-indent在IE6/IE7中的位置偏移BUG一文中讨论过IE6/IE7中inline-block元素设置text-inden ...

  10. [Azure][Windows Azure介绍]C1了解Windows Azure

    本章介绍了Windows Azure平台,并介绍了该平台提供的不同的服务和解决方案.本章主要针对还不熟悉什么Windows Azure是和它能做什么的读者.如果你已经熟悉了Windows Azure, ...