產品分類管理的html頁面以前忘記作了,此次附件裏補上。html
好了先上圖前端
從頁面效果圖來看,咱們須要開發列表獲取接口、添加接口、單條記錄獲取接口、編輯接口和刪除接口python
對於產品分類列表,咱們將使用jqgrid前端表格框架,jqgrid與接口交互時,它會提交頁面索引、頁面大小、排序字段名以及順序仍是倒序排序這幾個參數,而返回的結果也有格式約束。web
返回格式要求:sql
{ 'records': 0, 'total': 0, 'page': 1, 'rows': [], }
產品分類列表獲取接口數據庫
1 @get('/api/product_class/') 2 def callback(): 3 """ 4 獲取列表數據 5 """ 6 # 頁面索引 7 page_number = convert_helper.to_int1(web_helper.get_query('page', '', False)) 8 # 頁面顯示記錄數量 9 page_size = convert_helper.to_int0(web_helper.get_query('rows', '', False)) 10 # 排序字段 11 sidx = web_helper.get_query('sidx', '', False) 12 # 順序仍是倒序排序 13 sord = web_helper.get_query('sord', '', False) 14 # 初始化排序字段 15 order_by = 'sort asc' 16 if sidx: 17 order_by = sidx + ' ' + sord 18 19 ############################################################# 20 # 初始化輸出格式(前端使用jqgrid列表,須要指定輸出格式) 21 data = { 22 'records': 0, 23 'total': 0, 24 'page': 1, 25 'rows': [], 26 } 27 ############################################################# 28 # 執行sql,獲取指定條件的記錄總數量 29 sql = 'select count(1) as records from product_class' 30 result = db_helper.read(sql) 31 # 若是查詢失敗或不存在指定條件記錄,則直接返回初始值 32 if not result or result[0]['records'] == 0: 33 return data 34 # 保存總記錄數量 35 data['records'] = result[0].get('records', 0) 36 37 ############################################################# 38 ### 設置分頁索引與頁面大小 ### 39 # 設置分頁大小 40 if page_size is None or page_size <= 0: 41 page_size = 10 42 # 計算總頁數 43 if data['records'] % page_size == 0: 44 page_total = data['records'] // page_size 45 else: 46 page_total = data['records'] // page_size + 1 47 # 記錄總頁面數量 48 data['total'] = page_total 49 50 # 判斷提交的頁碼是否超出範圍 51 if page_number < 1 or page_number > page_total: 52 page_number = page_total 53 # 記錄當前頁面索引值 54 data['page'] = page_number 55 56 # 計算當前頁面要顯示的記錄起始位置 57 record_number = (page_number - 1) * page_size 58 # 設置查詢分頁條件 59 paging = ' limit ' + str(page_size) + ' offset ' + str(record_number) 60 ### 設置排序 ### 61 if not order_by: 62 order_by = 'id desc' 63 ############################################################# 64 65 # 組合sql查詢語句 66 sql = "select * from product_class order by %(orderby)s %(paging)s" % \ 67 {'orderby': order_by, 'paging': paging} 68 # 讀取記錄 69 result = db_helper.read(sql) 70 if result: 71 # 存儲記錄 72 data['rows'] = result 73 74 if data: 75 # 直接輸出json 76 return web_helper.return_raise(json.dumps(data, cls=json_helper.CJsonEncoder)) 77 else: 78 return web_helper.return_msg(-1, "查詢失敗")
這段代碼有點長,從功能上能夠分爲四段,第一段是接收客戶端提交的參數;第二段獲取當前查詢條件下有多少條記錄數量;第三段是處理分頁,並組合查詢sql語句;第四段是提交查詢請求,並返回結果json
get方式提交,咱們使用web_helper.get_query()函數獲取參數值api
具體代碼有詳細註釋,這裏就不細說了,你們若是有不明白的地方留言或到羣裏問我。緩存
界面中的刪除按鈕對應的是刪除接口框架
1 @delete('/api/product_class/<id:int>/') 2 def callback(id): 3 """ 4 刪除指定記錄 5 """ 6 # 判斷該分類是否已經被引用,是的話不能直接刪除 7 sql = """select count(*) as total from product where product_class_id=%s""" % (id,) 8 # 讀取記錄 9 result = db_helper.read(sql) 10 if result and result[0].get('total', -1) > 0: 11 return web_helper.return_msg(-1, "該分類已被引用,請清除對該分類的綁定後再來刪除") 12 13 # 編輯記錄 14 sql = """delete from product_class where id=%s returning id""" 15 vars = (id,) 16 # 寫入數據庫 17 result = db_helper.write(sql, vars) 18 # 判斷是否提交成功 19 if result: 20 return web_helper.return_msg(0, '成功') 21 else: 22 return web_helper.return_msg(-1, "刪除失敗")
在作刪除前,須要判斷一下這個分類是否已經被相關的產品引用綁定了,若是是的話,直接刪除將會形成前端相關產品沒法展現,因此須要作出提醒,讓用戶清除綁定後再進行刪除操做。
增改刪操做都是對數據庫的寫操做,因此都使用db_helper.write()函數。
在postgresql數據庫中,returning是一個很是棒很是好用的函數,它能夠指定返回的字段,即進行增改刪操做後,將這些記錄的指定字段值返回給咱們,咱們能夠經過檢查返回值是否存在來斷定是否執行成功。並且在進行條件操做時,它能返回咱們想要的主鍵id值,方便咱們進行咱們想要的操做,好比刪除nosql緩存對應值。
點擊列表上面的添加按鈕,會彈出一個小框,讓用戶輸入新增記錄值,以下圖:
接口代碼:
1 @post('/api/product_class/') 2 def callback(): 3 """ 4 新增記錄 5 """ 6 name = web_helper.get_form('name', '分類名稱') 7 is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否啓用')) 8 9 # 添加記錄(使用returning這個函數能返回指定的字段值,這裏要求返回新添加記錄的自增id值) 10 sql = """insert into product_class (name, is_enable) values (%s, %s) returning id""" 11 vars = (name, is_enable) 12 # 寫入數據庫 13 result = db_helper.write(sql, vars) 14 # 判斷是否提交成功 15 if result and result[0].get('id'): 16 return web_helper.return_msg(0, '成功') 17 else: 18 return web_helper.return_msg(-1, "提交失敗")
post方式提交,咱們使用web_helper.get_form()函數獲取參數值
編輯記錄和添加記錄同樣,使用同一個窗口,但在接口上,它須要獲取記錄值和編輯後保存兩個接口
1 @get('/api/product_class/<id:int>/') 2 def callback(id): 3 """ 4 獲取指定記錄 5 """ 6 sql = """select * from product_class where id = %s""" % (id,) 7 # 讀取記錄 8 result = db_helper.read(sql) 9 if result: 10 # 直接輸出json 11 return web_helper.return_msg(0, '成功', result[0]) 12 else: 13 return web_helper.return_msg(-1, "查詢失敗") 14 15 @put('/api/product_class/<id:int>/') 16 def callback(id): 17 """ 18 修改記錄 19 """ 20 name = web_helper.get_form('name', '分類名稱') 21 is_enable = convert_helper.to_int0(web_helper.get_form('is_enable', '是否啓用')) 22 23 # 編輯記錄 24 sql = """update product_class set name=%s, is_enable=%s where id=%s returning id""" 25 vars = (name, is_enable, id) 26 # 寫入數據庫 27 result = db_helper.write(sql, vars) 28 # 判斷是否提交成功 29 if result and result[0].get('id'): 30 return web_helper.return_msg(0, '成功') 31 else: 32 return web_helper.return_msg(-1, "提交失敗")
暫時尚未朋友說看不明白,因此就不往細說了,你們看代碼註釋,有人不明白提出後我再補上吧(最近太忙了,因此更新可能會有點慢,你們耐心等一等,我儘可能抽空碼完代碼後更新上來的)。
聯繫咱們頁面的前端代碼與接口代碼都在下載包中,你們本身比較一下本身處理的結果和個人是否是同樣。
版權聲明:本文原創發表於 博客園,做者爲 AllEmpty 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。
python開發QQ羣:669058475(本羣已滿)、733466321(能夠加2羣) 做者博客:http://www.cnblogs.com/EmptyFS/