非常強的許可權管控,精細到頁面按鈕及API

口壤迅坎發表於2020-09-27

  最近在研究工單系統的時候,被我找到一個非常流弊的工單系統,我們都知道工單系統最麻煩的就是流程和模版的維護,並且,在工單處理過程中很可能會新增一些操作,這些操作被稱之為鉤子。就按我目前調研的結果來說,目前其實沒有啥工單系統能實現的這麼好的。

  這個工單系統就把流程設計,模版設計等等做的非常不錯,而且對許可權的把控非常詳細,包括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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章