搜尋
首頁後端開發Python教學python 實現網路商城,轉帳,存取款等功能的信用卡系統

一、要求

二、思路

1.購物類buy

接收 信用卡類別 的信用卡可用可用餘額,

返回消費金額

2.信用卡(ATM)類

接收上次操作後,信用卡可用餘額,總欠款,剩餘欠款,存款

其中: 1.每種交易類型不單獨處理金錢,也不單獨記錄流水賬,每種交易類型調用處理金錢的函數(傳入交易類型,交易金額)

    2.處理金錢的函數,呼叫設定檔中關於每種交易類型的加減錢和利率

返回本次作業後信用卡可用餘額,總欠款,剩餘欠款,存款

3.客戶端

銀行管理員註冊登陸

普通用戶註冊登陸

發送需求:註冊、登陸、交易類型、交易金額

4.伺服器端

呼叫購物類,建立購物對象(購物介面)

調用信用卡(ATM)類,處理還款,轉帳等操作,對利息按月記錄,寫入文件

5.定時任務

定時執行程序,以計算利息。

三、代碼

3.1設定檔

import os
 
BASE_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=money
  self.consumption=consumption
  self.shopping_cart=shopping_cart
 
 def gouwu(self): #购物模块
  print('您的当前余额为:%d' %self.money)
  num=int(input('请输入商品序号:'))
  num-=1
  if self.goods[num]["name"] in self.shopping_cart.keys():    #goods[num]["name"]取商品名
   self.shopping_cart[self.goods[num]["name"]]['n']+=1     #商品数量+1
  else:
   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+pay
  print('您的当前余额为:%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=0
  buy=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    #信用卡id
  self.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-=amount
    self.balance+=amount
   else:
    self.balance+=self.remaining_debt
    self.remaining_debt=0
    self.saving+=amount-self.remaining_debt
  else:
 
   if self.saving<amount:
    self.saving=0
    a=amount-self.saving
    self.balance-=a+interest-self.saving
    # self.debt+=amount+interest
    self.remaining_debt+=a+interest
  a='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.request
  if 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 True
    else:
    return False
  else:
   return False
 
 
 def regist(self,usrname,pwd,x):
  '''
  注册
  :param usrname: 用户名
  :param pwd: 密码
  :return:是否注册成功
  '''
 
  conn=self.request
  if x=='1':
   mulu=os.path.join(settings.ADMIN,usrname)
  else:
   mulu=os.path.join(settings.ALL_USERS,usrname)
 
 
  if os.path.exists(mulu):
    return False
  else:
   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 True
 
 def user_identity_authentication(self,usrname,pwd,ret,x):
  '''
  判断注册和登陆,并展示用户的详细目录信息,支持cd和ls命令
  :return:
  '''
  conn=self.request
  if 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)
      continue
     elif ret[0]==1 or ret[0]==2:
      break #默认值已更改,银行管理员已操作
 
    if ret[0]==1: #如果管理员同意
     r=self.regist(usrname,pwd,x)
    else:
     r=0
    s=[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.request
  while 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':
    break
   else:
    s=conn.recv(1024)
    amount=str(s,encoding='utf-8')
 
   obj.transaction(r,amount)
 
 
  pass
 
 
 def handle(self):
  conn=self.request
  x=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)
 
     pass
 
    break
   elif x=='q':
    break
 
if __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 1
 else:
  return 0
 
def 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 1
 else:
  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 1
  else:
   print('用户名或密码错误')
   return 0
 elif a=='2':
  ret=regist(usrname,pwd,x)
  if ret:
   print('注册成功')
   return 1
  else:
   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)
     continue
    elif s[1]==1:
     while True:
      a=input('用户请求注册,输入1同意,2拒绝')
      if a=='1':
       s=[1,0]
       pickle.dump(s,open(settings.A,'wb'))
       break
      elif a=='2':
       s=[2,0]
       pickle.dump(s,open(settings.A,'wb'))
       break
      else:
       print('输入有误')
     break
  else: #普通用户登陆后
   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':
   break
 
 
 
obj=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)
  break
 elif x=='q':
  break
 else:
  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 settings
 
 
 
def 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.0005
   if basic_info[4] >= interest:
    basic_info[4] -= interest
   else:
    temp = interest - basic_info[4]
    basic_info[4]=0
    basic_info[0] -= temp
    pickle.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] = 15000
  pickle.dump(
   basic_info,
   open(os.path.join(settings.ALL_USERS, card, card+'name_base'),'w')
    )
 
 
def run():
 main()
  

以上就是用python開發網路商城信用卡系統,需要的同學可以參考下。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),