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

news2024/11/24 12:12:00

目录

教师模块功能的实现

创建一个 Teacher 实体类

创建 添加老师界面 AddTeacherFrm 注意创建成 JInternalFrame 类型

页面的制作

给添加按钮绑定事件

提供一个重置表单功能

回到 MainFrm 添加教师管理的按钮

给添加教师按钮绑定事件

测试添加教师功能

创建教师信息管理页面 ManageTeacherFrm 注意创建成:JInternalFrame类型

制作 ManageTeacherFrm 页面

再制作其他组件 效果如下

注意:记得把 两个单选按钮添加到按钮组,怎么添加,参照之前的

回到MainFrm 给教师列表按钮添加事件

测试一下

回到 ManageTeacherFrm

当页面一打开,查询所有教师,给表格填充数据

首先在TeacherDao中提供查询教师的方法

在 ManageTeacherFrm 定义填充数据的方法

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

测试

给查询按钮绑定事件

给表格的每一行添加事件

给确认修改按钮绑定事件

首选在 TeacherDao中提供修改方法

给删除按钮添加事件

启动测试一下删除功能

回到 LoginFrm 判断如果是教师登录

首先在 TeacherDao 中提供登录的方法

在 LoginFrm 中进行判断

再回到 EditPwdFrm 页面 进行教师身份的判断

在构造方法中判断

在 TeacherDao 中提供修改密码的方法

在 EditPwdFrm 中修改submitEdit()方法

启动测试


教师模块功能的实现

创建一个 Teacher 实体类

public class Teacher {
    private int id;
    private String name;
    private String sex;
    private String title;
    private int age;
    private String password;
    //get set 方法,自己补上 
}   

创建 添加老师界面 AddTeacherFrm 注意创建成 JInternalFrame 类型

页面的制作

给组件起个名字

teacherNameTextField; teacherTitleTextField; teacherAgeTextField; teacherSexManRadioButton; teacherSexFemalRadioButton; teacherPasswordField;

给添加按钮绑定事件

//添加按钮绑定事件
        addTeacherButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                addTeacherAct(e);
            }
        });
//添加教师功能
    protected void addTeacherAct(ActionEvent ae) {
        // TODO Auto-generated method stub
        String teacherName = teacherNameTextField.getText().toString();
        String teacherSex = teacherSexManRadioButton.isSelected() ? teacherSexManRadioButton.getText().toString()
                : teacherSexFemalRadioButton.getText().toString();
        String teacherTitle = teacherTitleTextField.getText().toString();
        String teacherPassword = teacherPasswordField.getText().toString();
        int teacherAge = 0;
        try {
            teacherAge = Integer.parseInt(teacherAgeTextField.getText().toString());
        } catch (Exception e) {
            // TODO: handle exception
            JOptionPane.showMessageDialog(this, "年龄只允许输入数字!");
            return;
        }
        if (StringUtil.isEmpty(teacherName)) {
            JOptionPane.showMessageDialog(this, "教师姓名必须填写!");
            return;
        }
        if (StringUtil.isEmpty(teacherTitle)) {
            JOptionPane.showMessageDialog(this, "教师职称必须填写!");
            return;
        }
        if (teacherAge == 0 || teacherAge < 0) {
            JOptionPane.showMessageDialog(this, "教师年龄必须大于0!");
            return;
        }
        if (StringUtil.isEmpty(teacherPassword)) {
            JOptionPane.showMessageDialog(this, "教师登录密码必须填写!");
            return;
        }
        Teacher teacher = new Teacher();
        teacher.setName(teacherName);
        teacher.setSex(teacherSex);
        teacher.setTitle(teacherTitle);
        teacher.setAge(teacherAge);
        teacher.setPassword(teacherPassword);
        TeacherDao teacherDao = new TeacherDao();
        if (teacherDao.addTeacher(teacher)) {
            JOptionPane.showMessageDialog(this, "教师添加成功!");
        } else {
            JOptionPane.showMessageDialog(this, "教师添加失败!");
        }
        //添加完重一下表单
        resetValue(ae);
    }
​
    

提供一个重置表单功能

// 重置表单
    protected void resetValue(ActionEvent ae) {
        // TODO Auto-generated method stub
        teacherNameTextField.setText("");
        teacherTitleTextField.setText("");
        teacherAgeTextField.setText("");
        teacherSexManRadioButton.setSelected(true);
        teacherPasswordField.setText("");
    }

回到 MainFrm 添加教师管理的按钮

给添加教师按钮绑定事件

//添加教师按钮事件
        mntmNewMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //打开添加教师页面
                openAddTeacherFrm(e);
            }
        });
//打开添加教师页面
    protected void openAddTeacherFrm(ActionEvent e) {
        // TODO Auto-generated method stub
        AddTeacherFrm addTeacherFrm = new AddTeacherFrm();
        addTeacherFrm.setVisible(true);
        desktopPane.add(addTeacherFrm);
    }

测试添加教师功能

创建教师信息管理页面 ManageTeacherFrm 注意创建成:JInternalFrame类型

制作 ManageTeacherFrm 页面

再制作其他组件 效果如下

给组件起名字

private JTable teacherListTable; ​ private JTextField searchTeacherNameTextField; ​ private JTextField editTeacherNameTextField; ​ private JTextField editTeacherTitleTextField; ​ private JTextField editTeacherAgeTextField; ​ private JPasswordField editTeacherPasswordField; ​ private JRadioButton editTeacherSexManRadioButton; ​ private JRadioButton editTeacherSexFemalRadioButton; ​ private JButton deleteTeacherButton;

注意:记得把 两个单选按钮添加到按钮组,怎么添加,参照之前的

回到MainFrm 给教师列表按钮添加事件

    //教师列表按钮,事件绑定
        menuItem_7.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                openManageTeacherFrm(e);
            }
        });
//打开教师列表页面
    protected void openManageTeacherFrm(ActionEvent e) {
        ManageTeacherFrm manageTeacherFrm = new ManageTeacherFrm();
        manageTeacherFrm.setVisible(true);
        desktopPane.add(manageTeacherFrm);
        
    }

测试一下

回到 ManageTeacherFrm

当页面一打开,查询所有教师,给表格填充数据

首先在TeacherDao中提供查询教师的方法
//查询教师
	public List<Teacher> getTeacherList(Teacher teacher) {
		// TODO Auto-generated method stub
		List<Teacher> retList = new ArrayList<Teacher>();
		StringBuffer sqlString = new StringBuffer("select * from s_teacher");
		if(!StringUtil.isEmpty(teacher.getName())){
			sqlString.append(" where name like '%"+teacher.getName()+"%'");
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sqlString.toString());
			ResultSet executeQuery = preparedStatement.executeQuery();
			while(executeQuery.next()){
				Teacher t = new Teacher();
				t.setId(executeQuery.getInt("id"));
				t.setName(executeQuery.getString("name"));
				t.setSex(executeQuery.getString("sex"));
				t.setTitle(executeQuery.getString("title"));
				t.setAge(executeQuery.getInt("age"));
				t.setPassword(executeQuery.getString("password"));
				retList.add(t);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retList;
	}

在 ManageTeacherFrm 定义填充数据的方法

// 填充表格数据
	private void setTable(Teacher teacher) {
		if ("教师".equals(MainFrm.userType.getName())) {
			Teacher tLogined = (Teacher) MainFrm.userObject;
			teacher.setName(tLogined.getName());
			searchTeacherNameTextField.setText(teacher.getName());
		}
		DefaultTableModel dft = (DefaultTableModel) teacherListTable.getModel();
		dft.setRowCount(0);
		TeacherDao teacherDao = new TeacherDao();
		List<Teacher> teacherList = teacherDao.getTeacherList(teacher);
		for (Teacher t : teacherList) {
			Vector v = new Vector();
			v.add(t.getId());
			v.add(t.getName());
			v.add(t.getSex());
			v.add(t.getTitle());
			v.add(t.getAge());
			v.add(t.getPassword());
			dft.addRow(v);
		}
	}

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

//调用填充表格数据的方法
		setTable(new Teacher());

测试

给查询按钮绑定事件

//查询按钮,绑定事件
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				searchTeacher(e);
			}
		});

//条件查询
	protected void searchTeacher(ActionEvent e) {
		// TODO Auto-generated method stub
		String teacherNameString = searchTeacherNameTextField.getText().toString();
		Teacher teacher = new Teacher();
		teacher.setName(teacherNameString);
		setTable(teacher);
	}

自己启动测试一下

给表格的每一行添加事件

//给表格的每一行添加事件
		teacherListTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				//点击表格没一行时,把这行的旧数据展示在编辑框里面
				selectedTableRow(e);
			}
		});

	// 点击表格每一行,展示旧数据
	protected void selectedTableRow(MouseEvent e) {
		DefaultTableModel dft = (DefaultTableModel) teacherListTable.getModel();
		editTeacherNameTextField.setText(dft.getValueAt(teacherListTable.getSelectedRow(), 1).toString());
		editTeacherTitleTextField.setText(dft.getValueAt(teacherListTable.getSelectedRow(), 3).toString());
		editTeacherAgeTextField.setText(dft.getValueAt(teacherListTable.getSelectedRow(), 4).toString());
		editTeacherPasswordField.setText(dft.getValueAt(teacherListTable.getSelectedRow(), 5).toString());
		String sex = dft.getValueAt(teacherListTable.getSelectedRow(), 2).toString();
		if (sex.equals(editTeacherSexManRadioButton.getText())) {
			editTeacherSexManRadioButton.setSelected(true);
		}
		if (sex.equals(editTeacherSexFemalRadioButton.getText())) {
			editTeacherSexFemalRadioButton.setSelected(true);
		}
	}

测试

给确认修改按钮绑定事件

首选在 TeacherDao中提供修改方法

public boolean update(Teacher teacher){
		String sql = "update s_teacher set name=?, sex=?,title=?,age=?,password=? where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setString(1, teacher.getName());
			preparedStatement.setString(2, teacher.getSex());
			preparedStatement.setString(3, teacher.getTitle());
			preparedStatement.setInt(4, teacher.getAge());
			preparedStatement.setString(5, teacher.getPassword());
			preparedStatement.setInt(6, teacher.getId());
			if(preparedStatement.executeUpdate() > 0){
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

//确认修改按钮,事件绑定
		updateTeacherButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				editTeacherAct(e);
			}
		});

//修改教师
	protected void editTeacherAct(ActionEvent e) {
		int row = teacherListTable.getSelectedRow();
		if(row == -1){
			JOptionPane.showMessageDialog(this, "请选择要修改的数据!");
			return;
		}
		String teacherName = editTeacherNameTextField.getText().toString();
		String teacherSex = editTeacherSexManRadioButton.isSelected() ? editTeacherSexManRadioButton.getText().toString() : editTeacherSexFemalRadioButton.getText().toString();
		String teacherTitle = editTeacherTitleTextField.getText().toString();
		int teacherAge = 0;
		try {
			teacherAge = Integer.parseInt(editTeacherAgeTextField.getText().toString());
		} catch (Exception ex) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(this, "年龄只允许输入数字!");
			return;
		}
		String teacherPassword = editTeacherPasswordField.getText().toString();
		if(StringUtil.isEmpty(teacherName)){
			JOptionPane.showMessageDialog(this, "教师姓名必须填写!");
			return;
		}
		if(StringUtil.isEmpty(teacherTitle)){
			JOptionPane.showMessageDialog(this, "教师职称必须填写!");
			return;
		}
		if(teacherAge == 0 || teacherAge < 0){
			JOptionPane.showMessageDialog(this, "教师年龄必须大于0!");
			return;
		}
		if(StringUtil.isEmpty(teacherPassword)){
			JOptionPane.showMessageDialog(this, "教师登录密码必须填写!");
			return;
		}
		Teacher teacher = new Teacher();
		teacher.setId(Integer.parseInt(teacherListTable.getValueAt(row, 0).toString()));
		teacher.setName(teacherName);
		teacher.setSex(teacherSex);
		teacher.setTitle(teacherTitle);
		teacher.setAge(teacherAge);
		teacher.setPassword(teacherPassword);
		TeacherDao teacherDao = new TeacherDao();
		if(teacherDao.update(teacher)){
			JOptionPane.showMessageDialog(this, "修改成功!");
		}else{
			JOptionPane.showMessageDialog(this, "修改失败!");
		}
		
		//修改完成填充表格数据
		setTable(new Teacher());
		
	}

启动测试一下

给删除按钮添加事件

//删除按钮绑定事件
		deleteTeacherButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				deleteTeacher(e);
			}
		});

// 删除教师
	protected void deleteTeacher(ActionEvent e) {
		int row = teacherListTable.getSelectedRow();
		if (row == -1) {
			JOptionPane.showMessageDialog(this, "请选择要删除的数据!");
			return;
		}
		if (JOptionPane.showConfirmDialog(this, "确定要删除么?") != JOptionPane.OK_OPTION)
			return;
		int id = Integer.parseInt(teacherListTable.getValueAt(row, 0).toString());
		TeacherDao teacherDao = new TeacherDao();
		if (teacherDao.delete(id)) {
			JOptionPane.showMessageDialog(this, "删除成功!");
		} else {
			JOptionPane.showMessageDialog(this, "删除失败!");
		}
		// 删除完填充数据
		setTable(new Teacher());

	}

启动测试一下删除功能

回到 LoginFrm 判断如果是教师登录

首先在 TeacherDao 中提供登录的方法

public Teacher login(Teacher teacher){
		String sql = "select * from s_teacher where name=? and password=?";
		Teacher teacherRst = null;
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement prst = con.prepareStatement(sql);//
			prst.setString(1, teacher.getName());
			prst.setString(2, teacher.getPassword());
			ResultSet executeQuery = prst.executeQuery();
			if(executeQuery.next()){
				teacherRst = new Teacher();
				teacherRst.setId(executeQuery.getInt("id"));
				teacherRst.setName(executeQuery.getString("name"));
				teacherRst.setPassword(executeQuery.getString("password"));
				teacherRst.setSex(executeQuery.getString("sex"));
				teacherRst.setAge(executeQuery.getInt("Age"));
				teacherRst.setTitle(executeQuery.getString("title"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return teacherRst;
	}

在 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())) {
			//教师登录
			Teacher teacher = null;
			TeacherDao teacherDao = new TeacherDao();
			Teacher teacherTmp = new Teacher();
			teacherTmp.setName(username);
			teacherTmp.setPassword(password);
			teacher = teacherDao.login(teacherTmp);
			if(teacher == null){
				JOptionPane.showMessageDialog(this, "用户名或密码错误!");
				return;
			}
			JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+teacher.getName()+"登录本系统!");
			this.dispose();
			new MainFrm(selectedItem, teacher).setVisible(true);

		} else {
			//学生登录..代码略
			
		}
	}

再回到 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{
			//教师
			Teacher teacher = (Teacher)MainFrm.userObject;
			cureentUser.setText("【教师】" + teacher.getName());
		}

在 TeacherDao 中提供修改密码的方法

public String editPassword(Teacher teacher,String newPassword){
		String sql = "select * from s_teacher where id=? and password=?";
		PreparedStatement prst = null;
		int id = 0;
		try {
			Connection con = JDBCUtils.getConnection();
			prst = con.prepareStatement(sql);
			prst.setInt(1, teacher.getId());
			prst.setString(2, teacher.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_teacher set password = ? where id = ?";
		try {
			Connection con = JDBCUtils.getConnection();
			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 中修改submitEdit()方法

// 确认修改
	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())) {
			//代码略...
		}
		if("教师".equals(MainFrm.userType.getName())){
			TeacherDao teacherDao = new TeacherDao();
			Teacher teacherTmp = new Teacher();
			Teacher teacher = (Teacher)MainFrm.userObject;
			teacherTmp.setName(teacher.getName());
			teacherTmp.setPassword(oldPassword);
			teacherTmp.setId(teacher.getId());
			JOptionPane.showMessageDialog(this, teacherDao.editPassword(teacherTmp, newPassword));
			
			return;
		}

	}
启动测试

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

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

相关文章

Day8——操作系统基础windows

文章目录 操作系统基础操作系统的定义 什么是windows 操作系统基础 操作系统的定义 什么是windows

gin RouterGroup 方法概览

路由组 RouterGroup是gin 里面的路由组&#xff0c;主要作用是实现gin的路由。 RouterGroup是嵌套在了Engine内部&#xff0c;实际上调用Engine的get&#xff0c;post等方式就是RouterGroup的实现。 另外RouterGroup还实现了如下两个接口&#xff1a; Engine相当于RouterGrou…

【Shell】自定义传入参数

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

计算机中丢失api-ms-win-core-path-l1-1-0dll

使用python自带工具打包exe文件夹时出现的错误。win10的exe文件放到win7上跑不出来。 本着找到这个dll文件放进去&#xff0c;但同事的win10打包的程序就可以放到win7上运行&#xff0c;所以改了python环境&#xff0c;把虚拟环境python版本改成了3.8&#xff0c;原来用的3.9不…

FFmpeg ~ 安装(附MetaRTC整合)

前言 本文会讲述FFmpeg下载/配置/编译/安装的完整流程&#xff0c;该流程并不复杂&#xff0c;因此本文的重点在于如何整合MetaRTC。MetaRTC的作用是令FFmpeg支持WebRTC推/拉流及回声消除功能&#xff08;常规版本的FFmpeg是不支持该功能的&#xff09;&#xff0c;使得WebRTC音…

【万字长文】AMD Instinct MI300详细解析:超微半导体的光辉时刻

美国时间6月13日&#xff0c;AMD在美国加利福尼亚州旧金山举行了一场名为“数据中心与AI技术首演”的活动&#xff0c;并在主题演讲中介绍了数据中心的解决方案。 其中&#xff0c;宣布推出“AMD Instinct MI300系列加速器”&#xff08;以下简称Instinct MI300系列&#xff0…

MidJourney v5.2 、Stable Diffusion XL 0.9 出图对比

最近两个最流行的AI图像生成器&#xff0c;Midjourney和Stable Diffusion&#xff0c;都发布了重大更新。Midjourney v5.2引入了许多新功能&#xff0c;包括“缩小”功能、“/缩短”命令、改进的图像质量等。 Stable Diffusion XL (SDXL) 0.9则专注于改善图像质量和构图。新模…

经典文献阅读之--R-PCC(基于距离图像的点云压缩方法)

0. 简介 对于激光雷达数据而言&#xff0c;虽然与2D图像相比&#xff0c;可以提供精确的物体深度信息&#xff0c;但也存在数据量大的问题&#xff0c;不便于数据存储或传输。在拿到离线数据分析的时候会发现我们很难拿到较长一段时间的激光数据&#xff0c;这就给我们问题的重…

抖音最新版本抓包

1.下载fiddler抓包工具 2.配置https抓包环境 3.抓包工具配置好了之后&#xff0c;我们确保手机和电脑在同一个局域网中 4.打电脑CMD 输入 ipconfig 查看电脑的ip地址 5.打开我们的手机设置代理 6.打开浏览器 输入&#xff1a;你的电脑ip:8888 下载证书 7.打开Re文件管理器(ps…

原来,绩效管理还能这么玩

早上好&#xff0c;我是老原。 最近&#xff0c;有个粉丝朋友来找我请教&#xff1a;他最近加入另外一家大型互联网公司&#xff0c;主要是负责领导力相关这块。他们现在也在做OKR实践&#xff0c;但是碰到了很多问题。 对此我并不觉得意外&#xff0c;因为这样的案例太多了。…

ModaHub魔搭社区:GPTCache的工作原理和为什么选择 GPTCache?

什么是 GPTCache&#xff1f; GPTCache 是一个开源工具&#xff0c;旨在通过实现缓存来提高基于 GPT 的应用程序的效率和速度&#xff0c;以存储语言模型生成的响应。GPTCache 允许用户根据其需求自定义缓存&#xff0c;包括嵌入函数、相似度评估函数、存储位置和驱逐等选项。…

《Opencv3编程入门》学习笔记—第十一章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第十一章 特征检测与匹配 一、SURF特征点检测 太复杂了&#xff01;全是公式&#xff01; &#xff08;一&#xff09;SURF算法概览 SURF&#xff0c;SpeededUp Rebus…

基于matlab使用点要素匹配在杂乱场景中检测对象(附源码)

一、前言 此示例演示如何在给定对象的参考图像的情况下检测杂乱场景中的特定对象。 此示例提供了一种基于查找参考和目标图像之间的点对应关系来检测特定对象的算法。它可以检测物体&#xff0c;尽管刻度变化或面内旋转。它对少量的面外旋转和遮挡也很鲁棒。这种对象检测方法…

Ansible练习

部署ansible练习 开始之前先使用student用户登录 登录命令&#xff1a;ssh studentworkstation 在workstation上运行lab deploy-review start命令&#xff0c;此脚本将确保受管主机在网络上访问。 然后开始验证控制节点上是否安装了ansible软件包&#xff0c;在运行anisble -…

Shell脚本编程教程

Shell脚本编程 1.Shell脚本语言的基本结构 1.1 Shell脚本的用途&#xff1a; 自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件 1.2 Shell脚本基本结构&#xff1a; ​ Shell脚本编程&#xff1a;是基于过程式&#xff0c;解释执行的语言 编程语言…

【C#】简单聊下Framework框架下的事务

框架用的多了&#xff0c;之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务 目录 1、SqlClient2、TransactionScope3、引用 1、SqlClient 在 C# 中&#xff0c;使用 using 块可以方便地实现对资源的自动释放&#xff0c;但它不适用于实现事务处理。为…

Redis实践篇(二)优惠卷秒杀 一人一单、分布锁

目录 全局ID生成器​编辑 实现优惠卷下单 优惠卷超卖问题 乐观锁 一人一单 分布式锁 分布锁的实现 基于Redis的分布锁 Redis的Lua脚本 再次改进Redis的分布锁 基于Redis的分布锁优化 Redisson分布式框架 引入依赖 Redisson可重入锁原理 Redisson分布锁原理​编辑 全局I…

基于Hadoop的疫情信息分析与可视化研究——包含大屏可视化及预测算法

需要本项目的全套环境、代码、文档、资源、数据和部署调试的私信博主&#xff01;&#xff01;&#xff01; 本研究基于中国新冠疫情2020-01-11至2022-12-20的全国整体数据进行疫情大数据分析&#xff0c;通过对历史的数据进行大数据分析&#xff0c;可以有效的掌握过去疫情数据…

4、JAVA 嵌套for循环 while do-while

1 嵌套for循环 1.1 概述 存在至少2层for循环,根据外层的条件&#xff0c;判断里层能否执行 如果能执行&#xff0c;就把里层代码都循环完毕后&#xff0c;再继续判断是否执行外层循环的下一次循环 1.2 嵌套for形式 1.3 练习&#xff1a;嵌套for循环入门案例 创建包: cn.tedu…