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

uniapp写支付的操作

支付的时候一般需要几个参数:

  1. ‘timeStamp’: 时间戳,
  2. ‘nonceStr’: 随机字符串,不超过32位
  3. ‘package’: 下单后接口返回的prepauid
  4. ‘signType’: 签名的算法
  5. ‘paySign’: 后端会给前端一个签名
  6. sign: data.sign // 根据签名算法生成签名
<template><view><scroll-view scroll-y><view class="block__title">报修信息</view><view class="cu-list menu"><view class="cu-item"><view class="content"><text class="text-grey">工单号</text></view><view class="action"><text class="text-grey text-sm">{{repairId}}</text></view></view><view class="cu-item"><view class="content"><text class="text-grey">报修类型</text></view><view class="action"><text class="text-grey text-sm">{{repairTypeName}}</text></view></view><view class="cu-item"><view class="content"><text class="text-grey">报修位置</text></view><view class="action"><text class="text-grey text-sm">{{repairObjName}}</text></view></view><view class="cu-item"><view class="content"><text class="text-grey">报修人</text></view><view class="action"><text class="text-grey text-sm">{{repairName}}</text></view></view><view class="cu-item"><view class="content"><text class="text-grey">报修内容</text></view><view class="action"><text class="text-grey text-sm">{{remark}}</text></view></view></view><view class="block__title">费用信息</view><view class="cu-list menu fee-last"><view class="cu-item"><view class="content"><text class="text-grey">费用编号</text></view><view class="action"><text class="text-grey text-sm">{{feeInfo.feeId }}</text></view></view><view class="cu-item"><view class="content"><text class="text-grey">金额</text></view><view class="action"><text class="text-grey text-sm">{{feeInfo.amount + '元' }}</text></view></view></view></scroll-view><view class=" bg-white  border flex justify-end" style="position: fixed;width: 100%;bottom: 0;"><view class="action text-orange margin-right line-height">合计:{{feeInfo.amount}}</view><view class="btn-group"><!-- #ifdef H5 || MP-WEIXIN --><button class="cu-btn bg-red shadow-blur lgplus sharp" @click="onPayFee()">提交订单</button><!-- #endif --><!-- #ifdef APP-PLUS --><button class="cu-btn bg-red shadow-blur lgplus sharp" @click="_payWxApp()">提交订单</button><!-- #endif --></view></view></view></view>
</template><script>import {date2String} from '../../lib/java110/utils/DateUtil.js'import context from '../../lib/java110/Java110Context.js';const constant = context.constant;const util = context.util;// #ifdef H5const WexinPayFactory = require('../../factory/WexinPayFactory.js');// #endifexport default {data() {return {communityId: '',communityName: '',repairId:'',appId: '',repairInfo:{},feeInfo:{},userId:'',payerObjId: '',payerObjType: '3333',endTime: '',repairTypeName: '',repairObjName: '',repairName: '',remark: '',};},/*** 生命周期函数--监听页面加载*/onLoad: function(options) {context.onLoad(options);// #ifdef MP-WEIXINlet accountInfo = uni.getAccountInfoSync();this.appId = accountInfo.miniProgram.appId;// #endif// #ifdef H5this.appId = uni.getStorageSync(constant.mapping.W_APP_ID)// #endifthis.communityId = options.communityId;this.repairId = options.repairId;this.userId = options.userId;this.payerObjId = options.repairObjId;this.endTime = date2String(new Date(options.appointmentTime.replace(/-/g, "/")));this.repairTypeName = options.repairTypeName;this.repairObjName = options.repairObjName;this.repairName = options.repairName;this.remark = options.contextthis._loadRepair();this._listFee();},methods: {/*** 加载我的报修* */_listFee: function() {let that = this;let _url = '';_url = constant.url.listFeeByAttr;let _paramIn = {"communityId": that.communityId,"page": 1,"row": 1,"specCd": '390001',"value": that.repairId};context.request({url: _url,header: context.getHeaders(),method: "GET",data: _paramIn,success: function(res) {let _json = res.data;if (_json.code == 0) {that.feeInfo = _json.data[0];return;}wx.showToast({title: "查询费用失败",icon: 'none',duration: 2000});},fail: function(e) {wx.showToast({title: "服务器异常了",icon: 'none',duration: 2000})}})},_loadRepair: function() {let that = this;let _url = '';_url = constant.url.listStaffFinishRepairs;let _paramIn = {"communityId": that.communityId,"page": 1,"row": 1,"userId": that.userId,"repairId": that.repairId};context.request({url: _url,header: context.getHeaders(),method: "GET",data: _paramIn,success: function(res) {let _json = res.data;if (_json.code == 0) {that.repairInfo = _json.data[0];return;}wx.showToast({title: "查询报修单失败",icon: 'none',duration: 2000});},fail: function(e) {wx.showToast({title: "服务器异常了",icon: 'none',duration: 2000})}})},_payWxApp: function(_data) {wx.showLoading({title: '支付中'});let _tradeType = 'APP';let _objData = {cycles: 1,communityId: this.communityId,feeId: this.feeInfo.feeId,feeName: '报修费',receivedAmount: this.feeInfo.feePrice,tradeType: _tradeType,appId: this.appId};context.request({url: constant.url.preOrder,header: context.getHeaders(),method: "POST",data: _objData,//动态数据success: function(res) {if (res.statusCode == 200 && res.data.code == '0') {let data = res.data; //成功情况下跳转let obj = {appid: data.appId,noncestr: data.nonceStr,package: 'Sign=WXPay', // 固定值,以微信支付文档为主partnerid: data.partnerid,prepayid: data.prepayid,timestamp: data.timeStamp,sign: data.sign // 根据签名算法生成签名}// 第二种写法,传对象字符串let orderInfo = JSON.stringify(obj)uni.requestPayment({provider: 'wxpay',orderInfo: orderInfo, //微信、支付宝订单数据success: function(res) {uni.showToast({title: "支付成功",duration: 2000});uni.navigateBack({});},fail: function(err) {console.log('fail:' + JSON.stringify(err));}});wx.hideLoading();return;}wx.hideLoading();wx.showToast({title: "缴费失败",icon: 'none',duration: 2000});},fail: function(e) {wx.hideLoading();wx.showToast({title: "服务器异常了",icon: 'none',duration: 2000});}});},onPayFee: function() {wx.showLoading({title: '支付中'});let _tradeType = 'JSAPI';let _objData = {cycles: '1',communityId: this.communityId,feeId: this.feeInfo.feeId,feeName: '报修费',receivedAmount: this.feeInfo.feePrice,tradeType: _tradeType,appId: this.appId,endTime: this.endTime,payerObjId: this.payerObjId,payerObjType: this.payerObjType};context.request({url: constant.url.preOrder,header: context.getHeaders(),method: "POST",data: _objData,//动态数据success: function(res) {if (res.statusCode == 200 && res.data.code == '0') {let data = res.data; //成功情况下跳转// #ifdef MP-WEIXINuni.requestPayment({'timeStamp': data.timeStamp,'nonceStr': data.nonceStr,'package': data.package,'signType': data.signType,'paySign': data.sign,'success': function(res) {uni.showToast({title: "支付成功",duration: 2000});uni.navigateBack({});},'fail': function(res) {console.log('fail:' + JSON.stringify(res));}});// #endif// #ifdef H5WexinPayFactory.wexinPay(data,function(){uni.showToast({title: "支付成功",duration: 2000});uni.navigateBack({});});// #endifwx.hideLoading();return;}wx.hideLoading();wx.showToast({title: "缴费失败",icon: 'none',duration: 2000});},fail: function(e) {wx.hideLoading();wx.showToast({title: "服务器异常了",icon: 'none',duration: 2000});}});}}};
</script>
<style>.ppf_item{padding: 0rpx 0rpx 0rpx 0rpx;}.block__title {margin: 0;font-weight: 400;font-size: 14px;color: rgba(69,90,100,.6);padding: 40rpx 30rpx 20rpx;}.button_up_blank{height: 40rpx;}.block__bottom{height: 180rpx;}.fee-last {margin-bottom: 200upx;}.cu-btn.lgplus {padding: 0 20px;font-size: 18px;height: 100upx;}.cu-btn.sharp {border-radius: 0upx;}.line-height {line-height: 100upx;}
</style>
import sheep from '@/sheep';
// #ifdef H5
import $wxsdk from '@/sheep/libs/sdk-h5-weixin';
// #endif
import { getRootUrl } from '@/sheep/helper';
import PayOrderApi from '@/sheep/api/pay/order';/*** 支付** @param {String} payment = ['wechat','alipay','wallet','mock']  	- 支付方式* @param {String} orderType = ['goods','recharge','groupon']  	- 订单类型* @param {String} id					- 订单号*/export default class SheepPay {constructor(payment, orderType, id) {this.payment = payment;this.id = id;this.orderType = orderType;this.payAction();}payAction() {const payAction = {WechatOfficialAccount: {wechat: () => {this.wechatOfficialAccountPay();},alipay: () => {this.redirectPay(); // 现在公众号可以直接跳转支付宝页面},wallet: () => {this.walletPay();},mock: () => {this.mockPay();}},WechatMiniProgram: {wechat: () => {this.wechatMiniProgramPay();},alipay: () => {this.copyPayLink();},wallet: () => {this.walletPay();},mock: () => {this.mockPay();}},App: {wechat: () => {this.wechatAppPay();},alipay: () => {this.alipay();},wallet: () => {this.walletPay();},mock: () => {this.mockPay();}},H5: {wechat: () => {this.wechatWapPay();},alipay: () => {this.redirectPay();},wallet: () => {this.walletPay();},mock: () => {this.mockPay();}},};return payAction[sheep.$platform.name][this.payment]();}// 预支付prepay(channel) {return new Promise(async (resolve, reject) => {let data = {id: this.id,channelCode: channel,channelExtras: {}};// 特殊逻辑:微信公众号、小程序支付时,必须传入 openidif (['wx_pub', 'wx_lite'].includes(channel)) {const openid = await sheep.$platform.useProvider('wechat').getOpenid();// 如果获取不到 openid,微信无法发起支付,此时需要引导if (!openid) {this.bindWeixin();return;}data.channelExtras.openid = openid;}// 发起预支付 API 调用PayOrderApi.submitOrder(data).then((res) => {// 成功时res.code === 0 && resolve(res);// 失败时if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) {// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况if (res.msg.indexOf('无效的openid') >= 0 // 获取的 openid 不正确时,或者随便输入了个 openid|| res.msg.indexOf('下单账号与支付账号不一致') >= 0) { // https://developers.weixin.qq.com/community/develop/doc/00008c53c347804beec82aed051c00this.bindWeixin();}}});});}// #ifdef H5// 微信公众号 JSSDK 支付async wechatOfficialAccountPay() {let { code, data } = await this.prepay('wx_pub');if (code !== 0) {return;}const payConfig = JSON.parse(data.displayContent);$wxsdk.wxpay(payConfig, {success: () => {this.payResult('success');},cancel: () => {sheep.$helper.toast('支付已手动取消');},fail: (error) => {if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) {sheep.$helper.toast('发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付');return}this.payResult('fail');},});}// 浏览器微信 H5 支付 TODO 芋艿:待接入async wechatWapPay() {const { error, data } = await this.prepay();if (error === 0) {const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`;location.href = `${data.pay_data.h5_url}&redirect_url=${encodeURIComponent(redirect_url)}`;}}// 支付链接  TODO 芋艿:待接入async redirectPay() {let { error, data } = await this.prepay();if (error === 0) {const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`;location.href = data.pay_data + encodeURIComponent(redirect_url);}}// #endif// 微信小程序支付async wechatMiniProgramPay() {// let that = this;let { code, data } = await this.prepay('wx_lite');if (code !== 0) {return;}// 调用微信小程序支付const payConfig = JSON.parse(data.displayContent);uni.requestPayment({provider: 'wxpay',timeStamp: payConfig.timeStamp,nonceStr: payConfig.nonceStr,package: payConfig.packageValue,signType: payConfig.signType,paySign: payConfig.paySign,success: (res) => {this.payResult('success');},fail: (err) => {if (err.errMsg === 'requestPayment:fail cancel') {sheep.$helper.toast('支付已手动取消');} else {this.payResult('fail');}},});}// 余额支付async walletPay() {const { code } = await this.prepay('wallet');code === 0 && this.payResult('success');}// 模拟支付async mockPay() {const { code } = await this.prepay('mock');code === 0 && this.payResult('success');}// 支付宝复制链接支付  TODO 芋艿:待接入async copyPayLink() {let that = this;let { error, data } = await this.prepay();if (error === 0) {// 引入showModal 点击确认 复制链接;uni.showModal({title: '支付宝支付',content: '复制链接到外部浏览器',confirmText: '复制链接',success: (res) => {if (res.confirm) {sheep.$helper.copyText(data.pay_data);}},});}}// 支付宝支付  TODO 芋艿:待接入async alipay() {let that = this;const { error, data } = await this.prepay();if (error === 0) {uni.requestPayment({provider: 'alipay',orderInfo: data.pay_data, //支付宝订单数据success: (res) => {that.payResult('success');},fail: (err) => {if (err.errMsg === 'requestPayment:fail [paymentAlipay:62001]user cancel') {sheep.$helper.toast('支付已手动取消');} else {that.payResult('fail');}},});}}// 微信支付  TODO 芋艿:待接入async wechatAppPay() {let that = this;let { error, data } = await this.prepay();if (error === 0) {uni.requestPayment({provider: 'wxpay',orderInfo: data.pay_data, //微信订单数据(官方说是string。实测为object)success: (res) => {that.payResult('success');},fail: (err) => {err.errMsg !== 'requestPayment:fail cancel' && that.payResult('fail');},});}}// 支付结果跳转,success:成功,fail:失败payResult(resultType) {sheep.$router.redirect('/pages/pay/result', {id: this.id,orderType: this.orderType,payState: resultType});}// 引导绑定微信bindWeixin() {uni.showModal({title: '微信支付',content: '请先绑定微信再使用微信支付',success: function (res) {if (res.confirm) {sheep.$platform.useProvider('wechat').bind();}},});}}export function getPayMethods(channels) {const payMethods = [{icon: '/static/img/shop/pay/wechat.png',title: '微信支付',value: 'wechat',disabled: true,},{icon: '/static/img/shop/pay/alipay.png',title: '支付宝支付',value: 'alipay',disabled: true,},{icon: '/static/img/shop/pay/wallet.png',title: '余额支付',value: 'wallet',disabled: true,},{icon: '/static/img/shop/pay/apple.png',title: 'Apple Pay',value: 'apple',disabled: true,},{icon: '/static/img/shop/pay/wallet.png',title: '模拟支付',value: 'mock',disabled: true,}];const platform = sheep.$platform.name// 1. 处理【微信支付】const wechatMethod = payMethods[0];if ((platform === 'WechatOfficialAccount' && channels.includes('wx_pub'))|| (platform === 'WechatMiniProgram' && channels.includes('wx_lite'))|| (platform === 'App' && channels.includes('wx_app'))) {wechatMethod.disabled = false;}wechatMethod.disabled = false; // TODO 芋艿:临时测试// 2. 处理【支付宝支付】const alipayMethod = payMethods[1];if ((platform === 'WechatOfficialAccount' && channels.includes('alipay_wap'))|| platform === 'WechatMiniProgram' && channels.includes('alipay_wap')|| platform === 'App' && channels.includes('alipay_app')) {alipayMethod.disabled = false;}// 3. 处理【余额支付】const walletMethod = payMethods[2];if (channels.includes('wallet')) {walletMethod.disabled = false;}// 4. 处理【苹果支付】TODO 芋艿:未来接入// 5. 处理【模拟支付】const mockMethod = payMethods[4];if (channels.includes('mock')) {mockMethod.disabled = false;}return payMethods;
}

相关文章:

uniapp写支付的操作

支付的时候一般需要几个参数&#xff1a; ‘timeStamp’: 时间戳,‘nonceStr’: 随机字符串&#xff0c;不超过32位‘package’: 下单后接口返回的prepauid‘signType’: 签名的算法‘paySign’: 后端会给前端一个签名sign: data.sign // 根据签名算法生成签名 <template&…...

微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index

目录 1. 如果需要对默认的变量名和下标进行修改&#xff0c;可以使用wx:for-item 和 wx:for-index 2. 将 wx:for 用在 标签上&#xff0c;以渲染一个包含多个节点的结构块 方法一 方法二 3. 总结 3.1 wx:for-item 和 wx:for-index总结 3.2 总结 1. 如果需要对默…...

下载无水印抖音视频

在抖音看到某些视频想下载&#xff0c;却出现无法保存在本地【显示"作品暂时无法保存,链接已复制"】。或者下载的视频有水印。 而某些微信小程序下载可能需要付费或者有水印。其实我们可以直接使用电脑浏览器直接下载。 举个例子: 这是来自王道官方账号的一条视频链…...

L1-039 古风排版(C++)

中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&a…...

springboot项目docker分层构建

一、需求场景 在使用dockerfile构建springboot项目时&#xff0c;速度较慢&#xff0c;用时比较长&#xff0c;为了加快构建docker镜像的速度&#xff0c;采用分层构建的方式 二、构建配置 1、pom.xml配置 <properties><project.build.sourceEncoding>UTF-8<…...

深入理解SPA、CSR与SSR的区别及应用

随着Web技术的快速发展&#xff0c;前端开发架构也在不断演进。在现代Web应用中&#xff0c;单页面应用&#xff08;SPA&#xff09;、客户端渲染&#xff08;CSR&#xff09;和服务器端渲染&#xff08;SSR&#xff09;是三种常见的实现方式&#xff0c;它们各自拥有独特的特性…...

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…...

将SQL数据库转换为Mysql数据库

一、准备工作 1、SQL server安装包与已经有数据的mdf、ldf数据库文件&#xff1b; 2、.net Framework安装包&#xff1b;&#xff08;用于支持SQL Server安装的组件&#xff09; 3、MySql安装包&#xff1b;&#xff08;用于目标数据库的环境安装&#xff09; 4、navicat安装包…...

Java集合进阶

双列集合 单列集合的特点&#xff1a;一次添加一个。 双列集合的特点&#xff1a;一次添加一对/键值对/键值对对象/Entry。 左键&#xff08;不可重复&#xff09;右值&#xff08;可重复&#xff09;&#xff0c;一一对应。 Map是双列集合的顶层接口&#xff0c;他的功能是…...

一.算法基础

目录 1.算法基础 2.算法概念 3.时间复杂度--用来评估算法运行效率的一个式子 如何简单快速的判断算法复杂度? 4.空间复杂度 1.算法基础 2.算法概念 --静态动态 3.时间复杂度--用来评估算法运行效率的一个式子 ----一个单位!!! 1-在什么配置下运行(机器) 2-问题的规模…...

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…...

Umi - 刷新后页面报404

Umi 项目本地运行刷新没问题&#xff0c;但是部署之后刷新页面报404。因为Umi 默认是用 browser 模式&#xff0c;需要做一下处理。 以下是官方给出解决方案。 一、解决方案 1. 方案一&#xff1a;改用hashHistory .umirc.js {history: { type: hash }, }这个方案项目打包…...

图片编辑器tui-image-editor

提示&#xff1a;图片编辑器tui-image-editor 文章目录 前言一、安装tui-image-editor二、新建components/ImageEditor.vue三、修改App.vue四、效果五、遇到问题 this.getResolve is not a function总结 前言 需求&#xff1a;图片编辑器tui-image-editor 一、安装tui-image-ed…...

如何使用“ubuntu移动文件、复制文件到其他文件夹“?

一、移动文件到其他文件夹命令 mv node_exporter-1.5.0.linux-amd64.tar.gz /usr/local/etc/prometheus 二、复制文件到其他文件夹命令 cp node_exporter-1.5.0.linux-amd64.tar.gz /home/master...

python实现B/B+树

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 B树和B树都是一种多路搜索树&#xff0c;用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用&#xff0c;特别是用于构建索引结构。 B树&#xff08;B-Tree&#xff09; B树&…...

感觉捡到宝了!这究竟是哪位大神出的神器?

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…...

Vue教学17:Element UI基础组件上手,打造美观实用的Vue应用

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十六篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…...

从政府工作报告探计算机行业发展(在医疗健康领域)

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…...

ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

前言 基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据&#xff0c;靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索&#xff0c;Lucene采用一种BKD结构&#xff0c;该结构能很好的空间利用率和性能。 …...

运维实习生 - 面经 - 游族网络

2024.3.5 Boss投递 2024.3.6 回复 2024.3.8过初筛 2024.3.13面试 确认候选人姓名 自我介绍 我看你更多是做数据分析的&#xff1f; 你是实习的时候才接触Linux&#xff1f; 软件工程不应该是往开发方面发展的吗&#xff1f; 你最近有做运维方面的工作吗&#xff0c;技术…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...