学生管理系统(升级版)

news2024/12/26 0:00:08

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Demo_学生管理系统 {
	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);
				break;
			case "2":
				register(list);
				break;
			case "3":
				gorgetPassword(list);
				break;
			case "4": {
				System.out.println("谢谢使用,再见!");
				System.exit(0);
			}

			default:
				System.out.println("没有这个选项");
				break;
			}
		}
	}

	// 登录
	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 = checkUsername(list, userInfo);
			if (result) {
				System.out.println("登录成功");
				// 创建对象,调用方法,启动学生管理系统
				StudentSystem s = new StudentSystem();
				s.startStudent();
				break;
			} else {
				System.out.println("登录失败!");
				System.out.println("用户名账户或密码错误");
				if (i == 2) {
					System.out.println("当前账号" + username + "被锁定,请联系客服!");
					return;
				} else {
					System.out.println("用户名或密码错误,还剩" + (2 - i) + "次机会!");
				}
			}
		}
	}

	// 验证用户名和密码是否正确
	private static boolean checkUsername(ArrayList<User> list,User userInfo) {
		// TODO Auto-generated method stub
		//遍历集合,判断用户是否存在
		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 void register(ArrayList<User> list) {
		// 把用户名,密码,身份证号码,手机号放到用户对象中
		// 把用户信息添加到集合中
		Scanner sc = new Scanner(System.in);
		String username;
		String password;
		String personID;
		String PhoneNumber;
		while (true) {
			System.out.println("请输入用户名");
			username = sc.next();
			// 用户名唯一
			// 先验证格式是否正确,在验证是否唯一
			// 用户名长度在3-15之间
			// 只能是字母加数字组合,不能是纯数字
			boolean flag1 = checkUsername(username);
			if (!flag1) {
				System.out.println("用户名不满足格式,需要重新录入");
				continue;
			}
			// 验证是否唯一
			// username集合中判断是否存在
			boolean flag2 = contains(list, username);
			if (flag2) {
				// 用户名存在
				System.out.println("用户名" + username + "已存在,请重新输出");
			} else {
				// 不存在
				System.out.println("用户名" + username + "可用");
				break;
			}
		}
		// 录入密码
		// 密码输入两次,两次一致才能进行注册
		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;
			}
		}

		// 录入身份证号码
		// 长度18位
		// 不能以0开头
		// 前17位必须是数字
		// 最后以为可以是X
		while (true) {
			System.out.println("请输入身份证号码");
			personID = sc.next();
			boolean flag = checkPersonID(personID);
			if (flag) {
				System.out.println("身份证号码满足要求!");
				break;
			} else {
				System.out.println("身份证号码格式有误!请重新输入");
				continue;
			}
		}

		// 录入手机号码
		// 长度11位
		// 不能以0开头
		// 必须是数字
		while (true) {
			System.out.println("请输入手机号码");
			PhoneNumber = sc.next();
			boolean flag = checkPhoneNumber(PhoneNumber);
			if (flag) {
				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) {
		// TODO Auto-generated method stub
		for (int i = 0; i < list.size(); i++) {
			User user = list.get(i);
			System.out.println(user.getUsername() + "," + user.getPassword() + "," + user.getPersonID() + ","
					+ user.getPhoneNumbwe());
		}
	}

	private static boolean checkPhoneNumber(String phoneNumber) {
		// TODO Auto-generated method stub
		// 长度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;
			}
		}
		// 都满足
		return true;
	}

	private static boolean checkPersonID(String personID) {
		// TODO Auto-generated method stub
		// 长度18位
		if (personID.length() != 18) {
			return false;
		}
		// 不能以0开头
		// 判断是否以0开头,是返回true 不是返回false
		boolean flag = personID.startsWith("0");
		if (flag) {
			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;
			}
		}
		char endChar = personID.charAt(personID.length() - 1);
		if (endChar >= '0' && endChar <= '9' || endChar == 'X' || endChar == 'x') {
			return true;
		} else {
			return false;
		}
	}

	private static boolean contains(ArrayList<User> list, String username) {
		// TODO Auto-generated method stub
		// 循环遍历集合,进行比较
		for (int i = 0; i < list.size(); i++) {
			User user = list.get(i);
			String rightUsername = user.getUsername();
			if (rightUsername.equals(username)) {
				return true;
			}
		}
		// 循环结束,满足
		return false;
	}

	private static boolean checkUsername(String username) {
		// TODO Auto-generated method stub
		// 用户名长度在3-15之间
		int ten = username.length();
		if (ten < 3 || ten > 15) {
			return false;
		}
		// 只能是字母加数字组合
		// 循环username里面每一个字符,如果有一个字符或数字,返回false
		for (int i = 0; i < username.length(); 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++) {
			char c = username.charAt(i);
			if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
				count++;
				break;
			}
		}

		return count > 0;
	}

	// 忘记密码
	private static void gorgetPassword(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);
		// 比较手机号码,身份证号码是否一样
		if (!(user.getPersonID().equalsIgnoreCase(personID) && user.getPhoneNumbwe().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) {
		// TODO Auto-generated method stub
		for (int i = 0; i < list.size(); i++) {
			User user = list.get(i);
			if (user.getUsername().equals(username)) {
				return i;
			}
		}
		return 0;
	}

	// 验证码
	// 长度为5
	// 由4位大写或者小写字母和1位数字组成,同一个字母可以重复
	// 数字可以出现在任何位置
	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 index = r.nextInt(list.size());
			// 利用随机索引获取随机字符
			char c = list.get(index);
			// 把随机字符添加到sb中
			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[randomIndex];
		arr[randomIndex] = arr[arr.length - 1];
		arr[arr.length - 1] = temp;
		return new String(arr);
	}
}

class User {
	private String username;
	private String password;
	private String personID;
	private String phoneNumbwe;

	public User(String username, String password, String personID, String phoneNumbwe) {
		super();
		this.username = username;
		this.password = password;
		this.personID = personID;
		this.phoneNumbwe = phoneNumbwe;
	}

	public User() {
		super();
	}

	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 getPhoneNumbwe() {
		return phoneNumbwe;
	}

	public void setPhoneNumbwe(String phoneNumbwe) {
		this.phoneNumbwe = phoneNumbwe;
	}
}

class StudentSystem {
	public void startStudent() {
		ArrayList<Student> list = new ArrayList<>();
		loop: while (true) {
			System.out.println("------------欢迎来到学生管理系统------------");
			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.next();
			// if (choose.equals("1")) {
			//
			// } else if (choose.equals("2")) {
			//
			// } else if (choose.equals("3")) {
			//
			// } else if (choose.equals("4")) {
			//
			// } else if (choose.equals("5")) {
			// System.out.println("退出成功,欢迎下次再来");
			// break;
			// } else {
			// System.out.println("没有这个选项");
			// }
			switch (choose) {
			case "1":
				addStudent(list);
				break;
			case "2":
				deletStudent(list);
				break;
			case "3":
				updateStudent(list);
				break;
			case "4":
				queryStudent(list);
				break;
			case "5": {
				System.out.println("退出成功,欢迎下次再来");
				// break loop;
				System.exit(0);// 停止虚拟机运行
			}
			}
		}
	}

	// 添加学生
	public static void addStudent(ArrayList<Student> list) {
		// 利用空参构造先创建学生对象
		Student s = new Student();

		Scanner sc = new Scanner(System.in);
		String id = null;
		while (true) {
			System.out.println("请输入学生id");
			id = sc.next();
			boolean flag = contains(list, id);
			if (flag) {
				System.out.println("id已经存在,请重新录入");
			} else {
				s.setId(id);
				break;
			}
		}

		System.out.println("请输入学生姓名");
		String name = sc.next();
		s.setName(name);

		System.out.println("请输入学生年龄");
		int age = sc.nextInt();
		s.setAge(age);

		System.out.println("请输入学生家庭住址");
		String address = sc.next();
		s.setAddress(address);

		// 把学生对象添加到集合中
		list.add(s);
		// 提示用户
		System.out.println("学生信息添加成功");

	}

	// 删除学生
	public static void deletStudent(ArrayList<Student> list) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入要删除的学生id");
		String id = sc.next();

		int index = getId(list, id);
		// 对index判断
		// >=0,存在,直接删除

		if (index >= 0) {
			list.remove(index);
			System.out.println("id为" + id + "的学生删除成功");
		} else {
			// 如果-1,表示不存在,返回出事菜单
			System.out.println("id不存在,删除失败");
		}
	}

	// 修改学生
	public static void updateStudent(ArrayList<Student> list) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入要修改的学生id");
		String id = sc.next();

		int index = getId(list, id);
		if (index == -1) {
			System.out.println("要修改的id" + id + "不存在,请重新输入");
			return;
		}
		// id存在
		// 获取要修改的学生对象
		Student stu = list.get(index);
		System.out.println("请输入要修改的学生姓名");
		String newName = sc.next();
		stu.setName(newName);

		System.out.println("请输入要修改的学生年龄");
		int newAge = sc.nextInt();
		stu.setAge(newAge);

		System.out.println("请输入要修改的学生家庭住址");
		String newAddress = sc.next();
		stu.setAddress(newAddress);

		System.out.println("学生信息修改成功!");

	}

	// 查询学生
	public static void queryStudent(ArrayList<Student> list) {
		if (list.size() == 0) {
			System.out.println("当前无学生信息,请添加后在查询!");
			return;
		}
		// 打印表头信息
		System.out.println("id\t姓名\t年龄\t家庭住址");
		for (int i = 0; i < list.size(); i++) {
			Student stu = list.get(i);
			System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress());
		}
	}

	// 判断id是否已经存在
	public static boolean contains(ArrayList<Student> list, String id) {
		// 循环遍历
		// for (int i = 0; i < list.size(); i++) {
		// // 拿到学生对象后,获取id并进行判断
		// Student stu = list.get(i);
		// String sid = stu.getId();
		// if (sid.equals(id)) {
		// return true;
		// }
		// }
		// return false;
		return getId(list, id) >= 0;
	}

	// 通过id获取索引
	public static int getId(ArrayList<Student> list, String id) {
		// 遍历集合
		for (int i = 0; i < list.size(); i++) {
			// 得到每一个学生对象
			Student stu = list.get(i);
			// 得到每一个学生对象的id
			String sid = stu.getId();
			// 集合中的学生id和要删除的学生id进行比较
			if (sid.equals(id)) {
				// 如果一样就返回索引
				return i;
			}
		}
		// 不存在,返回不存在的索引
		return -1;

	}
}

class Student {
	private String id;
	private String name;
	private int age;
	private String address;

	public Student(String id, String name, int age, String address) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.address = address;
	}

	public Student() {
		super();
	}

	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 getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

结果:

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer1.0-预热

一.Encoder encoder:译为编码器&#xff0c;负责将输入序列压缩成指定长度的向量&#xff0c;这个向量就可以堪称是这个序列的语义。然后可进行编码或特征提取等操作 在transformer中encoder由6个相同的层组成&#xff0c;每个层包含 Multi-Head Self-AttentionPosition-Wise …

SEO 链接建设:初学者指南 2023

链接在互联网上扮演着一种宝贵的角色&#xff0c;就像货币一样重要。当其他网页纷纷指向某个网页时&#xff0c;这个网页就会被视为很有"权威"&#xff0c;在搜索引擎&#xff08;比如谷歌&#xff09;中获得更高的排名。相反地&#xff0c;如果一个网页没有别的网页…

linuxARM裸机学习笔记(6)----UART串口通信和串口格式化函数移植实验

UART串口通信 协议介绍&#xff1a;串口通信协议_ft232和ch340是串口的哪种协议_夜路难行々的博客-CSDN博客 I.MX6U UART UART时钟源选择的是pll3_80m&#xff0c;然后在(bit5:0)设置分频值&#xff0c;设置为1分频 ADBR(bit14) &#xff1a;自动波特率检测使能位&#xff0c…

个人信息保护合规审计管理办法的发展方向

8月3日&#xff0c;为指导、规范个人信息保护合规审计活动&#xff0c;中央网信办就《个人信息保护合规审计管理办法》及配套的《个人信息保护合规审计参考要点》公开征求意见 个人信息保护合规审计参考要点 第一条 本要点依据《中华人民共和国个人信息保护法》等法律、行政法…

基于Spring Boot的在线视频教育培训网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的在线视频教育培训网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

zabbix触发器标签提取监控项子字符串实现对应告警恢复

0 实验环境 zabbix 6.0 1 监控项 1.1 监控项设置 通过zabbix agent自定义监控项&#xff0c;读取某文件内容模拟日志/trap告警&#xff0c;测试获取触发器标签中提取子字符串功能&#xff0c;以及相同标签的触发器自动恢复功能。 1.2 手工运行 手动触发之后&#xff0c;模…

嵌入式开发学习(STC51-17-DAC数模转换)

内容 使DAC(PWM)模块上的指示灯DA1呈呼吸灯效果&#xff0c;由暗变亮再由亮变暗&#xff1b; DAC介绍 简介 DAC&#xff08;Digital to analog converter&#xff09;即数字模拟转换器&#xff0c;它可以将数字信号转换为模拟信号&#xff0c;它的功能与ADC相反&#xff1b…

【Java设计模式】建造者模式 注解@Builder

概念 将一个复杂对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示。它使将一个复杂的对象分解成多个简单的对象&#xff0c;然后一步步构建而成。 每一个具体建造者都相对独立&#xff0c;而与其它的具体建造者无关&#xff0c;因此可以很方便地替换具…

【HDFS】每天一个RPC系列----complete(二):客户端侧

上图给出了最终会调用到complete RPC的客户端侧方法链路(除去Router那条线了)。 org.apache.hadoop.hdfs.DFSOutputStream#completeFile(org.apache.hadoop.hdfs.protocol.ExtendedBlock): 下面这个方法在complete rpc返回true之前,会进行重试,直到超过最大重试次数抛异…

解决Element Plus中Select在El Dialog里层级过低的问题(修改select选项框样式)

Element Plus是Vue.js的一套基于Element UI的组件库&#xff0c;提供了丰富的组件用于构建现代化的Web应用程序。其中&#xff0c;<el-select>是一个常用的下拉选择器组件&#xff0c;但在某些情况下&#xff0c;当<el-select>组件嵌套在<el-dialog>&#xf…

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…

Oracle-ORA-00600:[ktspffbmb:objdchk_kcbnew_3]

问题背景: 应用执行存储过程报错ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4], [], [], [], [], [], [], [], []&#xff0c;导致过程无法正常执行 ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4]…

关联字典表查询记录

字典表 也可以case gender when xxx then xxx when xxx then xxx end 别名 注意前面case别忘了 重新编辑了下 字典表 key value更加合理点吧 嘿嘿

【计算机视觉】关于图像处理的一些基本操作

目录 图像平滑滤波处理均值滤波计算过程python实现 高斯滤波计算过程python实现 中值滤波计算过程python实现 图像的边缘检测Robert算子计算过程python实现 图像处理腐蚀算子计算过程python实现 Hog&#xff08;梯度方向直方图&#xff09;特征计算流程&#xff1a;Hog的特征维…

数据库操作系列-Mysql, Postgres常用sql语句总结

文章目录 1.如果我想要写一句sql语句&#xff0c;实现 如果存在则更新&#xff0c;否则就插入新数据&#xff0c;如何解决&#xff1f;MySQL数据库实现方案: ON DUPLICATE KEY UPDATE写法 Postgres数据库实现方案:方案1&#xff1a;方案2&#xff1a;关于更新&#xff1a;如何实…

【项目多人协作的困扰】git-cli 解决 git merge 合并时 lock 文件变化,忘记重新安装依赖的问题

项目多人协作的困扰 相信大家多多少少都遇到过&#xff0c;当主线分支的代码&#xff0c;合入到自己的分支的时候&#xff0c;如果这时候&#xff0c;主线中有一些依赖的更新或者添加或者删除&#xff0c;如果合入之后&#xff0c;没有及时的install的话&#xff0c;项目启动的…

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

diffusion model(六)Dalle2技术小结

Dalle2 技术小结 文章目录 Dalle2 技术小结系列阅读背景Dalle2的总体架构DiffusionPrior模块训练阶段推理阶段 DiffusionDecode 模块 Dalle2的生成质量和目前的局限性Dalle2的生成效果基于MS-COCO caption生成效果Other Dalle2的局限性 参考文献 系列阅读 diffusion model&…

Ubuntu服务器ELK部署与实践

文章目录 1. Docker安装2. 拉镜象2.1 ElastciSearch2.2 Kibana2.3 logstash 3. 数据展示 1. Docker安装 看之前的文章 docker ubuntu完全卸载docker及再次安装 Ubuntu安装 Docker 此外&#xff0c;Docker偶尔会出现这种问题dial tcp: lookup registry-1.docker.io on 192.168.1…

ICMP 理解

icmp 差错报告机制&#xff0c;tcp/ip协议族中重要的子协议&#xff0c;通常被ip层或者更高的&#xff08;tcp/udp&#xff09;使用&#xff0c;&#xff0c;属于网络层协议&#xff0c;主要用于在ip主机和路由器之间传递控制消息&#xff0c;用于报告主机是否可达、路由是否可…