客户端
项目目录
bin目录下


1 import os 2 import sys 3 from core import src 4 5 6 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 7 sys.path.append(BASE_DIR) 8 9 if __name__ == '__main__': 10 src.run()
conf目录下


1 import os 2 3 # 根目录 4 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 5 # 下载电影目录 6 DOWNLOAD_MOVIE_PATH = os.path.join(BASE_DIR,'download_movie') 7 # 上传电影目录 8 UPLOAD_MOVIE_PATH = os.path.join(BASE_DIR,'upload_movie')
core目录下


1 from core import admin, user 2 from tcpclient.socketclient import SocketClient 3 4 func_dic = { 5 '1': user.run, 6 '2': admin.run 7 } 8 9 10 def run(): 11 while True: 12 # 导入套接字类,生成一个对象取出client 13 sk = SocketClient() 14 client = sk.get_client() 15 print(''' 16 1 用户视图 17 2 管理员视图 18 q 退出 19 ''') 20 choice = input('请选择进入的功能>>>:').strip() 21 if choice == 'q': 22 print('欢迎下次光临') 23 break 24 elif choice in func_dic: 25 func_dic[choice](client) 26 else: 27 print('请输入正确的编号')


1 from lib import common 2 from conf import settings 3 import os 4 5 user_info = { 6 'cookie': None 7 } 8 9 10 def register(client): 11 # 将注册的用户名和密码传输到服务端 12 # 判断是否存在,存在返回,不存在存储到数据库中,注册成功 13 print('注册功能') 14 while True: 15 username = input('请输入您的用户名>>>:').strip() 16 pwd = input('请输入您的密码>>>:').strip() 17 re_pwd = input('请再次输入您的密码>>>:').strip() 18 if not (username and pwd): 19 print('用户名或密码不能为空') 20 continue 21 if pwd != re_pwd: 22 print('两次密码不一致') 23 continue 24 send_dic = {'type': 'register', 'name': username, 'pwd': pwd, 'user_type': 'admin'} 25 recv_dic = common.send_data_back_dic(client, send_dic) 26 print(recv_dic.get('msg')) 27 if recv_dic.get('flag'): 28 break 29 30 31 def login(client): 32 print('登录功能') 33 # 将登录的用户名和密码传输到服务端 34 # 判断是否不存在,不存在返回,存在校验密码是否一致,一致则登录成功 35 while True: 36 username = input('请输入您的用户名>>>:').strip() 37 pwd = input('请输入您的密码>>>:').strip() 38 if not (username and pwd): 39 print('用户名或密码不能为空') 40 continue 41 send_dic = {'type': 'login', 'name': username, 'pwd': pwd, 'user_type': 'admin'} 42 recv_dic = common.send_data_back_dic(client, send_dic) 43 print(recv_dic.get('msg')) 44 if recv_dic.get('flag'): 45 user_info['cookie'] = recv_dic.get('session') 46 break 47 48 49 def upload_movie(client): 50 # 先获取自己上传视频的文件列表 51 # 选择列表中的文件并发送数据 52 print('上传视频功能') 53 while True: 54 movie_list = os.listdir(settings.UPLOAD_MOVIE_PATH) 55 if not movie_list: 56 print('暂无可上传的电影') 57 break 58 for i, movie_name in enumerate(movie_list, 1): 59 print(i, movie_name) 60 choice = input('请选择上传的电影>>>:').strip() 61 if not choice.isdigit(): 62 print('请输入数字') 63 continue 64 choice = int(choice) - 1 65 if choice not in range(len(movie_list)): 66 print('请输入正确的编号') 67 continue 68 file_name = movie_list[choice] 69 file_path = os.path.join(settings.UPLOAD_MOVIE_PATH, file_name) 70 # print(file_path) 71 file_size = os.path.getsize(file_path) 72 # print(file_size) 73 file_md5 = common.get_file_md5(file_path, file_size) 74 send_dic = {'type': 'check_movie_is_exist', 'session': user_info.get('cookie'), 'file_md5': file_md5} 75 recv_dic = common.send_data_back_dic(client, send_dic) 76 print(recv_dic.get('msg')) 77 if not recv_dic.get('flag'): 78 break 79 choice = input('请选择上传的电影是否收费,按y收费,否则免费>>>:').strip() 80 is_free = 1 if choice == 'y' else 0 81 send_dic = {'type': 'upload_movie', 'session': user_info.get('cookie'), 'file_md5': file_md5, 82 'is_free': is_free, 'file_name': file_name, 'file_size': file_size} 83 recv_dic = common.send_data_back_dic(client, send_dic, file_path) 84 print(recv_dic.get('msg')) 85 break 86 87 88 def delete_movie(client): 89 print('删除视频功能') 90 # 获取视频列表,再选择视频,删除 91 send_dic = {'type': 'get_movie_list', 'session': user_info.get('cookie'), 'movie_type': 'all'} 92 recv_dic = common.send_data_back_dic(client, send_dic) 93 print(recv_dic.get('msg')) 94 if not recv_dic.get('flag'): 95 return 96 movie_info_list = recv_dic.get('movie_info_list') 97 while True: 98 for i, movie_info in enumerate(movie_info_list, 1): 99 print('%s>>>电影名:%s,收费情况:%s' % (i, movie_info[0], movie_info[1])) 100 choice = input('请选择删除的电影>>>:').strip() 101 if not choice.isdigit(): 102 print('请输入数字') 103 continue 104 choice = int(choice) - 1 105 if choice not in range(len(movie_info_list)): 106 print('请输入正确的编号') 107 continue 108 movie_id = movie_info_list[choice][2] 109 send_dic = {'type': 'delete_movie', 'session': user_info.get('cookie'), 'movie_id': movie_id} 110 recv_dic = common.send_data_back_dic(client, send_dic) 111 print(recv_dic.get('msg')) 112 break 113 114 115 def release_notice(client): 116 print('发布公告功能') 117 # 将公告的标题和内容发送给服务端 118 while True: 119 title = input('请输入公告标题>>>:').strip() 120 content = input('请输入公告内容>>>:').strip() 121 if not (title and content): 122 print('输入不能为空') 123 continue 124 send_dic = {'type': 'release_notice', 'session': user_info.get('cookie'), 'title': title, 'content': content} 125 recv_dic = common.send_data_back_dic(client, send_dic) 126 print(recv_dic.get('msg')) 127 break 128 129 130 func_dic = { 131 '1': register, 132 '2': login, 133 '3': upload_movie, 134 '4': delete_movie, 135 '5': release_notice 136 } 137 138 139 def run(client): 140 while True: 141 print(''' 142 1.注册 143 2.登录 144 3.上传视频 145 4.删除视频 146 5.发布公告 147 q 退出 148 ''') 149 choice = input('请选择进入的功能>>>:').strip() 150 if choice == 'q': 151 print('欢迎下次光临') 152 user_info['cookie'] = None 153 break 154 elif choice in func_dic: 155 func_dic[choice](client) 156 else: 157 print('请输入正确的编号')


1 from lib import common 2 from conf import settings 3 import os 4 5 user_info = { 6 'cookie': None, 7 'is_vip': None 8 } 9 10 11 def register(client): 12 print('注册功能') 13 while True: 14 username = input('请输入您的用户名>>>:').strip() 15 pwd = input('请输入您的密码>>>:').strip() 16 re_pwd = input('请再次输入您的密码>>>:').strip() 17 if not (username and pwd): 18 print('用户名或密码不能为空') 19 continue 20 if pwd != re_pwd: 21 print('两次密码不一致') 22 continue 23 send_dic = {'type': 'register', 'name': username, 'pwd': pwd, 'user_type': 'user'} 24 recv_dic = common.send_data_back_dic(client, send_dic) 25 print(recv_dic.get('msg')) 26 if recv_dic.get('flag'): 27 break 28 29 30 def login(client): 31 print('登录功能') 32 while True: 33 username = input('请输入您的用户名>>>:').strip() 34 pwd = input('请输入您的密码>>>:').strip() 35 if not (username and pwd): 36 print('用户名或密码不能为空') 37 continue 38 send_dic = {'type': 'login', 'name': username, 'pwd': pwd, 'user_type': 'user'} 39 recv_dic = common.send_data_back_dic(client, send_dic) 40 print(recv_dic.get('msg')) 41 if recv_dic.get('flag'): 42 user_info['cookie'] = recv_dic.get('session') 43 user_info['is_vip'] = recv_dic.get('is_vip') 44 new_notice = recv_dic.get('new_notice') 45 print('最新公告>>>公告标题:%s,公告内容:%s,发布时间:%s' % (new_notice[0], new_notice[1], new_notice[2])) 46 break 47 48 49 def buy_vip(client): 50 print('充会员功能') 51 if user_info.get('is_vip'): 52 print('请勿重复购买') 53 return 54 choice = input('请选择是否需要支付$100购买vip,按y支付>>>:').strip() 55 if choice != 'y': 56 print('gun') 57 return 58 send_dic = {'type': 'buy_vip', 'session': user_info.get('cookie')} 59 recv_dic = common.send_data_back_dic(client, send_dic) 60 print(recv_dic.get('msg')) 61 if recv_dic.get('flag'): 62 user_info['is_vip'] = recv_dic.get('is_vip') 63 64 65 def check_movie(client): 66 print('查看视频功能') 67 send_dic = {'type': 'get_movie_list', 'session': user_info.get('cookie'), 'movie_type': 'all'} 68 recv_dic = common.send_data_back_dic(client, send_dic) 69 print(recv_dic.get('msg')) 70 if not recv_dic.get('flag'): 71 return 72 movie_info_list = recv_dic.get('movie_info_list') 73 for i, movie_info in enumerate(movie_info_list, 1): 74 print('%s>>>电影名:%s,收费情况:%s' % (i, movie_info[0], movie_info[1])) 75 76 77 def download_free_movie(client): 78 print('下载免费视频功能') 79 send_dic = {'type': 'get_movie_list', 'session': user_info.get('cookie'), 'movie_type': 'free'} 80 recv_dic = common.send_data_back_dic(client, send_dic) 81 print(recv_dic.get('msg')) 82 if not recv_dic.get('flag'): 83 return 84 movie_info_list = recv_dic.get('movie_info_list') 85 while True: 86 for i, movie_info in enumerate(movie_info_list, 1): 87 print('%s>>>电影名:%s,收费情况:%s' % (i, movie_info[0], movie_info[1])) 88 choice = input('请选择下载的电影>>>:').strip() 89 if not choice.isdigit(): 90 print('请输入数字') 91 continue 92 choice = int(choice) - 1 93 if choice not in range(len(movie_info_list)): 94 print('请输入正确的编号') 95 continue 96 movie_id = movie_info_list[choice][2] 97 send_dic = {'type': 'download_free_movie', 'session': user_info.get('cookie'), 'movie_id': movie_id} 98 recv_dic = common.send_data_back_dic(client, send_dic) 99 file_size = recv_dic.get('file_size') 100 file_name = recv_dic.get('file_name') 101 file_path = os.path.join(settings.DOWNLOAD_MOVIE_PATH, file_name) 102 recv_size = 0 103 with open(file_path, 'wb') as f: 104 while recv_size < file_size: 105 data = client.recv(1024) 106 f.write(data) 107 recv_size += len(data) 108 c = recv_size / file_size 109 print("\r%.2f%%" % (c * 100), end='') 110 print('下载成功') 111 break 112 113 114 def download_charge_movie(client): 115 print('下载收费视频功能') 116 send_dic = {'type': 'get_movie_list', 'session': user_info.get('cookie'), 'movie_type': 'charge'} 117 recv_dic = common.send_data_back_dic(client, send_dic) 118 print(recv_dic.get('msg')) 119 if not recv_dic.get('flag'): 120 return 121 movie_info_list = recv_dic.get('movie_info_list') 122 while True: 123 for i, movie_info in enumerate(movie_info_list, 1): 124 print('%s>>>电影名:%s,收费情况:%s' % (i, movie_info[0], movie_info[1])) 125 choice = input('请选择下载的电影>>>:').strip() 126 if not choice.isdigit(): 127 print('请输入数字') 128 continue 129 choice = int(choice) - 1 130 if choice not in range(len(movie_info_list)): 131 print('请输入正确的编号') 132 continue 133 if user_info.get('is_vip'): 134 cmd = input('是否支付$5购买该电影,按y购买>>>:').strip() 135 else: 136 cmd = input('是否支付$10购买该电影,按y购买>>>:').strip() 137 if cmd != 'y': 138 print('gun') 139 break 140 movie_id = movie_info_list[choice][2] 141 send_dic = {'type': 'download_free_movie', 'session': user_info.get('cookie'), 'movie_id': movie_id} 142 recv_dic = common.send_data_back_dic(client, send_dic) 143 file_size = recv_dic.get('file_size') 144 file_name = recv_dic.get('file_name') 145 file_path = os.path.join(settings.DOWNLOAD_MOVIE_PATH, file_name) 146 recv_size = 0 147 with open(file_path, 'wb') as f: 148 while recv_size < file_size: 149 data = client.recv(1024) 150 f.write(data) 151 recv_size += len(data) 152 c = recv_size / file_size 153 print("\r%.2f%%" % (c * 100), end='') 154 print('下载成功') 155 break 156 157 158 def check_download_record(client): 159 print('查看观影记录功能') 160 send_dic = {'type': 'check_download_record', 'session': user_info.get('cookie')} 161 recv_dic = common.send_data_back_dic(client, send_dic) 162 print(recv_dic.get('msg')) 163 if recv_dic.get('flag'): 164 movie_info_list = recv_dic.get('movie_info_list') 165 for i, movie_info in enumerate(movie_info_list, 1): 166 print('%s>>>电影名:%s,收费情况:%s,下载时间:%s' % (i, movie_info[0], movie_info[1], movie_info[2])) 167 168 169 def check_notice(client): 170 print('查看公告功能') 171 send_dic = {'type': 'check_notice', 'session': user_info.get('cookie')} 172 recv_dic = common.send_data_back_dic(client, send_dic) 173 print(recv_dic.get('msg')) 174 if recv_dic.get('flag'): 175 notice_list = recv_dic.get('notice_list') 176 for i, notice in enumerate(notice_list, 1): 177 print('%s>>>公告标题:%s,公告内容:%s,发布时间:%s' % (i, notice[0], notice[1], notice[2])) 178 179 180 func_dic = { 181 '1': register, 182 '2': login, 183 '3': buy_vip, 184 '4': check_movie, 185 '5': download_free_movie, 186 '6': download_charge_movie, 187 '7': check_download_record, 188 '8': check_notice 189 } 190 191 192 def run(client): 193 while True: 194 print(''' 195 1.注册 196 2.登录 197 3.充会员 198 4.查看视频 199 5.下载免费视频 200 6.下载收费视频 201 7.查看观影记录 202 8.查看公告 203 q 退出 204 ''') 205 choice = input('请选择进入的功能>>>:').strip() 206 if choice == 'q': 207 print('欢迎下次光临') 208 user_info['cookie'] = None 209 break 210 elif choice in func_dic: 211 func_dic[choice](client) 212 else: 213 print('请输入正确的编号')
lib目录下


1 import json 2 import struct 3 import hashlib 4 import os 5 6 7 # 发送数据接受数据 8 def send_data_back_dic(client, send_dic, path=None): 9 data_bytes = json.dumps(send_dic).encode('utf-8') 10 header = struct.pack('i', len(data_bytes)) 11 client.send(header) 12 client.send(data_bytes) 13 if path: 14 file_size = os.path.getsize(path) 15 recv_size = 0 16 with open(path, 'rb') as f: 17 for line in f: 18 client.send(line) 19 recv_size += len(line) 20 c = recv_size / file_size 21 print("\r%.2f%%" % (c * 100), end='') 22 header = client.recv(4) 23 data_len = struct.unpack('i', header)[0] 24 data_bytes = client.recv(data_len) 25 return json.loads(data_bytes.decode('utf-8')) 26 27 28 def get_file_md5(file_path, file_size): 29 md = hashlib.md5() 30 index_list = [0, file_size // 2, file_size - 10] 31 with open(file_path, 'rb') as f: 32 for index in index_list: 33 # print(index) 34 f.seek(index) 35 data = f.read(10) 36 md.update(data) 37 return md.hexdigest()
tcpclient目录下


1 import socket 2 3 4 class SocketClient(): 5 def __init__(self): 6 self.client = socket.socket() 7 self.client.connect(('127.0.0.1', 8080)) 8 9 def get_client(self): 10 return self.client
服务端
bin目录下


1 import os 2 import sys 3 from tcpserver.socketserver import SocketServer 4 5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 6 sys.path.append(BASE_DIR) 7 8 if __name__ == '__main__': 9 src = SocketServer() 10 src.run()
conf目录下


1 import os 2 3 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 4 MOVIE_DB_PATH = os.path.join(BASE_DIR, 'movie_db')
db目录下


1 from orm_mysql.orm import Models, StrField, IntField 2 3 4 class User(Models): 5 table_name = 'user' 6 id = IntField(name='id', primary_key=True) 7 name = StrField(name='name') 8 pwd = StrField(name='pwd') 9 is_vip = IntField(name='is_vip') 10 is_locked = IntField(name='is_locked') 11 user_type = StrField(name='user_type') 12 register_time = StrField(name='register_time') 13 14 15 class Movie(Models): 16 table_name = 'movie' 17 id = IntField(name='id', primary_key=True) 18 name = StrField(name='name') 19 path = StrField(name='path') 20 is_free = IntField(name='is_free') 21 is_delete = IntField(name='is_delete') 22 file_md5 = StrField(name='file_md5') 23 upload_time = StrField(name='upload_time') 24 user_id = IntField(name='user_id') 25 26 27 class Download_record(Models): 28 table_name = 'download_record' 29 id = IntField(name='id', primary_key=True) 30 user_id = IntField(name='user_id') 31 movie_id = IntField(name='movie_id') 32 download_time = StrField(name='download_time') 33 34 35 class Notice(Models): 36 table_name = 'notice' 37 id = IntField(name='id', primary_key=True) 38 title = StrField(name='title') 39 content = StrField(name='content') 40 create_time = StrField(name='create_time') 41 user_id = IntField(name='user_id')


1 # 保存用户的session实现登录装饰器,并且保存了用户对应的id 2 alive_user = {} 3 mutex = None
interface目录下


1 from db import models, user_data 2 from lib import common 3 from interface import user_interface 4 5 6 def register_interface(conn, recv_dic): 7 name = recv_dic.get('name') 8 pwd = common.get_md5_pwd(recv_dic.get('pwd')) 9 user_type = recv_dic.get('user_type') 10 user_list = models.User.select(name=name) 11 if user_list: 12 send_dic = {'flag': False, 'msg': '用户名已存在'} 13 else: 14 user_obj = models.User(name=name, pwd=pwd, is_vip=0, is_locked=0, user_type=user_type, 15 register_time=common.get_time()) 16 user_obj.save() 17 send_dic = {'flag': True, 'msg': '注册成功'} 18 common.send_msg(conn, send_dic) 19 20 21 def login_interface(conn, recv_dic): 22 name = recv_dic.get('name') 23 pwd = common.get_md5_pwd(recv_dic.get('pwd')) 24 user_type = recv_dic.get('user_type') 25 user_list = models.User.select(name=name) 26 if not user_list: 27 send_dic = {'flag': False, 'msg': '用户名不存在'} 28 else: 29 user_obj = user_list[0] 30 if user_obj.user_type != user_type: 31 send_dic = {'flag': False, 'msg': '用户类型错误'} 32 else: 33 if user_obj.pwd == pwd: 34 addr = recv_dic.get('addr') 35 session = common.get_session() 36 is_vip = user_obj.is_vip 37 user_data.mutex.acquire() 38 user_data.alive_user[str(addr)] = [session, user_obj.id] 39 user_data.mutex.release() 40 new_notice = user_interface.check_notice('new') 41 send_dic = {'flag': True, 'msg': '登录成功', 'session': session, 'is_vip': is_vip, 'new_notice': new_notice} 42 else: 43 send_dic = {'flag': False, 'msg': '密码错误'} 44 common.send_msg(conn, send_dic) 45 46 47 @common.login_auth 48 def get_movie_list_interface(conn, recv_dic): 49 movie_obj_list = models.Movie.select() 50 # print(movie_obj_list) 51 if not movie_obj_list: 52 send_dic = {'flag': False, 'msg': '暂无电影'} 53 else: 54 movie_info_list = [] 55 for movie_obj in movie_obj_list: 56 if not movie_obj.is_delete: 57 movie_name = common.get_movie_name(movie_obj.name) 58 if recv_dic.get('movie_type') == 'all': 59 movie_info_list.append([movie_name, '收费' if movie_obj.is_free else '免费', movie_obj.id]) 60 elif recv_dic.get('movie_type') == 'free': 61 if not movie_obj.is_free: 62 movie_info_list.append([movie_name, '免费', movie_obj.id]) 63 elif recv_dic.get('movie_type') == 'charge': 64 if movie_obj.is_free: 65 movie_info_list.append([movie_name, '收费', movie_obj.id]) 66 if not movie_info_list: 67 send_dic = {'flag': False, 'msg': '暂无电影'} 68 else: 69 send_dic = {'flag': True, 'msg': '电影如下', 'movie_info_list': movie_info_list} 70 common.send_msg(conn, send_dic)


1 from db import models 2 from lib import common 3 from conf import settings 4 import os 5 6 7 @common.login_auth 8 def check_movie_is_exist_interface(conn, recv_dic): 9 file_md5 = recv_dic.get('file_md5') 10 movie_obj_list = models.Movie.select(file_md5=file_md5) 11 if movie_obj_list: 12 send_dic = {'flag': False, 'msg': '电影已存在'} 13 else: 14 send_dic = {'flag': True, 'msg': '可以上传'} 15 common.send_msg(conn, send_dic) 16 17 18 @common.login_auth 19 def upload_movie_interface(conn, recv_dic): 20 user_id = recv_dic.get('user_id') 21 file_md5 = recv_dic.get('file_md5') 22 file_name = recv_dic.get('session') + '$' + recv_dic.get('file_name') 23 is_free = recv_dic.get('is_free') 24 file_size = recv_dic.get('file_size') 25 file_path = os.path.join(settings.MOVIE_DB_PATH, file_name) 26 recv_size = 0 27 with open(file_path, 'wb') as f: 28 while recv_size < file_size: 29 data = conn.recv(1024) 30 f.write(data) 31 recv_size += len(data) 32 movie_ovj = models.Movie(name=file_name, path=file_path, is_free=is_free, is_delete=0, 33 file_md5=file_md5, upload_time=common.get_time(), user_id=user_id) 34 movie_ovj.save() 35 send_dic = {'flag': True, 'msg': '上传成功'} 36 common.send_msg(conn, send_dic) 37 38 39 @common.login_auth 40 def delete_movie_interface(conn, recv_dic): 41 movie_id = recv_dic.get('movie_id') 42 movie_obj = models.Movie.select(id=movie_id)[0] 43 movie_obj.is_delete = 1 44 movie_obj.my_update() 45 send_dic = {'flag': True, 'msg': '删除成功'} 46 common.send_msg(conn, send_dic) 47 48 49 @common.login_auth 50 def release_notice_interface(conn, recv_dic): 51 title = recv_dic.get('title') 52 content = recv_dic.get('content') 53 user_id = recv_dic.get('user_id') 54 notice_obj = models.Notice(title=title, content=content, create_time=common.get_time(), user_id=user_id) 55 notice_obj.save() 56 send_dic = {'flag': True, 'msg': '公告发布成功'} 57 common.send_msg(conn, send_dic)


1 from lib import common 2 from db import models 3 import os 4 5 6 @common.login_auth 7 def buy_vip_interface(conn, recv_dic): 8 user_id = recv_dic.get('user_id') 9 user_obj = models.User.select(id=user_id)[0] 10 user_obj.is_vip = 1 11 user_obj.my_update() 12 send_dic = {'flag': True, 'msg': '购买成功', 'is_vip': user_obj.is_vip} 13 common.send_msg(conn, send_dic) 14 15 16 @common.login_auth 17 def download_free_movie_interface(conn, recv_dic): 18 user_id = recv_dic.get('user_id') 19 movie_id = recv_dic.get('movie_id') 20 movie_obj = models.Movie.select(id=movie_id)[0] 21 file_path = movie_obj.path 22 file_size = os.path.getsize(file_path) 23 file_name = common.get_movie_name(movie_obj.name) 24 send_dic = {'flag': True, 'msg': '可以上传', 'file_size': file_size, 'file_name': file_name} 25 common.send_msg(conn, send_dic, file_path) 26 record_obj = models.Download_record(user_id=user_id, movie_id=movie_id, download_time=common.get_time()) 27 record_obj.save() 28 29 30 @common.login_auth 31 def check_download_record_interface(conn, recv_dic): 32 user_id = recv_dic.get('user_id') 33 record_obj_list = models.Download_record.select(user_id=user_id) 34 if not record_obj_list: 35 send_dic = {'flag': False, 'msg': '暂无下载记录'} 36 else: 37 movie_info_list = [] 38 new_record_obj_list = sorted(record_obj_list, key=lambda record_obj: record_obj.download_time, reverse=True) 39 for record_obj in new_record_obj_list: 40 movie_obj = models.Movie.select(id=record_obj.movie_id)[0] 41 movie_name = common.get_movie_name(movie_obj.name) 42 movie_info_list.append([movie_name, '收费' if movie_obj.is_free else '免费', record_obj.download_time]) 43 send_dic = {'flag': True, 'msg': '下载记录如下', 'movie_info_list': movie_info_list} 44 common.send_msg(conn, send_dic) 45 46 47 @common.login_auth 48 def check_notice_interface(conn, recv_dic): 49 notice_obj_list = check_notice() 50 if not notice_obj_list: 51 send_dic = {'flag': False, 'msg': '暂无公告'} 52 else: 53 notice_list = [] 54 for notice_obj in notice_obj_list: 55 title = notice_obj.title 56 content = notice_obj.content 57 create_time = notice_obj.create_time 58 notice_list.append([title, content, create_time]) 59 send_dic = {'flag': True, 'msg': '公告如下', 'notice_list': notice_list} 60 common.send_msg(conn, send_dic) 61 62 63 def check_notice(new=None): 64 notice_obj_list = models.Notice.select() 65 if not notice_obj_list: 66 return 67 desc_notice_obj_list = sorted( 68 notice_obj_list, key=lambda notice_obj: notice_obj.create_time, reverse=True 69 ) 70 if new: 71 new_notice = [ 72 desc_notice_obj_list[0].title, 73 desc_notice_obj_list[0].content, 74 desc_notice_obj_list[0].create_time 75 ] 76 return new_notice 77 return desc_notice_obj_list
lib目录下


1 import time 2 import json 3 import struct 4 import hashlib 5 import uuid 6 from functools import wraps 7 from db import user_data 8 9 10 def get_time(): 11 return time.strftime('%Y-%m-%d %X') 12 13 14 def get_md5_pwd(pwd): 15 md = hashlib.md5() 16 md.update(pwd.encode('utf-8')) 17 md.update('虹桥炮王'.encode('utf-8')) 18 return md.hexdigest() 19 20 21 def send_msg(conn, send_dic, path=None): 22 data_bytes = json.dumps(send_dic).encode('utf-8') 23 header = struct.pack('i', len(data_bytes)) 24 conn.send(header) 25 conn.send(data_bytes) 26 if path: 27 with open(path, 'rb') as f: 28 for line in f: 29 conn.send(line) 30 31 32 def get_session(): 33 session = str(uuid.uuid4()) 34 return session 35 36 37 # 验证登录装饰器 38 def login_auth(func): 39 @wraps(func) 40 def inner(*args, **kwargs): 41 addr = args[1].get('addr') 42 if user_data.alive_user: 43 if user_data.alive_user.get(str(addr))[0] == args[1].get('session'): 44 args[1]['user_id'] = user_data.alive_user.get(str(addr))[1] 45 return func(*args, **kwargs) 46 send_dic = {'flag': False, 'msg': '未登录,请先登录'} 47 send_msg(args[0], send_dic) 48 49 return inner 50 51 52 def get_movie_name(name): 53 return name.split('$')[1]
orm_mysql目录下


1 from DBUtils.PooledDB import PooledDB 2 import pymysql 3 4 # pip3 install DBUtils 5 6 POOL = PooledDB( 7 creator=pymysql, # 使用链接数据库的模块 8 maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数 9 mincached=2, # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 10 maxcached=5, # 链接池中最多闲置的链接,0和None不限制 11 maxshared=3, 12 # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 13 blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 14 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 15 setsession=[], # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] 16 ping=0, 17 # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always 18 host='127.0.0.1', 19 port=3306, 20 user='root', 21 password='9527', 22 database='aiqiyi', 23 charset='utf8', 24 autocommit='True' 25 )


1 import pymysql 2 from orm_mysql.db_pool import POOL 3 4 5 class Mysql(): 6 def __init__(self): 7 self.conn = POOL.connection() 8 self.cursor = self.conn.cursor(pymysql.cursors.DictCursor) 9 10 def close(self): 11 self.cursor.close() 12 self.conn.close() 13 14 def select(self, sql, args=None): 15 self.cursor.execute(sql, args) 16 return self.cursor.fetchall() 17 18 def save(self, sql, args): 19 try: 20 self.cursor.execute(sql, args) 21 except Exception as e: 22 print(e)


1 from orm_mysql.mysql import Mysql 2 3 4 class Field(): 5 def __init__(self, name, column_type, primary_key, default): 6 self.name = name 7 self.column_type = column_type 8 self.primary_key = primary_key 9 self.default = default 10 11 12 class StrField(Field): 13 def __init__(self, name, column_type='varchar(255)', primary_key=False, default=None): 14 super().__init__(name, column_type, primary_key, default) 15 16 17 class IntField(Field): 18 def __init__(self, name, column_type='int', primary_key=False, default=0): 19 super().__init__(name, column_type, primary_key, default) 20 21 22 class MyMetaclass(type): 23 def __new__(cls, class_name, class_base, class_attrs): 24 if class_name == 'Models': 25 return type.__new__(cls, class_name, class_base, class_attrs) 26 table_name = class_attrs.get('table_name', class_name) 27 primary_key = None 28 mappings = {} 29 for k, v in class_attrs.items(): 30 if isinstance(v, Field): 31 mappings[k] = v 32 if v.primary_key: 33 if primary_key: 34 raise TypeError('一个表只能有一个主键') 35 primary_key = v.name 36 if not primary_key: 37 raise TypeError('一个表至少有一个主键') 38 # print(mappings) 39 for k in mappings.keys(): 40 class_attrs.pop(k) 41 class_attrs['table_name'] = table_name 42 class_attrs['primary_key'] = primary_key 43 class_attrs['mappings'] = mappings 44 return type.__new__(cls, class_name, class_base, class_attrs) 45 46 47 class Models(dict, metaclass=MyMetaclass): 48 def __init__(self, *args, **kwargs): 49 super().__init__(*args, **kwargs) 50 51 def __getattr__(self, item): 52 # print(2) 53 return self.get(item, '没有这个key') 54 55 def __setattr__(self, key, value): 56 self[key] = value 57 58 @classmethod 59 def select(cls, **kwargs): 60 # select * from 表名 where字段名=字段值 61 ms = Mysql() 62 if not kwargs: 63 sql = 'select * from %s' % cls.table_name 64 res = ms.select(sql) 65 else: 66 k = list(kwargs.keys())[0] 67 v = kwargs.get(k, '没有这个key') 68 sql = 'select * from %s where %s=?' % (cls.table_name, k) 69 sql = sql.replace('?', '%s') 70 res = ms.select(sql, v) 71 return [cls(**r) for r in res] 72 73 def save(self): 74 ms = Mysql() 75 # insert into 表名(字段名) values(字段值) 76 fields = [] 77 values = [] 78 args = [] 79 for k, v in self.mappings.items(): 80 if not v.primary_key: 81 fields.append(v.name) 82 args.append('?') 83 # print(v.name) 84 # print(1) 85 values.append(getattr(self, v.name, v.default)) 86 # print(3) 87 # print(values) 88 sql = 'insert into %s(%s) values(%s)' % (self.table_name, ','.join(fields), ','.join(args)) 89 # print(sql) 90 sql = sql.replace('?', '%s') 91 # print(sql) 92 # print(values) 93 ms.save(sql, values) 94 95 def my_update(self): 96 ms = Mysql() 97 # update 表名 set 字段名=字段值 where id=1 98 fields = [] 99 values = [] 100 primary_key = None 101 for k, v in self.mappings.items(): 102 if v.primary_key: 103 primary_key = getattr(self, v.name, v.default) 104 else: 105 fields.append(v.name + '=?') 106 values.append(getattr(self, v.name, v.default)) 107 sql = 'update %s set %s where %s=%s' % (self.table_name, ','.join(fields), self.primary_key, primary_key) 108 # print(sql) 109 sql = sql.replace('?', '%s') 110 # print(sql) 111 # print(values) 112 ms.save(sql, values)
tcpserver目录下


1 import socket 2 import struct 3 import json 4 from interface import common_interface, admin_interface, user_interface 5 from concurrent.futures import ThreadPoolExecutor 6 from threading import Lock 7 from db import user_data 8 9 10 class SocketServer(): 11 pool = ThreadPoolExecutor() 12 mutex = Lock() 13 user_data.mutex = mutex 14 15 def __init__(self): 16 self.server = socket.socket() 17 self.server.bind(('127.0.0.1', 8080)) 18 self.server.listen() 19 self.func_dic = { 20 'register': common_interface.register_interface, 21 'login': common_interface.login_interface, 22 'check_movie_is_exist': admin_interface.check_movie_is_exist_interface, 23 'upload_movie': admin_interface.upload_movie_interface, 24 'get_movie_list': common_interface.get_movie_list_interface, 25 'delete_movie': admin_interface.delete_movie_interface, 26 'release_notice': admin_interface.release_notice_interface, 27 'buy_vip': user_interface.buy_vip_interface, 28 'download_free_movie': user_interface.download_free_movie_interface, 29 'check_download_record': user_interface.check_download_record_interface, 30 'check_notice': user_interface.check_notice_interface 31 } 32 33 def run(self): 34 while True: 35 conn, addr = self.server.accept() 36 print('有客户端连接') 37 self.pool.submit(self.working, conn, addr) 38 39 def working(self, conn, addr): 40 while True: 41 try: 42 header = conn.recv(4) 43 data_len = struct.unpack('i', header)[0] 44 data_bytes = conn.recv(data_len) 45 recv_dic = json.loads(data_bytes.decode('utf-8')) 46 recv_dic['addr'] = str(addr) 47 # print(recv_dic) 48 self.dispatch(conn, recv_dic) 49 except Exception as e: 50 print(e) 51 self.mutex.acquire() 52 if user_data.alive_user: 53 user_data.alive_user.pop(str(addr)) 54 self.mutex.release() 55 conn.close() 56 break 57 58 def dispatch(self, conn, recv_dic): 59 func_type = recv_dic.get('type') 60 if func_type in self.func_dic: 61 self.func_dic[func_type](conn, recv_dic)