那么我们先来认识一下,什么是QT,他的具体作用是什么,应用在哪些方面?
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。
QT之所以能够在全世界范围内得到广大软件开发者的青睐和使用,一个很大的原因是QT入门确实是非常容易。很少的代码就能折腾出一个比较复杂的软件界面。
QT已经支持传统模式下的软件界面开发技术体系以及新模式下的软件界面开发技术体系。传统模式比如QT Widgets,这种模式下的竞争对手比如MFC早就“躺平”了表示不再升级更新了。
接下来,我们开始代码实战,编写mainwindows.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//一般在qt的构造函数中进行初始化操作
//显示当前窗口的时候,显示另外一个窗口TestWidget
#if 1
//创建窗口对象,没有给W对象指定父对象
//要显示这个窗口必须要进行show()操作
TestWidget* w = new TestWidget;
w->show();
#else
// 创建窗口对象,给W对象指定父对象
// explicit TestWidget(QWidget *parent = nullptr);
// 如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口
// 这样的话当前父窗口显示的时候,子窗口就一并被显示出来了
// 这时候子窗口是没有边框的
TestWidget* w = new TestWidget(this);
#endif
//创建对话框窗口
Dialog *dlg = new Dialog();
//非模态
dlg->show();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//一般在qt的构造函数中进行初始化操作
//显示当前窗口的时候,显示另外一个窗口TestWidget
//创建窗口对象,没有给W对象指定父对象
TestWidget* w = new TestWidget;
w->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
获取类的属性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; ++i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = object->property(name);
qDebug() << name << value;
}
在common中引入的坐标依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
迭代查询代码,一级缓存与二级缓存结合:
@GetMapping("query")
public Object query(String id) {
String articleKey = "article:" + id;
String articleKeyRedis = "REDIS_ARTICLE:" + id;
Article article = cache.get(articleKey, s -> {
System.out.println("文章id为"+id+"的没有查询到,则从Redis中查询后返回...");
Article articleReal = null;
String articleJsonStr = redis.get(articleKeyRedis);
// 判断从redis中查询到的文章数据是否为空
if (StringUtils.isBlank(articleJsonStr)) {
System.out.println("Redis中不存在该文章,将从数据库中查询...");
// 如果为空,则进入本条件,则从数据库中查询数据
articleReal = articleService.queryArticleDetail(id);
// 手动把文章数据设置到redis中,后续再次查询则有值
String articleJson = JsonUtils.objectToJson(articleReal);
redis.set(articleKeyRedis, articleJson);
} else {
System.out.println("Redis中存在该文章,将直接返回...");
// 如果不为空,则直接转换json类型article再返回即可
articleReal = JsonUtils.jsonToPojo(articleJsonStr, Article.class);
}
return articleReal;
});
return article;
}
@Resource
private IArticleTypeService articleTypeService;
@Resource
private Cache<String, List<ArticleType>> articleTypeCache;
@Resource
private RedisOperator redis;
@Override
public void run(String... args) throws Exception {
System.out.println("缓存预热。。。");
// 1. 查询所有分类数据
List<ArticleType> types = articleTypeService.list();
System.out.println(types);
String articleTypeKey = "articleTypeList";
// 2. 设置分类数据到本地缓存
articleTypeCache.put(articleTypeKey, types);
// 3. 设置分类数据到redis
redis.set(articleTypeKey, JsonUtils.objectToJson(types));
}
修改hostname,可以区分每个tab是哪台虚拟机
-- 获得http的协议版本号
-- ngx.say("http协议版本: " .. ngx.req.http_version());
-- 获得http的请求方法
-- ngx.say("http的请求method: " .. ngx.req.get_method());
-- http的请求头内容
-- ngx.say("http的原始请求头内容: " .. ngx.req.raw_header());
-- 获得http的请求头信息
local myHeader = ngx.req.get_headers();
-- ngx.say("token: " .. myHeader.token);
-- ngx.say("uid: " .. myHeader.uid);
-- 获得请求中的参数
local args = ngx.req.get_uri_args();
-- ngx.say("age: " .. args["age"]);
-- ngx.say("birthday: " .. args["birthday"]);
-- 获得请求体body中的数据
ngx.req.read_body();
local body_data = ngx.req.get_post_args();
for key,value in pairs(body_data) do
ngx.say(key, value);
end
目标: 先查询缓存,如果缓存有数据,则在网关中判断返回即可。 如果网关中缓存不存在,则把请求向后端服务转发。
-- 导入工具类引用
local http = require('http');
local redis = require("redis_utils")
local get = http.get;
local args = ngx.req.get_uri_args();
local articleId = args["id"];
local articleKey = "REDIS_ARTICLE:" .. articleId;
local articleDetail = redis.get(articleKey);
if articleDetail ~= ngx.null then
ngx.say("by openresty: " .. articleDetail);
return;
end
-- 发送请求
local result = get("/article/query", args);
-- 返回响应
ngx.say("by springboot: " .. result);
-- ngx.say("测试负载均衡 - 106");