• Java_题目_学生管理系统_注册登录忘记密码


    学生管理系统升级版

    Java_题目_学生管理系统_业务分析并搭建主菜单_查询添加删除修改

    需求:

    ​ 为学生管理系统书写一个登陆、注册、忘记密码的功能。

    ​ 只有用户登录成功之后,才能进入到学生管理系统中进行增删改查操作。

    分析:

    登录界面:
    System.out.println("欢迎来到学生管理系统");
    System.out.println("请选择操作1登录 2注册 3忘记密码");
    
    • 1
    • 2
    用户类:

    ​ 属性:用户名、密码、身份证号码、手机号码

    登录注册业务分析:
    switch(choose){
    ​ case 1 登录
    ​ case 2 注册
    ​ case 3 忘记密码
    ​ default 没有这个选项
    }

    注册功能:

    ​ 1,用户名需要满足以下要求:

    ​ 验证要求:

    ​ 用户名唯一

    ​ 用户名长度必须在3~15位之间

    ​ 只能是字母加数字的组合,但是不能是纯数字

    用户名要求分析:
    1)Scanner键盘录入用户名username
    2)在list集合中判断是否存在contains/getIndex
    3)长度必须在3~15之间。可以用字符串的length()
    4)先循环获取username里面每一个字符
    如果有一个字符不在’a’~‘z’ ‘A’~‘Z’ ‘0’~‘9’,那么当前用户名不符合条件
    统计一下用户名username当中有多少个字符在a-z A-Z
    判断个数,只要大于等于0才是满足要求的用户名

    ​ 2,密码键盘输入两次,两次一致才可以进行注册。

    1)利用Scanner第一次输入密码
    2)利用Scanner第二次输入密码
    3)两次一致则符合要求

    ​ 3,身份证号码需要验证。

    ​ 验证要求:

    ​ 长度为18位

    ​ 不能以0为开头

    ​ 前17位,必须都是数字

    ​ 最为一位可以是数字,也可以是大写X或小写x

    1)键盘录入身份证号码
    2)调用字符串里面的length()方法获取长度,只有为18的时候才满足
    3)调用 charAt(0)获取第一个字符,与’0’比较
    4)遍历前17位,如果有一个不在’0’~‘9’范围当中,则不符合
    5)获取最后一个字符,如果这个字符在’0’~'9’之间或者’X’或’x’则符合条件

    ​ 4,手机号验证。

    ​ 验证要求:

    ​ 长度为11位

    ​ 不能以0为开头

    ​ 必须都是数字

    1)键盘录入手机号码
    2)调用字符串里面的length()方法获取长度
    3)可以调用charAt(0),跟’0’进行比较
    4)遍历手机号码,如果有一个字符不在’0’~'9’之间则不符合

    User u =new User (username, password, personid, phoneNumber);
    list.add(u);

    登录功能:

    ​ 1,键盘录入用户名

    ​ 2,键盘录入密码

    ​ 3,键盘录入验证码

    验证要求:

    ​ 用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册

    ​ 判断验证码是否正确,如不正确,重新输入

    ​ 再判断用户名和密码是否正确,有3次机会

    1)键盘录入用户名
    2)键盘录入密码
    3)获取一个验证码
    4)键盘录入验证码

    验证:
    1)先判断用户名是否存在,如果不存在直接提示未注册
    2)用户名存在,则判断密码和验证码是否正确
    如果正确,登录成功;如果错误,会有三次机会

    忘记密码:

    ​ 1,键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册

    ​ 2,键盘录入身份证号码和手机号码

    ​ 3,判断当前用户的身份证号码和手机号码是否一致,

    ​ 如果一致,则提示输入密码,进行修改。

    ​ 如果不一致,则提示:账号信息不匹配,修改失败。

    1)键盘录入用户名,判断是否存在,不存在直接提示未注册
    2)当代码执行到第二步,表示用户名是存在的
    此时才键盘录入身份证号和手机号
    3)判断身份证号和手机号是否正确
    如果错误,则修改失败;如果正确,让用户继续键盘输入密码,提示修改成功

    验证码规则:

    ​ 长度为5

    ​ 由4位大写或者小写字母和1位数字组成,同一个字母可重复

    ​ 数字可以出现在任意位置

    比如:

    ​ aQa1K

    代码

    public class User {
        private String username;
        private String password;
        private String personID;
        private String phoneNumber;
    
        public User() {
        }
    
        public User(String username, String password, String personID, String phoneNumber) {
            this.username = username;
            this.password = password;
            this.personID = personID;
            this.phoneNumber = phoneNumber;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getPersonID() {
            return personID;
        }
    
        public void setPersonID(String personID) {
            this.personID = personID;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Scanner;
    
    public class App {
        public static void main(String[] args) {
            ArrayList<User> list = new ArrayList<>();
            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("欢迎来到学生管理系统");
                System.out.println("请选择操作:1.登录 2.注册 3.忘记密码");
                String choose = sc.next();
                switch (choose) {
                    case "1" -> login(list);
                    case "2" -> register(list);
                    case "3" -> forgetPassword(list);
                    case "4" -> {
                        System.out.println("谢谢使用,再见");
                        System.exit(0);
                    }//大括号不能省略
                    default -> System.out.println("没有这个选项");
                }
            }
        }
    
        private static void forgetPassword(ArrayList<User> list) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名");
            String username = sc.next();
            boolean flag = contains(list, username);
            if (!flag) {
                System.out.println("当前用户" + username + "未注册,请先注册");
                return;
            }
            //键盘录入身份证号和手机号
            System.out.println("请输入身份证号码");
            String personID = sc.next();
            System.out.println("请输入手机号码");
            String phoneNumber = sc.next();
            //比较用户对象中的手机号码和身份证号码是否相同
            //需要把用户对象通过索引先获取出来
            int index = findIndex(list, username);
            User user = list.get(index);
            //比较用户对象中的手机号码和身份证号码是否相同
            //★★★身份证号码最后一位可能是x,所以忽略大小写
            //★★★取反比较,增强代码阅读性
            if (!(user.getPersonID().equalsIgnoreCase(personID) && user.getPhoneNumber().equals(phoneNumber))) {
                System.out.println("身份证号码或手机号码输入有误,不能修改密码");
                return;
            }
            //当代码执行到这里,表示所有数据验证成功,直接修改
            String password;
            while (true) {
                System.out.println("请输入新的密码");
                password = sc.next();
                System.out.println("请再次输入新的密码");
                String againPassword = sc.next();
                if (password.equals(againPassword)) {
                    System.out.println("两次密码输入一致");
                    break;
                } else {
                    System.out.println("两次密码输入不一致,请重新输入");
                    continue;
                }
            }
            //直接修改密码
            user.setPassword(password);
            System.out.println("密码修改成功");
        }
    
        private static int findIndex(ArrayList<User> list, String username) {
            for (int i = 0; i < list.size(); i++) {
                User user = list.get(i);
                if (user.getUsername().equals(username)) {
                    return i;
                }
            }
            return -1;
        }
    
        private static void register(ArrayList<User> list) {
            //1.键盘录入用户名
            Scanner sc = new Scanner(System.in);
            String username;
            while (true) {
                System.out.println("请输入用户名");
                username = sc.next();
                //开发细节:先验证格式是否正确,再验证是否唯一
                //因为存储在数据库中,如果要校验,需要使用到网络资源
                boolean flagCheckUsername = checkUsername(username);
                if (!flagCheckUsername) {
                    System.out.println("用户名格式不满足条件,需要重新输入");
                    continue;
                }
                //校验用户名唯一
                //username到集合中判断是否有存在
                boolean flagContainsUsername = contains(list, username);
                if (flagContainsUsername) {
                    //用户名已存在,当前用户名无法注册,需要重新输入
                    System.out.println("用户名" + username + "已存在,请重新输入");
                } else {
                    //不存在,表示当前用户名可用,可以继续录入下面的其他数据
                    System.out.println("用户名" + username + "可用");
                    break;
                }
            }
            //2.键盘录入密码
            //密码键盘输入两次,两次一致才可以注册
            String password;
            while (true) {
                System.out.println("请输入要注册的密码");
                password = sc.next();
                System.out.println("请再次输入要注册的密码");
                String againPassword = sc.next();
                if (!password.equals(againPassword)) {
                    System.out.println("两次密码输入不一致,请重新输入");
                    continue;
                } else {
                    System.out.println("两次密码一致,继续录入其他数据");
                    break;
                }
            }
            //3.键盘录入身份证号码
            String personID;
            while (true) {
                System.out.println("请输入身份证号码");
                personID = sc.next();
                boolean flagCheckPersonID = checkPersonID(personID);
                if (flagCheckPersonID) {
                    System.out.println("身份证号码满足要求");
                    break;
                } else {
                    System.out.println("身份证号码格式有误,请重新输入");
                    continue;
                }
            }
            //4.键盘录入手机号码
            String phoneNumber;
            while (true) {
                System.out.println("请输入手机号码");
                phoneNumber = sc.next();
                boolean flagCheckPhoneNumber = checkPhoneNumber(phoneNumber);
                if (flagCheckPhoneNumber) {
                    System.out.println("手机号码格式正确");
                    break;
                } else {
                    System.out.println("手机号码格式有误,请重新输入");
                    continue;
                }
            }
            //用户名,密码,身份证号码,手机号码放到用户对象中
            User u = new User(username, password, personID, phoneNumber);
            //把用户对象添加到集合中
            list.add(u);
            System.out.println("注册成功");
            //遍历集合
            printList(list);
        }
    
        private static void printList(ArrayList<User> list) {
            for (int i = 0; i < list.size(); i++) {
                User u = list.get(i);
                System.out.println(u.getUsername() + "," + u.getPassword() + ","
                        + u.getPersonID() + "," + u.getPhoneNumber());
            }
        }
    
        private static boolean checkPhoneNumber(String phoneNumber) {
            //长度为11位
            if (phoneNumber.length() != 11) {
                return false;
            }
            //不能以0数字开头
            if (phoneNumber.startsWith("0")) {
                return false;
            }
            //必须都是数字
            for (int i = 0; i < phoneNumber.length(); i++) {
                char c = phoneNumber.charAt(i);
                if (!(c >= '0' && c <= '9')) {
                    return false;
                }
            }
            //当循环结束之后,表示每一个字符都在0-9之间
            return true;
        }
    
        private static boolean checkPersonID(String personID) {
            //长度为18
            if (personID.length() != 18) {
                return false;
            }
            //不能以0数字开头
            if (personID.startsWith("0")) {
                return false;
            }
            //前17位,必须都是数字
            for (int i = 0; i < personID.length() - 1; i++) {
                char c = personID.charAt(i);
                //如果有一个字符不在0-9之间,返回false
                if (!(c >= '0' && c <= '9')) {
                    return false;
                }
            }
            //最后一位可以是数字,也可以是大写X或小写x
            char endPersonIDChar = personID.charAt(personID.length() - 1);
            if ((endPersonIDChar >= '0' && endPersonIDChar <= '9') || (endPersonIDChar == 'x') || (endPersonIDChar == 'X')) {
                return true;
            } else {
                return false;
            }
        }
    
        private static boolean contains(ArrayList<User> list, String username) {
            //循环遍历集合得到每一个用户对象
            //拿着用户对象中的用户名进行比较
            for (int i = 0; i < list.size(); i++) {
                User user = list.get(i);
                String rightUsername = user.getUsername();
                if (rightUsername.equals(username)) {
                    return true;
                }
            }
            //当循环结束了,表示集合里面所有的用户都比较完毕了,还没有一样的,返回false
            return false;
        }
    
        private static boolean checkUsername(String username) {
            //用户名长度必须在3~15位之间
            int len = username.length();//减少后面调用方法的次数提高效率
            if (len < 3 || len > 15) {
                return false;
            }
            //★★当代码执行到这里,表示用户名的长度是符合要求的
            //继续校验:只能是字母+数字的组合
            //循环得到username里的每一个字符,如果有一个字符不是字母或者数字,返回false
            for (int i = 0; i < username.length(); i++) {
                // i 索引
                char c = username.charAt(i);
                //★★★!表示取反,不存在,注意括号数量
                if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                    return false;
                }
            }
            //★★当代码执行到这里,表示用户名满足长度和字符+数字的要求
            //但不能是纯数字
            //统计在用户名中,有多少字母
            int count = 0;
            for (int i = 0; i < username.length(); i++) {
                // i 索引
                char c = username.charAt(i);
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                    count++;
                    //★★★当有一个存在,直接退出,提高效率 a123
                    break;
                }
            }
            //★★★如果字母存在,返回true
            return count > 0;
        }
    
        private static void login(ArrayList<User> list) {
            Scanner sc = new Scanner(System.in);
            for (int i = 0; i < 3; i++) {
                System.out.println("请输入用户名");
                String username = sc.next();
                //判断用户名是否存在
                boolean flag = contains(list, username);
                if (!flag) {
                    System.out.println("用户名" + username + "未注册,请先注册再登录");
                    return;//结束方法
                }
                System.out.println("请输入密码");
                String password = sc.next();
                while (true) {
                    String rightCode = getCode();
                    System.out.println("当前正确的验证码为" + rightCode);
                    System.out.println("请输入验证码");
                    String code = sc.next();
                    //验证码忽略大小写
                    if (code.equalsIgnoreCase(rightCode)) {
                        System.out.println("验证码正确");
                        break;
                    } else {
                        System.out.println("验证码错误");
                        continue;
                    }
                }
                //验证用户名和密码是否正确
                //集合中是否包含用户名和密码
                //定义一个方法验证用户名和密码是否正确
                //★★★封装思想的应用:
                //我们可以把一些零散的数据,封装成一个对象
                //传递参数时,传递一个整体
                User userInfo = new User(username, password, null, null);
                boolean result = checkUserInfo(list, userInfo);
                if (result) {
                    System.out.println("登录成功,可以开始使用学生系统了");
                    //★★★★★★创建对象调用方法,启动学生管理系统
                    StudentSystem ss = new StudentSystem();
                    ss.startStudentSystem();
                    break;
                } else {
                    System.out.println("登录失败,用户名或密码错误");
                    if (i == 2) {
                        System.out.println("当前账号" + username + "被锁定,请联系客服:xxx-xxxxx");
                        //当前账号锁定之后,直接结束方法即可
                        return;
                    } else {
                        System.out.println("用户名或密码错误,还剩下" + (2 - i) + "次机会");
                    }
                }
            }
        }
    
        private static boolean checkUserInfo(ArrayList<User> list, User userInfo) {
            //遍历集合,判断用户是否存在,如果存在登录成功,如果不存在登录失败
            for (int i = 0; i < list.size(); i++) {
                User user = list.get(i);
                if (user.getUsername().equals(userInfo.getUsername()) && user.getPassword().equals(userInfo.getPassword())) {
                    return true;
                }
            }
            return false;
        }
    
        //生成一个验证码
        private static String getCode() {
            //1.创建一个集合添加所有的大写和小写字母,因为多次所以此处不添加数字
            ArrayList<Character> list = new ArrayList<>();
            for (int i = 0; i < 26; i++) {
                //★★★添加大小写字符
                list.add((char) ('a' + i));
                list.add((char) ('A' + i));
            }
            //拼接字符
            StringBuilder sb = new StringBuilder();
            //2.要随机抽取4个字符
            Random r = new Random();
            for (int i = 0; i < 4; i++) {
                //获取随机索引
                int randomIndex = r.nextInt(list.size());
                //利用随机索引获取字符
                //Character是类,char基本数据类型
                //★★★JDK5.0后,char可以自动包装成Character;Character也可以自动拆包成char
                char c = list.get(randomIndex);
                sb.append(c);
            }
            //3.把一个随机数字添加到末尾
            int number = r.nextInt(10);
            sb.append(number);
            //4.修改字符串内容
            //先把字符串变成字符数组,在数组中修改,然后再创建一个新的字符串】
            char[] arr = sb.toString().toCharArray();
            //获取随机索引
            int randomIndex = r.nextInt(arr.length);
            //最大索引指向的数字,和随机索引指向的元素交换
            char temp = arr[arr.length - 1];
            arr[arr.length - 1] = arr[randomIndex];
            arr[randomIndex] = temp;
            return new String(arr);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    public class StudentSystem {
        //★★★修改方法名,启动学生管理系统
        public static void startStudentSystem() {
            //public static void main(String[] args) {
    
    • 1
    • 2
    • 3
    • 4

    控制台

    在这里插入图片描述

  • 相关阅读:
    新160个CrackMe分析-第3组:21-30(上)
    C语言小游戏之三子棋(井字棋)(1.5w字超详细讲解)
    Java多线程编程核心技术手册 绝了
    一台服务器,最大支持的TCP连接数是多少?
    生命在于学习——Linux学习笔记(八)启动引导
    GE WES5120 5120-1506 自动化控制模块
    【算法篇】利用堆高效解决大数据量时TOP-K问题
    什么是Air-gapped test or development environments?
    微服务架构(从无到有)三.构建对象存储服务 1) micro+阿里云oss服务
    streamlit执行报错WARNING,重新安装碰到问题如何解决
  • 原文地址:https://blog.csdn.net/SisinRyu/article/details/128160526