技术文章如何写作才能有较好的阅读体验

派盖褪秘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

内容概要:本文介绍了一个关于三相桥式全控整流及有源逆变电路的实验仿真模型,重点研究三相整流器与逆变器在Simulink环境下的建模与仿真技术。内容涵盖电力电子变换器的工作原理、控制策略设计、系统动态响应分析,并进一步扩展至10kV配电网中不同中性点接地方式(中性点不接地、经小电阻接地、经消弧线圈接地)下的单相、两相短路接地及相间短路故障的仿真研究,全面呈现了电力系统典型故障的暂态特性。此外,文档还整合了丰富的科研资源,涵盖电力系统优化、新能源并网、故障诊断、微电网调度等多个前沿方向,充分体现了Matlab/Simulink在电气工程仿真中的核心地位和广泛应用价值。; 适合人群:电气工程、自动化、电力电子等相关专业的高校学生、科研人员及工程技术人员,具备一定的电路理论基础和仿真软件操作经验者更佳。; 使用场景及目标:①用于教学实验中帮助理解三相整流与逆变电路的工作机制;②支撑科研项目中对电力系统故障特性的建模与分析;③作为开发新型控制算法(如PWM控制、低电压穿越等)的仿真验证平台;④辅助完成毕业设计、课题研究或工程方案评估; 阅读建议:此资源以Simulink仿真实现为核心,强调理论与实践结合,建议读者在学习过程中同步搭建模型,动手调试参数,深入理解各模块功能与系统整体行为,同时可参考文中提供的完整资源链接拓展研究视野。
内容概要:本文介绍了一个关于风光制氢合成氨系统优化研究的论文复现资源,依托Cplex求解器在Matlab环境中实现系统建模与求解。该资源聚焦于新能源耦合系统,涵盖风能、太阳能发电制氢,并进一步合成氨的全流程能量管理与优化调度,通过数学建模与优化算法实现系统经济性与运行效率的最大化。内容不仅包括风光出力不确定性处理、电解水制氢、氢气储存与转化、氨合成工艺等关键环节的建模,还整合了多种智能优化算法与电力系统调度策略,如二阶锥规划、多目标优化与需求响应机制,旨在为科研人员提供一套完整的综合能源系统优化研究框架与代码实现范例。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事新能源系统优化、综合能源系统规划、氢能与氨能转化等前沿方向的研究者。; 使用场景及目标:① 复现高水平期刊论文中的风光制氢合成氨系统优化模型,掌握Cplex在Matlab中的建模与求解流程;② 学习并应用二阶锥规划、多目标优化、需求响应等先进优化方法于综合能源系统科研项目中;③ 借助提供的完整Matlab代码案例,快速搭建仿真环境,加速科研进程,提升学术创新能力与工程实践水平。; 阅读建议:此资源以科研复现为核心,强调理论与实践深度融合,建议读者在学习过程中结合文档中的代码实例,逐步调试与理解模型构建逻辑,并尝试进行参数调整与模型拓展,以深化对综合能源系统多能耦合与优化调度机制的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值