做鞋子的网站,wordpress大学,免费作图软件,营销型企业网站建设规划探讨1、FastAPI实现主从表数据接口和SqlAlchemy的数据处理WxPython跨平台开发框架全部采用Python语言进行开发#xff0c;包括后端的内容#xff0c;采用 基于SqlAlchemyPydanticFastApi 的后端框架#xff0c;FastAPI启动后#xff0c;进入Swagger页面如下所示#xff0c;列出…1、FastAPI实现主从表数据接口和SqlAlchemy的数据处理WxPython跨平台开发框架全部采用Python语言进行开发包括后端的内容采用 基于SqlAlchemyPydanticFastApi 的后端框架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_modelAjaxResponse[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 Nonereturn AjaxResponse(item)router.delete(quotation-related/{id},response_modelAjaxResponse[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的接口并自动生成路由依赖注入数据库连接等功能 ——构建方式2controller BaseController[Quotation, str, QuotationPageDto, QuotationDto](quotation_crud,pagedto_classQuotationPageDto,dto_classQuotationDto,routerrouter,)controller.init_router() # 初始化常规CRUD等接口的路由复制代码而报价单明细业务控制器主要需要根据报价单号订单号获取明细的接口复制代码from fastapi import APIRouter, Depends, HTTPException, Query, Request, Path, Bodyfrom typing import Type, TypeVar, Generic, List, Dict, Any, Optional, Annotatedfrom datetime import datetimefrom sqlalchemy.ext.asyncio import AsyncSessionfrom schemas.base import AjaxResponse, ErrorInfo, ListResult, PagedResultfrom api.base_controller import BaseControllerfrom db.session_async import get_dbfrom common.jwt import DependsJwtAuthfrom models.quotationdetail import QuotationDetailfrom schemas.quotationdetail import QuotationDetailDto, QuotationDetailPageDtofrom crud.quotationdetail import quotationdetail as quotationdetail_crudfrom crud.operationlog import operationlog as operationlog_crudfrom utils.request_parse import get_request_ip# 创建路由用于处理自定义接口router APIRouter()router.get(/by-orderno,response_modelAjaxResponse[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_modelAjaxResponse[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_classQuotationDetailPageDto,dto_classQuotationDetailDto,routerrouter,)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 打开数据库列表后右键菜单可以选择生成对应的PythonFastApi后端项目如下界面所示。选中相关的表后一键可以生成各层的类文件其中包括最为繁琐的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应用结合前后端的处理实现了主从表展示和录入的界面处理--产品报价单和明细记录的处理。专注于代码生成工具、.Net/Python 框架架构及软件开发以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架、Python开发框架等框架产品。