java实战项目-学生管理系统(附带全套源代码及其登录注册功能的实现)--《进阶篇》

一、前言

新增了登录注册的功能,代码量可能会有点大,所有代码加起来差不多560行。这个项目对于小白来说肯定是一大难关了。文章中的每张图都是作者亲手绘制的,简单明了,如果大家认同作者,希望可以支持一下作者。全套源代码一直会保持公开状态,有需要的话可以自行cv。

java专栏(从0开始的java之旅)

二、效果展示

注册功能展示

登录功能展示

忘记密码功能展示 

三、逻辑分析

1. 登录功能

2. 注册功能

3. 忘记密码功能

四、代码分析

1. 登录

循环尝试登录

for (int i = 0; i < 3; i++) {// 代码内容
}

使用了一个循环,最多允许用户尝试三次登录(包括第三次)。

输入用户名

System.out.println("请输入用户名");
String username = sc.next();

用户输入用户名,然后检查是否在已注册用户列表中。

检查用户名是否注册

boolean flag = comtains(users, username);
if (!flag) {System.out.println("用户名" + username + "未注册,请先注册在登录");System.exit(0);
}

如果用户名不在用户列表中,则提示用户未注册并退出程序。可能的改进是提供注册选项或重新提示输入。

输入密码和验证码

System.out.println("请输入密码");
String password = sc.next();

用户输入密码,并且每次登录尝试都需要输入验证码。

while (true) {String rightCode = GetCode();// 显示验证码并接受用户输入
}

这段代码通过 GetCode() 方法获取验证码,用户需要输入正确的验证码才能继续登录。验证码大小写不敏感。

验证用户名和密码

User userInfo = new User(username, password, null, null);
boolean result = checkUserInfo(users, userInfo);

checkUserInfo() 方法用于检查输入的用户名和密码是否在用户列表中匹配。如果匹配,则登录成功;否则,根据尝试次数给出失败提示。

登录结果处理

if (result) {System.out.println("登录成功");// 启动系统SyuSystem ss = new SyuSystem();ss.StartStuSystem();break;
} else {// 登录失败处理
}

如果登录成功,显示成功消息并启动系统;否则,根据尝试次数给出失败消息,并在达到最大尝试次数时锁定账号。

2. 注册

输入用户名

while (true) {System.out.println("请输入用户名");username = sc.next();boolean flag1 = checkUsername(username);if (!flag1) {System.out.println("格式不满足条件,需要重新输入");} else {boolean flag2 = contains(users, username);if (!flag2) {System.out.println("用户名" + username + "可用");break;} else {System.out.println("用户名" + username + "已存在,请重新输入");}}
}

用户首先输入用户名,程序会检查其格式是否符合要求(checkUsername(username) 方法的具体实现未给出,但通常会检查长度、字符等)。

如果用户名格式不正确,要求用户重新输入。

如果用户名已经存在于用户列表中(使用 contains(users, username) 方法判断),则要求用户重新输入。

输入密码

String password;
while (true) {System.out.println("请输入要注册的密码");password = sc.next();System.out.println("请再次输入密码");String password2 = sc.next();if (password.equals(password2)) {System.out.println("两次密码一致,继续输入其他数据");break;} else {System.out.println("两次密码不一致,请重新输入");}
}

用户输入密码,并要求再次确认密码。

如果两次输入的密码不一致,提示用户重新输入。

输入身份证号码和手机号码:

String personId;
while (true) {System.out.println("请输入身份证号");personId = sc.next();boolean flag = checkPersonId(personId);if (flag) {System.out.println("身份证号码满足需求");break;} else {System.out.println("身份证号码不满足需求,请重新输入");}
}String phoneNumber;
while (true) {System.out.println("请输入手机号码");phoneNumber = sc.next();boolean flag = checkPhoneNumber(phoneNumber);if (flag) {System.out.println("手机号格式正确");break;} else {System.out.println("手机号格式有误,请重新输入");}
}

用户依次输入身份证号码和手机号码。

每次输入后,程序会调用相应的验证方法(checkPersonId(personId) 和 checkPhoneNumber(phoneNumber))来验证格式的正确性。

如果格式不正确,提示用户重新输入。

创建用户对象并添加到列表

User user = new User(username, password, personId, phoneNumber);
users.add(user);

用户成功输入所有信息后,将信息封装成 User 对象,并将其添加到 users 列表中。

遍历集合打印用户信息

printList(users);

最后调用 printList(users) 方法遍历并打印注册的用户信息。

3. 忘记密码

输入用户名

System.out.println("请输入用户名");
String username = sc.next();
boolean flag = contains(users, username);
if (!flag) {System.out.println("当前用户" + username + "未注册,请先注册");return;
}

用户输入用户名,并检查该用户名是否存在于用户列表中(使用 contains(users, username) 方法)。

如果用户名不存在,提示用户先注册并结束函数。

输入身份证号和手机号

System.out.println("请输入身份证号码");
String personId = sc.next();
System.out.println("请输入手机号码");
String phoneNumber = sc.next();

用户输入身份证号码和手机号码。

验证身份信息

int index = findIndex(users, username);
User user = users.get(index);
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 newPassword = sc.next();if (password.equals(newPassword)) {System.out.println("两次密码输入一致");break;} else {System.out.println("两次密码不一致,请重新输入");continue;}
}

用户输入新的密码,并要求再次确认密码。

如果两次输入的密码不一致,提示用户重新输入。

修改密码

user.setPassword(password);
System.out.println("密码修改成功");

将用户对象中的密码字段更新为新输入的密码。

提示用户密码修改成功。

4. 方法

查找用户信息下标

方法签名和参数
private static int findIndex(ArrayList<User> users, String username)

findIndex 是一个静态方法,用于在给定的 ArrayList<User> 中查找指定用户名的用户。

users 是包含用户对象的列表。

username 是要查找的用户名。

循环遍历列表
for (int i = 0; i < users.size(); i++) {if (users.get(i).getUserName().equals(username)) {return i;}
}

使用 for 循环遍历 users 列表,从索引 0 开始逐个查找。

对于每个用户对象,通过 getUserName() 方法获取用户名,并与输入的 username 进行比较。

如果找到匹配的用户名,返回当前索引 i,即找到的用户在列表中的位置。

未找到用户情况
return -1;

如果循环结束后仍未找到匹配的用户名,返回 -1,表示未找到该用户。

检查用户名和密码是否正确

方法签名和参数

private static boolean checkUserInfo(ArrayList<User> users, User userInfo)

checkUserInfo 是一个静态方法,用于检查用户信息是否匹配。

users 是包含用户对象的列表。

userInfo 是要验证的用户信息对象,其中包含用户名和密码。

循环遍历列表

for (int i = 0; i < users.size(); i++) {if (users.get(i).getUserName().equals(userInfo.getUserName()) && users.get(i).getPassword().equals(userInfo.getPassword())) {return true;}
}

使用 for 循环遍历 users 列表,从索引 0 开始逐个检查每个用户对象。

对于每个用户对象,通过 getUserName() 方法获取用户名,并通过 getPassword() 方法获取密码。

如果当前用户对象的用户名和密码与 userInfo 中的用户名和密码完全匹配,则返回 true,表示找到匹配的用户信息。

未找到匹配的情况

return false;

如果循环结束后未找到任何匹配的用户名和密码组合,则返回 false,表示未找到匹配的用户信息。

检查手机号码

长度检查
if (phoneNumber.length() != 11) {return false;
}

首先检查手机号的长度是否为 11 位。如果不是,则返回 false。在大多数国家,手机号通常是固定长度的,这里假设长度为 11 位。

开头检查
if (phoneNumber.startsWith("0")) {return false;
}

接着检查手机号码是否以 "0" 开头。在某些国家和地区,手机号码不能以 "0" 开头,因此这里排除以 "0" 开头的情况。

数字检查
for (int i = 0; i < phoneNumber.length(); i++) {if (phoneNumber.charAt(i) > '9' || phoneNumber.charAt(i) < '0') {return false;}
}

然后通过循环遍历每个字符,检查是否都是数字。这是通过比较字符的 ASCII 值来实现的。条件 phoneNumber.charAt(i) > '9' || phoneNumber.charAt(i) < '0' 检查字符是否不在 '0' 到 '9' 的范围内。如果发现非数字字符,立即返回 false

 检查身份证号码

长度检查
if (personId.length() != 18) {return false;
}

首先检查身份证号的长度是否为 18 位。在大多数国家和地区,身份证号通常是固定长度的,因此这里假设长度为 18 位。

开头检查
boolean flag = personId.startsWith("0");
if (flag) {return false;
}

检查身份证号码是否以 "0" 开头。根据常见的身份证号规则,有些国家或地区的身份证号不应以 "0" 开头,因此这里排除以 "0" 开头的情况。

前17位检查
for (int i = 0; i < personId.length() - 1; i++) {if (personId.charAt(i) < '0' || personId.charAt(i) > '9') {return false;}
}

遍历身份证号的前 17 位,确保它们都是数字字符 ('0' 到 '9')。如果发现非数字字符,立即返回 false

第18位检查
char endChar = personId.charAt(personId.length() - 1);
if ((endChar >= '0' && endChar <= '9') || (endChar == 'x') || (endChar == 'X')) {return true;
} else {return false;
}

检查身份证号的第 18 位。它可以是数字字符 ('0' 到 '9'),或者是 'x' 或 'X'(用于表示身份证号的最后一位可能是大写字母 X)。

 检查用户名

长度检查
int len = username.length();
if (len > 15 || len < 2) {return false;
}

首先检查用户名的长度是否在 2 到 15 之间。这个范围内的长度通常被认为是合适的,太短可能不够描述,太长则可能过于复杂。

字符组成检查
for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'))) {return false;}
}

遍历用户名的每个字符,确保它们只包含字母(大小写)和数字。如果发现非这些字符,则返回 false

字母检查
int countnum = 0;
for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {countnum++;}
}

计算用户名中字母的个数。这段代码似乎是想确保用户名中至少包含一个字母,因为 countnum 变量只有在字符是字母时才增加。

生成一个验证码

创建字母集合
ArrayList<Character> code = new ArrayList<>();
for (int i = 0; i < 26; i++) {code.add((char) ('a' + i));  // 添加小写字母code.add((char) ('A' + i));  // 添加大写字母
}

首先创建了一个包含所有小写和大写字母的集合 code,即 [a-zA-Z]

随机生成四个字母
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {int index = r.nextInt(code.size());char ch = code.get(index);sb.append(ch);
}

使用 Random 类生成四个随机位置的字母,并将它们添加到 StringBuilder sb 中。

生成一个随机数字
int num = r.nextInt(10);
sb.append(num);

使用 Random 类生成一个 0 到 9 之间的随机数字,并将其追加到 sb 中。

调整数字位置
char[] arr = sb.toString().toCharArray();
int index = r.nextInt(arr.length);
char ch = arr[index];
arr[index] = arr[arr.length - 1];
arr[arr.length - 1] = ch;

将生成的验证码转换为字符数组 arr,然后随机选择一个位置将最后一个字符(即数字)与之交换,以增加验证码的随机性。

五、全套源代码

APP.java

package com.von.StudentSystem;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class App {public static void main(String[] args) {ArrayList<User> users = new ArrayList<>();Scanner sc = new Scanner(System.in);while (true) {System.out.println("欢迎来到VON学生管理系统");System.out.println("请选择操作:1登录 2注册 3忘记密码 4退出");String choose = sc.next();switch (choose) {case "1" -> login(users);case "2" -> register(users);case "3" -> forget(users);case "4" -> {System.out.println("谢谢使用,再见");System.exit(0);}default -> System.out.println("没有这个选项");}}}//忘记密码private static void forget(ArrayList<User> users) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.next();boolean flag = comtains(users, username);if (!flag) {System.out.println("当前用户" + username + "未注册,请先注册");return;}//输入身份证号和手机号System.out.println("请输入身份证号码");String perdonId = sc.next();System.out.println("请输入手机号码");String phoneNumber = sc.next();//比较身份证号,和手机号是否一样int index = findIndex(users, username);User user = users.get(index);if (!(user.getPersonId().equalsIgnoreCase(perdonId) && user.getPhoneNumber().equals(phoneNumber))) {System.out.println("身份证号码或手机号码输入有误,不能修改密码");return;}//更改密码String password;while (true) {System.out.println("请输入新密码");password = sc.next();System.out.println("请再次输入密码");String newPassword = sc.next();if (password.equals(newPassword)) {System.out.println("两次密码输入一致");break;} else {System.out.println("两次密码不一致,请重新输入");continue;}}//修改密码user.setPassword(password);System.out.println("密码修改成功");}//查找用户下标private static int findIndex(ArrayList<User> users, String username) {for (int i = 0; i < users.size(); i++) {if (users.get(i).getUserName().equals(username)) {return i;}}return -1;}//登录private static void login(ArrayList<User> users) {Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("请输入用户名");String username = sc.next();boolean flag = comtains(users, username);if (!flag) {System.out.println("用户名" + username + "未注册,请先注册在登录");System.exit(0);}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(users, userInfo);if (result) {System.out.println("登录成功");SyuSystem ss = new SyuSystem();ss.StartStuSystem();break;} else {System.out.println("登录失败,用户名或密码错误");if (i == 2) {System.out.println("当前账号" + username + "被锁定");return;} else {System.out.println("用户名或密码错误,还剩下" + i + "次机会");}}}}//检查用户名和密码是否正确private static boolean checkUserInfo(ArrayList<User> users, User userInfo) {for (int i = 0; i < users.size(); i++) {if (users.get(i).getUserName().equals(userInfo.getUserName()) && users.get(i).getPassword().equals(userInfo.getPassword())) {return true;}}return false;}//注册private static void register(ArrayList<User> users) {//1.输入用户名Scanner sc = new Scanner(System.in);String username;while (true) {System.out.println("请输入用户名");username = sc.next();boolean flag1 = checkUsername(username);if (!flag1) {System.out.println("格式不满足条件,需要重新输入");} else {//检测用户名是否唯一boolean flag2 = comtains(users, username);if (!flag2) {System.out.println("用户名" + username + "可用");break;} else {System.out.println("用户名" + username + "已存在,请重新输入");}}}//2.输入密码String password;while (true) {System.out.println("请输入要注册的密码");password = sc.next();System.out.println("请再次输入密码");String password2 = sc.next();if (password.equals(password2)) {System.out.println("两次密码一致,继续输入其他数据");break;} else {System.out.println("两次密码不一致,请重新输入");continue;}}//3.输入身份证号码String personId;while (true) {System.out.println("请输入身份证号");personId = sc.next();boolean flag = checkPersonId(personId);if (flag) {System.out.println("身份证号码满足需求");break;} else {System.out.println("身份证号码不满足需求,请重新输入");continue;}}//4.输入手机号码String phoneNumber;while (true) {System.out.println("请输入手机号码");phoneNumber = sc.next();boolean flag = checkPhoneNumber(phoneNumber);if (flag) {System.out.println("手机号格式正确");break;} else {System.out.println("手机号格式有误,请重新输入");continue;}}//5.用户名、密码、身份证号、手机号放到用户中User user = new User(username, password, personId, phoneNumber);users.add(user);//6.遍历集合printList(users);}//遍历集合private static void printList(ArrayList<User> users) {for (int i = 0; i < users.size(); i++) {User user = users.get(i);System.out.println(user.toString());}}//检查手机号码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++) {if (phoneNumber.charAt(i) > '9' && phoneNumber.charAt(i) < '0') {return false;}}return true;}//检查身份证号private static boolean checkPersonId(String personId) {//身份证号长度if (personId.length() != 18) {return false;}//检查开头数据boolean flag = personId.startsWith("0");if (flag) {return false;}//判断前17位for (int i = 0; i < personId.length() - 1; i++) {if (personId.charAt(i) < '0' || personId.charAt(i) > '9') {return false;}}//判断第18位char endChar = personId.charAt(personId.length() - 1);if ((endChar >= '0' && endChar <= '9') || (endChar == 'x') || (endChar == 'X')) {return true;} else {return false;}}//检查用户是否在集合中private static boolean comtains(ArrayList<User> users, String username) {for (int i = 0; i < users.size(); i++) {if (users.get(i).getUserName().equals(username)) {return true;}}return false;}//检查用户名private static boolean checkUsername(String username) {//用户长度必须在3-15位之间int len = username.length();if (len > 15 || len < 2) {return false;}//只能是字母加数字,不能是纯数字for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'))) {return false;}}//记录字母的个数int countnum = 0;for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {countnum++;}}return countnum > 0;}//生成一个验证码private static String GetCode() {//创建一个集合存放字母ArrayList<Character> code = new ArrayList<>();for (int i = 0; i < 26; i++) {code.add((char) ('a' + i));code.add((char) ('A' + i));}//随机生成四个字母Random r = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < 4; i++) {int index = r.nextInt(code.size());char ch = code.get(index);sb.append(ch);}//生成一个随机数字int num = r.nextInt(10);sb.append(num);//调整数字的位置char[] arr = sb.toString().toCharArray();int index = r.nextInt(arr.length);char ch = arr[index];arr[index] = arr[arr.length - 1];arr[arr.length - 1] = ch;return new String(arr);}
}

Student.java

package com.von.StudentSystem;public class Student {private String id;private String name;private int age;private String gender;private String address;public Student() {}public Student(String id, String name, int age, String gender, String address) {this.id = id;this.name = name;this.age = age;this.gender = gender;this.address = address;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

SyuSystem.java

package com.von.StudentSystem;import java.util.ArrayList;
import java.util.Scanner;public class SyuSystem {public static void StartStuSystem() {ArrayList<Student> students = new ArrayList<Student>();//菜单loop: while(true) {System.out.println("===================欢迎来到VON学生管理系统===================");System.out.println("====================1:添加学生============================");System.out.println("====================2:删除学生============================");System.out.println("====================3:修改学生============================");System.out.println("====================4:查找学生============================");System.out.println("====================5:退出系统============================");System.out.println("请输入您的选择");Scanner sc = new Scanner(System.in);String choose = sc.nextLine();switch (choose) {case "1" -> addStudent(students);case "2" -> delStudent(students);case "3" -> changeStudent(students);case "4" -> findStudent(students);case "5" -> {System.out.println("系统退出成功。欢迎再次使用");break loop;}default -> System.out.println("没有该选项");}}}//1.添加学生public static void addStudent(ArrayList<Student> students) {Student student = new Student();Scanner sc = new Scanner(System.in);while(true) {System.out.println("请输入学生ID");String id = sc.next();boolean flag = contains(students, id);if(flag) {//已经存在System.out.println("id已经存在请重新录入");}else {//不存在student.setId(id);System.out.println("请输入学生的姓名");String name = sc.next();student.setName(name);System.out.println("请输入学生年龄");int age = sc.nextInt();student.setAge(age);System.out.println("请输入学生性别");String gender = sc.next();student.setGender(gender);System.out.println("请输入学生家庭住址");String address = sc.next();student.setAddress(address);students.add(student);System.out.println("学生信息添加成功");break;}}}//2.删除学生public static void delStudent(ArrayList<Student> students) {System.out.println("请输入你要删除学生的id");Scanner sc = new Scanner(System.in);String id = sc.next();boolean flag = contains(students, id);if(flag) {//id存在for (int i = 0; i < students.size(); i++) {if(students.get(i).getId().equals(id)) {students.remove(i);System.out.println("id为"+id+"的学生删除成功");break;}}}else{//id不存在System.out.println("id不存在,删除失败");}}//3.修改学生public static void changeStudent(ArrayList<Student> students) {System.out.println("请输入要修改学生的id");Scanner sc = new Scanner(System.in);String id = sc.next();boolean flag = contains(students, id);if(flag) {//id存在for (int i = 0; i < students.size(); i++) {if(students.get(i).getId().equals(id)) {System.out.println("请输入要修改的学生姓名");students.get(i).setName(sc.next());System.out.println("请输入要修改的学生年龄");students.get(i).setAge(sc.nextInt());System.out.println("请输入要修改的学生性别");students.get(i).setGender(sc.next());System.out.println("请输入要修改的学生地址");students.get(i).setAddress(sc.next());break;}}}else{//id不存在System.out.println("要修改的id"+id+"不存在,请重新输入");}}//4.查询学生public static void findStudent(ArrayList<Student> students) {if(students.size() == 0) {System.out.println("当前没有任何学生信息,请添加后再查询");return;}System.out.println("id\t\t"+"姓名\t\t"+"年龄\t\t"+"性别\t\t"+"家庭住址");for (int i = 0; i < students.size(); i++) {Student stu = students.get(i);System.out.println(stu.getId()+"\t\t"+stu.getName()+"\t\t"+stu.getAge()+"\t\t"+stu.getGender()+"\t\t"+stu.getAddress());}}//5.判断id是否在集合中存在public static boolean contains(ArrayList<Student> students, String id) {for (int i = 0; i < students.size(); i++) {if(students.get(i).getId().equals(id)) {return true;}}return false;}
}

User.java

package com.von.StudentSystem;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;}@Overridepublic String toString() {return "User{" +"userName='" + userName + '\'' +", password='" + password + '\'' +", personId='" + personId + '\'' +", phoneNumber='" + phoneNumber + '\'' +'}';}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/377178.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

制作显卡版docker并配置TensorTR环境

感谢阅读 相关概念docker准备下载一个自己电脑cuda匹配的docker镜像拉取以及启动镜像安装cudaTensorRT部署教程 相关概念 TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个模型推理框架&#xff0c;支持C和Python推理。即我们利用Pytorch&#xff0c;Tensorflow或者其它框架…

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展&#xff0c;人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题&#xff0c;而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用&#xff0c;它能够让用户随时随地…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

自适应大气简约健康实木地板生产企业网站模板源码 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;企业的在线形象直接关联到其市场竞争力。对于专注于生产高品质、健康环保实木地板的企业而言&#xff0c;一个专业、大气且能完美展示产品特色的官方网站尤为重要。为了满足这一需求&#xff0c;我们精心打造了一款“自适应大气简约健康…

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置&#xff08;二&#xff09;》中&#xff0c;我们详细介绍了如何对Jenkins进行基本配置&#xff0c;包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置&#xff0c;您的Jenkins环境已经具备了基本的功能和…

Qt基础 | Qt Creator的基本介绍与使用 | 在Visual Studio中创建Qt项目

文章目录 一、Qt Creator的基本介绍与使用1.新建一个项目2.项目的文件组成3.项目文件介绍3.1 项目管理文件3.2 界面文件3.3 主函数文件3.4 窗体相关的文件 4.项目的编译、调试与运行 二、在Visual Studio中创建Qt项目 Qt C开发环境的安装&#xff0c;请参考https://liujie.blog…

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…

使用 HttpServlet 接收网页的 post/get 请求

前期工作&#xff1a;部署好 idea 和 一个 web 项目 idea(2021),tomcat(9) ->创建一个空的项目 -> 新建一个空的模块 -> 右键单击模块 选择 Add..Fra.. Sup.. -> 勾选Web App...后点击OK -> 点击 file - Project Struc... -> 选择刚刚的模块 -> 点…

Centos 使用nfs配置共享目录使docker集群所有容器日志统一主机访问

Centos 使用nfs配置共享目录&#xff0c;使docker集群所有容器日志统一存放在主机一个共享目录下&#xff0c;供开发人员访问查看 准备两台或以上Centos服务器 192.168.0.1 nfs服务器 192.168.0.2 nfs客户端 以root用户登录192.168.0.1服务器&#xff0c;执行以下操作 注意先…

vue里完成一个简单的评论功能,博客必备

效果展示 步骤 1-表单收集输入信息 <div class"commentorInfo"><div style"position: relative"><i class"fa fa-user"style"position:absolute;top: 50%;transform: translateY(-50%)translateX(8px)"></i>…

大语言模型诞生过程剖析

过程图如下 &#x1f4da; 第一步&#xff1a;海量文本的无监督学习 得到基座大模型&#x1f389; &#x1f50d; 原料&#xff1a;首先&#xff0c;我们需要海量的文本数据&#xff0c;这些数据可以来自互联网上的各种语料库&#xff0c;包括书籍、新闻、科学论文、社交媒体帖…

Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录 开放端口号问题引入依赖验证连接通用命令使用set 和 get 命令的使用exists 和 del 命令的使用keys 命令的使用expire 和 ttl 命令type 命令的使用 String 类型命令使用mset 和 mget 命令getrange 和 setrange 命令append 命令incr 和 decr 命令 list 类型命令使用lpus…

[极客大挑战 2019]FinalSQL

用异或来注入 注入语句为1是error&#xff0c;为0时为check ?id1^(length(database())5)写盲注脚本 这道题有点坑&#xff0c;首先是表名有两个&#xff0c;一个特别想flag&#xff0c;还有一个就是需要多线程&#xff0c;但是由于是python的&#xff0c;也没有那么必要等一…

CinemachineBrain的属性简介

CinemachineBrain的属性简介 CinemachineBrain是Unity Cinemachine的核心组件&#xff0c;它和Camera组件挂载在一起&#xff0c;监控场景中所有的virtual camera。CinemachineBrain在inspector中暴露的属性如下&#xff1a; Live Camera和Live Blend分别表示当前active的virtu…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然&#xff0c;线程之间同样也有死…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…