异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现-苏东坡版本)

article/2025/8/27 2:11:28

昔者,有客临门,亟需自石墨文库中撷取卷帙若干。此等文册,非止一卷,乃累牍连篇,亟需批量转置。然吾辈虑及用户体验,当效东坡"腹有诗书气自华"之雅意,使操作如行云流水,遂定以条分缕析之法,列其要目于屏间,令观者一目了然,恰似"大江东去,浪淘尽"之畅达,去繁就简,存精去芜,使界面如清风明月,操作若庖丁解牛。具体之法,容后详叙…

上传流程介绍

石墨云台藏机杼,以链为引可通幽。昔者匠人剖玉,今人截链取牍,得十六位秘钥,若敦煌经卷之编号,暗藏玄机。其法非独单卷,亦通全册,或拓一室之藏,但添协作者于卷轴、函匣、书阁之间,如邀苏子瞻共游赤壁,许其同览文海。然需筑私邸于云中(私有化部署),方得启下载之门径,此间玄妙,非市井可窥。

进度条之艺,恰似东坡观潮:初见细浪如银线,渐涌为雪堆千叠,终成惊涛拍岸之势。其理有三:一曰分黍定寸(任务切分),二曰燃香计时(进度追踪),三曰墨染绢帛(界面渲染)。每完成一卷,则添一笔于素笺,恰似东坡夜游承天寺,见"庭下如积水空明",步步生辉。其间奥义,非止术数,更含天地运行之理,今且述其梗概,余者待诸君细参。

服务流程示意图

文枢流转之法,恰似东坡治水之道。用户执链如持竹简,录于云台(系统界面),此乃"大江初发昆仑源"之始。后端服务承此简牍,以密钥为符,协作者为印,启石墨秘库之门,如子瞻开赤壁石壁,得见卷帙浩繁。

所得文牍既至,当效东坡"腹中贮书一万卷"之法,分存于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神笔,绘原子之章。其间妙理,非止于术,更在"不识庐山真面目"之破局——使进度刻痕如西子湖心月,任尔千帆过尽,自有清辉长明。然此中三昧,且待下回分说,恰似"欲把西湖比西子"之未尽余韵…


http://www.hkcw.cn/article/iwFKDEJKwa.shtml

相关文章

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…

[Windows] 摸鱼小工具:隐藏软件(重制版)

由吾爱大神写的摸鱼工具&#xff1a; 数据存放路径为C:\Users\用户名\AppData\Local\HideSoft&#xff0c;如果不想用时&#xff0c;删除软件及此路径下的HideSoft文件夹。如添加了开机启动&#xff0c;删除启动菜单文件夹的快捷方式即可&#xff0c;或者删除前在软件中取消设置…

模块化集成建筑(MiC建筑):颠覆传统的未来建造革命

传统建筑行业长期面临"高污染、高能耗、低效率"的困境。施工现场粉尘飞扬、建材浪费严重、人工依赖度高&#xff0c;这些痛点制约着行业现代化进程。而MiC技术通过将建筑分解为标准化模块&#xff0c;彻底颠覆了传统建造模式。 在海南海口刚刚落幕的第二十一届国际绿…

【文献阅读】Hierarchical Reinforcement Learning: A ComprehensiveSurvey

Acm Computing Surveys (csur) 1区 2021年 分层强化学习&#xff1a;全面综述 分层强化学习&#xff08;HRL&#xff09;能够将具有挑战性的长时决策任务自主分解为更简单的子任务。在过去几年里&#xff0c;HRL 研究领域取得了显著发展&#xff0c;产生了大量方法。为了系…

鸿蒙网络数据传输案例实战

一、案例效果截图 二、案例运用到的知识点 核心知识点 网络连接管理&#xff1a;connection模块HTTP数据请求&#xff1a;http模块RPC数据请求&#xff1a;rcp模块文件管理能力&#xff1a;fileIo模块、fileUri模块 其他知识点 ArkTS 语言基础V2版状态管理&#xff1a;Comp…

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频&#xff0c;可能总有些时候会多录制一段时间&#xff0c;但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数&#xff0c;比如剪映就不支持mkv格式的导出&#xff0c;导出成mp4格式的视频就会变得很…

Python 电脑桌面——牛马工作量监控大屏

开源地址&#xff1a;https://gitee.com/beautiful_corridors/niuma Python 工作量监控大屏 基于 Python PySide6 开发的实时工作量监控桌面应用&#xff0c;提供美观的大屏显示界面。 功能特性 &#x1f4ca; 实时监控 键盘输入统计: 实时统计按键次数&#xff0c;显示平…

界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现自定义遥测?

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 .NET As…

t009-线上代驾管理系统

项目演示地址 摘 要 使用旧方法对线上代驾管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在线上代驾管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…

测试Bug篇

本节概要&#xff1a; 软件测试的生命周期 bug的概念 buh要素 bug等级 bug生命周期 对于bug的定级与开发发生冲突如何解决 一、 软件测试的⽣命周期 软件测试贯穿于软件的整个生命周期&#xff0c;针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个生命周期。 软…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.2 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用。 dataframe<-data.frame( Surfacec(74,64,60,92…

无人机报警器探测模块技术解析!

一、运行方式 1. 频谱监测与信号识别 全频段扫描&#xff1a;模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段&#xff0c;覆盖遥控、图传及GPS导航信号。 多路分集技术&#xff1a;采用多传感器阵列&#xff0c;通过信号加权合并提升信噪比&#xff0c;…

从本地到云端:Code App+SSH协议在iPad开发中的性能优化实战

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 在春日的公园长椅上&#xff0c;当编程灵感突然闪现时&a…

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack实战 (下)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)&#xff0c;其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>}&#xff0c;所以L(n.data) 是一个异步函数…

2025年05月29日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;11898今日star数&#xff1a;2379项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

Python自动化之selenium语句——打开、关闭浏览器和网页

目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件&#xff0c;输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…

实时操作系统在脑机接口中的技术平衡:满足实时性与 AI 算力需求

在当今医疗科技蓬勃发展的时代&#xff0c;实时操作系统&#xff08;RTOS&#xff09;正逐渐成为医疗设备领域中不可或缺的关键技术。随着脑机接口等前沿技术的飞速发展&#xff0c;对实时性和算力的双重需求达到了前所未有的高度&#xff0c;而 RTOS 在其中扮演着至关重要的角…

循环神经网络(RNN)模型

一、概述 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种专门设计用于处理序列数据&#xff08;如文本、语音、时间序列等&#xff09;的神经网络模型。其核心思想是通过引入时间上的循环连接&#xff0c;使网络能够保留历史信息并影响当前输出。 …

【stm32开发板】原理图设计(电源部分)附:设计PCB流程

一、PCB设计流程 二、操作步骤 1.新建工程 文件→新建→工程 2.命名工程 保存后进入该页面 自生成了一个原理图和PCB 3.新建图页及重命名 右键第一个图页&#xff0c;选择新建图页 右键选择重命名可以为图页改名 4.取消设计规则的22项 5.原理图尺寸调整 如果觉得原理图框的…

MCP入门实战(极简案例)

MCP简介 MCP(Model Context Protocol,模型上下文协议)2024年11月底由 Antbropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。 Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使AI模型与API无缝交互,而Al Agent是一个…