java实训 | 低配版模拟火车订票系统

代码: 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;public class TrainBookingSystem {private JFrame frame;private JPanel loginPanel, mainPanel;private JTextField usernameField;private JPasswordField passwordField; // 改为JPasswordFieldprivate JTextField departureField, destinationField;private JButton searchButton;private List<Train> trainList;private List<Order> paidOrders;private List<Order> waitingListOrders;private List<Order> myTickets;private JPanel paidPanel, waitingListPanel, myTicketsPanel;public TrainBookingSystem() {frame = new JFrame("12306 Train Booking System");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(800, 600);createLoginInterface();initTrainData();paidOrders = new ArrayList<>();waitingListOrders = new ArrayList<>();myTickets = new ArrayList<>();}private void createLoginInterface() {loginPanel = new JPanel(new BorderLayout());loginPanel.add(createWelcomeLabel(), BorderLayout.NORTH);JPanel authPanel = new JPanel(new GridBagLayout());GridBagConstraints constraints = new GridBagConstraints();constraints.insets = new Insets(10, 5, 10, 5);constraints.fill = GridBagConstraints.HORIZONTAL;constraints.gridx = 0;constraints.gridy = 0;authPanel.add(new JLabel("账号:"), constraints);constraints.gridx = 1;authPanel.add(usernameField = new JTextField(30), constraints);constraints.gridx = 0;constraints.gridy = 1;authPanel.add(new JLabel("密码:"), constraints);constraints.gridx = 1;authPanel.add(passwordField = new JPasswordField(30), constraints);JButton loginButton = new JButton("登录");loginButton.addActionListener(e -> login());constraints.gridx = 0;constraints.gridy = 2;constraints.gridwidth = 2; // 按钮横跨两列authPanel.add(loginButton, constraints); // 移除多余的参数loginPanel.add(authPanel, BorderLayout.CENTER);frame.setContentPane(loginPanel);frame.setLocationRelativeTo(null);frame.setVisible(true);}private JLabel createWelcomeLabel() {JLabel welcomeLabel = new JLabel("欢迎使用12306订票系统");Font font = new Font("SansSerif", Font.BOLD, 24);welcomeLabel.setFont(font);welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);return welcomeLabel;}private void login() {String username = usernameField.getText();char[] passwordChars = passwordField.getPassword();String password = new String(passwordChars);if (!username.isEmpty() && !password.isEmpty()) {// 登录逻辑frame.setContentPane(createMainInterface());frame.revalidate();frame.repaint();} else {JOptionPane.showMessageDialog(frame, "请输入账号和密码!");}}private JPanel createMainInterface() {mainPanel = new JPanel(new BorderLayout());// 左侧面板JPanel leftPanel = new JPanel(new BorderLayout());leftPanel.setPreferredSize(new Dimension((int)(frame.getWidth() * 0.75), frame.getHeight()));leftPanel.setBorder(BorderFactory.createTitledBorder("车票查询"));JPanel inputPanel = new JPanel(new GridBagLayout());GridBagConstraints gbc = new GridBagConstraints();gbc.anchor = GridBagConstraints.WEST;gbc.insets = new Insets(10, 5, 10, 5);gbc.gridx = 0;gbc.gridy = 0;inputPanel.add(new JLabel("始发站:"), gbc);gbc.gridx = 1;gbc.gridwidth = 2;inputPanel.add(departureField = new JTextField(30), gbc);gbc.gridx = 0;gbc.gridy = 1;inputPanel.add(new JLabel("终点站:"), gbc);gbc.gridx = 1;inputPanel.add(destinationField = new JTextField(30), gbc);searchButton = new JButton("车次查询");searchButton.addActionListener(e -> showTrainList());gbc.gridx = 0;gbc.gridy = 2;gbc.gridwidth = 3;inputPanel.add(searchButton, gbc);leftPanel.add(inputPanel, BorderLayout.CENTER);// 右侧面板JPanel rightPanel = new JPanel(new GridLayout(3, 1)); // 3行1列的网格布局rightPanel.setPreferredSize(new Dimension(frame.getWidth() / 4, frame.getHeight()));rightPanel.setBorder(BorderFactory.createTitledBorder("个人订单查询"));// 初始化面板并添加到右侧面板paidPanel = new JPanel(new FlowLayout());waitingListPanel = new JPanel(new FlowLayout());myTicketsPanel = new JPanel(new FlowLayout());// 订单管理按钮初始化并添加到右侧面板JButton paidOrdersButton = new JButton("已支付");paidOrdersButton.addActionListener(e -> showOrders(paidOrders));rightPanel.add(paidOrdersButton, BorderLayout.NORTH);// 注意:需要将候补订单按钮添加到面板上JButton waitingListOrdersButton = new JButton("候补订单");waitingListOrdersButton.addActionListener(e -> showOrders(waitingListOrders));// 将候补订单按钮添加到rightPanel中rightPanel.add(waitingListOrdersButton, BorderLayout.CENTER);JButton myTicketsButton = new JButton("本人车票");myTicketsButton.addActionListener(e -> showOrders(myTickets));rightPanel.add(myTicketsButton, BorderLayout.SOUTH);rightPanel.add(new JLabel(" "), BorderLayout.CENTER);mainPanel.add(leftPanel, BorderLayout.CENTER);mainPanel.add(rightPanel, BorderLayout.EAST);// 初始订单显示更新updateOrderDisplays();return mainPanel;}private void showOrders(List<Order> orders) {if (orders.isEmpty()) {JOptionPane.showMessageDialog(frame, "当前没有订单!");} else {String message = "订单信息:\n";for (Order order : orders) {message += order.toString() + "\n";}JOptionPane.showMessageDialog(frame, message, "订单列表", JOptionPane.INFORMATION_MESSAGE);}}private void showTrainList() {JDialog dialog = new JDialog(frame, "车次列表", true);dialog.setLayout(new BorderLayout());dialog.setSize(400, 300);JPanel trainInfoPanel = new JPanel(new GridLayout(trainList.size(), 1));for (Train train : trainList) {JPanel trainPanel = new JPanel(new BorderLayout());JButton bookButton = new JButton("订票");JButton waitlistButton = new JButton("候补");waitlistButton.setVisible(false);bookButton.addActionListener(evt -> {if (train.book()) {addOrder(train, true); // 订票成功JOptionPane.showMessageDialog(frame, "订票成功!");dialog.dispose();} else {waitlistButton.setVisible(true);}});waitlistButton.addActionListener(evt -> {addOrder(train, false); // 候补票JOptionPane.showMessageDialog(frame, "候补成功!");dialog.dispose();});trainPanel.add(new JLabel(train.getTrainNumber() + " - " + train.getDepartureTime() + " - 剩余票数:" + train.getRemainingSeats()), BorderLayout.CENTER);JPanel buttonPanel = new JPanel(new FlowLayout());buttonPanel.add(bookButton);buttonPanel.add(waitlistButton);trainPanel.add(buttonPanel, BorderLayout.EAST);trainInfoPanel.add(trainPanel);}JScrollPane scrollPane = new JScrollPane(trainInfoPanel);dialog.add(scrollPane, BorderLayout.CENTER);dialog.setLocationRelativeTo(frame);dialog.setVisible(true);}private void addOrder(Train train, boolean isPaid) {Order order = new Order(train, isPaid);if (isPaid) {paidOrders.add(order);myTickets.add(order);} else {waitingListOrders.add(order);}updateOrderDisplays();}private void updateOrderDisplays() {// 此处不再需要removeAll,因为面板已经初始化paidPanel.removeAll();waitingListPanel.removeAll();myTicketsPanel.removeAll();// 直接添加订单信息for (Order order : paidOrders) {paidPanel.add(new JLabel(order.toString()));}for (Order order : waitingListOrders) {waitingListPanel.add(new JLabel(order.toString()));}for (Order order : myTickets) {myTicketsPanel.add(new JLabel(order.toString()));}paidPanel.repaint();waitingListPanel.repaint();myTicketsPanel.repaint();}private void initTrainData() {trainList = new ArrayList<>();trainList.add(new Train("G123", "08:00", 150));trainList.add(new Train("G124", "09:30", 100));trainList.add(new Train("G125", "11:00", 200));trainList.add(new Train("G126", "13:00", 0));trainList.add(new Train("G127", "15:00", 75));}class Train {private String trainNumber;private String departureTime;private int remainingSeats;public Train(String trainNumber, String departureTime, int remainingSeats) {this.trainNumber = trainNumber;this.departureTime = departureTime;this.remainingSeats = remainingSeats;}public String getTrainNumber() {return trainNumber;}public String getDepartureTime() {return departureTime;}public int getRemainingSeats() {return remainingSeats;}public boolean book() {if (remainingSeats > 0) {remainingSeats--;return true;}return false;}}class Order {private Train train;private boolean isPaid;public Order(Train train, boolean isPaid) {this.train = train;this.isPaid = isPaid;}@Overridepublic String toString() {return isPaid ? "已支付: " + train.getTrainNumber() + " " + train.getDepartureTime() :"候补: " + train.getTrainNumber() + " " + train.getDepartureTime();}}public static void main(String[] args) {new TrainBookingSystem();}
}

代码注释:

// 导入Swing库,用于创建图形用户界面  
import javax.swing.*;   
// 导入AWT库,包含用于构建图形用户界面和图像、字体、颜色等资源的类  
import java.awt.*;   
// 导入AWT的事件处理库,用于处理如按钮点击等用户事件  
import java.awt.event.ActionEvent;   
// 导入Java的集合库,用于创建列表  
import java.util.ArrayList;   
import java.util.List;   // 定义一个名为TrainBookingSystem的公共类,代表火车订票系统  
public class TrainBookingSystem {   // 声明多个私有成员变量,分别用于存储框架、面板、文本字段、按钮、火车列表和订单列表等  private JFrame frame;   private JPanel loginPanel, mainPanel;   private JTextField usernameField;   private JPasswordField passwordField; // 改用JPasswordField来更安全地处理密码输入  private JTextField departureField, destinationField;   private JButton searchButton;   private List<Train> trainList;   private List<Order> paidOrders;   private List<Order> waitingListOrders;   private List<Order> myTickets;   private JPanel paidPanel, waitingListPanel, myTicketsPanel;   // 构造函数,用于初始化系统  public TrainBookingSystem() {   // 创建框架并设置其标题、关闭操作和大小  frame = new JFrame("12306 Train Booking System");   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setSize(800, 600);   // 创建登录界面  createLoginInterface();   // 初始化火车数据  initTrainData();   // 初始化订单列表  paidOrders = new ArrayList<>();   waitingListOrders = new ArrayList<>();   myTickets = new ArrayList<>();   }   // 创建一个登录界面的方法  private void createLoginInterface() {   // 创建一个布局为BorderLayout的面板  loginPanel = new JPanel(new BorderLayout());   // 添加欢迎标签到面板的北部  loginPanel.add(createWelcomeLabel(), BorderLayout.NORTH);   // 创建一个用于账号和密码输入的面板,布局为GridBagLayout  JPanel authPanel = new JPanel(new GridBagLayout());   GridBagConstraints constraints = new GridBagConstraints();   // 设置GridBagConstraints对象,用于指定组件在GridBagLayout中的位置和填充方式  constraints.insets = new Insets(10, 5, 10, 5);   constraints.fill = GridBagConstraints.HORIZONTAL;   // 添加账号标签和文本字段到authPanel  constraints.gridx = 0;   constraints.gridy = 0;   authPanel.add(new JLabel("账号:"), constraints);   constraints.gridx = 1;   authPanel.add(usernameField = new JTextField(30), constraints);   // 添加密码标签和密码字段到authPanel  constraints.gridx = 0;   constraints.gridy = 1;   authPanel.add(new JLabel("密码:"), constraints);   constraints.gridx = 1;   authPanel.add(passwordField = new JPasswordField(30), constraints);   // 创建一个登录按钮并为其添加点击事件监听器  JButton loginButton = new JButton("登录");   loginButton.addActionListener(e -> login());   // 将登录按钮添加到authPanel,横跨两列  constraints.gridx = 0;   constraints.gridy = 2;   constraints.gridwidth = 2;   authPanel.add(loginButton, constraints);   // 将authPanel添加到loginPanel的中心区域  loginPanel.add(authPanel, BorderLayout.CENTER);   // 将loginPanel设置为框架的内容面板,并设置框架的位置和可见性  frame.setContentPane(loginPanel);   frame.setLocationRelativeTo(null);   frame.setVisible(true);   }   // 创建一个欢迎标签的方法  private JLabel createWelcomeLabel() {   // 创建一个标签并设置其文本、字体和对齐方式  JLabel welcomeLabel = new JLabel("欢迎使用12306订票系统");   Font font = new Font("SansSerif", Font.BOLD, 24);   welcomeLabel.setFont(font);
welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);   // 返回创建的欢迎标签  return welcomeLabel;   }   // 定义一个登录方法  private void login() {   // 从文本字段中获取账号和密码  String username = usernameField.getText();   char[] passwordChars = passwordField.getPassword();   String password = new String(passwordChars);   // 如果账号和密码都不为空,则执行登录逻辑  if (!username.isEmpty() && !password.isEmpty()) {   // 假设的登录逻辑(实际中应包含与数据库的交互)  // 将框架的内容面板更改为主界面,并重新验证和重绘框架  frame.setContentPane(createMainInterface());   frame.revalidate();   frame.repaint();   } else {   // 如果账号或密码为空,则显示错误消息  JOptionPane.showMessageDialog(frame, "请输入账号和密码!");   }   }   // 创建一个主界面的方法  private JPanel createMainInterface() {   // 创建一个布局为BorderLayout的主面板  mainPanel = new JPanel(new BorderLayout());   // 创建左侧的面板用于输入始发站和终点站  JPanel leftPanel = new JPanel(new BorderLayout());   leftPanel.setPreferredSize(new Dimension((int)(frame.getWidth() * 0.75), frame.getHeight()));   leftPanel.setBorder(BorderFactory.createTitledBorder("车票查询"));   // 创建一个用于输入始发站和终点站的面板,布局为GridBagLayout  JPanel inputPanel = new JPanel(new GridBagLayout());   GridBagConstraints gbc = new GridBagConstraints();   // 设置GridBagConstraints对象  gbc.anchor = GridBagConstraints.WEST;   gbc.insets = new Insets(10, 5, 10, 5);   // 添加始发站标签和文本字段到inputPanel  gbc.gridx = 0;   gbc.gridy = 0;   inputPanel.add(new JLabel("始发站:"), gbc);   gbc.gridx = 1;   gbc.gridwidth = 2;   inputPanel.add(departureField = new JTextField(30), gbc);   // 添加终点站标签和文本字段到inputPanel  gbc.gridx = 0;   gbc.gridy = 1;   inputPanel.add(new JLabel("终点站:"), gbc);   gbc.gridx = 1;   inputPanel.add(destinationField = new JTextField(30), gbc);   // 创建一个查询按钮并为其添加点击事件监听器  searchButton = new JButton("车次查询");   searchButton.addActionListener(e -> showTrainList());   // 将查询按钮添加到inputPanel,横跨三列  gbc.gridx = 0;   gbc.gridy = 2;   gbc.gridwidth = 3;   inputPanel.add(searchButton, gbc);   // 将inputPanel添加到leftPanel的中心区域  leftPanel.add(inputPanel, BorderLayout.CENTER);   // 创建右侧的面板用于显示个人订单  JPanel rightPanel = new JPanel(new GridLayout(3, 1)); // 3行1列的网格布局  rightPanel.setPreferredSize(new Dimension(frame.getWidth() / 4, frame.getHeight()));   rightPanel.setBorder(BorderFactory.createTitledBorder("个人订单查询"));   // 初始化并添加用于显示已支付订单、候补订单和本人车票的面板  paidPanel = new JPanel(new FlowLayout());   waitingListPanel = new JPanel(new FlowLayout());   myTicketsPanel = new JPanel(new FlowLayout());   // 创建订单管理按钮并为其添加点击事件监听器  JButton paidOrdersButton = new JButton("已支付");   paidOrdersButton.addActionListener(e -> showOrders(paidOrders));   rightPanel.add(paidOrdersButton, BorderLayout.NORTH); // 注意:这里应该是使用GridLayout,而不是BorderLayout  // 创建候补订单按钮并为其添加点击事件监听器  JButton waitingListOrdersButton = new JButton("候补订单");   waitingListOrdersButton.addActionListener(e -> showOrders(waitingListOrders));   rightPanel.add(waitingListOrdersButton, 1); // 在GridLayout中,
// 这里的索引参数在GridLayout中应该是一个数字,表示添加到第几行(从0开始)。  // 但是,因为GridLayout并没有直接提供索引来指定具体位置,  // 所以我们简单地按照顺序添加。在GridLayout中,组件会自动按行和列的布局进行排列。  rightPanel.add(waitingListOrdersButton); // 正确地添加候补订单按钮到rightPanel  // 创建本人车票按钮并为其添加点击事件监听器  JButton myTicketsButton = new JButton("本人车票");   myTicketsButton.addActionListener(e -> showOrders(myTickets));   rightPanel.add(myTicketsButton); // 将本人车票按钮添加到rightPanel  // 注意:这里添加了一个JLabel(" ")作为占位符是不必要的,因为GridLayout会自动处理布局  // rightPanel.add(new JLabel(" "), BorderLayout.CENTER); // 移除这个不必要的代码  // 将leftPanel和rightPanel添加到mainPanel中  mainPanel.add(leftPanel, BorderLayout.CENTER);   mainPanel.add(rightPanel, BorderLayout.EAST);   // 初始化并更新订单显示  updateOrderDisplays();   // 返回创建的主界面面板  return mainPanel;   }   // 显示订单列表的方法  private void showOrders(List<Order> orders) {   if (orders.isEmpty()) {   // 如果没有订单,则显示一个消息框提示没有订单  JOptionPane.showMessageDialog(frame, "当前没有订单!");   } else {   // 如果有订单,则创建一个消息框显示所有订单信息  String message = "订单信息:\n";   for (Order order : orders) {   message += order.toString() + "\n";   }   JOptionPane.showMessageDialog(frame, message, "订单列表", JOptionPane.INFORMATION_MESSAGE);   }   }   // 显示车次列表的方法  private void showTrainList() {   // 创建一个对话框用于显示车次列表  JDialog dialog = new JDialog(frame, "车次列表", true);   dialog.setLayout(new BorderLayout());   dialog.setSize(400, 300);   // 创建一个面板用于显示火车信息,布局为GridLayout,大小与trainList的大小一致  JPanel trainInfoPanel = new JPanel(new GridLayout(trainList.size(), 1));   // 遍历trainList中的每一辆火车  for (Train train : trainList) {   // 为每一辆火车创建一个面板  JPanel trainPanel = new JPanel(new BorderLayout());   // 创建订票和候补按钮  JButton bookButton = new JButton("订票");   JButton waitlistButton = new JButton("候补");   waitlistButton.setVisible(false); // 默认情况下不显示候补按钮  // 为订票按钮添加点击事件监听器  bookButton.addActionListener(evt -> {   if (train.book()) {   // 如果订票成功,则添加订单并显示成功消息  addOrder(train, true);   JOptionPane.showMessageDialog(frame, "订票成功!");   dialog.dispose(); // 关闭车次列表对话框  } else {   // 如果订票失败(没有剩余座位),则显示候补按钮  waitlistButton.setVisible(true);   }   });   // 为候补按钮添加点击事件监听器  waitlistButton.addActionListener(evt -> {   // 添加候补订单并显示成功消息  addOrder(train, false);   JOptionPane.showMessageDialog(frame, "候补成功!");   dialog.dispose(); // 关闭车次列表对话框  });   // 在trainPanel中添加火车信息和按钮  trainPanel.add(new JLabel(train.getTrainNumber() + " - " + train.getDepartureTime() + " - 剩余票数:" + train.getRemainingSeats()), BorderLayout.CENTER);   JPanel buttonPanel = new JPanel(new FlowLayout());   buttonPanel.add(bookButton);   buttonPanel.add(waitlistButton);   trainPanel.add(buttonPanel, BorderLayout.EAST);   // 将trainPanel添加到trainInfoPanel中  trainInfoPanel.add(trainPanel);   }   // 创建一个滚动面板来包含trainInfoPanel,并添加到对话框中  JScrollPane scrollPane = new JScrollPane(trainInfoPanel);   dialog.add(scrollPane, BorderLayout.CENTER); // 将滚动面板添加到对话框的中心位置  // 设置对话框的位置相对于父窗口居中  dialog.setLocationRelativeTo(frame);   // 设置对话框为可见  dialog.setVisible(true);   }  // 添加订单到对应列表的方法  private void addOrder(Train train, boolean isPaid) {   Order order = new Order(train, isPaid); // 创建一个新的订单对象  // 根据订单是否已支付,将其添加到对应的列表中  if (isPaid) {   paidOrders.add(order); // 添加到已支付订单列表  myTickets.add(order); // 添加到本人车票列表  } else {   waitingListOrders.add(order); // 添加到候补订单列表  }  // 更新订单显示面板的内容  updateOrderDisplays();   }  // 更新订单显示面板的方法  private void updateOrderDisplays() {   // 清除之前的订单信息  paidPanel.removeAll();   waitingListPanel.removeAll();   myTicketsPanel.removeAll();   // 遍历订单列表,将订单信息添加到对应的面板中  for (Order order : paidOrders) {   paidPanel.add(new JLabel(order.toString()));   }  for (Order order : waitingListOrders) {   waitingListPanel.add(new JLabel(order.toString()));   }  for (Order order : myTickets) {   myTicketsPanel.add(new JLabel(order.toString()));   }  // 重新绘制面板以显示新的订单信息  paidPanel.repaint();   waitingListPanel.repaint();   myTicketsPanel.repaint();   }  // 初始化火车数据的方法  private void initTrainData() {   trainList = new ArrayList<>();   // 添加几辆火车到trainList中,包括车次、发车时间和剩余座位数  trainList.add(new Train("G123", "08:00", 150));   trainList.add(new Train("G124", "09:30", 100));   trainList.add(new Train("G125", "11:00", 200));   trainList.add(new Train("G126", "13:00", 0)); // 这辆火车没有剩余座位  trainList.add(new Train("G127", "15:00", 75));   }  // 火车类Train,表示一辆火车  class Train {   // ...(类的成员变量和方法省略,已在前面定义)  // book方法,尝试预订火车票  public boolean book() {   if (remainingSeats > 0) { // 如果剩余座位数大于0  remainingSeats--; // 预订成功后,剩余座位数减1  return true; // 返回true表示预订成功  }  return false; // 返回false表示预订失败(没有剩余座位)  }  }  // 订单类Order,表示一个订单  class Order {   // ...(类的成员变量和方法省略,已在前面定义)  // toString方法,返回订单的字符串表示形式  @Override   public String toString() {   return isPaid ? "已支付: " + train.getTrainNumber() + " " + train.getDepartureTime() :  "候补: " + train.getTrainNumber() + " " + train.getDepartureTime();   }  }  // 主方法,程序入口  public static void main(String[] args) {   new TrainBookingSystem(); // 创建TrainBookingSystem对象,启动订票系统  }  
}

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

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

相关文章

C++ 教程 - 04 类的使用

文章目录 类的定义类定义案例 类的定义 C 在 C 语言的基础上增加面向对象编程&#xff0c;类是用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;封装了数据和函数。类可以被看作是一种模板&#xff0c;可以用来创建具有相同属性和行为的多个对象。 cla…

python爬虫学习笔记一(基本概念urllib基础)

学习资料&#xff1a;尚硅谷_爬虫 学习环境: pycharm 一.爬虫基本概念 爬虫定义 > 解释1&#xff1a;通过程序&#xff0c;根据URL进行爬取网页&#xff0c;获取有用信息 > 解释2&#xff1a;使用程序模拟浏览器&#xff0c;向服务器发送请求&#xff0c;获取相应信息…

分布式缓存和分布式对象池有什么区别?

分布式缓存和分布式对象池是两种不同的概念&#xff0c;它们在分布式系统中扮演着不同的角色&#xff0c;服务于不同的目的。下面分别解释它们的含义和区别&#xff1a; ### 分布式缓存&#xff08;Distributed Cache&#xff09; 分布式缓存是一种分布式存储系统&#xff0c…

尚品汇-(五)

商品管理模块开发 下面用到的表&#xff1a; 属性表&#xff1a; 属性值表&#xff1a; 分类一表&#xff1a; 分类二表&#xff1a; 分类三表&#xff1a; 1.1在service 模块下搭建service-product 搭建过程同common-util 添加配置文件application.yml spring:applicatio…

C#基于SkiaSharp实现印章管理(1)

最近对着微软的教程学习SkiaSharp的概念及用法&#xff0c;由于之前使用GDI绘制过坐标系、印章等程序&#xff0c;准备使用SkiaSharp、SKControl控件编写简单的印章设计功能&#xff0c;并能用印章对图片盖章。本文实现创建印章背景、序列化及反序列化印章对象等功能。   VS2…

PostgreSQL进阶教程

PostgreSQL进阶教程 目录 事务和并发控制 事务事务隔离级别锁 高级查询 联合查询窗口函数子查询CTE&#xff08;公用表表达式&#xff09; 数据类型 自定义数据类型数组JSON 高级索引 部分索引表达式索引GIN和GiST索引 性能调优 查询优化配置优化 备份与恢复 物理备份逻辑备份…

2-14 基于matlab的GA优化算法优化车间调度问题

基于matlab的GA优化算法优化车间调度问题。n个工作在m个台机器上加工。已知每个工作中工序加工顺序、各工序的加工时间以及每个工件所包含的工序&#xff0c;在满足约束条件的前提下&#xff0c;目的是确定机器上各工件顺序&#xff0c;以保证某项性能指标最优。程序功能说明&a…

视频讲解|【双层模型】分布式光伏储能系统的优化配置方法

1 主要内容 该讲解视频对应的程序链接为【双层模型】分布式光伏储能系统的优化配置方法&#xff0c;模型参考《分布式光伏储能系统的优化配置方法》&#xff0c;分为上下层求解方式&#xff0c;上层采用粒子群算法确定储能的选址和容量方案&#xff0c;以全年购电成本、网络损…

YouTube API接口:一键获取Playlist视频合集信息

核心功能介绍 在视频内容日益繁荣的今天&#xff0c;YouTube作为全球领先的视频分享平台&#xff0c;为内容创作者、品牌商家以及数据分析师提供了丰富的视频资源。其中&#xff0c;Playlist视频合集作为YouTube上的一种特色内容形式&#xff0c;深受用户喜爱。为了更好地满足…

TCP与UDP_三次握手_四次挥手

TCP vs UDP TCP数据 具体可以通过Cisco Packet Tracer工具查看&#xff1a; UDP数据 三次握手、四次挥手 为什么是3/4次&#xff1f;这牵扯到单工、双工通信的问题 TCP建立连接&#xff1a;表白 TCP释放连接&#xff1a;分手 TCP—建立连接—三次握手 解释&#xff1a; 首先&…

HTML与CSS的初步解析及实践案例

目录 1&#xff0c;HTML概览与基本语法 基本结构&#xff1a; 头部标签&#xff1a; 常用标签与属性 CSS概述与基本语法 CSS选择器与属性 盒子模型与布局 实例展示 1&#xff0c;HTML概览与基本语法 HTML&#xff0c;即超文本标记语言&#xff0c;是网页的基础构建语言…

本地离线模型搭建指南-LLaMA-Factory训练框架及工具

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…

【面试】基本数据类型的包装类缓存

目录 1. 说明2. Integer类分析2.1 代码块2.2 字节码2.3 分析2.4 valueOf方法 1. 说明 1.在java中&#xff0c;基本数据类型的包装类&#xff08;Integer、Byte、Character、Short、Long、Boolean&#xff09;的某些值会被缓存。2.以提高性能并减少内存使用。3.这种缓存机制是自…

Rxjava2最全面的解析

说到区别&#xff0c;可能有的小伙伴会问&#xff0c;我没看过rxjava1。可以直接看rxjava2么。个人觉得不必要&#xff0c;因为 rxjava2.x 是按照 Reactive-Streams specification 规范完全的重写的&#xff0c;完全独立于 rxjava1.x 而存在&#xff0c;它改变了以往 rxjava1的…

如何看待鸿蒙HarmonyOS?

鸿蒙系统&#xff0c;自2019年8月9日诞生就一直处于舆论风口浪尖上的系统&#xff0c;从最开始的“套壳”OpenHarmony安卓的说法&#xff0c;到去年的不再兼容安卓的NEXT版本的技术预览版发布&#xff0c;对于鸿蒙到底是什么&#xff0c;以及鸿蒙的应用开发的讨论从来没停止过。…

物联网系统运维——移动电商服务器单点部署,web服务器部署,Nginx Web服务介绍,Nginx性能,部署,架构,及实验:安装并设置Nginx(重点)

一.web服务器介绍 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上提供某种特定类型计算机的程序&#xff0c;Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件&#xff0c;让全世界浏览&#xff0c;可以放置数据文件&#xff0c;让全世界下…

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV &#x1f468;‍&#x1f3eb; 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释&#xff0c;包括每个部分的作用和注释&#xff1a; -- 计算每个玩…

Leetcode 3192. Minimum Operations to Make Binary Array Elements Equal to One II

Leetcode 3192. Minimum Operations to Make Binary Array Elements Equal to One II 1. 解题思路2. 代码实现 题目链接&#xff1a;3192. Minimum Operations to Make Binary Array Elements Equal to One II 1. 解题思路 这一题的话就是一个动态规划&#xff0c;我们使用两…

【K8S运维】整理常见使用命令

*特别提醒: 文件复制类的命令&#xff0c;执行命令等需要谨慎确定命令执行后的效果&#xff0c;否则一旦出错就不可逆&#xff01;&#xff01;&#xff01; 命令概览 序号使用场景命令格式使用样例命令使用说明1查询集群节点有多少kubectl get nodes2查询集群运行哪些podkub…

文华财经多空精准买卖点止损止盈数值主图指标公式源码

文华财经多空精准买卖点止损止盈数值主图指标公式源码&#xff1a; DD:EVERY(H>HV(H,20),1); KK:EVERY(L<LV(L,20),1); D:DD&&SUM(DD,BARSLAST(KK))1; K:KK&&SUM(KK,BARSLAST(DD))1; Y:1; DRAWCOLORKLINE(Y&&ISDOWN,COLORYELLOW,0); DRAW…