Prechádzať zdrojové kódy

将json数据格式改为字典;修复了新建设备时由于user唯一性而出错的bug;将测试用get与DEBUG绑定;公钥基础设施完成一半,正在开发中

Shellmiao 3 rokov pred
rodič
commit
dab90857ac

+ 33 - 37
account/interface.md

@@ -1,5 +1,5 @@
-# 返回值接口约定
-## 登录
+# 登录
+### 返回值接口约定
 ******
 ***第一个字段:result,第二个字段:token***
 ******
@@ -15,14 +15,29 @@ result: 'illegal method, please use post',
 
 result: 'login successfully',   token:'xxxxxx'  
 
- 
+### 请求接口约定(均使用POST)
+******
+接口链接:'account/login'
+
+username(选填)
+
+password(选填)
 
-## 登出
+token(必填,若客户端无token,则传输字符串'token'来表示无token)
+
+
+# 登出
+### 返回值接口约定
 ******
 ***第一个字段:result***
 ******
 result: 'logout successfully', 
-## 注册
+### 请求接口约定(均使用POST)
+******
+接口链接:'account/logout'
+
+# 注册
+### 返回值接口约定
 ******
 ***第一个字段:result***
 ******
@@ -31,49 +46,32 @@ result: 'reg successfully',
 result: 'illegal input',  
 
 result: 'illegal method, please use post',  
-## 编辑用户资料
+### 请求接口约定(均使用POST)
 ******
-***第一个字段:result***
-******
-result: 'You do not have permission to do this', 
-
-result: 'edit successfully',
-
-result: 'illegal input',
-
-result: 'illegal method, please use post',
-
-# 请求接口约定(均使用POST)
-## 登录
-******
-接口链接:'account/login'
-
-username(选填)
+接口链接:'account/register'
 
-password(选填)
+username(必填)
 
-token(必填,若客户端无token,则传输字符串'token'表示无token)
+password(必填)
 
-******
+password2(必填)
 
-## 登出
+# 编辑用户资料
+### 返回值接口约定
 ******
-接口链接:'account/logout'
+***第一个字段:result***
 ******
+result: 'You do not have permission to do this', 
 
-## 注册
-******
-接口链接:'account/register'
+result: 'edit successfully',
 
-username(必填)
+result: 'illegal input',
 
-password(必填)
+result: 'illegal method, please use post',
 
-password2(必填)
 
-******
+### 请求接口约定(均使用POST)
 
-## 编辑资料
 ******
 接口链接:'account/profile/(username)'
 
@@ -82,5 +80,3 @@ bio(选填)
 avatar(选填)
 
 phone(选填)
-
-******

+ 12 - 1
account/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 3.2.5 on 2021-07-06 06:51
+# Generated by Django 3.2.5 on 2021-07-08 17:28
 
 from django.conf import settings
 from django.db import migrations, models
@@ -20,7 +20,18 @@ class Migration(migrations.Migration):
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('phone', models.CharField(blank=True, max_length=20)),
                 ('bio', models.TextField(blank=True, max_length=500)),
+                ('avatar', models.ImageField(blank=True, upload_to='avatar/%Y%m%d/')),
                 ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)),
             ],
         ),
+        migrations.CreateModel(
+            name='Devices',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('last_login_time', models.DateField(auto_now=True)),
+                ('device_uid', models.CharField(default='233', max_length=100, unique=True)),
+                ('token', models.CharField(default='233', max_length=100, unique=True)),
+                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devices', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
     ]

+ 0 - 26
account/migrations/0002_devices.py

@@ -1,26 +0,0 @@
-# Generated by Django 3.2.5 on 2021-07-08 07:38
-
-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),
-        ('account', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Devices',
-            fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('last_login_time', models.DateField(auto_now=True)),
-                ('device_uid', models.CharField(max_length=100)),
-                ('token', models.CharField(default='233', max_length=100)),
-                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='devices', to=settings.AUTH_USER_MODEL)),
-            ],
-        ),
-    ]

+ 0 - 18
account/migrations/0003_profile_avatar.py

@@ -1,18 +0,0 @@
-# Generated by Django 3.2.5 on 2021-07-08 14:07
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('account', '0002_devices'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='profile',
-            name='avatar',
-            field=models.ImageField(blank=True, upload_to='avatar/%Y%m%d/'),
-        ),
-    ]

+ 2 - 2
account/models.py

@@ -24,11 +24,11 @@ class Profile(models.Model):
 # 设备表
 class Devices(models.Model):
     # 对应django自带的User
-    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='devices')
+    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='devices')
     # 设备登录时间
     last_login_time = models.DateField(auto_now=True)
     # 设备码
-    device_uid = models.CharField(max_length=100, blank=False, unique=True)
+    device_uid = models.CharField(max_length=100, default='233', blank=False, unique=True)
     # 登录凭证
     token = models.CharField(max_length=100, default='233', blank=False, unique=True)
 

+ 1 - 0
account/urls.py

@@ -6,4 +6,5 @@ urlpatterns = [
     path('logout/', views.user_logout, name='logout'),
     path('register/', views.user_register, name='register'),
     path('profile/<str:r_username>/', views.profile_detail, name='profile'),
+    path('edit/<str:r_username>/', views.profile_edit, name='profile_edit'),
 ]

+ 63 - 29
account/views.py

@@ -1,4 +1,4 @@
-from django.shortcuts import render, redirect
+from django.shortcuts import render
 from .form import UserLoginForm, UserRegisterForm
 from django.contrib.auth import authenticate, login, logout
 from django.http import HttpResponse
@@ -14,6 +14,7 @@ import json
 在此处修改token过期时间,30代表30天过期
 """
 expiration_date = 30
+DEBUG = True
 
 
 def user_login(request):
@@ -38,15 +39,15 @@ def user_login(request):
                         # 登录
                         user = device.user
                         login(request, user)
-                        response = ['login successfully', device.token]
+                        response = {'result': 'login successfully', 'token': device.token}
                         return HttpResponse(json.dumps(response))
                         # return redirect("chat:index")
                     else:
-                        response = ['token time out']
+                        response = {'result': 'token time out'}
                         return HttpResponse(json.dumps(response))
                 # 已过期的token并且已经被删除
                 except Devices.DoesNotExist:
-                    response = ['detected new device, please login']
+                    response = {'result': 'detected new device, please login'}
                     return HttpResponse(json.dumps(response))
             else:
                 # 检测账号密码是否匹配数据库中的一个用户
@@ -68,22 +69,23 @@ def user_login(request):
                             # 新建一个该user的设备
                             device = create_new_device(user)
                     login(request, user)
-                    response = ['login successfully', device.token]
+                    response = {'result': 'login successfully', 'token': device.token}
                     return HttpResponse(json.dumps(response))
                 else:
-                    response = ['wrong account or password']
+                    response = {'result': 'wrong account or password'}
                     return HttpResponse(json.dumps(response))
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
     # 用于测试,登录界面
-    # elif request.method == 'GET':
-    #     user_login_form = UserLoginForm()
-    #     context = {'form': user_login_form}
-    #     return render(request, 'login.html', context)
+    elif request.method == 'GET':
+        if DEBUG:
+            user_login_form = UserLoginForm()
+            context = {'form': user_login_form}
+            return render(request, 'login.html', context)
     else:
         # 请求方法错误,请使用POST
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))
 
 
@@ -112,7 +114,7 @@ def generate_random_str(random_length=16):
 
 def user_logout(request):
     logout(request)
-    response = ['logout successfully']
+    response = {'result': 'logout successfully'}
     return HttpResponse(json.dumps(response))
 
 
@@ -126,29 +128,30 @@ def user_register(request):
             new_user.set_password(user_register_form.cleaned_data['password'])
             # 保存
             new_user.save()
-            response = ['reg successfully']
+            response = {'result': 'reg successfully'}
             return HttpResponse(json.dumps(response))
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
     # 用于测试
-    # elif request.method == 'GET':
-    #     user_register_form = UserRegisterForm()
-    #     context = {'form': user_register_form}
-    #     return render(request, 'register.html', context)
+    elif request.method == 'GET':
+        if DEBUG:
+            user_register_form = UserRegisterForm()
+            context = {'form': user_register_form}
+            return render(request, 'register.html', context)
     else:
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))
 
 
 @login_required(login_url='/account/login/')
-def profile_detail(request, r_username):
+def profile_edit(request, r_username):
     user = User.objects.get(username=r_username)
     profile = Profile.objects.get(user__exact=user)
     if request.method == 'POST':
         # 判断此用户是否正在修改自身账号信息
         if request.user != user:
-            response = ['You do not have permission to do this']
+            response = {'result': 'You do not have permission to do this'}
             return HttpResponse(json.dumps(response))
         profile_form = ProfileForm(request.POST, request.FILES)
         if profile_form.is_valid():
@@ -159,16 +162,47 @@ def profile_detail(request, r_username):
             if 'avatar' in request.FILES:
                 profile.avatar = profile_cd["avatar"]
             profile.save()
-            response = ['edit successfully']
+            response = {'result': 'edit successfully'}
             return HttpResponse(json.dumps(response))
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
     # 用于测试
-    # elif request.method == 'GET':
-    #     profile_form = ProfileForm()
-    #     context = {'profile_form': profile_form, 'profile': profile, 'user': user}
-    #     return render(request, 'edit.html', context)
+    elif request.method == 'GET':
+        if DEBUG:
+            profile_form = ProfileForm()
+            context = {'profile_form': profile_form, 'profile': profile, 'user': user}
+            return render(request, 'edit.html', context)
+    else:
+        response = {'result': 'illegal method, please use post'}
+        return HttpResponse(json.dumps(response))
+
+
+@login_required(login_url='/account/login/')
+def profile_detail(request, r_username):
+    user = User.objects.get(username=r_username)
+    profile = Profile.objects.get(user__exact=user)
+    if request.method == 'POST':
+        response = {}
+        if profile.phone:
+            response['phone'] = profile.phone
+        else:
+            response['phone'] = ''
+        if profile.bio:
+            response['bio'] = profile.bio
+        else:
+            response['bio'] = ''
+        if profile.avatar:
+            response['avatar'] = profile.avatar.url
+        else:
+            response['avatar'] = ''
+        return HttpResponse(json.dumps(response))
+    # 用于测试
+    elif request.method == 'GET':
+        if DEBUG:
+            profile_form = ProfileForm()
+            context = {'profile_form': profile_form, 'profile': profile, 'user': user}
+            return render(request, 'edit.html', context)
     else:
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))

+ 0 - 0
chat/migrations/__init__.py


BIN
db.sqlite3


+ 10 - 0
infrastructure/form.py

@@ -0,0 +1,10 @@
+from django import forms
+from .models import PublicKey
+
+
+class AddPublicKeyForm(forms.ModelForm):
+    public_key = forms.CharField()
+
+
+class GetPublicKeyForm(forms.ModelForm):
+    username = forms.CharField()

+ 0 - 0
infrastructure/migrations/__init__.py


+ 8 - 0
infrastructure/models.py

@@ -1,2 +1,10 @@
 from django.db import models
+from django.contrib.auth.models import User
 
+
+# 公钥表
+class PublicKey(models.Model):
+    # 对应django自带的user
+    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
+    # 公钥
+    public_key = models.CharField(max_length=1025, blank=False, unique=True)

+ 56 - 1
infrastructure/views.py

@@ -1,3 +1,58 @@
 from django.shortcuts import render
+from .models import PublicKey
+from .form import AddPublicKeyForm
+from django.http import HttpResponse
+from django.contrib.auth.decorators import login_required
+import json
 
-# Create your views here.
+
+@login_required(login_url='/account/login/')
+def add_public_key(request):
+    if request.method == 'POST':
+        add_public_key_form = AddPublicKeyForm(data=request.POST)
+        if add_public_key_form.is_valid():
+            data = add_public_key_form.cleaned_data
+            new_public_key = PublicKey()
+            new_public_key.public_key = data['public_key']
+            new_public_key.user = request.user
+            # 保存
+            new_public_key.save()
+            response = ['public ket added']
+            return HttpResponse(json.dumps(response))
+        else:
+            response = ['illegal input']
+            return HttpResponse(json.dumps(response))
+    # 用于测试
+    # elif request.method == 'GET':
+    #     user_register_form = UserRegisterForm()
+    #     context = {'form': user_register_form}
+    #     return render(request, 'register.html', context)
+    else:
+        response = ['illegal method, please use post']
+        return HttpResponse(json.dumps(response))
+
+
+@login_required(login_url='/account/login/')
+def get_public_key(request):
+    if request.method == 'POST':
+        add_public_key_form = AddPublicKeyForm(data=request.POST)
+        if add_public_key_form.is_valid():
+            data = add_public_key_form.cleaned_data
+            new_public_key = PublicKey()
+            new_public_key.public_key = data['public_key']
+            new_public_key.user = request.user
+            # 保存
+            new_public_key.save()
+            response = ['public ket added']
+            return HttpResponse(json.dumps(response))
+        else:
+            response = ['illegal input']
+            return HttpResponse(json.dumps(response))
+    # 用于测试
+    # elif request.method == 'GET':
+    #     user_register_form = UserRegisterForm()
+    #     context = {'form': user_register_form}
+    #     return render(request, 'register.html', context)
+    else:
+        response = ['illegal method, please use post']
+        return HttpResponse(json.dumps(response))

BIN
media/avatar/20210709/php路线.png