From 24e4cc35f1d0ffa7d87e6b387d6f2de5069a4871 Mon Sep 17 00:00:00 2001 From: xishandong Date: Tue, 11 Jul 2023 18:05:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E5=85=B3?= =?UTF-8?q?=E6=B3=A8=E5=8F=96=E6=B6=88=E5=85=B3=E6=B3=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server01/__pycache__/models.cpython-39.pyc | Bin 2338 -> 2506 bytes .../migrations/0011_remove_user_followed.py | 17 ++++++ .../0011_remove_user_followed.cpython-39.pyc | Bin 0 -> 528 bytes Server01/models.py | 11 +++- Server01/static/img/post/29-avatar.jpg | Bin 0 -> 32254 bytes .../auxiliaryFuction.cpython-39.pyc | Bin 413 -> 1222 bytes Server01/util/auxiliaryFuction.py | 38 ++++++++++++ .../views/__pycache__/post.cpython-39.pyc | Bin 3146 -> 2886 bytes .../views/__pycache__/user.cpython-39.pyc | Bin 2263 -> 3146 bytes Server01/views/post.py | 26 +++----- Server01/views/user.py | 57 ++++++++++++------ webServer/__pycache__/settings.cpython-39.pyc | Bin 2587 -> 2614 bytes webServer/__pycache__/urls.cpython-39.pyc | Bin 1274 -> 1382 bytes webServer/settings.py | 3 +- webServer/urls.py | 6 ++ 15 files changed, 118 insertions(+), 40 deletions(-) create mode 100644 Server01/migrations/0011_remove_user_followed.py create mode 100644 Server01/migrations/__pycache__/0011_remove_user_followed.cpython-39.pyc create mode 100644 Server01/static/img/post/29-avatar.jpg diff --git a/Server01/__pycache__/models.cpython-39.pyc b/Server01/__pycache__/models.cpython-39.pyc index ba864579054b72731c95362d4a51347e701cac39..76e354a222bca33f10d3f5f7e9a65a6d38624074 100644 GIT binary patch delta 1356 zcmZuxOK;Rx6u$TRG2@wxF@|ISK?-eA@q!spTa+SHH44yf7)6?>4{t`s_mX(T*Ic@C zt+hD6^cA>HxFW)vt)R>i(?9eJBh(yHfZam}1Fr*csX2flX_HO*h-|V)gpx$# zv`X%1i9Xa|#aLs&nQNrYhBP8W_L%;XHybL$8n-{JuZrtUA#Vv;AK%WMud5_TqOcxy zmh1fyY`yLkG95gXX+a!k=D00VgWM98WGv#Dp$2^+Jzd(!=z)ZA^X6)P*ZV=T@`Pqq zs};t9QmxjwTC@0uj{wk6xKqMxR-{wxb{T74W@k&7@yaxT48*dFD2P63yX%j@m+*T4M*;{wEzd>>GL zfPj7Q3sUssNGRybNhB?Vy%BGC&byMa7;+!o@-tk(g3Hl)#E%g^LHHEm0)TJ#11Y*m zE9`YTaNl=V7a=q~qa{CY0LclSoLrbLoNKX#W@K79V{ z?#R{#Nfg(D!S_)d1@echgD{DD-SKc5*YHO(mY%l(znMJQe)_WFCHOH7V(~eCbGgVV M3a92euIn2A0*Nso(*OVf delta 1224 zcmZuxOKa3n6uvjl$&8au(`s8=tKzG{_p2y~SgLg)))Zr z43?iHZeb0BximFu5#yl@P~Ex=3$$w>^3&qq`ST7$DzV+H`?cm3xmGQ(J)rln-q)&U zxAneE?_hf&LVxm-)(bj#5C(#o=*nVgQ_r=?kIE&>GpD1VA@9s4zm(nq8#g)tJUfWO zkOwhm6OoMNxLZmb^~F$b8t7<_GtZj#A4Q@PbLm-a+Z7`E(M5mqU3HJC@Th^vUVt3c zs6$I|<*D+|P#n-u7i#j;=uHN-kd~5H+E5RM7dVdw=Kg!>`P%Z^F<~XE+Hez@fC6l+ zjS%>fJPa^Ts$_}2CriqELP@MHkg76ID`Z~zK;OV58G-)LaaT*VN^M4_svm}_0b}4X zPj%U-bK$CD7kElFUx0z}a1QS)G_}gjauE7bmdmXw2f#`k0q6sfSSe9#^=Sb+cB;vi35NF-DK18Ou_46g-cfxgGibP?eh!gb$bo%#&0V` zT*NnV0HS#k@if92gtG|e06e?y3qBi{gQ!-6`;KJ}gW*w-Ee*#5Zc~9f#J&@lns=kg>{D1ca?fvCz)Gv2ylr7U@=RvG=hxT!~06YO^O-VKrivv z`5QCG^j?*(tLw9Pv&MLf)7n7X_=xv^6_cY;BEHR?YV+>aI`c)<3TeUO3j$`RIB-i&>1v literal 0 HcmV?d00001 diff --git a/Server01/models.py b/Server01/models.py index 89295fe..e2e954f 100644 --- a/Server01/models.py +++ b/Server01/models.py @@ -1,4 +1,6 @@ from django.db import models +from webServer.settings import SYSTEM_PATH +from Server01.util.auxiliaryFuction import check_and_delete class User(models.Model): @@ -9,14 +11,17 @@ class User(models.Model): avatar = models.CharField(max_length=256, verbose_name='头像', null=False, default='http://localhost:8000/static/img/avatar/defaultAvatar.jpg') signature = models.CharField(max_length=64, verbose_name='个性签名', default='暂时没有个性签名~', null=True) + # 用户关注,related_name获取用户的粉丝 following = models.ManyToManyField('self', symmetrical=False, blank=True, related_name='beFocusOn') - followed = models.ManyToManyField('self', symmetrical=False, blank=True, related_name='focusOn') + # 用户喜爱的帖子 favorites = models.ManyToManyField('Post', blank=True, related_name='favoritePosts') + # 用户收藏的帖子 collected = models.ManyToManyField('Post', blank=True, related_name='collectedPosts') class Post(models.Model): """ 帖子表 """ + # 用户通过related_name获取ta发的帖子 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts') title = models.CharField(max_length=64, verbose_name='标题', null=False) content = models.TextField(max_length=3000, verbose_name='内容', null=True) @@ -25,7 +30,9 @@ class Post(models.Model): def delete(self, *args, **kwargs): # 删除关联的帖子图片 self.imgs.all().delete() - + # 删除帖子的图片的存储 + path = SYSTEM_PATH + '/webServer/Server01/static/img/post/' + check_and_delete(path, self.id) # 删除帖子本身 super().delete(*args, **kwargs) diff --git a/Server01/static/img/post/29-avatar.jpg b/Server01/static/img/post/29-avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb44714302ad732f84661531f053eb62528d6a3d GIT binary patch literal 32254 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 Yn)ZAXf`eC~$!fTomNROws^^S-02M(7xBvhE delta 1492 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 diff --git a/Server01/views/post.py b/Server01/views/post.py index 4dcd9f9..62c85c7 100644 --- a/Server01/views/post.py +++ b/Server01/views/post.py @@ -1,18 +1,18 @@ import json from django.http import JsonResponse -from webServer.settings import TIME_ZONE +from webServer.settings import TIME_ZONE, SYSTEM_PATH import Server01.models as models from Server01.util.verifyJWT import authenticate_request -from Server01.util.auxiliaryFuction import convert_to_timezone +from Server01.util.auxiliaryFuction import convert_to_timezone, combine_index_post + -system = 'D:/vue' def upload_post(request): file = request.FILES['file'] id = request.POST.get('id') - file_path = system + '/webServer/Server01/static/img/post/' + str(id) + '-' + file.name + file_path = SYSTEM_PATH + '/webServer/Server01/static/img/post/' + str(id) + '-' + file.name with open(file_path, 'wb') as destination: for chunk in file.chunks(): destination.write(chunk) @@ -27,6 +27,7 @@ def upload_post(request): return JsonResponse({'error': '错误的操作'}, status=401) +# 用户上传帖子 @authenticate_request def upload_post_info(request, payload): data = json.loads(request.body) @@ -38,6 +39,7 @@ def upload_post_info(request, payload): return JsonResponse({'data': 'success', 'info': post.id}, status=200) +# 获取帖子详情,整合信息 def get_post_detail(request): data = json.loads(request.body) id = data.get('id') @@ -72,6 +74,7 @@ def get_post_detail(request): return JsonResponse({'error': '错误的访问'}, status=401) +# 主页推送帖子 def query_post_index(request): data = json.loads(request.body) offset = data['offset'] @@ -87,18 +90,3 @@ def query_post_index(request): return JsonResponse({'info': []}, status=200) - -def combine_index_post(posts): - for post in posts: - imgs = post.imgs.all() - info = { - 'title': post.title, - 'id': post.id, - 'img': imgs[0].imagePath, - 'user': { - 'id': post.user.id, - 'username': post.user.username, - 'avatar': post.user.avatar - } - } - yield info diff --git a/Server01/views/user.py b/Server01/views/user.py index c53f640..257e929 100644 --- a/Server01/views/user.py +++ b/Server01/views/user.py @@ -3,7 +3,8 @@ from django.http import JsonResponse import Server01.models as models -from Server01.util.verifyJWT import create_token +from Server01.util.auxiliaryFuction import check_email, combine_index_post +from Server01.util.verifyJWT import create_token, authenticate_request # 用户登录 @@ -38,6 +39,7 @@ def register(request): return JsonResponse({'error': '创建用户失败'}, status=401) +# 获取用户主页信息 def query_user_index(request): data = json.loads(request.body) if data.get('id'): @@ -49,7 +51,7 @@ def query_user_index(request): 'avatar': user.avatar, 'signature': user.signature, 'fans': user.beFocusOn.count(), - 'focusOn': user.focusOn.count(), + 'focusOn': user.following.count(), 'postsCount': user.posts.count(), } info = { @@ -63,21 +65,40 @@ def query_user_index(request): return JsonResponse({'error': '非法访问'}, status=401) -def combine_index_post(posts): - for post in posts: - imgs = post.imgs.all() - info = { - 'title': post.title, - 'id': post.id, - 'img': imgs[0].imagePath, - 'user': { - 'id': post.user.id, - 'username': post.user.username, - 'avatar': post.user.avatar - } - } - yield info +# 获取用户关注用户id +@authenticate_request +def get_user_focus(request, payload): + user_id = payload['user_id'] + user = models.User.objects.filter(id=user_id).first() + following = user.following.all() + ids = [u.id for u in following] + return JsonResponse({'info': ids}, status=200) + + +# 用户关注 +@authenticate_request +def focusOn(request, payload): + # 做关注操作的用户id + id1 = payload['user_id'] + user1 = models.User.objects.filter(id=id1).first() + # 被关注的用户id + id2 = json.loads(request.body)['id'] + user2 = models.User.objects.filter(id=id2).first() + if user1 and user2: + user1.following.add(user2) + return JsonResponse({'info': '成功关注'}, status=200) + return JsonResponse({'error': '非法的操作'}, status=401) -def check_email(email): - return models.User.objects.filter(email=email).exists() +@authenticate_request +def unfollow(request, payload): + # 取消关注操作的用户id + user_id = payload['user_id'] + user = models.User.objects.filter(id=user_id).first() + # 被取消关注的用户id + unfollow_id = json.loads(request.body)['id'] + unfollow_user = models.User.objects.filter(id=unfollow_id).first() + if user and unfollow_user: + user.following.remove(unfollow_user) + return JsonResponse({'info': '成功取消关注'}, status=200) + return JsonResponse({'error': '非法的操作'}, status=401) diff --git a/webServer/__pycache__/settings.cpython-39.pyc b/webServer/__pycache__/settings.cpython-39.pyc index a20d88d08e94e3ccec5aa9cf70aa2494bb05b28a..2e5ec24db67aa73bc47ff1d438a6a6d623fd9618 100644 GIT binary patch delta 84 zcmbO&vQ309k(ZZ?0SHVq*QV(6Pvnzfyfjh!JV%slic&Cxrt-#rKiIgd*j%ji%Su!I nH03t`WUpo9jp7cD3=VPijSp}P@t9o3>CBigc^79Q6ALo{(E}IC delta 56 zcmdlcGFyZ%k(ZZ?0SMl+uTA;OH<3?<@!Ul1^DMy(no66Q7=N%a`)SHOD0GP#-%AO?%X7K`9LSPmjkR=Re@dH^RV3t5CN0w+aQ#wzSSc+gUgQn2NBPW=Y z+0ycpON;fZxJ!#ui}ax!J}{>=FD*YOC%=4h7qca!_~awZ^-Anu1^#(aeCeqr@gP<4 kV38;exMC-kSt<%ZhqLhWF!C^pF!L~RF~T8?&BXN)0Mpz)HUIzs delta 156 zcmaFH^@~$Gk(ZZ?0SI=#UX#+n!octt#6bq!K#l_t7f+d}on+3Q#n;S~%96sB%AUm! zW^n^q0$>&okR=Fa@uqTQ2{kjNb4CfL@C7qy@^5@}f@$)3W^+c7$?PoklUK6Ll#>FQ T$->XW$ipbY%)`iq3cmvY(48JS diff --git a/webServer/settings.py b/webServer/settings.py index 0ccd204..8ba416f 100644 --- a/webServer/settings.py +++ b/webServer/settings.py @@ -141,7 +141,8 @@ # 启用 CSRF 保护 CSRF_COOKIE_HTTPONLY = True - +# 配置保存文件路径 +SYSTEM_PATH = 'D:/vue' diff --git a/webServer/urls.py b/webServer/urls.py index fa736d5..8819ce1 100644 --- a/webServer/urls.py +++ b/webServer/urls.py @@ -19,12 +19,18 @@ urlpatterns = [ path("admin/", admin.site.urls), + # 用户相关 path("login/", user.login), path('register/', user.register), path('index/', user.query_user_index), + path('focus/', user.focusOn), + path('user/focus/', user.get_user_focus), + path('user/unfollow/', user.unfollow), + # 帖子相关 path('upload/', post.upload_post), path('upload/info/', post.upload_post_info), path('post/detail/', post.get_post_detail), path('post/', post.query_post_index), + # 评论相关 path('comment/', comment.do_comment) ]