基于Vue 3与JSON数据构建MBTI运势生成器:前端实战开发指南

news2026/5/16 14:51:19
1. 项目概述当MBTI遇上运势一个技术驱动的趣味应用最近在GitHub上看到一个挺有意思的项目叫“mbti-fortune”作者是leilei926524-tech。光看名字你可能会觉得这又是一个简单的星座运势或者性格测试的变种。但作为一个在Web开发和数据应用领域摸爬滚打了十多年的老手我第一眼看到的其实是它背后那个非常典型的“技术趣味”的融合场景。简单来说这个项目就是根据你的MBTI人格类型为你生成一份“专属运势”。听起来有点玄学对吧但恰恰是这种“玄学”与“科学”或者说是“确定性”的技术的结合点才最有意思也最考验开发者的产品思维和技术实现能力。MBTI迈尔斯-布里格斯类型指标本身是一个基于心理学理论的性格分类工具它将人的性格分为16种类型比如INTJ、ENFP等等在年轻人群体中非常流行常被用于自我认知、职业规划甚至社交破冰。而“运势”则是一个更偏向娱乐、文化和心理暗示的领域。把这两者结合起来本质上是在做一个“个性化内容生成器”。它的核心价值不在于预测的准确性这本身也无法被科学验证而在于提供一种有趣的、带有一定“定制感”的互动体验满足用户的好奇心、娱乐需求甚至是一种社交货币——比如在朋友圈分享你的“今日MBTI运势”。这个项目适合谁呢首先是对前端开发、尤其是现代Web应用框架如React, Vue感兴趣的学习者。其次是想了解如何将静态数据MBTI类型描述与动态、随机的内容生成逻辑结合起来的开发者。最后任何对产品创意、用户体验设计有兴趣的人都能从这个轻量级项目中看到如何将一个简单的想法包装成一个完整、可交互的应用。接下来我就带大家深入拆解一下要实现这样一个“mbti-fortune”应用我们需要思考哪些问题以及具体该如何一步步实现。2. 核心思路与产品设计拆解在动手写代码之前我们必须先想清楚这个产品要做什么以及怎么做。这不仅仅是功能列表更是对用户体验流程和技术架构的顶层设计。2.1 需求分析与功能定义一个完整的“MBTI运势”应用至少需要包含以下几个核心环节MBTI类型输入/选择用户如何告知系统自己的类型有两种主流方式。一是提供一个包含16种类型的下拉选择框这是最直接、最准确的方式。二是提供一个简化的测试问卷通过几道关键题目来推断用户的类型这种方式互动性更强但结果可能不准确更适合娱乐场景。对于第一个版本我强烈建议从简单的选择器开始快速验证核心功能。运势内容生成这是核心逻辑。我们需要为每一种MBTI类型16种准备一个“运势语料库”。这个库不能只是一句话而应该是多个维度的内容集合例如今日概述、工作建议、人际提醒、幸运物等。然后系统需要根据用户选择的类型从对应的语料库中随机或按一定规则选取内容组合成一份完整的运势报告。结果展示与交互生成的运势报告需要以美观、易读的方式呈现给用户。考虑到分享需求UI设计需要简洁、有吸引力可能还需要生成便于分享的图片。此外可以加入“重新生成”、“查看其他类型运势”、“分享到社交平台”等交互按钮提升用户粘性。数据与持久化可选是否需要记录用户的选择或生成历史对于这样一个轻量级应用初期可以不做后端数据库完全依赖前端。但如果想增加“每日运势”每天只生成一次或“历史运势回顾”功能就需要引入用户系统和数据存储了。2.2 技术栈选型与考量选择合适的技术栈能让开发事半功倍。针对这个项目我的推荐如下前端框架React 或 Vue.js。两者都是构建现代交互式单页面应用SPA的绝佳选择。React生态更庞大Vue则更易上手。考虑到项目需要动态更新运势内容、处理用户交互使用这类框架比纯原生JavaScript或jQuery要高效、可维护得多。我个人近期更偏爱Vue 3的组合式API代码组织非常清晰。样式方案Tailwind CSS。这是一个实用优先的CSS框架。对于这种需要快速搭建、且对UI美观度有一定要求的项目Tailwind能极大提升开发效率。你不需要在CSS文件和组件文件之间来回切换直接在HTML/JSX中通过类名就能定义样式并且能轻松实现响应式设计。构建工具Vite。无论是React还是Vue现在都用Vite作为构建工具就对了。它启动速度极快热更新HMR体验丝滑远超传统的Webpack能让你更专注于开发本身。部署平台Vercel 或 Netlify。它们对前端项目的部署支持是“傻瓜式”的连接你的GitHub仓库每次推送代码就能自动部署。并且都提供免费的HTTPS证书和CDN非常适合个人项目或原型。注意技术选型没有绝对的对错只有是否适合当前团队和项目阶段。对于个人学习项目选择你最想学或最熟悉的技术即可。核心是把产品逻辑实现。2.3 数据结构设计运势语料库的构建这是项目的“灵魂”所在。运势内容的质量和丰富度直接决定了用户体验的好坏。我们不能简单地写死16段话。一个推荐的结构是使用JSON来组织数据。为每一种MBTI类型创建一个对象每个对象内包含多个数组每个数组代表一个运势维度。// fortunes_data.json { INTJ: { overview: [ 今日你强大的战略思维将找到用武之地。, 理性之光闪耀适合解决复杂难题的一天。, 你的远见可能会让他人感到惊讶坚持自己的判断。 ], work: [ 专注于长期项目规划避免陷入琐碎细节。, 尝试用系统化的方法优化工作流程你会看到效率提升。, 适合独立钻研但必要时也别忘了向团队阐明你的蓝图。 ], relationship: [ 你的直率今天可能被误解为冷漠表达时可以稍加修饰。, 与志同道合者进行深度对话会让你感到愉悦。, 不必强求所有人都理解你的思维模式。 ], lucky_item: [一本逻辑严密的书, 黑色笔记本, 一杯黑咖啡] }, ENFP: { overview: [ 今天是灵感迸发的一天无数新点子等着你去捕捉。, 热情是你的超能力用它去感染身边的人吧。, 小心别让三分钟热度主导了一切选一个点子深挖下去。 ], // ... 其他维度 } // ... 其他14种类型 }这样设计的好处是易于维护要修改或扩充运势内容只需要编辑这个JSON文件。便于程序读取前端可以轻松地通过fortunes_data[‘INTJ’][‘work’]来获取对应数组。灵活性高可以轻松地增加新的运势维度如“健康提示”、“财运指南”。3. 前端核心功能实现详解有了清晰的设计和数据结构我们就可以开始编码了。这里我以 Vue 3 Composition API Tailwind CSS 的技术栈为例演示核心功能的实现。React的实现思路也基本相通。3.1 项目初始化与基础搭建首先使用Vite快速创建一个Vue项目。npm create vuelatest mbti-fortune # 按照提示选择需要的特性。本项目建议添加TypeScript, Vue Router (可选) Pinia (状态管理可选)。 cd mbti-fortune npm install然后安装Tailwind CSS。npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p按照Tailwind官方文档配置tailwind.config.js和全局CSS文件。完成后我们就可以得到一个干净、现代化的开发环境。3.2 组件设计与数据管理我们将构建两个主要组件TypeSelector.vue负责让用户选择MBTI类型。FortuneDisplay.vue负责展示生成的运势。状态管理由于组件间需要共享“用户选择的类型”和“生成的运势文本”这两个状态我们使用Vue 3的ref或reactive在父组件例如App.vue中管理即可对于这个规模的项目无需引入Pinia。在App.vue中我们定义核心状态和导入数据。!-- App.vue 脚本部分 -- script setup langts import { ref, computed } from vue; import TypeSelector from ./components/TypeSelector.vue; import FortuneDisplay from ./components/FortuneDisplay.vue; // 假设我们将 fortunes_data.json 放在 public 或通过 import 导入 // 这里为了演示先定义一个简化的本地数据 const fortunesData { INTJ: { overview: [运势A1, 运势A2], work: [工作建议A1], relationship: [人际A1], lucky_item: [物品A] }, ENFP: { overview: [运势B1], work: [工作建议B1], relationship: [人际B1], lucky_item: [物品B] }, // ... 其他类型 }; const selectedType ref(INTJ); // 默认选中INTJ const generatedFortune ref{[key: string]: string}({}); // 存储生成的各个维度运势文本 // 生成运势的函数 const generateFortune () { const typeData fortunesData[selectedType.value]; if (!typeData) return; const newFortune: {[key: string]: string} {}; // 遍历该类型的所有维度从每个维度的数组中随机取一项 Object.keys(typeData).forEach(dimension { const options typeData[dimension]; const randomIndex Math.floor(Math.random() * options.length); newFortune[dimension] options[randomIndex]; }); generatedFortune.value newFortune; }; // 当 selectedType 变化时自动重新生成运势 // 或者可以提供一个按钮让用户手动触发 /script3.3 类型选择器组件实现TypeSelector.vue组件提供一个下拉菜单列出所有16种MBTI类型。!-- TypeSelector.vue -- template div classmb-8 label formbti-select classblock text-lg font-medium text-gray-700 mb-2请选择你的MBTI人格类型/label select idmbti-select v-modellocalSelectedType changeonTypeChange classw-full md:w-auto px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 text-lg cursor-pointer transition duration-150 ease-in-out option v-fortype in mbtiTypes :keytype :valuetype {{ type }} /option /select p classmt-2 text-sm text-gray-500不知道自己的类型可以搜索“MBTI测试”进行简单评估。/p /div /template script setup langts import { ref, defineProps, defineEmits } from vue; const mbtiTypes [INTJ, INTP, ENTJ, ENTP, INFJ, INFP, ENFJ, ENFP, ISTJ, ISFJ, ESTJ, ESFJ, ISTP, ISFP, ESTP, ESFP]; const props defineProps{ modelValue: string; }(); const emit defineEmits{ update:modelValue: [value: string]; }(); const localSelectedType ref(props.modelValue); const onTypeChange () { emit(update:modelValue, localSelectedType.value); }; /script实操心得这里使用v-model和自定义事件实现了父子组件的双向数据绑定。注意我们为select元素添加了细致的Tailwind样式类使其看起来更现代、友好。提示文字“不知道自己的类型”是一个很好的用户体验细节能减少用户的困惑。3.4 运势展示组件与生成逻辑FortuneDisplay.vue组件接收生成的运势对象并将其美观地渲染出来。!-- FortuneDisplay.vue -- template div v-ifObject.keys(fortune).length 0 classbg-gradient-to-br from-white to-indigo-50 p-8 rounded-2xl shadow-xl border border-indigo-100 div classtext-center mb-6 h2 classtext-3xl font-bold text-gray-800你的专属运势/h2 p classtext-indigo-600 mt-2献给今天的 {{ selectedType }}/p /div div classspace-y-6 div v-for(value, key) in fortune :keykey classfortune-item h3 classtext-xl font-semibold text-gray-700 mb-2 capitalize border-l-4 border-indigo-500 pl-3{{ getDimensionName(key) }}/h3 p classtext-gray-600 text-lg leading-relaxed pl-3{{ value }}/p /div /div div classmt-10 pt-6 border-t border-gray-200 div classflex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4 button clickonRegenerate classpx-6 py-3 bg-indigo-600 text-white font-medium rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition duration-150 ease-in-out 换一条运势 /button button clickonShare classpx-6 py-3 bg-green-500 text-white font-medium rounded-lg hover:bg-green-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 transition duration-150 ease-in-out 分享好运 /button /div /div /div div v-else classtext-center py-12 text-gray-500 p classtext-xl请先选择你的MBTI类型以生成运势。/p /div /template script setup langts import { defineProps, defineEmits } from vue; const props defineProps{ fortune: { [key: string]: string }; selectedType: string; }(); const emit defineEmits([regenerate, share]); const dimensionMap: { [key: string]: string } { overview: 今日概览, work: 工作指南, relationship: 人际提醒, lucky_item: 幸运物 }; const getDimensionName (key: string) { return dimensionMap[key] || key; }; const onRegenerate () { emit(regenerate); }; const onShare () { // 分享功能实现见下文 emit(share); }; /script style scoped .fortune-item:hover { apply bg-white bg-opacity-50 rounded-lg p-2 transition duration-150 ease-in-out; } /style在App.vue的模板中我们将组件组合起来。!-- App.vue 模板部分 -- template div classmin-h-screen bg-gradient-to-b from-gray-50 to-white p-4 md:p-8 header classtext-center mb-10 h1 classtext-4xl md:text-5xl font-bold text-gray-900 mb-4MBTI 今日运势/h1 p classtext-xl text-gray-600 max-w-2xl mx-auto探索属于你人格类型的独特能量与每日指引。仅供娱乐愿你拥有美好的一天。/p /header main classmax-w-4xl mx-auto TypeSelector v-modelselectedType / button clickgenerateFortune classw-full md:w-auto mb-10 px-8 py-4 bg-gradient-to-r from-purple-600 to-indigo-600 text-white text-xl font-semibold rounded-xl shadow-lg hover:shadow-xl hover:from-purple-700 hover:to-indigo-700 transform hover:-translate-y-0.5 transition-all duration-200 focus:outline-none focus:ring-4 focus:ring-purple-300 ✨ 生成我的今日运势 /button FortuneDisplay :fortunegeneratedFortune :selected-typeselectedType regenerategenerateFortune sharehandleShare / /main footer classmt-16 text-center text-gray-500 text-sm p本应用内容基于MBTI类型理论随机生成仅供娱乐与自我反思。/p p classmt-2Made with ❤️ by [你的名字] | 项目灵感来自 leilei926524-tech/mbti-fortune/p /footer /div /template3.5 关键交互分享功能实现分享功能能极大提升应用的传播性。我们可以实现“复制文本分享”和“生成分享图片”两种方式。复制文本分享利用现代浏览器的 Clipboard API。// 在 App.vue 的脚本部分添加 handleShare 函数 const handleShare async () { const shareText 我的MBTI${selectedType.value}今日运势\n Object.entries(generatedFortune.value).map(([key, value]) ${dimensionMap[key] || key}: ${value}).join(\n) \n\n快来生成你的专属运势吧; try { await navigator.clipboard.writeText(shareText); alert(运势已复制到剪贴板快去分享给朋友吧); // 更优雅的方式是使用一个Toast提示组件 } catch (err) { console.error(复制失败:, err); // 降级方案使用一个隐藏的textarea const textArea document.createElement(textarea); textArea.value shareText; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { document.execCommand(copy); alert(运势已复制); } catch (err2) { alert(复制失败请手动选择文本复制。); } document.body.removeChild(textArea); } };生成分享图片这是一个更高级但体验更好的功能。可以使用html2canvas库将运势展示区域的DOM节点转换为图片。npm install html2canvas!-- 在 FortuneDisplay.vue 中修改分享按钮逻辑 -- script setup langts import html2canvas from html2canvas; // ... 其他代码 const onShare async () { // 先尝试使用 Web Share API (移动端友好) if (navigator.share) { try { await navigator.share({ title: 我的MBTI(${props.selectedType})运势, text: formatShareText(), // 格式化文本的函数 // url: window.location.href, // 可以分享链接 }); return; } catch (err) { console.log(Web Share 取消或失败降级到图片分享); } } // 降级方案生成图片 const displayElement document.querySelector(.fortune-display-container); // 给运势展示区域加个类名 if (displayElement) { try { const canvas await html2canvas(displayElement as HTMLElement, { backgroundColor: null, // 透明背景 scale: 2, // 提高分辨率 useCORS: true, }); const imgData canvas.toDataURL(image/png); // 触发下载 const link document.createElement(a); link.download mbti-fortune-${props.selectedType}-${Date.now()}.png; link.href imgData; link.click(); } catch (err) { console.error(生成图片失败:, err); alert(生成分享图片失败请尝试复制文本。); } } else { // 如果生成图片也失败回退到复制文本 emit(share); } }; const formatShareText () { // ... 格式化文本的逻辑 }; /script注意事项html2canvas在渲染某些CSS属性如box-shadow,gradient时可能会有兼容性问题需要进行测试和调整。此外生成图片是CPU密集型操作在移动端低性能设备上可能会造成卡顿使用时需注意用户体验。4. 数据、优化与部署进阶基础功能实现后我们可以考虑如何让项目更健壮、更专业。4.1 动态数据加载与更新将庞大的运势数据16种类型 * 多个维度 * 多条内容硬编码在JS文件中会让代码臃肿。更好的做法是将其放在一个独立的JSON文件中并通过网络请求动态加载。将fortunes_data.json放在项目的public目录下或上传到某个静态文件托管服务如 GitHub Gist, JSONBin。在应用初始化时例如在App.vue的onMounted钩子中使用fetch或axios加载数据。// App.vue import { ref, onMounted } from vue; const fortunesData ref({}); const isLoading ref(true); onMounted(async () { try { const response await fetch(/fortunes_data.json); // 或远程URL const data await response.json(); fortunesData.value data; } catch (error) { console.error(加载运势数据失败:, error); // 可以设置一个默认的、简化的数据或显示错误信息 } finally { isLoading.value false; } });这样做的好处是后期更新运势内容时无需重新构建和部署整个前端应用只需替换JSON文件即可。4.2 用户体验优化点加载状态在数据加载或生成运势时显示一个加载动画Spinner或骨架屏Skeleton Screen避免界面无响应。动画与过渡使用Vue的Transition组件或 Tailwind 的transition类为类型切换、运势生成等操作添加平滑的过渡效果提升质感。本地存储使用localStorage记录用户上次选择的MBTI类型下次访问时自动选中提升用户便利性。响应式设计利用Tailwind的响应式前缀如md:lg:确保应用在手机、平板、电脑上都有良好的显示效果。上面的示例代码已经考虑了这一点。SEO基础优化虽然是一个高度交互的SPA但我们可以使用Vue Meta或Vite插件来管理页面的标题、描述和关键词让搜索引擎更好地理解页面内容。4.3 部署上线使用Vercel或Netlify部署是最简单的。将代码推送到GitHub仓库。登录Vercel/Netlify点击“New Project”导入你的GitHub仓库。构建命令通常会自动识别为npm run build输出目录为dist。点击部署。之后每次向主分支推送代码都会自动触发新的部署。部署后你会获得一个形如https://your-project.vercel.app的永久链接就可以分享给朋友了。5. 常见问题、扩展思路与避坑指南在实际开发和思考这个项目的过程中我总结了一些可能会遇到的问题和可以深入的方向。5.1 开发与调试中的常见问题问题可能原因解决方案选择类型后运势没变化1.v-model绑定或事件未正确触发。2. 生成运势的函数generateFortune未被调用或数据未更新。1. 检查TypeSelector组件是否通过emit正确向上传递了值。2. 在App.vue中使用Vue Devtools检查selectedType和generatedFortune这两个响应式变量的值是否更新。可以在generateFortune函数开头加console.log调试。样式在移动端错乱Tailwind的响应式类使用不当或容器宽度未限制。1. 确保外层容器使用了max-width和mx-auto来居中并限制最大宽度。2. 多使用w-full移动端和md:w-auto桌面端来调整元素宽度。使用浏览器开发者工具的“设备工具栏”进行模拟测试。html2canvas生成的图片模糊或样式缺失1. 未设置scale参数。2. 使用了html2canvas不支持的CSS属性如backdrop-filter。3. 图片跨域。1. 将scale设置为2或3。2. 简化要截图区域的CSS避免使用太新的属性。3. 如果图片来自外链确保设置useCORS: true并且图片服务器允许跨域。部署后页面空白404单页面应用(SPA)的路由问题。Vercel/Netlify未正确配置重定向规则。在项目根目录创建vercel.json(Vercel) 或_redirects(Netlify) 文件配置将所有路径重定向到index.html。对于Vite项目这通常是自动配置的但若出现问题需手动检查。5.2 项目扩展方向这个基础框架有很大的扩展潜力增加“每日一签”结合日期例如new Date().toDateString()生成基于“类型日期”的哈希值作为随机种子。这样同一类型用户在一天内看到的运势是固定的增加了“每日”的仪式感和可分享性。引入后端与数据库使用Node.js Express或Next.js API Routes、Python Flask等轻量级后端搭配MongoDB或PostgreSQL。可以实现用户登录、保存历史运势、点赞/收藏某条运势、甚至用户贡献运势内容UGC的功能。更丰富的运势维度与算法除了随机选取可以引入更复杂的算法。例如根据一天中的时间、用户所在地的天气调用第三方API来微调运势内容。或者为每条运势内容打上“能量值”、“建议强度”等标签进行智能组合。社交功能允许用户为生成的运势“点赞”或“点踩”收集反馈数据反过来优化运势语料库。可以做一个“今日最受欢迎运势”榜单。多语言支持使用i18n库将界面和运势内容翻译成多种语言吸引更广泛的用户。5.3 避坑心得与总结数据质量优先这个项目的“灵魂”是运势内容。前期花时间搜集、撰写或生成高质量、有趣、贴合各MBTI类型特点的文案比追求复杂的技术特性更重要。内容要有梗、有共鸣才能引发传播。先完成再完美不要一开始就想着把所有扩展功能都做了。先用最简方案静态JSON数据、前端随机生成做出一个可用的版本并上线。获得真实反馈后再决定迭代方向。注意性能如果运势数据JSON文件很大要考虑分片加载或使用压缩。html2canvas操作比较耗时可以考虑在用户点击“分享图片”按钮后再去加载该库动态导入避免影响首屏加载速度。版权与声明如果运势内容并非完全原创需注意引用来源。在应用显著位置注明“内容仅供参考仅供娱乐”避免引起不必要的误解或纠纷。回过头看“leilei926524-tech/mbti-fortune”这个项目标题看似简单却是一个非常好的全栈练手项目。它覆盖了现代Web开发的核心链路产品构思、UI/UX设计、前端交互、数据处理、部署运维。通过实现它你不仅能熟悉Vue/React等框架还能实践状态管理、API调用、性能优化、乃至简单的产品思维。最重要的是它有趣有展示度做完后你会有实实在在的成就感。希望这篇超详细的拆解能帮你不仅复现这个项目更能理解其背后的设计逻辑并激发出属于自己的创意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2602812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…