Skip to content

注册登录系统_类实现

难度:⭐⭐⭐

1. 题目描述

题目描述

用类封装一个可注册&登录的后台系统 要求:

  1. 能登录
        判断是否注册,没有则不能登录,接着提示重新输入
        账号存在后继续判断密码是否正确
        账号密码以 json 格式存到文件中
  2. 能注册
        账号是手机号
        密码长度必须大于等于 6,小于等于 12;且只能是数字跟字母组合
  3. 可重复
  4. 可退出

2. 关键点

  • 字符串操作
  • json 与 dict 转换
  • class 类概念

3. 代码实现

点击显示代码
python
import os
import json

db = './db.json'


class XiTong():
    def __init__(self):
        """初始读取密码文件"""
        self.data = self.get_db()

    def save_db(self):
        """保存账号密码"""
        if not self.data:
            return
        with open(db, 'w') as f:
            f.write(json.dumps(self.data))

    def get_db(self):
        """读取账号密码"""
        if not os.path.isfile(db):
            with open(db, 'w') as f:
                f.write('')
            # os.mknod(db)
        with open(db) as f:
            data = f.read()
            if data:
                data = json.loads(data)
            else:
                data = {}
        return data

    def login(self, username, password):
        """登录"""
        if username not in self.data:
            print('账号尚未注册,请重新输入')
            return False
        if password != self.data[username]:
            print('账号不正确,请重新输入')
            return False
        print('登录成功')
        return True

    def register(self, username, password):
        """注册"""
        if self.check_username(username) and self.check_password(password):
            self.data[username] = password
            print('注册成功')
            return True
        return False

    def exit(self):
        """退出"""
        print('欢迎下次光临')

    def check_username(self, username):
        """检测用户名
        1. 长度检测
        2. 手机号必须 1 开头
        3. 组成检测
        """
        if len(username) != 11:
            print('长度不对,请输入正确的11位手机号')
            return False
        if username[0] != '1':
            print('只能1开头,请输入正确的11位手机号')
            return False
        # for c in username[1:]:
        #     if c not in range(10):
        #         print('非数字,请输入正确的11位手机号')
        #         break
        if not username.isdigit():
            print('非数字,请输入正确的11位手机号')
            return False
        return True

    def check_password(self, password):
        """检测密码
        1. 长度检测
        2. 组成检测
        """
        if not (6 <= len(password) <= 12):
            print('密码长度必须在 6~12 之间')
            return False
        if not password.isalnum():
            print('密码只能是数字或字母')
            return False
        return True

    def run(self):
        help_text = [
            '1. 我要注册',
            '2. 我要登录',
            '3. 我要退出',
        ]
        while True:
            action = input('{}\n请输入序号选择你需要的操作:'.format('\n'.join(help_text)))
            action = int(action)
            if action == 1:
                while True:
                    username = input('请输入手机号:')
                    password = input('请输入密码:')
                    res = self.register(username, password)
                    if res is True:
                        break
            elif action == 2:
                while True:
                    username = input('请输入手机号:')
                    password = input('请输入密码:')
                    res = self.login(username, password)
                    if res is True:
                        break
            elif action == 3:
                self.exit()
                break
        self.save_db()


if __name__ == '__main__':
    xt = XiTong()
    xt.run()

4. 运行示例

txt
1. 我要注册
2. 我要登录
3. 我要退出
请输入序号选择你需要的操作:1
请输入手机号:18101052222
请输入密码:python123
注册成功
1. 我要注册
2. 我要登录
3. 我要退出
请输入序号选择你需要的操作:2
请输入手机号:18101052222
请输入密码:python-abc
账号不正确,请重新输入
请输入手机号:18101052222
请输入密码:python123
登录成功
1. 我要注册
2. 我要登录
3. 我要退出
请输入序号选择你需要的操作:3
欢迎下次光临

5. 进阶思考

  1. 添加其它功能,比如查询注册人数
  2. 添加其它信息,比如邮箱、姓名等等
  3. 密码加密保存到文件