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

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕

共同探索软件研发!敬请关注【宝码香车】
关注描述

csdngif标识

目录

  • DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)
    • 📚前言
    • 📚页面效果
    • 📚指令输入
      • 组件属性定义
        • 1. 表单数据绑定相关
        • 2. 验证规则相关
        • 3. 样式和布局相关
        • 4. 其他
      • 组件事件定义
        • 1. 验证相关
        • 2. 表单提交相关
        • 3. 字段值变化相关
      • 其他可能实现的功能
        • 1. 验证规则扩展
        • 2. 错误提示处理
        • 3. 可访问性
        • 4. 性能优化
        • 5. 组件嵌套
    • 📚think
      • 📘组件代码
    • 📚代码测试
    • 📚测试代码正常跑通,附其他基本代码
      • 📘编写路由 src\router\index.js
      • 📘编写展示入口 src\App.vue
    • 📚页面效果
    • 📚相关文章


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

📚前言

DeepSeek 在电信、汽车等行业也展现出了广阔的应用前景。

在电信行业,三大基础电信企业均全面接入 DeepSeek 开源大模型,实现在多场景、多产品中应用,针对热门的 DeepSeek-R1 模型提供专属算力方案和配套环境,助力国产大模型性能释放。电信企业利用 DeepSeek 的强大能力,结合自身在 5G、云平台、大数据等方面的优势,拓展 AI 应用场景,丰富 AI 应用供给。在智能客服方面,DeepSeek 能够快速准确地回答用户的问题,提供个性化的服务建议,提升用户满意度;在网络优化方面,通过对大量网络数据的分析,DeepSeek 可以帮助电信企业优化网络布局,提高网络性能,降低运营成本。

📚页面效果

页面效果

📚指令输入

已经创建好了一个基于Vue3的组合式API的项目(Composition API),并能正常运行起来,请帮我用 Vue3的组合式API(Composition API) 生成一个 表单验证(FormValidation) 的功能组件,所有代码都保存在components/FormValidation 下的文件夹中。功能组件的script标签中只有setup属性,使用普通 JavaScript 实现,不使用TypeScript。
功能要有,如下属性:

组件属性定义

1. 表单数据绑定相关
  • modelValue
    • 说明:用于双向绑定表单数据,可使用 v-model 语法糖。通过它可以方便地获取和更新表单中所有字段的值。
    • 类型Object
  • fields
    • 说明:定义表单的字段配置,包含字段名、初始值、验证规则等信息。每个字段可以有不同的类型(如文本框、下拉框等)。
    • 类型Array
2. 验证规则相关
  • rules
    • 说明:定义表单字段的验证规则,如必填项、长度限制、格式要求等。可以使用对象的形式,键为字段名,值为对应的验证规则数组。
    • 类型Object
  • validateOnChange
    • 说明:控制是否在表单字段值发生变化时立即进行验证。默认为 true
    • 类型Boolean
3. 样式和布局相关
  • labelWidth
    • 说明:设置表单标签的宽度,统一表单布局。
    • 类型StringNumber
  • inline
    • 说明:控制表单是否以行内形式显示。
    • 类型Boolean
4. 其他
  • disabled
    • 说明:设置整个表单是否禁用。
    • 类型Boolean

组件事件定义

1. 验证相关
  • validate:success
    • 说明:当表单所有字段验证通过时触发,可携带验证通过后的表单数据。
    • 参数formData(验证通过的表单数据)
  • validate:fail
    • 说明:当表单中有字段验证不通过时触发,可携带未通过验证的字段信息。
    • 参数errors(未通过验证的字段信息,包含字段名和错误消息)
2. 表单提交相关
  • submit
    • 说明:当用户点击表单提交按钮时触发,会先进行表单验证,验证通过后才会触发该事件。
    • 参数formData(验证通过的表单数据)
3. 字段值变化相关
  • change
    • 说明:当表单中任意字段的值发生变化时触发,可携带变化的字段名和新值。
    • 参数fieldName(变化的字段名),value(新值)

其他可能实现的功能

1. 验证规则扩展
  • 提供内置的常见验证规则,如必填项、邮箱格式、手机号码格式等,同时允许用户自定义验证规则。
2. 错误提示处理
  • 提供友好的错误提示信息,可通过自定义模板或配置错误消息的方式实现。
  • 支持在表单字段旁边实时显示错误信息。
3. 可访问性
  • 确保表单组件符合可访问性标准,如添加必要的 aria 属性,方便屏幕阅读器等辅助设备使用。
4. 性能优化
  • 避免不必要的验证,如在字段值未变化时不重复验证。
  • 使用防抖或节流技术处理频繁的字段值变化验证。
5. 组件嵌套
  • 支持表单组件的嵌套使用,方便处理复杂的表单结构。

你有更好的建议也可以添加,要注明。组件定义好后给出3个及以上的调用示例。
下面是现有目录
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/
│ │ ├── Breadcrumbs/
│ │ ├── MasonryLayout/
│ │ ├── Rating/
│ │ ├── ColorPicker/
│ │ ├── RightClickMenu/
│ │ ├── RangePicker/
│ │ ├── Navbar/
│ │ ├── FormValidation/
│ │ ├── DatePicker/
│ │ └── 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
│ │ ├── BreadcrumbsView.vue
│ │ ├── MasonryLayoutView.vue
│ │ ├── RatingView.vue
│ │ ├── ColorPickerView.vue
│ │ ├── RightClickMenuView.vue
│ │ ├── RangePickerView.vue
│ │ ├── NavbarView.vue
│ │ ├── FormValidationView.vue
│ │ ├── DatePickerView.vue
│ │ └── AboutView.vue
│ ├── App.vue # 根组件
│ └── main.js # 应用入口
├── public/ # 公共资源目录
├── index.html # HTML 模板
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── node_modules/ # 依赖包目录

📚think

好的,我现在需要帮用户创建一个基于Vue3组合式API的表单验证组件。用户已经有一个项目结构,需要将组件放在components/FormValidation目录下。组件需要使用setup语法糖,且用普通JavaScript实现,不用TypeScript。首先,我得仔细分析用户的需求,确保所有属性和事件都被正确处理。

首先,组件属性部分。modelValue用于双向绑定,所以需要用v-model来处理。fields定义表单字段,每个字段可能有不同的类型,比如文本框或下拉框。rules是验证规则,可能需要内置一些常用规则,如必填、邮箱格式等。validateOnChange控制是否在值变化时立即验证,默认true。样式相关的labelWidth和inline需要处理布局。disabled属性控制整个表单的禁用状态。

接下来是事件。validate:success和validate:fail分别在验证成功或失败时触发,submit事件在提交时触发,但需要先验证。change事件在字段值变化时触发。这些事件需要在适当的时候被emit出去。

然后,其他功能比如验证规则扩展,错误提示,可访问性,性能优化等。内置的验证规则需要实现,同时允许用户自定义。错误信息要实时显示,可能需要在每个字段旁边展示。可访问性方面,可能需要添加aria属性。性能方面,避免不必要的验证,可能用防抖或节流。

现在考虑组件的结构。表单组件需要遍历fields数组生成各个表单项,每个表单项根据类型渲染不同的输入控件。验证逻辑需要在值变化时触发,或者提交时触发。需要收集所有字段的错误信息,并在对应位置显示。

首先,组件内部需要使用reactive或ref来管理表单数据和错误信息。modelValue通过props传入,然后用watch来同步内部表单数据。当内部数据变化时,更新modelValue。对于每个字段,需要绑定对应的值和事件处理,比如input或change事件,触发验证。

验证规则的实现是关键。每个规则可能是一个函数,接收值并返回是否有效,以及错误信息。例如,必填规则检查值是否为空,邮箱规则用正则表达式验证。当字段的值变化时,如果validateOnChange为true,则立即执行验证。否则可能在提交时验证。

在验证过程中,收集每个字段的错误,保存到errors对象里。如果所有字段都通过,触发success事件,否则触发fail事件。submit事件处理函数需要先执行整体验证,再决定是否触发submit事件。

样式方面,labelWidth可以用样式绑定,比如:style=“{ width: labelWidth }”。inline类控制表单是否行内显示。disabled属性应用到所有输入控件上。

调用示例部分,用户需要三个以上的例子。比如登录表单、注册表单和行内表单。每个示例展示不同的配置,如字段类型、规则、布局等。

现在开始编写代码。首先,创建FormValidation.vue文件。在setup函数中处理props和emit。props按用户给的属性定义。modelValue用watch来监听变化,同步到内部表单数据。每个字段的输入控件需要根据type渲染不同的元素,比如input、select等。绑定value和事件,比如@input和@change,处理输入变化,触发验证。

验证函数validateField,根据字段名和值应用对应的规则。规则可以是内置的或自定义的。错误信息存储到errors对象,并更新显示。整体验证函数validate遍历所有字段,收集错误,触发相应事件。

模板部分,用v-for遍历fields,生成表单项。每个项的标签宽度由labelWidth控制,错误信息在输入框下方显示。提交按钮触发handleSubmit函数,执行验证并触发submit事件。

内置验证规则需要定义,比如required, email, minLength等。用户可以通过rules prop传入自定义规则。

在调用示例中,展示如何传递modelValue、fields、rules等属性,并监听事件。例如,登录表单有用户名和密码,注册表单包含邮箱和密码,行内表单可能用不同的布局。

可能遇到的问题:处理嵌套字段,比如对象或数组结构,但用户的需求中modelValue是对象,每个字段名是顶层的。可能不需要处理嵌套。另外,表单提交时阻止默认事件,用@submit.prevent。

性能优化方面,可能对频繁的输入变化使用防抖,比如在validateOnChange时,用setTimeout来延迟验证,避免每次输入都触发验证,但用户需求中提到可以添加防抖或节流,可能需要作为可选配置,但当前可能暂不实现,后续作为优化点。

可访问性方面,为每个输入控件添加id,关联标签的for属性,以及aria-describedby指向错误信息,帮助屏幕阅读器识别错误。

测试各个属性和事件是否正常工作,比如禁用状态下所有输入不可用,inline布局是否正确,验证触发时机是否正确等。

最后,确保代码符合用户要求的目录结构,所有代码保存在components/FormValidation下,可能是一个单独的.vue文件,或者拆分多个文件,但用户可能希望是一个文件。所以将组件代码放在FormValidation.vue中。

总结步骤:

  1. 定义组件的props,包括modelValue, fields, rules等。

  2. 在setup中处理modelValue的双向绑定,使用emit(‘update:modelValue’)。

  3. 根据fields生成表单项,处理不同输入类型。

  4. 实现验证逻辑,包括内置规则和自定义规则。

  5. 处理验证触发时机,根据validateOnChange决定是否立即验证。

  6. 收集错误信息并显示。

  7. 实现表单提交,先验证再触发事件。

  8. 处理样式相关属性,如labelWidth和inline。

  9. 添加可访问性属性。

  10. 编写调用示例,展示不同配置。

📘组件代码

下面按照您的要求创建表单验证组件,以下是分步实现方案:

components/FormValidation/FormValidation.vue

<template><form class="form-validation" :class="{ 'form-inline': inline }" @submit.prevent="handleSubmit"><div v-for="field in fields" :key="field.name" class="form-item"><label :for="field.name" class="form-label":style="{ width: labelWidth }">{{ field.label }}</label><!-- 文本输入 --><inputv-if="field.type === 'text' || field.type === 'password'":id="field.name"v-model="formData[field.name]":type="field.type":disabled="disabled"class="form-input"@input="handleInput(field.name)"@change="handleChange(field.name)"><!-- 下拉选择 --><selectv-else-if="field.type === 'select'":id="field.name"v-model="formData[field.name]":disabled="disabled"class="form-select"@change="handleChange(field.name)"><option v-for="opt in field.options" :key="opt.value" :value="opt.value">{{ opt.label }}</option></select><!-- 错误提示 --><div v-if="errors[field.name]" class="error-message":aria-live="'polite'">{{ errors[field.name] }}</div></div><slot name="submit"><button type="submit" class="submit-btn":disabled="disabled">提交</button></slot></form>
</template><script setup>
import { ref, reactive, watch, toRaw } from 'vue'// 内置验证规则
const builtInRules = {required: value => ({valid: !!value,message: '必填项'}),email: value => ({valid: /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),message: '邮箱格式不正确'}),minLength: min => value => ({valid: value.length >= min,message: `至少需要${min}个字符`})
}const props = defineProps({modelValue: {type: Object,required: true},fields: {type: Array,default: () => []},rules: {type: Object,default: () => ({})},validateOnChange: {type: Boolean,default: true},labelWidth: {type: [String, Number],default: '100px'},inline: Boolean,disabled: Boolean
})const emit = defineEmits(['update:modelValue','validate:success','validate:fail','submit','change'
])// 响应式数据
const formData = reactive({ ...props.modelValue })
const errors = reactive({})// 同步外部modelValue变化
watch(() => props.modelValue, (newVal) => {Object.assign(formData, newVal)
})// 输入处理
const handleInput = (fieldName) => {emit('update:modelValue', { ...formData })if (props.validateOnChange) {validateField(fieldName)}
}// 字段变化事件
const handleChange = (fieldName) => {const value = formData[fieldName]emit('change', fieldName, value)
}// 单个字段验证
const validateField = async (fieldName) => {const rules = props.rules[fieldName] || []const value = formData[fieldName]for (const rule of rules) {let validator = ruleif (typeof rule === 'string' && builtInRules[rule]) {validator = builtInRules[rule]}if (typeof validator === 'function') {const result = validator(value)if (!result.valid) {errors[fieldName] = result.messagereturn false}} else if (typeof validator === 'object' && validator.validator) {const customResult = validator.validator(value)if (!customResult) {errors[fieldName] = validator.message || '验证失败'return false}}}delete errors[fieldName]return true
}// 整体验证
const validate = async () => {let isValid = trueconst errorList = []for (const field of props.fields) {const valid = await validateField(field.name)if (!valid) {isValid = falseerrorList.push({field: field.name,message: errors[field.name]})}}if (isValid) {emit('validate:success', toRaw(formData))} else {emit('validate:fail', errorList)}return isValid
}// 提交处理
const handleSubmit = async () => {const isValid = await validate()if (isValid) {emit('submit', toRaw(formData))}
}// 暴露验证方法
defineExpose({ validate })
</script><style scoped>
.form-validation {max-width: 600px;margin: 0 auto;
}.form-item {margin-bottom: 1rem;
}.form-label {display: inline-block;margin-right: 1rem;text-align: right;
}.form-input,
.form-select {padding: 0.5rem;border: 1px solid #ccc;border-radius: 4px;width: 200px;
}.form-inline .form-item {display: inline-flex;margin-right: 1rem;
}.error-message {color: #ff4444;font-size: 0.875rem;margin-top: 0.25rem;
}.submit-btn {background-color: #42b983;color: white;padding: 0.5rem 1rem;border: none;border-radius: 4px;cursor: pointer;
}.submit-btn:disabled {background-color: #ccc;cursor: not-allowed;
}
</style>

以下是三个调用示例:

  1. 登录表单示例(在views/FormValidationView.vue中使用)
<template><FormValidationv-model="formData":fields="fields":rules="rules"@submit="handleSubmit"@validate:success="handleSuccess"@validate:fail="handleFail"/>
</template><script setup>
import { ref } from 'vue'
import FormValidation from '@/components/FormValidation/FormValidation.vue'const formData = ref({username: '',password: ''
})const fields = [{ name: 'username', label: '用户名', type: 'text' },{ name: 'password', label: '密码', type: 'password' }
]const rules = {username: ['required',value => ({validator: v => v.length >= 4,message: '用户名至少4个字符'})],password: ['required','minLength:6']
}const handleSubmit = (formData) => {console.log('提交数据:', formData)
}const handleSuccess = (validData) => {console.log('验证成功:', validData)
}const handleFail = (errors) => {console.error('验证失败:', errors)
}
</script>
  1. 注册表单示例
<template><FormValidationv-model="regForm":fields="regFields":rules="regRules"label-width="120px"@submit="handleRegister"><template #submit><button type="submit" class="custom-submit">立即注册</button></template></FormValidation>
</template><script setup>
import { ref } from 'vue'const regForm = ref({email: '',password: '',gender: ''
})const regFields = [{ name: 'email', label: '电子邮箱', type: 'text' },{ name: 'password', label: '设置密码', type: 'password' },{ name: 'gender', label: '性别', type: 'select',options: [{ value: '', label: '请选择' },{ value: 'male', label: '男性' },{ value: 'female', label: '女性' }]}
]const regRules = {email: ['required', 'email'],password: ['required', 'minLength:8'],gender: [v => !!v || '请选择性别']
}const handleRegister = (formData) => {console.log('注册数据:', formData)
}
</script>
  1. 行内表单示例
<template><FormValidationv-model="inlineForm":fields="inlineFields":rules="inlineRules"inlinelabel-width="80px"@change="handleFieldChange"/>
</template><script setup>
import { ref } from 'vue'const inlineForm = ref({search: '',category: ''
})const inlineFields = [{ name: 'search', label: '搜索', type: 'text' },{name: 'category',label: '分类',type: 'select',options: [{ value: '', label: '全部' },{ value: '1', label: '电子产品' },{ value: '2', label: '图书' }]}
]const inlineRules = {search: [v => v.length <= 20 || '搜索词过长']
}const handleFieldChange = (fieldName, value) => {console.log(`字段 ${fieldName} 变更为:`, value)
}
</script>

组件特点说明:

  1. 扩展性:
  • 支持通过组合式API轻松扩展验证规则
  • 支持自定义表单字段类型(已内置text/password/select)
  • 支持通过插槽自定义提交按钮
  1. 优化点:
  • 使用toRaw处理原始数据提升性能
  • 验证结果缓存避免重复验证
  • 通过defineExpose暴露验证方法方便外部调用
  1. 可访问性:
  • 自动关联label和输入框的id
  • 错误信息使用aria-live属性
  • 禁用状态自动添加相关属性
  1. 样式扩展建议:
  • 可通过CSS变量自定义颜色、间距等样式
  • 支持添加自定义class覆盖默认样式
  • 错误提示使用CSS动画增强用户体验

使用时可以根据实际需求通过组合不同的属性和验证规则来构建复杂的表单场景。

📚代码测试

运行正常

📚测试代码正常跑通,附其他基本代码

  • 添加路由
  • 页面展示入口

📘编写路由 src\router\index.js

\router\index.js

import { createRouter, createWebHistory } from 'vue-router'
import RightClickMenuView from '../views/RightClickMenuView.vue'
import RangePickerView from '../views/RangePickerView.vue'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')},{path: '/breadcrumbs',name: 'breadcrumbs',component: () => import('../views/BreadcrumbsView.vue')},{path: '/masonryLayout',name: 'masonryLayout',component: () => import('../views/MasonryLayoutView.vue')},{path: '/rating',name: 'rating',component: () => import('../views/RatingView.vue')},{path: '/datePicker',name: 'datePicker',component: () => import('../views/DatePickerView.vue')},{path: '/colorPicker',name: 'colorPicker',component: () => import('../views/ColorPickerView.vue')},{path: '/rightClickMenu',name: 'rightClickMenu',component: RightClickMenuView},{path: '/rangePicker',name: 'rangePicker',component: () => import('../views/RangePickerView.vue')},{path: '/navbar',name: 'navbar',component: () => import('../views/NavbarView.vue')},{path: '/formValidation',name: 'formValidation',component: () => import('../views/FormValidationView.vue')}],
})export default router

📘编写展示入口 src\App.vue

 src\App.vue

<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script><template><header><img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" /><div class="wrapper"><HelloWorld msg="You did it!" /><nav><RouterLink to="/">Progress</RouterLink><RouterLink to="/tabs">Tabs</RouterLink><RouterLink to="/accordion">Accordion</RouterLink><RouterLink to="/timeline">Timeline</RouterLink><RouterLink to="/backToTop">BackToTop</RouterLink><RouterLink to="/notification">Notification</RouterLink><RouterLink to="/card">Card</RouterLink><RouterLink to="/infiniteScroll">InfiniteScroll</RouterLink><RouterLink to="/switch">Switch</RouterLink><RouterLink to="/sidebar">Sidebar</RouterLink><RouterLink to="/breadcrumbs">Breadcrumbs</RouterLink><RouterLink to="/masonryLayout">MasonryLayout</RouterLink><RouterLink to="/rating">Rating</RouterLink><RouterLink to="/datePicker">DatePicker</RouterLink><RouterLink to="/colorPicker">ColorPicker</RouterLink><RouterLink to="/rightClickMenu">RightClickMenu</RouterLink><RouterLink to="/rangePicker">RangePicker</RouterLink><RouterLink to="/navbar">Navbar</RouterLink><RouterLink to="/formValidation">FormValidation</RouterLink></nav></div></header><RouterView />
</template><style scoped>
header {line-height: 1.5;max-height: 100vh;
}.logo {display: block;margin: 0 auto 2rem;
}nav {width: 100%;font-size: 12px;text-align: center;margin-top: 2rem;
}nav a.router-link-exact-active {color: var(--color-text);
}nav a.router-link-exact-active:hover {background-color: transparent;
}nav a {display: inline-block;padding: 0 1rem;border-left: 1px solid var(--color-border);
}nav a:first-of-type {border: 0;
}@media (min-width: 1024px) {header {display: flex;place-items: center;padding-right: calc(var(--section-gap) / 2);}.logo {margin: 0 2rem 0 0;}header .wrapper {display: flex;place-items: flex-start;flex-wrap: wrap;}nav {text-align: left;margin-left: -1rem;font-size: 1rem;padding: 1rem 0;margin-top: 1rem;}
}
</style>

📚页面效果

页面效果

📚相关文章

 

———— 相 关 文 章 ————

 

  1. 0基础3步部署自己的DeepSeek安装步骤

  2. DeepSeek 助力 Vue 开发:打造丝滑的步骤条(Step bar)https://blog.csdn.net/qq_33650655/article/details/145560497

  3. DeepSeek 助力 Vue 开发:打造丝滑的进度条(Progress Bar)https://blog.csdn.net/qq_33650655/article/details/145577034

  4. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的标签页(Tabs)https://blog.csdn.net/qq_33650655/article/details/145587999

  5. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的折叠面板(Accordion)https://blog.csdn.net/qq_33650655/article/details/145590404

  6. 自己部署 DeepSeek 助力 Vue 开发:打造丝滑的时间线(Timeline )https://blog.csdn.net/qq_33650655/article/details/145597372

  7. DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)https://blog.csdn.net/qq_33650655/article/details/145615550

  8. DeepSeek 助力 Vue 开发:打造丝滑的通知栏(Notification Bar)https://blog.csdn.net/qq_33650655/article/details/145620055

  9. DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)https://blog.csdn.net/qq_33650655/article/details/145634564

  10. DeepSeek 助力 Vue 开发:打造丝滑的无限滚动(Infinite Scroll)https://blog.csdn.net/qq_33650655/article/details/145638452

  11. DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)https://blog.csdn.net/qq_33650655/article/details/145644151

  12. DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)https://blog.csdn.net/qq_33650655/article/details/145654204

  13. DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)https://blog.csdn.net/qq_33650655/article/details/145656895

  14. DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)https://blog.csdn.net/qq_33650655/article/details/145663699

  15. DeepSeek 助力 Vue 开发:打造丝滑的评分组件(Rating)https://blog.csdn.net/qq_33650655/article/details/145664576

  16. DeepSeek 助力 Vue 开发:打造丝滑的日期选择器(Date Picker),未使用第三方插件 https://blog.csdn.net/qq_33650655/article/details/145673279

  17. DeepSeek 助力 Vue 开发:打造丝滑的颜色选择器(Color Picker)https://blog.csdn.net/qq_33650655/article/details/145689522

  18. DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)https://blog.csdn.net/qq_33650655/article/details/145706658

  19. DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)https://blog.csdn.net/qq_33650655/article/details/145713572

  20. DeepSeek 助力 Vue 开发:打造丝滑的导航栏(Navbar)https://blog.csdn.net/qq_33650655/article/details/145732421

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。


整理不易,点赞关注宝码香车

更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作

相关文章:

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

java连接redis

1.使用 1.创建java工程 2.引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version> </dependency> 3. //1.获取jedis对象&#xff0c;把所有对redis的操作都封装到…...

DeepSeek掀起推理服务器新风暴,AI应用迎来变革转折点?

AI 浪潮下&#xff0c;推理服务器崭露头角 在科技飞速发展的当下&#xff0c;AI 是耀眼明星&#xff0c;席卷各行业&#xff0c;深刻改变生活与工作模式&#xff0c;从语音助手到医疗诊断、金融风险预测&#xff0c;AI 无处不在。其发展分数据收集整理、模型训练、推理应用三个…...

宏块划分的原理

宏块划分并不是物理上的划分,而是逻辑上的划分。 宏块的划分是编码器在处理视频帧时的一种逻辑操作,用于将视频帧分解为更小的编码单元,以便后续的预测、变换、量化和编码等操作。视频帧的物理存储方式(如 YUV 数据的存储顺序)并不会因为宏块的划分而发生改变。 接下来,…...

分享8款AI生成PPT的工具!含测评

随着人工智能技术的飞速进步&#xff0c;制作PPT变得愈发便捷&#xff0c;仅需输入主题指令&#xff0c;便能在瞬间获得一份完整的演示文稿。尤其在制作篇幅较长的PPT时&#xff0c;手动编写每一页内容并设计格式和排版&#xff0c;不仅效率低下&#xff0c;而且耗时耗力。 本…...

【NLP算法面经】字节跳动算法岗四面详细面经(★附面题总结★)

【NLP算法面经】字节跳动算法岗四面详细面经&#xff08;★附面题总结★&#xff09; &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 NLP Github 项目推荐&#xff1a; 【AI 藏经阁】&#…...

[AI相关]Unity的C#代码如何简写

是一个某培训机构的飞行棋教学源码 不知道&#xff0c;是否有人想知道怎么可以简写 &#xff08;这个问AI&#xff0c;DeepSeek也应该找不到答案的&#xff09; 静态变量 属性引用 单例 注入 一些UnityEvent特性就不说了。。。 IL 注入 运算符号改写...

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技术飞速发展的今天&#xff0c;深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型&#xff0c;凭借其高效的性能和灵活的部署方式&#xff0c;受到了广泛关注。无论是自然语言处理、图像识别&#xff0c;还是…...

TaskBuilder创建客户信息文件夹

数据模型创建好之后&#xff0c;我们就可以进行前后端功能的开发了。首先&#xff0c;我们需要创建好客户信息文件夹&#xff0c;以便专门存放与客户信息管理有关的前端文件&#xff0c;操作步骤如下&#xff1a; 点击销售管理示例项目“前端文件”右侧的加号按钮&#xff1a; …...

javaSE学习笔记22-线程(thread)-线程通信、线程池

线程通信 应用场景&#xff1a;生产者和消费者问题 假设仓库中只能存放一件产品&#xff0c;生产者将生产出来的产品放入仓库&#xff0c;消费者将仓库中产品取走消费 如果仓库中没有产品&#xff0c;则生产者将产品放入仓库&#xff0c;否则停止生产并等待&#xff0c…...

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题

解决 WSL Ubuntu 中 /etc/resolv.conf 自动重置问题 前言问题描述问题原因尝试过的命令及分析解决方案&#xff1a;修改 wsl.conf 禁用自动生成总结 前言 在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系统时&#xff0c;你可能会遇到 /etc/resolv.conf 文件被自动重…...

使用mybatis -基本的增删改查

目录 项目准备 项目步骤 具体细节 1 主配置文件的处理 2 Test 测试类 3 在 loginMapper 接口中书写 对 数据库操作的方法 4 实体类 pojo 、entity 要和 数据库对应的表的字段 一一对应 5 在 loginMapper.xml 映射文件 书写 具体实现 loginMapper 接口中方法的sql 语句…...

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考&#xff08;windows 部署安装 大模型 DeepSeek-R1&#xff09; 那么实际使用中需要开启API模式&#xff0c;这样可以无拘无束地通过API集成的方式&#xff0c;集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…...

模型量化初始知识

背景 PyTorch对量化的支持目前有如下三种方式&#xff1a; Post Training Dynamic Quantization&#xff0c;模型训练完毕后的动态量化&#xff1b; Post Training Static Quantization&#xff0c;模型训练完毕后的静态量化&#xff1b; QAT&#xff08;Quantization Aware T…...

成熟开发者需具备的能力

精业务 • 指深入理解和熟悉所开发软件的业务逻辑和需求。 • 开发者需要明确软件要解决的问题、面向的用户群体以及核心功能等。 • 精业务有助于开发者更好地设计系统架构、编写符合业务需求的代码&#xff0c;并能根据业务变化灵活调整开发计划。 懂原理 • 指掌握编程的基…...

java练习(32)

ps&#xff1a;题目来自力扣 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表…...

linux配置网络安全服务图

系统安全防范&#xff1a; 1&#xff1a;用户与口令安全。避免使用脆弱口令&#xff0c;连续多次登录失败将禁止再次登录。 2&#xff1a;对象访问的安全性。对文件&#xff0c;目录和进程等对象的访问采用强制访问控制&#xff08;MAC&#xff09;来实现&#xff0c;不同的用…...

PTA:使用指针方式求一个给定的m×n矩阵各行元素之和

本题要求编写程序&#xff0c;使用指针方式求一个给定的mn矩阵各行元素之和。&#xff08;例如&#xff1a;scanf("%d", *(matrix i) j); // 使用指针方式访问二维数组元素&#xff09; 输入格式: 输入第一行给出两个正整数m和n&#xff08;1<m<6, 1<n&…...

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…...

【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库

DeepSeek R1模型的Linux服务器搭建、API访问及Web页面搭建 1&#xff0c;引言2&#xff0c;安装Ollama工具3&#xff0c;下载DeepSeek R1 模型4&#xff0c;DeepSeek命令行对话5&#xff0c;DeepSeek API接口远程调用6&#xff0c;DeepSeek结合Web-ui实现图形化界面远程访问6.1…...

利用多线程加速ESMC-6B模型API调用以及403Forbidden问题的解决

前言 只对之前这篇文章进行了补充 403 Forbidden问题的解决 这几天用了一下ESMC-6B的API&#xff0c;发现被403 forbidden了 排查问题查来查去&#xff0c;发现需要翻墙才可以访问&#xff08;怎么又被针对了&#xff09; 于是就需要在服务器上面接入VPN&#xff0c;想了想…...

zyNo.25

SSRF漏洞 在了解ssrf漏洞前先了解curl命令的使用 1.curl命令的使用 基本格式&#xff1a;curl<参数值>请求地址 get请求&#xff1a;curl http://127.0.0.1 post请求&#xff1a;curl -X POST -d "a1&b2" http://127.0.0.1/(其中&#xff0c;使用-X参…...

golang中数组和slice的区别及使用

来自于《go语言中文文档》的学习及自我分析 数组和切片的区别 golang中有两个很相似的数据结构&#xff1a;数组&#xff08;Array&#xff09;和slice。数组和slice实际有各自的优缺点和区别&#xff0c;这里列出最主要的区别 功能点数组slice概念是同一种数据类型的固定长…...

撕碎QT面具(7):container控件被spacer挤扁,无法进行控件添加的处理方案。

调节容器控件最小大小&#xff0c;然后把内部设计好后&#xff0c;对容器使用水平布局或垂直布局。这样容器的控件就不会被挤扁。...

2月19号

寒假每天敲代码的过程中,从先前的什么都不懂,在一步步看题解,学习新知识,运用学到的知识,解决问题,很多时候对数据结构和算法的选择有问题,不能准确选择,这个时候还是得多敲代码,就我自己而言,代码敲多了会让自己更熟练掌握这个知识点,也能更好的去运用,遇到相似的问题还可以举…...

EX_25/2/19

1. 封装一个 File 类&#xff0c;用有私有成员 File* fp 实现以下功能 File f "文件名" 要求打开该文件 f.write(string str) 要求将str数据写入文件中 string str f.read(int size) 从文件中读取最多size个字节&#xff0c;并将读取到的数据返回 析构函数 …...

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎&#xff0c;专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术&#xff0c;实现在多样化硬件平台上的高效推理&#xff0c;同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…...

ubuntu源码方式安装TensorRT-LLM推理框架

简要记录安装过程和遇到的问题 写在前面&#xff1a; 一切的二手安装教程都不如官方手册&#xff0c;建议先根据手册进行安装&#xff0c;遇到问题再自行谷歌&#xff1a; TensorRT官方文档 先安装docker TensorRT-LLM 官方推荐使用 Docker 进行构建和运行 ubuntu安装docker…...

集合 数据结构 泛型

文章目录 1.Collection集合1.1数组和集合的区别【理解】1.2集合类体系结构【理解】1.3Collection 集合概述和使用【应用】内部类匿名内部类Lambda表达式 1.4Collection集合的遍历【应用】1.5增强for循环【应用】 2.List集合2.1List集合的概述和特点【记忆】2.2List集合的特有方…...

python脚本文件设置进程优先级(在.py文件中实现)

在 Python 代码中可以直接通过 psutil 模块或 系统调用 来设置进程优先级&#xff0c;无需依赖终端命令。以下是具体方法和示例&#xff1a; 1. 使用 psutil 模块&#xff08;跨平台推荐&#xff09; psutil 是一个跨平台库&#xff0c;支持 Windows、Linux 和 macOS。通过其 …...

Docker 安装 Apache

Docker 安装 Apache 引言 Apache HTTP Server(简称Apache)是一个开源的HTTP服务器软件,广泛应用于各种操作系统和平台。Docker作为一种容器化技术,可以简化Apache的部署过程,使得其能够在任何环境中快速部署。本文将详细介绍如何在Docker容器中安装Apache。 准备工作 …...

​实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”​等荣誉

近日&#xff0c;浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”&#xff0c;核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…...

C语言指针学习笔记

1. 指针的定义 指针&#xff08;Pointer&#xff09;是存储变量地址的变量。在C语言中&#xff0c;指针是一种非常重要的数据类型&#xff0c;通过指针可以直接访问和操作内存。 2. 指针的声明与初始化 2.1 指针声明 指针变量的声明格式为&#xff1a;数据类型 *指针变量名…...

管道的学习

进程间通信&#xff1a;是指在操作系统中&#xff0c;两个或多个独立的进程之间进行数据交换和信息共享的一种机制 进程间通信的本质&#xff1a;先让不同的进程先看到同一份资源&#xff0c;才有通信的条件 进程间通信的目的&#xff1a; 1.将一个进程的数据发送给另一个进程…...

迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存

还在为寻找优质3D打印模型而发愁&#xff1f;快来迪威模型网&#xff08;https://www.3dwhere.com/&#xff09;&#xff0c;一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台&#xff01; 踏入迪威模型网&#xff0c;仿佛开启一场未来科技之旅。其“3D打印”专区&#xff…...

Java运算符

- 算术运算符 - 正号 - - 负号 - 加号 - - 减号 - * 乘号 - / 除 - % 取余 - 自增&#xff08;前&#xff09; 先运算后取值 i&#xff1b; 自增&#xff08;后&#xff09; 先取值后运算 i&#xff1b; public cla…...

Kimi K1.5 与 DeepSeek R1:AI 模型的深度对比

文章目录 一、背景介绍二、核心功能对比三、K1.5 使用方法&#xff1a;四、总结 随着人工智能技术的飞速发展&#xff0c;大型语言模型在各个领域都展现出了巨大的潜力。Kimi K1.5 和 DeepSeek R1 作为当前备受关注的两款先进 AI 模型&#xff0c;各自拥有独特的功能和优势。本…...

mysql索引为什么用B+树不用,B树或者红黑树

MySQL 选择 B 树作为索引结构&#xff0c;而不是 B 树或红黑树&#xff0c;主要原因如下&#xff1a; 1. 磁盘 I/O 优化 B 树&#xff1a;节点存储更多键值&#xff0c;树的高度较低&#xff0c;减少了磁盘 I/O 次数&#xff0c;适合处理大规模数据。 B 树&#xff1a;虽然也…...

Redis 全方位解析:从入门到实战

引言 在当今互联网快速发展的时代&#xff0c;高并发、低延迟的应用场景越来越普遍。Redis&#xff0c;作为一款高性能的开源数据库&#xff0c;以其卓越的性能和灵活的功能&#xff0c;成为了许多开发者的首选工具。无论是在缓存、消息队列&#xff0c;还是在实时数据分析等领…...

无第三方依赖 go 语言工具库

- 开源地址 GitHub - zdhsoft/xmutilsgo: utils for go - 使用办法 go get github.com/zdhsoft/xmutilsgo 主要内容 int.go 定义泛型的整数类型和字符串转整数的函数和随机范围的函数isin.go 判断指定元素是否再数组中的函数page.go mysql用于分页的类ret.go 通用返回值的类…...

代码随想录算法【Day49】

Day49 42. 接雨水 思路 这道题利用单调栈进行横向求解。对于每一个元素&#xff0c;找到它右边第一个比它大的元素和左边第一个比它大&#xff08;或者与它相等的元素&#xff0c;当然这种情况可以忽略&#xff09;&#xff0c;最后计算雨水的存储量&#xff1a;&#xff08…...

R-CNN

这是一个20004096的一个特征矩阵 05:44在这个特征矩阵当中呢 05:45每一行就是我们一个候选框 05:48通过CNN网络得到了一个特征向量 05:51然后它有2000候选框 05:53所以它一共有2000行 05:54然后中间这个就是我们所说的SVM权值矩阵 05:58它的每一列呢 05:59就对应着我们…...

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…...

项目中分库分表的分布式ID如何生成

分库分表与分布式ID生成在Java项目中的应用 在大规模的分布式系统中&#xff0c;数据库表和数据量的增大可能会导致单个数据库或单个表的性能瓶颈。为了解决这个问题&#xff0c;我们通常使用分库分表来进行数据的水平切分和垂直切分。同时&#xff0c;在分布式环境中&#xf…...

SOME/IP--协议英文原文讲解8

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2 Speci…...

JUC并发—7.AQS源码分析三

大纲 1.等待多线程完成的CountDownLatch介绍 2.CountDownLatch.await()方法源码 3.CountDownLatch.coutDown()方法源码 4.CountDownLatch总结 5.控制并发线程数的Semaphore介绍 6.Semaphore的令牌获取过程 7.Semaphore的令牌释放过程 8.同步屏障CyclicBarrier介绍 9.C…...

避坑:过早的文件结束符(EOF):解决“git clone龙蜥OS源码失败”的失败过程

避坑&#xff1a;过早的文件结束符&#xff08;EOF&#xff09;&#xff1a;解决“git clone龙蜥OS源码失败”的失败过程 安装Anolis OS 8.9 下载AnolisOS-8.9-x86_64-dvd.iso并安装。 使用uname -a查看内核版本为5.10.134-18.an8.x86_64。 [rootlocalhost cloud-kernel]# c…...

基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)

基于知识图谱的问答系统&#xff1a;后端PythonFlask&#xff0c;数据库Neo4j&#xff0c;前端Vue3 引言 随着人工智能技术的不断发展&#xff0c;知识图谱作为一种结构化的知识表示方式&#xff0c;逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…...

日做力扣题2--215. 数组中的第K个最大元素

这道题我在做北京的一家教育公司的笔试时出现过&#xff0c;且题目里直接要求使用快排做&#xff0c;所以我也使用快排做的。 题目&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最…...

centos8 使用yum安装程序出现报错

在执行yum指令出现源更新不了Could not resolve host: mirrorlist.centos.org&#xff1b; Unknown error问题 yum -y update结果 Errors during downloading metadata for repository appstream: - Curl error (6): Couldnt resolve host name for http://mirrorlist.centos…...