鸿蒙UI系统组件16——富文本编辑器(RichEditor)

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

RichEditor是支持图文混排和文本交互式编辑的组件,通常用于响应用户的对于图文混合内容的输入操作,例如可以输入图片的评论区。下面针对RichEditor的基本使用做一个讨论。

👉🏻 创建一个RichEditor组件

创建一个RichEditor组件的方式有两种:a)不使用属性字符串构建RichEditor组件;b)使用属性字符串构建RichEditor。

⭐️ 不使用属性字符串构建方式接口定义如下:

RichEditor(value: RichEditorOptions)

RichEditorOptions的类图一览如下:

图片

其中RichEditorOptions是富文本组件初始化选项。示例代码如下:

controller: RichEditorController = new RichEditorController();options: RichEditorOptions = { controller: this.controller };RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('创建不使用属性字符串构建的RichEditor组件。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })

示例代码对应的效果如下:

图片

⭐️ 使用属性字符串构建方式接口定义如下:

RichEditor(options: RichEditorStyledStringOptions)

RichEditorStyledStringOptions的类图一览如下:

图片

其中RichEditorStyledStringOptions是富文本组件初始化选项。示例代码如下:

mutableStyledString: MutableStyledString = new MutableStyledString("创建使用属性字符串构建的RichEditor组件。",    [{        start: 0,        length: 5,        styledKey: StyledStringKey.FONT,        styledValue: this.fontStyle    }]);controller: RichEditorStyledStringController = new RichEditorStyledStringController();options: RichEditorStyledStringOptions = {controller: this.controller};RichEditor(this.options)    .onReady(() => {        this.controller.setStyledString(this.mutableStyledString);    })

实例代码对应的效果如下:

👉🏻 为RichEditor设置属性

⭐️ 设置自定义选择菜单

通过bindSelectionMenu设置自定义选择菜单,接口定义为:

bindSelectionMenu(  spanType: RichEditorSpanType,   content: CustomBuilder,   responseType: ResponseType | RichEditorResponseType,  options?: SelectionMenuOptions)// 涉及到的核心数据结构如下enum RichEditorSpanType {  TEXT = 0,  // Span为文字类型。  IMAGE = 1,  // Span为图像类型。  MIXED = 2,  // Span为图文混合类型。  BUILDER = 3,  // Span为BuilderSpan类型。}enum RichEditorResponseType{  LONG_PRESS  // 通过长按触发菜单弹出。  RIGHT_CLICK  // 通过鼠标右键触发菜单弹出。  SELECT  // 通过鼠标选中触发菜单弹出。}interface SelectionMenuOptions {onAppear: MenuOnAppearCallback  //自定义选择菜单弹出时回调。onDisappear: Callback<void>  //自定义选择菜单关闭时回调。}type MenuOnAppearCallback = (start: number, end: number) => void

其中:

    • spanType是菜单的类型,默认值为文字类型;

    • content是菜单的内容;

    • responseType是菜单的响应类型,默认类型为长按;

    • options是菜单的选项,可设置自定义选择菜单弹出或关闭时的回调。

(自定义菜单超长时,建议内部嵌套Scroll组件使用,避免键盘被遮挡)示例代码如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件设置了自定义菜单,长按可触发。', {            style: {                fontColor: Color.Black,                fontSize: 18            }        })    })    .bindSelectionMenu(RichEditorSpanType.TEXT, this.SystemMenu, ResponseType.LongPress, {        onDisappear: () => {            this.sliderShow = false        }    })    .width(300)    .height(300)@BuilderSystemMenu() {    Column() {            Menu() {                    if (this.controller) {                        MenuItemGroup() {                            MenuItem({                                startIcon: this.theme.cutIcon,                                content: "剪切",                                labelInfo: "Ctrl+X",                            })                            MenuItem({                                startIcon: this.theme.copyIcon,                                content: "复制",                                labelInfo: "Ctrl+C"                            })                            MenuItem({                                startIcon: this.theme.pasteIcon,                                content: "粘贴",                                labelInfo: "Ctrl+V"                            })                        }                    }                }                .radius(this.theme.containerBorderRadius)                .clip(true)                .backgroundColor(Color.White)                .width(this.theme.defaultMenuWidth)        }        .width(this.theme.defaultMenuWidth)}

效果如下

图片

⭐️ 设置光标和手柄颜色

添加文本内容,如果组件光标闪烁,插入后光标位置更新为新插入文本的后面,返回值为添加完成的TextSpan所在的位置。接口定义如下:​​​​​​​

addTextSpan(value: string, options?: RichEditorTextSpanOptions): number// options涉及的接口定义如下:interface RichEditorTextSpanOptions {  offset: number //添加文本的位置。省略时,添加到所有内容的最后。当值小于0时,放在所有内容最前面;当值大于所有内容长度时,放在所有内容最后面。  style: RichEditorTextStyle // 文本样式信息。省略时,使用系统默认文本信息。  paragraphStyle: RichEditorParagraphStyle //段落样式。  gesture: RichEditorGesture // 行为触发回调。省略时,仅使用系统默认行为。}

示例:通过caretColor设置输入框光标、手柄颜色。​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件设置了光标手柄颜色。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .caretColor(Color.Orange)    .width(300)    .height(300)

效果如下:

⭐️ 设置空态提示文本(placeholder)

通过placeholder设置无输入时的提示文本。

其中value为无输入时的提示文本;style为添加提示文本的字体样式,style缺省时默认跟随主题。​​​​​​​

RichEditor(this.options)    .placeholder("此处为提示文本...", {        fontColor: Color.Gray,        font: {            size: 15,            weight: FontWeight.Normal,            family: "HarmonyOS Sans",            style: FontStyle.Normal        }    })    .width(300)    .height(300)

效果如下:

图片

👉🏻 为RichEditor添加事件

⭐️ 初始化完成后的回调

通过onReady来添加组件初始化完成后可触发的回调。示例代码如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('onReady回调内容是组件内预置文本。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })

⭐️ 内容被选中时的回调

通过onSelect来添加组件内容被选中时可触发的回调。(触发该回调有两种方式:可通过鼠标左键按下选择,松开左键后触发回调,也可通过手指选择,松开手指触发回调)​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('选中此处文本,触发onselect回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onSelect((value: RichEditorSelection) => {        this.controller1.addTextSpan(JSON.stringify(value), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 图文变化前 / 后的回调

通过onWillChange添加图文变化前可触发的回调。通过onDidChange添加图文变化后可触发的回调。

  • onWillChange的callback中:RichEditorChangeValue为图文变化信息;boolean为true时,表示当前图文允许被更改。boolean为false时,表示当前图文不允许被更改。

  • onDidChange的callback中:OnDidChangeCallback为图文变化前后的内容范围。

【使用RichEditorStyledStringOptions构建的RichEditor不支持这两种回调】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件内图文变化前,触发回调。\n图文变化后,触发回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onWillChange((value: RichEditorChangeValue) => {        this.controller1.addTextSpan('组件内图文变化前,触发回调:\n' + JSON.stringify(value), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })        return true;    })    .onDidChange((rangeBefore: TextRange, rangeAfter: TextRange) => {        this.controller1.addTextSpan('\n图文变化后,触发回调:\nrangeBefore:' + JSON.stringify(rangeBefore) + '\nrangeAfter:' + JSON.stringify(rangeBefore), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })        return true;    })    .width(300)    .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 输入法输入前和完成输入后的回调

通过aboutToIMEInput添加输入法输入内容前可触发的回调。通过onIMEInputComplete添加输入法完成输入后可触发的回调。

  • aboutToIMEInput的callback中:RichEditorInsertValue为输入法将要输入内容信息;boolean为true时,组件执行添加内容操作。boolean为false时,组件不执行添加内容操作。

  • onIMEInputComplete的callback中:RichEditorTextSpanResult为输入法完成输入后的文本Span信息。

【使用RichEditorStyledStringOptions构建的RichEditor组件不支持这两种回调】​​​​​​​

RichEditor(this.options)          .onReady(() => {            this.controller.addTextSpan('输入法输入内容前,触发回调。\n输入法完成输入后,触发回调。' , {              style: {                fontColor: Color.Black,                fontSize: 15              }            })          })          .aboutToIMEInput((value: RichEditorInsertValue) => {            this.controller1.addTextSpan('输入法输入内容前,触发回调:\n'+JSON.stringify(value), {              style: {                fontColor: Color.Gray,                fontSize: 10              }            })            return true;          })          .onIMEInputComplete((value: RichEditorTextSpanResult) => {            this.controller1.addTextSpan('输入法完成输入后,触发回调:\n'+ JSON.stringify(value), {              style: {                fontColor: Color.Gray,                fontSize: 10              }            })            return true;          })          .width(300)          .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 完成粘贴前触发的回调

通过onPaste添加完成粘贴前可触发的回调【由于系统的默认粘贴,只支持纯文本的粘贴。所以我们可以通过该方法,覆盖系统默认行为,实现图文的粘贴】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onPaste(() => {        this.controller1.addTextSpan('触发onPaste回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

⭐️ 完成剪切前触发的回调

通过onCut添加完成粘贴前可触发的回调【由于系统的默认剪切行为,只支持纯文本的剪切。所以我们可以通过该方法,覆盖系统默认行为,实现图文的剪切】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onCut(() => {        this.controller1.addTextSpan('触发onCut回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

⭐️ 完成复制前触发的回调

通过onCopy添加完成粘贴前可触发的回调【由于系统的默认复制行为,只支持纯文本的复制。所以我们可以通过该方法,覆盖系统默认行为,实现图文的复制】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onCopy(() => {        this.controller1.addTextSpan('触发onCopy回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

效果如下:

图片

👉🏻 为RichEditor设置用户预设样式

通过setTypingStyle设置用户预设的样式(其中value是预设样式)。示例如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮,改变组件预设样式。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(60)Button('setTypingStyle', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.setTypingStyle({            fontWeight: 'medium',            fontColor: Color.Pink,            fontSize: 15,            fontStyle: FontStyle.Italic,            decoration: {                type: TextDecorationType.Underline,                color: Color.Gray            }        })    })

效果如下:

图片

👉🏻 为RichEditor设置背板高亮

通过setSelection设置组件内的内容选中时部分背板高亮(其中selectionStart为选中开始位置,selectionEnd选中结束位置。当selectionStart和selectionEnd均为-1时表示全选,当组件内未获焦出现光标时,调用该接口不产生选中效果)​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处选中0-2位置的文本。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(60)Button('setSelection(0,2)', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.setSelection(0, 2)    })

效果如下:

图片

👉🏻 添加文本内容

除了直接在组件内输入内容,也可以通过addTextSpan添加文本内容【其中value是文本内容;options是文本选项,用于添加文本的偏移位置和文本样式信息(RichEditorTextSpanOptions), 如果组件光标闪烁,插入后光标位置更新为新插入文本的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加text。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addTextSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addTextSpan('新添加一段文字。')    })

效果如下:

图片

👉🏻 添加图片内容

通过addImageSpan添加图片内容【其中value是图片内容;options是图片选项,用于添加图片的偏移位置和图片样式信息(RichEditorImageSpanOptions), 添加图片内容,如果组件光标闪烁,插入后光标位置更新为新插入图片的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加image。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addImageSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addImageSpan($r("app.media.startIcon"), {            imageStyle: {                size: ["57px", "57px"]            }        })    })

效果如下:

图片

👉🏻 添加Builder内容

通过addBuilderSpan添加builder内容【其中value是builder内容;options是builder选项,可通过RichEditorBuilderSpanOptions设置此builder在RichEditor中的index(一个文字为一个单位)】​​​​​​​

@BuilderTextBuilder() {    Row() {            Image($r('app.media.startIcon')).width(50).height(50).margin(16)            Column() {                Text("文本文档.txt").fontWeight(FontWeight.Bold).fontSize(16)                Text("123.45KB").fontColor('#8a8a8a').fontSize(12)            }.alignItems(HorizontalAlign.Start)        }.backgroundColor('#f4f4f4')        .borderRadius("20")        .width(220)}Button('addBuilderSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.my_builder = () => {            this.TextBuilder()        }        this.controller.addBuilderSpan(this.my_builder)    })

效果如下:

图片

👉🏻 添加SymbolSpan内容

可通过addSymbolSpan添加SymbolSpan内容【其中value是SymbolSpan组件内容;options是SymbolSpan组件选项,用于添加SymbolSpan组件的偏移位置和SymbolSpan组件样式信息( RichEditorSymbolSpanOptions ),添加SymbolSpan内容,如果组件光标闪烁,插入后光标位置更新为新插入Symbol的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加symbol。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addSymbolSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addSymbolSpan($r("sys.symbol.basketball_fill"), {            style: {                fontSize: 30            }        })    })

效果如下:

图片

👉🏻 获取组件内span信息

可通过getSpans获取组件内span信息【其中value是需要获取span范围。返回值为Array,是文本和图片Span信息】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮获取此处span信息。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(50)Text('查看getSpans返回值:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(50)Button('getSpans', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller1.addTextSpan(JSON.stringify(this.controller.getSpans()), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })

效果如下:

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

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

相关文章

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意&#xff1a;在C语言中&#xff0c;如果内存不够…

RISC-V笔记——语法依赖

1. 前言 Memory consistency model定义了使用Shared memory(共享内存)执行多线程(Multithread)程序所允许的行为规范。RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;该模型旨在为架构师提供更高的灵活性&#xff0c;以构建高性能可拓展的设计&#x…

【C++栈 贪心 决策包容性】3170. 删除星号以后字典序最小的字符串|1772

本文涉及知道点 C栈 模拟 C贪心 LeetCode3170. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ’ 字符…

Go语言中的控制结构(四)

Go语言中的控制结构详解 控制结构是编程语言中控制代码执行流程的核心部分&#xff0c;Go语言通过if、for、switch等常见的控制结构&#xff0c;以及独有的defer、panic、recover机制&#xff0c;提供了强大且简洁的控制流管理。本文将详细讲解Go语言中的控制结构&#xff0c;包…

ASR-01和ESP32语音控制LED灯——基于VSCODE编辑器和ESP-IDF环境

一、ASR-01部分 大家不要问我软件哪里来&#xff0c;大家哪里买的的&#xff0c;就去哪里要&#xff0c;淘宝客服一定有&#xff0c;没有你就换一家。 图形化编程 原理&#xff1a;通过接收相匹配语音&#xff0c;赋值给ID&#xff0c;然后通过switch语句&#xff0c;判断ID值…

Linux内核USB3.0驱动框架分析--USB Hub代码分析

一、Linux 下USB Hub热插拔处理 1.1 Linux下USB HUB的驱动的实现和分析&#xff1a; USB设备是热插拔&#xff0c;因此在hub_probe函数中调用hub_configure函数来配置hub&#xff0c;在这个函数中主要是利用函数usb_alloc_urb函数来分配一个urb&#xff0c;利用usb_fill_int_u…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…

【Linux】操作系统基础

1.冯诺依曼体系结构介绍 冯诺依曼体系结构如下&#xff1a; 在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设&#xff0c;⽽「存储器」在冯 诺依曼体系结构中表示「内存」 输⼊设备⼀般包括&#xff1a;⽹卡、磁盘、键盘、触摸屏等 输出设备⼀般包括&#xff1a;…

java 自定义填充excel并导出

首先在resources下面放一个excel模板 1. 方法签名和请求映射 RequestMapping(value "/ExportXls") public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request, RequestBody JSONArray jsonArray) throws IOException { RequestMapping(val…

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

【ONE·Web || HTML】

总言 主要内容&#xff1a;HTML基本知识入门&#xff0c;主要介绍了常见的一些标签使用&#xff0c;以及简单案例演示。       文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…

污水排放口细粒度检测数据集,污-水排放口的类型包括10类目标,10000余张图像,yolo格式目标检测,9GB数据量。

污水排放口细粒度检测数据集&#xff0c;污-水排放口的类型包括10类目标&#xff08;1 合流下水道&#xff0c;2 雨水&#xff0c;3 工业废水&#xff0c;4 农业排水&#xff0c;5 牲畜养殖&#xff0c;6 水产养殖&#xff0c;7 地表径流&#xff0c;8 废水处理厂&…

三菱FX3U PLC绝对定位- DRVA指令

指令格式 相关软元件一览 功能和动作 这是采用绝对驱动的单速定位指令。采用从原点(0点)开始的距离指定方式&#xff0c; 也被称为绝对驱动方式。 1、在指令执行过程中&#xff0c;即使改变操作数的内容&#xff0c;也不反映到当前的运行中。 在下次的指令驱动时才有效…

QT 中如何保存matlab 能打开的.mat数据矩阵!

Windows 上安装并使用 MATIO 库来保存 MATLAB 格式的 .mat 文件&#xff0c;需要进行以下步骤&#xff1a; 1. 下载并安装 CMake MATIO 使用 CMake 构建项目&#xff0c;因此你需要先安装 CMake。 前往 CMake 官网下载适用于 Windows 的安装程序并安装。 2. 下载 MATIO 库源…

Windows,MySQL主从复制搭建

前提&#xff1a;windows环境&#xff0c;同一个服务器安装多个相同版本的mysql数据库 多个MySQL服务搭建完成后&#xff0c;下面我们进行主从复制的相关配置 1.主数据库 执行指令 #创建用户 CREATE USER slavelocalhost IDENTIFIED BY 123456;#授权 GRANT REPLICATION SLA…

专线监控的使用方法:运维团队的全面实战指南

在当今高度信息化的时代&#xff0c;专线网络已成为企业连接不同地域、保障业务连续性的重要基础设施。然而&#xff0c;随着网络架构的复杂化和业务需求的多样化&#xff0c;运维团队面临着前所未有的挑战。为了有效应对这些挑战&#xff0c;运维团队需要深入了解并熟练掌握专…

前端埋点学习

前端埋点 前端数据埋点是在前端页面中通过代码的方式手机用户行为数据和页面性能的过程&#xff0c;通过在页面中插入指定的代码&#xff0c;实现实时监控用户在页面上的操作行为。 通常包括一下事件 定义事件: 定义需要手机的数据事件&#xff0c;如点击&#xff0c;浏览等添…

Linux系列-常见的指令(二)

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” mv 剪切文件&#xff0c;目录 重命名 比如说&#xff0c;我们在最开始创建一个新的文件hello.txt 然后我们将这个文件改一个名字&#xff0c;改成world.txt 所以&#xff0c;…

UE5 武器IK瞄准系统

创建空项目 创建基础蓝图类My_GameMode&#xff0c;My_HUD&#xff0c;My_PlayChar&#xff0c;My_PlayController 项目设置地图模式 近裁平面 0.1 My_PlayChar蓝图中添加摄像机&#xff0c;角色骨骼网格体&#xff0c;武器骨骼网格体 编辑角色骨骼&#xff0c;预览控制器使用…

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?

当前&#xff0c;各大平台的本地生活服务业务日渐兴盛&#xff0c;提高创业者入局意向的同时&#xff0c;也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看&#xff0c;在创业者们所询问的众多本地生活服务项目中&#xff0c;通过…