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

心情追忆:构建支付模块的五个基本接口设计

        之前,我独自一人开发了一个名为“心情追忆”的小程序,旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端(小程序)开发、后端搭建到最终部署。经过一个月的努力,通过群聊分享等方式,用户量也有了将近200人。虽然取得了初步的成绩,但我希望小程序能够持续发展。

基于上一篇

​​​​​​​心情追忆 - 打造完美支付体验:从零开始的支付功能实现https://blog.csdn.net/qq_34319145/article/details/144003105

是基于产品思维需要开发支付功能, 上篇只写了用户支付, 但实际支付需要有5个基本接口

1.用户支付

public static PrepayWithRequestPaymentResponse prepay(Integer total, String productTitle, String outTradeNo, String userOpenId) {// 使用单例模式获取配置Config config = getConfigInstance();// 构建serviceJsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();// request.setXxx(val)设置所需参数,具体参数可见Request定义PrepayRequest request = new PrepayRequest();Amount amount = new Amount();// 金额(单位分)amount.setTotal(total);request.setAmount(amount);request.setAppid(appId);request.setMchid(merchantId);// 支付项目名称request.setDescription(productTitle);// 回调地址request.setNotifyUrl(prePayNotifyUrl);// 交易编号request.setOutTradeNo(outTradeNo);Payer payer = new Payer();// 用户openidpayer.setOpenid(userOpenId);request.setPayer(payer);// 调用下单方法,这个是要给前端唤醒支付组件PrepayWithRequestPaymentResponse prepayWithRequestPaymentResponse = service.prepayWithRequestPayment(request);return prepayWithRequestPaymentResponse;}

2.支付回调

public void payNotify(@RequestHeader("Wechatpay-Signature") String wechatSignature,@RequestHeader("Wechatpay-Serial") String wechatPaySerial,@RequestHeader("Wechatpay-Nonce") String wechatpayNonce,@RequestHeader("Wechatpay-Timestamp") String wechatTimestamp,@RequestHeader("Wechatpay-Signature-Type") String signatureType,@RequestBody String requestBody) {// 打印上面的所有参数, 方便调试log.info("wechatSignature: {}, wechatPaySerial: {}, wechatpayNonce: {}, wechatTimestamp: {}, signatureType: {}, requestBody: {}",wechatSignature, wechatPaySerial, wechatpayNonce, wechatTimestamp, signatureType, requestBody);// 构建RequestParam, 这是下面的回调通知解析器需要用到的参数com.wechat.pay.java.core.notification.RequestParam requestParam = new com.wechat.pay.java.core.notification.RequestParam.Builder().serialNumber(wechatPaySerial).nonce(wechatpayNonce).signature(wechatSignature).timestamp(wechatTimestamp).body(requestBody).build();// 初始化 回调通知解析器, 传参和支付的配置一样NotificationParser parser = new NotificationParser(WxPayment.getConfigInstance());// sdk自动 验签、解密并转换成 Transaction(交易信息)Transaction transaction = parser.parse(requestParam, Transaction.class);// 更新支付记录表WechatPaymentRecords wechatPaymentRecord = wechatPaymentRecordsService.findByOutTradeNo(transaction.getOutTradeNo());wechatPaymentRecord.setStatus(transaction.getTradeState().name());wechatPaymentRecord.setTransactionId(transaction.getTransactionId());wechatPaymentRecordsService.updateById(wechatPaymentRecord);// 上面都成功后, 处理业务: 增加用户可使用次数UserFunctionRecord userFunctionRecord = userFunctionRecordService.getUserFunctionRecord(wechatPaymentRecord.getUserId());userFunctionRecord.setTotalUsageLimit(userFunctionRecord.getTotalUsageLimit() + 1);userFunctionRecordService.updateById(userFunctionRecord);// 自己好玩, 发个钉钉消息dingTalkMsg.sendMsgToDingTalk(JSONUtil.toJsonPrettyStr(transaction));}

3.支付列表查询

        这个就是查自己记录的表了

    public BaseResult<List<WechatPaymentRecords>> listPayments(@CurrentUser UserPrincipal userPrincipal) {// 基于springSecurity管理的CurrentUser拿到用户ID, 去查询支付记录List<WechatPaymentRecords> byUserId = wechatPaymentRecordsService.findByUserId(userPrincipal.getUserId());return BaseResult.success(byUserId);}

4.用户退款

和支付差不多, 不过比支付简单的是不用返回唤起支付组件的参数, 随便返回业务需要的参数就好

/*** 退款* @param outTradeNo 内部支付单号* @param outRefundNo 内部退款单号, 自己生成* @param reason 退款原因, 不必填, 业务必须填, 用于用户画像* @param total 订单金额* @param refund 退款金额* @return*/public static Refund createRefund(String outTradeNo,String outRefundNo, String reason, Long total, Long refund) {// 使用单例模式获取配置Config config = getConfigInstance();// 构建serviceRefundService service = new RefundService.Builder().config(config).build();CreateRequest request = new CreateRequest();request.setOutTradeNo(outTradeNo);request.setOutRefundNo(outRefundNo);request.setReason(reason);request.setNotifyUrl(refundNotifyUrl);AmountReq amount = new AmountReq();amount.setTotal(total);amount.setRefund(refund);amount.setCurrency("CNY");request.setAmount(amount);Refund refundResponse = service.create(request);return refundResponse;}

5.退款回调

和支付回调差不多, 只不过解析出来的是RefundNotification退款信息, 支付回调可以和退款回调写相同的一个, 也可以写不同. 我觉得写不同代码看的会少很多分支会简洁一点. 

public void refundNotify(@RequestHeader("Wechatpay-Signature") String wechatSignature,@RequestHeader("Wechatpay-Serial") String wechatPaySerial,@RequestHeader("Wechatpay-Nonce") String wechatpayNonce,@RequestHeader("Wechatpay-Timestamp") String wechatTimestamp,@RequestHeader("Wechatpay-Signature-Type") String signatureType,@RequestBody String requestBody) {// 打印上面的所有参数log.info("wechatSignature: {}, wechatPaySerial: {}, wechatpayNonce: {}, wechatTimestamp: {}, signatureType: {}, requestBody: {}",wechatSignature, wechatPaySerial, wechatpayNonce, wechatTimestamp, signatureType, requestBody);// 构建RequestParamcom.wechat.pay.java.core.notification.RequestParam requestParam = new com.wechat.pay.java.core.notification.RequestParam.Builder().serialNumber(wechatPaySerial).nonce(wechatpayNonce).signature(wechatSignature).timestamp(wechatTimestamp).body(requestBody).build();// 初始化 NotificationParserNotificationParser parser = new NotificationParser(WxPayment.getConfigInstance());// sdk自动 验签、解密并转换成 RefundNotification(退款信息)RefundNotification transaction = parser.parse(requestParam, RefundNotification.class);WechatPaymentRecords wechatPaymentRecord = wechatPaymentRecordsService.findByOutTradeNo(transaction.getOutTradeNo());wechatPaymentRecord.setRefundStatus(transaction.getRefundStatus().name());wechatPaymentRecord.setRefundAmount(transaction.getAmount().getRefund());wechatPaymentRecord.setRefundTime(LocalDateTime.now());wechatPaymentRecord.setOutRefundNo(transaction.getOutRefundNo());wechatPaymentRecord.setRefundId(transaction.getRefundId());wechatPaymentRecordsService.updateById(wechatPaymentRecord);dingTalkMsg.sendMsgToDingTalk(JSONUtil.toJsonPrettyStr(transaction));}

然后就是通用的配置

标准的单例双重验证, 不知道的可以去了解一下单例双重验证

// 提供一个静态方法来获取 Config 实例public static RSAAutoCertificateConfig getConfigInstance() {if (configInstance == null) {synchronized (lock) {if (configInstance == null) {configInstance = new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3key).build();}}}return configInstance;}

因为支付是购买产品, 所以需要一个产品表product, (有的大公司还有sku的概念, 但我这里不需要, 一切从简)

所以支付表可以这么设计:

关键是, 微信交易(transaction_id)的唯一Id和自己交易编号(out_trade_no)的唯一Id, 和状态, 退款也有一套. 是为了在微信支付平台查询实际交易信息用.

其中要关联业务数据userId和product_id.

CREATE TABLE `wechat_payment_records` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键,自增ID',`transaction_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信支付交易号,用于唯一标识一次支付交易',`out_trade_no` varchar(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '商户订单号,由商户生成,用于唯一标识一次支付请求',`user_id` bigint NOT NULL COMMENT '用户ID,关联用户表',`product_id` bigint NOT NULL COMMENT '产品Id',`amount` bigint NOT NULL COMMENT '支付金额,单位为元',`currency` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '货币种类,如CNY',`payment_time` datetime DEFAULT NULL COMMENT '支付时间,记录实际支付成功的时间',`status` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付状态,如SUCCESS、FAIL、REFUND等',`payment_method` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '支付方式,如JSAPI、APP、H5等',`description` text COLLATE utf8mb4_general_ci COMMENT '订单描述,用于记录支付的具体内容',`notify_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '回调通知URL,微信支付回调的地址',`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间,即发起支付请求的时间',`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间,每次更新记录时自动更新',`ip_address` varchar(45) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户发起支付请求时的IP地址',`device_info` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '设备信息,如设备型号、操作系统等',`refund_status` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款状态,如NOT_REFUND、PARTIAL_REFUND、FULL_REFUND等',`refund_amount` bigint DEFAULT NULL COMMENT '退款金额,单位为元',`refund_time` datetime DEFAULT NULL COMMENT '退款时间,记录实际退款成功的时间',`out_refund_no` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款编号',`refund_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信支付退款单号',`refund_reason` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '退款原因',PRIMARY KEY (`id`),UNIQUE KEY `out_trade_no` (`out_trade_no`),UNIQUE KEY `transaction_id` (`transaction_id`),KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引,用于快速查询某个用户的支付记录',KEY `idx_status` (`status`) COMMENT '支付状态索引,用于快速查询特定状态的支付记录',KEY `idx_created_at` (`created_at`) COMMENT '创建时间索引,用于按时间范围查询支付记录'
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='微信支付记录表';

总结

        和之前一篇一样: 

Java项目部署的三个阶段https://blog.csdn.net/qq_34319145/article/details/143963071目前我只有一个产品就是支付获得分析次数, 所以支付相关的表可以不太多. 如果后续业务变多变复杂, 就再继续去设计, 去完善. 不能一开始就上最完美的方案, 一定是要从最小MVP产品去一步一步迭代才行.

PS:

        上线审核时, 发现IOS打开小程序不允许出现虚拟产品的交易, 所以要关掉iOS的支付功能

// 检查是否为iOS系统const systemInfo = Taro.getSystemInfoSync();if (systemInfo.platform === 'ios') {Taro.showToast({title: 'iOS用户暂不支持支付功能',icon: 'none',duration: 2000});return;}

 

 

相关文章:

心情追忆:构建支付模块的五个基本接口设计

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…...

数据库导论

data 数据是数据库中存储的基本数据&#xff0c;描述事物的符号称为数据。 DB 数据库是长期存储在计算机内&#xff0c;有组织&#xff0c;可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织&#xff0c;描述和存储&#xff0c;具有较小的冗余度&#xff0c;较…...

echarts使用示例

柱状图折线图 折柱混合&#xff1a;https://echarts.apache.org/examples/zh/editor.html?cmix-line-bar option {title:{show: true},tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},toolbox: {feature: {dataView: { show: true, readOnl…...

选修课(Java Python JS C++ C )

题目描述 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。 输入描述 第一行为第…...

《解锁 C++数据读写秘籍:赋能人工智能训练》

在人工智能蓬勃发展的时代&#xff0c;数据无疑是驱动模型学习与成长的核心燃料。而 C作为一门高性能编程语言&#xff0c;在处理人工智能训练所需数据集的读取与写入时&#xff0c;有着独特的优势与关键作用。高效地运用 C进行数据操作&#xff0c;能够显著加速训练进程&#…...

23种设计模式-外观(Facade)设计模式

文章目录 一.什么是外观设计模式&#xff1f;二.外观设计模式的特点三.外观设计模式的结构四.外观设计模式的优缺点五.外观设计模式的 C 实现六.外观设计模式的 JAVA 实现七.代码解析八.总结 类图&#xff1a; 外观设计模式类图 一.什么是外观设计模式&#xff1f; 外观设计模…...

ReactPress(阮一峰推荐工具):一款基于Next.js的免费开源博客CMS系统

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …...

什么是缓存击穿?如何避免之布隆过滤器

缓存击穿&#xff08;Cache Penetration&#xff09;是分布式系统和缓存使用中的一个常见问题&#xff0c;布隆过滤器在解决缓存击穿问题时非常有用。接下来我会介绍缓存击穿的概念以及布隆过滤器在解决该问题中的应用。 什么是缓存击穿&#xff1f; 缓存击穿是指当大量的客户…...

React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法

概述 React组件的生命周期可以分为三个主要阶段&#xff1a; 挂载阶段&#xff08;Mounting&#xff09;&#xff1a;组件被创建&#xff0c;插入到DOM 树的过程&#xff1b; 更新阶段&#xff08;Updating&#xff09;&#xff1a;是组件中 props 以及state 发生变化时&#…...

java虚拟机——如何排查jvm问题

在项目中排查JVM问题是一个系统性的过程&#xff0c;涉及到多个工具和方法。以下是一些常见的步骤和工具&#xff0c;可以帮助你有效地诊断和解决JVM相关的问题&#xff1a; 1. 监控和日志 日志分析 JVM日志&#xff1a;启用JVM的日志记录功能&#xff0c;查看垃圾收集日志、…...

Altium Designer PCB设计检查工具1

此工具最大的特点是不需要联网&#xff0c;完全使用本地的计算资源即可实现检查统计操作&#xff0c;可用于不能联网的应用场景中。此工具支持多种计算加速方法&#xff0c;支持调用CUDA显卡进行数据处理&#xff0c;此功能需要计算机安装Matlab 2016以上版本&#xff0c;并需要…...

统计词频

目标&#xff1a;统计词频 从文件1.txt &#xff0c;读取内容&#xff0c;保存在一个字符串中统计字符串中&#xff0c;每个单词出现的频率对结果进行排序把最后的结果写入一个新的文件 import java.io.PrintWriter import scala.io.Source//知识点&#xff1a; //1.字符串&a…...

串,数组,广义表相关知识点

串 一.串的储存 1.基本概念 2.顺序储存 3.链式储存 二. 串的模式匹配算法 1.BF算法 将主串的第pos个字符和模式的第一个字符比较&#xff0c; 若相等&#xff0c;继续逐个比较后续字符&#xff1b; 若相等&#xff0c;继续逐个比较后续字符&#xff1b; 若不等&#xff0c…...

Leetcode 131 Palindrome Partition

题意 把一个字符串分割成多个回文字符串的partition&#xff0c;返回所有的可能partion 链接 https://leetcode.com/problems/palindrome-partitioning/description/ 思考 这只是dfs套了一个回文问题 题解 dfs每次截取一段字符串&#xff0c;判断是否是回文 退出条件是遍…...

git使用文档手册

创建一个本地代码工作空间&#xff0c;比如这里使用test目录作为工作目录 针对仓库地址 http://192.168.31.125:9557/poxiaoai-crm/project-crm.git。 1. 安装 Git 确保您的系统已经安装了 Git。如果未安装&#xff0c;请根据操作系统访问 Git 官网 下载并安装。 验证安装 …...

开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据

需求描述&#xff1a; 定义时间分界点&#xff1a;每月26号8点&#xff0c;过了26号8点则过滤出data数组中符合条件数据下个月的数据&#xff0c;否则过滤出当月数据 1.假如现在是2024年11月14日&#xff0c;那么过滤出data数组中日期都是2024-11月的数据&#xff1b; 2.假如…...

android 安全sdk相关

前述 在网上有看到许多android安全sdk相关的内容&#xff0c;有重复的也有比较新鲜的内容&#xff0c;这里做一个整体的合集&#xff0c;以及后续又看到一些比较新的东西会一起放在这里。 android内sdk目前可以分为以下几个部分&#xff08;有一些部分可能会存在一些重合&#…...

ChemBench—— 探索大语言模型在化学领域的新基准框架是否胜过化学专家

概述 大规模语言模型是一种机器学习模型&#xff0c;通过学习大量文本来生成文本。这些模型的能力正在迅速提高&#xff0c;现在已经可以通过美国国家医学考试。它们还可以与网络搜索和合成规划器等工具结合使用&#xff0c;自主设计化学反应和进行实验。 一些人认为这些模型…...

[SWPUCTF 2021 新生赛]Do_you_know_http

访问告诉我们要用WLLM 浏览器模式访问 import requestsurl http://node7.anna.nssctf.cn:23148/hello.php # 替换为题目提供的URL headers {User-Agent: WLLM } response requests.get(url, headersheaders) print(response.text)import requestsurl http://node7.anna.n…...

Flink--API 之 Source 使用解析

目录 一、Flink Data Sources 分类概览 &#xff08;一&#xff09;预定义 Source &#xff08;二&#xff09;自定义 Source 二、代码实战演示 &#xff08;一&#xff09;预定义 Source 示例 基于本地集合 基于本地文件 基于网络套接字&#xff08;socketTextStream&…...

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…...

CTF之密码学(培根密码)

培根密码&#xff0c;又名倍康尼密码&#xff08;Bacons cipher&#xff09;&#xff0c;是由法兰西斯培根发明的一种隐写术&#xff0c;属于密码学领域的一种替换密码。以下是关于培根密码的详细介绍&#xff1a; 一、原理 培根密码本质上是一种二进制密码&#xff0c;但它没…...

摄像头原始数据读取——V4L2(mmap模式,V4L2_MEMORY_MMAP)

摄像头原始数据读取——V4L2(mmap模式,V4L2_MEMORY_MMAP) 内存映射模式&#xff0c;是将设备在内核态申请的用于存储视频数据的物理内存映射到用户空间&#xff0c;使得用户应用程序可以直接访问和操作设备数据物理内存&#xff0c;避免了数据的拷贝。因此采集速度较快&#x…...

Ubuntu20.04下安装Matlab2018

Ubuntu20.04下安装Matlab2018 首先需要下载三个文件 挂载第一个镜像文件 先进入到终端&#xff0c;在空白处点击在终端打开 然后输入以下两个命令&#xff1a; mkdir ~/matlab //用户主目录下新建文件夹 matlab sudo mount -o loop Matlab911R2021b_Lin64.iso ~/matlab //将…...

如何做好一份技术文档?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于技术文档写作的相关内容&#xff01; 关…...

GitHub上如何创建文件夹及上传文件

GitHub上如何创建文件夹_github如何添加文件夹-CSDN博客 然后在对应的文件夹下上传文件即可 可以一个一个添加或一次性拖进去&#xff0c;但一次不能超过100个文件。...

GESP C++等级考试 二级真题(2024年9月)

若需要在线模拟考试&#xff0c;可进入题库中心&#xff0c;在线备考&#xff0c;检验掌握程度&#xff1a; https://www.hixinao.com/tidan/exam-157.html?time1732669362&sid172&index1...

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…...

SpringBoot生成顺序规则编号-查询数据库方式实现

先说编号规则&#xff1a; 前缀yyyyMMdd5位序号&#xff08;00001,00002.......&#xff09; 首先说说思路&#xff1a; 首先是查询数据库中编号的最大值是多少----->没有数据直接生成一个新的从00001开始----->存在编号就直接截取编号的后5位----->序号1 为了可以…...

【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)

分析一下rdd的特性和执行流程 A list of partitions 存在一系列的分区列表A function for computing each split 每个rdd上面都存在compute方法进行计算A list of dependencies on other RDDs 每个rdd上面都存在一系列的依赖关系Optionally, a Partitioner for key-value RDDs…...

docker离线安装linux部分问题整理

0:离线安装docker过程命令 echo $PATH tar -zxvf docker-26.1.4.tgz chmod 755 -R docker cp docker/* /usr/bin/ root 权限 vim /etc/systemd/system/docker.service --------- [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.do…...

shell(5)字符串运算符和逻辑运算符

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

容器和它的隔离机制

什么是容器和它的隔离机制&#xff1f; 容器 是一种轻量化的虚拟化技术&#xff0c;它允许多个应用程序共享同一个操作系统&#xff08;OS&#xff09;内核&#xff0c;同时为每个应用程序提供自己的运行环境。容器通过利用 Linux 的内核功能&#xff08;如 Namespaces 和 Cgr…...

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…...

DVWA靶场通过——文件上传漏洞

File Upload漏洞 它允许攻击者通过上传恶意文件来执行任意代码、窃取数据、获取服务器权限&#xff0c;甚至完全控制服务器。为了防止文件上传漏洞&#xff0c;开发者需要对文件上传过程进行严格的验证和处理。 1. 文件上传漏洞概述 文件上传漏洞发生在Web应用程序允许用户通过…...

原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder

原子类 JDK提供的原子类&#xff0c;即Atomic*类有很多&#xff0c;大体可做如下分类&#xff1a; 形式类别举例Atomic*基本类型原子类AtomicInteger、AtomicLong、AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArrayAtomic…...

MySQL(8)【聚合函数 | group by分组查询】

阅读导航 引言一、聚合函数1. 简介2. 使用示例&#xff08;1&#xff09;COUNT() 函数&#xff08;2&#xff09;SUM() 函数&#xff08;3&#xff09;AVG() 函数&#xff08;4&#xff09;MAX() 函数&#xff08;5&#xff09;MIN() 函数 二、group by分组查询1. 基本语法2. 按…...

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…...

React第七节 组件三大属性之 refs 的用法注意事项

1、定义 React 中refs 是允许我们操作DOM 访问组件实例的一种方案。开发人员可以直接使用 refs 访问操作DOM&#xff0c;而不用自身的数据状态&#xff0c;这种方案在实际开发过程中是有必要的&#xff0c;但是不建议通篇使用refs操作DOM&#xff0c;如果是这样&#xff0c;那…...

全文单词统计

目标&#xff1a;统计词频 import scala.io.Source //知识点 //1.字符串.split("分隔符")&#xff1a;把字符串用指定的分隔符。拆分成多份&#xff0c;保存在数组中 object test1 {def main(args: Array[String]): Unit { //从文件1.txt中读入内容val contentSourc…...

Angular v19 (二):响应式当红实现signal的详细介绍:它擅长做什么、不能做什么?以及与vue、svelte、react等框架的响应式实现对比

本文紧接着Angular v19 新版本来啦&#xff0c;一起瞧瞧新特性吧&#xff01;&#xff0c;主要针对它在v18引入了一项全新的响应式技术——Signal&#xff0c;这引起了开发者社区的广泛关注&#xff0c;最新的v19版本推出了更多的signal工具。Signal的加入旨在优化Angular的响应…...

【数据结构】二叉搜索树(二叉排序树)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、什么是二叉搜索树 二、二叉搜索树的实现 节点 属性和接口的声明 插入 查找 删除 拷贝构造 析构 中序遍历 三、二叉搜索树的…...

文件的摘要算法(md5、sm3、sha256、crc)

为了校验文件在传输中保证完整性和准确性&#xff0c;因此需要发送方先对源文件产生一个校验码&#xff0c;并将该值传输给接收方&#xff0c;将附件通过ftph或http方式传输后&#xff0c;由接收方使用相同的算法对接收文件再获取一个新的校验码&#xff0c;将该值和发送方传的…...

Python实现人生重开模拟器

目录 人生重开模拟器介绍 代码实现 打印初始界面 设置初始属性 设置角色性别 设置角色出生点 针对每一岁&#xff0c;生成人生经历 完整代码 人生重开模拟器介绍 人生重开模拟器 是之前比较火的一个小游戏&#xff0c;我们这里使用 Python 实现一个简化版的 人生重开模…...

机器学习(二十五):决策树算法以及决策树和神经网络的对比

一、决策树集合 单一决策树会对训练数据的变化很敏感。例子&#xff1a;输入十个数据&#xff0c;判断是否是猫。只替换其中一个数据&#xff0c;信息增益最高的分裂特征就发生了改变&#xff0c;决策树就发生了变化。 使用决策树集合可以使算法更加健壮。例子&#xff1a;使用…...

k8s运行运行pod报错超出文件描述符表限制

1.问题描述 运行pod超过文件描述符表 unable to allocate file descriptor table - out of memory/opt/COMMAND.sh: line 9: 2.查看设备的文件描述符限制 操作前一定要先查询这个值&#xff0c;2097152这个值即为我们可设置的最大值&#xff0c;超过这个值后将无法登录&am…...

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2

七、创建前端项目 你下载了nodejs吗&#xff1f;从cn官网下载&#xff1a;http://nodejs.cn/download/&#xff0c;或者从一个国外org网站下载&#xff0c;选择自己想要的版本https://nodejs.org/download/release/&#xff0c;双击下载好的安装文件&#xff0c;选择安装路径安…...

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序源码助力品牌共建:价值、策略与实践

摘要&#xff1a;在当今数字化商业环境下&#xff0c;品牌构建已演变为企业与消费者深度共建的过程。本文聚焦于“开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序源码”&#xff0c;探讨其如何融入品牌建设&#xff0c;通过剖析品牌价值构成&#xff0c;阐述该技术工具在助力…...

微信小程序中的WXSS与CSS的关系及使用技巧

微信小程序中的WXSS与CSS的关系及使用技巧 引言 在微信小程序的开发中,样式的设计与实现是构建用户友好界面的关键。微信小程序使用WXSS(WeiXin Style Sheets)作为其样式表语言,WXSS在语法上与CSS非常相似,但也有一些独特的特性。本文将深入探讨WXSS与CSS的关系,介绍WX…...

STM32的CAN波特率计算

公式&#xff1a; CAN波特率 APB总线频率 / &#xff08;BRP分频器 1&#xff09;/ (SWJ BS1 BS2) SWJ一般为1。 例如STM32F407的&#xff0c;CAN1和CAN2都在在APB1下&#xff0c;频率是42000000 如果想配置成1M波特率&#xff0c;则计算公式为&#xff1a;...