本帖最后由 武汉分校-小舞 于 2018-12-28 11:12 编辑
# 登录注册## 1 图片验证码生成(/passport/image_code)
用户点击 注册按钮,触发js中的函数生成一个UUID并通过ajax请求到服务器端,服务器接收到来自用户的请求,判断是否携带参数,有参数生成一张图片验证码并以用户传递过来的参数为key,图片验证码为value储存到redis中 并设置过期时间60S.
## 2 短信发送(/passport/sms_code)
用户填写完注册框中内容 点击获取验证码,前端做一次数据完整性的校验,通过ajax发送给后台,后台检验数据完整性,如果数据完整,检验验证码是否和redis中储存的数据一致,所有数据校验通过生成一个6位数字的验证码并调用第三方短信验证码平台发送,需要三个参数(手机号、短信内容(验证码)、过期时间), 第三方平台接收到这些数据会有一个返回值-1/0 0表示发送成功,-1表示发送失败,根据返回值判断短信是否发送成攻,如果发送成攻将手机号和验证码内容以key-value存入redis并设置过期时间,否则返回相应的错误信息.
## 3 注册(/passport/register)
用户填写完验证码之后 点击注册
前端通过ajax发送 手机号 验证码 密码到后端
后端检验数据的完整性
通过获取到的手机号取出redis中存入的验证码校验是否和前端传过来的是否一致,
如果取不到值返回验证码过期,
如果取出的值于前端传送过来的值不一致 返回错误 验证码不正确.所有验证通过之后 将数据存入数据库,存入数据库时做异常处理以及事务处理.
## 4 登录(/passport/login)
用户点击登录按钮 输入相应的用户名和密码之后 通过ajax发送到服务器,服务器接收到值之后做一致性校验,如果帐号不存在返回'用户不存在,请先注册',如果密码未能通过校验返回'用户名或者密码错误',登录成功之后将登录信息保存在session中#
页面展示
## 1 主页(/)
用户进入网站默认路由是index(首页)页面
判断用户是否已经登录
用户未登录:页面右上角显示登录按钮
用户已登录:页面右上角显示个人头像名称之类
点击首页时默认展示最新数据 查询数据库
点击不同新闻分类时触发ajax请求 不同分类的新闻有不同的class_id(cid)ajax发送请求携带cid后端接收到ajax请求 通过cid查询对应的新闻类别返回给前端展示返回数据包括:数据总页数、当前页数、当前页面的数据
页面往下拉的时候也会触发ajax请求往下请求更多数据(当前页面小于总页面数) 当前页面等于总页面数时不再显示更多数据
## 2 详情页(/<int:news_id>)
点击首页展示的新闻进入详情页面 向后端发送get请求 携带新闻的id
后端接收到前端的请求 通过新闻id查询出新闻详情 新闻的评论 点击次数 评论的点赞数量 并判断用户是否登录 如果用户登录则查询这个 新闻用户是否收藏 点赞
根据查询的结果返回给前端
## 3 评论(/news_comment)
点击评论时判断用户是否登录,如果用户未登录则弹出登录框
用户已登 评论提交时 通过js修改前端评论展示并将提交的评论展示到评论列表最上面,同时通过ajax把评论内容 新闻id 评论人的id 传送到后端 后端接受到这些参数 先校验参数的完整性 如果缺失任何一个参数 返回参数错误, 若参数都有继续校验数据库是否有这存在这篇新闻是否存在
如果不存在(管理员后台删除了请求时发生了未知的错误导致新闻id出错)返回错误'未查询到新闻'
在确认没有参数错误 没有数据错误之后将评论内容 评论的新闻id 评论人的id存入数据库中(注意所有数据库修改操作时都要加上事务处理)
## 4 收藏(/news_collect)前端发送请求包括 新闻id(news_id) 请求行为(action)
判断用户是否登录 没有登录弹出登录框
判断参数是否完整 否则返回错误'参数错误'
参数完整性校验通过后 校验数据的有效性 去数据库查找新闻是否存在
判断新闻页面是否存在 否则返回错误'未查询到新闻数据'
所有参数校验通过之后
根据action判断用户是否收藏新闻还是取消收藏
根据判断的结果在数据库中做相应的添加和移除操作
操作完成之后返回消息'操作成功'.
数据库修改操作时都要加上事务处理
## 5 评论点赞(/comment_like)
前端发送请求包括 评论id(comment_id) 请求行为(action)
判断用户是否登录 没有登录弹出登录框
判断参数是否完整 否则返回错误'参数错误'
参数完整性校验通过后 校验数据的有效性 去数据库查找评论是否存在
如果不存在 返回错误'评论不存在'
数据完整性和有效性都验证通过之后 在评论点赞表中根据用户id和评论id查找出数据
根据action判断用户的请求行为是点赞还是取消点赞
如果是点赞则在评论点赞表中删除这条记录 同时把该评论的点赞数-1
否则在评论点赞表中添加这条数据 同时把该评论的点赞数+1
数据库修改操作时都要加上事务处理
## 6 关注用户(/followed_user)
前端发送请求 携带参数 关注的用户id(user_id) 请求行为(action)
判断用户是否登录 未登录弹出登录框
判断数据完整性 否则返回错误'参数错误'
根据关注的用户id(user_id)去用户表中查找是否存在这个用户
如果查找不到该用户返回错误'未查询到用户信息'
根据action判断是关注用户还是取消关注
如果是关注用户在info_user_fans中添加当前用户id为follower_id user_id为followed_id
否则在info_user_fans中移除
# 3 个人中心##
用户资料(/user/info)
用户资料展示用户填写的基本资料 个性签名 昵称 性别
根据请求方式判断用户行为
如果请求方式为GET 展示用户的现有资料
如果请求方式为POST 根据传输到后端的值改变用户资料
当请求方式为POST时 服务端收到用户传输的数据首先做数据完整性校验
根据获取到的登录用户ID去用户表中修改信息
## 头像修改(/user/pic_info )
用户点击修改头像 服务端接收到用户请求根据用户的请求方式GET,POST判断用户是查看头像还是修改头像,请求方式为GET时是查看头像 返回用户头像模板和头像展示给用户,请求方式为POST时根据用户传输过来的数据提取到用户头像并上传到七牛云上 将传送到云上的URL保存到用户表中并将更新之后的数据返回给用户展示
## 关注列表(/user/user_follow)
用户点击我的关注之后进入关注页面 服务端收到用户请求,获取到当前用户的登录信息 查询用户的关注列表 以每页四个做分页 将总页面数 当前页面数据以及当前所在页面返回给用户显示
## 密码修改(/user/pass_info)
用户点击密码修改 服务端接收到用户的请求根据用户请求方式GET,POST 判断用户是请求更改密码的页面(GET)还是发生更改密码行为(POST)
GET请求返回修改密码界面
POST请求 携带参数旧密码 新密码
前端需要填写两次密码同时会校验两次密码是否一致如果不一致弹出提示'两次密码输入不一致'前端校验通过 后将新密码和旧密码传送到服务端,服务端收到POST请求 先校验数据的是否完整,数据校验通过之后 根据当前登录用户的id去用户表中查询当前登录的用户密码,通过check_password函数(创建用户表时写的方法)对比前端传输过来的旧密码和存在用户表中的密码是否相同,如果密码不同返回错误"原密码错误",如果验证通过 将新密码存入用户表中,返回消息 保存成功
## 我的收藏(/user/collection)
用户点击我的关注之后进入关注页面 服务端收到用户请求,获取到当前用户的登录信息 查询用户的收藏列表 以每页十个收藏的新闻做分页处理 处理完成之后将 总页面数 当前页面数 当前页面收藏的新闻 返回给前端展示
## 新闻列表(/user/news_list)
用户点击新闻列表获取自己投稿的新闻 以及状态
服务端接收用户请求 根据seesion获取到当前登录用户的信息
通过获取到的信息去新闻表中根据用户id查询用户发布的新闻以每页十条新闻做分页处理
处理完成之后将 总页面数 当前页面数 当前页面新闻 返回给前端展示 前端接收到服务端传送过来的数据 根据数据中 当前页面中的新闻状态(0,1,其余数值)显示新闻的相应状态(已通过,审核中,未通过)
## 新闻发布(/user/news_release)
用户点击新闻发布
进入新闻发布服务端接收请求 根据请求方式不同执行不同的操作(GET)请求新闻发布模板,(POST)传送编辑好的新闻到后端
用户点击新闻发布时对后端发送一个GET请求 服务端接收到GET请求 到数据库中查询新闻分类信息和新闻发布模板一起返回给前端
用户根据新闻发布页面填写内容,点击"发布"将内容以Ajax形式POST方式发送到后端,在Ajax发送之前JS在前端做一次数据完整性校验,校验不通过弹出"参数有误",前端校验通过之后数据发送到后端,后端接收到数据 做数据完整性校验 校验不通过返回错误"参数有误", 校验通过后 将数据写入新闻表中
``` python
news.title = title
news.digest = digest
news.source = source
news.content = contentnews.index_image_url = constants.QINIU_DOMIN_PREFIX + key
news.category_id = category_idnews.user_id = g.user.id
```# 后台管理##
登录(admin/login)
用户GET请求后台登录模板时
判断当前是否有登录,如果有登录直接重定向到管理员后台主页
在session中获取user_id,is_admin两个字段如果能获取到重定向到admin主页
获取不到 返回登录页面
用户发送POST请求时(username, password)
先做数据完整性校验
到用户表中查询是否有这个用户 并且is_admin字段为True
如果没有返回错误"未查询大炮用户信息"
登录完成之后将登录信息保存到seeion中并跳转到admin主页面
## 用户管理
### 用户统计(/admin/user_count)管理员点击 用户统计 发送请求
后台收到请求
查询User表中所有用户total_count
根据time.localtime() 获取到当前月份和年份并拼接到当前月份第一天
```python
t = time.localtime()
begin_mon_date_str = '%d-%02d-01' % (t.tm_year, t.tm_mon)
# 将字符串转成datetime对象
begin_mon_date = datetime.strptime(begin_mon_date_str, "%Y-%m-%d")
```通过begin_mon_date去数据库中查询创建时间在这之后的用户的总数mon_count
通过循环 获取到每一天中新增加的用用户active_count
将获取到的数据和和模板一起返回给前端渲染
### 用户列表(/admin/user_list )
查询用户表将所有非管理员用户查询出来之后以每页十个做分页处理
将查询出的数据(用户信息, 总页面, 当前页面)返回给前端
## 新闻管理
|
|