八年了,从一个随机数按钮到我的技术底座:豆子工具复盘

有些事,不做笔记真的意识不到已经过去了这么久。 最近在整理博客内容时,我翻到了**“豆子工具”小程序**的最早版本记录。那是 2018 年,最初的它简陋得甚至有点滑稽:整个页面只有一个按钮,点一下,生成一个随机数。 谁能想到,这颗“小豆子”一跑就是八年。 八年,它长成了我最趁手的“瑞士军刀” 这八年里,我在这款小程序上倾注了太多的时间和精力。它更像是我个人开发者生涯的一个“活化石”,记录了我每一个阶段遇到的问题和想出的方案。 我始终坚持一个原则:只做真正有用的。 现在的“豆子工具”已经从当年的随机数生成器,进化成了一个覆盖网络、多媒体、开发调试的全能工具箱: 网络与运维必备:获取 WIFI 公网地址、云厂商安全组管理、查服务端口、域名证书检测。 多媒体处理:音频格式转换(m4a 转 mp3)、图片格式转换(png 转 webp)、二维码识别与生成。 开发调试利器:局域网调试(TCP/UDP/WebSocket)、ESP 网络配置、时间戳转换、Base64 与 URL 编解码。 安全与提醒:私密密码本、事件邮件通知、微信服务通知、语音验证码。 这中间还有很多功能,比如查看上报信息、特定的算法实现等。当然,也有不少功能因为受众太小或者微信审核的边界问题,遗憾地消失在了版本更迭中。 它是工具,也是我的技术底座 很多人问过我,市面上工具软件那么多,为什么要自己写? 答案很简单:自由。 我可以为了适配一个特殊的局域网协议去写一套调试代码,也可以为了保护自己的隐私数据写一个加密密码本。这八年积累下来的不只是功能,更是对 Go、Rust、前端交互以及各种底层协议的深度理解。 关于未来的“深度复盘” 八年的积淀太厚,小程序那方寸之间已经装不下太多的原理说明。 所以,我决定在我的新博客中,为这些工具开辟专门的专栏。我会挑选出其中含金量最高、逻辑最有趣的工具,拆解它们的实现原理。比如: 多媒体黑盒:音频和图片格式转换在小程序前端是如何高效完成的? 网络深水区:局域网内的协议调试有哪些不为人知的坑? 消息推送系统:我是如何设计那套多端触发的事件通知系统的? 这些内容我会以“实战笔记”的形式,在这里逐一连载。 这颗“豆子”还会继续长下去,而关于它的故事,我们去博客细聊。

2018-01-03 · 1 min · Eagle

Wander 项目功能列表状态--列表形式

记录曾经存在的功能,列表形式展示。 音频转 MP3 可以将 IOS 的录音文件 m4a 格式转换为 mp3 格式,在老设备播放,或者其它特殊应用场景。 使用方法:搜索豆子工具小程序,点击音频格式转换。 推荐理由:方便用户在手机上操作,可以转换音频,还可以试听效果。 获取 AST 账户 AST 账户用于连接 Asterisk,是自助语音验证码重要的一个环节。 你可以搜索【豆子工具】小程序,获取自己的 AST 账户。 注意:AST 账户获取后并不是马上生效,它需要到次日方可使用。这是因为它在凌晨会进行一次同步,会同步到 Asterisk 数据库。 后续我们会讲下如何实现自助语音验证码。 获取识别码 识别码用于开放接口认证。专属 ID 码为自定义识别码,方便用户记忆。 目前开放接口为: 获取本机公网 IP 获取 IP 地址的归属地 你可以搜索【豆子工具】小程序,获取自己的识别码。 然后使用你喜爱的编程语言调用开放接口。 开放接口 API 请查看【豆子笔记】网站。 获取本机局域网 IP 状态:上架 上架原因:有适用场景,可用于获取手机的局域网 IP,排查问题时使用。 实现原理:调用小程序的本地获取 IP API。 获取网络打印机地址 状态:上架 上架原因:有适用场景,可用于获取局域网的网络打印机 IP 地址。 实现原理:调用小程序的 mdns API。 获取验证码 验证码用于访问豆子笔记网站认证使用。它是一次性码,用完即作废,5 分钟内有效。 豆子笔记网址:www.91demo.top 除了在豆子工具小程序获取验证码外,还有一个自助语音验证码,使用 Asterisk 实现。我们会在后续的章节进行讲解。 获取豆子点数 观看激励广告可获得豆子点数。 豆子点数用于使用小工具。添加豆子点数机制,是为了更好的促进豆子工具良性的发展。 除了观看激励广告获取豆子点数外,还可以使用九宫格大转盘抽取豆子点数, 报 IP 地址归属地也可以获取豆子点数奖励。 ...

2018-02-25 · 1 min · Eagle

豆子碎片小程序项目第七版

我的小程序“豆子碎片”,走到了第七个版本,也走到了它作为“不断迭代的产品”的终点。 这一次,没有新的功能,没有架构调整,没有交互革新。在经历了从平台梦碎到零成本重生,从游戏化狂欢到工程化精修的一系列漫长探索后,我停下追逐“下一个版本”的脚步,进行了一次彻底的回顾。 我决定,赋予它一个最平静、也最庄重的最终形态:一座以“时间轴”为展线的个人数字博物馆,小程序的个人作品集。 为何是时间轴? 因为它的价值,早已不在任何一个单独版本的功能里,而在于其完整的演进史诗本身。每一次看似推翻重来的“改版”,都不是失败,而是一次认知的跃进与边界的探索。它们共同构成了一部活生生的、关于一个开发者如何思考、试错、学习与成长的历程。 这座博物馆的首页,就是一条清晰的时间轴。上面标记着七个重要的坐标: V1.0 起点:标记为“技术自留地”。那是一个朴素数字笔记本的剪影,代表着一切开始的初心——纯粹地记录。 V2.0 膨胀:标记为“平台梦”。这里陈列着“创作者API”、“经济系统”等复杂的架构图碎片,象征着一次勇敢但脱离现实的雄心。 V3.0 重生:标记为“Git驱动”。一个极简的、指向Git仓库的图标,记录着在服务器到期后的绝地求生,以及“零成本可持续”的技术洞察。 V4.0 堡垒:标记为“自主枢纽”。一座微小的Nginx服务器模型,象征着从依赖走向可控,是稳定性与自主权的基石。 V5.0 蜕变:标记为“知识闯关”。一个九宫格地图和动态表单的交互模型,代表着从“展示”到“游戏”的哲学转变,是最富创造力的一跃。 V6.0 精修:标记为“稳健产品”。这里展示着规范的数据结构图纸和荣誉徽章,代表着从创意原型到可维护产品的工程化沉淀。 V7.0 博物馆:它自己,就是最后一个展品。这个“时间轴”本身,便是终极的答案。 博物馆的意义 这个最终版本,不是开发的中止,而是价值的升华。它将“豆子碎片”从一个需要我不断维护的“项目”,转变为一个可以静静展示的“作品”。 对自己,是完整的仪式:它给了我一个清晰的句点。顺着时间轴回溯,我能看到每一步选择的因果,看到技术热情如何与产品认知相互碰撞、塑造。这是一种宝贵的自我确认,做事有头有尾。 对观者,是诚实的叙事:任何访客打开它,不再需要面对一个不知所谓的孤立功能。他们可以通过这条时间轴,在几分钟内读懂一个想法长达数年的生命旅程。它展示的不仅是结果,更是过程;不仅是成功,更是充满教训的尝试。这份诚实,比任何华丽的功能都更有力量。 对内核,是信心的转移:我停止更新它,是因为我确信,真正的价值创造已转移至新的阵地——对知识体系本身的深度构建。这座博物馆的存在,恰恰解放了我,让我能心无旁骛地回归博客,去打造那个真正需要时间沉淀的、坚实的内核。 “豆子碎片”的最终版,不再是一个工具,而是一本书的目录,一部纪录片的索引,或是一棵大树的年轮。 它用一条时间轴,将散落的探索珍珠串成完整的项链,安静地陈列在数字世界的角落。它完成了自己的历史使命,从一个不断寻求下一站的行者,变成了一座记载着整个旅途风景的纪念碑。 从此,版本号定格于 V7.0,而创造者的旅程,将在新的篇章里继续。这座时间轴博物馆,便是这段旧日史诗,最恰当的丰碑与终点。 技术最终的本质还是知识的内涵和深度,不在于载体。

2025-12-03 · 1 min · Eagle

豆子碎片小程序项目第六版

“豆子碎片”的第五次生命是一场华丽的冒险。它将知识封装成关卡,将学习转化为闯关,用动态表单和激励广告构建了一个充满探索感的游戏世界。九宫格的首页地图,更是带来了直观的视觉冲击。 然而,当最初的兴奋感褪去,我以一个用户和开发者的双重身份重新审视它时,一些粗糙的边缘开始显现。网格布局虽有趣,但标题字数受限,信息表达不全;快速迭代下诞生的数据结构有些随意;用户进度的存储也让人不那么放心。它像一个充满创意的“原型”,但距离一个“稳健的产品”还有距离。 于是,第六版的使命清晰了:不改变游戏的核心乐趣,而是对它的框架、体验与代码进行一次全面的“精修”与“加固”。这是一次从“颠覆性创新”转向“系统性优化”的旅程。 一、界面优化:从网格到列表,信息优先 我做出的第一个显著改变,是首页布局。 为何改变? 第五版的九宫格网格,在内容增多后略显拥挤,且格子空间限制了关卡标题的完整展示,影响了一瞥之间的信息获取效率。 如何改变? 我将布局重构为清晰的单列列表。每个关卡独占一行,标题可以完整显示,描述更复杂的挑战成为可能。同时,我保留了核心的分页逻辑(如每页4-6条),确保了浏览的节奏感,避免了无尽滚动的疲惫。 带来什么? 新的列表布局,以牺牲部分游戏感为代价,换来了更高的信息密度和可读性。它更像个严肃的“挑战清单”,让用户能快速扫描和定位目标,体验更加沉稳、高效。 二、架构优化:数据结构的“工艺化”规范 如果说界面是外表,数据结构就是骨架。我着手对第五版快速搭建的“骨架”进行加固和标准化。 核心索引的规范化:我重新设计了描述整个游戏地图的核心数据文件(如 levels_index.json)。为每个关卡定义了严格、统一的字段结构,包括ID、标题、难度、标签、题型、答案模式等。这就像为所有零件制定了标准的图纸,让未来的扩展和维护有章可循。 考题格式的统一化:动态表单背后的“考题”定义被统一为结构化的规范。无论是选择题、填空题还是代码题,都遵循同一套描述语言。这为批量管理考题、未来开发可视化编辑器、甚至支持更多题型打下了坚实的基础。 用户进度存储的可靠性升级:通关状态是用户体验的核心。我优化了存储策略,结合本地缓存与轻量服务端校验,确保用户的闯关记录更安全、更可靠,减少了因设备或缓存问题导致进度丢失的风险。 三、代码优化:删繁就简,追求稳健 最后,也是所有优化的基础,是一次代码层面的“大扫除”。 “删减逻辑”:我回顾并简化了部分在快速迭代中产生的冗余或过度设计的逻辑。删除了不再使用的历史代码,合并了功能相似的函数,让代码的执行路径更加清晰。 增强健壮性:对关键流程增加了更完善的错误处理与边界情况检查。让整个小程序在面对异常数据或网络波动时,行为更加可预测,从“能运行”走向“运行得稳健”。 第六版的“豆子碎片”,没有改变第五版那颗“知识闯关游戏”的有趣灵魂。它所做的,是为这个灵魂打造了一副更结实、更得体、更耐用的躯壳。 通过更清晰的界面(列表)、更稳固的基础(数据结构)、更可靠的体验(进度存储)、以及更简洁的代码,它完成了一次从“创意原型”到“可维护产品”的成熟蜕变。 这标志着这个个人项目的重心,已经从“追逐新奇想法”的探索期,进入了“打磨用户体验与工程质量”的深耕期。它依然是一个充满个人色彩的工具,但已悄然具备了长期生命力的稳健形态。

2025-09-03 · 1 min · Eagle

豆子碎片小程序项目第五版

缘起:在完美的架构上,面对沉寂 我的小程序“豆子碎片”,在它的第四段生命中达到了一个技术上的稳定态:一台自主的Nginx代理服务器,像一座坚实的数据枢纽,保障了内容的稳定与可控;静默更新机制让它能自我焕新;反馈入口也让它不再是一座孤岛。 然而,一个最本质的产品困境也随之浮现:它的浏览量越来越低,时常连续数日不见一个用户。​ 这很矛盾——我似乎建好了一座坚固、自动化的图书馆,却发现读者不再上门。是内容不合时宜,还是形式本身已失去了吸引力? 我不愿看到它在精密的架构上“沉睡”。我需要一场根本性的变革,不是为了追逐数据,而是为了重新点燃创造与分享的火种。这一次,改变必须触及灵魂。 破局:从“陈列知识”到“设计挑战” 我做出了一个大胆的决定:彻底抛弃沿用了四个版本的“文章列表”模式。​ 我不想它再是一个被动的知识仓库。我的新答案是:将它变成一个“知识闯关游戏”。 这个转变,是产品哲学的重构: 解构与升华:我不再直接展示文章。而是将每篇文章的核心知识点进行深度抽象,提炼成一个具体、明确的问题或挑战。例如,从《CSS Flex布局详解》一文,抽象出 “如何让元素在容器中水平垂直居中?”​ 这样一个关卡。 重塑信息架构:首页不再是文章列表,而是一张 “知识探索地图”——一个九宫格式的关卡网格。每个格子是一个关卡,清晰标有挑战标题和用户的通关状态(锁形/对勾)。知识体系从此可视化、可追踪。 重新定义“文章”:完整的文章并未消失,它们被移到了每个关卡的 “帮助”​ 按钮背后。文章从被阅读的终点,变成了用户闯关途中,可以主动查阅的“攻略”或“参考答案”。学习从被动接收,变成了“遇到问题 -> 主动求助 -> 解决问题”的主动探索循环。 核心玩法:动态表单的解题仪式,用户点击一个关卡网格后,进入的不再是文章页,而是一个动态表单页。 这里就是闯关的“考场”: a. 形式:表单会根据当前关卡的问题,动态生成输入框、选择题、代码片段填写区等。它可能要求用户填写一个关键函数名,选择正确的执行顺序,或补全一段核心代码。 b. 交互:用户需要运用自己的知识(或从“帮助”中寻找线索)来填写或选择答案。提交后,系统会进行验证。 c. 结果:验证通过,关卡状态同步更新为“已通关”,九宫格地图上点亮一块拼图。验证失败,则停留在当前页面,用户可以选择再次尝试。 精妙的融合:激励广告成为游戏机制,这次改版,我还无缝融入了一个关键设计:小程序的激励式视频广告。它的触发场景被精心设计:当用户多次尝试仍无法通过某个关卡时,系统会:“是否观看一段短视频广告,直接跳过此关卡?” 这一设计一举三得: 用户体验的减压阀:它提供了体面的“跳过”选择,将挫败感转化为自主权,防止用户流失。 商业化的优雅植入:广告从强制阅读的干扰,变成了用户主动发起的“跳过”或“求助”工具,与游戏进程深度契合,接受度更高。 项目可持续的微光:它为可能零星但长期的用户流量,提供了一个自然、低侵害的微变现可能,让项目有了覆盖基础运营成本的希望。 它的技术实现:极简的三页架构 理念虽宏大,实现却力求极简。整个小程序仅由三个核心页面构成: 关卡地图页:承载九宫格网格,是游戏的主界面和进度总览。 动态表单页:关卡的核心互动场,根据配置渲染不同的题目与输入组件,处理答案的提交与验证。 帮助详情页:本质就是第四版及之前的文章详情页,无缝复用原有的Markdown解析与渲染能力,只是现在它作为“攻略”被调用。 后端依然是那座稳定的Nginx代理服务器,继续可靠地提供着关卡配置、题目数据和文章内容。技术栈几乎未变,只是用全新的产品逻辑重组了信息的流动与交互。 “豆子碎片”的第五次生命,是一场从“图书馆”到“冒险游戏”的迁徙。它把知识藏进了挑战里,把阅读变成了探索,把挫败感转化为可选择的捷径。 这并非对过去的否定,而是一次螺旋式的上升。它没有抛弃“分享技术知识点”的初心,只是换了一种更具吸引力、也更符合学习本质的方式——在解决问题的过程中获得知识。那座由Nginx服务器构成的坚固堡垒依然矗立,但里面装载的不再是静态的书架,而是一张等待被点亮的、充满惊喜的知识寻宝图。 这一次,它不再仅仅是我个人的数字笔记,而是一个向所有好奇者发出的、温和而有趣的挑战邀请。

2025-08-03 · 1 min · Eagle

豆子碎片小程序项目第四版

我的小程序“豆子碎片”,在经历了平台梦的破碎和服务器到期的沉寂后,凭借一个巧妙的构思迎来了第三次生命:完全舍弃后端,将文章以Markdown文件托管在Git仓库,让小程序直接拉取、渲染。它成了一个零成本、静态化的数字笔记本,我以为这便是它最优雅、永恒的形态了。 然而,免费的午餐总有代价。 一、预警:来自免费依赖的背刺 在平稳运行一段时间后,危机不期而至。某一天,用户反馈和后台数据同时告诉我:小程序一整天都无法加载任何文章。排查之后,根源令我心中一沉:我所依赖的第三方Git服务,对非自身域名的高频次外链访问进行了拦截。紧接着,另一个隐患浮出水面:我存放在那里的文章,同样受制于平台的内容审核策略,随时有“被过滤”的风险。 这次宕机像一记警钟。我终于清醒地认识到,我并没有解决核心的依赖问题——我只是将风险从需要付费的云服务器,转移到了一个免费但并不可控的第三方服务上。我的“永续运行”,建立在别人随时可能改变规则的沙地上。 二、破局:构筑自主的数据枢纽 要真正解决问题,我必须为“豆子碎片”建立一个稳定且自主的数据枢纽。于是,我做了一个与“零服务器”理念看似相悖、实则更为务实的决定:重新购买一台轻量级服务器。因为我不再需要做内容平台,所以这台服务器配置可以很小。这一次,它的使命极为纯粹,不做复杂的业务逻辑,不跑庞大的数据库。我只用它做一件事:运行一个由Nginx搭建的、高性能的静态文件代理与缓存服务。 架构的升级清晰而有力: 内容源不变:我依然在本地用Markdown写作,用Git进行版本管理,并推送到远程仓库。这保留了我最舒适、最高效的创作工作流。 链路自主化:小程序前端,所有指向第三方Git Raw链接的请求被全部替换。新的请求目标,指向我自己的这台服务器的文件服务。 服务器作为网关:这台Nginx服务器扮演了智能网关的角色。它接收小程序的请求,然后返回对应的 index.json索引文件或 .md文章文件。获取成功后,它会在本地进行缓存,并返回给小程序。 这一改变,一举解决了所有核心痛点: 稳定性:我的服务器不会拦截和过滤文章内容,是合法、常规的访问模式,彻底解决了Git因客户端特征触发的风控拦截。 自主性:文章内容经由我的服务器返回,Git平台不再提供静态文件服务,仅作为仓库,内容审核策略不再能影响我。我对最终交付的内容,拥有了完整的控制权。 性能与成本可控:缓存机制降低了服务的压力,也提升了小程序的加载速度。这台轻量服务器的成本,远低于维护一个完整的应用后端。 核心的东西从未改变——我依然在用Git管理内容,小程序依然在展示Markdown渲染的文章。但一切又都不同了:我用一台极简的Nginx服务器,替换了不可控的第三方依赖,为自己赢得了一片稳定的技术腹地。 三、进化:从“能活”到“好活” 夺回了架构的控制权,就像为房子打下了坚实的地基。接下来,我开始考虑如何让住在里面的人更舒适。基于新的稳定架构,我实现了两次关键进化: 技术体验:实现静默更新 在以前的纯静态模式下,每次我发布新文章,都必须更新小程序版本才能让用户看到,体验极差。我引入了 “版本号”机制。小程序启动时会向服务器查询一个简单的版本标识,如果发现线上有更新,便自动拉取最新的文章索引。从此,内容更新与小程序发版彻底解耦,用户获得了无缝的静默更新体验。 产品形态:建立连接与生态 当技术不再成为掣肘,产品思维便有了空间。我不再仅仅满足于“展示”。 借助服务器,我部署了自己的服务,我加入了 “反馈与联系”​ 的入口,让这个工具从单向输出,变为能聆听用户声音的窗口。 我尝试在应用中,以不打扰的方式,与我开发的其他工具小程序进行相互引荐。我希望它们能彼此照亮,形成一个微小的、有共同气质的产品矩阵雏形。 “豆子碎片”的第四次生命,始于一次外部依赖导致的崩溃,成于一个务实的架构决策。从完全依赖第三方,到引入自主的Nginx代理层,这一步看似是技术的“后退”(重新引入了服务器),实则是产品主权和稳定性的“大踏步前进”。 它没有变得功能庞杂,反而在核心体验上更加健壮和流畅。它不再是一个脆弱的实验品,而成了一个拥有自主数据通道、可持续更新、并能与用户及其他产品产生连接的、真正意义上的完整产品。 这一次,我守护住的,不仅是那个“展示技术思考”的简单初心,更是让这个初心得以在复杂多变的技术环境中,长期、稳定、自主存在的能力。这,便是第四段生命赋予它的全部意义。

2025-06-03 · 1 min · Eagle

豆子碎片小程序项目第三版

我的小程序“豆子碎片”,迎来了它的第三次生命。 这一次,它是在服务器到期、上一个雄心勃勃的版本彻底停摆后,从废墟里重新长出来的。 它的第二段生命,曾是一个充满激情的平台梦。我为此开发了完整的创作者后台、公开的API、实时的MQTT通知,并设计了一套用“豆子点数”兑换人民币的激励循环。我想把它做成一个微型的、技术人共创的内容生态。但现实是骨感的:小程序广告收益极低且不透明,难以维系激励;用户与创作者的动力都不足;个人开发者权限也处处受限。这个复杂的循环,运行不久就悄然崩塌了。 几个月后,服务器到期了。我没有续费。那个承载着API和数据库的“平台”,在物理上画上了句号。 但我不想让它就这样消失。这个从我个人技术笔记成长起来的小程序,我投入了大量的时间和心血,像我的一个数字孩子,我舍不得。我必须在新的约束下——近乎零成本、零维护的约束下——为它找到一条新的活路。 我的第一个决定,是做最彻底的产品减法。 我砍掉了所有平台化的幻想。没有创作者上传,没有审核,没有激励系统。它回归了最初的模样:一个只属于我个人的、记录技术知识碎片的数字笔记本。原因很现实:一是我已没有精力维护复杂后台,二是小程序政策对个人开发者的内容上传限制越来越严。它不再是一个“平台”,重新变回一个单纯的“作品”。 产品形态回归简单,但最核心的技术问题来了:内容存哪?怎么更新? 以前,文章存在数据库,有个后台来维护。现在服务器都没了,这条路断了。直到一次偶然的灵感,让我找到了破局点:Git服务器(比如Gitee),不就是个现成的、免费的、极其稳定的文件服务器吗? 我立刻动手改造。整个技术栈被彻底重构: 创作回归本质:我不再需要后台。打开任何编辑器,用 Markdown 格式​写好文章,这本身就是最舒适的写作。 存储拥抱版本控制:文章就是普通的 .md文件。我像提交代码一样,将它们 push到 Git 仓库的指定目录。这个仓库,成了我免费、永不过期、还带完整版本历史的“云端数据库”和“后台”。当然,为了能够访问,我也把代码公开,同时也把这种方案分享给了我的公众号读者。并获得了不小的流量。有很多读者与我同感。 小程序变身静态渲染器:小程序端,我删光了所有调用自家后端的代码。新的数据流清晰极了: a. 先拉目录:我在仓库里放了一个 index.json​ 文件,它就是全站的文章索引,里面用结构化的数据记录了所有文章的标题、摘要、时间和对应的文件路径。小程序启动后,第一件事就是用 downloadFile下载这个索引。 b. 再找内容:所有文章列表的展示、以及前端搜索,都变成了在本地对这个 index.json文件进行查询和过滤。 c. 最后渲染:用户点击某篇文章,小程序就根据路径,去下载那个具体的 .md文件,然后用我早已写好的 Markdown 解析器,将文本渲染成漂亮的页面。 于是,“豆子碎片”的第三个版本,演化成了一个完全由 Git 驱动的静态小程序。数据在云端(Git仓库),逻辑在本地(小程序)。虽然我为此砍掉了所有动态、交互、平台化的功能,但最核心的东西从未改变:它依然是一个能优雅、可靠地展示我技术文章的地方。 看似是战略撤退,实则是架构新生。它失去了平台的复杂性,却换来了前所未有的健壮性。只要我的 Git 仓库还在,只要小程序的基础框架还能运行,它就能一直活着,安静地待在那里,承载我的思考。 这第三次生命,不再关于扩张的野心,而是关于专注的可持续。它不再试图成为一个生态,而是安心做好一个纯粹的工具——一个完全属于我个人,零成本运行,并且会一直伴随我成长的技术笔记。这次重构,让我更深刻地理解了“少即是多”的力量,以及如何在技术的约束下,找到最本真、最持久的价值。

2025-05-03 · 1 min · Eagle

豆子碎片小程序项目第二版

起点:一个技术人的展示橱窗 在我学习了小程序之后,作为技术人,我想把自己的知识使用小程序来实现,这一切始于一个朴素的想法:我需要一个地方,来系统性地展示和沉淀我的技术知识点。 于是,“豆子小豆子碎片”小程序第一个版本诞生了。它是一个纯粹的技术“展示橱窗”,记录着我的学习与思考。 然而,我很快发现,一个单向输出的“橱窗”,即使内容再好,也缺乏持续的活力与互动。用户来了又走,我作为唯一的创作者,也感到动力有限。我意识到,如果知识只是被陈列,而无法流动、无法创造连接、无法衡量价值,它的影响力终究是有限的。 进化:引入“豆子点数”,点燃价值引擎 我想到了激励,为了自己,也方便他人。为了让知识流动起来,我构思了系统的核心:“豆子点数”激励系统。这不再是一个静态的展示柜,而是一个动态的价值交换市场。 我的目标,是将每一次阅读、每一次创作、每一次互动,都转化为可积累、可量化的数字资产——“豆子”。而“豆子”的终极锚点,是能兑换为人民币,这是我最初的想法。那我的收益又从哪里来呢?广告收入,用户需要查看文章,需要消耗豆子点数,当点数不足时,需要观看激励广告。 这个链路就是,创作者上传文章->用户看广告获取豆子点数->平台通过广告获取收益->用户浏览文章消耗豆子点数,创作者获取豆子点数->创作者兑换豆子点数。 升华:从个人项目到创作者平台 真正的蜕变,在于我决定将这个系统平台化、开放化。我不再是唯一的创作者,而是平台的搭建者和规则制定者。 平台的三角模型: 我(平台方):开发了小程序和后台API,文章上传客户端,负责维护系统、制定规则、对接广告,确保整个经济体稳定运行。 创作者:任何技术爱好者都可以通过API或客户端,向平台上传自己的技术文章,成为内容供应者。 读者:所有用户,来此免费消费这些技术内容。 它的核心运转机制:基于广告分成的价值循环。这是整个构想最精妙的部分,它形成了一个完美的闭环: 创作激励:读者阅读文章时,需要观看一则广告。这则广告产生的收益,将被平台折算成 “豆子点数”​ ,奖励给该文章的上传者(创作者)。创作者贡献内容,平台通过广告将读者的注意力变现,并回馈给创作者。 内容分层与溢价机制:创作者如果对自己的文章质量有足够信心,可以为其 “加锁”​ 。一旦文章被“加锁”,读者阅读时需要观看的广告(或广告价值)会更高,随之产生、并奖励给创作者的“豆子点数”也会更多。 这形成了强大的自我筛选和品质激励:优质内容会主动标示自己,并寻求更高回报;读者为高质量内容付出稍多的注意力(看更长或更多的广告),也觉合理;平台则通过优质内容吸引更多流量,形成良性循环。 互动增强回路:除了阅读广告产生的点数,“点赞”等互动行为也可以被设计为额外的奖励来源(例如,点赞能为创作者带来少量点数)。这鼓励创作者不仅追求流量,更追求内容带来的认同与共鸣,促进社区氛围。 完整的经济闭环: 创作者​为获取“豆子”(可换钱),积极生产内容,优质内容会“加锁”以求更高收益。 读者​为获取免费知识,付出注意力观看广告。 广告商​的投放费用流入平台。 平台​将广告收益的大部分,以“豆子点数”形式分配给创作者(特别是“加锁”的优质内容获得更高权重)。 创作者​积累“豆子”,最终从平台兑换人民币,实现知识变现。 小程序本身,则纯粹作为这个生态的“展示窗口”和“交互界面”,负责优雅、流畅地向终端用户呈现这一切。 愿景:一个由技术人共建、共享的良性生态 这个构想的终极目标,不再是展示我个人的技术,而是搭建一个基于价值认同的、可持续的开发者内容生态。对创作者而言,这是一个轻量级、可直接获得正反馈和物质激励的技术博客平台。对读者而言,这是一个能免费(以注意力为代价)接触到众多同行一线思考和经验的宝库。对整个社区而言,“豆子点数”如同血液,驱动着优质内容的生产、筛选与流通。 这看起来非常美好,仿佛是一个微小的公众号生态缩影。然而,当我真正试运行之后,才发现这个循环其实非常脆弱,很容易就会崩塌。 原因主要有这么几点: 第一,小程序的广告收益实在太低,我根本无法维持当初设想的“1000豆子兑换1元人民币”的固定汇率。 第二,小程序广告的收益算法并不透明,我很难设计出公平又可持续的豆子折算比例。 第三,用户对文章内容并不那么感兴趣,阅读量和互动始终起不来。 第四,创作者那边也缺乏持续上传文章的动力,早期激励难以覆盖他们的创作投入。 第五,从长远来看,小程序平台本身也在政策上存在不确定性,后续版本很可能会限制甚至禁止用户自定义内容的上传。 为了把这个想法落地,我在技术实现上是下了功夫的。我专门开发了一个内容上传平台,它拥有清晰的公开API和创作者使用的客户端界面。当创作者提交文章后,会进入审核流程。为了给创作者即时的反馈,我还额外集成了MQTT消息服务——一旦文章审核通过(或退回),系统就会通过MQTT通道向创作者客户端推送实时通知,让整个流程更顺畅、更透明。 就这样,尽管有这些技术上的准备和实现,这个想法在运行一段时间后,还是慢慢沉寂了。 虽然它没有成功,但却给我留下了一笔很大的财富——我意识到,我过去所做的,从技术实现上看是完整的,但从模式上看,更多是一种对现有逻辑的复制,而非真正的创新。 但这依然是一次宝贵的尝试。它让我完整地走完了一个“想法-开发-运营-验证”的闭环,其中的技术架构与产品反思,是单纯复制项目所无法获得的。 最后介绍一下识别码。文章上传和维护,我们是通过命令行工具来完成的。没有集成到小程序中,一是因为个人小程序不容易过审,二是在小程序中编制 Markdown 文档非常麻烦,因为没有提供 API 选择 MARKDOWN 文档,因此上传 Markdown 文档也不能实现。我自己实现了命令行工具可以管理文章。也提供开放接口 API 供用户自己实现工具上传。为了保护开放接口,我们需要用户认证。在小程序中实现了获取用户识别码的功能。可以获取到用户识别码,调用开放接口。 用户识别码 我们的小程序只实现了文章的浏览和搜索。为了将整个应用完善,我们还需要文章上传,文章删除等功能。上一节,我们已经讲了一种解决方案。就是使用开放接口 API。 开放接口因为是面向互联网的,所以任何人都能访问,为了保护我们的开放接口不让任意调用,我们需要添加认证。我们通过小程序的微信生态进行认证。只有用户能使用小程序,并能获取用户的 OPENID,我们才给用户提供识别码。 用户识别码相当于用户的账号和密码,我们基于用户的 OPENID 生成识别码。识别码是项目中是唯一的,可识别的。识别码密钥是随机字符串。通过识别码和识别码密钥,我们可以用来识别用户,所以,请妥善保管你的识别码和识别码密钥。防止他人滥用。你还可以重置识别码密钥,让以前的识别码密钥失效。类似于用户账户中的修改密码。 根据小程序的特性,我们还集成了广告,结合广告,用户识别码更加的重要。我们使用豆子点数机制,来实现广告和用户识别码的结合。当用户观看广告时,获取豆子点数,当用户调用开放接口时,消耗豆子点数。用户的公开加锁文章被其他用户浏览时,可以获得豆子点数,并且提供文章的浏览量,提高文章的排序。 增加一个 Tab 项,叫我的页面。我的页面只有两个功能,观看广告获取豆子点数,获取我的识别码。现在看看如何实现我的识别码。 <view class="page"> <view class="weui-form"> <view class="weui-form__bd"> <view class="weui-form__text-area"> <h2 class="weui-form__title">我的识别码</h2> <view class="weui-form__desc">识别码用于开放接口认证使用。请妥善保管识别码和密钥,不要将密钥告诉他人。</view> </view> <view class="weui-form__control-area"> <view class="weui-cells__group weui-cells__group_form"> <view class="weui-cells"> <view class="weui-cell"> <text>我的识别码:{{icode}}</text> </view> <view class="weui-cell"> <text>我的密钥:{{isecret}}</text> </view> </view> </view> </view> </view> <view class="weui-form__ft"> <view class="weui-form__opr-area"> <view class="weui-btn weui-btn_primary" aria-role="button" bind:tap="getMyAppIcode">获取识别码</view> <view class="weui-btn weui-btn_warn" aria-role="button" bind:tap="resetAppIcode">重置识别码密钥</view> <view class="weui-btn weui-btn_default" aria-role="button" bind:tap="doCopy">复制到剪切板</view> </view> </view> </view> </view> 获取识别码和重置识别码的整体思路和逻辑与前面的文章类似,没有新的技术点。这里添加了剪切板功能,方便用户复制识别码。 ...

2025-01-03 · 2 min · Eagle

豆子碎片小程序项目第一版

启动项目 在学习了微信小程序之后,我使用wxml页面可以做出唐诗的内容了。结合wxss,我可以定义好看的布局。在小程序需要备案时,因为唐诗需要资质,而我个人无法满足这些条件,所以我需要开发新的项目。恰好最近在为我的技术笔记发愁。我希望有一个可以展示我笔记内容的工具。而visit 就是一个用于展示和搜索文章的小程序工具。 项目需求 我的最初想法非常简单,1,可以更新文章内容而不需要升级小程序。2,需要在小程序端进行展示。3,能够根据标题或者关键字进行搜索文章内容。 技术选型 小程序使用原生开发 界面 UI 使用 WeUI 内容渲染使用Markdown 知识储备 需要你了解微信小程序开发基础知识,Markdown内容编写,以及towxml库。 完成首页页面 首页页面非常简单,一个标题描述,用来解释小程序干什么?一个搜索框用来搜索内容,三个快捷按钮用于快速查找内容。 写首页的时候,需要用到的技术要点: 搜索框、按钮、列表、文本 界面交互 网络请求、数据存储 在微信开发者工具,app.json 文件中配置首页,配置后会自动生成首页模板页面。 "pages": [ "pages/index/index" ], 在 pages/index/index.wxml 文件中,编写首页内容。包含标题,描述,搜索框,以及快捷按钮。 <view class="page"> <view class="page__hd"> <view class="page__title">使用说明</view> <view class="page__desc">收集了很多经典的代码片段和库,是学习编程的好工具。可通过关键字查找内容,用于解决开发中遇到的问题。</view> </view> <view class="page__bd page__bd_spacing"> <!-- 搜索框--> <view class="weui-search-bar {{inputShowed ? 'weui-search-bar_focusing' : ''}}" id="searchBar"> <form class="weui-search-bar__form"> <view class="weui-search-bar__box"> <i class="weui-icon-search"></i> <input type="text" confirm-type="search" class="weui-search-bar__input" placeholder="请输入您要查找的内容" value="{{inputVal}}" focus="{{inputShowed}}" bindinput="inputTyping" bindconfirm="search" /> </view> <label class="weui-search-bar__label" bindtap="showInput"> <i class="weui-icon-search"></i> <span class="weui-search-bar__text">搜索</span> </label> </form> <view class="weui-search-bar__cancel-btn" bindtap="hideInput">取消</view> </view> <!-- 查询快捷按钮--> <view class="weui-flex"> <view class="weui-flex__item"> <view class="placeholder" id="btnHot" bindtap="bindBtn" hover-class="placeholder-hover">最火</view> </view> <view class="weui-flex__item"> <view class="placeholder" id="btnNew" bindtap="bindBtn" hover-class="placeholder-hover">最新</view> </view> <view class="weui-flex__item"> <view class="placeholder" id="btnCold" bindtap="bindBtn" hover-class="placeholder-hover">最冷</view> </view> </view> <!-- 内容--> </view> </view> 当使用模拟器预览时,发现首页内容是正确的,但是样式非常丑, 我使用 WeUI 来美化一下,使用weui是因为虽然它不是最美,但它的兼容性和稳定性最好,如果自己写wxss,需要考虑各种机型和设备。 ...

2019-01-03 · 4 min · Eagle

实战笔记:为了不再发错下载链接,我给工具箱加了“扫码鉴定”

在软件发布流程中,最尴尬的事情莫过于:宣传图已经发出去了,用户扫码后却发现链接打不开,或者下载了一个旧版本的安装包。 我就亲身经历过这么一次“翻车”事故。 事故现场:一个 URL 引起的麻烦 我曾经碰到这样一个情况,网站上附带有二维码,用于下载安卓 APP。某天,用户反馈扫码下载的安卓 APP 没有新开发的功能。经过排查才发现是二维码的问题。 使用网站点击下载的用户正常,使用手机扫二维码下载的安卓 APP 没有新功能。原因为扫码下载还是使用的老链接地址,使用的上一个版本。这个时候,测试如果不细心的话,就不会发现这个问题。如果你手边有个可以识别二维码内容的小工具,那么你大概率不会在这种问题上栽跟头。 虽然这只是一个低级错误,但它让我意识到:在二维码挂载后、正式发布前,必须有一个极简的“内容鉴定”环节。 痛点:如何快速、无痛地校验? 通常我们校验二维码,习惯性地直接拿手机扫一下。但如果二维码指向的是一个大容量的 APP 下载包或复杂的跳转链接,扫码后手机会自动触发下载或进入复杂的网页路径。 我其实并不想真的下载并安装测试(那是后续的 QA 环节),我只是想一眼看到二维码里到底写了什么字符,确定那个 URL 是不是我想要的那一个。 实现:借力小程序的原生能力 既然发现了痛点,解决起来就非常顺手了。得益于微信生态对扫码的深度支持,我在“豆子工具”里实现了一个“二维码识别”功能: 核心逻辑:直接调用小程序的 wx.scanCode 接口。 功能表现:不仅支持扫描实物二维码,还支持从手机相册里直接读取生成的二维码图片。 结果反馈:系统不会触发自动跳转,而是将二维码包含的原始文本、URL、一维码内容直接以纯文本的形式展示在屏幕上。 当你碰到陌生的二维码时,忍不住想看,但又担心是病毒时或者有害网站时,不妨先使用该工具扫描二维码。如果二维码内容是网站链接,它不会跳转到网站,只会显示网址,非常安全。 价值:多看一眼,少出一次错 现在,每当我生成一个新的二维码,无论是用于软件下载、文档分享还是活动跳转,我都会习惯性地用自己的工具“扫一下”: 确认 URL 参数是否完整。 确认是否有肉眼难以察觉的拼写错误。 确认二维码的类型(一维码还是二维码)是否符合预期。 总结 这个功能的代码实现极其简单,几乎就是调用一个 API 的事。但它的价值在于改变了工作流——在发布前的最后关头,提供了一个低成本的“人工校验点”。 很多时候,工具的作用不仅仅是自动化,更是为了在我们疏忽大意时,拉我们一把。

2018-01-09 · 1 min · Eagle