一、要求

二、思路

1.购物类buy

接收 信用卡类 的信用卡可用可用余额,

返回消费金额

2.信用卡(ATM)类

接收上次操作后,信用卡可用余额,总欠款,剩余欠款,存款

其中: 1.每种交易类型不单独处理金钱,也不单独记录流水账,每种交易类型调用处理金钱的函数(传入交易类型,交易金额)
    2.处理金钱的函数,调用配置文件中关于每种交易类型的加减钱和利率

返回本次操作后信用卡可用余额,总欠款,剩余欠款,存款

3.客户端

银行管理员注册登陆
普通用户注册登陆
发送需求:注册、登陆、交易类型、交易金额

4.服务器端

调用购物类,创建购物对象(购物接口)
调用信用卡(ATM)类,处理还款,转账等操作,对利息按月记录,写入文件

5.定时任务

定时执行程序,以计算利息。

三、代码

3.1配置文件

import osBASE_DIR = os.path.dirname(os.path.dirname(__file__))  #配置文件的上层目录
DB_DIR=os.path.join(BASE_DIR,'db')        #数据文件夹
ADMIN=os.path.join(DB_DIR,'admin')
ALL_USERS=os.path.join(DB_DIR,'allusrs')
A=os.path.join(BASE_DIR,'db','s')
LOG=os.path.join(BASE_DIR,'log')TRANSACTION={'repay':{'action':'plus','interest':0}, #还款'withdraw':{'action':'minus','interest':0.05},#取现'transfer':{'action':'minus','interest':0.05},#转账'consume':{'action':'minus','interest':0},#消费'saving':{'action':'plus','interest':0}  #存款
}

3.2公共类

3.2.1购物类

class buy:goods=[{"name": "电脑", "price": 1999},{"name": "鼠标", "price": 10},{"name": "游艇", "price": 20},{"name": "美女", "price": 998},]def __init__(self,money,consumption,shopping_cart,):self.money=moneyself.consumption=consumptionself.shopping_cart=shopping_cartdef  gouwu(self): #购物模块print('您的当前余额为:%d' %self.money)num=int(input('请输入商品序号:'))num-=1if self.goods[num]["name"] in self.shopping_cart.keys():               #goods[num]["name"]取商品名self.shopping_cart[self.goods[num]["name"]]['n']+=1                 #商品数量+1else:self.shopping_cart[self.goods[num]["name"]]={"price":self.goods[num]["price"],'n':1,}  # 创建购物车字典   {keys{"price":价格,数量:1}}self.money-=self.shopping_cart[self.goods[num]["name"]]["price"]*self.shopping_cart[self.goods[num]["name"]]['n']       #单价*数量self.consumption+=self.shopping_cart[self.goods[num]["name"]]["price"]*self.shopping_cart[self.goods[num]["name"]]['n']def yichu(self):  #移除购物车模块c=int(input(' 请输入0/1选择是否移除购物车商品, 移除请输入1:'))if c==1:e=int(input(' 请输入要移除的商品序号:'))d=self.goods[e-1]if d in self.shopping_cart.keys():              #判断要移除的商品是否在购物车内self.shopping_cart.remove(d)          #移除商品self.money=self.money+self.goods[self.goods.index(d)]["price"]             #余额增加self.consumption=self.consumption-self.goods[self.goods.index(d)]["price"]  #消费总额减少else:print('商品不存在')def chongzhi(self):  #充值模块pay=int(input('请输入充值金额'))self.money=self.money+payprint('您的当前余额为:%d' % self.money)    #显示当前余额def main(self):print('商品清单:')for m,n in enumerate(self.goods,1):print(m)for v in n.values():print(v)print('=============')#消费总额清零self.consumption=0buy=True  #定义默认一直购物while buy:price=0  #定义初始价格b=1  #定义默认不退出购物或充值状态if self.money>=price:#消费模块;金钱大于货物价格时,才能开始购物while self.money>=price:#计价模块,有钱就可以一直购物self.gouwu()#移除购物车商品模块self.yichu()if self.money>=0:print('您的当前余额为:%d' %self.money)          #显示当前余额b=int(input(' 请输入0/1选择是否继续购物, 购物请输入1:'))if b==0:        #break   #退出计价模块if b==0:           #如果不购物break          #不购物退出整个购物程序#充值模块else:while self.money<price:          #金钱不足,可多次充钱,直到能买得起货物a=int(input(' 您的余额不足,请输入0/1选择是否充值,充值请输入1:'))if a==1:self.chongzhi()else:break           #退出充值模块if a==0:break           #不充值退出程序#打印购物车商品名、商品价格、消费总额、余额print('您的消费清单为:')for m,n in self.shopping_cart.items():print(m,n['price'],n['n'])#打印消费清单print('=============')print('您的当前余额为:%d,您的消费总额为:%d' % (self.money,self.consumption) )            #打印消费总额return self.consumption

3.2.2 信用卡ATM类

class Atm:credit=15000  #信用卡额度def __init__(self,balance,debt,remaining_debt,interest,saving,id):self.id=id             #信用卡idself.balance=balance     #信用卡可用金额self.debt=debt           #总欠款self.remaining_debt=remaining_debt #剩余欠款self.interest=interest      #手续费self.saving=saving     #存款self.now_time=time.strftime("%Y-%m-%d %H:%M:%S")self.now_data=time.strftime("%Y-%m")self.struct_time=time.gmtime(time.time())if self.struct_time.tm_mday>22:self.now_data=self.struct_time.tm_year+'-'+str(int(self.struct_time.tm_mon)+1)def account_info(self):#打印账户信息return '账户id%s 信用卡额度%s;信用卡可用金额%s;剩余欠款%s;'%(self.id,self.credit,self.balance,self.remaining_debt,)def ret_account_info(self):return [self.id,self.credit,self.balance,self.debt,self.remaining_debt,self.interest]def repay(self,amount):#还款self.handel_money('repay',amount)def withdraw(self,amount): #取现self.handel_money('withdraw',amount)def transfer(self,amount): #转账self.handel_money('transfer',amount)def consume(self,amount):  #消费self.handel_money('consume',amount)def saves(self,amount):self.handel_money('saving',amount)def transaction(self,a,amount):dic={'1':self.repay,'2':self.withdraw,'3':self.transfer,'4':self.consume,'5':self.saves}print("debug: a:",type(a),"amount:",type(amount))print(a)print(dic[a])print(dic["5"])dic[a](amount)print("end debug")def handel_money(self,transaction,amount): #交易类型,amount=int(amount)interest=amount*settings.TRANSACTION[transaction]['interest'] #手续费计算if settings.TRANSACTION[transaction]['action']=='plus':if amount<=self.remaining_debt:self.remaining_debt-=amountself.balance+=amountelse:self.balance+=self.remaining_debtself.remaining_debt=0self.saving+=amount-self.remaining_debtelse:if self.saving<amount:self.saving=0a=amount-self.savingself.balance-=a+interest-self.saving# self.debt+=amount+interestself.remaining_debt+=a+interesta='time:%s id:%s transaction: %s amount:%s interest %s \n'%(self.now_time,self.id,transaction,amount,interest)print(a)mulu=os.path.join(settings.ALL_USERS,self.id)path_name_liushui=os.path.join(mulu,str(self.id)+'name_liushui',str(self.now_data))with open(path_name_liushui,'a')as f:          #记录流水信息f.write(a)s=[self.balance,self.debt,self.remaining_debt,self.interest,self.saving,]     #更新基本信息path_name_base=os.path.join(mulu,str(self.id)+'name_base')pickle.dump(s,open(path_name_base,'wb'))

 3.3服务器端:

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sys,os
import hashlib
import pickle
import time
import socketserver
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settings
from lib import modules
from lib.modules import *class Myserver(socketserver.BaseRequestHandler):def md5(self,pwd):'''对密码进行加密:param pwd: 密码:return:'''hash=hashlib.md5(bytes('xx7',encoding='utf-8'))hash.update(bytes(pwd,encoding='utf-8'))return hash.hexdigest()def login(self,usrname,pwd,x):'''登陆:param usrname: 用户名:param pwd: 密码:return:是否登陆成功'''conn=self.requestif x=='1':path_name_pwd=os.path.join(settings.ADMIN,usrname)else:mulu=os.path.join(settings.ALL_USERS,usrname)path_name_pwd=os.path.join(mulu,usrname+'name_pwd')s=pickle.load(open(path_name_pwd,'rb'))if usrname in s:if s[usrname]==self.md5(pwd):        #和加密后的密码进行比较return Trueelse:return Falseelse:return Falsedef regist(self,usrname,pwd,x):'''注册:param usrname: 用户名:param pwd: 密码:return:是否注册成功'''conn=self.requestif x=='1':mulu=os.path.join(settings.ADMIN,usrname)else:mulu=os.path.join(settings.ALL_USERS,usrname)if os.path.exists(mulu):return Falseelse:os.mkdir(mulu)s={}s[usrname]=self.md5(pwd)path_name_pwd=os.path.join(mulu,usrname+'name_pwd')pickle.dump(s,open(path_name_pwd,'wb'))path_name_base=os.path.join(mulu,usrname+'name_base')pickle.dump([15000,{},0,0,0],open(path_name_base,'wb'))path_name_liushui=os.path.join(mulu,usrname+'name_liushui')os.mkdir(path_name_liushui)return Truedef user_identity_authentication(self,usrname,pwd,ret,x):'''判断注册和登陆,并展示用户的详细目录信息,支持cd和ls命令:return:'''conn=self.requestif ret=='1':r=self.login(usrname,pwd,x)if r:conn.sendall(bytes('y',encoding='utf-8'))else:conn.sendall(bytes('n',encoding='utf-8'))elif ret=='2':# print(usrname,pwd)if x=='1':r=self.regist(usrname,pwd,x)else:   #用户注册s=[0,1]pickle.dump(s,open(settings.A,'wb'))while True:ret=pickle.load(open(settings.A,'rb'))if ret[0]==0:time.sleep(30)continueelif ret[0]==1 or ret[0]==2:break  #默认值已更改,银行管理员已操作if ret[0]==1:  #如果管理员同意r=self.regist(usrname,pwd,x)else:r=0s=[0,0]pickle.dump(s,open(settings.A,'wb'))if r:conn.sendall(bytes('y',encoding='utf-8'))else:conn.sendall(bytes('n',encoding='utf-8'))def interactive(self,usrname):  #进行交互conn=self.requestwhile True:c=conn.recv(1024)  #接收用户交互选项r=str(c,encoding='utf-8')mulu=os.path.join(settings.ALL_USERS,usrname)path_name_base=os.path.join(mulu,usrname+'name_base')s=pickle.load(open(path_name_base,'rb'))#打印账户信息obj=modules.Atm(s[0],s[1],s[2],s[3],s[4],usrname)  #Atm对象a=obj.account_info() #接收账户信息conn.sendall(bytes(a,encoding='utf-8'))b=obj.ret_account_info()if r== '4':buy_obj=modules.buy(b[2],0,{})amount=buy_obj.main()elif r=='q':breakelse:s=conn.recv(1024)amount=str(s,encoding='utf-8')obj.transaction(r,amount)passdef handle(self):conn=self.requestx=conn.recv(1024)x=str(x,encoding='utf-8')conn.sendall(bytes('收到用户类别',encoding='utf-8'))while True:if x=='1' or x=='2':b=conn.recv(1024)ret=str(b,encoding='utf-8')conn.sendall(bytes('b ok',encoding='utf-8'))c=conn.recv(1024)r=str(c,encoding='utf-8')usrname,pwd=r.split(',')print(usrname,pwd)self.user_identity_authentication(usrname,pwd,ret,x) #登陆或注册验证if x=='2':#普通用户身份验证成功后self.interactive(usrname)passbreakelif x=='q':breakif __name__=='__main__':sever=socketserver.ThreadingTCPServer(('127.0.0.1',9999),Myserver)sever.serve_forever()

3.4 用户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
本程序作为用户或银行管理员的入口,其中c=1代表银行管理员,c=2代表普通用户
'''
import pickle
import sys
import time
import os
import socket
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settings
from lib import *
from lib.modules import *def login(usrname,pwd):'''登陆:param usrname:用户名:param pwd:密码:return:是否登陆成功'''obj.sendall(bytes(usrname+','+pwd,encoding='utf-8'))ret=obj.recv(1024)r=str(ret,encoding='utf-8')if r=='y':return 1else:return 0def regist(usrname,pwd,x):'''注册:param usrname:用户名:param pwd:密码:return:是否注册成功'''obj.sendall(bytes(usrname+','+pwd,encoding='utf-8'))ret=obj.recv(1024)r=str(ret,encoding='utf-8')if r=='y':return 1else:return 0
def user_identity_authentication(usrname,pwd,x):'''选择登陆或注册,展示用户的详细目录信息,支持cd和ls命令:return:'''a=input('请选择1.登陆 2.注册')obj.sendall(bytes(a,encoding='utf-8'))obj.recv(1024)if a=='1':ret=login(usrname,pwd)if ret:print('登陆成功')return 1else:print('用户名或密码错误')return 0elif a=='2':ret=regist(usrname,pwd,x)if ret:print('注册成功')return 1else:print('用户名已存在或银行管理员拒绝')return 0
def main(x):usrname=input('请输入用户名')pwd=input('请输入密码')if user_identity_authentication(usrname,pwd,x): #如果验证身份成功if x=='1':   #处理用户注册信息while True:s=pickle.load(open(settings.A,'rb'))if s[1]==0:time.sleep(30)continueelif s[1]==1:while True:a=input('用户请求注册,输入1同意,2拒绝')if a=='1':s=[1,0]pickle.dump(s,open(settings.A,'wb'))breakelif a=='2':s=[2,0]pickle.dump(s,open(settings.A,'wb'))breakelse:print('输入有误')breakelse:  #普通用户登陆后interactive()  #进行交互def interactive():while True:a=input('请选择 1.还款 2.取现 3.转账 4.消费 5.存钱  q退出')obj.sendall(bytes(a,encoding='utf-8'))r=obj.recv(1024) #接收账户信息ret=str(r,encoding='utf-8')print(ret)if a !='4'and a !='q':b=input('请输入金额')obj.sendall(bytes(b,encoding='utf-8'))elif a=='q':breakobj=socket.socket() #创建客户端socket对象
obj.connect(('127.0.0.1',9999))
while True:x=input('请选择1.银行管理员 2.用户 q、退出')obj.sendall(bytes(x,encoding='utf-8'))obj.recv(1024)    #确认收到用户类别if x=='1' or x=='2':main(x)breakelif x=='q':breakelse:print('输入有误请重新输入')obj.close()

 3.5定时任务

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os,sys
import json,pickle
import time
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from config import settingsdef main():card_list = os.listdir(settings.ALL_USERS)for card in card_list:basic_info = pickle.load(open(os.path.join(settings.ALL_USERS, card, card+'name_base')))struct_time = time.localtime()# 循环账单列表,为每月的欠款计息。并写入到当月账单中for item in basic_info['debt']:interest = item['total_debt'] * 0.0005if basic_info[4] >= interest:basic_info[4] -= interestelse:temp = interest - basic_info[4]basic_info[4]=0basic_info[0] -= temppickle.dump(basic_info,open(os.path.join(settings.ALL_USERS, card, card+'name_base'),'w'))# 如果当前等于10号(9号之前)#   当前余额为负值,则将值添加到账单列表中,开始计息,同时,本月可用额度恢复。date = time.strftime("%Y-%m-%d")if struct_time.tm_mday == 11 and basic_info[2]>0:dic = {'date': date,"total_debt":  basic_info[2],"balance_debt": basic_info[2],}basic_info[1].append(dic)# 恢复可用额度basic_info[0] = 15000pickle.dump(basic_info,open(os.path.join(settings.ALL_USERS, card, card+'name_base'),'w'))def run():main()

  

  

转载于:https://my.oschina.net/u/3579120/blog/1507664

基于python网络编程实现支持购物、转账、存取钱、定时计算利息的信用卡系统...相关推荐

  1. python编程入门指南怎么样-学习python网络编程怎么入门

    第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一 ...

  2. python网络编程证书_《Python网络编程基础》笔记

    python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...

  3. python网络编程要学吗_总算发现如何学习python网络编程

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  4. [转载] PYTHON 网络编程

    参考链接: Python | 使用openpyxl在Excel文件中进行三角运算 Socket 编程实战 文章目录 Socket库 0.1. 什么是 Socket? 0.2. socket()函数 0 ...

  5. python网络编程内容_图解Python网络编程

    Python Python开发 Python语言 图解Python网络编程 本篇索引 (1)基本原理 本篇指的网络编程,仅仅是指如何在两台或多台计算机之间,通过网络收发数据包:而不涉及具体的应用层功能 ...

  6. 读书笔记 - -《Python网络编程》重点

    文章目录 一.前言 二.客户/服务器网络编程简介 三.UDP 3.1 端口号 3.2 套接字 3.3 UDP分组 3.4 小结 四.TCP 4.1 TCP工作原理 4.2 绑定接口 4.3 死锁 4. ...

  7. 【CSDN软件工程师能力认证学习精选】Python网络编程(socket编程)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  8. python 网络编程_Python网络编程(原书第2版)

    Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...

  9. python网络编程基础百度云_PYTHON网络编程基础 PDF 下载

    相关截图: 资料简介: <Python网络编程基础>全面介绍了使用Python语言进行网络编程的基础知识,主要内容包括网络基础知识.高级网络操作.Web Services.解析HTML和X ...

最新文章

  1. sparkCore源码解析之思维脑图
  2. 在行列都排好序的矩阵中找数
  3. 【深度学习】研究揭秘:神经网络越大、表现越好的“神秘力量”
  4. 朴素容斥原理[ZJOI2016][bzoj4455]小星星
  5. 现在的00后都这么牛X的吗?
  6. SpringMVC 控制层注解
  7. 统一横轴墨卡托投影(UTM)
  8. 使用 IntraWeb (26) - 基本控件之 TIWMenu
  9. matlab2c使用c++实现matlab函数系列教程-toeplitz函数
  10. 世界上增福最快的方法!【错过就可惜了】
  11. mouseover 和 hover 方法
  12. 全国各省会城市经纬度(包含港澳台)
  13. Adreno Profiler分析任意安卓游戏特效+抓取资源
  14. 火遍全网的chatGPT怎么使用
  15. win10安装Ubuntu16.04
  16. window创建l2tp
  17. AIGC发展路径思考:大模型工具化普及迎来新机遇
  18. Android常用官网,开发者社区,论坛
  19. docker 安装 oracle11g
  20. 小学英语阅读促进学生思维品质发展及其策略应用的综述

热门文章

  1. python散点图重叠_通过增加figure siz避免python散点图中的重叠点
  2. Vue.js+uniapp青少年大学生心理健康科普系统 java php python微信小程序
  3. 移动端 HDR 视频产品实践与探索
  4. 自我学习,监督学习,半监督学习和迁移学习的区别
  5. Android使用RecyclerView和StaggeredGridLayoutManager实现瀑布流效果-标签
  6. Method ‘EncodeVideoFaster‘ in type ‘SIPSorceryMedia.Encoders.VpxVideoEncoder
  7. OSI、TCP/IP、进制转换——十、二、十六进制
  8. 猎魂觉醒显示无法连接战斗服务器,猎魂觉醒(台服)总是显示无法连接网络
  9. numpy的tfrecord处理
  10. 给机械专业大学生的回信