TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
🔄 本文是TTS-Web-Vue系列的最新文章,重点介绍如何在Vue3项目中实现侧边栏与顶部导航栏的双向联动功能。通过Vue3的响应式系统和组件通信机制,我们构建了一套高效、流畅的导航联动方案,让用户在不同入口都能获得一致的导航体验。
🌟 导航联动的价值与必要性
在现代Web应用中,导航系统的一致性和流畅性对用户体验至关重要。TTS-Web-Vue项目中实现侧边栏与顶部导航联动主要基于以下几个考虑:
- 用户体验一致性:无论用户从侧边栏还是顶部导航进入,状态都应保持同步
- 多入口导航便捷性:为用户提供多种导航入口,适应不同使用习惯
- 状态管理清晰性:确保应用在任何时刻只有一个真实的导航状态
- 界面响应及时性:导航变化时相关UI元素能够立即更新,提供即时反馈
- 代码结构可维护性:通过组件化和响应式设计,让导航逻辑易于扩展和维护
本文将详细介绍如何利用Vue3的特性,实现侧边栏和顶部导航的双向联动功能,包括状态同步、事件传递、组件通信等关键技术点。
💡 设计思路与技术选型
整体架构设计
我们的导航联动系统采用了以下核心技术和设计原则:
- 集中状态管理:使用Pinia存储全局导航状态
- 组件通信机制:通过props和events实现组件间的双向数据流
- Vue3响应式系统:利用
ref
、computed
和watch
监听和响应状态变化 - 属性绑定与事件传递:将状态绑定到DOM属性,通过事件触发状态更新
- 响应式更新:确保状态变化时视图自动更新
- 动态组件加载:根据导航状态动态加载对应的内容组件
这种组合方案既保证了导航状态的一致性,又提供了良好的用户体验和代码可维护性。
为什么选择双向联动方案
相比于单向数据流或完全独立的导航组件,双向联动方案具有以下优势:
- 用户体验一致:无论从哪个入口导航,状态都能保持同步
- 减少重复代码:避免在多个组件中重复实现相似的导航逻辑
- 状态管理清晰:有一个统一的状态来源,避免状态不一致问题
- 便于扩展:新增导航入口时只需连接到现有状态,无需重构
- 调试维护简单:导航问题可追溯到单一状态源,减少排查复杂度
🧩 核心组件结构设计
组件层次结构
在TTS-Web-Vue项目中,导航系统涉及以下主要组件:
App.vue # 应用根组件
├── Aside.vue # 侧边栏导航组件
└── Main.vue # 主内容区域└── FixedHeader.vue # 顶部固定导航栏
这种层次结构中,Main.vue
和 Aside.vue
是同级组件,通过Pinia store共享导航状态。而 FixedHeader.vue
是 Main.vue
的子组件,通过props和events与父组件通信。
状态管理设计
我们使用Pinia store来管理导航状态:
// store.js
import { defineStore } from 'pinia';export const useTtsStore = defineStore('tts', {state: () => ({page: {asideIndex: '1', // 当前选中的侧边栏索引tabIndex: '0' // 其他导航状态},// 其他应用状态...}),// actions和getters...
});
这个集中的状态源确保了无论从哪个组件触发导航变化,所有相关组件都能获得一致的状态更新。
🔍 侧边栏组件实现
Aside.vue 组件核心代码
侧边栏组件实现了导航项的展示和点击处理:
<template><div class="modern-aside"><div class="menu-container"><el-menu:default-active="page.asideIndex"class="modern-menu"@select="menuChange"collapse><el-menu-item index="1"><el-tooltip :content="t('aside.text')" placement="right"><el-icon><Document /></el-icon></el-tooltip></el-menu-item><!-- 其他菜单项... --></el-menu></div></div>
</template><script setup>
import { useTtsStore } from '@/store/store';
import { storeToRefs } from "pinia";
import { nextTick } from 'vue';const ttsStore = useTtsStore();
const { page } = storeToRefs(ttsStore);// 菜单点击处理函数
const menuChange = (index) => {// 更新状态console.log('Aside: 菜单切换,当前选择:', index.toString(), '原状态:', page.value.asideIndex);page.value.asideIndex = index.toString();console.log('Aside: 菜单状态已更新为:', page.value.asideIndex);// 确保页面状态已更新nextTick(() => {console.log('Aside: 页面刷新后的菜单状态:', page.value.asideIndex);});
};
</script>
关键点:
- 菜单组件通过
:default-active
绑定当前活动项 @select
事件处理程序更新store中的状态- 使用
storeToRefs
保持状态的响应式 - 添加调试日志跟踪状态变化
🔝 顶部导航栏实现
FixedHeader.vue 组件核心代码
顶部导航栏组件实现了导航项展示和点击处理,同时能响应侧边栏状态变化:
<template><div class="fixed-header"><div class="nav-menu"><div class="nav-item" :class="{ 'active': activeNav === 'tts' }" @click="changeNav('tts')">文字转语音</div><div class="nav-item" :class="{ 'active': activeNav === 'docs' }" @click="changeNav('docs')">文档</div><!-- 其他导航项... --></div></div>
</template><script>
export default {name: 'FixedHeader',props: {// 用于接收当前侧边栏激活的索引asideIndex: {type: String,default: '1'}},emits: ['nav-change'],setup(props, { emit }) {const activeNav = ref('tts');// 点击导航项触发状态更新const changeNav = (nav) => {activeNav.value = nav;emit('nav-change', nav);};// 根据侧边栏索引更新顶部导航状态const updateActiveNav = (asideIndex) => {console.log('FixedHeader: 根据asideIndex更新activeNav:', asideIndex);if (asideIndex === '1') {activeNav.value = 'tts';} else if (asideIndex === '4') {activeNav.value = 'docs';} else if (asideIndex === '5') {activeNav.value = 'subtitle';}console.log('FixedHeader: 更新后的activeNav:', activeNav.value);};// 监听侧边栏状态变化watch(() => props.asideIndex, (newIndex) => {console.log('FixedHeader: 监测到asideIndex变化:', newIndex);updateActiveNav(newIndex);});// 初始化时根据侧边栏状态设置导航状态onMounted(() => {updateActiveNav(props.asideIndex);});return {activeNav,changeNav,updateActiveNav};}
}
</script>
关键点:
- 使用props接收侧边栏状态
- 使用emit向父组件传递导航事件
- 实现updateActiveNav方法映射侧边栏索引到顶部导航状态
- 使用watch监听侧边栏状态变化
- 组件挂载时初始化导航状态
🔄 连接组件实现双向联动
Main.vue中的连接代码
Main组件作为FixedHeader的父组件,负责连接顶部导航与全局状态:
<template><div class="modern-main"><!-- 固定标题栏 --><FixedHeader :asideIndex="page.asideIndex"@nav-change="handleNavChange"/><!-- 内容区域 --><!-- 根据page.asideIndex显示不同内容 --></div>
</template><script setup>
import { useTtsStore } from "@/store/store";
import { storeToRefs } from "pinia";
import FixedHeader from "@/components/header/FixedHeader.vue";// 获取store中的状态
const ttsStore = useTtsStore();
const { page } = storeToRefs(ttsStore);// 处理顶部导航变化
const handleNavChange = (nav) => {console.log("导航更改为:", nav);// 根据顶部导航更新侧边栏选中项if (nav === 'tts') {page.value.asideIndex = '1';console.log('已将侧边栏导航更新为: 1 (文本转语音)');} else if (nav === 'docs') {page.value.asideIndex = '4';console.log('已将侧边栏导航更新为: 4 (文档)');} else if (nav === 'subtitle') {page.value.asideIndex = '5';console.log('已将侧边栏导航更新为: 5 (在线生成字幕)');}
};
</script>
关键点:
- 将store中的asideIndex传递给FixedHeader组件
- 处理FixedHeader的nav-change事件,更新store中的状态
- 状态更新后,关联组件会自动响应变化
导航映射关系
为了确保导航一致性,我们建立了侧边栏索引与顶部导航之间的映射关系:
侧边栏索引 | 顶部导航标识 | 功能描述 |
---|---|---|
1 | tts | 文字转语音 |
2 | batch | 批量处理 |
3 | settings | 配置页面 |
4 | docs | 文档页面 |
5 | subtitle | 在线生成字幕 |
这种映射关系在updateActiveNav方法和handleNavChange方法中实现,确保双向转换的正确性。
🔍 双向数据流的实现细节
从侧边栏到顶部导航的数据流
当用户点击侧边栏菜单时:
Aside.vue
的menuChange
方法被触发- 方法更新
store
中的page.asideIndex
Main.vue
通过storeToRefs
感知到状态变化Main.vue
将更新后的asideIndex
传递给FixedHeader
FixedHeader
的watch
监听到props.asideIndex
变化updateActiveNav
方法更新activeNav
状态- 顶部导航栏根据
activeNav
更新UI显示
这个流程确保了侧边栏选择能够正确反映到顶部导航。
从顶部导航到侧边栏的数据流
当用户点击顶部导航项时:
FixedHeader.vue
的changeNav
方法被触发- 方法更新本地
activeNav
状态并通过emit('nav-change')
向上传递事件 Main.vue
的handleNavChange
方法接收事件handleNavChange
方法更新store
中的page.asideIndex
Aside.vue
通过storeToRefs
感知到状态变化- 侧边栏菜单根据
:default-active="page.asideIndex"
更新选中状态
这个流程确保了顶部导航选择能够正确反映到侧边栏。
完整的双向联动示意图
用户点击侧边栏 → Aside.menuChange → store.page.asideIndex → Main.vue(props) → FixedHeader.watch → FixedHeader.updateActiveNav → 顶部导航UI更新用户点击顶部导航 → FixedHeader.changeNav → emit('nav-change') → Main.handleNavChange → store.page.asideIndex → Aside.vue读取更新 → 侧边栏UI更新
📱 移动端适配
移动端导航体验优化
在移动端设备上,侧边栏和顶部导航的联动需要特别考虑:
// 移动端导航处理
const isMobile = ref(window.innerWidth <= 768);// 在移动端,导航变化后自动收起侧边栏
watch(() => page.value.asideIndex, (newIndex, oldIndex) => {if (isMobile.value && newIndex !== oldIndex) {// 延迟收起侧边栏,让用户看到选中效果setTimeout(() => {hideSidebar();}, 300);}
});// 响应式检测设备类型
onMounted(() => {window.addEventListener('resize', () => {isMobile.value = window.innerWidth <= 768;});
});onUnmounted(() => {window.removeEventListener('resize', () => {});
});
这段代码确保在移动设备上,用户选择导航项后侧边栏会自动收起,提供更好的小屏幕体验。
🔧 调试与故障排除
添加调试日志
为了便于开发和调试,我们在关键位置添加了详细的日志:
// 状态变化日志
watch(() => page.value.asideIndex, (newIndex, oldIndex) => {console.log(`导航状态变化: ${oldIndex} -> ${newIndex}`);console.log('触发组件:', '侧边栏点击' /* 或其他来源 */);console.log('当前状态:', { asideIndex: newIndex, activeNav: activeNav.value });
});// 事件触发日志
const changeNav = (nav) => {console.log(`顶部导航点击: ${nav}`);// 其他逻辑...
};
常见问题与解决方案
-
导航状态不同步
- 问题:点击侧边栏后顶部导航未更新,或反之
- 解决:检查映射逻辑和watch监听是否正确绑定
-
导航映射不正确
- 问题:点击后跳转到错误的页面或高亮错误的导航项
- 解决:检查映射关系表和条件判断语句
-
移动端菜单未自动收起
- 问题:在移动设备上选择导航后侧边栏未收起
- 解决:确保isMobile检测正确并添加延时收起逻辑
-
导航点击无响应
- 问题:点击导航项无任何反应
- 解决:检查事件绑定和处理函数是否正确
📊 性能优化
减少不必要的渲染
为提高导航联动的性能,我们实施了以下优化:
// 使用计算属性避免不必要的渲染
const currentView = computed(() => {// 根据asideIndex返回当前应显示的组件switch (page.value.asideIndex) {case '1': return TextToSpeechView;case '2': return BatchProcessView;case '3': return SettingsView;case '4': return DocumentationView;case '5': return SubtitleGeneratorView;default: return TextToSpeechView;}
});// 使用组件缓存避免重复初始化
<keep-alive><component :is="currentView" />
</keep-alive>
导航状态变化的高效处理
// 使用nextTick优化状态更新
const menuChange = (index) => {// 更新状态page.value.asideIndex = index.toString();// 使用nextTick等待DOM更新完成后执行回调nextTick(() => {// 执行需要在DOM更新后才能进行的操作updateActiveView();});
};
🎭 用户体验增强
导航切换动画
为提升用户体验,我们为导航切换添加了平滑过渡效果:
<template><transition name="fade-slide" mode="out-in"><component :is="currentView" :key="page.asideIndex" /></transition>
</template><style>
.fade-slide-enter-active,
.fade-slide-leave-active {transition: opacity 0.3s, transform 0.3s;
}.fade-slide-enter-from,
.fade-slide-leave-to {opacity: 0;transform: translateY(20px);
}
</style>
视觉反馈优化
为导航项添加明确的视觉反馈:
.nav-item {position: relative;transition: all 0.3s ease;
}.nav-item.active {color: var(--primary-color);font-weight: 600;
}.nav-item.active::after {content: '';position: absolute;bottom: -2px;left: 50%;transform: translateX(-50%);width: 20px;height: 3px;background-color: var(--primary-color);border-radius: 2px;transition: all 0.3s ease;
}.nav-item:hover {color: var(--primary-color);transform: translateY(-1px);
}
📝 总结与拓展
主要成果
通过实现侧边栏与顶部导航的双向联动,我们为TTS-Web-Vue项目带来了以下价值:
- 一致的导航体验:无论用户从侧边栏还是顶部导航进入,状态始终保持同步
- 直观的界面反馈:导航状态变化时提供清晰的视觉反馈
- 可维护的代码结构:通过组件化和集中状态管理简化导航逻辑
- 良好的移动端适配:针对不同设备优化导航交互
- 流畅的过渡动画:提供平滑的页面切换效果
未来可能的拓展方向
- 导航历史记录:支持浏览器前进/后退导航
- 导航状态持久化:记住用户上次访问的页面
- 权限控制导航:根据用户权限动态调整可见导航项
- 导航深度链接:支持直接链接到应用的特定页面
- 路由系统整合:与Vue Router深度集成,提供更完善的路由能力
🔗 相关链接
- TTS-Web-Vue项目主页
- 在线演示
- Vue3官方文档
- Pinia状态管理
- Element Plus UI库
注意:本文介绍的功能仅供学习和个人使用,请勿用于商业用途。如有问题或建议,欢迎在评论区讨论!
相关文章:
TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
🔄 本文是TTS-Web-Vue系列的最新文章,重点介绍如何在Vue3项目中实现侧边栏与顶部导航栏的双向联动功能。通过Vue3的响应式系统和组件通信机制,我们构建了一套高效、流畅的导航联动方案,让用户在不同入口都能获得一致的导航体验。 …...
【C++】模板(初阶)
一、模板与泛型编程 我们先来思考一下:如何实现一个通用的交换函数? void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp left;left right;right te…...
大模型微调实战:基于GpuGeek平台的低成本高效训练方案
文章目录 引言一、GpuGeek平台使用入门1. 注册与账号设置2. 控制台功能概览3. 快速创建GPU实例3. 预置镜像与自定义环境 二、GpuGeek平台核心优势解析1. 显卡资源充足:多卡并行加速训练2. 镜像超多:开箱即用的开发环境3. 计费灵活:按需付费降…...
黑马k8s(六)
1.Deployment(Pod控制器) Selector runnginx 标签选择:会找pod打的标签 执行删除之后,pod也会删除,Terminating正在删除 如果想要访问其中的一个pod借助:IP地址端口号访问 假设在某一个瞬间,…...
WEB安全--Java安全--CC1利用链
一、梳理基本逻辑 WEB后端JVM通过readObject()的反序列化方式接收用户输入的数据 用户编写恶意代码并将其序列化为原始数据流 WEB后端JVM接收到序列化后恶意的原始数据并进行反序列化 当调用: ObjectInputStream.readObject() JVM 内部逻辑: → 反…...
16S18S_OTU分析(3)
OTU的定义 OTU:操作分类单元是在系统发生学研究或群体遗传学研究中,为了便于进行分析,人为给某一个分类单元(如品系、种、属、分组等)设置的同一标志。目的:OTU用于将相似的序列归为一类,以便于…...
嵌入式开发学习日志(数据结构--单链表)Day20
一、gdb调试 (一)一般调试步骤与命令 1、gcc -g (调试版本,内含调试信息与源码;eg:gcc -g main.c linklist.c) 2、gdb a.out(调试可执行文件,eg:gdb …...
nginx报错-[emerg] getpwnam(“nginx“) failed in /etc/nginx/nginx.conf:2
报错 - nginx: [emerg] getpwnam(“nginx”) failed in /etc/nginx/nginx.conf:2 问题描述: nginx: [emerg] getpwnam(“nginx”) failed in /etc/nginx/nginx.conf:2 问题原因: 是因为配制文件中使用的启动账户在系统中并没有找到 解决方法&#x…...
Linux系统编程——fork函数的使用方法
在 Linux 系统编程 中,fork() 函数是创建新进程的关键系统调用。fork() 在当前进程(父进程)中创建一个几乎完全相同的子进程。子进程和父进程从调用 fork() 的位置继续执行,但它们是两个独立的进程,每个进程都有自己的…...
Linux进程信号处理(26)
文章目录 前言一、信号的处理时机处理情况“合适”的时机 二、用户态与内核态概念重谈进程地址空间信号的处理过程 三、信号的捕捉内核如何实现信号的捕捉?sigaction 四、信号部分小结五、可重入函数六、volatile七、SIGCHLD 信号总结 前言 这篇就是我们关于信号的最…...
黑马Java跟学.最新AI+若依框架项目开发(一)
黑马Java跟学.最新AI若依框架项目开发.一 前瞻为什么学习若依?AI局限性若依是什么?创新项目开发新方案课程安排前置知识 一、若依搭建若依版本官方非官方 RuoYi-Vue运行后端项目初始化项目Git下载Maven构建 MySQL相关导入sql配置信息 Redis相关启动配置信息 项目运…...
【自学30天掌握AI开发】第1天 - 人工智能与大语言模型基础
自学30天掌握AI开发 - 第1天 📆 日期和主题 日期:第1天 主题:人工智能与大语言模型基础 🎯 学习目标 了解人工智能的发展历史和基本概念掌握大语言模型的基本原理和工作机制区分不同类型的AI模型及其特点理解AI在当前社会中的…...
(十六)Java String类全面解析
一、String类概述 1.1 String的本质 在Java中,String类可能是使用最频繁的类之一,但它也是最容易被误解的类之一。从本质上讲,String代表的是一个不可变的Unicode字符序列。这种不可变性(immutability)是String类设计的核心特性。 java S…...
Android架构之自定义native进程
在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...
#跟着若城学鸿蒙# HarmonyOS NEXT学习之AlphabetIndexer组件详解
一、组件介绍 AlphabetIndexer(字母索引条)是HarmonyOS NEXT中一个非常实用的UI组件,它主要用于在列表视图中提供快速的字母导航功能。当应用中有大量按字母顺序排列的数据(如联系人列表、城市列表等)时,A…...
React百日学习计划——Deepseek版
阶段一:基础巩固(1-20天) 目标:掌握HTML/CSS/JavaScript核心语法和开发环境搭建。 每日学习内容: HTML/CSS(1-10天) 标签语义化、盒模型、Flex布局、Grid布局、响应式设计(媒体查询…...
Room持久化库:从零到一的全面解析与实战
简介 在Android开发中,Room作为官方推荐的数据库持久化库,提供了对SQLite的抽象层,使得数据库操作更加安全、高效且易于维护。 Room通过注解处理器和编译时验证,显著降低了数据库操作的复杂度,同时支持响应式编程模式,使开发者能够轻松实现数据变化的实时监听。对于企业…...
Linux云计算训练营笔记day07(MySQL数据库)
数据库 DataBase 保存数据的仓库 数据库管理系统 DBMS 这是一个可以独立运行,用于维护磁盘上的数据的一套软件 特点: 维护性高,灵活度高,效率高,可扩展性强 常见的DBMS Mysql Mariadb Oracle DB2 SQLServer MySQL是一个关系型…...
C语言之旅5---分支与循环【2】
💫只有认知的突破💫才来带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫 🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己&#x…...
K230 ISP:一种新的白平衡标定方法
第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考:K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…...
【Web应用】Vue 项目前端项目文件夹和文件介绍
文章目录 ⭐前言⭐一、文件夹介绍🌟1、.idea🌟2、bin🌟3、build🌟4、node_modules🌟5、public🌟6、src ⭐二、文件介绍🌟1、.editorconfig🌟2、.env.development、.env.production、…...
Leetcode 3544. Subtree Inversion Sum
Leetcode 3544. Subtree Inversion Sum 1. 解题思路2. 代码实现 题目链接:3544. Subtree Inversion Sum 1. 解题思路 这一题我的思路上就是一个动态规划的思路,因为原则上我们只需要遍历一下所有的状态即可,但是这样显然时间复杂度过高&am…...
分别在windows和linux上使用curl,有啥区别?
作为开发者常用的网络工具,curl 在 Windows 和 Linux 上的使用看似相似,但实际存在不少细节差异。以下从 命令语法、环境特性、功能支持 和 开发体验 四个角度展开对比,帮助读者避免跨平台开发时的常见“坑”。 一、命令语法差异:…...
微服务八股(自用)
微服务 SpringCloud 注册中心:Eureka 负载均衡:Ribbon 远程调用:Feign 服务熔断:Hystrix 网关:Gateway/Zuul Alibaba 配置中心:Nacos 负载均衡:Ribbon 服务调用:Feign 服务…...
TCP首部格式及三次握手四次挥手
TCP协议详解:首部格式与连接管理 一、TCP首部格式 TCP首部最小20字节,最大60字节,包含以下字段: | 源端口号(16bit) | 目的端口号(16bit) | | 序列号(32bit) | | 确认号(32bit) | | 数据偏移(4bit)| 保留(6bit) |U|A|P|R|S|…...
Python查询ES错误ApiError(406, ‘Content-Type ...is not supported
现象 使用python查询es数据时出现下面错误 Traceback (most recent call last):File "getUsers.py", line 26, in <module>response es.search(index"lizz_users", bodyquery)File "/usr/local/lib/python3.6/site-packages/elasticsearch/_…...
下周,Coinbase将被纳入标普500指数
Coinbase加入标普500指数紧随比特币突破10万美元大关之后。加密资产正在日益成为美国金融体系的一部分。大型机构已获得监管批准创建现货比特币交易所交易基金,进一步推动了加密货币的主流化进程。 加密货币行业迎来里程碑时刻,Coinbase即将加入标普500…...
物理:由基本粒子组成的个体能否提炼和重组?
个体差异源于基本粒子组合的复杂性与随机性,这一假设若成立,确实可能为生物医学带来革命性突破——但需要突破技术、理论与系统层级的多重壁垒。以下从科学逻辑与技术路径展开分析: 一、随机组合中的共性与稳定结构 1. 自然界的自组织规律 涌现性(Emergence):尽管粒子组…...
Python Day 24 学习
讲义Day16内容的精进 NumPy数组 Q. 什么是NumPy数组? NumPy数组是Python中由NumPy库提供的一种多维数组对象,它称为N-dimensional array,简称ndarray。它是用于数值计算的核心数据结构,能够高效地存储和操作大量的同类型数据。 Q. NumPy数…...
ppy/osu构建
下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug...
前端学习(2)—— CSS详解与使用
目录 一,CSS基础 1.1 语法规范 1.2 引入方式 1.3 选择器 1.3.1 基础选择器 1.3.2 复合选择器 1.3.3 选择器小结 二,CSS使用 2.1 字体设置 2.2 文本属性 2.3 背景属性 2.2 圆角矩形 三,关于浏览器 3.1 Chrome 调试工具 -- 查看 …...
邀请函|PostgreSQL培训认证报名正式开启
掌握PostgreSQL 轻松驾驭主流国产数据库 PostgreSQL培训认证 6月开课 报名火热进行中~ 美创中国PostgreSQL培训认证合作机构 中国PostgreSQL培训认证由中国开源软件联盟PostgreSQL分会联合中国电子工业标准化技术协会共同打造,是国内权威的PG技术等级…...
力扣HOT100之二叉树:543. 二叉树的直径
这道题本来想到可以用递归做,但是还是没想明白,最后还是去看灵神题解了,感觉这道题最大的收获就是巩固了我对lambda表达式的掌握。 按照灵神的思路,直径可以理解为从一个叶子出发向上,在某个节点处拐弯,然后…...
深入理解 NumPy:Python 科学计算的基石
在数据科学、人工智能和科学计算的世界里,NumPy 是一块绕不过去的基石。它是 Python 语言中用于高性能科学计算的基础包,几乎所有的数据分析与机器学习框架(如 Pandas、TensorFlow、Scikit-learn)都离不开它的支持。 一、什么是 …...
基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计
一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...
SpringBoot--springboot简述及快速入门
spring Boot是spring提供的一个子项目,用于快速构建spring应用程序 传统方式: 在众多子项目中,spring framework项目为核心子项目,提供了核心的功能,其他的子项目都需要依赖于spring framework,在我们实际…...
智慧校园场景下iVX 研发基座应用实践与行业适配研究
一、智慧校园多系统协同实践 在智慧校园建设中,iVX 研发基座通过模块化协作开发模式实现跨系统集成与数据治理。以校园门户与子系统整合为例,基座通过统一身份认证体系实现单点登录(SSO),用户中心基于 ABAC 模型动态控…...
故障诊断模型评估——混淆矩阵,如何使样本量一致(上)
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…...
Redis Cluster 集群搭建和集成使用的详细步骤示例
以下是Redis集群搭建和集成使用的详细步骤示例: 搭建Redis集群 环境准备 下载Redis:从Redis官方网站下载最新稳定版本的Redis源代码,解压到指定目录,如/opt/redis。安装依赖:确保系统安装了必要的依赖,如…...
【技巧】使用UV创建python项目的开发环境
回到目录 【技巧】使用UV创建python项目的开发环境 0. 为什么用UV 下载速度快、虚拟环境、多版本python支持、清晰的依赖关系 1. 安装基础软件 1.1. 安装python 下载地址:https://www.python.org/downloads/windows/ 1.2. 安装UV > pip install uv -i ht…...
竞业禁止协议中AI技能限制的深度剖析
首席数据官高鹏律师团队 在当今科技飞速发展的时代,人工智能(AI)领域成为了商业竞争的关键战场。随着AI技术在各行业的广泛渗透,竞业禁止协议中涉及AI技能的限制条款愈发受到关注,其背后蕴含着复杂而关键的法律与商业…...
Mirror的多人连接管理及房间系统
以下是一个基于Mirror的多人连接管理及房间系统的服务端实现方案,包含部署说明: 一、服务端架构设计 网络管理扩展 using Mirror; using UnityEngine;public class RoomNetworkManager : NetworkManager {// 房间字典(房间ID -> 房间对象…...
基于Session实现短信登录全流程详解
前言 在当今的Web应用中,短信验证码登录已成为最常用的身份验证方式之一。本文将详细介绍基于Session实现短信登录的全套流程,包括技术选型、流程设计、具体实现以及安全防护措施。通过本文,您将掌握从发送验证码到完成登录的完整实现方案。…...
关于 javax.validation.constraints的详细说明
以下是关于 javax.validation.constraints(现为 Jakarta Bean Validation)的详细说明,涵盖核心注解、使用场景、代码示例及最佳实践: 一、javax.validation.constraints 是什么? 作用:提供一组标准注…...
linux系统如何将采集的串口数据存储到txt
步骤: 确认串口设备:通常为/dev/ttyS0(COM1)或/dev/ttyUSB0(USB转串口)。设置波特率等参数:使用stty命令,例如: bash stty -F /dev/ttyUSB0 9600 cs8 -icanon -ixon 实时…...
(顺序表、单链表、双链表)==>一篇解决!(Java版)
文章目录 一、线性表二、顺序表三、单链表四、双链表 一、线性表 线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。 线性表的特征:数据元素之间具有一种“一对一”的逻辑关系。 线性表的分类: 线…...
大模型常用位置编码方式
深度学习中常见的位置编码方式及其Python实现: 一、固定位置编码(Sinusoidal Positional Encoding) 原理 通过不同频率的正弦和余弦函数生成位置编码,使模型能够捕捉绝对位置和相对位置信息。公式为: 公式标准数学表达…...
【fastadmin开发实战】在前端页面中使用bootstraptable以及表格中实现文件上传
先看效果: 1、前端页面中引入了表格 2、表格中实现文件上传 3、增加截止时间页面 难点在哪呢? 1、这是前端页面,并不支持直接使用btn-dialog的类属性实现弹窗; 2、前端页面一般绑定了layout模板,如何实现某个页面不…...
IO、存储、硬盘、文件系统相关常识
目录 1. IO(输入输出)基础概念 1.1 IO的定义 1.2 流 1.3 IO流 2.存储 2.1 存储技术 2.2 存储介质的分类(机械硬盘、固态硬盘、光盘、磁带) 2.2.1 机械硬盘 2.2.2 固态硬盘 2.2.3 光盘 2.2.4 磁盘 2.3 存储管理 2.4 存…...
amd架构主机构建arm架构kkfileview
修改本机使用镜像仓库地址 vim /etc/docker/daemon.json { “experimental”: true, “registry-mirrors”: [ “https://docker.m.daocloud.io”, “https://docker.1panel.live”, “http://mirrors.ustc.edu.cn/”, “http://mirror.azure.cn/”, “https://docker.hpcloud.…...