微信小程序WxMa
文章平均质量分 79
WeChat Mini App
小丁学Java
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
这是最新的方法获取微信头像和昵称,其它所有的方法都已经失效,所有AI给的答案也都是旧的API(wx.getUserProfile)通过这个获取的都是灰色头像和默认的用户名叫微信用户
这意味着,只要用户不主动清理缓存,或者小程序没有被卸载,那么存储在本地的数据通常会。(本地存储) 的重要问题:微信小程序的本地存储能存储多久?好的,你问到了一个关于微信小程序。微信小程序的本地存储 (通过。原创 2024-12-27 20:02:26 · 1983 阅读 · 0 评论
-
揭秘小程序中的“秘密握手”:data-id 如何 magically 变成 dataset.id
小程序开发中的命名转换机制解析 本文深入探讨了微信小程序开发中WXML模板与JavaScript之间数据传递的核心机制。文章揭示了data-id与dataset.id看似不同却完美对应的秘密:这是两种命名规范(kebab-case与camelCase)的自动转换过程。 关键要点: WXML使用data-前缀的自定义属性(kebab-case) JavaScript通过dataset对象自动转换为camelCase格式 转换规则包括:剥离data-前缀,将连字符后的字母大写 这是基于HTML DOM data原创 2025-08-21 17:38:59 · 829 阅读 · 0 评论 -
从后端到前端:一次“教科书式”的小程序收藏功能全栈开发实录
本文详细介绍了小程序收藏功能的全栈开发实践。后端采用幂等性设计防止重复操作,通过批量查询接口避免N+1性能问题,返回高效Map结构。前端采用两步走策略,先快速展示内容再异步更新收藏状态,利用EventChannel传递数据实现无缝跳转,并运用乐观更新优化交互体验,最终为用户提供流畅的收藏功能。原创 2025-08-08 17:28:16 · 1177 阅读 · 0 评论 -
一行日志引发的血案:解密微信小程序 downloadFile:fail url scheme is invalid ✨
一行日志引发的“血案”:微信小程序开发中,用户更新头像时出现downloadFile:fail url scheme is invalid错误。经排查发现,开发者错误地将本地临时路径wxfile://传给仅支持网络URL的wx.downloadFileAPI。正确做法应直接使用wx.uploadFile处理本地文件上传。此案例警示开发者:1)严格遵循API使用规范;2)重视结构化日志记录;3)理解不同URL协议(wxfile://与http://)的差异。通过修正业务逻辑,改为直接上传本地临时文件路径,问题原创 2025-08-06 14:46:15 · 1215 阅读 · 0 评论 -
微信小程序上传揭秘:http://tmp 临时文件是如何“飞”到后端的?
微信小程序上传文件时使用的http://tmp临时路径解密:它并非真实网络地址,而是小程序环境内的本地文件标识符。当调用wx.uploadFile时,微信底层会将该路径转换为真实文件数据,打包成multipart/form-data请求发送至后端,后端接收到的直接是二进制文件数据而非路径字符串。整个过程由微信客户端原生代码完成转换,临时文件在小程序退出后会被清理。原创 2025-08-05 22:28:18 · 1305 阅读 · 0 评论 -
微信头像上传“巨坑”复盘:告别 getUserProfile,拥抱 uploadFile 的正确姿势 ✨
微信头像上传最佳实践:告别临时URL,拥抱文件直传 微信已废弃getUserProfile接口,开发者需采用新方案: 前端使用<button open-type="chooseAvatar">获取本地临时文件路径 通过wx.uploadFile将文件上传至自有服务器 后端接收文件并存储至云存储(如OSS),生成永久URL 关键优势: ✅ 摆脱对微信临时URL的依赖 ✅ 完全掌控用户数据资产 ✅ 支持后续图片处理和CDN加速 传统方案直接存储第三方URL存在严重隐患,新方案通过原创 2025-08-05 18:49:28 · 1641 阅读 · 0 评论 -
Spring Boot 实战:三步构建一个“教科书级”的用户信息获取接口 !
本文介绍如何基于Spring Boot构建一个安全、高效的RESTful用户信息获取接口。通过三步实现:1)复用UserProfileVO视图对象确保数据脱敏;2)在Service层使用@Transactional(readOnly=true)优化查询性能;3)通过Controller暴露GET接口,利用JWT拦截器保障安全。整个过程严格遵循RESTful规范,实现了前后端解耦和安全防护,为类似接口开发提供了标准范例。原创 2025-08-05 15:00:47 · 933 阅读 · 0 评论 -
Spring Boot 实战:构建一个安全、灵活的“部分更新”用户资料接口 !
本文介绍了如何构建一个安全、灵活的RESTful用户信息更新接口。通过Spring Boot实战案例,详细讲解了从接口设计到业务实现的完整流程。文章重点阐述了如何实现部分更新功能(前端只需传递要修改的字段),同时确保安全认证(使用JWT拦截器保护接口)。技术方案包括:采用PUT方法符合RESTful规范、使用独立的Payload和VO对象解耦数据、实现非空字段更新逻辑等。文章还通过流程图展示了请求从发起到数据库更新的完整链路,并提供了关键代码示例,包括请求载荷定义、视图对象设计及服务层实现的核心逻辑。原创 2025-08-04 19:35:48 · 625 阅读 · 0 评论 -
Spring Boot + WxJava 实战:三步构建一个“多租户”微信小程序绑定手机号接口
本文介绍了如何基于Spring Boot和WxJava SDK实现一个支持多租户的微信小程序绑定手机号接口。文章首先明确了技术选型,包括使用WxJava SDK简化微信API调用、JWT实现无状态认证等。然后详细设计了前后端交互的数据模型(DTO/VO),包括请求载荷和响应视图对象。核心实现部分展示了如何利用WxJava的多租户支持功能,通过switchover()方法动态切换小程序配置,并在一行代码内完成手机号获取。最后将手机号信息更新到数据库并返回给前端。整个过程遵循分层架构,代码简洁高效,为多小程序场原创 2025-08-04 18:30:16 · 1028 阅读 · 0 评论 -
微信多租户开发的“换挡”艺术:switchover 手动挡 vs. 动态代理自动挡!
**摘要:本文对比了微信多租户开发中的两种租户切换机制——WxJava标准switchover(手动挡)和动态代理自动切换(自动挡)。手动挡模式需在每个业务方法中显式调用切换,代码清晰但重复;自动挡通过代理拦截方法调用,从HTTP请求隐式获取租户信息,实现业务与切换逻辑解耦。前者简单直接,后者自动化程度高但实现复杂,开发者可根据项目需求选择合适方案。原创 2025-08-02 21:11:01 · 1135 阅读 · 0 评论 -
Spring Boot 实战:从零到一构建“多租户”微信小程序登录系统 ✨
本文介绍了如何使用Spring Boot构建一个支持多租户的微信小程序登录系统。系统通过application.yml集中管理不同小程序的AppID、AppSecret与后台店铺的映射关系,实现配置驱动的多租户支持。架构包含配置加载器(MiniAppAdminConfig)、请求处理(WxLoginPayload)、微信API调用(RestTemplate)、核心业务逻辑(WxAuthService)、JWT认证(JwtUtil)等组件。重点讲解了如何通过配置中心灵活管理不同租户信息,以及如何实现无状态认证原创 2025-08-02 18:20:35 · 1163 阅读 · 0 评论 -
微信登录后端实现:你会选择“手动挡(RestTemplate)”还是“自动挡(WxJava SDK)”?
摘要:文章对比了使用原生RestTemplate和WxJava SDK实现微信登录的两种方式。手动挡模式需要开发者自行处理URL拼接、HTTP请求、JSON解析和错误检查,代码量多且容易出错;而自动挡模式通过WxJava封装,只需一行代码即可完成所有操作,提供强类型支持和内置错误处理。后者显著提升开发效率,降低出错风险,适合需要频繁调用微信API的场景。建议在微信生态开发中优先考虑专业SDK方案。原创 2025-08-02 17:06:14 · 630 阅读 · 0 评论 -
字体粗细的秘密:font-weight:normal (400) 默认值大揭秘 !
font-weight 属性默认值为 normal(400),本文通过多种图表形式深入解析其工作原理。核心内容包括:1)当未设置时,浏览器会检查元素默认样式(如 <strong> 默认 700),否则使用 400;2)通过决策流程图展示浏览器如何确定最终字体粗细;3)使用时序图、状态图等形象化不同场景下权重的变化过程;4)类图和实体关系图揭示 CSS 规则的面向对象特性。帮助开发者全面掌握字体粗细的控制逻辑,提升样式设计能力。原创 2025-07-28 19:58:47 · 1040 阅读 · 0 评论 -
opacity vs rgba:CSS 透明效果的终极对决!
摘要:本文深入比较CSS透明效果实现方式opacity和rgba的核心区别。opacity会同时影响元素及其所有子元素的透明度,适用于整体淡入淡出效果;而rgba仅控制元素背景色的透明度,子元素保持清晰,适合弹窗遮罩等场景。文章通过对比表格、流程图、时序图、状态机、类图和实体关系图等多种可视化方式,系统解析两种透明方式的渲染机制和应用场景,帮助开发者精准选择透明效果实现方案,打造层次分明的UI界面。原创 2025-07-28 19:25:30 · 652 阅读 · 0 评论 -
Flexbox 终极指南:彻底解构主轴 (Main Axis) 与交叉轴 (Cross Axis) ✨
摘要: 本文深入解析Flexbox布局中的主轴与交叉轴概念,通过表格对比、流程图、生活场景和时序图等多种形式,清晰展示flex-direction如何决定对齐方向。关键点包括:flex-direction: row时主轴为水平方向,column时主轴为垂直方向;align-items的对齐行为会随主轴方向变化而改变。文章还通过书架比喻、浏览器内部处理流程和类图等生动方式,帮助开发者彻底掌握这一核心机制,解决常见的布局困惑。原创 2025-07-24 14:36:55 · 1127 阅读 · 0 评论 -
纯白与灰白:UI 设计中的“白”学问:#FFFFFF vs #F3F3F3,你用对了吗?✨
【摘要】本文深入解析UI设计中两种白色(#FFFFFF纯白和#F3F3F3灰白)的区别与应用。纯白色作为"画布"突出内容,适用于内容卡片和弹窗;灰白色则作为"墙纸"营造舒适视觉环境,常用于页面背景和输入框。通过流程图、时序图等可视化方式展示二者的设计逻辑和协作关系,揭示如何通过微妙的颜色差异构建界面层次感。文章还提供状态图、类图等辅助理解,帮助设计师掌握这对提升界面质感的黄金配色组合。原创 2025-07-19 17:25:01 · 1115 阅读 · 0 评论 -
小程序解谜:为什么我的 JS 计算值 132,在 iPhone 14 Pro Max 上变成了 75px? ✨
摘要: 小程序开发中,JS计算值132在WXML中绑定为132rpx后,在iPhone 14 Pro Max上渲染为75px的现象并非bug,而是小程序rpx单位自动适配的结果。通过正向验证:iPhone 14 Pro Max逻辑宽度为430px,按小程序标准750rpx=屏幕宽度的规则,转换公式为132*(430/750)≈75.68px,经引擎取整后得到75px。这一机制确保了跨设备适配,开发者只需关注rpx数值,渲染引擎会自动完成像素转换。原创 2025-07-18 19:33:42 · 974 阅读 · 0 评论 -
小程序 UI 魔法:解密 placeholder-style,让你的输入框“会说话”!
本文深入解析了微信小程序中placeholder-style属性的作用与用法。该属性专用于定制<input>和<textarea>组件的占位符文本样式,通过内联CSS实现视觉定制。文章采用流程图、时序图等多种可视化方式,生动展示了placeholder-style的渲染机制和优先级规则(高于placeholder-class)。通过实际案例演示如何将占位符设计为"推荐默认值"的样式,提升用户体验。最后用状态图、类图等深入剖析了小程序组件的样式系统架构。原创 2025-07-18 18:32:05 · 1058 阅读 · 0 评论 -
CSS 奇技淫巧:我是如何用 calc() 函数实现“跨层”定位的 ✨
CSS 布局技巧:用 calc() 实现精准定位 本文分享了一种利用 calc() 函数解决复杂布局问题的创新方法。通过反向计算的方式,实现了元素相对于屏幕边缘的精确定位,同时避免了使用 position: absolute 带来的文档流问题。 核心思路: 数学计算定位:使用 calc() 函数计算元素需要的边距值 反向推导:从期望的总距离减去父级容器的累积偏移量 保持文档流:不脱离文档流的情况下实现精确定位 技术要点: 计算期望位置与父级偏移的差值 支持不同单位的混合运算 实时动态计算特性 这种方法特别适原创 2025-07-18 17:16:26 · 904 阅读 · 0 评论 -
代码分层艺术:解构小程序中(wechat.js) API 网关与(device.js)设备工具库的优雅协作 ✨
小程序代码分层设计解析 本文剖析了小程序开发中两个核心模块的优雅分层协作:wechat.js作为底层API网关,统一封装微信原生接口;device.js作为上层工具库,提供设备信息服务。二者通过清晰的依赖关系形成分层架构: API网关层 (wechat.js): 采用门面/适配器模式 封装原生API,实现Promise化 提供标准化基础服务 工具服务层 (device.js): 基于API网关构建 实现设备信息缓存 提供语义化业务函数 通过初始化缓存、运行时快速读取的机制,这种分层设计既保证了性能,又实现了原创 2025-07-17 16:02:45 · 711 阅读 · 0 评论 -
CSS 适配魔法:一行代码搞定 iPhone 底部安全区 ✨
CSS适配iPhone底部安全区终极方案 🪄 本文介绍了一种优雅的CSS解决方案,通过一行代码padding-bottom: env(safe-area-inset-bottom)即可完美适配iPhone全面屏底部安全区。该方案利用CSS环境变量函数env()自动获取设备底部安全区高度(全面屏iPhone约34px,非全面屏为0px),适用于固定在底部的TabBar、工具栏等元素。文章通过流程图、时序图等多种可视化方式详细解析了其工作原理,并提供了微信开发者工具中的验证方法。相比传统媒体查询或JS判断,这原创 2025-07-17 15:51:20 · 957 阅读 · 0 评论 -
CSS 魔法揭秘:padding: 0 35rpx 120rpx; 到底是什么意思?
这篇技术博客深入解析了CSS中padding属性的三值简写语法padding: 0 35rpx 120rpx;。文章通过流程图、时序图、状态图等多种图表,详细展示了CSS引擎如何解析这种三值简写(上、左右、下),并特别解释了微信小程序专属的rpx响应式像素单位。全文采用生动形象的比喻和丰富的可视化表达,帮助开发者快速掌握这一常见但易混淆的CSS特性,同时提供了完整的记忆导图,让读者能够轻松应用于实际开发场景。原创 2025-07-16 21:00:49 · 962 阅读 · 0 评论 -
当生活中的 “shrink” 闯入代码:彻底搞懂 CSS flex-shrink 属性 ✨
本文深入解析CSS中的flex-shrink属性,通过生动的比喻和多种图表展示其工作原理。该属性决定弹性项目在空间不足时的收缩比例:flex-shrink:1表示默认收缩,0表示绝对不收缩,2表示加倍收缩。文章通过流程图、时序图等可视化方式,详细演示了浏览器如何处理不同flex-shrink值的布局决策,并分析了代码中两个关键应用案例(固定宽度侧边栏和不缩水的标签)。最后通过状态图、类图等补充说明,帮助读者全面理解这一重要CSS属性。原创 2025-07-16 17:27:13 · 758 阅读 · 0 评论 -
代码解剖室:揭秘微信小程序中自定义wechat.js和toast.js 文件的“爱恨情仇”。
本文通过详细图解分析了微信小程序中两个JS文件的协作关系。wechat.js作为底层API封装层,提供基础工具函数和Promise化接口;toast.js作为上层UI工具类,封装特定提示功能。两者通过巧妙的设计形成循环引用:wechat.js创建ToastCls实例,而toast.js则调用wechat.js的基础方法。这种分层设计实现了关注点分离,提高了代码可维护性,同时通过工厂模式提供便捷的语义化接口,使开发者能更高效地调用常用功能。原创 2025-07-16 15:14:45 · 631 阅读 · 0 评论 -
身份的困境:PC 端创建用户,如何优雅处理微信 OpenID 的唯一性与非空约束?
解决用户身份标识的数据库约束问题 当用户既通过微信小程序(有OpenID)又通过PC端(无OpenID)注册时,会面临数据库约束冲突问题。由于OpenID字段被设置为NOT NULL且UNIQUE,直接插入NULL会被MySQL转换为空字符串'',导致唯一约束冲突。解决方案是为PC端创建的用户生成临时唯一ID(如"PC_UUID"),满足数据库约束,待用户后续通过微信登录时再更新为真实OpenID。这种方法既保证了数据完整性,又解决了不同注册途径带来的身份管理问题。原创 2025-07-14 19:31:12 · 800 阅读 · 0 评论 -
微信开发双雄:公众平台 vs. 开放平台,你真的分清了吗?
微信开发中,公众平台和开放平台是两个核心工具,功能与定位各有不同。微信公众平台主要用于单个小程序或公众号的开发、管理和运营,提供AppID和OpenID,适合独立应用的创建与维护。微信开放平台则专注于多应用间的用户身份打通,通过UnionID实现跨应用的用户识别,适合需要统一管理多个应用的场景。开发者应根据业务需求选择合适平台:单一应用使用公众平台,多应用用户数据共享则需借助开放平台。原创 2025-05-20 14:40:06 · 3744 阅读 · 0 评论 -
深入理解微信小程序中的 wx:if=“{{detail[item.key]}}“!!!
方面详情父组件(页面或组件)子组件(自定义组件)语法作用如果为真值,则条件渲染 UI数据来源detail(对象)和list(数组)由父组件传递特殊处理显示unitText(如“月”)而非原始值主要优势避免渲染空值或无效数据,提升用户体验。原创 2025-04-19 21:10:29 · 1140 阅读 · 0 评论 -
排查微信小程序storage中 allowInvite 被“清空”的根源!!!
不是被“清空”的,而是未被正确设置后端接口在邀请码锁定的场景中,返回的data不包含字段。前端直接访问,结果是undefined。将设置为空。为什么其他键存在inviteCode和在其他逻辑中被设置,且没有被覆盖。通过一步步排查,我们终于找到了问题:后端在邀请码锁定场景下未返回字段,导致前端将其设置为空。收获:学会了如何通过前后端联合调试,结合日志、流程图和交互图,快速定位问题 💪。希望这篇博客对你有帮助!如果有其他问题,欢迎随时交流~ 😄。原创 2025-04-16 18:04:46 · 3911 阅读 · 0 评论 -
WePY 框架:小程序开发的“Vue式”利器!!!
特性原生小程序WePY组件化基础支持,复用麻烦强大,像 Vue 一样语法WXML + JS,传统风格类 Vue,现代感十足ES6+ 支持有限,需额外配置开箱即用,支持 Promise性能优化手动优化内置脏检查,自动优化开发效率中等,重复代码多高,组件化省心如果你是小程序开发者,又喜欢 Vue 的优雅语法,WePY 绝对是你的好帮手!它不仅提升开发效率,还能让代码更清晰、更现代化。💻适合人群:想从原生小程序升级的开发者,或 Vue 爱好者。入手建议:试试用wepy init。原创 2025-04-10 17:11:14 · 884 阅读 · 0 评论 -
微信小程序开发:必须全局安装 wepy-cli 吗?
方式命令优点缺点适用场景全局安装简单,随时可用可能版本冲突多个 WePY 项目本地安装版本独立,项目隔离命令稍长单一项目或团队协作如果你是 WePY 的“老司机”🚗,全局安装wepy-cli更方便。如果你追求项目隔离🔒,本地安装是更好的选择。无论哪种方式,只要能让你的小程序跑起来,就是胜利!有问题欢迎留言交流哦~💬。原创 2025-04-10 15:01:55 · 676 阅读 · 0 评论 -
小程序里为何偏爱 var?从一段代码看 var、let 和 const 的较量!
小程序里为何偏爱 var?从一段代码看 var、let 和 const 的较量!原创 2025-03-13 17:47:53 · 783 阅读 · 0 评论 -
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别
是桌面端网页开发中的经典选择器控件。如果您有更具体的应用场景,我可以帮您更深入分析!都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。更适合移动端和微信小程序,而 select。在微信小程序或前端开发中,picker。总结来说,picker。原创 2025-03-13 14:48:22 · 1046 阅读 · 0 评论 -
“errMsg“:“downloadFile:fail Error: ENOENT: no such file or directory
API 下载文件时,系统找不到指定的路径。ENOENT 是一个常见的 POSIX 错误码,代表 “Error NO ENTity”,即没有这个实体(在这里指的是文件或目录不存在)。根据提供的错误信息,这个问题发生在微信开发者工具中,并且涉及到了一个临时文件的下载操作。原创 2025-03-13 14:24:27 · 2016 阅读 · 3 评论 -
揭秘 glass-easel:小程序组件框架的“幕后英雄”与“bug制造者”
通过这次“踩坑”,我算是彻底搞明白了。原创 2025-03-12 21:18:52 · 1500 阅读 · 0 评论 -
小程序渲染之谜:如何解决“加载中...”不消失的 Bug(glass-easel)
这次 bug 的根源在于框架与现有代码的不兼容,导致状态更新后视图未能及时刷新。移除,恢复原生框架后,状态提示得以正常控制。💡技术小贴士如果小程序页面状态不更新,检查是否引入了第三方框架。异步操作可能导致渲染延迟,尽量确保状态逻辑与视图同步。🛠️希望这篇博客能帮你在小程序开发中少走弯路!如果遇到类似问题,或者有其他经验分享,欢迎留言交流。😊 下次再有 bug,我们一起搞定它!分享,让我们在技术路上携手进步!👍。原创 2025-03-12 21:03:55 · 1874 阅读 · 0 评论 -
从零到一揭秘微信小程序标签切换:tab-item、data-tab 和 bindtap 的奇妙冒险
tab-item:视觉的艺术家 🎨,用样式勾勒标签的轮廓。data-tab:逻辑的信使 📬,传递标签的身份信息。bindtap:交互的指挥家 🎵,协调用户操作与程序响应。这三者如同舞台上的三位主角,在微信小程序的剧场中上演了一出精彩的切换大戏。没有复杂的框架,没有冗余的代码,只需简单的配置,就能实现流畅的标签切换体验。这正是小程序开发的魅力所在!💡。原创 2025-03-12 16:15:28 · 982 阅读 · 0 评论 -
用伪元素打造酷炫分隔条:从小程序代码看设计魔法 ✨
从这段代码,我们看到一个小小的伪元素,就能让页面从平淡走向生动。设计从来不是堆砌复杂效果,而是用简单的手法制造惊喜。💖 下次写代码时,别忘了给你的页面加点“魔法条”,让用户眼前一亮吧!你有没有用过类似的伪元素技巧?快在评论里分享你的创意,咱们一起涨姿势!👇希望这篇博客既有趣又有料!原创 2025-03-09 19:36:50 · 866 阅读 · 0 评论 -
wx:if,我的代码小甜心,你到底会不会陪我出现?
2025年3月6日:你的 小可爱嗨,我的代码宝宝们!今天我要带你们认识一位让我心动的技术小甜心 ——。它就像恋爱中的你我,时而羞涩地躲起来,时而热情地扑进怀抱。想知道它是怎么俘获我的心的吗?快跟我一起走进这场甜甜的“技术恋爱”吧!💕。原创 2025-03-07 16:13:21 · 1091 阅读 · 0 评论 -
制服小程序的“滑手”:禁用页面左右滑动全攻略
通过和,我们成功制服了小程序的“左右滑动鬼”,让“疑惑产品上传”页面变得规规矩矩!👮 同时,保证了用户还能享受垂直滚动的自由。你的代码现在既安全又实用,简直是开发界的“滑手克星”!🌈快去测试一下吧!如果有啥问题,随时叫我,咱们一起“debug 狂欢”!🎉😊。原创 2025-03-03 16:10:55 · 1540 阅读 · 0 评论 -
揭秘 <input> 中的 const formData = e.detail.value:表单提交的小秘密
是<input>组件在表单提交中的好帮手,把用户输入从搬到你的代码里。它简单、直接,但在您的“疑惑产品上传”页面中却不可或缺!从价格到渠道,再到联系方式,它默默支撑着数据提交的全流程。加上一点小心和创意(比如实时更新),您的表单会更好玩、更实用!✨怎么样,是不是觉得这行代码有点可爱了?👍 有问题欢迎留言,我们一起聊聊小程序的奇妙世界!🌈😊。原创 2025-03-03 15:43:20 · 993 阅读 · 0 评论
分享