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上下文。这样只要在合适的时机,…

JavaScript高级之构造函数和原型

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

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…

JavaScript高级之ES5 中的新增方法

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

JavaScript高级之函数进阶

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

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…

sql 关联使用id还是code_R语言实例:用glue批量生成SQL语句

背景在数据开发中&#xff0c;有些情况下&#xff0c;需要手动生成批量SQL&#xff0c;只需改变某个参数&#xff0c;比如日期&#xff0c;从某天到某天。之前有一个实例&#xff0c;是用 stringr::str_replace_all() 去实现&#xff0c;这次就用 glue 来做示例&#xff0c;会更…

JavaScript高级之ECMASript 7、8 、9 、10 新特性

第3章 ECMASript 7 新特性 3.1. Array.prototype.includes Includes 方法用来检测数组中是否包含某个元素&#xff0c;返回布尔类型值 3.2. 指数操作符 在ES7中引入指数运算符「 **」&#xff0c;用来实现幂运算&#xff0c;功能与 Math.pow结果相同 第4章 ECMASript 8 新特…

swagger core 和 swagger ui 如何关联【窥探】

几个片段&#xff1a; package io.swagger.jaxrs.listing;import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils;import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.ws.rs.GET; import javax.ws.r…

vb 根据pid获取句柄_C++中避免返回指向对象内部的句柄(handles)

点蓝色字关注“CurryCoder的程序人生”微信公众号&#xff1a;CurryCoder的程序人生欢迎关注我&#xff0c;一起学习&#xff0c;一起进步!1.问题的引入假如你正在给一个应用写一个矩形类&#xff0c;这个矩形由左上角和右下角的顶点坐标表示。为了表示这两个点&#xff0c;我们…

关于MapReduce中自定义Combine类(一)

MRJobConfigpublic static fina COMBINE_CLASS_ATTR属性COMBINE_CLASS_ATTR "mapreduce.job.combine.class"————子接口&#xff08;F4&#xff09; JobContent方法getCombinerClass————子实现类 JobContextImpl实现getCombinerClass方法&#xff1a;public C…

react脚手架配置代理解决跨域问题

一、问题描述&#xff1a; 控制台报错&#xff0c;出现跨域问题 二、解决方案 配置代理&#xff1a; 第一种配置方式&#xff1a; 在package.json中追加如下配置 "proxy":"http://localhost:5000"说明&#xff1a; 优点&#xff1a;配置简单&#xff…

kstools工具是什么牌子_2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车...

2020年平衡车推荐&#xff0c;电动平衡车哪个牌子好&#xff1f;老司机教你如何选购电动平衡车随着我国科技的发展&#xff0c;生活水平的提高&#xff0c;在很多地方都出现了电动平衡车的身影&#xff0c;人们将电动平衡车当做短距离代步的工具&#xff0c;也是非常实用的。很…

plsql 中的一些好的设置和快捷键总结

1、SQL语句字符全部大写 自认为这是个好习惯&#xff0c;信息系统的核心是数据库&#xff0c;系统出问题时最先要查的就是SQL语句&#xff0c;怎样在浩瀚的日志中快速找到那条SQL语句是件比较痛苦的事情。 SQL语句全部大写并不能彻底解决这一问题&#xff0c;但在一堆代码…

react父子组件通信案例

父组件&#xff1a;App组件 子组件&#xff1a;Search组件、List组件 案例需求&#xff1a;文本框中输入关键词&#xff0c;点击搜索按钮后&#xff0c;下方列表展示出搜索结果 实现思路&#xff1a; 子组件Search组件向父组件App传递状态&#xff08;状态包括&#xff1a;是否…