首页

损失厌恶心理是如何影响我们的决策

雪涛

损失厌恶心理在设计中的应用以及是怎么影响我们的决策

前言:

前几天在一篇文章中看到“损失厌恶”这个心理学现象,就上网查阅了一些相关资料,以及它在设计中是如何运用,又是如何影响我们的决策,总结一点自己的观点。


一、损失厌恶


对于损失厌恶,先来做几个实验,来帮助我们更好的理解。

如果我给你一个苹果,你应该会感到高兴吧!现在换一下,我给你两个苹果,接着我向你拿回了一个。

请问,你更喜欢哪一个场景?我想多数人的答案是第一个,而不喜欢第二个场景。

这个实验两个场景的结果都是一样的,都得到了一个苹果,但是在第二个场景中,因为得而复失,损失了一个苹果,这严重影响并拉低了获得一个苹果的幸福感。


丹尼尔·卡尼曼(Daniel Kahneman)曾经设计了一个掷质硬币的实验,硬币是均质的。如果是正面,你将得到150美元;如果是背面,你将输掉100美元。这个赌局对于参与者来说,长期下注的话,肯定是稳赚不赔的,毕竟输赢概率相同,赢的收益大于输的损失。

但是实验结果却是,大多数人仍然拒绝了这个赌局,因为对于多数人来说,损失100美元的痛苦远远大于得到150美元的快乐。最少收益多少,快乐才能弥补普通人是失去100美元的痛苦呢?答案是,200美元。


由上述实验我们可以看出:


损失厌恶是指人们面对同样数量的收益和损失时,认为损失更加令他们难以忍受。同量的损失带来的负效用为同量收益的正效用的2.5倍。损失厌恶反映了人们的风险偏好并不是一致的,当涉及的是收益时,人们表现为风险厌恶;当涉及的是损失时,人们则表现为风险寻求。


二、坚持中庸最好


我们在进行网购的时候,比如看上一件很喜欢的衣服,追求高性价比的用户会通过图片在淘宝进行搜索,进行价格的对比,从而选择一款销量高、评价好、价格又合理的款式。

“损失厌恶心理”在其中发挥着它的作用,人们害怕价格太低,买到的商品没有自己预期的好,质量得不到保障,害怕价格太高,买到的商品不值这个价格。感觉自己会买亏,所以我们总是选择规避这样的风险,去选择一个中间价位的作为目标购买, “坚持中庸最好”。   



三、电商中的应用


每逢换季、过节时一些电商平台经常会搞一些促销活动,比如

  1. 2件8折,3件7折,预计到手XX元;

  2. 现价99,倒计时x小时恢复199;

  3. 线下店面到期最后一天全场5折的海报(每次路过的时候都是最后一天)

商家都是为了营造现在不买就没的“稀缺感”对你刺激消费,套路还是老套路,但是一直都很有用。如果我们真喜欢这件物品,即使凑单也要享受7折优惠去购买,因为你会感觉便宜很多,省下了不少钱;


还有一年一次的店庆,淘宝的双11,京东的618,也以用户的“损失厌恶”心理为基座。

用户从第一个角度想,能在这样的狂欢节中买到如此实惠的产品,一定要抓住机会,熬夜也要买买买!

用户从第二个角度想,一年一次,要是错过这个机会,如此实惠的产品可只有明年才有了,越累越多的人有这种心理,所以淘宝双十一的总额年年都在刷新记录。


再就是拼团功能的应用,单买价格可能对你来说不贵,但拼团会让你感觉更划算,能省则省,中国有14亿人,有那么3 4亿消费者是不追求高质量、高标准的,对于他们来说便宜就行,也正是因为这样一拨人,才促使了拼多多的在短短的3 4年就可以做到上市的原因之一。



在二手平台,有个估价的功能,当我们输入我们产品的各种信息后,会出现一个大概的市场价,下面会提示我们预计下周跌幅150元、一周后在降低200元等信息,这些细节设计的很到位,都是利用了人们的损失厌倦心理去促成交易。



四、股票市场中的应用


“损失厌恶”心理往往深刻影响这人们的投资决策。例如,你手中有两只股票,一只涨了100块,另一只跌了100块。现在你因急事需要用钱,必须卖掉一只,那么你会卖掉哪一只?调查显示,大多数人会选择卖掉上涨的股票。因为股票上涨是收益,赚了白不赚,一定要先落袋为安,却没有考虑它继续上涨的可能性。而股票下跌是损失,面临损失大多数人是不可接受的,总希望它能涨回来避免损失,如果卖掉那损失就永远不可挽回了。事实上正确的操作应该是卖掉跌的股票,及时止损,不然损失越来越大的概率要更高。


作者在支付宝里买了两支基金,在探索阶段,所以少买了一些在试水,第一支波动比较大,会有亏损,第二支,比较平稳基本就是定期的会有收益,即使没有,也几乎没有亏损的情况,而对我这种金融小白来说会卖掉亏损比较大的,用这些钱去买稳定一些的产品。



五、不要被蝇头小利蒙蔽


养孩子最贵的莫过于尿不湿和奶粉了当然除了学费,对于一个追求高性价比的人来说,孩子的尿不湿我会在闲鱼淘一些宝妈们转卖的全新产品,从下面这个对话来看,我们两个都会呈现出明显的“损失厌恶心理”,卖家不愿意放弃自己眼里的利益,认为自己可以减少损失,而我之前因为花了同样的钱买了同样数量的同样的品牌,所以也不想做出让步,最终也没完成交易。



六、间断造成的损失


一些app中的签到、金币购买皮肤等这些常见的功能就是利用了用户的损失厌恶心理来增加用户粘性,当用户连续签到多少天才可以赢得红包或礼品,中间只要一间断不仅领不到奖励还要重新开始签到,所以一些用户为了减少自己的损失,就会连续签到,还有QQ退出时的提示语也是利用了用户的这种心理,从而能很好的增加留存。



掌上生活app中的积分抽奖活动,1分、9分,一点点的花光都没抽中你想要的,内心的不服输,又抱着侥幸的心理再来一次,可能你把积分花光了也不一定能中奖;

像这样的情况,我们很容易被眼前的利益所蒙蔽,我们不愿意放弃对未来会有更大利益的收获,所以不断投入“沉没成本”,令损失加倍。



七、在产品中的植入


最常见的就是“购物车”功能,我们女生都爱买买买,也常把购物车当作收藏来使用,放进购物车,就感觉这件商品自己的,过两天在看,已经下架就会感觉自己像失去了一件宝贝似的

还有就是VIP体验功能,我们通过百度云盘上传或者下载文件的时候,会有一个免费体验300秒的极速下载的功能,先让你体验了最为VIP的待遇,体验过后,开始给你限速;


苏宁易购APP中非会员用户可以免费享受一个月SUPER VIP,并购买商品时返现2%到个人账户中,让用户感觉我买东西的同时还可以剩下2%,像是自己赚到的一样,体验期过后,你会感觉自己买东西亏了很多;


这些产品都是先让你免费试用付费的VIP,待你用习惯了,VIP也停了,大部分人都会乖乖付费,这也是损失厌恶的一种应用。



八、不敢轻易尝试


在生活中我们吃饭、逛街也是一样,尤其是吃饭,我们通常会选择口味、价格、服务、环境等都比较熟悉的地方吃饭,对一些不熟悉的饭馆,会比较谨慎,这也是损失厌恶心理在“作祟”担心陌生的餐馆饭菜不好吃还贵;


生活中还有很多常见的损失厌恶心理作祟的例子:比如吃自助餐,虽然过食伤胃的道理大家都懂,人们依然觉得已经花了这么多钱,就该敞开肚子吃才算有“赚到”;比如花30块买了张电影票,但看了20分钟后觉得无聊至极,但想着已经花了30块,不看完整场会很“亏”,选择继续呆在影院,即使电影带来的效益为负……有些时候,哪怕是很小的损失。


总结:


我们每个人都有损失厌恶心理,可以说是天性,也是本能,我们要尽可能去找到一些产生损失厌恶的边界,让自己坦然面对损失,规避“损失厌恶”。

点击遮罩层的背景关闭遮罩层

seo达人

开发工具与关键技术:Adobe Dreamweaver CC

作者:黄灿

撰写时间:2019.1.16



在模仿华为官方网页的练习当中我发现华为官网中有一个遮罩层是随便点击遮罩层的背景也能关闭掉遮罩层,但唯独点击内容区域不会关闭掉遮罩层。于是我开始模仿这个写案例,连内容也一模一样(因为这个练习就是要写出和华为关一样的效果或则比它更好的效果),一开始我是这样子写的(图1)



图1



class=Select_Region_bj 我给了一个灰色半透明的背景样式,后来在Javascript中写onclick事件无论这么写,点击内容区也是会关闭掉遮罩层。我百思不得其解到底怎么样写才能点击内容区不会关闭遮罩层,后来下课期间我看见我同学他写的带能点击内容区不会关闭遮罩层。我问他你是这么写的,他告诉我:“把他们分离就可以的了。”我思考了一会,脑补:分离?怎么分离?补着补着补着就补出了背景和内容区分离。分离写(图2)

图2



把背景层和内容区分开来写,不要在背景层中包裹内容,这样子点击内容区就不会关闭掉遮罩层了!

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

深入理解vue中的slot与slot-scope

seo达人

写在前面

vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率、使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”,于是就关闭了vue说明文档。

实际上,插槽的概念很简单,下面通过分三部分来讲。这个部分也是按照vue说明文档的顺序来写的。

进入三部分之前,先让还没接触过插槽的同学对什么是插槽有一个简单的概念:插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由父组件来决定。 实际上,一个slot最核心的两个问题这里就点出来了,是显示不显示怎样显示

由于插槽是一块模板,所以,对于任何一个组件,从模板种类的角度来分,其实都可以分为非插槽模板插槽模板两大类。
非插槽模板指的是html模板,指的是‘div、span、ul、table’这些,非插槽模板的显示与隐藏以及怎样显示由插件自身控制;插槽模板是slot,它是一个空壳子,因为它显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定,slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块

单个插槽 | 默认插槽 | 匿名插槽

首先是单个插槽,单个插槽是vue的官方叫法,但是其实也可以叫它默认插槽,或者与具名插槽相对,我们可以叫它匿名插槽。因为它不用设置name属性。

单个插槽可以放置在组件的任意位置,但是就像它的名字一样,一个组件中只能有一个该类插槽。相对应的,具名插槽就可以有很多个,只要名字(name属性)不同就可以了。

下面通过一个例子来展示。

父组件:


  1. <template>
  2. <div class="father">
  3. <h3>这里是父组件</h3>
  4. <child>
  5. <div class="tmpl">
  6. <span>菜单1</span>
  7. <span>菜单2</span>
  8. <span>菜单3</span>
  9. <span>菜单4</span>
  10. <span>菜单5</span>
  11. <span>菜单6</span>
  12. </div>
  13. </child>
  14. </div>
  15. </template>

子组件:


  1. <template>
  2. <div class="child">
  3. <h3>这里是子组件</h3>
  4. <slot></slot>
  5. </div>
  6. </template>

在这个例子里,因为父组件在<child></child>里面写了html模板,那么子组件的匿名插槽这块模板就是下面这样。也就是说,子组件的匿名插槽被使用了,是被下面这块模板使用了。


  1. <div class="tmpl">
  2. <span>菜单1</span>
  3. <span>菜单2</span>
  4. <span>菜单3</span>
  5. <span>菜单4</span>
  6. <span>菜单5</span>
  7. <span>菜单6</span>
  8. </div>

最终的渲染结果如图所示:



  1. 注:所有demo都加了样式,以方便观察。其中,父组件以灰色背景填充,子组件都以浅蓝色填充。

具名插槽

匿名插槽没有name属性,所以是匿名插槽,那么,插槽加了name属性,就变成了具名插槽。具名插槽可以在一个组件中出现N次。出现在不同的位置。下面的例子,就是一个有两个具名插槽单个插槽的组件,这三个插槽被父组件用同一套css样式显示了出来,不同的是内容上略有区别。

父组件:


  1. <template>
  2. <div class="father">
  3. <h3>这里是父组件</h3>
  4. <child>
  5. <div class="tmpl" slot="up">
  6. <span>菜单1</span>
  7. <span>菜单2</span>
  8. <span>菜单3</span>
  9. <span>菜单4</span>
  10. <span>菜单5</span>
  11. <span>菜单6</span>
  12. </div>
  13. <div class="tmpl" slot="down">
  14. <span>菜单-1</span>
  15. <span>菜单-2</span>
  16. <span>菜单-3</span>
  17. <span>菜单-4</span>
  18. <span>菜单-5</span>
  19. <span>菜单-6</span>
  20. </div>
  21. <div class="tmpl">
  22. <span>菜单->1</span>
  23. <span>菜单->2</span>
  24. <span>菜单->3</span>
  25. <span>菜单->4</span>
  26. <span>菜单->5</span>
  27. <span>菜单->6</span>
  28. </div>
  29. </child>
  30. </div>
  31. </template>

子组件:


  1. <template>
  2. <div class="child">
  3. // 具名插槽
  4. <slot name="up"></slot>
  5. <h3>这里是子组件</h3>
  6. // 具名插槽
  7. <slot name="down"></slot>
  8. // 匿名插槽
  9. <slot></slot>
  10. </div>
  11. </template>

显示结果如图:


可以看到,父组件通过html模板上的slot属性关联具名插槽。没有slot属性的html模板默认关联匿名插槽。

作用域插槽 | 带数据的插槽

最后,就是我们的作用域插槽。这个稍微难理解一点。官方叫它作用域插槽,实际上,对比前面两种插槽,我们可以叫它带数据的插槽。什么意思呢,就是前面两种,都是在组件的template里面写


  1. 匿名插槽
  2. <slot></slot>
  3. 具名插槽
  4. <slot name="up"></slot>

但是作用域插槽要求,在slot上面绑定数据。也就是你得写成大概下面这个样子。


  1. <slot name="up" :data="data"></slot>
  2. export default {
  3. data: function(){
  4. return {
  5. data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
  6. }
  7. },
  8. }

我们前面说了,插槽最后显示不显示是看父组件有没有在child下面写模板,像下面那样。


  1. <child>
  2. html模板
  3. </child>

写了,插槽就总得在浏览器上显示点东西,东西就是html该有的模样,没写,插槽就是空壳子,啥都没有。
OK,我们说有html模板的情况,就是父组件会往子组件插模板的情况,那到底插一套什么样的样式呢,这由父组件的html+css共同决定,但是这套样式里面的内容呢?

正因为作用域插槽绑定了一套数据,父组件可以拿来用。于是,情况就变成了这样:样式父组件说了算,但内容可以显示子组件插槽绑定的。

我们再来对比,作用域插槽和单个插槽和具名插槽的区别,因为单个插槽和具名插槽不绑定数据,所以父组件是提供的模板要既包括样式由包括内容的,上面的例子中,你看到的文字,“菜单1”,“菜单2”都是父组件自己提供的内容;而作用域插槽,父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前提下)。

下面的例子,你就能看到,父组件提供了三种样式(分别是flex、ul、直接显示),都没有提供数据,数据使用的都是子组件插槽自己绑定的那个人名数组。

父组件:


  1. <template>
  2. <div class="father">
  3. <h3>这里是父组件</h3>
  4. <!--第一次使用:用flex展示数据-->
  5. <child>
  6. <template slot-scope="user">
  7. <div class="tmpl">
  8. <span v-for="item in user.data">{{item}}</span>
  9. </div>
  10. </template>
  11. </child>
  12. <!--第二次使用:用列表展示数据-->
  13. <child>
  14. <template slot-scope="user">
  15. <ul>
  16. <li v-for="item in user.data">{{item}}</li>
  17. </ul>
  18. </template>
  19. </child>
  20. <!--第三次使用:直接显示数据-->
  21. <child>
  22. <template slot-scope="user">
  23. {{user.data}}
  24. </template>
  25. </child>
  26. <!--第四次使用:不使用其提供的数据, 作用域插槽退变成匿名插槽-->
  27. <child>
  28. 我就是模板
  29. </child>
  30. </div>
  31. </template>

子组件:


  1. <template>
  2. <div class="child">
  3. <h3>这里是子组件</h3>
  4. // 作用域插槽
  5. <slot :data="data"></slot>
  6. </div>
  7. </template>
  8. export default {
  9. data: function(){
  10. return {
  11. data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
  12. }
  13. }
  14. }

结果如图所示:

github

以上三个demo就放在GitHub了,有需要的可以去取。使用非常方便,是基于vue-cli搭建工程。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

开发过程中积累的CSS样式(持续更新)

seo达人

前言:平时写页面的时候有些样式使用完发现没过多久就忘记了,这篇文章主要是用来记录开发过程中容易忘记的CSS样式,与其总是去网上查,还不如一个一个记录下来,虽然说之前的都没有记录,但是知识的累积不论什么时候开始做都不会晚的。



首先 记录几个好用的插件网站:



layDate日期与时间组件: https://www.layui.com/laydate/

Vant移动端插件库: https://youzan.github.io/vant/#/zh-CN/intro

Element组件库: https://element.eleme.cn/#/zh-CN/component/installation

Vue.js框架: https://cn.vuejs.org/v2/guide/

Bootstrap框架: https://v2.bootcss.com/index.html

菜鸟教程官网: https://www.runoob.com/

w3school官网: https://www.w3school.com.cn/

下面是遇到的一些想累积的css样式:(内容会随时间累积的越来越多)



1、一个 div 中的内容实现上下滑动效果(而不是超出body的高以后上下滑动):overflow:auto;

简单的描述:body 中的一个 div 内,如果设置了固定的 height,而内容的总 height 超出了 div 的高,则超出的部分就会被覆盖,而想实现超出的部分变成滑动的效果而不被覆盖,则用 overflow:auto; 实现。



2、修改 前端框架封装好的css样式: border-radius: 20px!important;(注意使用英文的 ! 叹号)

简单的描述:在开发过程中经常使用一些前端框架(bootstrap,vue.js,laydate,Vant等等),在使用link导入css文件以后,发现有些css是在标签内使用内嵌的方式实现的,优先级最高,那么我们怎么修改呢?

比如:css文件中的边框弧度样式为10px:border-radius: 10px;

我们想改成20px,则在后面加上 !important 即可:border-radius: 20px!important;



这篇文章主要是以后回头复习或者忘记了的时候给我自己看的,但是如果恰好也帮助到了你,那是更加的有意义,在以后的开发过程中,该文章的内容一定会累积的越来越多

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

产品设计核心三要素

雪涛

先问一个问题:怎么样衡量一个设计好与不好?工作中实践越多次,越会发现华丽的设计稿并不是体现设计师专业能力的唯一标准。普通设计师和高级设计师区别在于,设计方案是否具备完整设计思路;设计对于业务有没有真正的价值体现;以及设计方案的推动落地的完整性到底有多少。设计越往后走,越考验产品思维,设计思维,以及设计推动能力。这是产品设计师需要关注的核心三要素。


设计师在工作中接到设计需求会不自觉的第一时间想着如何去进行视觉表达,视觉表达确实非常重要,也是公司对于设计师的核心价值的定位之一,但视觉表达只是其中设计专业本职工作中的一个环节。设计师还要应该能够站在产品、设计、技术等不同维度去思考设计方案的可行性。产品打磨-视觉呈现-落地执行,在这三个核心点里面设计师分别有不同的定位和价值所在。 


  一. 产品“双标”满足   

产品打磨包含产品规划,内容组成,界面布局,交互梳理等等…所有环节的工作是为了符合产品最终的目标。产品所有的能力会核心围绕两个点:1商业变现 2用户需求满足。这两个目标在产品执行的环节有时候会有一些冲突,在产品打磨阶段设计师通过怎样的方式,做到既满足产品商业目标又满足用户体验需求?可以按照以下几个步骤进行分析寻求切入点: 


Image title



这里用腾讯动漫付费模块举例说明: 项目背景是腾讯动漫产品要做付费体系升级设计,接到需求先有由产品源头一步步深入,逐步展开设计方案的规划。 


 01 产品目标确认  

通过对项目背景的解读和产品方案的深入了解,以及总结当前存在的一些问题,可以明确得到项目中产品核心目是什么。付费升级核心原因是付费转化低,用户付费意愿不够强烈。此次升级的核心目标是促进内容消费,提升付费率。 


Image title



 02 分析用户路径  

确认目标之后从哪个模块儿开始进行首要需要考虑的。对于现有现有功能的升级,建议核心从产品本身着手,可以根据用户行为分析,获取用户常规使用路径,找到用户使用场景下的核心目的,从而去挖掘用户在付费路径下的诉求点,根据诉求点找到付费升级的触点。这里我们罗列了用户阅读产品的路径。 

Image title



 03 观察用户核心需求是否被满足 

 用户在每个场景下都会有“痛点”和“痒点”。比如在阅读前,核心目是想快点看到漫画内容;阅读过程中,想要及时宣泄对漫画的故事情节的感受;阅读后,希望找到更多相关内容或者能够和内容有更多的互动。目前产品在这三个关键的路径节点都存在一些问题,阅读前对于付费缺乏正向引导,阅读过程中互相行为较少,阅读后没有更多延展内容可供消费等。 


Image title



 04 洞察设计切入点  

根据用户在阅读 “前 中 后” 关键路径的节点的不同情绪反馈,我们可以做出找到相应情感满足切入点,并且制定解决方案 


Image title



 05 制定设计方案  

将之前找到的设计情感切入点用交互和视觉的形式呈现出来,尽可能完整的表达清晰。下面展示是关于付费升级优化的完整视频DEMO。整个方案采用趣味情感化形式为核心设计思路,逐步去引导用户付费。让用户在趣味互动中完成产品的商业转化目标。 


https://v.youku.com/v_show/id_XNDM0NDg1MzY2MA==.html


 二. 设计呈现的“差异化”   

视觉呈现是设计师们都比较擅长的工作,但不同专业高度要求下方案最终呈现出的效果是完全不一样的。好的设计方案,需要在设计上做出明显的“差异化”,这里的差异化是指要区别于常规输出一般的水平。差异化的可以从多个点入手:


Image title



优质的设计美感

美感是作为设计师首先需要培养的技能之一,也是在后续职业生涯的一直需要用到的技能。设计师被神职化的很大一个原因就是因为设计师的美感比一般人要好,有懂得欣赏美、鉴别美、以及创造美的能力。单一从视觉层面,设计作品是合格品还是精品,最终取决于画面的精美程度。项目不分大小,再小的一个项目都可以做出精致品质,这也是体现设计师专业度的核心衡量之一。


Image title



完整设计思路:

设计方案的完整性也能够很好的设计师专业度的差异化,几张图的设计稿和一个有完整设计思路的设计方案在品质上自然是明显差别的。设计师不光需要将设计呈现出来,更需要有严谨的设计思路并且表达出来让受众到你的设计想法。设计前期分析、中期执行、后期落地以及迭代优化,能够让设计师有意识的锻炼和提升自己的设计思维,对于设计师能力提升有必然的帮助。 


Image title



独特创意:

设计差异化呈现上,创意是一个非常好的切入点。行业大趋势的前提下,现在同类产品越来越趋于同质化,受众使用产品的时候都会有一些常规认知,关于功能的、交互操作的、内容组成的等等,淘宝和京东、大众和美团、甚至QQ音乐和网易音乐在产品使用体验上都有高度重合的地方,这些已经在用户心智中形成习以为常的认知感受。如果能够在用户的常规认知里,用创意手法呈现出超出他们预期的内容使其惊喜,产品设计就会有明显差异化体现。 


Image title



善用情感化:

具备美感的设计能让作品看起来有高级感,但更为高级且有效的是能够引起用户情感共鸣的设计。设计是主观的,对于设计每个人都有自己的想法,也正是因为主观的设计感受,能让设计在情感化打造方面可以有很多的尝试方向。能够引起受众主观情感上的共鸣和认同的设计,会形成产品的核心记忆点之一。设计师对于情感化设计往往会有一些误区,认为图形可爱,色彩羡慕,动效流畅且能够形成一套视觉体系,就能够算情感设计。真正的情感设计是需要从用户角度出发,挖掘用户的认知领域和喜欢,从而去进行符合用户情感诉求的呈现。 


Image title


三. 方案推动的效能管理 

 

设计方案输出只是整个产品生产流程中的一个核心环节,产品上线后体验如何最终取决于落地实现的程度。在方案落地支持过程中,效率协调和实现能力是保证设计方案贯彻一致执行的关键因素:


 协作  

产品设计师工作协调分为内部协作和外部协作。内部协作即设计师之间的沟通协同,主要内容是如何保持设计语言一致性,除了制定设计规范,还可以建立公共控件库,线上调用。控件库能够使设计师协作无学习成本,设计师输出设计稿效率也能够大大提升,同时保一致性。


外部协作主要是和下游的技术同事直接的工作对接,设计方案的交接方式以及开发获取信息的效率很关键。在开发接收设计方案的时候,尽能力降低获取成本以及理解成本。比如设计稿的标注,在标注上设计师一般会花很长时间,开发也需要逐步查看,偶尔还会有标注遗漏的地方。我们团队会直接采用插件,设计稿及时同步,并且开发可以自己随时查看每个元素的标注信息,便捷。


这里推荐两款协调软件:一款是InVision可以在sketch里进行控件协同调用,所有想用的元素直接源文件调用,不需要再问同事要源文件!另一款是Zeplin技术同学可以直接查看元素属性以及间距等,设计师解放双手不再需要标注!


Image title



官网链接: 

https://login.invisionapp.com/auth/sign-in   

https://zeplin.io/


实现能力   

专业技术之间的壁垒,也会成为设计方案实现的阻力。同样的界面,设计人员用设计软件实现,技术人员用逻辑代码实现,实现的方式和成本存在很大的差异性,所以往往设计师认为很简单的需求在开发层面的确非常难实现。当然,不是所有需求都是无解的,设计师在技术实现层面还是可以做一些事情:


01 方案前置沟通

设计一个新的功能的时候,如果有非常规的设计方案,可以提前和技术人员沟通实现的难易程度,让技术人员有前期预判和预演的时间。并且,可以将设计做成简易DEMO方便技术人员快速理解,避免双方存在信息不对等的情况。


02 搭建开发控件库

开发控件库和设计规范一样,是最基础但应用最为频繁的模块儿。开发控件库可以将最基础的元素形成固有规范,所有开发实现都用同一套规范,以确保实现的高度一致性,同时也能够提升实现效率和设计还原。设计可以辅助开发一起制定开发控件库,确保控件库和设计规格的一致性。


03 寻求技术语言共通性

尽量将设计方案转化为技术能够理解和复用的形式进行对接。除了静态设计稿的标注,设计和技术实现最大的难点在于动态交互的实现上,对于动态设计,将设计方案转换为代码文件交付给技术实现,这样能确保功能的正常实现同时减少后期设计还原性的偏差。


以上初步总结的关于产品设计师在设计过程中从前期产品规划到中期设计执行再到后期开发落地应该注意的一些核心点:

第一条,设计方案既要满足产品目标又同时要兼顾用户体验;

第二条,优秀的设计师,会保持设计方案的“差异化”;

第三条,设计师职责除了确保设计方案完整性,更重要的是推动设计方案的完整落地。


在产品设计过程中,设计师需要关注还有很多关键点,这里也欢迎大家一起补充交流,正是这些关键点,将设计师的思维逐步打开,使其成为一个具有全链路思维的设计人才。 

文章来源:UI中国

JS--普通数字格式与会计金额格式之间的转换

seo达人

普通数字转会计金额格式(保留两位小数)

我们可以用数字的toLocaleString()方法将普通数字转为会计金额格式,但是这种方式无法保留两位小数(四舍五入),如果是整数或者小数长度只有一位的时候无法自动补0



例如:





思路:

利用toLocaleString()以及toFixed()先对数字进行一个转换得到最多保留了2位小数的金额,然后判断数字是为整数还是带有小数,如果带有小数则进行切割,判断小数长度为1时自动补0



// 普通数字转会计金额格式 第一种

    function toThousandsFormates(num) {

        // 判断传进来的数字是否为非空数字

       if (!isNaN(parseFloat(num))) {

            var reg = /./g

            var newNum = Number(Number(num).toFixed(2)).toLocaleString()

            // 判断转换后的数字是否带有小数

            if (reg.test(newNum)) {

                var numArr = newNum.split('.')

                // 判断小数点后数字长度为1,则自动补0

                numArr[1] = numArr[1].length === 1 ? numArr[1] + '0' : numArr[1]

                return numArr.join('.')

            } else {

                // 整数直接在后面补上0.00

                return newNum + '.00'

            }



        } else {

            return ''

        }

    }

    console.log(toThousandsFormates('0')); // 0.00

    console.log(toThousandsFormates('')); // ''

    console.log(toThousandsFormates(966)); // 966.00

    console.log(toThousandsFormates(966.3)); // 966.30

    console.log(toThousandsFormates(9669228.55)); // 9,669,228.55

    console.log(toThousandsFormates(96566.56954)); // 96,566.57



经过查阅资料后,发现toLocaleString()它里面自带属性可以检查到最少保留了几位小数,不够自动补0,这样我们上面的代码其实可以更加简单,如下:

// 普通数字转会计金额格式 第二种

function toThousandsFormates2(num) {

    // 判断传进来的数字是否为非空数字

    if (!isNaN(parseFloat(num))) {

        var newNum = Number(Number(num).toFixed(2)).toLocaleString('zh', { minimumFractionDigits: 2 })

        return newNum



    } else {

        return ''

    }

}



console.log(toThousandsFormates2('0')); // 0.00

console.log(toThousandsFormates2('')); // ''

console.log(toThousandsFormates2(966)); // 966.00

console.log(toThousandsFormates2(966.3)); // 966.30

console.log(toThousandsFormates2(9669228.55)); // 9,669,228.55

console.log(toThousandsFormates2(96566.56954)); // 96,566.57



// 结果一模一样



会计金额格式转普通数字(利用正则)

// 会计金额格式转为普通数字

    function rMoney(num) {

        return parseFloat(num.replace(/[^\d\.-]/g, ''))

    }

    console.log(rMoney('96,566.57')); // 96566.57

    console.log(rMoney('966.30')); // 966.3

    console.log(rMoney('9,669,228.55')); // 9669228.55

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

交互手势的容错性和逻辑性

雪涛

交互手势是用户操作的重要部分,交互手势的设计好坏非常影响用户体验,那么,交互手势的设计上对于容错性和逻辑性需要注意什么?

随着用户体验被愈发的重视,更多的 APP 偏向于使用多手势优化用户的操作流程,降低使用阻力。

点击某个确定的按钮的手势操作虽然被普遍使用并被用户熟知,但是增加更快捷的手势操作可以大大增大操作热区,提高操作效率,如下图。

交互手势的容错性和逻辑性

然而,我们可以发现由于不同产品的设计师对于用户体验的理解不同、交互层面的思考不同,导致设计的交互手势也不同。

有时同一种操作在不同的 APP 中交互手势也是不统一的,这无疑增加了用户的学习成本和记忆成本。

举个例子,iOS 端的得到和有书的播放页的打开和关闭方式。

得到有两种方式打开和关闭页面,用户可以通过点击控件或上滑控件打开播放页,通过点击收起按钮或下拉页面关闭播放页。但是有书只有一种方式打开和关闭,用户只能通过点击控件打开播放页,通过点击返回图标关闭播放页。

这让习惯了使用得到的我去使用有书时,感觉非常别扭,每次都尝试用得到的手势去操作但是都失败了,失败后我下一次并没有记住仍然用手势去操作,如此反复令我相当沮丧。

交互手势的容错性和逻辑性

容错性

容错性是一个很大的话题,今天我们仅仅在交互手势层面上讨论。

上面的例子中,有书并没有设计滑动手势去打开和关闭播放页,那么我以我的经验去进行的滑动滑操作在有书这个产品中就是错误的和不被产品识别的。但是这种手势又广泛存在于大量的音频播放 APP 中,如喜马拉雅、荔枝 FM 等。

一旦用户从这些 APP 迁移到了有书,本来养成的操作习惯在有书就失效了,用户就会感觉“这个 APP 很难用,用起来很不舒服”,进而可能放弃有书转而投向其他产品怀抱。

与手势设计类似,这也是为什么现在的同种类型的 APP 的信息架构设计越来越同质化,当我们打开淘宝、天猫、京东时我们有时感觉就像是同一个 APP ,本质上也是为了降低用户的迁移、记忆和学习成本。

如下图所示,提高手势的容错性对用户的意义。

交互手势的容错性和逻辑性

很多优秀的产品考虑到了上述问题,设计了多手势来优化用户体验。

举个例子,在 APP Store 的首页点击一个推荐卡片后进入详情页,由于详情页是直接由卡片放大转场的,不同于传统的新页面右侧进入和从底部弹出。

在用户的使用习惯和认知中新页面如果从右侧进入就可以通过右滑返回,从底部弹出的话就可以下拉返回。因此,当用户面对卡片放大进入新页面这种全新交互时可能会疑惑如何返回,对此理解不同的用户可能会尝试右滑,也可能尝试下拉。

APP Store 的设计在此就有很好的容错性,用户可以通过三种方式返回首页,分别是、右滑返回、下拉返回和点击叉号返回,这不但降低了用户的记忆和学习成本,也便于不同习惯的用户使用。

交互手势的容错性和逻辑性

针对不同的场景,手势的使用也会有不同。

一个很好的案例是知乎的评论:知乎的评论的关闭方式有三种,分别是下拉、右滑和点击叉号。

用户观看评论的场景有两种,第一种是只想看一下精选评论然后关闭,第二种是被评论吸引后一直往下看。当用户单手操作不方便点击叉号时,下拉对应的是第一种用户;右滑对应的是第二种用户,不管用户看了多少屏的评论,随时可以通过右滑关闭评论(因为用户翻阅了很多屏评论后需要下拉到第一条评论时,下拉关闭评论手势才会生效,所以第二种用户一般不使用下拉去关闭评论)。

可能你会心生疑惑:“第一种用户也可以使用右滑来关闭评论呀”,确实可以,但是对于人的操作习惯来说,上下滑动会比左右滑动更方便。

交互手势的容错性和逻辑性

还值得讨论的是苹果自 iPhone 6s 开始加入的新交互方式 3D Touch,它允许用户通过更大力度的重按呼出情景菜单快捷地使用高频功能而不用先打开 APP,对于追求效率的用户来说简直不要更方便,但是对于不支持 3D Touch 的机型则无法使用情景菜单。

因此,在生活中我发现这样的现象,很多使用惯了3D Touch 的用户换到无 3D Touch 的苹果机型后很不习惯,总是尝试去重按但是是无效的。

其实在很多安卓手机上也有情景菜单这一功能,它巧妙地将卸载也加到了情景菜单中,因此用户只需要通过长按就可以获得所有需要的功能,而不是像苹果那样长按是卸载而重按是情景菜单。

我猜测苹果为了适配所有机型,提高容错性,从今年的发布会的 iPhone 11 和iPhone 11 pro 开始,取消了 3D Touch,转而使用 Haptic Touch (有震动反馈的长按)代替。当你长按某个图标时,感受到震动后松开,即可呼出二级菜单;如果震动后仍不松开,则进入到卸载 APP 时的抖动状态,使得之后的即使不支持 3D Touch的机型可以使用便捷的情景菜单了。

对于不支持 3D Touch 的老款机型会不会在 iOS 13 更新后也可以使用 Haptic Touch 呢?

如果一致统一的话,容错性将大大提高,我们将拭目以待。

不仅仅是 iOS ,Android 的版本 Android 10经历了 6 个测试版迭代后正式发布,我们发现交互手势是 Android 10 的一个巨大亮点。Android 10 在第三版内测系统开始引入全局手势操作,用户启用后,屏幕底部便不会再出现虚拟按键和导航栏,只会剩下一个指示条,上滑返回主屏、侧滑返回上一层的操作逻辑也均和 iOS 保持一致。

这可能标志着安卓手机一直以来在国内各家厂商的各种创新手势的割裂生态中即将重归统一,并和 iOS 保持一致。

这种妥协将大大提高在用户使用一款新安卓手机时的容错性,同时降低了今后用户在两大系统之间的迁移成本。

逻辑性

再谈谈逻辑性,在交互手势的层面上,如果用户能够通过某个手势进行某个操作后,按照逻辑,用户也可以通过反向的手势或对应的手势进行逆向操作。

比如,在微信首页下拉调出小程序页面,之后可以通过上拉返回首页。点击加号呼出更多操作,再次点击加号收起更多操作。

如果违背了用户的心理模型和逻辑性,用户就会感觉到混乱和不适。

这里举一个反例, Uki 的个人主页可以通过点击或下拉底部的固定底板收起更多信息,但是收起后只能通过点击展开更多个人信息而不能上拉,不符合逻辑与用户的心理模型。

交互手势的容错性和逻辑性

如下图所示,逻辑性对用户的意义。

交互手势的容错性和逻辑性

有的时候,我们会发现为了提高容错性,我们会牺牲一部分逻辑性。

就像上文提到的知乎关闭评论弹出框,逻辑上它是从底部弹出的,但是不但能够下拉关闭还可以右滑关闭。尽管右滑关闭有些违背用户的心理模型,但是确实给用户带来了很多操作上的便捷。

如何设计

1. 是否需要加入多手势操作的考虑因素

我们需要考虑的因素包括使用频率、危险程度和特殊体验。

  1. 使用频率:当一个功能的使用频率足够高时,我们加入多手势操作去提高用户操作效率才是有意义的。一个低频的功能的特殊手势操作很容易被用户遗忘。
  2. 危险程度:如果一个操作不可撤销且存在危险性质,我们最好不要加入多手势操作。此时我们需要用户更加专注,如果加入多手势操作可能会增加误操作的概率。
  3. 特殊体验:当我们需要加入特殊的模拟体验时,此时我们可以加入多手势操作。如探探左滑无感右滑喜欢,给用户带来的“翻牌子”感觉是点击操作无法替代的。QQ 阅读下拉拟物绳灯进行日间和夜间模式切换,这种存在我们记忆中的交互方式能够唤起我们的情感。

2. 评估所选手势的考虑因素

1)考虑不同平台的硬件系统和操作系统特性

由于硬件与操作系统差异,iOS 系统支持很多手势,但是安卓系统在手势支持方面就不如 iOS 丰富。

安卓硬件设备的差异比较大,不同安卓手机厂商会在安卓系统的基础上自定义系统的手势操作,因此对于手势的支持也有较大的差异。对于这种情况我们需要熟悉相应平台的规范,做到心中有数。

2)考虑所选的手势的学习成本和记忆成本,用户是否已经被教育

如下图所示,尽管设备支持的手势数量多不胜数,但是日常使用 APP 时,大部分用户习惯使用的手势很少,比如单击、双击、滑动、上拉、下拉、双指扩张和收缩等。除此之外的手势教育成本和学习成本很高。

一般比较通用的功能是没有必要在此处创新的,但是如果一些特殊的操作确实需要加入时,我们就需要考虑下面的问题。

交互手势的容错性和逻辑性

a. 如果没有教育成熟,考虑加入教学或搭配简易的操作方式

对于我们需要加入的手势操作当前用户并未被教育成熟时,我们需要考虑加入手势教学,具体的手势教学类型下一部分会详细讨论。

然而,大部分情况下用户的记忆是短期的,教学内容可能会被快速遗忘,下次用户使用 APP 时仍然不会使用特殊手势。此时我们应该将一些比较难以记忆的手势操作搭配一个简单的手势操作。

比如 QQ 阅读的下拉拟物绳灯切换夜间模式的手势操作设计,其考虑到了有些用户在现实生活中并未见过拟物绳灯,并不知道是要进行下拉才能触发操作。因此,QQ 阅读贴心地搭配了一个简单的点击操作,用户通过点击绳灯也可以切换夜间模式,如下图。

交互手势的容错性和逻辑性

b. 考虑所选手势是否可能导致冲突和误操作,如果导致了,考虑如何避免和折中

最常见的手势冲突情况就是 APP 的手势与操作系统的全局手势冲突。

解决方案有两个,一是避免设计与全局手势一致的手势操作,例如 iOS 的在屏幕边缘右滑返回、全面屏机型的底部上滑退出应用等全局手势操作;二是仍然设计与全局手势冲突的操作,但是将全局手势部分禁用或以其他的方式区分开。

如下图有书播放页的案例,由于进度条滑动控件过于靠左,导致使用 iOS 全局右滑返回手势时有时会产生误操作,即本来想要右滑返回却不小心滑动了进度条。

这种情况下我们可以标注一个右滑手势禁用区域给开发工程师说明情况,将此情况避免掉即可。

交互手势的容错性和逻辑性

误操作指的是,我们设计的手势操作与 APP 内的其他操作或系统全局手势操作接近导致用户触发了非预期的操作。比如 iOS 端的知乎被吐槽的一个右滑返回手势操作,经过研究发现,由于 iOS 端的知乎在浏览回答的页面设计的右滑返回的热区过大,导致用户上滑浏览的时候如果手指的滑动角度变化幅度过大一不小心就触发了右滑返回,再次进入回答后又需要翻页很久才能找到之前离开的地方,很影响体验。

我觉得知乎可以减少热区,将热区调整为 iOS 全局的右滑返回区域即可,如下图所示。

当然,产品设计需要平衡与取舍,如果减少了热区是否会影响其他用户的体验还需要考虑和调研,两者并无绝对的对错

交互手势的容错性和逻辑性

3. 让用户了解并使用新手势

当新手势无法直接让用户感知时,我们需要加入一些手势教学帮助用户快速上手使用。

1)手势教学方式

a. 浮层和动画引导使用静态或动态的手势图片或气泡示例告诉用户使用哪种手势进行操作

相比于静态,动态比静态更为直观和易学。

交互手势的容错性和逻辑性

b. 内容隐喻通过微妙的视觉线索暗示用户此处可以通过某种手势进行操作

由于教学内容难免具有干扰性,对于高级用户来说是不必要的,但是对于初级用户又是必要的,因此以这种内容暗示的方式使教学极为轻量化,在低干扰的情况下使得用户学习了手势操作。

如下图,哔哩哔哩在打开第一篇文章时会平移显示下一篇文章的框架,暗示用户可以通过左右滑动切换文章。

再比如陌陌在打开点点功能时,会在用户进入页面的时候播放一个动画,暗示有很多卡片叠加在了一起,用户可以通过滑动切换卡片。

交互手势的容错性和逻辑性

2)教学的出现时机

a. 操作前当产品中设计了不容易感知的新手势,在用户操作前,通过教学让用户了解和学习新的手势。

b. 错误操作后对于一些与用户的心理模型和习惯不一致的手势,提前预测用户可能输入的错误手势,在用户错误操作后进行提示,规范用户的操作方式。

如下图,由于知乎旧版本是通过左右滑动切换回答的,新版本调整为上下滑动后,需要纠正用户使用习惯。因此,当用户仍然使用左右滑动时,会出现浮层提示用户正确的手势进行教学。

交互手势的容错性和逻辑性

结语

以上是日常思考和总结,有不恰当之处欢迎指出。希望本文在大家进行手势设计的过程中能够帮助做出合理的决策。

文章来源:人人都是产品经理 

nginx配置rewrite的用法详解

seo达人

文章目录

rewrite在if中的用法

rewrite中break和last的用法

1.break和last在location{}外部时

2.break和last在location{}内部时

3.break和last用法总结

return的用法

rewrite的语法规则

rewrite应用实例

1.域名跳转(域名重定向)

2.http跳转https

3.跳转二级目录

4.动静态请求分离

5.防盗链配置

6.伪静态(将静态页面重写为动态)

7.多个if并用

rewrite在if中的用法

格式:if (条件判断) { 具体的rewrite规则 }



if条件判断语句由Nginx内置变量、逻辑判断符号和目标字符串三部分组成。

其中,内置变量是Nginx固定的非自定义的变量,如,$request_method, $request_uri等。

逻辑判断符号,有=, !=, ~, ~, !~, !~

!表示相反的意思,~为匹配符号,它右侧为正则表达式,区分大小写,而~为不区分大小写匹配。

目标字符串可以是正则表达式,通常不用加引号,但表达式中有特殊符号时,比如空格、花括号、分号等,需要用单引号引起来。

1

2

3

4

5

示例1:当http请求方法为post时,返回403状态码



if ($request_method = POST)

{

    return 403; 

}

1

2

3

4

示例2:通过浏览器标识匹配关键字,禁止IE浏览器访问



if ($http_user_agent ~
MSIE) 

{

    return 403;

}

1

2

3

4

限制多个浏览器:



if ($http_user_agent ~ "MSIE|firefox|Chrome")

{

    return 403;

}

1

2

3

4

示例3:当请求的文件不存在时,进行重定向或return状态码等处理操作



if(!-f $request_filename)

{

    rewrite 语句;

}

1

2

3

4

示例4:判断uri中某个参数的内容



if($request_uri ~
'gid=\d{6,8}/') 

{

    rewrite 语句;

}

1

2

3

4

\d表示数字,{6,8}表示数字出现的次数是6到8次,当uri中gid参数的值包含6-8个数字那么执行rewrite语句



rewrite中break和last的用法

两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite、return指令)。



1.break和last在location{}外部时

测试示例:



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;



    rewrite /1.html /2.html;

    rewrite /2.html /3.html;

}

1

2

3

4

5

6

7

8

请求1.html文件时,会被重定向到2.html,然后被重定向到3.html,最后返回的文件为3.html



示例1:在rewrite 指令后面添加break



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;



    rewrite /1.html /2.html break;

    rewrite /2.html /3.html;

}

1

2

3

4

5

6

7

8

请求1.html文件时,会被重定向到2.html,然后直接返回2.html,break在此处的作用就是当匹配第一个rewrite指令成功时,不执行后面的rewrite指令



示例2:当break后面还有location{}的情况



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;



    rewrite /1.html /2.html break;

    rewrite /2.html /3.html;

    location /2.html {

        return 403;

    }

}

1

2

3

4

5

6

7

8

9

10

11

请求1.html文件时,会返回403状态码,当1.html被重定向到2.html时,break不会匹配后面的rewrite规则,但条件2.html匹配location{}定义的文件2.html,所以会执行return 403


以上两个示例中,将break换成last效果一样



2.break和last在location{}内部时

测试示例:



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;

    

    location / {

        rewrite /1.html /2.html;

        rewrite /2.html /3.html;

    }

    location /2.html

    {

        rewrite /2.html /a.html;

    }

    location /3.html

    {

        rewrite /3.html /b.html;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

请求1.html,会经过两次重定向到3.html,3.html又刚好匹配location /3.html{},所以返回b.html,当请求2.html时,会直接返回a.html,因为location /2.html {} 更精准,优先匹配



示例1:在rewrite后面添加break



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;

    

    location / {

        rewrite /1.html /2.html break;

        rewrite /2.html /3.html;

    }

    location /2.html

    {

        rewrite /2.html /a.html;

    }

    location /3.html

    {

        rewrite /3.html /b.html;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

请求1.html,会返回2.html,不会返回a.html,当break再location {} 内部时,遇到break后,当前location{} 以及后面的location{} 的指令都不再执行



示例2:在rewrite后面添加last



server{

    listen 80; 

    server_name test.com;

    root /data/wwwroot/test.com;

    

    location / {

        rewrite /1.html /2.html last;

        rewrite /2.html /3.html;

    }

    location /2.html

    {

        rewrite /2.html /a.html;

    }

    location /3.html

    {

        rewrite /3.html /b.html;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

请求1.html时,会返回a.html,在location {} 内部遇到last,当前location {}中剩下的指令不会再执行,但被重定向的url会重新匹配一遍location {}



3.break和last用法总结

1.当rewrite规则在location{}外,break和last作用一样,遇到break或last后,其后续的rewrite/return语句不再执行。但后续有location{}的话,还会近一步执行location{}里面的语句,前提是请求能匹配该location

2.当rewrite规则在location{}里,遇到break后,本location{}与其他location{}的所有rewrite/return规则都不再执行

3.当rewrite规则在location{}里,遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次从头匹配所有location



return的用法

该指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return后面的所有nginx配置都是无效的,可以使用在server、location以及if配置中,除了支持跟状态码,还可以跟字符串或者url链接。



示例1:直接返回状态码



server{

    listen 80;

    server_name www.test.com;

    return 403;

    rewrite www.test.net;  

}

1

2

3

4

5

6

访问时,直接返回403状态码,return返回内容后,后面的配置rewrite不会执行



示例2:当return在if 判断中时



server {

.....



if ($request_uri ~ ".password|.bak")

{

    return 404;

    rewrite /(.*) /index.html;  

}

.....

}

1

2

3

4

5

6

7

8

9

10

请求的文件包含.password或.bak时,直接返回404,rewrite不会执行,但if {}外的配置会继续执行,return只在当前作用域中生效



示例3:返回字符串



server{

    listen 80;

    server_name www.test.com;

    return 200 "hello";

}

1

2

3

4

5

返回字符串必须加上状态码,否则会报错



示例4:返回nginx变量



location /1.html {

    return 200 "$host $request_uri";

}

1

2

3

示例5:返回url



server{

    listen 80;

    server_name www.test.com;

    return http://www.test.com/index2.html;

}

1

2

3

4

5

返回url时,必须以http://或https://开头



示例6:返回html代码



if ($http_referer ~ 'baidu.com') 

{

    return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";

}

1

2

3

4

当网站被黑了的时候,从百度点进网站是链接都会跳转到其他网站,可以使用该方法暂时处理

注意:return http://$host$request_uri; 在浏览器中会提示"重定向的次数过多"



rewrite的语法规则

格式:rewrite regex replacement [flag]



rewrite 配置可以在server、location以及if配置段内生效



regex 是用于匹配URI的正则表达式,其不会匹配到$host(域名)



replacement 是目标跳转的URI,可以以http://或者https://开头,也可以省略掉$host,直接写$request_uri部分



flag 用来设置rewrite对URI的处理行为,其中有break、last、rediect、permanent,其中break和last在前面已经介绍过,rediect和permanent的区别在于,前者为临时重定向(302),而后者是永久重定向(301),对于用户通过浏览器访问,这两者的效果是一致的。

但是,对于搜索引擎爬虫来说就有区别了,使用301更有利于SEO。所以,建议replacemnet是以http://或者https://开头的,flag使用permanent。



示例1:域名跳转



location / {

    rewrite /(.*) http://www.test.com/$1 permanent;

}

1

2

3

.*为正则表达式,表示uri,用()括起来,在后面的uri中可以调用它,第一次出现的()用$1调用,第二次出现的()用$2调用,以此类推。



示例2:域名跳转的第二种写法



location / {

    rewrite /. http://www.test.com$request_uri permanent;

}

1

2

3

示例3:文件跳转



server{

    listen 80;

    server_name www.test.com;

    root /data/wwwroot/test.com;

    index index.html;

    if ($request_uri !~ '^/web/')

    {

        rewrite /(.
) /web/$1 redirect;

    }

}

1

2

3

4

5

6

7

8

9

10

将uri请求的文件重定向到web/目录中去寻找



错误写法1:



server{

    listen 80;

    server_name www.test.com;

    root /data/wwwroot/test.com;

    index index.html;

    rewrite /(.*) /web/$1 redirect;

}

1

2

3

4

5

6

7

这样写会反复循环,直到浏览器最大循环限制次数,哪怕uri包含web/目录了,也会继续重定向/web/web/$1



错误写法2:



server{

    listen 80;

    server_name www.test.com;

    root /data/wwwroot/test.com;

    index index.html;

    rewrite /(.*) /web/$1 break;

}

1

2

3

4

5

6

7

添加break后不会导致循环,但如果uri中包含web/目录的情况下也会被重定向一次,重定向后的uri就是web/web/$1



rewrite应用实例

1.域名跳转(域名重定向)

单个域名的情况:



server{

    listen 80;

    server_name www.test.com;

    rewrite /(.) http://www.test.net/$1 permanent;    

}

1

2

3

4

5

多个域名的情况:



server{

    listen 80;

    server_name www.test.com www.test.net;

    if ($host != 'www.test.net')

    {

        rewrite /(.
) http://www.test.net/$1 permanent;

    }

}

1

2

3

4

5

6

7

8

2.http跳转https

server{

    listen 80;

    server_name www.test.com;

    rewrite /(.) https://www.test.com/$1 permanent;

}

1

2

3

4

5

3.跳转二级目录

server{

    listen 80;

    server_name bbs.test.com;

    rewrite /(.
) http://www.test.com/bbs/$1 last;

}

1

2

3

4

5

4.动静态请求分离

server{

    listen 80;

    server_name www.test.com;

    location ~ ..(jpg|jpeg|gif|css|png|js)$

    {

        rewrite /(.*) http://img.test.com/$1 permanent;

    }

}

1

2

3

4

5

6

7

8

假设www.test.com的服务器在国外,访问速度较慢,img.test.com的服务器在国内,访问速度正常,可以将访问www.test.com静态文件的请求重定向到img.test.com,提高文件返回速度



第二种写法:



server{

    listen 80;

    server_name www.test.com;

    if ( $uri ~ 'jpg|jpeg|gif|css|png|js$')

    {

        rewrite /(.
) http://img.test.com/$1 permanent;

    }

}

1

2

3

4

5

6

7

8

5.防盗链配置

server{

    listen 80;

    server_name www.test.com;

    location ~ ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$

    {

        valid_referers none blocked server_names
.test.com

        if ($invalid_referer)

        {

            return 403;

        }

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

配置防盗链避免别的网站引用www.test.com不想被引用的图片等文件



http_referer表示从哪儿点击进网站的,比如从百度搜索引擎访问的

valid_referers:白名单

invalid_referer:无效的(未在白名单中定义的)

none:允许referer为空(也就是允许直接访问,未从其他站点跳转的请求)

blocked:允许来源地址不含http/https



6.伪静态(将静态页面重写为动态)

location /  {

    rewrite ^([^.])/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;

    rewrite ^([^.]
)/forum-(\w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;

    rewrite ^([^.])/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;

    rewrite ^([^.]
)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;

    rewrite ^([^.])/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;

    rewrite ^([^.]
)/(fid|tid)-([0-9]+).html$ $1/index.php?action=$2&value=$3 last;

}

1

2

3

4

5

6

7

8

示例为discuz的伪静态配置



7.多个if并用

location /{

    set $a 0;

    if ($document_uri !~ '^/abc')

    {

        set $a "${a}1"; #uri不以/abc开头时,$a的值变为01

    }

    if ($http_user_agent ~ 'ie6|firefox')

    {

       set $a "${a}2"; #浏览器标识包含ie6或者Firefox时,$a的值变为012

    }

    if ($a = "012") #当满足前两个if判断时,重写url

    {

        rewrite /(.
) /abc/$1 redirect;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

nginx配置文件语法不支持if嵌套,需要通过多个if并用判断时,使用标识变量值的方式处理



蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

中台是什么?听听大咖的看法

雪涛

历史上的每一次变革,都是从一小部分人的率先觉醒开始的。互联网时代的变革日新月异,更需要时刻洞察局势,未雨绸缪。


我们筹办了【蓝湖做东】的线下活动,邀请行业大咖们齐聚论道,碰撞智慧的花火,追寻潮流的轨迹。

本期嘉宾


(按发言顺序)



此外,感谢不愿透露姓名的神秘大咖们莅临现场!


话题背景


阿里巴巴集团在 2015 年首次提出“大中台、小前台”的战略,此后,腾讯、百度、京东、美团、滴滴等互联网巨头纷纷效仿,一时间“中台”引发互联网行业的刷屏热潮。


说到中台,不得不提到芬兰的游戏公司 Supercell ,仅有 300 名员工,却接连推出爆款游戏,成为当时全球最会赚钱的明星游戏公司,马云带队参观这家公司半年之后,阿里集团开始组建 " 大中台,小前台 " 的组织和业务体制。


2015 年年中,马云带领阿里巴巴集团高管,拜访了位于芬兰赫尔辛基的移动游戏公司 Supercell。


Supercell 当时号称是世界上最成功的移动游戏公司,Supercell 由 6 名资深游戏开发者在 2010 年创立,旗下拥有《部落冲突》、《皇室战争》、《海岛奇兵》和《卡通农场》这四款超级现象级产品。Supercell 是一家典型的以小团队模式进行游戏开发的公司,以 2 到 5 个员工、最多不超过 7 个员工组成独立的开发团队,称之为 Cell ( 细胞 ) ,这也是公司名字 Supercell (超级细胞)的由来。


团队自己决定做什么样的产品,然后最快时间推出产品公测版,看看游戏是否受用户欢迎。如果用户不欢迎,迅速放弃这个产品,再进行新的尝试,期间几乎没有管理角色的介入。团队研发的产品失败后,不但不会受到惩罚,甚至还会举办庆祝仪式,以庆祝他们从失败中学到了东西。


这种模式让 Supercell 公司成为了年税前利润 15 亿美金的游戏公司,2016 年 6 月,腾讯以 86 亿美元收购了员工数不超过 200 人的 Supercell 公司 84.3% 的股权,每一名员工人均贡献的估值超过 3.54 亿人民币。


Supercell 的成功很大原因就在于其的 " 部落 " 组织策略。在 supercell 仅有的 100 多人中,被分成若干个小前台组织,每个小组虽然人不多,但都包含了做一款游戏需要的所有人才。


本来就不大的公司被分成若干个小组,这样做的好处是可以快速决策,快速研发,快速把产品推向市场,而游戏引擎、服务器等后台基础则不需要操心。


Supercell 的模式给参加此次拜访的阿里高管们很大的震撼,在大家反复的心得交流和讨论中,一个非常重要的问题引起了很多人的反思:信息时代的公司架构到底应该是怎样的?


正是有了这次拜访才真正让阿里巴巴的领导层有了足够的决心要将组织架构进行调整,在此次拜访的半年后,阿里集团 CEO 逍遥子发出内部邮件,组织架构全面升级,建设整合阿里产品技术和数据能力的强大中台,组建 " 大中台,小前台 " 的组织和业务体制。


阿里中台
所谓的 " 中台 ",并不是阿里巴巴首先提出的词语,从字面意思上理解,中台是基于前台和后台之间。阿里通过多年不懈的努力,在业务的不断催化滋养下,将自己的技术和业务能力沉淀出一套综合能力平台,具备了对于前台业务变化及创新的快速响应能力。阿里人将 " 中台战略 " 形象地比喻成陆海空三军立体化协同作战。


海陆空协同作战
他们将中台分为六类,分别对应不同兵种:

业务中台,提供重用服务,例如用户中心、订单中心之类的开箱即用可重用能力,为战场提供了空军支援能力,随叫随到,威力强大;
数据中台,提供数据分析能力,帮助从数据中学习改进,调整方向,为战场提供了海军支援能力;
算法中台,提供算法能力,帮助提供更加个性化的服务,增强用户体验,为战场提供了陆军支援能力,随机应变,所向披靡;
技术中台,提供自建系统部分的技术支撑能力,帮助解决基础设施,分布式数据库等底层技术问题,为前台特种兵提供了精良的武器装备;
研发中台,提供自建系统部分的管理和技术实践支撑能力,帮助快速搭建项目、管理进度、测试、持续集成、持续交付,是前台特种兵的训练基地;
组织中台,为项目提供投资管理、风险管理、资源调度等,是战场的指挥部,战争的大脑,指挥前线,调度后方。
2018 年双 11,阿里又一次实现了一次壮举,在 2135 亿的背后,在令人骄傲的战绩背后,缺少不了阿里中台铁军发挥的巨大力量。
(资料来源于 ZAKER)


活动现场

北京的院子驰名中外,坐落在北京孔庙旁边的一处小院尤其别致,相对封闭的院子中,坐落着透明的玻璃房子。四面围合却有开阔的视野,兼具隐秘性与舒适感。【蓝湖做东】首期聚会在这里悄然开始。


特邀嘉宾们纷至沓来,不约而同地坐到了向阳的落地窗前,伴随着初秋的清风和暖阳,一场以中台为主题的讨论,徐徐展开。


影响着行业的大咖们,是如何被中台影响的呢?让我们拭目以待。


服务过阿里大文娱的高级交互设计专家朱斌,离中台最近,他率先发言。


在阿里大文娱,我注意到整个内容行业的资源非常依赖于导演和演员。


如果没有流量明星或知名导演,那这个作品票房十有八
九都不好,所以可以看到中国的电影宣传几乎都是明星脸。而国外就截然不同,国外更加依赖于编辑和 IP。并且以一套极为成熟和的生产模式批量化创造出大量优质的影视作品。像流水线一样生产出不同风格的流量大片。


当内容成为商品的时候,如何判断一个内容的传播价值,就成为问题。


我们为此建立了一个团队,专门来研究注意力管理,让不同层次的用户第一时间看到内容就能进行一系列快速判断,而且这个判断还要符合人类的思维结构。


简单来说我们想用体验的方式去把复杂的内容和故事进行具象化,在第一时间让用户看到、看懂,并激发出观看的兴趣。


这个构思在运作的过程中面临很多问题。


比如,设计师们如何快速从影视作品中提取有效信息,如果有个片子 50 集,要判断它的价值,要看完 50 集吗?影视作品体量那么大,没有那么多设计师把所有内容都过一遍。


最终,我们提出了“中台”这个设想,我们试图找到一种即又符合逻辑,同时符合用户体验的方式。把内容进行体验层面的归类和细分,提取共有特性,预判用户在不同类别中的兴趣和喜好。进而提升内容平台的商业价值和分发效率。


商业行为的本质就是榨取剩余价值。


榨取剩余价值的基本条件,就是降本增效——用更少的时间、更少的人力成本,做出一样多的事情。我们使用蓝湖这样的工具就是为了提效,这也是各大企业争相构建中台的原因之一。


设计行业比较偏向创意,和其他行业的中台有所不同,在座各位都是各行各业的大咖,我想借此机会听听大家对中台的理解和运用,大家就自己所面临的问题找找解决方案。


聚美优品也正在构建“电商中台”,苏星就此阐述了自己的观点:


大家都认为聚美优品是一个电商企业,其实内部已经逐步转变成了一个类投行的企业,不仅收购一些颇具潜力的项目,也孵化内部的一些项目。


中台与每个公司的业务形态相关,如果公司是产品驱动的,它的中台搭建就会侧重于更的提供各种功能性服务;如果产品比较单一、功能比较单一、市场比较下沉、类目比较垂直的话,那中台的概念可能是一个伪命题。


聚美优品近年来致力于寻找新的经济增长点,这是老牌上市公司必然经历的一个阶段。所以,公司对具有创造力的岗位或团队给予很多的支持,但很多创意都是天马行空想出来的,当一个产品或项目到设计部门的时候,我们需要判断其成功的路径是什么。我理解的,这就是一个中台。如果是设计中台的话,它需要完成一个任务,保证效果。


中台可能是一个宏观的状态概念和一个微观的具体操作层面的重合,我所说的设计中台,更偏向于设计管理上的中台思维,它是一个驱动力,可以灵活地组建很多模块,然后不断去自由匹配,从而支持一些功能。




阿里大文娱的朱斌接过话题,补充了一些看法:



产品设计行业具有特殊性,如何把产品设计理念和产品设计原则,通过数据整合,与设计需求靠近,是个难题,也是阿里的中台一直在努力解决的问题。


关于中台,我想提出两个点:中台的特性,中台对产品设计行业是好是坏。


朱斌曾服务过的华为提出“让听得见炮火的人呼唤炮火”,这就是个人与中台之间配合的关系。这里“呼唤炮火”的人,就是产品设计师,他们奋战在一线,接触不同维度、不同领域的人,有特别强的洞察力,而提供“炮火”的就是中台能力。


阿里现在在做两件事,其一就是强大的设计格局,其二就是把所有设计职能进行了升级,把之前的视觉设计师、交互设计师和各种子类的设计师都统一成了三种类型:体验设计师、创意设计师、用户研究设计师。其中体验设计师大概占 60-70%,创意设计师占 20%,用户研究设计师大约 10%.


阿里的零售板块非常稳定,服务的几千万中小企业每天都会有海量的店铺、商品设计需求。所以体验设计团队制定了详尽的规范,而这些规范就是中台,设计师按照规范进行输出即可,甚至开了鹿班系统自动生产,这就相当于炮兵,指哪打哪,火力凶猛。


同时,我们会拓展第二曲线,通过创意设计师找方向。创意设计师的工作不一定能立即带来商业价值,但可以通过尝试,获取用户反馈的数据,由此做一些校准和拓展业务边界的工作。


所以中台能解决的问题,一定是稳定的,而创意相关的东西一定是变化的。所以,阿里提出“大中台、小前台”的战略。用中台去做效率实现盈利,用前台去做变化生成新的规范。


以我开篇提到的内容行业举例,时下流行的明星是随时变动的,但这些变化会产生一些规律,比如这些明星都有哪些共同特点,中台就能总结出这些变动的规律,整合出一套审美规范,当知道受众需要什么的时候,就可以根据中台提供的规范,由前台去寻找符合受众需求的内容。


这是一个相辅相成的过程,通过前台不断刺激用户去看新内容,后台可以通过反馈收集整合更多规范,再由这些规范支持前台更产出符合用户需求的内容。


阿里的设计中台大家都知道,就是鹿班智能设计平台,它是设计中台最有代表性的一个产品。鹿班诞生的背景,是由于电商平台得通过 Banner 做宣传,淘宝量级越做越大,设计师支撑不住巨大的需求,加上同类 Banner 转化率差别不大。


这就体现了需要做设计中台的几个前提:


其一,需求量特别大,不是靠人力能够解决的,或者靠人力解决的话,成本会特别高。


其二,设计质量要求不高,所要输出到的信息量较为固定。


其三,存在的生命周期特别短。像淘宝的推广,你每次打开都是不一样的东西。


有了这三个前提,就可以考虑做设计中台。


就此,又产生一个疑问,以前的那么多设计师是不是就没活干了?


并不是这样的。


阿里提出“重新定义设计”,设计师是构造一种秩序,这种秩序是机器没有办法自动获得的,它一定来自于设计师的经验、对用户的洞察、对品类的把控。最终,建立、优化中台的任务是由设计师来做的。


用我们的设计团队举例,中高级 UX 设计师在迅速增加,设计师的绝对数量没有大的增长。可以看出整个企业设计团队的能力是在提升的,对业务的支撑也会更有效,不必像以前需要上百上千个初级设计甚至外包团队来做这件事。这就是中台在规模化和频繁迭代上的优势和效益。


广联达印隽讲到什么性质的中台解决什么问题,以及中台的本质是什么:


阿里的鹿班,在内部和其他系统高度耦合,一张推广图从制作到分发,到上架到验证,系统和系统之间并无太多断层。


从使用者的角度来说,鹿班系统的最大收益方并不是设计师,而是商户,本质上是为了提高生产效率,用 AI 来淘汰量产撸图的低端设计师,但还是可以视做设计中台,毕竟这是一套“会做设计”,并且由设计师来提供机训内容的系统。


所以我们谈中台之前,还是先把中台的边界划清楚。


不能把技术中台、业务中台、数据中台、设计中台混为一谈。


中台概念在支付领域出现的比较早,以支付系统为例,资金管理、财务、风控,属于后台,即技术视角的底层服务。


渠道接入、交易、账户、收单网关等等,属于中台。


中台承担的是业务聚合和泛用,中台不能独立存在,脱离后台来谈中台是没有意义的。



(例图摘自网络)


对于设计师来说,切忌盲目跟风,中台概念的确很火,但仅针对一线大型团队。团队和产品体量没达到一定规模,底层系统都还没打磨清楚的团队,谈中台也为时过早。且设计团队如果还以界面和功能交互设计的执行工作为主,并没有足够深入业务和技术的话,也没有资格谈中后台设计。


至于设计中台,还是得先看企业业务是否已经处于良性发展期,且技术和业务也已经到了可以有中台的阶段,不然,脱离业务来谈设计中台,又是一纸空文。


所以,从这个视角来看,行业内真正可以算得上是设计中台的,除了阿里鹿班这个量级的系统之外,少之极少。


但是,除此之外,就没有别的形式的设计中台了呢?


我们其实可以换个视角看一下,比如,一个已经达到一定量级的设计团队,是否有意识的在管理自己的数字和数据资产呢?在什么系统里管理?这样的系统,是否可以视为设计视角中台?或只是一个工具?
设计部门需要基于系统的数字资产管理。大部分设计团队,并没有从系统视角,把一个设计体系运作所需要的对象管理起来。小到一个图标,一个文档,大到你的规范和原则和设计语言,都散落在各个零碎的内、外部系统中,甚至于设计师个人的硬盘里。


一个 Design DAM( Digital Asset Management 设计数字资产管理) 系统或许可以成为一个企业的设计中台的一部分,而且这个中台是可以独立于部分业务而存在的,他能有效累积整个企业在生产过程中的所有客观过程,包括数据。


一个优秀的设计团队,需要具备数据验证和数据驱动能力,而用于分析和验证的数据,也应该是设计的数字资产的一部分。如果设计团队自己有能力的话,应该作为设计数字资产的一部分。那么这个数字资产可以是一个设计中台。换言之,数字资产是建立设计中台的一个重要核心。


蓝湖或许就像是一个 Design DAM 系统的雏形,当然,还有很长的路要走。


团队的方法论和知识库也需要一个系统性的沉淀。


企业需要的是依葫芦画瓢式的流程,还是化整为零的方法论库,根据实际项目情况合理的自由的组合运用。从管理视角来看,我们更希望看到的是系统性的管理,而不是完全依赖于人肉的主观。需要很清楚这些方法论的组合是以何种灵活的状态去支撑项目,以及输出的标准在哪里。


路漫漫,其修远兮。


自如网的贾洪涛对印隽的发言很赞同,但是关于“炮火”,他却有不同的见解:


关于任总“听见炮火的声音”来做决策,我的个人体会不一样,离炮火最近的人被炸死了,或者被炸残了,听得见炮声的人,也许不是第一线,而是第二线的人,他们才是最适合做决策的人。


我想做的是中台其中的一种,对内部的数据可视化。企业的相关数据能展现在所有员工面前,像淘宝双十一那样,一是激励团队,一是告诉团队产品的现状。


我们要做的第一步就是先用现有的数据,足够好、足够多的数据,展现给员工眼前,但同时也要考虑到,这些数据放出来,外部客户看到后会不会产生负面影响。


另外一个,项目的数据,如果让设计做清单是没有意义的,如果为了做得漂亮虚造数据,就更加没有意义,不是我想做的初衷。


提到数据,服务过阿里的朱斌补充了自己的看法:


我这儿有两个故事。


第一个故事是回应贾总的想法。我有一个学妹,正在阿里做一个项目,叫做“数据之美”,就是做双十一的大屏和各种数据的可视化呈现。比如会通过各种设计的变化来展示数据增长的速度感、体量感。目前做的非常成功,今年也晋升到了更高的职位,足以说明数据可视化的重要性。


第二个是另一个维度的故事。有时候团队内考核 Review 时,每个细分的 KPI 都完成了,而且看描述都是超额完成,所有的数据都很好。但实际上公司的整体竞争状态却在下滑。


这两个故事告诉我,数据其实就是一个任人打扮的小姑娘,好的打扮会让数据更易读易懂,坏的打扮会让数据具有欺骗性。当讲到数据的时候一定需要非常严谨的算法,每一个冲锋陷阵的人都似乎赢了,但最后战争却是输的,这就需要全面的数据分析,只抓单个的数据,其实特别危险。


广联达印隽说得很对,数字资产管理看的是长线、看得是全局,而产品经理往往看的是当下,是短线。由此,我认为直接把数据动态跟设计动态捆绑在一起,是危险的,或者不能叫做中台。我们的解决方法就是求助于数据分析团队,一方面通过专家解读保证正确理解,另一方面我们也自建数据理解的能力,招募了数据方面的专家增加了一条体验数据支线。


很多人说数据像毒药,我认为,数据是解药。那些认为数据有毒的人,大约是没有真正分清楚哪些才是有效的数据。Netflix、字节跳动等很多新兴企业的成功告诉我们,通过数据的分析,做出的决策更有利于目标的达成,而基于平台层面的数据收集、分析、管理,也就是数字资产管理,正是中台能力构建的基石。


文章来源:UI中国

使用docbox定制API文档

seo达人

使用docbox定制API文档

什么是docbox

docbox的安装

克隆项目

部署方式

docbox的编写

定制logo及UI

更换代码背景色

插入自己的logo

三列改为双列

其他定制UI



在公司实习了一个月,由于业务需要,我花了大概一周时间对docbox的安装,编写,定制化等进行了详细的研究,下面给大家分享一下我的总结

什么是docbox

Docbox是一个开源的REST API文档系统。它采用结构化的Markdown文件,并生成带有导航,固定链接的两列布局。下面是官方example图片:









docbox的安装

克隆项目

直接去官网https://github.com/tmcw/docbox,然后克隆即可。



部署方式

在使用npm命令前需要下载Node.js,npm会根据package.json配置文件中的依赖配置下载安装



接着,在/content下放入.md文件,并使用 npm run build 命令,生成一个包含所需要的js代码的bundle.js文件,同时创建一个新的index.html文件



重要的就是index.html、bundle.js、/css这三个文件和文件夹



docbox的编写

在/content下放入.md文件(markdown语法俺就不说了哈……)

对/src/custom/content.js中添加需要引入的.md文件位置和以及标题





注意: /src/custom/content.js中放入的是一级标题、二级和三级标题需要在.md文件中编写。





定制logo及UI

修改/src/custom/index.js文件

修改对应标签的属性即可,定制时修改生成的index.html是没有用的,因为index.html里的标签是被动态写死的。

更换代码背景色

<div class='round-left pad0y pad1x fill-green code small endpoint-method'>

1





<div class='endpoint dark fill-blue round '>

1





插入自己的logo





修改/src/components/app.js文件



三列改为双列

docbox默认情况下是显示三列布局,但我们可以在app.js下进行修改使之默认为双列布局。将下图的1改为2即可切换双列模式







其他定制UI

像下图一样,我们可以修改并填写代码得到自己想要的页面样式,比如说我在最上方加了一个固定位置的区域,然后可以在这个区域添加相应的超链接等。







app.js里可以找到图中对应的标签和js代码,docbox支持多种语言切换,我们在需要的地方加入我们想要加入的标签,并在/css文件夹中对相应的css文件添加样式就可以定制我们想要的UI啦!!!



下面给大家列出一些用docbox定制API文档的网站



Mapbox API文档

Mapillary的API文档和Tiles文档

HYCON 8th

Wall

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档