资讯动态

藏头诗微信小程序源码解析:从玩法设计到文本生成落地

发布时间:2026/10/20 23:33:19 来源:尧图企业网站定制
简介藏头诗微信小程序源码包是一份完全基于前端实现的微信小程序项目省去后端服务器依赖适合小程序开发初学者、个人开发者及需要快速搭建轻量应用的创业者。整套源码共 19 个文件由 js 逻辑脚本、json 页面配置、wxss 全局与页面样式、wxml 结构模板及少量 png 静态图组成压缩后仅 147KB轻量易部署。目前已有 374 人学习是观察小程序标准工程结构的良好样例。通过阅读这份工程可以学习 App() 全局逻辑、页面生命周期函数、WXML/WXSS 的 MVVM 数据绑定方式以及 rpx 自适应单位的使用同时源码中涉及用户授权、分享等常见 API 的调用对初探小程序路由跳转与状态管理也有直接的参考价值。页面与静态资源分层清晰全局与局部配置组织得当便于快速定位修改点适合在此基础上二次开发个性化的藏头诗生成工具。1. 藏头诗微信小程序源码先看它解决了什么问题再决定要不要动手读它用户输入两到四个字的名字等一两秒拿到一首句首藏着这些字的小诗截图发朋友圈——这就是“藏头诗微信小程序源码”这个 zip 里最核心的场景。它看起来是个小玩具但拆开看前端要处理输入、渲染与分享后端要处理文本生成与内容安全中间还夹着微信平台的一堆审核约束对想入门小程序开发的人来说是个典型的小而全的样例。做文本生成的人也会关心同一个问题规则拼接、词库组合、模型生成这三条路线摆在藏头诗场景里的代价分别是什么。这篇就顺着“源码里有什么→怎么生成→怎么跑通→会遇到什么坑→怎么做得更好”的顺序讲透。2. 翻开 zip 之前藏头诗小程序的玩法边界与核心模块组成2.1 两种玩法藏头、藏字与藏尾先明确代码要支持哪一种常见的藏头诗就是把用户输入的几个字拆开分别作为五言或七言诗每句的第一个字。名字是两个字的一般生成四句两个名字字分别占用前两句句首后两句用祝福语或意象字兜底名字是四个字的正好一个字对应一句。这是最保守也最好实现的玩法。还有一种变体叫“藏字”要求名字出现的绝对位置一致比如都在每句第二个字再激进一点是“藏尾”把名字放在每句末尾。玩法不同数据结构和生成逻辑完全不同。拿到源码后第一步不是看代码而是确认它做了哪种玩法去 pages 目录里找输入页的提示文字看是只让用户填名字还是让用户选了“五言七言”“藏头藏尾”。这个决定直接决定了后面所有的算法设计。边界问题通常藏在细节里两个字的用户要四句诗名字只覆盖两个句首剩下的句首用什么字补我看到过的源码多半兜底用“福、安、乐、康、喜”这类高频祝福字也有直接重复名字第一个字的后者很容易翻车——用户叫“张伟”四句句首变“张伟张伟”读起来像绕口令。读懂一个小程序的玩法边界比读懂它的代码更值钱因为玩法决定了你能改到什么程度。2.2 源码通用骨架页面、逻辑、数据接口与诗词库各管什么一个典型的藏头诗微信小程序源码无论作者怎么写目录骨架几乎逃不出这套结构pages 目录下至少两个页面index 是输入页result 是结果页utils 目录放请求封装和生成算法data 目录放诗词库app.js 做全局初始化app.json 注册页面并声明窗口样式。数据放哪里是读源码时最需要留意的一个分叉点。有的源码把诗词库做成一个本地 JSON 文件生成逻辑完全在小程序前端跑好处是离线可用、不需要后端坏处是诗词库体积会挤占小程序包体限制而且后续更新词库必须重新发版。有的源码把生成逻辑收在服务端小程序只负责把名字传给接口好处是算法更新不需要用户升级小程序坏处是你得自己养一台服务器还要配置合法域名。从我做这类小项目的经验看入门级源码里八成走的是“本地词库前端拼接”路线因为它不依赖任何部署条件复制到开发者工具里就能跑。2.3 先搞懂微信小程序的双线程运行模型再看代码读藏头诗源码之前有一个概念必须搞清楚小程序不是普通的网页它分视图层和逻辑层。视图层跑 WXML 和 WXSS负责渲染逻辑层跑 JavaScript负责计算。两层之间通过 setData 通信而且是异步的。这个模型带来的第一个坑是看到 setData 就以为它在刷新整个页面于是把整首诗的字符串丢进去结果渲染卡顿。第二个坑是把 wx.request 当成浏览器里的 fetch以为可以直接调用第三方接口实际上小程序的请求域名必须提前在微信公众平台后台配置否则真机直接失败。藏头诗这种场景文本很短真正的性能问题不在渲染而在页面跳转时把名字参数弄丢了。常见做法是把名字通过 URL 参数传给结果页或者存到全局变量里我一般推荐 URL 参数因为分享场景下别人点进卡片也能拿到参数。2.4 拿到源码后的第一遍通读顺序建议别从诗词库开始读那里面可能有几千条数据读不完会劝退。我建议按这个顺序先看 app.json了解这个项目注册了哪些页面、tabBar 有没有、window 怎么配然后进 pages/index读输入页的逻辑看用户提交时到底调用了哪个函数接着找到生成函数的入口在开发者工具里直接跑一下最后去结果页看渲染字段。整个链路搞清楚后再回头读诗词库的 JSON 结构只看字段名就够——是“首字”还是“全句”有没有“韵脚”标注。只要数据流清晰后面所有改动都有抓手。如果读了一圈发现生成逻辑不在前端而在某个接口里那你要做的第一件事不是读代码而是确认接口文档和域名配置后面第四章会专门讲。3. 把藏头诗生成规则拆成代码三类算法的选型理由与代价3.1 规则模板拼接法起步最快、效果最“程序员审美”模板法的核心思路是把名字直接嵌进预设的句式里。名字叫“张伟”就生成“张灯结彩迎新岁伟业宏图展宏图”。代码量极少逻辑一眼能看穿几行 if 就能跑通。但效果非常依赖模板数量模板少就翻车模板多其实就退化成了第二种词库法。我见过一个源码里的模板是“X 山翠色映朝霞Y 水清波送晚舟”名字换成什么都往这个壳里套结果用户叫“李雷”还能读叫“张三丰”直接语义崩坏。模板法最大的问题是重字和语义错配名字里的字在句子里既要做句首又要和后面的词构成通顺短语而模板根本没有这个能力。它对写作质量没要求、对运行环境没要求适合做原型验证不适合作为一个小程序的核心卖点长期保留。3.2 基于诗词库的首字组合法自然度更高工程代价在词库词库法是把素材整理成“首字到候选句”的映射生成时按用户名字逐字查表。比如用户要“林”字开头库里有“林间新绿一重重”还有“林风拂面送清凉”从中取一条老字“张”可能有三十条候选越常用的字候选越多。这种方式的自然度上限高但工程代价在词库建设和维护。一个可用的映射库至少要把常用名字字覆盖到三五千字每个字配两到三句语义完整的句子整理下来是上万句的量级靠手工录入不现实常见做法是从公开的诗词数据里做清洗再用自造句补覆盖缺口。词库的字段设计很重要我一般会砍到最少首字、全句、韵脚、热度权重。韵脚字段看起来可加可不加但没有它你没法做押韵筛选生成结果里就会出现句尾平仄混乱的观感。3.3 接入大模型接口效果上限高但成本、延时与合规要提前算账大模型生成的藏头诗自然度和语境理解是前两种方式比不了的但落地的时候有三笔账必须算清楚。第一笔是延时账模型接口快则两三秒慢则十秒以上用户在小程序里等一首诗超过三秒就会流失大半。第二笔是成本账每次生成一次请求消耗 tokens如果小程序没有收入模式这就是纯亏损。第三笔是合规账微信对小程序内的 UGC 内容有明确审核要求从大模型接口拿到的文本必须先过一遍内容安全检测才能展示给用户。还有一个技术约束很容易被忽略小程序端不能直接调用云端模型接口必须经过你自己的服务端中转。原因是小程序的请求域名必须是备案过的 HTTPS 域名而且前端直接放模型接口的密钥等于裸奔AppSecret 一旦被扒出来损失不可控。所以走这条路的源码前端和后端是两套工程前端 zip 里通常只保留了调你服务端接口的部分。如果拿到手的 zip 只有一个纯前端项目那它大概率没有接模型接口别被说明文档里的“AI 生成”字样带偏了。三条路线的对比如下选型时只看自己手上的资源选型效果上限工程成本依赖条件适合场景模板拼接低极低无原型验证、练手词库组合中高高词库建设无正式小程序、离线可用大模型接口高中服务端中转成本服务器域名备案内容安全付费功能、会员权益3.4 一套可复现的 JavaScript 核心实现与参数调节不管源码里采用哪种路线生成函数的核心逻辑都是相通的。下面这份代码实现了“词库组合重字过滤韵脚归一化”的最小可用版本可以直接放进小程序的 utils 目录里或者复制到 Node 环境里做验证。// utils/acrostic.js // 诗词库结构首字 - 候选句数组每句带韵脚分组和热度权重 const POETRY_LIB { 林: [ { text: 林间新绿一重重, rhyme: ong, hot: 80 }, { text: 林风拂面送清凉, rhyme: ang, hot: 60 }, ], 风: [ { text: 风起云扬万里程, rhyme: eng, hot: 90 }, ], }; // 韵脚分组表句尾字按韵母粗分组够用即可不用做到诗韵全集 const RHYME_GROUP { a: a, ia: a, ua: a, o: o, e: o, uo: o, i: i, ü: i, u: i, ai: ai, uai: ai, ei: ei, ui: ei, ao: ao, iao: ao, ou: ou, iu: ou, an: an, ian: an, uan: an, en: en, in: en, un: en, ang: ang, iang: ang, uang: ang, eng: eng, ing: eng, ong: eng, }; function normalizeRhyme(ending) { // 取句尾字的拼音韵母映射到粗分组找不到就原样返回 return RHYME_GROUP[ending] || ending || ; } function buildAcrostic(name, options {}) { const { lines 4, fallbackChar 福 } options; const chars [...name].slice(0, lines); // 名字不足四字时补齐兜底字 while (chars.length lines) { chars.push(fallbackChar); } const usedEndings []; const usedChars new Set(); const result []; for (let i 0; i lines; i) { const ch chars[i]; if (usedChars.has(ch)) { // 重字时换用同组候选句避免两句句首相同 result.push(${ch}气东来满乾坤); continue; } usedChars.add(ch); const candidates POETRY_LIB[ch] || []; // 优先取热度高、且句尾韵脚不与前文重复的句子 const viable candidates.filter((c) { const rhyme normalizeRhyme(c.rhyme); return !usedEndings.includes(rhyme); }); const pool viable.length 0 ? viable : candidates; const picked pool.sort((a, b) b.hot - a.hot)[0]; if (!picked) { result.push(${ch}华正茂展宏图); } else { usedEndings.push(normalizeRhyme(picked.rhyme)); result.push(picked.text); } } return result; } module.exports { buildAcrostic, normalizeRhyme };这段代码的核心逻辑分四步先把用户输入的名字拆成单个字符不足四句时用兜底字补齐然后逐字查诗词库过滤掉句尾韵脚与前面重复的候选再按热度权重排序取最优句子查无此字时落到模板兜底。参数lines控制生成句数fallbackChar控制名字不足时的补位字改成安、乐都行但要注意兜底字本身也要避开和名字字重复。重字处理单独拎出来说明名字里如果带重复字比如“林林”第二句会直接走兜底分支。有一种更优雅的做法是为每个字准备多组候选重字时取另一组避免句首连续重复。诗词库的热度字段hot是给高频名字用的常见做法是把“伟、芳、娜、敏、静”这类名字高频字的热度整体调高让常用名优先命中更通顺的句子这个技巧在最后一章还会展开。4. 在开发者工具里把它跑起来从解压到真机预览的四个关键配置4.1 解压后先改这三个地方AppID、项目根目录与调试基础库从 zip 解压出来的目录第一件事不是急着看代码而是导入微信开发者工具。导入时选择目录工具会提示你填写 AppID这里可以先用测试号不影响本地开发真机预览时再换成你自己申请的小程序 AppID。这三个配置项我建议按顺序检查# 开发者工具导入项目时重点确认三个位置 project.config.json # appid 字段、miniprogramRoot 字段 app.json # pages 数组、window 配置 sitemap.json # 索引配置不影响本地调试project.config.json里的miniprogramRoot经常是坑。有的源码把小程序代码放在根目录有的放在miniprogram/子目录下如果开发者工具提示“找不到 app.json”九成是miniprogramRoot指向不对。把miniprogramRoot改成miniprogram/或者删掉字段让工具重新识别即可。调试基础库版本也值得确认太老的基础库不支持某些新 API太新的基础库可能和源码里的旧写法不兼容。我一般选一个当前稳定版本跑通后再说。4.2 打通“输入名字→请求后端→展示诗词”的完整链路跑通的关键是理解数据的流向。输入页拿到用户填写的名字经过校验后要么直接调用前端生成函数要么把名字 POST 到服务端接口拿到结果后跳转到结果页。结果页在onLoad里通过options读取名字和诗文本再用setData渲染到 WXML。// pages/result/result.js Page({ data: { name: , lines: [] }, onLoad(options) { const name decodeURIComponent(options.name || ); const lines (options.lines || ).split(|).filter(Boolean); if (lines.length 0) { // 兜底本地重新生成 const { buildAcrostic } require(../../utils/acrostic); const generated buildAcrostic(name); this.setData({ name, lines: generated }); } else { this.setData({ name, lines }); } }, });注意这里我把诗文本用|分隔放进 URL 参数避免中文和特殊字符在分享链路上被截断进入结果页后如果参数缺失再走一次本地生成作为兜底。跳转前记得对用户输入做长度校验名字超过四个字就不要硬生成常见做法是弹出提示让用户缩短。页面跳转代码一般是wx.navigateTo({ url: /pages/result/result?name encodeURIComponent(name) lines lines.join(|) })其中lines在本地生成时可拿到在后端生成时等接口返回后再拼。4.3 把 request 封装成可复用模块超时、错误码与加载状态源码里如果走接口请求wx.request绝对不能被到处裸写。我见过一个翻车例子作者在三个页面里各写了一份请求逻辑超时时间不一致结果用户在一个页面等十秒才报错。正确做法是封装成一个统一的请求模块// utils/request.js function request(url, { method GET, data {}, timeout 10000 } {}) { return new Promise((resolve, reject) { wx.request({ url, method, data, timeout, success(res) { if (res.statusCode 200 res.statusCode 300) { resolve(res.data); } else { reject(new Error(HTTP ${res.statusCode})); } }, fail(err) { reject(err); }, }); }); } // 组件里统一用法 const { request } require(../../utils/request); request(https://api.example.com/acrostic, { method: POST, data: { name: 林风 }, }) .then((res) { console.log(生成成功句子数量, res.lines.length); wx.navigateTo({ url: /pages/result/result?name林风lines res.lines.join(|) }); }) .catch((err) { wx.showToast({ title: 生成失败请重试, icon: none }); });这个封装解决三个问题统一超时时间默认 10 秒弱网环境自动失败而不是无限转圈统一错误码处理任何非 2xx 状态码都会进入 reject统一加载状态入口在组件里调wx.showLoading或wx.showNavigationBarLoading即可。参数timeout按需调整接大模型接口建议拉到 15 秒以上因为模型推理本身就慢接自己的服务端则保持 10 秒以下宁可失败重试也不要让用户干等。4.4 真机预览与正常请求域名白名单、HTTPS 与开发环境不一致开发者工具里默认勾选了“不校验合法域名”所以你在本地怎么请求都顺畅但一旦切到真机预览所有未配置的域名请求全部失败报错长得很像网络错误。这是藏头诗小程序源码里最常见的“开发环境正常、部署环境翻车”问题。解决路径是固定的去微信公众平台后台在“开发管理→服务器域名”里把 request 合法域名配上域名必须是备案过的 HTTPS 域名不能带路径。在小程序代码里把 http:// 的请求地址全部改成 https://否则真机直接拦截。开发阶段临时调试可以勾选“不校验合法域名”跑通流程但提交审核前必须把勾去掉否则审核会以“含未配置合法域名的请求”为由驳回。注意本地调试通过只能证明页面逻辑没问题域名与证书问题只有真机或预览二维码能暴露。提交审核前至少用预览版在真机上完整走一遍生成链路。5. 避坑清单藏头诗小程序做内容生成的五个高频翻车点5.1 “生成的不是诗”——韵律缺失的排查与最小校验方案现象句首字确实对上了但用户反馈“读起来不像诗”仔细一看两句尾字完全相同而且平仄混乱。原因生成逻辑只做了首字匹配没有做句尾去重和押韵筛选词库里本身也缺韵律标注。解决在生成函数中强制加两步校验。第一步是句尾字去重重复时重选候选句第二步是按韵母粗分组做押韵判断前文第三章里那段代码已经实现了normalizeRhyme这里再补一个最小判断函数function isRhymeValid(lines, minSame 2) { // 取每句最后一个字的拼音韵母统计归属同一粗分组的个数 const groups lines.map((line) normalizeRhyme(getEndingRhyme(line))); const count {}; groups.forEach((g) { count[g] (count[g] || 0) 1; }); const maxSame Math.max(...Object.values(count)); return maxSame minSame; }参数minSame表示至少要有几句押同一个韵对四句诗来说设成 2 比较稳妥要求四句全押会大幅降低候选可用率。加了这个校验后生成结果的观感会明显提升代价是偶尔会触发候选不足需要把fallbackChar的兜底句子也纳入韵脚标注。5.2 “真机上输入框弹不出键盘”——页面层级与输入框遮挡排查现象开发者工具里输入框正常真机上点击输入框没有反应或键盘弹出来把结果按钮完全挡住。原因输入框被某个绝对定位的容器遮住了或者input组件的adjust-position属性没有开启。解决检查 WXML 里输入框是否被其他元素遮挡常见元凶是分享按钮的悬浮容器和cover-view的层级问题。输入框加上adjust-position{{true}}让键盘顶起页面结果页不要用position: fixed的底部按钮改成常规文档流让系统自动处理滚动。真机上还有一类玄学问题是低版本基础库对input的cursor-spacing支持不一致建议统一加cursor-spacing20保证光标离键盘边缘有足够间距。5.3 “开发者工具正常真机请求全部失败”——域名白名单与证书问题现象开发者工具里请求正常返回扫预览码到真机上接口全部报 fail控制台看不到具体错误。原因八成是合法域名没配两成是 HTTPS 证书不受信任或域名未备案。解决打开微信公众平台后台在服务器域名里加白名单确认证书链完整用浏览器直接访问接口地址看有没有证书警告确认域名完成 ICP 备案后再提交审核。如果临时要在没有证书的环境下联调只能借助开发者工具的“不校验合法域名”开关但这条路径只适合开发阶段不适合生产。5.4 “名字里的生僻字把整首诗毁了”——字库缺失与谐音兜底现象用户名字里有一个“祎”字诗词库里没有这个首字的候选句生成结果直接落到模板兜底读起来和名字毫无关联。原因诗词库只覆盖了高频名字字没有覆盖生僻字和异体字。解决建一个谐音映射表把生僻字映射到常用同音字再按映射字去查诗词库。比如“祎”映射“一”“翀”映射“春”。生成时优先用原字查不到再用映射字。这个技巧能一次性救回不少冷门名字的生成质量但要注意两点映射字与原字必须同音否则用户一眼看出问题如果原字和映射字都查不到才允许模板兜底。对冷门名字与其生成一首烂诗不如提示用户“换个常用字试试”。5.5 “文案被判定违规”——内容安全接口与敏感词拦截现象用户输入的名字本身没什么问题但生成结果中某个字组合在一起被内容安全接口拦截或者审核时被驳回。原因诗词库里有大量从公开数据清洗来的句子里面可能包含敏感字组合用户输入的名字也可能带特殊字符或敏感字。解决在用户输入入口就做一层过滤只允许中文、长度限制在 2-4 个字特殊字符直接拦截在内容展示前调用微信提供的内容安全能力做检测检测不通过就重新选候选句或提示用户重试。对从公开网络收集的诗词库建议洗数据时先跑一遍敏感词匹配把命中的句子直接从库里删掉而不是运行时再拦截。运行时拦截虽然有效但每次都浪费一次请求删库是一劳永逸。6. 把“能跑”变成“好用”诗词库权重、本地缓存与分享场景的落地技巧6.1 给诗词库加权重让高频名字命中更优诗句生成算法本身再优化也抵不过词库质量。一个可落地的做法是给每条候选句加一个hot权重字段维护时不是手工打分而是记录真实线上数据被选中的句子权重加 1被用户手动“换一句”的句子权重减 1。运行一段时间后词库会自动向高频好句倾斜。第一次发布时权重可以按句式通顺度粗设后续让数据来修正。6.2 用本地缓存减少重复生成请求藏头诗是低频工具但用户往往会对同一个名字反复生成好几次直到刷出满意的作品。在本地用wx.setStorageSync缓存最近生成记录键用名字值用句子数组加时间戳同一个名字在半小时内再次请求时先读缓存再请求接口。这样既省接口流量又让结果页秒开。异步生成场景要注意缓存读到的可能是旧版本词库的产物所以缓存里要带一个词库版本号版本升级时自动失效。const CACHE_KEY acrostic_cache_v1; const CACHE_TTL 30 * 60 * 1000; // 30 分钟有效期 function getCached(name) { const data wx.getStorageSync(CACHE_KEY) || {}; const hit data[name]; if (hit Date.now() - hit.ts CACHE_TTL) return hit.lines; return null; }缓存这块有个细节不要把整首诗的大字符串存进去存lines数组即可渲染层面更灵活也方便在分享卡片里重新拼接。6.3 让用户愿意用第二次生成记录与分享卡片做内容生成类小程序留存的关键往往不在算法而在分享路径。藏头诗天然适合分享用户生成一首自己名字的诗分享出去的卡片本身就是内容。实现onShareAppMessage让卡片标题带上名字和第一句诗的预览别人点进来直接从结果页开始而不是又回到输入页空等。同时在本地维护一个“最近生成”列表展示用户历史生成的诗句复访率明显比冷启动好。我早期做这类项目时把精力全压在生成算法上想让诗更有文采结果用户反馈里提得最多的是分享卡片不好看、生成结果加载慢。后来我把算法冻结专注打磨结果页的渲染和分享链路留存反而上来了。藏头诗这种轻工具用户要的是“快”和“美”不是“格律精妙”。先让流程顺畅再谈文本质量这个顺序希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑