课程名称 | IOS开发 | 任课老师 | 郑贵锋 |
---|---|---|---|
年级 | 16 | 专业(方向) | 软件工程(计算机应用方向) |
学号 | 16340132 | 姓名 | 梁颖霖 |
电话 | 13680473185 | [email protected] | |
开始日期 | 2019/4/27 | 完成日期 | 2019/5/2 |
IM业务系统后台实现
基于Django框架实现下列接口api
这里利用session来实现持久化登陆,即用户登陆后服务器会为其创建一个session,直至用户退出或者超时才会摧毁这个session。
只有在登陆状态后,用户才有权限执行别的操作
后端返回信息:JSON,status表示操作成功还是失败的状态,msg是执行操作后的返回信息,具体包括出错的具体细节,如密码错误等,data是在返回用户信息等操作时需要携带返回时使用。
{
status: {ok/fail},
msg: {},
data: {}
}
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(主键),用户名,密码,电话等信息
用户注册:
/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'),
]
访问的情况:
由于关于用户管理的接口有多达六七个,不再这里详述,这是选取其中两个有代表性的接口实现来讲述它的逻辑,其余实现也跟其类似。
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')
具体逻辑
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')
具体逻辑
这里实现的是对于聊天工具的好友管理,包括通过用户名查询添加一个新的好友,删除一个已有的好友,返回好友列表信息
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信息,通过这个信息来查询用户表来返回用户信息。
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'),
]
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')
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')
本周实验,小组正式进行第一次迭代,我所负责的后台api基本实现完成,剩余还有最关键的信息传递的接口,这个的实现我与另一个同学还在研究如何实现长连接,实现序号传输等功能。经过上周的Django学习,这周的开发过程也比较顺利,定义一个api可以用工业化流程来实现,第一步是对数据库的构建,第二步是定义url,第三步就是实现函数的逻辑,获取用户的传递参数处理数据库表格,返回response数据。为了测试写好的api,我利用之前IOS项目做过的网络访问类,来修改一下url地址,以及传入参数来进行测试。完成后台的任务后,可以转回到IOS客户端里面,帮助前端的同学实现几个简单的页面,或定义好网络访问的基类,数据的基类等。