Java-单机版的书店管理系统(练习设计模块和思想_系列 四(5) )

简介: Java-单机版的书店管理系统(练习设计模块和思想_系列 四(5) )

|||||||||||||||||||||||||||||||||||||||||||||||||||

实现类:UserDaoSerImpl

package cn.hncu.bookStore.user.dao.impl;
import java.util.ArrayList;
import java.util.List;
import cn.hncu.bookStore.common.UserTypeEnum;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.dao.dao.UserDao;
import cn.hncu.bookStore.user.vo.UserModel;
import cn.hncu.bookStore.user.vo.UserQueryModel;
import cn.hncu.bookStore.util.FileIoUtil;
/**
 * <br/>
 * 对用户数据处理的具体实现类 ----实现了UserDao接口
 * 
 * @author 陈浩翔
 * 
 * @version 1.0
 */
public class UserDaoSerImpl implements UserDao {
    private static final String FILE_NAME = "User.txt";
    @Override
    public boolean create(UserModel user) {
        // 1先把已有的数据反序列化(读)出来
        List<UserModel> list = FileIoUtil.readFormFile(FILE_NAME);
        // 2判断该用户是否已经存在,再决定是否创建
        for (UserModel userModel : list) {
            // 如果2个用户的uuid相等,用户就是相同的
            if (userModel.getUuid().equals(user.getUuid())) {
                return false;// 用户已经存在了,返回false
            }
        }
        // 3如果用户不存在,就创建
        list.add(user);
        FileIoUtil.write2file(list, FILE_NAME);
        return true;// 创建成功,返回true
    }
    @Override
    public boolean delete(String uuid) {
        // 1先把已有的数据反序列化(读)出来
        List<UserModel> list = FileIoUtil.readFormFile(FILE_NAME);
        // 2判断该用户是否已经存在,再决定是否删除
        // for(int i=0;i<list.size();i++){
        // if(list.get(i).getUuid().equals(uuid)){
        // list.remove(i);
        // FileIoUtil.write2file(list, FILE_NAME);
        // return true;
        // }
        // }
        for (UserModel userModel : list) {
            // 如果2个用户的uuid相等,用户就是相同的
            if (userModel.getUuid().equals(uuid)) {
                list.remove(userModel);
                FileIoUtil.write2file(list, FILE_NAME);
                // 删除成功,返回true
                return true;
            }
        }
        // 3用户不存在
        // 删除失败,返回false
        return false;
    }
    @Override
    public boolean update(UserModel user) {
        // 1先把已有的数据反序列化(读)出来
        List<UserModel> list = FileIoUtil.readFormFile(FILE_NAME);
        // 2判断该用户是否已经存在,再决定是否创建
        for (int i = 0; i < list.size(); i++) {
            // uuid是不能改的,通过uuid来找到那个用户数据,再修改就ok了
            if (list.get(i).getUuid().equals(user.getUuid())) {
                // 将找到的用户修改成user
                list.set(i, user);
                FileIoUtil.write2file(list, FILE_NAME);
                // 找到用户,返回true
                return true;
            }
        }
        // 3若该用户不存在,则修改失败
        return false;
    }
    @Override
    public List<UserModel> getAll() {
        return FileIoUtil.readFormFile(FILE_NAME);
    }
    @Override
    public List<UserModel> getbyCondition(UserQueryModel uqm) {
        List<UserModel> list = UserEbiFactory.getUserEbi().getAll();
        List<UserModel> results = new ArrayList<UserModel>();
        for(UserModel user : list){
            //反逻辑,卫条件: 外层判断用户输入是否是查询条件;内层判断该对象是否符合查询条件
            if(uqm.getUuid()!=null&&uqm.getUuid().trim().length()>0){//外层判断
                if(!user.getUuid().equals(uqm.getUuid())){//内层判断--精确查询
                    continue;
                }
            }
            if(uqm.getName()!=null&&uqm.getName().trim().length()>0){//外层判断
                if(user.getName().indexOf(uqm.getName())==-1){//内层判断--模糊查询
                    continue;
                }
            }
            if(uqm.getType()>0){//外层判断
                    if(user.getType()!=uqm.getType()){//内层判断--精确查询
                        continue;
                }
            }
            results.add(user);
        }
        return results;
    }
    @Override
    public UserModel getSingle(String uuid) {
        // 1先把已有的数据反序列化(读)出来
        List<UserModel> list = FileIoUtil.readFormFile(FILE_NAME);
        // 2判断该用户是否已经存在,存在就返回那个用户
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getUuid().equals(uuid)) {
                return list.get(i);
            }
        }
        // 3若该用户不存在,返回null
        return null;
    }
}

|||||||||||||||||||||||||||||||||||||||||||||||||

工厂方法:UserDaoFactory

package cn.hncu.bookStore.user.dao.factory;
import cn.hncu.bookStore.user.dao.dao.UserDao;
import cn.hncu.bookStore.user.dao.impl.UserDaoSerImpl;
/**
 * 工厂方法<br/>
 * new 一个dao的实例
 * @author 陈浩翔
 *
 * @version 1.0
 * 
 */
public class UserDaoFactory {
    public static UserDao getUserDao(){
        return new UserDaoSerImpl();
    }
}

用户模块逻辑层:

UserEbi 接口:

package cn.hncu.bookStore.user.business.ebi;
import java.util.List;
import cn.hncu.bookStore.user.vo.UserModel;
import cn.hncu.bookStore.user.vo.UserQueryModel;
/**
 * 逻辑层的接口
 *
 * @author chx
 * @version 1.0
 */
public interface UserEbi {
    /**
     * 功能:创建一个用户
     * 
     * @param userModel---将要创建的用户数据
     * @return---true表示创建成功,false表示创建失败
     */
    public boolean create(UserModel user);
    /**
     * 功能:根据用户的唯一标识码uuid删除一个用户
     * 
     * @param uuid---用户唯一的标识码,每个用户都不会相同
     * @return---true表示删除成功,false表示删除失败
     */
    public boolean delete(String uuid);
    /**
     * 功能:修改用户的数据资料
     * 
     * @param user---需要修改的用户数据参数名
     * @return 返回true-表示修改成功了,返回false-表示修改失败
     */
    public boolean update(UserModel user);
    /**
     * 功能:得到所有的用户数据
     * 
     * @return---一个UserModel集合,也就是用户的数据
     */
    public List<UserModel> getAll();
    /**
     * 功能:按照一定的查找条件进行查找,
     * <br/>
     * 把满足查找条件的用户数据返回。
     * 
     * @param uqm---被封装的查找条件
     * @return---满足查找条件的用户数据集合
     */
    public List<UserModel> getbyCondition(UserQueryModel uqm);
    /**
     * 功能:得到一个确定的用户的数据资料
     * 
     * @param uuid---用户唯一标识码
     * @return ---返回按这个唯一标识码找到的用户数据
     */
    public UserModel getSingle(String uuid);
}


||||||||||||||||||||||||||||||||||||||||||||||||||

具体实现类:UserEbo

package cn.hncu.bookStore.user.business.ebo;
import java.util.List;
import cn.hncu.bookStore.common.UuidModelConstance;
import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory;
import cn.hncu.bookStore.common.uuid.vo.UuidModel;
import cn.hncu.bookStore.user.business.ebi.UserEbi;
import cn.hncu.bookStore.user.dao.dao.UserDao;
import cn.hncu.bookStore.user.dao.factory.UserDaoFactory;
import cn.hncu.bookStore.user.vo.UserModel;
import cn.hncu.bookStore.user.vo.UserQueryModel;
/**
 * 逻辑层的实现类
 * @author 陈浩翔
 * @version 1.0
 */
public class UserEbo implements UserEbi{
    //注入
    private UserDao dao = UserDaoFactory.getUserDao();
    @Override
    public boolean create(UserModel user) {
        //如果表现层中对user对象的数据没有封装完整,那么在这里要为它补全
        //调用uuid模块的dao层来自动获取当前user对象的uuid
        String uuid = UuidDaoFactory.getUuidDao().getNextUuid(UuidModelConstance.USER);
        user.setUuid(uuid);
        return dao.create(user);
    }
    @Override
    public boolean delete(String uuid) {
        return dao.delete(uuid);
    }
    @Override
    public boolean update(UserModel user) {
        return dao.update(user);
    }
    @Override
    public List<UserModel> getAll() {
        return dao.getAll();
    }
    @Override
    public List<UserModel> getbyCondition(UserQueryModel uqm) {
        return dao.getbyCondition(uqm);
    }
    @Override
    public UserModel getSingle(String uuid) {
        return dao.getSingle(uuid);
    }
}

||||||||||||||||||||||||||||||||||||||||||||

工厂方法:UserEbiFactory

package cn.hncu.bookStore.user.business.factory;
import cn.hncu.bookStore.user.business.ebi.UserEbi;
import cn.hncu.bookStore.user.business.ebo.UserEbo;
/**
 * 
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class UserEbiFactory {
    public static UserEbi getUserEbi(){
        return new UserEbo();
    }
}

|||||||||||||||||||||||||||||||||||||||

用户模块表现层:

用户列表:ListPanel

/*
 * ListPanel.java
 *
 * Created on __DATE__, __TIME__
 */
package cn.hncu.bookStore.user.ui;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import cn.hncu.bookStore.user.business.ebi.UserEbi;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.vo.UserModel;
/**
 * 表现层-用户列表面板
 * 
 * @author 陈浩翔
 * @version 1.0
 */
public class ListPanel extends javax.swing.JPanel {
    private JFrame mainFrame = null;
    /** Creates new form ListPanel */
    public ListPanel(JFrame mainFrame) {
        this.mainFrame = mainFrame;
        initComponents();
        myInitData();
    }
    public ListPanel(JFrame mainFrame, List<UserModel> results) {
        this.mainFrame = mainFrame;
        initComponents();
        userLists.setListData(results.toArray());
    }
    /**
     * 读取所有用户并添加进列表
     */
    private void myInitData() {
        UserEbi user = UserEbiFactory.getUserEbi();
        List<UserModel> list = user.getAll();
        userLists.setListData(list.toArray());
    }
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        userLists = new javax.swing.JList();
        jLabel1 = new javax.swing.JLabel();
        btnToAdd = new javax.swing.JButton();
        btnToDelete = new javax.swing.JButton();
        btnToUpdate = new javax.swing.JButton();
        btnToQuery = new javax.swing.JButton();
        setMinimumSize(new java.awt.Dimension(800, 600));
        setLayout(null);
        userLists.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "" };
            public int getSize() {
                return strings.length;
            }
            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        jScrollPane1.setViewportView(userLists);
        add(jScrollPane1);
        jScrollPane1.setBounds(170, 80, 480, 230);
        jLabel1.setFont(new java.awt.Font("Dialog", 1, 48));
        jLabel1.setForeground(new java.awt.Color(204, 0, 51));
        jLabel1.setText("\u7528\u6237\u5217\u8868");
        add(jLabel1);
        jLabel1.setBounds(300, 0, 260, 80);
        btnToAdd.setFont(new java.awt.Font("Dialog", 1, 24));
        btnToAdd.setForeground(new java.awt.Color(0, 102, 102));
        btnToAdd.setText("\u6dfb\u52a0\u7528\u6237");
        btnToAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnToAddActionPerformed(evt);
            }
        });
        add(btnToAdd);
        btnToAdd.setBounds(160, 350, 150, 50);
        btnToDelete.setFont(new java.awt.Font("Dialog", 1, 24));
        btnToDelete.setForeground(new java.awt.Color(0, 102, 102));
        btnToDelete.setText("\u5220\u9664\u7528\u6237");
        btnToDelete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnToDeleteActionPerformed(evt);
            }
        });
        add(btnToDelete);
        btnToDelete.setBounds(510, 350, 150, 50);
        btnToUpdate.setFont(new java.awt.Font("Dialog", 1, 24));
        btnToUpdate.setForeground(new java.awt.Color(0, 102, 102));
        btnToUpdate.setText("\u4fee\u6539\u7528\u6237");
        btnToUpdate.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnToUpdateActionPerformed(evt);
            }
        });
        add(btnToUpdate);
        btnToUpdate.setBounds(160, 450, 150, 50);
        btnToQuery.setFont(new java.awt.Font("Dialog", 1, 24));
        btnToQuery.setForeground(new java.awt.Color(0, 102, 102));
        btnToQuery.setText("\u67e5\u627e\u7528\u6237");
        btnToQuery.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnToQueryActionPerformed(evt);
            }
        });
        add(btnToQuery);
        btnToQuery.setBounds(510, 450, 150, 50);
    }// </editor-fold>
    //GEN-END:initComponents
    private void btnToQueryActionPerformed(java.awt.event.ActionEvent evt) {
        mainFrame.setContentPane(new QueryPanel(mainFrame));
        mainFrame.validate();
    }
    private void btnToUpdateActionPerformed(java.awt.event.ActionEvent evt) {
        UserModel user = (UserModel) userLists.getSelectedValue();
        if (user == null) {
            JOptionPane.showMessageDialog(mainFrame, "请选择要修改的用户!");
            return;
        }
        String uuid = user.getUuid();
        mainFrame.setContentPane(new UpdatePanel(mainFrame, uuid));
        mainFrame.validate();
    }
    private void btnToDeleteActionPerformed(java.awt.event.ActionEvent evt) {
        UserModel user = (UserModel) userLists.getSelectedValue();
        if (user == null) {
            JOptionPane.showMessageDialog(mainFrame, "请选择要删除的用户!");
            return;
        }
        String uuid = user.getUuid();
        mainFrame.setContentPane(new DeletePanel(mainFrame, uuid));
        mainFrame.validate();
    }
    private void btnToAddActionPerformed(java.awt.event.ActionEvent evt) {
        mainFrame.setContentPane(new AddPanel(mainFrame));
        mainFrame.validate();
    }
    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton btnToAdd;
    private javax.swing.JButton btnToDelete;
    private javax.swing.JButton btnToQuery;
    private javax.swing.JButton btnToUpdate;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList userLists;
    // End of variables declaration//GEN-END:variables
}

|||||||||||||||||||||||||||||||||||||||||

添加用户:AddPanel

/*
 * AddPanel.java
 *
 * Created on __DATE__, __TIME__
 */
package cn.hncu.bookStore.user.ui;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import cn.hncu.bookStore.common.UserTypeEnum;
import cn.hncu.bookStore.user.business.ebi.UserEbi;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.vo.UserModel;
import cn.hncu.bookStore.util.FileIoUtil;
/**
 *
 * @author  陈浩翔
 */
public class AddPanel extends javax.swing.JPanel {
    private JFrame mainFrame = null;
    /** Creates new form AddPanel */
    public AddPanel(JFrame mainFrame) {
        this.mainFrame = mainFrame;
        initComponents();
        myInitData();
    }
    private void myInitData() {
        for (UserTypeEnum type : UserTypeEnum.values()) {
            combType.addItem(type.getName());
        }
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        tfdName = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        tfdPwd2 = new javax.swing.JPasswordField();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        combType = new javax.swing.JComboBox();
        tfdPwd = new javax.swing.JPasswordField();
        btnAdd = new javax.swing.JButton();
        btnBack = new javax.swing.JButton();
        setMinimumSize(new java.awt.Dimension(800, 600));
        setLayout(null);
        jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 48));
        jLabel1.setForeground(new java.awt.Color(204, 0, 0));
        jLabel1.setText("\u6dfb\u52a0\u7528\u6237");
        add(jLabel1);
        jLabel1.setBounds(270, 30, 230, 80);
        jLabel2.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel2.setText("\u7528\u6237\u7c7b\u578b:");
        add(jLabel2);
        jLabel2.setBounds(370, 190, 90, 30);
        tfdName.setFont(new java.awt.Font("Dialog", 1, 18));
        tfdName.setAutoscrolls(false);
        add(tfdName);
        tfdName.setBounds(180, 190, 120, 30);
        jLabel4.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel4.setText("\u59d3\u540d:");
        add(jLabel4);
        jLabel4.setBounds(120, 190, 50, 30);
        tfdPwd2.setFont(new java.awt.Font("宋体", 1, 18));
        add(tfdPwd2);
        tfdPwd2.setBounds(470, 300, 170, 30);
        jLabel5.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel5.setText("\u5bc6\u7801:");
        add(jLabel5);
        jLabel5.setBounds(120, 300, 50, 30);
        jLabel6.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel6.setText("\u786e\u8ba4\u5bc6\u7801:");
        add(jLabel6);
        jLabel6.setBounds(380, 300, 90, 30);
        combType.setFont(new java.awt.Font("Dialog", 1, 18));
        combType.setForeground(new java.awt.Color(51, 51, 255));
        combType.setModel(new javax.swing.DefaultComboBoxModel(
                new String[] { "请选择..." }));
        add(combType);
        combType.setBounds(470, 190, 160, 30);
        tfdPwd.setFont(new java.awt.Font("宋体", 1, 18));
        add(tfdPwd);
        tfdPwd.setBounds(190, 300, 160, 30);
        btnAdd.setFont(new java.awt.Font("Dialog", 1, 24));
        btnAdd.setForeground(new java.awt.Color(0, 204, 204));
        btnAdd.setText("\u6dfb\u52a0");
        btnAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddActionPerformed(evt);
            }
        });
        add(btnAdd);
        btnAdd.setBounds(190, 430, 120, 60);
        btnBack.setFont(new java.awt.Font("Dialog", 1, 24));
        btnBack.setForeground(new java.awt.Color(0, 204, 204));
        btnBack.setText("\u8fd4\u56de");
        btnBack.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBackActionPerformed(evt);
            }
        });
        add(btnBack);
        btnBack.setBounds(520, 430, 120, 60);
    }// </editor-fold>
    //GEN-END:initComponents
    private void back() {
        mainFrame.setContentPane(new ListPanel(mainFrame));
        mainFrame.validate();
    }
    /**
     *监听返回按钮
     * @param 返回按钮的点击监听
     */
    private void btnBackActionPerformed(java.awt.event.ActionEvent evt) {
        back();
    }
    private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {
        //1收集参数
        String name = tfdName.getText();
        String pwd = new String(tfdPwd.getPassword());
        String pwd2 = new String(tfdPwd2.getPassword());
        if (name.equals("") || name.equals(null)) {
            JOptionPane.showMessageDialog(mainFrame, "用户名为空,请重新输入!");
            return;
        }
        if (!pwd.equals(pwd2) || pwd.equals("") || pwd.equals(null)
                || pwd2.equals("") || pwd2.equals(null)) {
            JOptionPane.showMessageDialog(mainFrame, "两次密码输入不一致或密码为空,请重新输入!");
            return;
        }
        int type = 0;
        try {
            type = UserTypeEnum.getTypeByName(combType.getSelectedItem()
                    .toString());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(mainFrame, "请指定用户类型!");
            return;
        }
        //2组织参数
        UserModel user = new UserModel();
        user.setName(name);
        user.setPwd(pwd);
        user.setType(type);
        //3调用逻辑层
        UserEbi ebi = UserEbiFactory.getUserEbi();
        //4根据调用返回结果导向不同页面
        if (ebi.create(user)) {
            back();
        } else {
            JOptionPane.showMessageDialog(null, "该用户已经存在!");
        }
    }
    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton btnAdd;
    private javax.swing.JButton btnBack;
    private javax.swing.JComboBox combType;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JTextField tfdName;
    private javax.swing.JPasswordField tfdPwd;
    private javax.swing.JPasswordField tfdPwd2;
    // End of variables declaration//GEN-END:variables
}
目录
相关文章
|
13天前
|
JavaScript Java 测试技术
基于Java的金融支付终端管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的金融支付终端管理系统的设计与实现(源码+lw+部署文档+讲解等)
29 1
|
4天前
|
Java 数据库
Java实现超市管理系统(含数据库)
Java实现超市管理系统(含数据库)
|
7天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
11 0
|
13天前
|
JavaScript Java 测试技术
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
13 0
|
13天前
|
JavaScript Java 测试技术
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)
28 0
基于Java的心理预约咨询管理系统的设计与实现(源码+lw+部署文档+讲解等)
|
13天前
|
JavaScript Java 测试技术
基于Java的企业员工岗前培训管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的企业员工岗前培训管理系统的设计与实现(源码+lw+部署文档+讲解等)
26 1
基于Java的企业员工岗前培训管理系统的设计与实现(源码+lw+部署文档+讲解等)
|
13天前
|
JavaScript Java 测试技术
基于Java的电竞交互管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的电竞交互管理系统的设计与实现(源码+lw+部署文档+讲解等)
24 0
基于Java的电竞交互管理系统的设计与实现(源码+lw+部署文档+讲解等)
|
13天前
|
JavaScript Java 测试技术
基于Java的高校毕业生就业管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的高校毕业生就业管理系统的设计与实现(源码+lw+部署文档+讲解等)
27 0
基于Java的高校毕业生就业管理系统的设计与实现(源码+lw+部署文档+讲解等)
|
13天前
|
JavaScript Java 测试技术
基于Java的医疗企业管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的医疗企业管理系统的设计与实现(源码+lw+部署文档+讲解等)
22 0
基于Java的医疗企业管理系统的设计与实现(源码+lw+部署文档+讲解等)
|
13天前
|
JavaScript Java 测试技术
基于Java的家纺用品销售管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的家纺用品销售管理系统的设计与实现(源码+lw+部署文档+讲解等)
22 0