代碼生成器使用原理以及使用方法

代碼生成器使用原理以及使用方法

版本號:1.0

二Ο二五年二月

目錄

文檔介紹

1.1編寫目的

1.2文檔范圍

1.3讀者對象

系統設計

2.1設計目標

2.2設計思路

2.3代碼實現原理

使用方法

3.1如何使用

3.2如何修改?

對原程序的bug修改及簡化

4.1 一個bug

4.2 Controler層三個if改成接口形式1->3

4.3引擎中幾次替換修改為小的方法調用

4.4改進建議

文檔介紹

1.1編寫目的

1.讓修改者了解代碼執行過程,為未來可能的修改做準備。

2.讓使用者了解怎么使用,需要輸入哪些參數才能執行

1.2文檔范圍

代碼模塊組成,代碼執行過程解析,先前代碼的錯誤原因分析以及修改方法。

1.3讀者對象

有一定java基礎 知曉”類”?”注解”這些java內容以及使用方式。

系統設計

2.1設計目標

通用的代碼生成器。有幾個部分:

第一個部分:代碼模板的生成。

第二個部分:webmodelvo參數構建。

第三部分:webmodelvo轉為map。

第四部分:構建模板位置及目標位置。

第五部分:引擎實現。

2.2設計思路

代碼生成器幾乎代碼都是是通過 `OnlineGeneratorController` 類開始執行的。正常使用時應當從瀏覽器端輸入,下面介紹的是用main制作的樣例輸入。

1. 初始化 `onewebModelVo` 對象

WebModelVo onewebModelVo = OneMockWebModelVo.initWo();

作用

??調用 `OneMockWebModelVo.initWo()` 方法,初始化一個 `WebModelVo` 對象 `onewebModelVo`。 ?

??這個對象通常是一個數據模型(DTO 或 VO),用于描述單表模型的結構。 ?

??`onewebModelVo` 包含 14 個字段,其中 11 個是 `String` 類型。

思路 ?

??通過模擬數據(Mock Data)生成一個單表模型的數據對象,為后續的代碼生成提供輸入。

---

2.初始化 `OnlineGeneratorController` 并設置模板引擎

OnlineGeneratorController onlineGeneratorController = new OnlineGeneratorController();

onlineGeneratorController.setFreemakerEngine(new FreemakerEngineImpl());

作用

??創建 `OnlineGeneratorController` 的實例,用于控制代碼生成的過程。 ?

??設置 `FreemakerEngineImpl` 作為模板引擎,用于解析和生成代碼模板。

思路 ?

??`Freemaker` 是一個模板引擎,可以根據模板文件和數據模型生成代碼。 ?

??這里通過 `setFreemakerEngine` 方法將 `FreemakerEngineImpl` 注入到 `OnlineGeneratorController` 中,以便后續使用。

---

3.生成單表模型的代碼

onlineGeneratorController.codeGeneratesingletablewithouttree(onewebModelVo);

作用 ?

??調用 `codeGeneratesingletablewithouttree` 方法,傳入 `onewebModelVo` 作為參數,生成單表模型的代碼。

思路 ?

??`onewebModelVo` 描述了單表模型的結構,`codeGeneratesingletablewithouttree` 方法會根據這個結構生成對應的代碼文件(如實體類、DAO、Service 等)。

4.初始化 `treewebModelVo` 對象

WebModelVo treewebModelVo = TreeMockWebModelVo.initWo();

作用 ?

??調用 `TreeMockWebModelVo.initWo()` 方法,初始化一個 `WebModelVo` 對象 `treewebModelVo`。 ?

??這個對象通常用于描述樹形結構模型(如菜單、分類等)。

思路 ?

??通過模擬數據生成一個樹形結構模型的數據對象,為后續的代碼生成提供輸入。

5.生成樹形結構模型的代碼

onlineGeneratorController.codeGeneratesingletablewithouttree(treewebModelVo);

作用

??調用 `codeGeneratesingletablewithouttree` 方法,傳入 `treewebModelVo` 作為參數,生成樹形結構模型的代碼。

思路 ?

??`treewebModelVo` 描述了樹形結構模型的結構,`codeGeneratesingletablewithouttree` 方法會根據這個結構生成對應的代碼文件。

6.初始化 `onetomanywebModelVo` 對象

WebModelVo onetomanywebModelVo = OneToManyMockWebModelVo.initWo();

作用 ?

??調用 `OneToManyMockWebModelVo.initWo()` 方法,初始化一個 `WebModelVo` 對象 `onetomanywebModelVo`。 ?

??這個對象通常用于描述一對多關系模型(如訂單和訂單項)。

思路

??通過模擬數據生成一個一對多關系模型的數據對象,為后續的代碼生成提供輸入。

7.生成一對多關系模型的代碼

onlineGeneratorController.codeGeneratesingletablewithouttree(onetomanywebModelVo);

作用 ?

??調用 `codeGeneratesingletablewithouttree` 方法,傳入 `onetomanywebModelVo` 作為參數,生成一對多關系模型的代碼。

思路 ?

??`onetomanywebModelVo` 描述了一對多關系模型的結構,`codeGeneratesingletablewithouttree` 方法會根據這個結構生成對應的代碼文件。

---

總結

這段代碼的核心思路是通過模擬數據生成不同類型的模型(單表模型、樹形結構模型、一對多關系模型),然后調用 `OnlineGeneratorController` 的 `codeGeneratesingletablewithouttree` 方法生成對應的代碼。 ?

每個步驟的作用如下:

1. 初始化數據模型對象(`onewebModelVo`、`treewebModelVo`、`onetomanywebModelVo`)。

2. 設置模板引擎(`FreemakerEngineImpl`)。

3. 調用代碼生成方法,根據不同的模型生成代碼。

這種設計模式非常適合需要快速生成代碼的場景,例如代碼生成器、低代碼平臺等。

2.3代碼實現原理

2.2中提到了設計思路以及在什么時候調用什么類什么方法,這些都是在main函數里能看到的 2.3將進入這些類和方法作進一步研究。

先順著main往下看,WebModelVO是遇到的第一個類,里面的代碼定義了一個名為 `WebModelVo` 的 Java 類,它是一個數據模型類(Value Object,VO),用于封裝代碼生成器所需的相關配置和數據。以下是對代碼的詳細解釋:

1.類定義與注解

```java

@Slf4j

@Data

@SuperBuilder

@AllArgsConstructor

@NoArgsConstructor

@Component

public class WebModelVo implements Serializable {

@Slf4j ?

??這是 Lombok 提供的注解,用于自動生成日志對象 `log`,方便在類中直接使用日志功能。

@Data ?

??Lombok 注解,自動生成 `getter`、`setter`、`toString`、`equals` 和 `hashCode` 方法。

@SuperBuilder ?

??Lombok 注解,支持繼承的 Builder 模式,允許通過鏈式調用的方式創建對象。

@AllArgsConstructor 和 @NoArgsConstructor ?

??分別生成全參構造函數和無參構造函數。

@Component

??將該類標記為 Spring 的組件,使其可以被 Spring 容器管理。

implements Serializable

??實現 `Serializable` 接口,表示該類的對象可以被序列化(例如存儲到文件或通過網絡傳輸)。

2.字段定義

2.1 基本字段

private String author = "demo"; // 作者名稱,默認值為 "demo"

private String testmodulename = ""; // 測試模塊名稱

private String deploymodulename = ""; // 部署模塊名稱

private String testuserDefinePackage = ""; // 測試用戶自定義包名

private String deployuserDefinePackage = ""; // 部署用戶自定義包名

private EnumDeployWay enumDeployWay; // 部署方式枚舉

?這些字段用于存儲代碼生成器的配置信息,例如作者名稱、模塊名稱、包名等。

?部分字段有默認值(如 `author`),其他字段需要外部賦值。

2.2 客戶端相關字段

@NotEmpty

@Length(min = 10, max = 50)

private String codefromClientGUID = UUID.randomUUID().toString(); // 客戶端生成的唯一標識

```

-@NotEmpty

??表示該字段不能為空。

@Length(min = 10, max = 50)

??表示該字段的長度必須在 10 到 50 之間。

UUID.randomUUID().toString()

??生成一個唯一的標識符,用于標識客戶端請求。

2.3 輸出目錄字段

@NotNull

private String destinationOutPutDir; // 代碼生成目錄

@Length(min = 0, max = 100)

private String frontDestionOutPutDir; // 前端代碼生成目錄

@NotNull ?

??表示該字段不能為 `null`。

@Length(min = 0, max = 100) ?

??表示該字段的長度不能超過 100。

2.4 服務名稱與包名

private String servicename = "service"; // 服務名稱,默認值為 "service"

@Length(min = 5, max = 50)

private String packageName; // 包名,長度在 5 到 50 之間

servicename

??表示服務名稱,默認值為 `"service"`。

packageName

??表示代碼生成的包名,長度限制在 5 到 50 之間。

2.5 模型類型與表信息

private String jformType = "1"; // 表單類型,默認值為 "1"

@NotNull

private EnumModelType modeltype; // 模型類型枚舉

@NotNull

@Valid

private TableVoDomain tableVoDomain; // 表信息對象

jformType ?

??表示表單類型,默認值為 `"1"`。

EnumModelType ?

??枚舉類型,表示模型的類型(如單表模型、樹形模型等)。

TableVoDomain ?

??表示表信息的對象,使用 `@Valid` 注解表示需要對該對象進行嵌套驗證。

3.設計思路

數據封裝 ?

??`WebModelVo` 類封裝了代碼生成器所需的所有配置信息,包括作者、模塊名稱、包名、輸出目錄、模型類型等。

數據驗證: ?

??使用 Hibernate Validator 注解(如 `@NotEmpty`、`@NotNull`、`@Length`)對字段進行校驗,確保數據的合法性。

默認值 ?

??部分字段(如 `author`、`servicename`、`jformType`)設置了默認值,簡化了對象創建過程。

嵌套對象 ?

??通過 `TableVoDomain` 對象封裝表信息,支持復雜數據結構的嵌套驗證。

4.使用場景

代碼生成器 ?

??該類用于代碼生成器的配置管理,通過傳入不同的 `WebModelVo` 對象,生成不同類型的代碼(如單表模型、樹形模型等)。

數據校驗

??通過 Hibernate Validator 注解,確保傳入的數據合法,避免生成錯誤的代碼。

Spring 集成 ?

??通過 `@Component` 注解,該類可以被 Spring 容器管理,方便在其他組件中注入和使用。

總結

`WebModelVo` 是一個用于代碼生成器的數據模型類,封裝了代碼生成所需的配置信息,并通過注解實現了數據校驗和默認值設置。它的設計簡潔且易于擴展,適合用于代碼生成器、低代碼平臺等場景。

OneMockWebMode.intWo()的使用

public static WebModelVo initWo() throws Exception{
????WebModelVo wm = initWebModel();
????setWebModelWithoutTree(wm);
????return wm;
}//此方法在main第一個地方用到過 用于給別的變量賦值
//initWo 是一個靜態方法,用于初始化并返回一個 WebModelVo 對象。
//該方法調用了兩個輔助方法:initWebModel() 和 setWebModelWithoutTree(WebModelVo wm)。

這里的兩個輔助方法不再作詳細介紹 有興趣可以觀看 他們在同一個目錄底下。

OnlineGeneratorController onlineGeneratorController=new OnlineGeneratorController();
onlineGeneratorController.setFreemakerEngine(new FreemakerEngineImpl());

這里創建了onlineGeneratorController這個變量并實例化 下文簡稱小o

第二行,幫助小o選擇了FreemakerEngine接口底下的FreemakerEngineImpl這個類,小o里面的freemakerEngine變量接的就是FreemakerEngineImpl類了

注意!!!這個?FreemakerEngineImpl?類是一個基于 FreeMarker 模板引擎的代碼生成器實現類。它的主要功能是根據模板文件和輸入的數據模型(Map<String, Object>),生成目標代碼文件,在模板路徑和目標路徑的地方用到了硬編碼,直接移植有可能出錯。

onlineGeneratorController.codeGeneratesingletablewithouttree(onewebModelVo)

從這一步,正式開始執行引擎作用

這段代碼是一個 Spring Boot 控制器中的方法,用于根據傳入的 `WebModelVo` 對象生成代碼文件。它通過調用 `FreemakerEngine` 實現類(如 `FreemakerEngineImpl`)來處理 FreeMarker 模板,生成目標代碼文件。以下是代碼的詳細解釋:

1.方法簽名

public Result<?> codeGeneratesingletablewithouttree(@RequestBody @Validated WebModelVo webModelVo) throws Exception

作用

???這是一個 RESTful API 方法,用于處理 POST 請求。

???接收一個 JSON 格式的請求體,并將其轉換為 `WebModelVo` 對象。

???使用 `@Validated` 注解對 `WebModelVo` 對象進行校驗。

返回值

???返回 `Result<?>` 對象,表示操作結果(成功或失敗)。

2.方法邏輯

2.1 初始化模板路徑

?定義一個空字符串 `templatepath`,用于存儲模板路徑。

?創建一個 `ExtTemplateLocaltion` 對象,用于管理模板路徑。

2.2 初始化數據模型

?創建一個 `Map<String, Object>` 對象 `map`,用于存儲模板中需要替換的變量。

?從 `webModelVo` 中獲取模型類型(`enumModelType`),并根據模型類型設置不同的模板路徑和數據模型。

2.3 根據模型類型處理不同場景

`default.one`(單表模型)

???設置模板路徑為單表模型的路徑。

???使用 `OneMapSet` 類生成數據模型(`map`)。

??templatepath = "C:\\Users\\413448405\\Desktop\\codetemplateservice-master\\jeecg-boot\\jeecg-module-system\\jeecg-system-biz\\src\\main\\resources\\jeecg\\code-template-online\\default\\one\\java";

??ParentMapSetFromWebModelVo oneMapSet = new OneMapSet();

??oneMapSet.buildMap(map, webModelVo);

`default.tree`(樹形結構模型)

???設置模板路徑為樹形結構模型的路徑。

???使用 `TreeMapSet` 類生成數據模型(`map`)。

??templatepath = "C:\\Users\\413448405\\Desktop\\codetemplateservice-master\\jeecg-boot\\jeecg-module-system\\jeecg-system-biz\\src\\main\\resources\\jeecg\\code-template-online\\default\\tree\\java";

??new TreeMapSet().buildMap(map, webModelVo);

`default.onetomany`(一對多關系模型):

設置模板路徑為一對多關系模型的路徑。

??使用 `OneToManyMapSet` 類生成數據模型(`map`),包括主表和子表的信息。

??templatepath = "C:\\Users\\413448405\\Desktop\\codetemplateservice-master\\jeecg-boot\\jeecg-module-system\\jeecg-system-biz\\src\\main\\resources\\jeecg\\code-template-online\\erp\\onetomany\\java";

??OneToManyMapSet om = new OneToManyMapSet();

??om.buildMap(map, webModelVo);

??om.buildSonTableMap(map, webModelVo);

??om.buildSonTableColumnMap(map, webModelVo);

??map.put("ftl_description", webModelVo.getTableVoDomain().getTableTxt());

2.4補充數據模型

?向 `map` 中添加當前日期和格式化工具類:

??map.put("currentDate", NonceUtils.nowformat());

??map.put("Format", new SimpleFormat());

?2.5設置生成文件的路徑

創建一個 `ExtDestinationLocation` 對象,用于管理生成文件的目標路徑。

設置實體名稱和包名:

??destinationLocation.setEntityname(webModelVo.getTableVoDomain().getEntityName());

??destinationLocation.setEntitypackage(webModelVo.getPackageName());

?如果 `webModelVo` 中包含測試模塊名稱,則使用測試模塊名稱作為包名:

??if (webModelVo.getTestmodulename() != null) {

??????destinationLocation.setEntitypackage(webModelVo.getTestmodulename());

??}

2.6 生成文件

?調用 `freemakerEngine.processextenh` 方法,生成目標代碼文件:

??freemakerEngine.processextenh(map, templateLocaltion, destinationLocation);

2.7 返回結果

?返回操作成功的消息:

??return Result.ok("轉換成功");

3. 代碼中的關鍵點

模板路徑

???模板路徑是硬編碼的,建議將路徑配置在配置文件中,便于維護和移植。

數據模型生成

???根據不同的模型類型(單表、樹形結構、一對多關系),調用不同的類(如 `OneMapSet`、`TreeMapSet`、`OneToManyMapSet`)生成數據模型。

文件生成

使用 `FreemakerEngine` 實現類(如 `FreemakerEngineImpl`)處理 FreeMarker 模板,生成目標代碼文件。

使用方法

3.1如何使用

本程序的要點就在于FreemakerEngine這一部分,引擎有三個輸入 分別是map,模板路徑,目標路徑,簡單原理則為將map內容貼到模板上生成到目標路徑上。調用OnlineGeneratorController?里的內容可以修改輸入的map,更改templatepath可以變更模板位置,更改destinationLocation可以更新目標路徑

3.2如何修改?

如果想增加模版類型,就新增一個類掛在Select接口下面,如圖

如果想修改生成位置 在下圖所示部分修改

destinationLocation類如圖部分 修改路徑(生成位置)

對原程序的bug修改及簡化

4.1 一個bug

Bug位于FreemakerEngineImpl類中,原先代碼實現生成結束后,tablename這一位置永遠是null,經過debug發現在引擎部分tablenanme根本沒有被添加到路徑上,經過更改后tablename已經被添加,在圖中if和else中用了兩種方式,if中使用destinationLocation.getEntitypackage()方法從傳入的參數找路徑,else則是用String entitypackage = (String) map.get("tableName");直接去上一場map對象里去挖路徑。

4.2 Controler層三個if改成接口形式1->3

把它改成接口類型 這樣后續改進時候只需要新增類 而不需要在controller里面修改

以前輸入方式是直接更改代碼,更改為從瀏覽器輸入更為合適。

圖中紅框為代替controller里if的部分

4.3引擎中幾次替換修改為小的方法調用

4.4改進建議

用絕對路徑非常不友好,不方便移植。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85085.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85085.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85085.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32標準庫-I2C通信

文章目錄 一、I2C通信1.1 I2C1.2硬件電路1.3I2C時序基本單元1.4I2C時序 二、MPU60502.1簡介2.2MPU6050參數2.3硬件電路2.4MPU6050框圖 三、I2C外設(硬件)3.1簡介3.2I2C框圖3.3I2C基本結構3.4主機發送3.5主機接收3.6軟件/硬件波形對比1. 時序精度2. 信號穩定性3. 速率與效率4. 波…

使用 Azure LLM Functions 與 Elasticsearch 構建更智能的查詢體驗

作者&#xff1a;來自 Elastic Jonathan Simon 及 James Williams 試用這個示例房地產搜索應用&#xff0c;它結合了 Azure Gen AI LLM Functions 與 Elasticsearch&#xff0c;提供靈活的混合搜索結果。在 GitHub Codespaces 中查看逐步配置和運行該示例應用的方法。 更多閱讀…

模糊查詢 的深度技術解析

以下是 模糊查詢 的深度技術解析&#xff0c;涵蓋核心語法、通配符策略、性能優化及實戰陷阱&#xff1a; &#x1f50d; 一、核心運算符&#xff1a;LIKE SELECT * FROM 表名 WHERE 列名 LIKE 模式字符串;&#x1f3af; 二、通配符詳解 通配符作用示例匹配案例%任意長度字符…

[論文閱讀] (39)EuroSP25 CTINEXUS:基于大模型的威脅情報知識圖譜自動構建

《娜璋帶你讀論文》系列主要是督促自己閱讀優秀論文及聽取學術講座&#xff0c;并分享給大家&#xff0c;希望您喜歡。由于作者的英文水平和學術能力不高&#xff0c;需要不斷提升&#xff0c;所以還請大家批評指正&#xff0c;非常歡迎大家給我留言評論&#xff0c;學術路上期…

強化學習三大分類

核心目標&#xff1a; 教會一個智能體&#xff08;比如機器人、游戲AI、推薦系統&#xff09;通過試錯和獎勵&#xff0c;學會在某個環境中完成特定任務的最佳策略。 核心角色&#xff1a; 智能體 (Agent)&#xff1a; 學習者&#xff0c;比如玩游戲的小人、控制溫度的空調系…

城市排水生命線安全運行監測項目

近年來&#xff0c;城市內澇、污水溢流等問題頻發&#xff0c;讓排水管網這一"城市生命線"的安全運行備受關注。如何讓地下的"毛細血管"更智能、更可靠&#xff1f;本文將帶您深入解析城市排水生命線安全運行監測項目的建設邏輯與技術內核&#xff0c;看科…

LeetCode - 34. 在排序數組中查找元素的第一個和最后一個位置

題目 34. 在排序數組中查找元素的第一個和最后一個位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左邊界 初始化 left 0, right nums.size() - 1 當 left < right 時循環&#xff1a; 計算中點 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指靈巧手DG-4F:18自由度與多種抓取模式結合實現高精度操作

Tesollo四指靈巧手 DG-4F 是一款具備 18 自由度的多模態末端執行器&#xff0c;采用模塊化結構設計&#xff0c;融合人手靈活性與夾爪高效性特點。該產品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流機器人平臺&#xff0c;適用于工業自動化、科…

深入淺出JavaScript 原型鏈:對象繼承的“隱形鏈條”

深入淺出JavaScript 原型鏈&#xff1a;對象繼承的“隱形鏈條” 在 JavaScript 的世界里&#xff0c;原型鏈&#xff08;Prototype Chain&#xff09;是一個核心概念。它如同一條隱形的鏈條&#xff0c;連接著所有對象&#xff0c;使得代碼能夠高效地共享屬性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的數據類型 bool&#xff1a; 布爾類型 0 或者 1 CHAR&#xff1a; 單字符的字符 CHAR&#xff08;n&#xff09;:多字節字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可變長度的字符型 TINYINT &#xff1a; 單字節整型 SMALLINT&#x…

打卡第48天:隨機函數與廣播機制

知識點回顧&#xff1a; 隨機張量的生成&#xff1a;torch.randn函數卷積和池化的計算公式&#xff08;可以不掌握&#xff0c;會自動計算的&#xff09;pytorch的廣播機制&#xff1a;加法和乘法的廣播機制 ps&#xff1a;numpy運算也有類似的廣播機制&#xff0c;基本一致 …

學習昇騰開發的第四天--基本指令

1、查看npu當前狀態信息 npu-smi info 2、查看NPU的ID npu-smi info -l3、調用python python3 4、修改用戶名 su - HwHiAiUser 5、查看cann版本 cat /usr/local/Ascend/ascend-toolkit/latest/compiler/version.info 6、刪除文件夾 sudo rm -rf HelloWorld7、在本地環…

vue3 - 自定義hook

自定義hook 簡單點來說就是將人物或者訂單的所有數據和方法放在一個ts文件里面 這樣便于維護 假如一個人只需要管 人物的模塊 那他只需要操作usePerson.ts文件就可以了 //useDog.ts import { ref,reactive} from vue; import axios from axios;export default function(){…

【python】bash: !‘: event not found

報錯 # 2. 測試smplx是否工作&#xff08;可能不需要chumpy&#xff09; python -c "import smplx; print(? smplx works!)"bash: !: event not found 分析 這是bash的歷史擴展問題&#xff0c;感嘆號被解釋為歷史命令。用這些方法解決&#xff1a; &#x1f680…

【Python打卡Day47】注意力熱力圖可視化@浙大疏錦行

可視化空間注意力熱力圖的意義&#xff1a; 提升模型可解釋性 熱力圖能直觀展示模型決策的依據區域&#xff0c;破除深度學習"黑箱"困境。例如在圖像識別中&#xff0c;可以看到模型識別"貓"是因為關注了貓耳和胡須區域&#xff0c;識別"禁止通行&qu…

樹狀數組 2

L - 樹狀數組 2 洛谷 - P3368 Description 如題&#xff0c;已知一個數列&#xff0c;你需要進行下面兩種操作&#xff1a; 將某區間每一個數加上 x&#xff1b; 求出某一個數的值。 Input 第一行包含兩個整數 N、M&#xff0c;分別表示該數列數字的個數和操作的總個數。…

YOLOv2 技術詳解:目標檢測的又一次飛躍

&#x1f9e0; YOLOv2 技術詳解&#xff1a;目標檢測的又一次飛躍 一、前言 在 YOLOv1 提出后&#xff0c;雖然實現了“實時性 單階段”的突破&#xff0c;但其在精度和小物體檢測方面仍有明顯不足。為了彌補這些缺陷&#xff0c;Joseph Redmon 等人在 2017 年提出了 YOLOv2…

JAFAR Jack up Any Feature at Any Resolution

GitHub PaPer JAFAR: Jack up Any Feature at Any Resolution 摘要 基礎視覺編碼器已成為各種密集視覺任務的核心組件。然而&#xff0c;它們的低分辨率空間特征輸出需要特征上采樣以產生下游任務所需的高分辨率模式。在這項工作中&#xff0c;我們介紹了 JAFAR——一種輕量級…

SamWaf 開源輕量級網站防火墻源碼(源碼下載)

SamWaf網站防火墻是一款適用于小公司、工作室和個人網站的開源輕量級網站防火墻&#xff0c;完全私有化部署&#xff0c;數據加密且僅保存本地&#xff0c;一鍵啟動&#xff0c;支持Linux&#xff0c;Windows 64位,Arm64。 主要功能&#xff1a; 代碼完全開源 支持私有化部署…

79Qt窗口_QDockWidget的基本使用

目錄 4.1 浮動窗?的創建 4.2 設置停靠的位置 浮動窗? 在 Qt 中&#xff0c;浮動窗?也稱之為鉚接部件。浮動窗?是通過 QDockWidget類 來實現浮動的功能。浮動窗 ??般是位于核?部件的周圍&#xff0c;可以有多個。 4.1 浮動窗?的創建 浮動窗?的創建是通過 QDockWidget…