1.5 Social 模块开发
Social 功能概述
- 交友模块
- 获取推荐列表
- 喜欢 / 超级喜欢 / 不喜欢
- 反悔 (每天允许返回 3 次)
- 查看喜欢过我的人
- 好友模块
- 查看好友列表
- 查看好友信息
开发中的难点
- 滑动需有大量用户,如何初始化大量用户以供测试?
- 推荐算法
- 如何从推荐列表中去除已经滑过的用户
- 滑动操作,如何避免重复滑动同一人
- 如果双方互相喜欢,需如何处理
- 好友关系如何记录,数据库表结构如何设计?
- 反悔接口
- “反悔”都应该执行哪些操作
- 每日只允许“反悔” 3 次应如何处理
- 后期运营时,如何方便的修改反悔次数
- 内部很深的逻辑错误如何比较方便的将错误码返回给最外层接口
关系分析
- 滑动者与被滑动者
- 一个人可以滑动很多人
- 一个人可以被多人滑动
- 结论: 同表之内构建起来的逻辑上的多对多关系
- 用户与好友
- 一个用户由多个好友
- 一个用户也可以被多人加为好友
- 结论: 同表之内构建起来的逻辑上的多对多关系, Friend 表实际上就是一个关系表
模型设计参考
-
Swiped (划过的记录)
Field Description uid 用户自身 id sid 被滑的陌生人 id mark 滑动类型 time 滑动的时间 -
Friend (匹配到的好友)
Field Description uid1 好友 ID uid2 好友 ID
类方法与静态方法
method
- 通过实例调用
- 可以引用类内部的 任何属性和方法
classmethod
- 无需实例化
- 可以调用类属性和类方法
- 无法取到普通的成员属性和方法
staticmethod
- 无需实例化
- 无法取到类内部的任何属性和方法, 完全独立的一个方法
利用 Q 对象进行复杂查询
from django.db.models import Q
# AND
Model.objects.filter(Q(x=1) & Q(y=2))
# OR
Model.objects.filter(Q(x=1) | Q(y=2))
# NOT
Model.objects.filter(~Q(name='kitty'))
设计文档、业务逻辑
系统架构
- Django + sqlite / mysql
- 典型的 Web application
- NginX -> Django -> DB
需求分析
- User
- 获取短信验证码:1个接口
- 验证短信验证码,登录:1个接口
- 如果无此用户,直接创建
- 同时完成登录和验证
- 获取资料:1个接口
- 更改资料:1个接口
- 上传头像:1个接口
数据模型
- User
- 手机号:
- phonenum : varchar(20)
- +8613501234567
- 135-0123-4567
- phonenum : varchar(20)
- 用户名
- nickname: varchar(50)
- 性别
- gender / sex: varchar(20)
- male
- female
- unknown
- others
- gender / sex: varchar(20)
- 生日
- birth_year: smallint(双字节)
- birth_month: tinyint(单字节)
- birth_day: tinyint(单字节)
- 头像
- avatar: (URI: Uniform Resource Identifier): varchar(4096)
- 居住地
- addr / location: varchar(1024)
- 规范:北京:beijing、bj、peking,朝阳,永泰庄
- 手机号:
- Profile
- 目标城市 varchar (10)
- 城市的区
- 定位:经纬度
- 从ip地址
- 用地图插件
- 用前端获取经纬度:app、html5、小程序
- 多个接口接收用户的经纬度位置
- min_distance
- max_distance
- min_age
- max_age
- dating_sex
- vibration
- only_match
- auto_play
- user_id
- 目标城市 varchar (10)
API接口定义
-
User
-
获取验证码:
-
描述:
-
方法:GET [ POST / PUT / DELETE ]
-
路径 / 路由 / URL : http://www.some.com/user/submit/phone
-
参数:
- phonenum=13501234567
-
返回值:
{ "code": 0, "data": { "status": "ok" } }
-
code范围:
- 0 正常
- 1000 服务器内部错误
- 2000 客户端错误
- 2001 北京号码不能注册
-
-
校验验证码:
- 描述:
- 方法:POST
- 路由:http://www.some.com/user/submit/vcode
- 参数:
- phonenum=13512345678&vcode=2345
- response:
- { “code”: 0, “data”: { “status”: “ok” } }
- { “code”: 2001, “data”: { “status”: “code error” } }
-
获取资料:
- 描述:登录后使用
- 方法:GET
- URL:api/user/get/profile
- 参数:
- 不需要提交其他信息
- Profile 的 json 数据:
- 用户个人资料
- 具体哪些字段?
-
修改资料:
- 描述:登录后修改资料
- 方法:POST
- URL:api/user/set/profile
- 请求:
- key=value
- response:
- 我们修改的结果:成功还是失败
-
上传头像:
- 描述:登录后使用
- 方法:POST
- URL:api/user/upload/avatar
- request:
- file
- response:
- ok
-
-
Social接口
- 获取推荐列表
- 喜欢、超级喜欢、不喜欢
- 反悔
- 查看喜欢过我的人
RESTFUL 风格对比
- 混乱风格:project 1:
- GET http://www.some.com/user/1/edit
- GET http://www.some.com/user/1
- 混乱风格:project 2:
- POST http://www.some.com/edit/user/1
- GET http://www.some.com/get/user/1
- GET http://www.some.com/user/1/edit
- RESTful:
- GET http://www.some.com/user?id=1
- POST http://www.some.com/user
- PUT http://www.some.com/user
- body: gender=male
业务描述、业务流程、表结构
- 请介绍你做过的业务
- 请描述你的业务核心流程
- 请介绍你的业务逻辑结构
- 请画出核心表结构
- 针对你的业务,如果增加以下功能,该如何设计?
- 电商:多件商品捆绑优惠促销
- 游戏:多人对战
- 社交:好友排行