news 2026/7/4 6:14:05

小程序从本地存储迁移到服务端,全程记录,都是干货!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
小程序从本地存储迁移到服务端,全程记录,都是干货!!

我的小程序从本地存储迁到服务端,全程记录

几个月前我做了个小程序叫「一纸云深」,一个记录每日心情的情绪治愈工具。一开始图省事,所有数据都存在微信小程序的本地缓存里。

用户用了一段时间后,问题来了:

换个设备,记录全丢——用户换了手机,过去的日记全没了
手机和 iPad 不能共用——数据被隔离在两个设备上
删了重装回到解放前——本地存储经不起任何卸载操作

于是我决定把它改成服务端版。这篇文章记录下整个迁移过程。


🏗️ 改造方案:只动数据层,不动界面

最理想的方案是最小改动——数据层从 localStorage 换到服务器 API,界面不动。

改造范围只有三块:

  1. 后端——新建 Spring Boot 项目,建表、写 CRUD 接口
  2. 前端——把读取 localStorage 的地方换成调后端 API
  3. 登录——加上微信静默登录,关联用户

📊 表结构设计

小程序的核心数据是「日记」,两张表就够了:

CREATETABLEt_user(idBIGINTAUTO_INCREMENTPRIMARYKEY,openidVARCHAR(64)NOTNULLUNIQUE,create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP);CREATETABLEt_diary(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULL,dateVARCHAR(10)NOTNULL,timeVARCHAR(5)NOTNULL,mood_typeINTNOTNULL,contentVARCHAR(200)DEFAULT'',create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP,INDEXidx_user_date(user_id,date));

💡 每条日记关联用户,通过 openid 来识别是谁写的。


📋 接口设计

只做最基础的 5 个接口:

接口方法说明
/api/mini/loginPOST接收 code,返回 JWT token
/api/mini/diary/listGET获取当前用户的日记列表
/api/mini/diary/savePOST保存一条日记(每日上限 5 条)
/api/mini/diary/updatePUT更新日记内容
/api/mini/diary/deleteDELETE删除一条日记

🔄 前端改造:统一 API 封装

原来读取日记的代码是这样的:

// 🔴 改造前:读 localStoragefunctionloadDiaries(){constdata=uni.getStorageSync('yizhi_diary')returndata?JSON.parse(data):[]}

改成调后端 API:

// 🟢 改造后:调后端 APIexportasyncfunctiongetDiaries(){constres=awaitrequest('GET','/diary/list')returnres.data||[]}

每个页面(记录页、分析页、日历页、我的页)都做了同样的替换。改动量不大,但需要细心,一个页面漏了就会显示空数据。


📦 统一返回结构

之前图省事直接用Map.of()返回 JSON,结果发现Map.of()不允许 null 值,遇到空数据直接抛 NPE。

改成一个统一的 ApiResult 类:

@DatapublicclassApiResult<T>{privateintcode;privateStringmessage;privateTdata;publicstatic<T>ApiResult<T>success(Tdata){returnnewApiResult<>(200,"success",data);}}

所有接口统一返回{code, message, data}格式,前端处理起来也统一。


⏰ 关于 onShow 的一个小坑

微信小程序的页面生命周期和 Vue 不太一样。如果用了onMounted,从其他 Tab 切回来时不会重新触发。

// 🔴 从其他页面回来不会刷新onMounted(async()=>{awaitloadData()})// 🟢 每次显示页面都会刷新onShow(async()=>{awaitloadData()})

⚠️这个坑藏得挺深——所有页面都改完了才发现首页数据一直是缓存,切换 Tab 回来还是旧数据。


🚀 部署与上线

前后端开发完成后,按以下步骤上线:

  1. 后端打包——mvn clean package -DskipTests
  2. 上传到服务器——scp jar 到服务器nohup java -jar启动
  3. 前端生产构建——npm run build:mp-weixin
  4. 上传体验版——在微信开发者工具上传
  5. 配置白名单——微信公众平台 → 开发管理 → 服务器域名

✅ 总结

这次迁移花了大概两天时间,几点经验:

核心要点:

  • 先确认方案再动手——花一小时写设计文档,明确改造范围
  • 接口返回用统一对象——别用Map.of(),null 值处理是定时炸弹
  • 页面数据用 onShow——小程序 Tab 切换不会重新触发 onMounted
  • 微信登录在 dev 环境要 mock——本地调不通微信接口,加个测试 openid

如果这篇文章对你有帮助,欢迎点赞收藏!

最后安利一下我的小程序「一纸云深」——一个温暖的情绪治愈小工具,微信搜索就能体验。


关于作者:无羡,独立开发者,专注AI应用开发。

📌 分类:全栈开发

👉 关注我获取更多技术分享
👉 个人博客:云深不知处
👉 独立开发省钱攻略:查看详情
👉 体验我的AI产品:一纸云深

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

点击「阅读原文」查看我的独立开发笔记


👉 点击查看我的个人介绍

👉 点击查看我的小红书主页

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 3:47:16

Havenlon 白皮书解读|架构笔记(一):Havenlon 不是钱包

本文解读自《Havenlon Whitepaper v2.0》第 3.3 节 Product Ecosystem。 这一节的核心观点是&#xff1a;Havenlon 并不是一台单一设备&#xff0c;也不是传统意义上的硬件钱包&#xff0c;而是一套围绕“执行控制”构建的分层产品体系。This article is based on Section 3.3,…

作者头像 李华
网站建设 2026/7/3 0:39:22

Python openpyxl 如何删除行和列

在数据处理和分析中&#xff0c;Excel 文件是不可或缺的一部分。Python 的 openpyxl 库提供了强大的功能来操作 Excel 文件&#xff0c;包括读取、写入、修改和格式化数据。然而&#xff0c;很多初学者在使用 openpyxl 时会遇到一个常见的问题&#xff1a;如何删除 Excel 文件中…

作者头像 李华
网站建设 2026/6/30 22:44:09

Kimi LeetCode 3425. 最长特殊路径 Python3实现

以下是 LeetCode 3425. 最长特殊路径 的 Python3 实现。 --- 解题思路 这道题的核心是 DFS 滑动窗口&#xff08;树上的双指针&#xff09;&#xff0c;时间复杂度 O(n)&#xff0c;空间复杂度 O(n)。 关键观察 1. 特殊路径的定义&#xff1a;路径上所有节点的值互不相同…

作者头像 李华
网站建设 2026/7/4 1:58:35

北方高寒矿区专网通信搭建要点,适配低温、粉尘、防爆严苛工况

北方工矿矿区常年低温严寒、风沙粉尘大、作业环境复杂&#xff0c;井下开采、露天采掘、物料转运、设备检修、应急值守等工作24小时不间断开展。矿区属于高危作业场景&#xff0c;对通信设备的防爆、防寒、防尘、抗干扰性能要求极高&#xff0c;普通民用对讲设备无法适配矿区严…

作者头像 李华
网站建设 2026/7/4 6:06:22

别再只会Ctrl+Alt+T了!VMware Workstation 17 Pro里这5个隐藏指令,效率翻倍

VMware Workstation 17 Pro高阶指令指南&#xff1a;解锁专业用户的效率密码在虚拟化技术的日常使用中&#xff0c;大多数用户停留在图形界面的基础操作层面&#xff0c;却不知道命令行工具中隐藏着能大幅提升工作效率的宝藏指令。对于每天需要管理多个虚拟机的开发者和运维人员…

作者头像 李华