DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕
目录
- DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
- 📚前言
- 📚进入安装好的DeepSeek
- 📚页面效果
- 📚指令输入
- 📚think
- 📘组件代码
- 📘调用示例
- 📘扩展建议
- 📚代码测试
- 📚整理后主要代码
- 📘定义组件 Sidebar.vue
- 📘调用 SidebarView.vue
- 📚其他代码
- 📘编写 \router\index.js
- 📘编写 App.vue
- 📚页面效果
- 📚自己部署 DeepSeek 安装地址
- 📚相关文章
📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始
⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣
DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
📚前言
在成本方面,DeepSeek 具有明显的优势。其训练成本和推理成本都远低于其他同类模型。例如,DeepSeek-V3 的训练成本仅为 557.6 万美元,而训练 GPT-4 这样的模型则需要数亿美元乃至数十亿美元 。在推理成本方面,DeepSeek 的 API 定价仅为每百万 tokens 输入 1 元、输出 2 元,价格仅为 GPT-4 Turbo 的百分之一 。如此低的成本,使得更多的企业和开发者能够使用 DeepSeek 的技术,降低了人工智能应用的门槛。
在功能方面,DeepSeek 不仅具备强大的自然语言处理能力,还在多模态处理、个性化推荐等方面具有独特的优势。在多模态处理方面,DeepSeek 支持文本、图像、语音等多种模态的数据融合和学习,能够实现更丰富和全面的理解和推理。在智能客服场景中,用户既可以通过文字与 DeepSeek 交流,也可以直接发送语音指令,甚至上传相关图片辅助说明问题,DeepSeek 都能准确理解用户需求,并提供相应的解决方案。在个性化推荐方面,DeepSeek 能根据用户行为和偏好,提供个性化内容推荐,提升用户满意度和参与度。
📚进入安装好的DeepSeek
0基础3步部署自己的DeepSeek安装步骤
打开搭建好的DeepSeek应用。
进入应用。
📚页面效果
📚指令输入
已经创建好了一个基于Vue3的组合式API的项目(Composition API),并能正常运行起来,请帮我用 Vue3的组合式API(Composition API) 生成一个 侧边栏(Sidebar) 的功能组件,所有代码都保存在components/Sidebar 下的文件夹中。功能组件的script标签中只有setup属性,使用普通 JavaScript 实现,不使用TypeScript。
功能要有,如下属性:
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
position | 侧边栏位置(left/right) | String | ‘left’ |
width | 侧边栏宽度(支持所有CSS单位) | String/Number | ‘300px’ |
collapsible | 是否可折叠 | Boolean | true |
defaultCollapsed | 默认是否折叠 | Boolean | false |
showOverlay | 是否显示遮罩层(移动端模式) | Boolean | true |
overlayOpacity | 遮罩层透明度(0-1) | Number | 0.5 |
closeOnClickOutside | 点击遮罩层/外部区域是否关闭 | Boolean | true |
preventScroll | 展开时是否禁止背景滚动 | Boolean | true |
animationType | 过渡动画类型(slide/fade/none) | String | ‘slide’ |
animationDuration | 动画持续时间(毫秒) | Number | 300 |
responsive | 是否启用响应式(自动在小屏幕折叠) | Boolean | true |
breakpoint | 响应式断点(小于该宽度自动折叠) | Number | 768 |
modelValue | 控制侧边栏展开状态(v-model绑定) | Boolean | - |
如下事件: |
事件名 | 说明 | 参数 |
---|---|---|
update:modelValue | 状态变化时触发(用于v-model) | 新状态(Boolean) |
open | 展开时触发 | - |
close | 折叠时触发 | - |
toggle | 切换状态时触发 | 新状态(Boolean) |
overlay-click | 点击遮罩层时触发 | - |
你有更好的建议也可以添加,要注明。组件定义好后给出2个及以上完整的调用示例。
下面是现有目录
vueAndDeepseek/
├── src/ # 源代码目录
│ ├── assets/ # 静态资源
│ │ ├── base.css
│ │ ├── main.css
│ │ └── logo.svg
│ ├── components/ # 组件目录
│ │ ├── HelloWorld.vue
│ │ ├── TheWelcome.vue
│ │ ├── WelcomeItem.vue
│ │ ├── Progress/
│ │ │ └── Progress.vue
│ │ ├── Accordion/
│ │ ├── BackToTop/
│ │ ├── Card/
│ │ ├── InfiniteScroll/
│ │ ├── Notification/
│ │ ├── Timeline/
│ │ ├── Switch/
│ │ ├── Tabs/
│ │ ├── Sidebar/
│ │ └── icons/
│ ├── router/ # 路由配置
│ │ └── index.js
│ ├── stores/ # Pinia 状态管理
│ │ └── counter.js
│ ├── views/ # 页面组件
│ │ ├── ProgressView.vue
│ │ ├── TabsView.vue
│ │ ├── SwitchView.vue
│ │ ├── TimelineView.vue
│ │ ├── NotificationView.vue
│ │ ├── CardView.vue
│ │ ├── InfiniteScrollView.vue
│ │ ├── BackToTopView.vue
│ │ ├── AccordionView.vue
│ │ ├── SidebarView.vue
│ │ └── AboutView.vue
│ ├── App.vue # 根组件
│ └── main.js # 应用入口
├── public/ # 公共资源目录
├── index.html # HTML 模板
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── node_modules/ # 依赖包目录
📚think
好的,我现在需要帮用户生成一个基于Vue3组合式API的侧边栏组件。用户已经提供了一个详细的属性和事件列表,并且要求将所有代码放在components/Sidebar文件夹下,使用普通JavaScript实现。
首先,我得分析用户的需求。他们需要一个功能全面的侧边栏,支持位置、宽度、折叠等功能,并且有各种事件和响应式设计。组件必须使用setup函数,所以我要考虑如何在组合式API中组织这些逻辑。
接下来,我会逐一处理每个属性。比如,position决定侧边栏的位置,left或right,这可以通过动态class来实现。width需要支持所有CSS单位,直接作为style的width应用即可。collapsible和defaultCollapsed会影响侧边栏是否可以折叠以及默认状态,这里可能需要用一个内部的状态变量来管理展开/折叠的状态。
然后是遮罩层部分,showOverlay控制遮罩层的显示与否。当组件在移动端模式下,点击遮罩层或外部区域会关闭侧边栏,这需要监听click事件,并根据条件决定是否关闭。同时,closeOnClickOutside和preventScroll属性也需要处理,可能需要添加事件监听器到document上。
动画部分,animationType和animationDuration决定了过渡效果。使用Vue的TransitionGroup或者自定义过渡类来实现滑动或渐变效果。这里可能需要动态切换class,根据当前状态应用不同的动画样式。
响应式设计方面,当屏幕宽度小于breakpoint时自动折叠。这需要用到useResizeObserver来监听页面大小变化,并在resize事件中调整侧边栏的状态。
关于modelValue和v-model的支持,我需要使用computed属性来处理双向绑定,同时在组件内部触发update:模型值事件。当用户手动打开或关闭侧边栏时,会派发这个事件更新父组件的状态。
事件部分,有open、close、toggle、overlay-click等事件,这些都需要通过emit函数来派发。例如,在点击遮罩层的时候,派发overlay-click事件,并在回调中处理关闭逻辑。
现在考虑内部状态管理,我会用ref定义isCollapsed和isOpen两个变量。isCollapsed表示当前是否折叠,isOpen可能用于控制显示隐藏的动画过渡。当组件挂载时,根据defaultCollapsed设置初始状态。
接下来是方法部分,toggleSidebar用来切换展开/折叠状态,并派发相应的事件。handleOverlayClick则处理点击遮罩层的情况,只有在closeOnClickOutside为true时才会关闭侧边栏。
然后是响应式处理,监听页面的resize事件,当宽度小于breakpoint时,自动折叠侧边栏。这可能需要使用useResizeObserver或直接监听window.resize事件,并根据当前状态和断点调整isCollapsed的值。
样式方面,我会动态绑定class,根据position决定left还是right,以及是否显示隐藏。width属性通过style对象应用到侧边栏容器上。遮罩层的透明度由overlayOpacity控制,添加对应的背景颜色。
最后是写示例组件,展示如何在父组件中使用这个侧边栏。例如,绑定modelValue、设置不同的位置和宽度,以及监听各种事件来响应状态变化。
在整个过程中,我需要确保代码结构清晰,逻辑正确,并且覆盖所有用户提供的属性和事件。同时,考虑到性能优化,避免不必要的计算或重复渲染。最后,测试组件在不同情况下的表现,比如移动端和桌面端的显示效果,动画是否流畅,点击外部区域是否正确关闭等。
📘组件代码
根据组件设计经验和最佳实践,以下是侧边栏组件的开发建议和完整方案:
src/components/Sidebar/Sidebar.vue
<template><transition :name="transitionName" :duration="animationDuration"><div v-show="isOpen"class="sidebar":class="[positionClass, { collapsible }]":style="sidebarStyles"><!-- 头部插槽 --><div v-if="$slots.header" class="sidebar-header"><slot name="header"></slot></div><!-- 内容区域 --><div class="sidebar-body"><slot></slot></div><!-- 底部插槽 --><div v-if="$slots.footer" class="sidebar-footer"><slot name="footer"></slot></div></div></transition><!-- 遮罩层 --><transition name="fade" :duration="animationDuration"><divv-if="showOverlay && isOpen"class="sidebar-overlay":style="overlayStyles"@click="handleOverlayClick"></div></transition>
</template><script setup>
import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue'const props = defineProps({position: {type: String,default: 'left',validator: v => ['left', 'right'].includes(v)},width: {type: [String, Number],default: '300px'},collapsible: Boolean,defaultCollapsed: Boolean,showOverlay: Boolean,overlayOpacity: {type: Number,default: 0.5},closeOnClickOutside: Boolean,preventScroll: Boolean,animationType: {type: String,default: 'slide',validator: v => ['slide', 'fade', 'none'].includes(v)},animationDuration: {type: Number,default: 300},responsive: Boolean,breakpoint: {type: Number,default: 768},modelValue: Boolean
})const emit = defineEmits(['update:modelValue','open','close','toggle','overlay-click'
])// 响应式状态
const isOpen = ref(!props.defaultCollapsed)
const windowWidth = ref(window.innerWidth)// 计算属性
const positionClass = computed(() => `position-${props.position}`)
const transitionName = computed(() => props.animationType === 'slide' ? `slide-${props.position}` : props.animationType)const sidebarStyles = computed(() => ({width: typeof props.width === 'number' ? `${props.width}px` : props.width
}))const overlayStyles = computed(() => ({opacity: props.overlayOpacity,backgroundColor: `rgba(0,0,0,${props.overlayOpacity})`
}))// 方法
const toggle = (state) => {const newState = typeof state === 'boolean' ? state : !isOpen.valueisOpen.value = newStateemit('update:modelValue', newState)emit('toggle', newState)newState ? emit('open') : emit('close')// 处理滚动锁定if (props.preventScroll) {document.body.style.overflow = newState ? 'hidden' : ''}
}const handleOverlayClick = () => {emit('overlay-click')if (props.closeOnClickOutside) toggle(false)
}// 响应式处理
const checkResponsive = () => {if (props.responsive && windowWidth.value <= props.breakpoint) {toggle(false)}
}// 生命周期
onMounted(() => {window.addEventListener('resize', () => {windowWidth.value = window.innerWidthcheckResponsive()})
})onBeforeUnmount(() => {window.removeEventListener('resize')document.body.style.overflow = '' // 清理滚动锁定
})// 监听props变化
watch(() => props.modelValue, (val) => {isOpen.value = val
})watch(windowWidth, checkResponsive)
</script><style scoped>
.sidebar {position: fixed;top: 0;height: 100vh;background: #ffffff;box-shadow: 2px 0 8px rgba(0,0,0,0.15);z-index: 1000;transition: transform 0.3s ease;
}.position-left {left: 0;transform: translateX(-100%);
}.position-right {right: 0;transform: translateX(100%);
}.slide-left-enter-active,
.slide-left-leave-active {transition: transform v-bind('animationDuration + "ms"') ease;
}.slide-left-enter-to,
.slide-left-leave-from {transform: translateX(0);
}.slide-right-enter-active,
.slide-right-leave-active {transition: transform v-bind('animationDuration + "ms"') ease;
}.slide-right-enter-to,
.slide-right-leave-from {transform: translateX(0);
}.fade-enter-active,
.fade-leave-active {transition: opacity v-bind('animationDuration + "ms"') ease;
}.fade-enter-from,
.fade-leave-to {opacity: 0;
}.sidebar-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0,0,0,0.5);z-index: 999;
}.sidebar-header {padding: 16px;border-bottom: 1px solid #f0f0f0;
}.sidebar-body {padding: 16px;height: calc(100vh - 120px);overflow-y: auto;
}.sidebar-footer {position: absolute;bottom: 0;width: 100%;padding: 16px;border-top: 1px solid #f0f0f0;
}
</style>
📘调用示例
<template><!-- 基本用法 --><Sidebar v-model="isOpen1"><template #header><h3>导航菜单</h3></template><!-- 内容 --></Sidebar><!-- 响应式侧边栏 --><Sidebar v-model="isOpen2"position="right"width="350px":responsive="true":breakpoint="1024"><template #footer><button @click="isOpen2 = false">关闭</button></template></Sidebar><!-- 自定义动画 --><Sidebarv-model="isOpen3"animation-type="fade":animation-duration="500":show-overlay="false"/>
</template><script setup>
import { ref } from 'vue'
import Sidebar from '@/components/Sidebar/Sidebar.vue'const isOpen1 = ref(true)
const isOpen2 = ref(false)
const isOpen3 = ref(false)
</script>
📘扩展建议
-
键盘导航支持:
- 添加ESC键关闭支持
const handleKeydown = (e) => {if (e.key === 'Escape' && isOpen.value) toggle(false) }
-
手势支持(移动端):
let touchStartX = 0const onTouchStart = (e) => {touchStartX = e.touches[0].clientX }const onTouchEnd = (e) => {const deltaX = e.changedTouches[0].clientX - touchStartXif (Math.abs(deltaX) > 50) toggle(deltaX > 0) }
-
可访问性增强:
<div role="navigation"aria-label="主侧边栏":aria-expanded="isOpen" >
-
样式定制:
.sidebar {--sidebar-bg: #fff;--sidebar-shadow: 2px 0 8px rgba(0,0,0,0.15);background: var(--sidebar-bg);box-shadow: var(--sidebar-shadow); }
通过这种设计,侧边栏组件将具备以下优势:
- 完整的响应式支持
- 灵活的动画配置
- 完善的移动端体验
- 良好的可访问性
- 支持插槽内容定制
- 与Vue3生态完美集成
📚代码测试
有个报错,调整下代码
📚整理后主要代码
📘定义组件 Sidebar.vue
<script setup>
import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'const props = defineProps({position: {type: String,default: 'left',validator: v => ['left', 'right'].includes(v)},width: {type: [String, Number],default: '300px'},collapsible: {type: Boolean,default: true},defaultCollapsed: {type: Boolean,default: false},showOverlay: {type: Boolean,default: true},overlayOpacity: {type: Number,default: 0.5},closeOnClickOutside: {type: Boolean,default: true},preventScroll: {type: Boolean,default: true},animationType: {type: String,default: 'slide',validator: v => ['slide', 'fade', 'none'].includes(v)},animationDuration: {type: Number,default: 300},responsive: {type: Boolean,default: true},breakpoint: {type: Number,default: 768},modelValue: {type: Boolean,required: true}
})const emit = defineEmits(['update:modelValue', 'open', 'close', 'toggle', 'overlay-click'])// 计算样式
const sidebarStyles = computed(() => ({width: typeof props.width === 'number' ? `${props.width}px` : props.width,'--animation-duration': `${props.animationDuration}ms`
}))const overlayStyles = computed(() => ({backgroundColor: `rgba(0, 0, 0, ${props.overlayOpacity})`
}))// 处理遮罩点击
const handleOverlayClick = () => {if (props.closeOnClickOutside) {emit('update:modelValue', false)emit('overlay-click')}
}// 响应式处理
onMounted(() => {if (props.responsive) {window.addEventListener('resize', handleResize)}if (props.preventScroll) {document.body.style.overflow = props.modelValue ? 'hidden' : ''}
})onBeforeUnmount(() => {if (props.responsive) {window.removeEventListener('resize', handleResize)}if (props.preventScroll) {document.body.style.overflow = ''}
})const handleResize = () => {if (window.innerWidth < props.breakpoint && props.modelValue) {emit('update:modelValue', false)}
}// 监听状态变化
watch(() => props.modelValue, (val) => {if (props.preventScroll) {document.body.style.overflow = val ? 'hidden' : ''}emit(val ? 'open' : 'close')
})
</script><template><transition :name="animationType" :duration="animationDuration"><div v-show="modelValue" class="sidebar-container"><divclass="sidebar":class="[`sidebar-${position}`, { collapsible }]":style="sidebarStyles"><slot name="header"></slot><div class="sidebar-content"><slot></slot></div><slot name="footer"></slot></div><divv-if="showOverlay"class="sidebar-overlay":style="overlayStyles"@click="handleOverlayClick"></div></div></transition>
</template><style scoped>
.sidebar-container {position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1000;
}.sidebar {position: fixed;top: 0;bottom: 0;background: #fff;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);z-index: 1001;
}.sidebar-left { left: 0; }
.sidebar-right { right: 0; }.sidebar-overlay {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5);z-index: 1000;
}.slide-enter-active,
.slide-leave-active {transition: transform var(--animation-duration) ease;
}.slide-enter-from.sidebar-left,
.slide-leave-to.sidebar-left {transform: translateX(-100%);
}.slide-enter-from.sidebar-right,
.slide-leave-to.sidebar-right {transform: translateX(100%);
}.fade-enter-active,
.fade-leave-active {transition: opacity var(--animation-duration) ease;
}.fade-enter-from,
.fade-leave-to {opacity: 0;
}
</style>
📘调用 SidebarView.vue
<script setup>
import { ref } from 'vue'
import Sidebar from '../components/Sidebar/Sidebar.vue'// 基础示例状态
const isBasicOpen = ref(false)// 响应式示例状态
const isResponsiveOpen = ref(false)// 自定义主题示例状态
const isCustomOpen = ref(false)// 处理菜单点击
const handleMenuClick = () => {console.log('Menu item clicked')
}
</script><template><div class="sidebar-demo"><!-- 基础示例 --><section class="demo-section"><h3>基础示例</h3><button @click="isBasicOpen = true">打开左侧边栏</button><Sidebar v-model="isBasicOpen"><template #header><h3>基础侧边栏</h3></template><div class="menu-items"><div class="menu-item" @click="handleMenuClick">菜单项 1</div><div class="menu-item" @click="handleMenuClick">菜单项 2</div><div class="menu-item" @click="handleMenuClick">菜单项 3</div></div></Sidebar></section><!-- 响应式示例 --><section class="demo-section"><h3>响应式示例</h3><button @click="isResponsiveOpen = true">打开右侧边栏</button><Sidebarv-model="isResponsiveOpen"position="right":responsive="true":breakpoint="768"animationType="fade"><template #header><h3>响应式侧边栏</h3></template><div class="responsive-content"><p>在小屏幕下自动折叠</p><button @click="isResponsiveOpen = false">关闭</button></div></Sidebar></section><!-- 自定义主题示例 --><section class="demo-section"><h3>自定义主题示例</h3><button @click="isCustomOpen = true">打开自定义侧边栏</button><Sidebarv-model="isCustomOpen"width="400px":overlay-opacity="0.7":animation-duration="500"><template #header><div class="custom-header"><h3>自定义主题</h3><button @click="isCustomOpen = false">×</button></div></template><div class="custom-content"><p>自定义宽度和动画效果</p><div class="custom-menu"><div class="custom-menu-item">设置</div><div class="custom-menu-item">个人信息</div><div class="custom-menu-item">退出</div></div></div></Sidebar></section></div>
</template><style scoped>
.sidebar-demo {padding: 20px;
}.demo-section {margin-bottom: 30px;
}button {padding: 8px 16px;margin: 10px 0;border: none;border-radius: 4px;background: #409EFF;color: white;cursor: pointer;
}.menu-items {padding: 10px;
}.menu-item {padding: 10px;cursor: pointer;
}.menu-item:hover {background: #f5f7fa;
}.custom-header {display: flex;justify-content: space-between;align-items: center;padding: 16px;border-bottom: 1px solid #eee;
}.custom-content {padding: 20px;
}.custom-menu-item {padding: 12px;margin: 8px 0;background: #f5f7fa;border-radius: 4px;cursor: pointer;
}.custom-menu-item:hover {background: #e4e7ed;
}
</style>
📚其他代码
📘编写 \router\index.js
import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'progress',component: () => import('../views/ProgressView.vue'),},{path: '/tabs',name: 'tabs',// route level code-splitting// this generates a separate chunk (About.[hash].js) for this route// which is lazy-loaded when the route is visited.// 标签页(Tabs)component: () => import('../views/TabsView.vue'),},{path: '/accordion',name: 'accordion',// 折叠面板(Accordion)component: () => import('../views/AccordionView.vue'),},{path: '/timeline',name: 'timeline',// 时间线(Timeline)component: () => import('../views/TimelineView.vue'),},{path: '/backToTop',name: 'backToTop',component: () => import('../views/BackToTopView.vue')},{path: '/notification',name: 'notification',component: () => import('../views/NotificationView.vue')},{path: '/card',name: 'card',component: () => import('../views/CardView.vue')},{path: '/infiniteScroll',name: 'infiniteScroll',component: () => import('../views/InfiniteScrollView.vue')},{path: '/switch',name: 'switch',component: () => import('../views/SwitchView.vue')},{path: '/sidebar',name: 'sidebar',component: () => import('../views/SidebarView.vue')}],
})export default router
📘编写 App.vue
<script setup>
import { ref } from 'vue'
import Sidebar from '../components/Sidebar/Sidebar.vue'// 基础示例状态
const isBasicOpen = ref(false)// 响应式示例状态
const isResponsiveOpen = ref(false)// 自定义主题示例状态
const isCustomOpen = ref(false)// 处理菜单点击
const handleMenuClick = () => {console.log('Menu item clicked')
}
</script><template><div class="sidebar-demo"><!-- 基础示例 --><section class="demo-section"><h3>基础示例</h3><button @click="isBasicOpen = true">打开左侧边栏</button><Sidebar v-model="isBasicOpen"><template #header><h3>基础侧边栏</h3></template><div class="menu-items"><div class="menu-item" @click="handleMenuClick">菜单项 1</div><div class="menu-item" @click="handleMenuClick">菜单项 2</div><div class="menu-item" @click="handleMenuClick">菜单项 3</div></div></Sidebar></section><!-- 响应式示例 --><section class="demo-section"><h3>响应式示例</h3><button @click="isResponsiveOpen = true">打开右侧边栏</button><Sidebarv-model="isResponsiveOpen"position="right":responsive="true":breakpoint="768"animationType="fade"><template #header><h3>响应式侧边栏</h3></template><div class="responsive-content"><p>在小屏幕下自动折叠</p><button @click="isResponsiveOpen = false">关闭</button></div></Sidebar></section><!-- 自定义主题示例 --><section class="demo-section"><h3>自定义主题示例</h3><button @click="isCustomOpen = true">打开自定义侧边栏</button><Sidebarv-model="isCustomOpen"width="400px":overlay-opacity="0.7":animation-duration="500"><template #header><div class="custom-header"><h3>自定义主题</h3><button @click="isCustomOpen = false">×</button></div></template><div class="custom-content"><p>自定义宽度和动画效果</p><div class="custom-menu"><div class="custom-menu-item">设置</div><div class="custom-menu-item">个人信息</div><div class="custom-menu-item">退出</div></div></div></Sidebar></section></div>
</template><style scoped>
.sidebar-demo {padding: 20px;
}.demo-section {margin-bottom: 30px;
}button {padding: 8px 16px;margin: 10px 0;border: none;border-radius: 4px;background: #409EFF;color: white;cursor: pointer;
}.menu-items {padding: 10px;
}.menu-item {padding: 10px;cursor: pointer;
}.menu-item:hover {background: #f5f7fa;
}.custom-header {display: flex;justify-content: space-between;align-items: center;padding: 16px;border-bottom: 1px solid #eee;
}.custom-content {padding: 20px;
}.custom-menu-item {padding: 12px;margin: 8px 0;background: #f5f7fa;border-radius: 4px;cursor: pointer;
}.custom-menu-item:hover {background: #e4e7ed;
}
</style>
📚页面效果
📚自己部署 DeepSeek 安装地址
蓝耘元生代智算云平台地址:https://cloud.lanyun.net/#/registerPage?promoterCode=07100c37a0
📚相关文章
-
0基础3步部署自己的DeepSeek安装步骤
-
DeepSeek 助力 Vue 开发:打造丝滑的步骤条
-
DeepSeek 助力 Vue 开发:打造丝滑的进度条(Progress Bar)
-
自己部署 DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)
-
自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)
-
自己部署 DeepSeek 助力 Vue 开发:打造丝滑的时间线(Timeline )
-
DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)
-
DeepSeek 助力 Vue 开发:打造丝滑的通知栏(Notification Bar)
-
DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)
-
DeepSeek 助力 Vue 开发:打造丝滑的无限滚动(Infinite Scroll)
-
DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)
到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。
更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作
相关文章:
DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
手写一个Java Android Binder服务及源码分析
手写一个Java Android Binder服务及源码分析 前言一、Java语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.aidl3.2 IHelloService.java(自动生成)3.3 HelloService.java…...
考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)
目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…...
java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
Tomcat 屏蔽错误信息。java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p&…...
ros:ur机械臂初识
这是用来可视化的launch文件 比如,我运行 roslaunch ur_description view_ur3.launch ur3模型 ur3e模型 ur5模型 ur5e模型 ur10模型 ur20模型 ur30模型 后来我搜了一下 UR5 和 UR10 都是由 Universal Robots(简称 UR)生产的协作机器人&…...
计算机视觉-局部特征
一、局部特征 1.1全景拼接 先用RANSAC估计出变换,就可以拼接两张图片 ①提取特征 ②匹配特征 ③拼接图像 1.2 点的特征 怎么找到对应点?(才能做点对应关系RANSAC) :特征检测 我们希望找到的点具有的特征有什么特…...
LabVIEW袜品压力测试系统
开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块,实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法,为研究和评价袜子的舒适性提供了新的测试手段。 项目背景 该系统的…...
Node.js 工具模块
Node.js 工具模块 引言 Node.js 是一个开源的、基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端代码,从而构建快速、可扩展的网络应用。在 Node.js 开发过程中,工具模块扮演着至关重要的角色。本文将详细介绍 Node.js 中常用的工具…...
【Redis】下载安装Redis和Redis图形化界面工具教程(2024最新版本,史上最详细)
目录 一、Redis简介 二、Redis下载和安装 2.1、下载 2.2、安装 2.3、环境变量配置(可省略) 三、Redis启动验证 3.1、点击键盘上的WinR键,在跳出的运行界面中输入cmd并确定 3.2、输入redis-cli -v 查看redis的版本号 3.3、接着我们再…...
企业SSL 证书管理指南
文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…...
JDK1.8新特性面试题
lambda表达式 Lambda表达式极大地简化了匿名内部类的创建,促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象,并将其作为参数传递给方法或者赋值给变量。 三要素: 形式参数、箭头、代码块 (形式参数…...
floodfill算法系列一>太平洋大西洋水流问题
目录 题目方法解析:代码设计:代码呈现: 题目方法解析: 代码设计: 代码呈现: class Solution {int m,n;int[] dx {0,0,-1,1};int[] dy {-1,1,0,0};public List<List<Integer>> pacificAtlant…...
【信息学奥赛一本通 C++题解】1258:【例9.2】数字金字塔
信息学奥赛一本通(C版)在线评测系统 基础算法 第一节 动态规划的基本模型 1258:【例9.2】数字金字塔 小学生的课堂讲解 一、解题思路 同学们,今天我们要解决的是数字金字塔找最大路径和的问题。想象一下,数字金字塔就…...
初始c语言(指针和结构体)
前言: 内容: 昨天学的指针,今天复习指针,然后学习结构体 复习: 什么是指针,指针就是地址, int* p &a; p就是指针变量,但是口语一般成为指针 int 说明p指向的对象是in…...
C#(Winform)通过添加AForge添加并使用系统摄像机
先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...
Ubuntu安装geteck/jetlinks实战:源码启动
这个还是很复杂的,建议使用docker即可。 参考 使用源码启动JetLinks | JetLinks 物联网基础平台 安装Ubuntu虚拟机(略)安装JDK8编译Redis安装mysql ubuntu安装MySqL server-CSDN博客 初次使用,不要安装ElasticSearch下载源码…...
探索ELK 的魅力
在大数据时代,海量日志和数据的收集、存储、处理与可视化分析变得越来越重要。而 ELK 堆栈,由 Elasticsearch、Logstash、Beats 和 Kibana 组成,正是一个强大的开源解决方案,帮助开发者和运维人员高效管理和分析日志数据。本文将详…...
137,【4】 buuctf web [SCTF2019]Flag Shop
进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...
变相提高大模型上下文长度-RAG文档压缩-2.带早停机制的map-refine
我试过用map-refine方法来精炼上下文,由于它是线性的,运行时间随着文档数量线性增长。所以可以考虑通过判断上下文是否可以满足QA来提前结束过程。 import os import json from langchain_core.documents import Documentdata [] file_path ./data/da…...
C++ 虚表(Vtable)和虚基表(Vbtale)与 虚函数 和 虚继承
C的虚表(Vtable)和虚基表(Vbtale)是与 虚函数 和 虚继承 密切相关的概念。它们都是用于支持多态(特别是动态绑定)和虚拟继承的机制,但它们的作用和实现方式有所不同。我们将逐步探讨虚表、虚基表…...
2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序
2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现: 一、背景 UWB(Ultra-Wideband)技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一种无需任何载波,通过发送纳秒…...
SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...
草图绘制技巧
1、点击菜单栏文件–》新建–》左下角高级新手切换–》零件; 2、槽口:直槽口,中心点槽口,三点源槽口,中心点圆弧槽口; 3、草图的约束:需要按住ctrl键,选中两个草图,然后…...
机器学习-1:线性回归
常用的线性回归模型主要有以下这些 简单线性回归多元线性回归多项式回归岭回归套索回归弹性网络回归逐步回归 一.简单的一元线性回归 1.导入必备的库 #导入必备的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …...
android 的抓包工具
charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求: 1.启动代理: 2.设置设备端口 3.手机连接当前代理 …...
AJAX 与 ASP 的深入探讨
AJAX 与 ASP 的深入探讨 引言 随着互联网技术的飞速发展,Web应用程序的交互性和性能要求越来越高。AJAX(Asynchronous JavaScript and XML)和ASP(Active Server Pages)作为两种重要的Web开发技术,在提高Web应用程序性能和用户体验方面发挥着重要作用。本文将深入探讨AJ…...
Qt开发①Qt的概念+发展+优点+应用+使用
目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史: 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点: 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…...
函数调用过程的详细解析
目录 一、C语言示例代码 二、汇编代码分步解析(x86架构) 1. 调用前:参数压栈(从右向左) 2. 进入被调函数:保存栈帧 3. 执行函数逻辑 4. 恢复栈帧并返回 三、内存布局图示(调用过程中栈的变…...
教师管理系统在职校中的应用与优势
随着信息技术的不断发展,教师管理系统在职校中的应用越来越广泛。这一系统通过集成教师信息、教学资源和日程安排等功能,为职校管理带来了诸多便利和优势。 教师管理系统能够显著提高管理效率。传统的人工管理方式往往繁琐且易出错,而教师管理…...
【系统架构设计师】虚拟机体系结构风格
目录 1. 说明2. 解释器体系结构风格3. 规则系统体系结构风格4. 例题4.1 例题1 1. 说明 1.p263。2.虚拟机体系结构风格的基本思想是人为构建一个运行环境,在这个环境之上,可以解析与运行自定义的一些语言,这样来增加架构的灵活性。3.虚拟机体…...
UE C++ UObject 功能的初步总结
一. Uboject的 1.垃圾回收:上篇文章介绍过 2.引用更新 1. 反射:之前的文章描述过的CDO,还有就是C与蓝图相互调用UFUCTION,UPROPERTY 2.序列化:编辑器的资产序列化到磁盘上,变为.uasset等格式的资产文件。所有的东西存在编辑器里ÿ…...
Django 美化使用ModelForm的输入框
在初次使用ModelForm时,我的html文件代码如下,主要内容是显示一个卡片式表单,通过循环遍历 form 对象动态生成表单字段 {% extends layout.html %}{% block content %} <div class"container"><div class"c1"&g…...
SQL在云计算中的新角色:重新定义数据分析
文章目录 1. 云计算与数据分析的融合2. SQL在云计算中的新角色3. 分布式SQL查询引擎4. SQL-on-Hadoop解决方案5. SQL与其他数据分析工具的集成6. 实时数据分析与SQL7. SQL在云数据仓库中的角色8. 安全性与隐私保护9. SQL的未来展望《SQL数据分析实战(第2版ÿ…...
使用Redis实现分布式锁,基于原本单体系统进行业务改造
一、单体系统下,使用锁机制实现秒杀功能,并限制一人一单功能 1.流程图: 2.代码实现: Service public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderSe…...
用Python实现线性回归:从数学原理到代码实战
一、前言:为什么线性回归是AI必修课? 作为机器学习领域的"Hello World",线性回归算法具有三大核心价值: 1️⃣ 理解监督学习的底层逻辑(特征工程→模型训练→预测输出) 2️⃣ 掌握梯度下降等优化…...
JS 链表
文章目录 链表题的一些总结两种链表定义set存储链表节点,存的是整个空间同时处理长短不一的两个链表处理方法 while(l1 || l2)处理方法 while(l1 & l2) dummyhead的使用 链表题的一些总结 两种链表定义 class class ListNode {val;next null;constructor(va…...
AI时代:架构师的困境与救赎
在GitHub Copilot生成完整函数、ChatGPT编写业务逻辑的今天,编程正经历着前所未有的范式变革。某在线教育平台的技术负责人曾向我展示:团队使用AI工具3个月后,年轻工程师在架构评审会上对Kafka消息队列的消费机制支支吾吾,却在IDE…...
1-10 github注册仓库
如何在github中注册一个仓库? 1.0 注册仓库 1-1 GitHub的账号注册教程_github注册-CSDN博客 2.0 删除仓库 1-2 从github中删除创建的仓库_github删除仓库-CSDN博客 3.0 创建仓库 1-3 【教程】GitHub新建仓库新手教程_github仓库-CSDN博客 4.0 github操作 1-4 1-9 克…...
JavaScript作用域与闭包
一 作用域 在JavaScript中,作用域(Scope)指的是变量和函数的可访问性范围。在JavaScript中,作用域有全局作用域和局部作用域之分。 全局作用域(Global Scope):全局作用域指的是在代码中任何位置…...
docker容器部署jar应用导入文件时候报缺少字体错误解决
如题,在导入文件时候报错如下: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager 经查是缺少对应字体,解决办法有两张: 第一种:…...
lean4安装
目录 lean4安装windows 证明等比数列和函数函数 lean4安装windows lean4 windows一键安装(全网最简单的安装流程)_lean4安装-CSDN博客 证明等比数列和函数函数 import Mathlib.Data.Real.Basic -- 导入实数基础库 import Mathlib.Tactic.Simps.Basic -- 导入简化策略 im…...
HTML的入门
一、HTML HTML(HyperText Markup Language,超文本标记语言)是一种用来告知浏览器如何组织页面的标记语言。 超文本:就是超越了文本;HTML不仅仅可以用来显示文本(字符串、数字之类),还可以显示视频、音频等…...
Jenkins 部署 之 Mac 一
Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境,如果没有安装,先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装,终端输入命令:brew -v Mac安装HomeB…...
matlab平面波展开法计算的二维声子晶体带隙
平面波展开法计算的二维声子晶体带隙,分别是正方与圆形散射体形成正方格子声子晶体,最后输出了能带图的数据,需要自己用画图软件画出来。 列表 平面波展开法计算二维声子晶体带隙/a2.m , 15823 平面波展开法计算二维声子晶体带隙/a4.m , 942…...
爬虫实战:利用代理ip爬取推特网站数据
引言 亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据:网络数据平台领航者https://www.bright.cn/?promoRESIYEAR50/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_yingjie202502 在跨境电商、社…...
【kafka系列】生产者
目录 发送流程 1. 流程逻辑分析 阶段一:主线程处理 阶段二:Sender 线程异步发送 核心设计思想 2. 流程 关键点总结 重要参数 一、核心必填参数 二、可靠性相关参数 三、性能优化参数 四、高级配置 五、安全性配置(可选࿰…...
Kafka日志数据深度解析:从基础查看到高级操作全攻略
#作者:孙德新 文章目录 查看log日志文件(kafka-dump-log.sh)1、查看Log文件基本数据信息2、index文件健康性检查(--index-sanity-check)3、转储文件(--max-message-size)4、偏移量解码(--offsets-decoder)5、日志数据解析(--transaction-log-decoder)6、查询Log文件…...
单例模式、构造函数、左值右值
拷贝构造函数 简单的说就是——用一个对象构造另外一个对象 class Myclass {public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass(Myclass c) //拷贝构造函数{d c.d;} }; //对比 class Myclass {public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass…...
DeepSeek+即梦 做AI视频
DeepSeek做AI视频 制作流程第一步:DeepSeek 生成视频脚本和分镜 第二步:生成分镜图片绘画提示词第三步:生成分镜图片第四步:使用可灵 AI 工具,将生成的图片转成视频。第五步:剪映成短视频 DeepSeek 真的强&…...
「软件设计模式」建造者模式(Builder)
深入解析建造者模式:用C打造灵活对象构建流水线 引言:当对象构建遇上排列组合 在开发复杂业务系统时,你是否经常面对这样的类:它有20个成员变量,其中5个是必填项,15个是可选项。当用户需要创建豪华套餐A&…...