Qt/C++ Mysql数据库用户登录分配软件(源码分享)

news2024/11/24 8:45:43

功能简介:

这是一个基于 Qt/C++ 实现的简单 MySQL 用户权限管理系统,能够通过控制台交互输入进行数据库连接、用户创建、权限分配以及用户查询的自动化操作。用户可以通过该软件登录到 MySQL 服务器,选择数据库,并根据需求创建新用户,设置访问权限,最后还可以查询并显示数据库中的所有用户信息。

功能步骤和说明:

  1. 输入 MySQL 管理员密码

    • 软件启动后首先会提示用户输入 MySQL 管理员(root)密码。程序将使用此密码尝试连接到 MySQL 服务器。
    • 用户需要在控制台输入密码,以确保能够连接到数据库服务器。
  2. 连接 MySQL 数据库

    • 程序会使用用户输入的密码,尝试连接到本地的 MySQL 服务器 (localhost)。
    • 如果连接成功,程序会提示 "成功连接到MySQL数据库!"。如果连接失败,则会给出相应的错误提示,并终止程序。
  3. 显示数据库列表

    • 连接成功后,程序会从 MySQL 服务器获取当前服务器上所有可用的数据库列表。
    • 这些数据库会以序号的方式展示给用户,并提示用户选择要操作的数据库。
  4. 选择数据库

    • 用户可以通过输入对应的序号选择需要操作的数据库。
    • 选择完成后,程序会再次确认用户选择的数据库是否正确。如果确认无误,程序将继续进行下一步操作。
  5. 输入新用户信息

    • 程序将提示用户输入 新用户的用户名
    • 输入完成后,程序会继续提示用户选择该用户的登录方式:
      1. 本机登录:用户只能从本机 (localhost) 进行登录。
      2. 同一网段登录:用户可以从任意网段 (%) 进行登录。
    • 用户选择登录方式后,程序会提示输入 新用户的密码
  6. 确认信息

    • 在创建用户之前,程序会将所有信息汇总,显示给用户,包括:
      • 数据库名
      • 用户名
      • 登录方式(本机登录或同网段登录)
      • 用户密码
    • 用户需要确认信息是否正确,确认无误后,程序才会创建用户。如果用户取消操作,程序将退出。
  7. 创建用户并分配权限

    • 用户确认后,程序将自动在选定的数据库中创建新用户,并为其分配所有权限(ALL PRIVILEGES)。
    • 程序将输出操作结果,提示用户是否成功创建用户并分配权限。
  8. 查询并显示数据库中的用户信息

    • 在成功创建用户后,程序会自动查询该数据库中所有拥有访问权限的用户信息。
    • 程序将输出这些用户的详细信息,包括:
      • 用户名
      • 主机地址(表示用户的登录方式,例如 localhost%
  9. 结束操作

    • 完成所有操作后,程序会输出操作结果并感谢用户的使用。

源码分享

​
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QtCore/QTextStream>
#include <QtCore/QCoreApplication>
#include <QDebug>

// 宏定义用于处理中文字符串
#define tc(a) QString::fromLocal8Bit(a)

QTextStream cin(stdin);   // 输入流
QTextStream cout(stdout); // 输出流

// 数据库连接函数
bool connectToDatabase(const QString& host, const QString& user, const QString& password) {
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(host);        // 设置主机名
    db.setUserName(user);        // 设置用户名
    db.setPassword(password);    // 设置密码
    db.setPort(3306);            // 设置端口

    // 尝试连接数据库
    if (!db.open()) {
        cout << tc("错误: 无法连接到MySQL数据库: ") << db.lastError().text() << endl;
        cout.flush();
        return false;
    }

    cout << tc("成功连接到MySQL数据库!") << endl;
    cout.flush();
    return true;
}

// 获取所有数据库列表的函数
QStringList getDatabaseList() {
    QStringList dbList;
    QSqlQuery query("SHOW DATABASES");
    while (query.next()) {
        dbList << query.value(0).toString(); // 添加数据库名到列表
    }
    return dbList;
}

// 创建用户并分配权限的函数
bool createUserAndGrantPrivileges(const QString& database, const QString& username, const QString& password, const QString& host) {
    QSqlQuery query;

    // 创建用户SQL语句
    QString createUser = QString("CREATE USER '%1'@'%2' IDENTIFIED BY '%3';").arg(username, host, password);
    if (!query.exec(createUser)) {
        cout << tc("错误: 创建用户失败: ") << query.lastError().text() << endl;
        cout.flush();
        return false;
    }

    // 分配权限SQL语句
    QString grantPrivileges = QString("GRANT ALL PRIVILEGES ON %1.* TO '%2'@'%3';").arg(database, username, host);
    if (!query.exec(grantPrivileges)) {
        cout << tc("错误: 分配权限失败: ") << query.lastError().text() << endl;
        cout.flush();
        return false;
    }

    cout << tc("成功为用户 '") << username << tc("' 分配权限!") << endl;
    cout.flush();
    return true;
}

// 统计数据库中用户数量的函数
int countUsersInDatabase(const QString& database) {
    QSqlQuery query;
    QString showUsers = QString("SELECT COUNT(DISTINCT User) FROM mysql.db WHERE Db='%1';").arg(database);

    // 执行查询用户数量的SQL语句
    if (!query.exec(showUsers)) {
        cout << tc("错误: 查询用户数量失败: ") << query.lastError().text() << endl;
        cout.flush();
        return -1;
    }

    // 获取用户数量
    if (query.next()) {
        return query.value(0).toInt();
    }

    return 0;
}
// 查询数据库中用户信息的函数
QStringList getUsersInDatabase(const QString& database) {
    QStringList userList;
    QSqlQuery query;

    // 查询拥有该数据库权限的用户信息
    QString queryString = QString("SELECT DISTINCT User, Host FROM mysql.db WHERE Db='%1'").arg(database);
    if (!query.exec(queryString)) {
        cout << tc("错误: 无法查询用户信息: ") << query.lastError().text() << endl;
        cout.flush();
        return QStringList(); // 返回空列表
    }

    // 将查询结果加入列表
    while (query.next()) {
        QString user = query.value(0).toString();
        QString host = query.value(1).toString();
        userList << QString("%1@%2").arg(user, host); // 用户@主机
    }

    return userList;
}
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // Step 1: 提示用户输入MySQL管理员密码
    cout << tc("****************欢迎使用MySQL用户权限管理系统*******************") << endl;
    cout.flush();  // 强制刷新输出
    cout << tc("请输入MySQL管理员(root)密码进行登录: ");
    cout.flush();  // 强制刷新输出
    QString password = cin.readLine().trimmed(); // 获取用户输入的密码

    if (password.isEmpty()) {
        cout << tc("错误: 密码不能为空.") << endl;
        cout.flush();
        return 1;
    }

    // Step 2: 尝试连接到MySQL服务器
    cout << tc("正在连接到MySQL服务器,请稍候...") << endl;
    cout.flush();  // 强制刷新输出
    if (!connectToDatabase("localhost", "root", password)) {
        return 1; // 连接失败则退出
    }

    // Step 3: 显示数据库列表供用户选择
    QStringList databases = getDatabaseList();
    if (databases.isEmpty()) {
        cout << tc("错误: 没有找到任何数据库.") << endl;
        cout.flush();  // 强制刷新输出
        return 1;
    }

    cout << tc("当前服务器上的数据库有:") << endl;
    cout.flush();  // 强制刷新输出
    for (int i = 0; i < databases.size(); ++i) {
        cout << tc("序号 ") << i + 1 << ": " << databases[i] << endl;
        cout.flush();  // 强制刷新输出
    }

    // 用户选择数据库序号
    int selectedIndex = -1;
    do {
        cout << tc("请输入要选择的数据库序号: ");
        cout.flush();  // 强制刷新输出
        QString input = cin.readLine().trimmed();
        selectedIndex = input.toInt() - 1;

        if (selectedIndex < 0 || selectedIndex >= databases.size()) {
            cout << tc("错误: 选择的序号无效,请重新输入.") << endl;
            cout.flush();  // 强制刷新输出
        }
    } while (selectedIndex < 0 || selectedIndex >= databases.size());

    QString selectedDatabase = databases[selectedIndex];
    cout << tc("您选择的数据库是: ") << selectedDatabase << tc("。请确认 (Y/N): ");
    cout.flush();  // 强制刷新输出
    QString confirm = cin.readLine().trimmed().toLower();

    if (confirm != "y") {
        cout << tc("取消操作,程序退出。") << endl;
        cout.flush();  // 强制刷新输出
        return 1;
    }

    // Step 4: 输入新用户名
    QString username;
    do {
        cout << tc("请输入新用户名: ");
        cout.flush();  // 强制刷新输出
        username = cin.readLine().trimmed();

        if (username.isEmpty()) {
            cout << tc("错误: 用户名不能为空,请重新输入.") << endl;
            cout.flush();  // 强制刷新输出
        }
    } while (username.isEmpty());

    // Step 5: 选择登录方式
    QString host;
    do {
        cout << tc("请选择用户登录方式 (1: 本机登录, 2: 同一网段登录): ");
        cout.flush();  // 强制刷新输出
        QString choice = cin.readLine().trimmed();
        if (choice == "1") {
            host = "localhost";
        } else if (choice == "2") {
            host = "%"; // % 表示可以从任何IP地址访问
        } else {
            cout << tc("错误: 无效的选择,请重新输入.") << endl;
            cout.flush();  // 强制刷新输出
        }
    } while (host.isEmpty());

    // Step 6: 输入新用户密码
    QString userPassword;
    do {
        cout << tc("请输入新用户的密码: ");
        cout.flush();  // 强制刷新输出
        userPassword = cin.readLine().trimmed();

        if (userPassword.isEmpty()) {
            cout << tc("错误: 用户密码不能为空,请重新输入.") << endl;
            cout.flush();  // 强制刷新输出
        }
    } while (userPassword.isEmpty());

    // 确认所有信息
    cout << tc("\n请确认以下信息:") << endl;
    cout << tc("数据库: ") << selectedDatabase << endl;
    cout << tc("用户名: ") << username << endl;
    cout << tc("登录方式: ") << (host == "localhost" ? tc("本机登录") : tc("同一网段登录")) << endl;
    cout << tc("用户密码: ") << userPassword << endl;
    cout << tc("是否确认创建用户? (Y/N): ");
    cout.flush();  // 强制刷新输出
    confirm = cin.readLine().trimmed().toLower();

    if (confirm != "y") {
        cout << tc("取消操作,程序退出。") << endl;
        cout.flush();  // 强制刷新输出
        return 1;
    }

    // Step 7: 创建用户并分配权限
    cout << tc("正在为用户分配权限,请稍候...") << endl;
    cout.flush();  // 强制刷新输出
    if (!createUserAndGrantPrivileges(selectedDatabase, username, userPassword, host)) {
        return 1; // 分配权限失败则退出
    }

    // Step 8: 查询并输出当前数据库中的用户数量和详细信息
    cout << tc("正在查询数据库 '") << selectedDatabase << tc("' 中的用户信息,请稍候...") << endl;
    cout.flush();  // 强制刷新输出

    QStringList users = getUsersInDatabase(selectedDatabase);
    int userCount = users.size(); // 获取用户数量

    // 输出详细信息,包括数据库名和用户数量
    cout << tc("数据库 '") << selectedDatabase << tc("' 中当前拥有权限的用户数量为: ") << userCount << endl;

    if (userCount == 0) {
        cout << tc("该数据库中目前没有用户拥有访问权限。") << endl;
    } else {
        cout << tc("该数据库中拥有权限的用户信息如下:") << endl;
        for (const QString& userInfo : users) {
            cout << tc("用户: ") << userInfo << endl; // 输出每个用户的详细信息
        }
    }

    cout << tc("操作完成,感谢使用!") << endl;
    cout.flush();  // 强制刷新输出


    return 0;
}

​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拍摄录制剪辑太麻烦?一键生成3D文旅视频的AI神器来了!

AI正在改变世界。 从Chat GPT的横空出世到大语言模型的爆发&#xff0c;AI开始融入人们的生活&#xff0c;人类与AI的对话无处不在&#xff1b; Midjournery等文生图工具&#xff0c;让“神笔马良”走进现实&#xff0c;每个人都能用AI创作出生动的图片&#xff1b; Sora更是…

引入sqlite作为云盒和硬盒子驱动的日志记录功能

1.下载源码 wget https://www.sqlite.org/2024/sqlite-autoconf-3460100.tar.gz 2.解压安装与引用 注意&#xff1a;不能将源码下载到Windows和虚拟机的共享文件夹下&#xff0c;自动构建的时候会导致一系列的问题 ./configure CCgcc --prefix/usr/lib

VMware虚拟机上安装openfileresa开源的NAS存储管理解决方案和ISCSI共享磁盘存储

目录 文章目录 目录说明下载安装镜像创建虚拟机安装 openfileresa 操作系统重新启动系统使用 root 用户登录使用内置的用户 openfiler 登录 创建 ISCSI 的共享存储1、添加存储硬盘2、查看添加的磁盘3、对硬盘分区4、创建卷组(Volume Group)5、创建数据卷(Volume)6、启动 ISCSI …

解决 蚁剑AntSword 连接后 ,命令回显 有问题 (ret=127) 的方法

在渗透测试过程中&#xff0c;我们在 连接上蚁剑 后&#xff0c;想要 进行 命令执行查看一些信息&#xff0c; 发现无论输入任何指令&#xff0c;返回的信息 只有 ret127&#xff0c;要解决这种问题&#xff0c;为大家提供一个解决方案。 蚁剑 软件&#xff0c;命令回显 只有…

深入了解以太坊

1. 以太坊编程语言和操作码 以太坊中智能合约的代码以高级语言编写&#xff0c;如 Serpent、LLL、Solidity 或 Viper,并可转换为 EVM 可以理解的字节码&#xff0c;以便执行。 Solidity 是为以太坊开发的高级语言之一&#xff0c;它具有类似 JavaScript 的语法&#xff0c;可以…

【踩坑】Vue3项目正常跑动后页面空白问题

近期踩了个坑&#xff0c;Vue3搭建的项目能够正常跑动&#xff0c;但是页面却是空白的&#xff0c;控制台也不报错&#xff0c;只留下一行警告&#xff1a; 发现是 router 入口文件&#xff08;一般是在 router 文件夹下的 index 里面&#xff09;的写法和 vite 版本不匹配的问…

AI算力池化技术在银行业的最佳实践荣获“科学普及达人奖”

纵观半个多世纪以来的金融行业发展历史&#xff0c;每一次技术升级与商业模式变革依赖科技赋能与理念创新的有力支撑&#xff0c;以人工智能为代表的新技术给金融机构了带来巨大效益。 近日&#xff0c;由中国人民银行科技司指导、北京金融科技产业联盟支持、《金融电子化》杂…

AlmaLinux 9 上配置静态 IP 地址

在 Rocky Linux 9 中&#xff0c;密钥文件的新默认存储位置在 /etc/NetworkManager/system-connections 中 cd /etc/NetworkManager/system-connections默认dhcp配置 ~ …

数集相等定义推翻2300年直线公理

黄小宁 2300年前的古人认为凡懂什么是直线的人都知过两异点只能画一条直线从而有初中的2300年直线公理&#xff0c;继而有平行公理和平面公理等。然而数集相等概念凸显直线公理使数学一直将无穷多各异直线误为同一线。 变量x所取各数也均由x代表。设集A&#xff5b;x&#xf…

CENet及多模态情感计算实战(论文复现)

CENet及多模态情感计算实战&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 CENet及多模态情感计算实战&#xff08;论文复现&#xff09;概述研究背景主要贡献论文思路主要内容和网络架构数据集介绍性能对比复现过程&#xff08;重要&am…

数据集成在搭建“智慧校园”中的使用

智慧校园是一种新型校园数字化建设方式&#xff0c;目前被全国高校使用。 智慧校园利用现代信息技术&#xff0c;如物联网、云计算、大数据等&#xff0c;搭建集成硬件设施和数据平台&#xff0c;实现校园管理高度信息化&#xff0c;提高校园管理的效率。 如何搭建“智慧校园…

SPI驱动学习五(如何编写SPI设备驱动程序)

目录 一、SPI驱动程序框架二、怎么编写SPI设备驱动程序1. 编写设备树2. 注册spi_driver3. 怎么发起SPI传输3.1 接口函数3.2 函数解析 三、示例1&#xff1a;编写SPI_DAC模块驱动程序1. 要做什么事情2. 硬件2.1 原理图2.2 连接 3. 编写设备树4. 编写驱动程序5. 编写app层操作程序…

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息&#xff0c;即可快速实现设备配网&#xff0c;是一种兼顾高效性、可靠性和安全性的配网方式。2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递&#xff0c;利用特有的NAN协议实现。利用手机和智能设备…

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码&#xff1a; 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口&#xff0c;https的端口号为443 url为统一资源定位符。CSDN…

Java+Swing图书管理系统

JavaSwing图书管理系统 一、系统介绍二、功能展示1.管理员登陆2.图书查询3.图书入库4.借书5.还书6.图书证管理 三、系统实现1.BookManageMainFrame.java 四、其它1.其他系统实现 一、系统介绍 该系统实现了用户端实现书籍查询&#xff0c;借书&#xff0c;还书功能。用户能够查…

QLib学习

开源地址&#xff1a;GitHub - microsoft/qlib: Qlib is an AI-oriented quantitative investment platform that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementi…

为何在106短信群发前需完成实名认证?

为了严格遵循国家法律法规及电信运营商的规范要求&#xff0c;确保您及贵公司的合法权益得到充分保障&#xff0c;使用云通信服务进行106短信群发前&#xff0c;实名认证成为必要步骤。 根据《中华人民共和国网络安全法》第二十四条的明确规定&#xff1a; 法律强制性要求&…

vulhub think PHP 2-rce远程命令执行漏洞

1.开启环境 2。访问对应网站端口 3.这里我们直接构造payload&#xff0c;访问phpinfo() http://192.168.159.149:8080/?s/Index/index/L/${phpinfo()} 4.可以访问到我们的phpinfo&#xff0c; 所以写入一句话木马&#xff0c;也可使用蚁剑进行连接&#xff0c;获得其shell进…

GenAI 用于客户支持 — 第 4 部分:调整 RAG 搜索的相关性

作者&#xff1a;来自 Elastic Antonio Schnmann 欢迎阅读我们关于将生成式 AI 集成到 Elastic 客户支持的博客系列的第 4 部分。本期深入探讨了检索增强生成 (RAG) 在增强我们 AI 驱动的技术支持助理方面的作用。在这里&#xff0c;我们解决了改进搜索效果的挑战、解决方案和结…

【C++】windwos下vscode多文件项目创建、编译、运行

目录 &#x1f315;vscode多文件项目创建方法&#x1f319;具体案例⭐命令行创建项目名&#xff0c;并在vscode中打开项目⭐创建include目录和头文件⭐创建src目录和cpp文件⭐根目录下创建main.cpp &#x1f315;运行项目失败&#xff08;找不到include目录下的头文件和src目录…