支付系统设计入门:核心账户体系架构


👉目录
1 账户记账理论
2 账户设计
3 账户性能问题
4 账户核心架构
5 小结
第三方支付作为中立的第三方,截断了用户和商户的资金流,资金先从用户账户转移到第三方支付平台账户,得到双方确认后再从支付平台账户转移到商户账户。

支付平台为客户提供了资金流转以及结算等服务,必须建立自己独立的账户体系,以此来保证每个客户资金的准确性以及资金变动的可追溯性,这套账户体系在支付平台中成为“核心”,整体类似于银行的账户核心,但会比银行账户核心简单一些。
关注腾讯云开发者,一手技术干货提前解锁👇
鹅厂程序员面对面新一季直播继续,每周将邀请鹅厂明星技术大咖深入讲解技术话题,更有精美周边等你来拿,记得提前预约直播~👇
01
账户记账理论
1.1 会计恒等式
资产=负债+所有者权益
举个可能不是特别恰当的例子,比如腾讯滨海大厦,在等式的左边他体现为公司的资产,在等式的右边,负债可以表现公司为了兴建大厦从银行的贷款,所有者权益可以表现为公司股东的投入。等式右边,负债可以理解为外债,所有者权益可以理解为内债(欠股东的钱)。这里都是针对腾讯公司的法人而言,资产,负债,所有者权益都是这个法人的权利和义务。
另外,也可以理解为等式的左边资产是可用的资源,是公司的权利,而等式的右边是为了解释左边而存在,用来说明资产的来源,是公司的义务。
1.2 复式记账法
上面的会计恒等式中,除了强调相等,还强调左右,任何一笔交易,都必须保证这个等式成立,所以要么两边同时加或同时减(比如左边资产增加,右边负债也增加),要么等式单边内部平衡(比如等式左边,有资产增加,对应就有资产减少)。所以所谓的“复式记账法”简单理解就是一笔交易写两遍,使得左边和右边互相匹配,这样做的好处很明显,容易核对不容易出错。在会计中把这种复式记账法成为“借贷记账法”,强调“有借必有贷,借贷必相等”。

“借贷”的理解两个字意思都有歧义,不要尝试从字面意义去理解,在会计中借贷只是两个记账符号,表示两个相反的方向,不绝对代表数量的增减,所有的账户都是左借右贷,资产类账户增加是借,减少是贷,负债类账户刚好相反,增加是贷,减少是借。 上面这些概念对于没有会计基础的人来说,有时会比较难以理解,对于程序员来说,只需要知道一笔数至少记两次,至少会在两个相关的账户中记录金额相等,借贷相反的记录,两个账户的类型可以是相同的(比如都是负债类账户),也可以是不同的。
02
账户设计
对第三方支付平台而言,也同样存在资产类账户和负债类账户:
资产类账户:在上一篇文章中提到,交易过程中资金会被截断,用户支付时,是先从用户银行账户入账到了支付平台的账户,而没有直接到商户的银行账户,支付平台账户其实就是财付通开在央行的备付金账户(备付金的具体解析可以参考另外一篇文章)。这个是财付通的资产,对央行来说这笔钱是财付通的,所以这个是资产类账户。
负债类账户:当这笔钱入账到了财付通备付金账户后,财付通内部必须要知道这笔钱真正要归属到那个商户(央行备付金只是一个所有资金的总额,不会记录具体某一笔钱归属于谁),这就对应到前面提到的为了保障每个用户的资金清晰明了和可追溯,财付通内部建立了一套账户体系。这种账户对财付通来说是负债,因为这些钱是别人的,最终要转移到其他主体,所以财付通内部账户是负债类账户。
2.1 内部账户体系
内部账户在用户看来就是微信支付里面的零钱,当然这个只是整体账户体系的一部分。

按照属性分类,可以将内部账户分成以下几种:
个人账户,一个人一个账户,这个被叫做是C账户,是现金账户,个人可以完全支配。
商户账户,商户账户因为需要结算等,所以一个商户有两个账户,一个B账户(中介账户,理解为待结算账户),一个C账户(现金账户)。当用户支付时,实际支付到了商户的B账户,这个账户里面的资金商户不能自由支配,待平台结算后(扣除手续费等),资金被转移到C账户,这个账户商户是可以自由支配的,比如可以提现到商户自己的银行卡。
银行账户,第三方支付公司为各个银行设置的账户,这个账户是一个总账账户,记录与银行之间的资金变动,一般不记录余额,而只是记录流水,方便跟各个银行进行对账。
总体的关系如下:

其实在内部账户中,除了用户和商户账户外,还有支付平台自身的账户,当 B 账户进行结算时,一部分资金进入商户自己的 C 账户,另外手续费等进入支付平台的账户,另外,上图中省略了银行账户。
2.2 账户内容
账户体系中有三个主要内容,账户余额,交易凭证以及交易流水:

账户余额就是账户中的资金数目,任何余额的变动都需要记录流水,而凭证是用来记录交易过程的信息。
凭证单理论上可以放到业务层,不放在账户核心层,这样账户层就只有余额和流水。三者主要内容包括:
余额
账户余额记录用户的资金数目,当发生交易时,会对余额进行 update 操作,增加或减少资金的数据。一般包括:
账户 ID,这个 ID 有的平台会有编码规则,比如某些位用来区分个人或者商户,区分币种以及校验位等。
币种。
余额。
冻结余额,在途交易,还不能确定是否要扣减余额,就可以通过冻结余额来反应。
账户状态,比如是正常态、支付或者冻结等。
流水
当余额发生变更时,需要记录流水,以此来跟踪余额的变化,一般包括如下内容:
流水 ID。
凭证 ID,就是下面凭证中的 ID。
发生金额。
借贷方向。
对方账户 ID。
凭证
凭证用来记录交易过程中的信息,是用户交易的依据。凭证对应到支付平台内部的各种单类,比如充值单,体现单,交易单等等。一般包括:
凭证 ID。
交易参与方,可能是两方,也可能是多方。
交易金额、交易类型。
交易状态,比如支付中,支付成功,转退款等。
交易渠道。
03
账户性能问题
账户性能问题由以下两方面引入:
复式记账法,一笔交易需要在两个账户中进行记录,在海量支付系统中,两个账户大概率上不在同一台 DB 上,甚至也极有可能不在同一 IDC,这就需要引入分布式事务,分布式事务本质上是进程间的同步调用,性能会大幅下降,同时引入了较高的复杂性,比如需要考虑事务一半成功一半失败时的补偿机制或者回滚机制。所以复式记账法带来的分布式事务导致可靠性以及性能都会受到影响;
热点账户,某些账户的交易十分频繁(比如京东账户,拼多多账户),而每笔交易都会对应到余额字段的 update 操作,更新时需要对账户进行加锁操作,频繁加锁释锁会对 DB 造成极大的性能压力,可能会超过 DB 的能承载的极限。压测显示 MySQL 单条记录 update 最大性能500次/s(after_commit 模式)。
解决这些问题有以下一些方案:
先借后贷。
余额更新简化。
合并入账。
多账户。
3.1 先借后贷
通常情况下,复式记账的借贷需要在同一个事务里面完成,但分布式事务引入了性能和可靠性问题,所以可以将一个分布式事务拆分成两个本地事务,即“先借后贷”,一个是“借”的实时事务,加一个“贷”的异步事务。当完成实时事务后就可以对外返回成功,异步事务后续进行,这样简化了事务复杂性,当如也会引入其他的问题,后面会讲到。
举两个例子来说明整个过程,分别是快捷支付和余额支付:
快捷支付:用户银行账户支付给商户。借贷账户分别是财付通备付金账户(资产类账户)以及商户的内部 B 账户(负债类账户),T 型账如下图所示:

简化的交互序列如下所示:

余额支付:用户的财付通零钱账户支付给商户。借贷账户都是财付通内部账户,分别是用户的内部 C 账户以及商户的内部B账户,T 型账如下图所示:

简化的交互序列如下图所示:(这个图可能有点问题,其实是核心发出的异步消息和处理)。

可以看到,原则是:
先:增加资产,或减少负债。
后:减少资产,或增加负债。
引入的问题
所有将分布式事务拆分成本地事务后引入的问题都是类似的,在事务理论中的“ACID”中,拆分后牺牲了C(一致性)强一致性,但每个本地事物是一致的,另外也缺乏“I”(isolation)隔离型,缺乏隔离型会导致比如“脏读”的异常,即其他事务读到了尚未完全完成事务的更新,这个也很好理解,比如用户本该加100块,但由于异步导致这100块没有马上加上。这个看起来是个大问题,但具体分析:
业务层面而言,这个是可以接受的,因为实行“先借后贷”,所以商户或者用户的可用额度只会小于实际的可用额度,不会出现短款,整体的风险是可控的。另外,从用户的角度来说,短暂的余额不一致也是可以接受的,因为用户可能根本感知不到。
从**“事务回退”**的角度来看,对支付平台来说,资产增加和负债减少都是可以回退的,因为资产在支付机构账上,即使做错账了,可以进行退款等逆向操作。但如果先减少平台资产,比如先给客户打款了,这个是不可回退的,因为客户可能马上就把钱给用完了。“先借后贷”规避了拆分成本地事物的风险。
虽然风险可控,但还是一定要考虑好程序异常时对业务的回滚、重试以及对账机制,保障整个过程结果的最终一致性。
3.2 余额更新简化
特定应用场景下,可以不记余额,这其实违背了记账原则,但在某些场景下,可以通过其他手段来补偿和保障,典型的应用比如 C2B2C 交易,中间的 B 账户可以不记余额,它的存在只是为了作为中间交易的对手方。
3.3 合并入账
合并入账,就是先将余额更新操作 hold 住,暂存入待入账队列(可以使用 DB 或者 KV),累积到一定数量或者到一定时间时,将发生金额进行汇总合并,更新一次余额,从而大幅提升入账效率。合并入账借贷先后原则和前面类似,为了防范风险,只对入账(负债类账户的“贷”)进行合并,出账仍然需要实时完成。

3.4 多账户
先借后贷以及合并入账只能解决入账时的热点问题,而出账都是需要实时更新(为避免透支风险)。为了解决出账热点,需要引入多账户体系,即通过新建多个账户,把业务均摊到多个账户上,从而解决热点问题。
多账户不仅可以解决出账热点问题,对入账热点问题也有效,本质上多账户就是把一条 DB 记录的更新均分到了多个 DB 记录上。
按照账户的承载功能不同,多账户方案可以分成两种:
功能分离型多账户,出入帐功能分离,有的子账户承载入帐,有的子账户承载出账,有的承载两者。
功能完整性多账户,所有的分账户都同时承载出账和入帐。
功能分散型多账户
功能分离型有两个出发点,一是业务特性,出入帐性能压力不一样;二是风险和管理上的考虑,一个完整账户比多个完整账户的风险和管理难度要小很多。功能分散型子账户有以下几类:
入账子账户,只承载入帐请求。
出账子账户,只承载出账请求。
完整子账户,可以同时承载出入帐,这个账户也可以认为是一个主账户。

出账和入账的账户个数根据业务特性设置。
入账子账户完成入账操作后,定时将资金向上归集到主账户,之后主账户将资金调拨到出账子账户,供出账操作,某些情形下。根据业务特性,资金调拨有一下一些场景:
一定周期内只有一笔出账,则不需要往下调拨了。直接由主账户完成出金。
针对 2B 业务,特性是低频大额,此时可以将资金绝大部分留在主账户上,由主账户完成大额出金操作。
针对 2C 业务,特性是高频小额,此时可以将资金尽量分散到多个出账子账户,由出账子账户完成出金操作。
功能完整型多账户

每个子账户都会同时承载入账业务和出账业务,子账户之间时并列的关系:
入账时,应该尽量均衡的选择子账户。
出账时,应该选择余额大于出账金额的账户,如果没有,则选择余额最大的子账户,目的是减少资金调拨的次数。
多账户设计要点
需要保存用户和多个账户的逻辑对应关系,这个对应关系可以放在业务层,也可以放在核心账户层。
子账户的部署模式可以是同 DB 分布,同 IDC 多 DB 分布,或者跨 IDC 分布,实现难度依次增加,需要根据性能要求以及容灾要求选择合适的部署方式。
分账户后资金调拨是个难点,需要仔细设计,尽量避免资金的来回调拨。
如果是跨 DB 或者跨 IDC 部署时,资金总额的查询会很麻烦,可以考虑采用 CQRS(命令查询指责分离)的设计模式,设置一个集中化的查询副本。
04
账户核心架构
4.1 处理逻辑
财付通记账核心的事务处理经历过几个阶段:
本地事务:早期用户量和业务压力都不大,几台 DB 机器就完全能够处理,所以本地事务即能满足要求;
分布式事务:随着业务发展,本地事务已经无法满足需求,所以迭代到了分布式事务处理,采用两阶段提交来实现分布式事务,这个是财付通历史上比较重要的一个里程碑;
柔性事务:微信支付的兴起,对性能以及可靠性的要求都提高了很多。而分布式事务提供的 ACID 保证本质上是多台 DB 的同步调用,是以损害可用性、性能为代价的。因为只有在参与事务的各方都能够正常工作,分布式事务才能够顺利进行,只要有一个工作不正常,整个事务就不能完成。而BASE柔性事务的思想就是将分布式事务分割成多个本地事务,同时通过一定机制串接以达到最终一致性。BASE 理论最早是 eBay 工程师在2008发表的论文中提出的,可以参考《Base: An Acid Alternative》https://queue.acm.org/detail.cfm?id=1394128
目前财付通的记账核心大部分场景是基于柔性事务,少部分是基于分布式事务。事务拆分的依据就是上面提到的“先借后贷”。
下面简单介绍下基本的账务处理流程,以 C2B 支付为例,即个人支付给商户的场景,事务处理如下所示,可以分成三部分,买家账户处理,凭证处理,以及卖家处理:
beginupdate 买家余额,余额减少 insert 买家流水 insert 支付凭证交易单 update 卖家余额,余额增加 insert 卖家流水commit 柔性事务中事务分成两个子事务,买家事务+凭证合并为第一个本地事务,卖家事务作为第二个事务,基本的处理逻辑如下:

远程日志:当有一笔支付请求发送到事务管理器后,事务管理器首先通过本地的远程日志代理写远程日志,日记代理将日志发往异地的远程日志服务,远程日志服务将日志记录到日志文件里面持久化,同时会将事务信息记录到黑名单 kv 中。黑名单校验模块将会校核黑名单 kv,对于已经同步到异地备 DB 中的用户将会消除;
买家本地事务:远程日志记录完成后,事务管理器发起第一个事务,调用资源管理器,资源管理器将与账务 DB 交互,减买家余额,记录流水,并且记录交易单;完成第一个事务后,事务管理器将发送异步消息给异步入账服务;
卖家本地事务:异步入账服务收到异步消息后,将发起第二个事务,调用资源管理器,资源管理器与账务 DB 交互,加卖家余额,记录流水。
05
小结
本文介绍了账户记账原理、内部账户基本组成、性能方面的考虑、财付通账户的基本架构以及处理逻辑。核心账户体系比较复杂,关联的内容也有很多,理解有所偏差的地方,敬请指正。
-End-
原创作者|邱凯福
感谢你读到这里,不如关注一下?👇

📢📢Google Pay是怎么设计它的支付钱包系统的?点击下方立刻探索👇


你觉得账户体系中哪一块是最重要的?欢迎评论留言补充。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。4月16日中午12点开奖。






相关文章:
支付系统设计入门:核心账户体系架构
👉目录 1 账户记账理论 2 账户设计 3 账户性能问题 4 账户核心架构 5 小结 第三方支付作为中立的第三方,截断了用户和商户的资金流,资金先从用户账户转移到第三方支付平台账户,得到双方确认后再从支付平台账户转移到商户账户。 支…...
[LevelDB]Block系统内幕解析-元数据块(Meta Block)元数据索引块(MetaIndex Block)索引块(Index Block)
本文内容组织形式 Block的基本信息作用示意图举例说明 源码解析Footer格式写入&读取编码&解码 元数据块(Meta Block)构建&读取 元数据索引块构建&读取 索引块定义构建&读取核心方法-FindShortestSeparator&FindShortSuccessor作…...
leetcode:905. 按奇偶排序数组(python3解法)
难度:简单 给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1: 输入:nums [3,1,2,4] 输出:[2,4,3,1] 解释:…...
抖音视频下载工具
抖音视频下载工具 功能介绍 这是一个基于Python开发的抖音视频下载工具,可以方便地下载抖音平台上的视频内容。 主要特点 支持无水印视频下载自动提取视频标题作为文件名显示下载进度条支持自动重试机制支持调试模式 使用要求 Python 3.10Chrome浏览器必要的P…...
断言与反射——以golang为例
断言 x.(T) 检查x的动态类型是否是T,其中x必须是接口值。 简单使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二个参数就是OK,这…...
【家政平台开发(27)】商务部信用对接、法律咨询与视频面试功能开发全攻略
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
【数据结构】排序算法(下篇·开端)·深剖数据难点
前引:前面我们通过层层学习,了解了Hoare大佬的排序精髓,今天我们学习的东西可能稍微有点难度,因此我们必须学会思想,我很受感慨,借此分享一下:【用1520分钟去调试】,如果我们遇到了任…...
山东大学软件学院创新项目实训开发日志(9)之测试前后端连接
在正式开始前后端功能开发前,在队友的帮助下,成功完成了前后端测试连接: 首先在后端编写一个测试相应程序: 然后在前端创建vue 并且在index.js中添加一下元素: 然后进行测试,测试成功: 后续可…...
【VUE3】Eslint 与 Prettier 的配置
目录 0 前言 1 VSCode 中的 Eslint 与 prettier 插件 2 两种方案 3 eslint.config.js 4 eslint-plugin-prettier 插件 5 eslint-config-prettier 插件 6 安装插件命令 7 其他配置 8 参考资料 0 前言 黑马程序员视频地址:160-Vue3大事件项目-ESlint配合P…...
蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】
【背景说明】本文的作者是一名算法竞赛小白,在第一次参加蓝桥杯之前希望整理一下自己会了哪些算法,于是有了本文的诞生。分享在这里也希望与众多学子共勉。如果时间允许的话,这一系列会分为上中下三部分和大家见面,祝大家竞赛顺利…...
springboot调用python文件,python文件使用其他dat文件,适配windows和linux,以及docker环境的方案
介绍 后台是用springboot技术,其他同事做的算法是python,现在的需求是springboot调用python,python又需要调用其他的数据文件,比如dat文件,这个文件是app通过蓝牙获取智能戒指数据以后,保存到后台…...
GSO-YOLO:基于全局稳定性优化的建筑工地目标检测算法解析
论文地址:https://arxiv.org/pdf/2407.00906 1. 论文概述 《GSO-YOLO: Global Stability Optimization YOLO for Construction Site Detection》提出了一种针对建筑工地复杂场景优化的目标检测模型。通过融合全局优化模块(GOM)、稳定捕捉模块(SCM)和创新的AIoU损失函…...
Python 中使用单例模式
有这么一种场景,Web服务中有一个全局资源池,在需要使用的地方就自然而言引用该全局资源池即可,此时可以将该资源池以单例模式实现。随后,需要为某一特殊业务场景专门准备一个全局资源池,于是额外复制一份代码新建了一个…...
系统思考—提升解决动态性复杂问题能力
感谢合作伙伴的信任推荐! 客户今年的人才发展重点之一,是提升管理者应对动态性、复杂性问题的能力。 在深入交流后,系统思考作为关键能力模块,最终被纳入轮训项目——这不仅是一次培训合作,更是一场共同认知的跃迁&am…...
Java基础 - 反射(2)
文章目录 示例5. 通过反射获得类的private、 protected、 默认访问修饰符的属性值。6. 通过反射获得类的private方法。7. 通过反射实现一个工具BeanUtils, 可以将一个对象属性相同的值赋值给另一个对象 接上篇: 示例 5. 通过反射获得类的private、 pro…...
Python proteinflow 库介绍
ProteinFlow是一个开源的Python库,旨在简化蛋白质结构数据在深度学习应用中的预处理过程。以下是其详细介绍: 功能 数据处理:支持处理单链和多链蛋白质结构,包括二级结构特征、扭转角等特征化选项。 数据获取:能够从Protein Data Bank (PDB)和Structural Antibody Databa…...
P1162 洛谷 填涂颜色
题目描述 思考 看数据量 30 而且是个二维的,很像走迷宫 直接深搜! 而且这个就是搜连通块 代码 一开始的15分代码,想的很简单,对dfs进行分类,如果是在边界上,就直接递归,不让其赋值,…...
docker安装nginx,基础命令,目录结构,配置文件结构
Nginx简介 Nginx是一款轻量级的Web服务器(动静分离)/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强. 🔗官网 docker安装Nginx 🐳 一、前提条件 • 已安装 Docker(dock…...
SQLI漏洞公开报告分析
文章目录 1. 闭合 )2. 邀请码|POST参数|时间盲注 | **PostgreSQL**3. POST|order by参数|布尔盲注|Oracle4. SOAP请求|MSSQL|布尔盲注5. MySQL 时间盲注漏洞6. GET|普通回显注入7. ImpressCMS 1.4.2 | CVE | POST | 布尔盲注8. Mysql | post | 布尔/时间盲注9. 登录口 | post |…...
SpringBoot项目部署之启动脚本
一、启动脚本方案 1. 基础启动方式 1.1 直接运行JAR java -jar your-app.jar --spring.profiles.activeprod优点:简单直接,适合快速测试缺点:终端关闭即终止进程 1.2 后台运行 nohup java -jar your-app.jar > app.log 2>&1 &…...
用Django和AJAX创建一个待办事项应用
用Django和AJAX创建一个待办事项应用 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 用Django和AJAX创建一个待办事项应用让我们创建一个简单的 Django 项目,其中包含不同类型的 A…...
JavaScript:游戏开发的利器
在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...
C语言今天开始了学习
好多年没有弄了,还是捡起来弄下吧 用的vscode 建议大家参考这个配置 c语言vscode配置 c语言这个语言简单,但是今天听到了一个消息说python 不知道怎么debug。人才真多啊...
Elasticsearch 系列专题 - 第五篇:集群与性能优化
随着数据量和访问量的增长,单节点 Elasticsearch 已无法满足需求。本篇将介绍集群架构、性能优化方法以及常见故障排查,帮助你应对生产环境中的挑战。 1. 集群架构 1.1 节点角色(Master、Data、Ingest 等) Elasticsearch 集群由多个节点组成,每个节点可扮演不同角色: M…...
鸿蒙NEXT开发Preferences工具类(ArkTs)
import { AppUtil } from ./AppUtil; import dataPreferences from ohos.data.preferences; export const DEFAULT_PREFERENCE_NAME: string "SP_HARMONY_UTILS_PREFERENCES"; // Preferences实例的名称。/*** Preferences工具类* author CSDN-鸿蒙布道师* since 20…...
电商素材革命:影刀RPA魔法指令3.0驱动批量去水印,实现秒级素材净化
本文 去除水印实操视频展示电商图片水印处理的困境影刀 RPA 魔法指令 3.0 强势登场利用魔法指令3.0两步实现去除水印操作关于影刀RPA 去除水印实操视频展示 我们这里选择了4张小红书里面比较帅气的图片,但凡用过小红书的都知道,小红书右下角是会有小…...
前端面试题(七):什么是vuex,请解释一下它在Vue中的作用
Vuex 是一个专门为 Vue.js 应用程序开发的状态管理库。它可以集中管理应用的所有状态,并保证状态以一种可预测的方式发生变化。简单来说,Vuex 用来管理 Vue 应用中的数据(即状态),使得数据的传递和共享更加清晰和可靠&…...
笔记:头文件与静态库的使用及组织方式
笔记:头文件与静态库的使用及组织方式 1. 头文件的作用 接口声明:提供函数、类、变量等标识符的声明,供其他模块调用。编译依赖:编译器需要头文件来验证函数调用和类型匹配。避免重复定义:通过包含保护(如…...
ubuntu,react的学习(1)
在此目录下,开启命令行 /home/kt/react 如下操作 tkt4028:~/react$ npm create vitelatest task-manager -- --template react Need to install the following packages: create-vite6.3.1 Ok to proceed? (y) y> npx > cva task-manager --template react…...
【QT】QTreeWidgetItem的checkState/setCheckState函数和isSelected/setSelected函数
目录 1、函数原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函数和isSelected/setSelected这两组函数有着不同的用途,下面具体说明: 1、函数原型 1.1 checkState/setCheckState Qt::CheckState QTr…...
