为了账号安全,请及时绑定邮箱和手机立即绑定
3. 国际化

国际化的功能离不开错误码的支持,客户端指定语言到服务端去请求,当出错了服务端会根据错误码和语言找到对应的国际化提示语。从上面图中我们发现,错误码不仅仅是客户端与服务端的交互,后台各个服务间的交互也需要约定的一套错误码。一般一个系统的错误码 code 都是唯一确定的。msg 不同场景下可能不一样,提供给用户的肯定是需要友好且不能暴露底层细节,给开发人员看的就要详细专业的错误内容。网关服务上面维护着多套不同语言的错误码提示语,响应的时候会根据客户端带的 Lang 信息进行国际化转译。模块模块编码错误编码底层描述中文提示语英文提示语库存10001商品规格表关联有误商品不存在goods don’t exist一般国际化的系统中会有多份 xxx_lang.properties文件,每一份代表一种语言的消息提示语。中文一般会转为 Unicode 编码进行存储(这个过程一般开发工具可以设置自动转),这样的处理可以规避不同开发环境下不同编码导致中文乱码。

2. 国际化

上述例子发现输出的结果是英文的,显然是不适合在国内环境使用,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>有关国际化的更多内容可以参考文档。

3.1 微信小程序 API

uni-app 的 API 与微信小程序 API 基本一致。掌握微信小程序 API 对后面的开发很有帮助。微信小程序 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api/

3.1 打包为微信小程序

注册微信小程序账号,获取到 AppID,我们后面配置的时候会用到。在 HBuilderX 工具栏,点击发行,选择小程序-微信。输入小程序名称和 AppID,单击发行就可以了。这样我们就会获得一个微信小程序的打包文件,接下来我们来发布微信小程序项目,打开微信小程序开发者工具,导入刚刚生成的微信小程序项目的打包文件,在微信小程序开发者工具中先测试一下,项目运行是否正常,项目测试没有问题后,点击右上角>>按钮,上传代码就可以发布微信小程序了,最后等待微信团队审核通过,别人就可以在线上访问到你的项目了。

2. 实际原因

其实真实的原因是因为雪碧的英文名字是Sprite,而雪碧图的英文名是CSS Sprites,他俩同样都有Sprite这个词。左边是雪碧在国内的 Logo,右边是国外的 Logo。可以看到本来在没进入中国市场之前人家就叫Sprite(精灵),只不过进入了中国市场之后,中国区的负责人表示:用户去商店买汽水的时候如果对老板说:老板你这里有没有精灵?听起来就会感觉很奇怪,所以咱们不要被Sprite这个单词给限制住了,咱们应该起一个更符合中文语义的名字,于是乎“雪碧”诞生了。而雪碧图在国外叫做 CSS Sprite(CSS精灵)反正 Sprite 在国内被叫雪碧,那干脆不如咱们就叫它雪碧图吧!——来自最先接触到这项技术的人。所以后来接触这项技术的人也就跟随前人一起叫它雪碧图了。

5. 真实案例分享

腾讯新闻<h1>女子买4件茅台酒全是假的 店家赔偿44200元</h1><h3> 烟酒行里买茅台,4件都是假的</h3><hr><p> 家住贵阳白云区的王女士,这两天有点郁闷,因为她在一家烟酒行购买了4件茅台酒,结果4件酒都有问题,面对权威部门的鉴定结果,王女士只好向工商、消协等部门进行了反映。目前,相关部门正在调查中</p>

2.1 微框架

Flask 是一个 Python 实现的 Web 开发微框架,但是这个“微”并不代表着 Flask 功能比较简陋、有所欠缺。微框架中的 “微” 意味着:Flask 旨在保持核心简单而易于扩展;Flask 不会替用户做出太多决策,比如使用何种数据库;Flask 的选项(比如使用何种模板引擎) 通常有多个,用户很容易替换。默认情况下,Flask 不包含数据库抽象层、模板引擎、身份认证或其它任何已有多种库可以胜任的功能,如下图所示。然而,Flask 支持用扩展来给应用添加这些功能,应用程序可以很方便的集成这些扩展。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。

2.1 微前端

微前端 尚处在发展时期,其核心概念和 微服务 相似。现阶段较为常用的微前端框架为 single-spa 和 qiankun,后者是基于前者实现的。该技术能做到 技术栈无关,即一个应用,能由多个不同技术的子应用构成,同时做到子应用的相互隔离,这里的隔离就可以选择采用 Web Components 实现。

3. CDN

可以通过 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>

4.2 微信

1. 独立的页面维护了全局 错误码错误码由5位整数构成2. 每个接口一个独立的 参数说明页面正常情况下出参只返回业务实体异常情况才有 errCode errMsg每个接口下也可能有自己的业务错误码

新浪微博

咱们打开新浪微博,然后随便找个带皇冠的,按下F12键(Mac用户按command+option+i)然后选中控制台的箭头,再点击皇冠:再点开这个图片可以发现:可以看到那些大 V 图标皇冠图标以及各种微博认证等图标,都是放在了一张雪碧图里(即使再牛的大 V,身份标志也是放在雪碧图中的)。

1. HTML来历

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 定义了一整套符号标记规范,这些规范包括设置文字的格式;创建列表;显示图片;显示多媒体;显示超链接;等等。

3. 使用场景及应用实例

全局字体字号的修改通常用于对格式有严格要求的场景,比如毕业论文、或者招投标书之类的官方文档。局部字体字号的修改更常见于个人博客类文章、用多元化的字体形式丰富文章的 “性格”。实例 5:制作一段标签云效果。#### 标签云实例<font face="KAI" size=5>大江东去</font><font face="KAI" size=3>海之一粟</font><font face="KAI">江海寄余生</font><font face="song" size=5>天涯何处无芳草</font> <font face="KAI" size=5>一蓑烟雨任平生</font><font face="HEI" size=7>苏东坡</font><font face="HEI" size=4>寂寞沙洲冷</font> <font size=6>但愿人长久</font><font size=5>十年生死两茫茫</font><font size=2>诗酒趁年华</font>其渲染结果如下:

C 语言的标准

什么是标准?标准是对重复性事物和概念所做的统一规定,他以科学技术和实践经验的结合成果为基础,经有关方面协商一致,由主管机构批准,以特定形式发布作为共同遵守的准则和依据。在这个标准概念大行其道的今天,如果大家在生活中稍微注意一下,其实可以很容易发现,我们生活在一个标准化的世界里,每个产品的外包装或者标签上都会注明相应的执行标准。标准贯穿着我们的衣食住行。。总而言之,标准无处不在。当然标准具有行业性与地域性。每个国家基本都有自己的标准,这些标准有些是自己独立创造的,但更多的,为了与国际上大部分标准兼容,基本上会使用国际上一些通用的标准,只是改一下名字就可以了。作为软件行业中的老大哥级人物。C 语言也有自己的标准,而且是国际标准。如果大家遵循同一个标准,那么就会避免分歧的产生,避免出现很多不必要的麻烦和困扰。按照这统一标准就不会出现不兼容的问题。我们先来看下 C 语言标准的发展历史:

1. 简介

安全密钥交换与非对称密钥算法,推动了网络安全通信的发展,在认证与安全诉求越来越迫切的环境下,一些厂商嗅探到市场的机遇,逐渐推出了相应的认证服务。信息的安全关系到国家安全和经济利益,因此我国这几年也在积极探索网络安全的标准化建设,这些标准并不仅仅局限于证书的签名算法,也包括了物理厂房的建设,人员的管理流程规则制度。当然我们的网络安全建设一方面要保证自己足够安全,另一方面也要对接国际,毕竟今天的网络今天的经济都是全世界共同的。

3.1 VueDevTools 安装

chrome 商店直接安装vue-devtools 可以从 chrome 商店直接下载安装。我们可以打开 chrome 商店,搜索 vue-dev-tools,点击 “添加至 chrome” 即可。手动安装将 vue-devtools 克隆到本地。git clone https://github.com/vuejs/vue-devtools.git安装项目所需要的安装包npm install编译项目文件npm run build添加至 chrome 浏览器1、游览器输入地址“chrome://extensions/” 进入扩展程序页面,2、点击“加载已解压的扩展程序...”按钮3、选择vue-devtools>shells下的chrome文件夹。

3. 查看签名信息

我们打完包之后如何查看签名信息呢?有以下 2 种方法:方法一:其实 Gradle 默认给我们内置了很多任务,里面就包含查看应用签名的任务 signingReport。我们执行这个任务就可以看到应用的签名了。方法二:第二种方法就是直接使用命令查看签名信息,我们在控制台输入下面的命令keytool -list -v -keystore "[签名文件路径]"就可以看到签名信息了,包括我们之前写的组织/公司,省份,国家等。 Tips: 我们对于签名文件的注意点就只有下面一点,设置签名的 key 和密码时不要太过复杂,不然在看签名信息的时候,输入密钥库口令时看不到输入的内容,很容易输入错误。

2. 代理配置

go mod 虽然可以直接帮我们下载好我们需要的包,但是因为 Go 语言很多包都是在国外的服务器上,国内下载具有一定的困难。但是不用担心,go mod 提供了代理服务,同时很多国内的云服务器产商都提供了自己的代理服务:阿里云: https://mirrors.aliyun.com/goproxy 微软: https://goproxy.io 七牛云: https://goproxy.cn GoCenter: https://gocenter.io

2. 实际业务场景描述

业务场景描述有这样一个真实的业务场景:在某大厂某销售业务项目中,由于某大厂销售业务板块业务的持续增加,导致之前原本设计好的项目架构出现了问题,不足以支撑持续增长的业务需要,于是,某大厂程序员对项目架构做了拆分,并最终形成了以 Spring Cloud 为基础架构的微服务分布式项目架构。在拆分了项目架构之后,虽然可以支撑持续增长的业务需要,但是,在拆分后的项目架构中,Hystrix 无法对所有项目进行监控,即 Hystrix 服务监控平台只能监控一个分散的项目,无法对项目整体进行监控。问题原因分析在解决问题之前,我们首先来分析一下这种问题产生的原因。上述场景场景中,项目的架构方式是微服务的分布式架构,而一般来说的 Hystrix 微服务监控平台默认只对一个项目实例起作用,所以,也就导致了一个微服务平台只对一个微服务实例起作用。

4. 模板方法模式

模板方法模式是定义一个操作中的算法的骨架,从而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通常对于一些重要的复杂方法和多个子类共有的方法且逻辑相同的情况下会使用模板方法模式。比如用户第三方用户认证的时候就比较适合使用模板方法。我们来看一个例子:假设我们现在需要用到微信、微博的第三方用户授权来获取用户的信息。//使用模板方法模式描述获取第三方用户信息的过程 public abstract class Authentication{ public void checkUserAuthentication(){ checkIdentity(); fetchInfo(); } ​ protected abstract void checkIdentity(); protected abstract void fetchInfo(); } ​ //微信用户 public class WechatAuthenication extends Authentication{ @Override protected void checkIdentity() { System.out.println("获得微信用户授权"); } ​ @Override protected void fetchInfo() { System.out.println("获取微信用信息"); } } ​ //微信用户 public class WeiboAuthenication extends Authentication{ @Override protected void checkIdentity() { System.out.println("获得微博用户授权"); } ​ @Override protected void fetchInfo() { System.out.println("获取微博用信息"); } } ​ //调用模板方法 public class Demo{ public static void main(String...s){ Authentication auth = new WechatAuthenication(); auth.checkUserAuthentication(); auth = new WeiboAuthenication(); auth.checkUserAuthentication(); } }输出结果:获得微信用户授权 获取微信用信信息 获得微博用户授权 获取微博用信信息现在我们使用 Lambda 表达式换个角度来思考模板方法模式。如果我们用函数式接口来组织模板方法中的调用过程,相比使用继承来构建要显得灵活的多。//定义一个处理接口,用来处理一项事务,如授权或者获取信息。 public interface Processer{ public void process(); } ​ //封装调用过程 public class Authentication{ private final Processer identity; private final Processer userinfo; public Authentication(Criteria identity,Criteria userinfo){ this.identity = identity; this.userinfo = userinfo; } ​ public void checkUserAuthentication(){ identity.process(); userinfo.process(); } } ​ //使用模板方法 public class Demo{ Authentication auth = new Authentication(()->System.out.println("获得微信用户授权"), ()->System.out.println("获取微信用户信息")); auth.checkUserAuthentication(); auth = new Authentication(()->System.out.println("获得微博用户授权"), ()->System.out.println("获取微博用户信息")); auth.checkUserAuthentication(); }输出结果:获得微信用户授权 获取微信用信信息 获得微博用户授权 获取微博用信信息此时,我们的模板方法得到了大幅的简化,同时通过函数接口让模板方法获得了极大的灵活性。

网络模型

计算机的网络模型定义了计算机数据的传输过程,当前有以下 2 种主流模型:国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为 OSI 参考模型或七层模型;工业生产中实际用到的 TCP/IP 四层模型。这两者者的关系就好比,车间里面一个贴在墙上很规范的流程图,一个是实际生产中因为成本/便捷/效率等因素最终采用的流程。但是不管是七层模型还是四层模型,他们实现的目无非是为了解决两个问题:数据转成电信号;目标主机的寻址。

3.1 关于微服务监控平台

技巧 1如果我们的微服务监控平台没有任何数据,或者说,在打开微服务平台之后,各参数一直处于 loading 状态,这个时候,我们只需要在服务端调用任意一个服务接口即可,这样在微服务监控平台,我们就能看到被监控实例的参数了。技巧 2如果我们在访问 /actuator/hystrix.stream 路径时,系统找不到对应的路径,即报 404 异常,那么我们需要在对应项目的启动类中添加一个 Bean :@Beanpublic ServletRegistrationBean hystrixMetricsStreamServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); registration.addUrlMappings("/hystrix.stream"); return registration;}这样我们就能正常访问 /actuator/hystrix.stream 下的路径了。

Python 的对象和类

在编程领域中,通常把现实世界中的实体称为对象,例如:美国总统特朗普中国明星成龙上海中心大厦北京中信大厦这里需要注意的是,对象指的是一个具体的实体,不用于指代一个抽象的群体。例如:特朗普是一个特定的具体的人,可以说 “特朗普是一个对象”。他是一个美国人,因为美国人是一个抽象的概念,指代的是一类人,因此不能说 “美国人是一个对象”。类似的,上海中心大厦、北京中信大厦这些具体的大厦可以被称为对象,但是不使用 “大厦是一个对象” 这样的说法。

4. 配置信息的保存

无论是临时还是永久配置信息,PyCharm 都会自动把相关信息记录在<project directory>/.idea/workspace.xml 文件中 Run Manager 节点下, 如下图所示:Tips: 如果 workspace.xml 记录的运行配置信息仅服务于你个人,通常在实际工作中,这个文件是排除在版本控制之外的,即不会提交到代码库。

4. 小结

本节我们讨论了如何利用第三方平台做我们系统的 OAuth2.0 认证中心,主要的知识点如下:Spring Security 实现了 OAuth2.0 客户端的常用功能,开发者可以轻松的将 Spring Boot 应用作为 OAuth2.0 客户端集成到安全体系中;在使用第三方作为 OAuth2.0 认证服务器时,首先要在第三方平台上完成应用注册,并获取到 Client ID 和 Client Secret 两个重要参数;使用第三方 OAuth2.0 认证源,可以简化系统开发中的关于认证的操作,并且可以更轻易的实现单点登录;使用第三方 OAuth2.0 认证源的时候,用户在本系统内的权限、详细用户信息等,仍需要在本地系统内维护;目前在国内支持度比较好的第三方认证源有:QQ、微信、微博、Github 等。下一节中,我们继续在 OAuth2.0 协议的基础上,构造出属于自己的认证中心。

5. 信息综合搜索

信息的搜集往往不是单一的,是由类似上面列举的很多方式的组合。我们经常听到一个词 人肉搜索,大家都很惊讶网络神人技术太强,其实主要还是因为我们散布在网上的资料信息太多了。这些零碎的资料拼一拼还是能获得很全的信息的。搜索引擎随便输入你的名字,或者外加几个关键词可能查到你在哪所学校,参加了某某活动,获得了某某名次的奖励你在哪所公司,缴交的一些社保信息你在某个网站的评论根据你的昵称到 QQ 上面搜索,同一个昵称到处用概率还是很大的,如果有手机号那就更加准确了,紧接着可以根据你的 QQ 空间获取更多你私人的信息。(这以前是非常好查的,现在腾讯也一直在完善信息安全这块)也可能是到其他平台去搜索:微博,头条,人人网,58同城 等照片网上搜索相似百度搜索引擎就有根据图片搜索到功能到政府的一些网站,如 信用xx ,上面根据法人名字也能搜索不少有价值的东西。

5. ABA 问题解决之版本号机制

讲解 CAS 原理时,对于解决办法进行了简要的介绍,仅仅是一笔带过。这里进行较详细的阐释。其实 ABA 问题的解决,我们通常通过如下方式进行解决:版本号机制。我们一起来看下版本号机制:版本号机制:一般是在数据中加上一个数据版本号 version 字段,表示数据被修改的次数,当数据被修改时,version 值会加 1。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据中的 version 值相等时才更新,否则重试更新操作,直到更新成功。场景示例:假设商店类 Shop 中有一个 version 字段,当前值为 1 ;而当前商品数量为 50。店员 A 此时将其读出( version=1 ),并将商品数量扣除 10,更新为 50 - 10 = 40;在店员 A 操作的过程中,店员 B 也读入此信息( version=1 ),并将商品数量扣除 20,更新为 50 - 20 = 30;店员 A 完成了修改工作,将数据版本号加 1( version=2 ),商品数量为 40,提交更新,此时由于提交数据版本大于记录当前版本,数据被更新,数据记录 version 更新为 2 ;店员 B 完成了操作,也将版本号加 1( version=2 ),试图更新商品数量为 30。但此时比对数据记录版本时发现,店员 B 提交的数据版本号为 2 ,数据记录当前版本也为 2 ,不满足 “ 提交版本必须大于记录当前版本才能执行更新 “ 的乐观锁策略,因此,店员 B 的提交被驳回;店员 B 再次重新获取数据,version = 2,商品数量 40。在这个基础上继续执行自己扣除 20 的操作,商品数量更新为 40 - 20 = 20;店员 B 将版本号加 1 ,version = 3,将之前的记录 version 2 更新为 3 ,将之前的数量 40 更新 为 20。从如上描述来看,所有的操作都不会出现脏数据,关键在于版本号的控制。Tips:Java 对于乐观锁的使用进行了良好的封装,我们可以直接使用并发编程包来进行乐观锁的使用。本节接下来所使用的 Atomic 操作即为封装好的操作。之所以还要对 CAS 原理以及 ABA 问题进行深入的分析,主要是为了让学习者了解底层的原理,以便更好地在不同的场景下选择使用锁的类型。

1. C 语言标准历史

序号别称全称1C18ISO/IEC 9899:20182C11ISO/IEC 9899:20113C99ISO/IEC 9899:19994C95ISO/IEC 9899:1990/AMD 1:19955C90ISO/IEC 9899:19906C89ANSI X3.159-1989最新执行的 C 语言的国际标准是序号为 1 的 C18 标准(ISO/IEC 9899:2018 (C18)),这个标准是 2018 年通过的 C 语言国际标准。那么 C 语言的标准中都规定了哪些内容呢?下面我们一起来看下:

3. URL

通过前面我们知道 URI 是网络中用于标识某个对象的规约,URI 包含了多个 <scheme>,所以 URL 是 scheme = http 的 URI。URL 是 URI 的子集,只要是 URL 一定就是 URI ,反过来不成立。URL 和 URI 只差了一个字母,Location 和 Identifier:Location:定位,着重强调的是位置信息;Identifier:标识,只是一种全局唯一的昵称。举例:美国是一个国家,它只是一种标识,通过美国这两个字我们无法知道这个国家在哪里。如果这个标识换成了经纬度,那我们就能知道这个经纬度对应的是美国,并且知道美国所处的位置信息。

5. 过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果。比如,我们想获取全校师生的个人信息,如果将这些信息一股脑地全部展示在网页上,是不明智也是不现实的。如果数据量太大,在实际开发中我们会采用分页展示的形式。另外,如果想在一次考试后,按照成绩高低展示学生信息,那么可以通过过滤信息来实现。所谓过滤,就是在 URL 中添加一下限制参数。下面是一些常见的参数。?limit=10:指定返回记录的数量?offset=10:指定返回记录的开始位置。?page=2&per_page=100:指定第几页,以及每页的记录数。?sortby=score&order=asc:指定返回结果按照学生的成绩(score)正序(asc)排列顺序。参数的设计允许存在冗余,即允许 API 路径和 URL 参数允许有重复。比如,想要查询某个班级所有学生信息,我们可以设计 GET /classes/ID/students 与 GET /students?class_id=ID 两种地址,任何一种都可得到相同的结果。

首页上一页1234567下一页尾页
直播
查看课程详情
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号