简单的Java_Swing小项目

Swing小项目

无需任何额外配置,直接可以在eclipse用

非常简单的文件结构
在这里插入图片描述

简单的登录界面
在这里插入图片描述

进去后就大概是这么个样子
在这里插入图片描述
很久以前写的了,我就不一一打开展示了。内容和无UI版本差不多,只是用简单的Swing实现了界面化操作

数据是可以保存在根目录下的data.bat文件中,退出重新登录,之前录入的数据也是存在的。

Main.java

package swing;import javax.swing.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;public class Main {private static final String FILE_PATH = "data.dat";//static修饰符表示变量FILE_PATH是类级别的,而不是实例(对象)级别的。即不需要创建Main类的对象就可以访问FILE_PATH,否则需要通过Main类的对象来访问,final修饰符表示变量初始化后就无法更改private static List<Course> courseList = new ArrayList<>();private static List<Teacher> teacherList = new ArrayList<>();private static List<Student> studentList = new ArrayList<>();public static void main(String[] args) {loadData();SwingUtilities.invokeLater(() -> {new LoginFrame();});} public static void loadData() {try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.dat"))) {courseList = (List<Course>) ois.readObject();//读取是反序列化的过程,将文件存储的字节流提取出来还原到对象中teacherList = (List<Teacher>) ois.readObject();studentList = (List<Student>) ois.readObject();JOptionPane.showMessageDialog(null, "Data loaded successfully.");} catch (EOFException e) {JOptionPane.showMessageDialog(null, "Data file not found, initializing default data.");} catch (Exception e) {e.printStackTrace();}}public static void saveData() {try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.dat"))) {oos.writeObject(courseList);//写入是序列化的过程,将数据转化为字节流的形式存储起来oos.writeObject(teacherList);oos.writeObject(studentList);JOptionPane.showMessageDialog(null, "Data saved successfully.");} catch (Exception e) {e.printStackTrace();}}public static List<Course> getCourseList() {return courseList;}public static List<Teacher> getTeacherList() {return teacherList;}public static List<Student> getStudentList() {return studentList;}
}

AdminMenu.java

package swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Comparator;public class AdminMenu extends JFrame {public AdminMenu() {setTitle("管理员菜单");setSize(600, 400); // 调整窗口大小setLayout(new GridLayout(8, 1));JButton addCourseButton = new JButton("添加课程");JButton deleteCourseButton = new JButton("删除课程");JButton sortCoursesButton = new JButton("按照选课人数排序");JButton modifyTeacherButton = new JButton("修改授课教师");JButton restorePasswordsButton = new JButton("恢复密码");JButton viewListsButton = new JButton("查看课程、教师和学生列表");JButton addTeacherButton = new JButton("添加教师");JButton addStudentButton = new JButton("添加学生");JButton deleteTeacherButton = new JButton("删除教师");JButton deleteStudentButton = new JButton("删除学生");add(addCourseButton);add(deleteCourseButton);add(sortCoursesButton);add(modifyTeacherButton);add(restorePasswordsButton);add(viewListsButton);add(addTeacherButton);add(addStudentButton);add(deleteTeacherButton);add(deleteStudentButton);addCourseButton.addActionListener(e -> addCourse());deleteCourseButton.addActionListener(e -> deleteCourse());sortCoursesButton.addActionListener(e -> sortCourses());modifyTeacherButton.addActionListener(e -> modifyTeacher());restorePasswordsButton.addActionListener(e -> restorePasswords());viewListsButton.addActionListener(e -> viewLists());addTeacherButton.addActionListener(e -> addTeacher());addStudentButton.addActionListener(e -> addStudent());deleteTeacherButton.addActionListener(e -> deleteTeacher());deleteStudentButton.addActionListener(e -> deleteStudent());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}private void addCourse() {String courseName = JOptionPane.showInputDialog("输入课程名称:");String isMandatoryInput = JOptionPane.showInputDialog("输入是否为必修课 (yes/no):");boolean isMandatory = isMandatoryInput.equalsIgnoreCase("yes");Teacher selectedTeacher = (Teacher) JOptionPane.showInputDialog(null, "选择任课教师:", "添加课程", JOptionPane.QUESTION_MESSAGE, null, Main.getTeacherList().toArray(), Main.getTeacherList().get(0));Course newCourse = new Course(courseName, isMandatory, selectedTeacher);if (!isMandatory) {String maxEnrollmentInput = JOptionPane.showInputDialog("输入最大选课人数:");newCourse.maxEnrollment = Integer.parseInt(maxEnrollmentInput); // 仅对选修课设置最大人数}Main.getCourseList().add(newCourse);Main.saveData();JOptionPane.showMessageDialog(this, "课程添加成功");}private void deleteCourse() {String courseName = JOptionPane.showInputDialog("输入要删除的课程名称:");Main.getCourseList().removeIf(course -> course.getName().equals(courseName));Main.saveData();JOptionPane.showMessageDialog(this, "课程删除成功");}private void sortCourses() {Main.getCourseList().sort(Comparator.comparingInt(Course::getCurrentEnrollment).reversed());JOptionPane.showMessageDialog(this, "课程已按选课人数排序");}private void modifyTeacher() {String teacherName = JOptionPane.showInputDialog("输入教师用户名:");String newCourseName = JOptionPane.showInputDialog("输入新的课程名称:");// 修改授课教师的逻辑// 这里可以扩展,以便选择具体的课程和教师进行修改JOptionPane.showMessageDialog(this, "授课教师修改成功");}private void restorePasswords() {for (Teacher teacher : Main.getTeacherList()) {teacher.changePassword("123456");}for (Student student : Main.getStudentList()) {student.changePassword("123456");}Main.saveData();JOptionPane.showMessageDialog(this, "所有密码已恢复为初始密码");}private void viewLists() { StringBuilder list = new StringBuilder("课程列表:\n");for (Course course : Main.getCourseList()) {String courseType = course.getCourseType(); // 获取课程类型String teacherName = course.getTeacher().getUsername(); // 获取任课教师String enrollmentInfo = course.isMandatory() ? "" : ", 选课人数: " + course.getCurrentEnrollment() + "/" + course.getMaxEnrollment();list.append(String.format("课程名称: %s, 类型: %s, 任课教师: %s%s\n", course.getName(), courseType, teacherName, enrollmentInfo));}list.append("教师列表:\n");for (Teacher teacher : Main.getTeacherList()) {list.append(teacher.getUsername()).append("\n");}list.append("学生列表:\n");for (Student student : Main.getStudentList()) {list.append(student.getUsername()).append("\n");}JOptionPane.showMessageDialog(this, list.toString());}private void addTeacher() {String teacherName = JOptionPane.showInputDialog("输入教师用户名:");String teacherPassword = "123456"; // 默认密码Teacher newTeacher = new Teacher(teacherName, teacherPassword);Main.getTeacherList().add(newTeacher);Main.saveData();JOptionPane.showMessageDialog(this, "教师添加成功");}private void addStudent() {String studentName = JOptionPane.showInputDialog("输入学生用户名:");String studentPassword = "123456"; // 默认密码Student newStudent = new Student(studentName, studentPassword);Main.getStudentList().add(newStudent);Main.saveData();JOptionPane.showMessageDialog(this, "学生添加成功");}private void deleteTeacher() {String teacherName = JOptionPane.showInputDialog("输入要删除的教师用户名:");Main.getTeacherList().removeIf(teacher -> teacher.getUsername().equals(teacherName));Main.saveData();JOptionPane.showMessageDialog(this, "教师删除成功");}private void deleteStudent() {String studentName = JOptionPane.showInputDialog("输入要删除的学生用户名:");Main.getStudentList().removeIf(student -> student.getUsername().equals(studentName));Main.saveData();JOptionPane.showMessageDialog(this, "学生删除成功");}
}

Course.java

package swing;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;public class Course implements Serializable {private static final long serialVersionUID = 1L;private String name;private boolean isMandatory; // true表示必修课protected int maxEnrollment; // 最大选课人数,选修课时有效private List<Student> enrolledStudents;private Teacher teacher;public Course(String name, boolean isMandatory, Teacher teacher) {this.name = name;this.isMandatory = isMandatory;this.enrolledStudents = new ArrayList<>();this.teacher = teacher;this.maxEnrollment = isMandatory ? Integer.MAX_VALUE : 30; // 选修课默认最大人数}public String getName() {return name;}public boolean isMandatory() {return isMandatory;}public int getCurrentEnrollment() {return enrolledStudents.size();}public List<Student> getEnrolledStudents() {return enrolledStudents;}public Teacher getTeacher() {return teacher;}public void enrollStudent(Student student) {if (isMandatory || enrolledStudents.size() < maxEnrollment) {enrolledStudents.add(student);}}public String getCourseType() {return isMandatory ? "必修课" : "选修课";}public int getMaxEnrollment() {return maxEnrollment;}
}

LoginFrame.java

package swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class LoginFrame extends JFrame {private static final long serialVersionUID = 1L; // 添加serialVersionUIDprivate JTextField usernameField;private JPasswordField passwordField;private JButton togglePasswordButton;public LoginFrame() {setTitle("登录");setSize(300, 150);setLayout(new GridLayout(3, 2));add(new JLabel("用户名:"));usernameField = new JTextField();add(usernameField);add(new JLabel("密码:"));passwordField = new JPasswordField();add(passwordField);togglePasswordButton = new JButton("显示密码");add(togglePasswordButton);JButton loginButton = new JButton("登录");add(loginButton);loginButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {login();}});// Add action listener for the buttontogglePasswordButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {togglePasswordVisibility();}});setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}private void togglePasswordVisibility() {// 检查密码框当前的回显字符模式if (passwordField.getEchoChar() == '\u0000') {  // '\u0000' 表示没有字符被回显(密码可见)passwordField.setEchoChar('*');  // 重置回显字符为 '*',隐藏密码togglePasswordButton.setText("显示密码");} else {passwordField.setEchoChar((char) 0);  // 设置回显字符为 0,使密码明文显示togglePasswordButton.setText("隐藏密码");}
}private void login() {String username = usernameField.getText();String password = new String(passwordField.getPassword());if (username.equals("admin") && password.equals("admin123")) {new AdminMenu();dispose();} else {// Check other user typesfor (Teacher teacher : Main.getTeacherList()) {if (teacher.getUsername().equals(username) && teacher.getPassword().equals(password)) {new TeacherMenu(teacher);dispose();return;}}for (Student student : Main.getStudentList()) {if (student.getUsername().equals(username) && student.getPassword().equals(password)) {new StudentMenu(student);dispose();return;}}JOptionPane.showMessageDialog(this, "用户名或密码错误");}}
}

Student.java

package swing;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;public class Student implements Serializable {private String username;private String password;private List<Course> selectedCourses; // 存储所选课程的列表public Student(String username, String password) {this.username = username;this.password = password;this.selectedCourses = new ArrayList<>(); // 初始化课程列表}// Getter方法public String getUsername() {return username;}public String getPassword() {return password;}public List<Course> getSelectedCourses() {return selectedCourses;}public void addCourse(Course course) {if (!selectedCourses.contains(course)) {selectedCourses.add(course);}}// 修改密码的方法public void changePassword(String newPassword) {this.password = newPassword;}// 重写 toString() 方法@Overridepublic String toString() {return username; // 返回学生的用户名}
}

StudentMenu.java

package swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class StudentMenu extends JFrame {private static final long serialVersionUID = 1L;private Student student;public StudentMenu(Student student) {this.student = student;setTitle("学生菜单");setSize(400, 300);setLayout(new GridLayout(4, 1));JButton changePasswordButton = new JButton("修改密码");JButton viewCoursesButton = new JButton("查看所上课程");JButton enrollButton = new JButton("选修课程");add(changePasswordButton);add(viewCoursesButton);add(enrollButton);changePasswordButton.addActionListener(e -> changePassword());viewCoursesButton.addActionListener(e -> viewCourses());enrollButton.addActionListener(e -> enrollCourse());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}private void changePassword() {String newPassword = JOptionPane.showInputDialog("输入新密码:");student.changePassword(newPassword);Main.saveData();JOptionPane.showMessageDialog(this, "密码已修改");}private void viewCourses() {StringBuilder courseList = new StringBuilder("所上课程:\n");// 添加必修课程for (Course course : Main.getCourseList()) {if (course.isMandatory()) {courseList.append(course.getName()).append(" - 任课教师: ").append(course.getTeacher().getUsername()).append("\n");}}// 添加选修课程for (Course course : student.getSelectedCourses()) {courseList.append(course.getName()).append(" - 任课教师: ").append(course.getTeacher().getUsername()).append("\n");}JOptionPane.showMessageDialog(this, courseList.toString());}private void enrollCourse() {String courseName = JOptionPane.showInputDialog("输入要选修的课程名称:");for (Course course : Main.getCourseList()) {if (course.getName().equals(courseName)) {// 验证选课人数if (course.isMandatory() || course.getCurrentEnrollment() < course.getMaxEnrollment()) {selectElectiveCourse(course);return;} else {JOptionPane.showMessageDialog(this, "课程已满");}}}JOptionPane.showMessageDialog(this, "课程不存在");}// 选修课程的方法private void selectElectiveCourse(Course course) {if (!course.isMandatory()) {student.addCourse(course); // 将选修课程添加到学生的课程列表中JOptionPane.showMessageDialog(this, "选修课程成功!");Main.saveData(); // 保存数据}}
}

Teacher.java

package swing;import java.io.Serializable;public class Teacher implements Serializable {private String username;private String password;public Teacher(String username, String password) {this.username = username;this.password = password;}// Getter方法public String getUsername() {return username;}public String getPassword() {return password;}// 修改密码的方法public void changePassword(String newPassword) {this.password = newPassword;}// 重写 toString() 方法@Overridepublic String toString() {return username; // 返回教师的用户名}
}

TeacherMenu.java

package swing;import javax.swing.*;
import java.awt.*;public class TeacherMenu extends JFrame {private static final long serialVersionUID = 1L;private Teacher teacher;public TeacherMenu(Teacher teacher) {this.teacher = teacher;setTitle("教师菜单");setSize(400, 300);setLayout(new GridLayout(5, 1)); // 增加一行JButton changePasswordButton = new JButton("修改密码");JButton viewCoursesButton = new JButton("查看所授课程");JButton viewStudentsButton = new JButton("查看上课学生");JButton viewCourseStudentsButton = new JButton("查看某门课程的学生");add(changePasswordButton);add(viewCoursesButton);add(viewStudentsButton);add(viewCourseStudentsButton);changePasswordButton.addActionListener(e -> changePassword());viewCoursesButton.addActionListener(e -> viewCourses());viewStudentsButton.addActionListener(e -> viewStudentsInCourses());viewCourseStudentsButton.addActionListener(e -> viewStudentsInSpecificCourse());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}private void changePassword() {String newPassword = JOptionPane.showInputDialog("输入新密码:");teacher.changePassword(newPassword);Main.saveData();JOptionPane.showMessageDialog(this, "密码已修改");}private void viewCourses() {StringBuilder mandatoryCourses = new StringBuilder("必修课:\n");StringBuilder electiveCourses = new StringBuilder("选修课:\n");for (Course course : Main.getCourseList()) {if (course.isMandatory()) {mandatoryCourses.append(String.format("课程名称: %s, 任课教师: %s\n", course.getName(), course.getTeacher().getUsername()));} else {electiveCourses.append(String.format("课程名称: %s, 任课教师: %s, 选课人数: %d/%d\n", course.getName(), course.getTeacher().getUsername(), course.getCurrentEnrollment(), course.getMaxEnrollment()));}}StringBuilder courseListDisplay = new StringBuilder();courseListDisplay.append(mandatoryCourses).append("\n").append(electiveCourses);JOptionPane.showMessageDialog(this, courseListDisplay.toString());}private void viewStudentsInCourses() {StringBuilder studentList = new StringBuilder("上课学生名单:\n");boolean hasCourses = false;for (Course course : Main.getCourseList()) {if (course.getTeacher().equals(teacher)) {hasCourses = true;studentList.append("课程: ").append(course.getName()).append("\n");for (Student student : course.getEnrolledStudents()) {studentList.append(" - ").append(student.getUsername()).append("\n");}}}if (!hasCourses) {studentList.append("该教师没有教授任何课程。");}JOptionPane.showMessageDialog(this, studentList.toString());}private void viewStudentsInSpecificCourse() {String courseName = JOptionPane.showInputDialog("输入课程名称:");StringBuilder studentList = new StringBuilder("学生名单:\n");boolean foundCourse = false;for (Course course : Main.getCourseList()) {if (course.getName().equals(courseName) && course.getTeacher().equals(teacher)) {foundCourse = true;for (Student student : course.getEnrolledStudents()) {studentList.append(student.getUsername()).append("\n");}break;}}if (!foundCourse) {studentList.append("没有找到该课程或该课程不属于您。");}JOptionPane.showMessageDialog(this, studentList.toString());}
}

module-info.java

module experiment_2 {requires java.desktop;
}

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

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

相关文章

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计&#xff08;SOH预测&#xff09;1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合&#xff0c;如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常&#xff0c;主要原因还…

Docker的镜像

目录 1. 镜像是什么&#xff1f;&#xff1f;2. 镜像命令详解2.1 镜像命令清单2.2 docker rmi命令2.3 docker save命令2.4 docker load命令2.5 docker history命令2.6 docker import命令2.7 docker image prune命令2.8 docker build命令 3. 镜像的操作4. 离线迁移镜像5. 镜像存…

Git版本控制工具--介绍及安装

1.Git的简介 Git是目前世界上最先进的的分布式控制系统&#xff08;没有之一&#xff09;。 很多人都知道&#xff0c;Linus在1991年创建了开源的Linux&#xff0c;从此&#xff0c;Linux系统不断发展&#xff0c;已经成为最大的服务器系统软件了。 Linus虽然创建了Linux&…

【OJ题解】面试题三步问题

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…

CTFHub解题笔记之Web信息泄露篇:11.HG泄露

1.题目描述 题目位置 网页显示 2.解题思路 ‌HG泄露是指Mercurial版本控制系统中的敏感信息被未经授权的个人或系统访问的情况。Mercurial&#xff08;翻译过来是水银&#xff0c;所以通常简称为HG&#xff09;是一种分布式版本控制系统&#xff0c;用于管理软件源代码或其…

linux网络编程 | c | 多线程并发服务器实现

多线程并发服务器 基于该视频完成 12-多线程并发服务器分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是&#xff0c;阻塞是真的阻塞了&#xff0c;而这个方式是一直在问有没有请求有没有请求 linux | c | 多进程并发服务器实现-CSDN博客 …

R语言——缺失值处理

目录 缺失数据 1 R中的缺失值 2查看缺失值is.na() 3 去除缺失值 1 R中的缺失值 在R中&#xff0c;NA代表缺失值&#xff0c;NA是不可用&#xff08;可能是0&#xff0c;可能是其他值&#xff0c;NA是未知的&#xff09;&#xff0c;notavailable的简称&#xff0c;用来存储…

快速上手:利用 FFmpeg 合并音频文件的实用教程

FFmpeg 是一个强大的多媒体处理工具&#xff0c;能够轻松地对音频、视频进行编辑和转换。本文将介绍如何使用 FFmpeg 来合并&#xff08;拼接&#xff09;多个音频文件为一个单一文件。无论您是想要创建播客、音乐混音还是其他任何形式的音频项目&#xff0c;这都是一个非常实用…

常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD

三层架构&#xff08;View Service Dao&#xff09; 三层架构是指&#xff1a;视图层 view&#xff08;表现层&#xff09;&#xff0c;服务层 service&#xff08;业务逻辑层&#xff09;&#xff0c;持久层 Dao&#xff08;数据访问层&#xff09; 表现层&#xff1a;直接跟前…

重庆轨道交通2号线建桥地铁站自动化监测

1. 项目概述 本次项目位于重庆市轨道交通2号线中大渡口区的建桥站&#xff0c;轨道交通2号线是重庆市首条开通运营的城市轨道交通&#xff0c;也是中国首条开通运营的跨座式单轨线路。建桥站为轨道交通2号线延长线中的一站&#xff0c;本站为高架侧式&#xff0c;临近恒大麓山…

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写&#xff0c;意为“最近最少使用”。它是一种常见的缓存淘汰策略&#xff0c;用于在缓存容量有限时&#xff0c;决定哪些数据需要被删…

噪杂环境(房车改装市场)离线语音通断器模块

一直在坚持&#xff0c;却很难有机会上热门&#xff0c;在现在这个以流量为导向的时代&#xff0c;貌似很难靠所谓的坚守和热爱把产品成功的推向市场了。目前的客户仍然是以老客户为主&#xff0c;应用场景主要是房车改装&#xff0c;根据九客户的需求定制化一些模块。因为没有…

Rust之抽空学习系列(四)—— 编程通用概念(下)

Rust之抽空学习系列&#xff08;四&#xff09;—— 编程通用概念&#xff08;下&#xff09; 1、函数 函数用来对功能逻辑进行封装&#xff0c;能够增强复用、提高代码的可读 以下是函数的主要组成部分&#xff1a; 名称参数返回类型函数体 1.1、函数名称 在Rust中&…

深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等

光猫IPv6设置后的效果对比图&#xff1a; 修改前&#xff1a; 修改后&#xff1a; 一、DNS来源 1. 网络连接 来源&#xff1a; 从上游网络&#xff08;如运营商&#xff09;获取 IPv6 DNS 信息&#xff0c;通过 PPPoE 或 DHCPv6 下发。 特点&#xff1a; DNS 服务器地址直…

【Vue3】前端使用 FFmpeg.wasm 完成用户视频录制,并对视频进行压缩处理

强烈推荐这篇博客&#xff01;非常全面的一篇文章&#xff0c;本文是对该博客的简要概括和补充&#xff0c;在不同技术栈中提供一种可行思路&#xff0c;可先阅读该篇文章再阅读本篇&#xff1a; FFmpeg——在Vue项目中使用FFmpeg&#xff08;安装、配置、使用、SharedArrayBu…

聊一下前端常见的图片格式

1. JPEG (JPG) 概述&#xff1a;是一种有损压缩的图像格式&#xff0c;它通过去除图像中一些人类视觉不易察觉的细节来减小文件大小。它支持数百万种颜色&#xff0c;能够很好地呈现照片等色彩丰富的图像内容。优点&#xff1a; 压缩率高&#xff1a;可以在保持相对较好的图像…

【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现快速排序算法。 测试说明 平台会对你编写的代码进行测试&#xff1a; 测试输入示例&#xff1a; 10 6 8 7 9 0 1 3 2 4 5 (说明&#xff1a;第一行是元素个数&a…

企业级包管理器之 monorepomultirepo (8)

在企业级项目开发中&#xff0c;面对多个项目的管理&#xff0c;monorepo 和 multirepo 是两种常见的代码管理方案&#xff0c;它们各有特点与优劣&#xff0c;下面我们来详细了解一下。 一、基本概念 monorepo&#xff1a;“mono”在英语中有“单一的、单独的”之意&#xf…

【electron】electron forge + vite + vue + electron-release-server 自动更新客户端

基本信息 electron forge vue页面&#xff08;中文&#xff09;&#xff1a;https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面&#xff08;英文&#xff0c;中文版下面的tab无法点击&#xff09;&#xff1a;https://www.electronfor…