鸿蒙一次开发,多端部署(十四)一多开发实例(短信)

本章从系统预置的应用中,选择短信应用作为典型的案例,从页面开发和工程结构的角度,介绍"一多"的具体实践。系统的产品形态在不断丰富中,当前主要有默认设备和平板两种产品形态,本章的具体实践也将围绕这两种产品形态展开。

概览

短信是系统中预置的应用,主要包含信息查看、发送短信、接收短信、短信送达报告、删除短信等功能。在不同类型设备上,短信应用的功能完全相同,故短信应用适合使用 部署模型A (即:不同类型的设备上安装运行相同的HAP或HAP组合)。

本案例中,在会话详情页面利用 方舟开发框架 提供的“一多”能力,用一套代码同时适配默认设备和平板。

工程结构

短信应用的工程结构如下图所示,当前该应用的功能较少,所以直接使用了DevEco Studio创建出的默认工程结构。具体采用何种形式的工程结构,并不影响应用的开发。但是使用推荐的工程结构,目录结构更清晰,拓展性也更好。

短信应用UI相关的逻辑集中在views和pages两个目录,分别存放公共组件及页面。当前短信应用主要包含如下页面:

  • 信息列表页面:首页,展示信息列表。
  • 通知信息列表页面:将通知类信息集中在一起展示,与信息列表页面类似。
  • 会话详情页面:展示与某联系人的所有信息往来。
  • 报告详情页面:信息发送报告的详情页面。
  • 设置页面:消息设置页面,如是否展示送达报告等。
/Mms/├── doc                                        # 资料├── entry│   └── src│       └── main│           ├── resources                      # 资源配置文件存放目录│           ├── config.json                    # 全局配置文件│           └── ets                            # ets代码目录│               ├── ServiceAbility             # 后台常驻服务│               └── default                    # 业务代码目录│                   ├── data                   # 自定义数据类型│                   ├── model                  # 对接数据库│                   ├── pages                  # 所有页面│                   │   ├── conversation       # 会话详情页面│                   │   ├── conversationlist   # 信息列表页面│                   │   ├── index              # 初始页面│                   │   ├── info_msg           # 通知信息列表页面│                   │   ├── query_report       # 报告详情页面│                   │   └── settings           # 设置页面│                   ├── service                # 业务逻辑│                   ├── utils                  # 工具类│                   ├── views                  # 自定义组件│                   └── app.ets                # 应用生命周期├── signs                                      # 签名└── LICENSE

短信应用在开发阶段,采用了一层工程结构。由于功能较为简单,所以并没有规划共用的feature和common目录,仅采用了一层product目录。

  • 业务形态层(product) 该目录采用IDE工程默认创建的entry目录,开发者可根据需要在创建Module时自行更改该目录名。不同产品形态,编译出相同的短信HAP。

会话详情页面

页面结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

会话详情页面在默认设备和平板上的样式如上图所示,会话详情页面可以划分为三个部分:

接下来我们详细介绍各部分的实现。

说明: 为了方便理解,我们对会话详情页面做了一定的精简,本小节仅介绍会话详情页面最基础的实现。

顶部标题栏

顶部标题栏是一个简单的行布局,包含返回图标、联系人头像、联系人姓名和号码、拨号图标、设置图标共5个元素。其中,联系人姓名和号码以列布局的形式放在一起。

在默认设备和平板上,顶部标题栏的组件结构是相同的,仅联系人姓名和号码与拨号图标的间距不同。回顾方舟开发框架一多能力介绍,这个场景可以借助Blank组件使用拉伸能力。

我们先实现联系人姓名和号码,用Flex组件作为父容器,其包含两个Text子组件,分别用于存放联系人姓名和号码。Flex组件的属性设置如下:

  • direction: FlexDirection.Column:子组件在Flex容器上以列的方式排布,即主轴是垂直方向。

  • justifyContent: FlexAlign.Center:子组件在Flex容器主轴(垂直方向)上居中对齐。

  • alignItems: ItemAlign.Start:子组件在Flex容器交叉轴(水平方向)上首部对齐。

可以查看 Flex组件 及 Text组件 了解这两个组件各个属性的含义及详细用法。

@Componentstruct TopArea {build() {Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center,alignItems: ItemAlign.Start}) {Text('张三').fontSize(16).fontColor("#182431")Text('+123 4567 8901').fontSize(14).fontColor("#66182431")}}}

接下来我们通过width属性和height属性设置四个图标的宽高(详见 尺寸设置 ,并将它们与联系人姓名和电话以及Blank组件一起放到Flex父容器中。为了便于查看效果,对顶部标题栏设置了淡蓝色的背景色。

@Componentstruct TopArea {build() {Flex({ alignItems: ItemAlign.Center }) {Image($r('app.media.back')).width(24).height(24)Image($r('app.media.contact')).width(40).height(40)Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center,alignItems: ItemAlign.Start}) {Text('张三').fontSize(16).fontColor("#182431")Text('+123 4567 8901').fontSize(14).fontColor("#66182431")}Blank()                  // 拉伸能力Image($r("app.media.phone")).width(24).height(24)Image($r('app.media.dots')).width(24).height(24)}.width('100%').height(56).backgroundColor('#87CEFA')  // 顶部标题栏背景色,仅用于开发测试}}

当前标题栏中子组件的布局同预期还有些差异,接下来通过margin属性,设置各个元素的左右间距(详见 尺寸设置 )。如下图所示,最终顶部工具栏在默认设备和平板上都可以达到预期显示效果。

@Componentstruct TopArea {build() {Flex({ alignItems: ItemAlign.Center }) {Image($r('app.media.back')).width(24).height(24).margin({ left:24 })             // 设置间距Image($r('app.media.contact')).width(40).height(40).margin({ left:16, right:16 })  // 设置间距Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center,alignItems: ItemAlign.Start}) {Text('张三').fontSize(16).fontColor("#182431")Text('+123 4567 8901').fontSize(14).fontColor("#66182431")}Blank()Image($r("app.media.phone")).width(24).height(24)Image($r('app.media.dots')).width(24).height(24).margin({ left:16, right:24 })  // 设置间距}.width('100%').height(56).backgroundColor('#87CEFA')           // 顶部标题栏背景色,仅用于开发测试}}

底部输入栏

有了顶部工具栏的开发经验,可以发现底部输入栏的结构更为简单,它同样以Flex组件作为父容器,同时包含文本输入框(请访问 文本输入组件 查看详细介绍)和消息发送图标两个子节点。

为了便于查看的效果,我们同样给底部输入栏设置了淡蓝色到背景色。注意这里有一个特殊的地方,我们给TextArea设置了flexGrow(1)属性。flexGrow属性仅在父组件是Flex组件时生效,表示Flex容器的剩余空间分配给此属性所在的组件的比例,flexGrow(1)表示父容器的剩余空间全部分配给此组件,详见Flex布局。

@Componentstruct BottomArea {build() {Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {TextArea({ placeholder:'短信' }).placeholderColor("#99000000").caretColor("#007DFF").backgroundColor("#F1F3F5").borderRadius(20).height(40).flexGrow(1)           // 将父容器的剩余空间全部分配给此组件Image($r("app.media.send")).height(36).width(36).opacity(0.4).margin({ left:12 })}.height(72).width('100%').padding({ left:24, right:24, bottom:8, top:8 }).backgroundColor('#87CEFA')  // 底部输入栏背景色,仅用于开发测试}}

信息列表

观察信息列表区域,可以发现它是由一个个消息气泡组成的,另外消息气泡在默认设备和平板上的布局有差异。本小节将围绕如下两个主题介绍如何实现消息列表。

  • 如何实现自定义消息气泡组件。
  • 如何在默认设备和平板上自适应布局。

消息气泡

先做一个最简单的消息气泡,通过borderRadius属性可以设置边框的圆角半径(详见边框设置)。

@Component
struct MessageBubble {private content: string = "Introduction"build() {Column() {Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) {Text(this.content).fontSize(16).lineHeight(21).padding({ left: 12, right: 12, top: 8, bottom: 8 }).backgroundColor("#C0EBDF").borderRadius(24).fontColor("#182431")}.width('100%')}.margin({left: 24, right: 24 }).backgroundColor('#87CEFA')  // 消息背景色,仅用于开发和测试 }
}

注意这个简单的消息气泡,左上角(或右上角)的样式,与实际期望不符。我们先修改发送消息右上角的样式,接收消息左上角的实现与之类似。

Stack组件 是一个堆叠容器,其子组件按照轴方向依次堆叠,后一个子组件覆盖前一个子组件。通过其alignContent接口,可以设置子组件在容器内的对齐方式,如alignContent: Alignment.TopStart代表子组件从左上角对齐。

@Component
struct MessageBubble {private content: string = "Introduction"build() {Column() {Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) {Stack({ alignContent: Alignment.TopEnd }) {  // 在左上角堆叠一个小色块Column().backgroundColor("#C0EBDF").borderRadius(4).width(24).height(24)Text(this.content).fontSize(16).lineHeight(21).padding({ left: 12, right: 12, top: 8, bottom: 8 }).backgroundColor("#C0EBDF").borderRadius(24).fontColor("#182431")}}.width('100%')}.margin({left: 24, right: 24 }).backgroundColor('#87CEFA')  // 消息背景色,仅用于开发和测试 }
}

接下来我们在消息气泡下方加上时间显示,如下图所示,一个消息气泡自定义组件就基本完成了。

@Component
struct MessageBubble {private content: string = "Introduction"private time: string = "上午 10:35"build() {Column() {Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.End }) {Stack({ alignContent: Alignment.TopEnd }) {Column().backgroundColor("#C0EBDF").borderRadius(4).width(24).height(24)Text(this.content).fontSize(16).lineHeight(21).padding({ left: 12, right: 12, top: 8, bottom: 8 }).backgroundColor("#C0EBDF").borderRadius(24).fontColor("#182431")}}.width('100%')// 在消息气泡底部增加时间显示Flex({ alignItems: ItemAlign.Center, direction: FlexDirection.Row,justifyContent: FlexAlign.End}) {Text(this.time).textAlign(TextAlign.Start).fontSize(10).lineHeight(13).fontColor("#99182431")}.width('100%').margin({ left: 12, right: 24 })}.margin({left: 24, right: 24 }).backgroundColor('#87CEFA')  // 消息背景色,仅用于开发和测试 }
}

发送出的消息和接收到的消息的消息气泡结构基本一致,可以通过增加一个标志位,让两种消息共用MessageBubble这个自定义组件,代码如下所示。将这个标志位设置true,可以查看接收消息的效果。

@Componentstruct MessageBubble {private isReceived:boolean = true// 通过标志位,判断是发送or接收场景,进而使用不同的样式private content:string = "Introduction"private time:string = "今天 10:35"build() {Column() {Flex({ justifyContent:this.isReceived? FlexAlign.Start: FlexAlign.End,alignItems: ItemAlign.Center }) {Stack({ alignContent:this.isReceived? Alignment.TopStart: Alignment.TopEnd }) {Column().backgroundColor(this.isReceived?"#FFFFFF":"#C0EBDF").borderRadius(4).width(24).height(24)Text(this.content).fontSize(16).lineHeight(21).padding({ left:12, right:12, top:8, bottom:8 }).backgroundColor(this.isReceived?"#FFFFFF":"#C0EBDF").borderRadius(24).fontColor("#182431")}}.width('100%')Flex({ alignItems: ItemAlign.Center, direction: FlexDirection.Row,justifyContent:this.isReceived? FlexAlign.Start: FlexAlign.End }) {Text(this.time).textAlign(TextAlign.Start).fontSize(10).lineHeight(13).fontColor("#99182431")}.width('100%').margin({ left:this.isReceived?12:0, right:this.isReceived?0:12 })}.margin({left:24, right:24 }).backgroundColor('#87CEFA')  // 消息背景色,仅用于开发和测试}}

栅格布局

回顾方舟开发框架一多能力,消息气泡在默认设备和平板上布局不同,可以借助栅格布局来解决。为了方便测试,我们预定义一个全局数组。

 interface globalMessageItem {time:string,content:string,isReceived:boolean}const globalMessageList:globalMessageItem[] = [{time:'上午 10:20',content:'项目介绍',isReceived:false},{time:'上午 10:28',content:'"一次开发,多端部署"支撑开发者快速高效的开发支持多种终端设备形态的应用,实现对不同设备兼容的同时,提供跨设备的流转、迁移和协同的分布式体验',isReceived:false},{time:'上午 10:32',content:'系统能力',isReceived:true},{time:'上午 10:35',content:'系统能力(即SystemCapability,缩写为SysCap)指操作系统中每一个相对独立的特性,如蓝牙,WIFI,NFC,摄像头等,都是系统能力之一。每个系统能力对应多个API,随着目标设备是否支持该系统能力共同存在或消失。',isReceived:true}
]

结合 栅格组件 的定义,考虑我们当前的实际场景,GridRow的各参数设置如下。

  • columns:栅格组件中的列数,当前场景默认12列即可。
  • gutter:栅格布局列间距,当前场景未使用该参数,默认设置为0即可。
  • margin: 栅格布局两侧间距,在开发消息气泡组件时,已经设置了左右间距,故该属性也默认配置为0。

栅格中仅包含我们自定义的消息气泡组件,该组件在各断点上的参数配置如下。

@Component
export default struct MessageItem {private isReceived?: booleanprivate content?: stringprivate time?: stringbuild() {GridRow() {GridCol({span: {sm: 12, md: 8, lg: 8},offset: {sm: 0, md: this.isReceived? 0 : 4, lg: this.isReceived? 0 : 4}}) {Flex({ justifyContent: FlexAlign.End, alignItems: ItemAlign.End }) {MessageBubble({isReceived: this.isReceived,content: this.content,time: this.time})}}}}
}@Entry
@Component
struct Conversation {build() {Column() {                      // 验证效果MessageItem({isReceived: globalMessageList[1].isReceived,content: globalMessageList[1].content,time: globalMessageList[1].time})MessageItem({isReceived: globalMessageList[3].isReceived,content: globalMessageList[3].content,time: globalMessageList[3].time})}.backgroundColor('#87CEFA')    // 消息背景色,仅用于开发和测试}
}

组合成型

现在会话详情页面的顶部标题栏、信息列表及底部输入栏都已经准备完毕,将这三部分组合起来即可得到完整的页面。

  • 通过 Flex组件 将三个部分组合起来,注意justifyContent: FlexAlign.SpaceBetween配置项是将Flex组件中的元素按照主轴方向均匀分配,其中第一个元素与顶部对齐,最后一个元素与底部对齐。

  • 通过 List组件 和 ForEach语法 ,显示整个消息列表。

@Entry@Componentstruct Conversation {build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start,justifyContent: FlexAlign.SpaceBetween }) {Column() {TopArea()   // 顶部标题栏List() {    // 消息列表ForEach(globalMessageList, (item:globalMessageItem, index) => {ListItem() {MessageItem({isReceived: item.isReceived,content: item.content,time: item.time})}})}.listDirection(Axis.Vertical).edgeEffect(EdgeEffect.Spring)}BottomArea()  // 底部输入栏}.backgroundColor("#F1F3F5").width('100%').height('100%')}}

短信应用在默认设备和平板上的功能完全相同,因此选择了部署模型A。借助方舟开发框架一多能力,短信应用实现了在默认设备和平板上共用同一份代码,同时自然也共用安装包。

在实际开发过程中,会话详情页面需要从底层做数据交互,同时还要支持信息选择、信息删除、信息发送状态、输入框与输入法联动等等功能,会比本小节中介绍的基础版本复杂很多。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

ALPHA开发板中CAN硬件图

一. 简介 前面文章学习了 IMX6ULL芯片的 CAN总线协议,CAN传输速率。 本文来搜索 ALPHA开发板中CAN硬件原理图,以及CAN设备节点信息。这里主要是CAN控制器的驱动,属于IMX6ULL芯片内部的驱动,NXP官方已经写好。 CAN控制器的驱动…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python抓取抖音直播间数据的简易指南 说明:本文已脱敏,隐去地址…

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive(保活): Keepalive 是一种机制,通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息(称为keepalive消息)实现的。如果在预定时…

鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。 说明: 从API version 9开始,该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…

算法-双指针

目录 1、双指针遍历分割:避免开空间,原地处理 2、快慢指针:循环条件下的判断 3、左右指针(对撞指针):分析具有单调性,避免重复计算 双指针又分为双指针遍历分割,快慢指针和左右指针 1、双指…

【leetcode热题】 位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中…

Linux安装Nginx及配置TCP负载均衡

目录 1、安装编译工具及库文件2、下载解压Nginx压缩包3、Ngnix配置Tcp负载均衡4、配置Ngnix的文件5、Nginx启动 1、安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel2、下载解压Nginx压缩包 wget https://nginx.o…

rider下ef core迁移

新建数据库 create database mockstu新建web项目 安装Microsoft.EntityFrameworkCore.SqlServer包 设置连接字符串 新建model using MockStuWeb.Models.EnumTypes; using System.ComponentModel.DataAnnotations;namespace MockStuWeb.Models {/// <summary>/// 学生…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块 Make与CMake的联系与区别 摘要 本…

国内AI领域的新星:Kimi与GPT的较量,谁主沉浮?

近期&#xff0c;国产大型人工智能模型Kimi频繁成为众多行业领袖讨论的焦点。这些来自不同领域的专家和领袖们&#xff0c;似乎都在对Kimi的性能和能力给予高度评价。在这两年国产AI模型的快速发展中&#xff0c;尽管市场上涌现出了许多新面孔&#xff0c;但真正能够在技术和应…

LeetCode-热题100:79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…

Ps:色彩平衡

色彩平衡 Color Balance命令可改变阴影、中间调、高光中的颜色平衡&#xff0c;从而改善图像的整体色彩表现或为图像创造特定的氛围。 Ps菜单&#xff1a;图像/调整/色彩平衡 Adjustments/Color Balance 快捷键&#xff1a;Ctrl B Ps菜单&#xff1a;图层/新建调整图层/色彩平…

Oracle Data Guard部署

Oracle的主备DG搭建 1. 修改主机名,同步时间 主库IP&#xff1a;192.168.100.137 备库IP&#xff1a;192.168.100.138配置主机名(主库) Hostname zygjpdb vim /etc/hosts 192.168.100.137 zygjpdb 192.168.100.138 zygjsdbvim /etc/sysconfig/network HOSTNAMEzygjpdb ------…

文件上传二—WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

演示案例&#xff1a; PHP-中间件-上传相关-Apache&NginxPHP-编辑器-上传相关-第三方处理引用PHP-CMS源码-上传相关-已知识别到利用 #PHP-中间件-上传相关-Apache&Nginx 复现漏洞环境&#xff1a;vulhub &#xff08;部署搭建看打包视频&#xff09; 由于PHP搭建常用中…

二叉树:递归算法的理解和运用

上一期中&#xff0c;我们了解到了堆&#xff0c;堆的结构也可以叫做二叉树的顺序结构&#xff0c;今天我们一起来看看二叉树的链式结构&#xff0c;我们还要学习有关于二叉树递归的书写。 首先&#xff0c;这是一个二叉树&#xff0c;但是对于普通的二叉树来说&#xff0c;增…

【Linux】详谈命令行参数环境变量

目录 一、浅谈命令行参数 二、环境变量 2.1环境变量的内涵以及理解 2.2PATH环境变量&#xff1a; 2.3输入程序名就能运行我们的程序 2.4系统中的环境变量 2.5导出环境变量 三、main函数的第三个参数 3.1获得环境变量的三种方法 四、本地变量 一、浅谈命令行参数 我们的m…

用自己的想法模拟实现库函数(2)完结篇

哈喽&#xff0c;小伙伴们&#xff0c;我们又见面了&#xff0c;上次讲完strlen函数的模拟实现后&#xff0c;发现还比较受大家欢迎&#xff0c;因此&#xff0c;本次给大家带来模拟函数的完结篇。温馨提示&#xff1a;本篇文章将会涉及到可能还未学到的实用性较高的库函数哟。…

Leetcode刷题笔记——动态规划之子序列问题篇

Leetcode刷题笔记——动态规划之子序列问题篇 一、回文 第一题&#xff1a;回文子串 Leetcode647. 回文子串&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着…

案例实践 | 基于长安链的煤质检测智慧实验室

案例名称-煤质检测智慧实验室 ■ 建设单位 国能数智科技开发&#xff08;北京&#xff09;有限公司 ■ 用户群体 煤炭生产单位、电力单位、化工单位等产业链上下游单位 ■ 应用成效 化验效率提升50%&#xff0c;出验时间缩短40%&#xff0c;提高化验数据市场公信力 案例…