Browse Source

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

Shellmiao 3 years ago
parent
commit
84d462fbbf
8 changed files with 183 additions and 17 deletions
  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. BIN
      db.sqlite3

+ 1 - 1
account/form.py

@@ -28,4 +28,4 @@ class UserRegisterForm(forms.ModelForm):
 class ProfileForm(forms.ModelForm):
     class Meta:
         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: 'detected new device, please login',  
@@ -12,7 +15,72 @@ result: 'illegal method, please use post',
 
 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)
     # 个人简介
     bio = models.TextField(max_length=500, blank=True)
+    # 头像
+    avatar = models.ImageField(upload_to='avatar/%Y%m%d/', blank=True)
 
     def __str__(self):
         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
 
 urlpatterns = [
-    path('', views.user_login, name='login'),
+    path('login/', views.user_login, name='login'),
     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.http import HttpResponse
 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 datetime
 import json
@@ -35,15 +38,15 @@ def user_login(request):
                         # 登录
                         user = device.user
                         login(request, user)
-                        response = {'result': 'login successfully', 'token': device.token}
+                        response = ['login successfully', device.token]
                         return HttpResponse(json.dumps(response))
                         # return redirect("chat:index")
                     else:
-                        response = {'result': 'token time out'}
+                        response = ['token time out']
                         return HttpResponse(json.dumps(response))
                 # 已过期的token并且已经被删除
                 except Devices.DoesNotExist:
-                    response = {'result': 'detected new device, please login'}
+                    response = ['detected new device, please login']
                     return HttpResponse(json.dumps(response))
             else:
                 # 检测账号密码是否匹配数据库中的一个用户
@@ -65,13 +68,13 @@ def user_login(request):
                             # 新建一个该user的设备
                             device = create_new_device(user)
                     login(request, user)
-                    response = {'result': 'login successfully', 'token': device.token}
+                    response = ['login successfully', device.token]
                     return HttpResponse(json.dumps(response))
                 else:
-                    response = {'result': 'wrong account or password'}
+                    response = ['wrong account or password']
                     return HttpResponse(json.dumps(response))
         else:
-            response = {'result', 'illegal input'}
+            response = ['illegal input']
             return HttpResponse(json.dumps(response))
     # 用于测试,登录界面
     # elif request.method == 'GET':
@@ -80,7 +83,7 @@ def user_login(request):
     #     return render(request, 'login.html', context)
     else:
         # 请求方法错误,请使用POST
-        response = {'result', 'illegal method, please use post'}
+        response = ['illegal method, please use post']
         return HttpResponse(json.dumps(response))
 
 
@@ -109,7 +112,7 @@ def generate_random_str(random_length=16):
 
 def user_logout(request):
     logout(request)
-    response = {'result', 'logout successfully'}
+    response = ['logout successfully']
     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.save()
-            response = {'result': 'reg successfully'}
+            response = ['reg successfully']
             return HttpResponse(json.dumps(response))
         else:
-            response = {'result', 'illegal input'}
+            response = ['illegal input']
             return HttpResponse(json.dumps(response))
     # 用于测试
     # elif request.method == 'GET':
@@ -134,5 +137,37 @@ def user_register(request):
     #     context = {'form': user_register_form}
     #     return render(request, 'register.html', context)
     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))

BIN
db.sqlite3