Jelajahi Sumber

新增了编辑信息的功能,修复了json无法传输set的bug,完善了接口文档

Shellmiao 3 tahun lalu
induk
melakukan
84d462fbbf
8 mengubah file dengan 183 tambahan dan 17 penghapusan
  1. 1 1
      account/form.py
  2. 72 4
      account/interface.md
  3. 18 0
      account/migrations/0003_profile_avatar.py
  4. 2 0
      account/models.py
  5. 42 0
      account/templates/edit.html
  6. 2 1
      account/urls.py
  7. 46 11
      account/views.py
  8. TEMPAT SAMPAH
      db.sqlite3

+ 1 - 1
account/form.py

@@ -28,4 +28,4 @@ class UserRegisterForm(forms.ModelForm):
 class ProfileForm(forms.ModelForm):
 class ProfileForm(forms.ModelForm):
     class Meta:
     class Meta:
         model = Profile
         model = Profile
-        fields = ('phone', 'bio')
+        fields = ('phone', 'avatar', 'bio')

+ 72 - 4
account/interface.md

@@ -1,5 +1,8 @@
-# 登录
-## 返回值接口约定
+# 返回值接口约定
+## 登录
+******
+***第一个字段:result,第二个字段:token***
+******
 result: 'token time out'  
 result: 'token time out'  
   
   
 result: 'detected new device, please login',  
 result: 'detected new device, please login',  
@@ -12,7 +15,72 @@ result: 'illegal method, please use post',
 
 
 result: 'login successfully',   token:'xxxxxx'  
 result: 'login successfully',   token:'xxxxxx'  
 
 
-result: 'reg successfully',  
+ 
 
 
-result: 'logout successfully',  
+## 登出
+******
+***第一个字段:result***
+******
+result: 'logout successfully', 
+## 注册
+******
+***第一个字段:result***
+******
+result: 'reg successfully', 
 
 
+result: 'illegal input',  
+
+result: 'illegal method, please use 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(选填)
+
+password(选填)
+
+token(必填,若客户端无token,则传输字符串'token'表示无token)
+
+******
+
+## 登出
+******
+接口链接:'account/logout'
+******
+
+## 注册
+******
+接口链接:'account/register'
+
+username(必填)
+
+password(必填)
+
+password2(必填)
+
+******
+
+## 编辑资料
+******
+接口链接:'account/profile/(username)'
+
+bio(选填)
+
+avatar(选填)
+
+phone(选填)
+
+******

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

@@ -0,0 +1,18 @@
+# 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 - 0
account/models.py

@@ -14,6 +14,8 @@ class Profile(models.Model):
     phone = models.CharField(max_length=20, blank=True)
     phone = models.CharField(max_length=20, blank=True)
     # 个人简介
     # 个人简介
     bio = models.TextField(max_length=500, blank=True)
     bio = models.TextField(max_length=500, blank=True)
+    # 头像
+    avatar = models.ImageField(upload_to='avatar/%Y%m%d/', blank=True)
 
 
     def __str__(self):
     def __str__(self):
         return 'user {}'.format(self.user.username)
         return 'user {}'.format(self.user.username)

+ 42 - 0
account/templates/edit.html

@@ -0,0 +1,42 @@
+<div>
+                <br>
+                <div>
+                    用户名:{{ user.username }}
+                </div>
+                {% if profile.avatar %}
+                    <div>
+                        头像
+                    </div>
+                    <img src="{{ profile.avatar.url }}" styl="max-width: 20%; border-radius: 15%;">
+                {% else %}
+                    <h5>
+                        暂无头像
+                    </h5>
+                {% endif %}
+                <br>
+                <br>
+                <form method="post" action="." enctype="multipart/form-data">
+                    {% csrf_token %}
+                    <div>
+                        <label for="avatar">上传头像</label>
+                        <input type="file" name="avatar" id="avatar">
+                    </div>
+                    <div>
+                        <label for="phone">
+                            电话
+                        </label>
+                        <input type="text" id="phone" name="phone" value="{{ profile.phone }}">
+                    </div>
+                    <div>
+                        <label for="bio">
+                            简介
+                        </label>
+                        <textarea type="text" id="bio" name="bio" rows="12">
+                        {{ profile.bio }}
+                    </textarea>
+                    </div>
+                    <button type="submit">
+                        提交
+                    </button>
+                </form>
+    </div>

+ 2 - 1
account/urls.py

@@ -2,6 +2,7 @@ from django.urls import path
 from . import views
 from . import views
 
 
 urlpatterns = [
 urlpatterns = [
-    path('', views.user_login, name='login'),
+    path('login/', views.user_login, name='login'),
     path('register/', views.user_register, name='register'),
     path('register/', views.user_register, name='register'),
+    path('profile/<str:r_username>/', views.profile_detail, name='profile'),
 ]
 ]

+ 46 - 11
account/views.py

@@ -3,6 +3,9 @@ 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
 from .models import Profile, Devices
 from .models import Profile, Devices
+from django.contrib.auth.models import User
+from django.contrib.auth.decorators import login_required
+from .form import ProfileForm
 import random
 import random
 import datetime
 import datetime
 import json
 import json
@@ -35,15 +38,15 @@ def user_login(request):
                         # 登录
                         # 登录
                         user = device.user
                         user = device.user
                         login(request, user)
                         login(request, user)
-                        response = {'result': 'login successfully', 'token': device.token}
+                        response = ['login successfully', device.token]
                         return HttpResponse(json.dumps(response))
                         return HttpResponse(json.dumps(response))
                         # return redirect("chat:index")
                         # return redirect("chat:index")
                     else:
                     else:
-                        response = {'result': 'token time out'}
+                        response = ['token time out']
                         return HttpResponse(json.dumps(response))
                         return HttpResponse(json.dumps(response))
                 # 已过期的token并且已经被删除
                 # 已过期的token并且已经被删除
                 except Devices.DoesNotExist:
                 except Devices.DoesNotExist:
-                    response = {'result': 'detected new device, please login'}
+                    response = ['detected new device, please login']
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
             else:
             else:
                 # 检测账号密码是否匹配数据库中的一个用户
                 # 检测账号密码是否匹配数据库中的一个用户
@@ -65,13 +68,13 @@ def user_login(request):
                             # 新建一个该user的设备
                             # 新建一个该user的设备
                             device = create_new_device(user)
                             device = create_new_device(user)
                     login(request, user)
                     login(request, user)
-                    response = {'result': 'login successfully', 'token': device.token}
+                    response = ['login successfully', device.token]
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
                 else:
                 else:
-                    response = {'result': 'wrong account or password'}
+                    response = ['wrong account or password']
                     return HttpResponse(json.dumps(response))
                     return HttpResponse(json.dumps(response))
         else:
         else:
-            response = {'result', 'illegal input'}
+            response = ['illegal input']
             return HttpResponse(json.dumps(response))
             return HttpResponse(json.dumps(response))
     # 用于测试,登录界面
     # 用于测试,登录界面
     # elif request.method == 'GET':
     # elif request.method == 'GET':
@@ -80,7 +83,7 @@ def user_login(request):
     #     return render(request, 'login.html', context)
     #     return render(request, 'login.html', context)
     else:
     else:
         # 请求方法错误,请使用POST
         # 请求方法错误,请使用POST
-        response = {'result', 'illegal method, please use post'}
+        response = ['illegal method, please use post']
         return HttpResponse(json.dumps(response))
         return HttpResponse(json.dumps(response))
 
 
 
 
@@ -109,7 +112,7 @@ def generate_random_str(random_length=16):
 
 
 def user_logout(request):
 def user_logout(request):
     logout(request)
     logout(request)
-    response = {'result', 'logout successfully'}
+    response = ['logout successfully']
     return HttpResponse(json.dumps(response))
     return HttpResponse(json.dumps(response))
 
 
 
 
@@ -123,10 +126,10 @@ 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 = {'result': 'reg successfully'}
+            response = ['reg successfully']
             return HttpResponse(json.dumps(response))
             return HttpResponse(json.dumps(response))
         else:
         else:
-            response = {'result', 'illegal input'}
+            response = ['illegal input']
             return HttpResponse(json.dumps(response))
             return HttpResponse(json.dumps(response))
     # 用于测试
     # 用于测试
     # elif request.method == 'GET':
     # elif request.method == 'GET':
@@ -134,5 +137,37 @@ def user_register(request):
     #     context = {'form': user_register_form}
     #     context = {'form': user_register_form}
     #     return render(request, 'register.html', context)
     #     return render(request, 'register.html', context)
     else:
     else:
-        response = {'result', 'illegal method, please use post'}
+        response = ['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':
+        # 判断此用户是否正在修改自身账号信息
+        if request.user != user:
+            response = ['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():
+            # 填入信息
+            profile_cd = profile_form.cleaned_data
+            profile.phone = profile_cd['phone']
+            profile.bio = profile_cd['bio']
+            profile.avatar = profile_cd["avatar"]
+            profile.save()
+            response = ['edit successfully']
+            return HttpResponse(json.dumps(response))
+        else:
+            response = ['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)
+    else:
+        response = ['illegal method, please use post']
         return HttpResponse(json.dumps(response))
         return HttpResponse(json.dumps(response))

TEMPAT SAMPAH
db.sqlite3