题目:家庭财务管理系统
前言:
家庭财务管理收支管理是一个家庭日常生活中不可缺少一部分,也是财务管理的重要组成部分。
题目要求:
开发一个家庭财务管理系统,实现家庭财务信息的自动化。
系统主要功能:
1.登陆管理 :可以选一名家庭成员做管理员,普通用户只能查看自己的收支信息。
2. 家庭成员管理:成员的信息:姓名、性别、出身日期、年龄,身高,体重。
3. 收支项目管理可以设置收支项目,修改或者删除。收支项目要求分为两层,比如“车辆维护-保养费”;任意一层次都可作为收支项目记账,用户在不清楚支出是否属于“保养费”的时候,可以选择大类“车辆维护”作为支出项
5.家庭成员收支输出 显示每个成员每月的收支情况(时间、收支种类、金额、经手人)。
6.退出管理
下面是系统功能示意图:
系统的设计思路如下:
功能实现一:登录窗口实现
ui界面如下:
1.管理员登录
- 管理员登录功能实现:在登录窗口类loginDlg定义私有成员:管理员账号与管理员密码,通过
#include<QSettings> //Qt提供用于写入注册表的类
读写注册表。
- 通过lineEdit行编辑输入用户名密码,在代码段中通过管理员登陆的Radio Button是否选中进行判断是否进行管理员登录。
2.管理员密码修改
- 通过点击左下角的管理员密码修改按钮进行密码修改(进入密码修改对话框),对话框界面如下:
密码修改对话框具体功能实现在此先不做具体介绍,
注意:此处密码修改需要用到加密算法,这里使用QT提供用于密码加密的类:
#include<QCryptographicHash> //Qt提供用于加密的类
3.普通用户登录:读取数据库
- 基于QSqlite轻量级数据库,未选中管理员登录Radio Button时,默认为普通用户登录。
以下为具体代码:
logindlg.h
#ifndef LOGINDLG_H
#define LOGINDLG_H
#include <QDialog>
#include<QSettings>
#include<QByteArray>
#include<QCryptographicHash> //Qt提供用于加密的类
#include<QMessageBox>
#include <QTextCodec> //unicode编码与其他编码转换
#include <QSqlDatabase> //提供通过连接访问数据库的接口
#include <QSqlQuery> //sql查询中创建、导航和检索数据所涉及的功能
#include <QTime>
#include <QSqlError>
#include <QDebug>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QLabel>
#include <QDataWidgetMapper>
#include <QTemporaryFile>
#include <QFile>
#include <QByteArray>
#define SUB -1
#define MAIN 1
namespace Ui {
class loginDlg;
}
class loginDlg : public QDialog
{
Q_OBJECT
public:
explicit loginDlg(QWidget *parent = nullptr);
~loginDlg();
void setName(QString name) {Mng_Name = name;}
void setPswd(QString pswd) {Mng_Pswd = pswd;}
bool createConnection(); //创建数据库链接
bool queryAll(QString name, QString pswd); //查找数据库
void SetTabOrder(); //设置tab切换顺序
int SubOrMain; //主,从窗口切换标志
QString NormalUser; //普通用户账号
private:
Ui::loginDlg *ui;
void readSettings(); //读取设置,注册表
void writeSettings(); //写入设置,注册表
int Mng_tryCount = 0; //试错次数
QString encrypt(const QString& str); //字符串加密
QString Mng_Name = "user"; //初始化用户名
QString Mng_Pswd = "123456"; //初始化密码
QSqlDatabase DB;
private slots:
void on_LoginPushButton_clicked();
void on_SignOutPushButton_clicked();
void ChangePwd(); //修改密码
void on_radioButton_clicked();
};
#endif // LOGINDLG_H
logindlg.cpp
#include "logindlg.h"
#include "ui_logindlg.h"
loginDlg::loginDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::loginDlg)
{
ui->setupUi(this);
this->setWindowTitle("登陆窗口");
this->setAttribute(Qt::WA_DeleteOnClose);
// Mng_Pswd = encrypt("123456");
// writeSettings();
SetTabOrder();
readSettings(); //初始化注册管理员用户名和密码
createConnection();
connect(ui->ChangePswd_PB, SIGNAL(clicked()), this, SLOT(ChangePwd()));
}
loginDlg::~loginDlg()
{
delete ui;
}
bool loginDlg::createConnection()
{
DB = QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
DB.setDatabaseName("../familyDb.db");
if (!DB.open()) //打开数据库
{
QMessageBox::warning(this, "错误", "打开数据库失败",
QMessageBox::Ok,QMessageBox::NoButton);
return false;
}
return true;
}
bool loginDlg::queryAll(QString name, QString pswd)
{
DB = QSqlDatabase::database(); //使用默认连接
QSqlQuery query(DB);
query.exec("select * from familyBase");
while(query.next())
{
if(query.value(6).toString()==name&&query.value(7).toString()==pswd)
return true;
}
return false;
}
void loginDlg::SetTabOrder()
{
setTabOrder(ui->IDLineEdit, ui->PassWordLineEdit);
setTabOrder(ui->PassWordLineEdit, ui->LoginPushButton);
setTabOrder(ui->LoginPushButton, ui->SignOutPushButton);
setTabOrder(ui->SignOutPushButton, ui->radioButton);
setTabOrder(ui->radioButton, ui->ChangePswd_PB);
setTabOrder(ui->ChangePswd_PB, ui->radioButton);
}
void loginDlg::readSettings()
{//读取存储的用户名和密码, 密码是经过加密的
QString organization = "TJJ-Qt"; //用于注册表
QString appName = "FIO_System"; //app名字
QSettings settings(organization, appName);
Mng_Name = settings.value("Username","user").toString();
QString defaultPSWD = encrypt("123456"); //缺省密码“123456”加密后的数据
Mng_Pswd = settings.value("PSWD", defaultPSWD).toString(); //读取PSWD
}
void loginDlg::writeSettings()
{//保存用户名,密码等设置
QSettings settings("TJJ-Qt", "FIO_System"); //注册表键组
settings.setValue("Username",Mng_Name); //将管理员账号存至设置
settings.setValue("PSWD",Mng_Pswd); //将管理员密码存至设置
//指向的注册表目录是HKEY_CURRENT_USER/Software/TJJ-Qt/家庭收支管理系统
}
QString loginDlg::encrypt(const QString &str)
{ //字符串MD5算法加密
QByteArray btArray;
btArray.append(str);//加入原始字符串
QCryptographicHash hash(QCryptographicHash::Md5); //Md5加密算法
hash.addData(btArray); //添加数据到加密哈希值
QByteArray resultArray =hash.result(); //返回最终的哈希值
QString md5 =resultArray.toHex();//转换为16进制字符串
return md5;
}
void loginDlg::on_LoginPushButton_clicked()
{
QString user = ui->IDLineEdit->text().trimmed(); //输入用户名
QString pswd = ui->PassWordLineEdit->text().trimmed(); //输入密码
QString encrptPSWD = encrypt(pswd); //对输入密码进行加密
if(ui->radioButton->isChecked())
{
if ((user == Mng_Name)&&(encrptPSWD == Mng_Pswd)) //如果用户名和密码正确
{
writeSettings(); //保存设置
SubOrMain = MAIN;
this->accept(); //对话框accept(),关闭对话框
}
else
{
Mng_tryCount++; //错误次数
if (Mng_tryCount>3)
{
QMessageBox::critical(this, "提示", "已达最大试错次数,程序退出");
exit(1);
}
else
{
QMessageBox::warning(this, "错误提示", "用户名或密码错误");
return;
}
}
}
else
{
if(queryAll(user,pswd))
{