当前位置: 首页 > news >正文

微信小程序-增加隐私协议弹窗

真的加了非常之久,非常简单的一个功能,但是因为之前没弄过,加上系统有点bug,软件也有点抽风......

  1. 在微信后台配置-更新用户隐私协议信息
  2. 增加 "__usePrivacyCheck__" : true, 9月15号之后不加也行,好象今天刚刚好9月15
     "mp-weixin" : {"appid" : "xxxxxxxxxx","__usePrivacyCheck__" : true,"permission": {"scope.userLocation": {"desc": "提供准确的定位服务"}
    },
    "requiredPrivateInfos": ["getLocation"
    ]

  3. 微信开发者工具的基础库切换到>3.0(本地运行和发布时都要改,不改不弹窗)
  4. 首页增加隐私协议弹窗控件,加在最后一个view的上边
    <!-- #ifdef MP-WEIXIN -->
    <ws-wx-privacy id="privacy-popup"></ws-wx-privacy>
    <!-- #endif -->

  5. 增加隐私协议组件,增加到components文件夹下

  6. ws-wx-privacy.vue代码:
     

    <template><uni-popup id="privacy" type="center" ref="privacyPopup" :maskClick="false"><view class="ws-privacy-popup" :style="rootStyle"><view class="ws-privacy-popup__header"><!--标题--><view class="ws-picker__title">{{ title }}</view></view><view class="ws-privacy-popup__container"><text>{{ desc }}</text><text class="ws-privacy-popup__container-protocol" :style="protocolStyle"@click="openPrivacyContract">{{ protocol }}</text><text>{{ subDesc }}</text></view><view class="ws-privacy-popup__footer"><button class="is-agree" :style="agreeStyle" id="agree-btn" open-type="agreePrivacyAuthorization"@agreeprivacyauthorization="handleAgree">{{agreeText}}</button><button class="is-disagree" id="disagree-btn" @click="handleDisagree">{{disagreeText}}</button></view></view></uni-popup>
    </template>
    <script>import {getContext,getComponent} from './util'const privacyResolves = new Set() // onNeedPrivacyAuthorization的reslovelet privacyHandler = null// 注册监听if (uni.onNeedPrivacyAuthorization) {console.log('register uni.onNeedPrivacyAuthorization')uni.onNeedPrivacyAuthorization((resolve) => {if (typeof privacyHandler === 'function') {privacyHandler(resolve)}})}export default {name: 'wsWxPrivacy',emits: ['disagree', 'agree'],props: {// 标题title: {type: String,default: '用户隐私保护提示'},// 描述desc: {type: String,default: '感谢您使用本应用,您使用本应用的服务之前请仔细阅读并同意'},// 隐私保护指引名称protocol: {type: String,default: '《用户隐私保护指引》'},// 子描述subDesc: {type: String,default: '。当您点击同意并开始使用产品服务时,即表示你已理解并同意该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法使用相应服务。'},/*** 控制是否可以点击不同意按钮并显示提示。* 如果设置为 true,用户可以点击不同意按钮执行后续逻辑。* 如果设置为 false,点击不同意按钮会显示提示信息,但不会执行后续逻辑。* 默认为 true*/disagreeEnabled: {type: Boolean,default: true, // 默认为可以点击},/*** 配置不同意按钮的提示消息内容。*/disagreePromptText: {type: String,default: '请先仔细阅读并同意隐私协议', // 默认提示消息},// 拒绝按钮文字disagreeText: {type: String,default: '不同意'},// 同意按钮文字agreeText: {type: String,default: '同意并继续'},// 自定义背景颜色bgColor: {type: String,default: ''},// 自定义主题颜色(控制同意按钮和隐私协议名称的颜色)themeColor: {type: String,default: ''}},computed: {rootStyle() {if (this.bgColor) {return `background:${this.bgColor}`} else {return ''}},protocolStyle() {if (this.themeColor) {return `color:${this.themeColor}`} else {return ''}},agreeStyle() {if (this.themeColor) {return `background:${this.themeColor}`} else {return ''}}},created() {privacyHandler = (resolve) => {const context = getContext()const privacyPopup = getComponent(context, '#privacy-popup')if (privacyPopup) {const privacy = getComponent(privacyPopup, '#privacy')if (privacy && privacy.open) {uni.hideLoading()privacy.open()}}privacyResolves.add(resolve)}},methods: {/*** 打开隐私协议*/openPrivacyContract() {wx.openPrivacyContract({success: (res) => {console.log('openPrivacyContract success')},fail: (res) => {console.error('openPrivacyContract fail', res)}})},/*** 拒绝隐私协议*/handleDisagree() {uni.setStorageSync('mpweixin_disagree_authorization', 1) if (this.disagreeEnabled) {this.$refs.privacyPopup.close()privacyResolves.forEach((resolve) => {resolve({event: 'disagree'})})privacyResolves.clear()this.$emit('disagree')} else {uni.showToast({icon: 'none',title: this.disagreePromptText})}},/*** 同意隐私协议*/handleAgree() {uni.setStorageSync('mpweixin_disagree_authorization', 0) this.$refs.privacyPopup.close()privacyResolves.forEach((resolve) => {resolve({event: 'agree',buttonId: 'agree-btn'})})privacyResolves.clear()this.$emit('agree')}}}
    </script>
    <style lang="scss" scoped>.ws-privacy-popup {width: 600rpx;padding: 48rpx;box-sizing: border-box;overflow: hidden;width: 560rpx;background: linear-gradient(180deg, #e5edff 0%, #ffffff 100%);border-radius: 24rpx;&__header {display: flex;align-items: center;justify-content: center;width: 100%;height: 52rpx;font-size: 36rpx;font-family: PingFangSC-Medium, PingFang SC;font-weight: 550;color: #1a1a1a;line-height: 52rpx;margin-bottom: 48rpx;}&__container {width: 100%;box-sizing: border-box;font-size: 28rpx;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #333333;line-height: 48rpx;margin-bottom: 48rpx;&-protocol {font-weight: 550;color: #4D80F0;}}&__footer {display: flex;flex-direction: column;.is-disagree,.is-agree {width: 100%;height: 88rpx;background: #ffffff;border-radius: 44rpx;font-size: 32rpx;font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #666666;}.is-agree {background: #4D80F0;color: #ffffff;margin-bottom: 18rpx;}button {border: none;outline: none;&::after {border: none;}}}}
    </style>

  7. util.js文件代码:
     

    /*** 获取当前页面上下文* @returns 页面对象*/
    export function getContext() {// eslint-disable-next-line no-undefconst pages = getCurrentPages()return pages[pages.length - 1]
    }/*** 获取上下文中指定节点组件* @param context 选择器的选择范围,可以传入自定义组件的 this 作为上下文* @param selector 自定义节点选择器*/
    export function getComponent(context, selector ) {let component = null// #ifdef H5context.$children.forEach((child) => {if (`#${child.$attrs.id}` === selector) {component = child} else if (child.$children && child.$children.length) {if (getComponent(child, selector)) {component = getComponent(child, selector)}}if (component) {return component}})// #endif// #ifdef MP-WEIXINcomponent = context.selectComponent && context.selectComponent(selector) && context.selectComponent(selector).$vm// #endif// #ifdef MP-ALIPAYconst alipay = context.$children ? context.$children : context.$vm && context.$vm.$children ? context.$vm.$children : []component = alipay.find((component) => {return `#${component.$scope.props.id}` === selector})// #endif// #ifdef APP-PLUSconst app = context.$children ? context.$children : context.$vm && context.$vm.$children ? context.$vm.$children :[]component = app.find((component) => {return `#${component.$attrs.id}` === selector})// #endifreturn component
    }

  8. 一般到这里再次运行就可以成功了,成功的隐私弹窗:

  9. 如果到这里了还没有成功!!!再来,检查一下弹窗控件对不对
    看一下components 文件夹下边有没有uni-popup文件夹,如果有,一定要删掉!!!
    否则会报错,​easycom组件冲突:[@/components/uni-popup/uni-popup.vue,@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue]​
    如果有页面引用到了,引用的代码也删掉

  10. Hbuilder x 工具更新到最新版本,导入最新版本uni-popup组件
    点击插件安装:

  11. 找到 uni-popup插件,点击安装

  12. 再次运行,就会弹隐私协议的窗口啦

     

相关文章:

微信小程序-增加隐私协议弹窗

真的加了非常之久&#xff0c;非常简单的一个功能&#xff0c;但是因为之前没弄过&#xff0c;加上系统有点bug,软件也有点抽风...... 在微信后台配置-更新用户隐私协议信息增加 "__usePrivacyCheck__" : true, 9月15号之后不加也行&#xff0c;好象今天刚刚好9月15…...

分布式事务解决方案之可靠消息最终一致性

分布式事务解决方案之可靠消息最终一致性 什么是可靠消息最终一致性事务 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息&#xff0c;事务参与方(消息消费者)一定能 够接收消息并处理事务成功&#xff0c;此方案强调的是只要消息发给事务参与方最终…...

ROS学习笔记(四)---使用 VScode 启动launch文件运行多个节点

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 一、什么是launch文件 虽然说Terminator终端是能够比较方便直观的看运行的节点…...

编译Redis时报错: jemalloc/jemalloc.h: No such file or directory

1.编译Redis时出现错误 运行&#xff1a; [rootcentos01 redis-6.2.7]# make & make install报错&#xff1a; zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory #include <jemalloc/jemalloc.h> 2.解决步骤 2.1 检查gcc是否安装 [r…...

LLM 05-大模型法律

LLM 05-大模型法律 5.1 简介 在这个教程中&#xff0c;我们将探讨法律对大型语言模型的开发和部署有何规定。我们将会按照以下的步骤进行讨论&#xff1a; 新技术与现有法律的关系 与我们之前的讲座一样&#xff0c;比如关于社会偏见的讲座&#xff0c;我们将要讨论的很多内容…...

1-5 AUTOSAR数据交换文件ARXML

总目录——AUTOSAR入门详解AUTOSAR入门详解目录汇总&#xff1a;待续中。。。https://xianfan.blog.csdn.net/article/details/132818463 目录 一、Arxml文件 二、各类ARXML文件 一、Arxml文件 arxml文件是AUTOSAR&#xff08;Automotive Open System Architecture&#xff0…...

学习尚硅谷HTML+CSS总结

今天主要学习了颜色像素的四种表达方式&#xff0c;在没学习之前也只会一种RGB颜色的表达方式&#xff0c;虽然其他三种使用的比较少&#xff0c;但有些网页会用其他的表达方式写的我们学过之后就会看得懂&#xff0c;还有文本的设置&#xff0c;字体等等&#xff0c;这些都是后…...

自己设计CPU学习之路——基于《Xilinx FPGA应用开发》

1. 一个32组位宽为32的寄存器堆 框图 代码 regfile.h ifndef __FEGFILE_HEADER__define __REGFILE_HEADER__define HIGH 1b1define LOW 1b0define ENABLE_ 1b0define DISABLE_ 1b1define DATA_W 32define DataBus 31:0define DATA_D 32d…...

数据结构与算法:树

目录 树 定义 结构 二叉树 定义 结构 形式 满二叉树 完全二叉树 存储 链式存储结构 数组 孩子节点 父节点 应用 查找 维持相对顺序 遍历 深度优先遍历 前序遍历 中序遍历 后序遍历 广度优先遍历 层序遍历 二叉堆 定义 自我调整 操作 插入加点 删…...

Spark 【Spark SQL(一)DataFrame的创建、保存与基本操作】

前言 今天学习Spark SQL&#xff0c;前面的RDD编程要想熟练还是得通过项目来熟练&#xff0c;所以先把Spark过一遍&#xff0c;后期针对不足的地方再加强&#xff0c;这样效率会更高一些。 简介 在RDD编程中&#xff0c;我们使用的是SparkContext接口&#xff0c;接下来的Spar…...

026-从零搭建微服务-文件服务(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…...

Jenkins 页面部分显示Http状态403 被禁止

前言 生产环境Jenkins部署了一段时间了&#xff0c;结果今天在流水线配置中&#xff0c;部分页面显示Jenkins 页面部分显示Http状态403 被禁止&#xff0c;修改配置点击保存之后偶尔也会出现这个。 问题 以下是问题图片 解决 在全局安全配置里面&#xff0c;勾选上启用代…...

ajax day4

1、promise链式调用 /*** 目标&#xff1a;把回调函数嵌套代码&#xff0c;改成Promise链式调用结构* 需求&#xff1a;获取默认第一个省&#xff0c;第一个市&#xff0c;第一个地区并展示在下拉菜单中*/let pname axios({url: http://hmajax.itheima.net/api/province,}).t…...

8.Spring EL与ExpressionParser

Spring EL与ExpressionParser 文章目录 Spring EL与ExpressionParser介绍**使用SpEL来计算评估文字字符串表达式**使用SpEL来计算评估 bean 属性 – “item.name” 介绍 Spring表达式语言(SpEL)支持多种功能&#xff0c;并且可以测试这个特殊的“ExpressionParser”接口的表达…...

Go和Java实现迭代器模式

Go和Java实现迭代器模式 1、迭代器模式 迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素&#xff0c;不需要知道 集合对象的底层表示。 迭代器模式属于行为型模式。 意图&#xff1a;提供一种方法顺序访问一个聚合对象中各个…...

如何在 Vue.js 和 Nuxt.js 之间做出选择?

开篇 今天看了一位国外大佬的文章&#xff0c;主要是他对在项目中如何选择 Vue.js 或 Nuxt.js 的看法&#xff0c;欢迎大家在评论区发表看法&#xff0c;以下内容是他关于这个问题看法的整理&#xff0c;由于翻译水平有限&#xff0c;欢迎大家指正。 国外大佬的看法 Vue.js在开…...

(二十三)大数据实战——Flume数据采集之采集数据聚合案例实战

前言 本节内容我们主要介绍一下Flume数据采集过程中&#xff0c;如何把多个数据采集点的数据聚合到一个地方供分析使用。我们使用hadoop101服务器采集nc数据&#xff0c;hadoop102采集文件数据&#xff0c;将hadoop101和hadoop102服务器采集的数据聚合到hadoop103服务器输出到…...

Linux: network: dhcp: mtu 这个里面也有关于网卡的MTU设置;

https://linux.die.net/man/5/dhcp-options 需注意这个DHCP配置选项。 option interface-mtu uint16; This option specifies the MTU to use on this interface. The minimum legal value for the MTU is 68. 假如在网卡的配置文件中设置了dhcp获取IP信息&#xff0c;可能导…...

Android中使用图片水印,并且能够在线下载字体并应用于水印

Android中使用图片水印&#xff0c;并且能够在线下载字体并应用于水印 要在Android中使用图片水印&#xff0c;并且能够在线下载字体并应用于水印&#xff0c;可以按照以下步骤进行&#xff1a; 1.使用Picasso、Glide或其他图片加载库加载图片&#xff1a; ImageView imageV…...

HTTP文件服务

在工作中&#xff0c;往往会需要将文件同时共享给很多台电脑。 本篇介绍HHDESK的HTTP文件服务功能&#xff0c;通过浏览器&#xff0c;将本地资源共享给任意主机。 1 共享文件 首页——资源管理——服务端——“”&#xff0c;在弹出框中选择HTTP文件服务。 填写各项内容。…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...