用户建模
添加登陆入口,通过这个入口让管理员登录进去做商品系列操作,比如添加商品,修改商品等等,这就需要管理员权限,把管理员权限放到用户的操作文件中去。首先给用户建模,将数据存入数据库中。
server/database/schema/user.js
|
|
role
:角色,例如:管理员openid
:用户openid。微信小程序或者公众号对应的网站,保存用户信息,获取到openid。我们开发的应用如果只针对公众号或者小程序的话,只需要一个openid就可以了,如果项目跨多种产品线时,比如同时包含小程序、公众号、网站,这种情况下openid就不是唯一不变的,在不同的平台下openid是不同的,所以这里暂时把openid设置成数组。unionId
:把小程序或网站绑定到开放平台就能拿到用户另一个id,就是unionId。nickname
:用户名称address
:用户地址province
:省份country
:国家city
:用户所在城市
sex
:性别
hashed_password
:加盐后的密码值
loginAttempts
:登录次数lockUntil
:用户登录超过限定次数,锁定账户
虚拟字段
增加虚拟字段,这个字段不会真正的存入数据库,只是在每次解除数据时通过virtual拿到虚拟的字段。虚拟是指可以获取和设置但不会持久保存到MongoDB的文档属性。
通过两次取反,判断lockUntil
为true同时锁定的时间大于当前时间,说明当前账户还在锁定期内。
|
|
生成创建时间和更新时间
|
|
用户密码是否更改
判断用户的密码是否更改,如果更改了对密码进行加密,加密的同时通过bcrypt.gensalt()
加盐,可以增加密码的强度
|
|
比较密码
_password代表用户传过来的密码,password代表存入数据库加盐后的密码
|
|
登录次数
用户在登录时账号或密码匹配不成功,将登录次数+1
|
|
登录页面
pages/login.vue
|
|
登录
实现登录事件
|
|
设置请求路径和传入的参数,如果数据返回正确,更新数据commit('SET_USER', data.data)
store/action.js
|
|
登录路由
session中间件
有用户登录就会涉及到session机制,在common增加session中间件
server/middlewares/common.js
|
|
通过
客户端传过来的email和password,执行login方法获取数据,如果match为true表示匹配成功也就是当前密码正确,将user同步到当前user
server/routers/admin.js
|
|
@required({body: ['email', 'password']})
,添加中间件,表示必须有email和passowrd字段
通过findOne()
查找数据库里的用户,将客户端传过来的password和数据库里的password做比较,如果匹配成功返回user数据
server/api/admin.js
|
|
实现required中间件
接收参数rules,制定参数规则,声明errors来存放错误信息,声明passRules遍历制定的参数规则,如果有错误,给出报错信息,反之执行next()函数
convert:传入中间件middleware做转换工作,转换时将所有的参数(...args)
通过decorate()
方法将数据做进一步的处理
server/decorator/router.js
|
|
在浏览器中输入http://localhost:8080/login进入登录页面
测试
将管理员账号和密码通过脚本的方式写入数据库里,就可以测试登录功能
server/middlewares/database.js
|
|
user成功写入数据库,如图:
登录成功后,让后台页面跳转到某个页面,新建页面作为登录后的后台首页
pages/admin/index.vue
|
|
前端中间件
登录表单提交之后只是在后台做个密码比对返回登录状态,但是这个状态需要被保持,在后台页面上我们可能是点击前端页面刷新,也可能是直接进入另一个页面,这就需要会话方式同步现在的登录状态。新建middleware文件夹用来存放前端中间件
每次打开后台页面都需要经过这个中间件的过滤,如果当前用户没有登录,重定向到登录页面,如果有登录状态就直接进入目标页面
middleware/auth.js
|
|
与服务器同步渲染,会从服务器端将session带过来,判断session是否有用户信息,有的话设置用户信息
store/actions.js
|
|
设置session
在入口文件设置session,nuxt版本在传递session时可能会拿不到,所以在这里手动设置
server/index.js
|
|
每次在页面渲染之前都可以将session同步到request中
测试成功,如图:
前端微信二跳中间件
之前实现了在微信里授权,也实现了管理员从后台登录,对于管理员或者用户都可以用一套用户模型。我们在微信里打开网页时可以通过微信中间件的处理,让用户和管理员都能存到数据库里。在网页中打开项目首页可以访问,但是放到微信里做些活动页面或者购买行为时要有个中间跳转页面,让我们拿到微信用户资料存到数据库里,为session做持久化。实现从微信跳转时通过换取code过程识别来访用户的功能
微信中间件
每次打开首页时,判断authUser没有的话直接跳转到获取authUser的地址
middleware/wechat-auth.js
|
|
route为当前的路由,也就是当前要访问的全路径
在首页中增加微信中间件
pages/index.vue
|
|
设置authUser
store/index.js
|
|
设置微信用户
store/actions.js
|
|
store/mutations.js
|
|
跳转路由
通过wechat路由的wxRedirect()
跳转到目标地址,跳转之后拿到code,再用code获取用户的openid,通过API的接口拿到url,跳转到目标地址后通过ctx.session更新用户信息
server/controllers/wechat.js
|
|
同步session之前存入用户
|
|
注意:如果只是面向一种应用,比如只开发公众号或者小程序,只需要通过openid拿到用户资料,如果通过开放平台绑定了小程序、公众号,那么用户id就可以通过unionid来拿到用户资料
修改页面
将auth.vue作为跳板页面进行目标跳转,解析当前的url,解析后跳转到目标地址,这时session中已经有用户信息。在页面加载之前通过beforeMount获取到location里的url拿到数据,如果success为true,将数据设置到当前用户更新用户信息,通过getUrlParam()解析state,并以_
拼接参数
pages/oauth.vue
|
|
store/actions.js
|
|
store/services.js
|
|