上述例子发现输出的结果是英文的,显然是不适合在国内环境使用,moment.js 提供了国际化支持,在现有的库中,moment 支持的语言可以说是相对完备了。通过引入对应的国际化资源(语言文件),来切换语言。<script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.27.0/moment.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.27.0/locale/zh-cn.min.js"></script><script> var now = moment().calendar(); console.log(now);// 输出当前日历时间 moment().startOf('hour').fromNow(); // 相对这个小时过去了多少分钟 var timestamp = 1593933593236; // 2020年7曰5日下午15点20分38秒 moment(timestamp).fromNow(); // 相对时间戳多久前</script>有关国际化的更多内容可以参考文档。
国际化的功能离不开错误码的支持,客户端指定语言到服务端去请求,当出错了服务端会根据错误码和语言找到对应的国际化提示语。从上面图中我们发现,错误码不仅仅是客户端与服务端的交互,后台各个服务间的交互也需要约定的一套错误码。一般一个系统的错误码 code 都是唯一确定的。msg 不同场景下可能不一样,提供给用户的肯定是需要友好且不能暴露底层细节,给开发人员看的就要详细专业的错误内容。网关服务上面维护着多套不同语言的错误码提示语,响应的时候会根据客户端带的 Lang 信息进行国际化转译。模块模块编码错误编码底层描述中文提示语英文提示语库存10001商品规格表关联有误商品不存在goods don’t exist一般国际化的系统中会有多份 xxx_lang.properties文件,每一份代表一种语言的消息提示语。中文一般会转为 Unicode 编码进行存储(这个过程一般开发工具可以设置自动转),这样的处理可以规避不同开发环境下不同编码导致中文乱码。
在现实世界中,具体的实体被称为对象,观察这些对象的属性和行为,发现可以使用相同的特征去描述一类对象。例如:对象属性和行为美国总统特朗普姓名、年龄、工作中国明星成龙姓名、年龄、工作上海中心大厦高度、业主、维护北京中信大厦高度、业主、维护可以使用 “姓名、年龄、工作” 等特征去描述特朗普和成龙这一类对象,使用 “高度、业主、维护” 等特征去描述上海中心大厦、北京中信大厦这一类对象。在编程领域,类是对一组具有相同属性和行为的对象的抽象。例如, “人” 是一个抽象的概念,它是一个类或者类别,描述了具有 “姓名、年龄、工作” 等特征的一组对象;“楼” 是一个抽象的概念,它是一个类或者类别,描述了具有 “高度、业主、维护” 等特征的一组对象。
在编程领域中,通常把现实世界中的实体称为对象,例如:美国总统特朗普中国明星成龙上海中心大厦北京中信大厦这里需要注意的是,对象指的是一个具体的实体,不用于指代一个抽象的群体。例如:特朗普是一个特定的具体的人,可以说 “特朗普是一个对象”。他是一个美国人,因为美国人是一个抽象的概念,指代的是一类人,因此不能说 “美国人是一个对象”。类似的,上海中心大厦、北京中信大厦这些具体的大厦可以被称为对象,但是不使用 “大厦是一个对象” 这样的说法。
uni-app 的 API 与微信小程序 API 基本一致。掌握微信小程序 API 对后面的开发很有帮助。微信小程序 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api/
图片来源于网络学习任何知识之前肯定要对这个知识有一个简单的了解,当然学习 Go 语言也一样,这个小节我们就来简单认识下 Go 语言,了解下 Go 语言的来龙去脉。
注册微信小程序账号,获取到 AppID,我们后面配置的时候会用到。在 HBuilderX 工具栏,点击发行,选择小程序-微信。输入小程序名称和 AppID,单击发行就可以了。这样我们就会获得一个微信小程序的打包文件,接下来我们来发布微信小程序项目,打开微信小程序开发者工具,导入刚刚生成的微信小程序项目的打包文件,在微信小程序开发者工具中先测试一下,项目运行是否正常,项目测试没有问题后,点击右上角>>按钮,上传代码就可以发布微信小程序了,最后等待微信团队审核通过,别人就可以在线上访问到你的项目了。
现实世界中的实体有属性和行为,下面的表格列举了特朗普和成龙的属性和行为:对象属性行为特朗普姓名、年龄自我介绍成龙姓名、年龄自我介绍行为又被称为方法,它是对属性的操作,包括读取操作和修改操作。例如,在特朗普的自我介绍行为中,会读取他的属性:姓名和年龄。
在这一节知识点中,我将带领大家一起学习 <head>标签的相关知识点。<head>标签,是一个对于网页极其重要的标签。在整个前端开发领域算得上不可不知的程度。<head> 标签可谓是“藏龙卧虎”。别看它外观简短,却处处定义着一个网页的“大事”。<head> 也是 HTML 结构中不可获取的一部分。而关键字决定了你是否会被搜索引擎检索到。百度谷歌等搜索引擎想必大家的生活都已经离不开了吧。而网页视角则描述了用户从何种角度看一个网页。当然,作为一个完整的网页,最好还是有一些说明信息。那么,本节我们从四个知识点上来深入学习。首先是学习什么是网页头部信息,进而学习给网页添加关键字,然后学习一下什么叫网页视角,最后我们来学习给网页添加说明信息。
下表列出了 4 个常见的明星人物:姓名年龄周润发58成龙55刘德华53周星驰54进行归纳总结:这些人物具有较高的知名度,把这些人物归类为明星;每个明星两个属性:姓名和年龄。明星这个群体具有一个属性:数量,在这张表格中,明星的数量是 4;姓名和年龄等属性是用于描述具体的一个对象(例如:周润发),而人物的数量是用于描述明星这个类别。如果使用面向对象技术对以上实体进行描述,周润发、成龙、刘德华、周星驰等人物是对象,描述这些知名人物的抽象是类,需要区分位于不同层次的属性:隶属于具体对象的属性,例如:姓名、年龄隶属于类的属性,例如:人物数量本节讲解在 Python 中这两个层次上的属性的概念和使用。
在 Markdown 文档的公式中插入希腊字母的方法是,在美元符号包裹住的中间,直接插入 LaTeX 形式的希腊字母语法即可。实例 7:阿尔法:$\Alpha$,$\alpha$ 贝塔:$\Beta$,$\beta$ 伽玛:$\Gamma$,$\gamma$ 德尔塔:$\Delta$,$\delta$ 艾普西龙:$\Epsilon$,$\epsilon$ 捷塔:$\Zeta$,$\zeta$ 依塔:$\Eta$,$\eta$ 西塔:$\Theta$,$\theta$ 艾欧塔:$\Iota$,$\iota$ 喀帕:$\Kappa$,$\kappa$ 拉姆达:$\Lambda$,$\lambda$ 缪:$\Mu$,$\mu$ 拗:$\Nu$,$\nu$ 克西:$\Xi$,$\xi$ 欧麦克轮:$\Omicron$,$\omicron$ 派:$\Pi$,$\pi$ 柔:$\Rho$,$\rho$ 西格玛:$\Sigma$,$\sigma$ 套:$\Tau$,$\tau$ 宇普西龙:$\Upsilon$,$\upsilon$ 发艾:$\Phi$,$\phi$ 器:$\Chi$,$\chi$ 普赛:$\Psi$,$\psi$ 欧米伽:$\Omega$,$\omega$ 其渲染效果如下:这里需要注意:希腊字母区分大小写,其大小写的定义跟随公式中,声明该希腊字母的语法的首字母大小写。
① 定义:第三范式(Third Normal Form)要求数据库表中的每个字段和主键都直接相关,不能间接相关。② 案例解释:还是以第一范式中的user_info表作为案例,如果要存储每个用户的省份和省会城市,我们可能会设计出下面这样一张表:用户编号(user_id)姓名(username)年龄(age)座机电话(fixed_phone)手机电话(cell_phone)省份(province)省会城市(city)1小明201008618010002000北京市北京市2小红211008718010002001黑龙江省哈尔滨市3小王221008818010002002贵州省贵阳市我们将用户编号(user_id)作为主键,则姓名、年龄、座机电话、手机电话都和"用户"这个主体强相关,和主键直接相关,而省份和省会城市则和"用户"这个主体是弱相关,和主键间接相关,并且存在依赖关系:用户编号 -> 姓名,姓名 -> 省份,省份 -> 省会城市,这样构建了用户编号 -> 省会城市的间接传递关系,这种关系会导致数据冗余,而且在执行删除/修改/增加操作的时候,会产生异常情况:删除所有"贵州省"下的用户信息(即user_id = 3的记录),"贵州省"和"贵阳市"的信息也被删除了(显然不合理,因为省份这个定义和省份下的人员记录并没有关系)。所以我们需要将user_info表拆分,我们通过省份构建数据关系,优化后的用户(user_info)表如下:用户编号(user_id)姓名(username)年龄(age)座机电话(fixed_phone)手机电话(cell_phone)省份(province)1小明201008618010002000北京市2小红211008718010002001黑龙江省3小王221008818010002002贵州省独立拆分出的省份(province)表如下:省份(province)省会城市(city)北京市北京市黑龙江省哈尔滨市贵州省贵阳市③ 范式优点:提高了表的独立性,降低数据存储冗余。
pip 工具会从网站自动下载 Python 的第三方模块,提供下载 Python 第三方模块的网站被称为源。默认情况下,pip 从国外网站下载 Python 的第三方模块,速度非常的慢。为了加快下载速度,可以将 pip 的源改为国内的镜像源。国内常用的源如下:源的提供方源的 URL阿里云https://mirrors.aliyun.com/pypi/simple清华https://pypi.tuna.tsinghua.edu.cn/simple中国科技大学https://pypi.mirrors.ustc.edu.cn/simple华中理工大学http://pypi.hustunique.com豆瓣http://pypi.douban.com/simple
下面的列表总结了类和对象的关系和区别:对象是一个具体的实体,例如:特朗普是一个对象类是对多个具有相同属性的实体的抽象,例如:特朗普和成龙等实体具有 “姓名、年龄、工作” 等属性,通过归纳形成一个抽象概念——人,人是一个类对象与类的关系:对象属于某个类、对象不属于某个类,例如:特朗普是一个人,或者说特朗普属于人类
其实真实的原因是因为雪碧的英文名字是Sprite,而雪碧图的英文名是CSS Sprites,他俩同样都有Sprite这个词。左边是雪碧在国内的 Logo,右边是国外的 Logo。可以看到本来在没进入中国市场之前人家就叫Sprite(精灵),只不过进入了中国市场之后,中国区的负责人表示:用户去商店买汽水的时候如果对老板说:老板你这里有没有精灵?听起来就会感觉很奇怪,所以咱们不要被Sprite这个单词给限制住了,咱们应该起一个更符合中文语义的名字,于是乎“雪碧”诞生了。而雪碧图在国外叫做 CSS Sprite(CSS精灵)反正 Sprite 在国内被叫雪碧,那干脆不如咱们就叫它雪碧图吧!——来自最先接触到这项技术的人。所以后来接触这项技术的人也就跟随前人一起叫它雪碧图了。
通过配置文件,设置数据源信息。由于我们不再使用默认数据源,所以此处需要指定数据源类型为 DruidDataSource 。实例:# 指定数据源类型spring.datasource.type=com.alibaba.druid.pool.DruidDataSource# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=Easy@0122
Flask 是一个 Python 实现的 Web 开发微框架,但是这个“微”并不代表着 Flask 功能比较简陋、有所欠缺。微框架中的 “微” 意味着:Flask 旨在保持核心简单而易于扩展;Flask 不会替用户做出太多决策,比如使用何种数据库;Flask 的选项(比如使用何种模板引擎) 通常有多个,用户很容易替换。默认情况下,Flask 不包含数据库抽象层、模板引擎、身份认证或其它任何已有多种库可以胜任的功能,如下图所示。然而,Flask 支持用扩展来给应用添加这些功能,应用程序可以很方便的集成这些扩展。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。
我们只需要通过配置文件指定数据源信息, Spring Boot 就可以识别配置,并加载到数据源组件中。 JdbcTemplate 也可以自动识别该数据源,从而实现对数据库的操作。配置文件信息如下:实例:# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=123456需要注意的是,我们在 URL 配置中指定了编码方式,这样可以防止出现数据库中文乱码情况。同时指定了时区为北京时间所在的东八区(GMT%2B8),避免因时区问题导致错误。此时再次启动 Spring Boot 应用,正常运行,说明我们的数据源配置生效了。
微前端 尚处在发展时期,其核心概念和 微服务 相似。现阶段较为常用的微前端框架为 single-spa 和 qiankun,后者是基于前者实现的。该技术能做到 技术栈无关,即一个应用,能由多个不同技术的子应用构成,同时做到子应用的相互隔离,这里的隔离就可以选择采用 Web Components 实现。
本节我们讨论了如何利用第三方平台做我们系统的 OAuth2.0 认证中心,主要的知识点如下:Spring Security 实现了 OAuth2.0 客户端的常用功能,开发者可以轻松的将 Spring Boot 应用作为 OAuth2.0 客户端集成到安全体系中;在使用第三方作为 OAuth2.0 认证服务器时,首先要在第三方平台上完成应用注册,并获取到 Client ID 和 Client Secret 两个重要参数;使用第三方 OAuth2.0 认证源,可以简化系统开发中的关于认证的操作,并且可以更轻易的实现单点登录;使用第三方 OAuth2.0 认证源的时候,用户在本系统内的权限、详细用户信息等,仍需要在本地系统内维护;目前在国内支持度比较好的第三方认证源有:QQ、微信、微博、Github 等。下一节中,我们继续在 OAuth2.0 协议的基础上,构造出属于自己的认证中心。
可以通过 CDN 引入 ECharts 文件:<!-- bootstrap 服务 --><!-- bootstrap 提供的免费CDN服务,亲测非常稳定 --><script src="//cdn.bootcss.com/echarts/4.5.0/echarts.common.js"></script><!-- 七牛云存储服务 --><!-- 国内速度稳定,开放性强 --><script src="//cdn.staticfile.org/echarts/4.5.0/echarts.common.js"></script><!-- jsdeliver 服务 --><!-- 微软的CDN服务,虽然国内访问速度比不上国内CDN,但速度不至于太慢,有国际化需求的可以试试 --><script src="//cdn.jsdelivr.net/npm/echarts@4.5.0/echarts.common.js"></script><!-- cdnjs 服务 --><!-- 一个非常全的CDN服务,存储了大多数主流的js、css、图片库 --><script src="//cdnjs.cloudflare.com/ajax/libs/echarts/4.5.0/echarts.common.js"></script>
通过配置文件,设置数据源信息。实例:# 配置数据库驱动spring.datasource.driver-class-name=com.mysql.jdbc.Driver# 配置数据库urlspring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC# 配置数据库用户名spring.datasource.username=root# 配置数据库密码spring.datasource.password=Easy@0122
1. 独立的页面维护了全局 错误码错误码由5位整数构成2. 每个接口一个独立的 参数说明页面正常情况下出参只返回业务实体异常情况才有 errCode errMsg每个接口下也可能有自己的业务错误码
咱们打开新浪微博,然后随便找个带皇冠的,按下F12键(Mac用户按command+option+i)然后选中控制台的箭头,再点击皇冠:再点开这个图片可以发现:可以看到那些大 V 图标皇冠图标以及各种微博认证等图标,都是放在了一张雪碧图里(即使再牛的大 V,身份标志也是放在雪碧图中的)。
我们学一样技术或者一种工具,刚开始最好先了解一下它的来龙去脉。虽然无关使用,但通过它背后的故事可能会激发起我们学习它的浓厚兴趣,从这一点来讲还是有实际意义的。提起 Git,就不得不提起 Linus 和他的 Linux。计算机相关从业者大多都知道,linus 创建了 Linux 系统,但是 Linux 系统并不是由 Linus 一个人完成的,它依赖于广大的开发者源源不断的贡献代码来共同开发维护。那么问题来了,这么多人来共同维护一个系统,当时大家是怎样来保持高效的协作呢?这么多人提交代码,是怎么保证代码不冲突呢?你可能会想到使用过的一些版本控制系统,不过可能要让你失望了,虽然当时有很多版本控制系统像 CVS、SVN 等,但是都被 linus 舍弃了,因为这些集中式的版本控制系统需要联网,而且速度很受影响。所以,很长一段时间内,都是靠 linus 来自己手工合并的(默默送上大拇指)。但是,Linux 系统越来越庞大,这么下去不是个问题。直到 2002 年左右,BitMover 公司将他们的商业的版本控制系统 BitKeeper 给 Linux 社区免费使用,这下大家的工作量稍微减轻了些。但是好景不长,社区牛人聚集,还没一两个手脚乱动的?有人试图破解 BitKeeper 的协议,但是被 BitMover 公司发现了,于是乎 BitMover 公司一怒之下收回了他们的使用权。本来单车变摩托,现在又骑单车了。不过,Linus 就是 Linus,怎么可能重走旧路呢,毕竟合并代码手很疼。痛定思痛,没花多久自己用 C 开发了一套分布式版本管理系统,没错就是 Git!后来 Git 越来越流行,比如程序员大型交友网站 Github 使用的就是 Git 存储。
1969年,IBM 的技术人员 Charles Goldfarh 和 Edward Mosher 等人一起发明了通用标记语言 GML(Generalized Marked Language)。1985年在英国成立了国际 SGML 用户组织,在1986年,SGML 成为国际标准ISO8879:信息处理标准通用标记语言(Information processing Text and office system Standard generalized markup language)。HTML 和 XML 派生于 SGML,XML 可以被认为是它的一个子集,而 HTML 是它的一个应用。为了告诉浏览器我们需要展示什么内容,HTML 定义了一整套符号标记规范,这些规范包括设置文字的格式;创建列表;显示图片;显示多媒体;显示超链接;等等。
事件日志中包含屏幕电源状态,其中 0 表示屏幕关闭,1 表示屏幕打开,2 表示已锁屏。日志范例如下:grep screen_toggled bugreport-2015-10-18-16-52-22.txt10-18 15:05:04.383 992 992 I screen_toggled: 110-18 15:05:07.010 992 992 I screen_toggled: 010-18 15:23:15.063 992 992 I screen_toggled: 110-18 15:23:25.684 992 992 I screen_toggled: 010-18 15:36:31.623 992 992 I screen_toggled: 110-18 15:36:37.660 3283 3283 I screen_toggled: 2错误报告中还包含关于唤醒锁的统计信息,唤醒锁是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。唤醒锁总时长统计信息仅跟踪唤醒锁实际负责使设备保持唤醒状态的时间,不包括屏幕处于开启状态的时间。此外,如果同时持有多个唤醒锁,系统会在它们之间分配唤醒锁时长。
gem push my_gem_duxiao-0.1.0.gem命令行显示:Enter your RubyGems.org credentials.Don't have an account yet? Create one at https://rubygems.org/sign_up Email:然后根据提示输入刚刚注册的 rubygems.org 用户名和密码就可以了。上传完成之后,我们就可以在Gemfile里面使用gem 'my_gem_duxiao'来使用了!之后我们可以将我们刚刚制作的的Gem给放到Github上进行版本管理,这里就不再赘述。Tips:为了RubyGems社区的整洁,大家尽量不要发布一些没有用的Gems到线上去。经验:我们使用 Gemfile 来下载 Gem 的时候,尽量不要使用国外的 Gem 源,而使用国内的,这样下载速度会快很多,当然您如果在国外的服务器上使用 Gemfile,也要尽量使用国外的 Gem 源。source 'https://rubygems.org/' # 修改source为:https://gems.ruby-china.com/gem 'rails', '4.2.5'...国内的Gem源:https://gems.ruby-china.com/国外的Gem源:https://rubygems.org/修改 Gem 源的链接。
什么是标准?标准是对重复性事物和概念所做的统一规定,他以科学技术和实践经验的结合成果为基础,经有关方面协商一致,由主管机构批准,以特定形式发布作为共同遵守的准则和依据。在这个标准概念大行其道的今天,如果大家在生活中稍微注意一下,其实可以很容易发现,我们生活在一个标准化的世界里,每个产品的外包装或者标签上都会注明相应的执行标准。标准贯穿着我们的衣食住行。。总而言之,标准无处不在。当然标准具有行业性与地域性。每个国家基本都有自己的标准,这些标准有些是自己独立创造的,但更多的,为了与国际上大部分标准兼容,基本上会使用国际上一些通用的标准,只是改一下名字就可以了。作为软件行业中的老大哥级人物。C 语言也有自己的标准,而且是国际标准。如果大家遵循同一个标准,那么就会避免分歧的产生,避免出现很多不必要的麻烦和困扰。按照这统一标准就不会出现不兼容的问题。我们先来看下 C 语言标准的发展历史:
安全密钥交换与非对称密钥算法,推动了网络安全通信的发展,在认证与安全诉求越来越迫切的环境下,一些厂商嗅探到市场的机遇,逐渐推出了相应的认证服务。信息的安全关系到国家安全和经济利益,因此我国这几年也在积极探索网络安全的标准化建设,这些标准并不仅仅局限于证书的签名算法,也包括了物理厂房的建设,人员的管理流程规则制度。当然我们的网络安全建设一方面要保证自己足够安全,另一方面也要对接国际,毕竟今天的网络今天的经济都是全世界共同的。