Koa框架——coderhub实战

https://github.com/zep03/koa-coderhub/commits/main

一、coderhub功能接口说明

Coderhub旨在创建一个程序员分享生活动态的平台。
完整的项目接口包括:

  1. 面向用户的业务接口;
  2. 面向企业或者内部的后台管理接口;

完成的功能如下:
1.用户管理系统
2.内容管理系统
3.内容评论管理
4.内容标签管理
5.文件管理系统
其他功能其实都是非常相似的

二、项目的搭建

功能一:目录结构的划分:

  1. 按照功能模块划分;
  2. 按照业务模块划分;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

功能二:应用配置信息写到环境变量

  1. 编写.env文件
  2. 通过dotenv加载配置的变量

npm 官方文档的这样介绍 dotenv: Dotenv 是一个零依赖的模块,它能将环境变量中的变量从 .env 文件加载到 process.env 中。
在这里插入图片描述

功能三:创建和启动服务器

  • 基于koa创建app;
    -启动服务器;

三、用户注册接口

用户注册接口编写流程:

  1. 注册用户路由router编写;
  2. 处理函数的控制器controller编写;
  3. 操作数据库的service编写;

在这里插入图片描述
在这里插入图片描述

数据库连接操作:mysql2
5. 创建数据库连接;
6. 测试数据库连接是否成功;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注册用户校验

  1. 用户名或密码不能为空

在这里插入图片描述
在这里插入图片描述

  1. 用户名没有被注册过
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

密码加密存储:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

四、用户登录接口

用户登录接口编写流程:

  1. 授权router的编写;
  2. 处理函数的controller编写;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    实现动态加载路由:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

验证的中间件:
3. 账号和密码是否为空;
4. 用户名是否存在;
5. 校验密码是否一致;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

登录成功返回凭证:
6. cookie+session;
7. Token令牌;

五、为什么需要登录凭证呢?

web开发中,我们使用最多的协议是http,但是http是一个无状态的协议。

无状态的协议?什么叫做无状态协议呢?
举个例子:
我们登录了一个网站 www.coderhub.com(当然这个网站不存在,是我要开发一个的);
登录的时候我们需要输入用户名和密码:比如用户名coderwhy,密码Coderwhy666.;

登录成功之后,我们要以coderwhy的身份去访问其他的数据和资源,还是通过http请求去访问。

  • coderhub的服务器会问:你谁呀?
  • coderwhy说:我是coderwhy呀,刚刚登录过呀;
  • coderhub:怎么证明你刚刚登录过呀?
  • coderwhy说:这。。。,http没有告诉你吗?
  • coderhub:http的每次请求对我来说都是一个单独的请求,和之前请求过什么没有关系。

看到了吧?这就是http的无状态,也就是服务器不知道你上一步做了什么,我们必须得有一个办法可以证明我们登录过

六、认识cookie

Cookie(复数形态Cookies),又称为“小甜饼”。类型为“小型文本文件,某些网站为了辨别用户身份而存储在用户本地终端(Client Side)上的数据。

  • 浏览器会在特定的情况下携带上cookie来发送请求,我们可以通过cookie来获取一些信息;

Cookie总是保存在客户端中,按在客户端中的存储位置,Cookie可以分为内存Cookie和硬盘Cookie。

  • 内存Cookie由浏览器维护,保存在内存中,浏览器关闭时Cookie就会消失,其存在时间是短暂的;
  • 硬盘Cookie保存在硬盘中,有一个过期时间,用户手动清理或者过期时间到时,才会被清理;

如何判断一个cookie是内存cookie还是硬盘cookie呢?

  • 没有设置过期时间,默认情况下cookie是内存cookie,在关闭浏览器时会自动删除;
  • 有设置过期时间,并且过期时间不为0或者负数的cookie,是硬盘cookie,需要手动或者到期时,才会删除;

七、cookie常见的属性

cookie的生命周期:

  • 默认情况下的cookie是内存cookie,也称之为会话cookie,也就是在浏览器关闭时会自动被删除;
  • 我们可以通过设置expires或者max-age来设置过期的时间;
    expires:设置的是Date.toUTCString(),设置格式是;expires=date-in-GMTString-format;
    max-age:设置过期的秒钟,;max-age=max-age-in-seconds (例如一年为60*60*24*365);

cookie的作用域:(允许cookie发送给哪些URL)

  1. Domain:指定哪些主机可以接受cookie
  • 如果不指定,那么默认是 origin,不包括子域名。
  • 如果指定Domain,则包含子域名。例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如developer.mozilla.org)。
  1. Path:指定主机下哪些路径可以接受cookie
    例如,设置 Path=/docs,则以下地址都会匹配:
    /docs
    /docs/Web/
    /docs/Web/HTTP

八、客户端设置cookie

js直接设置和获取cookie:
在这里插入图片描述

这个cookie会在会话关闭时被删除掉:
在这里插入图片描述
设置cookie,同时设置过期时间(默认单位是秒钟):
在这里插入图片描述

九、服务器设置cookie

Koa中默认支持直接操作cookie

  • /test请求中设置cookie
  • /demo请求中获取cookie

在这里插入图片描述

十、Session是基于cookie实现机制

在koa中,我们可以借助于 koa-session 来实现session认证:
在这里插入图片描述
在这里插入图片描述

设置secrets加密字符串,用于加密数据:
在这里插入图片描述
在这里插入图片描述

十一、认识token

cookie和session的方式有很多的缺点:

  • Cookie会被附加在每个HTTP请求中,所以无形中增加了流量(事实上某些请求是不需要的);
  • Cookie是明文传递的,所以存在安全性的问题;
  • Cookie的大小限制是4KB,对于复杂的需求来说是不够的;
  • 对于浏览器外的其他客户端(比如iOS、Android),必须手动的设置cookie和session;
  • 对于分布式系统和服务器集群中如何可以保证其他系统也可以正确的解析session?

所以,在目前的前后端分离的开发过程中,使用token来进行身份验证的是最多的情况:

  • token可以翻译为令牌;
  • 也就是在验证了用户账号和密码正确的情况,给用户颁发一个令牌;
  • 这个令牌作为后续用户访问一些接口或者资源的凭证;
  • 我们可以根据这个凭证来判断用户是否有权限来访问;

所以token的使用应该分成两个重要的步骤:

  • 生成token:登录的时候,颁发token;
  • 验证token:访问某些资源或者接口时,验证token;

十二、JWT实现Token机制

在这里插入图片描述

JWT生成的Token由三部分组成:

  1. header
  • alg:采用的加密算法,默认是 HMAC SHA256(HS256),采用同一个密钥进行
    加密和解密;
  • typ:JWT,固定值,通常都写成JWT即可;
  • 会通过base64Url算法进行编码;
  1. payload
  • 携带的数据,比如我们可以将用户的id和name放到payload中;
  • 默认也会携带iat(issued at),令牌的签发时间;
  • 我们也可以设置过期时间:exp(expiration time);
  • 会通过base64Url算法进行编码
  1. signature
  • 设置一个secretKey,通过将前两个的结果合并后进行HMACSHA256的算法;
  • HMACSHA256(base64Url(header)+.+base64Url(payload), secretKey);
  • 但是如果secretKey暴露是一件非常危险的事情,因为之后就可以模拟颁发token,也可以解密token;

十三、Token的使用

当然,在真实开发中,我们可以直接使用一个库来完成: jsonwebtoken
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十四、非对称加密

前面我们说过,HS256加密算法一单密钥暴露就是非常危险的事情:

  • 比如在分布式系统中,每一个子系统都需要获取到密钥;
  • 那么拿到这个密钥后这个子系统既可以发布另外,也可以验证令牌;
  • 但是对于一些资源服务器来说,它们只需要有验证令牌的能力就可以了;

这个时候我们可以使用非对称加密,RS256:

  • 私钥(private key):用于发布令牌;
  • 公钥(public key):用于验证令牌;

我们可以使用openssl来生成一对私钥和公钥:

  • Mac直接使用terminal终端即可;
  • Windows默认的cmd终端是不能直接使用的,建议直接使用git bash终端;
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

十五、使用公钥和私钥签发和验证签名

在这里插入图片描述
在这里插入图片描述
注意:
在这里插入图片描述
在这里插入图片描述

const Koa = require('koa')
const Router = require('koa-router')
const jwt = require('jsonwebtoken')
const fs = require('fs')
const path = require('path')const app = new Koa()
const testRouter = new Router()const PRIVATE_KEY = fs.readFileSync(path.join(__dirname, './keys/private.key'));
const PUBLIC_KEY = fs.readFileSync(path.join(__dirname, './keys/public.key'));// 登录接口
testRouter.post('/test', (ctx, next) => {const user = {id: 110, name: 'zep'}const token = jwt.sign(user, PRIVATE_KEY,{expiresIn: 60 * 60,algorithm: 'RS256'})ctx.body = token
})// 验证接口
testRouter.get('/demo', (ctx, next) => {const authorization = ctx.headers.authorizationconst token = authorization.replace('Bearer ', '')try {const result = jwt.verify(token, PUBLIC_KEY, {algorithm: ['RS256']})ctx.body = result} catch (err) {console.log(err.message)ctx.body = err.message}
})app.use(testRouter.routes())app.listen(8001, (err) => {console.log('服务器启动成功')
})

在这里插入图片描述
在这里插入图片描述

十六、派发令牌和验证令牌

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
postman中设置全局变量token:
在这里插入图片描述
在这里插入图片描述

十七、发布和查询动态内容

创建新的表 moment
在这里插入图片描述

定义发布动态内容的接口

  • 定义路由接口
  • 验证用户登录
  • Controller和Service中处理内容
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

定义查询单个内容的接口

  • 根据momentId查询接口内容;

在这里插入图片描述

SELECT m.id, m.content, m.createAt, m.updateAt as updateTime,
JSON_OBJECT('id', u.id, 'name', u.name) as user
FROM moment as m
left join user as u on m.user_id = u.id
where m.id = 1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义查询多条内容的接口

  • 查询所有moment接口内容(根据offset和limit决定查询数量)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十八、修改和删除动态内容

定义修改动态内容的接口

  • 定义路由接口
  • 验证用户登录
  • 验证用户的权限
  • Controller和Service中的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

定义删除内容的接口

  • 定义路由接口
  • 验证用户登录
  • 验证用户权限
  • Controller和Service的处理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十九、发表和修改评论内容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:
关系表的级联更新: on update cascade
on delete cascade 是级联删除的意思
意思是 当你更新或删除主键表时,那么外键表也会跟随一起更新或删除

创建新的表 comment
定义发布评论内容的接口

  • 定义路由接口
  • 验证用户登录
  • Controller和Service中处理内容
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

回复评论接口:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义修改评论内容的接口

  • 定义路由接口
  • 验证用户登录
  • 验证用户的权限
  • Controller和Service中的处理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二十、删除和查询评论内容

定义删除评论内容的接口

  • 定义路由接口
  • 验证用户登录
  • 验证用户权限 p Controller和Service的处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询动态的时候,同时显示评论信息

  • 查询多个动态时,显示评论的个数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 查询单个动态时,显示评论的列表
    在这里插入图片描述
    根据动态的id获取评论详情:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二十一、标签接口开发

在这里插入图片描述

创建标签的表
在这里插入图片描述

定义创建标签接口

  • 路由配置Router
  • 验证用户登录
  • 创建标签
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建标签和动态关系表
在这里插入图片描述

定义给动态添加标签的接口

  • 给动态添加新的接口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

查询所有标签列表:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询标签接口

  • 查询动态列表,展示标签数量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 根据动态id,展示标签列表
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二十二、上传头像图片

在这里插入图片描述

上传头像逻辑:

  1. 定义上传图像的接口
  2. 定义获取图像的接口
  3. 请求用户信息时,获取头像

分析实现思路:

  • 1.图片(文件)上传 /upload/avatar
    目的:服务器端可以保存一张图片
  • 2.提供一个接口,可以让用户获取图片
    /1/avatar -> 找到图片\读取图片\content-type: image/jpeg\返回图像的信息
  • 3.将URL存储到用户信息中
    avatarURL: 头像的地址
  • 4.获取信息时,获取用户的头像
    在这里插入图片描述

1. 定义上传图像的接口,将用户上传的图片保存到服务器本地的uploads/avatar文件夹下,然后再把图片的信息保存到数据库中的avatar表中:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 定义获取图像的接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 请求用户信息时,获取头像

在这里插入图片描述
在这里插入图片描述

3.1 修改上传头像接口,不仅要把上传的头像信息保存到数据库的avatar表中,还要将上传的用户头像的avatarUrl保存到数据库的用户表中:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2 修改原来的动态查询接口,增加avatarUrl字段:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二十三、上传动态的配图

在这里插入图片描述
在这里插入图片描述

上传动态配图

  • 定义上传动态配图的接口
  • 定义获取动态配图的接口
  • 获取动态时,获取配图信息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1. 定义上传动态配图的接口

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 定义获取动态配图的接口

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. 获取动态时,获取配图信息

根据momentId获取动态的配图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

附加:处理上传的图片,将图片分成三种大小

在这里插入图片描述

在这里插入图片描述
JavaScript 编写的图像处理库 Jimp:https://github.com/oliver-moran/jimp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://github.com/oliver-moran/jimp/tree/master/packages/plugin-resize
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

然后修改获取动态配图的接口:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 协程_Python多任务协程

协程协程,又称微线程,纤程。英文名Coroutine。协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机,…

python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

Python简易http服务器源码import SimpleHTTPServerimport SocketServerimport sysPORT 80if len(sys.argv) ! 2:print("use: web.exe port")else:PORT int(sys.argv[1])Handler SimpleHTTPServer.SimpleHTTPRequestHandlerhttpd SocketServer.TCPServer(("&…

CoderHub接口文档

CoderHub接口文档 Coderhub旨在创建一个程序员分享生活动态的平台。 完成的功能如下: 用户管理系统 内容管理系统 内容评论管理 内容标签管理 文件管理系统 接口完整请求示例:http://127.0.0.1:8000/users github仓库:https://github.com…

Spring 概况

网站:http://spring.io/ http://projects.spring.io/spring-framework Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用。 是一个轻量级的控制反转(IoC)和面向切面&#xff…

属于python应用领域的有数据可视化_Python数据可视化

译者序前 言第1章 数据可视化概念框架11.1 数据、信息、知识和观点21.1.1 数据21.1.2 信息21.1.3 知识31.1.4 数据分析和观点31.2 数据转换41.2.1 数据转换为信息41.2.2 信息转换为知识71.2.3 知识转换为观点71.3 数据可视化历史81.4 可视化如何帮助决策101.4.1 …

JavaScript高级之构造函数和原型

1.1 概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念。 ES6, 全称 ECMAScript 6.0 ,2…

wget python3_python wget

wget -nH -K -E -d -np -L -r http://flatfull.com/themes/scale/-np 递归下载时不搜索上层目录-nH, –no-host-directories 不创建主机目录-d, –debug 打印调试输出-L 递归时不进入其它主机-E //将所有text/html文档以.html扩展名保存-r 递归抓取-k 抓取之后修正链…

JavaScript高级之继承

ES6之前并没有给我们提供 extends 继承。我们可以通过构造函数原型对象模拟实现继承,被称为组合继承。 2.1 call() 调用这个函数, 并且修改函数运行时的 this 指向 fun.call(thisArg, arg1, arg2, …) thisArg :当前调用函数 this 的指向对象arg1&…

【代码笔记】iOS-UILable电子表显示

一&#xff0c;效果图。 二&#xff0c;代码。 RootViewController.h #import <UIKit/UIKit.h>interface RootViewController : UIViewController {UILabel *label;NSDateFormatter *dateFormatter ; } end RootViewController.m #import "RootViewController.h&qu…

python cpu_python 让cpu满载

python 让cpu满载发布时间&#xff1a;2018-07-29 17:25:11编辑&#xff1a;admin阅读(5939)搞zabbix监控的时候&#xff0c;linux服务器的负载很低&#xff0c;如何写一个python脚本&#xff0c;让它满载呢&#xff1f;网上搜了一堆&#xff0c;发现各种不靠谱。后来终于发现了…

JavaScript高级之ES5 中的新增方法

3.1 ES5 新增方法概述 ES5 中给我们新增了一些方法&#xff0c;可以很方便的操作数组或者字符串&#xff0c;这些方法主要包括&#xff1a; 数组方法字符串方法对象方法 3.2 数组方法 迭代(遍历)方法&#xff1a;forEach()、map()、filter()、some()、every()&#xff1b; …

extjs 事件

。。转载于:https://www.cnblogs.com/glblog/p/5732636.html

python定位二维码_图像中二维码的检测和定位

二维码二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的&#xff1b;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念&#xff0c;使用若干个与二进制相对应的几何…

JavaScript高级之函数进阶

1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式 function 关键字 (命名函数)函数表达式 (匿名函数)new Function() Function 里面参数都必须是字符串格式第三种方式执行效率低&#xff0c;也不方便书写&#xff0c;因此较少使用所有函数都是 Function 的实例(对象)…

kafka Failed to send messages after 3 tries 问题解决

kafka Failed to send messages after 3 tries. 在kafka0.8开发过程中 生产者测试用例碰到了 Exception in thread "main" kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.at kafka.producer.async.DefaultEventHandler.handle(…

react 前端解析二进制流_一年半前端跳槽面试经验(头条、微信、shopee)

在2019年末的时候&#xff0c;突然想搞点大事&#xff0c;思来想去&#xff0c;感觉只有跳槽是最刺激的。由于我比较懒&#xff0c;不想换城市&#xff0c;所以这次只面试了头条、微信和 shopee。十分幸运&#xff0c;都拿到了 offer。接下来就简单的说下大家关心的面试题吧。问…

国内app快速生成平台对比

泰格老虎 2013-03-07 00:39:10 这是海恒CEO高鹏写的一篇国内app快速生成平台对比文章&#xff0c;介绍了国内快速生成APP的平台与自己平台的对比&#xff0c;很有参考价值。同类网站安米网 http://www.appbyme.org/追信 http://app.zhui.cn/简网app工厂 http://app.cutt.com/ap…

JavaScript高级之正则表达式

1. 正则表达式概述 1.1 什么是正则表达式 正则表达式&#xff08; Regular Expression &#xff09;是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。 正则表通常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本&am…

pushpop指令的操作数必须是字操作数_PLC的指令,电气人必须了解的基础内容

指令语句表编程语言是所有PLC都具有的最基本的编程语言。而指令语句表程序是由一条一条的指令堆砌而成的。因此&#xff0c;我们有必要对指令进行进一步的说明和解读。1、指令格式PLC的指令语句表程序和微机汇编语言程序非常的相似&#xff0c;我们也是以汇编语言的指令和指令系…

JavaScript高级之ECMAScript 6 新特性

2.1. let关键字 let关键字用来声明变量&#xff0c;使用 let声明的变量有几个特点&#xff1a; 不允许重复声明 块儿级作用域 不存在变量提升 不影响作用域链 应用场景&#xff1a;以后声明变量使用let就对了 案例&#xff1a;点击切换颜色 <!DOCTYPE html&g…