HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

【解决】uni.scanCode苹果(ios)黑屏,真机测试扫码黑屏问题

扫码

hbuilderx版本:3.5.3

原因:打包会使用新版本的sdk来打包

解决方式1:在manifest.json源码视图里面一下地方加入Barcode和Camera

{  
    "app-plus" : {  
        "modules" : {  
            "Barcode" : {},  
            "Camera" : {}  
        }  
    }  
}

解决方式2:升级hbuilderx版本,勾选以下两个

↓↓↓ 各位大佬点点赞

继续阅读 »

hbuilderx版本:3.5.3

原因:打包会使用新版本的sdk来打包

解决方式1:在manifest.json源码视图里面一下地方加入Barcode和Camera

{  
    "app-plus" : {  
        "modules" : {  
            "Barcode" : {},  
            "Camera" : {}  
        }  
    }  
}

解决方式2:升级hbuilderx版本,勾选以下两个

↓↓↓ 各位大佬点点赞

收起阅读 »

【TabBar】根据角色展示不同的数量或内容解决方案

tabbar

官方文档:https://uniapp.dcloud.net.cn/api/ui/tabbar.html#settabbaritem

看不懂的看我的解决方案:

1、pages.json里面按照要求配置好最全数量的tabbar,一定要按照最大数量配置,切记!!!并且此时对应的tabbar页面是公共的tabbar(最大数量为5个)例如ont,two,three。

2、将不同角色的页面提前创建好,写好自己的业务内容,此页面无需在 pages.json 中配置,作为一个组件引入即可。

3、在所有进入tabbar页面的url处一定要处理好标识,比如A角色=1,B角色=2。然后使用 switchTab 跳转对应的tabbar公共页面。

4、在公共的tabbar页面根据角色标识判断展示对应的组件(此组件为第2步创建的页面)。

5、在所有公共的tabbar页面的 onShow 函数中处理tabbar,以下是我的伪代码:

<script setup name="">  
import { onShow } from '@dcloudio/uni-app';  
import storage from '@/common/utils/storage.js';  

onShow(() => {  
    console.log(storage.getStorageSync('role'));  
    uni.setTabBarItem({  
        index: 0,  
        text: 'Home',  
        // pagePath: '/pages/tabbar/tea-home',  
        iconPath: '/static/images/tabbar/home.png',  
        selectedIconPath: '/static/images/tabbar/home-active.png',  
        complete: (e) => {  
            console.log('======= Home', e);  
        }  
    });  
});  
</script>

6、关于我为什么不使用 pagePath 这个属性直接替代页面,有三点给大家解释下:第一点:H5页面完全失效,刷新会失去tabbar;第二点:APP中系统杀死APP后再次进入会丢失tabbar;第三点:如果是自定义tabbar会有闪烁的情况。

7、大家也可以尝试其他方案,这只是本人遇到的问题及解决思路。

继续阅读 »

官方文档:https://uniapp.dcloud.net.cn/api/ui/tabbar.html#settabbaritem

看不懂的看我的解决方案:

1、pages.json里面按照要求配置好最全数量的tabbar,一定要按照最大数量配置,切记!!!并且此时对应的tabbar页面是公共的tabbar(最大数量为5个)例如ont,two,three。

2、将不同角色的页面提前创建好,写好自己的业务内容,此页面无需在 pages.json 中配置,作为一个组件引入即可。

3、在所有进入tabbar页面的url处一定要处理好标识,比如A角色=1,B角色=2。然后使用 switchTab 跳转对应的tabbar公共页面。

4、在公共的tabbar页面根据角色标识判断展示对应的组件(此组件为第2步创建的页面)。

5、在所有公共的tabbar页面的 onShow 函数中处理tabbar,以下是我的伪代码:

<script setup name="">  
import { onShow } from '@dcloudio/uni-app';  
import storage from '@/common/utils/storage.js';  

onShow(() => {  
    console.log(storage.getStorageSync('role'));  
    uni.setTabBarItem({  
        index: 0,  
        text: 'Home',  
        // pagePath: '/pages/tabbar/tea-home',  
        iconPath: '/static/images/tabbar/home.png',  
        selectedIconPath: '/static/images/tabbar/home-active.png',  
        complete: (e) => {  
            console.log('======= Home', e);  
        }  
    });  
});  
</script>

6、关于我为什么不使用 pagePath 这个属性直接替代页面,有三点给大家解释下:第一点:H5页面完全失效,刷新会失去tabbar;第二点:APP中系统杀死APP后再次进入会丢失tabbar;第三点:如果是自定义tabbar会有闪烁的情况。

7、大家也可以尝试其他方案,这只是本人遇到的问题及解决思路。

收起阅读 »

uniapp+uniCloud全栈开发小程序总结,效率的确是快

前端


界面
vue语法配合flex布局,轻松完成界面开发。

服务端


相信对前端工程师来说,以前需要做全栈开发的话,需要硬着头皮学一门后端语言。uniCloud的出现,让前端开发可以使用熟悉的javascript语言来做后端服务开发,本次小程序的试车,就体验了一把uniCloud的方便快捷。

1、关于数据库
uniCloud提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档。
每张表/集合,都有一个表名*.schema.json的文件,来描述表的信息、字段的信息。可以很方便的定义表的字段、字段类型、表的权限和字段的权限。
做项目常用的表格官方已经提供了很多openDB模板,直接添加就可以了。

2、服务端配置文件
uniCloud采用的是uni-config-center公共模块,所有需要进行配置的信息都可以在此模块下进行配置,例如用户体系的uni-id.需要获取配置信息的时候,在云函数内require就可以了。

3、第三方凭据管理
以前做小程序开发的时候,获取ticket、accessToken之类的凭据比较繁琐,uniCloud提供了uni-open-bridge模块来自动管理这些凭据,包含uni-open-bridge云对象、uni-open-bridge-common公共模块和官方提供的opendb-open-data数据表。uni-open-bridge部署后会自动获取例如微信小程序的凭据并存储到opendb-open-data表内,在做相关逻辑编码需要用到这些凭据的时候,直接调用uni-open-bridge-common提供的api来获取凭据就OK了。

4、订阅消息
小程序比较重要的一个功能是消息订阅,uniCloud提供了uni-subscribemsg公共模块来进行订阅消息的发送,方便快捷。

5、用户管理
开发任何应用,用户的登陆、注册、资料编辑等等是不可避免且重复的,且现在用到第三方登陆的场景可以说是必须的了,例如微信登陆、手机号一键登陆等等。
使用uni-id-pages来维护管理用户的登陆,界面、后端逻辑、token的维护都不需要开发者操心了,连数据库都不需要新建,官方提供的uni-id-users表格满足所有的登陆需求。

6、关于token
在uni-id-pages模块下包含了uni-id-common公共模块,token的生成、刷新、校验是依靠这个模块来完成的,具体使用可查看文档。使用uni-id-pages模块后,token的维护不用手写代码,了解原理即可。

7、服务端逻辑
要写具体的服务逻辑,创建云函数上传至云空间部署运行即可,前端通过uniCloud.callFunction来调用具体的云函数就能前后端联调了。

8、定时任务
定时任务是比较常见的功能,使用云函数定时触发器。已配置定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。
.......

总结:
这次开发小程序,发行了微信小程序和头条小程序两个版本,总的来说效率是杠杠的,只要仔细看文档,不懂的查查资料和多提问,都能很快搞定需求,uniapp+uniCloud的确是一个很好的创新,前端工程师也可以全栈搞定项目的开发,对自身的职业发展有很大的好处,平时也可以兼职做做项目赚点外快。

继续阅读 »

前端


界面
vue语法配合flex布局,轻松完成界面开发。

服务端


相信对前端工程师来说,以前需要做全栈开发的话,需要硬着头皮学一门后端语言。uniCloud的出现,让前端开发可以使用熟悉的javascript语言来做后端服务开发,本次小程序的试车,就体验了一把uniCloud的方便快捷。

1、关于数据库
uniCloud提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档。
每张表/集合,都有一个表名*.schema.json的文件,来描述表的信息、字段的信息。可以很方便的定义表的字段、字段类型、表的权限和字段的权限。
做项目常用的表格官方已经提供了很多openDB模板,直接添加就可以了。

2、服务端配置文件
uniCloud采用的是uni-config-center公共模块,所有需要进行配置的信息都可以在此模块下进行配置,例如用户体系的uni-id.需要获取配置信息的时候,在云函数内require就可以了。

3、第三方凭据管理
以前做小程序开发的时候,获取ticket、accessToken之类的凭据比较繁琐,uniCloud提供了uni-open-bridge模块来自动管理这些凭据,包含uni-open-bridge云对象、uni-open-bridge-common公共模块和官方提供的opendb-open-data数据表。uni-open-bridge部署后会自动获取例如微信小程序的凭据并存储到opendb-open-data表内,在做相关逻辑编码需要用到这些凭据的时候,直接调用uni-open-bridge-common提供的api来获取凭据就OK了。

4、订阅消息
小程序比较重要的一个功能是消息订阅,uniCloud提供了uni-subscribemsg公共模块来进行订阅消息的发送,方便快捷。

5、用户管理
开发任何应用,用户的登陆、注册、资料编辑等等是不可避免且重复的,且现在用到第三方登陆的场景可以说是必须的了,例如微信登陆、手机号一键登陆等等。
使用uni-id-pages来维护管理用户的登陆,界面、后端逻辑、token的维护都不需要开发者操心了,连数据库都不需要新建,官方提供的uni-id-users表格满足所有的登陆需求。

6、关于token
在uni-id-pages模块下包含了uni-id-common公共模块,token的生成、刷新、校验是依靠这个模块来完成的,具体使用可查看文档。使用uni-id-pages模块后,token的维护不用手写代码,了解原理即可。

7、服务端逻辑
要写具体的服务逻辑,创建云函数上传至云空间部署运行即可,前端通过uniCloud.callFunction来调用具体的云函数就能前后端联调了。

8、定时任务
定时任务是比较常见的功能,使用云函数定时触发器。已配置定时触发器的云函数,会在相应时间点被自动触发,函数的返回结果不会返回给调用方。
.......

总结:
这次开发小程序,发行了微信小程序和头条小程序两个版本,总的来说效率是杠杠的,只要仔细看文档,不懂的查查资料和多提问,都能很快搞定需求,uniapp+uniCloud的确是一个很好的创新,前端工程师也可以全栈搞定项目的开发,对自身的职业发展有很大的好处,平时也可以兼职做做项目赚点外快。

收起阅读 »

海淀警方举办第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式

反诈 普法

同心合力,联合百年学府掀起反诈热潮;

警学联盟,携手高校师生共建无诈校园。

2023年8月29日晚,由北京市公安局海淀分局主办、清华大学、抖音集团协办,汇聚辖区各高校和社会各界关注的第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式,在清华大学新清华礼堂成功举办。1400余名各高校师生、海淀网友、辖区群众代表参加了揭晓仪式。

为深入贯彻落实习近平总书记和党中央关于打击治理电信网络诈骗犯罪工作的重要指示精神,针对海淀区高校数量多、师生体量大、龙头高校集中的现实特点,海淀警方于2023年3月启动第一届“警学联盟·校园无诈”防电诈主题海报和短视频征集大赛,面向全区高校师生征集反诈宣传作品。大赛期间,各高校师生积极参与,共接收辖区2000余名高校学生提交的参赛作品1235件。海淀警方与高校初审通过的859件作品通过抖音平台集中宣传展播,播放量近4000万次、点赞量45万余次。通过各校初审初筛、线上大众评审打分和线下专家教授复审等环节,最终评选出反诈大赛海报组、视频组获奖作品各70个。

为进一步提升高校反诈宣传影响力,展现各高校工作特色亮点,上好秋季开学季反诈“第一课”,推动高校反诈宣防工作走深走实,8月29日晚,海淀警方联合清华大学,在新清华学堂举办第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式。

活动共分为“警醒之旅 青春不陷诈”“守护之盾 行动不畏诈”“警学之翼 未来不容诈”三个篇章,在不同篇章穿插师生访谈、作品颁奖、文艺演出、学生倡议和宣传启动等环节,介绍分析当前高校反诈严峻形势和高发案件类型,对高校反诈优秀经验进行分享推广,由高校学生表演反诈主题情景剧、音乐剧,向大赛优秀作品创作学生进行颁奖,以及聘任高校学生担任“校园反诈宣传大使”,充分展现警学联合共筑校园安全防线的决心,全面开启2023年秋季新学期的反诈宣传工作。

近年来,电信网络诈骗案件高发,高校学生成为易受骗群体。为有效防范校园电信网络诈骗案件发生,切实维护广大师生财产安全,海淀警方与辖区37所高校“警学联盟”,通过“优秀民警进校园主题宣讲”、组建“校园反诈志愿者服务队”、举办“校园反诈创意作品大赛”等多种形式,深入开展高校反电诈宣传活动,织牢织密校园反诈防护网。每逢开学季,海淀警方以学校迎新、社团招新、新生军训等校园活动为契机,选派分局优秀民警组建校园安全宣传团队,主动走进大学校园开展反诈宣传活动,采用生动诙谐幽默的语言、互动性较强的宣传模式,以案说法,深入浅出地向学生们讲述刷单返利、冒充客服、“杀猪盘”等常见电信网络诈骗骗术及防范技巧,为学生们上好开学反诈第一课,深受学生广泛好评。

除此之外,在各高校的食堂、宿舍区、教学楼、图书馆、体育馆等显著位置,张贴反诈宣传品,利用公共区域电子屏、电视屏,定时滚动播放宣传视频、反诈标语,做到在校内“食住行学”全覆盖宣传,切实提高广大师生识骗防骗的意识和能力。

下一步,海淀公安将持续推进打击防范电信网络诈骗工作,不断拓展宣传途径、创新宣传手段,营造全民反诈、全社会反诈的良好氛围,切实守护好人民群众的“钱袋子”。同时,海淀警方将以此次活动为起点,携手高校师生,共同推动校园安全建设,为打造安全、和谐、无诈的校园环境贡献海淀公安力量。

继续阅读 »

同心合力,联合百年学府掀起反诈热潮;

警学联盟,携手高校师生共建无诈校园。

2023年8月29日晚,由北京市公安局海淀分局主办、清华大学、抖音集团协办,汇聚辖区各高校和社会各界关注的第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式,在清华大学新清华礼堂成功举办。1400余名各高校师生、海淀网友、辖区群众代表参加了揭晓仪式。

为深入贯彻落实习近平总书记和党中央关于打击治理电信网络诈骗犯罪工作的重要指示精神,针对海淀区高校数量多、师生体量大、龙头高校集中的现实特点,海淀警方于2023年3月启动第一届“警学联盟·校园无诈”防电诈主题海报和短视频征集大赛,面向全区高校师生征集反诈宣传作品。大赛期间,各高校师生积极参与,共接收辖区2000余名高校学生提交的参赛作品1235件。海淀警方与高校初审通过的859件作品通过抖音平台集中宣传展播,播放量近4000万次、点赞量45万余次。通过各校初审初筛、线上大众评审打分和线下专家教授复审等环节,最终评选出反诈大赛海报组、视频组获奖作品各70个。

为进一步提升高校反诈宣传影响力,展现各高校工作特色亮点,上好秋季开学季反诈“第一课”,推动高校反诈宣防工作走深走实,8月29日晚,海淀警方联合清华大学,在新清华学堂举办第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式。

活动共分为“警醒之旅 青春不陷诈”“守护之盾 行动不畏诈”“警学之翼 未来不容诈”三个篇章,在不同篇章穿插师生访谈、作品颁奖、文艺演出、学生倡议和宣传启动等环节,介绍分析当前高校反诈严峻形势和高发案件类型,对高校反诈优秀经验进行分享推广,由高校学生表演反诈主题情景剧、音乐剧,向大赛优秀作品创作学生进行颁奖,以及聘任高校学生担任“校园反诈宣传大使”,充分展现警学联合共筑校园安全防线的决心,全面开启2023年秋季新学期的反诈宣传工作。

近年来,电信网络诈骗案件高发,高校学生成为易受骗群体。为有效防范校园电信网络诈骗案件发生,切实维护广大师生财产安全,海淀警方与辖区37所高校“警学联盟”,通过“优秀民警进校园主题宣讲”、组建“校园反诈志愿者服务队”、举办“校园反诈创意作品大赛”等多种形式,深入开展高校反电诈宣传活动,织牢织密校园反诈防护网。每逢开学季,海淀警方以学校迎新、社团招新、新生军训等校园活动为契机,选派分局优秀民警组建校园安全宣传团队,主动走进大学校园开展反诈宣传活动,采用生动诙谐幽默的语言、互动性较强的宣传模式,以案说法,深入浅出地向学生们讲述刷单返利、冒充客服、“杀猪盘”等常见电信网络诈骗骗术及防范技巧,为学生们上好开学反诈第一课,深受学生广泛好评。

除此之外,在各高校的食堂、宿舍区、教学楼、图书馆、体育馆等显著位置,张贴反诈宣传品,利用公共区域电子屏、电视屏,定时滚动播放宣传视频、反诈标语,做到在校内“食住行学”全覆盖宣传,切实提高广大师生识骗防骗的意识和能力。

下一步,海淀公安将持续推进打击防范电信网络诈骗工作,不断拓展宣传途径、创新宣传手段,营造全民反诈、全社会反诈的良好氛围,切实守护好人民群众的“钱袋子”。同时,海淀警方将以此次活动为起点,携手高校师生,共同推动校园安全建设,为打造安全、和谐、无诈的校园环境贡献海淀公安力量。

收起阅读 »

Chrome浏览器下载安装包 单击下载无法下载

下载

需要右键另一个标签页打开

需要右键另一个标签页打开

严重BUG!!!!!最新版uni-app无法在app中运行

uniapp

11:36:47.837 preLogin fail res: , [Object] {"errMsg":"preLogin:fail -20203当前环境不适合一键登录","code":30005,"appid":"pPyZWvH3Fa6PXba10aJ009","...} at App.vue:40
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/template/template. ERROR
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/extUI/extUI.
ERROR
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/API/API. ERROR
11:37:09.849 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/component/component.
ERROR

继续阅读 »

11:36:47.837 preLogin fail res: , [Object] {"errMsg":"preLogin:fail -20203当前环境不适合一键登录","code":30005,"appid":"pPyZWvH3Fa6PXba10aJ009","...} at App.vue:40
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/template/template. ERROR
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/extUI/extUI.
ERROR
11:37:08.847 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/API/API. ERROR
11:37:09.849 Waiting to navigate to: /pages/tabBar/extUI/extUI, do not operate continuously: /pages/tabBar/component/component.
ERROR

收起阅读 »

记一次在app-vue使用摄像头和录音的各种问题

摄像头

公司业务要求在app上做人脸识别,偏偏在uniapp上摄像头调用不支持app和H5调用,只能使用plus.camera,但是领导使用这种拍照形式的并不认同,只能另外想办法。
那只好从H5的api入手了,无意之中发现了MediaDevices.getUserMedia()这个api,通过h5调取摄像头权限,经过不断的尝试终于把 MediaStream放在页面上播放并作一帧一帧地识别活体,并作调百度api做人脸识别。
问题

  1. 摄像头黑白问题
  2. webview版本对api影响,使用pollyfill垫片
  3. uniapp的video在app-vue编译成组件,不编译成原始组件,无法获取该元素
继续阅读 »

公司业务要求在app上做人脸识别,偏偏在uniapp上摄像头调用不支持app和H5调用,只能使用plus.camera,但是领导使用这种拍照形式的并不认同,只能另外想办法。
那只好从H5的api入手了,无意之中发现了MediaDevices.getUserMedia()这个api,通过h5调取摄像头权限,经过不断的尝试终于把 MediaStream放在页面上播放并作一帧一帧地识别活体,并作调百度api做人脸识别。
问题

  1. 摄像头黑白问题
  2. webview版本对api影响,使用pollyfill垫片
  3. uniapp的video在app-vue编译成组件,不编译成原始组件,无法获取该元素
收起阅读 »

参照wot-design用vue3和TS写了个uni-app组件库——wot-design-uni

vue3

<p align="center">
<img alt="logo" src="https://wot-design-uni.cn/wot-design.png" width="200">
</p>
<h1 align="center">Wot Design Uni</h1>

<p align="center"> 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p>

<p align="center">

<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>

<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>

<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a>

</p>

<p align="center">
<a href="https://wot-design-uni.cn/">文档网站 (官网)</a>&nbsp;
<a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p>

✨ 特性

  • 支持 APP、H5、微信小程序 等平台.
  • 60+ 个高质量组件,覆盖移动端主流场景.
  • 使用 Typescript 构建,提供良好的组件类型系统.
  • 采用 Vue3 最新特性,提升组件性能.
  • 提供丰富的文档和组件示例.
  • 支持主题定制,可以定制 scss 变量以及组件的样式自定义.
  • 支持暗黑模式

预览

扫描二维码访问演示:

<p>
<img src="https://wot-design-uni.cn/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.cn/alipay.png" width="200" height="200" />
</p>

快速上手

详细说明见 快速上手

链接

贡献指南

修改代码请阅读我们的 贡献指南

使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR

贡献者们

感谢以下所有给 Wot Design Uni 贡献过代码的 开发者

<a href="https://github.com/Moonofweisheng/wot-design-uni/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Moonofweisheng/wot-design-uni" />
</a>

LICENSE

MIT

Star History Chart

继续阅读 »

<p align="center">
<img alt="logo" src="https://wot-design-uni.cn/wot-design.png" width="200">
</p>
<h1 align="center">Wot Design Uni</h1>

<p align="center"> 一个参照<a href="https://ftf.jd.com/wot-design/">Wot-design</a>,基于 Vue3 打造的uni-app组件库</p>

<p align="center">

<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>

<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>

<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>

<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a>

</p>

<p align="center">
<a href="https://wot-design-uni.cn/">文档网站 (官网)</a>&nbsp;
<a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p>

✨ 特性

  • 支持 APP、H5、微信小程序 等平台.
  • 60+ 个高质量组件,覆盖移动端主流场景.
  • 使用 Typescript 构建,提供良好的组件类型系统.
  • 采用 Vue3 最新特性,提升组件性能.
  • 提供丰富的文档和组件示例.
  • 支持主题定制,可以定制 scss 变量以及组件的样式自定义.
  • 支持暗黑模式

预览

扫描二维码访问演示:

<p>
<img src="https://wot-design-uni.cn/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.cn/alipay.png" width="200" height="200" />
</p>

快速上手

详细说明见 快速上手

链接

贡献指南

修改代码请阅读我们的 贡献指南

使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR

贡献者们

感谢以下所有给 Wot Design Uni 贡献过代码的 开发者

<a href="https://github.com/Moonofweisheng/wot-design-uni/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Moonofweisheng/wot-design-uni" />
</a>

LICENSE

MIT

Star History Chart

收起阅读 »

uni-app 微信小程序隐私代码流程

隐私弹窗

1、app.vue

``` vue  
<template>  
</template>  
<script>  
export default {  
globalData: {  
  PrivacyProtocol: {  
     needAuthorization: true,  
     title: ''  
  }  
},  
  methods: {  
    checkUserPrivacyProtocol() {  
                if (wx.getPrivacySetting) {  
                    wx.getPrivacySetting({  
                        success: res => {  
                            console.log(res)  
                            this.globalData.PrivacyProtocol.needAuthorization = res.needAuthorization  
                            if (res.needAuthorization) {  
                                // 需要弹出隐私协议  
                                this.globalData.PrivacyProtocol.title = res.privacyContractName  
                            }  
                        }  
                    })  
                }  
            }  
}  
  async onLaunch(option) {  
      // 检测用户是否需要提示隐私协议  
      await this.checkUserPrivacyProtocol()  
  },  
}  
</script>

2、使用mixin封装

export default {  
    data() {  
        return {  
            showPrivacyPopup: false, // 是否需要弹出协议  
            PrivacyPopupTitle: '', // 小程序协议名称  
            resolvePrivacyAuthorization: null // wx.onNeedPrivacyAuthorization的回调  
        };  
    },  
    created() {},  
    methods: {  
        // 打开弹窗  
        openPrivacyPopup() {  
            const app = getApp()  
            this.PrivacyPopupTitle = app.globalData.PrivacyProtocol.title  
            this.showPrivacyPopup = true  
        },  
        // 关闭弹窗  
        closePrivacyPopup() {  
            this.showPrivacyPopup = false  
        },  
        // 用户点击同意  
        handleAgreePrivacyAuthorization() {  
            console.log('点击了同意');  
            this.resolvePrivacyAuthorization({  
                buttonId: 'agree-btn',  
                event: 'agree'  
            })  
            this.showPrivacyPopup = false  
        },  
        // 用户点击拒绝  
        handleRefusePrivacyAuthorization() {  
            uni.showModal({  
                content: '如果拒绝,我们将无法获取您的信息, 包括手机号、位置信息、相册等该小程序十分重要的功能,您确定要拒绝吗?',  
                success: (res) => {  
                    if (res.confirm) {  
                        const app = getApp()  
                        console.log('点击了拒绝', this.resolvePrivacyAuthorization);  
                        this.resolvePrivacyAuthorization({  
                            event: 'disagree'  
                        })  
                        this.closePrivacyPopup()  
                        this.$log.warn(`用户${app.globalData.userInfo?.Name || ''}拒绝了隐私请求,无法使用相关微信的Api`)  
                    }  
                }  
            })  
        },  
        // 打开隐私协议  
        onClickPrivacyPopupTitle() {  
            wx.openPrivacyContract({})  
        },  
        // 监听调用微信api的函数  
        saveWXCallBack() {  
            if (wx.onNeedPrivacyAuthorization) {  
                wx.onNeedPrivacyAuthorization(resolve => {  
                    this.resolvePrivacyAuthorization = resolve  
                    this.openPrivacyPopup()  
                })  
            }  
        }  
    }  
};

3、main.js引入

import PrivacyProtocol from "./utils/PrivacyProtocol.js"  
Vue.mixin(PrivacyProtocol)

4、页面使用

<template>  
    <view class="box">  
               xxxxx  
        <u-popup :show="showPrivacyPopup" :closeOnClickOverlay="false" :round="10" mode="bottom"  
            @close="closePrivacyPopup()">  
            <view style="padding: 40rpx">  
                <p style="text-align: center;margin-bottom: 40rpx;font-size: 20px;font-weight: 700;">提示</p>  
                <text> 在你使用服务之前,请仔细阅读<text @click="onClickPrivacyPopupTitle()"  
                        style="color: #29B7A3;">{{PrivacyPopupTitle}}</text>。如果你同意{{PrivacyPopupTitle}},请点击“同意”开始使用。  
                </text>  
                <view class="display-style" style="margin-top: 40rpx;">  
                    <u-button text="拒绝" @click="handleRefusePrivacyAuthorization()"></u-button>  
                    <button id="agree-btn" class="btn-agree" open-type="agreePrivacyAuthorization"  
                        @agreeprivacyauthorization="handleAgreePrivacyAuthorization()">同意</button>  
                </view>  
            </view>  
        </u-popup>  
    </view>  
</template>  
<script>  
export default {  
  onLoad(option) {  
      this.saveWXCallBack()  
  },  
}  
</script>
继续阅读 »

1、app.vue

``` vue  
<template>  
</template>  
<script>  
export default {  
globalData: {  
  PrivacyProtocol: {  
     needAuthorization: true,  
     title: ''  
  }  
},  
  methods: {  
    checkUserPrivacyProtocol() {  
                if (wx.getPrivacySetting) {  
                    wx.getPrivacySetting({  
                        success: res => {  
                            console.log(res)  
                            this.globalData.PrivacyProtocol.needAuthorization = res.needAuthorization  
                            if (res.needAuthorization) {  
                                // 需要弹出隐私协议  
                                this.globalData.PrivacyProtocol.title = res.privacyContractName  
                            }  
                        }  
                    })  
                }  
            }  
}  
  async onLaunch(option) {  
      // 检测用户是否需要提示隐私协议  
      await this.checkUserPrivacyProtocol()  
  },  
}  
</script>

2、使用mixin封装

export default {  
    data() {  
        return {  
            showPrivacyPopup: false, // 是否需要弹出协议  
            PrivacyPopupTitle: '', // 小程序协议名称  
            resolvePrivacyAuthorization: null // wx.onNeedPrivacyAuthorization的回调  
        };  
    },  
    created() {},  
    methods: {  
        // 打开弹窗  
        openPrivacyPopup() {  
            const app = getApp()  
            this.PrivacyPopupTitle = app.globalData.PrivacyProtocol.title  
            this.showPrivacyPopup = true  
        },  
        // 关闭弹窗  
        closePrivacyPopup() {  
            this.showPrivacyPopup = false  
        },  
        // 用户点击同意  
        handleAgreePrivacyAuthorization() {  
            console.log('点击了同意');  
            this.resolvePrivacyAuthorization({  
                buttonId: 'agree-btn',  
                event: 'agree'  
            })  
            this.showPrivacyPopup = false  
        },  
        // 用户点击拒绝  
        handleRefusePrivacyAuthorization() {  
            uni.showModal({  
                content: '如果拒绝,我们将无法获取您的信息, 包括手机号、位置信息、相册等该小程序十分重要的功能,您确定要拒绝吗?',  
                success: (res) => {  
                    if (res.confirm) {  
                        const app = getApp()  
                        console.log('点击了拒绝', this.resolvePrivacyAuthorization);  
                        this.resolvePrivacyAuthorization({  
                            event: 'disagree'  
                        })  
                        this.closePrivacyPopup()  
                        this.$log.warn(`用户${app.globalData.userInfo?.Name || ''}拒绝了隐私请求,无法使用相关微信的Api`)  
                    }  
                }  
            })  
        },  
        // 打开隐私协议  
        onClickPrivacyPopupTitle() {  
            wx.openPrivacyContract({})  
        },  
        // 监听调用微信api的函数  
        saveWXCallBack() {  
            if (wx.onNeedPrivacyAuthorization) {  
                wx.onNeedPrivacyAuthorization(resolve => {  
                    this.resolvePrivacyAuthorization = resolve  
                    this.openPrivacyPopup()  
                })  
            }  
        }  
    }  
};

3、main.js引入

import PrivacyProtocol from "./utils/PrivacyProtocol.js"  
Vue.mixin(PrivacyProtocol)

4、页面使用

<template>  
    <view class="box">  
               xxxxx  
        <u-popup :show="showPrivacyPopup" :closeOnClickOverlay="false" :round="10" mode="bottom"  
            @close="closePrivacyPopup()">  
            <view style="padding: 40rpx">  
                <p style="text-align: center;margin-bottom: 40rpx;font-size: 20px;font-weight: 700;">提示</p>  
                <text> 在你使用服务之前,请仔细阅读<text @click="onClickPrivacyPopupTitle()"  
                        style="color: #29B7A3;">{{PrivacyPopupTitle}}</text>。如果你同意{{PrivacyPopupTitle}},请点击“同意”开始使用。  
                </text>  
                <view class="display-style" style="margin-top: 40rpx;">  
                    <u-button text="拒绝" @click="handleRefusePrivacyAuthorization()"></u-button>  
                    <button id="agree-btn" class="btn-agree" open-type="agreePrivacyAuthorization"  
                        @agreeprivacyauthorization="handleAgreePrivacyAuthorization()">同意</button>  
                </view>  
            </view>  
        </u-popup>  
    </view>  
</template>  
<script>  
export default {  
  onLoad(option) {  
      this.saveWXCallBack()  
  },  
}  
</script>
收起阅读 »

uni-app 微信小程序隐私协议开发实践(有组件提供,见文章底部)

隐私 隐私政策 隐私协议 微信小程序

背景

2023 年 08 月 10 日,微信团队发布了关于微信小程序隐私保护指引设置的公告:自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。这篇公告发布之后,引发了微信社区的广泛不满和抱怨。许多开发者抱怨称,相关文档难以理解,微信偷偷将相关实现回退导致开发进度受阻后无法进行调试,而微信相关的代码逻辑也比较混乱。

2023 年 08 月 22 日微信官方又偷偷更新了相关的文档,接口可以正常调试了,同时官方也给出了相关的Demo,所以我们又可以开始心不甘情不愿开开心心地调试了。

微信官方文档及公告地址

关于小程序隐私保护指引设置的公告

隐私相关接口

微信小程序隐私协议开发指南

更新用户隐私保护指引

小程序管理员或开发者可以根据具体小程序涉及到的隐私相关接口来更新微信小程序后台的用户隐私保护指引,更新并审核通过后就可以进行相关的开发调试工作。

需要注意的是,仅有在指引中声明所处理的用户信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将直接禁用

开发指南解读

开发调试配置

参考 微信小程序隐私协议开发指南中的介绍

目前 getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize 等接口目前可以正常接入调试。调试说明:

  • 在 2023 年 9 月 15 号之前,在 app.json 中配置 "__usePrivacyCheck__": true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。

  • 在 2023 年 9 月 15 号之后,不论 app.json 中是否有配置 usePrivacyCheck,隐私相关功能都会启用。

所以在基于uni-app开发时,我们在 2023 年 9 月 15 号之前进行相关开发调试则需要在manifest.json文件mp-weixin中添加"__usePrivacyCheck__": true

微信官方 Demo

  • demo1: 演示使用 wx.getPrivacySetting<button open-type="agreePrivacyAuthorization"> 在首页处理隐私弹窗逻辑 https://developers.weixin.qq.com/s/gi71sGm67hK0

  • demo2: 演示使用 wx.onNeedPrivacyAuthorization<button open-type="agreePrivacyAuthorization"> 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 https://developers.weixin.qq.com/s/4X7yyGmQ7EKp

  • demo3: 演示 wx.onNeedPrivacyAuthorizationwx.requirePrivacyAuthorize<button open-type="agreePrivacyAuthorization"><input type="nickname">组件如何结合使用 https://developers.weixin.qq.com/s/jX7xWGmA7UKa

  • demo4: 演示使用 wx.onNeedPrivacyAuthorization<button open-type="agreePrivacyAuthorization"> 在多个 tabBar 页面处理隐私弹窗逻辑 https://developers.weixin.qq.com/s/g6BWZGmt7XK9

微信官方给出了 4 个 Demo,可以覆盖大多数的开发场景,其内容主要就是getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize这三个接口的组合使用。

Demo 解读

Demo1

Demo1 仅使用wx.getPrivacySetting接口查询隐私授权情况,在needAuthorizationtrue时主动打开授权弹框。

Demo2

Demo2 使用wx.onNeedPrivacyAuthorization接口监听隐私接口需要用户授权事件,当需要用户进行隐私授权时会触发该事件,与此同时此时打开授权弹框。

Demo3

Demo3 使用wx.onNeedPrivacyAuthorization接口监听隐私接口需要用户授权事件,使用wx.requirePrivacyAuthorize模拟隐私接口调用,所以 Demo3 不需要用户真的进行隐私授权操作,就可以主动打开授权弹框。

Demo4

Demo4 与 Demo2 的逻辑基本上一致,针对tabbar切换场景增加了打开授权弹框的同时关闭其他 tabbar 已打开授权弹框的逻辑。

Demo 总结

我们可以根据具体的场景来参考 demo 组合使用getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize接口进行开发,比如某个页面需要上传图片,就需要使用wx.chooseImagewx.chooseMedia接口,这时候我们的场景和 Demo2 基本上是一致的,在用户点击选择图片的按钮时,就可以触发wx.onNeedPrivacyAuthorization并打开授权弹框。

组件推荐

推荐使用组件ws-wx-privacy 微信隐私保护弹出框,支持vue2和vue3

这里我们是以组件的形式提供了授权弹框,监听页面中用户调用隐私授权接口,开发者将组件引入页面后可以自行选择主动触发或被动触发。


<template>  
  <view>  
  <!-- #ifdef MP-WEIXIN -->  
  <ws-wx-privacy  
    id="privacy-popup"  
    @disagree="handleDisagree"  
    @agree="handleAgree"  
    title="用户隐私保护提示"  
    desc="感谢您使用本应用,您使用本应用的服务之前请仔细阅读并同意"  
    protocol="《用户隐私保护指引》"  
    subDesc="。当您点击同意并开始时用产品服务时,即表示你已理解并同意该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法使用相应服务。"  
  ></ws-wx-privacy>  
  <!-- #endif -->  
  </view>  
</template>  
<script>  

export default {  
  methods: {  
    handleDisagree() {  
      // 处理用户不同意隐私协议的逻辑  
    },  
    handleAgree() {  
      // 处理用户同意隐私协议的逻辑  
    }  
  }  
}  
</script>

微信隐私保护弹出框组件推荐

推荐使用组件ws-wx-privacy 微信隐私保护弹出框,支持vue2和vue3

相关文章

支持多平台小程序的uni-app持续集成工具

基于vue3的uni-app路由库uni-mini-router助你实现跳转、传参、拦截等路由功能

前端代码提交规范

Vue3高颜值组件库

Wot Design Uni | 一个参照Wot-design打造的uni-app组件库

继续阅读 »

背景

2023 年 08 月 10 日,微信团队发布了关于微信小程序隐私保护指引设置的公告:自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后,方可调用微信提供的隐私接口。这篇公告发布之后,引发了微信社区的广泛不满和抱怨。许多开发者抱怨称,相关文档难以理解,微信偷偷将相关实现回退导致开发进度受阻后无法进行调试,而微信相关的代码逻辑也比较混乱。

2023 年 08 月 22 日微信官方又偷偷更新了相关的文档,接口可以正常调试了,同时官方也给出了相关的Demo,所以我们又可以开始心不甘情不愿开开心心地调试了。

微信官方文档及公告地址

关于小程序隐私保护指引设置的公告

隐私相关接口

微信小程序隐私协议开发指南

更新用户隐私保护指引

小程序管理员或开发者可以根据具体小程序涉及到的隐私相关接口来更新微信小程序后台的用户隐私保护指引,更新并审核通过后就可以进行相关的开发调试工作。

需要注意的是,仅有在指引中声明所处理的用户信息,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将直接禁用

开发指南解读

开发调试配置

参考 微信小程序隐私协议开发指南中的介绍

目前 getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize 等接口目前可以正常接入调试。调试说明:

  • 在 2023 年 9 月 15 号之前,在 app.json 中配置 "__usePrivacyCheck__": true 后,会启用隐私相关功能,如果不配置或者配置为 false 则不会启用。

  • 在 2023 年 9 月 15 号之后,不论 app.json 中是否有配置 usePrivacyCheck,隐私相关功能都会启用。

所以在基于uni-app开发时,我们在 2023 年 9 月 15 号之前进行相关开发调试则需要在manifest.json文件mp-weixin中添加"__usePrivacyCheck__": true

微信官方 Demo

  • demo1: 演示使用 wx.getPrivacySetting<button open-type="agreePrivacyAuthorization"> 在首页处理隐私弹窗逻辑 https://developers.weixin.qq.com/s/gi71sGm67hK0

  • demo2: 演示使用 wx.onNeedPrivacyAuthorization<button open-type="agreePrivacyAuthorization"> 在多个页面处理隐私弹窗逻辑,同时演示了如何处理多个隐私接口同时调用。 https://developers.weixin.qq.com/s/4X7yyGmQ7EKp

  • demo3: 演示 wx.onNeedPrivacyAuthorizationwx.requirePrivacyAuthorize<button open-type="agreePrivacyAuthorization"><input type="nickname">组件如何结合使用 https://developers.weixin.qq.com/s/jX7xWGmA7UKa

  • demo4: 演示使用 wx.onNeedPrivacyAuthorization<button open-type="agreePrivacyAuthorization"> 在多个 tabBar 页面处理隐私弹窗逻辑 https://developers.weixin.qq.com/s/g6BWZGmt7XK9

微信官方给出了 4 个 Demo,可以覆盖大多数的开发场景,其内容主要就是getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize这三个接口的组合使用。

Demo 解读

Demo1

Demo1 仅使用wx.getPrivacySetting接口查询隐私授权情况,在needAuthorizationtrue时主动打开授权弹框。

Demo2

Demo2 使用wx.onNeedPrivacyAuthorization接口监听隐私接口需要用户授权事件,当需要用户进行隐私授权时会触发该事件,与此同时此时打开授权弹框。

Demo3

Demo3 使用wx.onNeedPrivacyAuthorization接口监听隐私接口需要用户授权事件,使用wx.requirePrivacyAuthorize模拟隐私接口调用,所以 Demo3 不需要用户真的进行隐私授权操作,就可以主动打开授权弹框。

Demo4

Demo4 与 Demo2 的逻辑基本上一致,针对tabbar切换场景增加了打开授权弹框的同时关闭其他 tabbar 已打开授权弹框的逻辑。

Demo 总结

我们可以根据具体的场景来参考 demo 组合使用getPrivacySettingonNeedPrivacyAuthorizationrequirePrivacyAuthorize接口进行开发,比如某个页面需要上传图片,就需要使用wx.chooseImagewx.chooseMedia接口,这时候我们的场景和 Demo2 基本上是一致的,在用户点击选择图片的按钮时,就可以触发wx.onNeedPrivacyAuthorization并打开授权弹框。

组件推荐

推荐使用组件ws-wx-privacy 微信隐私保护弹出框,支持vue2和vue3

这里我们是以组件的形式提供了授权弹框,监听页面中用户调用隐私授权接口,开发者将组件引入页面后可以自行选择主动触发或被动触发。


<template>  
  <view>  
  <!-- #ifdef MP-WEIXIN -->  
  <ws-wx-privacy  
    id="privacy-popup"  
    @disagree="handleDisagree"  
    @agree="handleAgree"  
    title="用户隐私保护提示"  
    desc="感谢您使用本应用,您使用本应用的服务之前请仔细阅读并同意"  
    protocol="《用户隐私保护指引》"  
    subDesc="。当您点击同意并开始时用产品服务时,即表示你已理解并同意该条款内容,该条款将对您产生法律约束力。如您拒绝,将无法使用相应服务。"  
  ></ws-wx-privacy>  
  <!-- #endif -->  
  </view>  
</template>  
<script>  

export default {  
  methods: {  
    handleDisagree() {  
      // 处理用户不同意隐私协议的逻辑  
    },  
    handleAgree() {  
      // 处理用户同意隐私协议的逻辑  
    }  
  }  
}  
</script>

微信隐私保护弹出框组件推荐

推荐使用组件ws-wx-privacy 微信隐私保护弹出框,支持vue2和vue3

相关文章

支持多平台小程序的uni-app持续集成工具

基于vue3的uni-app路由库uni-mini-router助你实现跳转、传参、拦截等路由功能

前端代码提交规范

Vue3高颜值组件库

Wot Design Uni | 一个参照Wot-design打造的uni-app组件库

收起阅读 »

8月29日,“警学联盟·校园无诈” 海淀公安与您相约清华大学,敬请期待!

普法 反诈

第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式即将举行,8月29日,海淀公安与您相约清华大学,敬请期待!

警学联盟·校园无诈”优秀反诈作品揭晓仪式【点击查看】

海淀警学反诈联盟 你我同心反诈同行!

继续阅读 »

第一届“警学联盟·校园无诈”优秀反诈作品揭晓仪式即将举行,8月29日,海淀公安与您相约清华大学,敬请期待!

警学联盟·校园无诈”优秀反诈作品揭晓仪式【点击查看】

海淀警学反诈联盟 你我同心反诈同行!

收起阅读 »