当前位置: 首页 > news >正文

9-社区动态(Stack布局)

涉及知识点:

  1. stack布局

  2. video组件
    3.组件状态控制: @State、@Prop以及@Link装饰器

  3. 组件状态控制:@Observed&@ObjectLink装饰器
    课时: 2

1 任务

1.1 需求

完成社区动态功能,社区动态显示用户发布的跟游戏相关的短视频,自动循环播放发布者发布的短视频,向下滑动切换到下一条短视频,短视频播放页面显示发布者,视频标题,视频描述,发布者头像,点赞数,评论数,收藏数,转发数等

1.2 界面原型

社区动态页面,上下滑动可以播放其他短视频,点击可以暂停和继续播放,可以点赞和收藏:

在这里插入图片描述

2 预备知识

2.1 Stack布局(层叠布局)

层叠布局官方指南:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-layout-development-stack-layout

  1. 固定定位与层叠
  2. 依次入栈(代码渲染顺序)
  3. 默认居中堆叠,可通过alignContent参数控制对齐位置

在这里插入图片描述

  1. 调整层级关系:Z序控制,zIndex

2.2 Video组件

播放视频,控制视频播放状态。

官方参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-common-components-video-player

视频加载(src属性设置视频链接):

  1. 本地视频

    • 在rawfile下,$rawfile(‘文件路径’)

    • 沙箱路径,file:///data/storage/el2/base/haps/entry/files/show.mp4

  2. 网络视频

    • 申请权限ohos.permission.INTERNET

    • 指定视频连接:https://www.example.com/example.mp4

常用参数:

  • src:加载视频

  • previewUri:海报

  • controller: 播放控制器

    private controller: VideoController = new VideoController()

常用属性:

  • muted:是否静音

  • controls:是否显示默认控制条

  • autoPlay:是否自动播放

  • loop:是否循环播放

  • objectFit:视频适配模式

    枚举类型说明:

    枚举说明-公共定义-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

    • ImageFit.Contain:保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内
    • ImageFit.Cover:保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界
    • ImageFit.Auto:图像会根据其自身尺寸和组件的尺寸进行适当缩放,以在保持比例的同时填充视图。
    • ImageFit.Fill:不保持宽高比进行放大缩小,使得图片充满显示边界。

事件回调:

播放开始(onStart),播放暂停(onPause)、播放结束(onFinish)、播放失败(onError)、播放停止(onStop)、视频准备完成(onPrepared),进度条定位(onSeeked),播放进度变化(onUpdate)、全屏非全屏播放状态变化(onFullscreenChange)等。

视频组件控制器(VideoController):

开始播放(start)、暂停(pause)、停止(stop)、重置(reset)、指定播放位置(setCurrentTime),请求全屏播放(requestFullscreen),退出全屏播放(exitFullscreen)

2.3 组件状态维护

官方参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-v1

2.3.1 @State 组件内状态

  • 私有,只能从组件内访问
  • 必须本地初始化
  • 与子组件中的@Prop装饰变量之间建立单向数据同步
  • 与@Link、@ObjectLink装饰变量之间建立双向数据同步
  • 变量类型:
    • Object、class、string、number、boolean、enum类型
    • 数组
    • Date
    • Map、Set

2.3.2 @Prop 父子单向传递

  • @Prop装饰的变量是可变的,但不会同步给父组件
  • 父组件的修改会覆盖子组件的修改
  • 可以本地初始化
  • 私有,只能从组件内访问
  • 变量类型:
    • Object、class、string、number、boolean、enum类型
    • 数组
    • Date
    • Map、Set

2.3.3 @Link 父子双向传递

  • 双向同步
  • 禁止本地初始化
  • 私有,只能在所属组件内访问
  • 变量类型:
    • Object、class、string、number、boolean、enum类型
    • 数组
    • Date
    • Map、Set

2.3.4 @Observed

  • 加在类前面
  • 观察对象类属性变化

2.3.5 @ObjectLink装饰器

  • 接收@Observed装饰的类的实例
  • 和父组件中对应的状态变量建立双向数据绑定
  • 不支持简单类型
  • 不能本地初始化,必须从父组件初始化
  • 不能在@Entry中使用(因为需要从父组件实例化)

3 新建社区动态展示组件

在components文件夹下新建ArkTS文件,命名为:CommunityVideoComponent,并编写基础代码:

@Component
export  default struct CommunityVideoComponent{build() {Column(){Text('社区动态').fontColor(Color.White)}.width('100%').height('100%').backgroundColor(Color.Black)}
}

Note:
需要播放视频,背景设置为黑色

4 封装视频信息

在model下新建ArkTS文件,命名为VideoBean,封装id,标题,视频连接,分享次数、点赞数、是否小红心、评论数等信息,并生成构造方法:


export default class VideoBean {id: number;title: string;//视频标题url:Resource;//视频连接shareCount:number; //分享次数likeCount:number; //点赞数isLike:boolean; //是否小红心commentCount: number;//评论数author: string; //作者videoDesc:string; //视频描述previewUrl: Resource; //海报isStar:boolean ;//是否收藏starCount: number ;//收藏数constructor(id: number, title: string, url: Resource, shareCount: number, likeCount: number, isLike: boolean,commentCount: number,author:string,videoDesc:string,previewUrl:Resource,isStar:boolean,starCount:number) {this.id = id;this.title = title;this.url = url;this.shareCount = shareCount;this.likeCount = likeCount;this.isLike = isLike;this.commentCount = commentCount;this.author = author;this.videoDesc = videoDesc;this.previewUrl = previewUrl;this.isStar = isStar;this.starCount = starCount;}}

5 后台短视频数据准备

在model中新建arkts文件,命名为:CommunityVideoModel ,并在CommunityVideoModel 中编码,添加getVideos方法,准备短视频数据:

export default class CommunityVideoModel {// 获取短视频数据getVideos():Array<VideoBean>{let videos:Array<VideoBean> = [new VideoBean(1,'一起放风筝',$rawfile('video/video1.mp4'),111,333,true,666,'jerry','大风起,云飞扬,好男儿走四方!',$rawfile('video/poster1.png'),true,123),new VideoBean(2,'一起跳泥坑',$rawfile('video/video2.mp4'),222,444,false,888,'tom','有坑你不躲,非要往里跳!',$rawfile('video/poster2.png'),false,321),new VideoBean(3,'虫儿飞',$rawfile('video/video3.mp4'),333,666,true,999,'jerry','虫儿飞,虫儿飞,搞笑的虫子不会飞!',$rawfile('video/poster3.png'),true,312),new VideoBean(4,'一起玩',$rawfile('video/video4.mp4'),444,888,false,777,'jerry','早起的虫儿,被鸟吃!',$rawfile('video/poster4.png'),false,777),new VideoBean(5,'神笔马良',$rawfile('video/video5.mp4'),444,888,false,777,'tom','这是神笔马良么?',$rawfile('video/poster5.png'),false,555),new VideoBean(6,'光头强改行',$rawfile('video/video6.mp4'),444,888,false,777,'jerry','光头强从此不砍树了!',$rawfile('video/poster6.png'),false,893),new VideoBean(7,'每次都说没问题',$rawfile('video/video7.mp4'),444,888,false,777,'tom','每次都说没问题,这次是真的么?',$rawfile('video/poster7.png'),false,532),new VideoBean(8,'侠客行',$rawfile('video/video8.mp4'),444,888,false,777,'jerry','何人倚剑白云间',$rawfile('video/poster8.png'),false,236),new VideoBean(9,'心静自然凉',$rawfile('video/video9.mp4'),444,888,false,777,'jerry','心静自然凉,鹰飞要凉凉',$rawfile('video/poster9.png'),false,956),new VideoBean(10,'这一片江上',$rawfile('video/video10.mp4'),444,888,false,777,'jerry','这一片江山都是你的,别往那边看,那边是别人的!',$rawfile('video/poster10.png'),true,8444),];return videos;}
}

6 短视频轮播

界面原型:

在这里插入图片描述

  1. 先在MainPage中调用社区动态组件:
      TabContent(){//Text('动态')CommunityVideoComponent()//社区动态}//.tabBar('动态').tabBar(this.MyTabBuilder(TabID.COMMUNITY))

预览效果:

在这里插入图片描述

  1. 封装视频播放组件

在components文件下新建arkts文件,命名为:PlayVideoComponent:

@Component
export struct PlayVideoComponent{@Prop videoBean:VideoBean;private videoController: VideoController = new VideoController();@Prop isPlay:boolean ;//初始时是否自动播放视频build() {Column(){Video({src:this.videoBean.url,controller:this.videoController,previewUri:this.videoBean.previewUrl}).controls(true).loop(true).autoPlay(this.isPlay).objectFit(ImageFit.Fill).width('100%').height('40%')}.width('100%').height('100%')}}

Note:
视频信息需要父组件传入,是否自动播放需要由父组件控制,因此需暴露这两个属性,并使用单向传递,即使用@Prop

  1. 建立轮播组件并调用

在CommunityVideoComponent中编码,首先定义变量:

  private communityVideoModel:CommunityVideoModel = new CommunityVideoModel();@State currentIdx: number = 0;

然后在Column布局中使用轮播组件:

      // Text('社区动态')//   .fontColor(Color.White)Swiper(){ForEach(this.communityVideoModel.getVideos(),(item:VideoBean,index:number)=>{if(index === this.currentIdx){PlayVideoComponent({videoBean:item,isPlay:true})}else{PlayVideoComponent({videoBean:item,isPlay:false})}},(item:VideoBean)=>JSON.stringify(item))}.indicator(false).loop(false).vertical(true).onChange((index)=>{console.info('idx:'+index)this.currentIdx = index;})

Note:
根据swiper组件的当前索引进行循环渲染一个默认自动播放还是不自动播放的视频播放组件,如不这样控制则所有视频会一起播放。
轮播组件设置为上下滑动,不要自动轮播,不要出现指示条

启动本地模拟器进行测试(video组件不能在预览器中预览):

在这里插入图片描述

上下滑动可以自由切换视频,并不会所有视频一起播放。

  1. 使用点击控制播放和暂停

在PlayVideoComponent中编码,首先定义枚举型变量控制播放状态(在组件外面写代码):

enum PlayState {STOP = 0,START = 1,PAUSE = 2
}
@Component
export struct PlayVideoComponent{
...

然后在组件内定义控制播放状态的变量:

export struct PlayVideoComponent{...@State playState: number = PlayState.START;build() {...

在Video组件上添加单击事件,控制播放状态,同时隐藏播放控制条:

      Video({src:this.videoBean.url,controller:this.videoController,previewUri:this.videoBean.previewUrl}).controls(false)//隐藏控制条.loop(true).autoPlay(this.isPlay).objectFit(ImageFit.Fill).onClick(()=>{if(this.playState === PlayState.START){this.playState = PlayState.PAUSEthis.videoController.pause();}else if(this.playState === PlayState.PAUSE){this.playState = PlayState.START;this.videoController.start();}else {this.playState = PlayState.STARTthis.videoController.start();}})

在本地模拟器中预览效果,测试是否可以通过点击控制视频播放和继续:

在这里插入图片描述

  1. Tab切换时停止播放短视频

当Tabs组件切换到首页或者其他页签时,短视频是在后台播放的,需要tabs索引和swiper索引联合控制短视频是否播放。

首先修改CommunityVideoComponent ,添加变量,暴露给父组件(包含tabs布局的MainPage)控制是否自动播放:

@Prop canPlay:boolean;

然后,在Swiper组件中加入父组件参与控制:

   Swiper(){ForEach(this.communityVideoModel.getVideos(),(item:VideoBean,index:number)=>{if(index === this.currentIdx && this.canPlay){PlayVideoComponent({videoBean:item,isPlay:true})}else{PlayVideoComponent({videoBean:item,isPlay:false})}},(item:VideoBean)=>JSON.stringify(item))}

最后在MainPage中,调用社区动态组件时,传入播放控制变量,根据当前显示的TabID是否是社区动态页签决定是否播放社区动态中的视频:

     ...
@State isComunityVideoShow: boolean = false;
...build(){   Tabs({barPosition:BarPosition.End}){TabContent(){//Text('动态')//CommunityVideoComponent()CommunityVideoComponent({canPlay:this.isComunityVideoShow})//社区动态}//.tabBar('动态').tabBar(this.MyTabBuilder(TabID.COMMUNITY))...}.width('100%').height('100%').onChange((index)=>{this.pageIndex = index;//控制换页if(this.pageIndex === TabID.COMMUNITY){this.isComunityVideoShow = true;}else{this.isComunityVideoShow = false;}})

在本地模拟器中测试,当切换到首页时,播放的短视频应该是没有声音的,处于停止状态,切换回社区动态时,短视频正常播放。

7 视频描述视图

界面原型:

在这里插入图片描述

在components目录下新建arkts文件,命名为VideoDescComponent,编写如下骨架代码,视频bean需要父组件传入:

@Component
export struct VideoDescComponent {@Prop videoBean:VideoBean;build(){}
}

在build函数中布局视频描述信息:

    Column({space:5}){Text(`@${this.videoBean.author}`).fontSize(20).fontColor(Color.White)Text(this.videoBean.title).fontSize(18).fontColor(Color.White).fontWeight(FontWeight.Bold)Text(this.videoBean.videoDesc).fontSize(15).fontColor(Color.White)}.width('95%').height('30%').alignItems(HorizontalAlign.Start).offset({y:'40%'})//相对定位

Note:
offset:相对定位,相对于自己本身的渲染位置在y轴上偏移40%

在PlayVideoComponent中调用,由于视频组件和描述组件需要叠放,因此将跟容器改为Stack堆叠布局:

  build() {Stack({alignContent:Alignment.End}){Video({src:this.videoBean.url,controller:this.videoController,previewUri:this.videoBean.previewUrl})...}).width('100%').height('40%')//视频描述视图VideoDescComponent({videoBean:this.videoBean})}.width('100%').height('100%')}

Note:
Stack: 堆叠布局,设置在底部对齐

在本地模拟器中运行,测试叠放效果:

在这里插入图片描述

8 评论视图

界面原型:

在这里插入图片描述

  1. 完成评论视图布局

在components目录下新建arkts文件,命名为VideoCommentComponent,并完成头像、小红心,评论,收藏,转发等布局:

@Component
export struct VideoCommentComponent {@Prop videoBean:VideoBean;build(){Column(){Image($r('app.media.head_logo')).width(50).height(50).border({width:3,color:Color.White,radius:25}).objectFit(ImageFit.Contain)Image(this.videoBean.isLike ?$r('app.media.like1'): $r('app.media.like3')).width(35).height(35).margin({top:30})Text(this.videoBean.likeCount === 0 ? '点赞' : this.videoBean.likeCount.toString()).fontSize(15).fontColor(Color.White)Image($r('app.media.comment3')).width(35).height(35).margin({top:20})Text(this.videoBean.commentCount === 0 ? '评论' : this.videoBean.commentCount.toString()).fontSize(15).fontColor(Color.White)Image(this.videoBean.isStar ?$r("app.media.star1"): $r("app.media.star3")).width(35).height(35).margin({top:30})Text(this.videoBean.starCount === 0 ? '收藏' : this.videoBean.starCount.toString()).fontSize(15).fontColor(Color.White)Image($r('app.media.share3')).width(35).height(35).margin({top:20})Text(this.videoBean.shareCount === 0 ? '分享' : this.videoBean.shareCount.toString()).fontSize(15).fontColor(Color.White)}.offset({ x: '-5%', y: '10%' })}
}

在本地模拟器中的测试效果:

在这里插入图片描述

  1. 小红心和收藏功能

在小红心和小星星上添加点击事件,处理状态变化:

      Image(this.videoBean.isLike ?$r('app.media.like1'): $r('app.media.like3')).width(35).height(35).margin({top:30}).onClick(()=>{if(this.videoBean.isLike){this.videoBean.likeCount --}else{this.videoBean.likeCount ++}this.videoBean.isLike = !this.videoBean.isLike})...Image(this.videoBean.isStar ?$r("app.media.star1"): $r("app.media.star3")).width(35).height(35).margin({top:30}).onClick(()=>{if(this.videoBean.isStar){this.videoBean.starCount --}else{this.videoBean.starCount ++}this.videoBean.isStar = !this.videoBean.isStar})

现在你可以在本地模拟器中测试代码,小红心和小星星的状态会发生变化,但是一划走再回来,或者切换到其他页面下,又恢复了初始数据,就是组件的状态跟踪没有处理好,我们对videoBean使用的是单向的数据传递,即使用Prop,改成双向数据传递有两种策略:

方式一:

  1. 将PlayVideoComponent中的videoBean属性都改成@State并赋初值
 @State videoBean:VideoBean =  new VideoBean(1,'一起放风筝',$rawfile('video/video1.mp4'),111,333,true,666,'jerry','大风起,云飞扬,好男儿走四方!',$rawfile('video/poster1.png'),true,123);
  1. 将VideoCommentCompoent中的videoBean改成@Link
@Link videoBean:VideoBean;

这样可以实现双向数据更新

方式一,不可以将PlayVideoComponent中的videoBean改成@Link,否则无法从CommunityVideoComponent组件中通过循环渲染赋值。

方式二(推荐):

  1. 在VideoBean类前加@Observed
@Observed
export default class VideoBean {
...
}
  1. 将PlayVideoComponent和VideoCommentCompoent中的videoBean都改成@ObjectLink
  @ObjectLink videoBean:VideoBean;

Note:
@Observed:加在类前面
@ObjectLink: 加在组件引用的对象前面,当组件改变该对象内部属性时会同步给所有引用该类的实例,实现其他组件数据的同步刷新。

在本地模拟器中测试,经过以上修改后,小红心,小星星的状态可以在上下滑动以及页面切换中正常维护同步。

在这里插入图片描述

参考

代码仓

https://gitee.com/snowyvalley/harmony-app-dev-basic-course.git

相关文章:

9-社区动态(Stack布局)

涉及知识点: stack布局 video组件 3.组件状态控制&#xff1a; State、Prop以及Link装饰器 组件状态控制&#xff1a;Observed&ObjectLink装饰器 课时: 2 1 任务 1.1 需求 完成社区动态功能&#xff0c;社区动态显示用户发布的跟游戏相关的短视频&#xff0c;自动循环…...

如何使用MATLAB NLP工具箱进行文本聚类

文章目录 前言一、核心流程与代码实现二、高级聚类技术三、评估聚类质量四、实战案例&#xff1a;新闻聚类五、优化技巧与注意事项 前言 在 MATLAB 中使用 NLP 工具箱进行文本聚类主要分为数据预处理、特征提取、相似度计算、聚类算法应用和结果分析五个核心步骤。以下是详细教…...

deepseek梳理java高级开发工程师es面试题

Elasticsearch 面试题及答案&#xff08;高级 Java 开发工程师版&#xff09; 基础概念 1. 解释 Elasticsearch 中的倒排索引是什么&#xff1f;为什么它比传统数据库更适合全文搜索&#xff1f; 答案&#xff1a; 倒排索引是一种将文档中的词项(token)映射到包含该词项的文…...

查看mysql配置文件my.cnf的位置

3.删除mysql相关文件 想要完全卸载mysql&#xff0c;不仅要卸载应用&#xff0c;配置文件及相关文件也需要一一清除&#xff0c;还原环境配置&#xff0c;减少一些麻烦。 sudo rm -rf /usr/local/mysql sudo rm -rf /etc/my.cnf sudo rm -rf /var/db/mysql sudo rm -rf /var/…...

PyTorch进阶实战指南:01自定义神经网络组件开发

PyTorch进阶实战指南&#xff1a;01自定义神经网络组件开发 前言 在深度学习领域&#xff0c;PyTorch凭借其动态计算图和灵活的模块化设计&#xff0c;已成为学术研究和技术落地的首选框架之一。本文聚焦于神经网络组件的自定义开发&#xff0c;旨在帮助开发者突破现成模型的限…...

【MySQL】04.数据类型

首先我们来看一下数据类型分类&#xff1a; 我们接下来对红色标识的进行介绍&#xff0c;其他的自行了解即可。 1. 数值类型 1.1 bit 我们以bit为例来介绍整型。 mysql> create table test_bit(-> sex bit(1)-> ); mysql> desc test_bit; -----------------…...

MCP专题 | 探索MCP服务器世界:增强AI能力的精选推荐

在人工智能快速发展的今天&#xff0c;模型上下文协议&#xff08;MCP&#xff0c;Model Context Protocol&#xff09;已成为一项重要的技术标准&#xff0c;它使AI模型能够安全地与外部资源交互。MCP服务器作为AI与工具、数据库和API之间的桥梁&#xff0c;极大地扩展了AI的功…...

深入解析OrientDB:多模型数据库的技术优势与实际应用

OrientDB 是一款开源的多模型 NoSQL 数据库&#xff0c;融合了文档数据库、图数据库和对象数据库的特性。它不仅支持灵活的数据建模&#xff0c;还提供了高性能的查询能力&#xff0c;适用于社交网络、物联网、内容管理等场景。本文详细探讨 OrientDB 的核心特性、应用场景&…...

芯片分享之AD976性能介绍

产品特征&#xff1a; D976和AD976A均为高速、低功耗、16位模数转换器(ADC)&#xff0c;采用5 V单电源供电。AD976A的吞吐速率为200 ksps&#xff0c;而AD976的吞吐速率为100 ksps。各器件均内置一个逐次逼近型开关电容ADC、一个2.5 V内部基准电压源和一个高速并行接口。最大功…...

Flutter - 集成三方库:数据库(sqflite)

数据库 $ flutter pub add sqlite $ flutter pub get$ flutter run运行失败&#xff0c;看是编译报错,打开Xcode工程 ⌘ B 编译 对比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默认的Flutter工程默认未生成Pod…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(三)用yolov5-face算法实现人脸检测

环境直接使用第一篇中安装好的环境即可 先clone yolov5-face项目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下载预训练权重文件yolov5n-face.pt 网盘链接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取码: lw9j &#xff08;野火官方提供&am…...

基于matlabcd7.x的无网格近似方法

无网格近似方法&#xff08;Meshless Methods&#xff09;是一类数值计算方法&#xff0c;用于解决偏微分方程&#xff08;PDEs&#xff09;问题&#xff0c;特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法&#xff08;FEM&#xff09;相比&#xff0c;无…...

塔式服务器都有哪些重要功能?

塔式服务器作为一种拥有着独特立式设计的服务器&#xff0c;能够帮助企业节省一定的放置空间&#xff0c;提供一系列的功能和优势&#xff0c;可以运用在多种应用场景当中&#xff0c;下面将探讨一下塔式服务器的主要功能都有哪些&#xff1f; 塔式服务器可以支持基本的应用程序…...

【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理

引言&#x1f4da; 在企业级应用开发中&#xff0c;用户管理系统是几乎所有后台管理系统的核心模块之一。它不仅需要实现用户数据的增删改查&#xff0c;还需要考虑数据分页展示、状态管理、前后端交互效率等问题。本文将以一个实际的用户管理系统为例&#xff0c;详细讲解基于…...

机器学习算法-聚类K-Means

先来看看K-Means算法的核心流程吧 下面我们通过一个简单聚类来介绍K-Means算法迭代过程 如图(a)所示&#xff1a;表示初始化数据集。 如图(b)所示&#xff1a;假设K2&#xff0c;随机选择两个点作为类别质心&#xff0c;分别为图中的红色和蓝色质心。 如图©所示&#xff…...

初识Linux 进程:进程创建、终止与进程地址空间

目录 0.写在前面 1.进程创建 fork()&#xff1a; exec()&#xff1a; 2.进程地址空间 3.进程终止 正常终止&#xff08;主动退出&#xff09; 异常终止&#xff08;被动终止&#xff09; 0.写在前面 本文将对Linux环境下的进程&#xff1a;包括进程创建、终止与进程等待…...

2025年PMP 学习二十二 15章 项目绩效域

2025年PMP 学习二十二 15章 项目绩效域 文章目录 2025年PMP 学习二十二 15章 项目绩效域项目绩效域1.项目绩效域2.项目持续效域3.项目管理中的干系人管理 1.干系人持续效域促进干系人参与的步骤&#xff1a; 2 团队持续效域1 团队持续效域及项目团队人员有关系的活动和职能&…...

顶级流媒体服务商 Spotify 2025.04 故障复盘报告,吃他人的堑长自己的智

2025 年 4 月 16 日&#xff0c;Spotify 经历了一次影响全球用户的中断。以下就是发生了什么以及我们将如何解决它。 背景 我们使用 Envoy Proxy 作为我们的网络外围系统。外围是我们的软件接收用户&#xff08;您&#xff01;&#xff09;网络流量的第一部分。然后&#xff…...

服装收银系统哪个好?服装店进销存管理软件全面评测

在服装批发零售行业&#xff0c;选择一款合适的收银系统和进销存管理软件至关重要。好的系统不仅能提高工作效率&#xff0c;还能帮助商家精准掌握库存、优化销售策略。 本文将全面分析服装收银系统的选择标准&#xff0c;并重点介绍秦丝进销存这一专业解决方案。 一、服装收…...

Java程序员从0学AI(二)

一、前言 在上一篇文章中&#xff0c;我们初步认识了 AI 领域的核心基础概念&#xff0c;如大语言模型&#xff08;LLM&#xff09;的参数量特征、提示词&#xff08;Prompt&#xff09;对交互效果的关键作用、文本处理单元 Token 的独特定义&#xff0c;以及通过向量转换实现…...

进阶知识:无参的函数装饰器之深入理解@wraps()

进阶知识&#xff1a;无参的函数装饰器之深入理解wraps(func) 一、wraps(func)的本质解析 1.1 核心作用 wraps(func)是functools模块提供的装饰器工具&#xff0c;用于保留被装饰函数的元信息。它通过将被装饰函数的名称&#xff08;__name__&#xff09;、文档字符串&#…...

《C 语言 sizeof 与 strlen 深度对比:原理、差异与实战陷阱》

目录 一. sizeof 和 strlen 的对比 1.1 sizeof 1.2 strlen 1.3 对比表格 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.2.1 代码练习一 2.2.2 代码练习二 2.2.3 代码练习三 2.2.4 代码练习四 2.2.5 代码练习五 2.2.6 代码练习六 2.3 二维数组 …...

C++ 初阶 | 类和对象易错知识点(上)

目录 0.引言 1.访问限定符 2.域 3.类的实例化和声明 4.this指针 5.构造函数&#xff08;自动执行&#xff09; 6.拷贝构造 7.运算符重载 8.日期类的实现 9.总结 0.引言 今天&#xff0c;小邓儿和大家分享一下&#xff0c;C在类和对象中的易错知识点&#x1f92d;&am…...

USB转TTL

USB转TTL模块是实现计算机USB接口与TTL电平串口设备&#xff08;如单片机、嵌入式系统&#xff09;通信的核心组件&#xff0c;其原理涉及协议转换和电平适配两大关键技术 一、核心功能与应用场景 功能&#xff1a;将计算机的USB信号&#xff08;高速差分信号、USB协议&#…...

汽车生产中的测试台连接 – EtherCAT 转CANopen高效的网关通信

使用 EtherCAT 和 CANopen协议&#xff0c;实现对汽车零部件的高效生产线末端测试 某电动机、电桥和变速箱制造商之一&#xff0c;正在其生产线上使用ETHERCAT转canopen网关WL-ECAT-COP的解决方案。集成到测试线中的下线测试必须映射众多待测设备的测试应用。该制造商已指定 Et…...

汽车充电过程中--各个电压的关系(DeepSeek)

在电动汽车的充电过程中&#xff0c;电池的充电机制涉及多个电压参数的协调控制&#xff0c;以下从原理到实际应用逐步分析&#xff1a; 1. 充电基础原理 电动汽车电池&#xff08;通常为锂离子电池组&#xff09;的充电本质是通过外部电源向电池注入电能&#xff0c;使锂离子…...

基于HTML的Word风格编辑器实现:从零打造功能完备的富文本编辑器

引言 在Web开发中&#xff0c;实现一个功能完备的富文本编辑器是一个常见需求。本文将基于HTML5和JavaScript&#xff0c;结合第三方库&#xff0c;打造一个具有Word风格界面的富文本编辑器&#xff0c;支持格式设置、图片插入、表格创建、文件导入导出等核心功能。 完整代码…...

亚远景-汽车软件开发的“升级之路”:ASPICE各等级说明

ASPICE&#xff08;Automotive SPICE&#xff09;将汽车软件开发过程的成熟度划分为六个等级&#xff0c;从0级到5级&#xff0c;每个等级代表了组织在软件开发过程中的不同能力水平。以下是各等级的详细说明&#xff1a; 等级0&#xff1a;不完整&#xff08;Incomplete&#…...

Unity Display 1 No cameras rendering

一个相机不能同时输出到屏幕和RenderTexture​​。 Output Texture&#xff0c;要么是 None &#xff08;屏幕&#xff09;&#xff0c;要么是RenderTexture。 如果此时相机已经输出到RenderTexture&#xff0c;场景中又没有别的相机在渲染&#xff0c;屏幕将变黑并显示No cam…...

Python Selenium 使用指南

Selenium 是一个用于自动化 Web 浏览器交互的强大工具&#xff0c;常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。 安装 Selenium 首先需要安装 Selenium 库和浏览器驱动&#xff1a; pip install selenium 然后下载对应浏览器的驱动&…...

Cribl 对数据源进行过滤-01

先说一个项目中实际的例子: Cribl 利用filter expression 来过滤 data, 举个例子: source1: sourcerouter=A, source 2: sourcerouter=B, 这个时候,可以要把他们合并起来: sourcerouter=A || sourcerouter=B 来进行过滤想要的数据。 最后可以使用一个pipeline 来对数据进行…...

python 通过 pymysql 获取 select count(*) xxx 的数量

在使用 pymysql 库来获取 SELECT COUNT(*) 语句的结果时&#xff0c;你可以通过以下步骤实现&#xff1a; 安装 pymysql&#xff1a;如果你还没有安装 pymysql&#xff0c;可以通过 pip 安装它。 pip install pymysql连接到数据库&#xff1a;使用 pymysql.connect() 方法连接…...

定时任务延迟任务

二者的区别&#xff1a; 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间。 延迟任务&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发另一个事件&#xff0c;任务可以立即执行&#xff0…...

【动手学深度学习】1.1~1.2 机器学习及其关键组件

目录 一、引言1.1. 日常生活中的机器学习1.2. 机器学习中的关键组件1&#xff09;数据2&#xff09;模型3&#xff09;目标函数4&#xff09;优化算法 一、引言 1.1. 日常生活中的机器学习 应用场景&#xff1a; 以智能语音助手&#xff08;如Siri、Alexa&#xff09;的唤醒…...

LLaVA-MoD:基于MoE结构和蒸馏训练方法,训练轻量化多模态大模型!!

摘要&#xff1a;我们介绍了LLaVA-MoD&#xff0c;这是一个旨在高效训练小型多模态语言模型&#xff08;s-MLLM&#xff09;的创新框架&#xff0c;通过从大规模多模态语言模型&#xff08;l-MLLM&#xff09;中提取知识来实现。我们的方法解决了多模态语言模型&#xff08;MLL…...

YOLOv8 的双 Backbone 架构:解锁目标检测新性能

一、开篇&#xff1a;为何踏上双 Backbone 探索之路 在目标检测的领域中&#xff0c;YOLOv8 凭借其高效与精准脱颖而出&#xff0c;成为众多开发者和研究者的得力工具。然而&#xff0c;传统的单 Backbone 架构&#xff0c;尽管已经在诸多场景中表现出色&#xff0c;但仍存在一…...

SSRF(服务器端请求伪造)基本原理靶场实现

1、漏洞原理 攻击者通过构造恶意请求&#xff0c;诱使服务器向内部系统或第三方服务发起非预期的网络请求。其核心在于 服务器信任了不可信的用户输入&#xff0c;并基于该输入发起网络操作。 2、攻击场景与利用方式 1. 基础利用 攻击类型示例Payload目标读取本地文件file://…...

自动化测试脚本点击运行后,打开Chrome很久??

亲爱的小伙伴们大家好。 小编最近刚换了电脑&#xff0c;这几天做自动化测试发现打开Chrome浏览器需要等待好长时间&#xff0c;起初还以为代码有问题&#xff0c;或者Chromedriver与Chrome不匹配造成的&#xff0c;但排查后发现并不是&#xff01;&#xff01; 在driver.py中…...

Oracle中如何解决FREE BUFFER WAITS

基于性能上的考虑&#xff0c;服务器进程在扫描LRU主列的同时&#xff0c;会将脏块移至LRU-W列&#xff0c;如果发现没有足够可用&#xff08;可替换&#xff09;的BUFFER CACHE&#xff0c;进程并不会无止尽地扫描整条LRU主列&#xff0c;而是在扫描到某个阀值&#xff08;该阀…...

OpenHarmony开源鸿蒙兼容性测试常见问题解答分享

OpenHarmony 兼容性测评主要是验证合作伙伴的设备和业务应用满足 OpenHarmony 开源兼容性定义的技术要求&#xff0c;确保运行在 OpenHarmony 上的设备和业务应用能稳定、正常运行&#xff0c;同时使用 OpenHarmony 的设备和业务应用有一致性的接口和业务体验。 一、兼容性测评…...

Android trace presentFence屏幕显示的帧

Android trace presentFence屏幕显示的帧 presentFence &#xff1a;当帧成功显示到屏幕时&#xff0c;present fence就会signal。 FrameMissed/GpuFrameMissed/HwcFrameMissed表示上一次合成的结果&#xff0c;当SurfaceFlinger合成后显示到屏幕上&#xff0c;present fence就…...

【520特辑】情人节脑影像绘图

祝大家520快乐&#xff01; 永远爱自己&#xff01; 1.Brain Net基于节点画爱心 clear all; clc;t linspace(0, 2*pi, 30); x 16*sin(t).^3; y 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t); z zeros(size(t));[X,Y] meshgrid(linspace(-10,10,5), linspace(-10,10,5)); X …...

Linux服务器配置深度学习环境(Pytorch+Anaconda极简版)

前言&#xff1a; 最近做横向需要使用实验室服务器跑模型&#xff0c;之前用师兄的账号登录服务器跑yolo&#xff0c;3张3090一轮14秒&#xff0c;我本地一张4080laptop要40秒&#xff0c;效率还是快很多&#xff0c;&#xff08;这么算一张4080桌面版居然算力能比肩3090&#…...

如何理解大模型的幻觉输出及RAG技术的应用与实战案例

导读&#xff1a;大语言模型&#xff08;LLM&#xff09;在当今技术领域中扮演着越来越重要的角色&#xff0c;但其“幻觉输出”问题却成为实际应用中的痛点。本文将带你深入剖析这一现象的定义、表现形式及成因&#xff0c;并探讨如何通过RAG&#xff08;检索增强生成&#xf…...

std::vector<>.emplace_back

emplace_back() 详解&#xff1a;C 就地构造的效率革命 emplace_back() 是 C11 引入的容器成员函数&#xff0c;用于在容器尾部就地构造&#xff08;而非拷贝或移动&#xff09;元素。这一特性显著提升了复杂对象的插入效率&#xff0c;尤其适用于构造代价较高的类型。 一、核…...

卷积神经网络(CNN)学习率调整完全指南:从理论到PyTorch实践

引言 学习率是训练卷积神经网络(CNN)最重要的超参数之一&#xff0c;合理调整学习率可以显著提高模型性能、加速收敛并避免训练失败。本文将全面解析CNN学习率调整的技术与方法&#xff0c;涵盖基础概念、常用策略、PyTorch实现以及实用技巧。 一、学习率为什么如此重要&…...

KLEC--基于知识学习的演化计算算法

KLEC–基于知识学习的演化计算算法 title&#xff1a; Knowledge Learning for Evolutionary Computation author&#xff1a; Yi Jiang, Zhi-Hui Zhan, Kay Chen Tan, Jun Zhang. journal&#xff1a; IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION (TEVC) DOI&#xff…...

Git查看指定作者提交命令

要查看 Git 仓库中某个作者的提交记录&#xff0c;可以使用 git log 命令结合 --author 选项。以下是具体用法和示例&#xff1a; 基础命令 git log --author"作者名"作用&#xff1a;列出指定作者的所有提交记录。示例&#xff1a;查找作者名为 John Doe 的提交&am…...

隐形安全感

凌晨两点&#xff0c;手机突然震动。合作三年的化工原料供应商发来紧急消息&#xff1a;“一批次环氧树脂需要连夜从南京调往广州&#xff0c;但合作多年的物流公司临时爽约&#xff0c;能帮忙想想办法吗&#xff1f;” 我盯着屏幕愣了几秒。这类危险品运输从来不是简单的“拉…...

代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛

图论 题目 101. 孤岛的总面积 计算孤岛总面积&#xff0c;一个想法是将相邻的陆地的位置置为 0&#xff0c;最后计算孤岛面积中最小的一个 #include <iostream> #include <vector> #include <queue>using namespace std;int sum 0; int dir[4][2] {0,-1…...