<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Idea on li 的 Blog</title>
    <link>https://blog.zhangli2946.club/categories/idea/</link>
    <description>Recent content in Idea on li 的 Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 24 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.zhangli2946.club/categories/idea/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>基于微信小程序的 家庭囤货保质期管理</title>
      <link>https://blog.zhangli2946.club/blog/weapp-grocery-expiry-management/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.zhangli2946.club/blog/weapp-grocery-expiry-management/</guid>
      <description>&lt;h2 id=&#34;背景与动机&#34;&gt;背景与动机&lt;/h2&gt;
&lt;p&gt;家庭囤货是常态，但管理不善就会变成「买完忘、过期扔、重复买」的死循环。冷藏室里冻了一年的肉、柜子深处过期的调味料，是每个家庭都会遇到的场景。&lt;/p&gt;
&lt;p&gt;市面上已有的保质期管理工具大多是 SaaS 模式，需要注册账号、连接云端。但这类工具的核心场景是&lt;strong&gt;个人或家庭内部使用&lt;/strong&gt;，为了记几个日期去搭一套后端，不仅成本高，还有隐私顾虑。有没有更轻量的办法？&lt;/p&gt;
&lt;p&gt;答案是：纯本地微信小程序，零服务器成本。&lt;/p&gt;
&lt;h2 id=&#34;功能设计&#34;&gt;功能设计&lt;/h2&gt;
&lt;h3 id=&#34;商品录入&#34;&gt;商品录入&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;扫码录入&lt;/strong&gt;：使用 &lt;code&gt;wx.scanCode&lt;/code&gt; 扫描商品条码，自动获取条码编号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动回填&lt;/strong&gt;：当扫码无法获取完整信息时，用户自行填写品名、分类、购入日期、保质期&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;库存看板&#34;&gt;库存看板&lt;/h3&gt;
&lt;p&gt;以列表或卡片形式展示所有商品，支持两种排序维度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按过期时间&lt;/strong&gt;：即将过期的排最前&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按分类&lt;/strong&gt;：同类商品聚合展示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;到期提醒&#34;&gt;到期提醒&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首页看板高亮标记：即将过期（黄色）和已过期（红色）&lt;/li&gt;
&lt;li&gt;小程序启动时自动检查：通过 &lt;code&gt;App.onShow&lt;/code&gt; 或页面 &lt;code&gt;onLoad&lt;/code&gt; 遍历所有商品，计算过期状态并展示汇总提示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;条码识别演进&#34;&gt;条码识别演进&lt;/h3&gt;
&lt;p&gt;当前版本扫码后只拿到条码编号，需要用户手动补充品名。商业版计划接入 LLM 识别方案：拍摄商品包装 → OCR 提取文字 → LLM 结构化输出（品名、品牌、保质期），一步完成录入。&lt;/p&gt;
&lt;h2 id=&#34;技术实现&#34;&gt;技术实现&lt;/h2&gt;
&lt;h3 id=&#34;数据模型&#34;&gt;数据模型&lt;/h3&gt;
&lt;p&gt;商品是核心实体，字段设计如下：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;字段&lt;/th&gt;
          &lt;th&gt;类型&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;code&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;条码编号 (EAN-13)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;商品名称&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;分类（食品、日用品等）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;quantity&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;number&lt;/td&gt;
          &lt;td&gt;数量&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;purchaseDate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;购入日期 (YYYY-MM-DD)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;expiryDate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;过期日期 (YYYY-MM-DD)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;notes&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;备注&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分类采用预置 + 自定义模式。预置分类包括：食品、饮品、调味品、日用品、个人护理、药品、其他。&lt;/p&gt;
&lt;h3 id=&#34;数据持久化方案&#34;&gt;数据持久化方案&lt;/h3&gt;
&lt;p&gt;这是整个项目最核心的技术决策。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;约束条件&lt;/strong&gt;：零云服务、零服务器成本、用户无感、数据不能轻易丢失。&lt;/p&gt;
&lt;h4 id=&#34;微信小程序的两种本地存储&#34;&gt;微信小程序的两种本地存储&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;存储方式&lt;/th&gt;
          &lt;th&gt;限制&lt;/th&gt;
          &lt;th&gt;清理缓存时&lt;/th&gt;
          &lt;th&gt;清理全部数据时&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;wx.setStorageSync&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;总上限 10MB，单 key 1MB&lt;/td&gt;
          &lt;td&gt;❌ 丢失&lt;/td&gt;
          &lt;td&gt;❌ 丢失&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;文件系统 (&lt;code&gt;wx.env.USER_DATA_PATH&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;总上限 200MB&lt;/td&gt;
          &lt;td&gt;✅ 保留&lt;/td&gt;
          &lt;td&gt;❌ 丢失&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关键区别在于：用户最常见的操作是「清理缓存」（清 Storage），而文件系统的数据&lt;strong&gt;不受影响&lt;/strong&gt;。「清理全部数据」才同时清除两者，但这是用户主动销毁数据的操作，任何本地 App 都无法避免。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
