python实战案例--银行系统
stay hungry, stay foolish.求知若饥,虚心若愚。
今天和大家分享一个python的实战案例,很多人在学习过程中都希望通过一些案例来试一下,也给自己一点动力。那么下面介绍一下这次要介绍的内容,这个也是博主最近学的,要相信自己可以搞得定。
那么现在进入正题,实战要求是做一个银行系统,就是我们去银行办业务时候会有个自助的ATM机,现在大部分业务都是由他来解决的。首先自己想一想,用面向对象的思想该怎样实现这个系统呢?都有哪些对象?他们各自的功能都有什么?想到的越多越好,在实现的时候,碰到一个问题解决一个问题,过程当中问题很多,也不是很容易解决,不过也就是这样的过程才能学到新的东西。
一、准备工作
首先走进银行的大门,会有工作人员来询问需要办理什么业务,当然得实话实说了,不过这个和系统没什么关系(* ̄︶ ̄)。接下来,如果要办理的业务是比较大众化的,可以在机器上完成,那么她就会带着我们到一个庞大的小机器旁边。前面他还需要操作几下,来让机器可以为我们工作,有时可以见到招呼一个更高级的员工来输下指纹。这些我们可以理解为管理员来启动系统(有些人是不是觉得哪有这么麻烦,主要我这里说的是银行里面那几台功能比较全的,不单单是简单的自动取款机)。
接下来该办理我们的业务了,都有哪些业务呢?先列举一些:查余额,存款,取款,转账,改个密码,还可以挂失锁卡,对应还能解锁,把最基本的忘记了,没有办卡哪有这些操作呢,开户也得算上,补卡,销户等等。
到这里了,我们和实际情况相比没有实体的卡,所以会有一些差异。剩下的过程中想到了再说。
二、转换思想
前面大概确定了需要实现的功能,最终我们还是要写成代码,所以得从编程的思想来考虑那些需求。
首先要考虑这个系统中有哪些对象,从人到银行的ATM机都有哪些事物。人,银行卡,ATM机,这三个是必须有的了,还需要什么,开始办理业务时候那个帮我们操作的人有很多和我们用户不一样的操作,把他也当做一个对象。
人。人这个对象有哪些属性呢?人有自己的一些信息,还有银行卡,剩下要办理的业务我们人为的给定。
卡。卡也有本身的一些信息。
ATM。atm机的功能就要多一些了,首先就是上面整理出来的那些存取款等等的功能,他都得实现。除此之外还有个工作人员对他的操作,他也得处理一下。
工作人员。他们有启用和关闭这个系统的权利。
大体方向有了,剩下的就一点点的完善。
三、功能实现
先从简单的开始,前面说到,客户和卡的属性还是比较单纯的,那就先把他们解决了。
# 银行卡:卡号,卡的密码,余额
class Card(object):
def __init__(self, cardId, cardPasswd, cardMoney):
self.cardId = cardId
self.cardPasswd = cardPasswd
self.cardMony = cardMoney
# 客户:姓名,身份证号,手机号,银行卡(性别年龄那些只是多了个属性,操作时一样的,就不多写了)
class User(object):
def __init__(self, name, idCard, phone, card):
self.name = name
self.idCard = idCard
self.phone = phone
self.card = card
以上两个类是对银行卡的客户的一个初始化,里面都是列写了一下必要的属性,比如补卡得用身份证,这里通过身份证号代替,等等。其中人的属性里的卡就是上面定义的卡,人的这一个卡属性就包括卡的内部几个属性。
接下来写一下管理员的功能:
import time class Admin(object):
# 为管理员设置个账号密码,为了不随便让人能操作一些危险的内容。
admin = ""
passwd = "" # 我们把初始的界面就放在管理员的类里了,他是第一个操作这个机器的嘛
def printAdminView(self):
print("****************************************************")
print("* *")
print("* *")
print("* 欢迎登陆银行 *")
print("* *")
print("* *")
print("****************************************************") def printSysFunctionView(self):
print("****************************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 补卡(9) 销户(0) *")
print("* 退出(q) *")
print("****************************************************") # 这里就是开始时候得验证一下是不是管理员,然后再决定是不是给他这些权利
def adminOption(self):
inputAdmin = input("请输入管理员账号:")
if self.admin != inputAdmin:
print("输入账号有误!")
return -1
inputPasswd = input("请输入管理员密码:")
if self.passwd != inputPasswd:
print("密码输入有误!")
return -1 # 能执行到这里说明账号密码正确
print("操作成功,请稍后······")
time.sleep(2)
return 0
上面的代码中有个time.sleep(),这个是为了让系统更生动一些,设置的延迟,来模拟系统在大量数据时操作的时延。
前面几个是比较好理解的,现在开始实现我们的系统的功能。这些就放在ATM机的模块里了,有需求就再修改添加策略。
按照上面的那个目录的顺序来,第一个要实现的功能就是开户。开户就得创建出那一系列的属性。并且这些信息我们还需要存储起来,要不然下次再来的时候就发现自己办的卡已经无效了。这些信息可以使用一个键值对来存储,那么key用哪个属性呢。考虑一下,姓名:可能有重名的,身份证号:这个人也许会办不止一张卡,最保险的就是卡号了,不会有卡号相同的吧。那么卡号作为key,其他的个人信息,银行卡信息都存到value中去。现在就在ATM下初始化一个字典(这里还有点问题,稍后再说)。
def __init__(self, allUsers):
self.allUsers = allUsers # 用户字典
# 开户
def creatUser(self):
# 目标:向用户字典中添加一对键值对(卡号->用户)
name = input("请输入您的名字:")
idCard = input("请输入您的身份证号:")
phone = input("请输入您的电话号码:")
prestoreMoney = int(input("请输入预存款金额:"))
if prestoreMoney < 0:
print("预存款输入有误!开户失败")
return -1 onePasswd = input("请设置密码:") # 生成银行卡号
cardStr = self.randomCardId() #生成号码通过一个函数来实现,让这里的逻辑更清晰一点
card = Card(cardStr, onePasswd, prestoreMoney) # 把卡的信息放到这张卡的对象中 user = User(name, idCard, phone, card) # 个人信息也存入客户的对象中
# 存到字典
self.allUsers[cardStr] = user # 这就实现了通过一个银行卡号来索引个人信息以及里面的银行卡属性
print("开户成功!请记住卡号:" + cardStr)
上面有个生成银行卡没有说,这个其实不难,只要随机生成一组数就可以了,不过这个随机生成的得保证不能和前面已经有的卡号重复了,否则索引就有问题了。
# 生成卡号
def randomCardId(self):
while True:
str = ""
for i in range(6):
ch = chr(random.randrange(ord(""), ord("") + 1))
str += ch
# 判断是否重复
if not self.allUsers.get(str): # 这里是通过找一下原来的字典中是否有这个key,如果没有的话那么这个卡号就合法,前面要有个not,没有找到这个卡号那么我们创建这个卡号
return str
上面已经可以开通一个账户并存储了,不过我们在真正开户时候都需要输入两次密码来确保密码不会不小心输错,其实后面有些功能也需要验证密码。可以再写一个函数来验证密码,以后使用的时候也可以直接调用。
# 验证密码
def checkPasswd(self, realPasswd): # 这里传入的参数就是我们第一次输入的密码,下面要检验第一次输入是不是有误
for i in range(3):
tempPasswd = input("请输入密码:")
if tempPasswd == realPasswd:
return True
return False
其实后面的一些功能和这个是类似的,这里就不赘述了,先动手试一试,尽量的想的全面些。我会把完整的代码放在最后,可以参考一下。
最终要实现这些功能还是再写一个主程序比较好,更直观,也方便把理清他们之间的关系。首先主程序里需要调用管理员的登录,之后是客户的使用。管理员的登录上面写了,再调用一下就可以。客户的需求需要把每项功能和操作对应起来。先显示出都有哪些功能可以选择,再操作。比如像这样:
while True:
admin.printSysFunctionView()
# 等待用户操作
option = input("请输入您的操作:")
if option == "":
# print('开户')
atm.creatUser()
elif option == "":
# print("查询")
atm.searchUserInfo()
elif option == "":
# print("取款")
atm.getMoney()
elif option == "":
# print("存储")
atm.saveMoney()
elif option == "":
# print("转账")
atm.transferMoney()
elif option == "":
# print("改密")
atm.changePasswd()
elif option == "":
# print("锁定")
atm.lockUser()
elif option == "":
# print("解锁")
atm.unlockUser()
elif option == "":
# print("补卡")
atm.newCard()
elif option == "":
# print("销户")
atm.killUser()
elif option == "q":
# print("退出")
上面这所有的操作,都需要最终长期存储到键值对中,我们这里先用文件来储存,也可以存储到数据库中。既然要长期存储起来,就得把他序列化到磁盘上,使用pickle库。
# 每次使用前,需要把内容先加载下来
filepath = os.path.join(os.getcwd(), "allusers.txt")
f = open(filepath, "rb")
allUsers = pickle.load(f)
atm = ATM(allUsers) # 而在操作结束的时候,要把操作过的内容重新写到磁盘中
f = open(filepath, "wb")
pickle.dump(atm.allUsers, f)
f.close()
到这里就出现了个问题,pickle.load(),当我们第一次使用时里面并没有存储东西,他自然也就不知道我们想要存储什么样格式的内容。所以第一次我们得手动的创建一个空字典,然后将一组信息存进去。下回使用的时候就可以直接load来使用。
在一开始测试的时候记不得里面存储的内容,我就先写了个查看信息的隐藏功能。后来感觉也许银行后台应该也有这样的功能,就没有删掉,虽然是很简单的显示,至少可以体现出他的思想。有兴趣的同学可以做的更好点。
# 这是上面使用这个功能的入口,并没有显式的展示出来,仅当管理员这样操作时会调用函数
elif option == "":
admin.ban(allUsers) # 这里是调用函数后显示所有存储的信息的内容
def ban(self, allUsers):
for key in allUsers:
print("账号:" + key + "\n" + "姓名:" + allUsers[key].name + "\n" + "身份证号:" + allUsers[key].idCard + "\n" + "电话号码:" + allUsers[
key].phone + "\n" + "银行卡密码:" + allUsers[key].card.cardPasswd + "\n")
上面我只是把系统的其中一部分拿出来解释了一下,需要把里面的功能完善一下。比如把密码验证等等得放到功能里面,还有一些面向对象的操作,需要创建对象,还需要考虑到每个对象之间的关系,比如银行卡的对象作为客户对象的属性,需要通过参数传进去。仔细琢磨一下,把这个系统完成。在下面放上完整的程序,上面东西不是很清晰的话,那就一点一点的看下面的代码,找找感觉。
import time
import random
import pickle
import os class Card(object):
def __init__(self, cardId, cardPasswd, cardMoney):
self.cardId = cardId
self.cardPasswd = cardPasswd
self.cardMony = cardMoney
self.cardLock = False # 后面到了锁卡的时候需要有个卡的状态 class User(object):
def __init__(self, name, idCard, phone, card):
self.name = name
self.idCard = idCard
self.phone = phone
self.card = card class Admin(object):
admin = ""
passwd = "" def printAdminView(self):
print("****************************************************")
print("* *")
print("* *")
print("* 欢迎登陆银行 *")
print("* *")
print("* *")
print("****************************************************") def printSysFunctionView(self):
print("****************************************************")
print("* 开户(1) 查询(2) *")
print("* 取款(3) 存款(4) *")
print("* 转账(5) 改密(6) *")
print("* 锁定(7) 解锁(8) *")
print("* 补卡(9) 销户(0) *")
print("* 退出(q) *")
print("****************************************************") def adminOption(self):
inputAdmin = input("请输入管理员账号:")
if self.admin != inputAdmin:
print("输入账号有误!")
return -1
inputPasswd = input("请输入管理员密码:")
if self.passwd != inputPasswd:
print("密码输入有误!")
return -1 # 能执行到这里说明账号密码正确
print("操作成功,请稍后······")
time.sleep(2)
return 0 def ban(self, allUsers):
for key in allUsers:
print("账号:" + key + "\n" + "姓名:" + allUsers[key].name + "\n" + "身份证号:" + allUsers[key].idCard + "\n" + "电话号码:" + allUsers[
key].phone + "\n" + "银行卡密码:" + allUsers[key].card.cardPasswd + "\n") class ATM(object):
def __init__(self, allUsers):
self.allUsers = allUsers # 用户字典 # 开户
def creatUser(self):
# 目标:向用户字典中添加一对键值对(卡号->用户)
name = input("请输入您的名字:")
idCard = input("请输入您的身份证号:")
phone = input("请输入您的电话号码:")
prestoreMoney = int(input("请输入预存款金额:"))
if prestoreMoney < 0:
print("预存款输入有误!开户失败")
return -1 onePasswd = input("请设置密码:")
# 验证密码
if not self.checkPasswd(onePasswd):
print("输入密码错误,开户失败!")
return -1 # 生成银行卡号
cardStr = self.randomCardId()
card = Card(cardStr, onePasswd, prestoreMoney) user = User(name, idCard, phone, card)
# 存到字典
self.allUsers[cardStr] = user
print("开户成功!请记住卡号:" + cardStr) # 查询
def searchUserInfo(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,查询失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1
print("账号:%s 余额:%d" % (user.card.cardId, user.card.cardMony)) # 取款
def getMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,取款失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始取款
amount = int(input("验证成功!请输入取款金额:"))
if amount > user.card.cardMony:
print("取款金额有误,取款失败!")
return -1
if amount < 0:
print("取款金额有误,取款失败!")
return -1
user.card.cardMony -= amount
print("您取款%d元,余额为%d元!" % (amount, user.card.cardMony)) # 存款
def saveMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,存款失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始存款
amount = int(input("验证成功!请输入存款金额:"))
if amount < 0:
print("存款金额有误,存款失败!")
return -1
user.card.cardMony += amount
print("您存款%d元,最新余额为%d元!" % (amount, user.card.cardMony)) # 转账
def transferMoney(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 # 开始转账
amount = int(input("验证成功!请输入转账金额:"))
if amount > user.card.cardMony or amount < 0:
print("金额有误,转账失败!")
return -1 newcard = input("请输入转入账户:")
newuser = self.allUsers.get(newcard)
if not newuser:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if newuser.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1
user.card.cardMony -= amount
newuser.card.cardMony += amount
time.sleep(1)
print("转账成功,请稍后···")
time.sleep(1)
print("转账金额%d元,余额为%d元!" % (amount, user.card.cardMony)) # 改密
def changePasswd(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,改密失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1
print("正在验证,请稍等···")
time.sleep(1)
print("验证成功!")
time.sleep(1) # 开始改密
newPasswd = input("请输入新密码:")
if not self.checkPasswd(newPasswd):
print("密码错误,改密失败!")
return -1
user.card.cardPasswd = newPasswd
print("改密成功!请稍后!") # 锁定
def lockUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,锁定失败!")
return -1
if user.card.cardLock:
print("该卡已被锁定,请解锁后再使用其功能!")
return -1
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,锁定失败!")
return -1
tempIdCard = input("请输入您的身份证号码:")
if tempIdCard != user.idCard:
print("身份证号输入有误,锁定失败!")
return -1
# 锁定
user.card.cardLock = True
print("锁定成功!") # 解锁
def unlockUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,解锁失败!")
return -1
if not user.card.cardLock:
print("该卡未被锁定,无需解锁!")
return -1
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,解锁失败!")
return -1
tempIdCard = input("请输入您的身份证号码:")
if tempIdCard != user.idCard:
print("身份证号输入有误,解锁失败!")
return -1
# 解锁
user.card.cardLock = False
print("解锁成功!") # 补卡
def newCard(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在!")
return -1
tempname = input("请输入您的姓名:")
tempidcard = input("请输入您的身份证号码:")
tempphone = input("请输入您的手机号码:")
if tempname != self.allUsers[cardNum].name\
or tempidcard != self.allUsers.idCard\
or tempphone != self.allUsers.phone:
print("信息有误,补卡失败!")
return -1
newPasswd = input("请输入您的新密码:")
if not self.checkPasswd(newPasswd):
print("密码错误,补卡失败!")
return -1
self.allUsers.card.cardPasswd = newPasswd
time.sleep(1)
print("补卡成功,请牢记您的新密码!") # 销户
def killUser(self):
cardNum = input("请输入您的卡号:")
# 验证是否存在该卡号
user = self.allUsers.get(cardNum)
if not user:
print("该卡号不存在,转账失败!")
return -1
# 判断是否锁定
if user.card.cardLock:
print("该卡已锁定!请解锁后再使用其功能!")
return -1 # 验证密码
if not self.checkPasswd(user.card.cardPasswd):
print("密码输入有误,该卡已锁定!请解锁后再使用其功能!")
user.card.cardLock = True
return -1 del self.allUsers[cardNum]
time.sleep(1)
print("销户成功,请稍后!") # 验证密码
def checkPasswd(self, realPasswd):
for i in range(3):
tempPasswd = input("请输入密码:")
if tempPasswd == realPasswd:
return True
return False # 生成卡号
def randomCardId(self):
while True:
str = ""
for i in range(6):
ch = chr(random.randrange(ord(""), ord("") + 1))
str += ch
# 判断是否重复
if not self.allUsers.get(str):
return str # 主函数,不在上面的类中
def main():
# 界面对象
admin = Admin() # 管理员开机
admin.printAdminView()
if admin.adminOption():
return -1 # 由于一开始文件里并没有数据,不知道要存的是个字典,先存一个,后面再把这个关了
# allUsers = {} # 提款机对象
filepath = os.path.join(os.getcwd(), "allusers.txt")
f = open(filepath, "rb")
allUsers = pickle.load(f)
atm = ATM(allUsers) while True:
admin.printSysFunctionView()
# 等待用户操作
option = input("请输入您的操作:")
if option == "":
# print('开户')
atm.creatUser()
elif option == "":
# print("查询")
atm.searchUserInfo()
elif option == "":
# print("取款")
atm.getMoney()
elif option == "":
# print("存储")
atm.saveMoney()
elif option == "":
# print("转账")
atm.transferMoney()
elif option == "":
# print("改密")
atm.changePasswd()
elif option == "":
# print("锁定")
atm.lockUser()
elif option == "":
# print("解锁")
atm.unlockUser()
elif option == "":
# print("补卡")
atm.newCard()
elif option == "":
# print("销户")
atm.killUser()
elif option == "q":
# print("退出")
if not admin.adminOption():
# 将当前系统中的用户信息保存到文件当中
f = open(filepath, "wb")
pickle.dump(atm.allUsers, f)
f.close()
return -1
elif option == "":
admin.ban(allUsers) time.sleep(2) if __name__ == "__main__":
main()
银行系统
上面就是整个系统了,其实主要还是思想,模块较多,没有全部解释,如果程序当中有哪里不理解,可以留言讨论。注意上述完整代码主要是供大家了解整个系统,想要实现还需在自己电脑上重新配置,注意那些文件的路径,还有一个存放信息的txt文件,把他搞懂后,相信让他运行起来不难。
python实战案例--银行系统的更多相关文章
- 源码篇:Python 实战案例----银行系统
import time import random import pickle import os class Card(object): def __init__(self, cardId, car ...
- Python实战案例系列(一)
本节目录 烟草扫码数据统计 奖学金统计 实战一.烟草扫码数据统计 1. 需求分析 根据扫码信息在数据库文件中匹配相应规格详细信息,并进行个数统计 条码库.xls 扫码.xlsx 一个条码对应多个规格名 ...
- Python实战案例:这是你见过的最详细的JS加密登录某博
0x00 抓包分析 简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成! 0x01 加密逻辑分析 搜索su=可以很快找到加密的位置,上图看到e.su ...
- Python 小案例实战 —— 简易银行存取款查询系统
Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...
- Flume实战案例运维篇
Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...
- 部署Ambari Server实战案例
部署Ambari Server实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备三台虚拟机(需要自行安装jdk环境) 1>.角色分配 NameNode节点: h ...
- 【Redis3.0.x】实战案例
Redis3.0.x 实战案例 简介 <Redis实战>的学习笔记和总结. 书籍链接 初识 Redis Redis 简介 Redis 是一个速度非常快的键值对存储数据库,它可以存储键和五种 ...
- 盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
摘要:基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测.车距计算等基本功能,作为辅助驾驶入门级 ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
随机推荐
- Kotlin的参考资料
参考资料和站点 http://kotlinlang.org/ 官方网站 https://github.com/JetBrains/kotlin/releases/tag/v1.0.6 下载compil ...
- OneAPM大讲堂 | 提高JavaScript性能的30个技巧
文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术.它使网站内容 ...
- SQL Server的优化器会缓存标量子查询结果集吗
在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...
- js实现进度条
不多说,直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- web前端(5)—— 常用标签2
以下三个不仅是常用标签了,还非常重要,所以请务必好好看,重要性从高到低: 盒模型div div标签是最常用最重要的,它可以把web页面分割成很多的小块分别管理 测试代码: <!DOCTYPE h ...
- Centos7安装搭建FTP服务器(最简便方法)
简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linu ...
- 排序算法之冒泡排序的思想以及Java实现
1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...
- puppet 和 apache passenger的配置
目录 1. 概要 2. apache passenger 安装测试 2.1. 什么是 apache passenger 2.2. 安装 apache passenger 2.3. 配置 apache ...
- Java断言(Assertion)
断言(Assertion)是Java中一条语句,包含一个布尔表达式,当该布尔值为真,程序则被认为是正确的:当布尔值为假,则系统会抛出错误. 断言默认禁用的,在开发时候可开启功能,有利于纠正错误,增加可 ...
- Java多线程 Socket使用
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...