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

前端如何优雅地对接后端

作为一名前端开发者,与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现,前端需要的不只是调用接口的代码,更是一种协作的艺术。本文将从Vue
3项目出发,分享如何与后端高效协作,减少联调中的“摩擦”,并通过代码示例和实战经验,让你的对接过程更顺畅。

一、理解API设计:站在后端视角看前端需求

在对接后端之前,理解API设计是第一步。一个好的API设计能减少沟通成本,而前端需要主动参与到设计讨论中,而不是被动接受。

1. 熟悉常见API规范

  • RESTful API:基于资源的设计,遵循GET、POST、PUT、DELETE等方法。例如,获取用户列表可能是GET /api/users,创建用户是POST /api/users
  • GraphQL:更灵活的查询方式,适合复杂数据结构。前端可以精确指定所需字段,减少过量数据传输。
  • 约定优先:与后端约定URL命名(如小写、连字符)、状态码(如200成功,400客户端错误)和分页参数(如pagesize)。

实战建议:在项目初期,主动与后端沟通API契约,推荐使用OpenAPI(如Swagger)或Postman生成文档,确保双方对接口定义达成共识。

2. 前端如何提出需求

  • 明确数据结构:告诉后端你需要的数据字段。例如,用户信息接口是否需要avatar字段?是否需要嵌套的roles数组?
  • 考虑边界情况:如空数据、超大数据量、权限限制等,提前与后端约定返回格式。
  • 关注性能:对于列表接口,建议后端支持分页或过滤,减少前端渲染压力。

生活感悟:就像点菜前先看菜单,与后端的对接需要先“对齐预期”。我曾因为没提前确认分页参数,导致前端渲染卡顿,熬夜改代码的教训让我学会了主动沟通。

二、封装请求:让API调用更优雅

在Vue 3项目中,统一的请求封装能提高代码可维护性,减少重复工作。以下是一个基于Axios的封装方案,适用于大多数前端项目。

1. 为什么选择Axios?

  • 支持拦截器,方便统一处理请求和响应。
  • 自动处理JSON数据,简化开发。
  • 支持TypeScript,类型安全更友好。

2. 封装Axios实例

以下是一个简单的Axios封装示例,包含请求拦截、响应拦截和错误处理。

// src/utils/request.js
import axios from 'axios';
import { ElMessage } from 'element-plus';// 创建Axios实例
const instance = axios.create({baseURL: '/api', // 后端API基础路径timeout: 10000, // 请求超时时间
});// 请求拦截器
instance.interceptors.request.use((config) => {// 添加tokenconst token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;},(error) => Promise.reject(error)
);// 响应拦截器
instance.interceptors.response.use((response) => {// 假设后端返回格式为 { code: number, data: any, message: string }const { code, data, message } = response.data;if (code === 200) {return data; // 返回数据} else {ElMessage.error(message || '请求失败');return Promise.reject(new Error(message));}},(error) => {// 统一处理HTTP错误if (error.response) {const { status } = error.response;if (status === 401) {ElMessage.error('登录过期,请重新登录');// 跳转到登录页window.location.href = '/login';} else if (status === 500) {ElMessage.error('服务器错误,请稍后重试');}} else {ElMessage.error('网络异常,请检查网络');}return Promise.reject(error);}
);// 封装GET和POST方法
export const get = (url, params = {}) => instance.get(url, { params });
export const post = (url, data = {}) => instance.post(url, data);export default instance;

3. 在Vue 3中使用

// src/views/UserList.vue
import { get, post } from '@/utils/request';
import { ref } from 'vue';export default {setup() {const users = ref([]);const fetchUsers = async () => {try {const data = await get('/users', { page: 1, size: 10 });users.value = data.list;} catch (error) {console.error('获取用户列表失败:', error);}};const createUser = async (userData) => {try {await post('/users', userData);ElMessage.success('创建用户成功');fetchUsers(); // 刷新列表} catch (error) {console.error('创建用户失败:', error);}};fetchUsers(); // 初始化加载return { users, createUser };},
};

亮点

  • 请求拦截器统一添加token,简化认证逻辑。
  • 响应拦截器统一处理错误,减少组件中的重复代码。
  • 使用TypeScript可进一步定义接口类型,如interface User { id: number; name: string },提升类型安全。

三、错误处理:从容应对异常情况

错误处理是优雅对接的关键。以下是几种常见场景的处理策略。

1. HTTP状态码处理

  • 401 Unauthorized:跳转登录页,清空本地token。
  • 403 Forbidden:提示用户无权限,引导联系管理员。
  • 500 Internal Server Error:显示通用错误提示,建议稍后重试。

2. 业务错误处理

后端通常会返回业务状态码(如code: 1001表示用户不存在)。前端需要根据message字段显示友好提示。例如:

if (response.data.code === 1001) {ElMessage.warning('用户不存在,请检查输入');
}

3. 网络异常与降级

  • 网络断开:提示用户检查网络,可使用navigator.onLine检测。
  • 接口超时:设置合理的timeout(如10秒),超时后显示提示。
  • 降级方案:对于非关键接口(如推荐内容),可使用缓存数据或默认值。

实战案例:在一次项目中,后端接口偶发性超时,我通过在前端添加重试逻辑(最多重试3次,每次间隔1秒)解决了问题:

const retryRequest = async (fn, retries = 3, delay = 1000) => {for (let i = 0; i < retries; i++) {try {return await fn();} catch (error) {if (i < retries - 1) {await new Promise((resolve) => setTimeout(resolve, delay));continue;}throw error;}}
};// 使用
const fetchUsersWithRetry = () => retryRequest(() => get('/users'));

四、前后端协作的软技能

技术之外,协作能力同样重要。以下是几点经验:

  1. 主动沟通:在API文档不完善时,主动找后端确认细节,避免假设。
  2. Mock数据:在后端开发未完成时,使用Mock.js或Vite的mock插件模拟接口,保持开发进度。
  3. 反馈闭环:发现接口问题(如返回数据不一致),及时反馈并记录,避免重复踩坑。
  4. 换位思考:理解后端的实现难度(如数据库查询优化),提出合理需求。

生活感悟:有次联调时,后端同事加班改了一个紧急bug,我送了杯咖啡表示感谢,结果后续协作顺畅了许多。小小的善意,能让技术对接更有温度。

五、总结

优雅地对接后端,不仅需要扎实的技术能力,还需要良好的沟通和协作。从理解API设计到封装请求,再到错误处理,前端开发者可以通过规范化的流程和工具减少对接中的“摩擦”。希望这篇文章能为你的项目带来启发,让你与后端的每一次联调都更顺畅。

最后寄语:技术对接如生活,偶尔有“bug”,但只要用心沟通,总能找到解决之道。愿我们都能在代码与协作中,找到属于自己的节奏!

相关推荐

想深入学习Vue 3和前端开发?以下是几篇值得一读的文章:

Vue 3 中的新特性:Suspense和Teleport

从初级到高级前端:如何写出高质量代码,迈向职业新高度

从零打造一个Vue 3组件库:开发、打包与发布到NPM

相关文章:

前端如何优雅地对接后端

作为一名前端开发者&#xff0c;与后端对接是我们日常工作中不可避免的一部分。从API设计的理解到错误处理的优雅实现&#xff0c;前端需要的不只是调用接口的代码&#xff0c;更是一种协作的艺术。本文将从Vue 3项目出发&#xff0c;分享如何与后端高效协作&#xff0c;减少联…...

Centos虚拟机远程连接缓慢

文章目录 Centos虚拟机远程连接缓慢1. 问题&#xff1a;SSH远程连接卡顿现象2. 原因&#xff1a;SSH服务端DNS检测机制3. 解决方案&#xff1a;禁用DNS检测与性能调优3.1 核心修复步骤3.2 辅助优化措施 4. 扩展认识&#xff1a;SSH协议的核心机制4.1 SSH工作原理4.2 关键配置文…...

Centos 、Linux 基础运维命令

查看系统IP ifconfig 巡检常用 显示磁盘空间使用情况 df -h 配置主机名查称看主机名称 hostname 修改主机名称 打开修改的配置文件 vim /etc/sysconfig/network 防火墙 查看防火墙状态 service iptables status 临时关闭防火墙&#xff1a;关机重启后防火墙还会开启 …...

算力网络有关论文自用笔记(2)

MADRLOM: A Computation offloading mechanism for software-defined cloud-edge computing power network 本质上还是计算卸载&#xff0c;概念套壳 主要工作 一种由软件定义的云边缘计算电力网络体系结构&#xff0c;包括多个用户设备、多个边缘节点和一个云数据中心。用户…...

基于外部中中断机制,实现以下功能: 1.按键1,按下和释放后,点亮LED 2.按键2,按下和释放后,熄灭LED 3.按键3,按下和释放后,使得LED闪烁

题目&#xff1a; 参照外部中断的原理和代码示例,再结合之前已经实现的按键切换LED状态的实验&#xff0c;用外部中断改进其实现。 请自行参考文档《中断》当中&#xff0c;有关按键切换LED状态的内容, 自行连接电路图&#xff0c;基于外部中断机制&#xff0c;实现以下功能&am…...

Go语言和Python 3的协程对比

Go语言和Python 3都支持协程&#xff08;concurrent coroutines&#xff09;&#xff0c;但它们的实现机制、使用方式、调度方式和性能表现差异很大。下面是对比分析&#xff1a; 一、基本概念对比 特性Go 协程&#xff08;goroutine&#xff09;Python3 协程&#xff08;asyn…...

量子计算在密码学中的应用与挑战:重塑信息安全的未来

在当今数字化时代&#xff0c;信息安全已成为全球关注的焦点。随着量子计算技术的飞速发展&#xff0c;密码学领域正面临着前所未有的机遇与挑战。量子计算的强大计算能力为密码学带来了新的应用场景&#xff0c;同时也对传统密码体系构成了潜在威胁。本文将深入探讨量子计算在…...

java知识点

一、ArrayList 的扩容 1.ArrayList 的扩容机制是将新容量计算为原容量的 15倍&#xff0c;即 oldcapacity(oldcapacity >>1)。这个操作将新容量设置为当前容量的 1.5 倍。 2.在 ArrayList 扩容时&#xff0c;会使用 Arrays.copyof()方法来复制原数组中的元素到新数组中&a…...

工厂模式:工厂方法模式 和 抽象工厂模式

工厂方法模式&#xff1a;优化&#xff0c;工厂类也分子类和父类 流程&#xff1a; 实例&#xff1a; #include <iostream> using namespace std; /*抽象产品类 TV(电视机类)*/ class TV { public: virtual void Show() 0; virtual ~TV();//声明析构函数为虚函数&…...

遨游通讯发布国产化旗舰三防手机AORO AU1:以自主可控重塑工业安全

在全球产业链加速重构的背景下&#xff0c;国产化技术突破已成为工业领域高质量发展的核心驱动力。作为专精特新中小企业&#xff0c;遨游通讯始终以“让世界更安全、更高效、更简单”为使命&#xff0c;深耕“危、急、特”场景智能通信设备的研发。近日&#xff0c;遨游通讯正…...

全波暗室和半波暗室的区别

什么是微波暗室&#xff1f;其作用是什么&#xff1a; 微波暗室又叫吸波室、电波暗室&#xff0c;一般是指由吸波材料和金属屏蔽体组成的特殊房间&#xff0c;该房间可有效防止电磁波的多次反射、隔绝外界电磁波的干扰&#xff0c;提供一个稳定的电磁环境&#xff0c;(高级点的…...

Qt 下载的地址集合

Qt 下载离线安装包 download.qt.io/archive/qt/5.14/5.14.2/ Qt 6 安装下载在线安装包 Index of /qt/official_releases/online_installers/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...

08_Docker Portainer可视化管理

简介&#xff1a; Portainer 是一个轻量级的、基于 Web 的 Docker 管理用户界面。它允许用户轻松管理 Docker 环境&#xff0c;包括 Docker 主机、容器、镜像、网络等。 多主机管理&#xff0c;Portainer 支持通过 agent 的方式管理多台 Docker 主机。无论是企业级大规模的 D…...

【产品经理从0到1】用户研究和需求分析

用户角色 定义 用户角色 user personal&#xff0c;从用户群体中抽象出来的典型用户&#xff0c;一般 会包含&#xff1a; 1、个人基本信息&#xff1b; 2、家庭、工作、生活环境描述&#xff1b; 3、与产品使用相关的具体情境&#xff0c;用户目标或产品使用行为描述等。 特…...

神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)

引言 在神经网络的发展历程中&#xff0c;梯度消失和梯度爆炸如同两座难以翻越的大山&#xff0c;阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时&#xff0c;这两个问题可能导致模型训练陷入困境&#xff0c;无法达到预期的效果。本文将深入探讨梯度消失和梯度…...

深入理解无监督学习:探索数据的潜在结构

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Java实例化对象都有几种方式

在 Java 中&#xff0c;实例化对象的方式有多种&#xff0c;具体取决于场景需求和设计模式。以下是 ​7 种核心对象实例化方式及其原理、适用场景与代码示例&#xff1a; 1. ​new 关键字&#xff08;直接构造&#xff09;​ ​原理​&#xff1a;通过调用类的构造函数直接创建…...

数据结构:顺序表的实现

顺序表是用一段物理地址连续的存储单元依次储存数据的线性结构&#xff0c;一般情况下采用数组储存&#xff0c;在数组上完成数据的增删减改。 这里我们定义一个MyArrayList类&#xff0c;用来实现顺序表的功能&#xff1a; public class MyArrayList{int[] array;int usedsi…...

# 06_Elastic Stack 从入门到实践(六)

06_Elastic Stack 从入门到实践(六) 一、课程介绍 1、课程介绍 2、Nginx日志分析系统 3、Filebeat入门学习 4、Metricbeat入门学习 5、Kibana入门学习 6、Logstash入门学习 7、综合练习 二、Nginx 日志分析系统需求分析 1、业务需求 Nginx是一款非常优秀的web服务…...

[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析

拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学&#xff0c;一般又称河马爱学教育平台app,河马爱学。 关于学习&#xff0c;你可能也需要一个“豆包爱学”这样的AI伙伴&#xff0c;它将为你提供全方位的学习帮助…...

重装系统后的自用包

装驱动 sudo apt update sudo apt upgrade sudo apt install nvidia-driver-535搜狗输入法&#xff1a; https://shurufa.sogou.com/linux/guideClash verge&#xff1a; ubuntu20 下载1.7.7版本的 https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v1.7.7…...

4.22tx视频后台开发一面

总时长大概在一个小时&#xff0c;主要提问C、操作系统、计网以及数据库等方面&#xff0c;最后两个算法编程题。 一上来先介绍项目 Linux下的mybash命令处理器和内存池 mybash可以再总结归纳一下&#xff0c;一上来有点紧张没有条理 内存池是用边界标识法写的&#xff0c;…...

如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程

以下是在本地部署运行 ORB-SLAM3 的详细步骤&#xff0c;基于官方 README.md 和最佳实践整理&#xff0c;适用于 Ubuntu 16.04/18.04/20.04/22.04 系统&#xff1a; 一、系统要求与依赖项安装 1. 基础系统要求 操作系统&#xff1a;Ubuntu 16.04/18.04/20.04/22.04&#xff…...

Ubuntu 上安装 Conda

在 Ubuntu 上安装 Conda&#xff08;Anaconda 或 Miniconda&#xff09;的完整步骤如下&#xff1a; --- **方法1&#xff1a;安装 Miniconda&#xff08;推荐&#xff09;** Miniconda 是 Anaconda 的精简版&#xff0c;只包含基本组件。 **1. 下载安装脚本** bash # 下载最…...

初级云计算运维工程师学习二

全面解析云计算服务模式&#xff1a;公有云、私有云、混合云及IaaS/PaaS/SaaS/DaaS 云计算部署模式&#xff1a;三种主要形式 1. 公有云&#xff08;Public Cloud&#xff09; 定义&#xff1a;云端资源开放给社会公众使用&#xff0c;由第三方云服务提供商通过互联网交付。 …...

物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键

在当今数字化时代&#xff0c;物联网&#xff08;IoT&#xff09;正以前所未有的速度蓬勃发展&#xff0c;其影响力已广泛渗透到各个领域&#xff0c;楼宇自控技术便是其中之一。从本质上讲&#xff0c;楼宇自控旨在实现对建筑物内各类机电设备的智能化管理与控制&#xff0c;为…...

数字孪生技术:企业数字化转型的助推器

在当今环境下&#xff0c;企业面临的挑战不断增加。从可持续发展目标的要求到员工数字技能的提升&#xff0c;转型的呼声越来越高。然而&#xff0c;即使是经验丰富的领导者&#xff0c;也很难在这种前所未有的商业环境下实现转型。企业如何在满足可持续发展目标的同时保持盈利…...

ESM 内功心法:化解 require 中的夺命一击!

前言 传闻在JavaScript与TypeScript武林中,曾有两大绝世心法:CommonJS与ESM。两派高手比肩而立,各自称霸一方,江湖一度风平浪静。 岂料,时局突变。ESM逐步修成阳春白雪之姿,登堂入室,成为主流正统。CommonJS则渐入下风,功力不济,逐渐退出主舞台。 话说某日,一位前…...

安全调度系统:安全管理的智能中枢

安全调度系统作为安全管理体系的核心枢纽&#xff0c;正在深刻改变着传统安全管理的模式和效能。这个集成了先进信息技术的智能化平台&#xff0c;通过实时监控、智能分析和快速响应三大核心功能&#xff0c;构建起全方位、多层次的安全防护网络&#xff0c;成为各类场所安全管…...

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...

jsconfig.json文件的作用

jsconfig.json文件的作用 ​ 为什么今天会谈到这个呢&#xff1f;有这么一个场景&#xff1a;我们每次开发项目时都会给路径配置别名&#xff0c;配完别名之后可以简化我们的开发&#xff0c;但是随之而来的就有一个问题&#xff0c;一般来说&#xff0c;当我们使用相对路径时…...

Python线程全面详解:从基础概念到高级应用

一、线程基础概念 1.1 进程与线程的关系 进程是操作系统资源分配的基本单位&#xff0c;它是程序的一次执行过程。当我们将程序加载到内存中运行时&#xff0c;系统会为它分配CPU、内存、文件句柄等资源&#xff0c;这时就形成了一个进程。 线程是CPU调度的基本单位&#xf…...

学习模拟电路

学习模拟电路需要掌握以下几个关键领域的知识和技能&#xff0c;涵盖基础理论、器件特性、电路设计、分析工具以及实践应用&#xff1a; 1. 基础理论与概念 电路基本定律&#xff1a;欧姆定律、基尔霍夫电压定律&#xff08;KVL&#xff09;和电流定律&#xff08;KCL&#xf…...

解码思维链:AI思维链如何重塑人类与机器的对话逻辑

第一章&#xff1a;思维链的诞生与进化 1.1 从"猜谜游戏"到"推理革命" 传统AI模型如同蒙眼解题的考生&#xff1a;当被问及"玛丽有12块饼干&#xff0c;吃掉4块后剩下多少"&#xff0c;它们擅长预测答案&#xff0c;却无法展示"12-48&quo…...

css3新特性第六章(2D变换)

css3新特性第五章(2D变换) CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。 2D位移2D缩放2D旋转2D扭曲多重变换变换原点 一、2D位移 2D 位移可以改变元素的位置&#xff0c;具体使用方式如下&#xff1a; 先给元素添加 转换属性 transform 编写 transform 的具体值&…...

L2-2、示范教学与角色扮演:激发模型“模仿力“与“人格“

一、Few-shot 教学的核心原理与优势 在与大语言模型交互时&#xff0c;Few-shot&#xff08;少样本&#xff09;教学是一种强大的提示技术。其核心原理是通过提供少量示例&#xff0c;引导模型理解我们期望的输出格式和内容风格。 Few-shot 教学的主要优势包括&#xff1a; …...

MAC系统下完全卸载Android Studio

删除以下文件 /Applications/Android Studio.app /Users/用户名/Library/Application Support/Google/AndroidStudio2024.2 /Users/用户名/Library/Google/AndroidStudio /Users/用户名/Library/Preferences/com.google.android.studio.plist /Users/用户名/Library/Cache…...

rgw的d3n功能配置

背景 最近在看缓存相关&#xff0c;文件系统可以通过fscache加速&#xff0c;加速的效果就是读取的时候能够缓存&#xff0c;原理是在网关的地方加入一个高速缓存盘&#xff0c;这样在后续读取的时候&#xff0c;能够直接从缓存盘读取&#xff0c;这样能够减少与集群的交互&am…...

this._uid:Vue 内部为每个组件实例分配的唯一 ID

Vue 提供了一些方法可以帮助你区分组件实例&#xff0c;例如通过 this._uid&#xff08;Vue 内部为每个组件实例分配的唯一 ID&#xff09;或自定义标识符。 以下是具体的实现步骤和代码示例&#xff1a; console.log("当前组件实例ID:", this._uid, "时间戳:&…...

使用Python设置excel单元格的字体(font值)

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;设置单元格的字体&#xff0c;也就是font值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…...

【深度学习】#8 循环神经网络

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 为了进一步提高长线学习的效率&#xff0c;该系列从本章开始将舍弃原始教材的代码部分&#xff0c;专注于理论和思维的提炼&#xff0c;系列名也改为“深度学习…...

三角形神经网络(TNN)

三角形神经网络&#xff08;TNN&#xff09;是一种新兴的神经网络架构&#xff0c;不过目前它并非像 CNN、RNN 等传统网络那样被广泛研究和应用&#xff0c;以下为你解释其原理并结合例子说明&#xff1a; 原理 基本结构 三角形神经网络的核心思想是构建一种类似三角形的层次…...

【JavaEE】-- MyBatis操作数据库(1)

文章目录 1. 什么是MyBatis2 MyBatis入门2.1 准备工作2.1.1 创建工程 2.2 配置数据库连接字符串2.3 写持久层代码2.4 单元测试 3. MyBatis的基础操作3.1 打印日志3.2 参数传递3.3 增&#xff08;insert&#xff09;3.3.1 返回主键 3.4 删&#xff08;delete&#xff09;3.5 改&…...

人工智能大模型备案与服务登记:监管体系的双轨逻辑与实操指南

一、核心差异&#xff1a;监管框架的分层设计 适用范围的本质分野 大模型备案&#xff1a;针对直接向公众提供生成式服务的自研或微调模型&#xff08;如 ChatGPT 类产品&#xff09;&#xff0c;要求模型具备舆论属性或社会动员能力。典型场景包括智能客服、内容创作平台等。大…...

衡石ChatBI:依托开放架构构建技术驱动的差异化数据服务

在当今数字化浪潮中&#xff0c;企业对数据价值的挖掘和利用需求日益增长。BI&#xff08;商业智能&#xff09;工具作为企业获取数据洞察的关键手段&#xff0c;其技术架构的创新与发展至关重要。衡石科技的Chat BI凭借其独特的开放架构&#xff0c;在BI领域脱颖而出&#xff…...

AOSP Android14 Launcher3——RecentsView最近任务数据加载

最近任务是Launcher中的一个重要的功能&#xff0c;显示用户最近使用的应用&#xff0c;并可以快速切换到其中的应用&#xff1b;用户可以通过底部上滑停顿进入最近任务&#xff0c;也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过&#xff0c;本文就不…...

分析型数据库与事务型数据库?核心差异与选型指南

在当今数据驱动的业务环境中&#xff0c;选择合适的数据库架构已成为企业技术决策的关键。然而&#xff0c;面对事务型数据库和分析型数据库的选择&#xff0c;许多技术团队往往陷入困境&#xff1a;日常运行良好的系统在数据量激增时性能骤降&#xff0c;简单的查询在复杂分析…...

Linux-信号

信号是由用户&#xff0c;系统或者进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。 进程分为前台进程和后台进程&#xff0c;对于前台进程我们可以输入特殊的终端字符来给它发送信号&#xff0c;比如输入Ctrlc&#xff0c;发送一个中断信号 系…...

Oracle数据库学习之路-目录

Oracle数据库学习之路 一、安装 &#xff08;一&#xff09;数据库安装步骤详解 &#xff08;二&#xff09;开发工具安装与配置 二、基础语法篇 &#xff08;一&#xff09;基础 SQL 语法详解 &#xff08;二&#xff09;SQL 语法练习与案例分析 三、高级语法篇 &…...

用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本

自动化测试任务&#xff1a; 百度搜索自己的姓名。点击第一个链接&#xff08;或者第二个&#xff09;&#xff0c;在新的页面上&#xff0c;添加断言&#xff0c;验证你的名字是否存在。 实验资料百度网盘下载路径&#xff1a; 链接: https://pan.baidu.com/s/1nVlHX_ivres…...