项目实战系列: 家居购项目 第一部分

news2024/9/21 12:36:41

家居购项目

  • 🐀Java后端经典三层架构
  • 🐇MVC模型
  • 🐇开发环境搭建
  • 🐇会员注册
    • 🍉前端JS校验
    • 🍉后端实现
  • 🐇会员登陆

在这里插入图片描述

🐀Java后端经典三层架构

在这里插入图片描述

在这里插入图片描述

分层对应包说明
web层com.zzw.furns.web/servlet/controller/handler接受浏览器发送数据; 调用相关的service;根据执行结果,返回页面数据
service层com.zzw.furns.serviceService接口包
com.zzw.furns.service.implService接口实现类
dao持久层com.zzw.furns.daoDao接口包
com.zzw.furns.dao.implDao接口实现类
实体bean对象com.zzw.furns.pojo/entity/domain/beanJavaBean类
工具类com.zzw.furns.utils工具类
测试包com.zzw.furns.test完成对dao/service测试

🐇MVC模型

MVC全称: Model模型, View试图, Controller控制器
MVC最早出现在JavaEE三层中的Web层, 它可以有效地指导WEB层代码如何有效地分离, 单独工作

  • View试图: 只负责数据和界面的显示, 不接受任何与显示数据无关的代码, 便于程序员和美工的分工与合作(Vue/Jsp/Thymeleaf/Html)
  • Controller控制器: 只负责接收请求, 调用业务层的代码处理请求, 然后派发给页面, 是一个"调度者"的角色
  • Model模型: 将与业务逻辑相关的数据封装为具体的JavaBean类, 其中不掺杂任何与数据处理相关的代码(JavaBean/Domain/Pojo)

在这里插入图片描述
在这里插入图片描述

解读

  1. model 最早期就是javabean, 就是早期的jsp+servlet+javabean
  2. 后面业务复杂度越来越高, model逐渐分层化/组件化(service+dao)
  3. 后面又出现了持久化技术(service+dao+持久化技术(hibernate / mybatis / mybatis-plus))
  4. MVC依然是原来的mvc, 只是变得更加强大

🐇开发环境搭建

参考 IDEA 2022.3开发JavaWeb工程

1.新建Java项目 jiaju_mall

2.导入jar包

3.项目的结构
在这里插入图片描述
在这里插入图片描述

4.下载资源, 拷贝到web路径下
在这里插入图片描述

html转成jsp, 并把页面调整也以下目录
views/member/login.jsp
views/member/register_ok.jsp
views/member/register_fail.jsp
views/member/login_ok.jsp
web/index.jsp

1)html页面转为jsp页面要做的处理

在这里插入图片描述

将页面内应用的.html页面改成.jsp

将页面内的相对路径重新修改

在这里插入图片描述
如果有需要, 在页面顶部引入c标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

如果是html页面, base标签不能使用el表达式, 要这样写:
在这里插入图片描述

5.Rebuild project, 让项目识别到这些资源, 然后再启动Tomcat

在这里插入图片描述

6.对于复杂的前端页面, 要学会打开当前页面的结构, 提高工作效率

在这里插入图片描述
在这里插入图片描述

🐇会员注册

🍉前端JS校验

1.验证用户名:必须字母,数字下划线组成,并且长度为 6 到 10 位 => 正则表达式
2.验证密码:必须由字母,数字下划线组成,并且长度为 6 到 10 位
3.邮箱格式验证:常规验证即可
4.验证码:后面实现

代码实现
1.修改web/views/member/login.html, 增加(script在src属性引文件)

<script type="text/javascript" src="../../script/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
    $(function () {//页面加载完毕后执行 function
        $("#sub-btn").click(function () {
            //采用过关斩将法
            //正则表达式验证用户名
            var usernameValue = $("#username").val();
            var usernamePattern = /^\w{6,10}$/;
            if (!usernamePattern.test(usernameValue)) {
                $("span[class='errorMsg']").text("用户名格式不对, 需要6-10个字符(大小写字母,数字,下划线)");
                return false;
            }
            //验证密码
            var passwordValue = $("#password").val();
            var passwordPattern = /^\w{6,10}$/;
            if (!passwordPattern.test(passwordValue)) {
                $("span.errorMsg").text("密码格式不对, 需要6-10个字符(大小写字母,数字,下划线)");
                return false;
            }
            //两次密码要相同
            var rePwdValue = $("#repwd").val();
            if (passwordValue != rePwdValue) {
                $("span.errorMsg").text("两次密码不相同");
                return false;
            }
            //这里仍然采用过关斩将法
            //验证邮件
            var emailVal = $("#email").val();
            //在java中, 正则表达式的转义是\\; 在js中, 正则表达式转义是\
            var emailPattern = /^[\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+$/;
            if (!emailPattern.test(emailVal)) {
                $("span.errorMsg").text("电子邮件的格式不正确, 请重新输入");
                return false;
            }
            //这里暂时不提交=>显示验证通过
            $("span.errorMsg").text("验证通过");
            return false;
        });
    })
</script>

2.测试

在这里插入图片描述

🍉后端实现

思路分析

  1. 会员注册信息, 验证通过后
  2. 提交给服务器, 如果用户名在数据库中已经存在, 后端给出提示信息, 并返回重新注册
  3. 如果用户名没有在数据库中, 完成注册, 并返回注册成功的页面

程序框架图
在这里插入图片描述

代码实现
1.创建数据库和表

-- 创建家居网购需要的数据库和表
-- 删除数据库
DROP DATABASE IF EXISTS home_furnishing;

-- 删除表
DROP TABLE member;

-- 创建数据库
CREATE DATABASE home_furnishing;

-- 切换
USE home_furnishing;

-- 创建会员表
CREATE TABLE member (
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32) NOT NULL DEFAULT '' UNIQUE,
	`password` VARCHAR(32) NOT NULL,
	email VARCHAR(64)
)CHARSET utf8 ENGINE INNODB;

-- 插入数据
INSERT INTO member VALUES(NULL, 'admin', MD5('admin'), '978964140@qq.com');
INSERT INTO member VALUES(NULL, 'zhaozhiwei', MD5('zhaozhiwei'), '978964140@qq.com');
INSERT INTO member(id, username, `password`, email) VALUES(NULL, 'tom', MD5('tom'), 'tom@sohu.com');

-- 查询
SELECT * FROM member;
SELECT id, username, `password`, email FROM member WHERE username = 'admine'
SELECT id, username, `password`, email FROM member WHERE username = 'admin123' AND `password` = MD5('123456');

UPDATE member SET `password`=MD5('admin') WHERE username='admin';

2.创建实体类src/com/zzw/furns/entity/Member.java 满汉楼项目参考
无参构造器和set方法. get方法

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

3.从满汉楼项目引入BasicDAO.java, JdbcUtilsByDruid.java, Druid.properties

4.修改Druid配置文件要连接的数据库名, 确保用户名密码正确. url后面是做批处理用的
在这里插入图片描述

5.修改JdbcUtilsByDruid的路径

在这里插入图片描述

6.配置快捷键

在这里插入图片描述
在这里插入图片描述

7.测试, 新建src/com/zzw/furns/test/JdbcUtilsByDruidTest.java

@SuppressWarnings({"all"})
public class JdbcUtilsByDruidTest {
    @Test
    public void getConnection() {
        Connection connection = JdbcUtilsByDruid.getConnection();
        System.out.println(connection);
        JdbcUtilsByDruid.close(null, null, connection);
    }
}

8.新建src/com/zzw/furns/dao/MemberDao.java

public interface MemberDAO {
    //小伙伴需要自己分析, 需要哪些方法
    //提供一个通过用户名返回对应的Member
    public Member queryMemberByUsername(String username);

    //提供一个 保存Member对象到数据库Member表 的方法
    public int saveMember(Member member);
}

9.新建src/com/zzw/furns/dao/impl/MemberDaoImpl.java

public class MemberDAOImpl extends BasicDAO<Member> implements MemberDAO {
    /**
     * 通过用户名返回对应的Member
     * @param username 用户名
     * @return 对应的Member, 如果没有该Member返回null
     */
    @Override
    public Member queryMemberByUsername(String username) {
        //现在sqlyog测试, 然后再拿到程序中, 这样可以提高我们的开发效率, 减少不必要的bug
        String sql = "SELECT id, username, `password`, email FROM member WHERE username = ?";
        Member member = querySingle(sql, Member.class, username);
        return member;
    }

    /**
     * 保存一个会员
     * @param member 传入一个Member对象
     * @return 如果返回-1, 就是失败; 返回其它的数字, 就是受影响的行数
     */
    @Override
    public int saveMember(Member member) {
        //连同单引号一并换成 ? , 它会自动加上单引号
        String sql = "INSERT INTO member(id, username, `password`, email) " +
                "VALUES(NULL, ?, MD5(?), ?)";
        int updateRows = update(sql, member.getUsername(), member.getPassword(), member.getEmail());
        return updateRows;
    }
}

10.测试, 新建src/com/zzw/furns/test/MemberDAOTest.java

public class MemberDAOTest {
    private MemberDAO memberDAO = new MemberDAOImpl();

    @Test
    public void queryMemberByUsernameTest() {
        if (memberDAO.queryMemberByUsername("tome") == null) {
            System.out.println("该用户名不存在");
        } else {
            System.out.println("该用户名存在");
        }
    }
    @Test
    public void saveMember() {
        Member member =
                new Member(null, "king", "king", "king@sohu.com");
        if (memberDAO.saveMember(member) == 1) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }
}

11.新建src/com/zzw/furns/service/MemberService.java

public interface MemberService {
    
    //注册用户
    public boolean registerMember(Member member);
    
    //判断用户名是否存在
    public boolean isExistsByUsername(String username);
}

12.新建src/com/zzw/furns/service/MemberServiceImpl.java

public class MemberServiceImpl implements MemberService {
    //定义MemberDAO属性
    private MemberDAO memberDAO = new MemberDAOImpl();

    /**
     * 判断用户名是否存在
     *
     * @param username 用户名
     * @return 如果存在返回true, 否则返回false
     */
    @Override
    public boolean isExistsByUsername(String username) {
        //小技巧: 如果看某个方法:
        // (1)ctrl+b 定位到memberDAO的编译类型中的方法
        // (2)如果使用ctrl+alt+b 会定位到实现类的方法
        //如果有多个类实现了该方法, 会让你选择
        return memberDAO.queryMemberByUsername(username) == null ? false : true;
    }

    @Override
    public boolean registerMember(Member member) {
        return memberDAO.saveMember(member) == 1 ? true : false;
    }
}

13.测试, 新建src/com/zzw/furns/test/MemberServiceTest.java

public class MemberServiceTest {
    private MemberService memberService = new MemberServiceImpl();

    @Test
    public void isExistsByUsernameTest() {
        if (memberService.isExistsByUsername("king")) {
            System.out.println("用户名存在");
        } else {
            System.out.println("用户名不存在");
        }
    }

    @Test
    public void registerMember() {
        //构建一个用来测试的Member对象
        Member member = new Member(null, "tom", "tom", "tom@sohu.com");
        if (memberService.registerMember(member)) {
            System.out.println("注册用户成功");
        } else {
            System.out.println("注册用户失败");
        }
    }
}

14.接通web层, 新建src/com/zzw/furns/web/RegisterServlet.java

public class RegisterServlet extends HttpServlet {

    private MemberService memberService = new MemberServiceImpl();

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

        @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");

        Member member = new Member(null, username, password, email);

        if (!memberService.isExistsByUsername(member)) {
            //用户名可用
            if (memberService.registerMember(member)) {
                System.out.println("注册成功");
                request.getRequestDispatcher("/views/member/register_ok.jsp")
                        .forward(request, response);
            } else {
                System.out.println("注册失败");
                request.getRequestDispatcher("/views/member/register_fail.jsp")
                        .forward(request, response);
            }
        } else {
            //用户名不可用
            request.setAttribute("msg", "用户名" + username + "不可用");
            request.setAttribute("username", username);//回显用户名
            request.setAttribute("active", "register_tab");
            request.getRequestDispatcher("/views/member/login.jsp")
                    .forward(request, response);
        }
    }
}

<servlet>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.zzw.furns.web.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/register</url-pattern>
</servlet-mapping>

15.前端(错误信息回显), 修改web/views/member/login.jsp

2)cart.jsp, checkout.jsp, order.jsp,order_detail.jsp均可跳转

<!-- Header Logo Start -->
<div class="col-auto align-self-center">
    <div class="header-logo">
        <a href="index.jsp"><img src="assets/images/logo/logo.png" alt="Site Logo"/></a>
    </div>
</div>
<!-- Header Logo End -->

<!-- Header Action Start -->
<div class="col align-self-center">
    <div class="header-actions">
        <!-- Single Wedge Start -->
        欢迎: ${sessionScope.member.username}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <div class="header-bottom-set dropdown">
            <a href="orderServlet?action=listOrderByMemberId">订单管理</a>
        </div>
        <div class="header-bottom-set dropdown">
            <a href="memberServlet?action=logout">安全退出</a>
        </div>
        <!-- Single Wedge End -->
    </div>
</div>
<!-- Header Action End -->

3)修改web/views/member/login.jsp注册表单

<!--会员注册-->
<span class="errorMsg"
      style="float: right; font-weight: bold; color: lightgray; font-size: 20pt; margin-left: 10px;">${msg}</span>
<form action="registerServlet" method="post">
</form>
<a id="register_tab" data-bs-toggle="tab" href="#lg2">
   <h4>会员注册</h4>
</a>

4)修改loign.jsp - 注册失败回显信息时, 停留在注册的tab内

$(function () {
	//模拟一个点击事件, 选中注册
	//决定是显示登陆还是显示注册tab
	//如果注册失败, 显示注册tab, 而不能是默认的登录tab
    if (${requestScope.active == "register_tab"}) {
        $("#register_tab")[0].click();
    } else {
        $("#login_tab")[0].click();
    }
}
<a id="login_tab" data-bs-toggle="tab" href="#lg1">
    <h4>会员登录</h4>
</a>
<a id="register_tab" data-bs-toggle="tab" href="#lg2">
    <h4>会员注册</h4>
</a>

5)加入register_ok.jsp, register_fail.jsp页面

<a class="active"  href="index.jsp">
    <h4>注册成功, 返回首页</h4>
</a>
<a class="active"  href="views/member/login.jsp">
    <h4>注册失败, 重新注册</h4>
</a>

16.删除点击注册后的拦截代码web/views/member/login.jsp

//这里暂时不提交=>显示验证通过
$("span.errorMsg").text("验证通过");
return false;

17.测试

在这里插入图片描述

在这里插入图片描述

🐇会员登陆

思路分析
1.输入用户名和密码后提交
2.如果输入有误,则给出提示
3.判断会员是否存在
4.会员存在于数据库, 显示登录成功页面
5.否则, 返回登陆页面, 重新登陆
6.要求改进登陆密码为md5加密

程序框架图
在这里插入图片描述

代码实现
1.修改src/com/zzw/furns/dao/MemberDao.java

在这里插入图片描述

2.修改src/com/zzw/furns/dao/MemberDaoImpl.java

/**
 * 根据用户名和密码查询对应的Member对象
 * @param username 用户名
 * @param password 密码
 * @return 对应的Member对象, 如果没有 则返回null
 */
@Override
public Member queryMemberByUsernameAndPassword(String username, String password) {
    String sql = "SELECT id, username, `password`, email FROM member WHERE username = ? AND `password` = MD5(?);";
    Member member = querySingle(sql, Member.class, username, password);
    return member;
}

3.测试(不要忘了测试)

@Test
public void queryMemberByUsernameAndPassword() {
    String username = "admin";
    String password = "123456";
    Member member = memberDao.queryMemberByUsernameAndPassword(username, password);
    if (member == null) {
        System.out.println("用户名或密码错误");
    } else {
        System.out.println("登录成功");
    }
}

快捷键
在这里插入图片描述
在这里插入图片描述

4.修改src/com/zzw/furns/service/MemberService.java

public interface MemberService {
    /**
     * 根据传入的member信息, 返回对应在DB中的member对象
     * @param member 是根据用户登录构建一个member
     * @return 返回的是对应的DB中的member对象, 如果不存在返回null
     */
    public Member login(Member member);
}

5.修改src/com/zzw/furns/service/impl/MemberServiceImpl.java

public class MemberServiceImpl implements MemberService {
    //定义MemberDAO属性
    private MemberDAO memberDAO = new MemberDAOImpl();

    /**
     * 判断用户名和密码是否存在
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @Override
    public Member login(Member member) {
        //返回一个对象
        return memberDAO.
                queryMemberByUsernameAndPassword(member.getUsername(), member.getPassword());
    }
}

6.测试(不要忘了测试)

@Test
public void login() {
    Member member = new Member(null, "adminx", "admin", null);
    Member login = memberService.login(member);
    System.out.println("login= " + login);
}

7.修改src/com/zzw/furns/web/LoginServlet.java

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    private MemberService memberService = new MemberServiceImpl();
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //如果在登陆界面用户没有输入内容, 后台接收到的是""
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        Member member = new Member(null, username, password, null);
        if (memberService.login(member) != null) {//用户存在DB
            System.out.println("用户存在, 登陆成功...");
            request.getRequestDispatcher("/views/member/login_ok.html")
                    .forward(request, response);
        } else {//用户不存在
            System.out.println("登陆失败, 返回登陆页面");
            request.setAttribute("username", username);
            request.setAttribute("msg", "登陆失败");
            request.getRequestDispatcher("/views/member/login.jsp")
                    .forward(request, response);
        }
    }
}

配置LoginServlet

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.zzw.furns.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

8.修改web/views/member/login.jsp

$("button:first")[0].onclick = function () {
    //采用过关斩将法
    //正则表达式验证用户名
    var usernameValue = $("form:first")[0].childNodes[3].value;
    var usernamePattern = /^\w{6,10}$/;
    if (!usernamePattern.test(usernameValue)) {
        $("span[class='errorMsg2']").text("用户名格式不对, 需要6-10个字符(大小写字母,数字,下划线)");
        return false;
    }
    //验证密码
    var passwordValue = $("form:first")[0].childNodes[5].value;
    var passwordPattern = /^\w{6,10}$/;
    if (!passwordPattern.test(passwordValue)) {
        $("span.errorMsg2").text("密码格式不对, 需要6-10个字符(大小写字母,数字,下划线)");
        return false;
    }
}
<!--会员登录-->
<span class="errorMsg2"
      style="float: right; font-weight: bold; color: lightgray; font-size: 20pt; margin-left: 10px;">${msg}</span>
<form action="loginServlet" method="post">
    <input type="text" name="username" value="${username}" placeholder="Username"/>
    <input type="password" name="password" placeholder="Password"/>
    <div class="button-box">
        <div class="login-toggle-btn">
            <input type="checkbox"/>
            <a class="flote-none" href="javascript:void(0)">Remember me</a>
            <a href="#">Forgot Password?</a>
        </div>
        <button type="submit"><span>Login</span></button>
    </div>
</form>

9.添加login_ok.jsp, 参考

10.快捷键学习

在这里插入图片描述

11.测试
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【PyQt6 应用程序】直播素材视频循环生成

在现代内容创作中,视频素材的生成和处理变得越来越重要,尤其是在直播、视频剪辑等场景中。对于需要长期、持续生成内容的用户来说,如何有效地利用现有的视频素材,生成长时间播放且无明显重复感的视频片段,是一个亟待解决的问题。 本教程将详细讲解如何使用 PyQt6 来实现一…

tabBar设置底部菜单选项以及iconfont图标

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…

欧拉系统安装 NVIDIA 显卡驱动

1、安装显卡驱动编译工具 yum install gcc make kernel-devel 2、安装显卡驱动依赖包 yum install vulkan-loader 可选安装项&#xff0c;不安装该系统包时会出现以下警告提示&#xff0c;但不影响安装和使用。 3、安装 NVIDIA GPU 驱动 生产环境建议选择 .run 格式的驱动…

Java线程池和Executor框架-面试与分析

线程池 什么是线程池&#xff1f;为什么要用线程池&#xff1f; 在Java并发框架中&#xff0c;线程池时使用最多的东西&#xff0c;几乎所有需要异步并发执行任务的程序都可以使用线程池。 使用线程池带来的好处&#xff1a; 降低资源消耗。通过重复利用已创建的线程降低线程…

基于Java语言的充电桩系统+充电管理平台+云快充协议+云快充协议1.5+桩直连协议+云快充协议源码

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过充电桩系统的开发者尤为合适&#xff1b; 2、包含&#xff1a;启…

文心一言功能新升级:读文档、懂翻译、能识图

9月4日&#xff0c;百度文心一言官网显示&#xff0c;在向全社会开放一周年之际&#xff0c;文心一言进行了功能最新全面升级&#xff0c;同时在周年期间为新老会员增加1个月专业版免费使用体验。 据了解&#xff0c;针对网页版用户需求&#xff0c;文心一言实现了创作内容更加…

Linux-进程管理【重点】

前言 Linux操作系统在虚拟机VM上的安装【CentOS版本】-CSDN博客 Linux-(系统启动、用户管理)-CSDN博客 Linux-实用指令-CSDN博客 Linux-【组管理、权限管理、定时任务调度】-CSDN博客 进程管理 在linux中&#xff0c;每个执行的程序都成为一个进程&#xff0c;每一个进程都…

玩转Python Turtle库,实现满屏飘字的魔法!

前言 本文将教你如何使用Python的Turtle库&#xff0c;通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识&#xff0c;跟着我们的步骤&#xff0c;你也可以成为编程小达人&#xff01; 效果展示 开发过程 一、准备工作 首先&#xff0c;确保你的电脑上已经安装了Py…

在OpenEuler(欧拉)系统上用kubeadm部署(k8s)Kubernetes集群

一、OpenEuler(欧拉) 系统简介 openEuler 是开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff1b; openEuler作为一个操作系统发行版平台&#xff0c;每两年推出一个LTS版本。该版本为企业级用户提供一个安全稳定可靠的操作系统。…

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点…

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity&#xff08;实体&#xff09; Entity 是表示数据库表的对象&#xff0c;通常对应数据库中的一行数据。它通常包含与数据库表对应的字段&#xff0c;并可能包含一些业务逻辑。 DTO&#xff08;数据传输对象&#xff09; 作用&#xff1a;DTO 是用于在…

将你的github仓库设置为web代理

将你的github仓库设置为web代理 废话不多说&#xff0c;直接上步骤 废话不多说&#xff0c;直接上步骤 创建一个仓库&#xff0c;上传静态web。 2. 设置仓库的 page 1&#xff09;点击 “Settings” 如图设置

echarts 实现签到记录日历组件

以下笔记来源&#xff1a;编程导航 分析 有三种基本图表可以选择&#xff1a; 基础日历图&#xff1a;https://echarts.apache.org/examples/zh/editor.html?ccalendar-simple日历热力图&#xff1a;https://echarts.apache.org/examples/zh/editor.html?ccalendar-heatmap…

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3&#xff0c;索性最新的nginx在构建一波&#xff0c;趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

YOLOv5: 从0开始搭建环境进行模型训练

视频链接&#xff1a;YOLOv5&#xff1a; 从0开始搭建环境进行模型训练_哔哩哔哩_bilibili 《YOLOv5&#xff1a;从0开始搭建环境进行模型训练》课程致力于帮助学生实战YOLOv5目标检测算法。常心老师将手把手带领大家从0开始搭建YOLOv5环境&#xff0c;带领大家排坑、避坑、填…

windows 环境下搭建mysql cluster 集群详细步骤

1、环境准备 下载mysql集群版本&#xff0c;我这里下载的是mysql-cluster-8.0.39-winx64 https://dev.mysql.com/downloads/cluster/ 2、创建配置文件 mysql集群版本下载以后解压后目录如下&#xff0c;创建配置文件 config.ini(集群配置文件&#xff0c;my.ini mysql配置…

人工智能、机器学习与深度学习的区别及其应用

引言 在过去的十年中,人工智能(AI)从研究实验室走向了工业应用的前沿,成为推动各个行业转型的关键技术。然而,AI 并不仅仅是某一种单一的技术,它包含了多种不同的方法和工具,适用于解决从自动驾驶到医疗诊断等复杂问题。与此同时,行业内对“人工智能”、“机器学习”与…

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁&#xff0c;而MyISAM 引擎不支持行级锁&#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句&#xff0c;是不会加记录锁的&#xff0c;因为它属于快照读&#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧

如何从硬盘恢复已删除/丢失的文件&#xff1f;本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据&#xff0c;或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗&#xff1f;当我将外部硬盘插入计算机时&#xff0c;我错误地删除了一些文…

自动提取上升沿周期时间python

import pandas as pd import numpy as np# 读取你的CSV数据&#xff08;假设数据已经加载到 DataFrame df 中&#xff09; # df pd.read_csv(your_data.csv)# 确保保存时间是datetime类型 df[保存时间] pd.to_datetime(df[保存时间])# 假设喂料电机实时转速的列名为 喂料电机…