当前位置:   article > 正文

Java学习——水果超市商品管理系统_java水果超市

java水果超市

案例介绍:

水果超市管理系统包括两个界面:系统欢迎界面和超市货物管理界面,在系统欢迎界面中,通过单击“进入系统”按钮,进入超市货物管理界面。在超市货物管理界面中,可以对水果信息实现具体的操作。例如,每当有新水果运送到超市时,就需要系统管理人员在系统中增加新水果的信息;若超市中的某种水果售罄,则删除该水果的信息;若水果的数量、价格等需要变更,则及时进行修改。这些操作都可以在水果超市管理系统中完成。

案例目标: 实现添加数据、修改数据和删除数据的功能。

运行环境: Jdk、Eclipse

案例代码:

首先,我们需要按照以下形式在Eclipse中创建相应的包和类。


先创建一个工程"fruitstore",下面开始就是代码了。

(1)先创建cn.example.fruitstore.app包,在此包下创建MainApp.java类。

  1. package cn.example.fruitstore.app;
  2. import cn.example.fruitstore.controller.MainFrameController;
  3. /**
  4. * 项目运行
  5. */
  6. public class MainApp {
  7. public static void main(String[] args) {
  8. new MainFrameController().setVisible(true);
  9. }
  10. }

(2)先创建cn.example.fruitstore.controller包,在此包下创建AdminDialogController.java类和MainFrameController.java类。

  1. //AdminDialogController.java类代码如下
  2. package cn.example.fruitstore.controller;
  3. import java.awt.Frame;
  4. import java.util.ArrayList;
  5. import javax.swing.JOptionPane;
  6. import javax.swing.table.DefaultTableModel;
  7. import javax.swing.table.TableModel;
  8. import cn.example.fruitstore.domain.FruitItem;
  9. import cn.example.fruitstore.service.AdminService;
  10. import cn.example.fruitstore.view.AbstractSdminDialog;
  11. /**
  12. * 管理员界面操作类*/
  13. @SuppressWarnings("serial")
  14. public class AdminDialogController extends AbstractSdminDialog{
  15. //定义服务类,提供完整功能服务
  16. private AdminService adminService = new AdminService();
  17. //构造方法
  18. public AdminDialogController(){
  19. super();
  20. }
  21. public AdminDialogController(Frame owner,boolean modal) {
  22. super(owner, modal);
  23. //创建对象时展示数据
  24. queryFruitItem();
  25. }
  26. //查询方法
  27. @Override
  28. public void queryFruitItem(){
  29. //定义表格头
  30. String[] thead ={"水果编号", "水果名称", "水果单价(/元)","计价单位"};
  31. //调用adminService的查询服务
  32. ArrayList<FruitItem> dataList = adminService.queryFruitItem();
  33. //调用list2Array方法,将查询到的集合转换为数组,方便为JTable赋值
  34. String[][] tbody = list2Array(dataList);
  35. //用查询到的结果为table赋值
  36. TableModel dataModel = new DefaultTableModel(tbody, thead);
  37. table.setModel (dataModel);
  38. }
  39. //集合数据转换为二维数组方法
  40. public String[][] list2Array(ArrayList<FruitItem> list){
  41. //根据EruitItem类的model与集合数据,定义JTable 数据的二维数组
  42. String[][] tbody = new String[list.size()][4];
  43. for (int i=0; i<list.size(); i++){
  44. FruitItem fruitItem = list.get(i);
  45. tbody[i][0] = fruitItem.getNumber();
  46. tbody[i][1] = fruitItem.getName();
  47. tbody[i][2] = fruitItem.getPrice()+"";
  48. tbody[i][3] = fruitItem.getUnit();
  49. }
  50. return tbody;
  51. }
  52. //添加方法
  53. @Override
  54. public void addFruitItem() {
  55. //获取数据
  56. String addNumber = addNumberText.getText();
  57. String addName = addNameText.getText();
  58. String addPrice = addPriceText.getText();
  59. String addUnit = addUnitText.getText();
  60. //调用adminService的添加服务
  61. boolean addSuccess = adminService.addFruitItem(addNumber, addName,
  62. addPrice, addUnit);
  63. //若添加成功
  64. if(addSuccess){
  65. //添加后刷新表格
  66. queryFruitItem();
  67. }else{
  68. //若没有添加成功,则弹出错误提示
  69. JOptionPane. showMessageDialog(this,"水果编号不能重复,请检查数据!");
  70. }
  71. }
  72. //修改方法
  73. @Override
  74. public void updateFruitItem(){
  75. //获取数据
  76. String updateNumber = updateNumberText.getText();
  77. String updateName= updateNameText.getText();
  78. String updatePrice = updatePriceText.getText();
  79. String updateUnit = updateUnitText.getText();
  80. //调用adminService的修改服务
  81. boolean updateSuccess = adminService.updateFruitItem(updateNumber,
  82. updateName, updatePrice, updateUnit);
  83. //若修改成功
  84. if(updateSuccess){
  85. //修改后刷新表格
  86. queryFruitItem();
  87. }else{
  88. //若没有修改成功,则弹出错误提示
  89. JOptionPane.showMessageDialog(this,"没有这个编号的水果,请检查数据!");
  90. }
  91. }
  92. //删除方法
  93. @Override
  94. public void delFruitItem(){
  95. //获取数据
  96. String delNumber = delNumberText.getText();
  97. //调用 adminService的删除服务
  98. boolean delSuccess = adminService.delFruitItem(delNumber) ;
  99. //若删除成功
  100. if(delSuccess){
  101. //删除后刷新表格
  102. queryFruitItem();
  103. }else{
  104. //若没有删除成功,则弹出错误提示
  105. JOptionPane.showMessageDialog(this,"没有这个编号的水果,请检查数据! ");
  106. }
  107. }
  108. }
  1. //MainFrameController.java类代码如下
  2. package cn.example.fruitstore.controller;
  3. import cn.example.fruitstore.view.AbstractMainFrame;
  4. /**
  5. *主界面操作类
  6. */
  7. @SuppressWarnings("serial")
  8. public class MainFrameController extends AbstractMainFrame {
  9. @Override
  10. public void showAdminDialog(){
  11. //在该方法中创建管理员界面并显示
  12. // this为父窗体(主界面),true表示设置为模态窗体展示
  13. new AdminDialogController(this, true).setVisible(true);
  14. }
  15. }

(3)先创建cn.example.fruitstore.dao包,在此包下创建AdminDao.java类。

  1. package cn.example.fruitstore.dao;
  2. import java.util.ArrayList;
  3. import cn.example.fruitstore.data.DataBase;
  4. import cn.example.fruitstore.domain.FruitItem;
  5. /*
  6. *管理员数据访问类
  7. */
  8. public class AdminDao{
  9. //获取所有数据
  10. public ArrayList<FruitItem> queryAllData(){
  11. return DataBase.data;
  12. }
  13. //添加数据
  14. public void addFruitItem(FruitItem fruitItem) {
  15. DataBase.data.add(fruitItem);
  16. }
  17. //删除数据
  18. public void delFruitItem(String delNumber){
  19. //查询集合中数据
  20. for(int i = 0; i < DataBase.data.size(); i++){
  21. FruitItem thisFruitItem= DataBase.data.get(i);
  22. //若有水果项的编号与传入编号相同,则从集合中删除
  23. if(thisFruitItem.getNumber().equals(delNumber)){
  24. DataBase.data.remove(i);
  25. }
  26. }
  27. }
  28. }

(4)先创建cn.example.fruitstore.data包,在此包下创建DataBase.java类。

  1. package cn.example.fruitstore.data;
  2. import java.util.ArrayList;
  3. import cn.example.fruitstore.domain.FruitItem;
  4. /**
  5. * 存储数据
  6. */
  7. public class DataBase{
  8. public static ArrayList<FruitItem> data = new ArrayList<FruitItem>();
  9. //初始数据
  10. static{
  11. data.add(new FruitItem("1","苹果",5.0,"kg"));
  12. }
  13. }

(5)先创建cn.example.fruitstore.domain包,在此包下创建FruitItem.java类。

  1. package cn.example.fruitstore.domain;
  2. /*
  3. * 水果项数据模型
  4. */
  5. public class FruitItem {
  6. //属性
  7. private String number; //水果编号
  8. private String name; //水果名称
  9. private double price;//水果单价
  10. private String unit;//计价单位
  11. //构造方法
  12. public FruitItem(){
  13. }
  14. //存储数据
  15. public FruitItem(String number, String name,double price,String unit) {
  16. super();
  17. this.number = number;
  18. this.name = name;
  19. this.price = price;
  20. this.unit = unit;
  21. }
  22. // getter和 setter方法
  23. public String getNumber() {
  24. return number;
  25. }
  26. public void setNumber(String number) {
  27. this. number = number;
  28. }
  29. public String getName(){
  30. return name;
  31. }
  32. public void setName(String name){
  33. this.name = name;
  34. }
  35. public double getPrice(){
  36. return price;
  37. }
  38. public void setPrice(double price) {
  39. this.price = price;
  40. }
  41. public String getUnit() {
  42. return unit;
  43. }
  44. public void setUnit(String unit) {
  45. this.unit = unit;
  46. }
  47. }

(6)先创建cn.example.fruitstore.service包,在此包下创建AdminService.java类。

  1. package cn.example.fruitstore.service;
  2. import java.util.ArrayList;
  3. import cn.example.fruitstore.dao.AdminDao;
  4. import cn.example.fruitstore.domain.FruitItem;
  5. /* *管理员服务类
  6. */
  7. public class AdminService{
  8. private AdminDao adminDao = new AdminDao();
  9. //查询服务
  10. public ArrayList<FruitItem> queryFruitItem(){
  11. //调用Dao层的获取所有数据方法获取所有数据
  12. ArrayList<FruitItem> data = adminDao.queryAllData();
  13. //返回数据
  14. return data;
  15. }
  16. //添加服务
  17. public boolean addFruitItem(String number,String name,String price,
  18. String unit){
  19. //调用Dao层的获取所有数据方法获取所有数据
  20. ArrayList<FruitItem> data = queryFruitItem() ;
  21. //使用输入的编号与所有数据对比
  22. for(int i=0;i<data.size(); i++) {
  23. FruitItem fruitItem = data.get(i);
  24. //若存在重复编号数据,则添加不成功
  25. if(number.equals(fruitItem.getNumber())){
  26. return false;
  27. }
  28. }
  29. //若没有重复编号,将数据封装为FruitItem对象
  30. FruitItem thisFruitItem = new FruitItem(number,name,
  31. Double.parseDouble(price), unit);
  32. //调用Dao层的添加数据方法
  33. adminDao.addFruitItem(thisFruitItem);
  34. //在添加数据后,返回添加成功
  35. return true;
  36. }
  37. //修改服务
  38. public boolean updateFruitItem(String number,String name,
  39. String price,String unit){
  40. //调用 Dao层的获取所有数据方法,获取所有数据
  41. ArrayList<FruitItem> data = queryFruitItem();
  42. //使用输入的编号与所有数据对比
  43. for(int i=0;i<data.size();i++){
  44. FruitItem fruitItem = data.get(i);
  45. //若存在相同编号数据,则可以更新
  46. if(number.equals(fruitItem.getNumber())){
  47. //调用Dao层的删除指定编号数据方法
  48. adminDao.delFruitItem(number);
  49. //若没有重复编号,则将数据封装为FruitItem对象
  50. FruitItem thisFruitItem = new FruitItem(number, name,
  51. Double.parseDouble(price), unit);
  52. //调用Dao层的添加数据方法
  53. adminDao.addFruitItem(thisFruitItem);
  54. //在修改数据后,返回添加成功
  55. return true;
  56. }
  57. }
  58. //若不存在相同编号数据,则不可以更新
  59. return false;
  60. }
  61. //删除服务
  62. public boolean delFruitItem(String delNumber) {
  63. //调用Dao层的获取所有数据方法获取所有数据
  64. ArrayList<FruitItem> data = queryFruitItem() ;
  65. //使用输入的编号与所有数据对比
  66. for(int i = 0; i< data.size(); i++){
  67. FruitItem fruitItem = data.get(i);
  68. //若存在相同编号数据,则可以删除
  69. if(delNumber.equals(fruitItem.getNumber())){
  70. //调用 Dao层的删除指定编号数据方法
  71. adminDao.delFruitItem(delNumber);
  72. //在删除数据后,返回添加成功
  73. return true;
  74. }
  75. }
  76. //若不存在相同编号数据,则不可以删除
  77. return false;
  78. }
  79. }

(7)先创建cn.example.fruitstore.test包,在此包下创建AbstractAdminDialogTest.java类和AbstractMainFrameTest.java类。

  1. //AbstractAdminDialogTest.java类代码如下
  2. package cn.example.fruitstore.test;
  3. import javax.swing.table.DefaultTableModel;
  4. import javax.swing.table.TableModel;
  5. import cn.example.fruitstore.view.AbstractSdminDialog;
  6. /*管理界面测试类*/
  7. @SuppressWarnings("serial")
  8. public class AbstractAdminDialogTest extends AbstractSdminDialog{
  9. //定义构造方法初始化数据
  10. public AbstractAdminDialogTest(){
  11. super();
  12. queryFruitItem();//测试数据
  13. }
  14. //加入测试table数据
  15. @Override
  16. public void queryFruitItem(){
  17. String [] thead = new String []{ "水果编号", "水果名称",
  18. "水果单价(/元)","计价单位"};
  19. String[][] tbody = new String[][]{
  20. {"1","苹果","5.0", "kg"},
  21. {"2","葡萄","3.2","斤"},
  22. {"3","雪梨","3.8","斤"},
  23. {"4","大榴莲", "120","个"}
  24. };
  25. TableModel data = new DefaultTableModel(tbody, thead);
  26. table.setModel(data);
  27. }
  28. @Override
  29. public void addFruitItem(){
  30. }
  31. @Override
  32. public void updateFruitItem(){
  33. }
  34. @Override
  35. public void delFruitItem(){
  36. }
  37. public static void main(String[] args) {
  38. new AbstractAdminDialogTest().setVisible(true);
  39. }
  40. }
  1. //AbstractMainFrameTest.java类代码如下
  2. package cn.example.fruitstore.test;
  3. import cn.example.fruitstore.view.AbstractMainFrame;
  4. /*主窗体测试类*/
  5. @SuppressWarnings("serial")
  6. public class AbstractMainFrameTest extends AbstractMainFrame {
  7. //定义主函数
  8. public static void main(String[] args){
  9. new AbstractMainFrameTest().setVisible(true);
  10. }
  11. //覆盖父类中展示管理员界面的方法
  12. @Override
  13. public void showAdminDialog(){
  14. System.out.println("进入管理界面");
  15. }
  16. }

(8)先创建cn.example.fruitstore.tools包,在此包下创建GUITools.java类。

  1. package cn.example.fruitstore.tools;
  2. import java.awt.Component;
  3. import java.awt.Toolkit;
  4. import javax.swing.JFrame;
  5. /*
  6. *工具类
  7. */
  8. public class GUITools {
  9. //JAVA提供的GUI默认工具类对象
  10. static Toolkit kit =Toolkit.getDefaultToolkit();
  11. //将指定组件屏幕居中
  12. public static void center(Component c){
  13. int x =(kit.getScreenSize().width - c.getWidth())/2;
  14. int y =(kit.getScreenSize().height - c.getHeight())/ 2;
  15. c.setLocation(x, y);
  16. }
  17. //为指定窗体设置图标标题
  18. public static void setTitleImage(JFrame frame, String titleIconPath) {
  19. frame.setIconImage(kit.createImage(titleIconPath));
  20. }
  21. }

(9)先创建cn.example.fruitstore.view包,在此包下创建AbstractMainFrame.java类和AbstractSdminDialog.java类。然后我们需要在src所在的文件夹内存入一个“Fruaitstore.jpg”(任意图片都行,但是敲黑板:必须把“Fruaitstore.jpg”存放在src所在文件夹内,否则图片不会运行出来!)

我就把“FruitStore.jpg”放在了这里:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzA2MjkwNw==,size_16,color_FFFFFF,t_70#pic_center

下面是AbstractMainFrame.java类和AbstractSdminDialog.java类的代码: 

  1. //AbstractMainFrame.java类代码如下
  2. package cn.example.fruitstore.view;
  3. import java.awt.BorderLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11. import cn.example.fruitstore.tools.GUITools;
  12. /**
  13. *主窗体类
  14. */
  15. @SuppressWarnings ("serial")
  16. public abstract class AbstractMainFrame extends JFrame{//组件
  17. private JLabel titleLabel = new JLabel(new ImageIcon("Fruaitstore.jpg"));//标题图片
  18. private JButton btn = new JButton("进入系统");//按钮
  19. //构造方法
  20. public AbstractMainFrame(){
  21. this.init ();
  22. this.addComponent();//添加组件
  23. this.addListener();//添加监听器
  24. }
  25. //初始化操作
  26. private void init(){
  27. this.setTitle("水果超市欢迎您!");
  28. this.setSize(600,400);//窗体大小与位置
  29. this.setResizable(true);//窗体大小不固定
  30. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗体默认操作
  31. }
  32. //添加组件
  33. private void addComponent() {
  34. //窗体使用默认的边界布局,北区放入图片
  35. this.add(this.titleLabel, BorderLayout.NORTH);
  36. //创建JPanel对象
  37. JPanel btnPanel=new JPanel();
  38. //清除布局,使JPanel中的组件可以自定义位置
  39. btnPanel.setLayout(null);
  40. //将JPanel对象添加到窗体中
  41. this.add(btnPanel);
  42. //定义边界位置
  43. btn.setBounds(240,20,120,50);//将按钮添加到JPanel对象中
  44. btnPanel.add(btn);
  45. }
  46. //添加监听器
  47. private void addListener(){
  48. btn.addActionListener(new ActionListener(){
  49. public void actionPerformed(ActionEvent e){
  50. showAdminDialog();
  51. }
  52. });
  53. }
  54. //展示管理员界面方法
  55. public abstract void showAdminDialog();
  56. }
  1. //AbstractSdminDialog.java类代码如下
  2. import java.awt.event.ActionListener;
  3. import javax.swing.JButton;
  4. import javax.swing.JDialog;
  5. import javax.swing.JLabel;
  6. import javax.swing.JScrollPane;
  7. import javax.swing.JTable;
  8. import javax.swing.JTextField;
  9. import cn.example.fruitstore.tools.GUITools;
  10. /*管理窗体类
  11. */
  12. @SuppressWarnings("serial")
  13. public abstract class AbstractSdminDialog extends JDialog{
  14. //定义界面使用到的组件作为成员变量
  15. private JLabel tableLabel = new JLabel("水果列表");//水果列表标题
  16. private JScrollPane tablePane = new JScrollPane();//滚动窗口
  17. protected JTable table = new JTable();//水果列表
  18. private JLabel numberLabel = new JLabel("水果编号");//编号标题
  19. private JLabel nameLabel = new JLabel("水果名称");//名称标题
  20. private JLabel priceLabel = new JLabel("水果单价");//单位标题
  21. private JLabel unitLabel = new JLabel("计价单位");//计价单位标题
  22. //添加功能组件
  23. protected JTextField addNumberText = new JTextField(6);//添加编号文本框
  24. protected JTextField addNameText = new JTextField(6);//添加名称文本框
  25. protected JTextField addPriceText = new JTextField(6);//添加单价文本框
  26. protected JTextField addUnitText = new JTextField(6);//添加计价单位文本框
  27. private JButton addBtn = new JButton("添加水果");//添加按钮
  28. //修改功能组件
  29. protected JTextField updateNumberText = new JTextField(6);//修改编号文本框
  30. protected JTextField updateNameText = new JTextField(6);//修改名称文本框
  31. protected JTextField updatePriceText = new JTextField(6);//修改单价文本框
  32. protected JTextField updateUnitText = new JTextField(6);
  33. //修改计价单位文本框
  34. private JButton updateBtn = new JButton("修改水果");//修改按钮
  35. //删除功能组件
  36. protected JTextField delNumberText = new JTextField(6);//添加编号文本
  37. private JButton delBtn = new JButton("删除水果");//删除按钮
  38. //构造方法
  39. public AbstractSdminDialog(){
  40. this(null,true);
  41. }
  42. public AbstractSdminDialog (Frame owner, boolean modal){
  43. super(owner,modal);
  44. this.init();//初始化操作
  45. this.addComponent();//添加组件
  46. this.addListener();//添加监听器
  47. }
  48. //初始化操作
  49. private void init(){
  50. this.setTitle("超市货物管理!");//标题
  51. this.setSize(600,400);//窗体大小与位置
  52. GUITools.center(this);//设置窗体在屏幕上的位置
  53. this.setResizable(false);//窗体大小固定
  54. }
  55. //添加组件
  56. private void addComponent() {
  57. //取消布局
  58. this.setLayout(null);
  59. //表格标题
  60. tableLabel.setBounds(265,20,70,25);
  61. this.add(tableLabel);
  62. //表格
  63. table.getTableHeader().setReorderingAllowed(false);//列不能移动
  64. table.getTableHeader().setResizingAllowed(false);//不可拉动表格
  65. table.setEnabled(false);//不可更改数据
  66. tablePane.setBounds(50,50,500,200);
  67. tablePane.setViewportView(table);//视口装入表格
  68. this.add(tablePane);
  69. //字段标题
  70. numberLabel .setBounds(50,250,70,25);
  71. nameLabel.setBounds(150,250,70,25);
  72. priceLabel.setBounds(250, 250, 70,25);
  73. unitLabel.setBounds(350,250,70,25);
  74. this.add(numberLabel);
  75. this.add(nameLabel);
  76. this.add(priceLabel);
  77. this.add(unitLabel);
  78. //增加组件
  79. addNumberText.setBounds(50,280,80,25);
  80. addNameText.setBounds(150,280,80,25);
  81. addPriceText.setBounds(250,280,80,25);
  82. addUnitText.setBounds(350,280,80,25);
  83. this.add(addNumberText);
  84. this.add(addNameText);
  85. this.add(addPriceText);
  86. this.add(addUnitText);
  87. addBtn.setBounds(460,280,90,25);
  88. this.add(addBtn);
  89. //修改组件
  90. updateNumberText.setBounds(50,310, 80,25);
  91. updateNameText.setBounds(150,310,80,25);
  92. updatePriceText.setBounds(250,310,80,25);
  93. updateUnitText.setBounds(350,310,80,25);
  94. this.add(updateNumberText);
  95. this.add(updateNameText);
  96. this.add(updatePriceText);
  97. this.add(updateUnitText);
  98. updateBtn.setBounds(460,310,90, 25);
  99. this.add(updateBtn);
  100. //删除组件
  101. delNumberText.setBounds(50,340,80,25);
  102. this.add(delNumberText);
  103. delBtn.setBounds(460,340,90,25);
  104. this.add(delBtn);
  105. }
  106. //添加监听器
  107. private void addListener(){
  108. //添加按钮监听
  109. addBtn.addActionListener(new ActionListener(){
  110. @Override
  111. public void actionPerformed(ActionEvent e){
  112. //调用添加方法
  113. addFruitItem();}
  114. });
  115. //修改按钮监听
  116. updateBtn.addActionListener(new ActionListener(){
  117. @Override
  118. public void actionPerformed(ActionEvent e){
  119. //调用修改方法
  120. updateFruitItem();
  121. }
  122. });
  123. //删除按钮监听
  124. delBtn.addActionListener(new ActionListener(){
  125. @Override
  126. public void actionPerformed(ActionEvent e){
  127. //调用删除方法
  128. delFruitItem();
  129. }
  130. });
  131. }
  132. //查询方法
  133. public abstract void queryFruitItem();
  134. //添加方法
  135. public abstract void addFruitItem();
  136. //修改方法
  137. public abstract void updateFruitItem();
  138. //删除方法
  139. public abstract void delFruitItem();
  140. }

案例运行结果:

首先,我们运行cn.example.fruitstore.app包下的MainApp.java类文件,再将窗口左右上下拉大后会看到如下画面:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzA2MjkwNw==,size_16,color_FFFFFF,t_70#pic_center

 

点击【进入系统】后,出现如下画面(这里画面的关于苹果的数据是我们编码时输入的,也就是系统默认的数据):
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NzA2MjkwNw==,size_16,color_FFFFFF,t_70#pic_center

 

 

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

闽ICP备14008679号