动态

详情 返回 返回

WxPython跨平台開發框架之主從表展示和錄入的界面處理--產品報價單和明細記錄的處理 - 动态 详情

我們在前面隨筆《Vue3+ElementPlus的BS端主從表的快速開發》瞭解了Vue3+ElementPlus的BS端主從表的實現,瞭解了大概的設計和界面設計方式,我們現在切換一下,看看如何結合FastAPI+WxPython實現主從表界面的展示和編輯處理的。

FastAPI的後端採用控制器基類繼承方式提供標準化接口,SqlALchemy提供的數據ORM管理,相關代碼通過代碼生成工具快速生成,包括後端的API接口定義類,SqlALchemy模型類、DTO對象類,以及前端的界面生成等工作。本篇隨筆主要介紹WxPython跨平台開發框架之主從表展示和錄入的界面處理--產品報價單和明細記錄的處理。

1、FastAPI實現主從表數據接口和SqlAlchemy的數據處理

WxPython跨平台開發框架全部採用Python語言進行開發,包括後端的內容,採用 基於SqlAlchemy+Pydantic+FastApi 的後端框架,FastAPI啓動後,進入Swagger頁面如下所示,列出每個業務表的相關接口。

以上就是常規化的接口,包括單個獲取、ID存在、條件查詢、分頁查詢、數量查詢、增加、刪除、更新等標準化接口,這些基礎類接口一般封裝在API的控制器基類中。

該後端接口採用統一的接口協議,標準協議如下所示。

{
  "success": false,
  "result":  T ,
  "targetUrl": "string",
  "UnAuthorizedRequest": false,
  "errorInfo": {
    "code": 0,
    "message": "string",
    "details": "string"
  }
}

常規化的接口是結合泛型的方式,這樣定義可以很好的抽象不同的業務類接口到基類控制器中,如下是FastApi 後端的基類控制器定義。

image

 有了上面基類定義好的常規化接口,子類只需要繼承基類控制器即可獲得強大的功能接口了。

一般API控制器的子類,只需要繼承基類就可以了,額外增加的接口按常規化的設計函數即可,可以參考基類的做法來寫各種(GET、PUT、DELETE、POST)的處理函數。

image

我們來看看對於產品報價單和明細記錄的處理,這兩個代表不同的業務表,我們可以分開管理,通過約束他們的記錄關係實現主從表彈性化的管理。

如對於主表,我們在基類接口外定義多兩個函數,主要就是刪除主表的時候,同時移除明細記錄的關聯操作。

from fastapi import APIRouter, Depends, HTTPException, Query, Request, Path, Body

..................
# 創建路由,用於處理自定義接口 router = APIRouter() @router.get( "byorderno/{orderno}", response_model=AjaxResponse[QuotationDto | None], summary="根據報價單編號獲取對象信息", dependencies=[DependsJwtAuth], ) async def find_by_orderno( orderno: Annotated[str | None, Path(description="訂單編號")], request: Request, db: AsyncSession = Depends(get_db), ): # ip = await get_request_ip(request) item = await quotation_crud.get_by_column(db, "handno", orderno) item = QuotationDto.model_validate(item) if item else None return AjaxResponse(item) @router.delete( "quotation-related/{id}", response_model=AjaxResponse[bool | None], summary="刪除報價單及明細信息", dependencies=[DependsJwtAuth], ) async def delete_quotation_related( id: Annotated[str | None, Path(description="報價單ID")], request: Request, db: AsyncSession = Depends(get_db), ): # ip = await get_request_ip(request) #獲取記錄信息 item = await quotation_crud.get(db, id) if not item: return AjaxResponse(False) # 刪除相關的明細記錄 res = await quotationdetail_crud.delete_by_column(db, "orderno", item.handno) if res: # 再刪除報價單 await quotation_crud.delete_byid(db, id) return AjaxResponse(res) # 使用基類控制器,可以繼承常規CRUD的接口,並自動生成路由,依賴注入,數據庫連接等功能 ——構建方式2 controller = BaseController[Quotation, str, QuotationPageDto, QuotationDto]( quotation_crud, pagedto_class=QuotationPageDto, dto_class=QuotationDto, router=router, ) controller.init_router() # 初始化常規CRUD等接口的路由

而報價單明細業務控制器,主要需要根據報價單號(訂單號)獲取明細的接口

from fastapi import APIRouter, Depends, HTTPException, Query, Request, Path, Body

from typing import Type, TypeVar, Generic, List, Dict, Any, Optional, Annotated
from datetime import datetime
from sqlalchemy.ext.asyncio import AsyncSession

from schemas.base import AjaxResponse, ErrorInfo, ListResult, PagedResult
from api.base_controller import BaseController
from db.session_async import get_db
from common.jwt import DependsJwtAuth

from models.quotationdetail import QuotationDetail
from schemas.quotationdetail import QuotationDetailDto, QuotationDetailPageDto
from crud.quotationdetail import quotationdetail as quotationdetail_crud
from crud.operationlog import operationlog as operationlog_crud
from utils.request_parse import get_request_ip

# 創建路由,用於處理自定義接口
router = APIRouter()

@router.get(
    "/by-orderno",
    response_model=AjaxResponse[List[QuotationDetailDto] | None],
    summary="根據訂單編號獲取記錄",
    dependencies=[DependsJwtAuth],
)
async def get_by_orderno(
    orderno: Annotated[str | None, Query(description="訂單編號")],
    request: Request,
    db: AsyncSession = Depends(get_db),
):
    # ip = await get_request_ip(request)
    items = await quotationdetail_crud.get_by_orderno(db, orderno)
    # print(len(items))
    items = [QuotationDetailDto.model_validate(item) for item in items]
    return AjaxResponse(items)

@router.delete(
    "/by-orderno/{orderno}",
    response_model=AjaxResponse[bool | None],
    summary="根據訂單編號刪除所有明細記錄",
    dependencies=[DependsJwtAuth],
)
async def delete_by_orderno(
    orderno: Annotated[str | None, Path(description="訂單編號")],
    request: Request,
    db: AsyncSession = Depends(get_db),
):
    res = await quotationdetail_crud.delete_by_attributes(db, QuotationDetail.orderno == orderno)
    return AjaxResponse(res)

# 使用基類控制器,可以繼承常規CRUD的接口,並自動生成路由,依賴注入,數據庫連接等功能 
controller = BaseController[QuotationDetail, str, QuotationDetailPageDto, QuotationDetailDto](
    quotationdetail_crud,
    pagedto_class=QuotationDetailPageDto,
    dto_class=QuotationDetailDto,
    router=router,
)
controller.init_router()  # 初始化常規CRUD等接口的路由

 

由於基類控制器接口的標準化,我們根據框架後端的接口進行前端API調用類的封裝處理,從而實現業務基類調用接口的統一封裝,簡化代碼。這樣增刪改查等處理的接口都可以抽象到BaseApi裏面了。

如對於權限模塊,我們涉及到的用户管理、機構管理、角色管理、菜單管理、功能管理、操作日誌、登錄日誌等業務類,那麼這些類繼承BaseApi,就會具有相關的接口了,如下所示繼承關係。

 

2、基於SqlAlchemy實現的業務模型

FastAPI負責提供數據的API接口,底層的數據處理,通過SqlAlchemy + MongoDB 實現多種數據庫的數據管理,如對於MySQL、Postgresql、SQLite、Oracle、MongoDB等進行接入和數據交換處理。

對於常規的業務表,我們採用SqlAlchemy實現數據庫的ORM管理的,SqlAlchemy也是Python領域中非常強大的ORM管理模塊之一, 它讓你用 Python 對象來操作數據庫,而不是手寫 SQL 語句。

一般我們先定義好模型的基類,提供簡單的封裝

image

 然後在業務類裏面繼承它即可

image

 報價單的明細表也是類似的

image

這些模型類和對應接口的DTO類只需要在代碼生成工具中進行一鍵生成就可以了,不用編寫。

 在代碼生成工具 Database2Sharp  打開數據庫列表後,右鍵菜單可以選擇生成對應的Python+FastApi後端項目,如下界面所示。

選中相關的表後,一鍵可以生成各層的類文件,其中包括最為繁瑣的Model映射類信息。如下是生成的相關類的界面效果。

 

2、WxPthon實現基於Python桌面端主從表的數據處理

我們知道,一般對於單表來説,業務和界面會相對比較簡單,如下面的界面效果,在Windows下客户信息的列表管理和數據編輯界面如下所示。

 

而對於主從表,一般除了主業務表外,會關聯一個到多個的明細表,對於報價單來説,就只有一個明細表,如下所示是具體的界面列表展示。

image

對於列表的主從表關聯關係,沒有太多好説的,就是增加了一個明細表的處理展示

對於主從表編輯界面來説,就需要複雜處理一些,在表格需要直接編輯錄入並保存明細的操作處理,如下是主從表的編輯界面的實現效果。

image

其主要就是在第一次創建的時候,對錶格數據類進行設置

image

表格的數據直接錄入,一般不是僅僅的通過文本框的錄入,一般錄入有選擇表的記錄,下拉類表、複選框、圖像、數值、顏色等等特殊的錄入的。

 如自定義數據列表選擇界面,我通過定義一個產品的數據列表展示供選擇,單擊產品編碼處,彈出一個選擇框進行選擇。

image

為了實現對錶格數據單元格的單擊監控,我們綁定了對應的事件。

AsyncBind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.on_cell_left_click, self.sub_grid)

然後對事件進行實現即可。

image

 下拉列表則是通過綁定固定列表,或者字典類型的方式實現字典下拉列表選擇

image

初始化字典列表很容易,如下代碼所示。

image

 其他案例可以參考測試效果,支持多種數據輸入處理,測試界面效果如下所示。

image

 

以上就是對於WxPython應用,結合前後端的處理,實現了主從表展示和錄入的界面處理--產品報價單和明細記錄的處理。

user avatar u_17494575 头像 u_16281588 头像 u_15505879 头像 u_17467352 头像 yian 头像 buildyuan 头像 chiqingdezhentou 头像 dalideshoushudao 头像 aitibao_shichangyingxiao 头像 java_study 头像 emanjusaka 头像 zengjingaiguodekaomianbao 头像
点赞 58 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.