银行管理系统是一个集开户、查询、取款、存款、转账、锁定、解锁、退出等一系列业务于一体的管理系统,随着计算机技术在金融行业的广泛应用,银行企业采用管理系统替代了传统手工记账的方式,这极大地缩短了用户办理基础储蓄业务的时间,提升了银行企业的形象。
假设现有一银行管理系统,该系统的“欢迎登录银行管理系统”界面和“功能菜单”界面分别如图所示
***************************************************
*** ***
*** ***
*** 欢迎登录银行管理系统 ***
*** ***
*** ***
***************************************************
图:"欢迎登录银行管理系统"界面
**************************************************
*** ***
*** 1.开户(1) 2.查询(2) ***
*** 3.取款(3) 4.存款(4) ***
*** 5.转账(5) 6.锁定(6) ***
*** 7.解锁(7) ***
*** ***
*** 退出(Q) ***
*** ***
**************************************************
图:"功能菜单"界面
银行管理系统启动后会显示“欢迎登录银行管理系统”界面,并要求工作人员按照提示输入管理员的账户和密码,输入正确的账户和密码后方可进入“功能菜单”界面,否则直接退出银行管理系统。管理员信息输入正确和输入错误的提示信息如图8-7所示。
请输入管理员账户:admin
请输入密码:12345
请输入密码:123
操作成功,请稍后……
图:输入正确的账号密码
请输入管理员账户:ad
管理员账户输入错误……
图:输入错误的账号
请输入管理员账户:admin
输入密码有误……
图:输入错误的密码
图示的“功能菜单”界面显示了银行管理系统的全部功能,包括开户、查询、取款、存款、转账、锁定、解锁和退出,每个功能的介绍如下。
使用SSMS(Microsoft SQL Server Management Studio,版本:v18.9.1。如非此版本请手动创建数据库,因为可能会出现不兼容的情况。)
创建新用户
右键数据库名选择属性
选择安全性并按如图配置
右键登录名创建新用户
选择常规并配置用户名密码
选择安全对象并授权(要求能够查询,修改,添加,删除数据库的元素)
如图配置即可完成
配置完毕之后可以登录数据库试试
参考脚本如下
USE [master]
GO
/****** Object: Database [bank] Script Date: 2021/5/5 19:12:05 ******/
CREATE DATABASE [bank]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'bank', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\bank.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'bank_log', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\bank_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO
ALTER DATABASE [bank] SET COMPATIBILITY_LEVEL = 150
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [bank].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [bank] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [bank] SET ANSI_NULLS OFF
GO
ALTER DATABASE [bank] SET ANSI_PADDING OFF
GO
ALTER DATABASE [bank] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [bank] SET ARITHABORT OFF
GO
ALTER DATABASE [bank] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [bank] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [bank] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [bank] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [bank] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [bank] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [bank] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [bank] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [bank] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [bank] SET DISABLE_BROKER
GO
ALTER DATABASE [bank] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [bank] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [bank] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [bank] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [bank] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [bank] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [bank] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [bank] SET RECOVERY FULL
GO
ALTER DATABASE [bank] SET MULTI_USER
GO
ALTER DATABASE [bank] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [bank] SET DB_CHAINING OFF
GO
ALTER DATABASE [bank] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [bank] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [bank] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [bank] SET ACCELERATED_DATABASE_RECOVERY = OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'bank', N'ON'
GO
ALTER DATABASE [bank] SET QUERY_STORE = OFF
GO
USE [bank]
GO
/****** Object: User [root] Script Date: 2021/5/5 19:12:06 ******/
CREATE USER [root] FOR LOGIN [root] WITH DEFAULT_SCHEMA=[dbo]
GO
/****** Object: Table [dbo].[account] Script Date: 2021/5/5 19:12:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[account](
[name] [varchar](20) NOT NULL,
[id] [varchar](50) NOT NULL,
[password] [varchar](50) NOT NULL,
[balance] [float] NOT NULL,
[telephone_number] [varchar](50) NOT NULL,
[is_lock] [int] NOT NULL,
[id_card] [varchar](50) NOT NULL,
CONSTRAINT [PK_account] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Alice', N'178324', N'154737', 0, N'16574358756', 1, N'126467198709394765')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Dennis', N'189612', N'156464', 2035.1, N'16455631735', 0, N'164536199801017635')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Jobs', N'234244', N'163736', 0, N'16745461746', 0, N'164564199801017844')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Lincoln', N'234534', N'144563', 10000, N'15463656473', 0, N'219033198811129034')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bidden', N'254546', N'132412', 0, N'16443745627', 1, N'164567199807081535')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Trump', N'324555', N'154632', 0, N'16735482798', 0, N'183647198902038464')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Maldives', N'325455', N'123212', 0, N'16744753877', 1, N'145666199802031846')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bob', N'329574', N'174465', 0, N'16755748375', 0, N'174657199802031324')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Lucy', N'345656', N'154635', 100000, N'15746587368', 0, N'198773199908091846')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bill', N'384594', N'154635', 0, N'15463641546', 1, N'153635199901017834')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Antone', N'685630', N'132354', 0.8, N'15464538775', 0, N'419817199897111735')
GO
USE [master]
GO
ALTER DATABASE [bank] SET READ_WRITE
GO
# coding=utf-8
# sqlserver的连接
import random
import pymssql
class MSSQL:
def __GetConnect(self):
"""
得到连接信息
返回: conn.cursor()
"""
self.conn = pymssql.connect(host='主机名(可以是localhost)', user='用户名(要求此用户有操作数据库数据的权限)', password='密码', database='数据库名', charset="utf8")
cur = self.conn.cursor()
if not cur:
raise (NameError, "连接数据库失败")
else:
return cur
def ExecQuery(self, sql):
"""
执行查询语句
返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
"""
cur = self.__GetConnect()
cur.execute(sql)
result_list = cur.fetchall()
# 查询完毕后必须关闭连接
self.conn.close()
return result_list
def ExecNonQuery(self, sql):
"""
执行非查询语句
"""
cur = self.__GetConnect()
try:
cur.execute(sql)
except Exception as ex:
print(ex)
self.conn.commit()
self.conn.close()
class Account:
def new_account(self):
name = input('欢迎成为我们的新用户,请输入您的姓名')
account = str(random.randint(100000, 999999))
password = input('请输入您的密码')
repeat_password = input('请再输入一次')
if password == repeat_password:
telephone = input('请输入您的电话')
import re
#使用正则表达式匹配电话号码
pattern_telephone = re.compile(R"^1[3578]\d{9}$")
phone_match_result = pattern_telephone.match(telephone)
if phone_match_result is not None:
#使用正则表达式匹配身份证号码
id_card = input('请输入您的身份证号码')
pattern_id_card=re.compile(R"^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2]["
R"1-9])|10|20|30|31)\d{3}[0-9Xx]$")
id_card_match_result = pattern_id_card.match(id_card)
if id_card_match_result is not None:
money=input('请输入预存金额')
da = MSSQL()
sql = 'INSERT INTO account VALUES(' + "'" + name + "','" + account + "','" + password + "'," + money + ",'" + telephone + "'," + "0" + ",'" + id_card + "')"
da.ExecNonQuery(sql)
else:
print('身份证号码无效')
else:
print("手机号码无效")
else:
print('注册失败,您输入的密码不一致')
def find(self):
d = MSSQL()
account = input('欢迎使用ATM存取款一体机,请插入银行卡')
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
user_message = result_list[0]
for i in range(3):
password = input('请输入密码')
if password == user_message[2]:
print('亲爱的客户您好,您的信息如下')
def check_account():
if user_message[5] == 0:
print('姓名', user_message[0], '\n账号', user_message[1], '\n余额', user_message[3], '\n手机号',
user_message[4], '\n账户正常\n身份证号', user_message[6])
else:
print('您的账户已锁定,无法查询')
return
check_account()
print('查询完毕,请取走卡片。\n谢谢您的光临')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
def get_money(self):
account = input('欢迎使用ATM存取款一体机,请插入银行卡')
d = MSSQL()
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
for i in range(3):
password = input('请输入密码')
user_message = result_list[0]
if password == user_message[2]:
if user_message[5] == 0:
print('您的余额为', user_message[3])
money = float(input('请取款'))
if money > user_message[3]:
print('您的余额不足,取款失败')
return
elif money < 0:
print('您的输入有误,取款失败')
return
else:
money_ = user_message[3]
money_ = str(money_ - money)
sql = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('取款成功,请核对。')
return
else:
print('您的银行卡已锁定,无法操作')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('取款结束,请取走卡片。\n谢谢您的光临')
def save_money(self):
account = input('欢迎使用ATM存取款一体机,请插入银行卡')
d = MSSQL()
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
for i in range(3):
password = input('请输入密码')
user_message = result_list[0]
if password == user_message[2]:
if user_message[5] == 0:
print('您的余额为', user_message[3])
money = float(input('请存款'))
if money < 0:
print('您的输入有误,存款失败')
return
else:
money_ = user_message[3]
money_ = str(money_ + money)
sql = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('存款成功,请核对。')
return
else:
print('您的银行卡已锁定,无法操作')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('存款结束,请取走卡片。\n谢谢您的光临')
def transfer_money(self):
account = input('欢迎使用ATM存取款一体机,请插入银行卡')
d = MSSQL()
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
user_message = result_list[0]
for i in range(3):
password = input('请输入密码')
if password == user_message[2]:
if user_message[5] == 0:
print('您的余额为', user_message[3])
person = input('请输入转到的银行卡号')
money = float(input('请输入转账金额'))
if money < 0:
print('您的输入有误,转账失败')
return
else:
make_sure_transfor=input('您确定转账?输入Y继续,输入其他退出')
if make_sure_transfor=='Y':
sql = 'SELECT * FROM account WHERE id=' + "'" + person + "'"
de = d.ExecQuery(sql)
if len(de) == 0:
print('无效卡号,请核对')
return
else:
if money > user_message[3]:
print('您的余额不足,转账失败')
return
else:
money_ = user_message[3]
money_ = str(money_ - money)
sql1 = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[
1] + "'"
d.ExecNonQuery(sql1)
money__ = de[0][3]
money__ = str(money__ + money)
sql2 = 'UPDATE account SET balance=' + money__ + ' WHERE id=' + "'" + person + "'"
d.ExecNonQuery(sql2)
print('转账成功,请核对。')
return
else:
return
else:
print('您的银行卡已锁定,无法操作')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('转账结束,请取走卡片。\n谢谢您的光临')
def lock(self):
account = input('欢迎使用ATM存取款一体机,请输入银行卡卡号')
d = MSSQL()
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
user_message = result_list[0]
for i in range(3):
password = input('请输入密码')
if password == user_message[2]:
if user_message[5] == 0:
print('您的余额为', user_message[3])
is_lock = input('您确定要锁定您的银行卡吗?输入1锁定银行卡,输入其他字符返回')
if is_lock != '1':
return
else:
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('锁定成功')
return
else:
print('您的银行卡已锁定,无法操作')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('挂失结束。\n谢谢您的光临')
def un_lock(self):
account = input('欢迎使用ATM存取款一体机,请输入银行卡卡号')
d = MSSQL()
sql = 'SELECT * FROM account WHERE id=' + account
result_list = d.ExecQuery(sql)
if len(result_list) == 0:
print('非法卡,请重试')
else:
user_message = result_list[0]
for i in range(3):
password = input('请输入密码')
if password == user_message[2]:
if user_message[5] == 1:
print('您的余额为', user_message[3])
is_lock = input('您确定要解锁您的银行卡吗?输入0解锁银行卡,输入其他字符返回')
if is_lock != '0':
return
else:
sql = 'UPDATE account SET is_lock=0 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('解锁成功')
return
else:
print('您的银行卡未锁定,无法操作')
return
else:
print('密码错误,请重试')
print('密码错误次数过多,银行卡已锁定')
sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
d.ExecNonQuery(sql)
print('挂失结束。\n谢谢您的光临')
def welcome():
welcome_ = '''
********************************************
*** ***
*** ***
*** 欢迎登录银行管理系统 ***
*** ***
*** ***
********************************************
'''
print(welcome_)
def main_menu():
menu = '''
**************************************************
*** ***
*** 1.开户(1) 2.查询(2) ***
*** 3.取款(3) 4.存款(4) ***
*** 5.转账(5) 6.锁定(6) ***
*** 7.解锁(7) ***
*** ***
*** 退出(Q) ***
*** ***
**************************************************
'''
print(menu)
def login():
acc = input('请输入管理员账户:')
if acc != 'admin':
print('管理员账户输入错误......')
exit(0)
p_s_w_d = input('请输入密码:')
if p_s_w_d != '12345':
print('输入密码有误......')
exit(0)
print('操作成功,请稍后......')
def choose():
a = Account()
choose_ = input('请输入您的操作')
if choose_ == '1':
a.new_account()
elif choose_ == '2':
a.find()
elif choose_ == '3':
a.get_money()
elif choose_ == '4':
a.save_money()
elif choose_ == '5':
a.transfer_money()
elif choose_ == '6':
a.lock()
elif choose_ == '7':
a.un_lock()
elif choose_ == 'Q':
exit(0)
else:
print('输入错误')
def main():
welcome()
login()
while True:
main_menu()
choose()
if __name__ == '__main__':
main()