0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙海报编辑器APP,分享端云一体化开发的经验!

陈姚丰 来源:jf_83680738 作者:jf_83680738 2025-03-16 16:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

在我工作的日常中,经常会用一些画图编辑器,简单设计一些页面原型。而在去年低代码很火的时候,我在公司就开发了一款大屏可视化编辑器,可以通过拖拉拽生成网页的一个工具。后面也想着自己也开发一个画图的编辑器,可以用来自己平时做图或者设计海报之类的。而这次我将使用鸿蒙ArkTs来开发这款海报编辑器APP,顺便分享一下我这次的开发经验。

项目架构与开发流程

我这次项目功能架构以及整体开发流程如下:

项目功能结构

海报编辑器架构.png

整体开发流程

海报编辑器端云一体开发流程.png

这次开发我使用了鸿蒙的端云一体化的开发模式进行整个项目的构建。说实话:之前我都是自己写后端代码,开发流程确实比较繁琐。而云开发模式就很方便了,端侧与云侧同时开发,无需搭建服务器,工具成本低。这点我还是很喜欢的。

端云一体化工程讲解

端云一体化的工程我也是第一次开发,相信很多伙伴也没开发过。我这次用的是官方提供的云模板工程,我大概给大家讲解一下:

image.png

整体结构很简单,使用起来也比较方便。所有的操作DevEco Studio开发工具都集成了。

而在讲解之前,使用云模板创建项目之前需要在华为开发平台创建项目,具体创建流程可以到官方文档查看,地址我也放在下面:https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/agc-harmonyos-clouddev-agcapp-0000001439436876-V3#section397317130308

注意:记得是创建项目哦,不是应用。我一开始就搞错了

创建表与方法

  1. 比如你要新建一张数据库表,只需在clouddb云数据库入口文件点击右键,点击new,然后你选择需要创建什么。
    image.png

而我比较喜欢在开发平台创建,比较方便,傻瓜式操作。大家也可以看看官方文档:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-createfirstclouddb-0000001569588629

2.比如你要创建一个云函数方法,也是只需在cloudfuntion云函数入口文件点击右键,点击new,然后你直接创建一个对应的云函数即可。

image.png

开发函数与数据库的使用

由于第一次使用云函数与云数据库,一路上磕磕碰碰。所以我打算将自己经验都分享给大家,希望能帮助大家。

开发云函数

在创建云函数之后,代码结构如下:

image.png

其中有一个ts文件,这个就是我们的函数入口了,其他的我们都暂时不用动。这里我默认的是nodejs开发模式以及http请求模式。如果你们需要修改配置可以看一下官方文档:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-cloud-function-start-from-here-0000001512489692

ts文件里面默认有一个主入口方法:

let myHandler = async function (event, context, callback, logger) {
  // 获取你的参数
  const body = event.body ? JSON.parse(event.body) : event

  // 写你的业务代码

  callback({
      code: 200,
      data: [],
      msg: '提示内容'
  });
};

export { myHandler };
  • myHandler:入口方法名称。
  • event:调用方传递的事件对象,JSON格式。具体内容请参见event对象
  • context:函数运行时上下文对象,封装了日志接口、回调接口、环境变量env对象等。
  • callback:事件处理结果。
  • logger:记录日志。

这里需要注意的是:获取参数的方式,我在本地调试的时候,event就是参数对象了,但是发布到云服务器之后,端侧传递的参数需要通过event.body来判断是否存在,然后将数据JSON化。也不知道是不是我用的不对,但是目前我是遇到这个问题了。

接下来我讲解一下云函数调用云数据库与云存储的相关步骤。详细步骤如下:

云函数使用云数据库

1. 云数据库注册认证

在使用云数据库的所有方法时,都需要先注册认证哈

const path = require('path');
const clouddb = require('@hw-agconnect/database-server/dist/index.js')
const { AGCClient, CredentialParser } = require("@hw-agconnect/common-server");
const db_demo = require('./db/bd_demo') // 从开发者平台下载对应的js配置文件,放在对应的函数目录根目录下

// 加载凭证文件,凭证文件也是在开发者平台下载,具体看我的截图
let client_name = "./db/agc-apiclient-chen.json";
let client_path = path.join(__dirname, client_name);
let credential = CredentialParser.toCredential(client_path);
AGCClient.initialize(credential, "clientCN", "CN");

let myHandler = async function (event, context, callback, logger) {
  // xxxx
};

export { myHandler };

1.1 下载加载对象类型文件
image.png
1.2 将上面下载的文件引入到云函数目录中
image.png
1.3 下载凭证文件
image.png

2. 初始化云数据库实例以及打开存储区

// 接着加载凭证文件的相关代码下
const agcClient = AGCClient.getInstance("clientCN");
clouddb.AGConnectCloudDB.initialize(agcClient);
const agconnectCloudDB = clouddb.AGConnectCloudDB.getInstance(agcClient);
//云数据库区块,获取方法看以下截图
const zoneName = '区块名称';
const cloudDBZoneConfig = new clouddb.CloudDBZoneConfig(zoneName);
const mCloudDBZone = agconnectCloudDB.openCloudDBZone(cloudDBZoneConfig);

2.1 获取区块名称
image.png

3. 使用云数据库的方法

3.1 云数据库-新增数据

需要注意的是:表名称,直接写对应的字符串名称就好

// 上面是注册、加载凭证、打开存储区的代码

let myHandler = async function (event, context, callback, logger) {
  // 获取你的参数
  const body = event.body ? JSON.parse(event.body) : event

  //表名称也是通过开发者平台获取即可,字符串模式
  const bookInfo = clouddb.CloudDBZoneGenericObject.build('表名称')
  // 添加属性对应的数据,按照自己定义的字段格式去赋值
  bookInfo.addFieldValue('字段名称1', '数据')
  bookInfo.addFieldValue('字段名称2', '数据')
  // 同步插入表里
  const resp = await mCloudDBZone.executeUpsert(bookInfo)
  callback({
      code: 200,
      data: [],
      msg: '提示内容'
  });
};

export { myHandler };

3.2 云数据库-更新数据

需要注意的是:要先获取表实例以及定位唯一键

const db_demo = require('./db/bd_demo')
// 上面是注册、加载凭证、打开存储区的代码

let myHandler = async function (event, context, callback, logger) {
  // 获取你的参数
  const body = event.body ? JSON.parse(event.body) : event
  
  // 引入表实例
  const bookInfo = new db_demo.db_demo();
  // 定位唯一键,目的找到对应的数据
  bookInfo.setId('主键数据值') // 主键字段,自己在创建数据库的时候需要自定义主键
  // 注册
  const operator = clouddb.CloudDBZoneObjectOperator.build(bookInfo)
  operator.update('字段名称1', 数据) // 更新对应字段数据
  operator.update('字段名称2', 数据) // 更新对应字段数据
  operator.update('字段名称3', 数据) // 更新对应字段数据
  // ....
  // 更新表里数据
  const resp = await mCloudDBZone.executeUpdate(operator)
  callback({
      code: 200,
      data: [],
      msg: '提示内容'
  });
};

export { myHandler };

3.2 云数据库-查询数据

这里需要注意的是:查询方式有很多,我这边只用到很基础的。想要更多操作可以看一下官网:https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-otheroperations-servernodejs-0000001569466329#section171182910246

const db_demo = require('./db/bd_demo')
// 上面是注册、加载凭证、打开存储区的代码

let myHandler = async function (event, context, callback, logger) {
  // 获取你的参数
  const body = event.body ? JSON.parse(event.body) : event
  
  // 初始化表
  let cloudDBZoneQuery = clouddb.CloudDBZoneQuery.where(db_demo.db_demo)
  // 查询字段名称等于xxx的数据
  const userCloudDBZoneQuery = cloudDBZoneQuery.equalTo('字段名称', 'xxx');
  const respUser = await mCloudDBZone.executeQuery(userCloudDBZoneQuery);
  const data = respUser.getSnapshotObjects()[0] // 获取对应数据
  callback({
      code: 200,
      data: [],
      msg: '提示内容'
  });
};

export { myHandler };

3.3 云数据库-删除数据

删除相关的操作我还没使用过,等我使用之后再补充给大家

云函数使用云存储

1. 云存储注册认证

在使用云存储的所有方法时,也是都需要先注册认证哈

import {AGCClient, CredentialParser} from "@agconnect/common-server"
import {StorageManagement, Bucket, File, AGCCloudStorage} from "@agconnect/cloudstorage-server"

// 加载凭证文件
let client_name = "./db/agc-apiclient-chen.json";
let client_path = path.join(__dirname, client_name);
let credential = CredentialParser.toCredential(client_path);
AGCClient.initialize(credential, "clientDW");

let storage = AGCCloudStorage.getInstance("clientDW");
// name: 存储实例名称,获取方式从开发者平台获取
let bucket = storage.bucket('xxxx');

let myHandler = async function (event, context, callback, logger) {
  // xxxx
};

export { myHandler };

1.1 获取存储实例名称

image.png

2. 使用云存储的方法

2.1 上传文件

需要注意的是:上传文件需要注意destination的文件路径规则。需要上传的文件对应的路径则是本地路径,文件在云函数的根目录下,。后续我也会将怎么通过端侧上传图片到云函数再上传到云存储的相关操作。

// 以上是认证的相关代码

let myHandler = async function (event, context, callback, logger) {
    const options = {
      destination:  'demo/demo.png', // 对应云存储中的文件路径,demo文件夹需要自己在开发者平台创建,文件名称自定义,存在则覆盖不存在则新增
      onUploadProgress: (event) = > {}
    };
    bucket.upload('需要上传的文件路径,例如:./static/demo.png', options);
};

export { myHandler };

2.2 下载文件

// 以上是认证的相关代码

let myHandler = async function (event, context, callback, logger) {
    const remoteFile = bucket.file(‘云存储下的文件具体路径’);
    const localFile = '需要上传的文件路径,例如:./static/demo.png'
    const directory = path.dirname(localFile);
    // 判断本地是否有当前文件,有则创建
    if (!fs.existsSync(directory)) {
      fs.mkdirSync(directory, { recursive: true });
    }
    
    // 下载云存储的文件内容到对应的本地文件
    await remoteFile.createReadStream()
      .on('error', (err) = > {})
      .on('end', () = > {
        // 业务代码
      })
      .pipe(fs.createWriteStream(localFile));
};

export { myHandler };

总结

这次的鸿蒙端云一体化的开发经验就讲解到这里,可能我讲的不是很细,因为也是第一次使用,希望可以帮助大家。如果上面描述的有问题,欢迎大家在评论区指出来,谢谢。后面我们也会分享端侧的开发经验,以及会将对应app上线,到时候有相关技术讨论的都可以找我们

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    60

    文章

    2865

    浏览量

    45398
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    广汽集团参与车路一体化中外车企协同开发测试

    10月16-18日,2025世界智能网联汽车大会在北京举行。大会期间,由国家智能网联汽车创新中心主办的“车路一体化中外车企协同开发测试行动量产应用场景动态演示及试乘体验活动”在北京亦庄成功举办
    的头像 发表于 10-21 17:10 1024次阅读

    解决方案 | 一体化OTA HIL测试解决方案

    TOSUN一体化OTAHIL测试解决方案随着智能网联汽车的快速发展,OTA(Over-the-Air)技术已成为车辆软件升级的核心手段。为满足日益严格的法规要求和技术挑战,同星智能(TOSUN
    的头像 发表于 09-19 20:03 529次阅读
    解决方案 | <b class='flag-5'>云</b>管<b class='flag-5'>端</b><b class='flag-5'>一体化</b>OTA HIL测试解决方案

    一体化解决方案Jama Software,如何支持医疗设备开发中的需求管理、风险管理与验证?

    医疗设备开发中的需求管理太复杂?试试一体化解决方案Jama Connect——支持ISO 1497等关键标准的合规认证、FMEA分析、可追溯性与变更管理等。
    的头像 发表于 06-25 11:36 410次阅读
    <b class='flag-5'>一体化</b>解决方案Jama Software,如何支持医疗设备<b class='flag-5'>开发</b>中的需求管理、风险管理与验证?

    零碳园区建设的突破之路:安科瑞 “一体化解决方案

    零碳园区建设的突破之路:安科瑞 “一体化解决方案 中国园区工业总产值占全国 50%,碳排放量达 31%,零碳转型成为 “双碳” 目标的关键抓手。尽管 20 余省份已出台支持政策,但园区在碳
    的头像 发表于 06-19 16:11 448次阅读
    零碳园区建设的突破之路:安科瑞 “<b class='flag-5'>云</b>边<b class='flag-5'>端</b>” <b class='flag-5'>一体化</b>解决方案

    Vim编辑器的基本操作

    在代码的世界里,效率是永恒的追求。无论是新手开发者还是资深工程师,都渴望拥有款能让自己如虎添翼的编辑器。而在Linux生态中,有款被无数程序员奉为神器、被誉为“效率之王”的
    的头像 发表于 05-06 13:41 992次阅读
    Vim<b class='flag-5'>编辑器</b>的基本操作

    电机群网络管控一体化PLC-SCADA设计及应用

    一体化的PLC-SCADA系统。借助网络和总线实现对电机群传动系统的管理和控制。通过在纺织印染机构多单元电机传动中的应用,实践证明该控制方可靠、有效。纯分享帖,需要者可点击附件获取完整资料~~~*附件
    发表于 04-26 01:15

    DM9270振动一体化温度RS485传感

    振动一体化温度RS485传感
    发表于 04-07 15:53 0次下载

    Linux下Vim编辑器的使用技巧

    【Vim】常用总结⟳ 简介⟳ image 什么是vim?⟳ Linux下两大编辑神器之 vim • Linux/Unix下使用最多的编辑器 • vi的改进版 • 可能是最难上手的编辑器
    的头像 发表于 04-01 17:36 1056次阅读
    Linux下Vim<b class='flag-5'>编辑器</b>的使用技巧

    控智行发布车路一体化智慧高速解决方案

    3月27日,第二十七届中国高速公路信息化大会暨技术产品博览会在山东青岛召开。控智行发布车路一体化智慧高速解决方案及落地实践等创新成果,助力我国交通基础设施数字化转型。
    的头像 发表于 03-28 14:30 1161次阅读

    华为发布一体化网络安全解决方案

    3月20日至21日,以“因聚而生 众智有为”为主题的华为中国合作伙伴大会2025在深圳举行。期间,华为数据通信产品线安全分销领域总监张峰在“华为坤灵直播间”面向中小企业发布一体化
    的头像 发表于 03-21 17:28 1713次阅读

    【McCharts】基于鸿蒙ArkTS语法开发的图表组件--折线图

    编辑器,可以用来自己平时做图或者设计海报之类的。而这次我将使用鸿蒙 ArkTs 来开发这款海报编辑器
    发表于 03-15 15:27

    多省市聚焦车路一体化发展,共绘智能交通产业新蓝图

    多省市聚焦车路一体化发展,共绘智能交通产业新蓝图
    的头像 发表于 02-18 08:49 842次阅读
    多省市聚焦车路<b class='flag-5'>云</b><b class='flag-5'>一体化</b>发展,共绘智能交通产业新蓝图

    如祺出行入选智能网联车路一体化典型案例

    在2024第三届未来交通产业发展峰会上,如祺出行“车路一体化C-V2X车载终端规模化应用项目”入选大会“智能网联车路一体化典型案例”。
    的头像 发表于 01-14 11:43 1079次阅读

    北京车网、雄安数城、雄千数联签署车路一体化业务合作协议

    一体化建设,推进重点领域和重点区域先行示范实施,丰富应用场景,探索创新商业模式,构建丰富产业生态,打造智能网联汽车开发和应用基地,推动车路一体化
    的头像 发表于 01-09 10:22 824次阅读

    华为入选中国网安一体化能力领导者

    近日,中国数字产业第三方权威调研咨询机构数世咨询发布了《网安一体化能力指南》报告(以下简称“报告”)。报告对中国11家具备网安相关解决方案和产品的主流厂商进行了调研,华为凭借在
    的头像 发表于 12-20 15:11 1217次阅读