<?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>Web &amp; 小程序 🖥️ on 噗噗碎碎念</title>
    <link>https://blog.congliu.dev/zh/posts/development/miniprogram/</link>
    <description>Recent content in Web &amp; 小程序 🖥️ on 噗噗碎碎念</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 17 Mar 2025 15:25:26 +0800</lastBuildDate>
    <atom:link href="https://blog.congliu.dev/zh/posts/development/miniprogram/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>微信小程序开发 - 第二篇</title>
      <link>https://blog.congliu.dev/zh/posts/development/miniprogram/miniprogram-2/</link>
      <pubDate>Mon, 17 Mar 2025 15:25:26 +0800</pubDate>
      <guid>https://blog.congliu.dev/zh/posts/development/miniprogram/miniprogram-2/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;噗噗订阅管理 - release-1.3.0&lt;br&gt;
&lt;a href=&#34;https://blog.congliu.dev/zh/posts/development/miniprogram/miniprogram-2/#%e6%9b%b4%e6%96%b0%e5%86%85%e5%ae%b9&#34;&gt;底部查看更新内容&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;准备开始慢慢更新&#34;&gt;准备开始慢慢更新&lt;/h2&gt;
&lt;p&gt;完成上一版开发后一直没管，想着就自己管理一下订阅，避免扣费。不过前两天看到微信数据显示有几十个用户陆续打开过小程序，既然还是能被人看见而且可能使用，那就继续更新。&lt;/p&gt;
&lt;p&gt;如果有任何建议，欢迎在小程序中的&lt;code&gt;设置&lt;/code&gt;页面的&lt;code&gt;反馈&lt;/code&gt;中提出。&lt;/p&gt;
&lt;h2 id=&#34;echarts&#34;&gt;Echarts&lt;/h2&gt;
&lt;p&gt;之前草草地做了历史数据页面，这次整理了一下小程序中基础使用&lt;code&gt;Echarts&lt;/code&gt;的步骤&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据官方提供的模版项目把&lt;code&gt;ec-canvas&lt;/code&gt;这个文件夹复制到自己项目中：&lt;a href=&#34;https://github.com/ecomfe/echarts-for-weixin/tree/master/ec-canvas&#34;&gt;https://github.com/ecomfe/echarts-for-weixin/tree/master/ec-canvas&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ec-canvas.js&lt;/code&gt;中有个&lt;code&gt;isUseNewCanvas&lt;/code&gt;的变量，把默认值改成true，这样可以避免一个Canvas 2D警告&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(Javascript项目跳过)Typescript项目需要给&lt;code&gt;echarts.js&lt;/code&gt;添加类型声明文件，主要就是&lt;code&gt;setOption&lt;/code&gt;这个方法。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;官方例子&lt;code&gt;pages&lt;/code&gt;文件下随便找个例子抄一抄，完成自己页面中文件修改就可以展示图表了
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;index.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.wxml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.js/ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/multiCharts&lt;/code&gt;下面展示了如何创建多个图表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/lazyLoad&lt;/code&gt;下面展示了如何懒加载图表，即可以先异步请求数据，再根据数据展示图表
&lt;ul&gt;
&lt;li&gt;推荐使用&lt;code&gt;lazyLoad&lt;/code&gt;的方式来创建多个图标，充分利用&lt;code&gt;selectComponent()&lt;/code&gt;的灵活性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;更新内容&#34;&gt;更新内容&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;右上角按钮&lt;code&gt;历史数据&lt;/code&gt;改成&lt;code&gt;数据分析&lt;/code&gt;，并修改了数据分析页面的图表。
&lt;ul&gt;
&lt;li&gt;不过周末时间有限，只加了汇总数据，后续添加各月详情列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;删除主页“各类别金额”部分，鸡肋。&lt;/li&gt;
&lt;li&gt;更换底部&lt;code&gt;添加&lt;/code&gt;按钮图标，统一风格。&lt;/li&gt;
&lt;li&gt;修改&lt;code&gt;添加&lt;/code&gt;页面图标选择的样式，统一风格。&lt;/li&gt;
&lt;li&gt;图标选择popup内增加了类别选择，方便查找。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;未来计划&#34;&gt;未来计划&lt;/h2&gt;
&lt;h3 id=&#34;release-140&#34;&gt;Release-1.4.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;给订阅类别添加颜色，方便区分&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;数据分析&lt;/code&gt;页面添加每月的详细数据列表&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;release-200&#34;&gt;Release-2.0.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;离线数据，现在所有操作都是实时的，没有网络无法使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;release-210&#34;&gt;Release-2.1.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;添加新计划时能有更视觉化的操作方式，快速选择新计划的时间范围&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;类型定义代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;declare&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;module&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;&amp;#34;echarts&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ECharts&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;setOption&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;option&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;EChartOption&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;opts?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;EChartsOptionConfig&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EChartOption&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;TSeries&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EChartOption.Series&lt;/span&gt;&amp;gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EChartOption&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Series&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;any&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;EChartsOptionConfig&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;notMerge?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;lazyUpdate?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;silent?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;undefined&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    <item>
      <title>微信小程序开发 - 第一篇</title>
      <link>https://blog.congliu.dev/zh/posts/development/miniprogram/miniprogram-1/</link>
      <pubDate>Thu, 24 Oct 2024 00:19:30 +0800</pubDate>
      <guid>https://blog.congliu.dev/zh/posts/development/miniprogram/miniprogram-1/</guid>
      <description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;
&lt;p&gt;今年被几个订阅扣了不少钱，所以想找一个订阅管理软件，但是没有找到满意的，大多数订阅管理软件中每一条记录都只能有一个价格，一个连续周期。&lt;/p&gt;
&lt;p&gt;但是我有不少订阅的价格一直在变化（从折扣到原价，改变订阅套餐等）。我希望能够在一个订阅里管理价格的变化，并能统计相关支出和提醒。&lt;/p&gt;
&lt;p&gt;所以打算自己写一个。然后开始考虑是做一个APP还是小程序。相比较而言的话，小程序的开发成本更低，而且不需要用户安装，并且现在APP通知有点被滥用，可能提醒效果还不如小程序，所以决定先做一个小程序。&lt;/p&gt;
&lt;h2 id=&#34;开发体验&#34;&gt;开发体验&lt;/h2&gt;
&lt;p&gt;小程序从2018年开始就已经火了，现在都已经2024年了，相关文档，教程，工具都已经很成熟了。所以整体开发体验算是相当流畅了（抛开测试部份）。&lt;/p&gt;
&lt;p&gt;不过小程序认证以及版本审核还是有点繁琐的。如果是企业帐号应该会方便不少，但是个人的话，只能跟着相关条款修改了。&lt;/p&gt;
&lt;h2 id=&#34;开发工具&#34;&gt;开发工具&lt;/h2&gt;
&lt;p&gt;用的都是比较常见的技术栈了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前端&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;微信开发者工具&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App: Nodejs + Nestjs&lt;/li&gt;
&lt;li&gt;Data: Python + FastAPI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据库&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sqlite&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缓存&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dragonfly (Redis)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部署&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes (测试环境)&lt;/li&gt;
&lt;li&gt;Docker Compose (生产环境)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;生产环境架构&#34;&gt;生产环境架构&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;部署架构图&#34; loading=&#34;lazy&#34; src=&#34;https://blog.congliu.dev/images/mini-program/prod-env.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;部署在一台阿里云的机器上，使用Docker Compose管理容器，毕竟只有一个机器，Kubernetes有点大材小用。&lt;/p&gt;
&lt;p&gt;使用Traefik作为反向代理，同时也是HTTPS证书管理工具（Let&amp;rsquo;s encrypt）。&lt;/p&gt;
&lt;p&gt;部署了一个MongoDB Express，并没有向外暴露，方便查看和管理MongoDB。&lt;/p&gt;
&lt;h2 id=&#34;开发流程&#34;&gt;开发流程&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;开发流程&#34; loading=&#34;lazy&#34; src=&#34;https://blog.congliu.dev/images/mini-program/dev-flow.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;毕竟是个小项目，所以开发流程尽量简单。利用Github Actions做CI/CD，每次push都会自动运行测试，然后release分支会打包Image并推送到Docker Hub。&lt;/p&gt;
&lt;p&gt;然后在Kubernetes（测试环境）上拉取最新的Image做测试。最后没问题再部署到生产环境。&lt;/p&gt;
&lt;h2 id=&#34;其他&#34;&gt;其他&lt;/h2&gt;
&lt;p&gt;暂时先分享这么多，贴上一个小程序的二维码，万一被有缘人看见了，欢迎体验。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;小程序二维码&#34; loading=&#34;lazy&#34; src=&#34;https://blog.congliu.dev/images/mini-program/qrcode.png&#34;&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
