qt 实现MVC Api控制器开发 web api接口-连载【5】-企业级系统开发实战连载系列 -技术栈vue、element-ui、qt、c++、sqlite
标题作者背景描述:
本人就职于外资IT企业,担任电商订单处理产品开发经理一职,领导过非常多次大小项目的开发工作,对电商平台订单处理流程非常熟悉。
公司专注鞋服行业相关软件开发和服务,公司规模100多人以上,在台北,广州,成都,上海,北京,国外等均有分公司。
为什么写此系列文章?
本人在学校至工作到现在十余年时间,使用.net C# 开发语言,结合在公司实际开发,和市场的需求中,NET.开发的商业企业级系统遇到的缺点有如下:
- 程序首次加载慢,因为虚拟机编译的原因。
- WINFORM界面开发不够炫丽,精美。
- WINFORM界面设计人员难找。
- 程序可以被反编译。
- 安装包过大,部署麻烦,framework.
- 跨平台不够好。
解决方案:
结合近年来前端设计的走向,最终选择了qt+vue+element UI+sqlite(数据库根据需要情况选择)
qt负责接口和硬件处理
sqlite做数据存储
vue+element UI 实现前端。
预览Demo
MVC 模型
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
Model(模型) - 模型代表一个存取数据的对象。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
下载QtWebApp
描述:要实现web Api需要使用一个qt web app 框架。
下载QtWebApp,集成到项目中,这个库主要是实现http 协议,和 QT Web Api库支持。
下载方式 : https://download.csdn.net/download/m0_49654513/12741112
作用:对于单机版本,不需要用户安装iis 或 tomcat,简化了部署的难度。
QtWebApp目录结构如下:
解压QtWebApp
添加到解决方案
打开上一章节创建的解决方案:BitPos 。
在解决方案资源管理器,右键》添加》现有项目 ,如下:
把qtwebapp.vcxproj 添加现在项目 。
设置静态链接
选择QtWebApp ,右键》属性
在常规选项中修改sdk 版本,和平台工具集,配置类型,输出为静态库,如下:
设置QT版本
在qt project settings 选项中,修改 qt installation 为 我们上一节配置的qt版本,如下:
编译源码
编译源码,这里能够一次编译成功,如下图:
引用QtwebApp
点击BitPos项目,右键》添加》引用
添加包含目录
为BitPos添加 包含目录,因为后面会用QtWebApp的头文件。
选择BitPos 》属性》vc++目录》包含目录》输入QtWebApp 如下图:
修改BitPos静态链接
修改BitPos运行库为静态链接。
按上面的步骤,修改这2个项目的配置为release 模式,重复一次操作。否则release编译会报错。
实现mvc
接下来演示如何添加一个用户登入时密码验证的接口。
这个接口有2个参数,分别是user_code ,password
返回为json ,返回了用户代码和用户名称 ,分别是user_code,user_name 。
使用postman请求工具,测试和调试API,
请求描述如下图:
添加API 控制器
接下来进行实操:添加API 控制器 和登入接口Login的方法
新增 src 目录,然后在目录下创建 controller
如下图:
添加controller类
选中controller 右键》添加》Add qt class
输入类名:ApiController
如下图:
点add 如下图:
点击next:如下图
把Base class 修改为HttpRequestHandler
实现模型Login 动作
ApiController.h添加Login 函数,
如下:
//action 登入接口。http://localhost:5050/vue-element-admin/api/login
Q_INVOKABLE void Login(HttpRequest & request, HttpResponse & response);
在ApiController.cpp添加Login 实现,实现了用户和密码的简单验证,并返回用户结果,如下:
Q_INVOKABLE void ApiController::Login(HttpRequest & request, HttpResponse & response)
{
//request.
//获取post请求的表单 。
QMultiMap<QByteArray, QByteArray> forms = request.getParameterMap();
//获取用户提交表单中的user_code
auto usercode = forms.value("user_code").trimmed();
if (usercode.isEmpty())
{
Result("用户代码不能为空!", 1, response);
return;
}
//获取用户提交表单中的password
auto password = forms.value("password").trimmed();
if (password.isEmpty())
{
Result("密码不能为空!", 1, response);
return;
}
//二次判断
QByteArray hash = QCryptographicHash::hash(password, QCryptographicHash::Algorithm::Sha256).toBase64();
//验证用户代码和密码。
QJsonObject object
{
{
"code", 0},
{
"msg", QJsonValue::Null}
};
QJsonObject user
{
{
"user_code", "admin"},
{
"user_name", "admin"}
};
object.insert("user", user);
QJsonDocument usermodel(object);
//返回用户信息。
QByteArray body = usermodel.toJson(QJsonDocument::JsonFormat::Indented);
response.write(body, true);
}
最后贴出这2个类的源码分别是:
ApiController.h的代码如下:
#pragma once
//解决中文乱码问题。
#pragma execution_character_set("utf-8")
#include <httpserver/httprequesthandler.h>
using namespace stefanfrings;
//控制器 http://localhost:5050/vue-element-admin/api
class ApiController :
public HttpRequestHandler
{
Q_OBJECT
public:
Q_INVOKABLE ApiController(const ApiController & v