我的第一個python web開發框架(37)——職位管理功能

来源:https://www.cnblogs.com/EmptyFS/archive/2018/09/06/9601845.html
-Advertisement-
Play Games

對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。 為了方便職位管理,我們可以將頁面設計成下麵這個樣子 左邊顯示部分列表,點擊其中一 ...


  對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。

  為了方便職位管理,我們可以將頁面設計成下麵這個樣子

  左邊顯示部分列表,點擊其中一個項後,右邊顯示對應部門的職位,然後再對職位進行增、改、刪等操作

  左邊我們可以直接使用上一章的部門列表介面,然後將jqGrid前端組件修改一下,只顯示名稱一列就可以了

  然後在前端代碼中的jqGrid組件中,增加onSelectRow方法,點擊列表項時執行右邊列表查詢和刷新操作就可以了。

  右邊需要增加職位列表查詢介面,查詢時需要提交部門id作為查詢條件,具體介面代碼如下:

 1 @get('/system/positions/')
 2 def callback():
 3     """
 4     獲取列表數據
 5     """
 6     # 部門id
 7     department_id = convert_helper.to_int0(web_helper.get_query('department_id', '部門id'))
 8     # 頁面索引
 9     page_number = convert_helper.to_int1(web_helper.get_query('page', '', is_check_null=False))
10     # 頁面頁碼與顯示記錄數量
11     page_size = convert_helper.to_int0(web_helper.get_query('rows', '', is_check_null=False))
12     sidx = web_helper.get_query('sidx', '', is_check_null=False)
13     sord = web_helper.get_query('sord', '', is_check_null=False)
14     # 初始化排序欄位
15     order_by = 'id asc'
16     if sidx:
17         order_by = sidx + ' ' + sord
18 
19     _positions_logic = positions_logic.PositionsLogic()
20     # 讀取記錄
21     wheres = ''
22     if department_id:
23         wheres = 'department_id=' + str(department_id)
24     result = _positions_logic.get_list('*', wheres, page_number, page_size, order_by)
25     if result:
26         # 直接輸出json
27         return json.dumps(result)
28     else:
29         return web_helper.return_msg(-1, "查詢失敗")

  代碼看起來是否感覺很熟悉,和前端列表查詢的代碼差不多,只是接收參數、查詢條件和調用的類不一樣而已。所以我們只需要熟悉工具函數、底層ORM方法和調用方法,寫起代碼來就非常便捷,代碼的可讀性也大大增強了。

 

  接著我們來處理新增職位操作,新增職位時,需要管理填寫的內容只有職位名稱,因為所屬部門與部門編碼在頁面中可以直接帶過來,另一個操作就是設置訪問許可權了,這也是我們整個許可權管理中最重要的一個環節

  由上圖可以看到,設置訪問許可權它是一個樹列表,它使用的是ztree控制項,按它要求的格式,將列表值傳給ztree控制項就可以自動生成這樣的樹列表了,然後前端代碼通過ztree控制項的onCheck方法,獲取所有勾選項對應的菜單項id,組合成許可權字串提交到介面,更新到數據表中,該職位就擁有了我們所勾選的所有許可權了。

  對於訪問許可權樹列表的展示,首先,它需要讀取菜單列表,輸出ztree控制項要求的格式;其次,我們在編輯職位許可權時,需要對已擁有許可權的項自動打上勾,這個我們也可以直接在介面中輸出對應的參數來進行設置。

  所以我們可以在上一章的menu_info.py文件中,增加下麵介面來處理,通過提交過來的職位id,來獲取該職位擁有的許可權,然後通過逐項判斷菜單項與許可權的關係,來判斷是否打勾。

 1 @get('/api/system/menu_info/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     根據用戶職位許可權獲取列表數據(樹列表),為已有許可權的數據賦值
 5     """
 6     _menu_info_logic = menu_info_logic.MenuInfoLogic()
 7     # 讀取記錄(ztree控制項需要輸出記錄id、父id、樹節點名稱、節點是否擴開這幾項參數)
 8     result = _menu_info_logic.get_list('id, parent_id, name, not is_leaf as open, false as checked')
 9     if result and result.get('rows'):
10         # 獲取指定的職位記錄
11         _positions_logic = positions_logic.PositionsLogic()
12         positions_logic_model = _positions_logic.get_model_for_cache(id)
13         if positions_logic_model:
14             # 讀取該職位許可權字串
15             page_power = positions_logic_model.get('page_power', '')
16             # 判斷當前菜單項id是否存在於該職位的許可權字串中
17             for model in result.get('rows'):
18                 # 如果存在,則表示當前職位擁有該菜單項的許可權,即在菜單許可權列表中需要打勾
19                 if ',' + str(model.get('id', 0)) + ',' in page_power:
20                     model['checked'] = True
21 
22         return web_helper.return_msg(0, "成功", {'tree_list': result.get('rows')})
23     else:
24         return web_helper.return_msg(-1, "查詢失敗")

  我們再來看看點擊保存後,執行新增職位記錄介面代碼是怎麼實現的

 1 @post('/system/positions/')
 2 def callback():
 3     """
 4     新增記錄
 5     """
 6     name = web_helper.get_form('name', '角色名稱')
 7     department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部門id'))
 8     page_power = web_helper.get_form('page_power', '許可權列表', is_check_null=False)
 9 
10     _department_logic = department_logic.DepartmentLogic()
11     # 讀取對應的部門記錄
12     department_result = _department_logic.get_model_for_cache(department_id)
13     if not department_result:
14         return web_helper.return_msg(-1, "部門不存在")
15 
16     _positions_logic = positions_logic.PositionsLogic()
17     # 組合更新欄位
18     fields = {
19         'name': string(name),
20         'department_id': department_id,
21         'department_code': string(department_result.get('code', '')),
22         'department_name': string(department_result.get('name', '')),
23         'page_power': string(page_power),
24     }
25     # 讀取記錄
26     result = _positions_logic.add_model(fields)
27     if result:
28         # 直接輸出json
29         return web_helper.return_msg(0, '提交成功')
30     else:
31         return web_helper.return_msg(-1, "提交失敗")

  這段代碼跟之前的新增也差不多,先是接收提交的參數,然後組合更新字典,再調用提交到數據表。

 

  修改職位許可權功能跟上面的類似,不過介面中需要增加一個獲取職位記錄實體的介面

 1 @get('/system/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     獲取指定記錄
 5     """
 6     _positions_logic = positions_logic.PositionsLogic()
 7     # 讀取記錄
 8     result = _positions_logic.get_model_for_cache(id)
 9     if result:
10         # 直接輸出json
11         return web_helper.return_msg(0, '成功', result)
12     else:
13         return web_helper.return_msg(-1, "查詢失敗")
14 
15 
16 @put('/system/positions/<id:int>/')
17 def callback(id):
18     """
19     修改記錄
20     """
21     name = web_helper.get_form('name', '角色名稱')
22     department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部門id'))
23     page_power = web_helper.get_form('page_power', '許可權列表', is_check_null=False)
24     if page_power == ',':
25         page_power = ''
26 
27     _positions_logic = positions_logic.PositionsLogic()
28     positions_result = _positions_logic.get_model_for_cache(id)
29     if department_id != positions_result.get('department_id'):
30         return web_helper.return_msg(-1, '該角色所屬部門錯誤,請與管理員聯繫')
31 
32     # 組合更新欄位
33     fields = {
34         'name': string(name),
35         'page_power': string(page_power),
36     }
37 
38     # 讀取記錄
39     result = _positions_logic.edit_model(id, fields)
40     if result:
41         # 直接輸出json
42         return web_helper.return_msg(0, '提交成功', result)
43     else:
44         return web_helper.return_msg(-1, "提交失敗")

 

  最後是刪除介面,我們在執行刪除操作時,一定要判斷它是否已綁定了管理員賬號,不然直接刪除後,管理員登錄後臺系統以後將沒有任何許可權,無法做任何操作。

 1 @delete('/system/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     刪除指定記錄
 5     """
 6     # 判斷要刪除的記錄是否被引用,是的話不能刪除
 7     _manager_logic = manager_logic.ManagerLogic()
 8     if _manager_logic.exists('positions_id=' + str(id)):
 9         return web_helper.return_msg(-1, "當前職位已綁定相關管理員,不能直接刪除")
10 
11     # 刪除記錄
12     _positions_logic = positions_logic.PositionsLogic()
13     result = _positions_logic.delete_model(id)
14     if result:
15         # 直接輸出json
16         return web_helper.return_msg(0, '刪除成功')
17     else:
18         return web_helper.return_msg(-1, "刪除失敗")

 

 

  本文對應的源碼下載 

 

版權聲明:本文原創發表於 博客園,作者為 AllEmpty 本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

python開發QQ群:669058475    作者博客:http://www.cnblogs.com/EmptyFS/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 集合中線程安全的類有:vector,stack,hashtable,enumeration,除此之外均是非線程安全的類與介面 Collection 是對象集合, Collection 有兩個子介面 List 和 Set, List 可以通過下標 (1,2..) 來取得值,值可以重覆,而 Set 只能 ...
  • 父類的靜態成員初始化>父類的靜態代碼塊>子類的靜態成員初始化>子類的靜態代碼塊>父類的代碼塊>父類的構造方法>子類的代碼塊>子類的構造方法 註意: 1.靜態成員和靜態代碼塊只有在類載入的時候執行一次,再次創建實例時,不再執行,因為只在方法區存在一份,屬於一整個類。 2.上述的是通用的載入順序,如果沒 ...
  • 1 import java.util.Arrays; 2 3 public class ArrayOperator { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 ArrLis... ...
  • 我們都知道HashTable是線程安全的類,因為使用了Synchronized來鎖整張Hash表來實現線程安全,讓線程獨占; ConcurrentHashMap的鎖分離技術就是用多個鎖來控制對Hash表的不同部分進行修改,因為我可能只需要對一小塊部分進行操作,而如果鎖整張表開銷太大了,其內部實現就是 ...
  • 目錄 分隔符 字元類和類型 重覆 子表達式 子表達式計數 定位到字元串的開始或末尾 分支 匹配特殊字元 特殊字元含義 分隔符 正則表達式必須包含在一對分隔符中。可以選擇任何非字母,數字,"\" 或空格的字元作為分隔符。字元串的開始和結束必須有匹配的分隔符。 最常用的分隔符是"/"。 如匹配"shop ...
  • typeHandler作用: 1.傳參時將javaType類型轉換成jdbcType 2.結果集中ResultSet中取值時,jdbcType轉換為javaType; 系統自定義的typeHandler: mybatis系統內部定義了一系列的typeHandler;基本涵蓋了我們正常使用的類型轉換; ...
  • laravel的啟動需要通過路由、中間件、控制器、模型、視圖最後出現在瀏覽器。而路由、中間件、模型,這些功能都有自己的類,比如Route::any()、DB::table()、$this->middleware()等等,這些功能都是由一個叫IOC(服務容器)的對象來調配的。 它就像框架里的一個管家, ...
  • 昨天對springboot中的mybatis逆向工程與分頁應用進行了整理,今天對ssm項目中的逆向工程與分頁進行整理。 項目運行環境:eclipse+jdk1.8+maven+tomcat 搭建ssm項目 首先新建maven project,項目Archetype選擇:maven archetype ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...