NodeJS实现支付宝沙箱支付②③

news2024/11/30 1:48:40

文章目录

  • 前言
  • 版权声明
  • Alipay SDK 沙箱环境简介
  • Node环境要求
  • 沙箱环境配置
  • 下载所需模块
  • 准备前端静态页面以及Node服务器
  • 文件夹规范
  • AlipaySdk 配置准备
  • AlipaySdk 代码演示
  •    Alipay实例化 ~ alipay.sdk 文件
  •    AlipayForm ~ alipayForm文件
  •    AlipayFormStatus ~ alipayForm文件
  •    AlipayForm文件 ~ 完整代码
  • 使用沙箱
  • 效果演示
  • AlipaySdk API ~
  • 最后


                    ⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸   ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇   不能   ⡏⠀⠀  ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇   白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽   

前言

  1. Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与```PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
  2. Nodejs是基于V8引擎,V8是Google发布的开源JavaScript引擎,本身就是用于Chrome浏览器的JS解释,但是Node之父 Ryan Dahl在这里插入图片描述把这V8搬到了服务器上,用于做服务器的软件。

版权声明

在这里插入图片描述

Copyright © [SYFStrive],未经许可,禁止转载 ~~~

Alipay SDK 沙箱环境简介

沙箱环境 : 是协助开发者进行功能测试,模拟了开放平台产品的主要功能,逻辑。可用于在产品上线前进行功能测试。

Node环境要求

Node.js 8 以上版本

沙箱环境配置

官方 : https://openhome.alipay.com/

配置步骤 :使用支付宝登录 👉 进入我的控制台 👉 下方的开发工具推荐 点击沙箱 👉 沙箱应用 启动公钥模式 👉 获取公钥和私钥 网关地址

下载所需模块

npm install koa

npm install koa-router

npm install alipay-sdk

npm install koa koa-router alipay-sdk

准备前端静态页面以及Node服务器

  • 静态页面
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/axios@1.1.2/dist/axios.min.js"></script>
    <title>支付宝沙箱支付</title>
</head>

<body>
    <button>支付宝</button>
</body>
<script>

    const but = document.querySelector('button')
    but.addEventListener('click', () => {
        axios({
            method: 'get',
            url: 'http://127.0.0.1:8000/payment'
        }).then(reason => {
            console.log(reason.data);
        })
    })
</script>

</html>
  • Node服务器
const koa = require("koa");
const app = new koa();//实例
const koaRouter = require('koa-router')
const router = new koaRouter()

router.get("/payment", (ctx, next) => {
    ctx.set('Access-Control-Allow-Origin', '*')
    ctx.set('Access-Control-Allow-Methods', "OPTIONS, GET, PUT, POST, DELETE")
    ctx.body = ({
        code: 200
    })
    next()
})

app.use(router.routes(), router.allowedMethods())
app.listen(8000, function () {
    console.log("HTTP服务已启动");
})

文件夹规范

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

AlipaySdk 配置准备

初始化 SDK 准备参数 👇

  • 公钥证书模式(推荐): appId、应用私钥、应用公钥证书文件、支付宝公钥证书文件、支付宝证书文件
  • 公钥模式:appId、应用私钥、应用公钥、支付宝公钥

AlipaySdk 代码演示

   Alipay实例化 ~ alipay.sdk 文件

  • 封装配置方法
const AlipaySdk = require('alipay-sdk').default
const fs = require('fs')
// 普通公钥模式
const alipaySdk = new AlipaySdk({
    appId: '2021000122664484', //开放平台上创建应用时生成的 appId
    signType: 'RSA2',//签名算法,默认 RSA2
    gateway: 'https://openapi.alipaydev.com/gateway.do',//支付宝网关地址
    privateKey: fs.readFileSync('private-key.pem', 'ascii'),//应用私钥
    alipayPublicKey: fs.readFileSync('alipay-public-key.pem', 'ascii'),//支付宝公钥
});

// 证书模式
// const alipaySdk = new AlipaySdk({
//   appId: '2021000122664484',
//   privateKey: fs.readFileSync('private-key.pem', 'ascii'),
//   // 传入支付宝根证书、支付宝公钥证书和应用公钥证书。
//   alipayRootCertPath: path.join(__dirname, 'alipayRootCert.crt'),
//   alipayPublicCertPath: path.join(__dirname, 'alipayCertPublicKey_RSA2.crt'),
//   appCertPath: path.join(__dirname, 'appCertPublicKey.crt'),
// });
module.exports = alipaySdk

   AlipayForm ~ alipayForm文件

//参数 商品订单 商品名称 商品详细 商品价格
const AlipayForm = (orderNumber, goodsName, goodsDetail, price) => {
    return new Promise((resolve, reject) => {
        // 创建支付宝需要的表单表 对接支付宝
        const formData = new AlipayFormData();
        formData['setMethod']('get');
        // 支付成功回调地址,必须为可以直接访问的地址,不能带参数
        formData['addField']('returnUrl', 'http://localhost:9999/#/paysuccess');
        // 然后就是需要的订单参数
        formData['addField']('bizContent', {
            outTradeNo: orderNumber, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复
            productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAY
            totalAmount: `${price}`, // 订单总金额,单位为元,精确到小数点后两位
            subject: goodsName, // 订单标题
            body: goodsDetail, // 订单描述
        });

        // 业务处理
        // result 为可以跳转到支付链接的 url
        //'alipay.trade.page.pay' 统一收单下单并支付页面接口
        //{} api 请求的参数(包含“公共请求参数”和“业务参数”)
        alipaySdk.exec(
            'alipay.trade.page.pay',
            {},
            {formData: formData},
        ).then(reason => {
            resolve({
                message: '支付成功❗',
                code: 200,
                data: reason,
                ok: true
            })
        }, err => {
            resolve({
                message: '支付失败❗',
                code: 404,
                data: {},
                ok: false
            })
        })
    })
}

   AlipayFormStatus ~ alipayForm文件

//参数 订单号 交易号
const AlipayFormStatus = (out_trade_no, trade_no) => {
    return new Promise((resolve, reject) => {
        // 创建支付宝需要的表单表 对接支付宝
        const formData = new AlipayFormData();
        formData.setMethod('get');
        // 然后就是需要的订单参数
        formData.addField('bizContent', {
            out_trade_no,
            trade_no,
        });

        alipaySdk.exec(
            'alipay.trade.query',
            {},
            {formData: formData},
        ).then(result => {
            axios({
                url: result,
                method: 'get'
            }).then(reason => {
                let saveData = reason.data['alipay_trade_query_response']
                if (saveData.code === '10000') {
                    switch (saveData['trade_status']) {
                        case 'WAIT_BUYER_PAY':
                            resolve({
                                message: '通知不会返回,不能申请修改',
                                code: 199,
                                data: '支付宝有交易记录,没付款',
                                ok: true
                            })
                            break;
                        case 'TRADE_FINISHED':
                            resolve({
                                message: '交易结束,不可退款',
                                code: 200,
                                data: '交易完成',
                                ok: true
                            })
                            break;
                        case 'TRADE_SUCCESS':
                            resolve({
                                message: '高级即时到帐状态下',
                                code: 201,
                                data: '交易完成',
                                ok: true
                            })
                            break;
                        case 'TRADE_CLOSED':
                            resolve({
                                message: '默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易',
                                code: 202,
                                data: '交易关闭',
                                ok: true
                            })
                            break;
                        default:
                            resolve({
                                message: '交易不存在❗',
                                code: 404,
                                data: {},
                                ok: false
                            })
                            break;
                    }
                } else {
                    resolve({
                        message: '交易不存在❗',
                        code: 404,
                        data: {},
                        ok: false
                    })
                }
            }, err => {
                resolve({
                    message: '交易不存在❗',
                    code: 404,
                    data: {},
                    ok: false
                })
            })
        }, err => {
            resolve({
                message: '交易不存在❗',
                code: 404,
                data: {},
                ok: false
            })
        })
    })
}

   AlipayForm文件 ~ 完整代码

const alipaySdk = require('./alipay.sdk')
const AlipayFormData = require('alipay-sdk/lib/form').default
const axios = require('axios')

//参数 商品订单 商品名称 商品详细 商品价格
const AlipayForm = (outTradeNo, goodsName, goodsDetail, price) => {
    return new Promise((resolve, reject) => {
        // 创建支付宝需要的表单表 对接支付宝
        const formData = new AlipayFormData();
        formData['setMethod']('get');
        // 支付成功回调地址,必须为可以直接访问的地址,不能带参数
        formData['addField']('returnUrl', 'http://127.0.0.1:3005/#/paysuccess');
        // 然后就是需要的订单参数
        formData['addField']('bizContent', {
            outTradeNo: outTradeNo, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复
            productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAY
            totalAmount: `${price}`, // 订单总金额,单位为元,精确到小数点后两位
            subject: goodsName, // 订单标题
            body: goodsDetail, // 订单描述
        });

        // 业务处理
        // result 为可以跳转到支付链接的 url
        //'alipay.trade.page.pay' 统一收单下单并支付页面接口
        //{} api 请求的参数(包含“公共请求参数”和“业务参数”)
        alipaySdk.exec(
            'alipay.trade.page.pay',
            {},
            { formData: formData },
        ).then(reason => {
            resolve({
                message: '支付成功❗',
                code: 200,
                data: reason,
                ok: true
            })
        }, err => {
            resolve({
                message: '支付失败❗',
                code: 404,
                data: {},
                ok: false
            })
        })
    })
}

//参数 订单号 交易号
const AlipayFormStatus = (out_trade_no, trade_no) => {
    return new Promise((resolve, reject) => {
        // 创建支付宝需要的表单表 对接支付宝
        const formData = new AlipayFormData();
        formData.setMethod('get');
        // 然后就是需要的订单参数
        formData.addField('bizContent', {
            out_trade_no,
            trade_no,
        });

        alipaySdk.exec(
            'alipay.trade.query',
            {},
            { formData: formData },
        ).then(result => {
            axios({
                url: result,
                method: 'get'
            }).then(reason => {
                let saveData = reason.data['alipay_trade_query_response']
                if (saveData.code === '10000') {
                    switch (saveData['trade_status']) {
                        case 'WAIT_BUYER_PAY':
                            resolve({
                                message: '通知不会返回,不能申请修改',
                                code: 199,
                                data: '支付宝有交易记录,没付款',
                                ok: true
                            })
                            break;
                        case 'TRADE_FINISHED':
                            resolve({
                                message: '交易结束,不可退款',
                                code: 200,
                                data: '交易完成',
                                ok: true
                            })
                            break;
                        case 'TRADE_SUCCESS':
                            resolve({
                                message: '高级即时到帐状态下',
                                code: 201,
                                data: '交易完成',
                                ok: true
                            })
                            break;
                        case 'TRADE_CLOSED':
                            resolve({
                                message: '默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易',
                                code: 202,
                                data: '交易关闭',
                                ok: true
                            })
                            break;
                        default:
                            resolve({
                                message: '交易不存在❗',
                                code: 404,
                                data: {},
                                ok: false
                            })
                            break;
                    }
                } else {
                    resolve({
                        message: '交易不存在❗',
                        code: 404,
                        data: {},
                        ok: false
                    })
                }
            }, err => {
                resolve({
                    message: '交易不存在❗',
                    code: 404,
                    data: {},
                    ok: false
                })
            })
        }, err => {
            resolve({
                message: '交易不存在❗',
                code: 404,
                data: {},
                ok: false
            })
        })
    })
}

module.exports = {
    AlipayForm,
    AlipayFormStatus
}

使用沙箱

在这里插入图片描述

在这里插入图片描述

效果演示

请添加图片描述

AlipaySdk API ~

  • new AlipaySdk(config)
参数类型描述
ParamTypeDescription
ConfigAlipaySdkConfig初始化 SDK 配置
  • AlipaySdkConfig
参数说明类型必须
appId应用IDstring
privateKey应用私钥字符串string
signType签名种类“RSA2”|“RSA”
alipayPublicKey支付宝公钥(需要对返回值做验签时候必填)string
gateway网关string
timeout网关超时时间(单位毫秒,默认 5s)number
camelcase是否把网关返回的下划线 key 转换为驼峰写法boolean
keyType指定private key类型, 默认: PKCS1, PKCS8: PRIVATE KEY, PKCS1: RSA PRIVATE KEY“PKCS1”|“PKCS8”
appCertPath应用公钥证书文件路径string
appCertContent应用公钥证书文件内容string|Buffer
appCertSn应用公钥证书snstring
alipayRootCertPath支付宝根证书文件路径string
alipayRootCertContent支付宝根证书文件内容string|Buffer
alipayRootCertSn支付宝根证书snstring 否
alipayPublicCertPath支付宝公钥证书文件路径string
alipayPublicCertContent支付宝公钥证书文件内容string|Buffer
alipayCertSn支付宝公钥证书sn string
encryptKeyAES密钥,调用AES加解密相关接口时需要string
wsServiceUrl服务器地址string
  • AlipaySdk.sdkExec(method, params) ⇒ string

作用 : 生成请求字符串,用于客户端进行调用 ~ Returns: string - 请求字符串

ParamTypeDescription
methodstring方法名
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
  • AlipaySdk.pageExec(method, params) ⇒ string

作用 :生成网站接口请求链接或表单 ~ Returns: string - 请求链接或表单 HTML

ParamTypeDescription
methodstring方法名
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
params.methodstring后续进行请求的方法。如为 GET,即返回 http 链接;如为 POST,则生成表单 html
  • AlipaySdk.exec(method, params, option) ⇒ Promise.<(AlipaySdkCommonResult|string)>

作用 :执行请求,调用支付宝服务端

Returns: Promise.<(AlipaySdkCommonResult|string)> - 请求执行结果

ParamTypeDescription
methodstring调用接口方法名,比如 alipay.ebpp.bill.add
paramsIRequestParams请求参数
params.bizContentobject业务请求参数
optionIRequestOption选项
option.validateSignBoolean是否验签
args.logobject可选日志记录对象
  • AlipaySdkCommonResult

作用 : 响应结果

参数说明类型必须
code响应码。10000 表示成功,其余详见 https://opendocs.alipay.com/common/02km9fstring
msg响应讯息。Success 表示成功。string
sub_code错误代号string
sub_msg错误辅助信息string
  • IRequestParams

作用 :请求参数

参数说明类型必须
bizContent业务请求参数object
needEncrypt自动AES加解密boolean
  • AlipaySdk.checkNotifySign(postData, raw)

作用 :通知验签 ~ Returns: Boolean - 是否验签成功

ParamTypeDescription
postDataJSON服务端的消息内容
rawBoolean是否使用 raw 内容而非 decode 内容验签

最后

以上是个人学习Node的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波

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

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

相关文章

MQTT协议在物联网环境中的应用及代码实现解析(四)

四、使用单片机环境编程接收MQTT服务器上特定主题的信息 以下是使用STM32F103单片机链接W5500芯片链接到网络上&#xff0c;利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息&#xff0c;并发送给串口的C语言代码示例&#xff0c;包括完…

C语言——指针详解(进阶)

轻松学会C语言指针 一、字符指针二、数组指针2.1 数组指针的定义2.2 &数组名VS数组名2.3 数组指针的使用 三、指针数组四、数组参数和指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 五、函数指针六、函数指针数组七、指向函数指针数组的指针八…

计算机网络微课堂学习笔记(详细图解讲解)-长期更新

前言&#xff1a; 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施&#xff0c;计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 一、因特网概述 &#xff08;1&#xff09;网络、…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序&#xff0c;ChatGPT通过大量来自互联网的文本进行训练&#xff0c;并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且&#xff0c;ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…

ngsoc使用指南

和威胁告警差不多。 ngsoc是以资产为核心&#xff0c;以安全事件为管理的关键流程&#xff0c;建立一套威胁检测&#xff0c;相应&#xff0c;预测&#xff0c;和持续监控分析&#xff0c;一体化的监控与相应平台。 和天眼的区别&#xff1a;会把天眼的告警&#xff0c;其他安…

【041】从零开始:逐步学习使用C++ STL中的stack容器

从零开始&#xff1a;逐步学习使用C STL中的stack容器 引言一、stack容器概述二、stack容器常用API2.1、构造函数2.2、赋值操作2.3、数据存取操作2.4、大小操作 三、使用stack容器实现一个高效的算法总结 引言 &#x1f4a1; 作者简介&#xff1a;一个热爱分享高性能服务器后台…

安达发|如何选择更适合我们的APS高级排程软件

如何选择aps高级排程公司更适合我们?在选购aps高级排程的时候&#xff0c;一些朋友由于不清楚其中的选购技巧&#xff0c;许多时候会掉入些许选择误区&#xff0c;导致我们买不了合适我们选择的aps高级排程。因此选择适合我们的aps高级排程就变得十分重要&#xff0c;唯有明白…

23.JavaWeb-集群+Nginx+JMeter

1.集群概念 平时用的服务是的并发量是有限的&#xff0c;像tomcat只有不到500的并发量&#xff0c;不能满足高并发的需求&#xff0c;因此就采用了集群的方法&#xff0c;用多个服务器 当用户请求集群系统时&#xff0c;集群给用户的感觉就是一个单一独立的服务器&#xff0c;而…

项目中使用拆分数据库的优势

为什么要拆分数据库&#xff1f; 取决于数据库的负载和数据量。 单体项目在构建之初&#xff0c;数据库的负载和数据量都不大&#xff0c;所以不需要对数据库做拆分&#xff0c;小型财务系统、文书系统、ERP系统、OA系统&#xff0c;用一个MySQL数据库实例基本就够用了。 就…

重绘 ( Repaint) 和回流 ( Reflow)

重绘 ( Repaint) 和回流 ( Reflow) 首先了解 重绘 ( Repaint) 和回流 ( Reflow)其实是关乎到浏览器性能的问题 重绘和回流是渲染步骤中的⼀⼩节&#xff0c;但是这两个步骤对于性能影响很大 重绘和回流的过程都需要浏览器耗费大量的计算资源&#xff0c;过多的使用会导致网页性…

港联证券|熨平短期扰动 7月MLF小额加量续作

7月17日&#xff0c;为保护银行系统流动性合理充裕&#xff0c;人民银行开展1030亿元中期借贷便利&#xff08;MLF&#xff09;操作和330亿元公开商场逆回购操作,充沛满足了金融机构需求。本月MLF中标利率和公开商场逆回购操中标利率与上期持平&#xff0c;分别为2.65%、1.9%。…

[深度学习入门]什么是神经网络?[神经网络的架构、工作、激活函数]

目录 一、前言二、神经网络的架构——以手写数字识别三、神经网络的工作1、单输入单输出感知器函数2、二维输入参数3、三维输入参数 四、激活函数1、激活函数2、ReLU激活函数3、非线性激活函数&#xff08;1&#xff09;二输入二输出的神经网络的架构&#xff08;2&#xff09;…

创建、发布npm包,并且应用在项目里面

实现一个函数去监听dom宽高的变化&#xff0c;并且发布NPM包&#xff0c;然后使用到项目中 步骤 1.5W3H 八何分析法 2.如何监听dom宽高变化 3.如何用vite 打包库 4.如何发布npm 一、NPM包新建过程 查看完整目录 1.生成 package.json npm init生成TS配置文件 tsconfig.js…

OpenVas扫描器更新扫描引擎

OPenvas扫描器安装时step1 是交换指导升级&#xff08;nvt&#xff0c;cert&#xff0c;scap&#xff09;&#xff0c;这次升级后是自动升级24h升级一次&#xff0c;但第一次升级时选择默认的rsync升级时会出现同步失败的问题&#xff0c;导致openvas安装完后有很大模块和规则不…

软件测试教程之测试分类

目录 1.按测试对象分类 界面测试 可靠性测试 容错性测试 文档测试 兼容性测试 易用性测试 安装卸载测试 性能测试 安全性测试 内存泄漏测试 2.按照是否查看代码分类 黑盒测试 白盒测试 灰盒测试 3.按开发阶段划分 单元测试 集成测试 系统测试 回归测试 冒…

栈的压入、弹出序列

链接: 栈的压入、弹出序列 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pushV int整型vector * param popV int整型vector * return bool布尔型*/bool IsPopOrder(vector<int…

视频制作高清GIF动图的简单方法分享

有时想要将电视剧、电影中的精彩画面保存下来&#xff0c;但是视频较大非常的不方便的时候该怎么办呢&#xff1f;这时候&#xff0c;可以使用专业的视频转gif&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&#xff0c;无需下载软件&#xff0c;手机、pc均可在线…

【深度学习平台推荐】 Kaggle

工欲善其事&#xff0c;必先利其器。在一个优秀的平台上&#xff0c;更利于深度学习的探究。 本文目的是推荐一些深度学习相关的网站。 1 Kaggle Kaggle offers a no-setup, customizable, Jupyter Notebooks environment. Access GPUs at no cost to you and a huge repositor…

搭建Redis主从集群和哨兵

说明&#xff1a;单机的Redis存在许多的问题&#xff0c;如数据丢失问题、高并发问题、故障恢复问题、海量数据的存储能力问题&#xff0c;针对这四个问题&#xff0c;对应解决方式有&#xff1a;数据持久化&#xff08;参考&#xff1a;http://t.csdn.cn/SSyBi&#xff09;、搭…

07-尚硅谷大数据技术之Spark源码

1. 环境准备&#xff08;Yarn 集群&#xff09; 搭建Spark on Yarn集群 3.3 Yarn 模式 独立部署&#xff08;Standalone&#xff09;模式由 Spark 自身提供计算资源&#xff0c;无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但…