【推荐】临时口令和会话口令合二为一的流程(适合随时授权)
前提:
小程序已绑定到微信开放平台。
分两种场景:
场景一:仅需要获取 unionid,且不需要获取头像昵称等用户信息,且已经有很大部分用户仅通过 code2Session 就能获取到 unionid(如:已关注了绑定同一微信开放平台的其它公众号,参 UnionID 机制说明);
场景二:仅需要获取 unionid,或需要获取 unionid 及头像昵称等用户信息,或很大部分用户不能通过 code2Session 获取到 unionid。
场景一步骤:
小程序调用 wx.login(),将 code 发送到开发者服务器
开发者服务器请求微信接口 code2Session,获得 session_key、openid,有机会获得 unionid
若没有返回 unionid,尝试用 openid 从数据库中获取 unionid
如果数据库中没有找到对应的 unionid,告知小程序端使用 button + getUserInfo 的方式请求用户授权
授权允许(判断 detail.errMsg 是否为 getUserInfo:ok)则将加密数据传回开发者服务器进行解密,得到 unionid、头像、昵称等信息,保存到数据库
若授权拒绝,则无动作,用户再次点击 button 会重新弹起授权框
* 该流程仅部分用户的首次使用才要求授权。其它注意事项和流程细节见下方流程图。
场景二步骤:
小程序调用 wx.login(),将 code 发送到开发者服务器
开发者服务器请求微信接口 code2Session,获得 session_key、openid
尝试用 openid 从数据库中获取 unionid 和/或 用户信息
如果数据库中没有找到对应的 unionid 和/或 用户信息,告知小程序端使用 button + getUserInfo 的方式请求用户授权
授权允许(判断 detail.errMsg 是否为 getUserInfo:ok)则将加密数据传回开发者服务器进行解密,得到 unionid、头像、昵称等信息,保存到数据库
若授权拒绝,则无动作,用户再次点击 button 会重新弹起授权框
* 该流程仅每个用户的首次使用才要求授权。其它注意事项和流程细节见下方流程图。
上述两种场景的设计流程,只要数据库中已保存用户的 unionid(和/或 用户信息),都不再需要用户再次授权(即使在“设置”中关闭了“用户信息”授权,点击小程序右上角三点按钮,选择关于小程序,点击右上角的三点,选择设置)。
场景一流程图:
场景二流程图:
流程图中的“临时口令”仅用于关联“通过 code2Session 获得的 session_key”,并在用户授权后带回换取 session_key。原因是 session_key 是机密数据,不允许被传到小程序端。临时口令用完即删(设置表 dt__weapp_code2session 中相应记录的该字段为空)。
【推荐】临时口令和会话口令合二为一的流程(适合随时授权)
HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure
Common causes of this issue:
The application process failed to start
The application process started but then stopped
The application process started but failed to listen on the configured port
Troubleshooting steps:
Check the system event log for error messages
Enable logging the application process' stdout messages
Attach a debugger to the application process and inspect
For more information visit: https://go.microsoft.com/fwlink/?LinkID=808681
发现装错了东西,服务器上应该安装 dotnet-hosting-*.*.*-win.exe
,而非 dotnet-runtime-*.*.*-win-x64.exe
常用获取英文的方法是查看英文版 App。
微信:WeChat
小程序:Mini Programs
公众号:Official Accounts
订阅号:Subscriptions
朋友圈:Moments
已登录的:Logged
服务通知:Service Messages
置顶:Sticky on Top / Remove from Top
发送给朋友:Share to Friends
微信号:WeChat ID
钱包:Wallet
余额:Balance
资金/零钱/基金:Funds
金额:Amount
明细:Details
账单:Transactions
资产:Assets
收入/收益:Income
财富:Fortune
登录:Log In / Login
退出登录:Log Out / Logout
当使用在线编辑器编辑一篇文章(或从 Word 复制)后,会得到包含 HTML 标签的字符串内容,可以直接将它输出到页面上而不需要进行 HTML 编码。
但是,当我们需要改变图片大小时,我们发现有些图片的尺寸是直接使用 style 属性固定的,除了用 JS 进行后期处理,我们可以在服务端对 <img /> 进行修正。
这个场景会在小程序开发的时候遇到。
网上一般使用正则表达式直接将 <img
替换成 <img style="max-width: 100%; height: auto;"
,缺点是如果该 <img /> 本身就带有 style 属性,那么会出现一个标签两个 style,很多情况导致这两个样式同时失效,所以我们应针对有 style 和无 style 分别处理。
// 把 <img src="a.jpg" style="display: block;" /> 替换成 <img src="a.jpg" style="display: block;;max-width:100%;height:auto;" />
Content = Content.replace(/(\<img\s+[^>]*style\s*\=\s*['"][^'"]*)(['"])/gi, '$1;max-width:100%;height:auto;$2');
// 把 <img src="b.jpg" /> 替换成 <img src="b.jpg" style="max-width:100%;height:auto;" />
Content = Content.replace(/(\<img\s+((?!style).)+?)(\/?>)/gi, '$1 style="max-width:100%;height:auto;" $3');
复制以上代码时,半角空格可能会变成全角空格,请注意修正。
当有 style 时,我们将 max-width: 100%; height: auto;
追加在原样式之后,以重写原样式。这里没有直接判断原样式是否以 ;
结尾,而是直接追加 ;
,这并不会影响实现展示效果。
在判断没有 style 用到正则表达式的“断言”,参:https://blog.csdn.net/xuyangxinlei/article/details/81359366
这是一个数据可视化项目,基于D3.js。能够将历史数据排名转化为动态柱状图图表。
先来看看效果:
https://xoyozo.net/Demo/BarGraph
作者 Jannchie 见齐还提供了官方视频教程:
https://www.bilibili.com/video/av28087807
不过由于开源项目的不断更新,该教程的部分内容已失效,本文针对 2018-12-25 版本总结了一些常用的配置说明,仅供参考。
从 GitHub 下载源代码,在 src 目录中可以看到 4 个文件:
bargraph.html --> 运行示例页面
config.js --> 配置文件
stylesheet.css --> 样式表
visual.js --> 核心文件
作者并没有将代码封装为插件的方式,所以我们是通过修改 config.js 配置文件的方式应用到自己的项目中的。
visual.js 虽然是核心文件,但作者将部分示例中的代码也包含其中,但并不影响我们直接在自己的项目中引用。
以下是 config.js 中的主要属性:
属性 | 说明 | 参考值 |
encoding | 数据源(csv、json)等的文件编码 | GBK / UTF-8 等 |
max_number | 每个时间节点最多显示的条目数 | 10 |
showMessage | 控制是否显示顶部附加信息文字 | true / false |
auto_sort | 时间自动排序(详细含义、作用及限制见代码中注释) | true / false |
timeFormat | 时间格式,显示于图表右下角的时间 | %Y、%Y-%M-%D 等 |
reverse | 是否倒序 | true / false |
divide_by | 类型根据什么字段区分?如果是 name,则关闭类型显示 | |
divide_color_by | 颜色根据什么字段区分? 须要注意的是,如果配置成 name,则各条颜色不同(因为 name 值各异),如果配置成 type 等,那么相同 type 值的条颜色相同。 | 字段名 |
color | 指定部分或所有条的颜色,该项与 divide_color_by 设置有关。 | 以 divide_color_by = 'name' 为例,"中国"是其中的一项 name 值,那么该项将显示 #D62728 色: color: { '中国': '#D62728' } |
changeable_color | 若 true 则颜色的深浅将根据数据的增长率实时改变 | |
itemLabel | 左边文字 | |
typeLabel | 右边文字 | |
item_x | ||
interval_time | 时间点间隔时间 | 2 |
text_y | ||
text_x | ||
offset | ||
display_barInfo | 如果希望不显示,则可以设置较大的值,单位像素 | |
use_counter | ||
step | ||
format | 格式化数值 | |
left_margin | ||
right_margin | ||
top_margin | ||
bottom_margin | ||
dateLabel_x | ||
dateLabel_y | ||
allow_up | ||
enter_from_0 | ||
big_value | ||
use_semilogarithmic_coordinate | ||
long | ||
wait | 数据加载完成后开始播放前的等待时间 | 0 |
update_rate |
在学习和使用 ASP.NET Web API 之前,最好先对 RESTful 有所了解。它是一种软件架构风格、设计风格,而不是标准。
推荐视频教程:https://www.imooc.com/learn/811
讲师:会飞的鱼Xia
需时:2小时25分
REST API 测试工具:
在 Chrome 网上应用店中搜索:Restlet Client
或网站 https://client.restlet.com
>>> 资源路径
SCHEME :// HOST [ ":" PORT ] [ PATH [ "?" QUERY ]]
其中 PATH 中的资源名称应该使用复数名词,举例:
GET https://xoyozo.net/api/Articles/{id}
POST https://xoyozo.net/api/Articles
>>> HTTP verb(对应 CURD 操作):
方法 | 功能 | ASP.NET Web API 接口返回类型(一般的) |
---|---|---|
GET | 取一个或多个资源 | T 或 IEnumerable<T> |
POST | 增加一个资源 | T |
PUT | 修改一个资源 | T |
DELETE | 删除一个资源 | void |
PATCH | 更新一个资源(资源的部分属性) | |
HEAD | 获取报头 | |
OPTIONS | 查询服务器性能或资源相关选项和需求 |
>>> 过滤信息:
如分页、搜索等
>>> 常用状态码:
200 | OK | 指示请求已成功 |
201 | Created | 资源创建成功(常见用例是一个 PUT 请求的结果) |
202 | Accepted | 该请求已被接收但尚未起作用。它是非承诺的,这意味着HTTP中没有办法稍后发送指示处理请求结果的异步响应。 |
204 | No Content | 成功 PUT(修改)或 DELETE(删除)一个资源后返回空内容(ASP.NET Web API 中将接口返回类型设置为 void 即可) |
400 | Bad Request | 服务器无法理解请求(如必填项未填、内容超长、分页大小超限等),幂等 |
401 | Unauthorized | 未授权(如用户未登录时执行了须要登录才能执行的操作),通俗地讲,是服务器告诉你,“你没有通过身份验证 - 根本没有进行身份验证或验证不正确 - 但请重新进行身份验证并再试一次。”这是暂时的,服务器要求你在获得授权后再试一次。 |
403 | Forbidden | 服务器理解请求但拒绝授权(是永久禁止的并且与应用程序逻辑相关联(如不正确的密码、尝试删除其它用户发表的文章)、IP 被禁止等),通俗地讲,是服务器告诉你,“我很抱歉。我知道你是谁 - 我相信你说你是谁 - 但你只是没有权限访问此资源。” |
404 | Not Found | 找不到请求的资源(指资源不存在,如果找到但无权访问则应返回 403) |
405 | Method Not Allowed | 请求方法被禁用(HTTP 动词) |
500 | Internal Server Error | 服务器遇到阻止它履行请求的意外情况(如数据库连接失败) |
503 | Service Unavailable | 服务器尚未准备好处理请求(常见原因是服务器因维护或重载而停机,这是临时的,可用于在单线程处理事务时遇到被锁定时的响应,如抽奖活动、抢楼活动,防止因并发导致逻辑错误) |
>> 错误处理:
C# 例:throw new HttpResponseException(HttpStatusCode.NotFound);
PHP 例:throw new Exception('文章不存在', 404);
>>> 返回结果:
JSON/XML
不要返回密码等机密字段
>>> 其它:
身份验证窗口(浏览器弹窗,类似 alert,非页面表单),明文传输,安全性不高,不建议使用。实现:
在 Headers 中添加 Authorization:Basic “用户名:密码”的 Base64 编码
原文标题:新手还在学习排版配色,高手已经在做内容设计了…
任何事物的呈现和传达都需要通过一定的媒介,在媒介承载的过程中,均会产生损耗。我们设计的目的之一就是将所传达的内容在媒介承载的过程中让损耗降到最低,呈现出我们想要给受众的东西,且能够被快速察觉、理解和获取(主动及被动的)。
文本作为语言沟通的书面化,一直以来承载着大量的信息,也是生活中最常见及熟知的方式。
当前人们快节奏的生活状态、快消的阅读习惯以及注意力分散,所以需要我们通过设计手段来减少视觉、心理及认知压力,让用户能够快速定位、理解和消化。同样,我们也需要根据目标、任务甚至品牌的诉求,从而更好的服务于主题。
以下是工作中一些心得和总结,旨在从更多角度去思考和完善,让文本信息能够得到更好的呈现和传达。
一、前提
前提是做事的先要条件。
达成目标
了解受众
具体情景
二、目的
目的是做这件事的动力。
满足用户所需,帮助完成工作;
简单直接,有效传达;
达成一致,统一规范可实施。
三、角度
角度是考虑要做的内容。
准确性
一致性
易读性
内容调性
1. 准确性
秉持文本信息准确明了、简达明意,无歧义
首先要明确所传达的群体对象,尽量避免使用行话,使用「用户」能直接理解的文本信息,当然相应的专业词汇也应给予良好的解释和说明。
案列:我们将 「循环次数」 更改成 「轮播次数」 ,「循环次数」会让人产生思考(循环一次是播放一次还是两次的),而 「轮播次数」 就显得更加直观明了且更符合上下文的语境。
用词完整、阐述直接
用词完整,例如保存修改,而不是简化为保存;阐述直接,避免模棱两可,模糊不清。
内容传达上应做的良好的「自解释」
例如:涉及操作事件的文本命名应根据上下文准确的进行表达,而不是含糊其辞的,使文本能够准确的解释和表达将要发生的事件及行为。
寻找更加合适的表达方式
例如:未输入提示,「XXX不能为空」 和 「请输入XXX」,第一个在表达上其实有一些责怪,而第二个表达同样说明了意思,但在口吻上却更加温和,并告诉用户应该怎样操作和行动。
避免错别字
错别字只会拉低产品的品质和用户内心的形象,请务必严格检查。避免把 「登录」 写成 「登陆」。
准确应用标点符号
标点符号能够赋予文字节奏,表达语气以及对内容的组织。准确应用,能够帮助文字更加有效传达和被人理解。
2. 一致性
同一事物用词一致,消除重复
例如,涉及新建的操作,一会用「新建」,一会又用「新增」、「创建」或者「添加」;涉及称谓,一会用「你」,一会又用「您」、「我」或者「我的」;涉及帮助,一会用「支持」,一会用「帮助」或者「服务」等等,我们应该消除这些重复,统一用词。
相似场景、意思和语境下句式表述一致
例如,未输入提示,应避免「请输入XXX」和「XXX不能为空」等不同的表达方式。
标点符号规范
根据符号使用规范并结合自身产品情况具体定义。例如:全角和半角,如常见「:」和「:」,截断省略「…」等等。又如:标题,提示文本不加结束符号等。
时间表达规范
时间是一个记录戳,需要根据与当前进行定义,显示不同的格式。
例如:今天发生的(自0时起),显示时分(24h);今天之前发生的,显示月-日(例如02-12);跨年,显示年-月-日(例如2017-12-30)。
数字使用规范
例如:统计数据统一使用阿拉伯数字。
大小写使用规范
专有名词大小写,单位符号等。例如:iOS
中西文混排规范
中英文之间需要加空格等。
代称一致
第一人称「我」,第二人称「你」和「您」,具体根据场景进行使用,同场景统一一致。你和您请不要随意混用或均使用,应当统一。
操作名称与目的页面标题一致
常见于移动端,在 PC 常见于链接及导航。
3. 易读性
简化内容,避免啰嗦
简单而直接,避免长段使用短语,保持措辞简洁,让读者感受到阅读乐趣,引诱他们深入阅读。
打破复杂冗长
通过段落、有序列表(项目编号)、无序列表等方式使内容结构化,便于视觉扫描。
段落:根据句意,进行分段呈现。
有序:当项目顺序或优先级重要(程序等)时,使用编号列表。
无序:项目相关时使用项目符号列表,但顺序或优先级无关紧要。
结构化:节奏和韵律。例如,电话号码或者银行卡号,使用连字符或空格使其容易被读取和识别。
重要内容突出显示
让用户首先看到最重要的内容,而不是去寻找它们。
经过良好的排版
合理使用文字大小:使用合理的字体大小,太小太大对于屏幕阅读来说都是低效率的。网页端字体大小一般使用不低于12px,更加直观易辨(对于多数人而言)的字体14px和16px;移动端字体大小不小于10pt(sp),12-18pt(sp)都是常用的字体选择范围。
颜色与对比度:颜色我们需要考虑色彩本身(色相、明度和饱和度)给人直观感受和文化寓意的,以及文本与背景之间是否有足够的对比度,从而方便人们可以更加直观舒服的进行阅读。W3C 建议的视觉呈现文本和文本的图像具有对比度至少为4.5:1,大型文字和图像的对比度至少为3:1,具体详情可了解 Contrast (Minimum):Understanding SC 1.4.3
字间距:汉字属于方块字,原则上文字外框彼此紧贴配置,称作密排;在各字之间加入固定量的空白来排列文字,称作疏排;减少字距,使得文字外框一部分重叠,称作紧排。文字排版时,会根据具体情况对字间距进行调整。大多时候我们对采用疏排方式,增加字间距,以提高易读性。
行高:具有良好的行距的文本,更易阅读和引导用户视线。与行之间的空白称为行距,文字尺寸+行距=行高,行距一般介于文字尺寸的50%–100%之间,自然行高的设置一般为文字尺寸的1.5-2倍。文字尺寸较小时,行高设定也会相对较小。行距一般不会超过文字尺寸,因为这样并不会因此而增加易读性。
段间距:段落与段落之间的距离,段间距大于行间距,行间距一般设置为文字大小的2-3倍之间,合适的段间距能够缓解用户的视线压力,起到很好的节奏及阅读定位。
行字数:一行的文字数量。一行文本过长,用户需要去移动脖子或视角,易造成的眼睛疲惫感,造成阅读困难;此外,在大段文本中找到正确的行也将变得困难。过短视线需要不断换行,从而打断了读者阅读节奏,造成尴尬的断裂效果;行太短也会造成用户在一行没读完的情况下去关注和阅读下一行。
虽然至今汉字依然没有正统的方法和具体行字数来衡量文本的完美长度,个人经验在12px下30-60汉字左右(包含标点),具体也要根据内容、人群等约束和变量,当然最重要的是要相信你自己(专业的设计师)的眼睛和判断。
词语尽量避免同行断开:例如,行末为「跳」,下行开头为「转」,读起来就有断句的存在感。
对齐方式:中文(简体)排版一般遵循左对齐的原则,符合我们从左到右的阅读习惯。文字居中,本身不适合可读性,但可用于许多小段文本块。右对齐在表格设置中,可用于数字的对比等应用。
符号避头尾:中文中行首遇到不能置于行首的标点符号,必须要将移动到前一行行尾。
合理突出:对于关键字、要点通过位置、加粗、比例大小和色彩处理等,以便让用户直接关注到。当然也要控制突出数量,毕竟都是「重点就没有重点」,过多也会扰乱和分散用户的注意力。
链接:链接文本需要很好的说明用户将要去何处,可以使用蓝色或者下划线标示出链接的样式,这是用户熟悉方式。神奇的「下划线」为体验赋能
尽量少用斜体:PC 和无线端的各个官方的中文字体包并没有斜体预设,生拉硬扯的倾斜在一定程度上是影响美观度,并造成一定的阅读困难。如果是为了突出或区别可以考虑使用字重、大小和颜色等方式。
层级处理:有对比就有层级关系,可通过大小、字重、色彩、距离、方向、纹理、形状、背景等等方式,可以让整体排版布局更加富有层次结构,让内容的可读性得到明显的提升。 例如:标题、副标题、引用和内容也是一种层级处理(结合了大小、色彩或者距离等等)。
留白:合适的留白可以更好的烘托内容主题,缓解视觉压力。
数量信息前后有汉字时需加空格:不加空格会出现前后拥挤的视感,另一方面可凸显数字信息。
4. 内容调性
依据产品定位,通过文本表述传递其相应的价值观和情感诉求
任何产品都有所针对的人群及自身的品牌形象。C端产品和 B端产品,儿童产品和成年人产品,所使用的语言表达方式自然也都是不一样的。
依据不同状态和用户群体
根据状态(正面、中性和负面)和用户(新手、中级用户和专家),使用合理的语调及用词规范,以适应不同的情境和状况。
始终坚持积极主动的,而不是消极令人沮丧
「请输入内容」与「错误,内容不能为空」,同样的意思却有不同的感受,从积极的一面表达就是传播正能量。
四、通用产出物
字体
日期和数字
标点符号
大小写
中英文混排
代称
1. 字体
字族 Font-Family
Font-Family 属性设置的字体系列。Font-Family 属性设置多个字体作为一种「后背」机制,浏览器不支持第一种字体,它会尝试下一个字体。
如果字体系列的名称超过一个字,它必须用引号,如Font-Family:「宋体」。
对于依附在 PC 端产品而言,统一的字体规范,以保证在不同平台、不同浏览器下保持良好的美观性和易读性。
以下呈现的是 Ant Design 的字体家族。个人在使用了多款后,觉得最好的一份:
font-family:「Chinese Quote」, -apple-system, BlinkMacSystemFont, 「Segoe UI」, 「PingFang SC」, 「Hiragino Sans GB」, 「Microsoft YaHei」, 「Helvetica Neue」, Helvetica, Arial, sans-serif,「Apple Color Emoji」, 「Segoe UI Emoji」, 「Segoe UI Symbol」;
如果大家想了解字体排列前后顺序的玄机可以认真看《推荐!Web中文字体应用指南》这篇文章。
以下备注区域,是我在使用字族的路上磕磕碰碰所收集到的有限知识,也算知其所以然了,若有不妥、错误和缺漏欢迎指正。
备注区域:
-apple-system:macOS 和 iOS平台的 Safari 调用 SanFrancisco 字体
BlinkMacSystemFont:macOS Chrome 调用 SanFrancisco 字体
Roboto字体,由 Google 开发,是 Android 4.0「Ice Cream Sandwich」及后面Android版本的默认字体。
Segoe UI 取代Tahoma,Windows 从 Vista 开始的界面默认西文字体。利用 ClearType 技术的新字体 Segoe UI 看起来比现在略显僵硬的 Tahoma 更加人性化。
Tahoma 被采用为 Windows 2000、Windows XP、Windows Server 2003及 Sega 游戏主机 Dreamcast 等系统的默认字型。
Arial 是一套随同多套微软应用软件所分发的无衬线体 TrueType字型。
Microsoft YaHei 微软雅黑,该字体将作为 Windows Vista 的默认字体取代2001年推出的 XP系统下默认的宋体汉字,以支持高清显示的 ClearType 功能。
Simsun 宋体,一直是简体中文版 Windows XP系统及之前版本的默认字体。但由于字体的特性,在Windows Vista 中已经改用支持 OpenType 的微软雅黑,
HanHei SC 威锋瀚黑,现苹果简体中文,OS X 10.11 El Capitan 开始,
STHeiti 华文黑体,分为「黑体-简(Heiti SC)」和「黑体-繁(Heiti TC)」,OS X 10.6 Snow Leopard 直至 OS X 10.10 Yosemite。
Hiragino Sans GB 冬青黑体
STXihei 华文细黑,是苹果公司 Mac OS X9 以及之前版本的操作系统的中文默认字体,截至 OS X 10.5 Leopard。
PingFang SC 为 iOS9.0 以后系统自带中文字体。
SanFrancisco iOS9 正式发布之后,替换了之前的 Helvetica Neue 成为了 iPhone/iPad 系列设备的默认字体。
Myriad Set Pro 苹果向 adobe 公司定制了一款西文字体,是以 myriad 为原型的,完成后在市面上叫做「myriad set」,后期升级为「myriad set pro」。
Helvetica Neue 意为「新 Helvetica」
Helvetica 是苹果电脑的默认西文字体
sans-serif 并非一个具体字体,而是css的通用字体族,具体是什么字体是由浏览器设置决定的。
字号 font-size
标题,内容,注释说明等不同字号的大小。
字间距 letter-spacing
根据不同字号,及文本数量进行字间距定义。
行高 line-height
设置行高能很好的解决,缓和上下文本之间拥挤在一起的情况。
颜色 text-color
这里主要讲下注意对比度的问题,很多产品在这一点上都忽视了这一点,搞出了所谓的「小清新」。
你可以查看完整的《网页内容可访问性指南WCAG 2.1》
《掌握具有共享样式的文本系统》(搭梯子访问)
2. 日期和数字
日期
使用完整数字日期,如:2018-01-02。
时间
使用24小时制,如 13:01:29
具体到时分秒,如当前对话显示 09:01:02
使用半角 「:」
日期和时间之间包含一个空格,如 2018-09-01 13:01:20。
数字
使用阿拉伯数字。
对四位或更多位数的数字使用逗号。
对手机号码使用前后无空格的连字符「-」。不要使用点,空格等其他符号。
数字范围使用前后无空格的连字符「-」。
正负数后不加空格。
数字和字符之间不需要空格
货币
人民币符号(¥)在数字前面,精确到小数点后两位。
测量单位
储存单位(B、kB、MB、GB、TB),在数量和度量单位之间包含一个空格。
对于长度「毫米(mm)、厘米(cm)、分米(dm)、千米(km)、米(m)、微米(μm)、纳米(nm)等」和重量「千克(kg)、克(g)、毫克(mg)、微克(ug)等」等测量单位应为小写(电流单位除外)。在数量和度量单位之间包含一个空格。
屏幕单位「像素(px)、逻辑分辨率(pt、dp、sp)、英寸(in)等 」应为小写。在数量和度量单位之间包含一个空格。
在连续列出尺寸时,将度量单位放在末尾,而不是在每个数字之后,并包括一个空格。
在所有情况下,数字和单位之间包含一个空格。HTML代码的最小空间是 & hairsp; 或 & #8202;
测量单位分为基本单位和导出单位。国际单位制共有7个基本单位长度:
长度:米 m;
质量:千克(公斤) kg;
时间:秒 s;
电流:安[培] A;
热力学温度:开[尔文] k;
物质的量:摩[尔] mol;
发光强度:坎[德拉]cd;
并由物理关系导出的单位称「导出单位」 。
3. 标点符号
省略不必要的标点
标题、副标题、输入框下的提示文本、输入框占位符、悬停提示中的文本、Toast中、弹窗等短句,在遣词造句时尽量避免标点符号,始终末尾不要使用句点。
有序列表和无序列表
使用冒号引入项目列表,列表后不使用标点。
使用列表来表示步骤、组或信息集。简要介绍列表的上下文。在顺序重要时列出数字列表,比如当您描述流程的步骤时。当列表的顺序不重要时,不要使用数字。
常用标点符号规范
空格:链接与前后文本之间增加空格;数字和单位之间包含一个空格;电话号码与前后文本包含一个空格;
省略号「…」:半角省略号,超出截断代替省略文本;
星号「*」:半角星号。表单必填、说明备注;
连接号「-」:半角连接号,前后无空格,如2018-01-04,2008-2018;
冒号「:」:半角冒号,用于时间的表示,如16:45 ;
冒号「:」:全角冒号,用于表单;
破折号「——」:中文破折号占两个汉字空间;
书名号「《》」:产品中常用于法律条文。
相关推荐:
4. 大小写
专门名词大小写
文件格式
当一般引用文件扩展名类型时,全部大写而不包含句点。
GIF
PDF
HTML
JPG 格式
引用特定文件时,文件名应该是小写的:
内容策略-设计完全手册.pdf
皮皮虾.gif
西湖.jpg
hot.html
5. 中西文混排
中英文之间需要加空格
中文与数字之间需要加空格
中文为主,使用全角符号且与英文或数字之间不加空格
6. 代称
为了表达双方的平等,避免使用「您」。使用「你」代称客户/用户,借以表达客户的口吻。在客户/用户为主的情况下使用「我」。避免同一句子中混用「你」和「我」。
对于「您」还是「你」的使用并非绝对,主要看行业以及服务的对象
在《胜于言传-Web内容创作与设计的艺术》中作者建议:
当用户提问的时候:
在问题中使用「我」和「我的」(用户的声音)
在答案中使用「你」和「你的」(应用对用户说话)
用「我们」和「我们的」代表回答公司
当应用提问的时候:
在问题中使用「你」和「你的」(应用向用户提问)
在答案中使用「我」和「我的」(用户的声音)
用「我们」和「我们的」代表回答公司
五、指导建议
操作行动
文本说明
句式结构
语音和语调
写作建议
1. 操作行动
按钮
清晰可预测。应该能够预测当点击按钮时会发生什么。
行动号召。按钮应始终带有强烈的动词,鼓励行动。为了给用户提供足够的上下文,在按钮上使用 {动词} + {名词} 格式,除了保存,关闭,取消或确定等常用操作。
以下是常用词的含义,以避免不恰当或混淆使用:
所有具体的用词需结合场景和生活习惯。
链接
使用描述性的链接文本。切勿使用「点击这里」或「这里」作为链接文本。
如果一个链接出现在句子的末尾或逗号之前,不要链接标点符号。
链接使用蓝色,这是用户习以为常的认知,并明确区分点击和未点击的区别。
2. 文本说明
对操作说明,功能说明,名词(术语)解释,提示信息等进行用户测试,是否明白其意,记住这是一个不断优化的过程。
以下是产品内的主要文本:
操作文本:按钮;
导航文本:全局和局部导航、目录、链接;
说明文本:功能说明、术语解释;
提示文本:弹框、toasts、操作反馈、系统反馈、通知等;
操作说明:功能引导说明,操作文档;
标题和副标题:弹框标题、操作说明标题、法律条款标题等;
条款:法律条款、申明;
ALT:为图片添加文字说明。
3. 句式结构
通用场景下的语句可进行归纳在一起,形成统一的句式结构。
例如:
操作反馈:成功直接提示结果,失败显示结果+说明原因+如何解决。
二次确认:先说明利害,再询问是否操作。
标题:「动词」+ 「名词」格式等。
4. 语音和语气
这听起来是谁,什么样的语音和语气能代表我们,我们想传达什么的形象。
因此,你可以建立一套准则,一般而言准则应该:
基于产品当前的业务;
准则可被执行,避免过于空洞;
易于记忆,3-5个尚可;
并随着产品发展和愿景的变化而不断适应改进。
例如:
积极主动
始终坚持积极主动的,而不是消极令人沮丧。
自信专业
避免听起来傲慢、亲密、孩子气或其他不适当的或非正式的。
友好尊重
依据不同状态(正面、中性和负面)和用户群体(新手、中级用户和专家),使用合理的语气及用词规范。
5. 写作建议
个人写作过程中的一些小感悟:
好的结果是不断修改来的,修改的基础是要先写下来,所有先记录而不是停留在脑子里,这才是一切开始的基础。
记住用户很忙且没有耐性,甚至不聪明,这会不断的促使你修改调整。
找人阅读并呈现结果,并询问其含义和建议。这是检验的最佳实践。
过段时间再来看看,或许有更好的方式。
结尾
这并非是一个完整的(内容层面可能保存图片风格,插画图标等),还有很多地方可以补充。重要的是找到适合你的产品,并有这样的意识去不断优化你的产品内容,从而更好的服务你的用户。
〓 系统
功能 | 命令 | --help | 示例 |
---|---|---|---|
关机 | halt | halt | |
重启 | reboot | reboot | |
系统监视器 | top | 系统时间, 运行天数, 当前登录用户数, 系统负载 总进程数, 运行中的, 睡眠的, 停止的, 未响应的 Cpu(s):us 用户, sy 系统, ni XX, id 空闲, wa 等待, hi XX, si XX Mem, 已使用, 空余, 缓冲 Swap, 已使用, 空余, 缓冲 快捷键: M 按占内存排序 P 按占Cpu排序 1 显示每个 Cpu k 杀死进程 q 退出 | top |
查看进程 | ps | aux -ef | 列出包含 java 的进程 ps aux |grep java ps -ef |grep java |
查看内存及 Swap 用量 | free | -b,-k,-m,-g 按单位显示 | free -m |
查看系统时间 | date | 显示 CST 时间 -R 显示时区 -u 显示 UTC 时间 | date |
查看硬件时间 | clock | clock | |
设置系统日期 | date -s 月/日/年 | ||
设置系统时间 | date -s 时:分:秒 | ||
将系统时间写入到硬件时间 | clock -w | ||
查看系统版本 | cat /etc/*release | ||
升级系统软件 | yum update -y |
〓 文件
功能 | 命令 | --help | 示例 |
---|---|---|---|
进入目录 | cd | cd .. # 上一层目录 cd /root # 根目录 | |
列出目录 | ls | 白色:表示普通文件 蓝色:表示目录 绿色:表示可执行文件 红色:表示压缩文件 浅蓝色:链接文件 红色闪烁:表示链接的文件有问题 黄色:表示设备文件 灰色:表示其他文件 | ls |
创建目录 | mkdir | mkdir XXX | |
删除目录 | rm | rm -rf XXX | |
删除文件 | rm | rm XXX | |
复制文件 | cp | cp XXX YYY | |
复制目录 | cp | -r 复制目录及目录内的所有项目 -v 详细显示进行的步骤 | cp -rv XXX YYY |
重命名文件 | mv | -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件; -f: 在mv操作要覆盖某已有的目标文件时不给任何指示; | mv 源文件 目标文件 |
移动文件 | mv | mv 一个或多个文件 目标目录 | |
下载文件 | wget | 下载到当前目录 | wget http://XXX.tar.gz |
计算文件/目录的磁盘用量 | du | -a 不仅显示目录,同时显示文件 -h 容易阅读方式显示 --max-depth=N 可指定计算深度 | du -ah --max-depth=1 | sort -n |
查找文件 | find | find /home -name *.apk |
〓 tar
功能 | 命令 | --help | 示例 |
---|---|---|---|
tar | tar | -z 是否压缩 -c 打包 -x 解包 -v 详细地列出处理的文件 -f | 打包:tar -cvf abc.tar abc 解包:tar -xvf abc.tar 压缩打包:tar -zcvf abc.tar.gz abc 解压解包:tar -zxvf abc.tar.gz |
〓 磁盘
功能 | 命令 | --help | 示例 |
---|---|---|---|
查看所有磁盘及分区 | fdisk -l | fdisk -l | |
查看当前挂载 | df | -h 按可阅读的方式打印数值和单位 -T 显示文件系统类型 | df -hT |
管理磁盘分区 | fdisk /dev/*** | 进入后的操作说明: m 显示命令菜单 d 删除一个分区 n 创建一个分区(e 扩展分区;p 主分区) t 改变分区ID q 不保存退出 w 保存退出 | fdisk /dev/vdb |
格式化分区 | mkfs.*** /dev/***N | mkfs.xfs /dev/vdb1 | |
挂载分区 | mount /dev/***N /*** | mount /dev/vdb1 /www | |
卸载分区 | umount /dev/***N | umount /dev/vdb1 | |
开机自动挂载 | vi /etc/fstab | 配置文档格式:设备 挂载点 文件系统类型 defaults 0 0 | 打开:vi /etc/fstab 配置:/dev/vdb1 /www xfs defaults 0 0 |
〓 网络
功能 | 命令 | --help | 示例 |
---|---|---|---|
查看 IP 配置 | ifconfig | ifconfig | |
配置网卡 IP | 配置文件目录:/etc/sysconfig/network-scripts/ 配置文件格式: DEVICE=eth0 / eth0:0 / ... # 在配置多线时若使用 cp 命令复制配置文件,必须修改此项以防止冲突 HWADDR=XX:XX:XX:XX:XX:XX # 网卡地址 TYPE=Ethernet # 以太网 UUID=******** ONBOOT=yes # 开机启动 NM_CONTROLLED=yes BOOTPROTO=static # 使用静态 IP IPADDR=192.168.1.2 # IP 地址 NETMASK=255.255.255.XXX # 子网掩码 GATEWAY=192.168.1.1 # 网关 DNS1=114.114.114.114 DNS2=8.8.8.8 | vi ifcfg-XXXN(:N) | |
重启网卡 | 使配置生效 | service network restart |
〓 防火墙
功能 | 命令 | --help | 示例 |
---|---|---|---|
配置 iptables | 添加需要允许的端口的方法同 22 端口 | vi /etc/sysconfig/iptables | |
重启使配置生效 | service iptables restart |
〓 用户/权限
功能 | 命令 | --help | 示例 |
---|---|---|---|
添加用户 | useradd | -g 组名 # 加入到该组 -s /bin/false #不允用户直接登录系统 | useradd –g 组名 用户名 -s /bin/false |
修改密码 | passwd | passwd 用户 | |
查看所有用户 | cut -d : -f 1 /etc/passwd | ||
查看可以登录系统的用户 | cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1 | ||
删除用户 | -r, --remove remove home directory and mail spool | userdel 用户 | |
添加用户组 | groupadd | groupadd 组名 | |
为组添加用户(用户必须已存在) | gpasswd | gpasswd -a 用户 组 | |
将用户移出组 | gpasswd | gpasswd -d 用户 组 | |
查看用户所属组 | groups | groups 用户 | |
查看组中有哪些用户 | groupmems | groupmems -g 组 -l | |
更改文件/目录所有者 | chown | -R 递归处理所有的文件及子目录 | chown -R 用户:组 *** |
更改文件/目录权限 | chmod | -R 以递归方式更改所有的文件及子目录 | chmod -R 777 *** |
〓 vi 编辑器
功能 | 命令 | --help | 示例 |
---|---|---|---|
打开文件 | vi | vi XXX | |
进入编辑模式 | 按 a/i/o/Insert 等 | ||
进入末行模式/命令模式 | 按 Esc后: :w 保存不退出 :q 退出(提示是否保存) :wq 保存并退出 :w XXX 另存到文件 XXX :q! 不保存退出 |
〓 计划任务
功能 | 命令 | --help | 示例 |
---|---|---|---|
设置计划任务 | crontab | 详细步骤见本页底部 | crontab -l # 查看计划任务 crontab -e # 编辑计划任务 |
〓 网站
功能 | 命令 | --help | 示例 |
---|---|---|---|
简单审查日志 | cat | grep | cat 日志文件 | grep 关键词1 | grep 关键词2 | more | |
日志分析 | goaccess | 见下文 |
〓 goaccess
功能 | 命令 | --help | 示例 |
---|---|---|---|
安装 | yum install goaccess | ||
日志格式 | NCSA Commbined Log Format | date_format %d/%b/%Y log_format %h %^[%d:%^] "%r" %s %b "%R" "%u" | |
参数 | -f | 需要解析的日志文件 | |
参数 | -e | 指定 IP 地址统计 | |
参数 | -p | 指定配置文件 | 可以将上面的日志格式内容保存到文件 ~/.goacessrc |
参数 | -H | 显示 HTTP 协议信息 | |
参数 | -M | 显示 HTTP 方法信息 | |
生成文件 | goaccess -f 日志文件 -p ~/.goaccessrc > 目标文件.htm |
〓 lnmp
功能 | 命令 | --help | 示例 |
---|---|---|---|
重启 LNMP | /root/lnmp restart | ||
重启 MySQL | /etc/init.d/mysql restart | ||
重启 PureFTPd | /root/pureftpd restart | ||
安装 LNMP | http://lnmp.org/install.html | ||
常见问题 | http://lnmp.org/faq.html | ||
状态管理命令 | http://lnmp.org/faq/lnmp-status-manager.html | ||
相关软件目录及文件位置 | http://lnmp.org/faq/lnmp-software-list.html | ||
防跨站、跨目录安全设置(仅支持 PHP 5.3.3 以上版本) | http://www.vpser.net/security/lnmp-cross-site-corss-dir-security.html | ||
查看 Nginx 版本 | nginx -V | ||
查看 MySQL 版本 | mysql -V | ||
查看 PNP 版本 | php -v | ||
查看 Apache 版本 | httpd -v | ||
查内存 | cat /proc/meminfo | ||
php.ini | vim /usr/local/php/etc/php.ini | ||
MySQL 配置文件 | vim /etc/my.cnf | ||
添加网站 | /root/vhost.sh | ||
添加 ProFTPd 用户 | /root/proftpd_vhost.sh |
〓 nginx
功能 | 命令 | --help | 示例 |
---|---|---|---|
启动/停止/重启 | service nginx 或 /etc/rc.d/init.d/nginx | service nginx start service nginx stop service nginx restart | |
伪静态 | 在 .conf 文件中配置 | rewrite ^(.*)/read-htm-(.*)\.html(.*)$ $1/read.php?$2.html? last; rewrite ^(.*)/thread-htm-(.*)\.html(.*)$ $1/thread.php?$2.html? last; rewrite ^(.*)-htm-(.*)$ $1.php?$2 last; rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last; rewrite ^(.*)/data/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/attachment/(.*)\.(htm|php)$ 404.html last; rewrite ^(.*)/html/(.*)\.(htm|php)$ 404.html last; | |
防盗链 | 在 .conf 文件中配置 | HttpRefererModule | location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked *.0574bbs.com *.eyuyao.com 0574bbs.com eyuyao.com; if ($invalid_referer) { rewrite ^/ http://web1.eyuyao.com/yyad/src/3122.jpg; # return 404; } } |
浏览器缓存 | 在 .conf 文件中配置 | location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } |
〓 vsftpd
功能 | 命令 | --help | 示例 |
---|---|---|---|
安装 | yum install vsftpd | ||
查看是否已安装 | rpm -q vsftpd | ||
启动/停止/重启 | service vsftpd | service vsftpd start service vsftpd stop service vsftpd restart | |
配置文件 | vi /etc/vsftpd/vsftpd.conf |
〓 MySQL
功能 | 命令 | --help | 示例 |
---|---|---|---|
登录 | mysql | mysql -u username -p | |
登出 | exit | ||
查看信息 | status; | ||
查询当前正在执行的 SQL 语句 | show processlist; | ||
删除指定时间之前的日志 | PURGE | PURGE MASTER LOGS BEFORE '2015-1-1 0:00:00'; |
〓 scp 远程文件/目录传输命令 (yum install openssh-clients) 用法
scp 会把文件权限(读取/写入/执行)带过来,但所有者为当前执行 scp 命令的用户。
scp 低版本有许多漏洞,用完最好 yum remove openssh-clients
scp 采用直接覆盖的机制,如需判断文件无差异则跳过,应改用 rsync 命令。查看 rsync 详细使用方式及与 scp 对比
功能 | 命令 | --help | 示例 |
---|---|---|---|
若远程服务器 SSH 端口非默认 | scp | -P 端口号 | |
下载远程服务器上的文件到本地 | scp | scp 远程用户@远程服务器:远程文件 本地文件 | |
下载远程服务器上的目录到本地 | scp | -P 端口 -v 显示进度 -r 递归 | scp -r 远程用户@远程服务器:远程目录 本地目录 实例:scp -r root@x.x.x.x:/a/b/ /c/d/ 结果:/c/d/b/,即将整个 b 复制到 d 下(注意与 rsync 命令的区别) |
将本地文件上传到远程服务器 | scp | scp 本地文件 远程用户@远程服务器:远程文件 | |
将本地目录上传到远程服务器 | scp | 最终目录结构参:远程->本地 | scp -r 本地目录 远程用户@远程服务器:远程目录 |
〓 rsync 远程文件/目录传输命令 (yum install rsync) 用法查看 rsync 详细使用方式及与 scp 对比
rsync 会把文件权限(读取/写入/执行)带过来,所有者也会带过来。
相比于 scp 最大的优势就是可以增量同步
功能 | 命令 | --help | 示例 |
---|---|---|---|
下载远程服务器上的目录到本地 | rsync | -a 递归 -v 详细 -p, -- perms 保持权限 -g, -- group 保持属组 -o, --owner 保持属主 -r 递归 --progress 打印 --delete 删除已不存在的文件 -u 表示仅更新较新的文件 -z 表示在传输过程中进行压缩 -e 'ssh -p 2222' 指定其它端口 | rsync 远程用户@远程服务器:远程目录 本地目录 实例:rsync -avu --progress root@x.x.x.x:/a/b/ /c/d/ 结果:/c/d/,即将 b 内的文件(夹)复制到 d 下(注意与 scp 命令的区别) |
将本地文件上传到远程服务器 | rsync | rsync 本地文件 远程用户@远程服务器:远程文件 | |
将本地目录上传到远程服务器 | rsync | 最终目录结构参:远程->本地 | rsync 本地目录 远程用户@远程服务器:远程目录 |
〓 ftp 客户端 (yum install ftp)
功能 | 命令 | --help | 示例 |
---|---|---|---|
登录 | ftp | ftp 目标服务器 | |
列出远程当前路径目录/文件 | ls | ls | |
创建远程目录 | mkdir | mkdir 目录名 | |
删除远程目录(空) | rmrmdir | mkdir 目录名 | |
进入远程目录 | cd | cd 目录名 | |
显示远程当前路径 | pwd | pwd | |
重命名远程文件 | rename | rename 原文件名 新文件名 | |
上传文件 | put | put 本地文件名 | |
下载文件 | get | get 远程文件名 | |
批量下载文件 | mget | 需要单个确认 | |
批量下载文件【lftp】 | mirror | 参数有很多 | mirror |
返回 shell(不退出) | ! | ! | |
返回 ftp(接上步) | exit ftp | exit ftp | |
结束 | bye quit | bye quit |
〓 iftop
流量监控工具 教程
〓 GoAccess
实时网站日志分析工具 官网
〓 Cacti
常见问题笔记
加硬盘
插入新硬盘
若有 RAID,则先设置,使操作系统能认到硬盘
使用 fdisk 命令对新设备进行分区
使用 mkfs 命令对新分区进行格式化
使用 mount 命令进行挂载
设置开机自动挂载(vi /etc/fstab)
更改 MySQL 数据库目录位置
停止 MySQL 服务
将原数据目录转移或复制到新位置(若是复制,则修改所有者使原来一致)
找到 my.cnf 配置文件(一般在 /etc/),修改 datadir 值为新路径
启动 MySQL 服务
502 Bad Gateway 问题排查
查看 PHP 日志,路径:/usr/local/php/var/log
一般为“server reached pm.max_children setting (10), consider raising it”连接数问题,在“/usr/local/php/etc”下的所有配置文件中查找并修改相关设置即可(如改成 1000)。
计划任务(实例:定时备份数据库并通过 FTP 同步至其它服务器)
创建可执行文件:vi dotask.sh
dotask.sh 的内容示例:
DATE_TIME=`date +%Y_%m_%d_%H%M%S`;
FILE_NAME=数据库名_backup_$DATE_TIME.sql;
cd /home/mysqlbackup/;
mysqldump -u数据库用户名 -p数据库密码 数据库名>$FILE_NAME;
tar -zcf $FILE_NAME.tar.gz $FILE_NAME;
rm $FILE_NAME;
ftp -v -n FTP地址 << END
user FTP用户名 FTP密码
bin
put 本地目录文件 目标路径文件
bye
END
文件名乱码问题可以在行末加“;”来解决赋予执行权限:chmod 777 dotask.sh (ls 命令时呈绿色)
编辑计划任务:crontab -e
crontab 书写规则:
# 分 时 日 月 周 文件路径
0 3 * * * /home/dotask.sh
30 4 * * * /home/dotask2.sh重启 crond:/etc/init.d/crond restart
netstat
netstat -an | grep xxx.xxx.xxx.xxx 可查看此 IP 的 TCP 请求及端口
Discuz! 数据库加索引
待优化的 SQL:(pre_forum_thread 表有 150 万条数据)
SELECT * FROM pre_forum_thread WHERE `fid`='62' AND `displayorder` IN('0','1','2','3','4') ORDER BY displayorder DESC, dateline DESC LIMIT 20, 20
加索引前,
EXPLAIN 结果 Extra 为:Using index condition; Using where; Using filesort
> 时间: 0.915s
加索引后:`fid`, `displayorder`, `dateline`
EXPLAIN 结果 Extra 为:Using where 或 Using index condition
> 时间: 0.001s
magapp 数据库加索引
待优化的 SQL:(mag_score_action_log 表有 200 万条数据)
SELECT COUNT(*) AS tp_count
FROM `mag_score_action_log`
WHERE action_id = 20
AND user_id = 650070
AND create_time >= 1534953600
AND create_time < 1535040000
LIMIT 1
加索引前,
EXPLAIN 结果 Extra 为:?????
> 时间: 70s
加索引后:`action_id`, `user_id`, `create_time`
EXPLAIN 结果 Extra 为:Using where; Using index
> 时间: 0.073s
待优化的 SQL:(mag_score_mission_log 表有约 55 万条数据)
SELECT COUNT(*) AS tp_count
FROM `mag_score_mission_log`
WHERE mission_id = 7
AND user_id = 650070
AND create_time >= 1534953600
AND create_time < 1535040000
LIMIT 1
加索引前,
EXPLAIN 结果 rows 为:549178
> 时间: 17.719s
加索引后:`mission_id`, `user_id`, `create_time`
EXPLAIN 结果 rows 为:1
> 时间: 0.025s
待优化的 SQL:(mag_score_mission_user 表有约 28 万条数据)
SELECT *
FROM `mag_score_mission_user`
WHERE `user_id` = 431779
AND `mission_id` = 5
AND `create_time` >= 1534953600
ORDER BY complete_count DESC
LIMIT 1
不加索引
1SIMPLEmag_score_mission_userALL282436Using where; Using filesort
> 时间: 7.325s
`user_id`, `mission_id`
1SIMPLEmag_score_mission_userrefix_us_miix_us_mi10const,const7Using where; Using filesort
时间: 0.014s
`user_id`, `mission_id`, `create_time`
1SIMPLEmag_score_mission_userrangeix_us_miix_us_mi151Using index condition; Using filesort
时间: 0.023s
`user_id`, `mission_id`, `complete_count`
1SIMPLEmag_score_mission_userrefix_us_miix_us_mi10const,const7Using where
> 时间: 0.014s
`user_id`, `mission_id`, `complete_count`, `create_time`
1SIMPLEmag_score_mission_userrefix_us_miix_us_mi10const,const7Using where
> 时间: 0.028s
`user_id`, `mission_id`, `create_time`, `complete_count`
1SIMPLEmag_score_mission_userrangeix_us_miix_us_mi151Using index condition; Using filesort
> 时间: 0.025s
其它就不一一举例了,根据 SHOW FULL PROCESSLIST 的慢查询自行加索引就行了。
代码一:
#if DEBUG
// Debug 模式
#else
// Release 模式
#endif
作用:判断 调试模式 / 发布模式
条件:须在项目属性的生成页中勾选“定义 DEBUG 常量”
适用:记录 EF 生成的 SQL 语句、控制定时器只在生产环境执行等
注意:调试和发布时应选择正确的模式
代码二:
if(Request.IsLocal) { }
作用:判断 本地 / 远程
条件:在会话中
适用:显示错误详情、记录 EF 生成的 SQL 语句
注意:不能用于定时器、Application_Start、异步操作等非会话中
代码三:
if (System.Net.IPAddress.IsLoopback(HttpContext.Connection.RemoteIpAddress)) { }
说明:ASP.NET Core 中的写法,用于检测 IP 地址是否为本地回环地址(IPv4 为 127.0.0.1,IPv6 为 ::1)
若在视图中使用,HttpContext 改为 ViewContext.HttpContext 或 Context
作用/条件/适用/注意:参“代码二”
代码四:
if(HttpRuntime.AppDomainAppPath == "X:\xxx\") { }
作用:判断当前网站根目录路径
条件:开发环境和生产环境的根目录路径不同
适用:判断根目录路径作相应的处理,适用于以上各种情况
注意:路径有变须要修改相应程序代码