balian

这是自己做的练习,可能有错误,欢迎讨论和各种优化重构方案。
根据读者反馈,或者code review,我对本篇文章答案或者相关内容的更新补充,一般会被添加在本篇博客的评论中。
我尽量保证每题的答案代码是完整的,不仅仅是函数或者类,打开Python 2.7的IDLE,将代码完整拷贝进去,就能调试运行。
欢迎访问Balian在博客园的家http://www.cnblogs.com/balian

13-4.
用户注册。建立一个用户数据库(包括登录名、密码和上次登录时间戳)类(参考练习7-5和练习9-12),来管理一个系统。该系统要求用户在登录后才能访问某些资源。这个数据库类对用户进行管理,并在实例化操作时加载之前保存的用户信息,提供访问函数来添加或更新数据库的信息。在数据修改后,数据库会在垃圾回收时将新信息保存到磁盘(参见__del__())。
【注】
我使用D盘EX13_4文件夹里的accounts.txt文件记录用户名和密码。只有一个用户Balian,密码是apple。用同位置的文件userlog.txt记录上次登录时间戳。如果用户Balian登陆正确,就返回上次登陆时间,和登陆成功信息。如果用户名或者密码错误,都将提示登陆失败,失败3次退出程序。对用户进行管理指如果登陆成功,可更新密码。这样做的目的是想使代码尽量简单,毕竟这只是一个练习题。
accounts.txt文件内容(仅一行)
balian 123456
userlog.txt为一个空文本文件
运行程序前,请提前准备以上的文件夹和文件。

【答案】
代码如下:

#-*- encoding: utf-8 -*-

class DBMnagement(object):
    \'数据库管理类\'
    
    def __init__(self, nm, pwd):
        self.name = nm
        self.password = pwd
        
    def updatePWD(self, newpwd):
        self.password = newpwd
        
    def __del__(self):
        pass
        
#import os
import time

def CreateLog(username):
    \'登陆成功写时间戳到log文件\'
    timeStamp = time.ctime(time.time())
    log = \'User\' + \' - \' + username + \', last time login Succeed at \' + timeStamp + \'\n\'
    logFile = open(\'d:\\EX13_4\\userlog.txt\', \'a\')
    logFile.write(log)
    logFile.close()        

def ReadLog():
    \'登陆成功,从log文件读取上次时间戳\'
    logFile = open(\'d:\\EX13_4\\userlog.txt\')
    logInfo = logFile.readlines()
    if len(logInfo) >= 1:
        print logInfo[-1]
    logFile.close() 
    
def ChangePWDinLog(username, newpwd):
    \'修改用户密码\'
    credentialFile = open(\'d:\\EX13_4\\accounts.txt\', \'w\') 
    credentialtxt = username + \' \' + newpwd
    credentialFile.write(credentialtxt)
    credentialFile.close()
    print \'密码已修改 ... Password updated successfully. \n\'

# 从这里开始是主程序
print \'欢迎使用最简单的用户管理系统\'
print \'尝试用系统中已经存在的用户名和密码登录,有三次机会\'
print \'登陆成功后输入 updatepwd 命令可以修改密码,成功后退出系统\'
print \'登陆成功后输入 quit 命令退出系统\n\'
    
credentialFile = open(\'d:\\EX13_4\\accounts.txt\') # 从文本文件中获取用户名和密码
credentialInfo = credentialFile.readlines()
credentialFile.close()

usernameinDB = credentialInfo[-1].split()[0] # 这里credentialInfo[-1]是一个字符串,包括用户名和口令,空格隔开的
passwordindm = credentialInfo[-1].split()[1]

errorTimes = 3
while errorTimes:
    print \'请输入用户名和密码:\'
    input_username = raw_input(\'Username ... :  \')
    input_password = raw_input(\'Password ... :  \')
    if input_username == usernameinDB and input_password == passwordindm:
        print \'登陆成功  ... Login Successful\'
        CurrentUser = DBMnagement(input_username, input_password)
        ReadLog()
        CreateLog(input_username)
        input_command = raw_input(\'请输入你的命令, quit or updatepwd ... \n\')
        if input_command == \'quit\':
            del CurrentUser
            print \'\n已退出系统  ... Logout successfully.\'
            break
        elif input_command == \'updatepwd\':
            newpwd = raw_input(\'\n请输入新密码, new password ... :  \')
            CurrentUser.updatePWD(newpwd)
            ChangePWDinLog(CurrentUser.name, CurrentUser.password)
            del CurrentUser
            print \'\n已退出系统  ... Logout successfully.\'
            break
        else:
            print \'错误命令  ... Wrong Command\'
            del CurrentUser
            print \'\n已退出系统  ... Logout successfully.\'
            break
    else:
        print \'用户名或口令错误  ... Wrong Username or Password.\n\'
        errorTimes -= 1
        if errorTimes == 0: print \'已退出系统  ... Logout successfully.\'
         

【执行结果】

欢迎使用最简单的用户管理系统
尝试用系统中已经存在的用户名和密码登录,有三次机会
登陆成功后输入 updatepwd 命令可以修改密码,成功后退出系统
登陆成功后输入 quit 命令退出系统

请输入用户名和密码:
Username ... :  balian
Password ... :  123
用户名或口令错误  ... Wrong Username or Password.

请输入用户名和密码:
Username ... :  balian
Password ... :  123456
用户名或口令错误  ... Wrong Username or Password.

请输入用户名和密码:
Username ... :  balian
Password ... :  apple
登陆成功  ... Login Successful
User - balian, last time login Succeed at Wed Sep 12 12:32:35 2012

请输入你的命令, quit or updatepwd ... 
updatepwd

请输入新密码, new password ... :  egg
密码已修改 ... Password updated successfully. 


已退出系统  ... Logout successfully.            
            
        

【参考】

http://blog.csdn.net/lgfei/article/details/92044
Python中写文本文件的方法
http://magustest.com/blog/softwaretesting/how-to-write-a-file-by-using-python/

分类:

技术点:

相关文章: