当前位置: 首页 > news >正文

Java实战:实现用户的登录注册功能

系列文章目录

Java文件 I/O流的操作实战和高级UI组件和事件监听的综合


文章目录

  • 系列文章目录
  • 前言
  • 一、大致流程思路分析:
  • 二、定义用户类:
  • 三、服务层的实现:
    • 1.保护用户数据功能的实现
    • 2.登录操作的实现
  • 四、实现用户的注册界面:
    • 大体流程:
  • 五、实现用户的登录界面(在这里面相当于总界面)
    • 大体流程:
  • 六、在实现时的易错点:
    • 以我自己举例:
  • 总结


前言

    在学习完文件和IO流的操作后,包括事件监听机制和UI组件以后,我们可能会想这些知识可以用来干什么,今天我们就用一个实战案例来帮大家将学过的知识运用起来。(但是这个实战案例本来是可以用数据库与Java进行连接,但是这篇我们也可以用将用户数据存储到文件当中来实现,因为像MySQL等数据库,本质都是存储在文件当中的)。


一、大致流程思路分析:

        我将用最通俗易懂的话向大家解释一下这个的具体流程:

     首先我们想要实现用户的注册和登录功能,就要先定义出来用户类,把用户的数据当作成员属性定义出来,然后我们需要建一个窗口来实现登录,注册,重置的操作,注册和登录需要我们输入文本,这些都是基础的,最关键的操作是什么呢?

     就是要定义一个能实现注册和登录的类作为服务层,注册的时候就是把在窗口得到的数据写到文件当中存储起来,那文件当中肯定会有一个又一个的用户的数据,因此我们实现登录的功能就需要把这些个用户全都读取出来,和登录窗口得到的文本核对,看是否能登录成功,大体流程就是这些,反正就是服务层和窗口层的连接,包括数据库的连接也是如此,这个我们后来再讲。

二、定义用户类:

    首先我们需要把用户当成一个用户类,它的属性就是我们理解的用户的数据。

           这里面的用户数据包括了:用户名,密码,性别,爱好,地址,学历。

         以下是代码:

public class User {//用户实体private int id;   //用户private String userName;  //用户名private String passWord;   //密码private int sex;  //性别private String hobby;   //爱好private String address;   //地址private String degree;  //学历public User(String userName, String passWord, int sex, String hobby, String address, String degree) {this.userName = userName;this.passWord = passWord;this.sex = sex;this.hobby = hobby;this.address = address;this.degree = degree;}public User(int id, String userName, String passWord, int sex, String hobby, String address, String degree) {this.id = id;this.userName = userName;this.passWord = passWord;this.sex = sex;this.hobby = hobby;this.address = address;this.degree = degree;}public void setId(int id) {this.id = id;}public void setUserName(String userName) {this.userName = userName;}public void setPassWord(String passWord) {this.passWord = passWord;}public void setSex(int sex) {this.sex = sex;}public void setAddress(String address) {this.address = address;}public void setHobby(String hobby) {this.hobby = hobby;}public void setDegree(String degree) {this.degree = degree;}public int getId() {return id;}public String getUserName() {return userName;}public String getPassWord() {return passWord;}public String getHobby() {return hobby;}public int getSex() {return sex;}public String getAddress() {return address;}public String getDegree() {return degree;}}

三、服务层的实现:

public static String filePath = "E:\\User.txt";private static final String DELIMITER = "|";

   先创建出来文件路径,以方便下面的操作。

1.保存用户数据功能的实现:

       这个方法是用来将用户的数据读取到文件当中的、

以下是代码实现:

public boolean saveUser(User user) throws IOException {File file = new File(filePath);if (!file.exists()) {if (!file.createNewFile()) {System.out.println("存储用户文件创建失败");return false;}}//下面开始对文件进行输入保存BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));//这是我们在注册窗口时通过输入的文本框的内容放在一个User对象// 得到我们在注册时的用户信息String userData = String.join(DELIMITER, String.valueOf(user.getId()), user.getUserName(),user.getPassWord(), String.valueOf(user.getSex()), user.getHobby(),user.getAddress(), user.getDegree());bufferedWriter.write(userData);bufferedWriter.newLine();bufferedWriter.close();return true;}

         2.登录操作的实现(即从文件中读取数据)

 这里面最关键的一点是:

我们要想对登录的用户进行验证,首先肯定要得到存储在文件中的所有用户资源
因此我们肯定需要写一个ReadAllUsers的方法,然后再对每一个对象进行一一遍历

  以下是代码实现:

//这个方法用来完成登录的操作// 首先我们肯定要得到用户名和密码,这个应该是在界面层通过输入的文本来得到// 相应的用户名和密码进行验证public boolean vaildateLogin(String inputUserName,String inputPassWord) throws IOException {//我们要想对登录的用户进行验证,首先肯定要得到存储在文件中的所有用户资源//因此我们肯定需要写一个ReadAllUsers的方法,然后再对每一个对象进行一一遍历List<User> users = readAllUsers();//下面开始对文件当中的每一个用户数据进行验证判断是否能登陆成功for(User user:users){if(user.getUserName().equals(inputUserName)&&user.getPassWord().equals(inputPassWord)){return true;}}return false;}public List<User> readAllUsers() throws IOException {//先创建一个列表来存放每一个用户数据对象List<User> list = new ArrayList<>();File file = new File(filePath);if (file.exists()) {//开始进行读操作BufferedReader bufferedReader = new BufferedReader(new FileReader(file));String line;while ((line = bufferedReader.readLine()) != null) {String[] parts = line.split("\\" + DELIMITER);//下面开始创建User对象并传入到列表当中if (parts.length == 7) {list.add(new User(Integer.parseInt(parts[0]), // IDparts[1],                   // 用户名parts[2],                   // 密码Integer.parseInt(parts[3]), // 性别parts[4],                   // 爱好parts[5],                   // 地址parts[6]                    // 学历));}}}return list;}

  四、实现用户的注册界面:

   大体流程:       

        对于注册界面我们肯定要设置标签和文本框,还需要设置布局方式,并且对确认和重置按钮作监听。

下面是代码的实现:

   

public class RegistFrame extends JFrame {//这是实现用户注册界面//主面板private JPanel p;//标签private JLabel lblName, lblPwd, lblRePwd, lblSex, lblHobby,lblAdress, lblDegree;//用户名文本框private JTextField txtName;//密码共和确认密码文本框private JPasswordField txtPwd, txtRepwd;//性别,单选按钮private JRadioButton rbMale, rbFemale;//爱好,多选框private JCheckBox ckbRead, ckbNet, ckbSwim, ckbTour;//地址,文本框private JTextArea txtAdress;//学历,组合框private JComboBox<String> cmbDegree;//确认和取消,按钮private JButton btnOk, btnCancle;//注册的用户private static User user;//用户业务类private UserService userService;//构造方法public RegistFrame() {super("用户注册");//实例化用户业务类对象userService = new UserService();//设置窗体的icon
//.......//设置面板布局,网格布局p = new JPanel(new GridLayout(8, 1, 0, 10));//实例化组件lblName = new JLabel("用  户   名:");lblPwd = new JLabel("密  码:");lblRePwd = new JLabel("确认密码:");lblSex = new JLabel("性  别:");lblHobby = new JLabel("爱  好:");lblAdress = new JLabel("地   址:");lblDegree = new JLabel("学  历");txtName = new JTextField(25);txtPwd = new JPasswordField(25);txtRepwd = new JPasswordField(25);rbMale = new JRadioButton("男");rbFemale = new JRadioButton("女");//性别的单选逻辑ButtonGroup bg = new ButtonGroup();bg.add(rbMale);bg.add(rbFemale);ckbRead = new JCheckBox("阅读");ckbNet = new JCheckBox("上网");ckbSwim = new JCheckBox("游泳");ckbTour = new JCheckBox("旅游");txtAdress = new JTextArea(3, 20);//组合框显示学历数组// 正确初始化组合框cmbDegree = new JComboBox<>(new String[]{"小学", "初中", "高中", "本科", "硕士", "博士"});//设置组合框可编辑cmbDegree.setSelectedIndex(0);// 默认选中第一项cmbDegree.setPreferredSize(new Dimension(200, 30));cmbDegree.setEditable(true);btnOk = new JButton("确定");btnCancle = new JButton("重置");btnOk.setPreferredSize(new Dimension(120, 35));   // 宽度120,高度35btnCancle.setPreferredSize(new Dimension(120, 35));Font bigFont = new Font("宋体", Font.PLAIN, 16);// 统一设置组件字体txtName.setFont(bigFont);txtPwd.setFont(bigFont);txtRepwd.setFont(bigFont);rbMale.setFont(bigFont);rbFemale.setFont(bigFont);ckbRead.setFont(bigFont);ckbNet.setFont(bigFont);ckbSwim.setFont(bigFont);ckbTour.setFont(bigFont);txtAdress.setFont(bigFont);cmbDegree.setFont(bigFont);btnOk.setFont(bigFont);btnCancle.setFont(bigFont);//这一步需要注册监听器,监听确定按钮btnOk.addActionListener(new RegisterListener());//还需要注册监听器,监听重置按钮btnCancle.addActionListener(new ResetListener());/*将组件分组放入面板,然后将小面板放入主面板*/JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEFT));p1.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p1.add(lblName);p1.add(txtName);p.add(p1);JPanel p2 = new JPanel(new FlowLayout(FlowLayout.LEFT));p2.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p2.add(lblPwd);p2.add(txtPwd);p.add(p2);JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT));p3.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p3.add(lblRePwd);p3.add(txtRepwd);p.add(p3);JPanel p4 = new JPanel(new FlowLayout(FlowLayout.LEFT));p4.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p4.add(lblSex);p4.add(rbMale);p4.add(rbFemale);p.add(p4);JPanel p5 = new JPanel(new FlowLayout(FlowLayout.LEFT));p5.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p5.add(lblHobby);p5.add(ckbRead);p5.add(ckbNet);p5.add(ckbSwim);p5.add(ckbTour);p.add(p5);JPanel p6 = new JPanel(new FlowLayout(FlowLayout.LEFT));p6.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p6.add(lblAdress);p6.add(txtAdress);p.add(p6);JPanel p7 = new JPanel(new FlowLayout(FlowLayout.LEFT));p7.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p7.add(lblDegree);p7.add(cmbDegree);p.add(p7);JPanel p8 = new JPanel(new FlowLayout(FlowLayout.CENTER));p8.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));p8.add(btnOk);p8.add(btnCancle);p.add(p8);//主面板放入窗体中this.add(p);//设置窗体的大小和位置居中this.setSize(450, 500);this.setLocationRelativeTo(null);//设置窗体不可改变大小this.setResizable(false);//设置窗体初始可见this.setVisible(true);}//监听类,负责处理确认按钮的业务逻辑private class RegisterListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//获取用户输入的数据String userName = txtName.getText().trim();String passWord = new String(txtPwd.getPassword());String rePassWord = new String(txtRepwd.getPassword());//将性别"男""女"对应转化为"1""0"int sex = Integer.parseInt(rbFemale.isSelected() ? "0" : "1");String hobby = (ckbRead.isSelected() ? "阅读" : "")+ (ckbNet.isSelected() ? "上网" : "")+ (ckbSwim.isSelected() ? "游泳" : "")+ (ckbTour.isSelected() ? "旅游" : "");String address = txtAdress.getText();Object selectedDegree = cmbDegree.getSelectedItem();String degree = (selectedDegree != null) ? selectedDegree.toString().trim() : "";//判断两次输入密码是否一致if (passWord.equals(rePassWord)) {//将数据封装到对象当中user = new User(userName, passWord, sex, hobby, address, degree);//保存数据try {if (userService.saveUser(user)) {System.out.println("注册成功!");}} catch (IOException ex) {throw new RuntimeException(ex);}} else {System.out.println("两次密码输入的不一致!");}}}public class ResetListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//清空姓名,密码,确认密码等内容txtName.setText("");txtPwd.setText("");txtRepwd.setText("");//重置单选按钮为未选择rbMale.setSelected(false);rbFemale.setSelected(false);//重置所有复选按钮为未选择ckbRead.setSelected(false);ckbNet.setSelected(false);ckbSwim.setSelected(false);ckbTour.setSelected(false);//清空地址栏txtAdress.setText("");//重置组合框为未选择状态cmbDegree.setSelectedIndex(0);}}}

 五、实现用户的登录界面(在这里面相当于总界面)

          大体流程:

这里的用户登录肯定也需要多个组件,用户名和密码的标签和文本框,然后登录,注册,重置按钮,并对其实现监听机制,这里面需要和服务层的登录方法匹配

    以下是代码实现:

  

/*** @author 袁敬尧* @version 1.0*/
public class LoginFrame extends JFrame {//这是用户登录 注册界面,我们需要多个组件//主面板private JPanel p;//标签private JLabel lblName, lblPwd;//用户名,文本框private JTextField txtName;//密码,密码框private JPasswordField txtPwd;//确认,取消和注册,按钮private JButton btnOk, btnCancle, btnRegist;//登录用户private static User user;//用户业务类private UserService userService;//构造方法public LoginFrame() {super("登录");//实例化用户业务类对象userService = new UserService();//实例化组件p = new JPanel();Font inputFont = new Font("微软雅黑", Font.PLAIN, 16);//使用null布局p.setLayout(null);lblName = new JLabel("用户名:");lblPwd = new JLabel("密码:");txtName = new JTextField(20);txtPwd = new JPasswordField(20);txtPwd.setEchoChar('*');btnOk = new JButton("登录");btnOk.addActionListener(new LoginListener());btnCancle = new JButton("重置");btnCancle.addActionListener(new ResetListener());btnRegist = new JButton("注册");btnRegist.addActionListener(new RegistListener());lblName.setBounds(30, 30, 80, 30);          // 增大标签宽度lblPwd.setBounds(30, 80, 80, 30);          // 下移密码标签位置txtName.setBounds(120, 30, 200, 30);       // 宽度200 → 300txtPwd.setBounds(120, 80, 200, 30);         // 同用户名框对齐btnOk.setBounds(50, 130, 80, 35);          // 增大按钮尺寸btnCancle.setBounds(150, 130, 80, 35);btnRegist.setBounds(250, 130, 80, 35);p.add(lblName);p.add(txtName);p.add(lblPwd);p.add(txtPwd);p.add(btnOk);p.add(btnCancle);p.add(btnRegist);txtName.setFont(inputFont);txtPwd.setFont(inputFont);//主面板放入窗体中this.add(p);//设置窗体的大小和位置this.setSize(420, 300);//设置窗口在屏幕中央this.setLocationRelativeTo(null);//设置窗体的默认关闭按钮this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体初始可见this.setVisible(true);}public class LoginListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//这里我在服务层里面已经写好了验证的数据String userName = txtName.getText().trim();String passWord = new String(txtPwd.getPassword());try {if (userService.vaildateLogin(userName,passWord)) {LoginFrame.this.setVisible(false);JOptionPane.showMessageDialog(null,"登录成功!欢迎您:" + userName,"系统提示",JOptionPane.INFORMATION_MESSAGE);}else{//输出提示信息System.out.println("密码错误,请重新输入");//清空密码框txtPwd.setText("");txtName.setText("");}} catch (IOException ex) {throw new RuntimeException(ex);}}}//监听类,负责处理重置按钮public class ResetListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {txtName.setText("");txtPwd.setText("");}}//监听类,负责处理注册按钮public class RegistListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {new RegistFrame();}}public static void main(String[] args){new LoginFrame();}}

    六、在实现时的易错点:

     以我自己举例:

              我在实现这个功能的时候,就报了空指针异常的错误,包括像我当时写坦克大战的时候也犯了空指针异常的错误,因为可能我们使用的类还没有分配内存就被使用了,那肯定会抛异常的,

private JComboBox<String> cmbDegree;
...
cmbDegree.setEditable(true); // 未初始化直接调用方法

我这里面未初始化就直接调用方法了

// 正确初始化组合框
private JComboBox<String> cmbDegree = new JComboBox<>(new String[]{"小学", "初中", "高中", "本科", "硕士", "博士"});

密码字段也错了

// LoginFrame.java
String userPwd = txtPwd.getPassword().toString(); // 错误!得到的是数组地址// RegistFrame.java
String passWord = new String(txtPwd.getPassword()); // 正确但未去空格

具体改正:

// LoginFrame.java
String userPwd = new String(txtPwd.getPassword()).trim(); // 转换为字符串并去空格// RegistFrame.java
String passWord = new String(txtPwd.getPassword()).trim();

还有最关键的一点就是使用文件流一定要记得关流。


总结

以上就是我要讲的内容了,这是一个实现用户登录和注册的基本功功能,其实这个还有很多可以扩充功能的,具体怎么实现我会和大家一起思考的,下面两周我会持续更新蓝桥杯算法题的,希望大家多多关注,我们一起加油,谢谢大家。

相关文章:

Java实战:实现用户的登录注册功能

系列文章目录 Java文件 I/O流的操作实战和高级UI组件和事件监听的综合 文章目录 系列文章目录前言一、大致流程思路分析&#xff1a;二、定义用户类&#xff1a;三、服务层的实现&#xff1a; 1.保护用户数据功能的实现2.登录操作的实现 四、实现用户的注册界面&#xff1a; 大…...

用LLama factory时报类似Process 2504721 got signal: 1的解决方法

之前用nohup来远程跑LLama factory微调脚本&#xff0c;是没有问题的&#xff0c;但今天发现运行类似下面这个命令时&#xff0c; nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一关闭ssh session&#xff0c;就会终止训练&#xff0c;报类似&…...

WPF ContentTemplate

ContentTemplate 是一个非常重要的属性&#xff0c;用于定义 ContentPresenter 中内容的显示样式。通过设置 ContentTemplate&#xff0c;你可以控制 ContentPresenter 如何呈现其绑定的内容。 下面是对 ContentTemplate 的详细解释以及它的作用和用法。 1. ContentTemplate 的…...

powershell7.5.0不支持conda的问题

经历&#xff1a;这周手欠使用vscode的powershell时提示我更新&#xff0c;我就更新了&#xff0c;更新完激活不了conda环境了&#xff0c;查询了半天是powershell最新版7.5.0与目前conda25.1.1以前的版本不支持的问题。 问题环境&#xff1a;powershell版本>7.5.0&#xff…...

SSE SseEmitter.completeWithError(e) 触发的处理逻辑

在 Java 客户端使用 OkHttp 监听 SSE&#xff08;Server-Sent Events&#xff09; 的情况下&#xff0c;当服务端调用 SseEmitter.completeWithError(e)&#xff0c;客户端会触发 EventSourceListener 的 onFailure() 方法&#xff08;而不是 onError&#xff09;。 1. 服务端&…...

JAVA反序列化深入学习(八):CommonsCollections6

与CC5相似&#xff1a; 在 CC5 中使用了 TiedMapEntry#toString 来触发 LazyMap#get在 CC6 中是通过 TiedMapEntry#hashCode 来触发 LazyMap#get 之前看到了 hashcode 方法也会调用 getValue() 方法然后调用到其中 map 的 get 方法触发 LazyMap&#xff0c;那重点就在于如何在反…...

科技快讯 | 韩国科学家研发出全球首款仿生液态机器人;OpenAI推出GPT-4o图像生成功能

韩国科学家研发出全球首款仿生液态机器人&#xff0c;自由变形穿越金属栅栏 韩国首尔大学等研究团队开发出一种基于液体的下一代软体机器人&#xff0c;具有细胞仿生特性&#xff0c;能自由变形、分裂融合&#xff0c;并执行物质运输任务。该机器人采用“颗粒装甲”设计&#x…...

[Vue2]v-model用于表单

之前我们讲到过v-model用于双向绑定一个数据&#xff0c;通常用于表单提交数据。而之前的演示里只演示了文本输入栏&#xff0c;这里详细演示一下其他表单输入时使用v-model。 文本输入 文本输入数据就是经典的type"text"&#xff1a; <input type"text&qu…...

【机器学习】imagenet2012 数据预处理数据预处理

【机器学习】数据预处理 1. 下载/解压数据2. 数据预处理3. 加载以及训练代码3.1 使用PIL等加载代码3.2 使用OpenCV的方式来一张张加载代码3.3 h5的方式来加载大文件 最后总结 这个数据大约 140个G,128w的训练集 1. 下载/解压数据 首先需要下载数据&#xff1a; 数据最后处理…...

基于pycatia的CATIA零部件激活状态管理技术解析

一、问题背景&#xff1a;CATIA激活状态管理的痛点 在CATIA V5/V6的装配设计过程中&#xff0c;工程师经常使用激活状态控制&#xff08;Activation&#xff09;​来管理大型装配体的显示性能。但实际使用中存在一个典型问题&#xff1a;​当零部件被取消激活&#xff08;Deac…...

基于javaweb的SpringBoot水果生鲜商城系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

‌JVM 内存模型(JDK8+)

‌1. 内存模型结构图解‌ JVM 内存模型&#xff08;JDK 8&#xff09; ├── **线程私有区** │ ├── 程序计数器&#xff08;Program Counter Register&#xff09;‌ │ ├── 虚拟机栈&#xff08;VM Stack&#xff09; │ │ └── 栈帧&#xff08;局…...

基于飞腾FT2000/4的全国产标准6U VPX板卡,支持银河麒麟

1 功能 高可靠性的基于飞腾公司FT2000/4的处理器以及 X100 芯片组的标准6U VPX板卡&#xff0c;具有以太网、SATA、PCIE&#xff0c;以及显示等接口&#xff0c;产品功能框图如图1所示&#xff1a; 图 1 功能框图 2 技术指标 本产品功能和性能指标&#xff0c;见表 1。 表1 产品…...

【从零实现Json-Rpc框架】- 项目实现 - Dispatcher模块实现篇

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

WPS宏开发手册——JSA语法练习

目录 系列文章3、JSA语法练习3.1、运算练习3.2、比较练习3.3、if else练习3.4、for 练习3.5、字符串、数组方法练习3.6、语义转编程练习题 系列文章 使用、工程、模块介绍 JSA语法 JSA语法练习题 Excel常用Api 后续EXCEL实战、常见问题、颜色附录&#xff0c;持…...

【自学笔记】Go语言基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Go 语言简介2. 基本语法变量声明与赋值常量数据类型运算符 3. 控制结构条件语句循环语句 4. 函数函数定义与调用多返回值匿名函数与闭包 5. 并发编程goroutinech…...

PyQt6实例_批量下载pdf工具_主线程停止线程池

目录 前置&#xff1a; 代码&#xff1a; 视频&#xff1a; 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点&#xff1a; 线程池&#xff1a;QThreadPool,QRunnable&#xff1b; 信号与…...

在 Vue 项目中,登录成功后是否存储 token 与用户信息到本地

答案&#xff1a;不安全 举例&#xff1a;直接使用localStorage存储&#xff0c;本地存储可能会被 XSS 攻击窃取 localStorage.setItem(token, response.token)localStorage.setItem(userInfo, JSON.stringify({username: response.username,email: response.email})) 推荐方…...

【加密社】做一个展示币种价格的组件

具体的代码是以下,可以看到 <div id"crypto-price-widget"><p class"loading">Loading cryptocurrency prices... <span class"spinner"></span></p> </div><script> document.addEventListener(DOM…...

CANoe入门——CANoe的诊断模块,调用CAPL进行uds诊断

目录 一、诊断窗口介绍 二、诊断数据库文件管理 三、添加基础诊断描述文件&#xff08;若没有CDD/ODX/PDX文件&#xff09;并使用对应的诊断功能进行UDS诊断 3.1、添加基础诊断描述文件 3.2、基于基础诊断&#xff0c;使用诊断控制台进行UDS诊断 3.2.1、生成基础诊断 3.…...

AI日报 - 2025年3月30日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; 模型进展 | Qwen2.5-Omni多模态实时交互&#xff0c;Gemini 2.5 Pro/GPT-4o低调升级&#xff0c;Claude内部思考过程揭秘。 新模型和升级持续涌现&#xff0c;多模态与内部机制理解成焦点。 ▎&#x…...

蓝桥刷题note11(好数)

1&#xff0c;好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数&#xff0c;偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数&#xff0c;我们就称之为 “好数”。 给定一个正整数 NN&#xff0c;请计算从 1 到 NN 一共…...

Go常用的设计模式

Go常用的设计模式 常见的设计模式&#xff0c;如 单例模式、工厂模式、策略模式、观察者模式、代理模式、装饰器模式 和 适配器模式 都可以在 Go 中实现&#xff0c;适用于不同的开发需求。 这些设计模式不仅能帮助你编写结构清晰、可维护的代码&#xff0c;还能让你更好地应…...

复现文献中的三维重建图像生成,包括训练、推理和可视化

要复现《One - 2 - 3 - 45 Fast Single Image to 3D Objects with Consistent Multi - View Generation and 3D Diffusion (CVPR)2024》文献中的三维重建图像生成&#xff0c;包括训练、推理和可视化&#xff0c;并且确保代码能正常运行&#xff0c;下面是基本的实现步骤和示例…...

day17 学习笔记

文章目录 前言一、数组的增删改查1.resize函数2.append函数3.insert函数4.delete函数5.argwhere函数6.unique函数 二、统计函数1.amax&#xff0c;amin函数2.ptp函数3.median函数4.mean函数5.average函数6.var&#xff0c;std函数 前言 通过今天的学习&#xff0c;我掌握了num…...

Mysql练习题

先创建对应数据表 #先创建表 #学生表 Student create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1990-01-01 , 男); insert into Student values(02 , 钱电 , 1990-12-21 , 男); insert int…...

torch不能使用cuda的解决方案

遇到了这样的报错&#xff0c;说明 torch不能使用cuda 反思 我频繁地尝试安装不同的 nvdia 驱动&#xff0c;浪费了很多时间。因为我的错误地认为nvidia会自带cuda&#xff0c;其实cuda需要单独安装。 还有我的torch是cpu版本的&#xff0c;即使nvidia cuda安装了&#xff0…...

Python 循环全解析:从语法到实战的进阶之路

一、问答题 &#xff08;1&#xff09;下面的循环体被重复了多少次?每次循环的输出结果是什么? i1 while i < 10:if i % 2 0:print(i)死循环&#xff0c;没有输出结果 i1 while i < 10:if i % 2 0:print(i)i l死循环&#xff0c;没有输出结果 i 1 while i< 10…...

代码随想录算法训练营--打卡day3

复习&#xff1a;标注感叹号的需要在电脑上重新做几遍 一.两两交换链表中的节点&#xff01;&#xff01; 1.题目链接 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2.思路 画图 3.代码 class Solution {public ListNode swapPairs(ListNode head) …...

ubuntu 安装mysql

在 Ubuntu 系统中安装 MySQL 的步骤如下&#xff1a; 步骤 1&#xff1a;更新软件包列表 sudo apt update步骤 2&#xff1a;安装 MySQL 服务器 sudo apt install mysql-server -yUbuntu 22.04/20.04 默认安装 MySQL 8.0&#xff0c;早期版本可能默认使用 MariaDB。 如果需要…...

用Python实现资本资产定价模型(CAPM)

使用 Python 计算资本资产定价模型&#xff08;CAPM&#xff09;并获取贝塔系数&#xff08;β&#xff09;。 步骤 1&#xff1a;导入必要的库 import pandas as pd import yfinance as yf import statsmodels.api as sm import matplotlib.pyplot as plt 步骤 2&#xff1…...

Conda配置Python环境

1. 安装 Conda 选择发行版&#xff1a; Anaconda&#xff1a;适合需要预装大量科学计算包的用户&#xff08;体积较大&#xff09;。 Miniconda&#xff1a;轻量版&#xff0c;仅包含 Conda 和 Python&#xff08;推荐自行安装所需包&#xff09;。 验证安装&#xff1a; co…...

Redisson延迟队列实战:分布式系统中的“时间管理者“

目录 引言&#xff1a;延迟队列的魅力与应用 什么是Redisson延迟队列&#xff1f; 技术原理与工作机制 应用场景 环境准备&#xff1a;搭建基础 Maven依赖配置 Redisson客户端配置 延迟队列实现&#xff1a;核心代码 工作原理深度解析 数据模型与存储结构 元素流转过…...

国产化适配 - YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析

根据知识库信息&#xff0c;以下是 YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析&#xff1a; 1. YashanDB 与 MySQL 兼容性 协议与语法兼容 &#xff1a; YashanDB 100%兼容 MySQL 5.7协议 的常用命令&#xff08;如 SELECT、INSERT&#xff09;&#xff0c;但…...

从0开始——在PlatformIO下开展STM32单片机的HAL库函数编程指南

目录 前言 编写时钟初始化 实现Systicks_Handler&#xff0c;完成HAL库的时基更新 编写驱动测试 前言 笔者最开始的尝试是在2025年的寒假&#xff0c;准备向PlatformIO迁移HAL库&#xff0c;注意&#xff0c;截止到目前&#xff0c;PlatformIO对HAL库的支持已经非常完善了。…...

Python小练习系列 Vol.9:杨辉三角生成(数组构建 + 数学组合)

&#x1f9e0; Python小练习系列 Vol.9&#xff1a;杨辉三角生成&#xff08;数组构建 数学组合&#xff09; &#x1f53a; 本期我们带来一道简洁却优雅的经典练习 —— 生成杨辉三角&#xff0c;是训练数组操作与组合思想的绝佳题目&#xff01; &#x1f9e9; 一、题目描述…...

Webview详解(下)

第三阶段&#xff1a;性能优化 加载速度优化 缓存策略 缓存策略可以显著减少网络请求&#xff0c;提升页面加载速度。常用的缓存策略包括 HTTP 缓存和本地资源预加载。 1. HTTP 缓存 HTTP 缓存利用 HTTP 协议中的缓存机制&#xff08;如 Cache-Control、ETag 等&#xff0…...

scss基础用法

SCSS&#xff08;Sassy CSS&#xff09;是Sass的增强版本&#xff0c;作为CSS的预处理器&#xff0c;它提供了多种功能来提高代码的可维护性和效率。以下是SCSS的基础用法&#xff1a; 变量&#xff08;Variables&#xff09; 用于存储常用的值&#xff0c;如颜色、字体大小等。…...

知能行每日综测

题目1 自己的做法 答案 题目2 自己的 答案 题目3 注意&#xff1a;这道做错了&#xff0c;你们可以看看我哪里错了 题目4 我的 答案 题目5 没思路&#xff0c;不会做 已更改 题目6 答案 第七题 我的 不会 现在补综测最后一个...

c++ vs和g++下的string结构

话不多说进入正题.注:下述结构是在32位平台下进行验证&#xff0c;32位平台下指针占4个字节. vs下string的结构 string总共占28个字节&#xff0c;内部结构稍微复杂一点&#xff0c;先是有一个联合体&#xff0c;联合体用来定义 string中字符串的存储空间&#xff1a;(联合体的…...

海量数据处理

1.海量数据处理问题 给两个文件&#xff0c;分别有100亿个query&#xff0c;只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 解决方案一&#xff1a; 可以先用布隆过滤器&#xff0c;一个文件的query放进布隆过滤器&#xff0c;另一个文件依次查找&#xff0c;在的…...

洛谷题单1-P5706 【深基2.例8】再分肥宅水-python-流程图重构

题目描述 现在有 t t t 毫升肥宅快乐水&#xff0c;要均分给 n n n 名同学。每名同学需要 2 2 2 个杯子。现在想知道每名同学可以获得多少毫升饮料&#xff08;严格精确到小数点后 3 3 3 位&#xff09;&#xff0c;以及一共需要多少个杯子。 输入格式 输入一个实数 t …...

【HarmonyOS 5】初学者如何高效的学习鸿蒙?

【HarmonyOS 5】初学者如何高效的学习鸿蒙&#xff1f; 一、前言 在全球科技格局风云变幻的当下&#xff0c;谷歌安卓系统的管控逐步收紧&#xff0c;加之国际形势愈发复杂&#xff0c;打造中国人自主的操作系统&#xff0c;已成为时代发展的必然要求&#xff0c;这不仅是突破…...

Java NIO之FileChannel 详解

关键点说明 文件打开选项&#xff1a; StandardOpenOption.CREATE - 文件不存在时创建 StandardOpenOption.READ/WRITE - 读写权限 StandardOpenOption.APPEND - 追加模式 StandardOpenOption.TRUNCATE_EXISTING - 清空已存在文件 缓冲区操作&#xff1a; ByteBuffer.wrap…...

数据可视化(matplotlib)-------图表样式美化

目录 一、图表样式概述 &#xff08;一&#xff09;、默认图表样式 &#xff08;二&#xff09;、图表样式修改 1、局部修改 2、全局修改 二、使用颜色 &#xff08;一&#xff09;、使用基础颜色 1、单词缩写或单词表示的颜色 2、十六进制/HTML模式表示的颜色 3、RGB…...

Go 语言中,关于客户端初始化的最佳实践

在 Go 语言中&#xff0c;关于客户端初始化的最佳实践确实需要注意以下几点&#xff1a; 全局单例模式是推荐做法&#xff0c;尤其对于需要保持长连接或需要复用资源的客户端&#xff08;如数据库、Redis、HTTP 客户端等&#xff09;并发安全是必须保证的&#xff0c;需要确保…...

MyBatis的第一天笔记

1. MyBatis 概述 1.1 什么是框架 框架是对通用代码的封装&#xff0c;提前写好了一堆接口和类&#xff0c;可以直接引入使用框架一般以jar包形式存在Java常用框架&#xff1a;SSM三大框架&#xff08;Spring SpringMVC MyBatis&#xff09;、SpringBoot、SpringCloud等 1.…...

区块链赋能,为木材货场 “智” 造未来

区块链赋能&#xff0c;为木材货场 “智” 造未来 在当今数字化浪潮席卷的时代&#xff0c;软件开发公司不断探索创新&#xff0c;为各行业带来高效、智能的解决方案。今天&#xff0c;让我们聚焦于一家软件开发公司的杰出成果 —— 区块链木材货场服务平台&#xff0c;深入了…...

IvorySQL:兼容Oracle数据库的开源PostgreSQL

今天给大家介绍一款基于 PostgreSQL 开发、兼容 Oracle 数据库的国产开源关系型数据库管理系统&#xff1a;IvorySQL。 IvorySQL 由商瀚高软件提供支持&#xff0c;主要的功能特性包括&#xff1a; 完全兼容 PostgreSQL&#xff1a;IvorySQL 基于 PostgreSQL 内核开发&#xf…...

Python 序列构成的数组(切片)

切片 在 Python 里&#xff0c;像列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;和字符串&#xff08;str&#xff09;这类 序列类型都支持切片操作&#xff0c;但是实际上切片操作比人们所想象的要强大 很多。 这一节主要讨论的是这些高级切片形式的…...