IOS开发笔记(七)——Django后台接口设计

版权声明: https://blog.csdn.net/dickdick111/article/details/89603042

中山大学数据科学与计算机学院本科生实验报告

(2019年春季学期)

课程名称 IOS开发 任课老师 郑贵锋
年级 16 专业(方向) 软件工程(计算机应用方向)
学号 16340132 姓名 梁颖霖
电话 13680473185 Email [email protected]
开始日期 2019/4/27 完成日期 2019/5/2

一、实验题目

IM业务系统后台实现

二、实现内容

基于Django框架实现下列接口api

  • 用户登陆,注册,查询
  • 好友添加,删除,查询

三、实验结果

A. IM 用户管理

1.概述

这里利用session来实现持久化登陆,即用户登陆后服务器会为其创建一个session,直至用户退出或者超时才会摧毁这个session。

只有在登陆状态后,用户才有权限执行别的操作

后端返回信息:JSON,status表示操作成功还是失败的状态,msg是执行操作后的返回信息,具体包括出错的具体细节,如密码错误等,data是在返回用户信息等操作时需要携带返回时使用。

{
status: {ok/fail},
msg: {},
data: {}
}

2.数据库设计——User表

class User(models.Model):
    UserID = models.AutoField(primary_key = True)
    Username = models.CharField(max_length = 20)
    Password = models.CharField(max_length = 20)
    Phone = models.CharField(max_length = 15)
    Email = models.CharField(max_length = 30)
    Nickname = models.CharField(max_length = 20)
    Avator = models.IntegerField(default = -1)
    Description = models.CharField(max_length = 40)

    def __str__(self):
        return self.Username

User表包括用户ID(主键),用户名,密码,电话等信息

3. URL设计

用户注册:
/account/register/
POST
{
username: {},
password: {}
}

检查是否已经登录:
/account/login/
GET

用户登录:
/account/login/
POST
{
username: {},
password: {}
}

退出登录:
/account/logout/
GET

获取用户信息:
/account/info/
GET

设置用户信息:
/account/info/
POST
{
phone: {},
email: {},
nickname: {},
avator: {image_id},
description: {}
}

更改用户密码:
/account/password/
POST
{
old_password: {},
new_password: {}
}

在Django的urls.py文件中表现为

from django.urls import path

from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
    path('login/', views.login, name='login'),
    path('logout/', views.logout, name='logout'),
    path('info/', views.info, name='info'),
    path('password/', views.changePassword, name='cPassword'),
]

访问的情况:

1

4. 具体实现

由于关于用户管理的接口有多达六七个,不再这里详述,这是选取其中两个有代表性的接口实现来讲述它的逻辑,其余实现也跟其类似。

注册
def register(request):
    # 定义返回体的内容,包括一个state和msg
    response = {'state':'fail', 'msg':'no msg'}
	
    # 判断是否已经登陆状态
    if 'login_id' in request.session:
        response['msg'] = 'already login'
        return HttpResponse(json.dumps(response), content_type = 'application/json')
    
	# 判断方法是否为POST
    if request.method != 'POST':
        response['msg'] = 'wrong method'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 获取post方法传递的两个参数
    try:
        t_username = request.POST['username']
        t_password = request.POST['password']
    except Exception as e:
        response['msg'] = 'POST parameter error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 数据库操作
    try:
        t_user = User.objects.filter(Username = t_username)
    except Exception as e:
        response['msg'] = 'db error'
    else:
        # 判断用户名是否唯一
        if t_user.count() == 0:
            User.objects.create(
                Username = t_username,
                Password = t_password
            )
            response['state'] = 'ok'
            response['msg'] = 'register successfully'
        else:
            response['msg'] = 'repeat username'

    return HttpResponse(json.dumps(response), content_type = 'application/json')

具体逻辑

  • 定义返回体的内容,包括一个state和msg
  • 判断是否已经登陆状态
    • 是,直接返回HttpResponse,告诉前端已经登陆,无须注册
    • 否,下一步
  • 判断方法是否为POST,不允许GET方法
  • 获取post方法传递的两个参数
    • 这时能得到用户注册的用户名以及密码
  • 数据库操作
    • 判断是否唯一后,插入到用户表
登陆
def login(request):
    # 定义返回体的内容,包括一个state和msg
    response = {'state':'fail', 'msg':'no msg'}
	
    # 判断方法是否为POST
    if request.method != 'POST':
        if 'login_id' in request.session:
            response['state'] = 'ok'
            response['msg'] = 'already login'
        else:
            response['msg'] = 'no login'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 获取参数
    try:
        t_username = request.POST['username']
        t_password = request.POST['password']
    except Exception as e:
        response['msg'] = 'POST parameter error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 数据库操作
    try:
        t_user = User.objects.filter(Username = t_username, Password = t_password)
    except Exception as e:
        response['msg'] = 'db error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')
    else:
        if t_user.count() <= 0:
            response['msg'] = 'username or password error'
        else:
            response['state'] = 'ok'
            response['msg'] = 'login successfully'
            request.session['login_id'] = t_username

    return HttpResponse(json.dumps(response), content_type = 'application/json')

具体逻辑

  • 定义返回体的内容,包括一个state和msg
  • 判断方法是否为POST,不允许GET方法
  • 获取post方法传递的两个参数
    • 这时能得到用户注册的用户名以及密码
  • 数据库操作
    • 判断用户名是否存在
    • 判断用户名与密码是否一致

B. IM 好友管理

这里实现的是对于聊天工具的好友管理,包括通过用户名查询添加一个新的好友,删除一个已有的好友,返回好友列表信息

1. Contact表

from django.db import models

# Create your models here.

class Contact(models.Model):
    UserName = models.AutoField(primary_key = True)
    Friends = models.CharField(max_length = 200)

    def __str__(self):
        return self.Friends

Contact表由用户名与一个Friends字符串组成,里面保存的是好友的id信息,通过这个信息来查询用户表来返回用户信息。

2.URL设计

from django.urls import path

from . import views

urlpatterns = [
    path('info/', views.info, name='info'),
    path('add/', views.add, name='add'),
    path('delete/', views.delete, name='delete'),
]

3.具体实现

获取好友的信息
def info(request):
    # 定义返回体的内容,包括一个state和msg和data
    response = {'state':'fail', 'msg':'no msg', 'data':[]}

    # 要在登录状态下
    if 'login_id' not in request.session:
        response['msg'] = 'no login'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 已经登录, 所以拿取用户信息
    t_username = request.session['login_id']

    # 只允许GET方法获得好友列表
    if request.method != 'GET':
        response['msg'] = 'wrong method'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 这里进入GET方法
    # 数据库操作
    try:
        t_contact = Contact.objects.filter(Username = t_username)

    except Exception as e:
        response['msg'] = 'db error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')
    else:
        if t_contact.count() == 1:
            t_contact = t_contact[0]
            t_friends = t_contact.Friends
            # 处理字符串,获取好友
            friends = t_friends.spilt()
            for friend_ID in friends_str:
                try:
                    t_user = User.objects.filter(UserID = friend_ID)
                except Exception as e:
                    response['msg'] = 'db error'
                    return HttpResponse(json.dumps(response), content_type = 'application/json')
                response['data'].append(t_user)
            response['state'] = 'ok'
            response['msg'] = 'get successfully'
        else:
            response['msg'] = 'no such user'

    return HttpResponse(json.dumps(response), content_type = 'application/json')
  • 定义返回体的内容,包括一个state和msg和data
  • 判断是否是登陆的状态
  • 判断是否为GET方法
  • 数据库操作
    • 先根据登陆用户的名字获取contact对象
    • 获取好友字符串
    • 处理字符串,得到好友的id
    • 通过好友的id来去查询User表来获取好友信息
    • 返回response
添加好友
def add(request):
    # 定义返回体的内容,包括一个state和msg
    response = {'state':'fail', 'msg':'no msg'}

    # 要在登录状态下
    if 'login_id' not in request.session:
        response['msg'] = 'no login'
        return HttpResponse(json.dumps(response), content_type = 'application/json')
    
	# 只允许POST操作
    if request.method != 'POST':
        response['msg'] = 'wrong method'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 已经登录, 所以拿取用户信息
    t_username = request.session['login_id']

    # 获取参数
    try:
        r_username = request.POST['username']
    except Exception as e:
        response['msg'] = 'POST parameter error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')

    # 数据库操作
    try:
        t_user = User.objects.filter(Username = r_username)
        t_contact = Contact.objects.filter(Username = t_username)
    except Exception as e:
        response['msg'] = 'db error'
        return HttpResponse(json.dumps(response), content_type = 'application/json')
    else:
        if t_user.count() <= 0:
            response['msg'] = 'user does not exist'
        else:
            t_contact.Friends = str(t_contact.Friends) + ',' + t_user.UserID
            response['state'] = 'ok'
            response['msg'] = 'add friends successfully'

    return HttpResponse(json.dumps(response), content_type = 'application/json')
  • 定义返回体的内容,包括一个state和msg
  • 判断是否是登陆的状态
  • 判断是否为POST方法
  • 数据库操作
    • 先根据登陆用户的名字获取contact对象,通过传递参数的好友名获取user对象
    • 判断user是否存在
    • 将user的id添加到contact的friends字符串中
    • 返回response

四、实验思考及感想

​ 本周实验,小组正式进行第一次迭代,我所负责的后台api基本实现完成,剩余还有最关键的信息传递的接口,这个的实现我与另一个同学还在研究如何实现长连接,实现序号传输等功能。经过上周的Django学习,这周的开发过程也比较顺利,定义一个api可以用工业化流程来实现,第一步是对数据库的构建,第二步是定义url,第三步就是实现函数的逻辑,获取用户的传递参数处理数据库表格,返回response数据。为了测试写好的api,我利用之前IOS项目做过的网络访问类,来修改一下url地址,以及传入参数来进行测试。完成后台的任务后,可以转回到IOS客户端里面,帮助前端的同学实现几个简单的页面,或定义好网络访问的基类,数据的基类等。

猜你喜欢

转载自blog.csdn.net/dickdick111/article/details/89603042