JavaWeb:用户注册登录案例

news2024/11/17 17:46:04

1.1 用户登录

1.1.1 需求分析

在这里插入图片描述

  1. 用户在登录页面输入用户名和密码,提交请求给LoginServlet
  2. LoginServlet中接收请求和数据[用户名和密码]
  3. LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表
  4. 将查询的结果封装到User对象中进行返回
  5. LoginServlet中判断返回的User对象是否为null
  6. 如果为nul,说明根据用户名和密码没有查询到用户,则登录失败,返回"登录失败"数据给前端
  7. 如果不为null,则说明用户存在并且密码正确,则登录成功,返回"登录成功"数据给前端

1.1.2 环境准备

  1. 复制静态页面到项目的webapp目录下,效果如下:

在这里插入图片描述

  1. 创建db1数据库,创建tb_user表,创建User实体类

2.1 将sql语句执行下:

在这里插入图片描述

2.2 创建User.java实体类

package com.dcxuexi.pojo;

/***
 * @Title User
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 16:33
 * @Version 1.0.0
 */
public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
  1. 在项目的pom.xml导入MybatisMysql驱动坐标
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
  1. 创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口

4.1 在resources目录下创建mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--起别名-->
    <typeAliases>
        <package name="com.dcxuexi.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--
                    useSSL:关闭SSL安全连接 性能更高
                    useServerPrepStmts:开启预编译功能
                    &amp; 等同于 & ,xml配置文件中不能直接写 &符号
                -->
                <property name="url" value="jdbc:mysql:///db1?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.dcxuexi.mapper"/>
    </mappers>
</configuration>

4.2 在com.dcxuexi.mapper包下创建UserMapper接口

package com.dcxuexi.mapper;

/***
 * @Title UserMapper
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 16:45
 * @Version 1.0.0
 */
public interface UserMapper {
}

4.3 resources目录下创建UserMapper.xml

注意:在resources下创建UserMapper.xml的目录时,要使用/分割

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dcxuexi.mapper.UserMapper">

</mapper>

至此我们所需要的环境就都已经准备好了,具体该如何实现?

1.1.3 代码实现

  1. UserMapper接口中提供一个根据用户名和密码查询用户对象的方法
package com.dcxuexi.mapper;

import com.dcxuexi.pojo.User;
import org.apache.ibatis.annotations.Param;

/***
 * @Title UserMapper
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 16:45
 * @Version 1.0.0
 */
public interface UserMapper {
    /**
     * 根据用户名和密码查询用户对象
     * @param username
     * @param password
     * @return
     */
    User select(@Param("username") String username, @Param("password")  String password);
}

UserMapper.xml实现根据用户名和密码查询用户对象。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dcxuexi.mapper.UserMapper">
    <select id="select" resultType="com.dcxuexi.pojo.User">
        select * from tb_user
                 where username = #{username}
                   and password = #{password}
    </select>
</mapper>

说明

@Param注解的作用:用于传递参数,是方法的参数可以与SQL中的字段名相对应。

  1. 修改login.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="css/login.css" rel="stylesheet">
</head>

<body>
<div id="loginDiv">
    <form action="/request_demo/loginServlet" method="post" id="form">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>
  1. 编写LoginServlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 接收用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2. 调用MyBatis完成查询
        //2.1 获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4 调用方法
        User user = userMapper.select(username, password);
        //2.5 释放资源
        sqlSession.close();


        //获取字符输出流,并设置content type
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //3. 判断user释放为null
        if(user != null){
            // 登陆成功
            writer.write("登陆成功");
        }else {
            // 登陆失败
            writer.write("登陆失败");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  1. 启动服务器测试在这里插入图片描述

4.1 如果用户名和密码输入错误,则

在这里插入图片描述

4.2 如果用户名和密码输入正确,则

在这里插入图片描述

至此用户的登录功能就已经完成了。

1.2 用户注册

1.2.1 需求分析

在这里插入图片描述

  1. 用户在注册页面输入用户名和密码,提交请求给RegisterServlet
  2. RegisterServlet中接收请求和数据[用户名和密码]
  3. RegisterServlet中通过Mybatis实现调用UserMapper来根据用户名查询数据库表
  4. 将查询的结果封装到User对象中进行返回
  5. RegisterServlet中判断返回的User对象是否为null
  6. 如果为nul,说明根据用户名可用,则调用UserMapper来实现添加用户
  7. 如果不为null,则说明用户不可以,返回"用户名已存在"数据给前端

1.2.2 代码编写

  1. 编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

    package com.dcxuexi.mapper;
    
    import com.dcxuexi.pojo.User;
    import org.apache.ibatis.annotations.Param;
    
    /***
     * @Title UserMapper
     * @Description TOTD
     * @Auter DongChuang
     * @Date 2023/1/1 16:45
     * @Version 1.0.0
     */
    public interface UserMapper {
        /**
         * 根据用户名和密码查询用户对象
         * @param username
         * @param password
         * @return
         */
        User select(@Param("username") String username, @Param("password")  String password);
    
        /**
         * 根据用户名查询用户对象
         * @param username
         * @return
         */
        User selectByUsername(String username);
        /**
         * 添加用户
         * @param user
         */
        void add(User user);
    }
    

    UserMapper.xml实现方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dcxuexi.mapper.UserMapper">

    <select id="select" resultType="com.dcxuexi.pojo.User">
        select * from tb_user
                 where username = #{username}
                   and password = #{password}
    </select>
    <select id="selectByUsername" resultType="com.dcxuexi.pojo.User">
        select * from tb_user
                 where username = #{username}
    </select>
    <insert id="add">
        insert into tb_user
        values(null,#{username},#{password})
    </insert>
</mapper>
  1. 修改register.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="login.html">登录</a>
    </div>
    <form id="reg-form" action="/request_demo/registerServlet" method="post">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>
</body>
</html>
  1. 创建RegisterServlet
package com.dcxuexi.web;

import com.dcxuexi.mapper.UserMapper;
import com.dcxuexi.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/***
 * @Title RegisterServlet
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 17:47
 * @Version 1.0.0
 */
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 接收用户数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //封装用户对象
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        //2. 调用mapper 根据用户名查询用户对象
        //2.1 获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4 调用方法
        User user2 = userMapper.selectByUsername(username);

        resp.setContentType("text/html;charset=utf-8");
        //3. 判断用户对象释放为null
        if (user2 == null){
            // 用户名不存在,添加用户
            userMapper.add(user);
            // 提交事务
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
            resp.getWriter().write("用户注册成功");
        }else {
            // 用户名存在,给出提示信息
            resp.getWriter().write("用户名已存在");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
  1. 启动服务器进行测试在这里插入图片描述

4.1 如果测试成功,则在数据库中就能查看到新注册的数据在这里插入图片描述

4.2 如果用户已经存在,则在页面上展示 用户名已存在 的提示信息在这里插入图片描述

1.3 SqlSessionFactory工具类抽取

上面两个功能已经实现,但是在写Servlet的时候,因为需要使用Mybatis来完成数据库的操作,所以对于Mybatis的基础操作就出现了些重复代码,如下

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new 
	SqlSessionFactoryBuilder().build(inputStream);

有了这些重复代码就会造成一些问题:

  • 重复代码不利于后期的维护
  • SqlSessionFactory工厂类进行重复创建
    • 就相当于每次买手机都需要重新创建一个手机生产工厂来给你制造一个手机一样,资源消耗非常大但性能却非常低。所以这么做是不允许的。

那如何来优化呢?

  • 代码重复可以抽取工具类
  • 对指定代码只需要执行一次可以使用静态代码块

有了这两个方向后,代码具体该如何编写?

package com.dcxuexi.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/***
 * @Title SqlSessionFactoryUtils
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 18:05
 * @Version 1.0.0
 */
public class SqlSessionFactoryUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

工具类抽取以后,以后在对MybatisSqlSession进行操作的时候,就可以直接使用

SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();

这样就可以很好的解决上面所说的代码重复和重复创建工厂导致性能低的问题了。

LoginServlet类优化如下:

package com.dcxuexi.web;

import com.dcxuexi.mapper.UserMapper;
import com.dcxuexi.pojo.User;
import com.dcxuexi.util.SqlSessionFactoryUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

/***
 * @Title LoginServlet
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 17:02
 * @Version 1.0.0
 */
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 接收用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username = " + username);
        //2. 调用MyBatis完成查询
        //2.1 获取SqlSessionFactory对象
        //String resource = "mybatis-config.xml";
        //InputStream inputStream = Resources.getResourceAsStream(resource);
        //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4 调用方法
        User user = userMapper.select(username, password);
        //2.5 释放资源
        sqlSession.close();
        //获取字符输出流,并设置content type
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        if (user!=null){
            // 登陆成功
            writer.write(username+"登陆成功");
        }else {
            // 登陆失败
            writer.write("登陆失败");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

RegisterServlet类优化如下:

package com.dcxuexi.web;

import com.dcxuexi.mapper.UserMapper;
import com.dcxuexi.pojo.User;
import com.dcxuexi.util.SqlSessionFactoryUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/***
 * @Title RegisterServlet
 * @Description TOTD
 * @Auter DongChuang
 * @Date 2023/1/1 17:47
 * @Version 1.0.0
 */
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 接收用户数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //封装用户对象
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        //2. 调用mapper 根据用户名查询用户对象
        //2.1 获取SqlSessionFactory对象
        //String resource = "mybatis-config.xml";
        //InputStream inputStream = Resources.getResourceAsStream(resource);
        //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        //2.2 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3 获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4 调用方法
        User user2 = userMapper.selectByUsername(username);

        resp.setContentType("text/html;charset=utf-8");
        //3. 判断用户对象释放为null
        if (user2 == null){
            // 用户名不存在,添加用户
            userMapper.add(user);
            // 提交事务
            sqlSession.commit();
            // 释放资源
            sqlSession.close();
            resp.getWriter().write("用户注册成功");
        }else {
            // 用户名存在,给出提示信息
            resp.getWriter().write("用户名已存在");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

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

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

相关文章

用或不用大O来优化代码(选择排序)

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 目录 写在前面 1.选择排序 2.选择排序实战 3.选择排序的实现 4.选择排序的效率 5.忽略常数 6.大O的作用 7.总结 写在前面 大 O 是一…

Java面向对象详解(下)

文章目录&#x1f4d6;前言&#xff1a;&#x1f3c5;封装• 封装的概念• 封装的好处• 封装的核心理解&#x1f3c5;继承• 继承的概念•继承的特点● 何时使用继承&#xff1f;● 继承的形式● 继承的传递性● 继承的构造方法&#x1f9f8;super关键字&#x1f387;用途&…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.14 平移、旋转、缩放

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1te4y1L7Mu 本节讲解平移、旋转、缩放这些变换操作 1. 关联信号槽 首先&#xff0c;在 widget.cpp 的构造中&#xff0c;为 “变换” 复选框&#xff0c;关联信号槽 // 平移、旋转、缩放 conn…

leetcode 2439. 最小化数组中的最大值

给你一个下标从 0 开始的数组 nums &#xff0c;它含有 n 个非负整数。 每一步操作中&#xff0c;你需要&#xff1a; 选择一个满足 1 < i < n 的整数 i &#xff0c;且 nums[i] > 0 。将 nums[i] 减 1 。将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作&…

程序的环境与预处理 程序的编译与链接

目录 1.程序的翻译环境和执行环境 ​编辑 2.编译链接 运行环境 3.预处理 预定义符号 #define #与## 带副作用的宏参数 宏和函数的对比 命名约定 ​编辑 #undef​编辑 命令行定义 ​编辑 条件编译 文件包含 嵌套文件包含 4.其他预处理指令 1.程序的翻译环境和…

新年伊始,和大家聊聊鲜枣课堂的未来

大家好&#xff0c;我是小枣君。时间过得很快&#xff0c;转眼之间&#xff0c;2022年已经结束了。回首这一年&#xff0c;感觉自己一直都在忙&#xff0c;却想不起来到底忙了些什么。这一年&#xff0c;我的生活和工作节奏&#xff0c;一直都是混乱的。这里面&#xff0c;既有…

罗振宇2023“时间的朋友”跨年演讲原版PPT(附下载)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点2023年&#xff0c;如何科学制定年度规划&#xff1f;《底层逻辑》高清配图清华大学256页PPT元宇宙研究报告.pdf&#xff08;附下载链接&#xff09;…

软件测试[用例篇]

一. 回顾测试用例 1.测试用例基本要素 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 2.测试用例好处 测试用例可以提高测试效率&#xff08;可以减…

省时省力,高速收费站无线组网解决方案

一、行业背景随着我国高速公路里程数的不断增加&#xff0c;科技水平的不断进步&#xff0c;智能化的高速公路收费站趋势在不断的加强。例如&#xff1b;高速公路收费站智能备份系统&#xff0c;通常情况下收费站、路段分中心和省联网中心之间是需要传输收费数据记录流水、清账…

【1801. 积压订单中的订单总数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种&…

关于el-time-picker使用错误的记录

之前在紧急参与一个PC管理后台的项目&#xff0c;项目的基础架子是花裤衩大佬的vue-element-admin()vue2版本),。其中有一个需求是列表数据中数据回显时候&#xff0c;有关时间部分的数据在回显/编辑的情况下&#xff0c;提交时获取的值有问题。虽然后面解决了&#xff0c;但还…

2023年要来了。顺便分享过来后我的学开车经历

你好呀&#xff0c;读者朋友们&#xff01;我是你们的老朋友 zhen guo时光如梭&#xff0c;转眼间我这边再有1个来小时就2023年了&#xff0c;因时差&#xff0c;很多看到这里的读者朋友应该都已经进入2023年。2022年再也回不去了&#xff0c;就像曾经过去的每一年那样&#xf…

【王道操作系统】2.3.1 进程的同步与互斥

进程的同步与互斥 文章目录进程的同步与互斥1.进程同步2.进程互斥1.进程同步 同步也称为直接制约关系在多道程序环境下&#xff0c;进程是并发执行的&#xff0c;不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,如等待、传递信息等&#xff0c;引入了…

IP协议重点总结(附实例)

文章目录前言一、IP地址1.1 概念1.2 作用1.3 格式1.4 组成1.5 分类二、NAT地址转换2.1 作用2.2 转换过程2.3 NAPT端口映射2.4 现实中的栗子&#xff08;以博主的手机为例&#xff09;2.4.1 连无线WLAN的情况2.4.2 用流量上网2.5 NAT的缺陷三、子网掩码3.1 格式3.2 作用3.3 计算…

windows安装IIS服务

安装ASP的环境IIS 1、使用快捷键 【Win X】 打开系统功能菜单&#xff0c;选择【程序和功能】 2、进入【程序和功能】界面管理后&#xff0c;点击【启用或关闭windows功能】。 3、然后保证以下勾选&#xff0c;其他的默认就行&#xff0c;点击确定。如图&#xff1a; 4、出现…

vueJs中的watch与watchEffect函数

前言有时&#xff0c;我们需要在状态变化时执行一些副作用,比如:监听路由状态,更改DOM,或是根据异步操作的结果去修改另一处的状态这个时候,就需要用到监听器在组合式API中,就可以使用watch函数在每次响应式状态发生变化时触发回调函数01使用watch监视refwatch:监听某个属性的变…

2023.01/1801. 积压订单中的订单总数

1801. 积压订单中的订单总数 题意: 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种&#xff1a; 0 表示这是一批采购订单 buy …

3D打印:FDM打印使用CURA4.13.1版本配置

一、前言 今天是2023年1月1日&#xff0c;新年阳历的第一天&#xff0c;在整理CSDN和写年度计划&#xff0c;对2022的总结&#xff0c;就像写一篇博客来分享一下我2022年积累的最多的一项经验&#xff0c;就是使用3D打印机&#xff0c;在2022年我先后入手了3台3d打印机&#x…

聊聊数字化转型是个啥

“国有企业首要的职责&#xff0c;就是实现国有资产保值增值。这是衡量国企工作优劣的关键&#xff01;” ——李克强 如果你开了一家制衣厂&#xff0c;雇佣了10个员工买了10台缝纫机&#xff0c;假设一天可以生产100件衣服。 做老板的你想要提高这家工厂的生产数量&#xff0…

禾元生物冲刺科创板上市:累计亏损超4亿元,贝达药业为主要股东

12月30日&#xff0c;武汉禾元生物科技股份有限公司&#xff08;下称“禾元生物”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;禾元生物计划募资35.02亿元&#xff0c;将用于植物源重组人血清白蛋白产业化基地建设项目、新药…