当前位置:   article > 正文

java 实训课程设计:仓库管理系统_java实训课程设计

java实训课程设计

实现配送中心管理系统的基本功能:针对产品实现该配送中心的货物的初始化处理,完成对货物的进仓、出仓、报废等管理,实现货物的库存统计等操作。

基本要求:

  1. 货物的初始化处理
  2. 货物的进仓
  3. 货物的出仓
  4. 货物的报废
  5. 零状态和满仓预警处理

6、必须要用面向对象设计思想编程实现

高级要求:

1、界面友好;

2、对货物信息进行统计(例如某单位时间内流量排序等);

大二期末的实训,共有十五个课设可以选择,博主选择的是仓库管理系统。

 

这是整个系统的设计模块图(仓库有很多种,博主做的是快递超市仓库管理系统)

不多说,上代码

货物类Cargo:

  1. public class Cargo{
  2. String name;
  3. int id;
  4. String type;
  5. String source;
  6. int picking;
  7. String state;
  8. int weight;
  9. String time;
  10. public Cargo(String name,int id,String type,String source,int picking,int weight) {
  11. this.name=name;
  12. this.id =id;
  13. this.type =type;
  14. this.source =source;
  15. this.picking=picking;
  16. this.state="正常";
  17. this.weight=weight;
  18. this.time= null;
  19. }
  20. public String getSource() {
  21. return source;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public int getId() {
  27. return id;
  28. }
  29. public String getType() {
  30. return type;
  31. }
  32. public int getPicking(){
  33. return picking;
  34. }
  35. public String getState(){
  36. return state;
  37. }
  38. public int getWeight(){
  39. return weight;
  40. }
  41. public String getTime() {return time;}
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45. public void setType(String type) {
  46. this.type = type;
  47. }
  48. public void setSource(String source) {
  49. this.source = source;
  50. }
  51. public void setPicking(int picking) {
  52. this.picking = picking;
  53. }
  54. public void setState(String state) { this.state = state; }
  55. public void setWeight(int weight) {this.weight = weight;}
  56. public void setTime(String time) {this.time = time;}
  57. @Override
  58. public String toString() {
  59. return "Cargo{" +
  60. "name='" + name + '\'' +
  61. ", id=" + id +
  62. ", type='" + type + '\'' +
  63. ", source='" + source + '\'' +
  64. ", picking='" + picking + '\'' +
  65. ", state='" + state + '\'' +
  66. ", weight=" + weight +
  67. ", time=" + time +
  68. '}';
  69. }
  70. }

仓库类Warehouse:

  1. import java.text.SimpleDateFormat;
  2. import java.util.Collection;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. public class Warehouse{
  6. private HashMap<Integer, Cargo> cargos = new HashMap<>();
  7. private int capacity = 0;
  8. public int getInventory() {
  9. int inventory = 0;
  10. for(Cargo cargo : cargos.values()){
  11. inventory +=cargo.getWeight();
  12. }
  13. return inventory;
  14. }
  15. public String getNewTime(){
  16. SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  17. Date date = new Date();
  18. String str =sdf.format(date);
  19. return str;
  20. }
  21. public int getCapacity() {
  22. return capacity;
  23. }
  24. public void setCapacity(int capacity) {
  25. this.capacity = capacity;
  26. }
  27. public boolean addCargo(Cargo cargo) {
  28. if(getInventory()+cargo.getWeight()<=capacity) {
  29. cargos.put(cargo.getId(), cargo);
  30. cargo.setTime(getNewTime());
  31. return true;
  32. } else {
  33. return false;
  34. }
  35. }
  36. public boolean getCargo(int id){
  37. return cargos.get(id) != null;
  38. }
  39. public boolean removeCargo(int id){
  40. return cargos.remove(id) != null;
  41. }
  42. public int getCargoPicking(int id){
  43. Cargo cargo = cargos.get(id);
  44. return cargo.getPicking();
  45. }
  46. public Cargo seekCargo(int id){
  47. return cargos.get(id);
  48. }
  49. public boolean stateChange(int id){
  50. Cargo cargo = cargos.get(id);
  51. if(cargo != null) {
  52. cargo.setState("已报废");
  53. return true;
  54. }else {
  55. return false;
  56. }
  57. }
  58. public WarehouseWarning warning(int capacity){
  59. if(getInventory() < 0.1 * capacity){
  60. return WarehouseWarning.EMPTY;
  61. } else if (getInventory() > 0.9 * capacity) {
  62. return WarehouseWarning.FULL;
  63. }else{
  64. return WarehouseWarning.NONE;
  65. }
  66. }
  67. public Collection<Cargo> getCargos() {
  68. return cargos.values();
  69. }
  70. @Override
  71. public String toString() {
  72. String str = "";
  73. for (Cargo cargo : cargos.values()) {
  74. str += cargo.getName() + "\n";
  75. }
  76. return str;
  77. }
  78. }

仓库类中用到的枚举WarehouseWarning

  1. public enum WarehouseWarning {
  2. EMPTY,
  3. FULL,
  4. NONE
  5. }

以上为该系统的数据层

由于高级要求中有一条界面友好的要求,博主是用GUI来实现的表现层(另一个高级要求没有完成)

下面是GUI的主界面MainFrame:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. public class MainFrame extends JFrame {
  5. private JPanel cn;
  6. private Warehouse warehouse;
  7. public MainFrame(String str, Warehouse warehouse) {
  8. super(str);
  9. this.warehouse = warehouse;
  10. setSize(800, 600);
  11. setLocationRelativeTo(null);
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setBackground(Color.white);
  14. Box box = Box.createVerticalBox();
  15. setContentPane(box);
  16. JPanel an = new JPanel();
  17. an.setSize(800, 200);
  18. JButton big = new JButton("容量设置");
  19. big.setPreferredSize(new Dimension(120, 60));
  20. JButton in = new JButton("进仓");
  21. in.setPreferredSize(new Dimension(120, 60));
  22. JButton out = new JButton("出仓");
  23. out.setPreferredSize(new Dimension(120, 60));
  24. JButton useless = new JButton("报废");
  25. useless.setPreferredSize(new Dimension(120, 60));
  26. JButton warning = new JButton("预警");
  27. warning.setPreferredSize(new Dimension(150, 75));
  28. warning.setBackground(Color.cyan);
  29. //warning.setEnabled(false);
  30. an.add(big);
  31. an.add(in);
  32. an.add(out);
  33. an.add(useless);
  34. an.add(warning);
  35. box.add(an);
  36. setVisible(true);
  37. JLabel x = new JLabel();
  38. an.add(x);
  39. cn = new JPanel();
  40. cn.setVisible(true);
  41. cn.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
  42. JScrollPane scrollPane = new JScrollPane(cn);
  43. scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  44. scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  45. //cn.setPreferredSize(new Dimension(780, cn.getPreferredSize().height));
  46. Dimension preferredSize = new Dimension(800, 600);
  47. cn.setPreferredSize(preferredSize);
  48. scrollPane.setPreferredSize(preferredSize);
  49. box.add(scrollPane);
  50. changeCargoButton();
  51. big.addActionListener(new ActionListener() {
  52. @Override
  53. public void actionPerformed(ActionEvent e) {
  54. new cabacityAdd("输入容量", warehouse);
  55. }
  56. });
  57. in.addActionListener(new ActionListener() {
  58. @Override
  59. public void actionPerformed(ActionEvent e) {
  60. new CargoAdd("进仓", warehouse, MainFrame.this);
  61. }
  62. });
  63. out.addActionListener(new ActionListener() {
  64. @Override
  65. public void actionPerformed(ActionEvent e) {
  66. new CargoRemove("出仓", warehouse, MainFrame.this);
  67. }
  68. });
  69. useless.addActionListener(new ActionListener() {
  70. @Override
  71. public void actionPerformed(ActionEvent e) {
  72. new Useless("报废", warehouse, MainFrame.this);
  73. }
  74. });
  75. warning.addActionListener(new ActionListener() {
  76. @Override
  77. public void actionPerformed(ActionEvent e) {
  78. x.setText(warehouse.getInventory() + " / " + warehouse.getCapacity());
  79. if (warehouse.warning(warehouse.getCapacity()) == WarehouseWarning.EMPTY) {
  80. warning.setBackground(Color.green);
  81. warning.setText("预警" + "\n" + "EMPLY(零状态)");
  82. } else if (warehouse.warning(warehouse.getCapacity()) == WarehouseWarning.FULL) {
  83. warning.setBackground(Color.red);
  84. warning.setText("预警" + "\n" + "FULL(满状态)");
  85. } else {
  86. warning.setBackground(Color.cyan);
  87. warning.setText("预警" + "\n" + "NONE(正常)");
  88. }
  89. }
  90. });
  91. }
  92. void changeCargoButton() {
  93. cn.removeAll();
  94. validate();
  95. repaint();
  96. for (Cargo cargo : warehouse.getCargos()) {
  97. JButton y1 = new JButton();
  98. y1.setPreferredSize(new Dimension(170, 80));
  99. y1.setBackground(Color.pink);
  100. y1.setText(" " + cargo.getId()+ "\n" + " " + cargo.getName() + "\n" + " " + cargo.getState());
  101. if (cargo.getState().equals("已报废")) {
  102. y1.setText(" " + cargo.getId() + "\n" + " " + cargo.getName() + "\n" + " " + cargo.getState());
  103. y1.setBackground(Color.GRAY);
  104. }
  105. cn.add(y1);
  106. y1.addActionListener(new ActionListener() {
  107. @Override
  108. public void actionPerformed(ActionEvent e) {
  109. new CargoMessege(cargo);
  110. }
  111. });
  112. validate();
  113. }
  114. }
  115. }

容量添加界面cabacityAdd:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class cabacityAdd extends JFrame {
  4. public cabacityAdd (String str,Warehouse warehouse) {
  5. super(str);
  6. setSize(210, 400);
  7. setLocationRelativeTo(null);
  8. setBackground(Color.white);
  9. JPanel c1 = new JPanel();
  10. JLabel a1 = new JLabel("容量大小");
  11. JTextField b1 = new JTextField(16);
  12. JButton jButton = new JButton("确定");
  13. c1.add(a1);
  14. c1.add(b1);
  15. c1.add(jButton);
  16. add(c1);
  17. setVisible(true);
  18. jButton.addActionListener((actionEvent -> {
  19. int s1 = Integer.parseInt(b1.getText());
  20. warehouse.setCapacity(s1);
  21. if(s1==0){
  22. new determine("容量不可为0");}else{
  23. new determine("容量设置成功");
  24. dispose();
  25. }
  26. }
  27. ));
  28. }
  29. }

货物进仓界面CargoAdd:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class CargoAdd extends JFrame {
  6. private MainFrame mainFrame;
  7. public CargoAdd(String str, Warehouse warehouse,MainFrame mainFrame) {
  8. super(str);
  9. this.mainFrame = mainFrame;
  10. setSize(210, 400);
  11. setLocationRelativeTo(null);
  12. setBackground(Color.white);
  13. JPanel c1 = new JPanel();
  14. JLabel a1 = new JLabel("名称");
  15. JLabel a2 = new JLabel("编号");
  16. JLabel a3 = new JLabel("类型");
  17. JLabel a4 = new JLabel("来源");
  18. JLabel a5 = new JLabel("出库码");
  19. JLabel a6 = new JLabel("重量");
  20. JTextField b1 = new JTextField(16);
  21. JTextField b2 = new JTextField(16);
  22. JTextField b3 = new JTextField(16);
  23. JTextField b4 = new JTextField(16);
  24. JTextField b5 = new JTextField(16);
  25. JTextField b6 = new JTextField(16);
  26. JButton jButton = new JButton("确定");
  27. c1.add(a1);
  28. c1.add(b1);
  29. c1.add(a2);
  30. c1.add(b2);
  31. c1.add(a3);
  32. c1.add(b3);
  33. c1.add(a4);
  34. c1.add(b4);
  35. c1.add(a5);
  36. c1.add(b5);
  37. c1.add(a6);
  38. c1.add(b6);
  39. c1.add(jButton);
  40. add(c1);
  41. setVisible(true);
  42. jButton.setActionCommand("myButton");
  43. jButton.addActionListener(new ActionListener() {
  44. public void actionPerformed(ActionEvent e) {
  45. String s1 = b1.getText();
  46. int s2 = Integer.parseInt(b2.getText());
  47. String s3 = b3.getText();
  48. String s4 = b4.getText();
  49. int s5 = Integer.parseInt(b5.getText());
  50. int s6 = Integer.parseInt(b6.getText());
  51. Cargo cargo = new Cargo(s1,s2,s3,s4,s5,s6);
  52. // warehouse.addCargo(cargo);
  53. if(s1==null||s3==null||s4==null||s6==0){
  54. new determine("请输入正确的信息");
  55. }
  56. else if(warehouse.addCargo(cargo)==false) {
  57. new determine("入库失败(超出库存)");
  58. }else{
  59. //mainFrame.addCargoButton(cargo);
  60. mainFrame.changeCargoButton();
  61. new determine("入库成功");
  62. dispose();
  63. }
  64. }
  65. });
  66. }
  67. }

货物出库界面CargoRemove:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class CargoRemove extends JFrame {
  4. private MainFrame mainFrame;
  5. public CargoRemove (String str,Warehouse warehouse,MainFrame mainFrame) {
  6. super(str);
  7. setSize(210, 400);
  8. setLocationRelativeTo(null);
  9. setBackground(Color.white);
  10. this.mainFrame = mainFrame;
  11. JPanel c1 = new JPanel();
  12. JLabel a1 = new JLabel("出仓货物编号");
  13. JLabel a2 = new JLabel("出库码");
  14. JTextField b1 = new JTextField(16);
  15. JTextField b2 = new JTextField(16);
  16. JButton jButton2 = new JButton("确定");
  17. c1.add(a1);
  18. c1.add(b1);
  19. c1.add(a2);
  20. c1.add(b2);
  21. c1.add(jButton2);
  22. add(c1);
  23. setVisible(true);
  24. jButton2.addActionListener((actionEvent -> {
  25. int s1 = Integer.parseInt(b1.getText());
  26. int s2 = Integer.valueOf(Integer.parseInt(b2.getText()));
  27. if(warehouse.getCargo(s1)==false){
  28. new determine("编号不存在");
  29. }else{
  30. if(warehouse.getCargoPicking(s1)!=s2){
  31. new determine("出仓码错误");
  32. }else {
  33. warehouse.removeCargo(s1);
  34. new determine("出仓成功");
  35. mainFrame.changeCargoButton();
  36. dispose();
  37. }
  38. }
  39. }
  40. ));
  41. }
  42. }

货物报废界面useless:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class Useless extends JFrame {
  4. private MainFrame mainFrame;
  5. public Useless (String str,Warehouse warehouse,MainFrame mainFrame) {
  6. super(str);
  7. setSize(210, 400);
  8. setLocationRelativeTo(null);
  9. setBackground(Color.white);
  10. this.mainFrame = mainFrame;
  11. JPanel c1 = new JPanel();
  12. JLabel a1 = new JLabel("货物报废");
  13. JTextField b1 = new JTextField(16);
  14. JButton jButton3 = new JButton("确定");
  15. c1.add(a1);
  16. c1.add(b1);
  17. c1.add(jButton3);
  18. add(c1);
  19. setVisible(true);
  20. jButton3.addActionListener((actionEvent -> {
  21. int s3 = Integer.parseInt(b1.getText());
  22. warehouse.stateChange(s3);
  23. if(warehouse.stateChange(s3)==false){
  24. new determine("编号不存在");
  25. }else{
  26. new determine("报废成功");
  27. mainFrame.changeCargoButton();
  28. }
  29. }
  30. ));
  31. }
  32. }

货物详细信息弹窗界面CargoMessege:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class CargoMessege extends JDialog {
  4. public CargoMessege(Cargo cargo) {
  5. setVisible(true);
  6. setBounds(800, 300, 200, 300);
  7. Container container = getContentPane();
  8. container.setLayout(null);
  9. Panel jPanel = new Panel();
  10. JLabel jLabel1 = new JLabel("货物名字" +": " + cargo.getName());
  11. JLabel jLabel2 = new JLabel("编号" +": " + cargo.getId() + " ");
  12. JLabel jLabel3 = new JLabel("类型" + ": " + cargo.getType() + " ");
  13. JLabel jLabel4 = new JLabel("来源" + ": " + cargo.getSource() + " ");
  14. JLabel jLabel5 = new JLabel("取件码" + ": " + cargo.getPicking() + " ");
  15. JLabel jLabel6 = new JLabel("状态" + ": " + cargo.getState() + " ");
  16. JLabel jLabel7 = new JLabel("重量" + ": " + cargo.getWeight() + " ");
  17. JLabel jLabel8 = new JLabel(" 入库时间" + cargo.getTime());
  18. jPanel.setSize(140, 300);
  19. jPanel.add(jLabel1);
  20. jPanel.add(jLabel2);
  21. jPanel.add(jLabel3);
  22. jPanel.add(jLabel4);
  23. jPanel.add(jLabel5);
  24. jPanel.add(jLabel6);
  25. jPanel.add(jLabel7);
  26. jPanel.add(jLabel8);
  27. container.add(jPanel);
  28. }
  29. }
  30. import javax.swing.*;
  31. import java.awt.*;
  32. public class CargoMessege extends JDialog {
  33. public CargoMessege(Cargo cargo) {
  34. setVisible(true);
  35. setBounds(800, 300, 200, 300);
  36. Container container = getContentPane();
  37. container.setLayout(null);
  38. Panel jPanel = new Panel();
  39. JLabel jLabel1 = new JLabel("货物名字" +": " + cargo.getName());
  40. JLabel jLabel2 = new JLabel("编号" +": " + cargo.getId() + " ");
  41. JLabel jLabel3 = new JLabel("类型" + ": " + cargo.getType() + " ");
  42. JLabel jLabel4 = new JLabel("来源" + ": " + cargo.getSource() + " ");
  43. JLabel jLabel5 = new JLabel("取件码" + ": " + cargo.getPicking() + " ");
  44. JLabel jLabel6 = new JLabel("状态" + ": " + cargo.getState() + " ");
  45. JLabel jLabel7 = new JLabel("重量" + ": " + cargo.getWeight() + " ");
  46. JLabel jLabel8 = new JLabel(" 入库时间" + cargo.getTime());
  47. jPanel.setSize(140, 300);
  48. jPanel.add(jLabel1);
  49. jPanel.add(jLabel2);
  50. jPanel.add(jLabel3);
  51. jPanel.add(jLabel4);
  52. jPanel.add(jLabel5);
  53. jPanel.add(jLabel6);
  54. jPanel.add(jLabel7);
  55. jPanel.add(jLabel8);
  56. container.add(jPanel);
  57. }
  58. }

提示信息弹窗界面determine:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. public class determine extends JDialog {
  4. public determine(String str) {
  5. setVisible(true);
  6. setBounds(600, 400, 200, 100);
  7. Container container = getContentPane();
  8. container.setLayout(null);
  9. JLabel jLabel = new JLabel(str);
  10. jLabel.setSize(130, 30);
  11. container.add(jLabel);
  12. }
  13. }

最后是主函数Delivery(添加了一些测试用例)

  1. public class Delivery {
  2. public static void main(String[] args) {
  3. Warehouse warehouse = new Warehouse();
  4. warehouse.setCapacity(1000);
  5. // Cargo cargo1 = new Cargo("康师傅",1,"食品","京东",114514,1);
  6. // Cargo cargo2 = new Cargo("洗发水",2,"生活用品","淘宝",114514,1);
  7. // Cargo cargo3 = new Cargo("洗手液",3,"生活用品","淘宝",114514,960);
  8. // Cargo cargo4 = new Cargo("餐巾纸",4,"生活用品","淘宝",114514,2);
  9. // Cargo cargo5 = new Cargo("面包",5,"食品","京东",114514,1);
  10. // Cargo cargo6 = new Cargo("面包",6,"食品","京东",114514,1);
  11. // Cargo cargo7 = new Cargo("康师傅",7,"食品","京东",114514,1);
  12. // Cargo cargo8 = new Cargo("洗发水",8,"生活用品","淘宝",114514,1);
  13. // Cargo cargo9 = new Cargo("洗手液",9,"生活用品","淘宝",114514,960);
  14. // Cargo cargo10 = new Cargo("餐巾纸",10,"生活用品","淘宝",114514,2);
  15. // Cargo cargo11 = new Cargo("面包",11,"食品","京东",114514,1);
  16. // Cargo cargo12 = new Cargo("面包",12,"食品","京东",114514,1);
  17. // Cargo cargo13 = new Cargo("面包",13,"食品","京东",114514,1);
  18. // Cargo cargo14 = new Cargo("面包",14,"食品","京东",114514,1);
  19. // Cargo cargo15 = new Cargo("康师傅",15,"食品","京东",114514,1);
  20. // Cargo cargo16 = new Cargo("洗发水",16,"生活用品","淘宝",114514,1);
  21. // Cargo cargo17 = new Cargo("洗手液",17,"生活用品","淘宝",114514,960);
  22. // Cargo cargo18 = new Cargo("餐巾纸",18,"生活用品","淘宝",114514,2);
  23. // Cargo cargo19 = new Cargo("面包",19,"食品","京东",114514,1);
  24. // Cargo cargo20 = new Cargo("面包",20,"食品","京东",114514,1);
  25. // Cargo cargo21= new Cargo("康师傅",21,"食品","京东",114514,1);
  26. // Cargo cargo22 = new Cargo("洗发水",22,"生活用品","淘宝",114514,1);
  27. // Cargo cargo23 = new Cargo("洗手液",23,"生活用品","淘宝",114514,960);
  28. //
  29. // warehouse.addCargo(cargo1);
  30. // warehouse.addCargo(cargo2);
  31. // warehouse.addCargo(cargo3);
  32. // warehouse.addCargo(cargo4);
  33. // warehouse.addCargo(cargo5);
  34. // warehouse.addCargo(cargo6);
  35. // warehouse.addCargo(cargo7);
  36. // warehouse.addCargo(cargo8);
  37. // warehouse.addCargo(cargo9);
  38. // warehouse.addCargo(cargo10);
  39. // warehouse.addCargo(cargo11);
  40. // warehouse.addCargo(cargo12);
  41. // warehouse.addCargo(cargo13);
  42. // warehouse.addCargo(cargo14);
  43. // warehouse.addCargo(cargo15);
  44. // warehouse.addCargo(cargo16);
  45. // warehouse.addCargo(cargo17);
  46. // warehouse.addCargo(cargo18);
  47. // warehouse.addCargo(cargo19);
  48. // warehouse.addCargo(cargo20);
  49. // warehouse.addCargo(cargo21);
  50. // warehouse.addCargo(cargo22);
  51. // warehouse.addCargo(cargo23);
  52. MainFrame mainFrame = new MainFrame("仓库管理系统",warehouse);
  53. }
  54. }

以上就是全部代码,接下来看看效果

主界面:

添加超出容量的货物后可使用滚动条

 仓库容量设置界面:

进仓出仓界面:

 既然是快递超市仓库管理系统,当然需要出仓码才能出仓啦(doge)

点击预警按钮后三种预警界面(正常,零状态,满状态):

报废界面:

 

 点击货物对应按钮后弹出的详细消息弹窗:

信息提示界面:

最后再来谈谈该系统没有完善的地方

        首先,系统的预警系统需要手动点击触发,其实这里可以关联在进仓出仓按钮上,实现自动预警,这里纯粹是博主在设计的时候没有想到。

        另外,在进仓26个货物之后,后面进仓的(第27个以及27以后)货物可能会无法在主界面显示,这个应该是代码问题但博主一直没有解决,如有大佬指正欢迎在讨论区留言。

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/893773
推荐阅读
相关标签
  

闽ICP备14008679号