效果图展示

在这里插入图片描述

安装插件海报画板导入到项目里面,在页面直接使用

在这里插入图片描述

<template><view><button @click="saveToAlbum" class="save-button">保存到相册</button><image :src="path" mode="widthFix" v-if="path" style="width: 100%;"></image><!-- 绘图组件(保持hidden) --><l-painter ref="painter" hidden isCanvasToTempFilePath @success="path = $event"><l-painter-view css="width:100%;line-height:90rpx;background:#efefef;text-align:center;"><l-painter-text text="分享好友得佣金,好友消费后佣金到账" css="color:blue;font-size:32rpx;"></l-painter-text></l-painter-view><l-painter-view css="padding:30rpx;display: flex;flex-direction: column;align-items: flex-start;"><l-painter-image css="width:100rpx;height:100rpx;border-radius:50rpx;" src="/static/logo.png"mode="aspectFill"></l-painter-image><l-painter-text text="一颗葡萄" css="font-size:28rpx;padding-top:20rpx;"></l-painter-text><l-painter-text text="共发布7篇 | 6分钟前发布" css="font-size:22rpx;color:#ccc"></l-painter-text><l-painter-text text="合租-观山湖区-未来方舟;" css="font-size:40rpx;padding-top:20rpx;"></l-painter-text></l-painter-view><l-painter-view css="padding:30rpx;display: flex;flex-wrap:wrap;align-items: flex-start;"><l-painter-image v-for="item in dataObj.house_images" css="width:30%;;border-radius:50rpx;" :src="item"mode="aspectFill"></l-painter-image></l-painter-view></l-painter></view>
</template><script setup>import {ref,onMounted} from 'vue'const path = ref('')const painter = ref(null)const dataObj = ref({"house_images": ["https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852511187350583.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852516350361922.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/175185252116150042.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852527581221874.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852533225847091.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852537888574703.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852542759268442.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852547136723025.png","https://renting-upload.oss-cn-chengdu.aliyuncs.com/App/20250707/1751852551059965495.png"]})onMounted(() => {checkAuth()})const checkAuth = () => {uni.getSetting({success(res) {if (!res.authSetting['scope.writePhotosAlbum']) {uni.authorize({scope: 'scope.writePhotosAlbum',success() {console.log('授权成功')},fail() {console.log('授权失败')}})}}})}const saveToAlbum = async () => {if (!path.value) {uni.showToast({title: '图片尚未生成',icon: 'none'})return}try {const tempFilePath = await base64ToTempFilePath(path.value)await uni.saveImageToPhotosAlbum({filePath: tempFilePath})uni.showToast({title: '保存成功',icon: 'success'})} catch (err) {console.error('保存失败:', err)handleSaveError(err)}}const base64ToTempFilePath = (base64) => {return new Promise((resolve, reject) => {const base64Data = base64.replace(/^data:image\/\w+;base64,/, '')const filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.jpg`wx.getFileSystemManager().writeFile({filePath,data: base64Data,encoding: 'base64',success: () => resolve(filePath),fail: reject})})}const handleSaveError = (err) => {if (err.errMsg.includes('auth deny')) {uni.showModal({title: '提示',content: '需要相册权限才能保存图片',confirmText: '去设置',success: (res) => {if (res.confirm) {uni.openSetting()}}})} else {uni.showToast({title: '保存失败: ' + err.errMsg,icon: 'none'})}}
</script><style lang="scss" scoped>.save-button {margin: 40rpx;background-color: #ff5000;color: white;border-radius: 10rpx;&:active {opacity: 0.8;}}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/news/914155.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914155.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914155.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java生产带文字、带边框的二维码

Java 生成带文字、带边框的二维码1、Java 生成带文字的二维码1.1、导入jar包1.2、普通单一的二维码1.2.1、代码示例1.2.2、效果1.3、带文字的二维码1.&#xff13;.&#xff11;、代码示例1.3.2、效果2、带边框的二维码2.1、代码示例2.2、带边框的二维码效果 1、Java 生成带文字…

ARM单片机启动流程(三)(栈空间综合理解及相关实际应用)

文章目录1、引出栈空间问题2、解决问题2.1、RAM空间2.2、RAM空间具体分布2.3、关于栈空间的使用2.4、栈溢出2.5、变量的消亡2.6、回到关键字static2.7、合法性的判断1、引出栈空间问题 从static关键字引出该部分内容。 为什么能从static引出来&#xff1f; 在使用该关键字的…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1.实验简介 实验目的&#xff1a; 从创建工程到编写代码&#xff0c;完成引脚约束&#xff0c;最后生成 bit 流下载到…

【Python练习】039. 编写一个函数,反转一个单链表

039. 编写一个函数,反转一个单链表 039. 编写一个函数,反转一个单链表方法 1:迭代实现运行结果代码解释方法 2:递归实现运行结果代码解释选择方法迭代法与递归法的区别039. 编写一个函数,反转一个单链表 在 Python 中,可以通过迭代或递归的方式反转一个单链表。 方法 1…

BERT代码简单笔记

参考视频&#xff1a;BERT代码(源码)从零解读【Pytorch-手把手教你从零实现一个BERT源码模型】_哔哩哔哩_bilibili 一、BertTokenizer BertTokenizer 是基于 WordPiece 算法的 BERT 分词器&#xff0c;继承自 PreTrainedTokenizer。 继承的PretrainedTokenizer&#xff0c;具…

PID控制算法理论学习基础——单级PID控制

这是一篇我在学习PID控制算法的过程中的学习记录。在一开始学习PID的时候&#xff0c;我也看了市面上许多的资料&#xff0c;好的资料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是写的太过深奥&#xff0c;有的则是照搬挪用&#xff0c;对原理则一问三不知&…

【Elasticsearch】function_score与rescore

它们俩都是用来“**干涉评分**”的&#xff0c;但**工作阶段不同、性能开销不同、能做的事也不同**。一句话总结&#xff1a;> **function_score** 在 **第一次算分** 时就动手脚&#xff1b; > **rescore** 在 **拿到 Top-N 结果后** 再“重新打分”。下面把“能干嘛”…

无广告纯净体验 WPS2016 精简版:移除联网模块 + 非核心组件,古董电脑也能跑

各位办公小能手们&#xff01;今天给你们介绍一款超神的办公软件——WPS2016精简版&#xff01;它有多小呢&#xff1f;才33MB&#xff0c;简直就是软件界的小不点儿&#xff01;别看它个头小&#xff0c;功能可一点儿都不含糊&#xff0c;文字、表格、演示这三大功能它全都有。…

《PyWin32:Python与Windows的桥梁,解锁系统自动化新姿势》

什么是 PyWin32在 Windows 平台的 Python 开发领域中&#xff0c;PyWin32 是一个举足轻重的库&#xff0c;它为 Python 开发者打开了一扇直接通往 Windows 操作系统底层功能的大门。简单来说&#xff0c;PyWin32 是用于 Python 访问 Windows API&#xff08;Application Progra…

vite如何生成gzip,并在服务器上如何设置开启

1. 安装插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068万预算!中国足协大模型项目招标,用AI技术驱动足球革命

中国足协启动国际足联“前进计划”下的大数据模型项目&#xff0c;预算1068万元。该项目将建立足球大数据分析平台&#xff0c;利用AI技术为国家队、青少年足球、业余球员及教练员裁判员提供精准数据分析服务&#xff0c;旨在通过科技手段提升中国足球竞技水平。 中国足球迎来数…

AI产品经理面试宝典第12天:AI产品经理的思维与转型路径面试题与答法

多样化思维:如何跳出单一框架解题? 面试官:AI产品常面临复杂场景,请举例说明你如何运用多样化思维解决问题? 你的回答:我会从三个维度展开:多角度拆解需求本质,多层级融合思维模式,多变量寻找最优解。比如设计儿童教育机器人时,不仅考虑功能实现(技术层),还融入情…

vscode.window对象讲解

一、vscode.window 核心架构图 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

为什么一个 @Transactional 注解就能开启事务?揭秘 Spring AOP 的底层魔法

你是否也曾深陷在各种“额外”逻辑的泥潭&#xff0c;为了给一个核心业务方法增加日志、权限校验或缓存&#xff0c;而不得不将这些非核心代码硬塞进业务类中&#xff0c;导致代码臃肿、职责不清&#xff1f;是时候用代理设计模式 (Proxy Design Pattern) 来解脱了&#xff01;…

《Spring 中上下文传递的那些事儿》Part 8:构建统一上下文框架设计与实现(实战篇)

&#x1f4dd; Part 8&#xff1a;构建统一上下文框架设计与实现&#xff08;实战篇&#xff09; 在实际项目中&#xff0c;我们往往需要处理多种上下文来源&#xff0c;例如&#xff1a; Web 请求上下文&#xff08;RequestContextHolder&#xff09;日志追踪上下文&#xf…

配置驱动开发:初探零代码构建嵌入式软件配置工具

前言在嵌入式软件开发中&#xff0c;硬件初始化与寄存器配置长期依赖人工编写重复代码。以STM32外设初始化为例&#xff0c;开发者需手动完成时钟使能、引脚模式设置、参数配置等步骤&#xff0c;不仅耗时易错&#xff08;如位掩码写反、模式枚举值混淆&#xff09;&#xff0c…

Elasticsearch混合搜索深度解析(下):执行机制与完整流程

引言 在上篇中&#xff0c;我们发现了KNN结果通过SubSearch机制被保留的关键事实。本篇将继续深入分析混合搜索的执行机制&#xff0c;揭示完整的处理流程&#xff0c;并解答之前的所有疑惑。 深入源码分析 1. SubSearch的执行机制 1.1 KnnScoreDocQueryBuilder的实现 KNN结果被…

Apache HTTP Server 从安装到配置

一、Apache 是什么&#xff1f;Apache&#xff08;全称 Apache HTTP Server&#xff09;是当前最流行的开源Web服务器软件之一&#xff0c;由Apache软件基金会维护。它以稳定性高、模块化设计和灵活的配置著称&#xff0c;支持Linux、Windows等多平台&#xff0c;是搭建个人博客…

php中调用对象的方法可以使用array($object, ‘methodName‘)?

是的&#xff0c;在PHP中&#xff0c;array($object, methodName) 是一种标准的回调语法&#xff0c;用于表示“调用某个对象的特定方法”。这种语法可以被许多函数&#xff08;如 call_user_func()、call_user_func_array()、usort() 等&#xff09;识别并执行。 语法原理 在P…

【设计模式】单例模式 饿汉式单例与懒汉式单例

单例模式&#xff08;Singleton Pattern&#xff09;详解一、单例模式简介 单例模式&#xff08;Singleton Pattern&#xff09; 是一种 创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。&#xff08;对象创建型模式&…