观影记录网站的一份踩坑总结ing
技术栈
前端:Vue全家桶
服务端:Express框架 + MongoDB
关于技术选型的反思
前后端分离:前端与后端API可以同域/跨域,方便分工
SPA:
vue:修改子组件样式
style scoped:为了防止命名带来的样式污染,赋予该组件内元素唯一标识。父子组件任一使用了scoped都无法更改子组件样式。
解决:混合style
登录登出与权限控制
方案
- cookie + session 服务端存储压力、集群同步、cookie安全性
- token + 客户端保存(localstorage) 一旦下发无法控制、收回
- SSO单点登录:多个应用系统共享登录状态(eg.百度系) 父域cookie、认证中心服务器、localstorage跨域
- OAuth:第三方
权限控制
- 路由级:路由守卫beforeEach+路由元数据meta(拦截/setting、/createlist等)
- 接口级:axios与express的拦截器(拦截mark操作请求等) 请求头携带token → 服务端校验token,失败返回错误码/成功返回数据 → axios响应拦截错误码,跳转到登录页
- 内容/按钮级:自定义指令v-permission(拦截评论modal)
登录登出流程
- 主动登录:前端发送请求 → 服务端验证并生成token → 前端保存token到本地+vuex → 跳回上页 → (获取用户信息)→ 头部更新
- 主动登出:前端发送请求(头携带token)→ 服务端销毁token → 前端清空本地+vuex的全部信息 → 原地头部更新
- 被动登出(localstorage被删除等):当路由跳转,检查本地token → 前端清空本地+vuex的全部信息 → 原地头部更新
获取用户信息
- 每次跳转路由,localstorage有token? 有:(获取用户信息,是否去登录页?拦截:放行)
无:(清空全部,路由需要权限?跳转到登录页:放行)
1.前端拦截无效
原因:封装axios实例为service,但并没有以service引入
状态码2xx以外的响应会被拦截,error.response.status取出(此处的状态码不是在响应体中自定义的状态)
2.服务端拦截无效
原因:express拦截器使用app.use()定义,代码顺序执行,位置应当放在中间件/静态资源之后,路由定义之前
3.服务端响应状态码
res.status:只设置状态码,不返回信息 → res.sendStatus = res.status(xxx).send('yyy')
4.router-view与视图更新(登录按钮&用户信息的切换)
为了少写几个header、footer,中间内容用了router-view展示……但路由跳转只有中间视图更新,头部需要自行刷新,以实现登录按钮&用户信息的切换(v-if="token")
思路:监听localstorage,变化则更新头部视图
方案:
- vuex响应式,state.xxx
注意:vue2.0响应式底层问题,对象/数组类型无法及时更新
持久化:每次刷新,从local取token/后台取信息
state.userinfo.username → state.username
5.刷新页面
- $nextTick、v-if、provide/inject
<NavHeader v-if="isRouterAlive" />
<div class="middle">
<router-view />
</div>
provide() {
return {
reload: this.reload,
};
},
data() {
return {
isRouterAlive: true
};
},
methods: {
reload() {
this.isRouterAlive = false;
this.$nextTick(() => {
this.isRouterAlive = true;
});
},
},
补充
验证码
手机登录
鼠标事件:移入移出
mousemove:元素内多次移动重复触发
mouseenter - mouseleave:只触发一次,不会冒泡,性能问题
mouseover - mouseout:包含子元素,会冒泡
一些debug总结
- console.log没有=没调用
- 模块封装名与引入时是否一致(axios)
- 代码定义顺序(express拦截器)