家居网购项目(一)

文章目录

    • 1.前置知识
        • 1.项目开发阶段
        • 2.Java经典三层架构
        • 3.项目具体分层(包方案)
        • 4.MVC
    • 2.开发环境搭建
        • 1.新建普通javaweb项目,导入jar包
        • 2.创建项目结构
        • 3.搭建前端页面
    • 3.会员注册前端js校验
        • 1.需求分析
        • 2.代码
          • login.html
        • 3.结果
        • 4.调试阶段
          • 1.验证信息一闪而过
            • 原因:
    • 4.会员注册后端
        • 1.需求分析
        • 2.程序框架图
        • 3.数据库表设计
          • 会员表设计
        • 4.建立javabean与表的映射
          • Member.java
        • 5.引入德鲁伊连接池工具类
          • JDBCUtilsByDruid.java
        • 6.引入BasicDao
          • BasicDao.java
        • 7.编写druid配置文件
          • druid.properties
          • 编写测试类,测试连接
            • JDBCUtilsByDruidTest.java
        • 8.编写MemberDao
          • 1.MemberDao.java
          • 2.MemberDaoImpl.java
          • 3.进行单元测试
            • MemberDaoTest.java
            • 测试结果:
        • 9.编写MemberService
          • 1.MemberService.java
          • 2.MemberServiceImpl.java
          • 3.进行单元测试
            • MemberServiceTest.java
            • 测试结果
        • 10.login.html优化
          • 1.设置base路径
          • 2.修改所有../../为空
          • 3.运行login.html
          • 4.修改前端js验证通过逻辑
        • 11.编写RegisterServlet
          • 1.修改login.html
          • 2.引入两个前端页面
          • 3.修改两个页面的base路径
          • 4.RegisterServlet.java
        • 12.注册功能展示
          • 注册界面
          • 注册成功
          • 注册失败返回首页

1.前置知识

1.项目开发阶段

image-20240204174457829

2.Java经典三层架构

image-20240204181049612

3.项目具体分层(包方案)

image-20240204181314291

4.MVC

image-20240204183543670

image-20240204182252025

2.开发环境搭建

1.新建普通javaweb项目,导入jar包

image-20240204185053583

2.创建项目结构

image-20240204185122184

3.搭建前端页面

image-20240204191613545

3.会员注册前端js校验

1.需求分析

image-20240204193615650

2.代码
login.html
<!--    引入jquery-->
    <script type="text/javascript" src="../../script/jquery-3.6.0.min.js"></script>
    <script>
        $(function () { //页面加载
            //绑定注册按钮点击事件
            $("#sub-btn").click(function () {
                //获取username
                var usernameVal = $("#username").val();
                // alert(usernameVal);
                //1.编写正则表达式验证用户名
                var usernamePattern = /^\w{6,10}$/;
                //验证
                if (!usernamePattern.test(usernameVal)) {
                    //使用前端给的span展示错误信息
                    $("span[class='errorMsg']").text("用户名格式不对,需要6到10个字符");
                    return false; //不提交
                }
                //2.编写正则表达式验证密码
                //获取密码
                var passwordVal =  $("#password").val();
                //正则
                var passwordPattern = /^\w{6,10}$/;
                //验证
                if (!passwordPattern.test(passwordVal)) {
                    //使用前端给的span展示错误信息(普通选择器)
                    $("span.errorMsg").text("密码格式不对,需要6到10个字符");
                    return false;
                }
                //3.两次密码需要相同
                //获取第二次输入的密码
                var repwdVal = $("#repwd").val();
                //与第一次的密码进行比较
                if (repwdVal != passwordVal) {
                    $("span.errorMsg").text("两次密码不相同!");
                    return false;
                }
                //4.验证邮箱
                //得到邮箱
                var emailVal = $("#email").val();
                //正则
                var emailPattern = /^[\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+$/; //java中是两个斜杠,js是一个
                //验证
                if(!emailPattern.test(emailVal)) {
                    $("span.errorMsg").text("电子邮件格式不对!");
                    return false;
                }
                //暂时先算过关,先不提交
                $("span.errorMsg").text("验证通过!");
                return false;
            })
        })
    </script>
3.结果

image-20240204201041909

4.调试阶段
1.验证信息一闪而过
原因:

没有在js中return false,阻止表单提交

4.会员注册后端

1.需求分析

image-20240204201601053

2.程序框架图

image-20240204202530923

3.数据库表设计
会员表设计
-- 创建家具网购数据库表
CREATE DATABASE home_furnishing;

USE home_furnishing;

-- 创建会员表
CREATE TABLE `member` (
`id` INT PRIMARY KEY auto_increment,
`username` VARCHAR(32) NOT NULL UNIQUE,
`password` VARCHAR(32) NOT NULL,
`email` VARCHAR(64)
)
-- 测试数据
INSERT INTO member VALUES(NULL, 'admin', MD5('admin'), '1721469477@qq.com')
4.建立javabean与表的映射
Member.java
package com.sxs.furns.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Member {
    private Integer id;
    private String username;
    private String password;
    private String email;

    //无参构造方法!!!用于反射调用
    public Member(){}

    public Member(Integer id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }

    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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

5.引入德鲁伊连接池工具类
JDBCUtilsByDruid.java
package com.sxs.furns.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class JDBCUtilsByDruid {
    //静态数据源引用(jdbc的接口)
    private static DataSource dataSource;

    //静态代码块,在类加载时为数据源引用赋值
    static {
        //1.读取配置文件
        Properties properties = new Properties();
        try {
            //使用类加载器读取配置文件,配置文件放在resources文件夹
            //这句话的意思是,使用JDBCUtilsByDruid类读取在resources文件夹下的配置文件,druid.properties
            properties.load(JDBCUtilsByDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //2.使用配置文件,创建德鲁伊数据源对象
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //编写getConnection方法
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //把Connection对象放回连接池
    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


}

6.引入BasicDao
BasicDao.java
package com.sxs.furns.dao;

import com.sxs.furns.utils.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 * 开发BasicDAO , 是其他DAO的父类
 */
public class BasicDao<T> { //泛型指定具体类型

    private QueryRunner qr =  new QueryRunner();

    //开发通用的dml方法, 针对任意的表
    public int update(String sql, Object... parameters) {

        Connection connection = null;

        try {
            connection = JDBCUtilsByDruid.getConnection();
            int update = qr.update(connection, sql, parameters);
            return  update;
        } catch (SQLException e) {
           throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }

    }

    //返回多个对象(即查询的结果是多行), 针对任意表

    /**
     *
     * @param sql sql 语句,可以有 ?
     * @param clazz 传入一个类的Class对象 比如 Actor.class
     * @param parameters 传入 ? 的具体的值,可以是多个
     * @return 根据Actor.class 返回对应的 ArrayList 集合
     */
    public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }

    }

    //查询单行结果 的通用方法
    public T querySingle(String sql, Class<T> clazz, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return  qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

    //查询单行单列的方法,即返回单值的方法

    public Object queryScalar(String sql, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return  qr.query(connection, sql, new ScalarHandler(), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

}

7.编写druid配置文件
druid.properties
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/home_furnishing?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/girls
username=root
password=root
#initial connection Size
initialSize=10
#min idle connecton size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000
编写测试类,测试连接
JDBCUtilsByDruidTest.java
package com.sxs.furns.test;

import com.sxs.furns.utils.JDBCUtilsByDruid;
import org.junit.Test;

import java.sql.Connection;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class JDBCUtilsByDruidTest {
    @Test
    public void getConnection() {
        //测试连接
        Connection connection = JDBCUtilsByDruid.getConnection();
        System.out.println(connection);
        JDBCUtilsByDruid.close(null, null, connection);
    }
}

image-20240204210743090

8.编写MemberDao
1.MemberDao.java
package com.sxs.furns.dao;

import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface MemberDao {
    //1.通过用户名返回Member
    public Member queryMemberByUsername(String username);
    //2.保存Member对象到数据库的member表
    public int saveMember(Member member);
}

2.MemberDaoImpl.java
package com.sxs.furns.dao.impl;

import com.sxs.furns.dao.BasicDao;
import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberDaoImpl extends BasicDao<Member> implements MemberDao {
    /**
     * 通过用户名,返回对应的Member
     * @param username 用户名
     * @return 对应的Member对象,如果没有则返回null
     */
    @Override
    public Member queryMemberByUsername(String username) {
        //查询单行数据
        Member member = querySingle("select * from member where username = ?", Member.class, username);
        return member;
    }

    /**
     * 保存一个会员
     * @param member 传入Member对象
     * @return 返回-1就是失败,返回其他的数字就是受影响的行数
     */
    @Override
    public int saveMember(Member member) {
        //获取member对象信息
        String username = member.getUsername();
        String password = member.getPassword();
        String email = member.getEmail();
        //插入到member表中
        return update("insert into member values(?,?,md5(?),?)", null, username, password, email);
    }
}

3.进行单元测试
MemberDaoTest.java
package com.sxs.furns.test;

import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.dao.impl.MemberDaoImpl;
import com.sxs.furns.entity.Member;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberDaoTest {
    private MemberDao memberDao = new MemberDaoImpl();
    @Test
    public void queryMemberByUsername() {
        if (memberDao.queryMemberByUsername("admin") == null) {
            System.out.println("该用户不存在");
        } else {
            System.out.println("该用户存在");
        }
    }
    @Test
    public void saveMember() {
        Member member = new Member(null, "jack", "123", "123@qq.com");
        if (memberDao.saveMember(member) == 1) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }
}

测试结果:

image-20240205095931244

image-20240205095853310

9.编写MemberService
1.MemberService.java
package com.sxs.furns.service;

import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface MemberService {
    //注册用户
    public boolean registerMember(Member member);
    //判断用户名是否存在
    public boolean isExistsUsername(String username);
}

2.MemberServiceImpl.java
package com.sxs.furns.service.impl;

import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.dao.impl.MemberDaoImpl;
import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberServiceImpl implements MemberService {
    //定义一个MemberDao的属性
    MemberDao memberDao = new MemberDaoImpl();

    /**
     * 将注册用户信息插入到数据库中
     * @param member 注册用户信息
     * @return 成功返回true,失败返回false
     */
    @Override
    public boolean registerMember(Member member) {
        return memberDao.saveMember(member) == 1 ? true : false;
    }

    /**
     * 判断用户是否存在
     * @param username 用户名
     * @return 如果存在,返回true,否则返回false
     */
    @Override
    public boolean isExistsUsername(String username) {
        return memberDao.queryMemberByUsername(username) == null ? false : true;
    }
}

3.进行单元测试
MemberServiceTest.java
package com.sxs.furns.test;

import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberServiceTest {
    private MemberService memberService = new MemberServiceImpl();

    @Test
    public void registerMember() {
        Member member = new Member(null, "jack", "123", "123@qq.com");
        if (!memberService.registerMember(member)) {
            System.out.println("注册失败");
        } else {
            System.out.println("注册成功");
        }
    }

    @Test
    public void isExistsUsername() {
       if (!memberService.isExistsUsername("jack")) {
           System.out.println("用户不存在");
       } else {
           System.out.println("用户存在");
       }
    }
}

测试结果

image-20240205102436637

image-20240205102443364

10.login.html优化
1.设置base路径
<!--    base路径设置    -->
    <base href="http://localhost:8080/jiaju_mail/">

image-20240205104237811

2.修改所有…/…/为空

image-20240205104843033

3.运行login.html

image-20240205104903148

4.修改前端js验证通过逻辑

image-20240205105045231

11.编写RegisterServlet
1.修改login.html

image-20240205105359729

2.引入两个前端页面

image-20240205140855281

3.修改两个页面的base路径

image-20240205140931909

4.RegisterServlet.java
package com.sxs.furns.web;

import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {
    //定义属性
    private MemberService memberService = new MemberServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受用户注册信息
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        //判断用户名是否在数据库中
        if (!memberService.isExistsUsername(username)) { //不在数据库中,可以注册
            Member member = new Member(null, username, password, email);
            //注册
            if (memberService.registerMember(member)) {
                //请求转发
                req.getRequestDispatcher("/views/member/register_ok.html").forward(req, resp);
            } else {
                //请求转发
                req.getRequestDispatcher("/views/member/register_fail.html").forward(req, resp);
            }
        } else {
            //返回注册页面
            req.getRequestDispatcher("/views/member/login.html").forward(req, resp);
        }
    }

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

12.注册功能展示
注册界面

image-20240205141051819

注册成功

image-20240205141105048

注册失败返回首页

image-20240205141249455

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤&#xff1a;文字检测和文字识别&#xff0c;而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像&#xff0c;主要由合成图像&#xff0c;产品描述&#xff0c;网络广告(淘宝)MS…

Linux下使用C语言实现高并发服务器

高并发服务器 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 使用多进程并发服务器时要考虑以下几点&#xff1a; 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)系统内创建进程个数(与内存大小相关)进程创建过多是否降低整体…

代码随想录训练营day36

第八章 贪心算法 part05 1.LeetCode. 无重叠区间 1.1题目链接&#xff1a;435. 无重叠区间 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;我来按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区…

yolov8训练自己数据集的一些小细节

例如我的路径格式如下: 这里要保证两个对齐, train/images/img1.jpg,2,3,xxx train/labels/img1.txt,2,3,xxx val/images/img1.jpg,2,3,xxx val/labels/img1.txt,2,3,xxxyaml文件读取路径的时候,个人猜测是依靠替换字符串找标签的, 因为yaml文件里没有指明如何加载labels,它后…

MobX原理剖析:基于可观察状态和自动依赖追踪的响应式状态管理

我们用代码示例来说明 MobX 的核心原理。 首先,我们定义一个简单的 Store 类,其中包含一个可观察的计数器状态: import { observable, action } from mobx;class CounterStore {observable count 0;actionincrement () > {this.count;};actiondecrement () > {this.…

【STM32G431RBTx】备战蓝桥杯嵌入式→省赛试题→第十四届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.KEY, 四个按键IO口都要配置&#xff0c;分别是PB0, PB1,PB2,PA…

【端云一体化开发】云函数本地运行/调试启动失败的两种解决方案

最近本地调试云函数一直出现这个错误&#xff1a;Before launch task execute failed! details:java.lang.lllegalStateException: npm installfailed 这个问题的原因似乎是运行云函数的时候会重新下载 npm 及相关依赖文件&#xff0c;但是 DevEco 的 npm 模块出错导致这个步骤…

软考121-上午题-【软件工程】-敏捷方法

一、敏捷方法 敏捷开发的总体目标是通过“尽可能早地、持续地对有价值的软件的交付”使客户满意。通过在软件开发过程中加入灵活性&#xff0c;敏捷方法使用户能够在开发周期的后期增加或改变需求。 敏捷过程的典型方法有很多&#xff0c;每一种方法基于一套原则&#xff0c;这…

内核驱动更新

1.声明我们是开源的 .c 文件末尾加上 2.在Kconfig里面修改设备&#xff0c;bool&#xff08;双态&#xff09;-----》tristate&#xff08;三态&#xff09; 3.进入menuconfig修改为M 4.编译内核 make modules 也许你会看到一个 .ko 文件 5.复制到根目录文件下 在板子…

【Linux的进程篇章 - 进程终止和进程等待的理解】

Linux学习笔记---008 Linux之fork函数、进程终止和等待的理解1、fork函数1.1、什么是fork?1.2、fork的功能介绍1.3、fork函数返回值的理解1.4、fork函数的总结 2、进程的终止2.1、终止是在做什么&#xff1f;2.2、进程终止的3种情况 3、进程的终止3.1、进程终止的三种情况3.2、…

深度学习简介

深度学习简介 一、引言&#xff1a;深度学习的兴起 简短介绍深度学习的历史背景 深度学习&#xff0c;作为人工智能领域的一颗冉冉升起的新星&#xff0c;其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为&#xff0c;是最早期的尝试之一。然而&#x…

一天300收入打底,​一个适合任何人的创业项目!

共享旅游卡项目&#xff0c;一天300收入打底&#xff0c;一个适合任何人的创业项目&#xff01; 只要你不懒&#xff0c;生活总过得不会太差。只要你不贪&#xff0c;就算不能大富大贵&#xff0c;至少不会负债累累。 人性最难戒掉的两个字&#xff1a;一个是懒&#xff0c;另…

Web安全漏洞原理(5万字最全总结)

资料来源–安恒攻防实验室 目录 SQL注入漏洞 漏洞原理 举例说明 测试方式 数字型注入&#xff1a;字符型注入&#xff1a;搜索型注入&#xff1a; 判断注入方式如何利用漏洞 识别数据库类型注入方法&#xff08;union&#xff09; 绕过过滤方式 大小写混合替换关键字使用编码…

Java——数组练习

目录 一.数组转字符串 二.数组拷贝 三.求数组中元素的平均值 四.查找数组中指定元素(顺序查找) 五.查找数组中指定元素(二分查找) 六.数组排序(冒泡排序) 七.数组逆序 一.数组转字符串 代码示例&#xff1a; import java.util.Arrays int[] arr {1,2,3,4,5,6}; String…

Python(1):认识Python并且了解一些简单函数

文章目录 一、Python的优势及其使用场景二、Python环境的安装三、Python中的变量及其命名四、Python中的注释五、一些简单常见的函数和认识ASCII表六、Python导入模块的方式 一、Python的优势及其使用场景 优点&#xff1a; 开发效率高&#xff1a;Python具有非常强大的第三方…

工业智能终端助力工业自动化的关键

在当今数字化时代&#xff0c;工业自动化已经成为工业生产中的重要趋势。随着工业互联网的发展&#xff0c;工业智能终端作为关键技术之一&#xff0c;正在为工业自动化的实现提供了重要支持和保障。 一、工业平板电脑 工业平板电脑具备显示与交互功能&#xff0c;可满足数采、…

rust使用print控制台打印输出五颜六色的彩色红色字体

想要在控制台打印输出彩色的字体&#xff0c;可以使用一些已经封装好的依赖库&#xff0c;比如ansi_term这个依赖库&#xff0c;官方依赖库地址&#xff1a;https://crates.io/crates/ansi_term 安装依赖&#xff1a; cargo add ansi_term 或者在Cargo.toml文件中加入&#…

Meta宣布全新训推一体加速器:完全集成PyTorch 2,性能3倍提升

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 Meta 疯狂砸入数十亿美元&#xff0c;一部分招揽人才&#xff0c;一部分造芯片。 Meta 正在不…

PyQt5+Pycharm, QThread

一、创建窗体控件 untitled.ui&#xff1a; PushButton, PushButton_2, PushButton_3 lineEdit, lineEdit_2, lineEdit_3 二、编译窗体 自动生成untitled.py 三、新建py文件 myDemo.py import sys from PyQt5.QtWidgets import QApplication, QMainWindow from untitled…

第四百五十三回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…