zoukankan      html  css  js  c++  java
  • 银行管理系统

    采用纯SQL语句实现银行管理系统的业务逻辑,基于MySQL5.6

    先建立相关数据表

    用户表:

     1 SET FOREIGN_KEY_CHECKS=0;
     2 
     3 -- ----------------------------
     4 -- Table structure for t_user
     5 -- ----------------------------
     6 DROP TABLE IF EXISTS `t_user`;
     7 CREATE TABLE `t_user` (
     8   `user_id` int(11) NOT NULL AUTO_INCREMENT,
     9   `user_name` varchar(32) COLLATE utf8_bin NOT NULL,
    10   `user_uuid` varchar(18) COLLATE utf8_bin NOT NULL,
    11   `user_tel` varchar(11) COLLATE utf8_bin NOT NULL,
    12   PRIMARY KEY (`user_id`)
    13 ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    t_user.sql

    银行卡表:

    t_bank.sql
     1 SET FOREIGN_KEY_CHECKS=0;
     2 
     3 -- ----------------------------
     4 -- Table structure for t_bank
     5 -- ----------------------------
     6 DROP TABLE IF EXISTS `t_bank`;
     7 CREATE TABLE `t_bank` (
     8   `bank_id` varchar(19) COLLATE utf8_bin NOT NULL,
     9   `bank_pass` varchar(255) COLLATE utf8_bin NOT NULL,
    10   `user_id` int(11) NOT NULL,
    11   `bank_status` int(1) NOT NULL DEFAULT '0',
    12   `regular_money` double(20,2) DEFAULT NULL,
    13   `current_money` double(20,2) DEFAULT NULL,
    14   `create_date` datetime NOT NULL,
    15   PRIMARY KEY (`bank_id`),
    16   KEY `u_id` (`user_id`)
    17 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    交易记录表:

     1 SET FOREIGN_KEY_CHECKS=0;
     2 
     3 -- ----------------------------
     4 -- Table structure for t_deal
     5 -- ----------------------------
     6 DROP TABLE IF EXISTS `t_deal`;
     7 CREATE TABLE `t_deal` (
     8   `deal_id` int(11) NOT NULL AUTO_INCREMENT,
     9   `in_bank_id` varchar(19) COLLATE utf8_bin DEFAULT NULL,
    10   `out_bank_id` varchar(19) COLLATE utf8_bin DEFAULT NULL,
    11   `money` double(20,2) NOT NULL,
    12   `deal_date` datetime NOT NULL,
    13   `deal_type` int(1) NOT NULL,
    14   PRIMARY KEY (`deal_id`),
    15   KEY `in_bank_id` (`in_bank_id`),
    16   KEY `out_bank_id` (`out_bank_id`)
    17 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    t_deal.sql

    通过存储过程实现创建随机卡号(前八位固定后七位自增最后一位随机校验位,例:1010 3576 0000 0011)

     1 DROP PROCEDURE my1;
     2 
     3 create PROCEDURE my1()
     4 BEGIN
     5 DECLARE head varchar(19) DEFAULT '1010 3576 ';
     6 DECLARE num int DEFAULT 1;
     7 DECLARE len int;
     8 DECLARE val int;
     9 DECLARE str VARCHAR(19);
    10 DECLARE str2 VARCHAR(19);
    11 DECLARE str3 VARCHAR(19);
    12 DECLARE str4 VARCHAR(19);
    13 select IFNULL(bank_id,'1010 3576 0000 0010')into str from t_bank;
    14 SELECT SUBSTRING(str FROM 11 FOR 4) into str2;
    15 select SUBSTRING(str FROM 16 FOR 4) INTO str3;
    16 select CONCAT(str2,str3) into str4;
    17 select CONVERT(str4,SIGNED)into num;
    18 set num=num+1;
    19 select CONVERT(num,CHAR)into str;
    20 select LPAD(str,7,'0')INTO str2;
    21 select CONCAT(str2,floor(rand() * 10)) into str;
    22 select LEFT(str,4)into str2;
    23 select RIGHT(str,4)into str3;
    24 select CONCAT(head,str2,' ',str3) into str;
    25 SELECT str;
    26 END
    27 
    28 CALL my1();
    29 
    30 DROP FUNCTION create_bankId;
    31 
    32 create FUNCTION create_bankId() RETURNS VARCHAR(19)
    33 BEGIN
    34 DECLARE head varchar(19) DEFAULT '1010 3576 ';
    35 DECLARE num int DEFAULT 1;
    36 DECLARE len int;
    37 DECLARE val int;
    38 DECLARE str VARCHAR(19)default '1010 3576 0000 0000';
    39 DECLARE str2 VARCHAR(19);
    40 DECLARE str3 VARCHAR(19);
    41 DECLARE str4 VARCHAR(19);
    42 -- 判断数据库是否有数据
    43 select IFNULL(bank_id,str)into str from t_bank ORDER BY create_date DESC LIMIT 0,1;
    44 -- 截取银行卡号后七位
    45 SELECT SUBSTRING(str FROM 11 FOR 4) into str2;
    46 select SUBSTRING(str FROM 16 FOR 3) INTO str3;
    47 select CONCAT(str2,str3) into str4;
    48 -- 转为整数
    49 select CONVERT(str4,SIGNED)into num;
    50 set num=num+1;
    51 -- 将自增号转为字符串
    52 select CONVERT(num,CHAR)into str;
    53 -- 用0补齐七位
    54 select LPAD(str,7,'0')INTO str2;
    55 -- 拼接随机数
    56 select CONCAT(str2,floor(rand() * 10)) into str;
    57 -- 追加空格
    58 select LEFT(str,4)into str2;
    59 select RIGHT(str,4)into str3;
    60 -- 拼接银行卡号
    61 select CONCAT(head,str2,' ',str3) into str;
    62 RETURN str;
    63 END
    创建随机卡号

    开户实现

     1 DROP PROCEDURE kaihu;
     2 
     3 CREATE PROCEDURE kaihu (
     4     IN uname VARCHAR (32),
     5     IN uuid VARCHAR (18),
     6     IN tel VARCHAR (11),
     7     IN bk_pass VARCHAR (50)
     8 )
     9 BEGIN
    10 
    11 DECLARE userId INT;
    12 
    13 
    14 DECLARE len INT;
    15 
    16 SELECT
    17     COUNT(1) INTO len
    18 FROM
    19     t_user
    20 WHERE
    21     user_uuid = uuid;
    22 
    23 -- 判断该用户是否开过户
    24 IF len = 0 THEN
    25     -- 未开户添加用户信息
    26     INSERT INTO t_user(
    27         user_name,
    28         user_uuid,
    29         user_tel
    30     )
    31 VALUES
    32     (uname, uuid, tel);
    33 
    34 
    35 END IF;
    36 -- 获取用户id
    37 
    38 SELECT
    39     user_id into userId
    40 FROM
    41     t_user
    42 WHERE
    43     user_uuid = uuid;
    44 
    45 -- 为用户开户
    46 INSERT INTO t_bank(
    47     bank_id,
    48     bank_pass,
    49     user_id,
    50     current_money,
    51     create_date
    52 )
    53 VALUES
    54     (
    55         create_bankId(),
    56         bk_pass,
    57         userId,
    58         100,
    59         NOW()
    60     );
    61 END 
    62 
    63 
    64 
    65 CALL kaihu (
    66     '李四',
    67     '222222222222222222',
    68     '22222222',
    69     '123456'
    70 );
    用户开户

    用户修改密码

     1 -- 修改密码
     2 create PROCEDURE update_pass(in uuid VARCHAR(18),in id VARCHAR(19),in pass VARCHAR(20))
     3 BEGIN
     4 DECLARE u_id INT;
     5 select IFNULL(user_id,0)into u_id from t_user where user_uuid=uuid;
     6 IF u_id>0 THEN
     7 UPDATE `t_bank`
     8 SET 
     9  `bank_pass` = pass
    10 WHERE
    11         `bank_id` = id
    12 AND
    13 user_id=u_id;
    14 end if;
    15 END
    修改银行卡密码

    存取款

     1 drop PROCEDURE save;
     2 -- 存钱
     3 create PROCEDURE save(in bankId VARCHAR(19),in pass VARCHAR(20),in type INT,in money DOUBLE)
     4 BEGIN
     5 DECLARE result int;
     6 DECLARE money1 double;
     7 -- 判断该用户是否存在和密码是否正确
     8 select COUNT(1) into result from t_bank where bank_id=bankId and bank_pass=pass;
     9 IF result=1 THEN
    10 
    11 IF type=0 THEN -- 活期存款
    12 SELECT IFNULL(current_money,0)into money1 from t_bank where (`bank_id`=bankId);
    13 UPDATE `t_bank` SET `current_money`=money1+money WHERE (`bank_id`=bankId);
    14 
    15 ELSEIF type=1 THEN -- 定期存款
    16 SELECT IFNULL(regular_money,0) into money1 from t_bank where (`bank_id`=bankId);
    17 UPDATE `t_bank` SET `regular_money`=money1+money WHERE (`bank_id`=bankId);
    18 end if;
    19 end if;
    20 END
    21 
    22 call save('1010 3576 0000 0026','123456',0,30);
    23 
    24 drop PROCEDURE take;
    25 -- 取钱
    26 create PROCEDURE take(in bankId VARCHAR(19),in pass VARCHAR(20),in money DOUBLE)
    27 begin
    28 DECLARE result int;
    29 DECLARE money1 double;
    30 -- 判断该用户是否存在和密码是否正确
    31 select COUNT(1) into result from t_bank where bank_id=bankId and bank_pass=pass;
    32 IF result=1 THEN
    33 SELECT IFNULL(current_money,0)into money1 from t_bank where (`bank_id`=bankId);
    34 if money1-money>1 THEN
    35 UPDATE `t_bank` SET `current_money`=money1-money WHERE (`bank_id`=bankId);
    36 end if;
    37 end if;
    38 END
    39 
    40 call take('1010 3576 0000 0012','123456',30);
    存取款

    交易记录监听

     1 drop TRIGGER deal;
     2 
     3 -- 取钱 1 存钱 2 转账 3
     4 -- 存取款交易记录
     5 create TRIGGER deal after UPDATE on t_bank for each ROW
     6 BEGIN
     7 IF old.current_money>new.current_money THEN -- 取钱
     8 INSERT INTO `t_deal` (
     9     `in_bank_id`,
    10     `out_bank_id`,
    11     `money`,
    12     `deal_date`,
    13     `deal_type`
    14 )
    15 VALUES
    16     (
    17         null,
    18         new.bank_id,
    19         old.current_money-new.current_money,
    20         NOW(),
    21         1
    22     );
    23 elseif old.current_money<new.current_money then -- 存钱
    24 INSERT INTO `t_deal` (
    25     `in_bank_id`,
    26     `out_bank_id`,
    27     `money`,
    28     `deal_date`,
    29     `deal_type`
    30 )
    31 VALUES
    32     (
    33         new.bank_id,
    34         null,
    35         new.current_money-old.current_money,
    36         NOW(),
    37         2
    38     );
    39 end if;
    40 END
    监听用户交易记录

    为用户提供相应查询

     1 CREATE VIEW vw_userInfo AS SELECT
     2     user_name 用户名,
     3     user_uuid 身份证号码,
     4     user_tel 电话
     5 FROM
     6     t_user;
     7 
     8 SELECT
     9     *
    10 FROM
    11     vw_userInfo
    12 WHERE
    13     身份证号码 = '111111111111111111';
    14 
    15 CREATE VIEW vw_cardInfo AS SELECT
    16     b.bank_id 银行卡号,
    17     b.bank_pass 银行卡密码,
    18     b.regular_money 定期余额,
    19     b.current_money 活期余额,
    20     b.create_date 开户时间,
    21     u.user_name 开户人,
    22     u.user_uuid 身份证号
    23 FROM
    24     t_bank b,
    25     t_user u
    26 WHERE
    27     u.user_id = b.user_id;
    28 
    29 SELECT
    30     *
    31 FROM
    32     vw_cardInfo
    33 WHERE
    34     银行卡号 = '1010 3576 0000 0012';
    35 
    36 -- 获取银行卡账户名称
    37 create FUNCTION getName(id VARCHAR(19))RETURNS VARCHAR(32)
    38 BEGIN
    39 DECLARE u_name VARCHAR(32);
    40 select u.user_name into u_name from t_user u,t_bank b where u.user_id = b.user_id and b.bank_id=id;
    41 RETURN u_name;
    42 END
    43 
    44 DROP view vw_tradeInfo;
    45 
    46 CREATE VIEW vw_tradeInfo AS SELECT
    47     d.deal_id 交易编号,
    48     d.in_bank_id 转入账号,
    49     IF(ISNULL(d.in_bank_id)=0,getName(d.in_bank_id),'') 转入账户人,
    50     d.out_bank_id 转出账号,
    51     IF(ISNULL(d.out_bank_id)=0,getName(d.out_bank_id),'') 转出账户人,
    52     d.money 交易金额,
    53     d.deal_date 交易时间,
    54     if(d.deal_type=1,'取钱',if(d.deal_type=2,'存钱','转账'))交易类型
    55 FROM
    56     t_deal d;
    57 
    58 SELECT * from vw_tradeInfo WHERE (转出账户人='张三' or 转入账户人='张三');
    查询视图
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/lingdu9527/p/11451150.html
Copyright © 2011-2022 走看看