【Tessent Shell新手福音】:一步到位掌握LV Flow使用指南(全面解析+实战演练)
立即解锁
发布时间: 2025-03-18 07:13:19 阅读量: 118 订阅数: 30 


Tessent Shell ETChecker for the LV Flow User’s Manual

# 摘要
本文首先介绍了Tessent Shell及其与LV Flow的关系,阐述了Tessent Shell的语言特性与LV Flow的工作原理。随后,深入探讨了Tessent Shell在LV Flow中的具体应用实践,包括脚本编写、高级技巧以及自动化测试流程的设计与执行。文章还探讨了进阶技巧,如脚本性能优化、外部工具集成和脚本维护。此外,本文强调了在LV Flow中实施安全与合规性的重要性,并提出了相应的安全措施和实现方法。最后,本文展望了Tessent Shell与LV Flow的未来发展趋势,包括新特性介绍和社区资源分享,以及未来技术分享的成功案例和经验交流。通过本文的研究,读者能够全面了解Tessent Shell与LV Flow的使用方法,掌握提高工作效率和系统安全性的技术。
# 关键字
Tessent Shell;LV Flow;自动化测试;性能优化;安全合规;脚本维护
参考资源链接:[LV Flow 用户手册:Tessent Shell ETChecker 2018.3版](https://wenku.csdn.net/doc/14ng5z80w2?spm=1055.2635.3001.10343)
# 1. Tessent Shell简介与LV Flow概述
## 1.1 Tessent Shell的起源与发展
Tessent Shell是一种专为集成电路设计和测试环境打造的脚本语言。它由Mentor Graphics开发,旨在简化复杂的设计验证任务。随着半导体技术的不断进步,Tessent Shell逐渐发展成为一种功能强大且灵活的工具,支持自动化和高级测试流程控制。
## 1.2 LV Flow的定义和作用
LV Flow是基于Tessent Shell的一个流程框架,它提供了一套完整的测试执行环境。LV Flow使得工程师能够集中管理测试用例和测试数据,并优化测试过程中的资源利用。它不仅支持常规的测试执行,还能够集成先进的诊断和故障分析功能,从而提高测试的整体效率。
## 1.3 本章小结
在这一章中,我们介绍了Tessent Shell以及LV Flow的起源、发展和定义。Tessent Shell和LV Flow在现代集成电路测试领域扮演了重要角色,它们的合作使得复杂测试流程的管理变得更加高效和系统化。在接下来的章节中,我们将深入探讨Tessent Shell的语言特点、LV Flow的工作原理,并最终过渡到如何在实践中有效地应用这些工具。
# 2. Tessent Shell与LV Flow的理论基础
## 2.1 Tessent Shell语言解析
### 2.1.1 语言结构和语法概览
Tessent Shell 是一种专门为了满足特定领域(如半导体测试领域)需求而设计的脚本语言。它拥有简洁的语法和强大的表达能力,允许工程师直接与硬件设备进行交互,以此来执行各种测试和验证任务。
Tessent Shell 的语法在很大程度上受到传统编程语言如 C 和 Python 的影响,但同时也增加了一些专门针对硬件测试的特性。举个例子,它的语法支持直接定义和操作硬件资源,如寄存器、内存地址等。这使得 Tessent Shell 不仅能够在软件层面上进行控制,而且能够直接映射到硬件操作上,这在硬件测试中是非常重要的。
### 2.1.2 变量、数据类型及表达式
Tessent Shell 支持多种数据类型,包括基本的数值类型(整型、浮点型)、布尔类型和字符串类型。变量的声明和使用方式也与传统编程语言类似,但为了适应硬件测试的需要,Tessent Shell 提供了一种特别的数据类型——设备类型,用以描述和操作硬件资源。
```tessent
int counter = 0; // 声明一个整型变量
float ratio = 1.618; // 声明一个浮点型变量
bool isComplete = true; // 声明一个布尔型变量
string description = "Test case description"; // 声明一个字符串变量
```
在表达式方面,Tessent Shell 提供了丰富的操作符,包括算术操作符、比较操作符、逻辑操作符以及位操作符等。这些操作符的使用和传统编程语言中的使用方式基本一致,但特别的,Tessent Shell 对硬件操作提供了一系列的位操作表达式,方便直接对硬件进行位级控制。
## 2.2 LV Flow的工作原理
### 2.2.1 LV Flow的基本概念
LV Flow 是基于 Tessent Shell 的流程控制框架,它提供了一套完整的工作流管理机制,用于自动化测试和验证的整个生命周期。LV Flow 的核心是一个流程引擎,负责解析和执行定义的测试流程,这些流程通过 Tessent Shell 脚本来实现具体的测试任务。
流程在 LV Flow 中被定义为一系列的步骤(或称为任务),每个任务都对应执行一些特定的操作。LV Flow 支持顺序执行、条件分支、循环处理等流程控制结构,使得复杂的测试流程也能够清晰地表达和管理。更重要的是,LV Flow 支持并行处理,能够利用多核心处理器的能力,加快测试的执行速度。
### 2.2.2 流程控制与任务调度机制
在 LV Flow 中,流程控制的核心是任务调度机制。任务可以是同步的,也可以是异步的。同步任务会在前一个任务完成后才开始执行,而异步任务则可以并发执行,不等待前一个任务结束。为了有效地管理这些任务,LV Flow 引入了任务依赖的概念,即一个任务的执行依赖于其他任务的完成状态。
为了提高测试的效率,LV Flow 采用了基于优先级的任务调度策略。开发者可以为每个任务分配优先级,调度器根据优先级以及任务依赖关系来决定任务的执行顺序。通过这种方式,可以确保关键任务优先执行,进一步优化整体测试流程的性能。
任务调度的示例代码如下:
```tessent
// 定义一个基本任务
task exampleTask {
command: "echo 'Task executed'";
}
// 定义优先级和依赖关系
task highPriorityTask {
priority: "high";
depends on: [exampleTask];
}
task lowPriorityTask {
priority: "low";
depends on: [highPriorityTask];
}
```
## 2.3 LV Flow的配置与管理
### 2.3.1 配置文件结构与设置
LV Flow 的配置文件通常使用 YAML 或 JSON 格式来定义测试流程。这样的结构清晰,易于编写和修改。配置文件中不仅包含了任务的定义,还包括了测试流程的控制逻辑、环境变量、硬件资源分配等。
一个典型的 LV Flow 配置文件可能会如下所示:
```yaml
flows:
- flow_name: example_flow
description: "Example of LV Flow configuration"
tasks:
- task_name: init
command: "echo 'Initialising test environment'"
- task_name: execute_test
command: "echo 'Executing test cases'"
- task_name: cleanup
command: "echo 'Cleaning up test environment'"
dependencies:
- { task_name: execute_test, depends on: [init] }
- { task_name: cleanup, depends on: [execute_test] }
```
### 2.3.2 管理命令与故障排查
为了管理 LV Flow 的执行,Tessent Shell 提供了一系列的管理命令。这些命令允许用户启动、停止、暂停和重启流程,同时能够查询流程的当前状态和执行历史。
故障排查是流程管理中的一个重要方面,LV Flow 提供了日志记录和错误报告机制。遇到错误时,系统能够输出详细的调试信息,帮助用户快速定位问题所在。
管理命令示例:
```tessent
// 启动测试流程
flow start example_flow
// 暂停测试流程
flow pause example_flow
// 查看测试流程状态
flow status example_flow
// 重启测试流程
flow restart example_flow
```
在进行故障排查时,可以结合日志文件,如下面的日志片段所示:
```
[ERROR] Task 'execute_test' failed with exit code 1
[DEBUG] Command executed: "echo 'Executing test cases'"
[DEBUG] Output: "Error: Invalid test case specified"
```
通过这样的日志信息,可以快速发现是因为指定了无效的测试案例导致任务失败,并进行相应的调整。
# 3. Tessent Shell在LV Flow中的应用实践
## 3.1 编写基本LV Flow脚本
### 3.1.1 脚本框架和结构设计
编写LV Flow脚本时,首先要理解脚本的基本结构和框架设计原则。一个典型的LV Flow脚本包含以下几个部分:
- **头部声明**:用于声明脚本的语言和模块依赖。
- **模块定义**:将脚本分成多个可复用的模块。
- **脚本入口**:指定脚本的执行起点。
- **功能函数**:实现特定功能的函数。
- **数据处理**:对输入数据或输出数据进行处理。
- **资源管理**:包括内存、文件句柄等资源的初始化和清理。
- **错误处理**:确保脚本在遇到错误时能安全退出或恢复。
以下是一个简单的脚本示例,展示了这些结构要素:
```tessent
@language LVFlow
module main
// 脚本入口
entry_point
run_module(main)
// 定义模块
module main {
// 功能函数定义
function void do_something() {
// 函数体
}
}
```
设计脚本结构时要注意以下几个关键点:
- **模块化设计**:确保各个模块之间独立性高,便于维护和复用。
- **清晰的入口**:脚本的执行流程应该是清晰且容易理解的。
- **错误处理**:合理使用try-catch结构来处理潜在的异常情况。
- **可读性**:代码应该有良好的注释和格式,易于他人阅读和理解。
### 3.1.2 模块化编程和复用
在LV Flow中,模块化编程不仅提高代码的可维护性,也是提高代码复用率的重要手段。我们可以创建具有特定功能的模块,并在不同的脚本中重用这些模块。
#### 模块的创建和使用
模块的创建非常简单,就像上面的示例代码中展示的那样。一旦定义了模块,就可以在任何需要的地方调用它。以下是一个模块复用的例子:
```tessent
// 调用已存在的模块
run_module(another_module)
```
在模块化编程实践中,应该遵循以下几个原则:
- **高内聚低耦合**:每个模块应该专注于完成一个任务,并且与其它模块的关系尽可能少。
- **抽象层**:通过定义接口或抽象方法,使得模块之间的交互更加灵活。
- **参数化**:如果模块需要依赖外部数据或配置,应该通过参数传递。
- **单一职责**:每个模块应当只有一个改变的理由,即只负责一项职责。
## 3.2 高级LV Flow脚本技巧
### 3.2.1 变量作用域与生命周期
在LV Flow中,变量的作用域与生命周期的管理至关重要。正确的管理变量可以避免很多常见的编程错误,例如变量泄露、意外的变量覆盖等。
#### 作用域
在LV Flow中,变量作用域分为以下几个级别:
- **全局作用域**:在整个脚本中都可以访问的变量。
- **模块作用域**:在特定模块内定义的变量,无法在模块外部直接访问。
- **局部作用域**:在特定函数或代码块内定义的变量,仅在该区域可用。
#### 生命周期
变量的生命周期从创建开始,到其所属的作用域被销毁为止。在LV Flow中,理解变量生命周期可以帮助我们合理管理资源,避免内存泄漏等问题。
```tessent
module example {
// 局部变量
variable int local_var
function void func() {
// 在函数内部声明的变量,只在func内部可用
}
}
```
在编写脚本时,应该:
- 避免不必要的全局变量,以降低代码间的耦合。
- 在不再需要时及时清理局部变量,特别是对象和大数据结构。
- 使用生命周期较长的变量时,要确保及时的资源释放,避免内存泄漏。
### 3.2.2 错误处理和异常管理
正确的错误处理和异常管理是编写健壮脚本不可或缺的部分。LV Flow提供了丰富的错误处理机制,包括异常捕获、自定义错误信息等。
#### 异常捕获
在LV Flow中,可以通过try-catch语句来捕获和处理异常:
```tessent
try {
// 尝试执行的代码块
} catch (ExceptionType e) {
// 异常处理代码块
}
```
#### 自定义异常
如果需要,你可以自定义异常类型:
```tessent
exception MyException {
string message
}
throw new MyException("Custom error message.")
```
异常管理的最佳实践包括:
- 使用异常来处理那些预料之外的情况,而非普通流程控制的一部分。
- 提供足够详细的信息来描述异常情况,帮助开发者定位问题。
- 不要捕获异常后忽略它,至少应该打印出异常信息。
- 合理使用异常抛出机制,避免过度异常化,以免造成性能损失。
## 3.3 实战演练:自动化测试流程
### 3.3.1 设计自动化测试案例
设计自动化测试案例需要深入理解被测试产品的功能和流程。以下是设计测试案例的基本步骤:
1. **分析需求**:首先要对产品的功能需求进行详细分析,了解所有可能的使用场景。
2. **确定测试目标**:明确每个测试案例要验证的具体功能点。
3. **设计测试步骤**:根据功能点拆分成多个测试步骤。
4. **设定预期结果**:为每个测试步骤设定预期的结果,用于判断测试是否成功。
5. **编写测试脚本**:根据设计好的测试步骤和预期结果,编写自动化测试脚本。
#### 编写测试脚本
以Tessent Shell脚本实现自动化测试的基本结构:
```tessent
module test_script {
entry_point {
run_testcases()
}
function void run_testcases() {
// 执行测试案例
}
// 定义具体测试案例
function void test_case_1() {
// 测试步骤和验证逻辑
}
}
```
设计测试案例时应该:
- 确保测试覆盖了所有功能点和边界条件。
- 测试案例要独立,一个案例的失败不应影响其他案例的执行。
- 编写可读性强、可维护的测试脚本。
### 3.3.2 集成LV Flow执行测试
自动化测试脚本编写完成之后,接下来就是如何将其与LV Flow集成,并执行测试。
#### 集成步骤
1. **准备测试环境**:确保测试环境已经搭建好,所有依赖都已就绪。
2. **加载LV Flow执行器**:将LV Flow执行器集成到测试框架中。
3. **配置测试参数**:设置必要的测试参数,如日志级别、报告格式等。
4. **运行测试**:执行测试脚本并监控测试进度。
5. **生成测试报告**:收集测试结果并生成详细的测试报告。
#### 集成代码示例
```tessent
// 加载LV Flow执行器
load执行器路径
// 配置测试参数
set 参数名 参数值
// 运行测试脚本
run test_script
// 生成测试报告
generate_report 路径/报告名
```
集成LV Flow执行自动化测试时应该:
- 确保测试环境稳定,避免不必要的外部干扰。
- 正确配置测试执行器的参数,以获得最佳的测试效果。
- 详细的测试报告对于定位问题和分析结果非常重要。
通过上述内容,我们已经完成了编写基本LV Flow脚本的实践学习,深入探讨了脚本的结构设计、模块化编程以及高级技巧,同时也实际操作了自动化测试流程的整个周期。在实际项目中,结合这些知识,您可以创建更加健壮、可维护和高效的LV Flow脚本,为项目的自动化测试和持续集成提供有力支持。
# 4. Tessent Shell与LV Flow的进阶技巧
## 4.1 优化LV Flow脚本性能
### 4.1.1 性能监控工具介绍
在面对复杂的LV Flow脚本时,性能问题往往是影响脚本运行效率的关键因素。为了确保LV Flow脚本在实际应用中的高效运行,性能监控是必不可少的环节。常用的性能监控工具包括`flowtrace`, `flowprof`, 和`flowcheck`。这些工具能够提供脚本执行过程中的详细信息,包括但不限于函数调用次数、执行时间、资源消耗等,这些数据是性能优化的重要参考。
使用`flowtrace`可以追踪脚本中所有模块的调用链,而`flowprof`则为开发者提供了函数级别的性能分析。此外,`flowcheck`工具可以在脚本开发阶段就检查潜在的性能瓶颈。对于Tessent Shell的开发者而言,熟练使用这些工具是提升工作效率的重要手段。
### 4.1.2 脚本分析与性能调优
在获得了性能监控工具提供的数据后,开发者需要对数据进行分析,找出瓶颈所在。性能调优的过程往往涉及以下几个方面:
- 减少不必要的计算和操作。
- 优化数据结构和算法,减少时间复杂度和空间复杂度。
- 对耗时的操作使用异步执行,减少阻塞。
- 使用缓存技术减少对数据库或API的重复访问。
- 确保代码在逻辑上足够清晰,以利于后续维护和进一步优化。
在实际操作中,可以通过改写脚本的一部分,或者调整整体的逻辑流程来实现性能优化。此外,进行压力测试也是不可或缺的,它能模拟高负载情况下的脚本表现,进一步指导优化工作。
## 4.2 集成外部工具和库
### 4.2.1 集成第三方脚本和工具
在复杂的LV Flow应用场景中,集成第三方脚本和工具可以极大的提升开发效率和脚本功能。例如,可以通过`flowimport`命令将外部工具集成到LV Flow脚本中,或通过Tessent Shell的API与外部程序进行数据交换。
集成第三方工具时,需要考虑工具的兼容性、可靠性以及性能影响。因此,在引入外部工具前,开发者应详细测试和评估,确保集成后的系统稳定运行。同时,对外部工具的依赖管理也非常重要,需要通过合适的版本控制机制确保工具更新时不会影响现有流程。
### 4.2.2 库函数的创建与使用
在LV Flow和Tessent Shell的开发中,创建和使用库函数是一种常见的代码复用手段。库函数可以封装通用的功能或业务逻辑,便于在不同的脚本中重用。这不仅简化了代码结构,也有助于保持代码的一致性。
创建库函数时,开发者应注重封装性和可维护性,例如,遵循命名规则,保持接口简单清晰,以及做好文档说明。同时,合理组织函数库的结构,按照功能或业务领域进行分类,有助于提高开发者的使用效率。
## 4.3 调试与维护LV Flow脚本
### 4.3.1 脚本调试工具和技术
LV Flow脚本的调试是提高脚本质量和运行效率的重要步骤。Tessent Shell提供了`flowdebug`工具,支持断点设置、单步执行和变量查看等功能。通过这些功能,开发者可以逐步观察脚本的执行过程,快速定位问题所在。
除了使用内置的调试工具外,开发者还应掌握一些基本的调试技术,如打印调试、异常捕获和日志记录。这些技术可以帮助开发者在不同的开发和运行阶段快速诊断问题。
### 4.3.2 维护计划和版本控制
随着项目的发展,LV Flow脚本的维护和更新变得越来越重要。建立一个有效的维护计划,可以确保脚本的长期稳定运行。维护计划中应包括定期的代码审查、性能测试、以及安全审计等环节。
版本控制是脚本维护过程中不可或缺的一部分。使用`git`等版本控制系统,可以记录代码的变更历史,便于回溯和管理。此外,通过创建分支和合并请求,团队成员可以在不影响主分支的情况下进行独立开发,保证了代码的稳定性和团队协作的高效性。
```mermaid
graph LR
A[开始脚本维护] --> B[代码审查]
B --> C[性能测试]
C --> D[安全审计]
D --> E[更新维护计划]
E --> F[结束]
```
在本章节中,我们详细讨论了Tessent Shell与LV Flow的进阶技巧,包括性能优化、集成外部工具和库、以及调试与维护脚本的方法。通过掌握这些技巧,开发者能够提升LV Flow脚本的性能和稳定性,使其在自动化测试流程中发挥更大的价值。
# 5. 安全与合规性在LV Flow中的应用
## 5.1 安全性考虑与实践
### 5.1.1 脚本安全最佳实践
在自动化测试流程中,安全性的考量尤为重要。LV Flow脚本虽然可以极大地提升工作效率,但同时也需要确保脚本本身以及脚本运行的环境是安全的。脚本安全最佳实践主要包括以下几个方面:
- **最小权限原则**:在设计LV Flow脚本时,应遵循最小权限原则,仅赋予脚本执行其功能所必须的权限,避免因权限过高带来的安全风险。
- **敏感信息加密**:脚本中可能包含数据库密码、API密钥等敏感信息。应使用加密手段对这些信息进行保护,并确保存储在安全的位置。
- **代码审计**:定期对LV Flow脚本进行代码审计,检查潜在的安全漏洞,例如未使用的变量、文件路径硬编码等。
- **输入验证**:对所有外部输入进行严格验证,防止SQL注入、命令注入等攻击。
- **错误处理**:合理的错误处理可以防止敏感信息泄露。在脚本中应该有明确的异常捕获和错误日志记录机制。
### 5.1.2 审计与合规性检查
合规性是企业在进行自动化测试流程设计时必须遵守的一系列法律、政策和标准。在LV Flow脚本中实施合规性检查和审计,可以确保脚本的运行符合公司政策及行业标准。审计过程一般涉及以下步骤:
- **确定合规性要求**:明确脚本需要遵守的法律、政策和标准,比如ISO标准、GDPR等。
- **审计计划的制定**:根据合规性要求,制定审计计划和检查清单。
- **执行审计**:执行计划中的审计项目,可以是代码审计、系统审计、流程审计等。
- **审计结果记录**:记录审计过程中的发现,并整理为报告。
- **整改与复审**:对审计中发现的问题进行整改,并进行复审以确保整改效果。
## 5.2 实现安全的LV Flow流程
### 5.2.1 访问控制和认证机制
访问控制和认证机制是保障LV Flow流程安全的重要环节。确保只有授权的用户和脚本能够访问特定资源或执行敏感操作。以下是几个实用的访问控制和认证机制:
- **用户身份认证**:在脚本启动时,通过用户名和密码、两步验证或多因素认证等方式验证用户身份。
- **权限管理**:基于角色的访问控制(RBAC)可以帮助管理员分配和管理不同用户的权限。
- **操作审计**:记录所有用户和脚本的操作日志,以便于事后审计和分析。
### 5.2.2 安全框架和数据保护
在LV Flow中实施安全框架可以增强整体的保护能力,提高数据的安全性。以下是实施安全框架和数据保护时需要考虑的要点:
- **加密技术**:应用SSL/TLS加密网络传输,使用AES等算法对敏感数据进行存储加密。
- **安全框架集成**:集成了如OWASP、Fortify等安全框架,这些框架提供了丰富的安全检查点和漏洞防护措施。
- **数据备份与恢复**:定期备份LV Flow脚本和相关数据,确保在发生数据丢失或损坏时能够迅速恢复。
安全和合规性是企业持续运行和长期发展的基石,特别是在使用LV Flow进行自动化流程时,必须时刻把安全放在首位,通过最佳实践和严格的安全框架来保护企业资产和用户数据。
# 6. Tessent Shell与LV Flow的未来展望
随着信息技术的快速发展,Tessent Shell和LV Flow作为行业内的主流技术,也在不断进步。在未来,它们将如何发展?本章节将对Tessent Shell与LV Flow的未来展望进行探讨,分析新特性与更新前瞻,并探索社区资源和成功案例。
## 6.1 新特性与更新前瞻
Tessent Shell与LV Flow的每一次更新都可能带来颠覆性的变化。了解最新的版本特性能够帮助从业者更好地规划技术升级和适应市场变化。
### 6.1.1 最新版本特性解析
最新版本的Tessent Shell和LV Flow在功能和性能上都有了显著的提升。例如,Tessent Shell引入了更为强大的模块化编程特性,使得代码复用性和可维护性大幅提升。此外,LV Flow优化了其流程控制逻辑,加强了对并行和异步任务的支持,这在处理大规模并发测试时尤其有用。
```shell
# 示例:最新版本中的模块化编程示例
module mymodule {
function myfunc() {
echo "Function from mymodule"
}
}
# 调用模块中的函数
mymodule::myfunc()
```
### 6.1.2 未来发展趋势预测
在未来,预计Tessent Shell和LV Flow将更加注重与AI技术的结合,提供智能化的脚本编写和流程优化建议。同时,它们可能会加强安全功能,为用户提供更为安全可靠的工作环境。随着物联网(IoT)设备的增多,它们也可能推出更多支持物联网测试的特性。
## 6.2 社区与资源分享
一个活跃的社区能够为技术的推广和问题的解决提供很大帮助。在Tessent Shell和LV Flow的社区中,成员们互相交流、分享经验,共同推动技术的进步。
### 6.2.1 社区资源和学习平台
社区资源包括论坛、用户组、视频教程、在线文档等多种形式。这些资源可以为初学者提供学习的起点,为经验丰富的开发者提供深入交流的平台。例如,LV Flow社区提供了一个专区来讨论最新的测试用例设计,并且定期举办线上和线下的交流活动。
### 6.2.2 成功案例和经验交流
通过分享成功案例,开发者能够了解Tessent Shell和LV Flow在不同场景下的应用,并从中吸取经验。例如,一家知名半导体公司分享了如何使用LV Flow大幅提高其芯片测试效率,并通过Tessent Shell实现自动化回归测试,减少了80%的人工干预。
```plaintext
# 成功案例摘要示例
成功案例:使用LV Flow与Tessent Shell实现大规模芯片测试流程自动化
- 问题描述:大规模测试效率低下,人工干预过多
- 解决方案:通过LV Flow的流程优化,结合Tessent Shell进行自动化脚本开发
- 成果:测试周期缩短80%,错误检出率提高20%
```
在这一章节中,我们不仅回顾了Tessent Shell与LV Flow的最新进展和未来可能的发展方向,还探索了社区资源和成功案例分享的重要性。通过深入分析与讨论,我们希望能为IT行业从业者提供有价值的参考,并激发更多关于Tessent Shell与LV Flow的创新应用。
0
0
复制全文
相关推荐









