异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现-苏东坡版本)
昔者,有客临门,亟需自石墨文库中撷取卷帙若干。此等文册,非止一卷,乃累牍连篇,亟需批量转置。然吾辈虑及用户体验,当效东坡"腹有诗书气自华"之雅意,使操作如行云流水,遂定以条分缕析之法,列其要目于屏间,令观者一目了然,恰似"大江东去,浪淘尽"之畅达,去繁就简,存精去芜,使界面如清风明月,操作若庖丁解牛。具体之法,容后详叙…
上传流程介绍
石墨云台藏机杼,以链为引可通幽。昔者匠人剖玉,今人截链取牍,得十六位秘钥,若敦煌经卷之编号,暗藏玄机。其法非独单卷,亦通全册,或拓一室之藏,但添协作者于卷轴、函匣、书阁之间,如邀苏子瞻共游赤壁,许其同览文海。然需筑私邸于云中(私有化部署),方得启下载之门径,此间玄妙,非市井可窥。
进度条之艺,恰似东坡观潮:初见细浪如银线,渐涌为雪堆千叠,终成惊涛拍岸之势。其理有三:一曰分黍定寸(任务切分),二曰燃香计时(进度追踪),三曰墨染绢帛(界面渲染)。每完成一卷,则添一笔于素笺,恰似东坡夜游承天寺,见"庭下如积水空明",步步生辉。其间奥义,非止术数,更含天地运行之理,今且述其梗概,余者待诸君细参。
服务流程示意图
文枢流转之法,恰似东坡治水之道。用户执链如持竹简,录于云台(系统界面),此乃"大江初发昆仑源"之始。后端服务承此简牍,以密钥为符,协作者为印,启石墨秘库之门,如子瞻开赤壁石壁,得见卷帙浩繁。
所得文牍既至,当效东坡"腹中贮书一万卷"之法,分存于Redis玉匣。业务层为匠人,执进度之笔,于玉匣刻痕记数,初若"轻舟已过万重山"之速,渐成"千帆竞发争上游"之势,终显"百川东到海"之成。其间刻痕深浅,皆映下载之进度,恰似东坡观潮,见"素练横江,雪浪排空"之景。
Talk is easy show me the code
redis存储类实体类
public class RedisTaskProcess {@Schema(description = "消息id")private String taskId;@Schema(description = "业务类型,定义自己的任务类型xxxxx")private String businessType;@Schema(description = "处理进度的百分比")private BigDecimal processPercent;@Schema(description = "任务状态, processing|completed|error|cancel")private String status = "processing";@Schema(description = "消息描述, 异常时或者特殊场景会指定消息")private String msg;@Schema(description = "用户编码,用于获取任务Key")private String userCode;@Schema(description = "任务标题(文件名)")private String title;@Schema(description = "创建时间")private Long createTime;/*** 启动一个长任务处理流程,并返回任务处理响应对象。* * @param businessType 业务类型,用于标识任务的业务场景。* @param userCode 用户代码,标识发起任务的用户。* @param title 任务标题,用于描述任务内容。* @param redisTemplate Redis模板对象,用于将任务信息存储到Redis中。* @return LongTaskProcessResponse 返回长任务处理响应对象,包含任务ID、状态、进度等信息。*/
public static RedisTaskProcess commonStart(String businessType, String userCode, String title, RedisTemplate<String, Object> redisTemplate) {// 初始化长任务处理响应对象RedisTaskProcess res = new RedisTaskProcess();// 设置任务ID、业务类型、状态、消息、标题、进度、用户代码和创建时间res.setTaskId(IdUtil.getSnowflakeNextIdStr());res.setBusinessType(businessType);res.setStatus("processing");res.setMsg("开始处理");res.setTitle(title);res.setProcessPercent(new BigDecimal(1));res.setUserCode(userCode);res.setCreateTime(System.currentTimeMillis());// 将任务信息存储到Redis中,并设置过期时间为1天redisTemplate.opsForValue().set(res.findTaskCacheKey(), res, 1, TimeUnit.DAYS);return res;
}/*** 完成任务的通用方法,用于设置任务状态为“已完成”,并更新相关信息到Redis缓存中。** @param completeMsg 任务完成时的消息内容,用于设置任务的msg字段。* @param redisTemplate Redis操作模板,用于将任务信息存储到Redis缓存中。*/
public void commonComplete(String completeMsg, RedisTemplate<String, Object> redisTemplate) {// 设置任务状态为“已完成”this.setStatus("completed");// 设置任务完成消息this.setMsg(completeMsg);// 设置任务进度为100%this.setProcessPercent(new BigDecimal(100));// 设置任务创建时间为当前时间this.setCreateTime(System.currentTimeMillis());// 将任务信息存储到Redis缓存中,并设置过期时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 执行通用的更新操作,并调用重载的 `commonUpdate` 方法。** @param status 当前状态信息,通常用于表示操作的状态。* @param msg 更新操作的消息或描述信息。* @param addPercent 需要增加的百分比值,通常用于表示进度或比例的增加。* @param redisTemplate Redis 操作模板,用于与 Redis 进行交互。*/
public void commonUpdate(String status, String msg, Integer addPercent, RedisTemplate<String, Object> redisTemplate) {this.commonUpdate(status, msg, addPercent, null, redisTemplate);
}/*** 更新任务状态信息,并将更新后的任务信息存储到Redis中。** @param status 任务状态,用于设置当前任务的状态。* @param msg 任务消息,用于设置当前任务的消息内容。* @param addPercent 增加的进度百分比,用于计算当前任务的进度。* @param title 任务标题,如果非空则更新任务的标题。* @param redisTemplate Redis模板对象,用于将任务信息存储到Redis中。*/
public void commonUpdate(String status, String msg, Integer addPercent, String title, RedisTemplate<String, Object> redisTemplate) {// 设置任务状态和消息this.setStatus(status);this.setMsg(msg);// 如果提供了任务标题,则更新标题if (title != null) {this.setTitle(title);}// 计算并更新任务进度,确保进度不超过99%BigDecimal calRes = this.getProcessPercent().add(new BigDecimal(addPercent));this.setProcessPercent(calRes.min(new BigDecimal(99)));// 设置任务的创建时间this.setCreateTime(System.currentTimeMillis());// 将更新后的任务信息存储到Redis中,并设置过期时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 处理通用失败情况,并将失败信息存储到Redis中。** 该方法将当前对象的状态设置为"error",并设置失败信息。同时,记录当前时间作为创建时间,* 并将整个对象存储到Redis中,缓存时间为1天。** @param failMsg 失败信息,用于描述失败的原因或详情。* @param redisTemplate Redis操作模板,用于与Redis进行交互。*/
public void commonFailure(String failMsg, RedisTemplate<String, Object> redisTemplate) {// 设置状态为"error",表示任务失败this.setStatus("error");// 设置失败信息this.setMsg(failMsg);// 记录当前时间作为创建时间this.setCreateTime(System.currentTimeMillis());// 将当前对象存储到Redis中,缓存时间为1天redisTemplate.opsForValue().set(this.findTaskCacheKey(), this, 1, TimeUnit.DAYS);
}/*** 生成任务缓存的唯一键。** 该函数通过将任务处理前缀、用户代码和任务ID拼接成一个字符串,生成一个唯一的缓存键。* 该键通常用于在缓存系统中标识和存储与特定任务相关的数据。** @return 返回一个格式化的字符串,表示任务缓存的唯一键。格式为:"任务处理前缀:用户代码:任务ID"。*/
public String findTaskCacheKey() {return String.format("%s:%s:%s", TASK_PROCESS_PREFIX_KEY, this.userCode, this.taskId);
}}
上传服务伪代码
public void updatexxxx{try{// 业务测文件集合List fileIdList = new ArrayList();// 业务代码填充xxxxxxx// 初始化进度响应对象RedisTaskProcess redisTaskProcess = RedisTaskProcess.commonStart("业务代码","业务代码","业务代码");// 计算文件进度int documentationProgress = 99 / fileIdList.size();// 指定上传逻辑伪代码fileIdList.forEach(fileId -> {// 业务代码逻辑xxxxxx// 更新文件进度redisTaskProcess..commonUpdate("processing", "正在处理文件: " + save.getFileName(), progressIncrement, redisTemplate);})// 完成长传逻辑commonComplete("文档下载完成", redisTemplate);} catch {log.error("文档下载处理失败", e);redisTaskProcess.commonFailure("文档下载处理失败: " + e.getMessage(), redisTemplate);throw new RuntimeException(e);}}
昔者东坡治水,知"急流须用缓沙堤"之理。今以Redis玉匣存进度,虽得"轻舟已过万重山"之速,然遇千帆竞渡之时,犹恐"惊涛拍岸卷千堆雪"。盖因弦歌未绝,已有新篙入水,玉匣刻痕易为后浪所湮,此乃"前度刘郎今又来"之困也。
欲解此困,当效东坡"庐山烟雨浙江潮"之禅机:或借WATCH法眼观潮,察毫厘之变;或运Lua神笔,绘原子之章。其间妙理,非止于术,更在"不识庐山真面目"之破局——使进度刻痕如西子湖心月,任尔千帆过尽,自有清辉长明。然此中三昧,且待下回分说,恰似"欲把西湖比西子"之未尽余韵…
相关文章:

异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现-苏东坡版本)
昔者,有客临门,亟需自石墨文库中撷取卷帙若干。此等文册,非止一卷,乃累牍连篇,亟需批量转置。然吾辈虑及用户体验,当效东坡"腹有诗书气自华"之雅意,使操作如行云流水,遂定…...

处理知识库文件_编写powershell脚本文件_批量转换其他格式文件到pdf文件---人工智能工作笔记0249
最近在做部门知识库,选用的dify,作为rag的工具,但是经过多个对比,最后发现, 比较好用的是,纳米搜索,但是可惜纳米搜索无法在内网使用,无法把知识库放到本地,导致 有信息…...

rtpmixsound:实现音频混音攻击!全参数详细教程!Kali Linux教程!
简介 一种将预先录制的音频与指定目标音频流中的音频(即 RTP)实时混合的工具。 一款用于将预先录制的音频与指定目标音频流中的音频(即 RTP)实时混合的工具。该工具创建于 2006 年 8 月至 9 月之间。该工具名为 rtpmixsound。它…...
【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
目录 如何使用? 1. 示例代码(基于Netty) 2. 关键参数解释 3. 协议格式示例 4. 常见配置场景 场景1:长度字段包含自身 场景2:长度字段在消息中间 5. 注意事项 举个例子 完整示例:客户端与服务端交互…...
stm与51单片机哪个更适合新手学
一句话总结 51单片机:像学骑自行车,简单便宜,但只能在小路上骑。 STM32:像学开汽车,复杂但功能强,能上高速公路,还能拉货载人(做复杂项目)。 1. 为啥有人说“先学51单片…...

【计算机网络】第3章:传输层—面向连接的传输:TCP
目录 一、PPT 二、总结 TCP(传输控制协议)详解 1. 概述 核心特性: 2. TCP报文段结构 关键字段说明: 3. TCP连接管理 3.1 三次握手(建立连接) 3.2 四次挥手(终止连接) 4. 可…...
从架构视角设计统一网络请求体系 —— 基于 uni-app 的前后端通信模型
在使用 uni-app 开发跨平台应用时,设计一套清晰、统一、可扩展的网络请求模块 是前期架构的关键环节。良好的请求模块不仅提高开发效率,更是保证后期维护、调试和业务扩展的基础。 一、网络请求设计目标 在uni-app中设计网络请求模块,应遵循…...

《信号与系统》--期末总结V1.0
《信号与系统》–期末总结V1.0 学习链接 入门:【拯救期末】期末必备!8小时速成信号与系统!【拯救期末】期末必备!8小时速成信号与系统!_哔哩哔哩_bilibili 精通:2022浙江大学信号与系统(含配…...
第32次CCF计算机软件能力认证-2-因子化简
因子化简 刷新 时间限制: 2.0 秒 空间限制: 512 MiB 下载题目目录(样例文件) 题目背景 质数(又称“素数”)是指在大于 11 的自然数中,除了 11 和它本身以外不再有其他因数的自然数。 题…...

mac笔记本如何快捷键截图后自动复制到粘贴板
前提:之前只会进行部分区域截图操作(commandshift4)操作,截图后发现未自动保存在剪贴板,还要进行一步手动复制到剪贴板的操作。 mac笔记本如何快捷键截图后自动复制到粘贴板 截取 Mac 屏幕的一部分并将其自动复制到剪…...

高考加油!UI界面生成器!
这个高考助力标语生成器具有以下特点: 视觉设计:采用了蓝色为主色调,搭配渐变背景和圆形装饰元素,营造出宁静而充满希望的氛围,非常适合高考主题。 标语生成:内置了超过 100 条精心挑选的高考加油标语&a…...

window ollama部署模型
注意去官网下载ollama,这个win和linux差别不大,win下载exe,linux用官网提供的curl命令 模型下载表:deepseek-r1 使用命令:Ollama API 交互 | 菜鸟教程 示例: 1.查看已加载模型: 2.文本生成接口 curl -X POST http://localhost:11434/v1/completions -H "Conte…...

用mediamtx搭建简易rtmp,rtsp视频服务器
简述: 平常测试的时候搭建rtmp服务器很麻烦,这个mediamtx服务器,只要下载就能运行,不用安装、编译、配置等,简单易用、ffmpeg推流、vlc拉流 基础环境: vmware17,centos10 64位,wi…...

ubuntu安装devkitPro
建议开个魔法 wget https://apt.devkitpro.org/install-devkitpro-pacman chmod x ./install-devkitpro-pacman sudo ./install-devkitpro-pacman(下面这句如果报错也没事) sudo ln -s /proc/self/mounts /etc/mtab往~.bashrc添加 export DEVKITPRO/o…...

Linux(10)——第二个小程序(自制shell)
目录 编辑 一、引言与动机 📝背景 📝主要内容概括 二、全局数据 三、环境变量的初始化 ✅ 代码实现 四、构造动态提示符 ✅ 打印提示符函数 ✅ 提示符生成函数 ✅获取用户名函数 ✅获取主机名函数 ✅获取当前目录名函数 五、命令的读取与…...
github actions入门指南
GitHub Actions 是 GitHub 提供的持续集成和持续交付(CI/CD)平台,允许开发者自动化软件工作流程(如构建、测试、部署)。以下是详细介绍: 一、核心概念 Workflow(工作流程) 持续集成的…...

代码随想录算法训练营 Day59 图论Ⅸ dijkstra优化版 bellman_ford
图论 题目 47. 参加科学大会(第六期模拟笔试) 改进版本的 dijkstra 算法(堆优化版本) 朴素版本的 dijkstra 算法解法的时间复杂度为 O ( n 2 ) O(n^2) O(n2) 时间复杂度与 n 有关系,与边无关系 类似于 prim 对应点多…...
HTML实战:响应式个人资料页面
我将创建一个现代化的响应式个人资料页面,展示HTML在实际应用中的强大功能。这个页面将包含多个实战元素:导航栏、个人简介、技能展示、作品集和联系表单。 设计思路 使用Flexbox和Grid布局实现响应式设计 添加CSS过渡效果增强交互体验 实现深色/浅色模式切换功能 创建悬停动…...
Mac电脑上本地安装 MySQL并配置开启自启完整流程
文章目录 一、mysql安装1.1 使用 Homebrew 安装(推荐)1.2 手动下载 MySQL 社区版1.3 常见问题1.4 图形化管理工具(可选) 二、Mac 上配置 MySQL 开机自动启动2.1 使用 launchd 系统服务(原生支持)2.2 通过 H…...
JavaSE:面向对象进阶之内部类(Inner Class)
JavaSE 面向对象进阶之内部类(Inner Class) 一、内部类的核心概念 内部类是定义在另一个类内部的类,它与外部类存在紧密的逻辑关联,主要作用: 封装细节:隐藏实现细节,对外提供简洁接口。访问…...

【HW系列】—安全设备介绍(开源蜜罐的安装以及使用指南)
文章目录 蜜罐1. 什么是蜜罐?2. 开源蜜罐搭建与使用3. HFish 开源蜜罐详解安装步骤使用指南关闭方法 总结 蜜罐 1. 什么是蜜罐? 蜜罐(Honeypot)是一种主动防御技术,通过模拟存在漏洞的系统或服务(如数据库…...

汽车总线分析总结(CAN、LIN、FlexRay、MOST、车载以太网)
目录 一、汽车总线技术概述 二、主流汽车总线技术对比分析 1. CAN总线(Controller Area Network) 2. LIN总线(Local Interconnect Network) 3. FlexRay总线 4. MOST总线(Media Oriented Systems Transport&#x…...

MyBatisPlus--条件构造器及自定义SQL详解
条件构造器 在前面学习快速入门的时候,练习的增删改查都是基于id去执行的,但是在实际开发业务中,增删改查的条件往往是比较复杂的,因此MyBatisPlus就提供了一个条件构造器来帮助构造复杂的条件。 MyBatisPlus支持各种复杂的wher…...

OVD开放词汇检测 Detic 训练COCO数据集实践
0、引言 纯视觉检测当前研究基本比较饱和,继续创新提升空间很小,除非在CNN和transformer上提出更强基础建模方式。和文本结合是当前的一大趋势,也是计算机视觉和自然语言处理结合的未来趋势,目前和文本结合的目标检测工作还是有很…...

docker、ctr、crictl命令简介与使用
概述 在使用k3s过程中,经常需要使用ctr和crictl两个命令,本文记录一下。 ctr 类似docker命令是docker-shim容器运行时的客户端工具,ctr是Containerd的客户端工具。一个简单的CLI接口,用作Containerd本身的一些调试用途…...
WEB安全--SQL注入--bypass技巧2
继之前文章的补充: WEB安全--SQL注入--bypass技巧_sql注入过滤空格-CSDN博客 Q1:发现sql注入的时间盲注时,如果时间盲注的函数都被过滤了,怎么办? 除了找其他函数替换、编码等方式,还有以下方式绕过&…...
【强化学习哲学 Day 1】Q-Learning - 在不确定中寻找确定
🎭 故事:那些选择的时刻 你还记得那些站在十字路口的时刻吗? 也许是刚进实验室,面对满墙的研究方向海报,不知道哪条路通向你想要的未来;也许是第一份工作的选择,大厂的螺丝钉还是小公司的多面…...

WEB3——什么是ABI
怎么获得ABI? 在编译完合约后,可以在左边下面点击复制ABI ABI(Application Binary Interface,应用二进制接口)是用来让前端或服务端 JavaScript 代码与智能合约进行交互的桥梁,它描述了合约的函数、事件和…...

嵌入式软件--stm32 DAY 8.5 基础复习总结
1.时钟树 在数据手册里面,有一张密密麻麻的图,正是时钟系统里的时钟树。 对于时钟,我们注意有两点。一个是系统时钟SYSCLK,一个是依赖外部晶振生成的RTC. RTC以外部低速晶振作为时钟源或者外部高速晶振128分频后作为时钟源,又或者…...

MMRL: Multi-Modal Representation Learning for Vision-Language Models(多模态表示学习)
摘要 预训练的VLMs,对于跨任务的迁移学习至关重要,然而,在few-shot数据集上微调会导致过拟合,降低在新任务上的性能。为解决这个问题,提出一种新的多模态表征学习框架(MMRL),该框架引入了一个共享、可学习…...