优酷项目

本文详细介绍了基于Python的在线视频平台系统设计与实现,涵盖了客户端与服务端的交互流程、用户与管理员功能、数据库设计及ORM操作。系统支持用户注册、登录、会员充值、视频上传与下载等功能,同时管理员可以进行视频管理、发布公告等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户端

项目目录

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()
start

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')
settings

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('请输入正确的编号')
src
  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('请输入正确的编号')
admin
  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('请输入正确的编号')
user

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()
common

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
socketclient

 

服务端

 

 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()
start

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')
settings

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')
models
1 # 保存用户的session实现登录装饰器,并且保存了用户对应的id
2 alive_user = {}
3 mutex = None
user_data

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)
common_interface
 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)
admin_interface
 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
user_interface

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]
common

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 )
orm_pool
 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)
mysql
  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)
orm

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)
socketserver

 

转载于:https://www.cnblogs.com/sxchen/p/11448363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值