Browse Source

测试修复了friends,进行了第一步合并

Shellmiao 3 years ago
parent
commit
25f4dcb229

+ 1 - 1
account/views.py

@@ -183,7 +183,7 @@ def profile_detail(request, r_username):
             response['avatar'] = profile.avatar.url
         else:
             response['avatar'] = ''
-        return HttpResponse(json.dumps(response),status=200)
+        return HttpResponse(json.dumps(response), status=200)
     # 用于测试
     elif request.method == 'GET':
         if DEBUG:

BIN
db.sqlite3


+ 12 - 0
friends/admin.py

@@ -1,3 +1,15 @@
 from django.contrib import admin
+from .models import Friends, FriendRequest
+
 
 # Register your models here.
+class FriendsAdmin(admin.ModelAdmin):
+    list_display = ["user", "friend", "status"]
+
+
+class FriendsRequestAdmin(admin.ModelAdmin):
+    list_display = ["requester", "receiver"]
+
+
+admin.site.register(Friends, FriendsAdmin)
+admin.site.register(FriendRequest, FriendsRequestAdmin)

+ 7 - 8
friends/form.py

@@ -1,13 +1,12 @@
 from django import forms
-from django.contrib.auth.models import User
 
 
-class UserRequestForm(forms.Form):
+class UserNameForm(forms.Form):
     username = forms.CharField()
-    otherUsername = forms.CharField()
-    token = forms.CharField()
 
-
-class UserListForm(forms.Form):
-    username = forms.CharField()
-    token = forms.CharField()
+    def clean_username(self):
+        data = self.data
+        if data.get('username').isalnum():
+            return data.get('username')
+        else:
+            raise forms.ValidationError('it contains illegal char!')

+ 58 - 0
friends/interface.md

@@ -0,0 +1,58 @@
+# 请求好友列表
+******
+## 请求(POST)
+请求链接:friends/friends_list
+
+无参数
+## 返回值(http状态码+(列表))
+200+列表:成功+好友名称列表
+
+400:请求不合法
+
+# 请求添加好友
+******
+## 请求(POST)
+请求链接:friends/add
+
+username(请求添加的好友名称)
+## 返回值(http状态码)
+421:二者已经是好友关系
+
+200:请求成功,等待对方同意
+
+422:对方不存在
+
+400:请求不合法
+
+# 请求获取目前未处理的被添加好友的通知
+******
+## 请求(POST)
+请求链接:friends/get_requests/
+
+## 返回值(http状态码+列表)
+200+列表:成功+目前有哪些人正在请求添加你为好友(返回他们的username)
+
+# 同意好友请求
+******
+## 请求(POST)
+请求链接:friends/accept/
+
+username(同意的那个人的username)
+
+## 返回值(http状态码)
+200:成功
+400:请求不合法
+
+# 请求删除好友
+******
+## 请求(POST)
+请求链接:friends/delete
+
+username(删除的好友的username)
+
+## 返回值(http状态码)
+422:该人不存在
+
+400:请求不合法
+
+200:成功

+ 26 - 0
friends/migrations/0001_initial.py

@@ -0,0 +1,26 @@
+# Generated by Django 3.2.5 on 2021-07-09 08:57
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Friends',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('friend', models.IntegerField()),
+                ('status', models.IntegerField(default=1)),
+                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 26 - 0
friends/migrations/0002_auto_20210709_1658.py

@@ -0,0 +1,26 @@
+# Generated by Django 3.2.5 on 2021-07-09 08:58
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('friends', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='friends',
+            name='friend',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_friend', to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AlterField(
+            model_name='friends',
+            name='user',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friends_user', to=settings.AUTH_USER_MODEL),
+        ),
+    ]

+ 24 - 0
friends/migrations/0003_friendrequest.py

@@ -0,0 +1,24 @@
+# Generated by Django 3.2.5 on 2021-07-09 09:41
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('friends', '0002_auto_20210709_1658'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='FriendRequest',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('receiver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='receiver', to=settings.AUTH_USER_MODEL)),
+                ('requester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requester', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 13 - 8
friends/models.py

@@ -1,15 +1,20 @@
 from django.db import models
+from django.contrib.auth.models import User
 
 
 # 好友表
-class friends(models.Model):
-    # 用户id
-    userid = models.IntegerField()
+class Friends(models.Model):
+    # 用户
+    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='friends_user')
     # 用户好友
-    whomFriend = models.IntegerField()
-    # 用户名
-    username = models.CharField(max_length=20, null=True)
-    # 凭证
-    token = models.CharField(max_length=100, default='233', blank=False)
+    friend = models.ForeignKey(User, on_delete=models.CASCADE, related_name='friends_friend')
     # 状态码,可以拉黑名单用,为0表示并不是好友,但是对方向自己发送过消息。
     status = models.IntegerField(default=1)
+
+
+# 好友请求表
+class FriendRequest(models.Model):
+    # 请求方
+    requester = models.ForeignKey(User, on_delete=models.CASCADE, related_name='requester')
+    # 接收方
+    receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')

+ 15 - 0
friends/templates/accept_friend.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="username">
+                            同意好友
+                        </label>
+                        <input type="text" id="username" name="username">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 15 - 0
friends/templates/add_friend.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="username">
+                            添加好友
+                        </label>
+                        <input type="text" id="username" name="username">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 15 - 0
friends/templates/delete_friend.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="username">
+                            删除好友
+                        </label>
+                        <input type="text" id="username" name="username">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 15 - 0
friends/templates/get_user_list.html

@@ -0,0 +1,15 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="username">
+                            获得好友列表
+                        </label>
+                        <input type="text" id="username" name="username">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 6 - 5
friends/urls.py

@@ -3,9 +3,10 @@ from django.views.generic.base import TemplateView
 from . import views
 
 urlpatterns = [
-    # path("Friend/add", views.addFriend),
-    path("friendsList/", views.friendsList),
-    path("friendsList/<int:pk>", views.friendDetail),
-    path("friend/delete", views.deleteFriend),
-    path("friend/accept", views.acceptFriend)
+    path("add/", views.add_friend),
+    path("get_requests/", views.get_friend_request),
+    path("friends_list/", views.friends_list),
+    # path("detail/<int:pk>", views.friendDetail),
+    path("delete/", views.delete_friend),
+    path("accept/", views.accept_friend)
 ]

+ 153 - 65
friends/views.py

@@ -1,88 +1,176 @@
 import json
-from django.http import JsonResponse, HttpResponse
+from django.http import HttpResponse
 from django.views.decorators.csrf import csrf_exempt
-from .form import UserRequestForm, UserListForm
-from .models import friends
+from .form import UserNameForm
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
+from django.contrib.auth.models import User
+from .models import Friends, FriendRequest
+
+DEBUG = True
 
 
 # 批处理流程
-def more_clean(request, form):
-    if request.method == 'POST':
-        user_login_form = form(request.POST)
-        if user_login_form.is_valid():
-            # 清洗出合法的数据
-            data = user_login_form.cleaned_data
-            return data
-    else:
-        response = {'result': 'illegal input'}
-        return HttpResponse(json.dumps(response))
+# def more_clean(request, form, html):
+#     if request.method == 'POST':
+#         user_login_form = form(request.POST)
+#         if user_login_form.is_valid():
+#             # 清洗出合法的数据
+#             data = user_login_form.cleaned_data
+#             return data
+#     elif request.method == 'GET':
+#         if DEBUG:
+#             form = form()
+#             context = {'form': form}
+#             return render(request, html, context)
+#
+#     else:
+#         return HttpResponse(status=400)
 
 
 # 获取好友列表
 @csrf_exempt
-def friendsList(request):
-    data = more_clean(request, UserListForm)
-    if data.get('token') != 'token':
-        response = {'result': 'there has a mistake, please provide illegal token'}
-        return HttpResponse(json.dumps(response))
+@login_required(login_url='/account/login/')
+def friends_list(request):
+    if request.method == 'POST':
+        # 查找双向好友关系
+        friends = Friends.objects.filter(user__username=request.user.username)
+        response = []
+        for friend in friends:
+            response.append(friend.friend.username)
+        friends = Friends.objects.filter(friend__username=request.user.username)
+        for friend in friends:
+            response.append(friend.user.username)
+        return HttpResponse(json.dumps(response), status=200)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'get_user_list.html')
     else:
-        try:
-            friendsTemp = friends.objects.filter(whomfriend=data['username'])
-            return HttpResponse(json.dumps(friendsTemp))
-        except friends.DoesNotExist:
-            response = {'result': 'this user do not exist'}
-            return HttpResponse(json.dumps(response))
+        return HttpResponse(status=400)
 
 
 #  添加好友(通过ws发送给被请求方信息,返回等待对方回应中)
-# @csrf_exempt
-# def addFriend(request):
-# 由于ws不是很确定,先闲置
+@csrf_exempt
+@login_required(login_url='/account/login/')
+def add_friend(request):
+    if request.method == 'POST':
+        user_name_form = UserNameForm(request.POST)
+        if user_name_form.is_valid():
+            data = user_name_form.cleaned_data
+            # 查找是否有此人
+            user = User.objects.filter(username=data['username'])
+            if user:
+                # 查找双向好友关系
+                friend_1 = Friends.objects.filter(user__username=data['username'])
+                friend_2 = Friends.objects.filter(friend__username=data['username'])
+                if friend_1 or friend_2:
+                    # 二者已是好友关系
+                    return HttpResponse(status=421)
+                else:
+                    friend_request = FriendRequest.objects.filter(requester__username=request.user.username)
+                    friend_request = friend_request.filter(receiver__username=data['username'])
+                    if friend_request:
+                        return HttpResponse(status=200)
+                    else:
+                        new_friend_request = FriendRequest()
+                        new_friend_request.requester = request.user
+                        new_friend_request.receiver = User.objects.filter(username=data['username']).get()
+                        new_friend_request.save()
+                        return HttpResponse(status=200)
+            else:
+                return HttpResponse(status=422)
+        else:
+            return HttpResponse(status=400)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'add_friend.html')
+    else:
+        return HttpResponse(status=400)
+
+
+@csrf_exempt
+@login_required(login_url='/account/login/')
+def get_friend_request(request):
+    # 查找目前有哪些请求
+    friend_requests = FriendRequest.objects.filter(receiver__username=request.user.username)
+    response = []
+    for friend_request in friend_requests:
+        response.append(friend_request.requester.username)
+    return HttpResponse(json.dumps(response), status=200)
 
 
+# 由于ws不是很确定,先闲置
 # 同意添加好友,
-def acceptFriend(request):
-    data = more_clean(request, UserRequestForm)
+@login_required(login_url='/account/login/')
+def accept_friend(request):
     if request.method == "POST":
-        try:
-            friends.objects.create(username=data["username"], whomfriend=data["otherUsername"], token=data["token"],
-                                   status=1)
-            response = {'result': "add successfully"}
-            return HttpResponse(json.dumps(response))
-        except:
-            response = {'result': "add failed"}
-            return HttpResponse(json.dumps(response))
+        user_name_form = UserNameForm(request.POST)
+        if user_name_form.is_valid():
+            data = user_name_form.cleaned_data
+            friend_requests = FriendRequest.objects.filter(receiver__username=request.user.username)
+            friend_requests = friend_requests.filter(requester__username=data['username'])
+            if friend_requests:
+                Friends.objects.create(user=User.objects.filter(username=data['username']).get(),
+                                       friend=User.objects.filter(username=request.user.username).get(),
+                                       status=1)
+                for friend_request in friend_requests:
+                    friend_request.delete()
+                    return HttpResponse(status=200)
+            else:
+                return HttpResponse(status=400)
+        else:
+            return HttpResponse(status=400)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'accept_friend.html')
+    else:
+        return HttpResponse(status=400)
 
 
 # 获取详细好友信息
-@csrf_exempt
-def friendDetail(request, pk):
-    data = more_clean(request, UserRequestForm)
-    try:
-        loginUserid = int(data["username"])
-        friendsTemp = friends.objects.get(whomfriend=loginUserid, userid=pk)
-
-    except friends.DoesNotExist:
-        response = {'result': "do not exist"}
-        return HttpResponse(json.dumps(response))
-
-    if len(friendsTemp):
-        response = {"data": friendsTemp, "result": "好友列表"}
-        return HttpResponse(json.dumps(response))
-    else:
-        response = {"result": "wrong"}
-        return HttpResponse(json.dumps(response))
+# @csrf_exempt
+# def friendDetail(request, pk):
+#     data = more_clean(request, UserRequestForm)
+#     try:
+#         loginUserid = int(data["username"])
+#         friendsTemp = friends.objects.get(whomfriend=loginUserid, userid=pk)
+#
+#     except friends.DoesNotExist:
+#         response = {'result': "do not exist"}
+#         return HttpResponse(json.dumps(response))
+#
+#     if len(friendsTemp):
+#         response = {"data": friendsTemp, "result": "好友列表"}
+#         return HttpResponse(json.dumps(response))
+#     else:
+#         response = {"result": "wrong"}
+#         return HttpResponse(json.dumps(response))
 
 
 @csrf_exempt
-def deleteFriend(request):
-    data = more_clean(request, UserRequestForm)
-    try:
-        tempFriend = friends.objects.get(
-            username=data["username"], whomfriend=data["otherUsername"])
-        tempFriend.clear()
-        response = {"result": "delete success"}
-        return HttpResponse(json.dumps(response))
-    except:
-        response = {"result": "delete failed"}
-        return JsonResponse(response)
+def delete_friend(request):
+    if request.method == 'POST':
+        user_name_form = UserNameForm(request.POST)
+        if user_name_form.is_valid():
+            data = user_name_form.cleaned_data
+            try:
+                temp_friends_1 = Friends.objects.filter(
+                    user=User.objects.filter(username=data["username"]).get(), friend=request.user)
+                temp_friends_2 = Friends.objects.filter(
+                    friend=User.objects.filter(username=data["username"]).get(), user=request.user)
+            except Friends.DoesNotExist:
+                return HttpResponse(status=422)
+            if not temp_friends_1 and not temp_friends_2:
+                return HttpResponse(status=400)
+            if temp_friends_1:
+                for temp_friend in temp_friends_1:
+                    temp_friend.delete()
+            if temp_friends_2:
+                for temp_friend in temp_friends_2:
+                    temp_friend.delete()
+            return HttpResponse(status=200)
+        else:
+            return HttpResponse(status=400)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'delete_friend.html')