zoukankan      html  css  js  c++  java
  • ATM+购物商城(第一版)

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-  
    # by wk
    
    # !/usr/bin/env python
    # -*- coding:utf-8 -*-
    # by wk
    
    
    import os
    import time
    
    '''
         1.额度 15000或自定义
         2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
         3.可以提现,手续费5%
         4.支持多账户登录
         5.支持账户间转账
         6.记录每月日常消费流水
         7.提供还款接口
         8.TM记录操作日志
         9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
         10.用户认证用装饰器
    '''
    
    
    # 用户信息文件转换为列表
    def users_txt_to_list():
        users_lists = []
        with open('users.txt', 'r', encoding='utf-8') as goods_r:
            for line in goods_r:
                user_list = line.split()
                user_dict = {'name': user_list[0], 'password': user_list[1],'money': user_list[2],
                             'grant': user_list[3],'status':user_list[4]}
                users_lists.append(user_dict)
        return users_lists
    
    
    # 用户登录装饰器
    def user_login(func):
        user_lists = users_txt_to_list()
        def wragger(*args, **kwargs):
            with open('user_session.txt','r',encoding='utf-8') as session_user_r:
                read_result = session_user_r.read()
            if read_result == '':
                username = input('登录名: ')
                passwords = input('密码: ')
                for user in user_lists:
                    if username == user['name'] and passwords == user['password'] and 
                                    user['status'] == 'open':
                        with open ('user_session.txt','w',encoding='utf-8') as user_session_w:
                            user_session_w.write(user['name'])
                        # print('写入成功')
                        func(*args, **kwargs)
                    elif user['status'] == 'lock':
                        user_login_flag = 'lock'
                        break
                    else:
                        user_login_flag = 'other'
                        break
                if user_login_flag == 'lock':
                    print('您的账户被锁定')
                elif user_login_flag == 'other':
                    print('您登录的信息有误,请重新登录')
            else:
                func(*args, **kwargs)
        return wragger
    
    
    # 用户管理装饰器
    def admin_user_login(func):
        user_lists = users_txt_to_list()
        def wragger(*args, **kwargs):
            with open('user_session.txt','r',encoding='utf-8') as session_user_r:
                read_result = session_user_r.read()
            # if read_result == '':
            #     username = input('登录名: ')
            #     passwords = input('密码: ')
            #     print('ffff',read_result)
                for user in user_lists:
                    if user['name'] == read_result and user['grant'] == 'admin':
                        # print('写入成功')
                        func(*args, **kwargs)
                    else:
                        print('您不是管理员')
                        # print(user['name'],user['status'])
                        break
            # else:
            #     func(*args, **kwargs)
        return wragger
    
    
    # 购物中心模块
    @user_login
    def goods_center():
        with open('user_session.txt', 'r', encoding='utf-8') as session_user_r:
            session_user = session_user_r.read()
            users = users_txt_to_list()
            for user in users:
                if session_user == user['name']:
                    user_dict = user
        flag_list = True
        my_cart_id = -1
        mycat_list = []
        # goodslists = goods_txt_to_list()
        while flag_list:
            goodsid = goods_list(mygoodslist)
            # goodslist = goods_txt_to_list()
            car_list = cartlists(goodsid, my_cart_id, mycat_list)
            continue_flag = input('是否继续购买(y or n): ')
            if continue_flag == 'Y' or continue_flag == 'y':
                flag_list = True
            elif continue_flag == 'N' or continue_flag == 'n':
                flag_list = False
        print('cartlists', car_list)
        # print('aaaaaaaaa', mygoodslist)
        my_buy(car_list, user_dict)
    
        # while True:
        #     my_choose = input('是否继续购物,确认请按(Y or y),退出请按(B or b): ')
        #     if my_choose == 'Y' or my_choose == 'y':
        #         flag = True
        #         break
        #     elif my_choose == 'B' or my_choose == 'b':
        #         flag = False
        #         break
        #     else:
        #         print('输入的信息不正确请重新输入')
        #         continue
    
    
    # 商品文件转换为列表
    def goods_txt_to_list():
        good_lists = []
        with open('goods.txt', 'r', encoding='utf-8') as goods_r:
            for line in goods_r:
                good_list = line.split()
                good_dict = {'name': good_list[0], 'price': good_list[1], 'nums': good_list[2]}
                good_lists.append(good_dict)
        return good_lists
    
    
    # 商品列表
    def goods_list(goodslists):
        my_goods_list = goodslists
        print('请选择商品')
        for k, goods in enumerate(my_goods_list):
            print('产品编号:%s 名称: %s 价格: %s元, 剩余: %s' % (k, goods['name'], goods['price'], goods['nums']))
        while True:
            my_goods_id = input('请输入要买商品的编号: ')
            if my_goods_id.isdigit():
                return my_goods_id
            print('输入的不是数字请重新输入
    ')
    
    
    # 购物车模块
    def cartlists(goodsid, cart_id, carlist):
        # goodslist = goods_txt_to_list()
        cart_id = cart_id + 1  # 为了给购物车里的商品编号,便于移除商品
        goods_id = int(goodsid)
        print('您选择了 %s' % (mygoodslist[goods_id]['name']))
        goods_num = input('请输入购买数量: ')
        if goods_num.isdigit():
            print('您购买的数量是 %s 件' % (goods_num))
            goods_name = mygoodslist[goods_id]['name']
            goods_price = int(mygoodslist[goods_id]['price'])
            oldnum = int(mygoodslist[goods_id]['nums'])
            newnum = oldnum - int(goods_num)
            mygoodslist[goods_id]['nums'] = newnum
            if newnum > 0:  # 判断产品数量够不够
                car_dict = {}  # 创建购物车字典
                car_dict['id'] = cart_id  # 编号
                car_dict['name'] = goods_name  # 商品名称
                car_dict['nums'] = goods_num  # 购买数量
                car_dict['price'] = goods_price * int(goods_num)  # 价格
                carlist.append(car_dict)
            else:
                print('没那么多了,看看还有没有别的想买的
    ')
        else:
            print('输入的不是数字请重新输入
    ')
    
        return carlist
    
    
    # 购物车商品合并模块
    def union_cart_list(cartlists):
        new_cart_list = []
        for car in cartlists:
            if car not in new_cart_list:
                car['nums']
                new_cart_list.append(car)
    
    
    # 购买模块
    def my_buy(cart_list, user_dict):
        goods_total_money = 0
        if not cart_list:
            pass
        else:
            while True:
                print('购物车信息:')
                for buy_car in cart_list:
                    print('购买编号: %s  产品名称: %s  价格: %s元  数量: %s个' % (
                        buy_car['id'], buy_car['name'], buy_car['price'], buy_car['nums']))
                my_confirm = input('订单确认请按(Y or y),移除请输入编号(数字),取消订单请按(N or n): ')
                if my_confirm == 'Y' or my_confirm == 'y':
                    for cart in cart_list:
                        goods_total_money += cart['price']
                    myoldmoney = int(user_dict['money'])
                    # goodsmoney = carlist[goods_id]['price'] * int(goods_num)
                    my_new_money = myoldmoney - goods_total_money
                    if my_new_money >= 0:  # 判断钱够不够
                        # user_dict['money'] = my_new_money
                        # goodslist[goods_id]['nums'] = goods_num
                        change_money(user_dict, my_new_money)
                        change_goods()
                        print('提交成功!')
                        print('当前您的订单信息:')
                        for buy_car in cart_list:
                            print('产品名称: %s  价格: %s元  数量: %s个' % (
                                buy_car['name'], buy_car['price'], buy_car['nums']))
                            now_time = str(time.asctime(time.localtime(time.time())))
                            month_report(buy_car['name'], buy_car['nums'], buy_car['price'], now_time)
                        # print('当前您的账户信息:
    ', users)
                        # for buy_users in users:
                        print('我的账户信息:
    账户名: %s  余额: %s元' % (user_dict['name'], my_new_money))
                        break
                    else:
                        print('钱不够了请去充值,提交失败
    ')
                        break
                elif my_confirm == 'N' or my_confirm == 'n':
                    print('您已取消
    ')
                    break
                else:
                    no_this_id = 0
                    if my_confirm.isdigit():
                        # print(type(len(cart_list)))
                        for my_cart in cart_list:
                            if my_cart['id'] == int(my_confirm):
                                cart_list.remove(my_cart)
                                print('移除成功!')
                                no_this_id = 1
                                break
                    elif no_this_id == 0:
                        print('没有这个编号,请重新输入
    ')
                    else:
                        print('输入有误,请重新输入
    ')
    
    
    # 商品变化模块从列表保存到文件
    def change_goods():
        with open('goods_new.txt', 'w', encoding='utf-8') as goods_new_w:
            for goods_dict in mygoodslist:
                goods_new_w.write('%s %s %s
    ' % (goods_dict['name'], goods_dict['price'], goods_dict['nums']))
        os.remove('goods.txt')
        os.rename('goods_new.txt', 'goods.txt')
    
    
    # ATM登录中心模块
    @user_login
    def atm_center():
        print('1.查看账户信息
    2.存钱
    3.提现
    4.转账
    5.消费单
    6.还款
    7.后台管理
    8.退出ATM')
        with open ('user_session.txt','r',encoding='utf-8') as session_user_r:
            session_user = session_user_r.read()
            users = users_txt_to_list()
            for user in users:
                if session_user == user['name']:
                    user_dict = user
        user_chose = input('请输入编号: ')
        if user_chose == '1':
            user_center(user_dict)
        elif user_chose == '2':
            recharge(user_dict)
        elif user_chose == '3':
            withdraw_cash(user_dict)
        elif user_chose == '4':
            transfer_money(user_dict)
        elif user_chose == '5':
            look_month_report(user_dict)
        elif user_chose == '6':
            repayment_money(user_dict)
        elif user_chose == '7':
            admin_center()
        elif user_chose == '8':
            exit_session(user_dict)
        else:
            print('输入信息有误,请重新输入')
            atm_center()
    
    
    # 账户金额变化模块从列表保存到文件
    def change_money(user_dicts, new_money):
        users_list = users_txt_to_list()
        with open('users_new.txt', 'w', encoding='utf-8') as users_new_w:
            for user_dict in users_list:
                if user_dict['name'] == user_dicts['name']:
                    user_dict['money'] = new_money
                    users_new_w.write('%s %s %s
    ' % (user_dict['name'], user_dict['password'], user_dict['money']))
                else:
                    users_new_w.write('%s %s %s
    ' % (user_dict['name'], user_dict['password'], user_dict['money']))
        os.remove('users.txt')
        os.rename('users_new.txt', 'users.txt')
    
    
    # 查看账户信息模块
    def user_center(user_dicts):
        login_user = user_dicts
        print('=======用户中心=======
     用户名: %s  余额: %s' % (login_user['name'], login_user['money']))
        now_time = str(time.asctime(time.localtime(time.time())))
        atm_operation_log(user_dicts, 'see_user_center', now_time)
        user_chose = input('返回上一级请输入(R or r)')
        if user_chose == 'R' or user_chose == 'r':
            atm_center()
    
    
    # 充值模块
    def recharge(user_dicts):
        flag1 = True  # 循环标记
        # while flag1:
        #     flag2 = True  # 循环标记
        add_money = input('请输入充值金额(数字): ')
        if add_money.isdigit():
            old_money = int(user_dicts['money'])
            new_money = old_money + int(add_money)
            user_dicts['money'] = new_money
            print('您现在的余额是 %s元' % user_dicts['money'])
            change_money(user_dicts, new_money)
            print('充值成功!')
            now_time = str(time.asctime(time.localtime(time.time())))
            atm_operation_log(user_dicts, 'recharge', now_time)
            atm_center()
        else:
            print('输入的不是数字请重新输入
    ')
    
    
    # 提现模块
    def withdraw_cash(user_dicts):
        print('提现手续费5%')
        withdraw_money = input('请输入提现金额(按R或者r返回上一级): ')
        if withdraw_money.isdigit():
            new_money = int(user_dicts['money']) - int(withdraw_money) - int(int(user_dicts['money']) * 0.05)
            change_money(user_dicts, new_money)
            print('提现成功!')
            now_time = str(time.asctime(time.localtime(time.time())))
            atm_operation_log(user_dicts, 'withdraw_cash', now_time)
            atm_center()
        else:
            print('输入的不是数字请重新输入
    ')
    
    
    # 转账模块
    def transfer_money(user_dicts):
        transfer_money_account = input('请输入转入账户: ')
        transfer_get_money = input('请输入转入金额: ')
        if transfer_get_money.isdigit():
            new_money = int(user_dicts['money']) - int(transfer_get_money)
            users_list = users_txt_to_list()
            with open('users_new.txt', 'w', encoding='utf-8') as users_new_w:
                for user_dict in users_list:
                    if user_dict['name'] == user_dicts['name']:
                        user_dict['money'] = new_money
                        users_new_w.write('%s %s %s
    ' % (user_dict['name'], user_dict['password'], user_dict['money']))
                    elif user_dict['name'] == transfer_money_account:
                        user_dict['money'] = int(user_dict['money']) + int(transfer_get_money)
                        users_new_w.write('%s %s %s
    ' % (user_dict['name'], user_dict['password'], user_dict['money']))
                    else:
                        users_new_w.write('%s %s %s
    ' % (user_dict['name'], user_dict['password'], user_dict['money']))
            os.remove('users.txt')
            os.rename('users_new.txt', 'users.txt')
            print('转账成功!')
            now_time = str(time.asctime(time.localtime(time.time())))
            atm_operation_log(user_dicts, 'repayment_money', now_time)
            atm_center()
        else:
            print('输入的不是数字请重新输入
    ')
    
    
    # 每月消费模块
    def month_report(goods,num,money,buy_time):
        with open('month_report.txt','a',encoding='utf-8') as month_report_w:
            month_report_w.write('商品名称: %s 商品数量: %s 价格: %s 购买时间: %s 
    ' %(goods,num,money,buy_time))
    
    
    # 查看每月消费信息
    def look_month_report(user_dicts):
        look_month_report_flag = False
        with open('month_report.txt', 'r', encoding='utf-8') as look_month_report_r:
            for line in look_month_report_r:
                look_user_list = line.split()
                if look_user_list[0] == user_dicts['name']:
                    look_month_report_flag = True
                    print(line.strip('
    '))
        if look_month_report_flag == False:
            print('没有找到内容')
        atm_center()
    
    
    # 还款模块
    def repayment_money(user_dicts):
        return_money = input('请输入还款金额: ')
        if return_money.isdigit():
            if return_money.isdigit():
                new_money = int(user_dicts['money']) + int(return_money)
                change_money(user_dicts, new_money)
                print('还款成功!')
                now_time = str(time.asctime(time.localtime(time.time())))
                atm_operation_log(user_dicts,'repayment_money', now_time)
                atm_center()
            else:
                print('输入的不是数字请重新输入
    ')
        else:
            print('输入的不是数字请重新输入
    ')
    
    
    # ATM操作日志模块
    def atm_operation_log(user_dicts,operation_info, time):
        log_str = user_dicts['name'] + ' ' + operation_info + ' ' + time + '
    '
        with open('atm_log.txt', 'a', encoding='utf-8') as atm_operation_log_a:
            atm_operation_log_a.write(log_str)
    
    
    # 退出ATM会话模块
    def exit_session(user_dicts):
        with open('user_session.txt','w',encoding='utf-8') as exit_session_w:
            pass
        print('账户: %s 已退出' %(user_dicts['name']))
        main()
    
    
    # ATM后台管理模块
    @admin_user_login
    def admin_center():
        print('1.查看账户信息
    2.添加账户
    3.修改账户额度
    4.冻结账户
    5.返回')
        with open ('user_session.txt','r',encoding='utf-8') as session_user_r:
            session_user = session_user_r.read()
            users = users_txt_to_list()
            for user in users:
                if session_user == user['name']:
                    user_dict = user
        user_chose = input('请输入编号: ')
        if user_chose == '1':
            user_center(user_dict)
        elif user_chose == '2':
            admin_add_user()
        elif user_chose == '3':
            admin_user_quota()
        elif user_chose == '4':
            admin_user_lock()
        elif user_chose == '5':
            exit_session(user_dict)
        else:
            print('输入信息有误')
    
    
    # 用户列表转换成文件
    def change_user_to_file(user_list):
        with open('users_new.txt', 'w', encoding='utf8') as add_user_w:
            for user_dict in user_list:
                add_user_w.write('%s %s %s %s %s
    ' % (user_dict['name'], user_dict['password'],
                                                 user_dict['money'], user_dict['grant'],
                                                 user_dict['status']))
        os.remove('users.txt')
        os.rename('users_new.txt', 'users.txt')
    
    
    # 添加账户模块
    def admin_add_user():
        add_new_user = input('新用户名: ')
        user_list = users_txt_to_list()
        while True:
            add_new_password = input('密码:')
            add_new_password2 = input('请再输入一遍密码: ')
            if add_new_password == add_new_password2:
                user_list.append({'name':add_new_user,'password':add_new_password,'money': '15000',
                                  'grant': 'ordinary','status':'open'})
    
                change_user_to_file(user_list)
                print('账户创建成功')
                break
            else:
                print('两次密码输入的不一致,请重新输入')
    
    
    # 修改账户额度模块
    def admin_user_quota():
        user_name = input('请输入账户名: ')
        quota_money = input('请输入账户额度: ')
        user_list = users_txt_to_list()
        for user in user_list:
            if user['name'] == user_name:
                user['money'] = quota_money
        change_user_to_file(user_list)
        print('额度修改成功')
    
    
    # 冻结账户模块
    def admin_user_lock():
        lock_name = input('请输入冻结账户: ')
        user_list = users_txt_to_list()
        for user in user_list:
            if user['name'] == lock_name:
                user['status'] = 'lock'
        change_user_to_file(user_list)
        print('账户冻结成功')
    
    
    # 主程序模块
    def main():
        flag = True  # 最外层循环标记
        while flag:
            # my_cart_id = -1
            # flag_list = True
            mainlist = '========我的网上商城=======
    1.ATM机
    2.购物商城'
            print(mainlist)
            choose = input('请选择编号(1 or 2),退出请按(E or e): ')
            if choose == 'E' or choose == 'e':
                break
            else:
                if choose.isdigit() and choose == '2':
                    goods_center()
                elif choose.isdigit() and choose == '1':
                    atm_center()
                else:
                    print('输入的选项错误,请重新输入
    ')
    
    
    if __name__ == '__main__':
        mygoodslist = goods_txt_to_list()
        main()
  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/godspeed034/p/7245661.html
Copyright © 2011-2022 走看看