作业需求

1. 购物系统,能够注册登录,用户第一次登录后,让用户输入金额,然后打印商品列表
2. 允许用户根据商品编号购买商品
3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4. 购买完一件商品后打印购物清单及余额
5. 可随时查看购物清单和退出
6. 如果用户多次购买同一商品,必须合并商品数量和价格信息
7. 用户下次登录时,可查看之前的消费记录

流程图

README

1. 通过分析需求,使用面向过程和函数式编程的方式更好;
2. 文件序列化通过 pickle实现永久存储;
3. 每个用户信息用独立的数据文件来存储;
4. 要求输入数字的地方只能输入正整数;
5. 第二次购买的商品如果同第一次购买的相同,则在第一次商品信息上进行叠加。

程序代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey import os, pickle def file_oper(file, mode, *args):
'''
通过pickle序列化持久存储数据信息
:param file: 不同的用户生成不同的数据文件,文件名+'.db'
:param mode: 对数据文件的操作,读取还是写入
:param args: 需要写入的数据信息
:return: 返回读取数据文件的信息
'''
if mode == 'wb':
data = args[0]
with open(file, mode) as f:
pickle.dump(data, f)
elif mode == 'rb':
with open(file, mode) as f:
data = pickle.load(f)
return data def user(user, pwd, mode):
'''
用户注册及登录
:param user: 用户输入的用户名
:param pwd: 用户输入的密码
:param mode: 注册还是登录
:return: 登录成功,返回用户信息;登录失败,返回 None
'''
db_file = user + '.db'
# 用户注册
if mode == 'regist':
if not os.path.isfile(db_file):
user_info = {'name': user, 'passwd': pwd, 'stat': 0}
file_oper(db_file, 'wb', user_info)
print('\033[32;1m注册成功.\033[0m')
else:
print('\033[31;1m错误:该用户已存在.\033[0m')
# 用户登录
elif mode == 'login':
if os.path.isfile(db_file):
dict_user = file_oper(db_file, 'rb')
if dict_user['name'] == user and dict_user['passwd'] == pwd:
print('\033[32;1m登录成功.\033[0m')
return dict_user
else:
print('\033[31;1m错误:用户名密码错误。\033[0m')
else:
print('\033[31;1m错误:该用户不存在.\033[0m') def shopping(user_dict, list_goods):
'''
用户购物信息
:param user_dict: 用户信息
:param list_goods: 商品列表
''' # 判断购物车内是否有商品
if user_dict['shopping_car']:
list_shopping = user_dict['shopping_car']
else:
list_shopping = []
while True:
print('\033[32;1m商品列表\033[0m'.center(50, '#'))
for i, k in enumerate(list_goods):
print('序号:%s\t商品名:%s\t\t价格:%s' % (i, k['name'], k['price']))
choice = input('\033[34;1m购买请输入商品序号[t 查看购物清单 q 退出]:\033[0m').strip()
if not choice: continue
# 用户输入大小写 'q' 都是退出
if choice.upper() == 'Q':
break
# 购买商品必须输入商品范围类的数字
if choice.isdigit() and 0 <= int(choice) < len(list_goods):
num = input('\033[34;1m输入购买的数量:\033[0m').strip()
if num.isdigit():
num = int(num)
else:
print('\033[31;1m错误:数量必须是正整数.\033[0m') # 获取用户输入的商品信息,并生成商品字典
good = {'name': list_goods[int(choice)]['name'], 'num': num,
'total_prices': list_goods[int(choice)]['price'] * num}
# 获取用户的余额
money = user_dict['money']
# 用户的余额 - 商品的总价
res_money = money - good['total_prices']
if res_money >= 0:
# 这里目前没有想到好的处理办法,只能使用标记来做判断
# 默认 flag 为 True,因为用户一次只能购买一件商品,如果用户购买的是重复的商品,就将购买过的商品信息合并,
# 然后将 flag 设置为 False
flag = True
for i in list_shopping:
if good['name'] == i['name']:
i['num'] += good['num']
i['total_prices'] += good['total_prices']
flag = False
# 当flag = True 说明用户没有购买重复的商品,添加新商品到购物清单;反之则购买了重复的商品 flag = False
if flag:
list_shopping.append(good)
print('\033[32;1m购买成功!\033[0m\n')
print('\033[32;1m购物清单\033[0m'.center(50, '#'))
for i in list_shopping:
print('商品名:%s\t数量:%s\t总价:%d元' % (i['name'], i['num'], i['total_prices']))
print('\033[33;1m您的余额为:%d元\033[0m' % res_money)
print('##########################################\n')
# 修改购物后的用户余额信息
user_dict['money'] = res_money
# 修改购物清单信息
user_dict['shopping_car'] = list_shopping
# 将修改后的数据写入数据文件
file_oper(user_dict['name'] + '.db', 'wb', user_dict)
else:
print('\033[31;1m错误:商品总价为:%d元,您的余额为:%d元,购物失败.\033[0m' % (good['total_prices'], money)) elif choice.upper() == 'T':
print('\033[32;1m购物清单\033[0m'.center(50, '#'))
for i in list_shopping:
print('商品名:%s\t数量:%s\t总价:%d元' % (i['name'], i['num'], i['total_prices']))
print('\033[33;1m您的余额为:%d元\033[0m' % user_dict['money'])
print('##########################################\n')
any = input('\033[34;1m任意键返回商品列表\033[0m').strip()
continue
else:
print('\033[31;1m错误:输入商品序号错误。\033[0m') def start(list_goods):
while True:
print('1. 注册\n'
'2. 登录\n'
'3. 退出')
choice = input('>>>').strip()
if not choice: continue
if choice.isdigit() and 0 < int(choice) < 4:
if choice == '':
username = input('\033[34;1m输入用户名:\033[0m').strip()
password = input('\033[34;1m输入密码:\033[0m').strip()
user(username, password, 'regist') elif choice == '':
username = input('\033[34;1m输入用户名:\033[0m').strip()
password = input('\033[34;1m输入密码:\033[0m').strip()
user_dict = user(username, password, 'login')
# 当 user(username, password, 'login') 返回 None表示登录失败
if user_dict is None:
continue
# user_dict['stat'] = 0 表示用户第一次登录,user_dict['stat'] 非零则表示用户多次登录
if user_dict['stat'] == 0:
money = input('\033[34;1m首次登录,请输入充值金额:\033[0m').strip()
if money.isdigit(): # 这里无法判断小数类型
user_dict['money'] = int(money)
# 第一次登录设置成功金额后,将 stat 设置为非零
user_dict['stat'] = 1
user_dict['shopping_car'] = []
print('\033[32;1m恭喜:充值成功!\033[0m')
shopping(user_dict, list_goods) else:
print('\033[31;1m错误:金额只能是正整数!\033[0m')
# user_dict['stat'] = 0 表示用户第一次登录,user_dict['stat'] 非零则表示用户多次登录
else:
shopping(user_dict, list_goods)
elif choice == '':
break
else:
print('\033[31;1m错误:序号输入错误.\033[0m') if __name__ == '__main__':
# 商品列表
list_goods = [
{'name': '苹果', 'price': 10},
{'name': '鸭梨', 'price': 20},
{'name': '芒果', 'price': 30},
] start(list_goods)

shopping.py

部分运行截图:

图1:

图2:

图3:

图4:

[ python ] 购物系统的更多相关文章

  1. python 操作mysql数据库之模拟购物系统登录及购物

    python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...

  2. Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)

    眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...

  3. 案例:我行我素购物系统 v1.1

    系统逻辑结构: import java.util.Scanner; public class ShoppingSystem { public static void main(String[] arg ...

  4. java基本打印练习《我行我素购物系统》

    public class ShoppingSystem{ public static void main(String[] args){ //System.out.println("**** ...

  5. Python云端系统开发入门——框架基础

    Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...

  6. python 保障系统(一)

    python  保障系统 from django.shortcuts import render,redirect,HttpResponse from app01 import models from ...

  7. python 报障系统(完)

    python 报障系统(完) 一.报障系统原理: 原理: 1. 简单管理 2. 角色多管理(权限) a. 登录 session放置用户信息(检测是否已经登录) session放置权限信息(检测是否有权 ...

  8. DAY4:简单购物系统

    根据前几天对于循环和列表的学习,做了一个简单的购物系统: 密码模块就是前篇文章已经做过就,直接调用过来就行,简单说一下该购物系统功能 1,展示货物,需要手动添加,haha 2,判断余额是否充足并充值 ...

  9. Python云端系统开发入门 pycharm代码

    html <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title& ...

随机推荐

  1. [BZOJ4653][NOI2016]区间 贪心+线段树

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...

  2. 【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

    [BZOJ5248][九省联考2018]一双木棋(搜索,哈希) 题面 BZOJ Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何 ...

  3. oracle 远程登录sqlplus TNS:无监听

    1.将localhost 改成 计算机名 best-PC,或者ip地址 .  我修改成计算机名,因为经常在无线网络和有限网络之间切换 SID_LIST_LISTENER =  (SID_LIST =  ...

  4. python基础----__slots__方法、__call__方法

    ''' 1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的_ ...

  5. 洛谷P1396 营救

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  6. 树莓派apt-get下载网速太慢

    因为学校有ipv6的原因,当我想用ipv4的时候用apt-get发现特别慢.找了很久终于找到了解决方案: Add -o Acquire::ForceIPv4=true when running apt ...

  7. php 性能优化之opcache - 让你的php性能提升 50%

    性能提升原理:减少文件解析的时间. 我们都知道,程序要运行,得有一个编译或者解析的过程,编译或解析之后的代码才是机器可以运行的. 而 php 是一种解析性语言,在使用php来处理http请求的时候,每 ...

  8. python学习(十五) 内建模块学习

    介绍python的几个內建模块,原文链接 1 python的时间模块datetime 取现在时间 from datetime import datetime now = datetime.now() ...

  9. 用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  10. 这年头不会点Git真不行!!!

    版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 1 2 3 4 5 6 7 8 9 10 11 毕业论文_初稿.doc 毕业论文_修改1.do ...