项目——学生信息管理系统4

news2024/12/26 23:20:23

目录

学生模块的功能实现

1. 创建Student实体类型

编写StudentDao 提供添加学生的方法

创建 学生添加页面

创建 AddStudentFrm 页面 注意创建成JInternalFrame类型

注意:把main方法注释掉

回到 MainFrm.java 页面 给添加学生按钮绑定事件

当打开 AddStudentFrm页面时,填充所属班级信息

在 AddStudentFrm 提供填充班级方法

在构造方法里面调用 setStudentClassInfo() 方法

测试

添加学生功能的实现

在提供一个重置的方法

测试一下

创建学生列表页面 ManageStudentFrm 注意创建成:JInternalFrame 类型

剩余的参照之前去做,最后如下图

在StudentDao 中,提供查询所有学生的方法

ManageStudentFrm 页面一打开,填充表格数据

ManageStudentFrm 页面一打开给所属班级下拉框填入数据

回到 MainFrm.java 页面,给 学生列表按钮绑定事件

测试

给查询按钮绑定事件

给表格每一行添加点击事件

测试

给删除按钮绑定事件

在 StudentDao中提供删除学生的方法

编写代码进行删除操作

给修改按钮绑定事件

在 StudentDao 中 提供修改的方法

回到 LoginFrm 登录页面,我们要加上 学生登录的判断

先在 StudentDao 中提供登录的方法

在 LoginFrm 中进行判断 如果是学生

回到 EditPwdFrm 页面,判断如果是学生修改密码

先在StudentDao 中提供修改密码的方法啊

在 EditPwdFrm 页面,判断如果是学生修改密码

在 EditPwdFrm 页面的构造方法里面,根据不同身份进行提示

测试:用学生登录,以及修改密码


学生模块的功能实现

1. 创建Student实体类型

public class Student {
    private int id;
    private String name;
    private int classId;
    private String password;
    private String sex;
    //get set 方法自己补上
}   

编写StudentDao 提供添加学生的方法

public class StudentDao {
    
    public boolean addStudent(Student student) {
        
        try {
            Connection con = JDBCUtils.getConnection();
            String sql = "insert into s_student values(null,?,?,?,?)";
            java.sql.PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, student.getName());
            preparedStatement.setInt(2, student.getClassId());
            preparedStatement.setString(3, student.getPassword());
            preparedStatement.setString(4, student.getSex());
            if (preparedStatement.executeUpdate() > 0)
                return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
}   

创建 学生添加页面

创建 AddStudentFrm 页面 注意创建成JInternalFrame类型

注意:把main方法注释掉

回到 MainFrm.java 页面 给添加学生按钮绑定事件

//添加学生按钮事件
        menuItem_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                openAddStudentFrm(e);
            }
        });

//打开添加学生页面
    protected void openAddStudentFrm(ActionEvent e) {
        // TODO Auto-generated method stub
        AddStudentFrm addStudentFrm = new AddStudentFrm();
        addStudentFrm.setVisible(true);
        desktopPane.add(addStudentFrm);
    }
​

当打开 AddStudentFrm页面时,填充所属班级信息

在 AddStudentFrm 提供填充班级方法

 //把班级填充到下拉框中
    private void setStudentClassInfo() {
        ClassDao classDao = new ClassDao();
        List<StudentClass> classList = classDao.getClassList(new StudentClass());
        for (StudentClass sc : classList) {
            studentClassComboBox.addItem(sc);
        }
    }

在构造方法里面调用 setStudentClassInfo() 方法

测试

添加学生功能的实现

给 确认添加按钮,绑定一个点击事件

//添加学生的事件绑定
        addStudentButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取一个方法
                studentAddAct(e);
            }
        });
//添加学生
    protected void studentAddAct(ActionEvent ae) {
        // TODO Auto-generated method stub
        String studentName = studentNameTextField.getText().toString();
        String studentPassword = studentPasswordField.getText().toString();
        if (StringUtil.isEmpty(studentName)) {
            JOptionPane.showMessageDialog(this, "请填写学生姓名!");
            return;
        }
        if (StringUtil.isEmpty(studentPassword)) {
            JOptionPane.showMessageDialog(this, "请填写密码!");
            return;
        }
        StudentClass sc = (StudentClass) studentClassComboBox.getSelectedItem();
        String sex = studentSexManRadioButton.isSelected() ? studentSexManRadioButton.getText()
                : (studentSexFemalRadioButton.isSelected() ? studentSexFemalRadioButton.getText()
                        : studentSexUnkonwRadioButton.getText());
        Student student = new Student();
        student.setName(studentName);
        student.setClassId(sc.getId());
        student.setPassword(studentPassword);
        student.setSex(sex);
        StudentDao studentDao = new StudentDao();
        if (studentDao.addStudent(student)) {
            JOptionPane.showMessageDialog(this, "添加成功!");
        } else {
            JOptionPane.showMessageDialog(this, "添加失败!");
        }
        //添加完重置
        resetValue(ae);
    }

在提供一个重置的方法

// 重置的方法,如果有需要可以调用下
    protected void resetValue(ActionEvent ae) {
        // TODO Auto-generated method stub
        studentNameTextField.setText("");
        studentPasswordField.setText("");
        studentClassComboBox.setSelectedIndex(0);
        buttonGroup.clearSelection();
        // studentSexManRadioButton.setSelected(true); 把男的按钮设置为选中
    }

测试一下

创建学生列表页面 ManageStudentFrm 注意创建成:JInternalFrame 类型

剩余的参照之前去做,最后如下图

给组件起的名字如下

private JTextField serachStudentNameTextField;
	private JTable studentListTable;
	private JTextField editStudentNameTextField;
	private JPasswordField editStudentPasswordPasswordField;
	private JComboBox searchStudentComboBox;
	private List<StudentClass> studentClassList ;
	private JComboBox editStudentClassComboBox;
	private ButtonGroup editSexButtonGroup;
	private JRadioButton editStudentSexManRadioButton;
	private JRadioButton editStudentSexFemalRadioButton;
	private JRadioButton editStudentSexUnkonwRadioButton;
	private JButton deleteStudentButton;

在StudentDao 中,提供查询所有学生的方法

public List<Student> getStudentList(Student student) {
		
		List<Student> retList = new ArrayList<Student>();
		StringBuffer sqlString = new StringBuffer("select * from s_student");
		if (!StringUtil.isEmpty(student.getName())) {
			sqlString.append(" and name like '%" + student.getName() + "%'");
		}
		if (student.getClassId() != 0) {
			sqlString.append(" and classId =" + student.getClassId());
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con
					.prepareStatement(sqlString.toString().replaceFirst("and", "where"));
			ResultSet executeQuery = preparedStatement.executeQuery();
			while (executeQuery.next()) {
				Student s = new Student();
				s.setId(executeQuery.getInt("id"));
				s.setName(executeQuery.getString("name"));
				s.setClassId(executeQuery.getInt("classId"));
				s.setSex(executeQuery.getString("sex"));
				s.setPassword(executeQuery.getString("password"));
				retList.add(s);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retList;
	}

ManageStudentFrm 页面一打开,填充表格数据

在 ManageStudentFrm 提供方法 setTable()方法

//填充表格数据
	private void setTable(Student student){
		DefaultTableModel dft = (DefaultTableModel) studentListTable.getModel();
		dft.setRowCount(0);//清空表格数据
		StudentDao studentDao = new StudentDao();
		List<Student> studentList = studentDao.getStudentList(student);
		for (Student s : studentList) {
			Vector v = new Vector();
			v.add(s.getId());
			v.add(s.getName());
            //getClassNameById()把所属班级的数字,换成班级名称
			v.add(getClassNameById(s.getClassId()));
			v.add(s.getSex());
			v.add(s.getPassword());
			dft.addRow(v);
		}
		
	}
//再提供这个方法
//getClassNameById()把所属班级的数字,换成班级名称
	private String getClassNameById(int id) {
		for (StudentClass sc : studentClassList) {
			if (sc.getId() == id)
				return sc.getName();
		}
		return "";
	}

在构造方法中调用 setTable()方法

setTable(new Student());

ManageStudentFrm 页面一打开给所属班级下拉框填入数据

在 ManageStudentFrm 提供方法 setStudentClassInfo()方法

	// 给下拉框回填数据
	private void setStudentClassInfo() {
		ClassDao classDao = new ClassDao();
		studentClassList = classDao.getClassList(new StudentClass());
		for (StudentClass sc : studentClassList) {
			//给上面的下拉框回填数据
			searchStudentComboBox.addItem(sc);
			//给下面的下拉框回填数据
			editStudentClassComboBox.addItem(sc);
		}

	}

在构造方法中调用 setStudentClassInfo()方法

setStudentClassInfo();

回到 MainFrm.java 页面,给 学生列表按钮绑定事件

//学生列表按钮事件绑定
		menuItem_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//抽取个方法
				openMagageStudentFrm(e);
			}
		});
//打开学生管理页面
	protected void openMagageStudentFrm(ActionEvent e) {
		// TODO Auto-generated method stub
		ManageStudentFrm manageStudentFrm = new ManageStudentFrm();
		manageStudentFrm.setVisible(true);
		desktopPane.add(manageStudentFrm);
		
	}

测试

给查询按钮绑定事件

//条件查询按钮,绑定事件
		searchButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				searchStudent(ae);
			}
		});
//条件查询
	protected void searchStudent(ActionEvent ae) {
		// TODO Auto-generated method stub
		Student student = new Student();
		student.setName(serachStudentNameTextField.getText().toString());
		StudentClass sc = (StudentClass) searchStudentComboBox.getSelectedItem();
		student.setClassId(sc.getId());
		//再次填充数据
		setTable(student);
	}

给表格每一行添加点击事件

//给表格的每一行添加点击事件
		studentListTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				//抽取个方法,把点击的那一行的数据,展示到编辑框
				selectedTableRow(arg0);
			}
		});

展示你点击的那一行数据

// 把表格点击的那一行数据,展示出来
	protected void selectedTableRow(MouseEvent me) {
		// 获取表格模型
		DefaultTableModel dft = (DefaultTableModel) studentListTable.getModel();
		// 获取第二列的数据进行填充
		editStudentNameTextField.setText(dft.getValueAt(studentListTable.getSelectedRow(), 1).toString());
		// 填充密码
		editStudentPasswordPasswordField.setText(dft.getValueAt(studentListTable.getSelectedRow(), 4).toString());
		// 获取班级名称
		String className = dft.getValueAt(studentListTable.getSelectedRow(), 2).toString();
		//循环下拉框选项,进行判断,填充
		for (int i = 0; i < editStudentClassComboBox.getItemCount(); i++) {
			StudentClass sc = (StudentClass) editStudentClassComboBox.getItemAt(i);
			if (className.equals(sc.getName())) {
				editStudentClassComboBox.setSelectedIndex(i);
			}
		}
		// 获取性别
		String sex = dft.getValueAt(studentListTable.getSelectedRow(), 3).toString();
		//清空按钮组所选
		editSexButtonGroup.clearSelection();
		//判断勾选哪个性别
		if (sex.equals(editStudentSexManRadioButton.getText())) {
			editStudentSexManRadioButton.setSelected(true);
		}

		if (sex.equals(editStudentSexFemalRadioButton.getText())) {
			editStudentSexFemalRadioButton.setSelected(true);
		}

		if (sex.equals(editStudentSexUnkonwRadioButton.getText())) {
			editStudentSexUnkonwRadioButton.setSelected(true);
		}

	}

测试

给删除按钮绑定事件

在 StudentDao中提供删除学生的方法

//删除学生
	public boolean delete(int id) {
		String sql = "delete from s_student where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, id);
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

编写代码进行删除操作

	//删除按钮绑定事件
		deleteStudentButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				//抽取方法进行删除
				deleteStudent(ae);
			}
		});
//删除学生操作
	protected void deleteStudent(ActionEvent ae) {
		//获取选中行的索引
		int row = studentListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选中要删除的数据!");
			return;
		}
		if (JOptionPane.showConfirmDialog(this, "您确定删除么?") != JOptionPane.OK_OPTION) {
			return;
		}
		StudentDao studentDao = new StudentDao();
		//获取第一列的id
		int id = Integer.parseInt(studentListTable.getValueAt(row, 0).toString());
		if (studentDao.delete(id)) {
			JOptionPane.showMessageDialog(this, "删除成功!");
		} else {
			JOptionPane.showMessageDialog(this, "删除失败!");
		}

		//重新填充表格数据
		setTable(new Student());
	}

给修改按钮绑定事件

在 StudentDao 中 提供修改的方法

//修改学生
	public boolean update(Student student) {
		String sql = "update s_student set name=?, classId=?,sex=?,password=? where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setString(1, student.getName());
			preparedStatement.setInt(2, student.getClassId());
			preparedStatement.setString(3, student.getSex());
			preparedStatement.setString(4, student.getPassword());
			preparedStatement.setInt(5, student.getId());
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
//修改按钮绑定事件
		submitEditButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				submitEditAct(ae);
			}
		});
//修改操作
	protected void submitEditAct(ActionEvent ae) {
		// TODO Auto-generated method stub
		int row = studentListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选中要修改的数据!");
			return;
		}
		String studentName = editStudentNameTextField.getText().toString();
		String studentPassword = editStudentPasswordPasswordField.getText().toString();
		if (StringUtil.isEmpty(studentName)) {
			JOptionPane.showMessageDialog(this, "请填写学生姓名!");
			return;
		}
		if (StringUtil.isEmpty(studentPassword)) {
			JOptionPane.showMessageDialog(this, "请填写密码!");
			return;
		}

		Student student = new Student();
		student.setName(studentName);
		student.setPassword(studentPassword);
		StudentClass sc = (StudentClass) editStudentClassComboBox.getSelectedItem();
		student.setClassId(sc.getId());
		student.setId(Integer.parseInt(studentListTable.getValueAt(row, 0).toString()));
		if (editStudentSexManRadioButton.isSelected())
			student.setSex(editStudentSexManRadioButton.getText().toString());
		if (editStudentSexFemalRadioButton.isSelected())
			student.setSex(editStudentSexFemalRadioButton.getText().toString());
		if (editStudentSexUnkonwRadioButton.isSelected())
			student.setSex(editStudentSexUnkonwRadioButton.getText().toString());
		StudentDao studentDao = new StudentDao();
		if (studentDao.update(student)) {
			JOptionPane.showMessageDialog(this, "更新成功!");
		} else {
			JOptionPane.showMessageDialog(this, "更新失败!");
		}
		//修改完成重新填充表格数据
		setTable(new Student());
	}

回到 LoginFrm 登录页面,我们要加上 学生登录的判断

先在 StudentDao 中提供登录的方法

//学生登录
	public Student login(Student student) {
		String sql = "select * from s_student where name=? and password=?";
		Student studentRst = null;

		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement prst = con.prepareStatement(sql);// 
			prst.setString(1, student.getName());
			prst.setString(2, student.getPassword());
			ResultSet executeQuery = prst.executeQuery();
			if (executeQuery.next()) {
				studentRst = new Student();
				studentRst.setId(executeQuery.getInt("id"));
				studentRst.setClassId(executeQuery.getInt("classId"));
				studentRst.setName(executeQuery.getString("name"));
				studentRst.setPassword(executeQuery.getString("password"));
				studentRst.setSex(executeQuery.getString("sex"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return studentRst;
	}

在 LoginFrm 中进行判断 如果是学生

// 点击登录按钮进行处理
	protected void userLogin(ActionEvent e) throws SQLException {
		// 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值
		String username = usernameTextField.getText().toString().trim();
		String password = passwordTextField.getText().toString().trim();
		// 获取用户的下拉选择
		UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem();
		// 判断用户名和密码是否为空
		if (StringUtil.isEmpty(username)) {
			// 弹出一个提示框进行提示
			JOptionPane.showMessageDialog(this, "用户名不能为空!");
			return; // 注意return掉
		}
		if (StringUtil.isEmpty(password)) {
			JOptionPane.showMessageDialog(this, "密码不能为空!");
			return; // 注意return掉
		}
		// 根据不同的身份进行不同的登录操作
		Admin admin = null;
		if ("管理员".equals(selectedItem.getName())) {
			//代码略...

		} else if ("教师".equals(selectedItem.getName())) {

		} else {
			//学生登录
			Student student = null; 
			StudentDao studentDao = new StudentDao();
			Student studentTmp = new Student();
			studentTmp.setName(username);
			studentTmp.setPassword(password);
			student = studentDao.login(studentTmp);
			if(student == null){
				JOptionPane.showMessageDialog(this, "用户名或密码错误!");
				return;
			}
			JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+student.getName()+"登录本系统!");
			this.dispose();
			//打开主页面
			new MainFrm(selectedItem, student).setVisible(true);
		}
	}

回到 EditPwdFrm 页面,判断如果是学生修改密码

先在StudentDao 中提供修改密码的方法啊

//修改密码
	public String editPassword(Student student, String newPassword) throws SQLException {
		Connection con = JDBCUtils.getConnection();
		String sql = "select * from s_student where id=? and password=?";
		PreparedStatement prst = null;
		int id = 0;
		try {
			prst = con.prepareStatement(sql);
			prst.setInt(1, student.getId());
			prst.setString(2, student.getPassword());
			ResultSet executeQuery = prst.executeQuery();
			if (!executeQuery.next()) {
				String retString = "旧密码错误";
				return retString;
			}
			id = executeQuery.getInt("id");
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} // 
		String retString = "修改失败";
		String sqlString = "update s_student set password = ? where id = ?";
		try {
			
			prst = con.prepareStatement(sqlString);
			prst.setString(1, newPassword);
			prst.setInt(2, id);
			int rst = prst.executeUpdate();
			if (rst > 0) {
				retString = "密码修改成功";
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} // 
		return retString;
	}

在 EditPwdFrm 页面,判断如果是学生修改密码

// 确认修改
	protected void submitEdit(ActionEvent e) {
		// 获取输入框的输入内容
		String oldPassword = oldPwdTextField.getText().toString().trim();
		String newPassword = newPwdTextField.getText().toString().trim();
		String conformPassword = okNewPwdTextField.getText().toString().trim();
		if (StringUtil.isEmpty(oldPassword)) {
			JOptionPane.showMessageDialog(this, "请填写旧密码!");
			return;
		}
		if (StringUtil.isEmpty(newPassword)) {
			JOptionPane.showMessageDialog(this, "请填写新密码!");
			return;
		}
		if (StringUtil.isEmpty(conformPassword)) {
			JOptionPane.showMessageDialog(this, "请确认新密码!");
			return;
		}
		if (!newPassword.equals(conformPassword)) {
			JOptionPane.showMessageDialog(this, "两次密码输入不一致!");
			return;
		}
		if ("管理员".equals(MainFrm.userType.getName())) {
			//代码略....
		}
		if ("学生".equals(MainFrm.userType.getName())) {
			StudentDao studentDao = new StudentDao();
			Student studentTmp = new Student();
			Student student = (Student) MainFrm.userObject;
			studentTmp.setName(student.getName());
			studentTmp.setPassword(oldPassword);
			studentTmp.setId(student.getId());
			try {
				JOptionPane.showMessageDialog(this, studentDao.editPassword(studentTmp, newPassword));
			} catch (HeadlessException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			return;
		}

	}

在 EditPwdFrm 页面的构造方法里面,根据不同身份进行提示

// 根据不同的身份在,修改密码页面展示用户名
		if ("管理员".equals(MainFrm.userType.getName())) {
			Admin admin = (Admin) MainFrm.userObject;
			cureentUser.setText("【系统管理员】" + admin.getName());
		}else if("学生".equals(MainFrm.userType.getName())){
			Student student = (Student)MainFrm.userObject;
			cureentUser.setText("【学生】" + student.getName());
		}else{
			//教师
		}

测试:用学生登录,以及修改密码

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

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

相关文章

从裸机启动开始运行一个C++程序(五)

先序文章请看 从裸机启动开始运行一个C程序&#xff08;四&#xff09; 从裸机启动开始运行一个C程序&#xff08;三&#xff09; 从裸机启动开始运行一个C程序&#xff08;二&#xff09; 从裸机启动开始运行一个C程序&#xff08;一&#xff09; 把MBR和内核源码拆开 拆分M…

实现表格合并单元格、在表格做输入处理以及数值统计

需求&#xff1a;表格样式涉及到合并单元格&#xff0c;功能上可以在表格最后一列输入分数&#xff0c;并自动统计总分。 大体样式 代码&#xff1a; 表格&#xff1a; :span-method 属性用来合并单元格 :summary-method 属性用来实现自动统计 // 合并单元格操作 objectSpa…

头文件的使用,什么是头文件?

*## 头文件的使用*为什么要加这个#include include表示包含的意思&#xff0c;就是把iostream这个文件拷贝到main.c这里 有什么意义呢&#xff1f; 有什么意义呢&#xff1f;都是明星同时也是小卡 所以需要包含头文件去查找一下 所以头文件就是相对应功能函数的集合。要想使用…

java实现布隆过滤器(手写和Guava库提供的)

目录 前言 布隆过滤器的原理 插入​编辑 查询 删除 布隆过滤器优缺点 优点&#xff1a; 缺点&#xff1a; 代码实现 方式一&#xff1a; Google Guava 提供的 BloomFilter 类来实现布隆过滤器 到底经过几次哈希计算 解决缓存穿透 方式二&#xff1a;手写 前言 在学…

基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

Git:git merge和git rebase的区别

分支合并 git merge是用来合并两个分支的。比如&#xff1a;将 b 分支合并到当前分支。同样git rebase b&#xff0c;也是把 b 分支合并到当前分支。他们的 「原理」如下&#xff1a; 假设你现在基于远程分支"origin"&#xff0c;创建一个叫"mywork"的分支…

【爬虫】对某某贴吧主页的爬虫分析+源码

1. 网站分析 想要的内容有标题、时间和帖子跳转链接 查看网站源代码&#xff0c;发现想要的内容就在里面&#xff0c;那就好办了&#xff0c;直接上正则&#xff0c;当然beautifulsoup也不是不可以 2. Python源码 import requests import re from prettytable import PrettyTa…

“生鲜蔬”APP的设计与实现

1.引言 在这个科技与网络齐头并进的时代&#xff0c;外卖服务正在飞速发展&#xff0c;人们对外卖APP系统功能需求越来越多&#xff0c;开发APP的人员对自己的要求也要越来越高&#xff0c;要从所做APP外卖系统所实现的功能和用户的需求来对系统进行设计&#xff0c;还需要与当…

基于SpringBoot+vue的人职匹配推荐系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

CC1310 CC1310F128RSMR 超低功耗SUB-1GHz 无线 MCU芯片

1 器件概述 1 1 特性 • 微控制器 – 性能强大的 Arm Cortex -M3 处理器 – EEMBCCoreMark评分&#xff1a;142 – EEMBC ULPBench™评分&#xff1a;158 – 时钟速率最高可达 48MHz – 32KB、64KB 和 128KB 系统内可编程闪存 – 8KB 缓存静态随机存取存储器 (SRAM) &#xff…

农业副业产品求购供应发布市场行情VIP会员公众号小程序开源版开发

农业副业产品求购供应发布市场行情VIP会员公众号小程序开源版开发 后台一键同步全国近200家农产品批发市场商品包括&#xff0c;蔬菜、水果、水产、粮油和农副产品等的价格。 前端VIP权益功能&#xff0c;开通VIP会员后&#xff0c;可以开启VIP会员标识。可无限制查看全国市场…

Scrapy框架之Mongo安装和与关系型数据库比较

目录 Windows安装与启动MongoDB 下载 启动MongoDB 通过命令启动 脚本 快速学习方法 与关系型数据库比较 什么是BSON Windows安装与启动MongoDB 下载 企业版-收费 社区版-免费 下载Mongodb Download MongoDB Community Server | MongoDB 选择版本 稳定版5.0.9 选择平台…

前端工程化 | vue3+ts+jsx+sass+eslint+prettier 配置化全流程

起因&#xff1a; 前端开发是一个工程化的流程。 包括持续集成、持续部署。 我认为集成 的第一方面就是开发&#xff0c;在前端项目开发中&#xff0c;需要保证代码格式规范的统一、代码质量、提交的规划。而这些要求需要通过各种插件来保证规范化和流程化开发。 如何配置这…

大数据的金融数据读取及分析(二)

一、注册和获取token 参考大数据的金融数据读取及分析&#xff08;一&#xff09;大数据的金融数据读取及分析&#xff08;-&#xff09;_石工记的博客-CSDN博客 二、获取股市信息 需注意的是&#xff0c;利用tushare接口获取部分信息时对积分有不同的要求&#xff0c;积分不…

后室主题 Game Jam

在后室主题 Game Jam 中探索无尽的深渊&#xff01; 向所有富有冒险精神的游戏开发者和创作者发出召集令&#xff01;准备好潜入未知领域&#xff0c;将令人毛骨悚然的后室之谜变为现实吗&#xff1f;加入我们&#xff0c;参加与 Game Maker 合作举办的令人振奋的游戏竞赛吧&am…

【C语言】GNU make 和 Makefile :构建工具与构建描述文件的力量

本文将详细介绍make和Makefile&#xff0c;它们是软件开发中常用的构建工具和构建描述文件。本文将探讨make的作用、原理和用法&#xff0c;以及Makefile的结构、语法和常见用法。通过了解这些工具&#xff0c;开发者可以更高效地管理和构建复杂的软件项目。 引言一、make1.1 m…

Java8新特性详解

陈老老老板 说明&#xff1a;新的专栏&#xff0c;本专栏专门讲Java8新特性&#xff0c;把平时遇到的问题与Java8的写法进行总结&#xff0c;需要注意的地方都标红了&#xff0c;一起加油。 本文是介绍Java8新特性与常用方法&#xff08;此篇只做大体介绍了解&#xff0c;之后会…

使用OpenCV工具包实现人脸检测与人脸识别,包括传统视觉和深度学习方法(最全整理!)

使用OpenCV工具包实现人脸检测与人脸识别&#xff08;最全整理&#xff01;&#xff09; OpenCV实现人脸检测OpenCV人脸检测方法基于Haar特征的人脸检测Haar级联检测器预训练模型下载Haar 级联分类器OpenCV-Python实现 基于深度学习的人脸检测传统视觉方法与深度学习方法对比 O…

three.js 最小环境搭建

完整目录: 1、html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…

专利优先权应在什么时候提出

专利优先权要求应当在3个月内提交第一次提出的专利申请文件的副本&#xff1b;未提出书面声明或者逾期未提交专利申请文件副本的&#xff0c;视为未要求优先权。 申请人就相同主题的发明或实用新型在外国第一次提出专利申请之日起十二个月内&#xff0c;或者就相同主题的外观设…