非常強的許可權管控,精細到頁面按鈕及API
最近在研究工單系統的時候,被我找到一個非常流弊的工單系統,我們都知道工單系統最麻煩的就是流程和模版的維護,並且,在工單處理過程中很可能會新增一些操作,這些操作被稱之為鉤子。就按我目前調研的結果來說,目前其實沒有啥工單系統能實現的這麼好的。
這個工單系統就把流程設計,模版設計等等做的非常不錯,而且對許可權的把控非常詳細,包括API介面、選單、頁面按鈕許可權,都可以靈活的控制,非常的不錯。
Demo:http://fdevops.com:8001/#/dashboard
Github:
如果覺得不錯就給作者一個star,你的star沒準就是作者繼續維護下去的動力呢。
功能介紹
系統管理
使用者管理不僅僅包括了使用者,還有角色、職位、部門的管理,方便後面的工單處理人擴充套件。
對選單,頁面按鈕,甚至是API介面的管理。
登陸日誌,對使用者登陸和退出的日誌記錄。
流程中心
流程申請,對流程進行分類管理,方便維護與視覺化。
工單列表,拆分了4個分類,包括:我待辦的工單,我建立的工單,我相關的工單,還有所有工單。
轉交工單,如果你當前有別的事情在處理就可以把工單轉交給別人去處理。
結束工單,如果一個工單發展申請不對,許可權足夠的話,是可以直接結束工單的。
工單處理人的多樣化,不僅可以個人處理,還可以是部門、角色、變數。
處理人變數,根據使用者資料來自動獲得是該誰處理,比如:建立人,建立人leader,HRBP等等。
會籤,如果是多個選擇人的話,並且勾選了會籤功能,那麼就需要這些負責人都處理完成後才會透過。
任務管理,可以給任何階段繫結任務,相當於流程中的鉤子操作,實現的效果就是,工單完成,任務也就執行完成了,減少很多的人力成本。
通知方式的靈活性,可以透過任務給每個階段繫結通知方式,也可以給流程繫結全域性通知。
閘道器,支援排他閘道器和並行閘道器,排他閘道器即透過條件判斷,只要有一個條件透過,則可進入下一個階段;並行閘道器,即必須所有的階段都完成處理,才可以進行下一個階段
後面還會有很多的功能擴充套件,包括:加簽,催辦,子流程等等。
等等還有很多功能待研究。
資料結構設計
對於一個完整的工作流系統來說,我們需要有流程、模版、分組、使用者、任務等等,並且這些東西都是可以靈活定製的,因為如果不能靈活定製的話,對於普通的使用這來說是非常不方便的,所以對於一個好的工作流系統,是必須要實現靈活性的。
下面直接來展示一下,資料結構的設計圖。
工作流資料結構設計圖
流程分類
type Classify struct{
base.Model
Name string`gorm:"column:name;type:varchar(128)"json:"name"form:"name"`//分類名稱
Creator int`gorm:"column:creator;type:int(11)"json:"creator"form:"creator"`//建立者
}
func(Classify)TableName()string{
return"process_classify"
}
流程
type Info struct{
base.Model
Name string`gorm:"column:name;type:varchar(128)"json:"name"form:"name"`//流程名稱
Structure json.RawMessage`gorm:"column:structure;type:json"json:"structure"form:"structure"`//流程結構
Classify int`gorm:"column:classify;type:int(11)"json:"classify"form:"classify"`//分類ID
Tpls json.RawMessage`gorm:"column:tpls;type:json"json:"tpls"form:"tpls"`//模版
Task json.RawMessage`gorm:"column:task;type:json"json:"task"form:"task"`//任務ID,array,可執行多個任務,可以當成通知任務,每個節點都會去執行
Creator int`gorm:"column:creator;type:int(11)"json:"creator"form:"creator"`//建立者
}
func(Info)TableName()string{
return"process_info"
}
模版
type Info struct{
base.Model
Name string`gorm:"column:name;type:varchar(128)"json:"name"form:"name"binding:"required"`//模板名稱
FormStructure json.RawMessage`gorm:"column:form_structure;type:json"json:"form_structure"form:"form_structure"binding:"required"`//表單結構
Creator int`gorm:"column:creator;type:int(11)"json:"creator"form:"creator"`//建立者
Remarks string`gorm:"column:remarks;type:longtext"json:"remarks"form:"remarks"`//備註
}
func(Info)TableName()string{
return"tpl_info"
}
工單
type Info struct{
base.Model
Title string`gorm:"column:title;type:varchar(128)"json:"title"form:"title"`//工單標題
Process int`gorm:"column:process;type:int(11)"json:"process"form:"process"`//流程ID
Classify int`gorm:"column:classify;type:int(11)"json:"classify"form:"classify"`//分類ID
IsEnd int`gorm:"column:is_end;type:int(11);default:0"json:"is_end"form:"is_end"`//是否結束,0未結束,1已結束
State json.RawMessage`gorm:"column:state;type:json"json:"state"form:"state"`//狀態資訊
RelatedPerson json.RawMessage`gorm:"column:related_person;type:json"json:"related_person"form:"related_person"`//工單所有處理人
Creator int`gorm:"column:creator;type:int(11)"json:"creator"form:"creator"`//建立人
}
func(Info)TableName()string{
return"work_order_info"
}
工單繫結模版
type TplData struct{
base.Model
WorkOrder int`gorm:"column:work_order;type:int(11)"json:"work_order"form:"work_order"`//工單ID
FormStructure json.RawMessage`gorm:"column:form_structure;type:json"json:"form_structure"form:"form_structure"`//表單結構
FormData json.RawMessage`gorm:"column:form_data;type:json"json:"form_data"form:"form_data"`//表單資料
}
func(TplData)TableName()string{
return"work_order_tpl_data"
}
工單流轉歷史
type CirculationHistory struct{
base.Model
Title string`gorm:"column:title;type:varchar(128)"json:"title"form:"title"`//工單標題
WorkOrder int`gorm:"column:work_order;type:int(11)"json:"work_order"form:"work_order"`//工單ID
State string`gorm:"column:state;type:varchar(128)"json:"state"form:"state"`//工單狀態
Source string`gorm:"column:source;type:varchar(128)"json:"source"form:"source"`//源節點ID
Target string`gorm:"column:target;type:varchar(128)"json:"target"form:"target"`//目標節點ID
Circulation string`gorm:"column:circulation;type:varchar(128)"json:"circulation"form:"circulation"`//流轉ID
Processor string`gorm:"column:processor;type:varchar(45)"json:"processor"form:"processor"`//處理人
ProcessorId int`gorm:"column:processor_id;type:int(11)"json:"processor_id"form:"processor_id"`//處理人ID
CostDuration string`gorm:"column:cost_duration;type:varchar(128)"json:"cost_duration"form:"cost_duration"`//處理時長
Remarks string`gorm:"column:remarks;type:longtext"json:"remarks"form:"remarks"`//備註
}
func(CirculationHistory)TableName()string{
return"work_order_circulation_history"
}
任務
type Info struct{
base.Model
Name string`gorm:"column:name;type:varchar(256)"json:"name"form:"name"`//任務名稱
TaskType string`gorm:"column:task_type;type:varchar(45)"json:"task_type"form:"task_type"`//任務型別
Content string`gorm:"column:content;type:longtext"json:"content"form:"content"`//任務內容
Creator int`gorm:"column:creator;type:int(11)"json:"creator"form:"creator"`//建立者
Remarks string`gorm:"column:remarks;type:longtext"json:"remarks"form:"remarks"`//備註
}
func(Info)TableName()string{
return"task_info"
}
任務執行歷史
type History struct{
base.Model
Task int`gorm:"column:task;type:int(11)"json:"task"form:"task"`//任務ID
Name string`gorm:"column:name;type:varchar(256)"json:"name"form:"name"`//任務名稱
TaskType int`gorm:"column:task_type;type:int(11)"json:"task_type"form:"task_type"`//任務型別,python,shell
ExecutionTime string`gorm:"column:execution_time;type:varchar(128)"json:"execution_time"form:"execution_time"`//執行時間
Result string`gorm:"column:result;type:longtext"json:"result"form:"result"`//任務返回
}
func(History)TableName()string{
return"task_history"
}
安裝部署
go>=1.14
vue>=2.6
npm>=6.14
二次開發
後端
#1.獲取程式碼
git .git
#2.進入工作路徑
cd./ferry
#3.修改配置ferry/config/settings.dev.yml
vi ferry/config/settings.dev.yml
#配置資訊注意事項:
1.程式的啟動引數
2.資料庫的相關資訊
3.日誌的路徑
#4.初始化資料庫
go run main.go init-c=config/settings.dev.yml
#5.啟動程式
go run main.go server-c=config/settings.dev.yml
前端
#1.獲取程式碼
git _web.git
#2.進入工作路徑
cd./ferry_web
#3.安裝依賴
npm install
#4.啟動程式
npm run dev
上線部署
後端
#1.進入到專案路徑下進行交叉編譯(centos)
env GOOS=linux GOARCH=amd64 go build
更多交叉編譯內容,請訪問https://www.fdevops.com/2020/03/08/go-locale-configuration
#2.config目錄上傳到專案根路徑下,並確認配置資訊是否正確
vi ferry/config/settings.yml
#配置資訊注意事項:
1.程式的啟動引數
2.資料庫的相關資訊
3.日誌的路徑
#3.建立日誌路徑及靜態檔案經歷
mkdir-p log static/uploadfile
#4.初始化資料
./ferry init-c=config/settings.yml
#5.啟動程式,推薦透過"程式管理工具"進行啟動維護
nohup./ferry server-c=config/settings.yml>/dev/null 2>&1&
前端
#1.編譯
npm run build:prod
#2.將dist目錄上傳至專案路徑下即可。
mv dist web
#3.nginx配置,根據業務自行調整即可
server{
listen 8001;#監聽埠
server_name localhost;#域名可以有多個,用空格隔開
#charset koi8-r;
#access_log logs/host.access.log main;
location/{
root/data/ferry/web;
index index.html index.htm;#目錄內的預設開啟檔案,如果沒有匹配到index.html,則搜尋index.htm,依次類推
}
#ssl配置省略
location/api{
#rewrite^.+api/?(.*)$/$1 break;
proxy_pass api server即需要代理的IP地址
proxy_redirect off;
proxy_set_header Host$host;
proxy_set_header X-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
}
#登陸
location/login{
proxy_pass api server即需要代理的IP地址
}
#重新整理token
location/refresh_token{
proxy_pass api server即需要代理的IP地址
}
#介面地址
location/swagger{
proxy_pass api server即需要代理的IP地址
}
#後端靜態檔案路徑
location/static/uploadfile{
proxy_pass api server即需要代理的IP地址
}
#error_page 404/404.html;#對錯誤頁面404.html做了定向配置
#redirect server error pages to the static page/50x.html
#將伺服器錯誤頁面重定向到靜態頁面/50x.html
#
error_page 500 502 503 504/50x.html;
location=/50x.html{
root html;
}
}
自此專案就介紹完了,反正我覺得還是非常不錯的,如果你也覺得不錯,就給作者一個star吧。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69920894/viewspace-2724504/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一對一原始碼,前端頁面許可權和按鈕許可權控制原始碼前端
- springboot許可權設計思路(精確到按鈕級別)Spring Boot
- 【專案實踐】一文帶你搞定頁面許可權、按鈕許可權以及資料許可權
- 許可權管控
- 選單許可權和按鈕許可權設定
- 手把手教你搞定選單許可權設計,精確到按鈕級別
- vue要做許可權管理該怎麼做?如果控制到按鈕級別的許可權怎麼做?Vue
- 許可權安全管控的設計想法
- 超級實用!React-Router v6實現頁面級按鈕許可權React
- Android應用中,跳轉到App的詳細設定頁面,設定許可權頁面AndroidAPP
- 一個簡單的Vue按鈕級許可權方案Vue
- 使用Proftpd支援FTP/SFTP許可權管控FTP
- 手把手帶你開發一套使用者許可權系統,精確到按鈕級
- Vue 專案實現按鈕級別許可權管理Vue
- 前端單頁面應用的許可權管理前端
- 基於VUE自定義指令實現按鈕級許可權控制Vue
- Vue2-利用自定義指令實現按鈕許可權控制Vue
- 【自然框架】許可權的視訊演示(二):許可權到欄位、許可權到記錄框架
- 防止頁面按鈕多次點選
- uniapp頁面中的按鈕使用分享功能APP
- fastadmin 資料記錄行上新增操作按鈕並設定許可權AST
- 面試官問我按鈕級別許可權怎麼控制,我說v-if,面試官說再見面試
- android動態許可權到自定義許可權框架Android框架
- SpringSecurity許可權管理系統實戰—三、主要頁面及介面實現SpringGse
- 為 Charles 新增代理頁面按鈕(Rewrite)
- Bootstrap頁面佈局13 - BS按鈕boot
- API閘道器控制靈活,支援細粒度許可權控制API
- selenium 搜尋不到頁面最底部的按鈕
- vue實現後臺管理系統頁面功能和頁面路由許可權的控制Vue路由
- 使用Java API操作zookeeper的acl許可權JavaAPI
- android強制申請許可權Android
- Spring Boot 之 RESRful API 許可權控制Spring BootAPI
- Django REST framework API 指南(14):許可權DjangoRESTFrameworkAPI
- log1按鈕介質頁面跳轉
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- 許可權控制及AOP日誌
- Telescope 在生產環境配置的許可權,還是彈出 403 頁面