银行管理系统

采用纯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 转入账户人='张三');
查询视图

猜你喜欢

转载自www.cnblogs.com/lingdu9527/p/11451150.html
今日推荐