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

TiDB 源码编译之 PD/TiDB Dashboard 篇

作者: ShawnYan 原文来源: https://tidb.net/blog/a16b1d46

no-alt

TiDB

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性,支持在本地和云上部署。

源码仓库

TiDB 数据库本身由众多组件构成,而周边生态也欣欣向荣,所以源码仓库很多,本文主要涉及 PD 和 TiDB Dashboard 两个源码库,目标地址如下:

  • https://github.com/tikv/pd/

PD 是 Placement Driver 的缩写。它管理和调度TiKV集群。PD 被称之为 TiDB 集群的“大脑”。 PD 通过嵌入etcd来支持容错。部署时,建议启动 3 个 PD 进程来构成 PD 集群,保证高可用。

  • https://github.com/pingcap/tidb-dashboard/

TiDB Dashboard 是一个 Web UI,用于监视、诊断和管理 TiDB 集群。可单独编译前后台资源包,也可以打包成二进制文件,一键启动。 关于 TiDB Dashboard 的更多介绍,可以参考官方文档: TiDB Dashboard 介绍

编译依赖

本文的编译使用的系统为 CentOS 7。

[shawnyan@centos7 ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[shawnyan@centos7 ~]$ uname -a
Linux centos7.shawnyan.com 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[shawnyan@centos7 ~]$ go version
go version go1.20.6 linux/amd64

PD 编译依赖 go 1.20,所以需要先安装 golang。但是,CentOS 7 默认提供的是 golang 1.19。

[shawnyan@centos7 ~]$ yum info golang
Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, subscription-manager
Loading mirror speeds from cached hostfile
Installed Packages
Name        : golang
Arch        : x86_64
Version     : 1.19.10
Release     : 1.el7
Size        : 7.4 M
Repo        : installed
From repo   : epel-7-aliyun
Summary     : The Go Programming Language
URL         : http://golang.org/
License     : BSD and Public Domain
Description : The Go Programming Language.[shawnyan@centos7 pd]$ go version
go version go1.19.10 linux/amd64

所以,需要手动下载二进制包并更新环境变量。

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz
tar zxvf go1.20.6.linux-amd64.tar.gz
sudo mv go /optvi ~/.bashrc
export GOl11MODULE=on
export GOROOT=/opt/go
export GOPATH=/home/shawnyan
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

TiDB Dashboard 包含前端 UI,所以依赖会多一些,需要安装 npm、pnpm,如果未安装 pnpm 会遇到报错。

cd ui &&\
pnpm i
/bin/sh: line 1: pnpm: command not found
make: *** [ui_deps] Error 127

这里,从 GitHub 下载 pnpm 二进制包。

wget https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64
sudo mv pnpm-linuxstatic-x64 /bin/pnpm
sudo chmod +x /bin/pnpm
pnpm --version
8.6.11

编译示例 -- PD

PD 编译时会直接引用 TiDB Dashboard,PD 编译日志截取如下。

+ Fetch TiDB Dashboard Go module- TiDB Dashboard directory: /home/shawnyan/pkg/mod/github.com/pingcap/tidb-dashboard@v0.0.0-20230705095454-5e220f970f27
+ Create download cache directory: /home/shawnyan/pd/.dashboard_download_cache
+ Discover TiDB Dashboard release version- TiDB Dashboard release version: 2023.07.05.1
+ Check whether pre-built assets are available- Cached archive does not exist- Download pre-built embedded assets from GitHub release- Download https://github.com/pingcap/tidb-dashboard/releases/download/v2023.07.05.1/embedded-assets-golang.zip% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 14.7M  100 14.7M    0     0  4029k      0  0:00:03  0:00:03 --:--:-- 7105k- Save archive to cache: /home/shawnyan/pd/.dashboard_download_cache/embedded-assets-golang-2023.07.05.1.zip
+ Unpack embedded asset from archive
Archive:  /home/shawnyan/pd/.dashboard_download_cache/embedded-assets-golang-2023.07.05.1.zip

所以想修改 TiDB Dashboard 的 UI 见面并打包到 PD 中,则需先完成 TiDB Dashboard 的编译。 当然也可以跳过 TiDB Dashboard 的编译,在 PD 编译过程中会自动下载打包好的 Dashboard。 甚至,可以在 PD 编译过程中,使用参数 without_dashboard 来跳过 Dashboard。

PD 编译过程其实蛮顺畅。

git clone https://github.com/shawn0915/pd --depth=1
cd pd
make

稍等一会就可以看到二进制文件了。

[shawnyan@centos7 bin]$ ls
pd-ctl  pd-recover  pd-server
[shawnyan@centos7 bin]$ ./pd-server --version
Release Version: fe52361
Edition: Community
Git Commit Hash: fe52361cf48a7f5ed8c69bcd02db77e25162f207
Git Branch: master
UTC Build Time:  2023-07-31 05:49:54

编译示例 -- TiDB Dashboard

下载 TiDB Dashboard 源码,这里为了节省时间、空间,只克隆一份最新版本的源码:

git clone https://github.com/shawn0915/tidb-dashboard --depth=1

进入源码文件夹,并执行编译命令 make package ,然后进入漫长的等待。。。

[shawnyan@centos7 tidb-dashboard-master]$ make package
scripts/install_go_tools.sh
+ Install go tools
go install github.com/swaggo/swag/cmd/swag
go install github.com/vektra/mockery/v2
+ Clean up go mod
cd ui &&\
pnpm i
packages/tidb-dashboard-lib              |  WARN  The field "resolutions" was found in /home/shawnyan/tidb-dashboard-master/ui/packages/tidb-dashboard-lib/package.json. This will not take effect. You should configure "resoluti                                         ons" at the root of the workspace instead.
Scope: all 8 workspace projects
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated opn@6.0.0
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated chokidar@2.1.8
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated fsevents@1.2.13
packages/tidb-dashboard-lib              |  WARN  deprecated @babel/polyfill@7.12.1
packages/tidb-dashboard-lib              |  WARN  deprecated uuid@3.4.0
packages/tidb-dashboard-lib              |  WARN  deprecated querystring@0.2.0
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated core-js@1.2.7
packages/tidb-dashboard-lib              |  WARN  deprecated core-js@2.6.12
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated source-map-resolve@0.5.3
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated source-map-url@0.4.1
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated urix@0.1.0
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated resolve-url@0.2.1
packages/tidb-dashboard-for-op           |  WARN  deprecated source-map-resolve@0.6.0
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated sane@4.1.0
packages/tidb-dashboard-for-clinic-cloud |  WARN  deprecated w3c-hr-time@1.0.2
packages/tidb-dashboard-lib              |  WARN  deprecated uglify-es@3.3.9
Packages: +2384
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 2408, reused 2387, downloaded 0, added 0
Progress: resolved 2408, reused 2387, downloaded 0, added 0, done
node_modules/.pnpm/esbuild@0.14.49/node_modules/esbuild: Running postinstall script, done in 791ms
node_modules/.pnpm/cypress@8.5.0/node_modules/cypress: Running postinstall script, done in 1m 42.9s
node_modules/.pnpm/es5-ext@0.10.61/node_modules/es5-ext: Running postinstall script, done in 367ms
. prepare$ cd .. && husky install ui/.husky
│ fatal: not a git repository (or any of the parent directories): .git
└─ Done in 609msWARN  Issues with peer dependencies found
.
├─┬ @typescript-eslint/eslint-plugin 4.33.0
│ └── ✕ unmet peer eslint@"^5.0.0 || ^6.0.0 || ^7.0.0": found 8.20.0
└─┬ @typescript-eslint/parser 4.33.0└── ✕ unmet peer eslint@"^5.0.0 || ^6.0.0 || ^7.0.0": found 8.20.0packages/tidb-dashboard-for-clinic-cloud
├─┬ cypress-image-snapshot 4.0.1
│ └── ✕ unmet peer cypress@^4.5.0: found 8.5.0
└─┬ @g07cha/flexbox-react 5.0.0└─┬ styled-components 2.4.1└── ✕ unmet peer react@">= 0.14.0 < 17.0.0-0": found 17.0.2packages/tidb-dashboard-for-op
├─┬ cypress-image-snapshot 4.0.1
│ └── ✕ unmet peer cypress@^4.5.0: found 8.5.0
└─┬ @g07cha/flexbox-react 5.0.0└─┬ styled-components 2.4.1└── ✕ unmet peer react@">= 0.14.0 < 17.0.0-0": found 17.0.2packages/tidb-dashboard-lib
├─┬ @g07cha/flexbox-react 5.0.0
│ └─┬ styled-components 2.4.1
│   └── ✕ unmet peer react@">= 0.14.0 < 17.0.0-0": found 17.0.2
├─┬ react-konva 16.8.6
│ ├── ✕ unmet peer react@16.8.x: found 17.0.2
│ ├── ✕ unmet peer react-dom@16.8.x: found 17.0.2
│ └─┬ react-reconciler 0.20.4
│   └── ✕ unmet peer react@^16.0.0: found 17.0.2
├─┬ react-native 0.70.6
│ └── ✕ unmet peer react@18.1.0: found 17.0.2
└─┬ @react-three/fiber 8.9.1├── ✕ unmet peer react@>=18.0: found 17.0.2├── ✕ unmet peer react-dom@>=18.0: found 17.0.2├─┬ its-fine 1.0.6│ └── ✕ unmet peer react@>=18.0: found 17.0.2└─┬ react-reconciler 0.27.0└── ✕ unmet peer react@^18.0.0: found 17.0.2The integrity of 1189 files was checked. This might have caused installation to take longer.
Done in 6m 53.8s
cd ui &&\
pnpm build> tidb-dashboard-ui@1.0.0 build /home/shawnyan/tidb-dashboard-master/ui
> pnpm -r buildpackages/tidb-dashboard-lib              |  WARN  The field "resolutions" was found in /home/shawnyan/tidb-dashboard-master/ui/packages/tidb-dashboard-lib/package.json. This will not take effect. You should configure "resolutions" at the root of the workspace instead.
Scope: 7 of 8 workspace projects
packages/clinic-client build$ gulp build
[28 lines collapsed]
│ [main] INFO  o.o.codegen.TemplateManager - writing file /home/shawnyan/tidb-dashboard-master/ui/packages/clinic-client/src/client/api/.openapi-generator/FILES
│ ################################################################################
│ # Thanks for using OpenAPI Generator.                                          #
│ # Please consider donation to help us maintain this project 🙏                 ##
│ # https://opencollective.com/openapi_generator/donate                          #
│ ################################################################################
│ [17:37:00] Finished 'swagger:gen' after 45 min
│ [17:37:00] Starting 'tsc:build'...
│ [17:37:14] Finished 'tsc:build' after 14 s
│ [17:37:14] Finished 'build' after 45 min
└─ Done in 45m 36.6s
...

Finally, TiDB Dashboard 编译完成。这里演示的是直接将 TiDB Dashboard 直接编译为二进制文件,所以编译完成后,可以在 bin 目录下看到 tidb-dashboard 二进制包。

[shawnyan@centos7 bin]$ ./tidb-dashboard --help
Usage of ./tidb-dashboard:--cluster-allowed-names string   comma-delimited list of acceptable peer certificate SAN identities--cluster-ca string              (TLS between components of the TiDB cluster) path of file that contains list of trusted SSL CAs--cluster-cert string            (TLS between components of the TiDB cluster) path of file that contains X509 certificate in PEM format--cluster-key string             (TLS between components of the TiDB cluster) path of file that contains X509 key in PEM format--data-dir string                path to the Dashboard Server data directory (default "/tmp/dashboard-data")-d, --debug                          enable debug logs--experimental                   allow experimental features--feature-version string         target TiDB version for standalone mode (default "N/A")-h, --host string                    listen host of the Dashboard Server (default "127.0.0.1")--path-prefix string             public URL path prefix for reverse proxies (default "/dashboard")--pd string                      PD endpoint address that Dashboard Server connects to (default "http://127.0.0.1:2379")-p, --port int                       listen port of the Dashboard Server (default 12333)--telemetry                      allow telemetry--temp-dir string                path to the Dashboard Server temporary directory, used to store the searched logs--tidb-allowed-names string      comma-delimited list of acceptable peer certificate SAN identities--tidb-ca string                 (TLS for MySQL client) path of file that contains list of trusted SSL CAs--tidb-cert string               (TLS for MySQL client) path of file that contains X509 certificate in PEM format--tidb-key string                (TLS for MySQL client) path of file that contains X509 key in PEM format-v, --version                        print version information and exit
pflag: help requested

此时,可以单独启动面板,只需将其注册到 PD。

./bin/tidb-dashboard --pd x.x.x.x

新启动的面板默认端口为 12333 ,可以通过 URL http://127.0.0.1:12333/dashboard/ 来访问刚刚编译好的面板。

验证测试

为了验证编译效果,本例中对 TiDB Dashboard 做了小小改动,版本号增加了 -ShawnYan 后缀,在【概况】、【监控指标】页面有文档链接,实际产品中指向了 stable 版本,这里修改为 v7.2

no-alt

修改的代码位置为: https://github.com/pingcap/tidb-dashboard/blob/master/ui/packages/tidb-dashboard-for-op/src/apps/Overview/context.ts#L60 https://github.com/pingcap/tidb-dashboard/blob/master/ui/packages/tidb-dashboard-for-op/src/apps/Monitoring/context.ts#L36

修改完成后,再次打包。待打包完成后启动 TiDB Dashboard。可以看到如下效果:

no-alt

总结

在 CentOS 7 下就可以进行编译,并不需要高版本的 gcc,体验就很棒,但是还是对机器的性能是有要求的,“老破小”机器上编译就很痛苦。 在写本文过程中,发现 TiDB Dashboard 和 PD 的版本未对齐,于是在 AskTUG 上开了一个帖子 ( 1010558 ),从帖子提出到问题有人对应,产研在源码仓库提出 Issue #1566 仅过去了不到一小时,对应速度可谓飞快。 Surprise! 另发现一处文档选择 dev 版本的小问题,也提了帖子记录一下。( 1010580 ) anyway, TiDB 组件很多,而编译工作是定制化二次开发的一个必要条件,要想一个一个编译过来还需要花点时间和精力。

相关文章:

TiDB 源码编译之 PD/TiDB Dashboard 篇

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/a16b1d46 TiDB TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融…...

Vue3描述列表(Descriptions)

&#x1f601; 整体功能效果与 ant design vue 保持高度一致 &#x1f601; 包含两种组件&#xff1a;Descriptions 和 DescriptionsItem&#xff08;必须搭配使用&#xff01;&#xff09; 效果如下图&#xff1a;在线预览 APIs Descriptions 参数说明类型默认值必传title…...

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…...

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…...

uniapp引入inconfont自定义导航栏

app,h5端引入 uniapp本身的全局设置中有个iconfontsrc属性 所以只需要 1.iconfont将需要的icon添加至项目 2.下载到本地解压后,将其中的ttf文件,放在static静态目录下 3.在page.json中对全局文件进行配置tabBar(导航图标) “iconfontSrc”: “static/font/iconfont.ttf”, …...

OSLog与NSLog对比

NSLog: NSLog的文档&#xff0c;第一句话就说&#xff1a;Logs an error message to the Apple System Log facility.&#xff0c;所以首先&#xff0c;NSLog就不是设计作为普通的debug log的&#xff0c;而是error log&#xff1b;其次&#xff0c;NSLog也并非是printf的简单…...

全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在测试的过程中&a…...

Mysql自动同步的详细设置步骤

以下步骤是真实的测试过程&#xff0c;将其记录下来&#xff0c;与大家共同学习。 一、环境说明&#xff1a; 1、主数据库&#xff1a; &#xff08;1&#xff09;操作系统&#xff1a;安装在虚拟机中的CentOS Linux release 7.4.1708 (Core) [rootlocalhost ~]# cat /etc/redh…...

opencv-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算&#xff0c;它有助于关闭前景物体内部的小孔&#xff0c;或去除物体上的小黑点&#xff0c;还可以将不同的前景图像进行连接。 例如&#xff0c;在图 8-17 中&#xff0c;通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔&#xff08;内部闭合的…...

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…...

刷题笔记 day8

1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1&#xff0c;求出最大元素全是1的子数组长度&#xff0c;看这道题第一感觉还要将里面的0变成1&#xff0c;感觉这道题解决起来很麻烦&#xff0c;但是我们可以转变思路&#xff0c;找出其最大子数组&#xff0c;使得子…...

C 语言的表达式

表达式 expression 表达式由运算符和运算对象组成。 最简单的表达式是一个单独的运算对象&#xff0c;以此为基础可以建立复杂的表达式。 一些表达式由子表达式&#xff08;subexpression&#xff09;组成。子表达式即较小的表达式。 这些都是一些表达式&#xff1a; -4 a…...

C++设计模式创建型之单例模式

一、概述 单例模式也称单态模式&#xff0c;是一种创建型模式&#xff0c;用于创建只能产生一个对象实例的类。例如&#xff0c;项目中只存在一个声音管理系统、一个配置系统、一个文件管理系统、一个日志系统等&#xff0c;甚至如果吧整个Windows操作系统看成一个项目&#xf…...

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…...

MyBatis@Param注解的用法

一、前言 本人在学习mybatis的过程中遇到的一个让人不爽的bug&#xff0c;在查找了些相关的资料后得以解决&#xff0c;遂记录。 二、报错及解决 mapper中有一方法&#xff1a; Select("select * from emp " "where name like concat(%, #{name}, %) "…...

Shader 编程:GLSL 重要的内置函数

该原创文章首发于微信公众号&#xff1a;字节流动 未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 前面发了一些关于 Shader 编程的文章&#xff0c;有读者反馈太碎片化了&#xff0c;希望这里能整理出来一个系列&#xff0c;方便系统的…...

浏览器同源策略

浏览器同源策略 同源策略&#xff1a;是一个重要的浏览器的安全策略&#xff0c;用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介 例如&#xff1a;被钓鱼网站收集信息&#xff0c;使用ajax发起…...

GD32F103的EXTI中断和EXTI事件

GD32F103的EXTI可以产生中断&#xff0c;也产生事件信号。 GD32F03的EXTI触发源: 1、I/O管脚的16根线&#xff1b; 2、内部模块的4根线(包括LVD、RTC闹钟、USB唤醒、以太网唤醒)。 通过配置GPIO模块的AFIO_EXTISSx寄存器&#xff0c;所有的GPIO管脚都可以被选作EXTI的触发源…...

了解 spring MVC + 使用spring MVC - springboot

前言 本篇介绍什么是spring MVC &#xff0c;如何使用spring MVC&#xff0c;了解如何连接客户端与后端&#xff0c;如何从前端获取各种参数&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 什么…...

C#中的Invoke

在 C# 中&#xff0c;Invoke() 是一个用于调用方法的方法&#xff0c;它能够在运行时动态地调用一个方法。 Invoke() 方法的使用方式有两种&#xff1a; 通过 MethodInfo 对象调用&#xff1a; using System.Reflection;namespace ConsoleApp_Invoke {public class Program{…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地

NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配&#xff0c;成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景&#xff0c;通过标准化 SQL 工作台与细粒度权限管控两大能力&#xff0c;助力企业安全高效…...