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

实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节

目录

  1. 引言:为什么需要进度条?
  2. 环境准备与项目结构分析
  3. 原理剖析:从终端输出到动态刷新
  4. 代码逐行解析(附完整代码)
    • 4.1 头文件与宏定义
    • 4.2 进度条的动态构建逻辑
    • 4.3 关键转义字符:\r\n的深度对比
    • 4.4 缓冲机制与fflush的强制刷新
  5. 编译运行:Makefile的设计与使用
  6. 扩展优化:打造个性化进度条
  7. 常见问题与调试技巧
  8. 总结与展望

1. 引言:为什么需要进度条?

在软件开发中,进度条是用户界面中不可或缺的反馈机制。它为用户提供了程序执行进度的直观视觉表示,尤其在处理耗时操作(如文件下载、数据解析、编译过程)时,能有效缓解用户的等待焦虑。在Linux命令行环境下,实现一个高效的进度条涉及终端控制、输出缓冲管理、转义字符使用等核心技术。


2. 环境准备与项目结构分析

2.1 开发环境

  • 操作系统:Linux发行版(CentOS)
  • 编译器:GCC
  • 构建工具:Make

2.2 项目文件结构

.
|-- main.c              # 主程序入口
|-- makefile            # 构建脚本
|-- ProgressBar.c       # 进度条实现
`-- ProgressBar.h       # 头文件与宏定义

3. 原理剖析:从终端输出到动态刷新

3.1 终端输出的本质

终端(如Bash)是基于字符的流式输出设备。普通输出(如printf)按顺序显示字符,而动态效果(如进度条)需要控制光标位置实现“原地更新”。

3.2 动态刷新核心:\r\n

  • \n(换行符):光标移动到下一行行首。
  • \r(回车符):光标回到当前行行首,不换行。

关键区别\r允许在同一行内覆盖旧内容,而\n必定换行。进度条需用\r实现动态更新。


4. 代码逐行解析(附完整代码)

4.1 头文件与宏定义(ProgressBar.h)

#pragma once
#include <stdio.h>
#include <string.h>
#include <unistd.h>#define NUM 101         // 进度条长度+1(预留'\0')
#define S_NUM 5         // 样式字符种类数extern void Process();  // 进度条主逻辑

4.2 进度条的动态构建(ProgressBar.c)

4.2.1 初始化与样式定义
char bar[NUM];
memset(bar, '\0', sizeof(bar));  // 清空数组
char style[S_NUM] = {'-', '.', '#', '>', '+'};  // 填充样式
const char* lable = "|\\-/";     // 旋转光标效果字符
4.2.2 主循环逻辑
while (cnt <= 100) 
{printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt % 4]);fflush(stdout);      // 立即刷新输出缓冲区bar[cnt++] = style[cnt % S_NUM];  // 填充样式字符usleep(50000);       // 模拟耗时操作(0.05秒)
}
printf("\n");            // 完成时换行

代码解析

  • %-100s:左对齐并固定输出宽度为100字符,避免进度条长度波动。
  • fflush(stdout):强制刷新缓冲区,确保立即显示。
  • 旋转光标lable[cnt % 4]循环显示|, \, -, /,增强动态效果。

4.3 关键转义字符深度对比

4.3.1 \r的实现效果
printf("Progress: 50%%\r");
printf("Progress: 75%%\r");

输出结果始终在同一行更新,最终显示Progress: 75%

4.3.2 \n的错误使用案例
printf("Progress: 50%%\n");
printf("Progress: 75%%\n");

输出结果为两行,无法实现进度条效果。

4.4 缓冲机制与fflush的强制刷新

4.4.1 缓冲类型
  • 全缓冲:缓冲区满时刷新(常见于文件写入)。
  • 行缓冲:遇到\n或缓冲区满时刷新(标准输出默认模式)。
  • 无缓冲:立即输出(如标准错误流)。
4.4.2 为何需要fflush

由于\r不触发行缓冲,若不手动刷新,输出可能滞留在缓冲区,导致进度条无法实时显示。


5. 编译运行:Makefile的设计与使用

5.1 Makefile内容

ProgressBar:main.c ProgressBar.cgcc -o ProgressBar main.c ProgressBar.c -DN=1
.PHONY:clean
clean:rm -f ProgressBar

5.2 编译与运行

make        # 编译生成可执行文件
./ProgressBar     # 运行程序

6. 扩展优化:打造个性化进度条

6.1 颜色控制

通过ANSI转义序列添加颜色:

printf("\033[32m[%-100s]\033[0m", bar);  // 绿色进度条

6.2 动态速度调整

根据任务实际进度调整usleep时间,实现速度同步。

6.3 多线程支持

在独立线程中更新进度条,避免阻塞主任务。


7. 常见问题与调试技巧

7.1 进度条不更新

  • 检查\r是否正确使用,确认未误用\n
  • 确认fflush(stdout)是否调用

7.2 显示错乱

  • 固定输出宽度:如%-100s确保格式稳定。
  • 避免打印额外字符:确保每次循环只输出一行。

8. 总结与展望

本文深入探讨了Linux下进度条的实现原理,详细解析了\r\n的区别、输出缓冲机制、终端控制等关键技术。通过扩展,读者可进一步实现彩色进度条、自适应速度调整等高级功能。掌握这些技术,不仅有助于提升命令行工具的交互体验,也为深入理解Linux系统编程奠定基础。


附件:完整代码

[xff@VM-8-2-centos test_323]$ tree
.
|-- main.c
|-- makefile
|-- ProgressBar.c
`-- ProgressBar.h0 directories, 4 files
[xff@VM-8-2-centos test_323]$ cat ProgressBar.h
#pragma once#include <stdio.h>
#include <string.h>
#include <unistd.h>#define NUM 101
#define S_NUM 5extern void Process();// 函数声明
[xff@VM-8-2-centos test_323]$ cat ProgressBar.c
#include "ProgressBar.h"void Process() // 函数定义
{int cnt = 0;char bar[NUM];memset(bar, '\0', sizeof(bar));// 风格char style[S_NUM] = {'-', '.', '#', '>', '+'};// reverseconst char* lable = "|\\-/";// 循环 101 次 while(cnt <= 100){printf("[%-100s] [%%%-3d] [%c]\r", bar, cnt, lable[cnt % 4]);fflush(stdout);bar[cnt++] = style[N];usleep(50000);// 5s}printf("\n");
}
[xff@VM-8-2-centos test_323]$ cat main.c
#include "ProgressBar.h"
int main()
{Process();// 函数调用return 0;
}
[xff@VM-8-2-centos test_323]$ cat makefile
ProgressBar:main.c ProgressBar.cgcc -o ProgressBar main.c ProgressBar.c -DN=1
.PHONY:clean
clean:rm -f ProgressBar
[xff@VM-8-2-centos test_323]$ make
gcc -o ProgressBar main.c ProgressBar.c -DN=1
[xff@VM-8-2-centos test_323]$ ./ProgressBar
[....................................................................................................] [%100] [|]
[xff@VM-8-2-centos test_323]$ make clean
rm -f ProgressBar

运行图

相关文章:

实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节

目录 引言&#xff1a;为什么需要进度条&#xff1f;环境准备与项目结构分析原理剖析&#xff1a;从终端输出到动态刷新代码逐行解析&#xff08;附完整代码&#xff09; 4.1 头文件与宏定义4.2 进度条的动态构建逻辑4.3 关键转义字符&#xff1a;\r与\n的深度对比4.4 缓冲机制…...

生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店

前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的&#xff0c;然而切换到cmd时&#xff0c;突然发现cmd中无法识别anaconda的python环境&#xff0c;竟然打开了应用商店让我安装Python&#xff0c;这当然是不对的。 解决 这是因为…...

TypeScript中的声明合并:与JavaScript的对比与实践指南

引言 在大型项目开发中&#xff0c;代码的可维护性和可扩展性至关重要。TypeScript作为JavaScript的超集&#xff0c;通过静态类型系统带来了更强大的代码组织能力。其中声明合并&#xff08;Declaration Merging&#xff09; 是TypeScript独有的重要特性&#xff0c;本文将深…...

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…...

2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…...

Linux程序性能分析

为什么程序会慢&#xff1f; 在深入工具和方法之前&#xff0c;我们先来聊聊为什么程序会慢。一个程序主要在三个方面消耗资源&#xff1a; CPU时间 - 计算太多、算法效率低 内存使用 - 内存泄漏、频繁申请释放内存 I/O操作 - 文件读写、网络通信太频繁 今天我们主要聚焦C…...

【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现

项目背景与意义 在全球范围内&#xff0c;安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会&#xff0c;人们面临的生活、工作环境日益复杂&#xff0c;交通事故、火灾、溺水、突发疾病等各种意外事件的发生…...

Linux shift 命令使用详解

简介 在 Bash 脚本中&#xff0c;shift 命令用于将命令行参数向左移动&#xff0c;有效地丢弃第一个参数并将其他参数向下移动。 基础语法 shift [N]N&#xff08;可选&#xff09;→ 要移动的位置数。默认值为 1 示例用法 移动参数 #!/bin/bash echo "Before shift…...

【C++网络编程】第5篇:UDP与广播通信

一、UDP协议核心特性 1. UDP vs TCP ​特性 ​UDP​TCP连接方式无连接面向连接&#xff08;三次握手&#xff09;可靠性不保证数据到达或顺序可靠传输&#xff08;超时重传、顺序控制&#xff09;传输效率低延迟&#xff0c;高吞吐相对较低&#xff08;因握手和确认机制&…...

C++11QT复习 (五)

文章目录 **Day6-2 成员访问运算符重载&#xff08;2025.03.25&#xff09;****1. 复习****2. 成员访问运算符重载****2.1 箭头运算符 (->) 重载****(1) 语法** **2.2 解引用运算符 (*) 重载****(1) 语法** **3. 代码分析****3.1 代码结构****3.2 代码解析****(1) Data 类**…...

Python项目-基于Python的网络爬虫与数据可视化系统

1. 项目简介 在当今数据驱动的时代&#xff0c;网络爬虫和数据可视化已成为获取、分析和展示信息的重要工具。本文将详细介绍如何使用Python构建一个完整的网络爬虫与数据可视化系统&#xff0c;该系统能够自动从互联网收集数据&#xff0c;进行处理分析&#xff0c;并通过直观…...

SpringCloud Zuul 使用教程

SpringCloud Zuul 使用教程 目录 Zuul 简介环境准备搭建 Zuul 网关 • 3.1 Maven 依赖 • 3.2 配置文件 • 3.3 启动类注解基本路由配置 • 4.1 简单路由 • 4.2 基于路径的路由 • 4.3 基于服务的路由Zuul 高级配置 • 5.1 过滤器配置 • 5.2 限流与熔断 • 5.3 负载均衡 •…...

介绍一款基于MinerU的PDF翻译工具

一。简介 Fast pdf translate是一款pdf翻译软件&#xff0c;基于MinerU实现pdf转markdown的功能&#xff0c;接着对markdown进行分割&#xff0c; 送给大模型翻译&#xff0c;最后组装翻译结果并由pypandoc生成结果pdf。 git地址&#xff1a; https://github.com/kv1830/fast…...

轻量级TLS反向代理工具TLS-reverse-proxy:打造安全通信桥梁

在数字化浪潮席卷全球的今天&#xff0c;数据隐私与传输安全已成为企业及个人的核心关切。TLS&#xff08;传输层安全协议&#xff09;作为互联网通信的"隐形卫士"&#xff0c;承担着保护数据在传输过程中不被窃取或篡改的重要使命。然而&#xff0c;对于许多传统服务…...

SQL问题分析与诊断(8)——前提

8.1. 前提 与其他关系库类似&#xff0c;SQL Server中&#xff0c;当我们对存在性能问题的SQL语句进行分析和诊断时&#xff0c;除了获取该SQL语句本身外&#xff0c;还需要获取SQL语句相应的查询计划及其相关的数据环境。这里&#xff0c;所谓数据环境&#xff0c;具体是指SQ…...

关于cmd中出现无法识别某某指令的问题

今天来解决以下这个比较常见的问题&#xff0c;安装各种软件都可能会发生&#xff0c;一般是安装时没勾选注册环境变量&#xff0c;导致cmd无法识别该指令。例如mysql&#xff0c;git等&#xff0c;一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…...

如何处理不同输入类型(例如邮箱、电话号码)的验证?

处理不同输入类型(如邮箱、电话号码)的验证可以通过多种方法实现,包括使用 HTML5 内置验证、JavaScript/jQuery 自定义验证和正则表达式。以下是一些常用的验证方法和示例。 1. 使用 HTML5 内置验证 HTML5 提供了一些内置的输入类型,可以自动处理基本的验证。 示例 <…...

Redis集群哨兵相关面试题

目录 1.Redis 主从复制的实现原理是什么? 详解 补充增量同步 replication buffer repl backlog buffer 2.Redis 主从复制的常见拓扑结构有哪些? 3.Redis 复制延迟的常见原因有哪些? 4.Redis 的哨兵机制是什么? 主观下线和客观下线 哨兵leader如何选出来的&#x…...

【CXX-Qt】4.1 extern “RustQt“

QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心&#xff0c;用于声明 Rust 类型和签名&#xff0c;使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...

当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验

求人不如求己。 事情是这样的&#xff0c;前段时间&#xff0c;我看了本书&#xff0c;书里介绍了款应用&#xff0c;能计算财富自由价格&#xff0c;还能制定退休计划。 结果&#xff0c;我迫不及待去下载这个应用时&#xff0c;发现这应用功能残缺&#xff0c;完全不可用。 …...

如何排查C++程序的CPU占用过高的问题

文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...

数据库练习

完善t_hero表 -- 添加作者字段 alter table t_hero add author varchar(100);-- 更新数据update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id…...

nodejs-原型污染链

还是老规矩&#xff0c;边写边学&#xff0c;先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...

无人机与AI技术结合的突破性应用场景

1. 自主导航与动态避障 技术栈&#xff1a;SLAM 强化学习 (PPO算法) 代码示例&#xff08;Python PyTorch&#xff09;&#xff1a; import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...

jsBridge在vue中使用

创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...

Windows下docker使用教程

docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的&#xff0c;后面的内容其实不变 …...

iOS:GCD信号量、同步、异步的使用方法

信号量的详细用法&#xff0c;可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示&#xff0c;最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...

Nginx相关漏洞解析

一、CRLF注入漏洞 原理&#xff1a;Nginx将传入的url进行解码&#xff0c;对其中的%0a%0d替换成换行符&#xff0c;导致后面的数据注入至头部&#xff0c;造成CRLF 注入漏洞 1、开环境 2、访问网站&#xff0c;并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...

SpringCloud构建一个服务步骤

Spring Cloud是一个用于构建分布式系统的开源框架&#xff0c;可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤&#xff0c;展示如何使用Spring Cloud构建一个服务&#xff1a; 创建一个Spring Boot项目&#xff1a;首先需要创建一个Spring Boot项目作为基础。可以…...

MySQL中怎么分析性能?

MySQL中主要有4种方式可以分析数据库性能&#xff0c;分别是慢查询日志&#xff0c;profile&#xff0c;Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启&#xff0c; show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...

MinGW与使用VScode写C语言适配

压缩包 通过网盘分享的文件&#xff1a;MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面&#xff0c;从上数第4个&#xff0c;点击扩展&#xff08;以下通此&#xff09; 搜索---Chinese--点击---安装--o…...

k8s存储介绍(五)PV与PVC

在 Kubernetes&#xff08;k8s&#xff09;中&#xff0c;持久化存储&#xff08;Persistent Storage&#xff09;是一个非常重要的概念&#xff0c;因为 Pod 本身是无状态的&#xff0c;重启后会丢失数据。为了支持有状态应用&#xff0c;Kubernetes 提供了持久化存储的机制&a…...

LangChain开发(五)消息管理与聊天历史存储

文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口&#xff0c;看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例&#xff0c;其中聊天历史保存在内存中&…...

HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)

引言 在前端开发的广袤领域中&#xff0c;HTML 表单处理堪称基石般的存在&#xff0c;是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单&#xff0c;到功能多样的搜索栏、反馈表单&#xff0c;HTML 表单如同桥梁&#xff0c;紧密连接着用户与 Web 应用…...

【文献25/03/26】Hyperspectral Image Transformer Classification Networks

高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像&#xff08;HSI&#xff09;分类是地球观测任务中的一项重要工作。 卷积神经网络&#xff08;CNN&#xff09;凭借…...

数字转换(c++)

【题目描述】 如果一个数 xx 的约数和 yy &#xff08;不包括他本身&#xff09;比他本身小&#xff0c;那么 xx 可以变成 yy &#xff0c;yy 也可以变成 xx 。例如 44 可以变为 33 &#xff0c;11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行&#xff0c;…...

WPF ContentPresenter详解2

ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件&#xff0c;但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl&#xff1a;位于 WPF 控件…...

【git】认识git的本地仓库

1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后&#xff0c;目录下会有一个.git文件&#xff0c;这个就是本地仓库 而创建本地仓库的目录叫做工作区&#xff0c;我们不能对.git文件进行任何手…...

正则表达式基本语法和Java中的简单使用

先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...

【大模型】什么是循环神经网络(RNNs)

在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;**循环神经网络&#xff08;Recurrent Neural Networks, RNNs&#xff09;**是一种非常强大的工具&#xff0c;特别适合处理序列数据。无论是语言、时间序列还是音乐&#xff0c;RNNs都能帮助我们理解和预测这些数据的…...

Leetcode 交错字符串

java solution class Solution {public boolean isInterleave(String s1, String s2, String s3) {//首先获取这三个字符串的长度int m s1.length();int n s2.length();int l s3.length();if(m n ! l) return false;//创建dp数组,dp[i][j]其含义是s3的前ij个字符是否可以由…...

Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮

Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...

MySQL - 数据库基础操作

SQL语句 结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language)&#xff0c;定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…...

从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!

引言&#xff1a;为什么SQL注入攻击依然如此强大&#xff1f; SQL注入&#xff08;SQL Injection&#xff09;是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施&#xff0c;但SQL注入依然在许多情况下能够突破防线&#…...

关于优麒麟ukylin如何更换清华源以及ubuntu24.04安装gcc-i686-linux-gnu找不到包的问题

打算把这个文章当成一个调试Linux bug的汇总&#xff0c;会持续更新 1、关于优麒麟ukylin如何更换清华源 &#xff08;1&#xff09;首先打开命令行&#xff0c;切换root权限 su root 输入密码 如果第一次使用ubuntu会提示密码不正确&#xff0c;输入 sudo passwd root …...

Spring Boot 自定义 Starter 组件的技术指南

1、简述 Spring Boot 通过 Starter 机制&#xff0c;让开发者可以快速集成第三方组件。在企业级开发中&#xff0c;我们常常需要封装自己的 Starter 组件&#xff0c;以提高代码复用性&#xff0c;简化配置&#xff0c;并实现可插拔的模块化开发。 Spring Boot Starter 机制 …...

基于Spring Boot的ONLY在线商城系统设计与实现的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

HarmonyOS 之 @Require 装饰器自学指南

在 HarmonyOS 应用开发工作中&#xff0c;我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里&#xff0c;要是无法确保必要参数在构造时准确传入&#xff0c;就极易引发运行时错误&#xff0c;而且排查起来费时费力。一次偶然的机会&#xff0c;我接触到了 Require 装饰…...

【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典

更新日期&#xff1a;2025年3月26日。 Github 仓库&#xff1a;https://github.com/SaiTingHu/HTFramework Gitee 仓库&#xff1a;https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…...

JavaScript的性能优化指导

JavaScript 的性能优化可以从多个层面入手&#xff0c;涵盖代码执行效率、内存管理、DOM 操作、网络请求等。以下是一些关键优化策略&#xff1a; 一、代码执行优化 减少作用域链查找 避免在循环中频繁访问全局变量或深层嵌套的属性&#xff0c;将其缓存到局部变量中。 // 优化…...