微信小程序自定义底部导航栏实战:从配置到动态隐藏的完整指南
微信小程序自定义底部导航栏实战从配置到动态隐藏的完整指南你是否厌倦了微信小程序原生底部导航栏千篇一律的样式当产品经理拿着一个充满设计感的UI稿要求实现一个带毛玻璃效果、支持动态隐藏、甚至每个图标都有独特入场动画的底部TabBar时原生组件往往显得力不从心。自定义底部导航栏正是我们打破这种限制赋予小程序独特品牌气质和流畅交互体验的关键技术手段。这不仅仅是替换几个图标那么简单它涉及到组件化架构、页面状态同步、手势交互兼容以及性能优化等一系列深水区问题。本文将从一个完整的实战项目视角出发为你拆解自定义TabBar从零到一再到应对各种复杂场景的全过程。无论你是希望为电商小程序打造一个促销活动感更强的底部栏还是为内容产品设计一个能随阅读深度渐隐的导航这里都有你需要的思路和代码。1. 项目初始化与基础架构搭建在动手写第一行代码之前我们需要对自定义导航栏有一个清晰的架构认知。微信小程序官方提供的自定义TabBar方案本质上是一个全局自定义组件。它独立于任何页面又需要与所有Tab页进行通信管理自身的选中状态和显示隐藏。一个稳健的架构是后续所有高级功能的基础。首先在项目根目录下创建custom-tab-bar文件夹。请注意这个文件夹名称是固定的微信小程序框架会主动寻找这个路径下的组件作为自定义TabBar。这与我们平常在components目录下创建组件有所不同体现了其“特殊全局组件”的身份。// custom-tab-bar/index.json { component: true, usingComponents: {} }index.json的配置非常简单声明这是一个组件即可。接下来是组件的逻辑层这里是我们定义数据与交互的核心。// custom-tab-bar/index.js Component({ data: { // 当前选中项的索引 selected: 0, // 未选中状态的颜色 color: #7A7E83, // 选中状态的颜色 selectedColor: #3cc51f, // 控制整个导航栏显示与隐藏的开关 showBar: true, // 导航列表配置 list: [ { pagePath: /pages/index/index, text: 首页, iconPath: /assets/tabbar/home.png, selectedIconPath: /assets/tabbar/home_active.png }, { pagePath: /pages/category/index, text: 分类, iconPath: /assets/tabbar/category.png, selectedIconPath: /assets/tabbar/category_active.png }, { pagePath: /pages/cart/index, text: 购物车, iconPath: /assets/tabbar/cart.png, selectedIconPath: /assets/tabbar/cart_active.png }, { pagePath: /pages/user/index, text: 我的, iconPath: /assets/tabbar/user.png, selectedIconPath: /assets/tabbar/user_active.png } ] }, methods: { // Tab切换事件处理 switchTab(e) { const data e.currentTarget.dataset const url data.path // 使用 wx.switchTab 进行跳转这是Tab页跳转的专用API wx.switchTab({ url }) } } })在data中我们定义了导航栏所需的全部状态。list数组描述了每个Tab项这里我建议将图标路径等资源文件放在统一的静态资源目录如/assets/下便于管理。switchTab方法处理用户的点击事件通过wx.switchTabAPI 进行页面跳转。注意在自定义组件中无法直接使用wx.switchTab的success回调来更新本组件的selected状态。因为页面切换成功后当前组件实例可能已经卸载。状态同步的正确姿势是在各个Tab页的页面生命周期中处理我们会在后面详细说明。视图层WXML的结构需要特别注意组件选择。由于原生TabBar层级很高为了确保自定义导航栏能覆盖其上必须使用cover-view和cover-image这两个原生组件。它们是显示在顶层WebView之上的特殊视图可以覆盖地图、视频、画布等原生组件。!-- custom-tab-bar/index.wxml -- cover-view classtab-bar wx:if{{showBar}} cover-view classtab-bar-border/cover-view cover-view wx:for{{list}} wx:keyindex classtab-bar-item {{selected index ? active : }} >/* custom-tab-bar/index.wxss */ .tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 100rpx; /* 可根据设计稿调整 */ background: #ffffff; display: flex; align-items: center; /* 关键适配iPhone X等有底部安全区域的机型 */ padding-bottom: env(safe-area-inset-bottom); box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06); z-index: 9999; } .tab-bar-border { position: absolute; left: 0; top: 0; width: 100%; height: 1rpx; background-color: rgba(0, 0, 0, 0.08); transform: scaleY(0.5); transform-origin: 0 0; } .tab-bar-item { flex: 1; display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; } .tab-bar-item__icon { width: 48rpx; height: 48rpx; margin-bottom: 6rpx; } .tab-bar-item__text { font-size: 20rpx; line-height: 1; } .tab-bar-item.active .tab-bar-item__icon { /* 可以添加一些激活状态的动画效果 */ transform: translateY(-4rpx); transition: transform 0.2s ease; }最后需要在app.json中声明启用自定义TabBar并配置一个基本的tabBar对象。这个配置中的list必须与自定义组件中的list在pagePath上严格对应否则wx.switchTab可能无法正常工作。// app.json { pages: [ pages/index/index, pages/category/index, pages/cart/index, pages/user/index ], tabBar: { custom: true, // 关键启用自定义 color: #7A7E83, selectedColor: #3cc51f, list: [ { pagePath: pages/index/index, text: 首页 }, { pagePath: pages/category/index, text: 分类 }, { pagePath: pages/cart/index, text: 购物车 }, { pagePath: pages/user/index, text: 我的 } ] }, // ... 其他配置 }至此一个基础的自定义导航栏骨架就搭建完成了。运行项目你应该能看到一个位于底部、带有图标和文字的自定义TabBar。点击它可以切换页面但你会发现一个关键问题选中状态高亮的图标和文字并没有随着页面切换而更新。这是因为状态管理还没有打通。2. 状态同步与通信机制自定义TabBar组件与各个Tab页面是相互独立的实例。当用户点击TabBar切换页面或者通过其他方式如扫码、链接进入某个Tab页时我们需要一种机制来通知TabBar组件更新当前的选中状态。微信小程序提供了this.getTabBar()接口来实现这一点。在每个Tab页的页面逻辑Page中我们可以在onShow生命周期函数里获取TabBar组件实例并设置选中索引。// pages/index/index.js - “首页”对应的页面 Page({ onShow() { // 判断 getTabBar 方法是否存在并且调用后能获取到组件实例 if (typeof this.getTabBar function this.getTabBar()) { // 设置选中索引为 0对应 list 数组中的第一项 this.getTabBar().setData({ selected: 0 }) } } })你需要为每一个Tab页面pages/category/index,pages/cart/index,pages/user/index都添加类似的代码只是将selected的值改为其在list数组中对应的索引1, 2, 3。提示为了避免硬编码索引值带来的维护困难我推荐一种更优雅的方式。你可以在自定义TabBar组件的list配置中为每个项添加一个唯一的key或者在页面中通过遍历list数组来动态查找当前页面路径对应的索引。这样可以避免在多个页面中散落着0, 1, 2, 3这样的魔法数字。然而这里藏着一个常见的“坑”如果你仅仅按照上述代码操作可能会遇到点击TabBar时页面跳转两次或者选中状态闪烁的诡异问题。这是因为wx.switchTab触发页面切换目标页面的onShow被调用其中又通过getTabBar().setData更新了状态。但有时事件触发和页面生命周期执行的时序可能导致重复渲染。一个经过实践验证的稳定方案是在自定义组件的switchTab方法中不立即更新本组件的selected状态而是完全交由目标页面的onShow来驱动。这确保了状态更新的单一数据源。// custom-tab-bar/index.js - 优化后的 switchTab 方法 methods: { switchTab(e) { const data e.currentTarget.dataset const url data.path const index data.index // 可选添加一个简单的点击反馈提升用户体验 const items this.selectAllComponents(.tab-bar-item) if (items[index]) { items[index].animate([{ transform: scale(0.95) }, { transform: scale(1) }], { duration: 200 }) } // 仅执行跳转不在此处 setData 更新 selected wx.switchTab({ url }) } }除了页面切换我们还需要考虑另一种场景深页面的返回。例如从“购物车”Tab页进入了一个商品详情页非Tab页然后从详情页返回。此时“购物车”页面的onShow会被调用从而正确更新TabBar的选中状态。这套机制保证了状态同步的鲁棒性。为了更彻底地管理状态我们可以将TabBar的配置数据提升到全局例如存储在app.js的全局数据中或者使用小程序的全局状态管理方案如MobX-miniprogram。这样不仅TabBar组件可以读取任何页面也能方便地获取和修改相关配置比如动态更换某个Tab的图标。// app.js App({ globalData: { tabBarConfig: { selected: 0, list: [...], // 与之前相同的list配置 showBar: true } } }) // 在自定义组件和页面中可以通过 getApp().globalData.tabBarConfig 访问和修改这种方式为后续实现更动态的功能如红点提醒、徽标数字、节日换肤打下了基础。3. 实现动态显示与隐藏在很多交互场景下我们需要隐藏底部导航栏来获得更大的内容展示空间。例如进入全屏的视频播放页。进入沉浸式的阅读详情页。在图片画廊中横滑浏览时。对于自定义TabBar由于其本身是一个组件我们可以通过控制其内部的一个状态变量如之前定义的showBar来实现显示和隐藏。关键在于如何让非Tab页面即那些不在tabBar配置list中的页面也能访问并控制这个组件。方法一通过页面路由栈判断在自定义TabBar组件中我们可以监听页面的路由变化根据当前页面是否属于Tab页来决定显示或隐藏。但这需要维护一份Tab页路径的白名单并且对分包加载等复杂情况处理起来比较麻烦。方法二显式API调用推荐这是一种更直接、可控性更强的方式。我们在自定义组件中暴露设置showBar的方法然后在需要隐藏/显示TabBar的页面中调用它。首先在自定义组件中我们已经在data中定义了showBar并在WXML中通过wx:if{{showBar}}控制渲染。接下来我们需要提供一个方法供页面调用。虽然页面可以通过this.getTabBar().setData({ showBar: false })直接设置但为了更好的封装性和可能存在的额外逻辑如隐藏动画我们可以在组件方法中提供一个专用函数。// custom-tab-bar/index.js - 新增方法 Component({ // ... data 部分同上 methods: { switchTab(e) { ... }, // 暴露给页面的方法隐藏TabBar hide() { this.setData({ showBar: false }) // 可以在这里触发隐藏动画 console.log(自定义TabBar已隐藏) }, // 暴露给页面的方法显示TabBar show() { this.setData({ showBar: true }) // 可以在这里触发显示动画 console.log(自定义TabBar已显示) }, // 暴露给页面的方法切换显示状态 toggle() { this.setData({ showBar: !this.data.showBar }) } } })然后在需要隐藏TabBar的页面例如一个全屏的视频播放页pages/video/player中这样调用// pages/video/player.js Page({ onLoad() { // 页面加载时隐藏TabBar const tabBar this.getTabBar() if (tabBar tabBar.hide) { tabBar.hide() } }, onUnload() { // 页面卸载时如返回上一页显示TabBar // 注意如果是从播放页跳转到另一个也需要隐藏TabBar的页面这里可能需要更精细的控制 const tabBar this.getTabBar() if (tabBar tabBar.show) { tabBar.show() } }, // 或者在某个按钮事件中手动控制 onFullscreenToggle() { const tabBar this.getTabBar() if (tabBar tabBar.toggle) { tabBar.toggle() } } })注意this.getTabBar()方法仅在当前页面是Tab页即在app.json的tabBar.list中配置了的页面时才有效。如果你的播放页不是Tab页上述代码将无法工作。这是一个常见的误区。那么非Tab页面如何控制自定义TabBar的显示隐藏呢这就需要借助全局事件总线或状态管理库了。一个相对简单的方案是利用小程序的getApp()和全局数据在app.js中定义一个全局可观察的数据对象和更新函数。自定义TabBar组件监听这个全局数据的变化。任何页面包括非Tab页都可以修改这个全局数据从而驱动TabBar更新。// app.js App({ globalData: { tabBarVisible: true }, watchCallbacks: {}, // 简单的观察者模式实现 watch(key, callback) { if (!this.watchCallbacks[key]) this.watchCallbacks[key] [] this.watchCallbacks[key].push(callback) }, setGlobalData(obj) { Object.keys(obj).forEach(key { this.globalData[key] obj[key] // 通知所有观察者 if (this.watchCallbacks[key]) { this.watchCallbacks[key].forEach(cb cb(obj[key])) } }) } }) // custom-tab-bar/index.js const app getApp() Component({ lifetimes: { attached() { // 组件挂载时监听全局数据变化 app.watch(tabBarVisible, (value) { this.setData({ showBar: value }) }) } }, // ... 其他代码 }) // 在任何页面包括非Tab页中 const app getApp() // 隐藏TabBar app.setGlobalData({ tabBarVisible: false }) // 显示TabBar app.setGlobalData({ tabBarVisible: true })这种方式实现了任意页面与自定义TabBar组件之间的解耦通信是处理复杂交互场景的利器。4. 高级样式、交互与性能优化当基础功能稳固后我们可以专注于提升导航栏的视觉表现和交互体验这往往是体现产品差异化的地方。4.1 样式增强与主题化我们可以让TabBar支持更多的样式配置甚至动态主题。例如根据页面滚动位置将TabBar的背景色从透明渐变为纯色。// custom-tab-bar/index.js - 扩展数据与样式 data: { // ... 原有数据 backgroundColor: #ffffff, backgroundOpacity: 1, blurEffect: false, // 是否启用毛玻璃效果 }在WXSS中我们可以使用CSS变量或动态内联样式来绑定这些属性。!-- custom-tab-bar/index.wxml -- cover-view classtab-bar wx:if{{showBar}} stylebackground-color: {{backgroundColor}}; opacity: {{backgroundOpacity}}; backdrop-filter: {{blurEffect ? blur(20rpx) : none}}; !-- ... 内部结构不变 -- /cover-view然后在页面滚动监听事件中计算并更新这些样式属性。// 在某个页面的 onPageScroll 中 onPageScroll(e) { const scrollTop e.scrollTop let opacity 1 if (scrollTop 0 scrollTop 100) { opacity 1 - (scrollTop / 100) * 0.5 // 随着滚动透明度从1变化到0.5 } else if (scrollTop 100) { opacity 0.5 } const tabBar this.getTabBar() if (tabBar tabBar.setData) { tabBar.setData({ backgroundOpacity: opacity }) } }4.2 交互反馈与动画微交互能极大提升用户体验。我们可以为TabBar的点击、选中状态添加动画。点击反馈使用小程序自带的hover-class属性需在cover-view上设置hover-stop-propagation和hover-start-time等属性或者用animationAPI 实现缩放效果如前文代码示例。选中态动画当选中的Tab变化时可以给图标添加一个轻微的弹跳bounce效果或者让文字有一个渐显的变化。// 在自定义组件的 switchTab 方法中添加动画 switchTab(e) { const data e.currentTarget.dataset const url data.path const index data.index // 为即将被选中的项添加动画 const targetItem this.selectComponent(.tab-bar-item:nth-child(${index 1})) if (targetItem) { // 使用 createAnimation const animation wx.createAnimation({ duration: 300, timingFunction: ease-out }) animation.scale(0.9).step().scale(1).step() targetItem.animation animation targetItem.setData({ animationData: animation.export() }) } wx.switchTab({ url }) }4.3 性能优化要点自定义TabBar作为一个全局组件其性能表现至关重要。减少不必要的渲染确保只有data中真正需要响应式变化的属性才用setData更新。对于静态的配置数据可以放在组件的properties或直接定义为模块常量。图片优化TabBar图标通常较小但也要注意压缩。建议使用WebP格式小程序已支持以减小体积。对于选中/未选中两套图标可以考虑使用雪碧图CSS Sprite或字体图标IconFont来减少HTTP请求但要注意cover-image对雪碧图的支持度。避免频繁的getTabBar调用在页面的onShow中调用是必要的但要避免在onPageScroll等高频触发的事件中频繁调用和setData这可能导致卡顿。可以考虑函数节流throttle。4.4 常见问题与调试技巧在开发过程中你可能会遇到以下问题问题现象可能原因解决方案自定义TabBar不显示1.custom-tab-bar目录位置或名称错误。2.app.json中未设置custom: true。3. 组件JS文件有语法错误。检查目录结构、配置并查看开发者工具控制台报错。点击TabBar无法跳转1.wx.switchTab的url路径与app.json中list配置的pagePath不一致。2. 目标页面不是Tab页。确保路径完全一致且目标页面已在tabBar.list中注册。选中状态不同步1. 页面onShow中未调用getTabBar().setData。2. 页面索引与组件list索引不匹配。检查每个Tab页的onShow逻辑并确认索引对应关系。可使用页面路径动态查找索引。在非Tab页无法隐藏TabBarthis.getTabBar()在非Tab页返回undefined。使用全局状态管理方案如修改app.globalData并让组件监听来控制显示隐藏。TabBar被页面内容遮挡页面内容未预留TabBar高度。在Tab页面的最外层容器添加padding-bottom: 100rpx;与TabBar高度一致。调试时充分利用微信开发者工具的“自定义组件”调试面板可以实时查看自定义TabBar组件的data、properties状态方便定位问题。5. 实战案例打造一个“灵动”的导航栏让我们综合运用以上知识实现一个稍微复杂但效果出众的案例一个随着页面内容滚动图标会轻微上浮并变色的“灵动”导航栏。第一步设计数据结构与样式我们在组件数据中增加控制图标位移和颜色的变量。// custom-tab-bar/index.js - data 部分扩展 data: { selected: 0, list: [...], // 同前 // 新增控制每个图标的垂直偏移量和颜色 iconStyles: [ { transform: translateY(0), color: #7A7E83 }, { transform: translateY(0), color: #7A7E83 }, { transform: translateY(0), color: #7A7E83 }, { transform: translateY(0), color: #7A7E83 } ] }第二步在WXML中绑定动态样式!-- custom-tab-bar/index.wxml -- cover-view classtab-bar wx:if{{showBar}} cover-view wx:for{{list}} wx:keyindex classtab-bar-item >// pages/index/index.js Page({ data: { lastScrollTop: 0, scrollingUp: false }, onPageScroll(e) { const scrollTop e.scrollTop const delta scrollTop - this.data.lastScrollTop const scrollingUp delta 0 if (scrollingUp ! this.data.scrollingUp) { this.data.scrollingUp scrollingUp this._updateTabBarIconStyle(scrollingUp) } this.setData({ lastScrollTop: scrollTop }) }, _updateTabBarIconStyle(scrollingUp) { const tabBar this.getTabBar() if (!tabBar) return const selectedIndex 0 // 假设首页是第一个Tab const newIconStyles [...tabBar.data.iconStyles] // 复制原数组 if (scrollingUp) { // 向上滚动选中图标上浮10rpx颜色变为选中色 newIconStyles[selectedIndex] { transform: translateY(-10rpx), color: tabBar.data.selectedColor } } else { // 向下滚动或顶部恢复原位和未选中色 newIconStyles[selectedIndex] { transform: translateY(0), color: tabBar.data.color } } tabBar.setData({ iconStyles: newIconStyles }) }, onShow() { // 页面显示时重置图标样式并更新选中状态 const tabBar this.getTabBar() if (tabBar) { const resetStyles tabBar.data.iconStyles.map(() ({ transform: translateY(0), color: tabBar.data.color })) tabBar.setData({ selected: 0, iconStyles: resetStyles }) } } })这个案例展示了如何将页面交互与自定义组件状态深度结合创造出原生TabBar无法实现的动态效果。你可以在此基础上发挥创意比如结合手机陀螺仪数据让图标产生视差移动或者根据网络状态、时间变化动态更换图标样式。自定义底部导航栏的开发是一个从“能用”到“好用”再到“惊艳”的渐进过程。它考验的不仅是对小程序组件系统的理解更是对用户体验细节的把握。从最初的状态同步难题到复杂的动态交互每一步问题的解决都让产品的体验更上一层楼。我自己的经验是在项目初期就采用全局状态管理来驱动TabBar虽然前期会多写一些代码但在后续应对产品频繁的交互需求变更时你会感谢自己当初的这个决定。记住那些让用户感到“顺滑”和“贴心”的细节往往就藏在这些自定义组件的微交互里。

相关新闻

突破SIM卡区域限制:Nrfr工具的技术原理与实战价值

突破SIM卡区域限制:Nrfr工具的技术原理与实战价值

突破SIM卡区域限制:Nrfr工具的技术原理与实战价值 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制,突破区域限制 …

2026/5/17 10:54:07 阅读更多 →
Cogito-v1-preview-llama-3B应用场景:医疗健康科普内容生成与审核辅助

Cogito-v1-preview-llama-3B应用场景:医疗健康科普内容生成与审核辅助

Cogito-v1-preview-llama-3B应用场景:医疗健康科普内容生成与审核辅助 1. 医疗健康科普的挑战与机遇 医疗健康科普内容创作一直是个专业门槛很高的领域。传统的科普创作面临几个核心痛点:专业医生没时间写科普,非专业人士写的内容又不准确&…

2026/7/3 19:27:37 阅读更多 →
SEER‘S EYE预言家之眼多轮对话效果深度评测

SEER‘S EYE预言家之眼多轮对话效果深度评测

SEERS EYE预言家之眼多轮对话效果深度评测 最近,我花了不少时间深度体验了SEERS EYE预言家之眼模型,特别是它在多轮复杂对话场景下的表现。说实话,市面上很多模型在单轮问答上做得不错,但一旦对话拉长,上下文一复杂&a…

2026/7/5 11:24:26 阅读更多 →

最新新闻

Agentic AI:聊天机器人到自主执行系统,从岗位要求反推能力栈

Agentic AI:聊天机器人到自主执行系统,从岗位要求反推能力栈

聊《Agentic AI:聊天机器人到自主执行系统,从岗位要求反推能力栈》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向关注 AI 产品化和自动化系统的开发者,但不会把“Ag…

2026/7/5 13:02:02 阅读更多 →
PCB设计中地线与电源线加宽的技术要点与实战分析

PCB设计中地线与电源线加宽的技术要点与实战分析

1. PCB布线中地线与电源线加宽的核心逻辑 在PCB设计领域,地线(GND)和电源线(VCC)的走线宽度处理是影响电路性能的关键因素之一。不同于信号线可以相对灵活地调整宽度,这两类走线需要特殊对待的根本原因在于…

2026/7/5 12:58:00 阅读更多 →
基于YOLOv10的红外目标检测实战指南

基于YOLOv10的红外目标检测实战指南

1. 项目背景与核心价值去年夏天,我在参与一个山区救援项目时,亲眼目睹了传统无人机监控系统的局限性。在浓烟和夜间环境下,普通摄像头完全失效,而热成像设备虽然能捕捉到热源,却无法准确识别是人、动物还是车辆。正是这…

2026/7/5 12:51:58 阅读更多 →
AIAgent之工具调用:Function Call 与 Tool Use

AIAgent之工具调用:Function Call 与 Tool Use

工具调用:Function Call 与 Tool Use工具调用是 Agent 的「手」,让大模型能操作外部世界。这篇讲 Function Calling 的原理、工具怎么定义、模型怎么选工具、参数怎么传、常见的工具类型,以及开发中的最佳实践。大家好,我是黒漂技…

2026/7/5 12:49:55 阅读更多 →
ICM-42688-P与STM32F746ZG在工业自动化中的应用

ICM-42688-P与STM32F746ZG在工业自动化中的应用

1. ICM-42688-P与STM32F746ZG的黄金组合解析 在工业自动化和机器人控制领域,传感器与微控制器的协同设计直接决定了系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动传感器,与STMicroelectronics的STM32F746ZG Cortex-M7微控制器形成的硬…

2026/7/5 12:47:54 阅读更多 →
混合整数二次规划在模型预测控制中的应用与求解器对比

混合整数二次规划在模型预测控制中的应用与求解器对比

1. 混合整数二次规划在模型预测控制中的核心作用 混合整数二次规划(MIQP)作为模型预测控制(MPC)中处理离散决策变量的关键技术,其核心价值在于平衡计算复杂度和控制性能。在车辆动力系统控制这类典型应用中,变速箱档位选择、发动机启停等离散决策变量与连…

2026/7/5 12:47:54 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻