功能简介:
这是一个基于 Qt/C++ 实现的简单 MySQL 用户权限管理系统,能够通过控制台交互输入进行数据库连接、用户创建、权限分配以及用户查询的自动化操作。用户可以通过该软件登录到 MySQL 服务器,选择数据库,并根据需求创建新用户,设置访问权限,最后还可以查询并显示数据库中的所有用户信息。
功能步骤和说明:
-
输入 MySQL 管理员密码:
- 软件启动后首先会提示用户输入 MySQL 管理员(root)密码。程序将使用此密码尝试连接到 MySQL 服务器。
- 用户需要在控制台输入密码,以确保能够连接到数据库服务器。
-
连接 MySQL 数据库:
- 程序会使用用户输入的密码,尝试连接到本地的 MySQL 服务器 (
localhost
)。 - 如果连接成功,程序会提示 "成功连接到MySQL数据库!"。如果连接失败,则会给出相应的错误提示,并终止程序。
- 程序会使用用户输入的密码,尝试连接到本地的 MySQL 服务器 (
-
显示数据库列表:
- 连接成功后,程序会从 MySQL 服务器获取当前服务器上所有可用的数据库列表。
- 这些数据库会以序号的方式展示给用户,并提示用户选择要操作的数据库。
-
选择数据库:
- 用户可以通过输入对应的序号选择需要操作的数据库。
- 选择完成后,程序会再次确认用户选择的数据库是否正确。如果确认无误,程序将继续进行下一步操作。
-
输入新用户信息:
- 程序将提示用户输入 新用户的用户名。
- 输入完成后,程序会继续提示用户选择该用户的登录方式:
- 本机登录:用户只能从本机 (
localhost
) 进行登录。 - 同一网段登录:用户可以从任意网段 (
%
) 进行登录。
- 本机登录:用户只能从本机 (
- 用户选择登录方式后,程序会提示输入 新用户的密码。
-
确认信息:
- 在创建用户之前,程序会将所有信息汇总,显示给用户,包括:
- 数据库名
- 用户名
- 登录方式(本机登录或同网段登录)
- 用户密码
- 用户需要确认信息是否正确,确认无误后,程序才会创建用户。如果用户取消操作,程序将退出。
- 在创建用户之前,程序会将所有信息汇总,显示给用户,包括:
-
创建用户并分配权限:
- 用户确认后,程序将自动在选定的数据库中创建新用户,并为其分配所有权限(
ALL PRIVILEGES
)。 - 程序将输出操作结果,提示用户是否成功创建用户并分配权限。
- 用户确认后,程序将自动在选定的数据库中创建新用户,并为其分配所有权限(
-
查询并显示数据库中的用户信息:
- 在成功创建用户后,程序会自动查询该数据库中所有拥有访问权限的用户信息。
- 程序将输出这些用户的详细信息,包括:
- 用户名
- 主机地址(表示用户的登录方式,例如
localhost
或%
)
-
结束操作:
- 完成所有操作后,程序会输出操作结果并感谢用户的使用。
源码分享
#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;
}