編寫環(huán)境管理頁面
之前的篇幅里面說過迈着,用例沒有根據(jù)環(huán)境
去劃分它的歸屬蛔趴,其實這樣也是不太合理的,畢竟不同的環(huán)境需要的數(shù)據(jù)可能不一致蜘拉,并不一定能編寫完全通用的用例。所以今天我打算從這個頁面下手有鹿,手把手
教大家編寫一個完整的CRUD功能(帶前端+聯(lián)調(diào))。后面前端的部分谎脯,如果大家不感興趣的話葱跋,只看后端
就好了。因為會有一系列的截圖!看完不說半條命娱俺,那半小時肯定沒了稍味。
有的人可能不理解,環(huán)境不就是那幾套嗎荠卷?測試/預(yù)發(fā)/線上等等模庐。是的,但是各個公司會叫不同的名字油宜,所以我們?yōu)榱酥谱饕豢畲蟊娗彝ㄓ玫墓ぞ叩嗉睿蕴峁┧麄兙S護自己環(huán)境的功能。
CRUD/CURD是什么
經(jīng)常逛脈脈
的同學肯定都知道慎冤,經(jīng)常能看到CURD CRUD CRUD boy這樣的詞匯疼燥。直白點說,curd指的就是增刪改查蚁堤,我們今天的內(nèi)容就是這個醉者,且聽我一一道來。
-
增
公司最近開了一個新的環(huán)境:fat2披诗,我們系統(tǒng)得維護起來撬即,所以我們需要新增一條
fat2
環(huán)境的數(shù)據(jù)。 -
刪
公司又不用這個環(huán)境了呈队,想去掉這個環(huán)境剥槐,免得混淆視聽。
-
改
fat2環(huán)境公司覺得不好聽掂咒,公司決定改成fat-beta才沧。
-
查
公司現(xiàn)在有100多種環(huán)境,太多了绍刮,需要查詢是否有fat77這個環(huán)境温圆。
沒錯,其實很多開發(fā)做的功能都與這個接近孩革。大部分時間都是在做一些crud的工作岁歉。上述是細化到我們這一次環(huán)境管理的功能點,如果你覺得難的話膝蜈,耐心看完(抄完)你就不會覺得難了锅移。
明確思路
首先我們先要搞清楚本次需求,其實需求很簡單饱搏,就是想給用戶提供自定義環(huán)境名的功能非剃。那么我們是不是在數(shù)據(jù)庫需要存儲這些環(huán)境
的信息。最基本的信息需要哪些呢推沸?我這里列一下:
數(shù)據(jù)表準備
核心字段:
- 環(huán)境名稱
比如fat uat pro (是否能重復(fù)备绽?那肯定是不能重復(fù)的呀券坞!)
- 環(huán)境備注
比如fat是測試環(huán)境啥的啥的,其實也可以不要肺素,但是給你一個選項恨锚,萬一你需要添加一些說明呢
基本字段:
- 創(chuàng)建人是誰
- 修改人是誰
- 什么時候創(chuàng)建的
- 什么時候更新的
- 被刪除了木有
功能需求準備
環(huán)境可以通過名字模糊查詢
可以編輯,編輯后會更新編輯時間
可以添加
-
可以刪除
功能一拆分倍靡,是不是特別簡單了猴伶,其實需求沒多少,后端可能1小時不到就搞定了塌西,前端還是費時間的他挎。
開始行動
定義model
既然表的字段不多,數(shù)據(jù)也不復(fù)雜雨让,那么我們可以先定義model雇盖。
內(nèi)容不難,熟悉sqlalchemy就更輕松了栖忠。目的是為了映射一個數(shù)據(jù)表(環(huán)境表)的類
崔挖。
tablename 表示當前class對應(yīng)的數(shù)據(jù)庫表名,我們這里為了區(qū)分庵寞,統(tǒng)一加上pity_
前綴狸相。
后面的內(nèi)容就是對字段的定義以及初始化類。
生成model
為了能自動生成數(shù)據(jù)表捐川,我們需要在dao/init.py里面import這個model類脓鹃。
定義Pydantic的schema
這一步的目的很簡單,就是為了做參數(shù)校驗古沥,比如有的哥們很壞瘸右,他創(chuàng)建環(huán)境的時候,直接給你來個空字符串或者空格字符串的環(huán)境名
岩齿,所以遇到這樣的人太颤,我們要鄙視他,在數(shù)據(jù)插入數(shù)據(jù)庫之前就檢測到盹沈,并給他沉重打擊龄章。這里熟悉pydantic的同學,都了解乞封,不熟悉的話建議去閱讀以下Pydantic的官方文檔做裙,或者照著抄就是了。
大體意思就是定義了一個Environment的表單肃晚,里面有3個參數(shù): id锚贱、name、remarks关串,對應(yīng)的就是id拧廊,環(huán)境名和備注杂穷。其中name不能為空,備注隨便你卦绣,寫不寫都行,id你也可以不傳飞蚓,不傳就默認為None滤港。
編寫Dao層(與db交互的核心內(nèi)容)
- 新增環(huán)境
由于環(huán)境也算配置里面的一套內(nèi)容,后續(xù)要和全局變量放到一起趴拧,所以我們給他歸檔到config目錄下溅漾。
來看看這個新增環(huán)境
的功能都做了啥。
首先固定搭配著榴,這個dddd(懂的都懂)添履。從數(shù)據(jù)庫拿到一個session,類似于db.cursor()也類似于jdbc里面的getConnection脑又。
with Session() as session:
接著暮胧,根據(jù)我們的業(yè)務(wù)邏輯,雖然咱們數(shù)據(jù)庫設(shè)置name為unique问麸,我們還是先查詢是否有這個name并且deleted_at=None(刪除時間=None 代表未被刪除的)的環(huán)境數(shù)據(jù)往衷,如果有的話,我們不繼續(xù)新增了严卖,返回一個提示信息
就行席舍。
否則呢,我們就把數(shù)據(jù)插到數(shù)據(jù)庫并用session進行提交哮笆。如果中途發(fā)生異常来颤,我們就該記錄日志的記錄日志,該返回錯誤的返回錯誤稠肘。如果沒啥問題就返回None福铅,代表大吉大利,相安無事
启具。
- 編輯環(huán)境
套路都是一樣的本讥,甚至代碼也很接近。但是注意到有個區(qū)別鲁冯,這里調(diào)用了update_model方法拷沸,這個方法是干啥的哩?
我們知道薯演,更新一條數(shù)據(jù)撞芍,我們除了需要更改的字段以外,還得有更新人和更新時間這2個字段跟著修改跨扮。所以我們編寫了一套通用的方法序无,把你傳入的data數(shù)據(jù)验毡,改到query里面,順便改寫一下更新時間和更新人帝嗡。
not_null指的是晶通,只更新非空字段,比如我本來有個數(shù)據(jù)是abc哟玷,你傳None進來狮辽,我給他改成None了,這樣可能會有誤會巢寡。這里借鑒了gorm喉脖,只更新非null的字段。dist代表目標抑月,source代表數(shù)據(jù)源树叽。
- 刪除環(huán)境
其實刪除環(huán)境,我們這里做的是軟刪除
谦絮,所以其實它還是一個update的操作题诵。我們通過id找到對應(yīng)的數(shù)據(jù),把它的deleted_at改成當前時間即可挨稿,順便改一下更新人(留下罪證)仇轻。
- 查詢環(huán)境
注意,我這兒用的是list_env名稱奶甘,為啥不是search呢篷店?這里隨你的便,我其實是把list和search合體了一下臭家∑I拢可以看到我的name參數(shù),如果不是None的時候钉赁,它就是個search動作蹄殃,否則它是一個list操作。
search的根本條件是你踩,deleted_at == None诅岩,也就是說不管怎么樣,咱們都得保證數(shù)據(jù)沒被刪除带膜。
if name:
search.append(Environment.name.ilike("%{}%".format(name)))
如果name有傳吩谦,或者不為""也不為None蚪黑,那么我們加上對name的模糊查詢勺鸦,等價于where name ilike xxxxx
。
最后就是自動分頁了华弓,我們查出來的數(shù)據(jù)很多的話芭挽,不可能全部做展示滑废,所以我們需要進行分頁蝗肪。page和size指的就是當前頁碼
和一頁多少條數(shù)據(jù)
。
最后咱們通過created_at進行倒序排列蠕趁,也就是說最新創(chuàng)建的在最前面
薛闪。返回一個total,就是本次查詢查到了多少條數(shù)據(jù)俺陋,以便于前端進行展示逛绵。
編寫router
router層很簡單,通過ApiRouter新建路由倔韭,并把list/insert/update/delete方法注冊到路由∑岸裕可以看到基本上代碼量很少寿酌,屬于調(diào)用dao層的核心方法,根據(jù)返回結(jié)果來返回http response硕蛹。
值得注意的是醇疼,我沒有用restful api去寫接口,所以udpate/insert都是post請求法焰,其他是get請求秧荆。(未出現(xiàn)put delete)
注冊router
最后把剛才編寫的router注冊到app(pity)就可以了。
劇透下效果:
本期內(nèi)容就到這里了埃仪,不水文雖然少點樂趣乙濒,但是hin充實呀!下一期以前端怎么curd為主卵蛉,各位觀眾姥爺颁股,拜了個拜!