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

news2024/12/23 10:33:47

目录

用户类型,我们创建一个枚举类

在 org.xingyun.model 包下创建 UserType 枚举类

快速生成 get set 方法

修改代码,下拉框的内容,用我们的枚举类型

给登录按钮绑定事件

我们在 org.xingyun.utils 包下创建一个工具类

Eclipse 智能提示

可以运行测试下

根据不同的身份进行不同的判断

导入我们的SQL脚本,把表建出来

在org.xingyun.utils包下创建一个工具类

创建 Admin 实体类

在 org.xingyun.dao 包下创建 AdminDao 编写登录操作

回到 LoginFrm.java 编写管理员登录逻辑

主界面的制作

添加 JMenuBar

在JMenuBar里面添加 JMenu

在JMenu 下面添加 两个 JMenuItem

添加学生管理的 JMenu

添加班级管理的JMenu

添加帮助的Jemun

关于我们的功能实现

给关于我们按钮添加事件

管理员登录成功跳转页面

修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用

修改登录页面代码,登录成功后跳转到主页面

可以运行测试一下

修改密码的实现

给修改密码按钮,绑定事件

修改密码的页面制作

在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame

添加面板的关闭,最小化,最大化按钮

页面的制作,参照登录页面的制作

bug 处理,如果点击 关闭按钮不起作用,注释一行代码

注释掉 EditPwdFrm 的main方法

回到 MainFrm.java 点击修改密码,打开修改密码页面

先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置

把 JDesktopPane 提升为成员变量

打开修改密码页面

可以运行测试下

在修改密码页面,取一下用户名

给确认修改按钮添加事件

编写确认修改的方法

编写 AdminDao 提供 修改的方法

退出系统

给退出系统按钮添加事件


用户类型,我们创建一个枚举类

在 org.xingyun.model 包下创建 UserType 枚举类

​
package org.xingyun.model;
​
public enum UserType {
    ADMIN("管理员",0),TEACHER("教师",1),STUDENT("学生",2);
    private String name;
    private int index;
    private UserType(String name,int index){
        this.name = name;
        this.index = index;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    public int getIndex() {
        return index;
    }
    
    public void setIndex(int index) {
        this.index = index;
    }
    
    @Override
    public String toString(){
        return this.name;
    }
}
​

快速生成 get set 方法

修改代码,下拉框的内容,用我们的枚举类型

userTypeComboBox.setModel(new DefaultComboBoxModel(new UserType[] {UserType.ADMIN, UserType.TEACHER, UserType.STUDENT}));

给登录按钮绑定事件

//给登录按钮,绑定事件
        loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取个方法,把事件对象传递过去
                userLogin(e);
            }
        });

// 给登录按钮,绑定事件
        loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 抽取个方法,把事件对象传递过去
                userLogin(e);
            }
        });

// 点击登录按钮进行处理
    protected void userLogin(ActionEvent e) {
        // 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值
        String username = usernameTextField.getText().toString().trim();
        String password = passwordTextField.getText().toString().trim();
        //获取用户的下拉选择
        UserType selectedItem = (UserType)userTypeComboBox.getSelectedItem();
        //判断用户名和密码是否为空,这里的 StringUtil 是我们自己编写的一个工具类
        if(StringUtil.isEmpty(username)){
            //弹出一个提示框进行提示
            JOptionPane.showMessageDialog(this, "用户名不能为空!");
            return; //注意return掉
        }
        if(StringUtil.isEmpty(password)){
            JOptionPane.showMessageDialog(this, "密码不能为空!");
            return; //注意return掉
        }
​
    }
​

我们在 org.xingyun.utils 包下创建一个工具类

public class StringUtil {
    public static boolean isEmpty(String str){
        if("".equals(str)|| str == null){
            return true;
        }
        return false;
    }
}
​

Eclipse 智能提示

依次点击Window --> Perferences(选项设置) --> Java --> Editor(编辑) --> Content Assist(内容辅助/代码提示)

==注意:按快捷键 ctrl+1 会补全返回值==

==ctrl+shift+F 格式化代码==

可以运行测试下

根据不同的身份进行不同的判断

// 点击登录按钮进行处理
    protected void userLogin(ActionEvent e) {
        // 获取用户输入的用户名和密码,以及登录类型 按快捷键 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掉
        }
        // 根据不同的身份进行不同的登录操作
        if ("管理员".equals(selectedItem.getName())) {
​
        } else if ("教师".equals(selectedItem.getName())) {
​
        } else {
​
        }
​
    }

导入我们的SQL脚本,把表建出来

从我们的资料中导入SQL脚本即可

在org.xingyun.utils包下创建一个工具类

package org.xingyun.utils;
​
import java.sql.*;
​
public class JDBCUtils{
​
    private static String url;
    private static String username;
    private static String password;
​
    private JDBCUtils() {
    }
​
    static {
        try {
            //这些连接数据库的基本参数,写在代码里写死了,不好。
            //要配合配置文件,把这些参数写到配置文件里,代码里面读取配置文件中的内容
            Class.forName("com.mysql.jdbc.Driver");
            url = "jdbc:mysql://localhost:3306/db_student";
            username = "root";
            password = "123456";
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
    //获取连接对象
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
​
    //释放资源
    public static void close(Connection conn, Statement statement, ResultSet resultSet) throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (statement != null) {
            statement.close();
        }
        if (resultSet != null) {
            resultSet.close();
        }
    }
​
​
    public static void close(Connection conn, Statement statement) throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (statement != null) {
            statement.close();
        }
    }
}
​

创建 Admin 实体类

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

在 org.xingyun.dao 包下创建 AdminDao 编写登录操作

package org.xingyun.dao;
​
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
​
import org.xingyun.model.Admin;
import org.xingyun.utils.JDBCUtils;
​
public class AdminDao {
​
    /**
     * 管理员登陆
     * @throws SQLException 
     */
    public Admin login(Admin admin) throws SQLException {
        //获取连接对象
        Connection con = JDBCUtils.getConnection();
        String sql = "select * from s_admin where name=? and password=?";
        Admin adminRst = null;
        try {
            PreparedStatement prst = con.prepareStatement(sql);// 把sql语句传给数据库操作对象
            prst.setString(1, admin.getName());
            prst.setString(2, admin.getPassword());
            ResultSet executeQuery = prst.executeQuery();
            if (executeQuery.next()) {
                adminRst = new Admin();
                adminRst.setId(executeQuery.getInt("id"));
                adminRst.setName(executeQuery.getString("name"));
                adminRst.setPassword(executeQuery.getString("password"));
                adminRst.setCreateDate(executeQuery.getString("createDate"));
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return adminRst;
    }
}
​

回到 LoginFrm.java 编写管理员登录逻辑

// 点击登录按钮进行处理
    protected void userLogin(ActionEvent e) {
        // 获取用户输入的用户名和密码,以及登录类型 按快捷键 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())) {
            //创建Dao
            AdminDao adminDao = new AdminDao();
            //创建管理员对象
            Admin adminTmp = new Admin();
            adminTmp.setName(username);
            adminTmp.setPassword(password);
            //调用登录方法
            admin = adminDao.login(adminTmp);
            //如果登录失败
            if(admin == null){
                JOptionPane.showMessageDialog(this, "用户名或密码错误!");
                return;
            }
            //登录成功,弹出给提示
            JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!");
            this.dispose();//关闭登录框
            //创建主页面
            new MainFrm(selectedItem, admin).setVisible(true);
​
        } else if ("教师".equals(selectedItem.getName())) {
​
        } else {
​
        }
​
    }

主界面的制作

在 org.xingyun.view 包下创建 MainFrm

添加 JMenuBar

在JMenuBar里面添加 JMenu

在JMenu 下面添加 两个 JMenuItem

图标自己设置一下

添加学生管理的 JMenu

添加班级管理的JMenu

添加帮助的Jemun

关于我们的功能实现

给关于我们按钮添加事件

//点击关于我们的按键
        menuItem_6.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取一个方法,把事件对象传过去
                aboutMe(e);
            }
        });
//关于我们
    protected void aboutMe(ActionEvent e) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub
                String info = "【西安星云科技教育】出品\n";
                info += "网址:http://www.xingyun.org \n";
                info += "认真做IT教育,不辜负每一位莘莘学子!";
                String[] buttons = {"迫不及待去看看!","心情不好以后再说!"};
                //返回的是 buttons 两个按钮的索引
                int ret = JOptionPane.showOptionDialog(this, info, "关于我们", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.DEFAULT_OPTION, new ImageIcon(LoginFrm.class.getResource("/images/学生.png")), buttons, null);
                if(ret == 0){
                    //采用Java 调用系统浏览器打开制定
                    try {
                        URI uri = new URI("http://www.baidu.com");
                        Desktop.getDesktop().browse(uri);
                        //Runtime.getRuntime().exec("explorer http://www.163.com"); //这个也能打开浏览器
                    } catch (Exception e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }else{
                    JOptionPane.showMessageDialog(this, "你真是狠心,坏淫!");
                }
    }

管理员登录成功跳转页面

修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用

public static UserType userType; public static Object userObject;

代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开,修改构造方法,为增加的两个成员变量赋值==

public class MainFrm extends JFrame {
​
    private JPanel contentPane;
    //用户类型
    public static UserType userType;
    // 用户对象
    public static Object userObject;
​
    /**
     * Launch the application.
     */
    //注释掉main方法,不要直接运行打开
/*  public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrm frame = new MainFrm();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
*/
    /**
     * Create the frame.
     */
    public MainFrm(UserType userType,Object userObject) {
        //给成员变量赋值
        this.userType = userType;
        this.userObject = userObject;
        
        setTitle("学生信息系统主界面");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1082, 663);
        //.....其他代码略
    }   

修改登录页面代码,登录成功后跳转到主页面

// 点击登录按钮进行处理
    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())) {
            //创建Dao
            AdminDao adminDao = new AdminDao();
            //创建管理员对象
            Admin adminTmp = new Admin();
            adminTmp.setName(username);
            adminTmp.setPassword(password);
            //调用登录方法
            admin = adminDao.login(adminTmp);
            //如果登录失败
            if(admin == null){
                JOptionPane.showMessageDialog(this, "用户名或密码错误!");
                return;
            }
            //登录成功,弹出给提示
            JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!");
            this.dispose();//关闭登录框
            //创建主页面
            new MainFrm(selectedItem, admin).setVisible(true);
​
        } else if ("教师".equals(selectedItem.getName())) {
​
        } else {
​
        }
​
    }
​

可以运行测试一下

修改密码的实现

给修改密码按钮,绑定事件

//点击修改密码的事件处理
        menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取一个方法,把事件对象传过去
                updatePassword(e);
            }
        });
    //修改密码
    protected void updatePassword(ActionEvent e) {
        //打开一个修改密码的页面
        
    }

修改密码的页面制作

在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame

添加面板的关闭,最小化,最大化按钮

页面的制作,参照登录页面的制作

bug 处理,如果点击 关闭按钮不起作用,注释一行代码

//setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

你可以修改一下几个组件的名称

private JTextField cureentUser; 当前用户 ​ private JTextField oldPwdTextField; 旧密码 ​ private JTextField newPwdTextField; 新密码 ​ private JTextField okNewPwdTextField; 确认新密码

JButton ok_updatePwdButton 确认修改按钮

注释掉 EditPwdFrm 的main方法

代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开==

可以加一行代码,设置窗口居中 //设置窗口位置居中打开 setLocation(null);

public class EditPwdFrm extends JFrame {
​
    private JPanel contentPane;
    private JTextField cureentUser;
    private JTextField oldPwdTextField;
    private JTextField newPwdTextField;
    private JTextField okNewPwdTextField;
   
​
    /**
     * Launch the application. 注释掉main方法
     */
    /*public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EditPwdFrm frame = new EditPwdFrm();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
*/
    /**
     * Create the frame.
     */
    public EditPwdFrm() {
 
        setTitle("修改密码");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 566, 410);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        //设置窗口位置居中打开
        setLocation(null);
        // .... 其他代码略
    }   

回到 MainFrm.java 点击修改密码,打开修改密码页面

先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置

把 JDesktopPane 提升为成员变量

public class MainFrm extends JFrame {
​
    private JPanel contentPane;
    //用户类型
    public static UserType userType;
    // 用户对象
    public static Object userObject;
    
    private JDesktopPane desktopPane;
    
    public MainFrm(UserType userType,Object userObject) {
        //给成员变量赋值
        this.userType = userType;
        this.userObject = userObject;
        
        //......其余代码略
        //把他提升为成员变量
        desktopPane = new JDesktopPane();
        contentPane.add(desktopPane, BorderLayout.CENTER);
    }
​
    
}

打开修改密码页面

​
//打开修改密码面板
    protected void updatePassword(ActionEvent e) {
        // 打开一个修改密码的页面
        // TODO Auto-generated method stub
        EditPwdFrm editPasswordFrm = new EditPwdFrm();
        editPasswordFrm.setVisible(true);
        // 添加子面板
        desktopPane.add(editPasswordFrm);
    }
​

可以运行测试下

在修改密码页面,取一下用户名

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

测试一下

给确认修改按钮添加事件

//确认修改按钮的点击事件
        ok_updatePwdButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取一个方法
                submitEdit(e);
            }
        });

编写确认修改的方法

//确认修改
    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())) {
            AdminDao adminDao = new AdminDao();
            Admin adminTmp = new Admin();
            Admin admin = (Admin) MainFrm.userObject;
            adminTmp.setName(admin.getName());
            adminTmp.setId(admin.getId());
            adminTmp.setPassword(oldPassword);
            try {
                //调用修改密码的方法
                JOptionPane.showMessageDialog(this,adminDao.editPassword(adminTmp, newPassword));
            } catch (HeadlessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            return;
        }
​
    }
​
}

编写 AdminDao 提供 修改的方法

public class AdminDao {
    //登录方法略...
    
    public String editPassword(Admin admin, String newPassword) throws SQLException {
        //获取连接对象
        Connection con = JDBCUtils.getConnection();
        String sql = "select * from s_admin where id=? and password=?";
        PreparedStatement prst = null;
        int id = 0;
        try {
            prst = con.prepareStatement(sql);
            prst.setInt(1, admin.getId());
            prst.setString(2, admin.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();
        } // 把sql语句传给数据库操作对象
        String retString = "修改失败";
        String sqlString = "update s_admin 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();
        } // 把sql语句传给数据库操作对象
        return retString;
    }
}
​

退出系统

给退出系统按钮添加事件

    //退出系统按钮事件
        menuItem_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(JOptionPane.showConfirmDialog(MainFrm.this, "确定退出么?") == JOptionPane.OK_OPTION){
                    System.exit(0);
                }
            }
        });

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

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

相关文章

【Java基础】volatile关键字

关于作者:CSDN内容合伙人、技术专家, 从零开始做过日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 作用2.2 多线程共享变量的访问流程2.3 多线…

EMC学习笔记(十二)跨分割区及开槽的处理

跨分割区及开槽的处理 1.开槽的产生1.1 对电源/地平面分割造成的开槽1.2 通孔过于密集形成开槽 2.开槽对PCB板EMC性能的影响2.1 高速信号与低速信号的面电流分布2.2 分地的概念2.3 信号跨越电源平面或地平面上的开槽的问题 3.对开槽的处理3.1 需要严格的阻抗控制的高速信号线&a…

基于Hadoop的豆瓣电影的数据抓取、数据清洗、大数据分析(hdfs、flume、hive、mysql等)、大屏可视化

目录 项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计数据获取网络爬虫介绍豆瓣电影数据的采集 数据预处理数据导入及环境配置Flume介绍Hive介绍MySQL介绍Pyecharts介绍环境配置及数据加载 大数据分析及可视化豆瓣影评结构化分析豆瓣电影类型占比分析豆瓣电影…

Vector - CAPL - 常见缩写词

我们在CAPL脚本开发过程中,为了表示的方便,我们会使用大量的缩写词,为了方便自己的使用,大家也可作为参考使用,这里就整理出来一部分常用缩写,以及中英文注释。 CAPL开发中常见缩写 缩写英文解释中文ABSA…

数据安全系列(二)丨数据分类分级

1 数据分类分级的依据 2016年11月,《网络安全法》明确将“数据分类”作为网络安全保护法定义务之一。 2021年9月,《数据安全法》再次具体确立了“数据分类分级保护制度”及其基本原则。 《数据安全法》 第二十一条 国家建立数据分类分级保护制度&am…

Ansible与Shell结合使用

利用Shell脚本运行Ansible命令: 本实验采用rhel8.3。这次将使用 yum_repository 模块远程写入仓库配置。 写入仓库: Shell脚本: #!/bin/bashansible dev -m yum_repository -a namemyBase description"myTestRepo \ baseurl"/m…

物联网的未来:连接万物的智能世界

第一章:引言 在当今数字化时代,物联网(Internet of Things,IoT)已经成为了人们生活中不可或缺的一部分。物联网技术的快速发展和广泛应用,将为我们带来一个连接万物的智能世界。本文将探讨物联网的未来发展…

内核态与用户态详解(嵌入式学习)

内核态与用户态 内核态概念特点和功能 用户态概念特点和功能 内核态与用户态如何切换?总结 内核态 概念 内核态(Kernel Mode)是计算机操作系统中的一种特权级别或运行模式。在内核态下,操作系统拥有最高的权限和访问系统资源的能…

vue-tsc --noEmit导致打包报TS类型错误

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…

使用预计算的纹理替换Hololens 2屏幕的内容

需求:自己渲染器生成的纹理是A,Unity里的virtual camera生成的纹理是B,正常情况下眼镜里看到的是B,我想着直接用A替换掉B。 了解Unity渲染脚本的生命周期: 对于我们的需求,关键的是Scene Rendering这一块内…

基于ChatGLM2和langchain的本地知识库问答的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【C语言】计算机是如何存储整数和小数的?

文章目录 前言一、正整数和0二、负整数三、小数1、定点数(1)什么是定点数(2)表示精度(3)表示范围(4)优缺点 2、浮点数(1)什么是浮点数(2&#xff…

Linux——搭建jdk环境

标题Linux——搭建jdk环境 Linux搭建jdk,案例采用jdk8 1.检查linux位数(64和32位) [rootnode1 /]# getconf LONG_BIT 642.下载对应的linux JDK包,这里使用jdk8 下载jdk8 : 链接: https://www.oracle.com/java/technologies/downloads/#java8 3、上…

苹果又撕下了国产手机遮羞布,国内消费者最爱iPhone

618结束之后,各个国产手机品牌都说自己表现优秀,比去年增长了多少多少,不过随着分析机构给出具体的数据,国产手机可谓被撕下了遮羞布,国内消费者最爱的还是iPhone。 分析机构指出618期间iPhone的销量高达562万部&#…

【互斥锁与信号量】线程通信:互斥锁(mutex)与信号量(semaphore)

目录 0. 互斥锁与信号量 同步互斥概述 1. 互斥锁 1.1 互斥锁的概念 1.2 互斥锁初始化:pthread_mutex_init函数 1.3 互斥锁上锁:pthread_mutex_lock函数 1.4 互斥锁解锁:pthread_mutex_unlock函数 1.5 销毁互斥锁:pthread_…

chatgpt赋能python:Python重写父类方法:在OOP编程中的应用

Python重写父类方法:在OOP编程中的应用 在Python的面向对象编程范式中,继承是一种非常重要的概念。当我们声明一个类时,我们可以通过继承来扩展类的功能并避免重复编写代码。在这个过程中,很可能你会碰到需要重写父类方法的情况。…

17.RocketMQ之死信队列

highlight: arduino-light 1.5 死信队列 当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列…

flutter 简介 flutter 能为我们做什么

flutter 简介 flutter 能为我们做什么 前言一、什么是Flutter?二、Flutter的特点和优势三、Flutter与其他跨平台框架的比较总结 前言 陆陆续续已经写了60多篇的flutter 的文章了,本篇文章就来说说我对flutter 的简单看法 一、什么是Flutter&#xff1f…

【Rust】安装

文章目录 1.官网下载2.安装3.安装验证4.打开本地文档5.安装插件6.HelloWorld①新建项目目录使用VSCode打开②新建rs文件③编译④运行 7.HelloCargo①新建项目目录使用VSCode打开②cargo build③cargo run④cargo check⑤为发布构建 8.更新与卸载 1.官网下载 官网地址&#xff…

c++11 标准模板(STL)(std::basic_ostream)(一)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…