我的第一個python web開發框架(16)——產品分類管理

来源:http://www.cnblogs.com/EmptyFS/archive/2017/11/16/7846746.html
-Advertisement-
Play Games

產品分類管理的html頁面之前忘記做了,這次附件里補上。 好了先上圖 從頁面效果圖來看,我們需要開發列表獲取介面、添加介面、單條記錄獲取介面、編輯介面和刪除介面 對於產品分類列表,我們將使用jqgrid前端表格框架,jqgrid與介面交互時,它會提交頁面索引、頁面大小、排序欄位名以及順序還是倒序排序 ...


  產品分類管理的html頁面之前忘記做了,這次附件里補上。

  好了先上圖

  

  從頁面效果圖來看,我們需要開發列表獲取介面、添加介面、單條記錄獲取介面、編輯介面和刪除介面

  對於產品分類列表,我們將使用jqgrid前端表格框架,jqgrid與介面交互時,它會提交頁面索引、頁面大小、排序欄位名以及順序還是倒序排序這幾個參數,而返回的結果也有格式約束。

  返回格式要求:

{
    '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語句;第四段是提交查詢請求,並返回結果

  get方式提交,我們使用web_helper.get_query()函數獲取參數值

  具體代碼有詳細註釋,這裡就不細說了,大家如果有不明白的地方留言或到群里問我。

  

  界面中的刪除按鈕對應的是刪除介面

 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
出處:http://www.cnblogs.com/EmptyFS/
有興趣的朋友可以加加python開發QQ群:669058475 ,大家一起探討。大家有問題的話可以在群里發問,當然我平時工作也非常繁忙不一定會及時回覆。

本文為AllEmpty原創,歡迎轉載,但未經同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


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

-Advertisement-
Play Games
更多相關文章
  • 在[Asp.Net Core](https://www.asp.net)中,我們的web application 其實是運行在Kestrel服務上,它是一個基於libuv開源的跨平臺可運行 Asp.Net Core 的web伺服器。 ...
  • 今天做了幾個小小的練習,和大家分享一下. 1.用*列印出等腰三角形,代碼如下: 由於等腰三角形是1,3,5,7....,找規律就好了 2. 編寫一個程式,輸入一個整數,判斷其為幾位數(例如100是三位,-99是兩位) 3.編寫一個通用的人員類(Person),該類具有姓名(Name)、年齡(Age) ...
  • 返回總目錄 十四、Temporary Field(令人迷惑的暫時欄位) 1、某個實例變數僅為某種特定的情況而設 2、某些實例欄位僅為某個函數的複雜演算法少傳參數而設 將這些變數和相關函數提煉到一個獨立的類中。 十五、Message Chains(過度耦合的消息鏈) 如果你看到用戶向一個對象請求另一個對 ...
  • 一般情況下我們將tomcat做成服務時都會指定服務的名稱:service install ywbase 安裝後, 服務名稱是ywbase. 這時候用tomcat7w.exe配置jdk記憶體會出現指定的服務未安裝. 解決的方案: 將tomcat7w.exe 改成 ywbasew.exe 執行就OK了 ...
  • 題目描述: Find the sum of all left leaves in a given binary tree. 例子: 解題思路: 用遞推對二叉樹進行遍歷,判斷是否為末枝的左子葉,然後將所有的末枝的左子葉相加(不要忘了考慮空指針的情況) 代碼: 解題收穫: 對於C語言鏈表的使用還是有些不 ...
  • 1.http://blog.csdn.net/zhangchaoyi1a2b/article/details/77510138 2.use Mavn 3.on the pom.xml <dependencies> <dependency> <groupId>org.apache.logging.lo ...
  • 採集美女模特圖片庫時,需要對標題進行分詞,找了好久,終於找到了一個不錯的分詞庫 分詞系統簡介:PHPAnalysis分詞程式使用居於unicode的詞庫,使用反向匹配模式分詞,理論上相容編碼更廣泛,並且對utf-8編碼尤為方便。 由於PHPAnalysis是無組件的系統,因此速度會比有組件的稍慢,不 ...
  • 作者:NiceCui 本文謝絕轉載,如需轉載需徵得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/7846812.html 郵箱:[email protected] 日期:2017-11-16 平時寫代碼有時會常用到一些處理日期的邏輯,自己寫了一個工 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...