首页 文章 精选 留言 我的

精选列表

搜索[小程序后台],共10000篇文章
优秀的个人博客,低调大师

从微信小程序到鸿蒙js开发【05】——tabs组件&每日新闻

目录: 1、tabs, tab-bar, tab-content 2、tabs的事件处理 3、tabs实现的每日新闻 1、tabs, tab-bar, tab-content 上章说到,鸿蒙的list组件仅能支持竖向滚动,无法实现横向滚动。如果需要作出可横向滚动的顶部菜单栏,鸿蒙提供了tabs组件。tabs配合两个子元素组件tab-bar和tab-content,即可很轻松地实现顶部菜单+内容切换效果。 tab-bar的子元素为text,tab-content的子元素为div。 hml: <div class="container"> <tabs class="tabs"> <tab-bar> <block for="{{ tabBar }}"> <text> {{ $item.name }} </text> </block> </tab-bar> <tab-content> <block for="{{ tabBar }}"> <div style="background-color: {{ $item.color }}; height: 500px;"> <text style="font-size: 50px;"> {{ $idx }} </text> </div> </block> </tab-content> </tabs> </div> css: .container { width: 100%; height: 1200px; display: flex; flex-direction: column; } .tabs{ width: 100%; height: 100%; } js: export default { data: { tabBar: [{name: '推荐', color: '#1296db'}, {name: '最新', color: '#e20a0b'}, {name: '最热', color: '#cdcdcd'}] } } 由效果可看出,tab-bar组件是顶部的菜单栏,自带了动态样式。tab-content组件是下方的内容部分,会根据点击的菜单切换到对应的内容部分。tab-bar和tab-content是根据索引值一一对应的。这里还发现,哪怕tab-content给了height: 500px的样式,还是会占满整个tabs的高度。 tabs的属性index用于指定默认选中的菜单索引项,vertical指定是否为竖向菜单栏。这里设置为竖向后可以看出,tab-bar变为占满一列,tab-content的height样式起作用,宽度则占满tabs。 <tabs class="tabs" index="1" vertical="true"> 多放几个菜单项,并设置tab-bar的属性mode="fixed",则菜单项无法滑动,均布占满整行。 <tabs class="tabs" index="0" vertical="false"> <tab-bar mode="fixed"> mode="scrollable",就有横向滚动效果了,且点击菜单项后整个菜单栏会有适应移动效果。 <tab-bar mode="scrollable"> tab-content属性scrollable-"true",菜单对应内容就可以竖向滚动了,和list效果类似。 <tab-content scrollable="true"> 2、tabs的事件处理 如想捕获菜单项变化的事件并进行处理,需在tabs标签中通过onchange进行绑定。在传入的事件对象中,index则为选中菜单项的索引值。这里使用prompt模块的showToast()进行调试。 <tabs class="tabs" index="0" vertical="false" onchange="changeTab"> import prompt from '@system.prompt'; export default { data: { tabBar: [ ... ] }, changeTab(event) { prompt.showToast({ message: '你点击了第' + event.index + '项。' }) } } 这个onchange事件捕获的条件比较苛刻,注意: tabs tab-bar text tab-content div 以上组件都必须存在,且tab-bar中text的数量和tab-content中div的数量需一致。 或者也可以在text上通过onclick绑定事件,就没有以上的严苛触发条件。 <div class="container"> <tabs class="tabs" index="0" vertical="false"> <tab-bar mode="scrollable"> <block for="{{ tabBar }}"> <text onclick="clickTab($idx)"> {{ $item.name }} </text> </block> </tab-bar> ...... import prompt from '@system.prompt'; export default { data: { tabBar: [......] }, clickTab(idx) { prompt.showToast({ message: '你点击了第' + idx + '项。' }) } } 当然,弊端也很明显。tab-bar文字下的蓝色线条并没有跟随移动,tab-content也没有随之改变,只是事件可以捕获到。这种用法适用于只希望保留tab-bar的部分,自定义动态样式,可以省略tab-content以及其中的div。哪一种方式更好,还得看需求。 3、tabs实现的每日新闻 这里运用了整套tabs组件,从聚合数据新闻头条接口(https://www.juhe.cn/docs/api/id/235)请求数据,实现了一个简单的每日新闻模块。因为鸿蒙的页面布局如果高度超过手机总高度就会有滑动效果,tab-bar和自定义的底部菜单都是固定的,因此也用不着list组件了。代码如下: hml: <!-- 每日新闻 --> <div> <tabs class="newsTabs" onchange="changeNewsType"> <tab-bar> <block for="{{ newsTitles }}"> <text> <span>{{ $item.name }}</span> </text> </block> </tab-bar> <tab-content> <block for="{{ newsTitles }}"> <div class="newsView"> <block for="{{ newsList }}"> <div class="newsItem"> <image src="{{ $item.thumbnail_pic_s }}" class="newsImg"></image> <div class="newsContent"> <text> {{ $item.title }} </text> <div class="newsDesc"> <text> {{ $item.author_name }} </text> <text> {{ $item.date }} </text> </div> </div> </div> </block> </div> </block> </tab-content> </tabs> </div> <!-- 每日新闻end --> css: /*每日新闻*/ .newsTabs { width: 100%; height: 100%; } .newsView { width: 100%; height: 100%; display: flex; flex-direction: column; } .newsItem { width: 100%; height: 240px; border-bottom: 1px solid #bbbbbb; display: flex; align-items: center; } .newsImg { margin-left: 20px; width: 200px; height: 200px; } .newsContent { display: flex; flex-direction: column; margin-right: 20px; margin-left: 20px; } .newsContent>text { margin-top: 20px; height: 140px; font-size: 34px; color: #333333; } .newsDesc { height: 60px; line-height: 60px; display: flex; justify-content: space-between; } .newsDesc>text { font-size: 28px; color: #777777; } js: data: { newsTitles: [ { name: '头条', value: 'top' }, { name: '社会', value: 'shehui' }, { name: '国内', value: 'guonei' }, { name: '国际', value: 'guoji' }, { name: '娱乐', value: 'yule' }, { name: '体育', value: 'tiyu' }, { name: '军事', value: 'junshi' }, { name: '科技', value: 'keji' }, { name: '财经', value: 'caijing' }, { name: '时尚', value: 'shishang' } ], newsList: [], }, changeNewsType(event) { let type = this.newsTitles[event.index].value; fetch.fetch({ url: 'http://v.juhe.cn/toutiao/index?key=xxxxx&type=' + type, responseType: 'json', success: res => { let data = JSON.parse(res.data); this.newsList = data.result.data; } }) }, 作者:Chris. 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

优秀的个人博客,低调大师

支付宝应用和小程序开发:使用阿里云KMS保护应用私钥

一、支付宝开放平台的公私钥机制 支付宝开放平台的应用管理体系,使用了公私钥的机制,来保障商户应用和支付宝交互的安全性。这一机制包括两个部分: 商户应用使用自己的私钥对消息加签之后,将消息和签名传递给支付宝,支付宝则使用应用的公钥验证消息的真实性(来自于合法应用的真实消息)。 对于支付宝返回消息给商户应用的情形,应用则使用支付宝的“平台公钥”来验证返回消息的真实性。 下图简单描述了上述第一部分的交互机制: 这一机制的关键前提假定是: 商户应用必须保障应用私钥的安全性,从而保障应用和和支付宝交互的安全性。 反之,一旦私钥发生泄露,商户则会面临较大的安全风险。若应用和支付宝的交互涉及到资金类接口则风险更甚。 二、阿里云KMS带来的价值 相比于在应用中使用应用私钥的明文来对消息进行加签,阿里云KMS为用户带来了如下几个方面的优势: 保障私钥安全性:用户可以将签名私钥安全托管在KMS的托管密码机内。用户通过KMS的开放API使用私钥加签时,私钥会在密码机的硬件安全边界之内,完成运算后返回签名值,从而防止私钥的泄露。 控制谁可以使用私钥:用户可以通过阿里云访问控制服务(RAM服务),中心化的管理和控制谁可以使用KMS中的密钥,用于应用加签。 审计对私钥的调用日志:通过阿里云操作审计服务可以查看每一次调用KMS的记录;而商家应用自行保管私钥则很难产生“客观”的审计事件。 对安全事件的响应能力:在应用系统遭遇恶意者攻击等安全事件的情形下,也可以通过多种手段阻止对私钥的非法使用:例如用户可以通过RAM服务撤销对私钥的使用权限,或者通过KMS禁用私钥等。 三、使用阿里云KMS配置应用密钥 第一步:在阿里云KMS中创建应用密钥 登录阿里云KMS的管理控制台。 在左上角的地域选择栏,选择合适的地域。通常情况下,建议您选择和应用部署相同的KMS地域创建密钥。 点击 创建密钥,选择密钥类型和密钥用途。 密钥类型使用 RSA_2048。 密钥用途选择 Sign/Verify。 保护级别选择 Hsm,即通过KMS系统的硬件加密机产生和保护密钥 第二步:在支付宝配置应用密钥 支付宝开放平台提供了两种配置方法,普通公钥方式和公钥证书方式。 公钥证书方式是对普通公钥方式的增强机制,从数字签名的角度来看,机制大同小异,商户应用只需要二选一即可。注意:对于涉及到资金往来的商户应用,应当使用公钥证书的方式。 方法一:普通公钥方式 以下步骤参考支付宝开放平台普通公钥方式,并做恰当修改: 在阿里云KMS的管理控制台,选择之前创建的RSA_2048类型的密钥,进入详情页之后,点击查看公钥可以复制或者下载应用公钥。 进入 支付宝开放平台 并打开对应的应用,在应用的开发配置页面进行 接口加签方式 设置。点击 设置 后,输入手机验证码。 复制上一步生成的公钥,粘贴到 填写公钥字符 对应的位置,点击 保存设置,即可完成公钥的设置。 普通公钥方式的一句话总结: 从阿里云KMS获取应用公钥,注册到支付宝开放平台对应的应用中。 方法二:公钥证书方式 以下步骤参考支付宝开放平台公钥证书方式,并做恰当修改: 在阿里云KMS的管理控制台,选择之前创建的RSA_2048类型的密钥,进入详情页之后,点击 生成CSR。注意:填写证书属性时,企业/单位名称 一定要和开发者中心门户账号信息的公司名称保持一致,否则会导致后续步骤中上传 CSR 证书文件校验失败。 进入 支付宝开放平台 并打开对应的应用,在应用的开发配置页面进行 接口加签方式 设置。点击 设置 后,输入手机验证码。 加签模式 选择 公钥证书 ,上传证书文件 选择 上传CSR文件在线生成证书。最后点击 上传CSR文件在线生成证书,即可完成公钥证书的设置。 公钥证书方式的一句话总结: 从阿里云KMS获取应用私钥的证书请求 CSR,到支付宝开放平台一键完成应用证书签发和注册。 四、应用中调用阿里云KMS 支付宝开放平台新版SDK,也就是EasySDK集成了阿里云KMS作为加签提供器(Sign Provider),简化使用。以Java为例,您需要在应用中引用EasySDK 2.0.1以及之后的版本。 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-easysdk</artifactId> <version>2.0.1</version> </dependency> 当然,如果遵循支付宝开放API的签名规则,也可以不使用EasySDK,通过阿里云KMS的AsymmetricSign接口自行实现签名。 代码示例:普通公钥方式 本示例来自于阿里云KMS的Github代码样例库。 package com.aliyun.kms.samples; import com.alipay.easysdk.base.qrcode.models.AlipayOpenAppQrcodeCreateResponse; import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.kms.aliyun.AliyunKMSConfig; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; /** * Alipay-easysdk使用KMS签名示例,本示例展示了公钥模式调用 */ public class KmsAlipayEasySDKPublicKeyDemo { public static void main(String[] args) { Factory.setOptions(getOptions()); try { AlipayOpenAppQrcodeCreateResponse response = Factory.Base.Qrcode().create("page/component/component-pages/view/view", "x=1", "二维码描述"); if ("10000".equals(response.code)) { System.out.println("调用成功"); } else { System.err.println("调用失败,原因:" + response.msg + "," + response.subMsg); } } catch (Exception e) { System.err.println("调用遭遇异常,原因:" + e.getMessage()); throw new RuntimeException(e.getMessage(), e); } } private static AliyunKMSConfig getOptions() { AliyunKMSConfig config = new AliyunKMSConfig(); config.protocol = "https"; config.gatewayHost = "openapi.alipay.com"; config.signType = "RSA2"; // 请更换为您的AppId config.appId = "202100****"; // 请修改如下的支付宝公钥字符串为自己的支付宝公钥 config.alipayPublicKey = "MIIBIjANB..."; // 如果使用阿里云KMS签名,则需要指定签名提供方名称,阿里云KMS的名称为"AliyunKMS" config.signProvider = "AliyunKMS"; // 如果使用阿里云KMS签名,请更换为您的阿里云AccessKeyId config.aliyunAccessKeyId = getAliyunAccessKey("AccessKeyId"); // 如果使用阿里云KMS签名,请更换为您的阿里云AccessKeySecret config.aliyunAccessKeySecret = getAliyunAccessKey("AccessKeySecret"); // 如果使用阿里云KMS签名,请更换为您的KMS服务密钥ID config.kmsKeyId = "4358f298-8e30-4849-9791-****"; // 如果使用阿里云KMS签名,请更换为您的KMS服务密钥版本ID config.kmsKeyVersionId = "e71daa69-c321-4014-b0c4-****"; // 如果使用阿里云KMS签名,需要更换为您的KMS服务地址 // KMS服务地址列表详情,请参考: // https://help.aliyun.com/document_detail/69006.html?spm=a2c4g.11186623.2.9.783f77cfAoNhY6#concept-69006-zh config.kmsEndpoint = "kms.cn-hangzhou.aliyuncs.com"; return config; } /** * 从文件中读取阿里云AccessKey配置信息 * 此处为了测试执行的环境普适性,AccessKey信息配置在resources资源下,实际过程中请不要这样做。 * * @param key AccessKey配置对应的key * @return AccessKey配置字符串 */ private static String getAliyunAccessKey(String key) { InputStream stream = KmsAlipayEasySDKPublicKeyDemo.class.getResourceAsStream("/fixture/aliyunAccessKey.json"); Map<String, String> result = new Gson().fromJson(new InputStreamReader(stream), new TypeToken<Map<String, String>>() { }.getType()); return result.get(key); } } 代码示例:公钥证书方式 使用公钥证书模式时,EasySDK的使用方式和上述示例类似,区别主要在于配置了商户应用和支付宝平台的公钥证书。 请参考阿里云KMS的Github代码样例库了解更多。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册