Преглед изворни кода

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

Shellmiao пре 3 година
родитељ
комит
dab90857ac

+ 33 - 37
account/interface.md

@@ -1,5 +1,5 @@
-# 返回值接口约定
-## 登录
+# 登录
+### 返回值接口约定
 ******
 ******
 ***第一个字段:result,第二个字段:token***
 ***第一个字段:result,第二个字段:token***
 ******
 ******
@@ -15,14 +15,29 @@ result: 'illegal method, please use post',
 
 
 result: 'login successfully',   token:'xxxxxx'  
 result: 'login successfully',   token:'xxxxxx'  
 
 
- 
+### 请求接口约定(均使用POST)
+******
+接口链接:'account/login'
+
+username(选填)
+
+password(选填)
 
 
-## 登出
+token(必填,若客户端无token,则传输字符串'token'来表示无token)
+
+
+# 登出
+### 返回值接口约定
 ******
 ******
 ***第一个字段:result***
 ***第一个字段:result***
 ******
 ******
 result: 'logout successfully', 
 result: 'logout successfully', 
-## 注册
+### 请求接口约定(均使用POST)
+******
+接口链接:'account/logout'
+
+# 注册
+### 返回值接口约定
 ******
 ******
 ***第一个字段:result***
 ***第一个字段:result***
 ******
 ******
@@ -31,49 +46,32 @@ result: 'reg successfully',
 result: 'illegal input',  
 result: 'illegal input',  
 
 
 result: 'illegal method, please use post',  
 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)'
 接口链接:'account/profile/(username)'
 
 
@@ -82,5 +80,3 @@ bio(选填)
 avatar(选填)
 avatar(选填)
 
 
 phone(选填)
 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.conf import settings
 from django.db import migrations, models
 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')),
                 ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('phone', models.CharField(blank=True, max_length=20)),
                 ('phone', models.CharField(blank=True, max_length=20)),
                 ('bio', models.TextField(blank=True, max_length=500)),
                 ('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)),
                 ('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):
 class Devices(models.Model):
     # 对应django自带的User
     # 对应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)
     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)
     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('logout/', views.user_logout, name='logout'),
     path('register/', views.user_register, name='register'),
     path('register/', views.user_register, name='register'),
     path('profile/<str:r_username>/', views.profile_detail, name='profile'),
     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 .form import UserLoginForm, UserRegisterForm
 from django.contrib.auth import authenticate, login, logout
 from django.contrib.auth import authenticate, login, logout
 from django.http import HttpResponse
 from django.http import HttpResponse
@@ -14,6 +14,7 @@ import json
 在此处修改token过期时间,30代表30天过期
 在此处修改token过期时间,30代表30天过期
 """
 """
 expiration_date = 30
 expiration_date = 30
+DEBUG = True
 
 
 
 
 def user_login(request):
 def user_login(request):
@@ -38,15 +39,15 @@ def user_login(request):
                         # 登录
                         # 登录
                         user = device.user
                         user = device.user
                         login(request, user)
                         login(request, user)
-                        response = ['login successfully', device.token]
+                        response = {'result': 'login successfully', 'token': device.token}
                         return HttpResponse(json.dumps(response))
                         return HttpResponse(json.dumps(response))
                         # return redirect("chat:index")
                         # return redirect("chat:index")
                     else:
                     else:
-                        response = ['token time out']
+                        response = {'result': 'token time out'}
                         return HttpResponse(json.dumps(response))
                         return HttpResponse(json.dumps(response))
                 # 已过期的token并且已经被删除
                 # 已过期的token并且已经被删除
                 except Devices.DoesNotExist:
                 except Devices.DoesNotExist:
-                    response = ['detected new device, please login']
+                    response = {'result': 'detected new device, please login'}
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
             else:
             else:
                 # 检测账号密码是否匹配数据库中的一个用户
                 # 检测账号密码是否匹配数据库中的一个用户
@@ -68,22 +69,23 @@ def user_login(request):
                             # 新建一个该user的设备
                             # 新建一个该user的设备
                             device = create_new_device(user)
                             device = create_new_device(user)
                     login(request, user)
                     login(request, user)
-                    response = ['login successfully', device.token]
+                    response = {'result': 'login successfully', 'token': device.token}
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
                 else:
                 else:
-                    response = ['wrong account or password']
+                    response = {'result': 'wrong account or password'}
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
         else:
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
             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:
     else:
         # 请求方法错误,请使用POST
         # 请求方法错误,请使用POST
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))
         return HttpResponse(json.dumps(response))
 
 
 
 
@@ -112,7 +114,7 @@ def generate_random_str(random_length=16):
 
 
 def user_logout(request):
 def user_logout(request):
     logout(request)
     logout(request)
-    response = ['logout successfully']
+    response = {'result': 'logout successfully'}
     return HttpResponse(json.dumps(response))
     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.set_password(user_register_form.cleaned_data['password'])
             # 保存
             # 保存
             new_user.save()
             new_user.save()
-            response = ['reg successfully']
+            response = {'result': 'reg successfully'}
             return HttpResponse(json.dumps(response))
             return HttpResponse(json.dumps(response))
         else:
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
             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:
     else:
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))
         return HttpResponse(json.dumps(response))
 
 
 
 
 @login_required(login_url='/account/login/')
 @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)
     user = User.objects.get(username=r_username)
     profile = Profile.objects.get(user__exact=user)
     profile = Profile.objects.get(user__exact=user)
     if request.method == 'POST':
     if request.method == 'POST':
         # 判断此用户是否正在修改自身账号信息
         # 判断此用户是否正在修改自身账号信息
         if request.user != user:
         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))
             return HttpResponse(json.dumps(response))
         profile_form = ProfileForm(request.POST, request.FILES)
         profile_form = ProfileForm(request.POST, request.FILES)
         if profile_form.is_valid():
         if profile_form.is_valid():
@@ -159,16 +162,47 @@ def profile_detail(request, r_username):
             if 'avatar' in request.FILES:
             if 'avatar' in request.FILES:
                 profile.avatar = profile_cd["avatar"]
                 profile.avatar = profile_cd["avatar"]
             profile.save()
             profile.save()
-            response = ['edit successfully']
+            response = {'result': 'edit successfully'}
             return HttpResponse(json.dumps(response))
             return HttpResponse(json.dumps(response))
         else:
         else:
-            response = ['illegal input']
+            response = {'result': 'illegal input'}
             return HttpResponse(json.dumps(response))
             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:
     else:
-        response = ['illegal method, please use post']
+        response = {'result': 'illegal method, please use post'}
         return HttpResponse(json.dumps(response))
         return HttpResponse(json.dumps(response))

+ 0 - 0
chat/migrations/__init__.py



+ 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.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 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