Knife4j的原理及应用详解(二)

本系列文章简介:

        在当今快速发展的软件开发领域,API(Application Programming Interface,应用程序编程接口)作为不同软件应用之间通信的桥梁,其重要性日益凸显。随着微服务架构的兴起,API的数量和复杂度急剧增加,如何高效地管理和维护这些API文档成为了开发者们面临的一大挑战。传统的文档编写方式往往依赖于手工操作,不仅效率低下且容易出错,难以满足现代软件开发的需求。

        Swagger,作为一款开源的API文档生成工具,凭借其自动化生成文档、支持多种语言及框架等特点,迅速在开发者中赢得了广泛的认可。然而,Swagger的默认UI界面在美观性和用户体验方面仍有提升空间,特别是对于追求高效和良好用户体验的现代应用而言。

        正是在这样的背景下,Knife4j应运而生。作为Swagger的增强解决方案,Knife4j不仅继承了Swagger强大的文档生成能力,还通过定制化的UI界面、增强的交互功能以及更灵活的配置选项,为开发者们提供了一个更加高效、易用且美观的API文档管理工具。

        本系列文章旨在深入探讨Knife4j的原理及其应用。首先,我们将简要介绍Knife4j的基本概念、主要功能及特点,以便读者对其有一个初步的了解。随后,我们将深入分析Knife4j的工作原理,包括它是如何与Swagger集成的、如何解析Swagger注解并生成API文档的,以及它如何通过定制化的UI界面和增强的交互功能来提升用户体验。

        希望通过全面而深入的剖析,帮助大家更好地理解并掌握Knife4j的原理及其应用,从而为现代软件开发中的API文档管理提供有力的支持。

        欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!

目录

一、引言

二、Knife4j概述

2.1 Knife4j简介

2.1.1 定义与起源

2.1.2 与Swagger的关系及区别

2.2 Knife4j主要功能与特点

2.2.1 自动API文档生成

2.2.2 美观的UI界面与增强的用户体验

2.2.3 高级功能:接口分组、请求示例、响应示例等

2.2.4 前后端分离架构的优势

三、Knife4j的原理

3.1 Swagger基础原理

3.2 Knife4j对Swagger的扩展与增强

3.3 核心技术解析

四、Knife4j的应用

五、Knife4j与其他工具的对比

六、案例分析

七、结论与展望

八、结语


一、引言

        Knife4j是一个基于Swagger构建的开源Java API文档工具,它为Java开发者提供了生成、展示和调试API文档的强大功能。Knife4j的前身是swagger-bootstrap-ui,取名Knife4j是希望它能像一把匕首一样小巧、轻量且功能强悍。Knife4j是专为Java MVC框架集成的Swagger生成Api文档的增强解决方案,旨在简化接口文档的编写和管理过程。

        本文将跟随《Knife4j的原理及应用详解(一)》的进度,继续介绍Knife4j。希望通过本系列文章的学习,您将能够更好地理解Knife4j的内部工作原理,掌握Knife4j的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Knife4j的潜力,为系统的高效运行提供有力保障。

二、Knife4j概述

2.1 Knife4j简介

2.1.1 定义与起源

1、定义

Knife4j是一款为Java MVC框架集成Swagger生成Api文档的增强解决方案。它基于Swagger进行开发,旨在简化接口文档的编写和管理,通过提供一套美观的界面,能够自动生成接口文档,并支持在线调试接口。Knife4j不仅具有小巧、轻量的特点,而且功能强悍,是Java后端项目中接口文档管理的重要工具。

2、起源

  1. 前身
    • Knife4j的前身是swagger-bootstrap-ui。为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j。
    • 更名后的Knife4j主要专注于前后端Java代码以及前端Ui模块的分离,使得在微服务架构下使用更加灵活。
  2. 命名由来
    • 取名knife4j是希望它能像一把匕首一样小巧、轻量,并且功能强悍。这一命名体现了开发者对工具高效、便捷、实用的追求。
  3. 发展
    • 随着微服务架构的普及和API文档的重要性日益凸显,Knife4j逐渐成为Java后端项目中不可或缺的一部分。它不仅能够自动生成接口文档,还支持在线调试接口,大大提高了开发效率和团队协作能力。
  4. 开源与社区
    • Knife4j是一个开源项目,其开源仓库位于GitHub等平台。这意味着开发者可以自由地获取和使用它,同时也可以为项目贡献自己的力量。通过社区的支持和反馈,Knife4j不断迭代更新,功能日益完善。

2.1.2 与Swagger的关系及区别

Knife4j与Swagger之间的关系及区别可以归纳如下:

关系

  1. 继承与发展:Knife4j是基于Swagger的增强解决方案,它继承了Swagger的核心理念和功能,并在此基础上进行了扩展和优化。
  2. 替代与互补:在许多情况下,Knife4j可以作为Swagger的替代品,提供更为丰富和强大的功能。同时,由于Knife4j完全遵循Swagger的使用方式,因此可以无缝切换,实现平滑过渡。

区别

  1. 界面与用户体验
    • Swagger:Swagger的默认界面相对较为朴素,随着系统功能的增加和接口数量的增长,其使用体验可能会逐渐下降,如请求参数为JSON时无法格式化、返回结果无法折叠、缺乏搜索功能等。
    • Knife4j:Knife4j在界面上进行了大幅优化,采用了更为炫酷和优雅的设计,同时增加了许多实用的功能,如请求参数的格式化、返回结果的折叠、搜索功能等,极大地提升了用户体验。
  2. 架构与灵活性
    • Swagger:Swagger的原始架构可能在一些微服务场景下显得较为臃肿,因为它通常将后端Java代码和前端UI混合打包。
    • Knife4j:为了契合微服务的架构发展,Knife4j将前后端Java代码以及前端UI模块进行了分离,使得在微服务架构下使用更加灵活。这种分离方式也减少了代码的耦合度,提高了系统的可维护性。
  3. 功能特性
    • Swagger:Swagger主要提供了API文档的生成、描述、调试和可视化等功能。
    • Knife4j:在保留Swagger所有功能的基础上,Knife4j还增加了许多增强功能,如接口排序、Swagger资源保护、导出Markdown、参数缓存等。这些功能使得Knife4j在API文档的管理和维护方面更加高效和便捷。
  4. 使用方式
    • SwaggerKnife4j在使用方式上非常相似,都支持通过注解来标记API信息,并通过配置来生成API文档。然而,由于Knife4j在Swagger的基础上进行了扩展和优化,因此在使用时可能需要添加额外的依赖或配置来启用Knife4j的增强功能。

综上所述,Knife4j与Swagger之间的关系是继承与发展的关系,而它们之间的区别则主要体现在界面与用户体验、架构与灵活性、功能特性以及使用方式等方面。在实际应用中,可以根据项目的具体需求和场景来选择合适的工具。

2.2 Knife4j主要功能与特点

2.2.1 自动API文档生成

Knife4j作为Swagger的增强UI实现,在自动API文档生成方面提供了极大的便利和强大的功能。以下是Knife4j在自动API文档生成方面的详细说明:

1. 集成Swagger

Knife4j基于Swagger/OpenAPI规范,通过集成Swagger的注解和配置,能够自动从Java代码中提取API信息,并生成对应的文档。这意味着开发者只需在代码中添加Swagger注解(如@Api@ApiOperation@ApiParam等),Knife4j就能根据这些注解自动生成详细的API文档。

2. 自动扫描与解析

Knife4j支持自动扫描项目中配置的包路径或类路径,识别并解析带有Swagger注解的类和方法。它会解析这些注解中的信息,如API的描述、请求参数、响应体、错误信息等,并将这些信息整理成结构化的API文档。

3. 实时更新

在开发过程中,随着代码的不断修改,API文档也需要实时更新以反映最新的接口信息。Knife4j支持实时扫描和解析功能,能够在代码修改后自动重新生成文档,确保文档与代码的一致性。

4. 可视化界面

Knife4j提供了美观且功能丰富的可视化界面,用于展示生成的API文档。界面上通常会以列表或树形结构展示所有API接口,用户可以点击具体的接口查看其详细信息,包括请求方法、路径、参数、响应体等。此外,Knife4j还支持在线调试接口,用户可以在界面上直接发送请求并查看响应结果。

5. 导出与分享

Knife4j生成的API文档支持多种格式的导出,如Markdown、HTML等。这方便了用户将文档导出到本地或分享给其他团队成员。导出的文档保留了原有的结构和样式,确保了在其他环境中的一致性和可读性。

6. 权限控制

对于包含敏感信息的API文档,Knife4j提供了权限控制功能。通过配置,可以设置不同的用户角色和权限,限制对API文档的访问。这有助于保护文档的安全性,防止敏感信息泄露。

7. 自定义与扩展

Knife4j支持一定程度的自定义和扩展。用户可以通过配置来调整文档的样式、布局等,以满足个性化的需求。此外,Knife4j还提供了插件和扩展点,允许开发者根据自己的需求添加额外的功能或修改现有功能。

8. 兼容性与扩展性

Knife4j兼容OpenAPI 2.0和OpenAPI 3.0规范,能够生成符合这些规范的API文档。这使得Knife4j能够很好地与各种API管理平台和服务集成使用。同时,Knife4j的架构和设计也考虑到了未来的扩展性,能够随着OpenAPI规范的更新和发展而不断演进。

综上所述,Knife4j通过集成Swagger、自动扫描与解析、实时更新、可视化界面、导出与分享、权限控制、自定义与扩展以及兼容性与扩展性等功能,为Java后端项目提供了强大的自动API文档生成能力。这使得开发者能够轻松地生成、维护和分享高质量的API文档,提高项目的开发效率和可维护性。

2.2.2 美观的UI界面与增强的用户体验

Knife4j作为一款为Java MVC框架集成Swagger生成Api文档的增强解决方案,其主要功能与特点之一便是其美观的UI界面与增强的用户体验。以下是对这一方面的详细阐述:

美观的UI界面

  1. 界面设计
    • Knife4j提供了一套简洁而美观的界面设计,相较于Swagger原生UI,其在视觉效果上进行了显著提升。这种设计不仅使得API文档更加易于阅读和理解,还提升了整体的用户体验。
    • 界面以树形结构展示接口信息,用户可以方便地浏览和查找所需的接口。同时,各个部分的布局合理,信息展示清晰,使得用户能够快速定位到所需的内容。
  2. 高度定制化
    • Knife4j支持高度定制化的界面设计,用户可以根据自己的需求对界面进行个性化设置。这种灵活性使得Knife4j能够更好地适应不同项目和团队的需求。
  3. 响应式设计
    • Knife4j的UI界面支持响应式设计,能够自动适应不同设备和屏幕尺寸的显示需求。这使得用户无论是在电脑、平板还是手机上查看API文档,都能够获得良好的浏览体验。

增强的用户体验

  1. 自动生成接口文档
    • Knife4j能够根据代码中的Swagger注解自动生成接口文档,包括接口信息、请求参数、响应参数等。这一功能极大地减少了编写接口文档的工作量,使得开发者可以更加专注于业务逻辑的实现。
  2. 在线调试接口
    • Knife4j支持在线调试接口,用户可以在界面上直接输入参数并发送请求,实时查看接口的返回结果。这一功能使得接口测试和调试变得更加便捷和高效,极大地提升了开发效率。
  3. 权限控制
    • Knife4j支持对接口文档的访问权限控制,可以设置不同的用户角色和权限。这一功能保障了接口文档的安全性,避免了敏感信息的泄露。
  4. 丰富的功能特性
    • 除了上述功能外,Knife4j还提供了接口排序、搜索、分组等功能,支持多种格式的输出。这些功能特性进一步提升了用户体验,使得API文档的管理和使用变得更加灵活和便捷。
  5. 与主流框架的集成
    • Knife4j能够与Spring Boot等主流Java框架很好地集成使用。这种集成性使得开发者可以更加方便地将Knife4j引入到自己的项目中,而无需进行额外的配置和适配工作。

综上所述,Knife4j以其美观的UI界面和增强的用户体验成为了Java后端项目中接口文档管理的重要工具。它不仅能够提升开发效率,还能够保障接口文档的安全性和易用性。

2.2.3 高级功能:接口分组、请求示例、响应示例等

Knife4j作为一款基于Swagger的API文档生成工具,不仅提供了基础的API文档生成功能,还具备了一系列高级功能,如接口分组、请求示例、响应示例等。以下是对这些高级功能的详细阐述:

1. 接口分组

功能描述
接口分组功能允许开发者将大量的接口按照不同的业务模块或功能进行分组管理,从而使得接口文档更加清晰、易于理解和维护。

实现方式

  • 在Controller类或方法上使用@Api注解的tags属性来指定接口所属的分组。例如,@Api(tags = "用户管理")表示该Controller类下的所有接口都属于“用户管理”分组。
  • Knife4j还支持通过配置类来动态创建分组,例如使用GroupedOpenApi来定义不同的分组,并通过DocketgroupRequests方法来指定每个分组包含哪些接口。

排序与自定义

  • 对于接口分组的排序,可以通过在@Tag注解上添加自定义属性(如extensions属性中的x-order)来实现,但需要注意的是,这种方法在不同版本的Knife4j中可能有所不同,具体实现方式需要参考官方文档。
  • 另外,还可以通过自定义配置类,在Docket的创建过程中添加自定义的排序逻辑,以实现更灵活的分组排序。

2. 请求示例

功能描述
请求示例功能允许在API文档中直接展示接口的请求示例,包括请求方法、请求URL、请求参数等。这对于接口的使用者来说非常有用,可以帮助他们快速了解如何正确地调用接口。

实现方式

  • 在Controller类的方法上使用@ApiOperation注解来描述接口的功能,并通过@ApiImplicitParam@ApiImplicitParams注解来定义请求参数。这些注解中的valueexample等属性可以用于生成请求示例。
  • Knife4j会自动解析这些注解,并生成相应的请求示例展示在API文档中。

3. 响应示例

功能描述
响应示例功能允许在API文档中展示接口的响应示例,包括响应状态码、响应头、响应体等。这对于接口的使用者来说同样非常有用,可以帮助他们快速了解接口的返回结果及其结构。

实现方式

  • 在Controller类的方法上,可以通过返回值的注解(如@ResponseBody配合@ApiResponse@ApiResponses)来定义接口的响应示例。这些注解中的responseexamples等属性可以用于生成响应示例。
  • 另外,Knife4j还支持在Model类上使用@ApiModel@ApiModelProperty等注解来定义响应体中的数据结构,这些注解中的信息也会被Knife4j用来生成响应示例。

查看与使用

  • 开发者可以在Knife4j生成的API文档中找到每个接口的响应示例部分,查看接口的返回结果及其结构。
  • 响应示例中的StatusCode、Headers、Body等信息可以帮助开发者了解接口的响应状态、数据格式和具体内容,从而进行接口调试和验证。

综上所述,Knife4j通过提供接口分组、请求示例、响应示例等高级功能,极大地提升了API文档的可读性和易用性,使得接口的使用和维护变得更加便捷和高效。

2.2.4 前后端分离架构的优势

Knife4j本身是一个为Java MVC框架集成Swagger生成API文档的增强解决方案,它主要关注于API文档的生成、展示和增强,并不直接涉及前后端分离架构的实现。然而,在探讨前后端分离架构时,我们可以从更广泛的角度来理解Knife4j在这种架构下可能带来的优势,尽管这些优势并非Knife4j直接提供,而是前后端分离架构本身所带来的。

前后端分离架构的优势主要包括以下几个方面:

  1. 更好的团队协作
    • 在前后端分离的架构中,前端和后端团队可以独立开发,各司其职,减少了彼此之间的依赖和耦合。这种分离使得开发过程更加清晰,提高了团队的协作效率和开发灵活性。
  2. 优化用户体验
    • 前后端分离可以实现异步数据加载和无需完整刷新页面,从而提供更流畅的用户体验。用户界面的更新可以更加迅速和动态,减少了页面闪烁和加载时间,提升了用户的使用感受。
  3. 性能优化
    • 由于前后端分离架构中,后端仅返回前端所需的数据,不再渲染HTML页面,这减少了网络传输的数据量,降低了服务器负载。同时,前端可以缓存数据并优化页面渲染,进一步提高了应用的性能。
  4. 适应多平台
    • 前后端分离架构允许通过相同的后端API为不同的前端(如Web端、移动端、桌面应用等)提供服务,从而实现了更好的多平台适配。这种灵活性使得应用可以轻松地扩展到不同的设备和平台上。
  5. 保护后端数据和逻辑
    • 在前后端不分离的架构中,前端直接访问后端的逻辑和数据,容易暴露后端的安全漏洞。而前后端分离通过API接口传输数据,可以更好地保护后端的数据和逻辑,提高了应用的安全性。
  6. 技术选型灵活
    • 前后端分离架构允许前端和后端团队选择最适合自己的技术栈进行开发,不受限于某一种特定的开发语言或框架。这种灵活性使得团队可以根据项目的需求和自身的优势来选择合适的技术方案。

虽然以上优势并非Knife4j直接提供,但Knife4j在前后端分离架构中的应用可以进一步增强API文档的管理和维护效率。例如,通过Knife4j自动生成并展示清晰的API文档,前端开发者可以更容易地理解后端提供的接口和数据结构,从而加快开发进度并减少沟通成本。同时,Knife4j提供的在线调试和测试功能也可以帮助开发者在开发过程中及时发现和解决问题。

综上所述,虽然Knife4j本身不直接提供前后端分离架构的优势,但它在这种架构下的应用可以进一步增强团队的协作效率、优化用户体验、提高性能、适应多平台、保护后端数据和逻辑以及实现技术选型的灵活性。

三、Knife4j的原理

3.1 Swagger基础原理

       详见《Knife4j的原理及应用详解(三)

3.2 Knife4j对Swagger的扩展与增强

       详见《Knife4j的原理及应用详解(三)

3.3 核心技术解析

       详见《Knife4j的原理及应用详解(四)

四、Knife4j的应用

       详见《Knife4j的原理及应用详解(五)

五、Knife4j与其他工具的对比

       详见《Knife4j的原理及应用详解(六)

六、案例分析

        详见《Knife4j的原理及应用详解(七)

七、结论与展望

        详见《Knife4j的原理及应用详解(七)

八、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频图文理解关联技术与创业团队(二)

上一篇:google gemini1.5 flash视频图文理解能力初探(一)提到了gemini 1.5 flash 可以对视频进行理解以及分析,但是整体在检索任务上效果不佳。 这几天参加了人工智能大会 网上收集,看一看有相似能力的一些技术点、创…

生物素化果胶粒子包裹药物阿霉素;DOX/Bio-PEC

生物素化果胶粒子包裹药物阿霉素(DOX/Bio-PEC)是一种新型的药物载体系统,结合了生物素和果胶多糖的优势,旨在提高药物的靶向性和控释性能。以下是对该系统的详细解析: 一、生物素化果胶粒子的制备 原理与步骤&#xff…

独立开发者系列(22)——API调试工具apifox的使用

接口的逻辑已经实现,需要对外发布接口,而发布接口的时候,我们需要能自己简单调试接口。当然,其实自己也可以写简单的代码调试自己的接口,因为其实就是简单的request请求或者curl库读取,调整请求方式get或者…

甄选范文“论区块链技术及应用”,软考高级论文,系统架构设计师论文

论文真题 区块链作为一种分布式记账技术,目前已经被应用到了资产管理、物联网、医疗管理、政务监管等多个领域。从网络层面来讲,区块链是一个对等网络(Peer to Peer, P2P),网络中的节点地位对等,每个节点都保存完整的账本数据,系统的运行不依赖中心化节点,因此避免了中…

MATLAB基础应用精讲-【数模应用】分层聚类(附python代码实现)

目录 前言 知识储备 层次聚类 1. 算法解读: 2. 步骤和细节: 3. 举例: 4. 算法评价: 5. 算法的变体: 算法原理 基本思想 分层聚类网络的原理 分层聚类网络的优势 分层聚类网络的应用领域 SPSSAU 分层聚类案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果…

Johnson Counter

目录 描述 输入描述: 输出描述: 参考代码 描述 请用Verilog实现4位约翰逊计数器(扭环形计数器),计数器的循环状态如下。 电路的接口如下图所示。 输入描述: input clk , input …

[氮化镓]Kevin J. Chen组新作—肖特基p-GaN HEMTs正栅ESD机理研究

这篇文章是发表在《IEEE Electron Device Letters》上的一篇关于Schottky型p-GaN栅极高电子迁移率晶体管(HEMTs)的正向栅极静电放电(ESD)机理研究的论文。文章由Jiahui Sun等人撰写,使用了基于碳化硅(SiC&a…

设计模式探索:观察者模式

1. 观察者模式 1.1 什么是观察者模式 观察者模式用于建立一种对象与对象之间的依赖关系,当一个对象发生改变时将自动通知其他对象,其他对象会相应地作出反应。 在观察者模式中有如下角色: Subject(抽象主题/被观察者&#xf…

第11章 规划过程组(二)(11.10制订进度计划)

第11章 规划过程组(二)11.10制订进度计划,在第三版教材第395~397页;文字图片音频方式 第一个知识点:定义及作用 分析活动顺序、持续时间、资源需求和进度制约因素,创建项目进度模型,从而落实项目…

六、数据可视化—Wordcloud词云(爬虫及数据可视化)

六、数据可视化—Wordcloud词云(爬虫及数据可视化) 也是一个应用程序 http://amueller.github.io/word_cloud/ Wordcloud词云,在一些知乎,论坛等有这样一些东西,要么做封面,要么做讲解,进行分析…

Java并发/多线程CompleteableFuture详解

目录 CompleteableFuture 创建 获得结果的方法 辅助方法 allOf和anyOf的区别 CompletableFuture 里大约有五十种方法,但是可以进行归类: 变换类 thenApply 消费类 thenAccept 执行操作类 thenRun thenApply/thenAccept/thenRun 结合转化类 thenCombine 结…

浅析Nginx技术:开源高性能Web服务器与反向代理

什么是Nginx? Nginx是一款轻量级、高性能的HTTP和反向代理服务器,也可以用作邮件代理服务器。它最初由俄罗斯的程序员Igor Sysoev在2004年开发,并于2004年首次公开发布。Nginx的主要优势在于其非阻塞的事件驱动架构,能够处理大量并…

python-24-零基础自学python while循环+交互+数据的存储

学习内容:《python编程:从入门到实践》第二版 知识点: 文件处理 with open()while 练习内容:10章练习题10-3、10-4、10-5 练习10-3:访客 编写一个程序,提示用户输入名字。用户做…

北森锐途人才竞聘盘点管理测评:高管领导力六大评判标准深度解析万达商管中国绿发等

北森锐途人才管理测评:高管领导力评判标准深度解析 在企业高管的盘点与竞聘测评领域,众多管理人才面临评估自身领导力的挑战。面对能力卓越、职级显赫的同僚,许多管理者感到缺乏一套权威且专业的评价体系。然而,无论是天赋异禀的领…

【回溯 - 1】46. 全排列

46. 全排列 难度:中等 力扣地址:https://leetcode.cn/problems/permutations/description/ 问题描述 给定一个 不含重复数字 的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nu…

ICMP隧道

后台私信找我获取工具 目录 ICMP隧道作用 ICMP隧道转发TCP上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 执行后门木马,本地上线 ICMP隧道转发SOCKS上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 ​执行后…

经常用借呗和花呗对征信有影响吗?

说起支付宝里的花呗和借呗,大伙儿肯定都不陌生,它们俩就像是支付宝里的信用贷款双胞胎,名字相近,性格却大相径庭。现在,这俩兄弟都乖乖地接入了央行的征信大家庭,你的每一次使用,都会被记录得清…

老师怎么快速发布成绩?

期末考试的钟声刚刚敲响,成绩单的发放却成了老师们的一大难题。每当期末成绩揭晓,老师们便要开始一项繁琐的任务——将每一份成绩单逐一私信给家长。这不仅耗费了大量的时间和精力,也让本就忙碌的期末工作变得更加繁重。然而,随着…

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例,打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”,点击打开,弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”,右边会出现自动导入文献…

SwiftUI知识点(二)

Animation import SwiftUIstruct AnimationBootcamp: View {State var isAnimation: Bool falsevar body: some View {VStack{Button("Button"){withAnimation(Animation.default//重复//autoreverses: true:A-B-A-B//false: A-B,A-B.repeat…