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

緊接着上一期的內容,繼續對go-admin的一些細節進行解析。golang

通用的增刪改查方法

go-admin/common/actions下封裝了通用的增刪改查方法。在對這些方法進行說明前,先移步到另外一個文件夾下go-admin/common/dto/generate.go&type.goweb

這倆個文件的內容在整個web請求中都相當重要,首先看sql

type.go數據庫

image-20210219153351397

裏面只有倆個接口,根據筆者的實踐這倆個接口的做用應該是這樣的編程

Indexjson

一、綁定查詢參數mvc

二、分頁實體app

Control框架

一、from表單或url實例綁定編碼

二、dto轉換【轉換爲數據庫實體】

golang中的接口實現老是很難受,沒有強類型的檢查,實現任一接口中的任一方法都算實現了這個接口。這就致使編碼時候很很差回溯誰是誰接口的實現。

generate.go

image-20210219155026460

經過generate.go來對type.go進行分析可以有一個簡單的認識。

Bind()方法實現的功能是,參數綁定到實體ObjectById中。GetId()實現的方法是返回綁定的參數。而這倆個方法就是上面type.go的接口實現。

那麼爲何要這麼作呢?有什麼做用?

這個時候咱們把目光就能夠放回/common/actions/create.go

image-20210219155352893

按步驟進行解析

一、首先獲取數據庫實例GetOrm()

二、獲取當前web上下文IDGenerateMsgIDFromContext()

req := control.Generate()

err = req.Bind(c)

image-20210219155855698

這倆段代碼的理解是重中之重。control是一個接口類型,實現了這個接口的一定是一個Model,且這個實體確定實現了Generate、GenerateM、Bind方法。咱們去找一下在哪裏會有對此方法的實現。

image-20210219160107441

go-admin/app/router/任一.go文件中執行CreateAction而且傳遞參數,參數是每個路由請求的ViewModel。

那就比較好理解這一層邏輯了。首先在路由定義層面對不一樣路由的增刪改查方法傳遞viewModel的實體做爲後續實體綁定的定義。這就有點像是.net mvc編程中控制器方法體形參定義的實體,只是在.net MVC是框架幫你綁定好了,而這裏須要本身從源頭定義綁定。

三、從viewModel轉換成數據庫Dto

四、附上建立人等屬性

五、調用數據庫建立方法,根據返回結果返回前臺json內容

數據權限檢查

go-admin能夠選擇開啓數據權限檢查,開啓後的表現爲:

根據控制檯配置的內容,角色擁有不一樣的權限

  • 本部門
  • 本部門及如下
  • 本身
  • 特定

如何理解?就是若是設置了當前角色的數據權限爲「本身」,那本身就只能看到且操做本身的記錄,其餘的以此類推。

聽着好神奇,那麼具體是如何實現的呢?

首先要實現這樣的功能數據庫的表確定要有一些特定的字段,以下

  • CreateBy 建立人

  • UpdateBy 修改人

    在後臺執行crud指令的時候附加T-sql語句,經過不一樣角色定義的權限配置不一樣的語句,以下所示

    image-20210219161835528

    p := GetPermissionFromContext(c) //數據權限檢查

    db = db.WithContext(c).Scopes(Permission(object.TableName(), p)

Scopes是Gorm的一種用法

Scope 方法基於鏈式操做理論建立的。

使用它,你能夠提取一些通用邏輯,寫一些更可用的庫

執行順序

一、獲取通用數據權限檢查

二、調用gorm.scopes方法 ,在執行crud操做時候附加權限檢查where條件做爲判斷依據。

相關文章
相關標籤/搜索