1. 程式人生 > >go-admin線上開發平臺學習-4[細節解析]

go-admin線上開發平臺學習-4[細節解析]

緊接著上一期的內容,繼續對`go-admin`的一些細節進行解析。 ## 通用的增刪改查方法 在`go-admin/common/actions`下封裝了通用的增刪改查方法。在對這些方法進行說明前,先移步到另一個資料夾下`go-admin/common/dto/generate.go&type.go` 這倆個檔案的內容在整個web請求中都至關重要,首先看 **type.go** 裡面只有倆個介面,根據筆者的實踐這倆個介面的作用應該是這樣的 Index 1、繫結查詢引數 2、分頁實體 Control 1、from表單或url例項繫結 2、dto轉換【轉換為資料庫實體】 golang中的介面實現總是很難受,沒有強型別的檢查,實現任一介面中的任一方法都算實現了這個介面。這就導致編碼時候很不好回溯誰是誰介面的實現。 **generate.go** 通過generate.go來對type.go進行分析能夠有一個簡單的認識。 Bind()方法實現的功能是,引數繫結到實體**ObjectById**中。GetId()實現的方法是返回繫結的引數。而這倆個方法就是上面**type.go**的介面實現。 那麼為什麼要這麼做呢?有什麼作用? 這個時候我們把目光就可以放回`/common/actions/create.go`中
按步驟進行解析 1、首先獲取資料庫例項**GetOrm()** 2、獲取當前web上下文ID**GenerateMsgIDFromContext()** > req := control.Generate() > > err = req.Bind(c) ![image-20210219155855698](https://gitee.com/happlyfox/img/raw/master/image-20210219155855698.png) 這倆段程式碼的理解是重中之重。control是一個介面型別,實現了這個介面的必定是一個Model,且這個實體肯定實現了Generate、GenerateM、Bind方法。我們去找一下在哪裡會有對此方法的實現。 ![image-20210219160107441](https://gitee.com/happlyfox/img/raw/master/image-20210219160107441.png) **go-admin/app/router/任一.go**檔案中執行CreateAction並且傳遞引數,引數是每一個路由請求的ViewModel。 那就比較好理解這一層邏輯了。首先在路由定義層面對不同路由的增刪改查方法傳遞viewModel的實體作為後續實體繫結的定義。這就有點像是.net mvc程式設計中控制器方法體形參定義的實體,只是在.net MVC是框架幫你繫結好了,而這裡需要自己從源頭定義繫結。 3、從viewModel轉換成資料庫Dto 4、附上建立人等屬性 5、呼叫資料庫建立方法,根據返回結果返回前臺json內容 ## 資料許可權檢查 go-admin可以選擇開啟資料許可權檢查,開啟後的表現為: 根據控制檯配置的內容,角色擁有不同的許可權 * 本部門 * 本部門及以下 * 自己 * 特定 如何理解?就是如果設定了當前角色的資料許可權為“自己”,那自己就只能看到且操作自己的記錄,其他的以此類推。 聽著好神奇,那麼具體是如何實現的呢? 首先要實現這樣的功能資料庫的表肯定要有一些特定的欄位,如下 * CreateBy 建立人 * UpdateBy 修改人 在後臺執行crud指令的時候附加T-sql語句,通過不同角色定義的許可權配置不同的語句,如下所示 ![image-20210219161835528](https://gitee.com/happlyfox/img/raw/master/image-20210219161835528.png) p := GetPermissionFromContext(c) //資料許可權檢查 db = db.WithContext(c).Scopes(Permission(object.TableName(), p) > Scopes是Gorm的一種用法 > > Scope 方法基於鏈式操作理論建立的。 > > 使用它,你可以提取一些通用邏輯,寫一些更可用的庫 執行順序 1、獲取通用資料許可權檢查 2、呼叫gorm.scopes方法 ,在執行crud操作時候附加許可權檢查where條件作為判斷