参加比赛的作品,开发周期一个月,使用了 Wafer2 框架,后台采用腾讯云提供的 Node.js SDK 接入对象存储 API ,前端核心代码实现了类似于图片编辑器的功能,支持图片和文字的移动、旋转、缩放、生成预览图以及编辑状态的保存,动画部分采用 CSS 动画实现小程序中的模态输入框部分使用了自己封装的 InputBox 组件代码已移除 AppId 等敏感信息,可自行添加自己的 AppId 和 AppSecret 以配置后台环境,实现登录测试,详细添加方法见下文「使用方法」,若本地运行可通过修改 app.json 文件中 page 字段的顺序来查看不同页面微信小程序定制需求请联系作者微信:aweawds (注明来意)效果展示      使用方法首先点击右上角 Star ʕ •ᴥ•ʔ获取Demo代码执行 git clone https://github.com/goolhanrry/Weapp-Demo-LemonJournal.git或 点击此处 下载最新版本的代码解压后在微信开发者工具中打开 Weapp-Demo-LemonJournal 文件夹即可如需进行登录测试,还要执行以下步骤准备好自己的 AppId 和 AppSecret(可在微信公众平台注册后获取)在 project.config.json 的 appid 字段中填入 AppId在 /client/utils/util.js 中相应位置填入 AppId 和 AppSecret在微信开发者工具中重新导入整个项目,上传后台代码后编译运行即可核心代码组件的移动、旋转和缩放主要思路是把  标签(对应图片)和  标签(对应文字)封装在同一个自定义组件  中,通过对外暴露的 text 变量是否为空来进行条件渲染,然后绑定 onTouchStart() 、onTouchEnd() 和 onTouchMove() 三个事件来对整个组件的位置、角度、大小、层级以及 “旋转” 和 “移除” 两个按钮的行为进行操作onTouchStart: function (e) {     // 若未选中则直接返回     if (!this.data.selected) {         return     }     switch (e.target.id) {         case 'sticker': {             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             break         }         case 'handle': {             // 隐藏移除按钮             this.setData({                 hideRemove: true             })             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             this.sticker_center_x = this.data.stickerCenterX;             this.sticker_center_y = this.data.stickerCenterY;             this.remove_center_x = this.data.removeCenterX;             this.remove_center_y = this.data.removeCenterY;             this.handle_center_x = this.data.handleCenterX;             this.handle_center_y = this.data.handleCenterY;             this.scale = this.data.scale;             this.rotate = this.data.rotate;             break         }     } }, onTouchEnd: function (e) {     this.active()     this.touch_target = ''     // 显示移除按钮     this.setData({         removeCenterX: 2 * this.data.stickerCenterX - this.data.handleCenterX,         removeCenterY: 2 * this.data.stickerCenterY - this.data.handleCenterY,         hideRemove: false     })     // 若点击移除按钮则触发移除事件,否则触发刷新数据事件     if (e.target.id === 'remove') {         this.triggerEvent('removeSticker', this.data.sticker_id)     } else {         this.triggerEvent('refreshData', this.data)     } }, onTouchMove: function (e) {     // 若无选中目标则返回     if (!this.touch_target) {         return     }     var current_x = e.touches[0].clientX * 2     var current_y = e.touches[0].clientY * 2     var diff_x = current_x - this.start_x     var diff_y = current_y - this.start_y     switch (e.target.id) {         case 'sticker': {             // 拖动组件则所有控件同时移动             this.setData({                 stickerCenterX: this.data.stickerCenterX   diff_x,                 stickerCenterY: this.data.stickerCenterY   diff_y,                 removeCenterX: this.data.removeCenterX   diff_x,                 removeCenterY: this.data.removeCenterY   diff_y,                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             break         }         case 'handle': {             // 拖动操作按钮则原地旋转缩放             this.setData({                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             var diff_x_before = this.handle_center_x - this.sticker_center_x;             var diff_y_before = this.handle_center_y - this.sticker_center_y;             var diff_x_after = this.data.handleCenterX - this.sticker_center_x;             var diff_y_after = this.data.handleCenterY - this.sticker_center_y;             var distance_before = Math.sqrt(diff_x_before * diff_x_before   diff_y_before * diff_y_before);             var distance_after = Math.sqrt(diff_x_after * diff_x_after   diff_y_after * diff_y_after);             var angle_before = Math.atan2(diff_y_before, diff_x_before) / Math.PI * 180;             var angle_after = Math.atan2(diff_y_after, diff_x_after) / Math.PI * 180;             this.setData({                 scale: distance_after / distance_before * this.scale,                 rotate: angle_after - angle_before   this.rotate             })             break         }     }     this.start_x = current_x;     this.start_y = current_y; }编辑状态的保存一篇手帐包含的组件类型包括 sticker(软件自带的贴纸)、image(用户上传的图片)和 text(自定义文字)三种,全部保存在一个如下格式的 json 对象中,每个独立组件都包含了一个不重复的 id 以及相关的信息,保存时由客户端生成该对象并编码成 json 字符串存储在数据库,恢复编辑状态时通过解析 json 字符串获得对象,再由编辑页面渲染{     "backgroundId": "5",                                        背景图id     "assemblies": [         {             "id": "jhjg",                                       组件id             "component_type": "image",                          组件类型(自定义图片)             "image_url": "https://example.com/jhjg.png",        图片地址             "stickerCenterX": 269,                              中心横坐标             "stickerCenterY": 664,                              中心纵坐标             "scale": 1.7123667831396403,                        缩放比例             "rotate": -3.0127875041833434,                      旋转角度             "wh_scale": 1,                                      图片宽高比             "z_index": 19                                       组件层级         },         {             "id": "gs47",             "component_type": "text",                           组件类型(文字)             "text": "test",                                     文字内容             "stickerCenterX": 479,             "stickerCenterY": 546,             "scale": 1.808535318980528,             "rotate": 29.11614626607893,             "z_index": 10         },         {             "id": "chjn",             "component_type": "sticker",                        组件类型(贴纸)             "sticker_type": "food",                             贴纸类型             "sticker_id": "1",                                  贴纸id             "image_url": "https://example.com/weapp/stickers/food/1.png",             "stickerCenterX": 277,             "stickerCenterY": 260,             "scale": 1.3984276885130673,             "rotate": -16.620756913892055,             "z_index": 5         }     ] }
2025-08-09 09:39:27 6.81MB 开源项目
1
【微信助手Chrome插件】 微信助手是一款针对微信用户设计的Chrome浏览器扩展,旨在提供便捷的功能,帮助用户管理和优化他们的微信社交网络。这个插件的主要功能是检查并确认微信好友是否已将你从好友列表中删除,使用户能够及时了解自己的微信社交关系状态。 **一、微信助手的核心功能** 1. **检测好友关系**:微信助手的核心功能就是检测微信好友列表,通过与服务器的交互,判断哪些好友可能已经将你移除。这一特性对于维护个人社交网络的完整性和及时了解朋友圈动态变化至关重要。 2. **简单易用**:作为一款Chrome插件,微信助手的安装和使用都非常简单,只需在Chrome浏览器的扩展商店搜索并添加即可。用户无需复杂的设置,一键操作即可开始检查。 3. **隐私保护**:虽然微信助手涉及到好友关系的检测,但它并不会获取或保存用户的任何个人信息,确保了用户隐私的安全。 **二、开源项目的价值** 1. **透明度与可信度**:作为开源项目,微信助手的源代码对公众开放,用户可以查看其工作原理,确保没有恶意代码或侵犯隐私的行为,增加了软件的可信度。 2. **社区协作**:开源项目鼓励开发者参与贡献,用户可以通过提交bug报告或改进代码来优化产品,使其持续进化,满足更多用户需求。 3. **学习资源**:对于开发者来说,开源的微信助手提供了一个学习Chrome插件开发、微信API调用和好友关系管理的实践平台,有助于提升技能。 **三、使用教程** 1. **下载安装**:需要在Chrome浏览器的Web Store中搜索“微信助手”并下载安装。 2. **授权连接**:安装完成后,用户需在插件界面授权微信助手连接到微信账户,同意必要的权限。 3. **开始检测**:授权成功后,点击插件图标,按照提示操作,即可开始检测好友关系。 **四、注意事项** 1. **隐私政策**:使用此类插件时,务必了解其隐私政策,确保自己的数据安全。 2. **软件更新**:由于微信接口可能会发生变化,定期检查插件更新,以保持其功能正常运行。 3. **官方支持**:尽管微信助手是开源项目,但可能存在兼容性问题或功能限制,遇到问题时,可以寻找社区支持或开发者提供的帮助。 微信助手Chrome插件提供了一种方便的方式来管理和维护微信中的好友关系,而其开源性质则保证了代码的透明度和社区的活力。通过了解和使用这款工具,用户可以更好地掌握自己的微信社交网络,同时也能为开发者提供一个学习和创新的平台。
2025-08-08 00:05:31 1.34MB 开源项目
1
内容概要:本文档提供了一个包含 osg3.6.5 和 osgearth3.1 源码工程的下载链接,以及解压密码。OpenSceneGraph (OSG) 是一个开源的高性能 3D 图形工具包,而 OSGEarth 则是基于 OSG 的地球可视化插件。该源码工程不仅包括 OSG 和 OSGEarth 的源代码,还包含了必要的第三方库,方便开发者进行二次开发和深入研究。; 适合人群:对 3D 图形开发、地球可视化技术感兴趣的开发人员,尤其是有一定 C++ 基础并希望深入了解 OSG 和 OSGEarth 内部机制的工程师。; 使用场景及目标:① 开发者可以利用该源码工程进行 OSG 和 OSGEarth 的二次开发;② 研究人员可以通过阅读和修改源码来探索 3D 图形渲染和地球可视化的实现细节。; 其他说明:请确保从合法渠道获取并使用该源码,遵守相关开源协议。下载链接为百度网盘,提取码为 osgb,解压密码为 qazsew_osg。
2025-07-15 20:16:24 224B OpenGL 开源项目 3D图形
1
lua-gd 是 LibGD 的 Lua 语言绑定版本。示例代码:require "gd" local gray1 = im:colorResolve(128, 128, 128)        -- Using the colon notation local gray2 = gd.colorResolve(im, 128, 128, 128)    -- Using a C-style notation下载和安装:gcc -o gd.so `gdlib-config --features |sed -e "s/GD_/-DGD_/g"` `gdlib-config --cflags` `pkg-config lua5.1 --cflags` -O3 -Wall -shared `gdlib-config --ldflags` `gdlib-config --libs` `pkg-config lua5.1 --libs` -lgd luagd.c lua test_features.lua Lua-GD version: lua-gd 2.0.33r2 Lua-GD features:     PNG support ..................... Enabled     GIF support ..................... Enabled     JPEG support .................... Enabled     XPM/XBM support ................. Enabled     FreeType support ................ Enabled     Fontconfig support .............. Enabled 标签:luagd
2025-07-04 09:11:27 435KB 开源项目
1
yudao ruoyi-vue-pro 支付模块初始化 SQL 包含多支付渠道核心表结构及基础配置,支持微信、支付宝等主流支付方式。资源涵盖支付应用表(pay_app)、商户配置表(pay_merchant)、支付订单表(pay_order)、退款记录表(pay_refund)及异步通知日志,集成支付渠道参数管理、订单状态追踪、回调处理等数据模型。内置测试商户信息、沙箱环境密钥及示例订单数据,适配 Ruoyi 权限体系,通过 pay_ 前缀表实现模块化隔离。支持多租户支付配置、交易对账及账单生成功能,提供默认权限路由与菜单配置,确保快速对接第三方支付平台,适用于电商、SAAS 等场景的支付中台建设。
2025-06-24 16:46:45 29KB sql 开源项目
1
NanoStat: An open source, fully wireless potentiostat 论文开源项目工程,该论文以及使用方法可以参考本人相关博客。
2025-06-24 16:05:56 12.29MB
1
qt_eventdispatcher_libevent  是基于 Libevent 的 Qt 事件调度器 特点 非常快速 支持Qt4和Qt5 不需要Qt的私有头文件 通过Qt4 和 Qt5 的事件调度,事件循环,定时器和socket通知测试
2025-06-21 17:14:23 30KB 开源项目
1
在网上找到的很多根据android-serialport-api开源项目改编的Android串口项目在进入Activity时会有一个弹窗,提示text locations,具体请看https://blog.csdn.net/qq_37069563/article/details/79585341
2025-06-20 14:09:55 17KB 串口 开源项目
1
标题 "jruby-1.7.9.zip" 暗示了我们正在处理一个与 JRuby 相关的文件,JRuby 是一个流行的 Java 实现的 Ruby 语言版本。它允许开发者在 Java 平台上运行 Ruby 代码,利用 JVM (Java Virtual Machine) 的性能和生态系统。JRuby 1.7.9 是该版本线的一个特定发布,可能包含了对 Ruby 1.9.x 版本的兼容性优化和一些已知问题的修复。 描述中的 "opencmsmoduleswar.zip" 提到了 OpenCMS,这是一个开源的内容管理系统,主要用于构建和管理企业级网站。"war" 文件是 Web 应用的归档格式,通常用于部署在像 Apache Tomcat 这样的 Java 应用服务器上。"war" 文件包含所有必要的资源,如 HTML、CSS、JavaScript、Java 类和其他支持文件,以便于服务器运行和分发 Web 应用。 标签 "开源项目" 表明 OpenCMS 和 JRuby 都遵循开放源代码的原则,这意味着它们的源代码可以被任何人查看、使用、修改和分发。这种开放性鼓励社区协作,推动软件的持续改进和发展。 在压缩包子文件的文件名称列表中提到了 "opencmsmoduleswar-master",这很可能是一个 Git 仓库的主分支名称,表示这是 OpenCMS 模块项目的最新稳定版本。"master" 分支通常代表开发者的主线工作,意味着这个 ZIP 文件包含的是最新的、未经分支的代码。 基于以上信息,我们可以深入讨论以下几个 IT 知识点: 1. **JRuby**:JRuby 是如何工作的?它是如何将 Ruby 代码编译为字节码并在 JVM 上执行的?JRuby 支持哪些 Ruby 特性?与 MRI(Matz's Ruby Interpreter)相比,JRuby 有哪些优势和劣势? 2. **Java 平台**:JVM 的工作原理是什么?如何实现跨平台运行?为什么选择在 Java 平台上运行 Ruby? 3. **OpenCMS**:OpenCMS 的核心功能是什么?它如何帮助开发者构建和管理网站?有哪些关键特性,如内容创建、版本控制、权限管理等? 4. **Web 应用的部署**:"war" 文件的结构是怎样的?如何将一个 "war" 文件部署到 Java 应用服务器上?部署过程中需要注意哪些问题? 5. **开源社区**:开源软件的开发模式是什么?社区如何协作并贡献代码?开源许可证是如何影响代码使用的? 6. **Git 仓库和版本控制**:"master" 分支的重要性是什么?如何使用 Git 进行版本控制和协同开发?Git 常用的命令有哪些? 7. **模块化开发**:在 OpenCMS 中,模块是如何工作的?如何通过模块扩展系统功能?开发自定义模块的步骤是什么? 这些知识点涵盖了从编程语言、软件架构到项目管理和版本控制等多个领域,展示了 IT 行业中不同层面的专业知识。了解并掌握这些概念对于提升开发和运维技能至关重要。
2025-06-15 11:05:54 118.87MB 开源项目
1
logback-steno.zip,一个用于速记格式的logback编码器一个logback过滤器和一个用于输出速记格式日志文件的编码器。
2025-06-10 11:19:03 357KB 开源项目
1