Shellmiao 4 лет назад
Родитель
Сommit
f4bebf7f87

+ 1 - 1
MeChat/settings.py

@@ -45,7 +45,7 @@ MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
-    'django.middleware.csrf.CsrfViewMiddleware',
+    #    'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',

+ 7 - 0
chat/admin.py

@@ -1,3 +1,10 @@
 from django.contrib import admin
+from .models import Message
+
 
 # Register your models here.
+class MessageAdmin(admin.ModelAdmin):
+    list_display = ["is_received", "fromUser", "toUser", "plaintext"]
+
+
+admin.site.register(Message, MessageAdmin)

+ 6 - 0
chat/form.py

@@ -0,0 +1,6 @@
+from django import forms
+
+
+class StoreDataForm(forms.Form):
+    toUsername = forms.CharField()
+    plaintext = forms.CharField()

+ 67 - 0
chat/interface.md

@@ -0,0 +1,67 @@
+# 发送者消息到服务器
+******
+## 请求(POST)
+请求链接:char/send/
+
+参数:
+
+toUsername(需要发送到的人的名字)
+
+plaintext(消息内容)
+
+## 返回值
+422:此人不存在
+
+423:你们不是好友关系
+
+400:请求不合法
+
+200:成功发送
+
+# 获取与某好友消息漫游
+******
+## 请求(POST)
+请求链接:char/filter_message/
+
+参数:
+
+username(好友的名称)
+
+## 返回值
+
+422:此人不存在
+
+423:你们不是好友关系
+
+400:请求不合法
+
+200+列表:成功+消息记录
+
+(列表中每个元素是一个字典,分别有from_user_name,to_user_name,plaintext)
+
+# 接收者请求未曾被接收的消息
+******
+## 请求(POST)
+请求链接:chat/request_message/
+
+参数:无
+## 返回值
+200+列表:成功+未被接受的消息列表
+
+(列表中每个元素都是一个字典,分别有from_user_name,to_user_name,plaintext,message_id)
+
+# 成功接收消息
+******
+## 请求(POST)
+请求链接:chat/receive_successfully/
+
+参数:
+
+message_id:消息id
+
+## 返回值
+423:消息不存在
+
+400:请求不合法
+
+200:成功访问

+ 28 - 0
chat/migrations/0001_initial.py

@@ -0,0 +1,28 @@
+# Generated by Django 3.2.5 on 2021-07-09 13:07
+
+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='Message',
+            fields=[
+                ('message_id', models.AutoField(primary_key=True, serialize=False)),
+                ('is_received', models.BooleanField(default=False)),
+                ('date', models.DateTimeField(auto_now=True)),
+                ('plaintext', models.CharField(max_length=2048)),
+                ('fromUser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='from_user', to=settings.AUTH_USER_MODEL)),
+                ('toUser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='to_user', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]

+ 0 - 0
chat/migrations/__init__.py


+ 17 - 0
chat/models.py

@@ -1,3 +1,20 @@
 from django.db import models
+from django.contrib.auth.models import User
+
 
 # Create your models here.
+
+#  聊天记录表
+class Message(models.Model):
+    # 消息id
+    message_id = models.AutoField(primary_key=True)
+    # 是否已接收
+    is_received = models.BooleanField(default=False)
+    # 消息来源
+    fromUser = models.ForeignKey(User, on_delete=models.CASCADE, related_name='from_user')
+    # 消息去向
+    toUser = models.ForeignKey(User, on_delete=models.CASCADE, related_name='to_user')
+    # 消息日期
+    date = models.DateTimeField(auto_now_add=True)
+    # 消息内容
+    plaintext = models.CharField(max_length=2048)

+ 15 - 0
chat/templates/filter_message.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
chat/templates/receive_successfully.html

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

+ 21 - 0
chat/templates/send_message.html

@@ -0,0 +1,21 @@
+<div>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="toUsername">
+                            接收方username
+                        </label>
+                        <input type="text" id="toUsername" name="toUsername">
+                    </div>
+                    <div>
+                        <label for="plaintext">
+                            消息内容
+                        </label>
+                        <input type="text" id="plaintext" name="plaintext">
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 4 - 1
chat/urls.py

@@ -2,5 +2,8 @@ from django.urls import path
 from . import views
 
 urlpatterns = [
-    path('', views.testindex, name='index'),
+    path('send/', views.send_message, name='send'),
+    path('request_message/', views.request_for_message, name='request_message'),
+    path('filter_message/', views.filter_messages, name='filter_message'),
+    path('receive_successfully/', views.receive_successfully, name='receive_successfully'),
 ]

+ 158 - 2
chat/views.py

@@ -1,6 +1,162 @@
 from django.shortcuts import render
 from django.http import HttpResponse
+from django.views.decorators.csrf import csrf_exempt
+from django.contrib.auth.models import User
+from django.contrib.auth.decorators import login_required
+import json
+from friends.models import Friends
 
+from .form import StoreDataForm
+from .models import Message
+from django.http import JsonResponse
+from django.db.models import Q
 
-def testindex(request):
-    return HttpResponse("Hello")
+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))
+
+
+#
+# 存储消息到表中
+@csrf_exempt
+@login_required(login_url='/account/login/')
+def send_message(request):
+    if request.method == 'POST':
+        store_data_form = StoreDataForm(request.POST)
+        if store_data_form.is_valid():
+            data = store_data_form.cleaned_data
+            user = User.objects.filter(username=data['toUsername'])
+            if user:
+                temp_friends_1 = Friends.objects.filter(
+                    user=User.objects.filter(username=data["toUsername"]).get(), friend=request.user)
+                temp_friends_2 = Friends.objects.filter(
+                    friend=User.objects.filter(username=data["toUsername"]).get(), user=request.user)
+                if temp_friends_1 or temp_friends_2:
+                    Message.objects.create(
+                        fromUser=request.user,
+                        toUser=user.get(),
+                        plaintext=data['plaintext'],
+                    )
+                    return HttpResponse(status=200)
+                else:
+                    return HttpResponse(status=423)
+            else:
+                return HttpResponse(status=422)
+        else:
+            return HttpResponse(status=400)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'send_message.html')
+    else:
+        return HttpResponse(status=400)
+    # try:
+    #     Message.objects.create(
+    #         date=post_data["date"],
+    #         belongUserid=postData["belongUserid"],
+    #         fromUserid=postData["fromUserid"],
+    #         toUserid=postData["toUserid"],
+    #         EphemeralPub=postData["EphemeralPub"],
+    #         plaintext=postData["plaintext"],
+    #         EphemeralPri=postData["EphemeralPri"])
+    #     response = {"result": "添加成功"}
+    #     return JsonResponse(response)
+    # except:
+    #     response = {"result": "添加失败!"}
+    #     return JsonResponse(response)
+
+
+# 适用于设备的漫游消息
+@csrf_exempt
+@login_required(login_url='/account/login/')
+def filter_messages(request):
+    if request.method == 'POST':
+        data = request.POST
+        user = User.objects.filter(username=data['username'])
+        if user:
+            temp_friends_1 = Friends.objects.filter(
+                user=User.objects.filter(username=data["toUsername"]).get(), friend=request.user)
+            temp_friends_2 = Friends.objects.filter(
+                friend=User.objects.filter(username=data["toUsername"]).get(), user=request.user)
+            if temp_friends_1 or temp_friends_2:
+                # to_user = User.objects.filter(username=data['username'])
+                # messages = Message.objects.filter(
+                #     (Q(fromUser=to_user) & Q(toUser=request.user)) |
+                #     (Q(fromUser=request.user) & Q(toUser=to_user))
+                # ).order_by("date")
+                response = []
+                messages = Message.objects.filter(fromUser__username=data['username'],
+                                                  toUser__username=request.user.username)
+                for message in messages:
+                    message_dict = {'from_user_name': message.fromUser.username, 'plaintext': message.plaintext,
+                                    'to_user_name': request.user.username}
+                    response.append(message_dict)
+                messages = Message.objects.filter(toUser__username=data['username'],
+                                                  fromUser__username=request.user.username)
+                for message in messages:
+                    message_dict = {'from_user_name': message.fromUser.username, 'plaintext': message.plaintext,
+                                    'to_user_name': request.user.username}
+                    response.append(message_dict)
+                return HttpResponse(json.dumps(response), status=200)
+            else:
+                return HttpResponse(status=423)
+        else:
+            return HttpResponse(status=422)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'filter_message.html')
+    else:
+        return HttpResponse(status=400)
+    # try:
+    #     loginUserid = data["fromUsername"]
+    #     messagesTemp = list(Message.objects.filter(
+    #
+    #         (Q(fromUserid=pk) & Q(toUserid=loginUserid) & Q(belongUserid=loginUserid)) |
+    #         (Q(fromUserid=loginUserid) & Q(toUserid=pk) & Q(belongUserid=loginUserid))
+    #     ).order_by("date"))
+    #     response = {"result": "已发送", "data": messagesTemp}
+    #     return JsonResponse(response)
+    # except Message.DoesNotExist:
+    #     response = {"result": "该用户不存在或者没有消息记录"}
+    #     return JsonResponse(response)
+
+
+# 发送信息
+@login_required(login_url='/account/login/')
+def request_for_message(request):
+    messages = Message.objects.filter(toUser__username=request.user.username, is_received=False)
+    response = []
+    for message in messages:
+        message_dict = {'from_user_name': message.fromUser.username, 'plaintext': message.plaintext,
+                        'to_user_name': request.user.username, 'message_id': message.message_id}
+        response.append(message_dict)
+    return HttpResponse(json.dumps(response), status=200)
+
+
+# 成功接收消息
+@login_required(login_url='/account/login/')
+def receive_successfully(request):
+    if request.method == 'POST':
+        data = request.POST
+        try:
+            message = Message.objects.filter(message_id=data['message_id']).get()
+            message.is_received = True
+            message.save()
+            return HttpResponse(status=200)
+        except Message.DoesNotExist:
+            return HttpResponse(status=423)
+    elif request.method == 'GET':
+        if DEBUG:
+            return render(request, 'receive_successfully.html')
+    else:
+        return HttpResponse(status=400)


+ 1 - 4
friends/form.py

@@ -6,7 +6,4 @@ class UserNameForm(forms.Form):
 
     def clean_username(self):
         data = self.data
-        if data.get('username').isalnum():
-            return data.get('username')
-        else:
-            raise forms.ValidationError('it contains illegal char!')
+        return data.get('username')