上传组件:
// ChunkUpload.jsx import React, { useCallback, forwardRef, useState, useImperativeHandle, useEffect, useRef } from 'react'; import { UploadDropZone } from '@rpldy/upload-drop-zone'; import {ChunkedUploady,useUploady,useChunkStartListener,useChunkFinishListener,useRequestPreSend,useAbortItem,useItemAbortListener,useAbortAll,useAbortBatch,useBatchAbortListener,useBatchAddListener,useAllAbortListener,useBatchStartListener,useBatchFinishListener, } from '@rpldy/chunked-uploady'; import retryEnhancer, { useRetry } from "@rpldy/retry-hooks"; import { useItemProgressListener, useItemFinalizeListener } from '@rpldy/uploady'; import { Button } from "antd"; import { asUploadButton } from "@rpldy/upload-button";const ChunkUpload = forwardRef((props, ref) => {const [activeBatches, setActiveBatches] = useState([]);const [abortResult, setAbortResult] = useState();const abortItemBtnRef = useRef(); const flattenBatchItems = (batch) => {if (!batch || !batch.items) return [];const parentData = { ...batch };delete parentData.items;return batch.items.map(item => {const newItem = { ...item };Object.keys(parentData).forEach(key => {newItem[`parent_${key}`] = parentData[key];});newItem[`file_name`] = item.file?.name || item.fileName || '';newItem[`file_id`] = '';return newItem;});};// ---- listeners (most are kept as your original components) ----const ChunkUploadStartListenerComponent = () => {useChunkStartListener(async (data) => { /* nothing special here */ });return null;};const ChunkUploadFinishListenerComponent = () => {useChunkFinishListener(({ item, chunk, uploadData }) => { });return null;};// 当 batch 被添加时触发(立即通知父组件)const ChunkUploadAddListener = ({ onBatchStart }) => {useBatchAddListener((batch) => {onBatchStart(batch);});return null;};const ChunkedUploadAbortAllListener = () => {useAllAbortListener(() => {// console.log("调用了abortAll,全部停止上传"); });return null;};const BatchUploadStartListener = () => {useBatchStartListener((batch) => { });return null;};const BatchFinishListener = ({ onBatchFinish }) => {useBatchFinishListener((batch) => {onBatchFinish(batch);});return null;};const BatchAbortListener = ({ onBatchAbort }) => {useBatchAbortListener((batch) => {onBatchAbort(batch);});return null;};const UploadAbortItemListener = ({ onAbortItem }) => {useItemAbortListener((item) => {onAbortItem(item);});return null;};// 给可拖拽项添加点击上传const MyClickableDropZone = forwardRef((props, ref) => {const { onClick, ...buttonProps } = props;const onZoneClick = useCallback(e => { if (onClick) onClick(e); }, [onClick]);return (<UploadDropZone{...buttonProps}ref={ref}onDragOverClassName="drag-active"extraProps={{ onClick: onZoneClick }}groupedmaxGroupSize={10}/> );});const DropZoneButton = asUploadButton(MyClickableDropZone);// 停止单个上传按钮(隐藏测试用)const UploadAbortItemButton = forwardRef((props, ref) => {const abort = useAbortItem();useImperativeHandle(ref, () => ({ abort: (id) => abort(id) }));return (<Button className="w-16 h-6 border rounded-sm p-6" style={{ display: "none" }}>取消上传</Button> );});const handleAbortItem = (item) => {setAbortResult(item);};const handleBatchAbort = (batch) => {let abortBatchResult = batch.items.map(item => item.id);setAbortResult(abortBatchResult);setActiveBatches(prevActiveBatches => prevActiveBatches.filter((it) => it.id !== batch.id));};const onBatchFinish = (batch) => {setActiveBatches(prevActiveBatches => prevActiveBatches.filter((it) => it.id !== batch.id));};// InnerUploader — 暴露控制接口给父组件(并支持 setRequestPreSend)const InnerUploader = forwardRef(({ activeBatches, preSendDataRef }, ref) => {const uploader = useUploady();const abortAll = useAbortAll();const abortBatch = useAbortBatch();const abortItem = useAbortItem();const preSendRef = useRef(null);const retryItem = useRetry();useRequestPreSend(({ options, items }) => {const itemId = items?.[0]?.id;const match = preSendDataRef.current[itemId] || {};return {options: {...options,params: {...options.params,video_id: match.file_id,name: match.file_name,},},};});useImperativeHandle(ref, () => ({setRequestPreSend: (cb) => { preSendRef.current = cb; },startUpload: () => uploader.processPending(),stopAll: () => abortAll(),stopBatch: (batchId) => abortBatch(batchId),stopItem: (itemId) => abortItem(itemId),retryItem: (itemId) => retryItem(itemId),getBatches: () => activeBatches,}), [activeBatches, uploader, abortBatch, abortItem]);return null;});// 文件上传进度监听const ItemProgressListener = ({ onItemProgress }) => {useItemProgressListener((item) => {onItemProgress?.(item);});return null;};// 文件上传完成监听const ItemFinalizeListener = ({ onItemFinalize }) => {useItemFinalizeListener((item) => {onItemFinalize?.(item);});return null;};// 当 batch 添加 -> 保存 activeBatches 并立即通知父组件(持久化由父组件完成)const handleBatchStart = (batch) => {setActiveBatches(prev => [...prev, batch]);// 立刻扁平化并发回父组件,父组件负责去重/持久化const flat = flattenBatchItems(batch);props.onBatchAdd?.(flat); // <-- 父组件接收并持久化 };useEffect(() => {props.onBatchesChange?.(activeBatches);}, [activeBatches]);return (<ChunkedUploadyautoUpload={false}accept='video/*'chunked={false} // 是否开启分片上传destination={{url: '/api/uploads',headers: { 'Authorization': localStorage.getItem('token') }}}sendWithFormData={true}concurrentmaxConcurrent={5}parallel={1}retries={5}enhancer={retryEnhancer}{...props}multiple><ChunkedUploadAbortAllListener /><ChunkUploadAddListener onBatchStart={handleBatchStart} /><ChunkUploadStartListenerComponent /><ChunkUploadFinishListenerComponent /><BatchUploadStartListener /><BatchAbortListener onBatchAbort={handleBatchAbort} /><UploadAbortItemListener onAbortItem={handleAbortItem} /><BatchFinishListener onBatchFinish={onBatchFinish} /><UploadAbortItemButton ref={abortItemBtnRef} />{/* 本地 Item 进度/完成监听,透传给父组件 */}<ItemProgressListener onItemProgress={props.onItemProgress} /><ItemFinalizeListener onItemFinalize={props.onItemFinalize} /><InnerUploader ref={ref} activeBatches={activeBatches} preSendDataRef={props.preSendDataRef} /><DropZoneButton><div className='w-full h-auto flex flex-col justify-center items-center p-4 rounded-md border border-inherit cursor-pointer select-none' ><div className='text-lg' style={{ marginBottom: '1rem' }}>单击或拖动文件到此区域进行上传</div><div className='text-sm text-gray-500'>支持单个文件上传</div></div></DropZoneButton></ChunkedUploady> ); });export default ChunkUpload;
页面组件 --> antdProComponents
// index.jsx import { useRef, useState } from 'react'; import { EditableProTable, ModalForm } from '@ant-design/pro-components'; import { Button, Form, message, Popconfirm } from "antd"; import {SelectOutlined,UploadOutlined,LoadingOutlined,ClockCircleOutlined,CheckCircleOutlined,CloseCircleOutlined, } from "@ant-design/icons"; import ChunkUpload from "../components/ChunkUpload";const VideoMaterial = () => {const [editableKeys, setEditableRowKeys] = useState([]);const [chooseFile, setChooseFile] = useState(false);const materialRef = useRef();const uploadRef = useRef();const preSendDataRef = useRef({});const [batchesMap, setBatchesMap] = useState([]);const [form] = Form.useForm();// 父端接收 ChunkUpload 的批次添加事件const handleBatchAdd = (flatItems) => {setBatchesMap(prev => {const map = new Map(prev.map(i => [i.id, i]));flatItems.forEach(item => {if (map.has(item.id)) {map.set(item.id, { ...(map.get(item.id)), ...item });} else {map.set(item.id, { ...item });}});return Array.from(map.values());});// 打开编辑态让用户填写setEditableRowKeys(prev => [...prev, ...flatItems.map(it => it.id)]);};// 上传进度回调const handleItemProgress = (item) => {// item: { id, loaded, total, completed? }setBatchesMap(prev => prev.map(row => {if (row.id === item.id) {const completed = item.completed ?? Math.round((item.loaded / Math.max(item.total || 1, 1)) * 100);return { ...row, completed, state: 'uploading' };}return row;}));};// 上传状态回调 (TODO 有BUG待完善)const handleItemFinalize = (item) => {setBatchesMap(prev => prev.map(row => {if (row.id === item.id) {// 如果 finalize 时 completed === 100 认为成功const completed = item.completed ?? row.completed;const newState = item.state ?? (completed === 100 && 'finished');return { ...row, completed, state: newState };}return row;}));};// 保存编辑回调(当用户手动点击保存)const submitForm = async (row) => {// row 已包含 file_id / file_name 等字段setBatchesMap(prev => prev.map(item => item.id === row.id ? { ...item, ...row } : item));return true;};// 当点击开始上传const handleStartUpload = async () => {var resultMap;try {// 1) validateFields 以确保表单校验通过并获取最新字段const validateValues = await form.validateFields();// validateValues值的结构为 { id: { file_id, file_name } }const resultArr = Object.entries(validateValues).map(([id, obj]) => ({ id, ...obj }));// 确认是否经过第1步的校验获取到数据if (resultArr.length) {resultMap = Object.fromEntries(resultArr.map(r => [r.id, r]));} else {resultMap = Object.fromEntries(batchesMap.map(r => [r.id, r]));}// 2) 合并到 batchesMapsetBatchesMap(prev => prev.map(item => ({ ...item, ...(resultMap[item.id] || {}) })));// 3) 保存所有编辑行for (const key of editableKeys) {if (materialRef.current?.saveEditable) {await materialRef.current.saveEditable(key);}}// 4) 设置 requestPreSend(每个 item 上传时根据 item.id 找对应的参数)preSendDataRef.current = resultMap;// 5) 退出编辑态并开始上传 setEditableRowKeys([]);uploadRef.current.startUpload();// message.success('开始上传');} catch (error) {// console.error(error);message.error('请先填写并保存所有必填字段');}};// 删除/取消上传const abortUpload = (id) => {uploadRef.current.stopItem(id);setBatchesMap(prev => prev.map(it => it.id === id ? { ...it, state: 'error' } : it));};// 重试上传const retryUpload = async (id) => {setBatchesMap(prev => prev.map(it => it.id === id ? { ...it, state: 'reloading' } : it));uploadRef.current && uploadRef.current.retryItem(id);};// 清除并停止所有上传const clearAll = () => {if (uploadRef.current) {uploadRef.current.stopAll()setBatchesMap([]);setEditableRowKeys([]);}};const confirm = (id) => {abortUpload(id)setBatchesMap(prev => prev.filter(item => item.id !== id))};const cancel = () => { };// 表格列(你现有的列,略微调整 renderText)const columns = [{title: '序列ID',dataIndex: 'id',width: 150,align: 'center',editable: false,},{title: '视频ID',dataIndex: 'file_id',width: 100,align: 'center',editable: true,trigger: ['onBlur'],formItemProps: { rules: [{ required: true, message: '请填写视频ID' }] },},{title: '视频名称',dataIndex: 'file_name',editable: true,width: 230,trigger: ['onBlur'],formItemProps: { rules: [{ required: true, message: '请填写视频名称' }] },},{title: '状态',dataIndex: 'state',editable: false,width: 130,render: (text, rowData) => {switch (rowData.state) {case 'pending':return <><ClockCircleOutlined style={{ color: '#faad14' }} /> 等待上传</>;case 'uploading':return <><LoadingOutlined style={{ color: '#1890ff' }} spin /> 上传中</>;case 'reloading':return <><LoadingOutlined style={{ color: '#faad14' }} /> 重新上传中</>case 'aborted':return <><CloseCircleOutlined style={{ color: '#faad14' }} /> 已取消</>;case 'finished':return <><CheckCircleOutlined style={{ color: '#52c41a' }} /> 上传成功</>;case 'error':return <><CloseCircleOutlined style={{ color: '#ff4d4f' }} /> 上传失败</>;default: return rowData.state;}}},{title: '上传进度',dataIndex: 'completed',valueType: 'progress',editable: false,width: 150,renderText: (val) => Math.max(0, Math.min(100, Math.round(val || 0))),},// {// title: '原名称',// dataIndex: 'file',// editable: false,// render: (colData) => colData?.name || '',// }, {title: '操作',dataIndex: 'option',valueType: 'option',width: 180,render: (text, record, _, action) => {const UPLOAD_RETRY = record.state !== 'pending' && record.state !== 'finished' && record.state !== 'uploading';// 等待上传、上传成功或者正在上传不可以重试const UPLOAD_ABORT = record.state === 'uploading';// 上传中可以取消return [<a key="editable" onClick={() => action?.startEditable?.(record.id)}>编辑</a>,UPLOAD_RETRY && (<a key="retry" onClick={async () => { retryUpload(record.id); await action?.saveEditable?.(record.id); }}>重试</a>),UPLOAD_ABORT && (<a key="abort" onClick={() => { abortUpload(record.id); action?.saveEditable?.(record.id); }}>取消上传</a>),<Popconfirmkey="delete"title="确定删除吗?"onConfirm={() => confirm(record.id)}onCancel={cancel}okText="确定"cancelText="取消"><a>删除</a></Popconfirm> ,]}},];return (<><EditableProTablescroll={{ x: 800 }}columns={columns}actionRef={materialRef}headerTitle="视频素材列表"rowKey="id"search={false}value={batchesMap}onChange={(value) => setBatchesMap(value)}recordCreatorProps={false}revalidateOnFocus={false}pagination={{ pageSize: 10 }}toolBarRender={() => [// <Button// type="primary"// danger// key="danger"// onClick={() => clearAll()}// icon={<StopOutlined />}// >// 全部停止// </Button>,<Buttontype="primary"key="primary"disabled={batchesMap.length === 0}onClick={handleStartUpload}icon={<UploadOutlined />}>开始上传</Button>,<Buttontype='default'key="choose"onClick={() => setChooseFile(true)}icon={<SelectOutlined />}>选择素材</Button> ]}editable={{type: 'multiple',form,editableKeys,onSave: async (rowKey, data) => {await submitForm(data);// 返回 true 表示保存成功return true;},onDelete: (rowKey, data) => {abortUpload(data.id);},onChange: setEditableRowKeys,actionRender: (row, config, dom) => [dom.save, dom.delete]}}/><ModalFormtitle={'选择素材'}width={800}open={chooseFile}onOpenChange={setChooseFile}submitter={{render: (props, defaultDoms) => {return [<Buttonkey="confirm"type='primary'onClick={() => {setChooseFile(false);}}>确认</Button>, ];},}}><ChunkUploadref={uploadRef}destination={{ url: '/localApi/upload/simple' }}onBatchAdd={handleBatchAdd} // 新增批次时父端持久化onBatchesChange={() => { }} // 保持兼容(可选)onItemProgress={handleItemProgress} // 进度回调onItemFinalize={handleItemFinalize} // 完成回调preSendDataRef={preSendDataRef}/></ModalForm></> ); };export default VideoMaterial;
相关文章:
文件上传、分片上传结合antdProComponents表格展示,点击上传
文件上传、分片上传结合antdProComponents表格展示,点击上传上传组件:// ChunkUpload.jsx import React, { useCallback, forwardRef, useState, useImperativeHandle, useEffect, useRef } from react; import { UploadDropZone } from @rpldy/upload-drop-zone; import {Ch…...
2025 年 PLM 市场新锐崛起:五家厂商以创新技术引领行业变革新路径
在制造业数字化转型的汹涌浪潮中,产品生命周期管理(PLM)领域正历经着前所未有的深刻变革。往昔传统的软件模式逐渐式微,一批将技术创新奉为圭臬的新锐厂商强势登场。它们凭借独具差异化的解决方案,宛如矫健的黑马,在市场中迅速崭露头角,为制造企业精心打造出从研发设计的…...
2025 年国产 PLM 系统发展全景:厂商实力与核心功能深度解读
随着国产 PLM 技术的持续突破,本土厂商在功能适配性、行业针对性和服务响应速度上的优势愈发凸显,为不同规模、不同领域的制造企业提供了更贴合需求的解决方案。本文将聚焦 2025 年国产 PLM 系统主流厂商,全面解析厂商特色与系统核心功能模块,为企业选型提供参考。一、2025…...
开发效率翻倍!编码助手+云效 AI 评审如何破解代码质量与速度难题?
如今随着 AI 技术的突破,这一问题出现了全新解法:使用编码助手(包括不限于通义灵码、Qoder、Cursor、Claude Code 等工具,本文以通义灵码作为示例) + 云效 AI 评审,助力解决传统开发流程中的一些挑战。作者:致信 背景 随着软件开发复杂度的持续攀升和产品迭代周期的不断…...
SSL部署完成,https显示连接不安全如何处理?
在部署 SSL 后,如果浏览器仍然显示 “连接不安全” 或 “Not Secure”,通常是由以下几种原因导致的。针对每种可能的原因和问题,以下提供了详细的排查和解决方案。1. 排查问题的可能原因 1.1 SSL 证书未正确安装 如果 SSL 证书安装不完整或配置错误,浏览器会显示连接不安全…...
各省简称
各省简称目录一、华北地区二、东北地区三、华东地区四、华中地区五、华南地区六、西南地区七、西北地区八、特别行政区记忆小技巧: 一、华北地区省份全称 简称 由来简述北京市 京 直接取自全称中的字。历史上是京城的所在地。天津市 津 直接取自全称中的字。意为“天子的渡口”…...
完整教程:HDFS基准测试与数据治理
完整教程:HDFS基准测试与数据治理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...
var code = 76cb2b4f-5a26-4a70-a3bf-dc8f2ae5162f
var code = "76cb2b4f-5a26-4a70-a3bf-dc8f2ae5162f"...
解放双手!三端通用的鼠标连点神器
前言在日常工作和游戏中,我们经常遇到需要大量重复点击的情况——无论是抢购、快速通过游戏关卡,还是处理繁琐的数据录入工作。手动重复点击不仅枯燥乏味,还容易导致手腕疲劳。今天给大家分享一款轻巧易用的鼠标连点器工具,支持多种点击模式,彻底解放你的双手!为什么推荐…...
用 C# 与 Tesseract 实现验证码识别系统
一、项目概述 验证码识别在自动化测试、爬虫开发与用户辅助系统中具有重要价值。本文将介绍如何使用 C# 调用 Tesseract OCR 实现验证码图像识别功能,并对验证码图像进行简单预处理,以提高识别准确率。 二、开发环境准备安装 Tesseract 更多内容访问ttocr.com或联系143642394…...
【9月19日最终截稿,SPIE出版】2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)
2025年信息工程、智能信息技术与人工智能国际学术会议(IEITAI 2025)将于2025年9月26-28日在黑龙江哈尔滨盛大召开。旨在为全球学者、工程师及行业专家提供一个高水平交流平台,围绕信息工程、人工智能、大数据、物联网、5G/6G通信等前沿领域展开研讨,分享最新研究成果与技术…...
Dockerfile:如何用CMD同时启动两个进程
场景 在一个Dockerfile中,如何编写CMD指令,使得可以同时启动两个进程? 方案 这两个进程假设分别为Springboot Jar工程、sh脚本:app.jar script.sh需要明确一点:CMD指令本身只能直接执行一个命令 所以我们只能通过间接方式来做到启动多个进程:使用启动脚本start.sh,在其中…...
启动GA-Event Activated,结束GA-End Ability
在GA中 Event Activated是激活时的行为 在激活结尾时调用End Ability...
202003_MRCTF_千层套娃
ZIP套娃,QR二维码Tags:ZIP套娃,QRCODE 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202003_MRCTF_千层套娃.zip 0x01. WP 01. 打开压缩文件发现hint信息 发现是zip套娃,需要通过python脚本进行自动化解压H…...
基于MATLAB的粒子群算法优化广义回归神经网络的实现
基于MATLAB的粒子群算法(PSO)优化广义回归神经网络(GRNN)的实现一、算法原理与流程 graph TDA[数据准备] --> B[PSO参数初始化]B --> C[GRNN适应度计算]C --> D[粒子速度更新]D --> E[粒子位置更新]E --> F[全局最优解更新]F --> G[GRNN模型训练]G -->…...
MySql EXPLAIN 详解
1、EXPLAIN介绍 EXPLAIN语句提供MySQL如何执行语句的信息。EXPLAIN返回SELECT语句中使用的每个表的信息并列出一行运行数据。它是按照MySQL在处理语句时读取表的顺序列出并输出到一个表格中。2、查询示例 2.1、【explain + 表名】显示的是这个表的表结构。 2.2、【explain + s…...
Transformer完整实现及注释
主要组件:Multi-Head Self-Attention (多头自注意力) Position Encoding (位置编码) Feed Forward Network (前馈神经网络) Encoder/Decoder Layer (编码器/解码器层) Complete Transformer Model (完整模型) """import torch import torch.nn as nn import to…...
数据策略与模型算法
数据策略与模型算法数据工程师:更多关心「基建」的问题,比如,数据链路如何构建、如何做技术选型、效率稳定性如何保障等等。 算法工程师:更多关心「模型」的问题,比如,具体某个算法是什么原理,如何调参等等。 数据分析师:运用工具解决「端到端」的问题,包括「问题抽象…...
在使用代理的时候,可以使用更简单的C++语法代替FGameplayAttribute代理,使用TStaticFuncPtr T
DECLARE_DELEGATE_REVAL(FGameplayAttribute, FAttributeSignature); 比如这里的代理 定义为FAttributeSignature AttributeSignature ;但是可以不生命代理,直接声明 TBaseStaticDelegateInstance<FGameplayAttribute(), FDefaultDelegateUserPolicy>::FFuncPtr它代表…...
从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!
完整内容:从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!你是否曾在面对大量文章资料,却要在短时间内将其精华提炼并制作成演示文稿时,感到焦头烂额、无从下手?一页页翻阅文章,手动摘取要点,再逐一编排进 PPT,整个过程繁琐又耗时,效率低下不说,最终呈现…...
[WPF学习笔记]多语言切换-001
1、VS2019新建项目2、引入Nuget包 3、修改XML代码引入命名空间并设置<Window x:Class="WPFMultiLanguageTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/…...
Shell 语法摘要
sed 的使用 sed 的全称是 Stream Editor,即流编辑器。它可以逐行处理输入数据(先将读入的行放到缓冲区中,对缓冲区里的内容进行处理),并将处理结果输出到标准输出。 格式:sed [选项] [address]{脚本命令(块)} 文件名 前缀 address 可以是数字或者文本(正则),格式:[addr…...
软件设计师知识点总结(一)
一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概念, 只有一个根目录 /, 所有文件都在它下面 二、常见目录介绍(记住重点)目录作用/bin二进制命令所在的目录(普通命令 => 普通用户…...
智能引擎驱动:DRS.Editor让汽车诊断设计效率跃升!
在汽车电子诊断数据管理领域,用户普遍依赖传统的线下 Excel 管理模式,这种离线、文件化的方式常常导致数据分散、版本混乱、共享困难、复用率低,正成为制约开发效率与质量的瓶颈,并带来以下痛点:校验低效易错:诊断数据编写不规范,合法性、逻辑性及完整性校验效率低,易出…...
【译】Visual Studio 2026 Insider 来了!
Visual Studio 2026 Insider 现已发布 —— 这标志着我们在这款 IDE 上迈出了最具雄心的一步。此版本将人工智能直接融入开发者的工作流程,性能方面的改进重新树立了企业级规模下对速度的预期,而现代化的设计则让整个开发环境感觉更轻盈、更专注。并且,我们首次推出了全新的…...
CH584 CH585 触摸应用介绍一
1、提供的资料工程和功能介绍 | | | |-- TOUCH | | | | |-- TKYLIB:触摸库文件及其头文件 | | | | |-- Touch_EX001:触摸应用的综合演示,包括触摸滑条、触摸滑环、触摸按键和隔空感应四种触摸应用,配合EVB使用。 | | …...
OpenEuler 24.03 (LTS-SP2)安装最新版本docker
OpenEuler 24.03系统默认安装的docker版本是18.09,该版本有重大bug,所以鉴于此安装最新版本docker。 一、配置 Docker 仓库 首先,需要设置 Docker 的官方仓库,和替换为国内的镜像源。 1.安装必要的包:sudo dnf install -y dnf-utils2.设置稳定的仓库: docker官方没有明确…...
西门子SINAMICS S120伺服驱动系统介绍
SINAMICS S120是集V/F、矢量控制及伺服控制于一体的驱动控制系统,可以控制普通的三相异步电动机,还能控制同步电机、扭矩电机及直线电机,属于高性能驱动,是西门子SINAMICS M1级产品。S120产品特点“高度灵活”的模块化设计 允许不同功率等级与控制性能的单元自由组合,所有…...
第10章 STM32 模拟SPI电阻屏触摸配置和测试
前言 硬件的配置由前面的工程递增,会根据目的修改部分控制代码 由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成 源码地址https://gitcode.com/qq_36517072/stm32,第x章为cx文件夹一、STM32CUBE配置修改 带的2…...
ABAP同步和异步
在保存增强触发其他单据生成或者自建表保存需要COMMIT WORK 时候使用STARTING NEW TASK 优势是在新会话中提交:在这个新的、独立的上下文中执行 COMMIT WORK,只会提交该 RFC 函数内部自身的数据库操作,而不会影响到主增强程序所在的事务上下文。主程序的数据库更改仍会等待…...
202208_网鼎杯青龙组_CRYPTO
MD5,爆破Tags:MD5,爆破 0x00. 题目 小A鼓起勇气向女神索要电话号码,但女神一定要考考他。女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞,该漏洞可以向陌生人泄露AirDrop发起者或接收者的电话号码和电子邮箱。小A经…...
Oracle笔记:11GR2 datagruad 环境搭建BORKER
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle笔记:11GR2 datagruad 环境搭建BORKER 公司所有的DG环境都用到了…...
GAS_Aura-Gameplay Abilities
1简单说明了下GAS运行的情景...
领域驱动设计(DDD)【23】之泛化:从概念到实践
文章目录 一 泛化基础:理解DDD中的核心抽象机制1.1 什么是泛化?1.2 为什么泛化在DDD中重要?1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承:最直接的泛化实现2.2 接口实现:更灵活的泛化方…...
零基础langchain实战二:大模型输出格式化成json
零基础langchain实战一:模型、提示词和解析器-CSDN博客 书接上文 大模型输出格式化 在下面例子中:我们需要将大模型的输出格式化成json。 import os from dotenv import load_dotenvload_dotenv() # 加载 .env 文件 api_key os.getenv("DEEPS…...
Python 数据分析:numpy,抽提,整数数组索引
目录 1 代码示例2 欢迎纠错3 免费爬虫------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个…...
在项目中如何巧妙使用缓存
缓存 对于经常访问的数据,每次都从数据库(硬盘)中获取是比较慢,可以利用性能更高的存储来提高系统响应速度,俗称缓存 。合理使用缓存可以显著降低数据库的压力、提高系统性能。 那么,什么样的数据适合缓存…...
C语言字符串
字符串是C语言最核心的概念之一,却也是引发最多Bug的领域。掌握它,你将解锁高效处理文本的能力;忽视细节,则可能陷入内存陷阱。 一、字符串的本质:字符数组 核心规则:C语言用\0(ASCII值0&#…...
HarmonyOS NEXT仓颉开发语言实战案例:图片预览器
上文分享了如何使用仓颉语言实现动态广场,动态广场中有很多图片,本文一下如何使用仓颉语言实现一个图片放大预览器: 看到这个效果,我首先想到的实现方案是弹窗,弹窗的弹出和消失效果为我们节省了很多工作,这…...
Rust代码规范之蛇形命名法和驼峰命名法
Rust 使用两种主要的命名风格:驼峰命名法(UpperCamelCase)和蛇形命名法(snake_case)。通常,类型(如结构体、枚举、特征)使用驼峰命名法,而变量、函数、方法等使用蛇形命名…...
cocos creator 3.8 - 精品源码 - 六边形消消乐(六边形叠叠乐、六边形堆叠战士)
cocos creator 3.8 - 精品源码 - 六边形消消乐 游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验 游戏介绍 六边形堆叠战士(六边形消消消)是一款脱胎于2048、1010,基于俄罗斯方块的魔性方块达人小游戏,可以多方向多造型消除哦! 功能介…...
(七)Spring Web
Spring Web 是 Spring Framework 的一部分,专门用于构建 Web 应用程序。Spring Web 提供了一个强大的基础设施,用于开发 Web 服务、Web 应用程序和 RESTful API。它包括许多模块和组件,帮助开发人员轻松地构建、配置和管理 Web 应用程序。 以…...
计算机操作系统(十七)内存管理
计算机操作系统(十七)内存管理 前言一、内存的使用与程序重定位(一)内存是什么?(二)程序的重定位过程(三)总结:内存使用的核心问题 二、连续分区管理…...
Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)
Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327) 引言:正文:一、Java 驱动的高频交易数据处理架构1.1 边缘 - 中心协同数据接入系统(SEC 17a-4 合规)1.2 多市场…...
Idea 项目远程开发 Remote Development
个人建议:Remote Development 使用体验不佳,不推荐。实际远程开发受限于网络通信速度,在开发时,基本无法SSH更新项目内容。 1. File -> Remote Development 2. New Connection Connect to SSH Connection 3. Project director…...
【驱动设计的硬件基础】CPLD和FPGA
在数字电路设计领域,CPLD(复杂可编程逻辑器件)和 FPGA(现场可编程门阵列)堪称 “变形金刚” 般的存在。它们既能像 ASIC(专用集成电路)一样实现硬件加速,又能通过软件编程快速迭代功…...
JavaScript中Object()的解析与应用
在JavaScript中,Object() 是一个基础构造函数,用于创建对象或转换值为对象类型。它既是语言的核心组成部分,也提供了一系列静态方法用于对象操作。以下是详细解析和应用示例: 一、Object() 的基本行为 作为构造函数(…...
Spring Cloud 微服务(负载均衡策略深度解析)
📌 摘要 在微服务架构中,负载均衡是实现高可用、高性能服务调用的关键机制之一。Spring Cloud 提供了基于客户端的负载均衡组件 Ribbon,结合 Feign 和 OpenFeign,实现了服务间的智能路由与流量分配。 本文将深入讲解 Spring Clo…...