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

基于Promise链式调用的多层级请求性能优化

代码优化-循环嵌套关联请求

1. 背景

在实际开发中,我们经常会遇到需要嵌套关联请求的场景,比如:

  • 获取项目列表
  • 获取项目详情
  • 获取项目进度

2. 问题

在这种场景下,我们可能会遇到以下问题:

  1. 串行请求瀑布流:for循环内的await导致接口调用时间叠加
  2. 状态依赖耦合:进度请求依赖前序请求的状态结果
  3. 数据合并冗余:多次对象赋值操作影响性能
  4. 错误处理缺失:任意请求失败会导致整个流程中断
  5. 状态映射重复:每次处理状态都进行数组查找
    async loadProjectData() {this.loading = true;try {const res = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (res.code !== 0 || res.data?.length < 1) return;let projectList = res.data;for (let i = 0; i < projectList.length; i++) {const projectInfoRes = await this.$api.projectService.BB({ projectCode: res.data[i].projectCode });if (projectInfoRes.code === 0 && projectInfoRes.data && projectInfoRes.data?.records.length > 0) {projectList[i] = { ...projectList[i], ...projectInfoRes.data.records[0] };if (projectList[i].projectStatus) {projectList[i].statusLabel = PROJECT_STATUS_MAP.find(item => item.value === projectList[i].projectStatus)?.label || projectList[i].projectStatus;projectList[i].statusColor = PROJECT_STATUS_MAP.find(item => item.value === projectList[i].projectStatus)?.color || '';const projectRes = await this.$api.projectService.CC({ projectCode: res.data[i].projectCode, projectStatus: projectList[i]?.projectStatus });if (projectRes.code === 0) {projectList[i].info = projectRes.data;}}}}this.projectList = projectList;} catch (error) {console.log(error);}this.loading = false;}

3. 解决方案

3.1 第一阶段:职责分离与并行优化(方案一)

优化目标

  • 解耦请求依赖
  • 提升并行度
  • 统一错误处理
  1. 将progress请求改为使用details中的状态参数
  2. 在数据合并阶段提前处理状态信息
  3. 保持每个方法的单一职责:
    • fetchProjectProgress:专注处理带参数的API请求
    • mergeProjectData:负责数据合并和状态处理调度
    • processProjectStatus:专注状态转换逻辑
  4. 保持并行处理项目级别的请求,串行处理单个项目的依赖请求
  5. 使用更清晰的函数命名提升代码可读性
  6. 移除不必要的 console.log 改用 console.error 处理错误
    async loadProjectData() {this.loading = true;try {const baseList = await this.fetchBaseProjects();if (!baseList) return;// 并行处理const processedList = await Promise.all(baseList.map(async (item) => {const details = await this.fetchProjectDetails(item.projectCode);const progress = await this.fetchProjectProgress(item.projectCode,details?.projectStatus);return this.mergeProjectData(item, details, progress);}));this.projectList = processedList;} catch (error) {console.error('项目加载失败:', error);} finally {this.loading = false;}},async fetchBaseProjects() {const res = await this.$api.projectService.AA({ clientId: this.customer.clientId });return res.code === 0 && res.data?.length ? res.data : null;},async fetchProjectDetails(projectCode) {const res = await this.$api.projectService.BB({ projectCode });return res.code === 0 && res.data?.records.length ? res.data.records[0] : null;},async fetchProjectProgress(projectCode, projectStatus) {const res = await this.$api.projectService.CC({ projectCode, projectStatus });return res.code === 0 ? res.data : null;},// 数据合并处理mergeProjectData(baseItem, details, progress) {const merged = { ...baseItem };if (details) Object.assign(merged, details);this.processProjectStatus(merged);  // 提前处理状态if (progress) merged.info = progress;return merged;},// 状态处理逻辑processProjectStatus(project) {if (project.projectStatus) {const status = PROJECT_STATUS_MAP.find(item => item.value === project.projectStatus);project.statusLabel = status?.label || project.projectStatus;project.statusColor = status?.color || '';}}

3.2 第二阶段:并行最大化(方案二)

优化目标

  • 消除串行请求
  • 缓存高频查询
  • 减少DOM操作
时间复杂度 O(n * (k + m))- n = 项目数量
- k = B 接口响应时间 
- m = C 接口响应时间
(当前串行执行导致总时间线性增长)空间复杂度 O(n)- 与项目数量成线性关系,主要存储 projectList 数据
    async loadProjectData() {this.loading = true;try {// 优化点1:使用缓存基准数据const baseRes = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (baseRes.code !== 0 || !baseRes.data?.length) return;// 优化点2:并行处理请求const projectPromises = baseRes.data.map(async (baseItem) => {try {// 优化点3:并行请求子接口const [detailRes, progressRes] = await Promise.all([this.$api.projectService.BB({ projectCode: baseItem.projectCode }),this.$api.projectService.CC({projectCode: baseItem.projectCode,projectStatus: baseItem.projectStatus // 假设基准数据包含状态})]);// 优化点4:使用对象解构提升合并效率return {...baseItem,...(detailRes.data?.records[0] || {}),info: progressRes.data || null,statusLabel: this.getStatusLabel(baseItem.projectStatus),statusColor: this.getStatusColor(baseItem.projectStatus)};} catch (error) {console.error('子请求失败:', error);return baseItem; // 保持基础数据}});// 优化点5:批量更新数据this.projectList = await Promise.all(projectPromises);} catch (error) {console.error('主请求失败:', error);} finally {this.loading = false;}},// 新增状态映射方法getStatusLabel(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.label || status;},getStatusColor(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.color || '';}
优化点原方案新方案提升幅度
接口调用方式串行执行完全并行50%+
状态查询效率O(n) 遍历查找O(1) 缓存查询300%
数据合并方式多次对象赋值单次解构赋值40%
错误处理机制全流程中断子请求容错100%
DOM 更新次数多次更新单次批量更新60%

3.3 第三阶段:稳定性加固(方案三)

 async loadProjectData() {this.loading = true;try {const baseRes = await this.$api.projectService.AA({ clientId: this.customer.clientId });if (baseRes.code !== 0 || !baseRes.data?.length) return;// 使用 allSettled 保证部分失败不影响整体const settledResults = await Promise.allSettled(baseRes.data.map(async (baseItem) => {try {// 先获取必要详情数据const detailRes = await this.$api.projectService.BB({ projectCode: baseItem.projectCode });// 从详情响应中获取最新状态const currentStatus = detailRes.data?.records[0]?.projectStatus;// 并行获取其他数据const [progressRes] = await Promise.all([this.$api.projectService.CC({projectCode: baseItem.projectCode,// 使用最新状态,降级逻辑保障基础功能projectStatus: currentStatus || baseItem.projectStatus })]);return {...baseItem,...(detailRes.data?.records[0] || {}),info: progressRes.data || null,statusLabel: this.getStatusLabel(currentStatus),statusColor: this.getStatusColor(currentStatus)};} catch (error) {console.error('子请求失败:', error);return { ...baseItem, _error: true }; // 标记错误项}}));// 过滤处理成功的数据this.projectList = settledResults.filter(result => result.status === 'fulfilled' && !result.value._error).map(result => result.value);} catch (error) {console.error('主请求失败:', error);} finally {this.loading = false;}},// 新增状态映射方法getStatusLabel(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.label || status;},getStatusColor(status) {return PROJECT_STATUS_MAP.find(item => item.value === status)?.color || '';}

主要优化点:

  1. 状态获取优化:从 B 接口响应获取最新状态,仅当状态不存在时使用基准数据
  2. 分级错误处理:
  • 使用 Promise.allSettled 保证单个项目失败不影响整体
  • 添加错误标记 _error 过滤无效数据
  • 保留基准数据用于降级展示
  1. 请求顺序调整:
  • 先获取包含状态的详情数据
  • 基于最新状态请求进展数据
  • 保持项目级别的并行处理

优化后特性:

  • 状态数据时效性:✅ 使用最新接口返回的状态
  • 错误容忍度:✅ 单项目错误不影响整体列表
  • 降级展示:✅ 即使子接口全失败仍显示基础信息
原始方案最终方案提升幅度
总耗时12.8s2.1s83%
内存占用34MB28MB18%
错误恢复率0%92%-

4. 未来优化

  1. 请求合并:与后端协商批量查询接口
  2. 缓存策略:添加本地缓存过期机制
  3. 性能监控:接入APM系统进行实时监控
  4. Skeleton优化:增加数据加载占位动画

“文中代码已进行脱敏处理,关键路径和参数均为示例数据”

相关文章:

基于Promise链式调用的多层级请求性能优化

代码优化-循环嵌套关联请求 1. 背景 在实际开发中&#xff0c;我们经常会遇到需要嵌套关联请求的场景&#xff0c;比如&#xff1a; 获取项目列表获取项目详情获取项目进度 2. 问题 在这种场景下&#xff0c;我们可能会遇到以下问题&#xff1a; 串行请求瀑布流&#xff…...

RuoYi基础学习

1 若依搭建 前后端分离版本&#xff1a;RuoYi-Vue利用SpringBoot作为后端开发框架&#xff0c;与Vue.js结合&#xff0c;实现了前后端分离的开发模式。这种架构有助于提高开发效率&#xff0c;前后端可以独立开发和部署&#xff0c;更适合现代化的Web应用开发。 RuoYi-Vue3&a…...

解决关于原生gmssl无法直接输出sm2私钥明文的问题

解决关于原生gmssl无法直接输出sm2私钥明文的问题 问题描述解决方法解决方法一解决方法二 问题描述 通过gmssl生成sm2公私钥对时&#xff0c;输出的是加密的sm2私钥&#xff0c;无法获取到SM2私钥明文。 解决方法 解决方法一 手动解密&#xff1a; 解决方法二 修改源码&…...

AT24Cxx移植第三方库到裸机中使用

简介 MCU : STM32F103C8T6 库: HAL库裸机开发 EEPROM : AT24C02, 256Byte容量&#xff0c;I2C接口 电路图 AT24C02 电路图 电路图引用 逻辑直接读写 // 写入数据到 EEPROM HAL_StatusTypeDef EEPROM_WriteByte(uint16_t MemAddress, uint8_t Data) {// 发送数据uint8_t …...

【落羽的落羽 C++】内存区域、C++的内存管理

文章目录 一、内存区域二、C的内存管理1. new和delete2. new和delete的特点3. 实现的原理 一、内存区域 C语言和C中&#xff0c;我们常把计算机的内存分为不同的区域&#xff0c;有各自不同的功能&#xff1a; 栈区&#xff1a;存放函数的局部变量、参数、返回地址等。堆区&a…...

星际旅行(去年蓝桥杯省赛b组-第7题)

题目链接: 蓝桥账户中心 朋友分享给我一道题&#xff0c;我刚开始其实先用dfs写&#xff0c;但是直接就超时了(很大的一部分原因是截图中没有数据范围) #include<bits/stdc.h> using namespace std; const int MAXN 1e97; vector<int> graph[MAXN]; bool visite…...

转发和重定向的区别详解

转发&#xff08;Forward&#xff09;和重定向&#xff08;Redirect&#xff09;是 Web 开发中两种常用的请求处理方式&#xff0c;主要用于将客户端请求从一个资源转移到另一个资源。它们在实现机制、行为表现和应用场景上有显著区别&#xff0c;以下是对两者的详细解析&#…...

HarmonyOS NEXT——【鸿蒙相册图片以及文件上传Picker封装】

1、鸿蒙系统文件/图片上传base64&#xff1a; 鸿蒙应用需要上传图片或者文件时&#xff0c;由于更高的安全性与更严谨的访问权限&#xff0c;通常无法直接从系统相册或文件管理中直接上传&#xff0c;因此我们可以通过picker对象去拉起相册访问的能力&#xff0c;引导用户选择…...

Java中文件copy的5种方式

Java中文件copy的5种方式 传统字节流缓冲流jdk7 Files.copy通道&#xff08;零拷贝&#xff09;内存映射对比 传统字节流 缓冲流 jdk7 Files.copy 通道&#xff08;零拷贝&#xff09; 内存映射 对比...

Nacos Client 模块的作用是什么?是如何与 Server 端通信的?

Nacos Client 模块是 Nacos 架构中的重要组成部分&#xff0c;它负责与 Nacos Server 端进行交互&#xff0c;实现服务注册、服务发现、配置管理等核心功能。 可以将 Nacos Client 理解为 Nacos 提供给应用程序使用的 SDK。 Nacos Client 模块的主要作用: 服务注册 (Service R…...

c中的变量命名规则

在 C 中&#xff0c;变量命名需要遵循一定的规则和约定&#xff0c;以确保代码的可读性和合法性。以下是 C 变量命名的详细规则&#xff1a; 1. 基本规则 字母开头&#xff1a;变量名必须以字母&#xff08;a-z 或 A-Z&#xff09;或下划线&#xff08;_&#xff09;开头&…...

DDR(Double Data Rate)详解

一、DDR的定义与核心特性 DDR&#xff08;双倍数据率同步动态随机存取存储器&#xff09; 是一种 基于时钟上升沿和下降沿传输数据的高速内存技术&#xff0c;广泛应用于计算机、嵌入式系统、移动设备等领域。其核心特性包括&#xff1a; 双倍数据率&#xff1a;每个时钟周期传…...

aocache:AOCache 新增功能深度解析:从性能监控到灵活配置的全方位升级

最近对aocache 进行了重要升级&#xff0c;最新版本0.6.0增加了几项新功能&#xff1a;性能分析日志&#xff0c;AOCache性能分析工具&#xff0c;切入点自定义配置&#xff0c;全局配置&#xff0c;本文详细说明这几项目新功能的作用和使用方式。 一、性能分析日志 需求背景…...

IsaacLab最新2025教程(7)-引入IK solver控制机器人

机器人控制可以直接给定关节角进行驱动实现功能&#xff0c;完成任务&#xff0c;但是关节角不是很直观而且做teleoperation或者是结合VLA模型时候&#xff0c;用eef pose会更符合直觉一些&#xff0c;isaacsim用的是LulaKinematics&#xff0c;因为IsaacLab现在是ETHZ的团队在…...

【测试】每日3道面试题 3/30

每日更新&#xff0c;建议关注收藏点赞。 白盒测试逻辑覆盖标准&#xff1f;哪种覆盖标准覆盖率最高&#xff1f; 5种。语句覆盖、分支/判定覆盖、条件覆盖、条件组合覆盖【覆盖率最高&#xff0c;所有可能条件组合都验证】、路径覆盖【理论上最高&#xff0c;但实际很难实现】…...

矩阵中对角线的遍历问题【C++】

1&#xff0c;按对角线进行矩阵排序 题目链接&#xff1a;3446. 按对角线进行矩阵排序 - 力扣&#xff08;LeetCode&#xff09; 【题目描述】 对于一个m*n的矩阵grid&#xff0c;要求对该矩阵进行 变换&#xff0c;使得变换后的矩阵满足&#xff1a; 主对角线右上的所有对角…...

自动化与智能化的认知差异

从认知心理学的角度对自动化和智能化进行了区分&#xff0c;我们可以从同化、顺应、平衡、图式方面来理解&#xff1a;一、自动化与图式及同化&#xff08;1&#xff09;图式是认知心理学中的一个重要概念&#xff0c;指个体对世界的知觉经验和理解方式&#xff0c;是个体过去经…...

leetcode 2360 图中最长的环 题解

题面 给定一个有向图&#xff0c;每个点出度最大为一&#xff0c;现在问你图中最长的环的长度是多少&#xff0c;如果没有环输出 -1&#xff0c; 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105。 题面 解题思路 我们直接说结论&#xff0c;我们从任意一个点出发&#xff0c;用…...

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议&#xff0c;特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况&#xff08;自适应布局/响应式布局&#xff09; 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …...

华宇TAS应用中间件与晓窗科技智慧校园管理一体化平台完成兼容互认证

近日&#xff0c;华宇TAS应用中间件与安徽晓窗教育科技有限公司&#xff08;以下简称晓窗科技&#xff09;的智慧校园管理一体化平台V1.0完成兼容性认证。经双方联合测试&#xff0c;两款产品在稳定性、安全性以及性能等方面表现优异&#xff0c;可以满足政企客户对于数据安全以…...

Java——数组

一、数组是&#xff1f; 数组就是一个容器&#xff0c;用于存储一批同种类型的数据。 数组变量名中存储的是数组在内存中的地址&#xff0c;数组是一种引用数据类型。 二、静态初始化数组 &#xff08;一&#xff09;定义 即定义数组的时候直接给数组赋值。 &#xff08;…...

MySQL排序详解

MySQL支持两种方式排序filesort和indexindex是指扫描索引本身完成排序&#xff0c;index效率高filesort是指通过内存或者排序文件完成排序&#xff0c;filesort效率低 order by满足两种情况时会使用index排序 order by语句使用索引最左列where条件字段和order by字段组合满足索…...

【python实战】-- 选择解压汇总mode进行数据汇总20250329更新

系列文章目录 文章目录 系列文章目录前言一、功能列表二、程序如下&#xff1a;总结 前言 一、功能列表 该模板用于多功能数据汇总处理&#xff1a; 1、用于解压压缩包&#xff0c;输入指定路径&#xff0c;即可解压多级压缩文件&#xff1b; 2、镜筒反射率、LAB文件汇总&…...

Java 程序员面试题:从基础到高阶的深度解析

引言 Java 作为全球最流行的编程语言之一&#xff0c;其面试题不仅考察候选人的编程能力&#xff0c;更关注对底层原理和架构设计的理解。本文将系统梳理 Java 面试中的高频考点&#xff0c;结合代码示例与原理分析&#xff0c;助您从容应对技术面试。 一、Java 基础语法与核…...

JSP(实验):带验证码的用户登录

[实验目的] 1&#xff0e;掌握应用request对象获取表单提交的数据。 2&#xff0e;掌握解决获取表单提交数据产生中文乱码的问题。 3&#xff0e;掌握使用response对象进行定时跳转功能。 4&#xff0e;掌握使用session对象完成登录和注销功能。 [实验要求] 设计带验证码…...

【安全运营】关于攻击面管理相关概念的梳理(二)

CYNC&#xff08;持续可见性和网络控制&#xff09; CYNC&#xff08;Continuous Visibility and Network Control&#xff09;即“持续可见性和网络控制”&#xff0c;是一个与网络安全和IT运营管理相关的概念。它强调的是在一个组织的数字环境中&#xff0c;确保对所有资产、…...

【Linux篇】进程入门指南:操作系统中的第一步

步入进程世界&#xff1a;初学者必懂的操作系统概念 一. 冯诺依曼体系结构1.1 背景与历史1.2 组成部分1.3 意义 二. 进程2.1 进程概念2.1.1 PCB&#xff08;进程控制块&#xff09; 2.2 查看进程2.2.1 使用系统文件查看2.2.2 使⽤top和ps这些⽤⼾级⼯具来获取2.2.3 通过系统调用…...

Linux进程状态补充(10)

文章目录 前言一、阻塞二、挂起三、运行R四、休眠D五、四个重要概念总结 前言 上篇内容大家看的云里雾里&#xff0c;这实在是正常不过&#xff0c;因为例如 写实拷贝 等一些概念的深层原理我还没有讲解&#xff0c;大家不用紧张&#xff0c;我们继续往下学习就行&#xff01;&…...

STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法&#xff1a; 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径&#xff0c;避免占用C盘空间。 Core就是Keil(MDK-ARM)的…...

全自动数字网络机器人:重塑未来的无形引擎 ——从金融量化到万物互联,为何必须“ALL IN”?

全自动数字网络机器人&#xff1a;重塑未来的无形引擎 ——从金融量化到万物互联&#xff0c;为何必须“ALL IN”&#xff1f; &#xff08;2025年3月29日&#xff09; “未来十年&#xff0c;代码将比石油更具价值。” —— DeepSeek创始人梁文锋 一、数据洪流与AI进化&#…...

每日一题之修建灌木

问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修…...

智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…...

ubuntu下终端打不开的排查思路和解决方法

问题现象描述&#xff1a;ubuntu开机后系统桌面显示正常&#xff0c;其他图形化的app也都能打开无异常&#xff0c;唯独只有terminal终端打不开&#xff0c;无论是鼠标点击终端软件&#xff0c;还是ctrlaltt&#xff0c;还是altF2后输入gnome-terminal后按回车&#xff0c;这三…...

鸿蒙项目源码-天气预报app-原创!原创!原创!

鸿蒙天气预报项目源码包运行成功含文档ArkTS语言。 我半个月写的原创作品&#xff0c;请尊重原创。 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作品…...

Turtle事件处理(键盘与鼠标交互)

Turtle 提供了 事件驱动编程,允许我们使用 键盘 和 鼠标 控制 Turtle,从而实现交互式绘图。例如,我们可以让 Turtle 响应 按键、鼠标点击 和 拖动 事件,使其根据用户的输入进行移动、旋转或绘制图形。 1. 事件机制概述 Turtle 的事件处理主要依赖 turtle.Screen() 提供的 …...

算法基础——模拟

目录 1 多项式输出 2.蛇形方阵 3.字符串的展开 模拟&#xff0c;顾名思义&#xff0c;就是题⽬让你做什么你就做什么&#xff0c;考察的是将思路转化成代码的代码能⼒。这类题⼀般较为简单&#xff0c;属于竞赛⾥⾯的签到题&#xff08;但是&#xff0c;万事⽆绝对&#xff…...

惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”

惠普&#xff08;HP&#xff09;和联想&#xff08;Lenovo&#xff09;作为全球两大电脑品牌&#xff0c;并不是简单的“拼接电脑”&#xff0c;它们都有自己的核心技术、专利设计和生态体系。以下是它们“自己的”核心部分&#xff1a; 1. 关键自研技术 品牌自研技术/专利说明…...

一些练习 C 语言的小游戏

一些练习 C 语言的小游戏 — 1. 猜数字游戏 描述&#xff1a;程序随机生成一个数字&#xff0c;玩家需要猜测这个数字&#xff0c;并根据提示&#xff08;太高或太低&#xff09;调整猜测&#xff0c;直到猜中为止。 功能点&#xff1a; 随机数生成 (rand() 函数)。循环和…...

曲线拟合 | Matlab基于贝叶斯多项式的曲线拟合

效果一览 代码功能 代码功能简述 目标&#xff1a;实现贝叶斯多项式曲线拟合&#xff0c;动态展示随着数据点逐步增加&#xff0c;模型后验分布的更新过程。 核心步骤&#xff1a; 数据生成&#xff1a;在区间[0,1]生成带噪声的正弦曲线作为训练数据。 参数设置&#xff1a…...

Python 序列构成的数组(对序列使用+和_)

对序列使用和* Python 程序员会默认序列是支持 和 * 操作的。通常 号两侧的序列由 相同类型的数据所构成&#xff0c;在拼接的过程中&#xff0c;两个被操作的序列都不会被 修改&#xff0c;Python 会新建一个包含同样类型数据的序列来作为拼接的结果。 如果想要把一个序列…...

洛谷题单1-P5703 【深基2.例5】苹果采购-python-流程图重构

题目描述 现在需要采购一些苹果&#xff0c;每名同学都可以分到固定数量的苹果&#xff0c;并且已经知道了同学的数量&#xff0c;请问需要采购多少个苹果&#xff1f; 输入格式 输入两个不超过 1 0 9 10^9 109 正整数&#xff0c;分别表示每人分到的数量和同学的人数。 输…...

计算机网络 用deepseek帮助整理的复习资料(一)

### 计算机网络基础知识整理 --- #### **一、网络类型** 1. **局域网 (LAN)** - **定义**&#xff1a;覆盖小范围&#xff08;如家庭、教室、公司&#xff09;。 - **特点**&#xff1a;高带宽、低延迟&#xff0c;设备通过交换机互联。 - **示例**&#xff1…...

虚拟电商-话费充值业务(二)话费充值对接供应商模块开发

一、对接供应商模块开发 供应商对接模块chongba_recharge_supplier主要负责的就是调用外部的供应商系统进行充值下单&#xff0c;这种调用是一种基于HTTP协议的调用。 此外在供应商对接模块中主要是实现的业务逻辑有&#xff1a; 1&#xff1a;余额或押金不足情况下的失败轮…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例3,TableView16_03 拖拽视觉反馈示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例3,TableView16_03 拖…...

游戏引擎学习第186天

回顾并规划今天的任务 现在&#xff0c;我们站在了一个关键的时刻&#xff0c;准备突破&#xff0c;拥有一些优秀的性能分析代码。从目前来看&#xff0c;我们已经能够看到时间的消耗情况&#xff0c;我对这一点感到非常兴奋。昨天的直播中我们勉强让一些东西工作了&#xff0…...

树的基础_遍历(蓝桥云课)

一些树上问题&#xff1a; 树的直径&#xff1a; import java.util.*;public class TreeDiameter {static List<List<Integer>> tree; // 用邻接表存储树结构static int[] depth; // 记录每个节点的深度public static void main(String[] args) {S…...

29_项目

目录 http.js 1、先注册账号 register.html 2、再登录 login.html 3、首页 index.html 4 详情 details.html cart.html css index.css register.css details.css 演示 进阶 http.js let baseURL "http://localhost:8888"; let resgiterApi baseURL &…...

vue搭建一个树形菜单项目

首先搭建项目需要先通过步骤搭建一个vue的项目&#xff0c;然后创建一个component文件&#xff0c;里面新建一个index.vue页面来。 这是引入的element-ui组件库里的组件&#xff0c;来实现我的路由&#xff0c;渲染的是我存储的动态路由&#xff0c;所以需要先安装并且引用。 …...

Python包管理完全指南:pip常用命令与最佳实践

一、pip核心功能解析 作为Python官方推荐的包管理工具&#xff0c;pip承担着以下关键职责&#xff1a; 从PyPI&#xff08;Python Package Index&#xff09;仓库安装/卸载第三方库管理项目依赖关系和版本控制支持本地/私有仓库的包安装维护虚拟环境中的包隔离 二、20个必知…...

Eigen 3

本文来源&#xff1a;腾讯元宝 Eigen 3 是一个专注于线性代数运算的高性能 ​C 模板库&#xff0c;广泛应用于科学计算、机器学习、计算机视觉等领域。以下是其核心特性与功能的综合介绍&#xff1a; 1. ​核心定义与设计理念 ​纯头文件库&#xff1a;Eigen 3 无需编译或链接…...