HarmonyOS4-学习入门知识总结

简单的组件学习:

/*** weip 自定义控件* 自定义构建函数也是需要充电的地方,分全局和局部的* 全局:需要添加function关键字  局部:不加function关键字* @Styles function 自定义公共样式 分全局和局部* @Extends(Text) 继承模式 只能写成全局的* export:导出组件*/
@Component
export struct Header {private title: ResourceStr;build() {// 标题部分Row() {// 资源自行替换,返回iconImage($r('app.media.app_icon')).width(30)Text(this.title).fontSize(30).fontWeight(FontWeight.Bold)Blank()// 资源自行替换,分享iconImage($r('app.media.app_icon')).width(30)}.width('100%').height(30)}
}

ImagesPage.ets:

引用header组件

/*** 导入head组件*/
import { Header } from '../components/HeadComponents'// 全局自定义构建函数  function:代表全局
@Builder function ItemCard() {}// 组件内的局部函数需要加this
// 自定义公共样式
@Styles function fillScreen() {.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)
}// 自定义字体样式 需使用Extend() 继承模式,只能写在全局位置
@Extend(Text) function priceText() {.fontSize(18).fontColor('#F36')
}@Entry
@Component
struct Index {@State imageWidth: number = 150// ForEach:循环遍历数组,根据数组内容渲染页面组件,超过屏幕的东西就看不到,也滑动不了,所以后面统一使用List组件build() {// 纵向布局 主轴/交叉轴,一般只设置主轴,不设置交叉轴Column() {// 标题Header({title: "图片详情"}).padding({left: 20, top: 20, right: 20, bottom: 20})// 横向布局 主轴/交叉轴,一般只设置主轴,不设置交叉轴Row(){Image($r('app.media.icon')).width(this.imageWidth).interpolation(ImageInterpolation.High)}.width('100%').height(400).justifyContent(FlexAlign.Center)// Row容器 放一行Row() {Text($r('app.string.width_label')).fontSize(20).fontWeight(FontWeight.Bold).fontColor('#663')TextInput({ placeholder: '请输入图片宽度', text:this.imageWidth.toFixed(0) }).width(150).backgroundColor('#FFF').type(InputType.Number).onChange(value => {console.log(value)this.imageWidth = parseInt(value)})}.width('100%').padding({left: 14,right: 14}).justifyContent(FlexAlign.SpaceBetween) // 中间留空// 分割线Divider().width('91%')// 两个按钮Row(){Button('缩小').width(80).fontSize(20).onClick(() => {if (this.imageWidth >= 10) {this.imageWidth -= 10;}})Button('放大').width(80).fontSize(20).onClick(() => {if (this.imageWidth < 300) {this.imageWidth += 10;}})}.width('100%').margin({top: 35, bottom: 35}).justifyContent(FlexAlign.SpaceEvenly)Slider({min: 100,max: 300,value: this.imageWidth,step: 10}).width('100%').blockColor('#36D').trackThickness(7).showTips(true).onChange(value => {// value:当前滑块值this.imageWidth = value;})}.width('100%').height('100%')}
}/*** struct:自定义组件 可复用的UI单元* 装饰器:用来装饰类结构、方法、变量* @Component:标记自定义组件* @Entry:标记当前组件是入口组件* @State:标记一个变量是状态变量,值变化时会触发UI更新* build():UI描述,其内部以声明式方式描述UI结构* 内置组件:ArkUI提供的组件,比如容器组件如Row、Column* 基础组件:自带样式和功能的页面元素,如Text* 属性方法:设置组件的UI样式* 事件方法:设置组件的事件回调* 组件通用属性、特有属性(图片插值)*/

Index.ets:

一般是应用程序的入口

@Entry  // 入口組件
@Component
struct Index {@State message: string = 'Hello World'build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).fontColor('#36D').onClick(() => {this.message = 'Hello ArkTS!';})// Image('https://bkimg.cdn.bcebos.com/pic/bd315c6034a85edf8db139b7db031e23dd54564edf55?x-bce-process=image/format,f_auto/quality,Q_70/resize,m_lfit,limit_1,w_536')//   .width('50%')// 引用本地图片资源地址Image($r('app.media.icon')).width(250).interpolation(ImageInterpolation.High)}.width('100%')}.height('100%')}
}/*** struct:自定义组件 可复用的UI单元* 装饰器:用来装饰类结构、方法、变量* @Component:标记自定义组件* @Entry:标记当前组件是入口组件* @State:标记一个变量是状态变量,值变化时会触发UI更新* build():UI描述,其内部以声明式方式描述UI结构* 内置组件:ArkUI提供的组件,比如容器组件如Row、Column* 基础组件:自带样式和功能的页面元素,如Text* 属性方法:设置组件的UI样式* 事件方法:设置组件的事件回调* 组件通用属性、特有属性(图片插值)*/

PropPage.ets:
/*** 自定义任务类*/
class Task {// 静态变量,所有对象共享变量static id: number = 1// 任务名称   半角:``name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false
}// 统一的卡片样式
@Styles function card() {.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})
}// 任务完成样式
@Extend(Text) function finishedTask() {.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}// 任务统计信息的实体类【c】
class StaticInfo {totalTask: number = 0;finishTask: number = 0;
}@Entry
@Component
struct PropPage {// 总任务数量@State totalTask: number = 0// 已完成任务数量@State finishTask: number = 0build() {Column({space: 10}){// 任务进度卡片 子组件TaskStatistics({finishTask:this.finishTask, totalTask: this.totalTask})// 任务列表,包含新增任务 @Link totalTask:$finishTask:变量的引用TaskList({finishTask:$finishTask, totalTask: $totalTask})}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskList {// 总任务数量@Link totalTask: number// 已完成任务数量@Link finishTask: number// 任务数组@State tasks: Task[] = []handleTaskChange(){// 更新任务总数量this.totalTask = this.tasks.length// 更新已完成任务数量this.finishTask = this.tasks.filter(item => item.finished).length}build() {Column() {// 2、新增任务按钮Button('新增任务').width(200).onClick(() => {// 新增任务数据this.tasks.push(new Task())// 更新任务总数量this.handleTaskChange()})// 3、任务列表List({space: 10}) {ForEach(this.tasks,(item: Task, index) => {ListItem() {Row() {// 任务名Text(item.name).fontSize(20)// 任务复选框Checkbox().select(item.finished).onChange(isSelected => {// 任务状态发生变更,更新当前任务状态item.finished = isSelected// 更新已完成任务数量this.handleTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}.swipeAction({end: this.DeleteButton(index)})})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button(){Image($r('app.media.icon')).fillColor(Color.White).width(20)}.width(40).height(40).type(ButtonType.Circle).backgroundColor(Color.Red).margin(5).onClick(() => {// 从角标开始删 删1个this.tasks.splice(index, 1)this.handleTaskChange()})}
}/*** 任务进度卡片 子组件* 子组件是TaskStatistics  此时父组件是PropPage.ets* Prop:变量不能初始化 单向同步【父组件-->子组件】* Link:支持传对象 Prop:不支持传对象* provider 跨组件传输* consume 跨组件传输*/
@Component
struct TaskStatistics {// 总任务数量@Prop totalTask: number// 已完成任务数量@Prop finishTask: numberbuild() {Row() {// 任务进度Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)// 堆叠容器Stack() {// 进度条Progress({value: this.finishTask,total: this.totalTask,type: ProgressType.Ring})// 1/5Row() {Text(this.finishTask.toString()).fontSize(24).fontColor('#36D')Text(' / ' + this.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 20}).justifyContent(FlexAlign.SpaceEvenly)}
}

预览效果图:

注解的学习:

/*** 自定义任务类*/
class Task {// 静态变量,所有对象共享变量static id: number = 1// 任务名称   半角:``name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false
}// 统一的卡片样式
@Styles function card() {.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})
}// 任务完成样式
@Extend(Text) function finishedTask() {.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}// 任务统计信息的实体类
class StatInfo {totalTask: number = 0;finishTask: number = 0;
}/*** 父组件*/
@Entry
@Component
struct PropPage {// 统计信息  【父亲】@State stat: StatInfo = new StatInfo()build() {Column({space: 10}){// 任务进度卡片 子组件TaskStatistics({finishTask:this.stat.finishTask, totalTask: this.stat.totalTask})// 任务列表,包含新增任务 @Link totalTask:$finishTask:变量的引用TaskList({stat:$stat})}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskList {// 统计信息【儿子】  Link可以传对象@Link stat: StatInfo// 任务数组@State tasks: Task[] = []handleTaskChange(){// 更新任务总数量this.stat.totalTask = this.tasks.length// 更新已完成任务数量this.stat.finishTask = this.tasks.filter(item => item.finished).length}build() {Column() {// 2、新增任务按钮Button('新增任务').width(200).onClick(() => {// 新增任务数据this.tasks.push(new Task())// 更新任务总数量this.handleTaskChange()})// 3、任务列表List({space: 10}) {ForEach(this.tasks,(item: Task, index) => {ListItem() {Row() {// 任务名Text(item.name).fontSize(20)// 任务复选框Checkbox().select(item.finished).onChange(isSelected => {// 任务状态发生变更,更新当前任务状态item.finished = isSelected// 更新已完成任务数量this.handleTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}.swipeAction({end: this.DeleteButton(index)})})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button(){Image($r('app.media.icon')).fillColor(Color.White).width(20)}.width(40).height(40).type(ButtonType.Circle).backgroundColor(Color.Red).margin(5).onClick(() => {// 从角标开始删 删1个this.tasks.splice(index, 1)this.handleTaskChange()})}
}/*** 任务进度卡片 子组件* 子组件是TaskStatistics  此时父组件是PropPage.ets* Prop:变量不能初始化 单向同步【父组件-->子组件】* Link:支持传对象 Prop:不支持传对象* provider 跨组件传输* consume 跨组件传输*/
@Component
struct TaskStatistics {// 总任务数量@Prop totalTask: number// 已完成任务数量@Prop finishTask: numberbuild() {Row() {// 任务进度Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)// 堆叠容器Stack() {// 进度条Progress({value: this.finishTask,total: this.totalTask,type: ProgressType.Ring})// 1/5Row() {Text(this.finishTask.toString()).fontSize(24).fontColor('#36D')Text(' / ' + this.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 20}).justifyContent(FlexAlign.SpaceEvenly)}
}

跨组件传输数据:

@Provider @Consume

这种相对比较费内存,非跨组件不建议使用

/*** 自定义任务类*/
class Task {// 静态变量,所有对象共享变量static id: number = 1// 任务名称   半角:``name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false
}// 统一的卡片样式
@Styles function card() {.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})
}// 任务完成样式
@Extend(Text) function finishedTask() {.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}// 任务统计信息的实体类
class StatInfo {totalTask: number = 0;finishTask: number = 0;
}/*** 父组件*/
@Entry
@Component
struct PropPage {// 统计信息  【父亲】@Provide stat: StatInfo = new StatInfo()build() {Column({space: 10}){// 任务进度卡片 子组件TaskStatistics()// 任务列表,包含新增任务 @Link totalTask:$finishTask:变量的引用TaskList()}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskList {// 统计信息【儿子】  Link可以传对象@Consume stat: StatInfo// 任务数组@State tasks: Task[] = []handleTaskChange(){// 更新任务总数量this.stat.totalTask = this.tasks.length// 更新已完成任务数量this.stat.finishTask = this.tasks.filter(item => item.finished).length}build() {Column() {// 2、新增任务按钮Button('新增任务').width(200).onClick(() => {// 新增任务数据this.tasks.push(new Task())// 更新任务总数量this.handleTaskChange()})// 3、任务列表List({space: 10}) {ForEach(this.tasks,(item: Task, index) => {ListItem() {Row() {// 任务名Text(item.name).fontSize(20)// 任务复选框Checkbox().select(item.finished).onChange(isSelected => {// 任务状态发生变更,更新当前任务状态item.finished = isSelected// 更新已完成任务数量this.handleTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}.swipeAction({end: this.DeleteButton(index)})})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button(){Image($r('app.media.icon')).fillColor(Color.White).width(20)}.width(40).height(40).type(ButtonType.Circle).backgroundColor(Color.Red).margin(5).onClick(() => {// 从角标开始删 删1个this.tasks.splice(index, 1)this.handleTaskChange()})}
}/*** 任务进度卡片 子组件* 子组件是TaskStatistics  此时父组件是PropPage.ets* Prop:变量不能初始化 单向同步【父组件-->子组件】* Link:支持传对象 Prop:不支持传对象* provider 跨组件传输* consume 跨组件传输*/
@Component
struct TaskStatistics {// 统计信息@Consume stat: StatInfobuild() {Row() {// 任务进度Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)// 堆叠容器Stack() {// 进度条Progress({value: this.stat.finishTask,total: this.stat.totalTask,type: ProgressType.Ring})// 1/5Row() {Text(this.stat.finishTask.toString()).fontSize(24).fontColor('#36D')Text(' / ' + this.stat.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 20}).justifyContent(FlexAlign.SpaceEvenly)}
}

// bind(this)

/*** 自定义任务类*/
@Observed
class Task {// 静态变量,所有对象共享变量static id: number = 1// 任务名称   半角:``name: string = `任务${Task.id++}`// 任务状态:是否完成finished: boolean = false
}// 统一的卡片样式
@Styles function card() {.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius: 6, color: '#1F000000', offsetX: 2, offsetY: 4})
}// 任务完成样式
@Extend(Text) function finishedTask() {.decoration({type: TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}// 任务统计信息的实体类
class StatInfo {totalTask: number = 0;finishTask: number = 0;
}/*** 父组件*/
@Entry
@Component
struct PropPage {// 统计信息  【父亲】@Provide stat: StatInfo = new StatInfo()build() {Column({space: 10}){// 任务进度卡片 子组件TaskStatistics()// 任务列表,包含新增任务 @Link totalTask:$finishTask:变量的引用TaskList()}.width('100%').height('100%').backgroundColor('#F1F2F3')}
}@Component
struct TaskList {// 统计信息【儿子】  Link可以传对象@Consume stat: StatInfo// 任务数组@State tasks: Task[] = []handleTaskChange(){// 更新任务总数量this.stat.totalTask = this.tasks.length// 更新已完成任务数量this.stat.finishTask = this.tasks.filter(item => item.finished).length}build() {Column() {// 2、新增任务按钮Button('新增任务').width(200).onClick(() => {// 新增任务数据this.tasks.push(new Task())// 更新任务总数量this.handleTaskChange()})// 3、任务列表List({space: 10}) {ForEach(this.tasks,(item: Task, index) => {ListItem() {// bind(this)  绑定父组件的thisTaskItem({item: item, onTaskChange: this.handleTaskChange.bind(this)})}.swipeAction({end: this.DeleteButton(index)})})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center)}}@Builder DeleteButton(index: number) {Button(){Image($r('app.media.icon')).fillColor(Color.White).width(20)}.width(40).height(40).type(ButtonType.Circle).backgroundColor(Color.Red).margin(5).onClick(() => {// 从角标开始删 删1个this.tasks.splice(index, 1)this.handleTaskChange()})}
}/*** 自定义任务的item项* 方法传递*/
@Component
struct TaskItem {@ObjectLink item: Task// 变量的类型是个函数类型onTaskChange: () => voidbuild() {Row() {// 任务名 如果完成,需要变灰if (this.item.finished) {Text(this.item.name).fontSize(20).finishedTask()} else {Text(this.item.name).fontSize(20)}// 任务复选框Checkbox().select(this.item.finished).onChange(isSelected => {// 任务状态发生变更,更新当前任务状态this.item.finished = isSelected// 更新已完成任务数量//this.handleTaskChange()this.onTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}
}/*** 任务进度卡片 子组件* 子组件是TaskStatistics  此时父组件是PropPage.ets* Prop:变量不能初始化 单向同步【父组件-->子组件】* Link:支持传对象 Prop:不支持传对象* provider 跨组件传输* consume 跨组件传输*/
@Component
struct TaskStatistics {// 统计信息@Consume stat: StatInfobuild() {Row() {// 任务进度Text('任务进度').fontSize(30).fontWeight(FontWeight.Bold)// 堆叠容器Stack() {// 进度条Progress({value: this.stat.finishTask,total: this.stat.totalTask,type: ProgressType.Ring})// 1/5Row() {Text(this.stat.finishTask.toString()).fontSize(24).fontColor('#36D')Text(' / ' + this.stat.totalTask.toString()).fontSize(24)}}}.card().margin({top: 20, bottom: 20}).justifyContent(FlexAlign.SpaceEvenly)}
}

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

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

相关文章

wangEditor 测试环境对,但是生产环境无法显示

package.json 文件版本 "wangeditor": "4.3.0"开发环境 new Editor(#${this.id});出来的数据 正式环境 new Editor(#${this.id});出来的数据 原因&#xff1a; vue.config 文件 打包策略的时候 const assetsCDN {css: [https://lf6-cdn-tos.bytecd…

【千帆平台】百度智能云千帆AppBuilder应用探索益智游戏之猜物小游戏

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景AppBuilder控制台创建应用设置应用自动配置随机生成AI生成应…

20.安全性测试与评估

每年都会涉及&#xff1b;可能会考大题&#xff1b;多记&#xff01;&#xff01;&#xff01; 典型考点&#xff1a;sql注入、xss&#xff1b; 从2个方面记&#xff1a; 1、测试对象的功能、性能&#xff1b; 2、相关设备的工作原理&#xff1b; 如防火墙&#xff0c;要了解防…

产业链上下游持续利好 冷缩管(冷缩套管)应用需求不断增长

产业链上下游持续利好 冷缩管&#xff08;冷缩套管&#xff09;应用需求不断增长 冷缩管又称冷缩套管、冷收缩式电缆附件&#xff0c;指利用预扩张技术制成的弹性体部件。冷缩管具有抗冲击、耐热、耐腐蚀、防水、抗老化、电绝缘性能好等优势&#xff0c;在通信系统、电力系统等…

「实战应用」如何用图表控件LightningChart创建JS堆叠条形图?

LightningChartJS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航空…

Netty学习——高级篇2 Netty解码技术 备份

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…

K8s-Ingress Nginx-Day 08

1. 什么是Ingress 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#what-is-ingress Ingress 是 kubernetes API 中的标准资源类型之一&#xff0c;主要是k8s官方在维护。 2. Ingress的作用 Ingress 提供从集群外部到集群内服务…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比&#xff0c;达梦的归档日志相关参数有个比较特别&#xff0c;可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME&#xff1a;归档日志保留时间&#xff0c;单位分钟&#xff0c;取值范围 0~2147483647。只…

github生成新的SSH密钥

首先是参考官方文档 生成新的 SSH 密钥并将其添加到 ssh-agent述 当你在创建SSH密钥时遇到提示&#xff1a; Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):这一步是让你选择保存生成的SSH密钥对的文件名和位置。如果你直接按回车键&#xff08;[Pr…

【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤&#xff0c;本篇我们将继续分享迁移、启动~ 目录 9. 离线迁移 9.1. 迁移插件安装 中断安装&#xff0c;比如 kill 掉java进程&#xff08;安装失败也要等待300s&#xff09; 下载安装包准备上传 缺少mysqlclient lib包 mysq…

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量…

TypeScript常用知识点整理

介绍 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型支持和更多现代编程特性&#xff0c;提高了代码的可靠性和可维护性。最终会被编译成标准的 JavaScript 代码运行。 使用npm install -g typescript进行全局安装 将编写好的ts代码进行运行&#xff0c;第…

Go语言工程师如何进阶为云原生高级开发工程师?

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家&#xff1b;《企业级Go项目开发实战》作者&#xff0c;云原生实战营 知识星球星主。欢迎关注我的公众号【令飞编程】&#xff0c;干货不错过。 我们当前正处在云原生时代&#xff0c;有…

数据恢复软件能不能恢复已经删除的监控视频

随着安防意识的日益增强&#xff0c;监控视频已成为众多场所不可或缺的安全保障。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了一些重要的监控视频。面对这种情况&#xff0c;许多人都会想到使用数据恢复软件来尝试找回这些丢失的视频。那么&#xff0c;数…

Linux入门攻坚——18、SELinux、Bash脚本编程续

SELinux——Secure Enhanced Linux&#xff08;安全加强的Linux&#xff09;&#xff0c;工作于Linux内核中。 SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源&#xff08;最小权限原则&#xff09;。采用委任式存取控制&#xff0c;是在进行程序、文件等细节权…

NAT转换是怎么工作的?

前言 对象: 服务器S&#xff0c;NAT设备&#xff0c;用户设备C1&#xff0c;用户设备C2 用户C1向服务器S发起一个HTTP请求&#xff0c;经过NAT转化&#xff0c;服务器收到并作出响应&#xff0c;用户C1收到响应。 问题来了&#xff0c;NAT是怎么知道这个响应是给用户C1而不是…

复现chatgpt_ros,需要openapi key

&#xff11;&#xff0e; 前置工作&#xff1a; 现在&#xff55;buntu系统是20.04ros1&#xff0c;现在用docker新建并安装ros2&#xff1a; 最简单的&#xff0c;用大佬的一键安装&#xff1a; wget http://fishros.com/install -O fishros && . fishros 其次自己装…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声&#xff0c;社区不少小伙伴都在讨论用以替换的 Linux 操作系统&#xff0c;经过问卷调查&#xff0c;我们发现小伙伴们的操作…

kotlin项目引用

概要&#xff1a; 记录项目引用kotlin具体事项 1 object下build.gradle buildscript {//声明引用版本ext.kotlin_version "1.4.20"repositories {google()mavenCentral()}dependencies {classpath "com.android.tools.build:gradle:4.2.0"//引用kotlinc…

假期别闲着:REST API实战演练之创建Rest API

1、创建实体类&#xff0c;模拟实体对象 创建一个类&#xff0c;模拟数据数据库来存储数据&#xff0c;这个类就叫Person。 其代码如下&#xff1a; package com.restful;public class Person {private String name;private String about;private int birthYear;public Perso…