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 转入账户人='张三');
    查询视图
  • 相关阅读:
    12 python json&pickle&shelve模块
    11 python shutil 模块
    10 python os&sys 模块
    9 random模块
    8 python time$datetime
    7 python 模块间相互导入
    6 unit3-文件操作&函数 review
    3 Python 函数介绍
    hibernate课程 初探单表映射2-6 session详解(下)
    hibernate课程 初探单表映射2-5 session详解(上)
  • 原文地址:https://www.cnblogs.com/lingdu9527/p/11451150.html
Copyright © 2011-2022 走看看