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

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明
1.DEMO创意为卡片字典。
2.不同卡片显示不同内容:微卡、小卡、中卡、大卡,根据不同卡片特征显示同一个字的不同内容,基于用户习惯可选择喜欢的卡片。
3.万能卡片刷新:用户点击卡片刷新按钮查看新内容,同时卡片设置了定时刷新,让用户每天看到的卡片都是新的文字,便于用户学习和查阅。
4.元服务内具有搜索功能,用户可以通过搜索查询相应的字和解释,采用了类似现在用户习惯的上下滑动方式来进行逐字详细阐述。
5.基于API9、ArkTS语言开发,通过serverless云服务实现注册、登录等功能。
二、元服务效果
1.万能卡片效果

 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

2.元服务内页
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


三、项目开发
1.环境搭建
软件要求:
DevEco Studio版本:DevEco Studio 3.1 Release及以上版本。
HarmonyOS SDK版本:API version 9及以上版本。
硬件要求:
设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
HarmonyOS系统:3.1.0 Developer Release及以上版本。

2.主要代码结构解读
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


entry/src/main/ets: 文件入口
common:公共资源文件
images:公共图片资源
Constants.ts:公共常量
CountryViewModel.ts:国家号码类
LazyFE_Class.ets:懒数据加载类
Log.ts:日志类

components:封装组件文件

database:数据库封装类
data_cyhz.ets:数据文件

entryability:应用/服务入口

entryformability:卡片服务

pages:应用/服务页面
Auth.ets:认证授权
CloudFunction.ets:云函数
CloudProject.ets:云项目
CloudStorage.ets:云存储
Index.ets:主页
User_Login.ets:登录页
User_SignUp.ets:注册页
User_VerifyCodeLogin.ets:验证码登录页

services:后台操作类

widget:服务卡片

resources:资源文件目录

3.进入应用说明
由于创建的是云模板项目,所以无需额外配置SDK依赖,只需要注意的是,云模板的初始集成sdk位置不一样,所以我们还是在应用初始化阶段使用context初始化SDK,推荐在entryability的onCreate中进行。
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


4.首页
我们需要给应用添加底部菜单栏,用于切换不同的应用模块,由于各个模块之间属于完全独立的情况,并且不需要每次切换都进行界面的刷新,所以我们用到了Tabs,TabContent组件。
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


本应用一共有首页、我的两个模块,分别对应Tabs组件的两个子组件TabContent。

首页包含搜索文字和滑动浏览信息两个模块,具体代码实现我们将在下边分模块进行说明。

搜索文字:主要用到Search组件,通过搜索文字来跳转到相应的文字展示信息,主要代码如下:

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...
//常用汉字搜索栏
Column() {Search({ value: this.submitValue, placeholder: '汉字搜索', controller: this.search }).searchButton('搜索').placeholderColor(Color.Grey).textFont({ size: 14, weight: 400 }).margin({ left: 20, right: 20 }).onSubmit((value: string) => {this.submitValue = valuefor (let i = 0; i < wz.length; i++) {const element: any = wz[i];if (this.submitValue == element.zi) {this.swiperIndex = ithis.submitValue = ''}}}).onChange((value: string) => {this.changeValue = value})
}.width("100%").margin({ top: 20, bottom: 20 })
......

浏览信息模块:主要用到swiper组件,通过数据的懒加载行为,来预缓存数据,通过滑动页面来展示文字信息,主要代码如下:

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...//常用汉字轮播部分
Column() {Swiper(this.swiperController) {LazyForEach(this.data_wz, (item: any) => {Column() {...}.width("100%").height("100%").justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)}, item => item)}.vertical(true).cachedCount(2).autoPlay(false).indicator(false).loop(false).duration(400).itemSpace(0).curve(Curve.Linear).cachedCount(3).index(this.swiperIndex).disableSwipe(this.disableSwipe).onChange((index: number) => {console.info("swiper:" + index.toString())this.swiperIndex = index})
}.width("100%")...

5.我的
我的页包含游客登陆、用户登录两个模块。
其中游客登陆不显示登录信息以及应用部分功能,仅能使用部分应用能力;
用户登录显示用户部分信息,并展开应用所有功能,需要用户注册登录;
具体代码实现我们将在下边分模块进行说明。

游客登录:

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...//游客登陆状态
if (this.isVisitor) {//头像信息Column() {Image($r('app.media.icon')).width(90).objectFit(ImageFit.Contain).borderRadius(50)Text(this.isVisitor ? "游客_" : this.userName).fontSize(16).margin(20)Button(this.isLogin ? "退出" : "登录", { type: ButtonType.Capsule }).fontSize(14).width('120').height('30').backgroundColor(0xf48fb1).onClick(() => {router.replaceUrl({url: "pages/User_Login"})})}.width('90%').height('240').borderRadius(12).margin({ top: 20 }).backgroundColor(0xFFFFFF).shadow({ radius: 12, color: 0xCECECE, offsetX: 4, offsetY: 6 }).justifyContent(FlexAlign.Center)
}...

用户登录:

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...//已经登陆状态if (!this.isVisitor) {//头像信息Column() {
...}.width('90%').height('240').borderRadius(12).margin({ top: 20 }).backgroundColor(0xFFFFFF).shadow({ radius: 12, color: 0xCECECE, offsetX: 4, offsetY: 6 }).justifyContent(FlexAlign.Center)//选择项Column() {...
}.width('100%')
.height("100%")
.backgroundColor(0xF5F5F5)
.justifyContent(FlexAlign.Start)

6.注册登录页
让用户进行账号注册,能够完全使用应用。
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


核心代码:

....onClick(() => {if (this.phoneNumber !== '' && this.password !== '') {let verifyCodeSettings = new VerifyCodeSettingBuilder().setAction(VerifyCodeAction.REGISTER_LOGIN).setLang('zh_CN').setSendInterval(60).build();agconnect.auth().requestPhoneVerifyCode(this.countryCode, this.phoneNumber, verifyCodeSettings).then(verifyCodeResult => {this.startTimer()//验证码申请成功}).catch(error => {//验证码申请失败Prompt.showToast({ message: "请输入正确的手机号和密码" + JSON.stringify(error) })});}else {Prompt.showToast({ message: "手机号和密码不能为空" })}
})......
.......onClick(() => {if (this.phoneNumber !== '' && this.password !== '') {let user = new PhoneUserBuilder().setCountryCode(this.countryCode).setPhoneNumber(this.phoneNumber).setPassword(this.password) //可以给用户设置初始密码。填写后后续可以用密码来登录.setVerifyCode(this.VerifyCode).build();agconnect.auth().createPhoneUser(user).then(result => {// 创建用户成功AppStorage.Set('phoneNumber', user.phoneNumber)AppStorage.Set('password', user.password)AppStorage.Set('isVisitor', false)AppStorage.Set('isLogin', true)AppStorage.Set('userName', user.phoneNumber)router.pushUrl({url: "pages/Index"})}).catch(error => {// 创建用户失败Prompt.showToast({ message: "注册失败," + JSON.stringify(error),duration:4 })})} else {Prompt.showToast({ message: "手机号和密码不能为空" })}
})

7.其他云服务
说明:这是云模板初始业务,如有其他业务需求,可自行添加。
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


四、卡片开发
按需求添加卡片,也可以只用初始创建卡片,修改相关卡片参数即可。

1.创建卡片
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


2.初始卡片修改相关参数
打开resources/base/profile目录下的form_config.json文件,按需修改参数
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


3.卡片加载与获取数据

卡片加载更新部分由EntryFormAbility.ts文件完成,这里可参考官方文档操作即可。

由于没有连接到后台数据部分,所以我们这里采用自定义模拟数据,然后在每次卡片挂载到桌面时,随机选取卡片内容,代码如下:
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...
aboutToAppear() {let idx = Math.floor((Math.random() * wz_arr.length))this.zi = wz_arr[idx].zithis.pinYin = wz_arr[idx].pinYinthis.buShou = wz_arr[idx].buShouthis.biHua = wz_arr[idx].biHuathis.fanTi = wz_arr[idx].fanTithis.near_words = wz_arr[idx].near_wordsthis.reverse_words = wz_arr[idx].reverse_wordsthis.explain = wz_arr[idx].explain.toString()
}...

4.卡片主要代码

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

...Column() {//微卡Stack() {Text(this.zi).width("100%").textAlign(TextAlign.Center).fontSize(30).fontColor('#1f1f1f').fontWeight(600).margin({right:20})Row(){Image("/common/images/R2.png").width(18).height(18).margin({right:"15%"}).objectRepeat(ImageRepeat.NoRepeat).onClick(()=>{this.rotateAngle = 180this.aboutToAppear()}).rotate({ angle: this.rotateAngle }).animation({duration:300,curve: Curve.Linear,playMode: PlayMode.Normal})}.width("100%").justifyContent(FlexAlign.End)}.width("100%").height(72)//小卡、中卡Flex({direction:FlexDirection.Column,wrap:FlexWrap.Wrap,justifyContent:FlexAlign.Start}){Column(){Text("拼音:"+this.pinYin).fontSize(14).margin({left:15})Text("部首:"+this.buShou).fontSize(14).margin({top:4,left:15})Text("笔画:"+this.biHua).fontSize(14).margin({top:4,left:15})Text("繁体:"+this.fanTi).fontSize(14).margin({top:4,left:15})}.width(208).justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)Column(){Text("近义词:"+this.near_words).fontSize(12).margin({right:15})Text("反义词:"+this.reverse_words).fontSize(12).margin({top:4,right:15})}.justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)}.width("100%").height(102)//大卡Column(){Text("解释:").width("100%").textAlign(TextAlign.Start).fontSize(12).margin({left:15,right:15})Text(this.explain).fontSize(14).margin({top:4,left:15,right:15})}.width("100%").height("100%").justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start)
}
.width("100%")
.alignItems(HorizontalAlign.Center)
.backgroundImage("/common/images/cywz.jpg")
.backgroundImageSize(ImageSize.Cover)
.onClick(() => {postCardAction(this, {"action": this.ACTION_TYPE,"abilityName": this.ABILITY_NAME,"params": {"message": this.MESSAGE,}});
})...

五、项目运行
 

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区


六、结语
各位感兴趣的开发者可以点击进入元服务官网,详细了解元服务、万能卡片相关信息。大家还可以在华为手机的负一屏、华为应用市场元服务专区体验本文作者及团队已经上架运营的元服务-成语心情,用万能卡片按照自己的心情来刷刷成语吧。

HarmonyOS元服务开发实践:桌面卡片字典-开源基础软件社区

相关文章:

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容&#xff1a;微卡、小卡、中卡、大卡&#xff0c;根据不同卡片特征显示同一个字的不同内容&#xff0c;基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新&#xff1a;用户点击卡片刷新按钮查看新内容&#xff0c;同时…...

xLua学习

xLua教程&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ&#xff1a;https://github.com/Tencent/xLua/blob/maste…...

​Web3到底是个啥?

Web3到底是个啥&#xff1f; Web3是近两年来科技领域最火热的概念之一&#xff0c;但是目前对于Web3的定义却仍然没有形成标准答案&#xff0c;相当多对于Web3的理解&#xff0c;都是建立在虚拟货币行业&#xff08;即俗称的“币圈”&#xff09;的逻辑基础之上的。 区块链服务…...

pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)

文章目录 pycharm、idea、golang系列修改行分隔符我应该选择什么换行符JetBrains IDE&#xff0c;默认行分隔符 是跟随系统修改JetBrains IDE&#xff0c;默认行分隔符 pycharm、idea、golang系列修改行分隔符 一般来说,不同的开发环境和项目对换行格式的使用偏好不同: Windo…...

ThinkPHP函数深度解析

ThinkPHP是一个具有丰富功能和强大灵活性的PHP开发框架。在这篇文章中&#xff0c;我们将详细介绍ThinkPHP的一些关键函数&#xff0c;以帮助开发人员更好地理解和使用这个框架。 1. 入门&#xff1a;ThinkPHP的核心函数 1.1 C()函数 C()函数用于读取和设置配置参数。它是Thin…...

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言&#xff1a;maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…...

LeetCode150道面试经典题-合并两个有序数组(简单)

合并两个有序数组 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&a…...

记录 运维三剑客一件部署的的docker-compose,yml文件

CAdvisor: 收集 InfluxDB: 存储 Grafana&#xff1a; 展示 version: 3.1volumes:grafana_data: {}services:influxdb:image: tutum/influxdb:0.9restart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083:8083"- "8086:8086"volumes:- ./data/inf…...

Xposed框架开发

文章目录 xpose插件开发步骤清单文件新建一个类&#xff08;插件入口点&#xff09;设置入口点 Hook第一个实例zhuceji.apk一些常用的HOOKHookH5PluginHookProxyPluginHookSystem 资料Xposed原理初探 xpose插件开发步骤 magisk安装与配置 Xpose Framework API LSPosed magisk …...

2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)

1.long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) 描述:从指定的用户环形缓冲区中排出样本,并为每个此类样本调用提供的回调: long (*callback_fn)(struct bpf_dynptr *dynptr, void *ctx); 如果callback_fn返回0,帮助函数…...

关于游戏的笔记

关于搭建秦时明月2一键端&#xff0c;并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…...

vue diff 前后缀+最长递增子序列算法

文章目录 查找相同前后缀通过前后缀位置信息新增节点通过前后缀位置信息删除节点 中间部份 diff判断节点是否需要移动删除节点删除未查找到的节点删除多余节点 移动和新增节点最长递增子序列 求解最长递增子序列位置信息 查找相同前后缀 如上图所示&#xff0c;新旧 children 拥…...

【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析

目录 前言 influxDB 安装运行InfluxDB 用Python 上报数据到influxdb ocust 数据写入到 influx Locust的生命周期 上报数据 优化升级 配置Grafana 总结 资料获取方法 前言 在进行性能测试时&#xff0c;我们需要对测试结果进行监控和分析&#xff0c;以便于及时发现问…...

数组模拟循环链表

5073. 空闲块 - AcWing题库 数组模拟循环链表 /*从当前位置开始遍历空闲块链表&#xff08;初始是从地址最小的第一个空闲块开始&#xff09;&#xff0c;寻找满足条件的最小块 &#xff08;即&#xff1a;大于等于请求空间的最小空闲块&#xff0c;如果有多个大小相同的最小空…...

第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树

文章目录 虚拟源点&#xff1a;1146. 新的开始贪心或kruskal性质&#xff1a;1145. 北极通讯网络最小生成树与完全图&#xff1a;346. 走廊泼水节次小生成树&#xff1a;1148. 秘密的牛奶运输 虚拟源点&#xff1a;1146. 新的开始 1146. 新的开始 - AcWing题库 与一般的最小…...

RESTful API的讲解以及用PHP实现RESTful API

RESTful API是什么 RESTful是一种设计风格&#xff0c;是一种用于构建Web服务的架构。RESTful API是一种基于REST&#xff08;Representational State Transfer&#xff09;架构风格的Web服务接口设计规范。它强调使用HTTP协议中的请求方法&#xff08;例如GET、POST、PUT、DEL…...

Spring中@Component和@Bean的区别

1. 用途不同 Component用于标识普通类 Bean是在配置类中声明和配置Bean对象 2. 使用方式不同 Component是一个类级别的注解,Spring通过ComponentScan注解扫描并注册为Bean. Bean是一个方法级别的注解,在配置类中手动声明和配置Bean 3. 控制权不同 Component注解修饰的类使…...

【问题解决】mysql 数据库字符串分割之后多行输出方法

背景&#xff1a; 项目需要从一张表查询出来数据插入到另一张表&#xff0c;其中有一个字段是用逗号分隔的字符串&#xff0c;需要多行输入到另一张表&#xff0c;那么这个如何实现呢 方案&#xff1a; 下面先粘贴下sql语句&#xff1a; select SUBSTRING_INDEX(SUBSTRING_…...

flutter开发实战-时间显示刚刚几分钟前几小时前

flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳&#xff0c;需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…...

导出LLaMA等LLM模型为onnx

通过onnx模型可以在支持onnx推理的推理引擎上进行推理&#xff0c;从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖&#xff0c;获得更好的性能等优势。 这篇博客&#xff08;大模型LLaMa及周边项目&#xff08;二&#xff09; - 知乎&#xff09;进行…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...