系统简介
在之前写的博客里面提到了上一个项目简易聊天室的问题,在这个银行管理系统上面得到了解决,通过服务器的链表将用户输入的账号密码储存起来,然后在服务器不退出的情况下,实现用户的查询、存钱、取钱、转账、改密码、销户等功能,并将其交易记录写入了Mysql的数据库中。服务器即使退出,丢失账号密码但是交易记录还在。其实账号密码也是应当存储在数据库中,这样账户密码也不会丢失,但是为了练习链表将其写在了链表中。
下面写的是安装MySQL的数据库的命令。
apt-get install mysql-server //需要自己指定密码
apt-get install mysql-client
apt-get install libmysqlclient-dev//支持C语言API
客户端
客户端我通过设置termios结构体中的c_lflag设置来关闭回显,保证密码安全,通过查找资料封装了一个函数来管理是否回显。
/*************************************************************************
> 文件路径: client.c
> 作者: Moliam
> 邮箱: 2515826079@qq.com
> 文件创建时间: 2019年03月20日 星期三 14时47分52秒
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <termios.h>
#include <errno.h>//由于我修改了vim的配置,所以会出现没有必要的头文件
#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)//回显相关宏定义
#define PORT 9709
int sockfd;
int text_fd;
//char *IP = "192.168.1.190";
char *IP = "192.168.15.2";//服务器IP地址
typedef struct sockaddr AD;
char acc[30]={0};//存放账户
char cmd_buf[30]={0};//存放命令
char dat_buf[100]={0};//存放数据
int set_disp_mode(int fd,int option);//是否回显函数
int getpasswd(char* passwd, int size);//获取终端输入函数
void err(const char *buf,int line);//出错函数
void Init(void);//初始化客户端
void Service(void);//匹配帐号密码
void menu(void);//菜单
void enquiry(void);//查询余额
void save(void);//存钱
void withdraw(void);//取钱
void modpw(void);//改密
void trans(void);//转账
void logout(void);//注销
void __exit(void);
int main(void)
{
Init();
Service();
menu();//
return 0;
}
void menu(void)
{
//0查询 1存款 2取款 3转账 4改密 5销户 6退出
int opt=0;
while(1)
{
printf("*********************************\n");
printf(" 按0查询 \n");
printf(" 按1存款 \n");
printf(" 按2取款 \n");
printf(" 按3转账 \n");
printf(" 按4改密 \n");
printf(" 按5销户 \n");
printf(" 按6退出 \n");
printf("*********************************\n");
repeat: printf("请输入你需要进行的操作:\n");
scanf("%d",&opt);
if (opt > 6 && opt < 0)
{
printf("输入错误,请重新输入!\n");
goto repeat;
}
switch(opt)
{
case 0:enquiry();break;
case 1:save();break;
case 2:withdraw();break;
case 3:trans();break;
case 4:modpw();break;
case 5:logout();break;
case 6:__exit();return ;
}
}
}
void enquiry(void)
{
sprintf(cmd_buf,"0");
text_fd = send(sockfd,cmd_buf,strlen(cmd_buf),0);//发送命令
if(text_fd == -1)
err("send",__LINE__);
text_fd = recv(sockfd,dat_buf,sizeof(dat_buf),0);//接受余额
if(text_fd == -1)
err("recv",__LINE__);
printf("当前余额为%s\n",dat_buf);
memset(dat_buf,0,sizeof(dat_buf));
}
void save(void)
{
double money = 0;
sprintf(cmd_buf,"1");
text_fd = send(sockfd,cmd_buf,strlen(cmd_buf),0);//发送命令
if(text_fd == -1)
err("send",__LINE__);
printf("请输入你要存的数目:\n");
scanf("%lf",&money);
sprintf(dat_buf,"%.2f",money);
text_fd = send(sockfd,dat_buf,strlen(dat_buf),0);//发送数目
if(text_fd == -1)
err("send",__LINE__);
memset(dat_buf,0,sizeof(dat_buf));
text_fd = recv(sockfd,dat_buf,sizeof(dat_buf),0);//接收是否成功
if(text_fd == -1)
err("recv",__LINE__);
if(strcmp(dat_buf,"correct") != 0)
{
printf("aha,failure!\n");
}
memset(dat_buf,0,sizeof(dat_buf));
enquiry();
}
void withdraw(void)
{
float money = 0;
sprintf(cmd_buf,"2");
text_fd = send(sockfd,cmd_buf,strlen(cmd_buf),0);//发送命令
if(text_fd == -1)
err("send",__LINE__);
printf("请输入你要提现的数目:\n");
scanf("%f",&money);
sprintf(dat_buf,"%.2f",mon