C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示
生活随笔
收集整理的這篇文章主要介紹了
C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
概述
演示
源碼
?
概述
這里用Spring Boot控制"/"和"index.html"請求,獲取客戶端http的信息;
Qt端使用QML和C++混合編程方式,C++控制業務,QML做頁面展示;
?
演示
首先來個動態圖:
然后,然后就沒有然后了,
差不多就是這種現象,可以識別谷歌,和火狐瀏覽器,
Windows和Linux操作系統,主要是根據HTTP包的user-agent這個屬性。
?
源碼
Java端結構如下:
源碼如下:
HelloController.java
package getsomeinfo.demo.controller;import getsomeinfo.demo.judgment.Judge; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.List; import java.util.Map;@Controller public class HelloController {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredHttpServletRequest httpServletRequest;@ResponseBody@GetMapping({"/", "/index.html"})public String index(){//List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from someInfo");Enumeration<String> headerNames = httpServletRequest.getHeaderNames();String allInfo = "";while (headerNames.hasMoreElements()){String header = headerNames.nextElement();allInfo += header + ": ";allInfo += httpServletRequest.getHeader(header) + "\n";}String osAndBrower = httpServletRequest.getHeader("user-agent");String os = Judge.whatOS(osAndBrower);String brower = Judge.whatBrower(osAndBrower);System.out.println(os + ":" + brower);SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");df.format(new Date());String sqlCmd = "insert into someInfo(os, brower, time, alldata) values('"+ os + "', '" + brower + "', '" + df.format(new Date()) + "', '" + allInfo + "')";System.out.println(sqlCmd);//存到數據庫里面jdbcTemplate.execute(sqlCmd);return "業務繁忙,告辭,告辭!";} }Jude.java
package getsomeinfo.demo.judgment;public class Judge {//判斷是啥操作系統public static String whatOS(final String str){String osStr = "未知";//這里就簡單判斷下if(str.contains("Windows")){osStr = "Windows";}else if(str.contains("Linux")){osStr = "Linux";}else{}return osStr;}//判斷是啥瀏覽器-簡單判斷下public static String whatBrower(final String str){String browerStr = "未知";if(str.contains("Chrome")){browerStr = "Chrome";}else if(str.contains("Firefox")){browerStr = "Firefox";}else{}return browerStr;} }application.yml
spring:datasource:username: rootpassword : 123456url: jdbc:mysql://192.168.164.141:3306/jdbcdriver-class-name: com.mysql.jdbc.Driverserver:port: 8888porn.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.19.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>GetSomeInfo</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>?
C++的Qt端
結構如下:
源碼如下:
mytableviewmodel.h
#ifndef MYTABLEVIEWMODEL_H #define MYTABLEVIEWMODEL_H#include <QAbstractTableModel>class MyTableViewModel: public QAbstractTableModel {Q_OBJECT public:MyTableViewModel();int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;Q_INVOKABLE void addItem(QString one, QString two, QString three, QString four, QString five);Q_INVOKABLE void Del();Q_INVOKABLE void Refresh();private:QVector<QVector<QString>> m_aryData;};#endif // MYTABLEVIEWMODEL_Hwidget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> #include <QVector>QT_BEGIN_NAMESPACE class QQuickView; class MyTableViewModel; class QSqlQuery; class QTimer; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected:void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;bool connectMySQL();QVector<QStringList> selectAppropriateData(const QString &cmd);protected slots:void flushText();private:Ui::Widget *ui;QQuickView *m_quickView;QWidget *m_quickWidget;MyTableViewModel *m_model;QSqlDatabase m_db;QSqlQuery *m_query;QTimer *m_timer; };#endif // WIDGET_Hmain.cpp
#include "widget.h" #include "mytableviewmodel.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }mytableviewmodel.cpp
#include "mytableviewmodel.h"MyTableViewModel::MyTableViewModel(): QAbstractTableModel(NULL) {}int MyTableViewModel::rowCount(const QModelIndex &parent) const {Q_UNUSED(parent)return m_aryData.size(); }int MyTableViewModel::columnCount(const QModelIndex &parent) const {Q_UNUSED(parent)return 3; }QVariant MyTableViewModel::data(const QModelIndex &index, int role) const {return m_aryData[index.row()][role]; }QHash<int, QByteArray> MyTableViewModel::roleNames() const {QHash<int, QByteArray> roles;roles[0] = "1";roles[1] = "2";roles[2] = "3";roles[3] = "4";roles[4] = "5";return roles; }void MyTableViewModel::addItem(QString one, QString two, QString three, QString four, QString five) {beginInsertRows(QModelIndex(), m_aryData.size(),m_aryData.size());QVector<QString> list;list << one << two << three << four << five;m_aryData << list;endInsertRows(); }void MyTableViewModel::Del() {if(m_aryData.size() <= 0) return;for(int i = 0; i < m_aryData.size(); i++){beginRemoveRows(QModelIndex(), m_aryData.size() - 1, m_aryData.size() - 1);}m_aryData.clear();endRemoveRows(); }void MyTableViewModel::Refresh() {beginResetModel();endResetModel(); }widget.cpp
#include "widget.h" #include "ui_widget.h" #include "mytableviewmodel.h" #include <QQmlApplicationEngine> #include <QQmlComponent> #include <QDateTime> #include <QQmlContext> #include <QQuickView> #include <QSqlQuery> #include <QResizeEvent> #include <QDebug> #include <QTimer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connectMySQL();m_quickView = new QQuickView;m_timer = new QTimer(this);m_model = new MyTableViewModel;m_quickView->engine()->rootContext()->setContextProperty("theModel", m_model);m_quickView->setResizeMode(QQuickView::SizeRootObjectToView);m_quickView->setSource(QUrl("qrc:/main.qml"));m_quickWidget = QWidget::createWindowContainer(m_quickView);m_quickWidget->setParent(ui->widget);connect(m_timer, SIGNAL(timeout()), this, SLOT(flushText()));m_timer->start(500);this->setWindowTitle("CSDN IT1995"); }Widget::~Widget() {delete ui;delete m_quickView;delete m_model; }void Widget::resizeEvent(QResizeEvent *event) {Q_UNUSED(event);m_quickWidget->setFixedSize(ui->widget->size());QWidget::resizeEvent(event); }bool Widget::connectMySQL() {m_db = QSqlDatabase::addDatabase("QMYSQL");m_query = new QSqlQuery(m_db);m_db.setHostName("192.168.164.141");m_db.setPort(3306);m_db.setDatabaseName("mysql");m_db.setUserName("root");m_db.setPassword("123456");if(!m_db.open()){qDebug() << "error";return false;}return true; }QVector<QStringList> Widget::selectAppropriateData(const QString &cmd) {QVector<QStringList>listVec;if(!m_query->exec(cmd) || m_query->size() == 0){return listVec;}while(m_query->next()){QStringList list;for(int i = 0; i < 5; i++){ //這里偷懶了,把5寫死了!if(i == 3){list << m_query->value(i).toDateTime().toString("yyyy-MM-dd HH:mm:ss");continue;}list << m_query->value(i).toString();}listVec.append(list);}return listVec; }void Widget::flushText() {m_model->Del();QVector<QStringList> listVec = selectAppropriateData("select * from jdbc.someInfo");for(int i = 0; i < listVec.size(); i++){m_model->addItem(listVec[i][0].toUtf8(), listVec[i][1].toUtf8(), listVec[i][2].toUtf8(), listVec[i][3].toUtf8(), listVec[i][4].toUtf8());}m_model->Refresh(); }widget.ui
main.qml
import QtQuick 2.8 import QtQuick.Controls 2.1Item {visible: trueMyTableView{id: myTableViewheight: parent.heightwidth: parent.widthfocus: falsetableView.itemDelegate:Rectangle {TextField{id: textFieldheight: 25text: styleData.value}}tableView.rowDelegate: Rectangle {height: 25}} }MyTableView.qml
import QtQuick 2.8 import QtQuick.Controls 1.4TableView {property alias tableView: tableViewid: tableViewTableViewColumn {title: "id"; role: "1"; width: 120}TableViewColumn {title: "操作系統"; role: "2"; width: 120}TableViewColumn {title: "瀏覽器"; role: "3"; width: 120}TableViewColumn {title: "訪問時間"; role: "4"; width: 120}TableViewColumn {title: "所有數據"; role: "5"; width: 120}model: theModel }MySQL數據庫
總結
以上是生活随笔為你收集整理的C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt笔记-解决Q3DScatter加载Q
- 下一篇: C++笔记-異常處理機制(释放堆区空间)