zoukankan      html  css  js  c++  java
  • youku客户端

    文件结构

    config

    import os
    
    
    IP_PORT = ('127.0.0.1',8080)
    
    
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    BASE_UPLOAD_MOVIE = os.path.join(BASE_DIR,'upload_movie')
    BASE_DOWNLOAD_MOVIE = os.path.join(BASE_DIR,'download_movie')
    setting

    core

    import os
    from tcp_client import tcpclient
    from lib import common
    from conf import setting
    
    
    user_state = {
        'cookie':None
    }
    
    
    def admin_register(client):
        if user_state['cookie']:
            print('管理员已登录')
            return
        print('33[32m 注册功能 33[0m'.center(10,'-'))
        while True:
            name = input('注册名(q退出)>>>:').strip()
            if name == 'q':break
            password = input('注册密码>>>:').strip()
            confirm_password = input('确认注册密码>>>:').strip()
            if password == confirm_password:
                user_dic = {
                    'func_type':'register',
                    'name':name,
                    'password':common.get_password_md5(password),
                    'user_type':'admin'
                }
                back_dic = common.send_back(user_dic,client)
                if back_dic['flag']:
                    print(back_dic['msg'])
                    break
                else:
                    print(back_dic['msg'])
                    continue
            else:
                print('两次密码不匹配')
                continue
    
    
    def admin_login(client):
        if user_state['cookie']:
            print('管理员已登录')
            return
        print('33[32m 登录功能 33[0m'.center(10, '-'))
        while True:
            name = input('登录名(q退出)>>>:').strip()
            if name == 'q': break
            password = input('登录密码>>>:').strip()
            user_dic = {
                'func_type': 'login',
                'name': name,
                'password': common.get_password_md5(password),
                'user_type': 'admin'
            }
            back_dic = common.send_back(user_dic, client)
            if back_dic['flag']:
                user_state['cookie'] = back_dic['session']
                print(back_dic['msg'])
                break
            else:
                print(back_dic['msg'])
                continue
    
    
    @common.login_auth('admin')
    def upload_movie(client):
        while True:
            upload_movie_list = os.listdir(setting.BASE_UPLOAD_MOVIE)
            if upload_movie_list:
                for k,movie in enumerate(upload_movie_list):
                    print('%s : %s' % (k,movie))
                choice = input('请输入上传电影编号(q退出)>>>:').strip()
                if choice == 'q':break
                if not choice.isdigit():continue
                choice = int(choice)
                if choice >= len(upload_movie_list):continue
                upload_movie_name = upload_movie_list[choice]
                upload_movie_path = os.path.join(setting.BASE_UPLOAD_MOVIE, upload_movie_name)
                upload_movie_size = os.path.getsize(upload_movie_path)
                upload_movie_md5 = common.get_file_md5(upload_movie_path)
                send_dic = {
                    'func_type':'check_upload_movie_exist',
                    'session':user_state['cookie'],
                    'file_md5':upload_movie_md5
                }
                back_dic = common.send_back(send_dic,client)
                if not back_dic['flag']:
                    print(back_dic['msg'])
                    break
                is_free = input('是否免费(y/n)>>>:').strip()
                if is_free == 'y':
                    is_free = 1
                else:
                    is_free = 0
                send_dic = {
                    'func_type':'upload_movie',
                    'session':user_state['cookie'],
                    'file_name':upload_movie_name,
                    'file_path':upload_movie_path,
                    'file_size':upload_movie_size,
                    'is_free':is_free,
                    'file_md5':upload_movie_md5
                }
                back_dic = common.send_back(send_dic,client,upload_movie_name)
                if back_dic['flag']:
                    print(back_dic['msg'])
                    break
                else:
                    print(back_dic['msg'])
                    break
            else:
                print('暂无可上传电影')
                break
    
    
    @common.login_auth('admin')
    def delete_movie(client):
        while True:
            send_dic = {
                'func_type':'check_moive_list',
                'session':user_state['cookie'],
                'movie_type':'all'
            }
            back_dic = common.send_back(send_dic,client)
            if back_dic['flag']:
                back_movie_list = back_dic['back_movie_list']
                for k,movie in enumerate(back_movie_list):
                    print('%s,影片信息:%s' % (k,movie))
                choice = input('选择删除的视频>>>:').strip()
                if choice == 'q':break
                if not choice.isdigit():continue
                choice = int(choice)
                if choice >= len(back_movie_list):continue
                delete_movie_item = back_movie_list[choice]
                del_movie_id = delete_movie_item[0]
                send_dic = {
                    'func_type':'delete_movie',
                    'session':user_state['cookie'],
                    'del_movie_id':del_movie_id
                }
                back_dic = common.send_back(send_dic,client)
                if back_dic['flag']:
                    print(back_dic['msg'])
                    break
                else:
                    print(back_dic['msg'])
    
            else:
                print(back_dic['msg'])
                break
    
    
    @common.login_auth('admin')
    def release_notice(client):
        while True:
            name = input('公告标题(q退出)>>>:').strip()
            if name == 'q':break
            content = input('公告内容:>>>:').strip()
            send_dic = {
                'func_type':'release_notice',
                'session':user_state['cookie'],
                'name':name,
                'content':content
            }
            back_dic = common.send_back(send_dic, client)
            if back_dic['flag']:
                print(back_dic['msg'])
                break
            else:
                print(back_dic['msg'])
                break
    
    
    
    func_dic = {
        '1':admin_register,
        '2':admin_login,
        '3':upload_movie,
        '4':delete_movie,
        '5':release_notice
    }
    
    
    def admin_view():
        client = tcpclient.get_client()
        while True:
            print('''
            1 管理员注册
            2 管理员登录
            3 上传视频
            4 删除视频
            5 发布公告
            ''')
    
            choice = input('33[32m 请选择功能 33[0m>>>:').strip()
            if choice == 'q':
                user_state['cookie'] = None
                break
            if not choice.isdigit(): continue
            if choice not in func_dic: continue
            func_dic[choice](client)
    admin
    from core import admin,user
    
    
    func_dic = {
        '1':admin.admin_view,
        '2':user.user_view
    }
    
    
    def run():
        while True:
            print('''
            1 管理员视图
            2 用户视图
            ''')
    
            choice = input('33[32m 请选择功能 33[0m>>>:').strip()
            if choice == 'q':break
            if not choice.isdigit():continue
            if choice not in func_dic:continue
            func_dic[choice]()
    src
    import time
    import os
    from tcp_client import tcpclient
    from lib import common
    from conf import setting
    
    
    user_state = {
        'cookie':None,
        'is_vip':None,
    }
    
    
    
    def user_register(client):
        if user_state['cookie']:
            print('用户已登录')
            return
        print('33[32m 注册功能 33[0m'.center(10,'-'))
        while True:
            name = input('注册名(q退出)>>>:').strip()
            if name == 'q':break
            password = input('注册密码>>>:').strip()
            confirm_password = input('确认注册密码>>>:').strip()
            if password == confirm_password:
                user_dic = {
                    'func_type':'register',
                    'name':name,
                    'password':common.get_password_md5(password),
                    'user_type':'user'
                }
                back_dic = common.send_back(user_dic,client)
                if back_dic['flag']:
                    print(back_dic['msg'])
                    break
                else:
                    print(back_dic['msg'])
                    continue
            else:
                print('两次密码不匹配')
                continue
    
    
    def user_login(client):
        if user_state['cookie']:
            print('用户已登录')
            return
        print('33[32m 登录功能 33[0m'.center(10, '-'))
        while True:
            name = input('登录名(q退出)>>>:').strip()
            if name == 'q': break
            password = input('登录密码>>>:').strip()
            user_dic = {
                'func_type': 'login',
                'name': name,
                'password': common.get_password_md5(password),
                'user_type': 'user'
            }
            back_dic = common.send_back(user_dic, client)
            if back_dic['flag']:
                user_state['cookie'] = back_dic['session']
                user_state['is_vip'] = back_dic['is_vip']
                print(back_dic['msg'])
                print('最新公告:%s' % back_dic['back_notice'])
                break
            else:
                print(back_dic['msg'])
                continue
    
    
    @common.login_auth('user')
    def charge_vip(client):
        while True:
            if user_state['is_vip']:
                print('已经是会员')
                break
            choice = input('消费10元来充值会员吗?(y/n)>>>:').strip()
            if choice == 'y':
                send_dic = {
                    'func_type':'charge_vip',
                    'session':user_state['cookie'],
                }
                back_dic = common.send_back(send_dic, client)
                if back_dic['flag']:
                    print(back_dic['msg'])
                    break
                else:
                    print(back_dic['msg'])
                    continue
            else:
                print('您未充值会员')
                break
    
    
    @common.login_auth('user')
    def check_movie(client):
        if user_state['is_vip']:
            movie_type = 'all'
        else:
            movie_type = 'free'
        send_dic = {
            'func_type':'check_moive_list',
            'session':user_state['cookie'],
            'movie_type':movie_type
        }
        back_dic = common.send_back(send_dic, client)
        if back_dic['flag']:
            print(back_dic['msg'])
            print(back_dic['back_movie_list'])
            return
        else:
            print(back_dic['msg'])
            return
    
    
    @common.login_auth('user')
    def download_free_movie(client):
        while True:
            send_dic = {
                'func_type': 'check_moive_list',
                'session': user_state['cookie'],
                'movie_type': 'free'
            }
            back_dic = common.send_back(send_dic, client)
            if back_dic['flag']:
                print(back_dic['msg'])
                movie_list = back_dic['back_movie_list']
                for k,movie in enumerate(movie_list):
                    print('%s : 影片信息:%s' % (k,movie))
                    choice = input('请选择下载的电影(q退出)>>>:').strip()
                    if choice == 'q':break
                    if not choice.isdigit():continue
                    choice = int(choice)
                    if choice >= len(movie_list):continue
                    movie_id = movie_list[choice][0]
                    movie_name = movie_list[choice][1]
                    send_dic = {
                        'func_type':'download_free_movie',
                        'session':user_state['cookie'],
                        'movie_id':movie_id
                    }
                    back_dic = common.send_back(send_dic,client)
                    if back_dic['flag']:
                        if back_dic['wait_time']:
                            print('非会员用户请等待%s后开始下载' % back_dic['wait_time'])
                            time.sleep(back_dic['wait_time'])
                        print('会员用户您好,已努力加载源数据开始下载:')
                        recv_size = 0
                        file_size = back_dic['file_size']
                        file_path = os.path.join(setting.BASE_DOWNLOAD_MOVIE,movie_name)
                        with open(file_path,'wb') as f:
                            while recv_size < file_size:
                                recv_data = client.recv(1024)
                                f.write(recv_data)
                                recv_size += len(recv_data)
                                percent = recv_size / file_size
                                common.print_progress(percent)
                        print('下载成功')
                        break
                    else:
                        print(back_dic['msg'])
                        break
                break
            else:
                print(back_dic['msg'])
                break
    
    
    @common.login_auth('user')
    def download_charge_movie(client):
        while True:
            send_dic = {
                'func_type': 'check_moive_list',
                'session': user_state['cookie'],
                'movie_type': 'charge'
            }
            back_dic = common.send_back(send_dic, client)
            if back_dic['flag']:
                print(back_dic['msg'])
                movie_list = back_dic['back_movie_list']
                for k,movie in enumerate(movie_list):
                    print('%s : 影片信息:%s' % (k,movie))
                    choice = input('请选择下载的电影(q退出)>>>:').strip()
                    if choice == 'q':break
                    if not choice.isdigit():continue
                    choice = int(choice)
                    if choice >= len(movie_list):continue
                    movie_id = movie_list[choice][0]
                    movie_name = movie_list[choice][1]
                    send_dic = {
                        'func_type':'download_charge_movie',
                        'session':user_state['cookie'],
                        'movie_id':movie_id
                    }
                    back_dic = common.send_back(send_dic,client)
                    if back_dic['flag']:
                        cost_money = back_dic['cost_money']
                        confirm_charge = input('是否确认消费下载此电影(y/n)>>>:').strip()
                        if confirm_charge == 'n':
                            print('您未下载收费视频')
                            break
                        print('您已消费金额:%s,电影努力加载中' % cost_money)
                        recv_size = 0
                        file_size = back_dic['file_size']
                        file_path = os.path.join(setting.BASE_DOWNLOAD_MOVIE,movie_name)
                        with open(file_path,'wb') as f:
                            while recv_size < file_size:
                                recv_data = client.recv(1024)
                                f.write(recv_data)
                                recv_size += len(recv_data)
                                percent = recv_size / file_size
                                common.print_progress(percent)
                        print('下载成功')
                        break
                    else:
                        print(back_dic['msg'])
                        break
                break
            else:
                print(back_dic['msg'])
                break
    
    
    @common.login_auth('user')
    def check_download_record(client):
        send_dic = {
            'func_type':'check_download_record',
            'session':user_state['cookie']
        }
        back_dic = common.send_back(send_dic, client)
        if back_dic['flag']:
            print(back_dic['msg'])
            print(back_dic['back_download_record_list'])
            return
        else:
            print(back_dic['msg'])
            return
    
    
    @common.login_auth('user')
    def check_notice(client):
        send_dic = {
            'func_type': 'check_notice',
            'session': user_state['cookie']
        }
        back_dic = common.send_back(send_dic, client)
        if back_dic['flag']:
            print(back_dic['msg'])
            print(back_dic['notice_list'])
            return
        else:
            print(back_dic['msg'])
            return
    
    
    
    func_dic = {
        '1':user_register,
        '2':user_login,
        '3':charge_vip,
        '4':check_movie,
        '5':download_free_movie,
        '6':download_charge_movie,
        '7':check_download_record,
        '8':check_notice
    }
    
    
    def user_view():
        client = tcpclient.get_client()
        while True:
            print('''
            1 用户注册
            2 用户登录
            3 充会员
            4 查看视频
            5 下载免费视频
            6 下载收费视频
            7 查看下载记录
            8 查看公告
            ''')
    
            choice = input('33[32m 请选择功能 33[0m>>>:').strip()
            if choice == 'q':
                user_state['cookie'] = None
                user_state['is_vip'] = 0
                break
            if not choice.isdigit(): continue
            if choice not in func_dic: continue
            func_dic[choice](client)
    user

    lib

    import hashlib
    import json
    import struct
    import os
    
    
    def login_auth(user_type):
        from core import admin,user
        def wrapper(func):
            def auth(*args,**kwargs):
                if user_type == 'admin':
                    if not admin.user_state['cookie']:
                        print('请先登录')
                        admin.admin_login(args[0])
                    else:
                        func(*args,**kwargs)
                elif user_type == 'user':
                    if not user.user_state['cookie']:
                        print('请先登录')
                        user.user_login(args[0])
                    else:
                        func(*args,**kwargs)
                else:
                    return False
            return auth
        return wrapper
    
    
    def get_password_md5(password):
        md = hashlib.md5()
        md.update('密码加盐'.encode('utf-8'))
        md.update(password.encode('utf-8'))
        return md.hexdigest()
    
    
    def send_back(send_dic,client,file=None):
        # 发送
        send_dic_json = json.dumps(send_dic)
        send_dic_bytes = send_dic_json.encode('utf-8')
        send_dic_head = struct.pack('i',len(send_dic_bytes))
        client.send(send_dic_head)
        client.send(send_dic_bytes)
    
        # 文件
        if file:
            send_size = 0
            file_size = send_dic['file_size']
            with open(send_dic['file_path'],'rb') as f:
                while send_size < file_size:
                    send_data = f.readline()
                    client.send(send_data)
                    send_size += len(send_data)
                    percent = send_size / file_size
                    print_progress(percent)
    
        # 接收
        back_dic_head = client.recv(4)
        back_dic_len = struct.unpack('i',back_dic_head)[0]
        back_dic_bytes = client.recv(back_dic_len)
        back_dic_json = back_dic_bytes.decode('utf-8')
        back_dic = json.loads(back_dic_json)
        return back_dic
    
    
    def print_progress(percent):
        width = 70
        sign = ''
        if percent > 1:
            percent = 1
        print_str = '[%%-%ds]' % width % (int(percent * width) * sign)
        print('
    %s %d%%' % (print_str,int(percent * 100)),end='')
    
    
    # 大文件校验唯一性的md5值
    def get_file_md5(file_path):
        md = hashlib.md5()
        if os.path.exists(file_path):
            file_size = os.path.getsize(file_path)
            file_pieces_list = [0, file_size // 3, (file_size // 3) * 2, file_size - 10]
            with open(file_path, 'rb') as f:
                for file_piece in file_pieces_list:
                    f.seek(file_piece)
                    md.update(f.read(10))
                return md.hexdigest()
        else:
            print('文件不存在')
            return False
    
    
    if __name__ == '__main__':
        print(get_file_md5('/Users/limengjie/Desktop/pyhon/youku_web/youku_client/upload_movie/test.pdf'))
        print(get_file_md5('/Users/limengjie/Desktop/pyhon/youku_web/youku_client/upload_movie/test2.pdf'))
    
        percent = 0
        while percent < 1:
            percent += 0.1
            print_progress(percent)
    common

    tcp_client

    import socket
    from conf import setting
    
    
    def get_client():
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        client.connect(setting.IP_PORT)
        return client
    tcpclient

    根目录下:

    import os
    import sys
    
    
    path = os.path.dirname(__file__)
    sys.path.append(path)
    
    from core import src
    
    if __name__ == '__main__':
        src.run()
    start
  • 相关阅读:
    如何使用GOOGLE高级搜索技巧
    你所认为的极限,可能只是别人眼中的起点
    飞机选座——附:东航320选坐攻略
    古诗词里,从初识到相爱到分离到重逢的漫长过程
    从零开始学摄影
    Python之运维
    Linux用户和组密令大全
    centos7 下安装生物信息软件的问题小总结
    VMware锁定文件失败开启模块diskearly的操作失败未能启动虚拟机
    linux 基本命令整理--转
  • 原文地址:https://www.cnblogs.com/limengjie0104/p/9074209.html
Copyright © 2011-2022 走看看