Flask+LayUI開發手記(十一):選項集合的數據庫擴展類

? ? ? ? 條目較少的選項集合,確實可以在程序中直接定義(其實最合適的還是存儲在一個分類別的數據庫表里),但條目較多的選項集合,或者是復雜的樹型結構選項集合,一般都是存儲在數據庫中的,這樣維護起來比較方便,也容易遷移和共享。所以,在完成基礎選項集合框架后,考慮應用的方便性,面向數據庫存儲的選項集合擴展類就成了下一步開發的任務。

????????有了基礎類做底,這些實現擴展起來也是十分方便。基于數據庫存儲的類包括兩大類型,一種是列表類,這個就是基礎選項類的擴展,數據結構沒有區別,只是多了選項條目從數據庫中裝載到內存中的過程,另一種是樹型類,它的數據結構比列表類復雜了一些,數據庫里也是以父子ID方式存放數據,放在內存里則是一個包括父子ID和名稱的字典,依據父子ID關系可以生成與layui-tree組件接口一致的樹型結構傳送到前端。

? ? ? ? 下面這段是列表類的python服務類List_OptionSet,它是基于OptionSet基礎類擴展的,所以,相同功能的類函數直接復用基礎類。重寫的子類函數包括構造函數__init__()和get_dict(),新寫的函數包括load()和reload()。可以看出,列表類與基礎類的區別是比較小的。

?(注:寫到這兒時,發現原來的基礎類中有個錯誤,就是reload()函數也必須在基礎類里編寫出來,否則如果對基礎類選項集合進行重載時,就會出現系統級錯誤)

#取自數據庫表的列表選項集合
class List_OptionSet(OptionSet):def __init__(self,dbclass=None,fdinf=None,n_opt=None,t_opt=None) :super().__init__()self.dbclass = dbclassself.fdinf = fdinfself.opt_name = n_optself.opt_title = t_optif n_opt :sysOptionPool.add_optset(n_opt,self)# 取選項字典def get_dict(self):if (self.opt_dict == None):if self.load(self.dbclass,self.fdinf) == 0:return Nonereturn self.opt_dict# 數據裝入函數def load(self,dbclass,fdinf):logging.info('Load Table OptionSet %s....' % self.opt_name)fdkey = fdinf.get('key')fdname = fdinf.get('name')filtstr = fdinf.get('filter')try :rows = db.session.query(dbclass).filter(text(filtstr)).all()opt_info = {}for irow in rows:valkey = getattr(irow,fdkey)valname = getattr(irow,fdname)opt_info[valkey] = valnameself.opt_dict = opt_infoexcept SQLAlchemyError as e:logging.debug('裝入選項集合[%s]數據庫讀取失敗!!%s' % (self.opt_name,str(e.orig)))return 0return 1#數據重載函數def reload(self) :rtncode = self.load(self.dbclass,self.fdinf)if rtncode == 0 :return 0if self.opt_name :sysOptionPool.add_optset(self.opt_name,self)return 1

? ? ? ? 列表類實現時,重點要強調一下,類實例初始化時并不會從數據庫中取數據,而是在第一次使用時,如果判斷條目字典為空,才會從數據庫中加載條目數據,這是系統中經常用到的方法,因為在系統啟動時,所有的選項實例就已經生成了,但大部分的實例在運行時并不會用到,如果這時加載,那會占用較多內存,并且啟動時間也會加長。

? ? ? ? 上面這個實現在get_dict()中完成,當self.opt_dict為空時調用load函數完成加載。reload()函數的主要用途是將條目數據從數據庫重新裝載到類實例中。當選項條目被維護后,就會調用此函數完成選項集合的同步。重載是選項集合服務一個路由請求實現,在上一節中有體現。

? ? ? ? 下面這段代碼是樹型選項集合類Tree_OptionSet的實現,它是在列表類的基礎上擴展的。可以看出,樹型類進行了大量的擴充,幾乎所有的函數都進行了重寫,并且增加了多個函數。樹型選項的存儲結構不再是簡單的鍵值對字典,而是一個以ID為鍵字的復合字典,并為前端提供了列表、映射以及樹型等多種格式的數據服務。

##樹型的選項集合類    
class Tree_OptionSet(List_OptionSet) :def __init__(self,dbclass=None,fdinf=None,n_opt=None,t_opt=None) :super().__init__()self.dbclass = dbclassself.fdinf = fdinfself.opt_name = n_optself.opt_title = t_optif n_opt :sysOptionPool.add_optset(n_opt,self)# 獲取選項名稱def get_name(self,id) :dt_id = self.get_dict().get(id)if dt_id == None :return '-'return dt_id.get('name')# 獲取選項格式串(廢棄保留)def id_format(self,id):dt_id = self.get_dict().get(id)if dt_id == None :return '-'idname = dt_id.get('name')if isinstance(id, str) :return id + '_' + idnameelse :return str(id) + '_' + idname# 獲取選項映射def get_map(self):itemlist = {}d_opt = self.get_dict()if (d_opt == None) :return Nonefor (k,v) in d_opt.items():itemlist[k] = v['name']return itemlist# 獲取選項列表def get_list(self,**kwargs) :itemlist = []d_opt = self.get_dict()if (d_opt == None) :return Nonefor (k,v) in d_opt.items():item = [k,v['name'],v['pid'],0]itemlist.append(item)f_sort = kwargs.get('sort')if f_sort == None or f_sort == False:return itemlistreturn sorted(itemlist)# 數據裝載def load(self,dbclass,fdinf):logging.debug('Load Table Tree Options %s....' % self.opt_name)fdkey = fdinf.get('key')fdname = fdinf.get('name')fdvalue = fdinf.get('value')fdparent = fdinf.get('parent')filtstr = fdinf.get('filter')try :rows = db.session.query(dbclass).filter(text(filtstr)).all()opt_info = {}for irow in rows:valkey = getattr(irow,fdkey)valname = getattr(irow,fdname)valparent = getattr(irow,fdparent)opt_info[valkey] = dict(name=valname,pid=valparent)if (fdvalue != None) :valvalue = getattr(irow,fdvalue)opt_info[valkey]['value'] = valvalueself.opt_dict = opt_infoexcept SQLAlchemyError as e:logging.debug('裝入樹型選項集合[%s]數據庫讀取失敗!!%s' % (self.opt_name,str(e.orig)))return 0return 1# 獲取選項集合def get_option(self,optcat=None) :return self.get_tree()# 獲取選項樹型def get_tree(self) :item_opt = self.get_list(sort=True)if item_opt == None:return Noneif hasattr(self,'fdinf') :root_id = self.fdinf.get('rootid')else :root_id = 0#logging.debug('item_opt: %s' % item_opt)item_tree = self.build_tree(item_opt,root_id,0)return item_tree# 生成選項樹型# 基于Layui-Tree接口格式生成數據def build_tree(self,data,p_id,level=0):tree = []for item in data:if item[2] !=p_id:continuerow = dict(id = item[0], title= item[1], parent_id=item[2],level= level)if level==0:row['spread'] = Truechild = self.build_tree(data, row['id'], level+1)row['children'] = []if child:row['children'] += childtree.append(row)return tree

? ? ? ? 通過加載函數load()完成條目字典的原始數據結構加載,其數據結構為{id111:{name:xxx,pid:xxx,value:xxx},id222:{...},...}。之后由原始數據結構為基礎,然后通過一系列函數完成數據服務,主要包括:

get_name():根據鍵值取名稱

id_format():生成格式化的選項展示(后臺生成展示項時用)

get_map():生成鍵值map映射表

get_list():生成鍵值列表

get_tree():生成樹型選項集合

get_option():對外提供的統一的選項集合接口

? ? ? ? 上述功能實現后,統一選項集合數據服務類就基本完成了。下面是幾個具體的選項集合實例。

# 系統用戶角色選項處理
optOprRole = List_OptionSet(Role,{'key': 'role_cd','name' : 'rolename','filter' : 'status=0 and roletype=0'},'OprRole')#機構樹型選項處理
optBranchTree = Tree_OptionSet(Branchs,{'key': 'id','name' : 'short_name','parent' : 'parent_id','rootid' : 0,'filter' : 'status=0'},'BranchTree')#機構狀態
optBranchStatus = OptionSet({0:'正常',1:'停用',9:'廢棄'},'BranchStatus')

????????前端通過服務請求可以下載選項集合數據,并按個性化的需求對前端組件進行渲染。比如對layui-form中已經有的select、checkbox進行功能增強,也可以自行實現單選樹型、多選樹型等復合選擇域,從而將layui-form的功能再次提升。

? ? ? ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89243.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI學習筆記三十二:YOLOv8-CPP-Inference測試(Linux版本)

若該文為原創文章,轉載請注明原文出處。主要介紹如何在Linux系統上安裝和部署基于YOLOv8的C推理項目一、服務器準備使用AutoDL平臺租用服務器AutoDL有git加速,可以自行啟用二、環境配件1、檢查Opencv版本pkg-config --modversion opencv4如果版本為4.5&a…

113:路徑總和 II

題目:給你二叉樹的根節點 root 和一個整數目標和 targetSum ,找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。葉子節點 是指沒有子節點的節點。解答:用 go主要坑有兩個,一個是二維結果切片傳遞用指針,一個…

Perl 數組

Perl 數組 在Perl編程語言中,數組是處理數據的一種強大工具。數組允許我們將多個值存儲在單個變量中,從而簡化了代碼并提高了效率。本文將詳細介紹Perl數組的創建、操作、遍歷以及一些高級用法。 數組的創建 在Perl中,創建一個數組非常簡單。…

優先隊列的實現

目錄 引言 堆的基本概念與特性 堆的插入與向上調整 堆的刪除與向下調整 優先隊列的設計思路 模板參數設計 比較器的作用 核心接口實現 push pop top 附錄(完整代碼) 引言 優先隊列(Priority Queue)是一種特殊的隊列數據結構,其中每…

現代CSS實戰:用變量與嵌套重構可維護的前端樣式

現代CSS實戰:用變量與嵌套重構可維護的前端樣式 引言 在傳統CSS開發中,我們常常陷入「樣式冗余」與「維護噩夢」的循環: 想調整主題色?得全局搜索所有 #3498db 手動替換,稍有不慎就漏改某個角落; 寫嵌套…

DHTMLX Suite 9.2 重磅發布:支持歷史記錄、類Excel交互、剪貼板、拖放增強等多項升級

全球知名的 JavaScript UI 組件庫 DHTMLX Suite 迎來 9.2 新版本!此次更新雖為次版本號,卻實質性提升了 Grid 網格組件的交互能力與用戶體驗,引入了包括歷史記錄管理、剪貼板操作、數據選擇范圍管理、Block 區塊選擇等多項高級模塊&#xff0…

深入理解Java中的Map.Entry接口

文章目錄深入理解Java中的Map.Entry接口1. 接口定義2. 核心方法解析2.1 基本方法2.2 Java 8新增的靜態方法3. 基本使用示例3.1 遍歷Map的條目3.2 修改Map中的值3.3 使用比較器排序4. Java 8/9增強特性4.1 與Stream API結合4.2 Java 9的equals和hashCode默認方法5. 實際應用場景…

AI培訓學習2

不要打擾用戶的習慣,比如APP右下角的我的,放到第一個就不合適 先抄再超 lifeTime value NPS: 評價 Product market 平衡 ARPU: LT活躍時長 游戲中好友的重要性 不花錢存活率很少 如何花錢,1分錢買東西 聯影醫療 figma uizard…

npm 安裝時候怎么指定某一個子包的版本 overrides

有時候用 npm install 安裝的時候會報錯,比如 express 包依賴 "escape-html": "^1.0.2" 版本的包,但是因為 escape-html" 升級到 1.0.3 版本了,但是這個版本有問題,導致express 下載不下來。怎么固定下載…

python學智能算法(十九)|SVM基礎概念-超平面

引言 前序學習進程中,對向量相關的基本知識進行了學習,鏈接為: 向量的值和方向 向量點積 在實際的支持向量機算法使用中,最核心的目標是找出可以實現分類的超平面,超平面就是分割的點、線或者面,不要在這個…

python 基于 httpx 的流式請求

文章目錄1. 環境介紹2. 同步客戶端2.1. 面向過程2.1.1. 流式輸出2.1.2. 非流式輸出2.2. 面向對象3. 異步客戶端3.1. 面向過程3.2. 面向對象3.3. Attempted to call a sync iterator on an async stream.參考:https://www.jb51.net/article/262636.htm次要參考&#…

Python 數據建模與分析項目實戰預備 Day 4 - EDA(探索性數據分析)與可視化

? 今日目標 使用 Pandas Matplotlib/Seaborn 對簡歷數據進行探索性分析分析不同字段與目標變量的相關性通過可視化呈現簡歷篩選的潛在規律🧾 一、建議分析內容 🔹 分類字段分析字段圖表建議說明degree柱狀圖(分組通過率)分析學歷…

力扣每日一題--2025.7.17

📚 力扣每日一題–2025.7.17 📚 3202. 找出有效子序列的最大長度 II(中等) 今天我們要解決的是力扣上的第 3202 題——找出有效子序列的最大長度 II。這道題是昨天 3201 題的擴展,需要我們處理更一般化的情況。 ??…

github不能訪問怎么辦

訪問:“github.com”國內多個地點網站測速結果_網站測速 - 站長工具訪問“github.global.ssl.fastly.net”國內多個地點網站測速結果_網站測速 - 站長工具復制紅框中的ip 打開“C:\Windows\System32\drivers\etc\hosts”文件輸入: 20.205.243.166 githu…

【深度學習新浪潮】AI在finTech領域有哪些值得關注的進展?

近年來,AI在金融科技(FinTech)領域的應用呈現爆發式增長,尤其在大模型技術突破和政策支持的雙重驅動下,多個關鍵領域取得了顯著進展。以下是值得關注的核心方向及具體案例: 一、大模型技術重塑金融服務范式 以DeepSeek為代表的國產大模型通過開源和低成本部署(本地化成…

【中等】題解力扣22:括號生成

題目詳情 數字 n 代表生成括號的對數,設計一個函數生成所有可能的并且有效的括號組合。 示例 1: 輸入:n 3 輸出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2: 輸入:n 1 輸出&#…

【JEECG 組件擴展】JSwitch開關組件擴展單個多選框樣式

功能說明:基于JeecgBoot開源框架,JSwitch開關組件擴展,支持單個多選樣式。效果展示:使用示例:{field: JSwitch,component: JSwitch,label: JSwitch,},{field: JSwitchCheckBox,component: JSwitch,label: JSwitchCheck…

(轉)Kubernetes基礎介紹

Kubernetes是用于自動部署、擴展和管理容器化應用程序的開源系統。

vue 播放海康m3u8視頻流筆記

1、安裝hls.jsnpm i hls 2、使用<el-dialogtitle"監控"top"5vh":visible.sync"dialogVisible"width"30%"><video id"video" style"width:100%;height:300px" controls><sourcetype"applicati…

如何清除 npm 緩存

清除 npm 緩存&#xff1a;利弊分析與操作指南 在使用 Node.js 和 npm 進行項目開發時&#xff0c;我們經常會與 npm install 命令打交道。這個過程中&#xff0c;npm 會在本地建立一個緩存機制&#xff0c;用以存儲已下載的包&#xff0c;從而顯著提升后續安裝的速度。然而&am…