zoukankan      html  css  js  c++  java
  • 使用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)
    购物车程序
  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/shenwenlong/p/5607625.html
Copyright © 2011-2022 走看看