当前位置: 首页 > news >正文

图解支付系统的渠道路由设计

大家好,我是隐墨星辰,今天和大家聊聊渠道路由设计。

这篇文章主要讲清楚:渠道路由是什么,为什么需要渠道路由,渠道路由的几种形态,一个简洁而实用的基于规则的渠道路由设计。

注:有些公司称渠道为通道,都是一个意思,为方便起见,本文统称为渠道。

1. 一些背景知识

有些支付公司没有区分支付方式咨询渠道咨询渠道路由,而是混在一起做掉,这样的好处是简单而实用,缺点是扩展性不足。下面将以扩展性最好的拆分方式来讲解。

下面是三者之间的简单关系图:

说明:

  1. 支付方式咨询:根据用户的请求,组装可用支付方式列表返回给用户。由收银域提供服务。
  2. 渠道咨询:根据用户的请求,组装可用的渠道列表和渠道属性返回给收银域,再由收银域转换为支付方式返回给用户。由渠道网关提供服务。
  3. 渠道路由:当有多个渠道可用时,选择出最优的一个渠道。由渠道网关提供服务。

再详细一点,如下:

支付方式咨询:解决用户可以使用哪些支付方式,比如余额、招行借记卡、招行信用卡等。比如虚拟商品不能使用信用卡,这种支付方式的管理就是支付方式咨询的职责。

渠道咨询:解决是否有渠道可以支持当前的支付行为。比如用户绑定了招行借记卡,但招行当前正在维护无法提供服务,那就将渠道状态设置为不可用,收银域对应的支付方式会置灰。

渠道路由:解决最优渠道问题。需要综合支付成功率、支付成本、用户体验、渠道状态等多种因素挑选出最优的一条渠道。

2. 渠道路由核心作用

渠道路由核心作用是当有多个渠道同时满足业务诉求时,综合支付成功率、支付成本、用户体验、渠道状态等多种因素挑选出最优的一条渠道。具体如下:

  1. 提高支付成功率:通过选择最合适的渠道,可以提高支付的成功率,减少支付失败带来的用户流失。原因在于不同的渠道在其内部的风险偏好是不一样的,同一个请求在A渠道会失败,但在B渠道会成功。
  2. 优化成本:不同渠道的费用可能不同,通过合理的路由,可以降低支付成本。一些渠道还有阶梯收费,需要通过分流不同的渠道,保持整体成本最优。
  3. 提升用户体验:快速、稳定的支付体验能增强用户的满意度和忠诚度。用户如果经常在A渠道支付,新的请求过来后,仍然发给A渠道支付的成功率往往会更高。
  4. 负载均衡:将支付请求合理分配到不同的渠道,避免某个渠道过载,提升整体系统的稳定性。

举几个渠道路由应用的小场景:

  1. 用户使用招行信用卡支付,支付平台同时对接了网联和银联,而网联和银联都支持招行信用卡,那么就需要渠道路由挑选一个渠道。
  2. 做实名认证,平台对接了多个实名认证通道,通过渠道路由挑选一个认证渠道。

由上面可以看到,除了支付路由外,还可能有信息类渠道路由,比如实名认证类。

那退款有没有路由?显示没有。在银联做的支付,只能去银联退款。特殊的渠道也没有路由,比如用户选择使用支付宝支付,因为支付宝只能在支付宝做支付,所以无需路由。

3. 渠道路由的设计原则

渠道路由作为支付系统的核心模块,需要满足以下几个设计原则:

  • 灵活性:路由规则需要支持动态调整。从业务的角度出发,有些场景考虑成本,有些场景考虑成功率,都能方便支持。
  • 扩展性:设计时要考虑到未来可能新增的支付渠道,新增的决策因子,这些都不能在代码中写死,确保系统易于扩展。
  • 高可用性:路由系统本身需要具备高可用性,确保在高并发和故障情况下仍能稳定运行,哪怕内部报错,仍然能返回一条可用的渠道。
  • 性能:在保证准确性的前提下,路由决策需要快速,不能成为支付流程的瓶颈。

4. 业界常见的几种路由形态

根据业务的需要,通常有以下几种路由形态:

  1. 硬编码取第一个。在项目上线初期,为了赶进度,同时渠道也不多,常常在代码中写死取第一个,先保证支付主流程能走通。
  2. 基于规则的路由。通过预定义的规则提高灵活性和可扩展性。
  3. 智能路由。利用机器学习和大数据分析,根据历史数据和实时状态,智能地选择最佳渠道。

5. 一种典型的基于规则的渠道路由设计

基于规则的渠道路由是最常见的设计。简单地说,就是符合什么条件就执行什么样的分流逻辑。比如:支付平台对接了网联和银联,招行信用卡全部走网联,工行信用卡500块以内的走网联,500块以上的走银联。

5.1. 核心流程设计

说明:

  1. 先进行唯一渠道判断,如果只有一条渠道,直接返回。
  2. 判断规则,如果规则没有命中,那就从可用渠道中随机挑选一条。
  3. 如果命中规则,再根据规则中的分流逻辑进行分流。
  4. 最后返回唯一的一条渠道。

5.2. 分流算法设计

如果一个请求既可以走银联,也可以走网联,还可以走直连,有以下几种情况:

  1. 没有命中任何一条规则,随机选择一条渠道。
  2. 有多条规则可以命中,选择优先级最高的。
  3. 命中的路由规则里,银联和网联分别是40%和40%,直连20%,根据规则分流。如果当前银联挂了,把银联按比例分配到网联和直连。

常见的分流算法是先把各渠道的分流比例换算成0-100区间的数字,从大到小排序,再根据用户ID取模、请求单号取模或生成一个随机数,再看这个数落在哪个区间,对应的渠道就是命中的渠道。

伪代码如下:

int random = 用户ID取模(或请求单号取模,或生成随机数);
for (int i = 0; i < 分流集合.size(); i++) {if (random -= 分流集合[i] <= 0) {return 命中的渠道;}
}

5.3. 路由规则配置模型

说明:

  1. 路由规则用于规则引擎运算是否命中。核心字段包括:规则ID、规则类型、规则表达式、优先级。实际实现时可根据各公司内部情况加字段。
    1. 规则ID:用于分流配置做关联;
    2. 规则类型:用于区分支付、实名认证等。
    3. 规则表达式:用于规则引擎运算;
    4. 优先级:用于排序,如果有多个规则都符合,以优先级最高的为准;
  1. 分流配置用于规则命中后,如何进行分流。核心字段包括:规则ID、渠道名、分流比例。
    1. 规则ID:用于与路由规则进行关联。
    2. 渠道名:表示要分流去的渠道。
    3. 分流比例:说明有多少流量要分过去。
  1. 决策因子定义用于决策的条件。比如卡BIN,卡品牌,金额等。

5.4. 规则引擎选择

业务的规则引擎有很多,比如大名鼎鼎的Drools等,也可以选择自研,各公司可以根据自己的技术生态来选择。

我个人推荐QlExpress。推荐理由:简单实用。因为路由规则都非常简单,没有过于复杂的运算,不需要引入一些很重的规则引擎。

关于QlExpress的资料,可参考官网介绍。

后面会有QlExpress的规则示例。

5.5. 决策子选择

决策因子就是路由规则匹配的条件,一般有以下几种:

  1. 金额:比如小于某个金额,或大于某个金额。
  2. 卡品牌:VISA、MASTER、UPAY等。
  3. 发卡行:CMB、ICBC等。
  4. 卡类型:借记卡、信用卡等。
  5. 卡BIN:某个号段的卡。
  6. 业务场景字段:各公司自定,比如线下场景,线上场景等。

5.6. 路由规则示例

规则的编写和规则引擎强相关。下面以QLExpress做个示例。实际落地时,需要根据自己选择的规则引擎做改造。

假设:支付平台对接了网联和银联,要求:

1)招行信用卡全部走网联。

2)工行信用卡500块以内(不包含)的40%走网联,60%走银联。

3)工行信用卡500块以上的走银联。

一些基本的变量定义

银行名称:bankName

支付方式:paymentMethod

卡类型:cardType

金额变量:amount

网联:NUCC

银联:UPAY

招行:CMB

工行:ICBC

定义规则

  1. 规则1:paymentMethod='card' && cardType='credit' && bankName='CMB'

分流:NUCC:100

  1. 规则2:paymentMethod='card' && cardType='credit' && bankName='ICBC' and amount < 500.00

分流:NUCC:40,UPAY:60

  1. 规则3:paymentMethod='card' && cardType='credit' && bankName='ICBC' and amount >= 500.00

分流:UPAY:100

5.7. 界面配置示例

下面只是示意一个简单的路由配置。如果是多层次的与和或关系,需要产品经理做一些稍微复杂一点的界面。

说明:

  1. 示例规则的业务诉求:工行信用卡500块以内(不包含)的40%走网联,60%走银联。
  2. 后台保存的规则为:“paymentMethod='card' && cardType='credit' && bankName='ICBC' and amount < 500.00”,分流有2两条,分别是:“NUCC:40”,“UPAY:60”。
  3. 用于决策因子的元数据,需要提前定义好,包括这些字段的运算规则(比如开户行就不能使用大于、等于)。

5.8. 一些调优思路

  1. 用户最近支付成功记录优先,提高成功率。比如用户可以用银联,也可以使用网联,如果5天内最近一次使用了银联是成功的,那么为了成功率,可以考虑再次路由到银联去。因为从渠道风控的角度,已经成功的前提下,再次成功的可能性更大(余额不足除外)。
  2. 根据用户ID做分流,而不是当前订单号做分流,或者完全随机数。也就是使用伪随机。好处是同一个用户更大概率走到同一个渠道,有利于提高成功率,进而提升用户体验。
  3. 适当使用缓存,以提高运算速度。

6. 加入自动化开关的渠道路由

外部渠道服务经常不稳定,通过自动化开关模块监听支付引擎或渠道网关的支付结果消息,实时计算渠道的状态,在渠道出现问题后自动关闭,并推送给渠道路由。

说明:

  1. 由自动化开关模块监听支付引擎的支付结果消息,每秒计算一次渠道的状态,在渠道出现问题后,自动关闭,并把结果推送给渠道路由。
  2. 渠道关闭后,再发起探测服务,探测成功后,灰度打开渠道。

下图是渠道自动化渠道开关的示意图。有多种技术手段可以实现,基本原理就是基于滑动时间窗口算法来做,具体落地可以使用时序数据库,或者自己通过redis实现。

说明:

  1. 初始是完成打开。
  2. 指定时间内全部失败或指定时间内成功率低于阀值,关闭渠道。
  3. 指定时间后,发起查询,如果查询渠道失败,持续关闭。
  4. 如果查询成功,就灰度打开,如果灰度打开后的成功率不满足要求,就继续关闭。
  5. 如果灰度打开后的成功率满足要求,就持续加大灰度,直到完成打开。

后面会单独起一篇文章来讲自动化渠道开关的设计与实现。

7. 高阶的智能路由

一些有实力的公司,通过算法和机器学习来做智能路由。所谓智能路由,就是不仅是根据路由规则来计算路由,而是根据当前的请求参数和渠道数据,综合成功率、成本、用户使用习惯、地域等多因子计算出最优的一条渠道。

这个方案有几个难题不好解决。

首先是公司实力足够强。有人才来做算法,且这些算法同学需要懂一点业务;

其次是经验不好总结。比如成功率提升了2%,是因为什么原因提升了?有一些不可解释性。

最后业务无法直接操作调优。比如有些场景下业务希望保成功率,有些场景下业务希望保较低的成本,智能路由如何调参?

我个人更倾向于【规则路由 + 离线数据分析】的组合。其中离线数据分析平台可以引入一些算法来分析各因子对成功率的影响,供业务人员决策,并调整路由规则。

说明:

  1. 通过分析数据,找到影响成功率成本的因子。
  2. 更新路由规则。
  3. 重复第1步。

8. 结束语

渠道路由在现代支付系统中扮演着至关重要的角色,一个高效、灵活的渠道路由设计能够显著提升支付成功率,优化成本,并改善用户体验。通过本文的介绍,希望能为大家在实际项目中设计和实现渠道路由提供一些有益的参考。

这是《百图解码支付系统设计与实现》专栏系列文章中的第(25)篇。欢迎和我一起深入解码支付系统的方方面面。

精选

《百图解码支付系统设计与实现》电子书_V20240525

专栏地址百图解码支付系统设计与实现
领域相关(部分)
支付行业黑话:支付系统必知术语一网打尽
跟着图走,学支付:在线支付系统设计的图解教程
图解收单平台:打造商户收款的高效之道
图解结算平台:准确高效给商户结款
图解收银台:支付系统承上启下的关键应用
图解支付引擎:资产流动的枢纽
图解渠道网关:不只是对接渠道的接口(一)

技术专题(部分)
交易流水号的艺术:掌握支付系统的业务ID生成指南
揭密支付安全:为什么你的交易无法被篡改
金融密语:揭秘支付系统的加解密艺术
支付系统日志设计完全指南:构建高效监控和问题排查体系的关键基石
避免重复扣款:分布式支付系统的幂等性原理与实践
支付系统的心脏:简洁而精妙的状态机设计与核心代码实现
图解金融级密钥管理系统:构建支付系统的安全基石
一文搞懂支付安全
用极简的工具画超帅的架构图
资损防控:搞定交易系统中金额处理规范

相关文章:

图解支付系统的渠道路由设计

大家好&#xff0c;我是隐墨星辰&#xff0c;今天和大家聊聊渠道路由设计。 这篇文章主要讲清楚&#xff1a;渠道路由是什么&#xff0c;为什么需要渠道路由&#xff0c;渠道路由的几种形态&#xff0c;一个简洁而实用的基于规则的渠道路由设计。 注&#xff1a;有些公司称渠…...

Leecode---347:输出前k个高频元素(使用unordered_map)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路&#xff1a; 三步&#xff1a; 1、用map来记录每个元素出现的次数 2、按map中的值大小排序&#xff0c;先让其有序&#xff0c;再逆…...

k8s ceph(静态pvc)

1.在 Kubernetes 节点上安装ceph-common 包。这个包包含了连接到 Ceph 集群所需的工具和库。可以使用以下命令在每个节点上安装&#xff1a; sudo apt-get install ceph-common2.在 Kubernetes 中创建一个 Secret 对象&#xff0c;用于存储连接到 Ceph 集群所需的密钥和配置信息…...

Qt QScript 之 C++/JavaScript相互调用

文章目录 Qt Script什么是ECMAScriptQt 中JavaScriptclass 详解Basic UsageQObject对脚本引擎可用使用信号槽connect 三种模式访问属性, 子对象使c++对象可用于用Qt Script编写的脚本C++ 类成员函数可用于脚本C++ 类属性可用于脚本对脚本中的c++对象信号的反应函数对象和本机函…...

可能会引起空指针

PreparedStatement preparedStatement null; preparedStatement conn.prepareStatement(sql); 如果直接下面这个可能会赋值给空指针 因为要在try{}和catch{}里面都用,所以要定义在try外面为null //如果只是测试,可以PreparedStatement preparedStatement conn.prepareSta…...

Linux input输入子系统

Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;负责与具体的硬件设备进行交互&#xff0c;并将底层的硬件输入转化为统一的事件形式&#xff…...

dataworks调度参数

概述 调度参数是DataWorks任务调度时使用的参数&#xff0c;调度参数会根据任务调度的业务时间及调度参数的取值格式自动替换取值&#xff0c;实现在任务调度时间内参数的动态取值。 调度参数通过赋值方式分为自定义参数&#xff08;推荐&#xff09;和系统内置变量两大类。 …...

JavaScript第五讲:事件,条件循环语句,错误处理

前言 在编程的世界里&#xff0c;事件、条件和循环语句、以及错误处理是构建任何复杂程序或应用的基石。无论是开发一个简单的网页交互&#xff0c;还是构建一个庞大的企业级系统&#xff0c;这些基础概念都扮演着至关重要的角色。今天星途将通过这篇文章&#xff0c;分别深入…...

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型

BrainGPT1&#xff0c;一个帮你b站点歌放视频的多模态多轮对话模型 返回论文目录 项目地址 模型地址 作者&#xff1a;华东师范大学&#xff0c;计算机科学与技术学院&#xff0c;智能教育研究院的小怪兽会微笑。 介绍 BrainGPT1是一个工具调用多轮对话模型&#xff0c;与G…...

带DSP音效处理D类数字功放TAS5805M中文资料

国产替代D类数字功放中文资料访问下方链接 ACM8628 241W立体声182W单通道数字功放中文寄存器表 内置DSP多种音频处理效果ACM8628M-241W立体声或182W单通道数字功放 1 特性 具有增强处理能力和低功率损耗的 TAS5805M 23W、无电感器、数字输入、立体声、闭环 D 类音频放大器 …...

java中BigDecimal的比较

BigDecimal是Java中的一个类&#xff0c;位于java.math包中&#xff0c;它提供了任意精度的有符号十进制数字的表示&#xff0c;以及对这些数字进行算术运算的方法 BigDecimal的主要用途包括&#xff1a; 1.金融计算&#xff1a;金融领域对数值的精度要求非常高&#xff0c;使…...

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生&#xff0c;就是努力工作&#xff0c;买房&#xff0c;买车&#xff0c;送孩子上好的学校&#xff0c;为了孩子不要输在起跑线上&#xff0c;拼命报各种补习班等&#xff0c;这些都是普通人认为的主流价值观文化&#xff0c;也造就了一批批的赚钱机器&#xf…...

Nginx(openresty) 开启gzip压缩功能 提高web网站传输速度

1 开启nginx gzip压缩后&#xff0c;网页的图片&#xff0c;css、js等静态资源的大小会减少&#xff0c;节约带宽&#xff0c;提高传输效率&#xff0c;给用户快的体验,给用户更好的体验. 2 安装 #centos 8.5 yum install gzip 3 配置 #建议统一配置在http段 vim /usr/loca…...

nn.Embedding使用

nn.Embedding使用 Embedding.weight会从标准正态分布中初始化成大小为&#xff08;num_embeddings, embedding_dim&#xff09;的矩阵 PE矩阵的作用就是替换这个标准正态分布 input中的标号表示从矩阵对应行获取权重来表示单词 # 1.设置embedding结构 max_seq_len 1000 # 句…...

Qt6 mathgl数学函数绘图

1. 程序环境 Qt6.5.1, mingw11.2mathgl 8.0.1: https://sourceforge.net/projects/mathgl/,推荐下载mathgl-8.0.LGPL-mingw.win64.7z,Windows环境尝试自己编译mathgl会缺失一些库,补充完整也可以自己编译,路径"D:\mathgl-8.0.LGPL-mingw.win64\bin"添加至系统环境…...

Nginx配置文件中静态资源文件禁止通过目录查看

Nginx配置文件中静态资源文件禁止通过目录查看 nginx作为文件服务器访问静态资源时&#xff0c;默认是可以通过目录路径查看该目录下的所有文件的&#xff0c;这样会被检查出漏洞&#xff0c;容易造成静态资源泄露。 方案 location /images {autoindex off;autoindex_exact_…...

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…...

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…...

OpenCV学习 基础图像操作(十七):泛洪与分水岭算法

原理 泛洪填充算法和分水岭算法是图像处理中的两种重要算法&#xff0c;主要用于区域分割&#xff0c;但它们的原理和应用场景有所不同&#xff0c;但是他们的基础思想都是基于区域迭代实现的区域之间的划分。 泛洪算法 泛洪填充算法&#xff08;Flood Fill&#xff09;是一…...

Docker基础命令(三)

同步docker容器中的时间和本地时间一致 背景: 在很多时候, 训练模型的时候, 记录的log日志中标记的时间和实际的时间不一致, 往往是容器时间和本地时间不一致照成的. 方案 场景一: 正在运行的容器&#xff0c;可以宿主机直接执行命令给某个容器同步时间 #方法1 直接在宿主机…...

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…...

两个数相加减高级实现

不使用实现两数相加 #include <stdio.h> int plus(int a, int b) {int sum0,addication0;while(b!0){sum a^b;addication (a&b)<<1;a sum;b addication;}return a; }不使用-实现两数相减 #include <stdio.h> int sub(int a, int b) {int sum0,abdc…...

小白跟做江科大32单片机之对射式红外传感器计次

原理部分 1中断示意图&#xff0c;中断会打断主函数的执行&#xff0c;终端执行完成之后再返回主函数继续执行 2.STM32中断 这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断&#xff0c;每个中断通道都拥有16个可编程的优先等级&#xff0c;可对优先级进行分组…...

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…...

新游启航 失落的方舟台服注册指南 一文教会你方舟台服注册

新游启航&#xff01;失落的方舟台服注册指南&#xff01;一文教会你方舟台服注册 失落的方舟作为本月最受期待游戏之一&#xff0c;在上线之际许多玩家已经有点急不可待了。这款游戏是由开发商Smile gate开发的一款MMORPG类型游戏&#xff0c;这款游戏的基本玩法与其他MMORPG…...

运维开发详解

运维开发&#xff08;DevOps&#xff09;是开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;的结合&#xff0c;旨在通过自动化和协作提高软件开发和交付的效率、速度和可靠性。DevOps强调文化、实践和工具的融合&#xff0c;以实现持续集成&…...

英伟达(NVIDIA)H100性能及应用场景

英伟达H100是一款性能强大的GPU芯片&#xff0c;其关键性能参数和应用领域可以归纳如下&#xff1a; 一、性能参数 架构&#xff1a;H100采用了新一代的Hopper架构&#xff0c;拥有高达1.8万亿次/秒的张量处理能力和高达840 TFLOPS的FP8张量性能。CUDA核心数&#xff1a;H100…...

充电宝怎么选?充电宝目前什么牌子质量好耐用?盘点好用充电宝

充电宝怎么选&#xff1f;是不是很多朋友在选充电宝上非常的纠结&#xff1f;在买充电宝上面还是非常有讲究的&#xff01;市面上的充电宝虽然多&#xff0c;但是不排除很多存在安全隐患的&#xff0c;如果稍微没有挑选好充电宝的话&#xff0c;买来的充电宝极大可能是存在非常…...

智能视频监控技术为游泳馆安全护航,助力安全管理新升级

随着社会的进步和科技的发展&#xff0c;视频监控技术在各行各业的应用越来越广泛。游泳馆作为公共场所&#xff0c;每天都会有大量的游泳者进出。在这样的环境中&#xff0c;有时难免会发生一些意外事故&#xff0c;如溺水、摔倒等。因此&#xff0c;视频监控建设的必要性尤为…...

Windows通过cmd运行快速启动应用

Windows如何通过cmd运行快速启动应用&#xff1f; 在Windows操作系统中&#xff0c;可以通过配置环境变量的方式将文件的路径配置到环境变量的path中&#xff0c;配置完成后可以在cmd中输入对应的应用名称即可启动应用&#xff0c;具体操作如下&#xff1a; 1. 添加应用程序路径…...

271 基于matlab的可调Q因子小波变换故障诊断

基于matlab的可调Q因子小波变换故障诊断&#xff0c;可用在轴承、齿轮、活塞等故障诊断中&#xff0c;程序中包含了原始TQWT工具箱和轴承振动信号信号的谱包络的求取。通过仿真数据、实际轴承数据说明了方法的效果。程序已调通&#xff0c;可直接运行。 271 可调Q因子小波变换 …...

吴恩达深度学习个人笔记

1. 上一个视频提到的房地产领域,我们不就使用了一个普遍标准神经网络架构吗 而对于图像识别处理问题,我们则要使用卷积神经网络(Convolution Neural Network),即CNN。 对于序列数据,例如音频,有一个时间组件,随着时间的推移,音频被播放出来, 所以音频是最自然的表…...

Spring的依赖注入DI

调用构造器方法注入: 需要有对应匹配的构造器 不然出现异常No matching constructor Spring构造器注入有三种不同方式 name :按照参数名称 <bean id"stu" class"com.xja.bean.Student"> <constructor-arg name"name" value"rk&…...

Java 获取和修改期日与时间的各种操作方法

LocalDateTime获取当地日期和时间 import java.time.LocalDateTime; /*LocalDateTime.now() 获取当前时间*/ public class LocalDateTimeDemo {public static void main(String[] args) {LocalDateTime time1 LocalDateTime.now();System.out.println(time1);//2024-06-01T13…...

【ubuntu20】--- 定时同步文件

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux命令】--- 多核压缩命令大全&…...

网吧|基于SprinBoot+vue的网吧管理系统(源码+数据库+文档)

网吧管理系统 目录 基于SprinBootvue的网吧管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2 网管功能模块 3 会员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…...

[C/C++] -- Libcurl开发

libcurl 是一个功能强大的 C 语言库&#xff0c;用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心&#xff0c;并提供了一个简单、灵活、高效的 API&#xff0c;允许开发人员在他们的应用程序中轻松地执行网络操作。 以下是 libcurl 的一些主要特点和功能&#xf…...

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…...

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议&#xff0c;在传输之前需要形成三次握手形成会话 只有会话形成了&#xff0c;服务端和客户端才能想发送数据&#xff0c;在创建会话的过程中&#xff0c;服务端和客户…...

React@16.x(14)context 举例 - Form 表单

目录 1&#xff0c;目标2&#xff0c;实现2.1&#xff0c;index.js2.2&#xff0c;context.js2.2&#xff0c;Form.Input2.3&#xff0c;Form.Button 3&#xff0c;使用 1&#xff0c;目标 上篇文章说到&#xff0c;context 上下文一般用于第3方组件库&#xff0c;因为使用场景…...

十几款基于ChatGPT的免费神器,每个都是王炸!

十几款基于ChatGPT的免费神器&#xff0c;每个都是王炸&#xff01; 1、ChatGPT ChatGPT非常强大&#xff0c;但注册需要魔法和国外的手机号&#xff0c;大部分人都没法使用。还好有一些基于API开发的体验版&#xff0c;我收集了一些可以直接使用的站点分享给大家&#xff0c…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…...

java单元测试如何断言异常

​ 在junit单元测试中&#xff0c;我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable)​ 假设我们有以下…...

C语言| n的阶乘相加

逻辑性较强&#xff0c;建议记住。 分析思路&#xff1a; 假如n4&#xff1a;m m * i; sum sum m; 1&#xff09;当i1时&#xff0c;m1, sum1。 2&#xff09;当i2时&#xff0c;m12, sum112。 3&#xff09;当i3时&#xff0c;m123, sum112123。 4&#xff09;当i4时&…...

cwiseMax、cwiseMin函数

一、cwiseMax含义 cwiseMax是Eigen库中的一个函数&#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数&#xff0c;但是可以同时处理多个元素&#xff0c;且支持矩阵和向量。 举例&#xff1a; 例如&#xff0c;对于两个向量a和b&#xff0c;cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php

在Apache运行thinkphp5.1时&#xff0c;发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下&#xff0c;打开config/httpd.conf。 搜索rewrite.so&#xff0c;将前面的#删掉&#xff0c;表示开启URL重写功能 2、…...

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制&#xff0c;大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象&#xff0c;提供了更方便的按行读取的方法&#xff1a;readLine();在使用字符流读取文本文件时&#xff0c;我们可以使…...

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…...

Kivy.uix.textinput

一个小小的输入框&#xff0c;纵上下数页文档已不能全不概括&#xff0c;当去源码慢慢寻找&#xff0c;才知道其中作用&#xff0c;才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…...

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…...