鸿蒙端云一体化简单项目

文章目录

  • 前言
  • 端云一体化
  • 服务端
  • 客户端
  • 云数据库
  • 总结
一、前言

鸿蒙系统在不断地成熟,现在有了鸿蒙端云一体化开发模式。什么是端云一体化呢,简单点就是你原本是客户端开发的,项目中只是客户端的代码,端云一体化呢,就是服务器的项目,也是由客户端完成了,对,就是你写客户端同时也把服务端的活也给干了。

看到这里,你可能会觉得不可思议。为什么会有端云一体化呢,主要是对一些中小企业,为了成本,为了稳健性,使用华为云来处理后台的任务。一方面是稳健性,一方面是省成本。当然了,如果你要求的后台比较复杂,那么就需要单独的后台人员来开发。

这篇文章主要讲的就是把云函数,云数据库,还有客户端调用云服务这些整合起来。最后我会附上一个demo,可以看看具体是怎么玩的。

二、端云一体化

1、注册华为开发者账号。
到AppGallery Connect网站:
https://developer.huawei.com/consumer/cn/service/josp/agc/index.html,AppGalleryConnect
2、
在AppGallery Connect,创建项目,写一个项目名就行。
默认数据处理位置选择中国,其他都按默认的。
然后就创建完了,接着左边会有Serverless,这里头就有认证服务 云函数 云数据库等功能。把这几个主要的都给开通了。
在这里插入图片描述

3、
DevEco 创建项目:
记得选的是 Empty Ability withCloudDev 然后点击下一步:
在这里插入图片描述
接着需要你去登录:
在这里插入图片描述

登录完还会报错,你还没有进行关联。关联一下,你在AppGallery Connect 中创建的项目,填一些关联的基本信息就可以了。
(这一步主要是将app和云服务进行绑定。)
然后回到DevEco,就会发现绑定完成,然后点finish就可以了。
在这里插入图片描述
在这里插入图片描述

4、这个时候会看到两个项目,一个是Application 就是客户端的。
一个是CloudProgram 这个就是服务端的。

接下里我们就一个端,一个端写实现

三、服务端

1、我们可以在CloudProgram/cloudfunctions 创建一个云函数。 创建方法:右键cloudfunctions,New -> Cloud Fuction

比如我们创建login函数:

/**
 * 云函数入口
 * */

let myHandler = async function (event, context, callback, logger) {//event: 接收请求信息。 callback:返回服务器数据
  logger.info(event);

  // 实现那个随机数
  let random = Math.random().toFixed(4);

  callback({ //返回服务器的数据
    code: 0,
    desc: "Success." + random
  });
};

export { myHandler };

上面这个login 中,我们就可以写服务器的实现了,我们这里是实现随机数,然后将结果返回。

2、
写完之后,我们就可以发布到云服务上去:
右键 cloudfunctions -> Deploy Cloud Fuction 这个时候AppGallery Connect,云函数中,就会有我们刚才写的login了。

3、测试
这里我们可以通过编译工具,Tools -> CloudDev -> Cloud Fuctions Requestor
进行测试验证,请求结果。
在这里插入图片描述

这个时候服务端搞定了。

四、客户端

1、
首先在entry/src/module.json5 要保证有网络权限。

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
]

2、查看entry/oh-package.json5 里面的依赖。如果没同步,要点sync now,进行同步下。

3、我们在index.ets 添加按钮

 Button("获取服务器数据").onClick(()=>{
        console.log("点击了")
        this.getLoginResult();
      })
getLoginResult = () => {
  login(getContext(this)).then((data) => {
    let message: Message =  JSON.parse(data) as Message  //这里是数据格式的转换,转成对象。
    console.log('获取的数据:', message.desc);
  }).catch((err) => {
    console.error('error: ', err && err.message);
  });
}     

在Function.ts 中增加个login 方法,用来请求云函数:

export function login(context): Promise<string> {
    return new Promise((resolve, reject) => {
        getAGConnect(context);
        console.log("开始请求")
        let functionCallable = agconnect.function().wrap("login-$latest");
        functionCallable.call().then((ret: any) => {
            Log.info(TAG, "Cloud Function Called, 返回来的值: " + JSON.stringify(ret.getValue()));
            resolve(JSON.stringify(ret.getValue())); //这里会进行回调
        }).catch((error: any) => {
            Log.error(TAG, "Error - could not obtain cloud function result. Error Detail: " + JSON.stringify(error));
            reject(error);
        });
    });
}

通过上面,我们就能在客户端,调用云函数了,也就是调用接口。正常打印日志,能够接收到服务器返回的随机数,说明能正常访问服务器了。

到此。我们已经能够通过客户端请求服务端的云函数了。到这里,如果觉得消化不了,可以先去实践,根据上面的跑一下,因为后面这部分是锦上添花的事,就是操作云数据库。

五、云数据库

1、创建一个json文案,实际上就是数据库表要用到的字段,给类型,给id等:
右键 CloudProgram/clouddb/objecttype 创建json 文件。(New -> Cloud DB Object Type)
创建完,改自己想要定义的字段名就行了

{
     "belongPrimaryKey": true,
     "fieldName": "bookName",
     "fieldType": "String",
     "isNeedEncrypt": false,
     "notNull": true
   }

2、创建数据条数:
右键 CloudProgram/clouddb/dataentry (New -> Cloud DB Data Entry)
创建文件 dataentry1.json:
文件会默认生成,你根据自己的需要做个修改就行,下面代表加了两条数据

{
  "cloudDBZoneName": "cloudDBZone1",
  "objectTypeName": "objectType1",
  "objects": [
    {
      "bookName": "My Favorite Book",
      "author": "ssz",
      "id": 10,
      "publishTime": 1706169847036,
      "field5": 10.5,
      "field6": 10
    },
    {
      "bookName": "string2",
      "author": "string2",
      "id": 20,
      "publishTime": 1706169847036,
      "field5": 20.5,
      "field6": 20
    }
  ]
}

3、部署数据库
右键 cloubdb,选择 Deploy Cloud DB
右下角,弹出Deploy successfully,表示部署成功。

这个时候打开AppGallery Connect 刷新下,就可以看到云数据库里,有了两条数据。

六、操作云数据库

既然数据库部署完了,那么接下来就能通过客户端来操作云数据库了。

1、
在AppGallery Connect 找到自己的项目,左边栏找到 -> 项目设置 -> 常规,下载 agconnect-services.json,将文件下载。
放到 entry/src/main/ets 目录下

另外还要下载:在AppGallery Connect 找到自己的项目,左边栏找到-> Serverless -> 云数据库 -> 对象类型 -> 点击导出json(新增按钮旁边的三个点)-> 重命名为schema
同样放到 entry/src/main/ets 目录下

还有:在 entry/src/main/ets 创建个models文件
然后在AppGallery Connect 找到自己的项目,左边栏找到-> Serverless -> 云数据库 -> 对象类型 ->勾选自己写的objectType1-> 导出js格式
解压后,将文件命名为objectType1.js 放到 models 中。

上面这几个文件,主要是下面要用到,要提前准备好。

2、
在oh-package.json5
添加依赖:

    "@hw-agconnect/hmcore": "^1.0.1",
    "@hw-agconnect/cloud": "^1.0.1",
    //记得点右上角,同步下。

3、
在EntryAbility.ts
导入:

import {initialize} from '@hw-agconnect/hmcore'
import json from '../agconnect-services.json';

在oncreate 中进行初始化:

oncreate(){
     initialize(this.context, json)
}   

4、
在Index.ets中导入database组件:

import cloud from '@hw-agconnect/cloud';   
import schema from '../schema.json';
import {objectType1} from '../models/objectType1';

下面就是增删改查的操作了。

   Button("查询数据库").onClick(async ()=>{
        console.log("查询数据")
        const resultArray = await cloud.database({objectTypeInfo: schema, zoneName: "cloudDBZone1"}).collection(objectType1).query().get();
        console.log("更新成功:" +  JSON.stringify(resultArray))
      })

      Button("增加一条数据").onClick(async ()=>{
        console.log("连接数据库")
        try {
          let object = new objectType1();
          object.bookName = 'ssz新增书'
          object.author = 'ssz'
          const record = await cloud.database({objectTypeInfo: schema, zoneName: "cloudDBZone1"}).collection(objectType1).upsert(object);
          console.log("增加成功:" + record)
        }catch (err){
          console.log("增加失败")
        }
      })

      Button("删除数据").onClick(async ()=>{
        console.log("连接数据库")
        try {
          let object = new objectType1();
          object.bookName = 'ssz新增书'
          const record = await cloud.database({objectTypeInfo: schema, zoneName: "cloudDBZone1"}).collection(objectType1).delete(object);
          console.log("删除成功:" + record)
        }catch (err){
          console.log("删除失败")
        }
      })

当我们要运行的时候,会碰到一个坑,就是关于so的报错。
这块只要在entry/build-profile.json5 的文件中,增加以下代码即可:

...
"buildOption": {
    //配置筛选har依赖.so资源文件的过滤规则
    "napiLibFilterOption": {
      //按照.so文件的优先级顺序,打包最高优先级的.so文件
      "pickFirsts": [
        "**/1.so"
      ],
      //按照.so文件的优先级顺序,打包最低优先级的.so 文件
      "pickLasts": [
        "**/2.so"
      ],
      //排除的.so文件
      "excludes": [
        "**/3.so"
      ],
      //允许当.so重名冲突时,使用高优先级的.so文件覆盖低优先级的.so文件
      "enableOverride": true
    }
  },
  ...
   "targets":

上面的操作一定要注意,先进行query,也就是查询的操作,因为查询不需要管理员权限。其他的操作,可能要相应的权限才能操作。这块一定的注意,特别是刚玩的时候,一直没成功会摸不着头脑的。其实最主要就是objectType1.json 也就是部署云数据库的时候,创建的这个objectType1,要进行一些权限的修改才能正常。

我这个demo中已经都改成所有用户都能增删改查了。

好了,整个项目,就是这个样子,主要还是一些配置还有就是前后端的结合,及一些注意事项。

最后呢,端云一体化相关的东西,比如配置什么的,一不小心就踩坑了,写这篇博客真的是比较费心的,总算写出来了,只是作为参考,随着api的变动,可能后面还会有不同。可以根据最新文档来实现。

以上代码地址:https://github.com/shenshizhong/AppCloudDemo

总结

1、简单介绍端云一体化
2、实现服务端,然后再实现客户端,通过客户端调用云函数
3、部署云数据库,然后通过客户端调用云数据库,实现增删改查。

如果对你有一点点帮助,那是值得高兴的事情。:)
我的csdn:http://blog.csdn.net/shenshizhong
我的简书:http://www.jianshu.com/u/345daf0211ad

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MyBatis】#{} 和 ${}

目录 1. #{} 使用示例&#xff1a; 2. ${} 使用示例&#xff1a; SQL注入 使用#{}的情况&#xff1a; 使用${}的情况&#xff1a; MyBatis是一种用于Java语言的持久层框架&#xff0c;它简化了数据库操作的过程。在MyBatis中&#xff0c;我们经常会看到两种不同的参数占…

华为云WAF,开启web网站的专属反爬虫防护罩

背景 从保护原创说起 作为一个原创技术文章分享博主&#xff0c;日常除了Codeing就是总结Codeing中的技术经验。 之前并没有对文章原创性的保护意识&#xff0c;直到在某个非入驻的平台看到了我的文章&#xff0c;才意识到&#xff0c;辛苦码字、为灵感反复试验创作出来的文…

苹果macOS 恶意软件家族被曝光:通过破解软件分发,可窃取敏感信息

卡巴斯基安全实验室近日发布博文&#xff0c;发现了一种针对苹果 macOS 设备的新型恶意软件家族&#xff0c;并提醒苹果 Mac 用户谨慎下载破解软件。 报告称这种新型恶意软件家族高度复杂&#xff0c;主要伪装成为各种知名 macOS 软件的破解版分发&#xff0c;用户下载恶意 PKG…

ISO 14229和UDS:汽车诊断的黄金标准

UDS简介&#xff1a; UDS是Unified Diagnostic Services的缩写&#xff0c;全名统一诊断服务。它是一种用于汽车电子控制单元&#xff08;ECU&#xff09;之间进行诊断和通信的标准协议&#xff0c;属于ISO 14229标准的一部分。 UDS的起源和背景&#xff1a; UDS的起源可以追…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中&#xff0c;通过HTTP访问网络&#xff0c;可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用&#xff0c;需要封装下才好。推荐使用前端开发中流行的axios网络客户端库&#xff0c;如果是前端开发者&#xff0c;用 axios也会更加顺…

Java笔记(死锁、线程通信、单例模式)

一、死锁 1.概述 死锁 : 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法往下执行。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相等待的进…

vusui css 使用,简单明了 适合后端人员 已解决

vusui-cssopen in new window 免除开发者繁复的手写 CSS 样式&#xff0c;让 WEB 前端开发更简单、灵活、便捷&#xff01;如果喜欢就点个 ★Staropen in new window 吧。 移动设备优先&#xff1a; vusui-css 包含了贯穿于整个库的移动设备优先的样式。浏览器支持&#xff1a…

【每日一题】最大合金数

文章目录 Tag题目来源解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【数组】【2024-01-27】 题目来源 2861. 最大合金数 解题思路 方法一&#xff1a;二分枚举答案 思路 如果我们可以制造 x 块合金&#xff0c;那么一定也可以制造 x-1 块合金。于…

《合成孔径雷达成像算法与实现》Figure5.18

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

【C++干货铺】C++中的IO流和文件操作

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言的输入输出 流是什么&#xff1f; C的IO流 C标准IO流 C文件IO流 文本文件读写 二进制文件的读写 stringstream的简单介绍 将数值类型数据格式化为字…

JS中的try...catch

一、定义和结构 作用&#xff1a;捕获同步执行代码下的异常错误 在没有使用try...catch的情况下&#xff0c;同步代码执行遇到异常会报错&#xff0c;并中断后续代码执行&#xff1b; 在使用try...catch的情况下&#xff0c;同步代码执行遇到异常会抛出异常&#xff0c;并继续…

线性代数----------学习记录

线性代数发展历程 &#xff08;1&#xff09;线性方程组&#xff1a;例如二元一次方程组&#xff1b; &#xff08;2&#xff09;行列式&#xff1a;determinant,克莱默&#xff0c;莱布尼兹&#xff1b; &#xff08;3&#xff09;矩阵&#xff1a;方程个数与未知数的个数可…

【前端工程化】环境搭建 nodejs npm

文章目录 前端工程化是什么&#xff1f;前端工程化实现技术栈前端工程化环境搭建 &#xff1a;什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么&#xff1f; 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…

JAVAEE初阶 网络编程(五)

TCP协议 一.TCP协议图二. TCP中的关键协议确认应答后发先至机制引入序号和确认序号 超时重传去重机制 建立连接三次握手 一.TCP协议图 我们可以发现&#xff0c;相比于UDP&#xff0c;TCP协议明显复杂很多&#xff0c;比如32位序号和32位确认序号&#xff0c;4位首都长度&#…

前端面试题-js数据类型-怎么判断是对象还是数组-字符串常用方法-数组常用方法

前端面试题-js部分-js数据类型-怎么判断是对象还是数组-字符串常用方法-数组常用方法 JS数据类型有哪些值类型和引用类型的区别数组的常用方法哪些方法会改变原数组 字符串常用方法对象常用方法怎么判断是对象还是数组 JS数据类型有哪些 数据类型类型描述Number基本类型&#…

ANSYS 2023 下载安装教程,附安装包和工具,轻松安装,无套路

前言 ANSYS是一款融结构、流体、电场、磁场、声场分析于一体的大型通用有限元分析(FEA)软件&#xff0c;能与多数计算机辅助设计软件接口&#xff0c;实现数据的共享和交换&#xff0c;如Creo,NASTRAN、Algor、IDEAS、AutoCAD等. 准备工作 1、Win10及以上系统 2、提前准备好…

防火墙的基础知识点

目录 1. 防火墙的意义&#xff1a; 2. 防火墙分类&#xff1a; 3. 防火墙的发展史&#xff1a; 3.1 包过滤 3.2 应用代理 3.3. 状态检测 3.4. 专用设备 3.4.1 入侵检测系统(IDS) 3.4.2 入侵防御系统(IPS) 3.4.3 防病毒网关 (AV) 3.4.4 Web应用防火墙 (WAF) 3.5. 统…

Netty的解码器和编码器

链路图 一个完整的RPC请求中&#xff0c;netty对请求数据和响应数据的处理流程如下图所示 网络线路中传输的都是二进制数据&#xff0c;之后netty将二进制数据解码乘POJO对象&#xff0c;让客户端或者服务端程序处理。 解码的工具称为解码器&#xff0c;是一个入站处理器InBo…

BAT学习笔记:详解环境变量及其所有创建方法

文章目录 一、初识环境变量二、什么是环境变量三、为什么需要环境变量四、环境变量的分类五、环境变量的设置 一、初识环境变量 1.windows 的搜索框中输入 查看高级系统设置。点击打开系统属性窗口。 2. 在系统属性窗口中&#xff0c;点击右下方的“环境变量”打开环境变量设…

Linux服务器配置与管理(第二次实验)

实验目的及具体要求 目的 1.掌握基于命令行的文件操作 2.掌握基于命令行的目录操作 3.掌握用户账户的命令行操作 4.掌握组账户的命令行操作 5.熟悉磁盘分区操作 6.掌握调整优先级的方法 具体要求 1.掌握基于命令行的文件和目录操作 ①创建测试目录 ②创建文件 ③复…