HarmonyOS元服务开发实战—端云一体化开发

news2024/10/1 1:24:17

还记得我第一次接触arkui还是在22年的9月份,当时arkui还在一个比较初试的阶段。时隔一年再见方舟框架,它已经发生了令人瞩目的变化,不得不说华为方舟框架在更新迭代的速度已经遥遥领先。新的功能和性能优化让这个框架更加强大和灵活,为开发者提供了更多的工具和可能性。让我们一起探索这些激动人心的变化,看看它如何重新定义了移动应用开发的标准。

本文我将从元服务、ArkTS语言以及DevEco Studio开发工具的端云一体化开发和低代码开发等方面来详细撰写本文带大家实战体验学习!

一.再识 DevEco Studio开发工具

下载地址:HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者

在过去的一年里,DevEco Studio经历了一系列的升级和改进。当我再了解它时,我发现DevEco Studio更新了俩个十分惊艳的功能——端云一体化开发和低代码开发功能。

1.1 HarmonyOS低代码开发

HarmonyOS低代码,有丰富的UI界面编辑功能,例如基于图形化的自由拖拽、数据的参数化配置等,通过可视化界面开发方式快速构建布局,可有效降低用户的时间成本和提升用户构建UI界面的效率。(注:DevEco Studio V2.2 Beta1及更高版本中支持)我们来一起体验一下:

1.没有安装DevEco Studio的用户,需要去官网安装一下DevEco Studio。

2.创建一个新的项目如下:

image-20230926220218120

3.启用超级视觉(低代码开发)如下,名称需要英文即可创建项目,我这里用了我的CSDN(一见已难忘)名作为演示。

image-20230926220418009

4.等待项目成功创建,下载安装必要依赖,成功创建项目如下:

image-20230926221026541

我们观察上部的index.ets,他的代码现在是这样的:

@Entry
@Component
struct Index {

  @State message: string = '这里是一见已难忘低代码'

  /**
   * In low-code mode, do not add anything to the build function, as it will be
   * overwritten by the content generated by the .visual file in the build phase.
   */
  build() {

  }
}

5.然后我们对其继续一个可视化的拖拽组件:很容易就完成了一个简单的页面。

image-20230926222027872

6.点击生成我们这个页面的代码:

image-20230926222137517

7.然后我们就得到了这个页面的样式代码了,是不是很简单快捷。

@Entry
@Component
struct Index {
 
  @State message: string = '这里是一见已难忘低代码'

  build() {
    Column() {
      Image("")
      Column() {
        Button("这是一个按钮")
          .width("180vp")
          .height("80vp")
          .offset({ x: "4.35vp", y: "438.04vp" })
          .opacity(0.92)
          .enabled(true)
        Text(`${this.message}`)
          .width("300vp")
          .height("60vp")
          .offset({ x: "-6.39vp", y: "252.76vp" })
          .textAlign(TextAlign.Center)
          .fontSize("25fp")
          .fontWeight(FontWeight.Bold)
        DatePicker()
          .width("200vp")
          .height("200vp")
          .offset({ x: "10.1vp", y: "-14.97vp" })
      }      
      .width("100%")
      .height("100%")
      .offset({ x: "0vp", y: "11.95vp" })
      .justifyContent(FlexAlign.Center)
    }    
    .width("100%")
    .height("100%")
  }
}

1.2 HarmonyOS端云一体化开发

端云一体化开发是DevEco Studio的一个新特性,它允许开发者在本地和云端之间无缝地开发和调试应用程序。通过端云一体化开发,开发者可以更加高效地使用云计算资源,同时也可以在本地快速测试和调试代码。让我们一起体验一下端云一体化开发的魅力。

端云一体化开发基本流程如下:

创建云函数->调试云函数->云函数与应用程序的通信

1.创建云函数:在DevEco Studio中,开发者可以轻松地创建和管理云函数。云函数是一段运行在云端的代码,它可以与应用程序进行通信,执行一些需要在云端完成的任务。通过创建云函数,开发者可以利用云计算的强大能力,同时也可以在本地快速测试和调试代码。

2.调试云函数:在DevEco Studio中,开发者可以使用调试器来调试云函数。调试器允许开发者在本地模拟云函数的运行环境,并在代码中加入断点来进行调试。这使得开发者可以更加轻松地发现和解决问题,提高了开发效率。

3.云函数与应用程序的通信:在端云一体化开发中,云函数与应用程序之间的通信是非常重要的。DevEco Studio提供了一些工具来帮助开发者实现这种通信。例如,开发者可以使用HTTP或WebSocket协议来与云函数进行通信,也可以使用华为提供的云服务SDK来进行更高级的通信操作。这些工具使得开发者可以更加轻松地实现云函数与应用程序之间的交互,提高了开发效率。

端云一体化开发相比大家在学习生涯中都有听说,下面就是 HarmonyOS端云一体化开发相比传统开发的优势,大家对比观看就可以发现其优势巨大。集成端云一体化组件后,进行简单配置即可向应用用户提供登录、支付等多种功能。

image-20231007011434907

下面我们就来一起体验一下端云一体化开发吧。

1.我们到DevEco Studio 创建一个新的工程,点击Template Market ,里面有很多的云端模板,我们下载一个到本地环境里使用。

image-20231007011832764

2.填写配置工程的基本信息如下:

image-20231007012225728

3.我们点击下一步,但是由于我们是第一次接触,我们必然是没有对应的云端的对应配置内容。我们需要到官网注册配置。

官网地址:AppGallery Connect (huawei.com)

image-20231007012435318

4.创建项目名称为:Harmony-myapplication(这是我的案例名称,按照华为包命名规范自行起名即可)。

配置数据处理位置等相关配置好之后,点击开通即可。

image-20231007012650675

5.创建应用

填写对应的参数要求,并且添加到刚刚创建的项目中去。

image-20231007013415889

完成上面该有的配置之后,我们再返回到 DevEco Studio,就可以看到我们刚刚创建的。

image-20231007014019143

点击finsh之后我们创建项目,耐心等待配置和自动下载所需资源包即可。

6.我们的设置SDK也是无需手动配置的,我们的云端一体化创建会帮我们自动的创建好所需的文件和配置,为我们节省了大量的步骤,这里要给我们的系统点一个赞。

image-20231007014221737

7.我们现在在previewer里就可以看到我们最新的代码样式了。如下图所示:

image-20231007014527039

1.2.1 登录组件集成使用

集成端云一体化组件后,只需进行简单配置即可向应用用户提供登录、支付等众多功能。这是我们的端云一体化开发模式的一大特点:

1.首先要保证我们项目里的oh-package.json5里有登录的依赖:

"@ohos/agconnect-auth-component": "^1.0.5"

image-20231007015538124

2.引入组件方法(在页面顶部引入)

import {Login, AuthMode} from "@ohos/agconnect-auth-component";

代码如下:

import Logger from '@ohos.hilog';
import { GoodsList, SearchContainer } from '../../components';
import { GoodModel } from '../../model';
import { Request, RequestType, Triggers } from '../../api';
import { domain, searchText, Constants } from '../../constants';
import {Login, AuthMode} from "@ohos/agconnect-auth-component";
const TAG = new String($r('app.string.Home')).toString();

@Component
export struct Home {
  @State recommendHint: string = searchText;
  @State searchInput: string = '';
  @Link token: string;
  @Link @Watch("onSearchChanged") isSearching: boolean;
  @State searchResult: Array<GoodModel> = [];
  private controller: SearchController = new SearchController();

  onSearchChanged() {
    Logger.info(domain, TAG, "search state changed " + this.isSearching);
  }

  async getSearchResult(keyword) {
    let params = {
      "keyword": keyword
    };

    let res = await Request.invokeWithToken(Triggers.Commodity, this.token, RequestType.Search, params);
    //展示搜索列表
    this.isSearching = true;
    this.searchResult = res;
  }

  build() {
    Column() {
      Login({
        modes: [AuthMode.PASSWORD, AuthMode.PHONE_VERIFY_CODE, AuthMode.MAIL_VERIFY_CODE],
        onSuccess: (user) => {
          AlertDialog.show({
            title: 'authInfo',
            message: JSON.stringify(user)
          })
        }
      }){
        Text('Login').decoration({ type: TextDecorationType.Underline });
      }
    }
    .backgroundColor($r('app.color.page_background'))
  }
}

换成按钮可能会好一点:

Button('Login').fontColor(Color.White);

渲染页面如下:

image-20231007020043199

集成组件代码另附如下:

Column() {
        Login({
          modes: [AuthMode.PASSWORD, AuthMode.PHONE_VERIFY_CODE, AuthMode.MAIL_VERIFY_CODE],
          onSuccess: (user) => {
            AlertDialog.show({
              title: 'authInfo',
              message: JSON.stringify(user)
            })
          }
        }){
          Text('Login').decoration({ type: TextDecorationType.Underline });
        }
}

1.2.2 登录组件效果展示

我们在完成上文几处简单的代码配置调用后,就完成了我们的登录组件的撰写,效果还是非常不错的,效果如下:

image-20231007020329811

image-20231007020338197

image-20231007020348688

image-20231007020400295

image-20231007020410756

只有我们实际的操作下来才能感受到他的便利,虽然现在的组件还比较少,但是随着我们框架遥遥领先的迭代速度,我相信在不就的将来,组件库会越来越丰富,到了那个时候鸿蒙开发者的开发应用效率会大幅度的提高。

2.1 探索ArkTS语言的新特性

ArkTS语言也得到了许多更新和改进,它的变化可以说是改头换面的更新,还记得一年前我初始ets(之前ArkTS叫ets)还十分的笨重,很多地方都不完善,相比其他语言(TS,JS)相比会出现很多意想不到的bug,让人摸不着头脑。但是经过一年的迭代更新,其功能现在已经十分强大。让开发者能够更高效地编写和开发应用程序。

比如说:

  • 类型推导和类型检查:ArkTS语言现在支持更加智能的类型推导和类型检查。开发者可以更加轻松地编写类型安全的代码,而无需显式地指定每个变量的类型。此外,ArkTS还提供了更加严格的类型检查,以确保开发者在编写代码时遵循正确的类型规则。
  • 异步编程:ArkTS语言现在支持更加灵活的异步编程模型。开发者可以使用async/await语法来编写异步代码,使代码更加简洁和易于理解。此外,ArkTS还提供了一些新的异步函数和操作符,使开发者能够更轻松地处理异步任务。
  • 模块化编程:ArkTS语言现在支持更加模块化的编程模型。开发者可以将代码划分为多个模块,每个模块都具有独立的作用域和命名空间。这使得代码更加清晰和易于维护,同时也方便了开发者之间的协作。

在使用ArkTS语言开发应用时,状态管理是一个重要的概念。状态管理是指管理应用中的各种状态,包括组件状态、全局状态等。状态管理可以帮助开发者更好地组织和管理应用中的数据,使得应用更加稳定和高效。

ArkTS提供了多维度的状态管理机制,可以在ArkUI开发框架中使用。和UI相关联的数据,不仅可以在组件内使用,还可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,也可以是应用全局范围内的传递。

2.1.2 ArkTS开发Demo实战:在线状态切换

1.引入组件:

const TAG = new String($r('app.string.Home')).toString();

2.这是一个装饰器,用于标记这个结构(struct)作为一个ArkTS组件。@Link 装饰器用于定义组件的链接属性。在这里,token 是一个字符串类型的链接属性是从外部传入的令牌值。每次点击就会切换boolean的值。

import Logger from '@ohos.hilog';
import { GoodsList, SearchContainer } from '../../components';
import { GoodModel } from '../../model';
import { Request, RequestType, Triggers } from '../../api';
import { domain, searchText, Constants } from '../../constants';
import {Login, AuthMode} from "@ohos/agconnect-auth-component";
const TAG = new String($r('app.string.Home')).toString();

@Component
export struct Home {
  @State isSearching: boolean = false;
  @Link token: string;

  build() {
    Column() {
      Button('一见已难忘:点击切换状态')
        .fontColor(Color.White)
        .onClick(() => {
          this.isSearching = !this.isSearching;
        });

      Text(`现在的状态: ${this.isSearching ? '上线' : '下线'}`)
        .fontSize(18)
        .margin(20);

      // Text(`Token: ${this.token || 'N/A'}`)
      //   .fontSize(18)
      //   .margin(20);
    }
    .backgroundColor($r('app.color.page_background'))
  }
}

onClick的作用是切换 isSearching 属性。

效果展示:

image-20231007025710223

点击一见已难忘:点击切换状态 按钮在线状态转换,效果如下:

image-20231007025750280

2.1.3 ArkTS开发Demo实战:粉丝计数器实现

粉丝计数器实现的实现非常简单,我们需要先引入依赖:

const TAG = new String($r('app.string.Home')).toString();

设定变量:

  @State clickCount: number = 0;
  @Link isSearching: boolean;
  @Link token: string;

具体实现代码如下:

import Logger from '@ohos.hilog';
import { GoodsList, SearchContainer } from '../../components';
import { GoodModel } from '../../model';
import { Request, RequestType, Triggers } from '../../api';
import { domain, searchText, Constants } from '../../constants';
import {Login, AuthMode} from "@ohos/agconnect-auth-component";
const TAG = new String($r('app.string.Home')).toString();

@Component
export struct Home {
  @State clickCount: number = 0;
  @Link isSearching: boolean;
  @Link token: string;

  build() {
    Column() {
      Text(`一见已难忘计数器Demo`)
        .fontSize(18)
        .margin(20);

      Button('增加一个粉丝')
        .fontColor(Color.White)
        .onClick(() => {
          this.clickCount++;
        });

      Button('减少一个粉丝')
        .fontColor(Color.White)
        .onClick(() => {
          this.clickCount--;
        });

      Text(`目前的粉丝量: ${this.clickCount}`)
        .fontSize(18)
        .margin(20);
    }
    .backgroundColor($r('app.color.page_background'))
  }
}

上述代码解释:

  • @State clickCount: number = 0;: 这是一个带有状态的属性,表示点击计数器的值,初始值为 0
  • @Link isSearching: boolean;: 这是一个链接属性,用于跟踪用户是否正在进行搜索操作,它的类型为布尔值。
  • @Link token: string;: 这是另一个链接属性,用于存储某种令牌或身份验证凭据,它的类型为字符串。
  • build() {...}: 这是一个构建方法,用于创建用户界面元素。它包括一个 Column,其中包含一些文本标签和按钮,用于增加或减少点击计数器的值,并显示当前计数器的值。
  • Text(一见已难忘计数器Demo): 这是一个文本元素,显示一个标题。
  • Button('增加一个粉丝')Button('减少一个粉丝'): 这是两个按钮元素,分别用于增加和减少点击计数器的值。这些按钮具有点击事件处理程序,点击按钮时会更新 clickCount 属性的值。
  • Text(目前的粉丝量: ${this.clickCount}): 这是另一个文本元素,用于显示当前点击计数器的值。

效果展示:

image-20231007030455256

我们点击增加一个粉丝10次:

image-20231007030526011

我们点击增加一个减少粉丝5次:

image-20231007030554521

2.1.4 ArkTS开发Demo实战:待办事项列表

实例代码如下:

主页面:

import { ToItem } from './ToItem'
@Entry
@Component
struct Index {

  totalTasks: Array<string> = [
    "CSDN写文章",
    "完成今日开发任务",
    "撰写工作日报",
    "学习ArkTs",
    "放松休息"
  ]

  build() {
    Row() {
      Column() {
        Text('一见已难忘的待办')
          .fontSize(28)
          .fontWeight(FontWeight.Bold)
          .margin({
            top:30,
            bottom: 20
          })
          .width("80%")
        ForEach(this.totalTasks, (item) => {
          ToItem({content: item})
        })

      }
      .height("100%")
      .width("100%")

      .backgroundColor("#efefef")
    }
    .justifyContent(FlexAlign.End)

  }
}

上述代码解释:

  • totalTasks: Array<string> = [...]: 这是一个名为 totalTasks 的数组,包含了一组字符串,每个字符串代表一个待办事项的文本内容。
  • build() {...}: 这是一个构建方法,用于创建主页面的用户界面元素。它包括一个 Row,其中包含一个 Column,在 Column 中,首先有一个文本标题(“一见已难忘的待办”),然后使用 ForEach 循环迭代 totalTasks 数组,并为每个待办事项创建一个 ToItem 组件,并传递相应的内容。
    • Text('一见已难忘的待办'): 这是一个文本元素,显示在页面的顶部,可能是一个标题。
    • ForEach(this.totalTasks, (item) => { ToItem({content: item}) }): 这个循环迭代 totalTasks 数组中的每个元素,对于每个元素,它创建了一个 ToItem 组件,并将待办事项的内容传递给组件。

这段代码定义了一个主页面(Index 组件),该页面包含一个标题和一组待办事项,每个待办事项都由 ToItem 组件表示。

ToItem页面:

@Component
export struct  ToItem{
  private content:string;
  @State isComplete: boolean = false;

  @Builder labelIcon(icon) {
    Image(icon)
      .width(20)

  }


  build(){
    Row(){
      if(this.isComplete){
        // this.labelIcon($r('app.media.radio_on'))
      }else {
        // this.labelIcon($r('app.media.radio_off'))
      }
      Text(this.content)
        .fontSize(20)
        .margin({left:15})
        .opacity(this.isComplete ? 0.4 : 1)
        .decoration({type: this.isComplete ? TextDecorationType.Overline : TextDecorationType.None})
    }
    .backgroundColor("#fff")
    .borderRadius(24)
    .padding(25)
    .margin(10)
    .width("93%")
    .onClick(() => {
      this.isComplete = !this.isComplete
    })
  }
}

上述代码解释:

  • private content: string;: 这是一个私有属性,用于存储待办事项的文本内容。
  • @State isComplete: boolean = false;: 这是一个带有状态的属性,表示待办事项是否已完成。初始值为 false,但可以通过用户交互改变。
  • @Builder labelIcon(icon) {...}: 这是一个构建器方法,根据传入的 icon 参数构建一个图像,并应用一些属性,设置图像的宽度。
  • build() {...}: 这是一个构建方法,用于创建待办事项的用户界面元素。它包括一个 Row,其中包含一个图标(具体图标取决于 isComplete 的值)和文本内容。这个方法还设置了一些样式属性,例如背景颜色、圆角、边距、宽度,并添加了点击事件处理程序,以在用户单击时切换 isComplete 的值。

这段代码定义了一个用户界面组件,用于显示待办事项的文本和一个可点击的图标,用户可以单击以标记待办事项是否已完成。

效果展示:

image-20231007033817858

点击事件后效果如下:(点击完成的事件置灰表示事件已完成)

image-20231007033842363

3.1 深度体验元服务轻量化、信息外显

3.1.1什么是HarmonyOS元服务?

首先,让我们明确一下HarmonyOS元服务的概念。元服务是一种基于HarmonyOS API的全新服务提供方式,它以鸿蒙万能卡片等多种呈现形态,向用户提供更轻量化的服务。这一概念的核心在于将服务提供的方式变得更加灵活和适应性更强,同时为开发者和用户提供了更好的体验。

3.1.2 Hello World 入门案例

1.在创建之前,我们需要保证自己的应用里有元服务的应用,如没有需要自己进行创建。

image-20231007035203315

2.创建一个元服务项目,如下所示:后续的页面选择arkts,继续创建项目。

image-20231007035445420

3.进入项目如下图所示。

image-20231007040309267

到这里我们需要安装真机,具体步骤较为简单,只需要下载安装即可,可以自行查看网络教程。配置好如下图:

image-20231007040734903

调试运行:菜单选择“File > Project Structure”,选择“Signing Configs”,勾选“Automatically generate signatue”。如果未登录,先点击“Sign In”进行登录。

image-20231007040846031

基本的配置完毕之后,我们点击右上的运行按钮,运行结果如下图:

image-20231007040628490

3.1.3 元服务实战:在线状态切换

在线状态切换代码如下:

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State isSearching: boolean = false;
  build() {
    Row() {

      Column() {
        Button('一见已难忘:点击切换状态')
          .fontColor(Color.White)
          .onClick(() => {
            this.isSearching = !this.isSearching;
          });

        Text(`现在的状态: ${this.isSearching ? '上线' : '下线'}`)
          .fontSize(18)
          .margin(20);
      }
      .width('100%')
    }
    .height('100%')
  }
}

运行到真机如下:

image-20231007042338830

点击状态切换:

image-20231007042422215

3.1.4 元服务实战:粉丝计数器实现

元服务实战:粉丝计数器实现代码实现如下:

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  @State isSearching: boolean = false;
  @State clickCount: number = 0;
  build() {
    Row() {

      Column() {
        Text(`一见已难忘计数器Demo`)
          .fontSize(18)
          .margin(20);

        Button('增加一个粉丝')
          .fontColor(Color.White)
          .onClick(() => {
            this.clickCount++;
          });

        Button('减少一个粉丝')
          .fontColor(Color.White)
          .onClick(() => {
            this.clickCount--;
          });

        Text(`目前的粉丝量: ${this.clickCount}`)
          .fontSize(18)
          .margin(20);
      


      }
      .width('100%')
    }
    .height('100%')
  }
}

运行到真机如下:

初始粉丝数为0,点击6次增加粉丝数效果如下:

image-20231007042657181

点击3次减少粉丝数效果如下:

image-20231007042742869

3.1.5 元服务实战:待办事项列表

元服务实战待办事项列表代码如下:

import { ToItem } from './ToItem'
@Entry
@Component
struct Index {

  totalTasks: Array<string> = [
    "CSDN写文章",
    "完成今日开发任务",
    "撰写工作日报",
    "学习ArkTs",
    "放松休息"
  ]

  build() {
    Row() {
      Column() {
        Text('一见已难忘的待办')
          .fontSize(28)
          .fontWeight(FontWeight.Bold)
          .margin({
            top:30,
            bottom: 20
          })
          .width("80%")
        ForEach(this.totalTasks, (item) => {
          ToItem({content: item})
        })

      }
      .height("100%")
      .width("100%")

      .backgroundColor("#efefef")
    }
    .justifyContent(FlexAlign.End)
  }
}

ToItem实例代码如下:

@Component
export struct  ToItem{
  private content:string;
  @State isComplete: boolean = false;

  @Builder labelIcon(icon) {
    Image(icon)
      .width(20)

  }


  build(){
    Row(){
      if(this.isComplete){
        // this.labelIcon($r('app.media.radio_on'))
      }else {
        // this.labelIcon($r('app.media.radio_off'))
      }
      Text(this.content)
        .fontSize(20)
        .margin({left:15})
        .opacity(this.isComplete ? 0.4 : 1)
        .decoration({type: this.isComplete ? TextDecorationType.Overline : TextDecorationType.None})
    }
    .backgroundColor("#fff")
    .borderRadius(24)
    .padding(25)
    .margin(10)
    .width("93%")
    .onClick(() => {
      this.isComplete = !this.isComplete
    })
  }
}

运行到真机如下:

image-20231007043149631

点击效果如下:

image-20231007043214606

4.1 总结

我是在2021年10月份第一次接触到ArkUI,时隔一年,感触颇深,本文侧重的撰写了元服务,ArkTS语言,DevEco Studio开发工具等在这一年中的巨大更新和迭代的功能深度体验。

  1. 元服务:这是HarmonyOS提供的一种新型服务模式,它以鸿蒙万能卡片等多种形态呈现,更加轻量化,便于向用户提供服务。
  2. ArkTS语言:华为自主研发的一种开发语言,基于TypeScript并与之匹配的ArkUI框架,扩展了声明式UI和状态管理等功能,使开发者能够更简洁、更自然地开发跨端应用。
  3. DevEco Studio开发工具:该工具支持端云一体化开发和低代码开发。在创建工程时选择云开发模板,可以在DevEco Studio内同时完成HarmonyOS应用/服务的端侧与云侧开发,实现端云一体化协同开发。此外,它还支持低代码开发,具有丰富的UI界面编辑功能,如基于图形化的自由拖拽和数据参数化配置等,遵循HarmonyOS JS开发规范,通过可视化界面开发方式快速构建布局,有效降低用户的时间成本并提升构建UI界面的效率。

在本文,我们深入探讨了HarmonyOS元服务、ArkTS语言和DevEco Studio开发工具。通过这些工具的应用,华为为开发者提供了更便捷、高效的开发体验,为用户提供了更丰富、高质量的应用程序。

HarmonyOS元服务不仅是华为技术的创新,也是整个科技行业的一大进步。它代表了未来智能生活的可能性,使得设备之间的互联变得更加便捷和灵活。这一技术也鼓励了更多的开发者加入到鸿蒙生态系统中,共同构建一个繁荣的生态系统。

华为技术有着遥遥领先的迭代速度和庞大的用户量,我相信HarmonyOS将会发展的越来越快,让我们一起加入,成为一名HarmonyOS开发者吧。无论是开发者还是普通用户,都将受益于这一创新浪潮,走向更加智能化的明天。让我们一起期待并迎接这个美好的未来!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【实用】PPT没几页内存很大怎么解决

PPT页数很少但导出内存很大解决方法 1.打开ppt点击左上角 “文件”—“选项” 2.对话框选择 “常规与保存” &#xff08;1&#xff09;如果想要文件特别小时可 取消勾选 “将字体嵌入文件” &#xff08;2&#xff09;文件大小适中 可选择第一个选项 “仅最入文档中所用的字…

【SpringBoot篇】Spring_Task定时任务框架

文章目录 &#x1f339;概述&#x1f33a;应用场景&#x1f384;cron表达式&#x1f6f8;入门案例&#x1f38d;实际应用 &#x1f339;概述 Spring Task 是 Spring 框架提供的一种任务调度和异步处理的解决方案。可以按照约定的时间自动执行某个代码逻辑它可以帮助开发者在 S…

腾讯云 小程序 SDK对象存储 COS使用记录,原生小程序写法。

最近做了一个项目&#xff0c;需求是上传文档&#xff0c;文档类型多种&#xff0c;图片&#xff0c;视频&#xff0c;文件&#xff0c;doc,xls,zip,txt 等等,而且文档类型可能是大文件&#xff0c;可能得上百兆&#xff0c;甚至超过1G。 腾讯云文档地址&#xff1a;https://c…

Altium Designer学习笔记11

画一个LED的封装&#xff1a; 使用这个SMD5050的封装。 我们先看下这个芯片的功能说明&#xff1a; 5050贴片式发光二极管&#xff1a; XL-5050 是单线传输的三通道LED驱动控制芯片&#xff0c;采用的是单极性归零码协议。 数据再生模块的功能&#xff0c;自动将级联输出的数…

BootStrap【表格二、基础表单、被支持的控件、表单状态】(二)-全面详解(学习总结---从入门到深化)

目录 表格二 表单_基础表单 表单_被支持的控件 表单_表单状态 表格二 紧缩表格 通过添加 .table-condensed 类可以让表格更加紧凑&#xff0c;单元格中的内补&#xff08;padding&#xff09;均会减半 <table class"table table-condensed table-bordered"…

信创系列之大数据,分布式数据库产业链跟踪梳理笔记…

并购优塾 投行界的大叔&#xff0c;大叔界的投行 【产业链地图&#xff0c;版权、内容与免责声明】1&#xff09;版权&#xff1a;版权所有&#xff0c;违者必究&#xff0c;未经许可不得翻版、摘编、拷贝、复制、传播。2&#xff09;尊重原创&#xff1a;如有引用未标注来源…

数据结构与算法编程题15

设计一个算法&#xff0c;通过遍历一趟&#xff0c;将链表中所有结点的链接方向逆转&#xff0c;仍利用原表的存储空间。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; …

Cypress-浏览器操作篇

Cypress-浏览器操作篇 页面的前进与后退 后退 cy.go(back); cy.go(-1);前进 cy.go(forward); cy.go(1);页面刷新 cy.reload() cy.reload(forceReload) cy.reload(options) cy.reload(forceReload, options)**options&#xff1a;**只有 timeout 和 log forceReload 是否…

普通平衡树

题意&#xff1a;略&#xff0c;题中较清晰。 用二叉查找树来存储数据&#xff0c;为了增加效率&#xff0c;尽量使左子树和右子树的深度差不超过一&#xff0c;这样可以时间控制在logn&#xff0c;效率比较高。 右旋和左旋&#xff0c;目的是为了维护二叉树的操作&#xff0…

NX二次开发UF_CSYS_ask_matrix_of_object 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_matrix_of_object Defined in: uf_csys.h int UF_CSYS_ask_matrix_of_object(tag_t object_id, tag_t * matrix_id ) overview 概述 Gets the matrix identifier atta…

Sealos 云操作系统私有化部署教程

Sealos 私有云已经正式发布了&#xff0c;它为企业用云提供了一种革命性的新方案。Sealos 的核心优势在于&#xff0c;它允许企业在自己的机房中一键构建一个功能与 Sealos 公有云完全相同的私有云。这意味着企业可以在自己的控制和安全范围内&#xff0c;享受到公有云所提供的…

Web前端—移动Web第五天(媒体查询、Bootstrap、综合案例-alloyTeam)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第五天01-媒体查询基本写法书写顺序案例-左侧隐藏媒体查询-完整写法关键词 / 逻辑操作符媒体类型媒体特性 媒体查询-外部CSS 02-Bootstrap简介使用步骤下载使用 栅格系统全局…

数据库|TiDB v7.1.0 资源管控功能是如何降低运维难度和成本

目录 一、前言 二、资源管控流程图 三、资源管控(Resource Control)测试 &#xff08;一&#xff09;测试集群环境 &#xff08;二&#xff09;Request Unit(RU)概念 &#xff08;三&#xff09;资源管控参数 &#xff08;四&#xff09;评估实际负载所需容量 &#xff…

vue项目引入element-plus

文章目录 引入框架遇到的问题引入的时候&#xff0c;报错 ...(reading replace)...报错&#xff1a;The template root requires ...eslint报错&#xff1a; 运行 引入框架 使用add引入 遇到的问题 引入的时候&#xff0c;报错 …(reading ‘replace’)… Cannot read prop…

Navicat 技术指引 | 适用于 GaussDB 的数据迁移工具

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

git本地账户如何从一台电脑迁移到另外一台

为了表述方便&#xff0c;我们此处用旧电脑、新电脑指代。 在新电脑上安装git 例如&#xff0c;我旧电脑上安装的git版本是2.33.1版本&#xff0c;新电脑安装git的版本是2.43.0&#xff0c;这不妨碍迁移。 将git的全局配置文件从旧电脑拷贝到新电脑 Git的全局配置文件&…

el-table表格排序(需要后端判别),el-table导出功能(向后端发送请求)

&#xff08;1&#xff09;表格排序 &#xff08;2&#xff09;简单的table导出功能&#xff08;需要后台支撑&#xff09;必须要有iframe &#xff08;3&#xff09;页面所有代码&#xff1a; <template><div class"mainContainer"><el-form:model&…

Selenium安装WebDriver最新Chrome驱动(114以后的版本)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

都被“锟斤拷”毒害过,那么究竟是为什么会出现这些奇怪的字符?

不管是在工作中还是生活中&#xff0c;都被“锟斤拷”毒害过&#xff0c;比如这样&#xff1a; 或者这样&#xff1a; 还有这样&#xff1a; 那么究竟是为什么会出现这些奇怪的字符&#xff1f; ASCII编码 在计算机底层都是用0和1进行存储的&#xff0c;ASCII编码将所有的字母…

oracle数据库巡检常见脚本-系列二

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…