使用socket实现信用卡程序和迷你购物商城

#-*- coding:utf-8 -*-
from moudle import *
import socketserver
import json
import os
import time
import datetime
carddict={}
def main(request):
    conn=request
    conn.sendall(by('欢迎光临大龙FTP!'))
    return conn

def login(conn):
    card=int(st(conn.recv(1024)))
    global carddict
    if not os.path.isfile('DB\cardinfo\%s'%card):
       conn.sendall(by('33[031m该用户不存在33[0m'))
    else:
        conn.sendall(by('33[032m存在!33[0m'))
        password=st(conn.recv(1024))
        print(password)
        print()
        carddict=json.load(open('DB\cardinfo\%s'%card))
        if password==carddict['password']:
            conn.sendall(by('33[032m登陆成功!33[0m'))
            return True
        else:
            conn.sendall(by('33[031m密码错误,登陆失败!33[0m'))
            return False

def register(conn):
        user=st(conn.recv(1024))
    # if  os.path.isfile('DB\cardinfo\%s'%card):
    #    conn.sendall(by('33[031m注册失败,该用户已存在33[0m'))
    # else:
        conn.sendall(by('33[032m注册成功!33[0m'))
        password=st(conn.recv(1024))
        card=creat[-1]+1
        creat[0]=creat[0]+1
        json.dump(creat,open('DB\creat_card.json','w'))
        conn.sendall(by(str(card)))
        print(card)
        carddict={'user':user,'password':password,'card':card,'credit':15000,'balance':15000,
                   'saving':0,'status':0,'debt':[[],[],[]]}
        cardinfo(carddict)
        os.mkdir('log\%s'%card)
def giro(conn):
    conn.sendall(by('粘包'))
    tocard=int(st(conn.recv(1024)))
    tocarddict=json.load(open('DB\cardinfo\%s' % tocard, 'r'))
    conn.sendall(by(tocarddict['user']))
    num= int(st(conn.recv(1024)))
    result=pay(num)
    if int(result):
        userlog(carddict, '转账 -%s 到: %s' %(num,tocard))
        repay(tocarddict, num,conn)
        userlog(tocarddict, '转账 +%s 源: %s' % (num, carddict['card']))
        conn.sendall(by(result))

def atm(conn):
    num = int(st(conn.recv(1024)))
    print('atm')
    result = pay(num,1.05)
    conn.sendall(by(result))
    print(result)
    if int(result):
        userlog(carddict, '提现 -%s' %(num))
    query(conn)

def repayment(conn):
    num = float(st(conn.recv(1024)))
    repay(carddict,num,conn)
    userlog(carddict, '还款 +%s' % (num))

def yue(debt,num):
    if len(debt[0])==0:  # 没有欠款直接返回还款金额
        print('len ',num,debt)
        return num,debt
    # result=num-debt[0][0]
    else: # 如果有欠款
        result = num - debt[2][0]  # 还款后 计算第一个月欠款
        if not result<0:  # 如果还款金额大于第一个月的欠款
            num -= debt[2][0]
            del debt[0][0]
            del debt[1][0]
            del debt[2][0]
            print('result>>0 ', num,debt)
            return yue(debt,num)
        else:
            debt[2][0]=debt[2][0]-num
            print('result<<0 ', num,debt)
            return 0,debt

def repay(carddict,num,conn):
    debt=carddict['debt']
    now_owe=carddict['credit']-carddict['balance']
    # if len(debt[0]) !=0:
    num,debt=yue(debt,num)
    print('num',num,debt)
    carddict['debt']=debt
    if num >0:
        if now_owe > 0:
            left = num - now_owe
            if left > 0:
                print(111)
                carddict['balance'] = carddict['credit']
                carddict['saving'] += left
            else:
                print(222)
                carddict['balance'] += num
        else:
            print(333)
            carddict['saving'] += num
    # else:
    #     debt[4] -=num
    print(carddict)
    cardinfo(carddict)
    query(conn)

def query(conn):
    conn.sendall(by('%d|%d'%(carddict['saving'],carddict['balance'])))

def pay(num,add=1):
    if carddict['saving']>= num:
        carddict['saving']-=num
        cardinfo(carddict)
        print('pay success')
        return '1'
    else:
        left=(num-carddict['saving'])*add
        if left <= carddict['balance']:
            carddict['saving']=0
            carddict['balance']-=left
            cardinfo(carddict)
            print('pay success')
            return '1'
        else:
            print('pay fail')
            return '0'

def cardinfo(carddict):
    card=carddict['card']
    json.dump(carddict,open('DB\cardinfo\%s'%card,'w'))
# def owed(carddict):
#     debt=carddict['debt']

class Myserver(socketserver.BaseRequestHandler):
    def handle(self):
        conn=main(self.request)
        choose={'1':login,'2':register,}
        choose2 = {'1': query, '2': giro, '3': atm, '4': repayment,}
        # logchoose={'2': 'zhuanzhang', '3': 'tixian', '4': 'huankuan'}
        while True:
            # opt = st(conn.recv(1024))
            # login(self.request)
            opt=st(conn.recv(1024))
            if opt in choose.keys():
                result = choose[opt](self.request)
                if result:
                    while True:
                        opt2 = st(conn.recv(1024))
                        print(opt2)
                        if opt2 in choose2.keys():
                            choose2[opt2](self.request)
                        elif opt2=='5':
                            break
                        else:pr('输入无效!','r')
            elif opt=='3':break

            elif opt in choose.keys():
                result=choose[opt]()


if __name__=='__main__':
    Server=socketserver.ThreadingTCPServer(('127.0.0.1',8889),Myserver)
    Server.serve_forever()
银行程序
#-*- coding:utf-8 -*-
import socket
from moudle import *
def main(address,port):
    obj=socket.socket()
    obj.connect((address,port))
    print(st(obj.recv(1024)))
    return obj

def login():
    user=input('请输入卡号:')
    password=input('请输入密码:')
    obj.sendall(by(str(user)))
    have=st(obj.recv(1024))
    if '' in have:
        print(have)
        return False
    else:
        obj.sendall(by(password))
        result=st(obj.recv(1024))
        print(result)
        if '成功' in result:return True
        else:return False

def register():
    user = input('请输入姓名:')
    password = input('请输入密码:')
    obj.sendall(by(user))
    result=st(obj.recv(1024))
    print(result)
    # if '成功' in result:
    obj.sendall(by(password))
    card=st(obj.recv(1024))
    print('您的卡号为%s,请牢记!'%card)
def shopgiro(tocard):
    obj.sendall(by('1'))
    result = login()
    if result:
        obj.sendall(by('2'))
        giro(tocard)
def giro(tocard=None):
    if tocard==None:
        tocard=input('输入对方卡号:')
    # else:
    #     result=login()
    #     if result:
    obj.recv(1024)#'粘包'
    obj.sendall(by(str(tocard)))
    toname = st(obj.recv(1024))
    print('请核对信息:   卡号:%s   姓名:%s' % (tocard,toname))
    num = input('转账金额:')
    obj.sendall(by(num))
    query()
    result=int(st(obj.recv(1024)))
    if result:pr('支付成功!%s'%num)
    else:pr('支付失败!','r')

def atm():
    num = input('取款金额:')
    obj.sendall(by(num))
    result = int(st(obj.recv(1024)))
    if result:
        pr('提现成功!%s' % num)
    else:
        pr('提现失败!', 'r')
    query()

def repay():
    num = input('还款金额:')
    obj.sendall(by(num))
    pr('还款成功!%s' % num)
    query()

def query():
    result=st(obj.recv(1024)).split('|')
    print('您的存款:%s      信用款:%s'%(result[0],result[1]))
obj = main('127.0.0.1', 8889)
if __name__ == '__main__':
    choose = {'1': login, '2': register, '3': exit}
    choose2 = {'1': query, '2': giro, '3': atm, '4': repay,}
    while True:
        opt = input('请选择: 1、登陆    2、注册    3、退出
>>>')
        obj.sendall(by(opt))
        if opt in choose.keys():
            result = choose[opt]()
            if result:
                while True:
                    opt2 = input('请选择: 1、查询    2、转账    3、提现   4、还款    5、退出
>>>')
                    obj.sendall(by(opt2))
                    if opt2 in choose2.keys():
                        result = choose2[opt2]()
                    if opt2=='5':break
        elif opt=='3':break
        else:pr('输入无效','r')
客户端程序
import os
import json
import time
import datetime
from moudle import userlog

t = time.strftime("%Y-%m-%d %H:%I:%S", time.localtime(time.time()))
# month = t[:7]
# print(month)
card_list=os.listdir('DB\cardinfo')
debt_sum=0
now = int(time.time())
for cardfile in card_list:
    carddict=json.load(open('DB\cardinfo\%s'%cardfile,'r'))
    for i in zip(carddict['debt'][0], carddict['debt'][1]):
        print(i)
        print(i[1][:4], i[1][5:])
        s = datetime.datetime(int(i[1][:4]), int(i[1][5:]), 11)
        ss = time.mktime(s.timetuple())
        owe_time = int((now - ss) / (60 * 60 * 24)) + 1
        owe_debt=i[0]*owe_time*0.0005
        debt_sum+=owe_debt
    print(carddict)
    if carddict['saving']==0:
        carddict['balance']-=debt_sum
    else:
        debt_owe=debt_sum-carddict['saving']
        carddict['saving']=0
        carddict['balance'] -= debt_sum
    print(cardfile)
    json.dump(carddict, open('DB\cardinfo\%s'%cardfile, 'w'))
    userlog(carddict,'欠款金额:%d 利息:%d'%(sum(carddict['debt'][0]),debt_sum))
每天计算每个用户的利息
#-*- coding:utf-8 -*-
import os
import json
import time


t = time.strftime("%Y-%m-%d %H:%I:%S", time.localtime(time.time()))
month = t[:7]
print(month)
card_list=os.listdir('DB\cardinfo')
for i in card_list:
    print(i)
    carddict=json.load(open('DB\cardinfo\%s'%i,'r'))
    # print(carddict)
    # carddict={"card": 8003, "debt": [[5000,5000], ["2016-04","2016-05"], 5000], "status": 0, "credit": 15000, "user": "dalong", "saving": 950.0, "password": "123", "balance": 15000}
    owe=carddict['credit']-carddict['balance']
    if owe>0:
        carddict['balance']=carddict['credit']
        card = carddict['card']
        carddict['debt'][0].append(owe)
        carddict['debt'][1].append(month)
        print(carddict)
        json.dump(carddict,open('DB\cardinfo\%s'%i,'w'))
每个月计算是否有欠款
#-*- coding:utf-8 -*-
import time
t = time.strftime("%Y-%m-%d %H:%I:%S", time.localtime(time.time()))
month = t[:10]
# month='2016-06-23'
y,m,d=month.split('-')
y,m,d=int(y),int(m),int(d)
filename=''
def pr(word,color='g'):
    if color =='r':
        print('33[031m%s33[0m'%word)
    else:
        print('33[032m%s33[0m'%word)
def by(word):
    a=bytes(word,encoding = 'utf-8')
    return a
def st(word):
    b=str(word,encoding = 'utf-8')
    return b
import os,json

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

USER_DIR = os.path.join(BASE_DIR, 'db', 'user')
creat=json.load(open('DB\creat_card.json','r'))
import logging
def userlog(carddict,word):
    filename=log_file()
    file2 = logging.FileHandler('log\%s\%s.log' %(carddict['card'],filename), 'a',encoding='utf-8')
    fmt = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s:  %(message)s')
    file2.setFormatter(fmt)
    logger2 = logging.Logger('s2', level=logging.DEBUG)
    logger2.addHandler(file2)
    logger2.info(word)
def log_file():
    if d>22:
        filename='%d-%d'%(y,m)
    else:
        if m-1 <1:
            filename = '%d-%d' % (y-1, 12)
        else:
            filename = '%d-%d' % (y, m-1)
    return filename
模板程序
#-*- coding:utf-8 -*-
from moudle import *
from client import *
class mall:
    def shop(self):
        while True:
            for k,v in goods.items():
                print('商品:%s		价格:%d¥'%(k,v))
            opt2=input('选择商品  q退出  
请选择:').strip()
            if opt2 == 'q':
                break
            else:
                if opt2 in goods.keys():
                    num=input('请输入数量:')
                    shop_list[opt2]=int(num)
                    pr('商品已添加到购物车')
                else:
                    pr('输入无效!','r')
                    continue
    def pay(self,):
        num=0
        for i in shop_list.keys():
            # print(shop_list[i],goods[i])
            num+=shop_list[i]*goods[i]
        pr(num)
        shopgiro(8888)
pr('Welcome to the shopping mall')
shop_list={}
goods={'iphone':5000,'bike':500,'apple':15,'qb':1,}
shop=mall()
choose={'1':shop.shop,'2':shop.pay,'3':exit}
while True:
    # obj = main('127.0.0.1', 8889)
    opt=input('1、选择商品    2、结算    3、退出  
请选择:').strip()
    if opt in choose.keys():choose[opt]()
    else:pr('输入无效!','r')
print(shop_list)
购物车程序
原文地址:https://www.cnblogs.com/shenwenlong/p/5607625.html