-
前端
html、css、js、ajax
-
后端环境 Python 3.6.7+ django 1.11.8+mysql 5.7+Ubuntu18.04+dwebsocket
-
通信协议 http,websocket
-
通信格式 json,html
-
API 规范 一定程度上符合 RESTful 定义
- 用户的登录和注册
- 并发:支持连接处理多个用户请求
- 查询天气,新闻资讯
- 好友列表
- 好友在线状态
- 即时聊天
- 离线接收消息,历史记录
- 群聊功能
-
Web后端框架选择:Django
-
全双工通讯:由于是即时聊天,需要服务器主动向浏览器推送数据,http通讯协议无法满足
- 引用WebSocket,全双工通讯的协议。
- Django使用Channels实现WebSocket
-
并发:多用户同时操作 主要为IO操作
- 多线程/多进程并发:占用较多的资源
- fork多进程
- IO多路复用:I/O多路复用是在单一进程的上下文中的,因此每个逻辑流程都能访问该进程的全部地址空间,所以开销比多进程低得多;缺点是编程复杂度高。
- select方式,支持多平台,逻辑简单,支持最大并发数量(1024),相对epoll效率较低
- poll方式,
- epoll方式,
- 使用nginx的并发功能
- 多线程/多进程并发:占用较多的资源
-
数据库
- 数据库存储:查询效率高,方便程序调用,做自动化处理
- 数据库选择:mysql
- 实现方式:通过Django的Model模型层,对数据库进行相对的增删改查(CURD)
-
界面:使用html文件在web浏览器上呈现
- 基于Django框架的设计
- 由于Django是B/S架构,使用浏览器作为客户端
- 通讯模块
- 与客户端通讯,接收客户端的请求,将响应发送给客户端
- 与数据库通讯,数据的增删改查
- 并发处理模块
- 同时处理多个客户端请求
- 逻辑处理模块
- 处理客户请求,组织响应内容
- 通讯模块
- 数据库操作类(查询,增加,修改)
- 数据库名称:wechat_db
-
确保用户名,手机号唯一
-
用户名和密码约束
- 用户名(字段约束)--由2-10位字母、数字、下划线或中文组成,以字母或中文开头
- 昵称(可以相同)
- 邮箱(字段验证)-- 符合邮箱格式
- 密码(长度限制,字段约束)--
- 由6-12位字母、数字组成
- 不能全部是数字
- 不能全部是字母
- 必须是数字或字母
-
密码加密
- 密码隐式存储在数据库中,可选择加盐加密方法
-
用户状态验证
- 登入记住用户名功能
- 禁止用户未登入直接进入聊天界面
-
短信验证
- 手机短信验证
- 注册页面路径:/verify/signup
- 需要post的数据名:username,password...
- 服务端:
- 接收,判断用户名是否已经存在,存在返回”用户名已经存在“,反之返回注册成功,并进入聊天界面
- 存储注册成功的用户,密码使用加盐加密
- session验证:
- 验证用户是不是一个合法用户
- 在当前用户的session上记录当前用户名的名称和id
- request.session["user"]={"user":"news","id":1}
- 没有登陆的用户 session["user"]不存在
- 退出登陆时,删除session["user"]
- 路径:/verify/signin
- 记住上一次登入的用户名
- 使用cookie存储用户名
- 手机短信验证
- url:/verify/pwd_reset
- 验证成功后进入密码修改页面
- 密码修改
- url:/verify/pwd_reset2
- 根据客户端访问的IP,获取所在城市,查询天气,显示在聊天主界面
- 爬取新华网的五条头条新闻,显示在聊天主界面
- 图片、文章链接、标题
- 使用 nginx + uwsgi 为 django 提供高并发 web 服务
- 上传头像
- 修改密码、邮箱、电话号码、昵称、性别
- 友情链接
- 上传下载文件
- 添加好友
- 申请好友
- url:ws://127.0.0.1:8000/chat/friend_id
- 通讯方式:websocket
- 请求格式:json{ “sender”:请求者,"reciver":"接收者",”step“:“0”,"dataType":’0‘}
- 响应格式:json{code":200, “sender”:请求者,"reciver":"接收者",”step“:”1”,"dataType":”0”}
- 回复请求
- url:ws://127.0.0.1:8000/chat/friend_id
- 通讯方式:websocket
- 请求格式:json{“sender”:请求者,"reciver":"接收者",”step“:”2”,"status":"回复状态","dataType":”1”}
- 响应格式:json{code":200, “sender”:请求者,"reciver":"接收者",”step“:”3”,"status":"回复状态","dataType":”1”}
- 申请好友
- 推送好友列表
- url:ws://127.0.0.1:8000/chat/friend_list
- 通讯方式:websocket
- 请求格式:json{code":200, "friends":[{"username":好友名称,"step":"5", "friend_head":头像} .....]}
- 好友详细信息
- url:ws://127.0.0.1:8000/chat/detial_info
- 通讯方式:ajax
- 请求格式:"username":好友名称
- 响应格式:json{code":200, "username":好友名称,"friend_head":头像....}
- 判断好友是否已经存在
- 好友添加成功后刷新好友列表
- url:ws://127.0.0.1:8000/chat/friend_id
- 通讯方式:websocket
- 请求格式:json{code":200, "friends":[{"username":好友名称,"step":"5", "friend_head":头像} .....]}
- 获取头像
- 用户头像
- 好友头像
- url:ws://127.0.0.1:8000/chat/friend_id
- 通讯方式:websocket
- 请求格式:json{ “sender”:请求者,"reciver":"接收者","dataType":“2”,"msg":" ...","time":"2019-8-12 18:20:23"}
- 响应格式:json{code":200, “sender”:请求者,"reciver":"接收者","dataType":“2”,"msg":" ...","time":"2019-8-12 18:20:23"}
- 添加忘记密码界面展示
- 修改提示错误样式
- 忘记密码界面 --> password_reset.html
- 修改密码界面 --> password_reset2.html
- 注册界面 --> signup.html
- 添加输入验证码文本框 name="veri_code"