首页 > 其他分享 >#星计划#分享元服务「心情盲盒」开发经历

#星计划#分享元服务「心情盲盒」开发经历

时间:2024-01-02 11:01:09浏览次数:39  
标签:服务 卡片 盲盒 心情 json let 分享

前言

这次的端云一体化活动同样是开发鸿蒙应用或者元服务,上次的端云一体化活动,我也参加了,当时简单入手,在原有模板的基础上开发了一个元服务,那个完全不算一个正常的项目,充其量只能称呼为一个测试DEMO。通过那个DEMO,我熟悉了端云一体化开发的步骤,工具的用法,服务卡片的开发和交互也都熟悉了。但当时受限于个人的技术水平,没能开发一个像样的元服务提交发布,但当时有了一个简单的构思,畅想了一下自己会做一个什么样的元服务,当时构思的项目是“快递盲盒”,这个快递装载着陌生朋友的心情,所以叫它盲盒。碍于当时个人对端云一体化的云端还不够熟悉,手边也没有支持API9的真机可以调试,所以当时研究了几天,感觉无望,毅然放弃了。时隔了小半年的时间,通过不断的学习官网的文档和别人的帖子,发现在自己项目中集成serverless云服务真是并不复杂,一旦搞懂,就所向披靡了,感觉开发的道路豁然开朗,有任何想法都可以去试试手了。这次,为了圆梦,我就把上次那个想法开发出来了,做成了一个元服务,并成功上架了。这个元服务就是“心情盲盒”,使用的人不多,可能使用价值和受欢迎程度都还不够,不要紧,这次的经历,坚定了我克服困难勇往直前的信念,也大大提高了自己遇到问题时分析问题和解决问题的能力。

简介

“心情盲盒”这款元服务,主要包含两个模块,服务卡片和应用主页面。

服务卡片查看随机抽取的陌生人的心情寄语,用户点击卡片盒子边缘空白处,可以改变盒子的颜色,点击盒子会触发盒子旋转,同时获取别人的心情,心情分为喜怒哀乐四种,分别以不同的表情图像显示,图像下会显示对方的手机号末尾4位数字,卡片中间显示心情详情,下方是功能操作按钮,可以继续获取,或者发布一个心情。

应用主页面中,用户可以输入自己的心里话,并选择此刻的心情,然后发布。

因为这个元服务的业务功能定义为盲盒,所以查看者和发布者都是匿名的。盲盒信息是每日自动更新的,因为每个人每天都会有新的心情,所以服务端只保存了当天的心情数据,昨天和之前的会被服务器自动删除,到了明天今天的心情数据也会消失。

本篇文档简单介绍一下心情盲盒的功能和实现过程。

预览

animok.gif

功能介绍

盒子颜色可以随机改变,点击服务卡片中盒子外的部分,盒子颜色和背景底色都会跟随改变。 a.png

点击盒子,触发盒子旋转动画,同时跳转到新的界面, cardrotate.gif

获取到心情数据后,会直接显示心情信息, moodcard.png

上方的人脸表情是代表喜怒哀乐心情的,看上面这样子好像是有些不高兴,下方的小数字代表发布者手机号尾部4位,说明这句心里话是尾号6236的朋友发布的。中间的黑色文字就是对方说的话。点击“再换个人”,会重新返回盲盒界面,同时颜色随机改变,再点击盲盒,又会继续获取新的心情信息。不论你登录与否,都可以查看别人的心情,但要想发表自己的心情,就需要通过手机号进行注册一下了。

有时,也可能你是当天第一个查看盲盒的人,没有新数据就会显示如下界面,此时,你可以发表一个心情,作为首发哦。或者刷新一下,看看是不是因为网络不太好的原因没获取到数据。 lost.png

点击发表之后,会出现如下的发表界面, post.png 在我想说中,输入自己想说的心里话,在心情一栏,选择自己此刻的比较接近的心情,然后点击“发布盲盒”就可以了。 posting.png

发布成功后,会提示发布成功,用户可以选择“再发一个”继续发表心情,或者“以后再说”关闭发表界面。 posted.png

如果用户首次使用,没有登录,会提示如下界面,让用户进行登录, login.png

勾选底部的“阅读并同意”的方框,就可以进行登录操作了。 namepwd.png

其他玩法

基于鸿蒙系统对卡片支持的多功能性,我们可以添加多个心情盲盒服务卡片,构成一个卡片墙,或者把多个心情盲盒堆叠在一起。

盲盒墙效果: wall.png

盲盒堆叠效果: cascade.png

代码实现

服务卡片通过message类型的action通知EntryFormAbility获取新数据,

async getMood() {
  postCardAction(this, {
    'action': 'message',
    'params': {
    }
  });
}

EntryFormAbility在onFormEvent中处理message类型消息,并读取云数据库,

async onFormEvent(formId, message) {
    // Called when a specified message event defined by the form provider is triggered.
    initialize(this.context, json);

    try {
      const context =  this.context
      const value = await context.resourceManager.getRawFileContent('schema.json');
      let json: string = buffer.from(value).toString("utf8");
      let objectTypeInfo: ObjectTypeInfo = JSON.parse(json);

	...

      let agcDataBase = cloud.database({ objectTypeInfo: objectTypeInfo, zoneName: "MessageDB" })
      const resultArray = await (agcDataBase as Database)
        .collection(Message)
        .query()
        .equalTo('insertDate', curDate)
        .orderByDesc("id")
        .limit(100, 0)
        .get();
	
	...

    } catch (err) {

    }
  }

然后将结果反馈给服务卡片,

      // updateform
      let formData = {
        'user': msg.getUser(),
        'content': msg.getContent(),
        'mood': moodIdx,
      };

      let formInfo = formBindingData.createFormBindingData(formData)
      formProvider.updateForm(formId, formInfo).then((data) => {
        console.info('FormAbility updateForm success.' + JSON.stringify(data));
      }).catch((error) => {
        console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
      })

用户发布心情数据,直接更新云数据库,

const value = await context.resourceManager.getRawFileContent('schema.json');
let json: string = buffer.from(value).toString("utf8");
let schema: ObjectTypeInfo = JSON.parse(json);

const record = await cloud.database({ objectTypeInfo: schema, zoneName: "MessageDB" })
  .collection(Message)
  .upsert({
    "user": phone,
    "content": content,
    "mood": mood,
    "insertDate": curDate
  });

用户登录的实现,

Login({
  modes: [AuthMode.PHONE_VERIFY_CODE],
  onSuccess: async (user: AuthUser) => {
    // this.shownPartIndex = 2;
    this.isShowButton = false
    AppStorage.Set<AuthUser>('user', user);
    this.currentUser = AppStorage.Get<AuthUser>('user');
    if (this.currentUser != null && this.currentUser != undefined) {

      let agcUserExtra = await this.currentUser.getUserExtra();
      this.creatTime = agcUserExtra.getCreateTime()
      this.lastLogin = agcUserExtra.getLastSignInTime()

      router.replaceUrl({
        url: 'pages/Home'
      })
    }
  }
}) {
  if (this.isShowButton && this.isAccept) {
    Button({ type: ButtonType.Normal }) {
      Text($r('app.string.auth_service_login_button_text'))
        .fontColor($r('app.color.white'))
    }
  }
}

用户登出的实现,

async logout() {
  cloud.auth().signOut().then(() => {
    this.isShowButton = true
    this.currentUser = null
  }).catch((error: Object) => {
  });
}

用户注销的实现,

deleteUser() {
  cloud.auth().deleteUser().then(() => {
    this.isShowButton = true
    this.currentUser = null
  }).catch((err: Object) => {
  })
}

总结

通过这次实践,熟悉了端云一体化新模板的功能,也熟悉了云数据库、云函数和用户认证的用法,为以后开发其他项目打了一个基础。

本文作者:droidzxy

想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com/#bkwz​

标签:服务,卡片,盲盒,心情,json,let,分享
From: https://blog.51cto.com/harmonyos/9065088

相关文章

  • 智能安防视频平台LiteCVR监控视频流的分享操作
    GB28181协议旨在建立一个统一的视频监控系统标准,使不同厂家的设备能够互相兼容和互通。它定义了视频监控设备之间的通信接口和协议,包括视频流传输、设备控制、事件通知等。并且,GB28181协议采用分布式部署的架构,支持多个视频监控设备之间的实时通信和数据交换。使用该协议,可以实现视......
  • JavaScript调用系统邮件快速分享
    在前端使用邮件分享进行快速分享~,详情参考->MDN自定义参数subject:主题cc:抄送到次要收件人(与邮件有关但无需做出应答的个人或组织)bcc:密送到其他收件人(主要、次要收件人不应该获得密送收件人的身份)body:邮件内容注:每个字段的值都必须进行编码(也就是,带有......
  • Microsoft 365解决方案:如何生成外部分享报告
    51CTO博客链接:https://blog.51cto.com/u_13637423组织内部与Partner或者vender协作时,通常会采用共享的方式将文档或者重要资料分享给外部用户便于协同编辑,但组织内部管理员也需要定期生成外部共享报告,其主要原因为:·      审计和合规:某些行业或者组织需要遵循特定的法规和标......
  • 63页!嵩山版Java开发手册分享
    作为广受欢迎的编程语言之一,Java在软件开发领域扮演着重要的角色。然而,由于Java的灵活性和广泛应用,很容易出现代码质量低下、可读性差、维护困难等问题。为了解决这些问题,阿里巴巴集团发布了一份权威指南——阿里嵩山版Java开发手册。阿里嵩山版Java开发手册是一份规范性文档,提供......
  • 【专题】2023年中国消费者洞察白皮书报告PDF合集分享(附原数据表)
    全文链接:https://tecdat.cn/?p=33375原文出处:拓端数据部落公众号在疫情后的时代,中国的消费市场正在逐步复苏。政策和社会共同努力,全面提振消费者的信心。与此同时,供给侧正在采用新的内容营销模式,品牌、电商直播和信息平台注重科普专业知识,将品质和创新作为核心竞争力。居民消费......
  • Prometheus 14 点实践经验分享
    这是2017年的promcon的分享,原文地址在这里,作者JuliusVolz,今天偶然看到,虽然已经过去6年,有些实践经验还是非常值得学习。做个意译,加入一些自己的理解,分享给大家。埋点方面1.所有模块都要埋点我印象中Google有个规范,所有的服务模块,都需要通过HTTP /varz 接口暴露监......
  • 技术分享
    Java是一种广泛使用的编程语言,有很多方面的技术专长可以涵盖。以下是一份可能的Java技术专长总结:核心语言特性:熟练掌握Java语言的基本语法和核心特性。对面向对象编程(OOP)的概念有深入理解,包括类、对象、继承、封装和多态。Java标准库:熟悉并能有效使用Java标准库中的核心类......
  • 数据结构实验代码分享 - 4
    迷宫与栈问题(图的应用)【问题描述】以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。输入:行列迷宫,0表示无障碍,1表示有障碍输出:一条Path或“NOPATH” 注:参考了《数据结......
  • 【代码分享】10行代码写一个超级简单的进度条
    我们知道,Python使用rich或tqdm模块可以轻松创建进度条,那么如果我们自己写一个,需要几行代码呢?答案是4行。显示效果完整代码完整代码如下,核心代码也就4行#!/usr/bin/envpython#-*-coding:UTF-8-*-importtimedefprogress_bar(desc:str,index:int,total:int,b......
  • iOSapp开发怎么分享小程序?
    Hello,大家好我是咕噜铁蛋!随着移动互联网的迅猛发展,小程序作为一种新型的应用形态,已经逐渐成为移动开发领域的新宠。对于iOS开发者来说,如何将自己的APP与小程序进行无缝对接,为用户提供更加便捷的服务,成为了一个值得探讨的话题。今天铁蛋讲为大家详细解读iOS开发APP如何分享小程序。......