Vue3+Node/Express支付宝沙箱支付与确认支付
Vue3+Node/Express支付宝沙箱支付与确认支付
- 支付宝沙箱配置
- 进入沙箱
- 选择自定义密钥
- 密钥工具下载
- 生成密钥
- 格式转换
- 自定义密钥设置
- Express
- 安装依赖
- 项目目录
- 创建alipay.js
- 请求(打开支付)代码
- router/pay.js
- app.js
- 前端代码
- 前端封装接口
- 前端调用
- 实现支付
- 查询结果代码
- 优化和实现思路(重点)
- 支付需要结果
- 如何更新页面?
- 请求时间增加健壮性
- 请求过程优化
- 一些相关的思路
- 参考链接
支付宝沙箱配置
支付宝开放平台,进行登录,进入控制台
进入沙箱
选择自定义密钥
密钥工具下载
密钥工具下载
生成密钥
格式转换
将应用私钥复制至格式转换
自定义密钥设置
将生成的应用公钥复制到自定义密钥设置中
保存后如下图所示
最后点击确认即可,此时公钥模式已启用
Express
安装依赖
"alipay-sdk": "^3.6.1","axios": "^1.8.1",
本篇文章使用的sdk
为^3.6.1
,axios
是为寻求支付结果需要使用到的
项目目录
├─db
├─jwt_config
├─limit
├─public
│ └─upload
├─router
├─router_handler
└─utils└─alipay.js
创建alipay.js
utils
目录下新建alipay.js
文件,代码如下:
const AlipaySdk = require("alipay-sdk").default;const alipaySdk = new AlipaySdk({appId: "",signType: "RSA2",gateway: "https://openapi-sandbox.dl.alipaydev.com/gateway.do",alipayPublicKey:"",privateKey:""
});
module.exports = alipaySdk;
这里的appId
可在支付宝开放平台的沙盒里看到,如下图所示:
signType
和gateway
分别是签名算法
和网关
,这个默认和上述代码即可
alipayPublicKey
就是自定义密钥设置一节中的支付宝公钥
privateKey
则为格式转换后输出的密钥
请求(打开支付)代码
router_handler
下新建pay.js
路由处理程序文件,代码如下:
const alipaySdk = require("../utils/alipay");
const AlipayFormData = require("alipay-sdk/lib/form").default;exports.pay = (req, res) => {console.log(req.body);(async () => {// 调用 setMethod 并传入 get,会返回可以跳转到支付页面的 urlconst formData = new AlipayFormData();formData.setMethod("get");// 通过 addField 增加参数// 在用户支付完成之后,支付宝服务器会根据传入的 notify_url,以 POST 请求的形式将支付结果作为参数通知到商户系统。formData.addField("returnUrl", "http://localhost:8080/#/home"); // 支付成功回调地址,必须为可以直接访问的地址,不能带参数formData.addField("bizContent", {outTradeNo: req.body.outTradeNo, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复productCode: "FAST_INSTANT_TRADE_PAY", // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAYtotalAmount: req.body.all_money, // 订单总金额,单位为元,精确到小数点后两位subject: "商品", // 订单标题body: "商品详情", // 订单描述}); // 如果需要支付后跳转到商户界面,可以增加属性"returnUrl"const result = await alipaySdk.exec("alipay.trade.page.pay", // 统一收单下单并支付页面接口{}, // api 请求的参数(包含“公共请求参数”和“业务参数”){formData: formData,}); // result 为可以跳转到支付链接的 urlres.json({url: result,});})();
};
这里需要注意的是returnUrl
对应的地址,这是当支付成功后跳转的页面,一般来说都是跳转回商城的首页
bizContent
里面的内容则是与支付有关,outTradeNo
是订单号(可以使用随机函数唯一生成,用于查询结果,非常重要),productCode
默认为FAST_INSTANT_TRADE_PAY
无需改变,totalAmount
是商品的总价,也就是需要支付的价格,需要注意的是要精确到小数点后两位,可以使用fixed(2)
实现,subject
和body
则是与商品的基本信息有关,可以通过前端传值进行赋值
router/pay.js
// router/pay.js
const express = require("express");
const router = express.Router();
const PayHandler = require("../router_handler/pay");
router.post("/pay", PayHandler.pay);module.exports = router;
app.js
// app.js
const PayRouter = require("./router/pay");
app.use("/pay", PayRouter);
至此基础的就完成了,可以请求当前接口进行支付
前端代码
前端封装接口
// 订单号和总价
export const pay = (outTradeNo, all_money) => {return instance({url: "/pay/pay",method: "POST",data: {outTradeNo,all_money,},});
};
前端调用
const res = await pay(outTradeNo, totalPrice1.toFixed(2));
if (res.url) {window.open(res.url, "_blank"); // 在新窗口中打开支付链接
} else {alert("未获取到支付链接!");
return;
}
实现支付
当请求后发起后会在浏览器打开支付宝的支付窗口,如下所示:
账户名和支付密码在沙箱账号中,如下图所示:
支付成功,等待2~3秒会跳转至returnUrl
指定的地址
查询结果代码
开箱即用,传入订单号outTradeNo
即可查询结果
// router/pay.js
const express = require("express");
const router = express.Router();
const axios = require("axios");
const PayHandler = require("../router_handler/pay");
const alipaySdk = require("../utils/alipay");
router.post("/pay", PayHandler.pay);const AlipayFormData = require("alipay-sdk/lib/form").default;
router.post("/query", function (req, res) {(async function () {const { outTradeNo } = req.body;console.log(outTradeNo);const formData = new AlipayFormData();formData.setMethod("get");formData.addField("bizContent", {outTradeNo,}); // 通过该接口主动查询订单状态const result = await alipaySdk.exec( 'alipay.trade.query',const result = await alipaySdk.exec("alipay.trade.query", // 统一收单下单并支付页面接口{}, // api 请求的参数(包含“公共请求参数”和“业务参数”){formData: formData,});axios({method: "GET",url: result,}).then((data) => {let r = data.data.alipay_trade_query_response;if (r.code === "10000") {// 接口调用成功switch (r.trade_status) {case "WAIT_BUYER_PAY":res.send("交易创建,等待买家付款");break;case "TRADE_CLOSED":res.send("未付款交易超时关闭,或支付完成后全额退款");break;case "TRADE_SUCCESS":res.send({status: 0,msg: "支付成功",});break;case "TRADE_FINISHED":res.send("交易结束,不可退款");break;}} else if (r.code === "40004") {res.send("交易不存在");}}).catch((err) => {res.json({msg: "查询失败",err,});});})();
});module.exports = router;
优化和实现思路(重点)
支付需要结果
支付了需要查询结果,大部分文章仅仅讲到了支付,并没有谈到如何获取结果,这里参考了使用Node.js打通支付宝支付(沙箱环境),作者是字节跳动程序员
如何更新页面?
查询到结果如何更新页面?使用了ElMessageBox
和ElLoading
第一步是弹窗,如下图所示:
由于此时无法确定用户是否已支付或未支付(打开了弹窗但未支付),所以不管是取消和确定都需要调用接口进行查询
请求时间增加健壮性
由于请求结果是由支付宝服务器传回,所以需要最大程度的考虑请求的响应时间,经过测试,60s
是个不错的选择,代码如下:
// 二次封装axios
import axios from "axios";const instance = axios.create({// 后端url地址baseURL: "http://127.0.0.1:3007",timeout: 60000, //设置超时headers: {"Content-Type": "application/x-www-form-urlencoded",},
});
当然,请求失败后再次进行请求也是一个不错的选择
请求过程优化
添加loading
状态
直至结果返回后取消
一些相关的思路
①支付成功后需要连带更新库存和销量
②支付成功后需要更新购物车或当前页面(假设当前页面存在①的数据)
③支付成功后需要更新用户的订单列表
④由于订单号唯一性,初次支付过程中未支付(生成了订单号),下次支付时需要更新改商品已存在的订单号
⑤多个商品同时结算,利用多条记录的订单号相同的思路,便可通过订单号查询结果时一并更新用户订单,也就是订单号已经为支付状态了,把相同订单号的记录的信息更新至用户的订单表中
参考链接
Node对接支付宝沙箱完成支付完整流程
使用Node.js打通支付宝支付(沙箱环境)
相关文章:
Vue3+Node/Express支付宝沙箱支付与确认支付
Vue3Node/Express支付宝沙箱支付与确认支付 支付宝沙箱配置进入沙箱选择自定义密钥 密钥工具下载生成密钥格式转换 自定义密钥设置Express安装依赖项目目录创建alipay.js请求(打开支付)代码router/pay.jsapp.js 前端代码前端封装接口前端调用 实现支付查…...
什么是大语言模型
大语言模型(Large Language Model,LLM)是一种基于深度学习技术的人工智能模型,旨在理解和生成人类语言。以下是大语言模型的详细介绍: 一、基本概念 大语言模型通常包含数百亿甚至数千亿个参数,通过在海量…...
本地部署Embedding模型API服务的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
postgresql postgis扩展相关
项目 下载地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…...
FFmpeg-chapter3-读取视频流(原理篇)
ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...
入门基础项目(SpringBoot+Vue)
文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…...
C#调用CANoeCLRAdapter.dll文章(二)
一、引言 在上一篇指南中,我们介绍了如何通过C#调用CANoeCLRAdapter.dll实现基础功能,包括COM接口操作、DLL导入和PANL面板集成。本文将进一步探讨高级功能开发,涵盖事件驱动编程、CAPL脚本双向通信以及异步任务处理,帮助开发者构…...
ai大模型自动化测试-TensorFlow Testing 测试模型实例
AI大模型自动化测试是确保模型质量、可靠性和性能的关键环节,以下将从测试流程、测试内容、测试工具及测试挑战与应对几个方面进行详细介绍: 测试流程 测试计划制定 确定测试目标:明确要测试的AI大模型的具体功能、性能、安全性等方面的目标,例如评估模型在特定任务上的准…...
QT——c++界面编程库
非界面编程 QT编译的时候,依赖于 .pro 配置文件: SOURCES: 所有需要参与编译的 .cpp 源文件 HEADERS:所有需要参与编译的.h 头文件 QT:所有需要参与编译的 QT函数库 .pro文件一旦修改,注意需要键盘按 ctrls 才能加载最新的配置文…...
postman--接口测试工具安装和使用教程
postman–接口测试工具 postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 。 无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 。 下面先通过一张…...
如何用python画一棵分形树
这个代码会生成一个彩色的分形树图案,可以通过调整draw_tree函数中的参数来改变树的形状和大小 import turtle import random# 递归函数绘制分形树 def draw_tree(branch_len, t):if branch_len > 5:t.color(random.choice(colors))t.pensize(branch_len / 10)t…...
【leetcode】二分查找专题
文章目录 1.二分查找1.题目2.解题思路3. 解题代码 2.在排序数组中查找元素的第一个和最后一个位置1.题目2.算法原理3. 代码 3.x的平方根1.题目2.代码 4.搜索插入位置1.题目2.解题思路3.解题代码 5.山脉数组的索引1.题目2.解题思路3. 代码 6.寻找峰值1.题目2.解题思路3.代码 7. …...
深度学习笔记17-马铃薯病害识别(VGG-16复现)
目录 一、 前期准备 1. 设置GPU 2. 导入数据 二、手动搭建VGG-16模型 1. 搭建模型 三、 训练模型 1. 编写训练函数 3. 编写测试函数 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 前言 🍨 本文为🔗365天深度学习训…...
【LeetCode】131.分割回文串
目录 题目描述输入输出示例及数据范围思路C 实现 题目描述 这道题目来自 LeetCode 131. 分割回文串。 题目描述如下: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 输入输出示例及数据…...
【AIGC系列】5:视频生成模型数据处理和预训练流程介绍(Sora、MovieGen、HunyuanVideo)
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
基于C++“简单且有效”的“数据库连接池”
前言 数据库连接池在开发中应该是很常用的一个组件,他可以很好的节省连接数据库的时间开销;本文基使用C实现了一个简单的数据库连接池,代码量只有400行左右,但是压力测试效果很好;欢迎收藏 关注,本人将会…...
vulnhub靶场【kioptrix-4】靶机
前言 靶机:kioptrix-4,IP地址为192.168.1.75,后期IP地址为192.168.10.8 攻击:kali,IP地址为192.168.1.16,后期IP地址为192.168.10.6 都采用VMware虚拟机,网卡为桥接模式 这里的靶机…...
科普:ROC AUC与PR AUC
在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...
服务器IPMI用户名、密码批量检查
背景 大规模服务器部署的时候,少不了较多的网管和监测平台,这些平台会去监控服务器的性能、硬件等指标参数,为了便于管理和控制,则需要给服务器IPMI带外管理添加较多的用户,这就需要对较多的服务器检查所对应的IPMI用…...
51单片机中reg52.h与regx52.h在进行位操作时的不同
reg52.h中不能使用例如 P2_0;这样的定义 而只能使用 P2^0;这样的定义 但是都不可以对位进行直接赋值操作; 而 regx52.h中可以使用 P2_0和P2^0;但是只有使用下划线的才可以对位进行赋值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 语言中,…...
Apollo Cyber 学习笔记
目录 0 Introduction What Why Advantage 1 Example 2 Concept 3 Flow Chart 4 Module 4.1 Transport 4.1.1 Share Memory 4.1.1.1 Segment 4.1.1.1.1 State 4.1.1.1.2 Block 4.1.1.1.3 Common 4.1.1.2 Notifier 4.1.1.2.1 ConditionNotifier 4.1.1.2.2 Multi…...
【Electron入门】进程环境和隔离
目录 一、主进程和渲染进程 1、主进程(main) 2、渲染进程(renderer) 二、预加载脚本 三、沙盒化 为单个进程禁用沙盒 全局启用沙盒 四、环境访问权限控制:contextIsolation和nodeIntegration 1、contextIsola…...
拉链表介绍
拉链表 是处理 缓慢变化维(SCD) 的一种常用方法,特别适用于需要保留历史记录的场景。以下是拉链表的详细说明及实现方法: 1. 什么是拉链表? 拉链表是一种用于记录维度数据历史变化的表结构,通过 开始时间 …...
Spring Boot 日志配置与常见问题解析(详解)
目录 Spring Boot 日志配置与常见问题解析引言什么是日志?日志的重要性日志使用打印日志 日志框架介绍日志格式的说明⽇志级别日志级别的分类日志级别的使用 Spring Boot 日志配置1. 设置日志级别和格式2. 配置日志收集器3. 查看和分析日志4.日志的持久化5.设置日志…...
-bash: lsof: command not found
一、问题说明 执行如下命令时报错: # lsof |grep deleted > deleted_file -bash: lsof: command not found二、处理方法 # yum -y install lsof安装完成后可成功执行上面的命令。...
PC 端连接安卓手机恢复各类数据:安装、操作步骤与实用指南
软件介绍 这款用于恢复安卓手机数据的软件,虽运行在 PC 端,却专为安卓手机数据恢复打造,使用时得用数据线把手机和电脑连接起来。它的功能相当强大,能帮你找回安卓手机里已删除的短信、联系人、通话记录、文档,还有照…...
ES、OAS、ERP、电子政务、企业信息化(高软35)
系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...
android智能指针android::sp使用介绍
android::sp 是 Android 中的智能指针(Smart Pointer)的实现,用于管理对象的生命周期,避免手动管理内存泄漏等问题。它是 Android libutils 库中重要的一部分,常用于管理继承自 android::RefBase 的对象。 与标准库中…...
推荐一款最新开源,基于AI人工智能UI自动化测试工具!支持自然语言编写脚本!
随着互联网技术的飞速发展,Web应用越来越普及,前端页面也越来越复杂。为了确保产品质量,UI自动化测试成为了开发过程中不可或缺的一环。然而,传统的UI自动化测试工具往往存在学习成本高、维护困难等问题。特别是UI 自动化脚本里往…...
DeepSeek05-大模型WebUI
一、说明: 将DeepSeek部署到前台Web界面的方法主要有以下几种推荐方案,涵盖开源工具、第三方客户端及特定场景适配方案: Open WebUIChatbox AICherry StudioSillyTavern 二、Open WebUI 安装配置教程 特点:Open WebUI 是一个开…...
自然语言处理NLP入门 -- 第八节OpenAI GPT 在 NLP 任务中的应用
在前面的学习中,我们已经了解了如何使用一些经典的方法和模型来处理自然语言任务,如文本分类、命名实体识别等。但当我们需要更强的语言生成能力时,往往会求助于更先进的预训练语言模型。OpenAI 旗下的 GPT 系列模型(如 GPT-3、GP…...
FFmpeg av_read_frame 和iOS系统提供的 AVAudioRecorder 实现音频录制的区别
1. 第一种方式:使用 FFmpeg 的 av_read_frame 特点 底层实现:基于 FFmpeg,这是一个强大的多媒体处理库,直接操作音频流。灵活性:非常灵活,可以处理多种音频格式、编解码器和输入设备。复杂性:需要手动管理音频流、数据包(AVPacket)、内存释放等,代码复杂度较高。跨平…...
【区块链】深入理解区块链中的 Gas 机制
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 深入理解区块链中的 Gas 机制一、Gas 的基本概念1.1 为什么需要 Gas?…...
2020 年英语(一)考研真题 笔记(更新中)
Section I Use of English(完型填空) 原题 Directions:Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Even if families are less likely to si…...
mamba_ssm和causal-conv1d详细安装教程
1.前言 Mamba是近年来在深度学习领域出现的一种新型结构,特别是在处理长序列数据方面表现优异。在本文中,我将介绍如何在 Linux 系统上安装并配置 mamba_ssm 虚拟环境。由于官方指定mamba_ssm适用于 PyTorch 版本高于 1.12 且 CUDA 版本大于 11.6 的环境…...
leetcode-442.数组中重复的数据
leetcode-442.数组中重复的数据 文章目录 leetcode-442.数组中重复的数据1.题目描述:数组中重复的数据2.第一次代码提交:(不符合仅使用常量额外空间)3.最终代码提交:只使用常数额外空间、时间复杂度为 O(n) 的做法,即“标记法” 1…...
UniApp 按钮组件 open-type 属性详解:功能、场景与平台差异
文章目录 引言一、open-type 基础概念1.1 核心作用1.2 通用使用模板 二、主流 open-type 值详解2.1 contact - 客服会话功能说明平台支持代码示例 2.2 share - 内容转发功能说明平台支持注意事项 2.3 getUserInfo - 获取用户信息功能说明平台支持代码示例 2.4 getPhoneNumber -…...
Android13修改多媒体默认音量
干就完了! 设置音量为最大音量,修改如下: /framework/base/media/java/android/media/AudioSystem.java/** hide */public static int[] DEFAULT_STREAM_VOLUME new int[] {4, // STREAM_VOICE_CALL7, // STREAM_SYSTEM5, // STREAM_RING-5, // STREAM_MUSIC15, // STREAM…...
【银河麒麟高级服务器操作系统】服务器测试业务耗时问题分析及处理全流程分享
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
HTTP 请求时传递多部分表单数据
HTTP 请求时传递多部分表单数据(multipart/form-data) --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…...
【Python环境】配置极简描述
241220 241220 241220 Python环境配置 下载Python 稳定版本:Stable Releases【3.12.3】 下载地址:Python Releases for Windows | Python.org. 配环境 注意勾上Add Python 3.x to PATH,然后点“Install Now”即可完成安装。 配置完成&…...
1. HTTP 数据请求
相关资源: 图片素材📎图片素材.zip 接口文档 1. HTTP 数据请求 什么是HTTP数据请求: (鸿蒙)应用软件可以通过(鸿蒙)系统内置的 http 模块 和 Axios,通过 HTTP 协议和服务器进行通讯 学习核心Http请求技术: Http模块 - 属于鸿…...
基于深度学习+NLP豆瓣电影数据爬虫可视化推荐系统
博主介绍:资深开发工程师,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有…...
Apache Spark中的依赖关系与任务调度机制解析
Apache Spark中的依赖关系与任务调度机制解析 在Spark的分布式计算框架中,RDD(弹性分布式数据集)的依赖关系是理解任务调度、性能优化及容错机制的关键。宽依赖(Wide Dependency)与窄依赖(Narrow Dependency)作为两种核心依赖类型,直接影响Stage划分、Shuffle操作及容…...
SEO炼金术(4)| Next.js SEO 全攻略
在上一篇文章 SEO炼金术(3)| 深入解析 SEO 关键要素 中,我们深入解析了 SEO 关键要素,包括 meta 标签、robots.txt、canonical、sitemap.xml 和 hreflang,并探讨了它们在搜索引擎优化(SEO)中的作…...
DeepSeek开源周,第五弹再次来袭,3FS
Fire-Flyer 文件系统(3FS)总结: 一、核心特点 3FS 是一个专为 AI 训练和推理工作负载设计的高性能分布式文件系统,利用现代 SSD 和 RDMA 网络,提供共享存储层,简化分布式应用开发。其主要特点包括…...
conda怎么迁移之前下载的环境包,把python从3.9升级到3.10
克隆旧环境(保留旧环境作为备份) conda create -n cloned_env --clone old_env 在克隆环境中直接升级 Python conda activate cloned_env conda install python3.10 升级 Python 后出现 所有包导入失败 的问题,通常是因为依赖包与新 Pyth…...
一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)
前言 本文将实现控制弹板移动,通过Unity的New Input System,可以支持鼠标移动弹板跟随移动,触控点击跟随移动,并且当弹板移动到边界时,弹板不会移动超过边界之外。 创建移动相关的InputAction 项目模版创建的时候默认会…...
wordpress子分类调用父分类名称和链接的3种方法
专为导航而生,在wordpress模板制作过程中常常会在做breadcrumbs导航时会用到,子分类调用父分类的名称和链接,下面这段简洁的代码,可以完美解决这个问题。 <?php echo get_category_parents( $cat, true, » ); ?…...
使用mermaid查看cursor程序生成的流程图
一、得到cursor生成的流程图文本 cursor写的程序正常运行后,在对话框输入框中输入诸如“请生成扫雷的代码流程图”,然后cursor就把流程图给生成了,但是看到的还是文本的样子,保留这部分内容待用 二、注册一个Mermaid绘图账号 …...