精华内容
下载资源
问答
  • 银行ATM存取款系统主要功能分别有开户,开户又分为:填写开户申请单自动开通账户 存取款,查询余额,转账。这个系统根据银行要求,实现各项银行日常存款,取款和转账业务.
  • 第六章 银行ATM存取款系统.pptx
  • 银行ATM存取款系统

    2012-12-17 14:31:41
    网上找的觉得挺有用的银行ATM存取款系统 print '开始转账,请稍后......' print '交易正在进行,请稍后......' update Cardinfo set balance=balance-@money where customerID=(select customerID from UserInfo...
  • 酒店管理信息系统银行ATM存取款系统的数据库设计
  • 北大青鸟S2优化MySchool数据库设计项目案例ATM系统
  • 银行业务处理 每个用户可以开设多个银行卡账户 每个银行卡账户可以有多笔交易 设计符合第三范式的数据库结构 根据银行业务绘制E-R图 绘制数据库模型图 使用三大范式规范数据库结构 实现“ATM取款系统”的相关业务
  • 银行ATM存取款系统 银行ATM存取款系统业务描述如下: 银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及...

    C语言模块化编程、数据结构,模拟实现ATM存取款系统

    本项目使用模块化编程、使用数据结构:线性表,模拟实现ATM存取款系统。

    银行ATM存取款系统:

    银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业务有如下注意点:

    (1) 登陆系统
    用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。

    (2) 开户业务
    要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。

    (3) 存款业务
    客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。

    (4) 取款业务
    客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。

    (5) 查询业务
    客户登陆系统后,可以选择查询业务,查询账户余额。

    (6) 转账业务
    客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系统已经存在的银行账户。

    (7) 修改密码
    客户登陆系统后,可以选择修改密码业务,进行密码修改。

    源代码:

    /*
     * user.h
     * 详情:用户模块头文件
     */
    #ifndef __USER_H__
    #define __USER_H__
    
    struct user;
    
    /*
     * 功能:	创建指向所有用户的指针,并将文件中的所有用户读出到指针所指向的堆内存中 
     * 
     * 参数:	无 
     * 
     * 返回值: 指向所有用户的指针
     */ 
    struct user *user_init();
    
    /*
     * 功能:	检查用户账号是否存在 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要检查的用户账号 
     * 
     * 返回值: 0:该账号不存在
     *			1:该账号存在 
     */ 
    int user_check_id(struct user *user, char *id_card); 
    
    /*
     * 功能:	检查用户账号和密码是否存在(登录用) 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要检查的用户账号 
     *			password:要检查的账户密码 
     * 
     * 返回值: 0:该账号和密码不存在
     *			1:该账号和密码存在 
     */ 
    int user_check_user(struct user *user, char *id_card, int password); 
    
    /*
     * 功能:	向用户存储结构中添加一个用户(注册用),同时文件保存 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要添加的用户账号 
     *			password:要添加的账户密码 
     * 
     * 返回值: 无
     */ 
    void user_put(struct user *user, char *id_card, int password);
    
    /*
     * 功能:	修改指定账户的密码,同时文件保存 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要修改的用户账号 
     *			password:要修改的账户的密码 
     *			new_password:修改后的密码 
     * 
     * 返回值: 0:该账号和密码不存在,修改密码失败 
     *			1:该账号和密码存在,修改密码成功 
     */ 
    int change_password(struct user *user, char *id_card, int password, int new_password);
    
    /*
     * 功能:	向指定用户转账,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要转入的用户账号 
     *			money:要转入的金额 
     * 
     * 返回值: 0:该账号不存在,转账失败 
     *			1:该账号存在,转账成功 
     */ 
    int transfer_get_money(struct user *user, char *id_card, int money);
    
    /*
     * 功能:	从指定账户中取出金额,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要取钱的用户账号 
     *			password:要取钱的账户的密码 
     *			money:要取出的金额 
     * 
     * 返回值: 0:该账号不存在,取出失败 
     *			1:该账号存在,取出成功 
     */ 
    int out_money(struct user *user, char *id_card, int password, int money);
    
    /*
     * 功能:	查询指定账户的余额 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要查余的用户账号 
     *			password:要查余的账户的密码 
     * 
     * 返回值: != -1:该账户的余额 
     * 			-1:该账号不存在,查询失败 
     */ 
    int get_money(struct user *user, char *id_card, int password);
    
    /*
     * 功能:	向指定账户中存入金额,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要存钱的用户账号 
     *			password:要存钱的账户的密码 
     *			money:要存入的金额 
     * 
     * 返回值: 0:该账号不存在,存入失败 
     *			1:该账号存在,存入成功 
     */ 
    int put_money(struct user *user, char *id_card, int password, int money);
    
    /*
     * 功能:释放堆内存中的所有用户,并释放指针 
     * 
     * 参数:user:指向所有用户的指针
     * 
     * 返回值: 无 
     */ 
    void user_free(struct user *user);
    
    #endif  /*__USER_H__*/
    
    
    /*
     * user.c
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "user.h"
    
    #define USER_INIT_SIZE 1 	/*存储结构初始值*/
    #define USER_INCR_SIZE 1	/*存储结构每次扩充值*/
    
    /*用户信息*/ 
    struct element {
    	char id_card[18];
    	int password;
    	int money;
    };
    
    /*结构头部*/ 
    struct user {
    	struct element *element;
    	int count;
    	int size;
    };
    
    /*
     * 功能:   将所有用户信息存入文件中(内部函数) 
     * 
     * 参数:   user:指向所有用户的指针 
     * 
     * 返回值: 无 
     */ 
    static void save_user(struct user *user) 
    {
    	FILE * fp;
    	struct element e;
    	
    	fp=fopen("myfile.dat","w");
    	fclose(fp);
    	
        if((fp=fopen("myfile.dat","ab+"))==NULL) return;
        int i;
        for(i=0; i<user->count; i++) {
        	e = user->element[i];
    		fwrite(&e,sizeof(struct element),1,fp);
    	}
        	
        fclose(fp);
        return;
    }
    
    /*
     * 功能:	向用户存储结构中添加一个用户(内部函数) 
     * 
     * 参数:	user:指向所有用户的指针 
     *			e:用户信息结构体 
     * 
     * 返回值: 无 
     */ 
    static void user_add(struct user *user, struct element e)
    {
    	if (user->count == user->size) {
            user->element = (struct element *)realloc(user->element, (user->size + USER_INCR_SIZE) * sizeof(struct element));
             
            if (user->element == NULL) {
                perror("user_add_element realloc error!");
                exit(1);
            }
             
            user->size += USER_INCR_SIZE;
        }
         
        user->element[user->count] = e;
        user->count++;
         
    	return;
    }
    
    /*
     * 功能:	创建指向所有用户的指针,并将文件中的所有用户读出到指针所指向的堆内存中 
     * 
     * 参数:	无 
     * 
     * 返回值: 指向所有用户的指针
     */ 
    struct user *user_init()
    {
    	FILE *fp;
    	struct element e;
    	struct user *user = NULL;
    
    	user = (struct user *)malloc(sizeof(struct user));
    	if (user == NULL) return NULL;
    	
    	user->element = NULL;
    	user->count = 0;
    	user->size = 0;
    	
    	user->element = (struct element *)malloc(sizeof(struct element) * USER_INIT_SIZE);
       	if (user->element == NULL) {
           	free(user);
           	return NULL;
       	}
       	user->size = USER_INIT_SIZE;
       	memset(user->element, 0, sizeof(struct element) * USER_INIT_SIZE);
       	
    	
    	
    	if((fp=(fopen("myfile.dat","ab+")))==NULL) return;
    	if(fgetc(fp) == EOF) {
    		fclose(fp);
    		return user;
    	}
    	rewind(fp);
    	while (1) {
    		fread(&e,sizeof(struct element),1,fp);
    		if(feof(fp)) break;
    		user_add(user, e);
    	}
    	fclose(fp);
       	return user;
    }
    
    
    /*
     * 功能:	检查用户账号是否存在 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要检查的用户账号 
     * 
     * 返回值: 0:该账号不存在
     *			1:该账号存在 
     */ 
    int user_check_id(struct user *user, char id_card[18])
    {
    	int i;
    	struct element e;
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			return 1;
    		}
    	}
    	
    	return 0;
    }
    
    /*
     * 功能:	检查用户账号和密码是否存在(登录用) 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要检查的用户账号 
     *			password:要检查的账户密码 
     * 
     * 返回值: 0:该账号和密码不存在
     *			1:该账号和密码存在 
     */ 
    int user_check_user(struct user *user, char *id_card, int password)
    {
    	int i;
    	struct element e;
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			if(e.password == password)
    				return 1;
    		}
    	}
    	
    	return 0;
    }
    
    /*
     * 功能:	向用户存储结构中添加一个用户(注册用),同时文件保存 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card[18]:要添加的用户账号 
     *			password:要添加的账户密码 
     * 
     * 返回值: 无
     */ 
    void user_put(struct user *user, char id_card[18], int password)
    {
    	struct element e;
    	strcpy(e.id_card, id_card);
    	e.password = password;
    	e.money = 0;
    	
    	user_add(user, e);
    	save_user(user);
    	return;
    }
    
    /*
     * 功能:	修改指定账户的密码,同时文件保存 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要修改的用户账号 
     *			password:要修改的账户的密码 
     *			new_password:修改后的密码 
     * 
     * 返回值: 0:该账号和密码不存在,修改密码失败 
     *			1:该账号和密码存在,修改密码成功 
     */ 
    int change_password(struct user *user, char *id_card, int password, int new_password)
    {
    	int i;
    	struct element e;
    	
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0 && e.password == password) {
    			user->element[i].password = new_password;
    			save_user(user);
    			return 1;
    		}
    	}
    	return 0;
    }
    
    /*
     * 功能:	向指定用户转账,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要转入的用户账号 
     *			money:要转入的金额 
     * 
     * 返回值: 0:该账号不存在,转账失败 
     *			1:该账号存在,转账成功 
     */ 
    int transfer_get_money(struct user *user, char *id_card, int money)
    {
    	int i;
    	struct element e;
    	
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			user->element[i].money += money;
    			save_user(user);
    			return 1;
    		}
    	}
    	return 0;
    }
    
    /*
     * 功能:	从指定账户中取出金额,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要取钱的用户账号 
     *			password:要取钱的账户的密码 
     *			money:要取出的金额 
     * 
     * 返回值: 0:该账号不存在,取出失败 
     *			1:该账号存在,取出成功 
     */ 
    int out_money(struct user *user, char *id_card, int password, int money)
    {
    	int i;
    	struct element e;
    	
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			if (e.password == password)
    				if(e.money >= money) {
    					user->element[i].money -= money;
    					save_user(user);
    					return 1;
    				}
    				
    		}
    	}
    	return 0;
    }
    
    /*
     * 功能:	查询指定账户的余额 
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要查余的用户账号 
     *			password:要查余的账户的密码 
     * 
     * 返回值: != -1:该账户的余额 
     * 			-1:该账号不存在,查询失败 
     */ 
    int get_money(struct user *user, char *id_card, int password)
    {
    	int i;
    	struct element e;
    	
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			if(e.password == password)
    				return e.money;
    			else
    				return -1;
    		}
    	}
    }
    
    /*
     * 功能:	向指定账户中存入金额,同时文件保存  
     * 
     * 参数:	user:指向所有用户的指针
     *			id_card:要存钱的用户账号 
     *			password:要存钱的账户的密码 
     *			money:要存入的金额 
     * 
     * 返回值: 0:该账号不存在,存入失败 
     *			1:该账号存在,存入成功 
     */ 
    int put_money(struct user *user, char *id_card, int password, int money)
    {
    	int i;
    	struct element e;
    	
    	for(i=0; i<user->count; i++) {
    		e = user->element[i];
    		if(strcmp(e.id_card, id_card) == 0) {
    			if(e.password == password) {
    				user->element[i].money += money;
    				save_user(user);
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    /*
     * 功能:释放堆内存中的所有用户,并释放指针 
     * 
     * 参数:user:指向所有用户的指针
     * 
     * 返回值: 无 
     */ 
    void user_free(struct user *user)
    {
    	free(user->element);
    	free(user);
    	
    	return;
    }
    
    
    /*
     * main.c
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "user.h" 
    
    struct user *user = NULL;     /*所有用户*/ 
    char load_id_card[18];        /*当前登录的账户*/
    int load_password;            /*当前登录账户的密码*/
    
    /*身份证号输入检查功能函数*/
    void input_id_card(char *idCard)
    {
    	while (1) {
    		printf("请输入您的身份证号码:");
    		scanf("%s",idCard);
    		
    		int i = 0;
    		while(idCard[i++]!='\0'); 
    		
    		if(i == 19) {
    			printf("%s\n", idCard);
    			break;
    		}
    		else {
    			printf("您输入的身份证号码有误,请您重新输入!\n");
    		}
    	}
    	return;
    }
    
    /*主界面*/ 
    int main_ui()
    {
    	int in;
    	
    	while(1) {
    		system("cls");
    		printf("----------------------------\n");
    		printf("  1.登录   2.注册   3.退出  \n");
    		printf("----------------------------\n");
    		printf("请输入对应操作前的数字:");
    		
    		scanf("%d",&in);
    	
    		if(in!=1 && in!=2 && in!=3) {
    			printf("您的操作有误,请重新输入!\n");
    			system("PAUSE");
    		}
    		else {
    			return in;
    		}
    	}
    }
    
    /*登录成功后显示界面*/
    int sign_in_ui() {
    	int in;
    	while(1) {
    		system("cls");
    		printf("---------------------------------------------\n");
    		printf("  1.查询 2.存款 3.取款 4.转帐 5.改密 6.退出  \n");
    		printf("---------------------------------------------\n");
    		printf("请输入对应操作前的数字:");
    		
    		scanf("%d", &in); 
    		if(in!=1 && in!=2 && in!=3 && in!=4 && in!=5 && in!=6) {
    			printf("您的操作有误,请重新输入!\n");
    			system("PAUSE");
    		}
    		else
    			return in;
    	} 
    }
    
    /*查余*/
    void inquire()
    {
    	printf("您的余额为:%d\n", get_money(user, load_id_card, load_password));
    	system("PAUSE"); 
    }
    
    /*存款*/ 
    void deposit()
    {
    	int money;
    	printf("请输入存入金额:");
    	scanf("%d", &money);
    	if(put_money(user, load_id_card, load_password, money)) 
    		printf("存入成功!\n");
    	else
    		printf("存入失败!\n");
    	
    	system("PAUSE");
    	return; 
    }
    
    /*取款 */
    void withdrawal()
    {
    	int money;
    	printf("请输入取出金额:");
    	scanf("%d", &money);
    	if(out_money(user, load_id_card, load_password, money))
    		printf("取出成功!\n");
    	else
    		printf("余额不足!\n");
    		
    	system("PAUSE");
    	return; 
    } 
    
    /*转账*/
    void transfer_accounts()
    {
    	int money;
    	char id[18];
    	printf("请输入转入账户的身份证:");
    	scanf("%s", id);
    	
    	int i = 0;
    	while(id[i]!='\0') {
    		i++;
    	}
    	if(i == 18) {
    		if(user_check_id(user,id)) {
    			printf("请输入转账金额:");
    			scanf("%d",&money);
    			if(out_money(user, load_id_card, load_password, money)) {
    				if (transfer_get_money(user, id, money))
    					printf("转入成功!\n");
    				else
    					printf("转入失败!\n");
    			}
    			else
    				printf("余额不足!\n");
    		}
    		else
    			printf("您输入的转账账户不存在!\n");
    	}
    	else 
    		printf("您输入的转账账户位数有误!\n");
    	
    	system("PAUSE");
    	return;
    }
    
    /*改密*/ 
    void ch_password()
    {
    	int password;
    	printf("请输入新密码:");
    	scanf("%d",&password);
    	if(change_password(user, load_id_card, load_password, password)) {
    		printf("修改成功!\n");
    		load_password = password;
    	}
    	else 
    		printf("修改失败!\n");
    		
    	system("PAUSE");
    	return; 
    }
    
    /*登录成功后的操作*/ 
    void sign_successful()
    {
    	while(1) {
    		switch(sign_in_ui()) {
    			case 1:	inquire(); break;
    			case 2:	deposit(); break;
    			case 3:	withdrawal(); break; 
    			case 4:	transfer_accounts(); break;
    			case 5:	ch_password(); break;
    			case 6:	return;
    			default : break;		
    		}
    	}
    	
    }
    
    /*退出*/
    void my_exit()
    {
    	exit(0);
    	return;
    } 
    
    /*登录*/
    void sign_in()
    {
    	char id[18];
    	int password; 
    
    	input_id_card(id);
    	if(user_check_id(user,id)) {
    		printf("请输入密码:");
    		scanf("%d",&password);
    		if(user_check_user(user, id, password)) {
    			printf("登录成功\n");
    			system("PAUSE");
    			strcpy(load_id_card,id);
    			load_password = password;
    			sign_successful();
    		}else {
    			printf("密码错误!\n");
    			system("PAUSE");
    		}
    	}
    	else {
    		printf("您输入的账户不存在!\n");
    		system("PAUSE");
    	} 
    		
    	return;
    }
    
    /*注册*/ 
    void sign_up()
    {   
    	char id[18];
    	int password;
    	
    	input_id_card(id);
    	
    	if(user_check_id(user,id))
    		printf("您输入的账户已存在!\n");
    	else {
    		printf("请输入密码:");
    		scanf("%d",&password);
    		user_put(user, id, password);
    		printf("注册成功!\n");
    	} 
    	
    	system("PAUSE");
    	return; 
    }
    
    /*主函数*/
    int main(int argc, char *argv[]) {
    	while(1) {
    		user = user_init();
    		int state = main_ui();
    		switch(state) {
    			case 1: sign_in();break;
    			case 2: sign_up();break;
    			case 3: my_exit();break;
    			default:break;
    		}
    		user_free(user);
    	}
    	
    	system("PAUSE");
    	return 0;
    }
    
    
    展开全文
  • CREATE TABLE if not exists cardInfo( cardID VARCHAR(19) PRIMARY KEY NOT NULL COMMENT'银行卡卡号', curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'币种', savingID INT(2) NOT NULL COMMENT'存款类型'...

    首先,我们需要知道项目的需求有哪些?

    用例1:数据库设计

    绘制E-R图

    绘制数据库模型图

    数据库模型图我们可以创建好表和约束之后,点击对象

    就会出现你已经创建好的表,选中需要绘制模型图的表

    然后右下角有三个图案,数据库默认是第一个,我们可以选择第三个

    可以去看看这三个图案有什么不同,这样比我们一个一个去添加字段设置约束的效率要高很多,一举两得,希望能帮助到大家!

    用例2:创建数据库及登录用户并授权

    #创建bankDB数据库,如果存在先删除在创建
    DROP DATABASE IF EXISTS bankDB;
    CREATE DATABASE if not exists bankDB;
    
    #创建普通用户bankMaster并授权
    grant all on bankdb
    to bankMaster@127.0.0.1 identifed by '1234';
    

    登录用户的权限书本上有提到,可以去看看它的解析,这就不多做讲述了。

    用例3:创建表、约束

    #使用bankDB数据库
    use bankDB;
    
    
    #客户信息表
    DROP TABLE IF EXISTS userInfo;
    CREATE TABLE if not exists userInfo(
    	customerID INT(8) PRIMARY KEY AUTO_INCREMENT COMMENT'客户编号',
    	customerName VARCHAR(10) NOT NULL COMMENT'客户姓名',
    	PID CHAR(18) NOT NULL COMMENT '身份证号',
    	telephone CHAR(11) NOT NULL COMMENT '手机号码',
    	address VARCHAR(50) comment '地址'
    )ENGINE=INNODB COMMENT='客户表',
    CHARSET=utf8;
    
    
    #银行卡信息表
    DROP TABLE IF EXISTS cardInfo;
    CREATE TABLE if not exists cardInfo(
    	cardID VARCHAR(19) PRIMARY KEY NOT NULL COMMENT'银行卡卡号',            
    	curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'币种',
    	savingID INT(2) NOT NULL COMMENT'存款类型',
    	openDate TIMESTAMP NOT NULL COMMENT'开户日期',
    	openMoney DECIMAL NOT NULL COMMENT '开户金额',
    	balance DECIMAL NOT NULL COMMENT '账户余额', 
    	`password` VARCHAR(6) NOT NULL default '888888' COMMENT'密码',
    	IsReportLoss BIT NOT NULL default 0 COMMENT '是否挂失',
    	customerID INT(8) NOT NULL COMMENT'客户编号'
    )ENGINE=INNODB COMMENT='银行卡信息表',
    CHARSET=utf8;
    
    alter table cardinfo modify openMoney decimal(9,2);
    alter table cardinfo modify balance decimal(9,2);
    
    #创建外键
    alter table cardinfo
    add constraint foreign key(customerID) references userinfo(customerID);
    alter table cardinfo
    add constraint foreign key(savingID) references deposit(savingID);
    
    
    #交易信息表
    DROP TABLE IF EXISTS tradeInfo;
    CREATE TABLE if not exists tradeInfo(
    	transDate TIMESTAMP NOT NULL COMMENT'交易日期',
    	cardID char(19) NOT NULL NULL COMMENT'卡号',
    	transType char(10) NOT NULL COMMENT'交易类型',
    	transMoney DECIMAL NOT NULL COMMENT'交易金额',
    	remark TEXT COMMENT'交易备注'
    )ENGINE=INNODB COMMENT='交易信息表',
    CHARSET=utf8;
    
    #创建外键
    alter table tradeinfo
    add constraint foreign key(cardID) references cardinfo(cardID);
    
    
    #存款类型表
    DROP TABLE IF EXISTS deposit;
    CREATE TABLE if not exists deposit(
    	savingID INT(2) PRIMARY KEY COMMENT'存款类型',
    	savingName VARCHAR(20) NOT NULL COMMENT'存款类型名称',
    	curID VARCHAR(10) NOT NULL default 'RMB' COMMENT'存款币种'
    )ENGINE=INNODB COMMENT='存款类型表',
    CHARSET=utf8
    

    用例4:插入测试数据库

    #添加数据
    
    #银行客户表数据
    INSERT INTO userInfo(customerID,customerName,PID,telephone,address)
    VALUES(1,'丁六','567891321242345618','13645667783','北京西城区'),
    			(2,'王五','56789132124234567X','13642345112','河北石家庄市'),
    			(3,'张三','567891321242345789','13567893246','北京海定区'),
    			(4,'丁一','123451321242345618','13056434411','河南新乡'),
    			(5,'李四','678911321242345618','13318877954','山东济南市');
    
    
    #银行卡信息数据
    INSERT INTO cardInfo(cardID,savingID,openDate,openmoney,balance,`password`,IsReportLoss,customerID)
    VALUES('1010357612121004',1,NOW(),1,1001,'888888',0,1),
    			('1010357612121130',1,NOW(),1,1,'888888',0,2),
    			('1010357612125678',3,NOW(),1000,6100,'123456',0,3),
    			('1010357612128284',3,NOW(),1000,1001,'888888',0,4),
    			('1010357612121134',1,NOW(),1,1501,'123123',1,5);
    
    
    #交易信息表数据
    INSERT INTO tradeInfo(transDate,cardID,transType,transMoney,remark)
    VALUES(NOW(),'1010357612125678','支取',900,NOW()),
    			(NOW(),'1010357612121130','存入',300,NOW()),
    			(NOW(),'1010357612121004','存入',1000,NOW()),
    			(NOW(),'1010357612121130','存入',1900,NOW()),
    			(NOW(),'1010357612121134','存入',5000,NOW()),
    			(NOW(),'1010357612121134','存入',500,NOW()),
    			(NOW(),'1010357612121134','支取',2000,NOW()),
    			(NOW(),'1010357612125678','存入',2000,NOW()),
    			(NOW(),'1010357612121134','支取',2000,NOW()),
    			(NOW(),'1010357612125678','存入',2000,NOW()),
    			(NOW(),'1010357612125678','存入',2000,NOW());
    
    
    #存款类型表数据
    INSERT INTO deposit(savingID,savingName)
    VALUES(1,"定期一年"),(2,"定期二年"),(3,'活期');
    

    用例5:模拟常规业务

    #1.修改客户密码
    update cardinfo set `password`='123456' where cardID='1010357612125678';
    update cardinfo set `password`='123123' where cardID='1010357612121134';
    
    #2.办理银行卡挂失
    update cardinfo set IsReportLoss=1 where cardID='1010357612121134';
    select c.cardID 卡号,c.curID 货币,d.savingName 储蓄种类,c.openDate 开户日期,c.openMoney 开户金额,c.balance 余额,
    			 c.`password` 密码,c.IsReportLoss 是否挂失,u.customerName 客户姓名
    from cardinfo c
    inner join userinfo u
    on c.customerID=u.customerID
    inner join deposit d
    on c.savingID=d.savingID;
    
    #3.统计银行总存入金额和总总支取金额
    select transType 资金流向,sum(transMoney) 总金额 from tradeInfo
    where transType='支取' or transType='存入'
    group by transType;
    
    #4.查询本周开户信息
    select c.cardID 卡号,u.customerName 姓名,c.curID 货币,c.savingID 存款类型,c.openDate 开户日期,c.openMoney 开户金额,
    			 c.balance 开户余额,c.IsReportLoss 账户状态
    from cardinfo c
    inner join userinfo u
    on c.customerID=u.customerID
    where week(c.openDate)=week(NOW());
    
    #5.查询本月交易金额最高的卡号
    select distinct cardID
    from tradeinfo 
    where  transMoney=(select MAX(transMoney) from tradeinfo where transType='支出' or transType='存入' 
    									 and MONTH(transDate)=MONTH(NOW()));
    
    #6.查询挂失客户
    select u.customerName 客户姓名,u.telephone 联系电话,c.cardID 卡号,c.IsReportLoss 是否挂失
    from userinfo u
    inner join cardinfo c
    on u.customerID=c.customerID
    where c.IsReportLoss=b'1';
    
    
    #7.催款提醒业务
    select u.customerName 客户姓名,u.telephone 联系电话,c.balance 存款余额
    from userinfo u
    inner join cardinfo c
    on u.customerID=c.customerID
    where c.balance<200;

    用例6:创建、使用客户友好信息视图

    #创建用户视图
    DROP VIEW IF EXISTS view_userInfo;
    create view view_userInfo
    as
    select customerID 客户编号,customerName 客户姓名,PID 身份证号,telephone 手机号码,address 地址
    from userinfo u;
    
    #创建银行卡视图
    DROP VIEW IF EXISTS view_cardinfo;
    create view view_cardinfo
    as
    select cardID 卡号,customerName 客户名,c.curID 货币种类,savingName 存款类型,openDate 开户日期,balance 余额, 
    			`password` 密码,IsReportLoss 是否挂失
    from cardinfo c
    inner join userinfo u
    on c.customerID=u.customerID
    inner join deposit d
    on c.curID=d.curID;
    
    
    #创建交易信息视图
    DROP VIEW IF EXISTS view_transInfo;
    create view view_transInfo
    as
    SELECT transDate 交易日期,transType 交易类型,cardID 卡号, transMoney 交易金额, remark 备注
    FROM tradeinfo;

    用例7:使用事务完成转账

    #使用事务完成转账
    #从卡号为“1010357612121134”的账户中转出300元给卡号为“1010357612345678”的账户,即李四转账300元给张三。
    #先关闭自动提交状态
    set autocommit=0;
    
    #开启事务
    begin;
    update cardinfo set balance=balance-300 where cardID='1010357612121134';
    update cardinfo set balance=balance+300 where cardID='1010357612125678';
    
    #提交事务
    commit;
    
    #遇到问题回滚数据到原来的状态
    rollback;
    
    #恢复自动提交
    set autocommit=1;
    

    可以根据书本上的提示完成项目……

     

    展开全文
  • 银行ATM存取款操作 import java.util.Scanner; public class Atm { private static int password = 123456; private static double account = 1000; public Atm(int a, double b) { password = a; account = ...

    银行ATM存取款操作

    import java.util.Scanner;
    
    public class Atm {
        public static void main(String[] args) {
            System.out.println("欢迎使用ATM机");
            String Id = "张三";
            System.out.println("欢迎账户" + Id);
            System.out.println("请选择您的操作,查询余额请按1,存钱请按2,取钱请按3");
            Scanner scanner = new Scanner(System.in);
            Serve Serve = new Serve("123456", 1000);
            int k = scanner.nextInt();
            if (k == 1) {
                Serve.selectMoney();
            } else if (k == 2) {
                Serve.saveMoney();
            }else if(k==3) {
                Serve.withdrawMoney();
            }else {
                System.out.println("对不起,无此项操作");
            }
        }
    }
    class Serve {
        private  String password;
        private  double account;
    
        public Serve(String a, double b) {
            this.password = a;
            this.account = b;
        }
    
    
        //检查密码是否正确
         boolean check() {
            Scanner scanner = new Scanner(System.in);
            boolean p=true;
            int i = 0;
            for (i = 0; i < 3; i++) {
                System.out.println("请输入您的密码");
                String pw = scanner.next();
                if (pw.equals(password)) {
                    System.out.println("密码正确");
                    break;
                } else if(!(pw.equals(password))) {
                        System.out.println("密码输入错误,若输入错误达3次,账户冻结,请联系银行柜台");
                        p=false;
                }
            }
            return p;
        }
    
    
    
        //查账户余额
        void  selectMoney() {
            if (check()) {
                System.out.println("你还有余额" + account + "元");
            }else {
                System.out.println("密码错误,操作失败");
            }
        }
    
        //存钱啦哈哈哈哈哈
        void  saveMoney() {
            System.out.println("请输入存款金额");
            Scanner scanner = new Scanner(System.in);
            double m = scanner.nextInt();
            account += m;
            if (check()) {
                System.out.println("已经存入" + m + "元,现在账户余额为" + account + "元");
            }
        }
        //取钱
        void withdrawMoney(){
            System.out.println("请输入取款金额");
            Scanner scanner = new Scanner(System.in);
            double m=scanner.nextInt();
            if(m<=account){
            account -= m;
            if (check()) {
                System.out.println("已经取走" + m + "元,现在账户余额为" + account + "元");
            }
            }else {
                System.out.println("取款金额大于余额,操作失败");
            }
        }
    }
    
    

    效果

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    涉及知识点

    1.布尔值函数用法(返回值)
    2.循环语句
    3.if else 语句
    4.string型要判断是否相等要用equals
    5.其他好像没有了
    6.实践出真知

    展开全文
  • 数据库期末作业之银行ATM存取款系统

    千次阅读 多人点赞 2019-05-07 11:22:16
    --2)完成取款或存款业务 alter proc sav_get @v_cardnumber char(19), @v_transtype char(4), @v_money money, @v_pass char(6), @remark char(100) as begin tran if exists(select *from cardinfo where cardID=@v...
    --一、建库、建表、建约束
    --1、使用SQL创建表
    --客户信息表userinfo
    --字段名称	说明	备注
    --customerID	顾客编号	自动编号(标识列),从1开始,主键	
    --用序列sequence实现,用其属性:nextval
    --customerName	开户名	必填	
    --PID	身份证号	必填,智能是18位或15位,唯一约束	check约束len()函数
    --telephone	联系电话	必填,11位手机号	check约束,’[0-9]’
    --address	居住地址		
    create table userinfo
    (
    customerID int identity(1,1),
    customerName char(10),
    PID char(18) ,
    telephone char(11),
    address char(30)
    )
    --银行卡信息表cardinfo
    --字段名称	说明
    --cardID	卡号	必填,主键,
    --银行的卡号规则和电话号码一样,一般前8位代表特殊含义,如某综合某支行等,
    --假定该行要求其营业厅的卡号格式为10103576**** ***开始,
    --每4位号码后有空格,卡号一般是随机产生。
    --curType	货币种类	必填,默认为RMB
    --savingTate	存款类型	活期/定活两便/定期
    --openDate	开户日期	必填,默认为系统当前日期
    --openMoney	开户金额	必填,不低于1元
    --balance	余额	必填,不低于1元,否则将销户
    --pass	密码	必填,6位数字,开户时默认为6个“6”
    --IsReportloss	是否挂失	必填,是/否值,默认为“否”
    --customerID	顾客编号	外键,必填,表示该卡对应的顾客编号,一位顾客允许办理多张卡号
    create table cardinfo
    (
    cardID char(19) not null,
    curType char(10),
    savingTate char(10) ,
    openDate datetime,
    openMoney money,
    balance money,
    pass char(6),
    IsReportloss char(2) ,
    customerID int
    )
    --交易信息表transinfo
    --字段名称	说明
    --transDate	交易日期	必填,默认为系统当前日期
    --cardID	卡号	必填,外键
    --transType	交易类型	必填,只能是存入/支取
    --transMoney	交易金额	必填,大于0
    --remark	备注	可选,其他说明
    create table transinfo
    (
    transDate datetime,
    cardID char(19),
    transType char(4),
    transMoney money,
    remark varchar(100)
    )
    --2、使用SQL语言在每个表上添加约束
    --主键约束、外键约束、CHECK约束、默认约束、非空约束
    --①
    --客户信息表userinfo
    
    --customerID	顾客编号	自动编号(标识列),从1开始,主键	
    alter table userinfo
    add constraint PK_userinfor primary key(customerID)
    
    --customerName	开户名	必填	
    alter table userinfo
    add constraint CK_cn check(customerName is not null)
    
    --PID	身份证号	必填,智能是18位或15位,唯一约束	check约束len()函数
    
    alter table userinfo
    add constraint CK_PID check(len(PID)=18 or len(PID)=15 )
    alter table userinfo
    add constraint CK_pn check(PID is not null)
    alter table userinfo
    add constraint UK_pid unique(pid)
    
    --telephone	联系电话	必填,11位手机号	check约束,’[0-9]’
    
    alter table userinfo
    add constraint CK_tele check(telephone like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
    alter table userinfo
    add constraint CK_tn check(telephone is not null)
    
    --②
    --银行卡信息表cardinfo
    
    --cardID	卡号	必填,主键,
    --卡号格式为10103576**** ***开始
    alter table cardinfo
    ADD	constraint CK_Nca check(cardID is not null)
    alter table cardinfo
    ADD	constraint PK_ca primary key(cardID),
    	constraint CK_car check(cardID like '1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
    --curType	货币种类	必填,默认为RMB
    
    alter table cardinfo
    add constraint DF_ca default 'RMB' for curType,
    	constraint CK_Ncur check(curType is not null)
    	
    --savingTate	存款类型	活期/定活两便/定期
    
    alter table cardinfo
    add constraint CK_st check(savingTate in ('活期','定活两便','定期'))
    
    --openDate	开户日期	必填,默认为系统当前日期
    
    alter table cardinfo
    add constraint DF_openDate default getdate() for openDate,
    	constraint cK_nod check(openDate is not null)
    	
    --openMoney	开户金额	必填,不低于1元
    
    alter table cardinfo
    add constraint CK_nopenM check(openMoney is not null),
    	constraint CK_openM check(openMoney>=1)
    	
    --balance	余额	必填,不低于1元,否则将销户
    
    alter table cardinfo
    add constraint CK_nbalance check(balance is not null),
    	constraint CK_balance check(balance>=1)
    	
    --pass	密码	必填,6位数字,开户时默认为6个“6”
    
    alter table cardinfo
    add constraint CK_npass check(pass is not null),
    	constraint DF_PASS default '666666' for pass,
    	constraint CK_PASS check(pass like '[0-9][0-9][0-9][0-9][0-9][0-9]')
    --IsReportloss	是否挂失	必填,是/否值,默认为“否”
    
    alter table cardinfo
    add constraint CK_nIsReportloss check(IsReportloss is not null),
    	constraint DF_IsReportloss default '否' for IsReportloss,
    	constraint CK_IsReportloss check(IsReportloss in('是','否'))
    	
    --customerID	顾客编号	外键,必填,表示该卡对应的顾客编号,一位顾客允许办理多张卡号
    
    alter table cardinfo
    add constraint FK_customerID foreign key(customerID) references userinfo(customerID),
    	constraint CK_ncustomerID check(customerID is not null)
    	
    --③
    --交易信息表transinfo
    
    --transDate	交易日期	必填,默认为系统当前日期
    --cardID	卡号	必填,外键
    --transType	交易类型	必填,只能是存入/支取
    --transMoney	交易金额	必填,大于0
    --remark	备注	可选,其他说明
    alter table transinfo
    add constraint CK_Nrd check(transDate is not null),
    	constraint DF_td default getdate() for transDate,
    	
    	constraint FK_cardID foreign key (cardID) references cardinfo(cardID),
    	constraint CK_NcardID check(cardID is not null),
    	
    	constraint CK_NtransType check(transType is not null),
    	constraint DF_transType CHECK(transType in('存入','支取')),
    	
    	constraint CK_NtransMoney check(transMoney is not null),
    	constraint DF_transMoney CHECK(transMoney>0)	
    --二、插入测试数据
    --使用SQL语言向每个表中插入至少3条记录
    
    --1.向userinfo表中插入3条记录
    insert into userinfo(customerName,PID,telephone,address) values
    			('李白','370404066601021111','15000000000','山东济南'),
    			('李大白','370404066601022222','15000000111','山东济宁'),
    			('李小白','370404066601023333','15000000222','山东泰安')
    --2.向cardinfo表中插入3条记录
    insert into cardinfo(cardID,savingTate,openMoney,balance,pass,customerID) values
    			('1010 3576 0000 0000','活期',10,2,'000000',1),
    			('1010 3576 0000 0001','活期',100,20,'000001',2),
    			('1010 3576 0000 0010','活期',1000,200,'000010',3)
    --3.向transinfo表中插入3条记录
    insert into transinfo(cardID,transType,transMoney) values
    ('1010 3576 0000 0000','存入',100),
    ('1010 3576 0000 0001','存入',100),
    ('1010 3576 0000 0010','支取',100)
    --三、模拟常规业务
    --1)修改客户密码
    --修改卡号为‘1010 3576 0000 0000’的密码为‘000011’
    update cardinfo set pass='000011' where cardID='1010 3576 0000 0000'
    --2)办理银行卡挂失
    --挂失卡号为‘1010 3576 0000 0000’的卡
    update cardinfo set IsReportloss='是' where cardID='1010 3576 0000 0000'
    --3)统计银行资金流通余额和盈利结算
    --银行资金流通余额=总存入金额-总支取金额
    --通过调用存储过程计算流通余额
    create proc pro_sum
    as
    begin
    declare @v_sum money,@v_inmoney money,@v_omoney money
    select @v_inmoney=(select SUM(transMoney) from transinfo where transType='存入')
    select @v_omoney=(select SUM(transMoney) from transinfo where transType='支取')
    select @v_sum=@v_inmoney-@v_omoney
    select '流通余额'=@v_sum
    end
    go
    
    exec pro_sum
    --盈利结算=总支取金额 * 0.008 – 总存入金额 * 0.003
    --通过调用存储过程计算盈利结算
    create proc profit
    as
    begin
    declare @v_pro money,@v_inmoney money,@v_omoney money
    select @v_inmoney=(select SUM(transMoney) from transinfo where transType='存入')
    select @v_omoney=(select SUM(transMoney) from transinfo where transType='支取')
    select @v_pro=@v_omoney*0.008 -@v_inmoney * 0.003
    select '盈利结算'=@v_pro
    end
    go
    exec profit
    --4)查询本周开户的卡号,显示该卡相关信息
    select * from cardinfo where (DATEDIFF(DAY,GETDATE(),openDate)<DATEPART(WEEKDAY,openDate))
    --5)查询本月交易金额最高的卡号
    select distinct cardID from transinfo where transMoney=(select MAX(transMoney) from transinfo)
    --6)查询挂失账号的客户信息
    select * from userinfo where customerID in(select customerID from cardinfo where IsReportloss='是')
    --四、利用视图实现数据查询
    --1)为客户提供以下3个视图供其查询该客户数据
    --2)提供友好界面,要求各列名称为中文描述
    --3)调用创建的视图获得查询结果
    --客户基本信息:vw_userInfo
    create view vw_userInfo 
    as select customerID 客户号,customerName 客户名,PID 身份证号,telephone 电话号码,address 地址 from userinfo
    
    select *from vw_userInfo
    --银行卡信息:vw_cardInfo
    create view vw_cardInfo
    as select cardid 银行卡号,curType 货币类型,savingTate 存款类型,openDate 开户日期,openMoney 开户金额,
    balance 余额,pass 密码,IsReportloss 是否挂失,customerID 客户号 from cardinfo
    
    select *from vw_cardInfo
    --银行卡交易信息:vw_transInfo
    create view vw_transInfo
    as select transDate 交易日期,cardID 银行卡号,transType 交易类型,transMoney 交易金额,remark 备注 from transinfo
    
    select *from vw_transInfo
    
    --五、用存储过程实现业务处理
    --1)完成开户业务
    
    --创建存储过程通过随机数产生卡号
    create proc randomcardid
    @cardid char(19)output
    as
    select @cardid='1010 3576 '+substring(convert(char(10),RAND()*10000),0,5)+' '+substring(convert(char(10),RAND()*10000),0,5)
    go
    
    --创建开户存储过程
    create proc openaccount
    @curtype char(10),
    @savingTate char(10) ,
    @openMoney money,
    @customerID int
    as
    begin
    begin tran
    if(@openMoney<1)
    	begin
    		print'开户金额小于一元!'
    		rollback tran
    	end
    else
    	begin
    		declare @cardid char(19) 
    		exec  randomcardid @cardid output
    		insert into cardinfo values(@cardid,@curtype,@savingTate,default,@openMoney,@openMoney,default,DEFAULT,@customerID )
    		print'开户成功!'
    		select *from cardinfo where cardID=@cardid
    		commit tran
    	end
    end
    go
    
    --test:开户金额>=1
    exec openaccount 'DOLLAR','活期',2,'1'
    
    --test:开户金额<1
    exec openaccount 'DOLLAR','活期',0.1,'1'
    --开户金额小于一元!
    
    --2)完成取款或存款业务
    alter proc sav_get
    @v_cardnumber char(19),
    @v_transtype char(4),
    @v_money money,
    @v_pass char(6),
    @remark char(100)
    as
    begin tran
    if exists(select *from cardinfo where cardID=@v_cardnumber)
    	begin
    		if(@v_pass!=(select pass from cardinfo where cardID=@v_cardnumber))
    		begin
    			raiserror('密码输入错误!',16,1)
    			rollback tran
    		end
    
    		if(@v_transtype='存入')
    		begin
    			update cardinfo set balance=balance+@v_money where cardID=@v_cardnumber
    			print'存入成功!'
    		end
    		else if(@v_transtype='支取' )
    		begin
    			update cardinfo set balance=balance-@v_money where cardID=@v_cardnumber
    			if((select balance from cardinfo where cardID=@v_cardnumber)<0)
    			begin
    				print'余额不足!'
    				rollback tran
    			end
    		end
    		insert into transinfo values(GETDATE(),@v_cardnumber,@v_transtype,@v_money,@remark)
    	end
    commit tran
    go
    select *from cardinfo
    exec sav_get'1010 3576 0000 0000','存入',10,'000011',null
    --3)根据卡号打印对账单
    create procedure show
    @cardnumber char(19)
    as
    begin
    if exists(select*from transinfo where cardID=@cardnumber)
    	select *from transinfo where cardID=@cardnumber
    else
    	print'卡号不存在!'
    end
    go
    
    exec show '1010 3576 0000 0000'
    --4)查询、统计指定时间段内没有发生交易的账户信息
    create proc noexchange
    @starttime datetime,
    @endtime datetime
    as
    begin
    if (@starttime<@endtime)
    	select *from cardinfo 
    	where cardID not in(select cardID from transinfo where transDate>=@starttime and transDate<=@endtime)
    else 
    	print'开始时间应早于结束时间!'
    end 
    go
    exec noexchange'2018-12-18','2018-12-19'

     

    展开全文
  • # 银行卡信息 CREATE TABLE `Account`( `card_number` VARCHAR(16) COMMENT '卡号' NOT NULL PRIMARY KEY, `NameId` INT COMMENT '顾客编号' NOT NULL, FOREIGN KEY(`NameId`) REFERENCES client(`NameId`), `...
  • 这是用MFC编写的银行ATM存取款机,能实现正常的注册新用户、登录、存取款、转账、查询、安全退出等功能操作,已在VS2008上成功运行
  • 项目名称:银行ATM存取款系统设计与实现 一、创建数据库............................................................................................................. 3 1.1创建数据库......................
  • 第九章:银行ATM存取款系统

    千次阅读 2017-02-24 08:24:25
    INSERT INTO deposit (savingName,descrip) VALUES ('本取息五年','按月支取利息') SELECT * FROM DEPOSIT INSERT INTO userInfo(customerName,PID,telephone,address ) VALUES('张三','123456789012345','010-...
  • 报告和T-SQL源文件
  • 系统为您产生的随机卡号为:'+@mycardID print '开户日期'+convert(char(10),getdate(),111)+' 开户金额:'+convert(varchar(20),@openMoney) IF not exists(select * from userInfo where PID=@PID) INSERT INTO ...
  • if object_id('proc_getwithouttrade','p') is not null drop procedure proc_getwithouttrade go create procedure proc_getwithouttrade @startdate datetime=null,@...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,562
精华内容 624
关键字:

银行atm存取款系统