【蓝桥杯】第十五届省赛大学真题组真题解析

news2025/2/26 22:53:43

【蓝桥杯】第十五届省赛大学真题组真题解析

一、智能停车系统

1、知识点

(1)flex-wrap

控制子元素的换行方式
属性值有:

  1. no-wrap不换行
  2. wrap伸缩容器不够则自动往下换行
  3. wrap-reverse伸缩容器不够则自动往上换行
(2)align-content调整多行侧轴对齐方式

align-items调整单行侧轴对齐方式
控制子元素在交叉轴上的对齐方式
属性值有:

  1. flex-start侧轴的起始位置对齐
  2. flex-end侧轴的终止位置对齐
  3. center侧轴的中间位置对齐
  4. space-around伸缩项目之间的距离相等是距离边缘间距的2倍
  5. space-between伸缩项目之间的距离相等,距离边缘间距为0
  6. space-evenly伸缩项目之间的距离相等是距离边缘间距的1倍
(3)justify-content调整主轴对齐方式

控制子元素在主轴上的对齐方式
属性值有:

  1. flex-start侧轴的起始位置对齐
  2. flex-end侧轴的终止位置对齐
  3. center侧轴的中间位置对齐
  4. space-around伸缩项目之间的距离相等是距离边缘间距的2倍
  5. space-between伸缩项目之间的距离相等,距离边缘间距为0
  6. space-evenly伸缩项目之间的距离相等是距离边缘间距的1倍

2、题解

flex-wrap: wrap; 
align-content: space-between;
justify-content: space-between;

二、布局切换

1、知识点

(1)classList
  1. add添加类
  2. remove移除类
  3. toggle切换类:如果元素已有该类名则移除,没有则添加

2、题解

layoutOptions.forEach(function (option) {
    // 经典模式,浏览模式,工具模式点击事件
    option.addEventListener('click', function () {
        // TODO:待补充代码
        document.querySelector('.active').classList.remove('active');
        option.classList.toggle('active')
         // TODO:END 
        //  以下代码无需修改
        // 根据不同选项进行布局处理
        if (this === layoutOptions[0]) {
            // Classic mode
            tool.style.display = "none"; // 隐藏工具
            layoutContainer.classList.add('two-column-layout'); // 添加两列布局类
            layoutContainer.classList.remove('three-column-layout'); // 移除三列布局类

        } else if (this === layoutOptions[1]) {
            // Browse mode
            tool.style.display = "none"; // 隐藏工具
            layoutContainer.classList.add('three-column-layout'); // 添加三列布局类
            layoutContainer.classList.remove('two-column-layout'); // 移除两列布局类

        } else if (this === layoutOptions[2]) {
            // Tool mode
            tool.style.display = 'flex'; // 显示工具
        }
        mode.style.display = 'none'; // 隐藏布局容器
    });
});

三、产品360度展示

1、知识点

(1)Promise对象

Promise对象是一个构造函数,用来封装异步操作并且返回成功或者失败的结果
回调函数:函数A作为参数引入函数B,则称函数A为回调函数
可以防止“回调地狱”现象产生
回调地狱:多个异步代码需要按顺序执行产生多层嵌套现象,可读性极差

  • 存在一个异步任务
//封装一个异步操作
const p = new Promise((resolve,reject) => {
	//调用一下两个参数可相应改变promise状态的值
	resolve('获取成功')
	//或
	reject('获取失败')
})
p.then((data)=>{
	//then内部接受一个回调函数(resolve()),回调函数的参数设置为data
	console.log(data)
})
.catch((err)=>{
	console.log(err)
})
  • 存在两个异步任务
//封装一个异步操作
const p = new Promise((resolve,reject) => {
	//调用两个参数可改变promise状态的值
	resolve('获取成功')
	//或
	reject('获取失败')
})
p.then((data)=>{
	console.log(data)
	//分配第二个异步任务的功能,作为p.then的返回值
	return p1 = new Promise((resolve,reject) => {
		//调用两个参数可改变promise状态的值
		resolve('获取成功')
		//或
		reject('获取失败')
	})
})
//用于处理上一个then返回的promise对象
.then((data)=>{
	console.log(data)
})
.catch((err)=>{
	console.log(err)
})
(2)async、await语法糖

在promise的基础上简化了异步代码的编写。
async可以定义异步函数,使该函数返回一个promise对象。如果异步函数返回一个值则会被promise.resolve包装 如果异步函数返回异常则会被promise.reject包装。
await被用于被async定义的异步函数中,用于等待一个promise对象完成,并返回一个promise值。如果await后面不是一个promise对象,那么他会被转换成一个已解决的promise对象。

function one(){
	return 'one'
}
function two(){
	return new Promise((resolve,reject)=>{
		setTimeout(()=>{
			resolve('two')
		},2000)
	})
}
function three(){
	return 'three'
}
async function run(){
	console.log(one())
	console.log(await two())//可以等待two的异步函数执行完再往下继续执行
	console.log(three())
}
(3)Promise.resolve方法

可以将一个普通值转换为状态为fulfilled的promise对象

(4)reduce方法

reduce方法是js数组对象中的一个高阶方法,他对数组中的每个元素执行一个自定义的回调函数,并将结果汇总为单个值

语法:数组名.reduce(callback(accumulator,currentValue,currentIndex(可选),array()可选),initialValue(可选))
  1. 参数
  • callback是一个自定义的回调函数,参数可以设置accumulator,currentValue,currentIndex,array
    • accumulator:累加器,可保存上一次回调函数的返回值;在第一次调用回调函数时如果设置了initialValue,则accumulator初始值为initialValue,如果没有设置initialValue,则accumulator的初始值为数组中的第一个元素(必选)
    • currentValue:当前正在处理的数组元素(必选)
    • currentIndex:当前正在处理的数组元素的所以(可选)
    • array:调用reduce()方法的数组(可选)
  • initialValue:第一次调用callback函数时,accumulator的初始值(可选)
  1. 返回值
    reduce()方法最后一次回调函数的返回值

2、题解

简单的promise链式调用

const pipeline = (initialValue, sequence) => {
    // TODO: 待补充代码
    return sequence.reduce((promise,currentFn)=>{
        return promise.then((result)=>{
            return currentFn(result)
        })
    },Promise.resolve(initialValue))
};

在第一次调用时,promise对象为Promise.resolve(initialValue),其解决值为initialValue。
在后续调用中,promise对象为then方法中返回的新promise对象,其解决值为上一个函数调用后的值。

async await语法糖

const pipeline = async (initialValue, sequence) => {
    // TODO: 待补充代码
    let result = initialValue
    for (const fn of sequence){
        result = await fn(result)
    }
    return result
};

如果await后面不是一个promise对象,那么他会被转换成一个已解决的promise对象。

3、思路

pipeline函数的设计目标是按顺序依次执行sequence数组中的所有函数,并且每个函数的输入是上一函数的输出。

  1. 通过reduce方法遍历sequence数组,并且将返回值设置为初始值的已解决promise对象形式

在 pipeline 函数中,sequence 数组里的函数既可以是同步函数,也可以是返回 Promise 的异步函数。通过将初始值 initialValue 包装成一个已解决状态的 Promise(使用 Promise.resolve(initialValue)),可以确保后续处理的一致性。

  1. promise.then会在promise状态变为fulfilled时执行内部的回调函数(第一次循环时,initalValue已经是一个已解决的promise对象所以会立即执行回调函数)
  2. 在回调函数内部,currentFn(result)会调用当前函数,并传入上一个promise的结果作为参数result。

当currentFn是同步函数时,会立刻执行并且返回一个值,由于then的特性(then方法期望得到一个promise对象),返回的值会被包装成一个已解决的promise对象(Promise.resolve(返回值))。
当currentFn是异步函数时,会等待promise状态由pending转变为resolved,然后返回一个已解决的promise对象。

  1. 返回的已解决的promise对象会重新传入管道函数的参数promise累加器,进行下一轮的遍历

四、多表单检验

1、知识点

(1)Element-plus

ElementPlus 是一个基于 Vue 3 构建的开源 UI 组件库,它为开发者提供了一系列丰富、高质量且易于使用的组件,能够帮助开发者快速搭建美观、功能强大的 Web 应用程序。

(2)创建表单数据和校验规则

使用reactive来创建表单数据对象,同时定义校验规则。

  1. 创建表单数据
const form = reactive({
  name: '',
  sex: '',
  age: '',
  isCompetition: '',
  isEntrepreneurship: '',
  footnote: ''
})
  1. 创建校验规则
    通常使用rules对象定义每个表单字段的校验规则,每个规则的字段是一个数组,内部可以包含多个校验规则,常见的规则属性包括:
  • required表示该字段是否为必填项
  • message校验不通过时的错误提示信息
  • trigger制定验证逻辑的触发方式
    • blur失去焦点时触发
    • change值改变时触发
  • minmax用于限制字符串或数组的长度
  1. 自定义校验规则
    如果内置的校验规则无法满足需求时可以使用自定义校验函数,如:
const validatePassword = (rule, value, callback) => {
  if (value === "") {
    callback(new Error("请输入密码"));
  } else if (value !== ruleForm.pass) {
    callback(new Error("密码输入不一致"));
  } else {
    callback();
  }
};

在这个示例中,validatePassword 是一个自定义的校验函数,它接收三个参数:rule(当前校验规则)、value(当前字段的值)和 callback(回调函数)。在校验过程中,根据不同的情况调用 callback 函数,若校验通过则直接调用 callback(),若校验不通过则调用 callback(new Error(‘错误信息’)) 抛出错误。

(3)正则表达式检验

test 方法:test 是正则表达式对象的一个方法,它接受一个字符串作为参数,用于检测该字符串是否包含符合正则表达式规则的部分。如果找到匹配项,test 方法返回 true;否则返回 false。

(4)reactive函数
  • reactive是Vue3提供的一个函数,他的作用是将一个普通的JavaScript对象转换为一个响应式对象。当对象属性发生变化时,与之相关的视图会自动更新
  • reactive函数期望接受一个合法的对象字面量作为参数。对象字面量是由花括号包裹,包含一系列键对值的结构,键是属性名值可以是各种数据类型reactive函数内不能声明函数与变量,只能包含对象字面量

2、题解

// TODO:待补充代码
const rules = reactive({
  name:[
    {validator:validateName = (rule,value,callback) => {
    if(value === ''){
      callback(new Error('请输入姓名'))
    }else if (/[^\u4e00-\u9fa5]/g.test(value)){
      callback(new Error('只能输入汉字'))
    }else{
      callback()
    }
  },trigger:'blur'}
  ],
  sex:[
    {required:true,message:'请选择性别',trigger:'blur'}
  ],
  age:[
    {required:true,message:'请输入年龄',trigger:'blur'}
  ],
  isCompetition:[
    {required:true,message:'请选择是否参加过编程比赛',trigger:'blur'}
  ],
  isEntrepreneurship:[
    {required:true,message:'请选择是否有过创业经历',trigger:'blur'}
  ]
})

五、找回连接的奇幻之旅

1、知识点

(1)arguments

基本概念:arguments对象包含了函数调用时传入的所有参数,其索引从0开始,可以通过索引来访问每个参数。不过argument并不是真正的数组,他没有数组的方法(如map、filter),但是具备length属性,用于表示传入参数的数量。
虽然arguments并不是真正的数组,但是我们可以通过方法将其转化为真正的数组

  • Array.from()方法
  • 扩展运算符...:可以将多余的参数(传递的参数在函数内部未被使用)收集到一个真正的数组中。

2、题解

function resetableOnce(fn) {
    // TODO: 待补充代码
    let done = false
    let result
    function runOnce() {
       if(!done){
            result = fn(...arguments)
            done=!done
       }
       return result
    }
    function reset() {
       done = false
    }  
    // TODO: END
    return { runOnce, reset};
}

六、tree命令助手

1、知识点

(1)map方法

map()是数组的一个高阶函数,它用于对数组中的每个元素执行一个给定的函数,并返回一个新的数组,新数组中的元素是原数组元素经过函数处理后的结果。
map方法的特点:

  • 不改变原数组:map()方法不会改变原始数组,而是返回一个新的数组。
  • 按顺序执行:map()方法按照数组元素的顺序依次调用回调函数,并且新数组中的元素顺序与原数组一致。
  • 对稀疏数组的处理:map()方法会跳过数组中缺少的元素(即稀疏数组中的空位),不会为这些空位调用回调函数。

2、题解

// 生成文件树
function generateTree(dirPath) {
  // TODO:待补充代码
  const items = fs.readdirSync(dirPath)
  return items.map((item)=>{
    console.log('dirPath是:',dirPath);
    console.log('item是:',item);
    const itemPath =path.join(dirPath,item)
    console.log('itemPath是:',itemPath);
    if(fs.statSync(itemPath).isDirectory()){
      return {
        name:item,
        children:generateTree(itemPath)
      }
    }else{
      return {
        name:item
      }
    }
  })
}

七、Github明星项目统计

1、知识点

(1)filter方法

filter()方法是数组的一个常用高阶函数,用于创建一个新数组,其中包含通过特定条件筛选出来的原数组中的元素。
filter方法的特点:

  • 不改变原数组:filter()方法不会改变原始数组,而是返回一个新的数组,新数组中的元素是根据条件筛选出来的原数组中的部分元素。
  • 按顺序执行:filter()方法按照数组元素的顺序依次调用回调函数,并且新数组中的元素顺序与原数组中满足条件的元素顺序一致。
  • 对稀疏数组的处理:filter()方法会跳过稀疏数组中的空位,不会为这些空位调用回调函数,也不会将其包含在新数组中。
(2)slice方法

slice()方法是数组和字符串都具有的方法,用于提取原数组或字符串的一部分,并返回一个新的数组或字符串,而不改变原始数组或字符串

语法:array.slice(begin,end) 遵循左闭右开原则

(3)箭头函数

在箭头函数中如果使用花括号包裹函数体则需要return返回,不适用花括号包裹函数体则不需要return返回

(4)Vue.ref()
  • ref用于创建一个包含响应式数据的引用对象,当引用对象的值改变时vue会自动追踪值的变化并更新与之绑定的dom元素。
  • 访问和修改ref的值需要使用.value属性,在 Vue 3 的 <script setup> 语法糖中,在模板里使用 ref 对象时可以直接引用,无需添加 .value,Vue 会自动处理。但在 JavaScript 代码里,仍然需要使用 .value 来访问和修改值。

2、题解

//任务1
<div>
  筛选语言
  <!-- TODO: 待补充代码 -->
  <select name="language" id="language" @change="changeHandle" v-model="language">
    <option v-for='lang in languages' :value="lang">{{lang}}</option>
  </select>
</div>

//任务2
// 语言筛选改变时或页面数字输入框数字改变时的处理函数
const changeHandle = () => {
  // TODO:待补充代码
  let newData = chartData.value.filter((item)=>item.language === language.value)//响应式数据对象需要.value才能获取到具体数值
  if(language.value === 'All'){
    newData = chartData.value
  }
  newData = newData.slice(pageStart.value-1,pageEnd.value)
  xData.value = newData.map((item)=>item.name)
  yData.value = newData.map((item)=>item.stars)
  initChart();
};

八、小蓝驿站

1、知识点

(1)push方法

push方法是 JavaScript 中数组的一个常用方法,用于在数组的末尾添加一个或多个元素,并返回新数组的长度。

2、题解

//任务1
<!-- 联系人列表 -->
<ul class="contacts-list">
    <!-- TODO:待补充代码 目标 1  -->
    <!--A 为例 start -->
    <li class="contacts-group" v-for='(item,index) in contacts'>   <!-- 字母分组渲染 DOM 结构-->
        <div class="contacts-group-title">{{item.letter}}</div>  <!-- 分组的 字母名称 -->
        <ul>
            <li class="contact-item" v-for='i in item.contacts'> <!-- contact-item 人名渲染 dom 结构-->
                <span class="contact-name">{{i.name}}</span>
                <button class="del-contact-button">删除</button>
            </li>
        </ul>
    </li>
</ul>



//任务2
// 定义添加联系人的方法
const addContact = () => {
    // TODO:待补充代码 目标 2 
    let inp = document.querySelector('.add-contact-input')
    let inpFirst = inp.value[0].toUpperCase()
    let index = contacts.value.map((item)=>item.letter).indexOf(inpFirst)
    if(index>=0){
        return contacts.value[index].contacts.push({
            "name":inp.value
        })
    }else{
        return contacts.value.push({
            "letter":inpFirst,
            "contacts":[{"name":inp.value}]
        })
    }
    // TODO:END
    // 添加完成清空联系人输入框
    newContact.value = "";
};

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

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

相关文章

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器&#xff0c;我们常见的PO当中的这些成员变量的数据类型&#xff0c;它都有对应的处理器&#xff0c;因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…

力扣2454. 下一个更大元素 IV

力扣2454. 下一个更大元素 IV 题目 题目解析及思路 题目要求对于每个数&#xff0c;找到右边比它大的第二个数&#xff0c;并记录在ans数组中 如果是右边第一个大的&#xff0c;就用一个递减栈即可&#xff0c;栈顶元素如果<当前元素则弹出 第二个大数就要利用弹出的栈顶…

unity学习51:所有UI的父物体:canvas画布

目录 1 下载资源 1.1 在window / Asset store下下载一套免费的UI资源 1.2 下载&#xff0c;导入import 1.3 导入后在 project / Asset下面可以看到 2 画布canvas&#xff0c;UI的父物体 2.1 创建canvas 2.1.1 画布的下面是 event system是UI相关的事件系统 2.2 canvas…

Ollama部署与常用命令

Ollama是一款开源工具&#xff0c;其目标是简化大语言模型在本地环境的部署和使用。它支持多种流行的开源大语言模型&#xff0c;如 Llama 2、Qwen2.5等。 通过Ollama&#xff0c;用户无需具备深厚的技术背景&#xff0c;就能在普通的消费级硬件上快速搭建一个强大的语言处理环…

Visual Studio Code 远程开发方法

方法1 共享屏幕远程控制&#xff0c;如 to desk, 向日葵 &#xff0c;像素太差&#xff0c;放弃 方法2 内网穿透 ssh 第二个方法又很麻烦&#xff0c;尤其是对于 windows 电脑&#xff0c;要使用 ssh 还需要额外安装杂七杂八的东西&#xff1b;并且内网穿透服务提供商提供的…

C语言预编译

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

flowable-ui 的会签功能实现

场景&#xff1a;在进行智慧保时通开发时&#xff0c;有个协作合同入围功能&#xff0c;这个功能的流程图里有个评审小组&#xff0c;这个评审小组就需要进行会签操作&#xff0c;会签完成后&#xff0c;需要依据是否有不通过的情况选择下一步走的流程 思考步骤&#xff1a; 首…

大连指令数据集的创建--数据收集与预处理_02

1.去哪儿爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;去哪儿&#xff08;https://travel.qunar.com/trav…

STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动

SPI总线驱动整体上与I2C总线驱动类型&#xff0c;差别主要在设备树和数据传输上&#xff0c;由于SPI是由4根线实现主从机的通信&#xff0c;在设备树上配置时需要对SPI进行设置。 原理图可知&#xff0c;数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…

java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正

医院绩效考核管理系统&#xff0c;java医院绩效核算系统源码&#xff0c;采用多维度综合绩效考核的形式&#xff0c;针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求&#xff0c;对考核方案中各维度进行灵活配置&#xff0c;对各维…

C语言学习笔记-初阶(13)scanf介绍

当我们有了变量&#xff0c;我们需要给变量输入值就可以使用 scanf 函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数&#xff0c;下面看⼀个例子&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型&#xff0c;传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新&#xff0c;更是管理、文化、业务流程等全方位的变革。从零开始&#xff0c;如何带领一家传统制造企业走向数字化突破&#xff0c;是许多企业领导者面…

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时&#xff0c;或者某些三方SDK以来的管理后台&#xff0c;都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释&#xff1a; 华为AppGallery Connect简称 AGC平台&#xff0…

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…

Linux中文件目录类指令

1、pwd指令 基本语法&#xff1a;pwd 功能&#xff1a;显示当前工作目录的绝对路径 1.相对路径访问和绝对路径访问 当前处于home目录下&#xff0c;访问a.txt文件 相对路径访问&#xff1a;kim/better/a.txt&#xff0c;从当前位置开始定位 绝对路径访问&#xff1a;/home…

开源模型应用落地-LangChain实用小技巧-获取token消耗(五)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 计算 Token 消耗对有效管理和优化语…

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…