微信搜索【大奇測試開】,關注這個堅持分享測試開發乾貨的傢伙。javascript
本想按照上節安排,實現添加和更新功能,不過內容有些多,本着每一次進步一點點的原則,將再拆分下,先講明白如何實現添加,一樣給出本篇關鍵點:css
- 抽公共數據連接方法
添加接口掌握post實現和請求數據處理html
前端掌握Button\Dilog\Form\Input\Notification組件前端
封裝數據庫連接 在product.py 文件中咱們須要增長一個create添加接口,不過再次以前咱們須要先封裝下上節直接寫在外邊的數據連接對象,由於多方法中如增\改刪使用完後會關閉數據庫鏈接,因此不能一次聲明處處使用,咱們須要在每次接口請求處理業務前,進行新的數據庫初始化,保證數據庫正在連接狀態。vue
def connectDB(): connection = pymysql.connect(host='localhost', # 數據庫IP地址或連接域名 user='mrzcode', # 設置的具備增改查權限的用戶 password='mrzcode', # 用戶對應的密碼 database='TPMStore',# 數據表 charset='utf8mb4', # 字符編碼 cursorclass=pymysql.cursors.DictCursor) # 結果做爲字典返回遊標 # 返回新的書庫連接對象 return connection
增長添加接口 同以前的查詢接口同樣,咱們設定新的route,用POST方法實現產品添加接口的處理,這裏主要是掌握post的定義,以及請求傳遞的body如何處理,關鍵點以下:java
methods 定義爲POST請求python
flask request模塊的get_data()獲取bodymysql
json 請求處理請求的JSON格式數據git
新增依賴引用github
from flask import request import json
和代碼均給了詳細註釋
# [POST方法]實現新建數據的數據庫插入 @app_product.route("/api/product/create",methods=['POST']) def product_create(): # 初始化數據庫連接 connection = connectDB() # 定義默認返回結構體 resp_data = { "code": 20000, "message": "success", "data": [] } # 獲取請求傳遞json body body = request.get_data() body = json.loads(body) with connection: # 先作個查詢,判斷keyCode是否重複(這裏的關鍵詞最初定義爲惟一項目編號或者爲服務的應用名) with connection.cursor() as cursor: select = "SELECT * FROM `products` WHERE `keyCode`=%s" cursor.execute(select, (body["keyCode"],)) result = cursor.fetchall() # 有數聽說明存在相同值,封裝提示直接返回 if len(result) > 0: resp_data["code"] = 20001 resp_data["message"] = "惟一編碼keyCode已存在" return resp_data with connection.cursor() as cursor: # 拼接插入語句,並用參數化%s構造防止基本的SQL注入 # 其中id爲自增,插入數據默認數據設置的當前時間 sql = "INSERT INTO `products` (`keyCode`,`title`,`desc`,`operator`) VALUES (%s,%s,%s,%s)" cursor.execute(sql, (body["keyCode"], body["title"], body["desc"], body["operator"])) # 提交執行保存插入數據 connection.commit() # 按返回模版格式進行json結果返回 return resp_data
對於產品添加中有個字段keyCode咱們需求上定義爲項目惟一編碼,因此對於插入不該該有重複項,因此咱們須要在正式插入操做前進行查詢判斷,若是重複給出提示,code 定義20001,那麼在前端request.js 進行處理的時候,因爲不是20000就會攔截,並按照message內容錯誤提示。
以上編寫完成再次用ide或者命令運行 app.py 啓動後段程序,用postman進行請求測試,驗證產品新增接口服務沒有問題
1)重複提示
2)不重複添加成功
先看下想要實現成的頁面樣式
定義接口請求 首先對已經測試經過添加接口定義到前端src/api/product.js中,這裏主要就是學會post請求接口的方式,以及注意參數定義,在查詢定義下方,新增以下定義
data: 就是請求的json格式的參數,稍後在前端定義
export function apiProductCreate(requestBody) { return request({ url: '/api/product/create', method: 'post', data: requestBody }) }
定義請求參數 在 product.vue頁面script中的data()返回數據集裏定義
一個變量獲取以前登陸的用戶名後邊做爲操做者值
定義product的json,默認賦值undefined,操做人賦予op_user
dialogProductShow 用戶添加對話框的顯示和隱藏屬性變量
// 導入全局存儲 import store from '@/store'
// 得到登陸的名字 op_user: store.getters.name, // 定義產品參數 product: { id: undefined, title: undefined, keyCode: undefined, desc: undefined, operator: this.op_user }, // 控制嵌套表單顯示和隱藏 dialogProductShow: false,
這裏要清楚一點是,其餘變量的引用須要經過this.來給定
定義添加按鈕 直接使用element-ui的button組件,在原來界面table之上定義,使用的圖標按鈕,掌握 el-button 另外對於組件的使用,初期都在想用什麼的時候直接去官方參考就行。
<div class="filter-container"> <el-button type="primary" icon="el-icon-plus" style="float:right" @click="dialogProduct()">新增</el-button> </div>
本例屬性type=爲類型,主要就是不一樣樣式;
icon=內部的一些圖標,見icon圖標組件說明;
style= 就是自定義的css樣式了
@click 指定點擊的時候的動做 dialogProduct() 執行下邊邊自定義方法
其餘按鈕樣式或屬性參考官網:https://element.eleme.io/#/zh-CN/component/button
實現dialogProduct()方法 在product.vue 中的 methods模塊中,增長初始化數據和顯示增長對話框頁面邏輯
dialogProduct() { // 添加先初始化空狀態 this.product.id = undefined this.product.keyCode = '' this.product.title = '' this.product.desc = '' this.product.operator = this.op_user // 彈出對話框設置爲true this.dialogProductShow = true }
頁面實現添加窗體 使用Dialog組件和嵌套form來實現建立表單的頁面,掌握 el-dialog 、 el-form 和 el-input 三個組件,再定義兩個button按鈕實現取消/肯定的操做邏輯
<!--對話框嵌套表,使用el-dialog--> <el-dialog title="添加產品或項目" :visible.sync="dialogProductShow"> <el-form :model="product"> <el-form-item label="名稱" label-width="100px"> <el-input v-model="product.title" placeholder="請填寫中文名稱" style="width: 80%"></el-input> </el-form-item> <el-form-item label="惟一碼" label-width="100px"> <el-input v-model="product.keyCode" placeholder="產品/項目惟一碼" style="width: 80%"></el-input> </el-form-item> <el-form-item label="備註" label-width="100px"> <el-input v-model="product.desc" type="textarea" placeholder="備註說明" style="width: 80%"></el-input> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="dialogProductShow = false">取 消</el-button> <el-button type="primary" @click="pCreate()">確 定</el-button> </span> </el-dialog>
本例 :visible.sync="dialogProductShow" 屬性綁定上邊定義的變量,控制是否顯示此對話框,flase爲隱藏,true爲顯示;
:model="product" 動態數據綁定 v-model 子數據綁定;
label="" 標題;placeholder="" 輸入框內部提示說明;
type="textarea" 輸入組件指定爲多行文本框;
其餘按鈕樣式或屬性參考官網:
實現pCreate()方法 最終彈窗內容填寫後,點擊肯定按鈕出發真正的保存操做,因爲vue已經在上邊動態的顯示數據綁定,因此參考以前查詢操做,這裏請求apiProductCreate 並給定data()中的product請求數據便可,本列掌握傳參接口請求,以及成功後的 Notification 組件
引入api
// 導入src/api/proudct 配置的請求列表方法 import { apiProductList, apiProductCreate } from '@/api/product'
具體代碼實現和其餘邏輯處理
pCreate() { // 請求API進行添加 apiProductCreate(this.product).then(response => { // 若是request.js沒有攔截即表示成功,給出對應提示和操做 this.$notify({ title: '成功', message: '項目或產品添加成功', type: 'success' }) // 關閉對話框 this.dialogProductShow = false // 從新查詢刷新數據顯示 this.getProductList() }) }
https://element.eleme.io/#/zh-CN/component/notification
以上順利敲下來,就能夠npm run dev 啓動查看最終效果了,如測接口同樣,分別測試下重複添加和正常添加功能是否OK
本次分享代碼已提交 https://github.com/mrzcode/TestProjectManagement
標記TAG:TPMShare5
若是想查看當前代碼能夠checkout本次TAG便可
pymysql.err.Error: Already closed 這是一個python實現過程當中的錯誤,由於在寫增長的接口的時候沒有再次初始化連接,關閉再請求致使,就是一開始爲何抽了一個數據連接方法。
原創不易,通過實踐的總結分享更不易,若是你以爲有用,請點擊推薦,也歡迎關注我博客園和微信公衆號。
*可能需歷史閱讀*