前端设计
简单想了一下流程,分开两个视图,一个是登录视图(路径为/login),组件为登录表单;一个是展示投票页面的视图(路径为是根路径),组件是投票表单+登录展示。
主要业务逻辑如下:
- 项目初始化
- vuex从尝试从本地加载TOKEN和用户名
- 用户访问首页
- before导航守卫判断vuex中是否有TOKEN,没有则转至登录视图
- 如果有TOKEN,向后端发送TOKEN获取投票信息
- 正常获得响应,使用vote中的数据进行渲染--正常进入投票视图
- 出现401错误,表示TOKEN认证失败--转至登录视图
- 出现404错误,表示用户没有投过票。此时只渲染投票组件中投票部分,不展示投票数量,让用户进行投票之后再展示投票结果。
- 用户访问登录视图
- 导航守卫不做任何验证-->所有用户都可以访问登录视图
- 用户发送登录请求-->成功取得200响应-->将TOKEN和用户名,是否投票,上次投票日期等信息加载至Vuex并存储到本地存储中,然后转至首页。
- 用户发送登录请求-->返回任何错误代码-->依然返回登录视图,但是需要通过SLOT插入错误信息。
- 用户选择了组件之后点击发送按钮
- 如果获取201响应,则表示成功进行投票。
- 如果获取406页面,想办法在页面上提示每24小时只能投一次票,什么也不做,还是留在当前页面。
- 如果获取401响应,表示TOKEN出现问题,将用户转至登录页面。
Vuetify
看了刘架构分享的尤雨溪6月4日的Vue技术分享,其中提到的Vuetify库,扁平化风格,很对我口味。真的不想再对着BootStrap那套玩意了。决定借写前端的机会也用一下这个库。vuetify安装
Vuetify的文档在这里,还有中文文档,算是比较方便。 我采用的方法是使用vue ui生成项目,在项目生成之后,点击左侧的插件,然后右上角添加插件,搜索vuetify,是0.5版。点击然后点右下角的安装,然后会弹出通知说插件安装好。
之后还有三个选项,由于是新项目之间安装,选默认就可以了。
剩下就可以使用了。
快速指南里还有其他方法,都比较简便。
Flex Box 学习
这里有一篇A Complete Guide to Flexbox讲的相当不错。 把Flex Box的内容总结一下:FLEX容器
设置了属性display:flex的都是FLEX容器,容器的作用是决定其中内部的FLEX项目的排布。可以设置的属性如下
flex-direction,决定主轴方向,可选row | row-reverse | column | column-reverseflex-wrap,要不要强制显示在一行中,可选nowrap | wrap | wrap-reverse,nowrap表示不允许换行,wrap表示换行。flex-flow,前两个属性的简写,默认是row nowrap。justify-content,决定其中项目沿主轴的对齐方式,可选flex-start | flex-end | center | space-between | space-around | space-evenly,分别表示靠近头,靠近尾,居中,两端对齐,平均分布(每个项目自带一个左右两侧相等的空白部分),所有项目之间和到两侧的空白相等align-items,决定其中项目沿交叉轴的对齐方式,可选flex-start | flex-end | center | baseline | stretch,分别表示靠近头,靠近尾,居中,对齐其中文字的基线,拉伸到适合整个交叉轴align-content,决定多行的对齐方式,flex-start | flex-end | center | space-between | space-around | stretch,这个的居中是将一个容器的所有东西向中间排布,其他和单主轴对齐差不多。
- item
FLEX项目
在FLEX容器内包裹的内容,自动成为FLEX项目。可以设置的属性如下:order,一个整数值,决定排列顺序,默认为0,要设置就一起设置,不然0总会排在正数的前边flex-grow,表示项目是否放大,默认是0,表示不放大,如果都是1,会等分空间,如果数字不相同,会加总然后计算各自占的比例。flex-shrink,表示项目是否缩小,默认为1,表示会缩小;如果设置为0表示不缩小;如果很多项目都是1,会同比例等分缩小。这个属性设置成负数无效。flex-basis,表示在分配多余空间之前,项目占据的主轴大小,默认是auto,即项目的本来大小。可以设置成具体的长度,项目就会占据固定空间。flex,上边三个属性按照flex-grow,flex-shrink和flex-basis顺序的简写。有两个快捷值auto(1 1 auto)和none(0 0 auto)。align-self,表示这个属性所在的项目自己的对齐方式,会覆盖FLEX容器的align-items属性。默认为auto,即继承父元素的设置。可以设置为auto | flex-start | flex-end | center | baseline | stretch;其意义与FLEX容器的属性一样。
align-self: flex-end。
- item
FLEX嵌套
FLEX容器是可以嵌套的,一个FLEX项目既可以控制自己的排布,也可以成为一个容器继续控制其内部的排布。 比如如果将上边的例子里的文字也居中,只需要把文字再套在一个元素里,然后把内部的FLEX项目同时设置为一个FLEX容器:-
item
Vuetify啦,做出的页面应该不会让老婆说丑了。