Java web 2022跟学尚硅谷(十) 后端基础 书城

news2025/1/23 12:56:02

Java web 2022跟学尚硅谷十 后端基础 书城

  • 验证码kaptcha和缓存cookie
    • 简单了解cookie
    • 步骤
    • 简单创建cookie的样例
      • 代码
        • CookieServlet01
        • hello.html
      • 页面结果
        • Cookie保存结果
      • 第二次请求
    • cookie的API
    • Kaptcha验证码
      • 使用步骤
      • 显示效果
    • 验证码的校验
      • 相关类
        • KaptchaServlet01
  • 书城1.2
    • 正则表达式
      • 正则表达式的使用
        • 全局匹配(模式匹配)
        • 忽略大小写匹配
        • 结尾查找
        • 多行查找
        • 元字符
          • \w
          • \W
          • .
          • \s和\S
          • \d和\D
          • \b
          • ^和$
        • 字符集合
          • [ ]
          • [^]
          • [-]
          • |
      • 出现次数
    • js中获取html中标签值的方式
    • 注册界面
      • 输入用户信息后给出相关提示
      • 用户名失焦后校验是否已经被注册
      • 相关代码
        • regist.html
        • regist.js异步请求
        • UserController.java
        • DispatcherServlet.java
    • 总结

验证码kaptcha和缓存cookie

简单了解cookie

简单了解cookie

步骤

  1. 创建Cookie对象
  2. 在客户端保存Cookie
  3. 设置Cookie的有效时长
    cookie.setMaxAge(60) , 设置cookie的有效时长是60秒
    cookie.setDomain(pattern);
    cookie.setPath(uri);
  4. Cookie的应用:
    4-1: 记住用户名和密码十天 setMaxAge(60 * 60 * 24 * 10)
    4-2: 十天免登录

简单创建cookie的样例

创建cookie的样例

代码

CookieServlet01

package com.atguigu.cookies;

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

/**
 * @ClassName: CookieServlet01
 * @Description:
 * @Author: wty
 * @Date: 2022/12/14
 */
@WebServlet("/cookie01")
public class CookieServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        // 1.创建一个cookie对象
        Cookie cookie = new Cookie("uname", "jim");
        // 2.将cookie保存到客户端
        response.addCookie(cookie);

        request.getRequestDispatcher("hello.html").forward(request, response);
    }
}

hello.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Cookie跳转</title>
</head>
<body>
<p1>Cookie成功!</p1>

</body>
</html>

页面结果

页面结果

Cookie保存结果

Cookie保存结果

第二次请求

可以发现请求头和响应头,都有cookie
第二次请求

cookie的API

        // 可以给cookie设置有效时长1800秒,30分钟
        cookie.setMaxAge(1800);

        // 可以给cookie设置路径,当前路径才会带cookie过来
        cookie.setDomain("Path");

Kaptcha验证码

使用步骤

  1. 添加jar包
    添加jar包
  2. 在web.xml文件中注册KaptchaServlet,并设置验证码图片的相关属性
    web.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>KaptchaServlet</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <init-param>
            <param-name>kaptcha.border.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>abcdefghijklmnopqrstuvw123456789</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.noise.impl</param-name>
            <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>KaptchaServlet</servlet-name>
        <url-pattern>/kaptcha.jpg</url-pattern>
    </servlet-mapping>
</web-app>
  1. 在html页面上编写一个img标签,然后设置src等于KaptchaServlet对应的url-pattern
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Cookie跳转</title>
    <meta charset="UTF-8">
</head>
<body>
<img src="/kaptcha.jpg"></img>

</body>
</html>

显示效果

验证码

验证码的校验

  1. kaptcha验证码图片的各个属性在常量接口:Constants中
    验证码API

  2. KaptchaServlet在生成验证码图片时,会同时将验证码信息保存到session中。因此,我们在注册请求时,首先将用户文本框中输入的验证码值和session中保存的值进行比较,相等,则进行注册

相关类

KaptchaServlet01

package com.atguigu.cookies;

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 javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @ClassName: KaptchaServlet01
 * @Description:
 * @Author: wty
 * @Date: 2022/12/14
 */
@WebServlet("/kaptcha01")
public class KaptchaServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object kaptcha_session_key = session.getAttribute("KAPTCHA_SESSION_KEY");
        System.out.println("kaptcha_session_key =" + kaptcha_session_key);
    }
}

先打开验证码
打开验证码
获取session中的KAPTCHA_SESSION_KEY
获取验证码
查看控制台的输出
查看控制台的输出

书城1.2

正则表达式

正则表达式的使用

正则表达式的使用
1.定义正则表达式的对象
2.定义将校验的字符串
3.校验

 <script type="" language="JavaScript">
        // 或者写成 直接量形式; var reg = /abc/;
        // 对象形式:
        var reg = new RegExp("abc");
        var str = "abdefghi";
        var b = reg.test(str);
        console.log(b);

    </script>

全局匹配(模式匹配)

        // 全局匹配
        var reg2 = /abc/g;
        var str2 = "abctabc"
        str2 = str2.replace(reg2, 'o');
        console.log(str2);

输出

        oto

忽略大小写匹配

        // 忽略大小写
        var reg3 = /a/gi;
        var str3 = "abcAgt";
        str3 = str3.replace(reg3, '_')
        console.log(str3);

输出

_bc_gt

结尾查找

没有加m说明是单行匹配,会认为是一行,则替换最后一个t

        // 结尾查找
        var reg4 = /t$/;
        var str4 = "abcAgt\nabtcgt";
        str4 = str4.replace(reg4, '_')
        console.log(str4);

查找结果

abcAgt
abtcg_

多行查找

这里是多行匹配,所以会看成2行,只替换了最后一行的t

        // 多行查找
        var reg5 = /t$/m;
        var str5 = "abcAgt\nabtcgt";
        str5 = str5.replace(reg5, '_')
        console.log(str5);

结果

abcAg_
abtcgt

元字符

\w

\w:任意数字和字母还有下划线_

        // w:任意数字和字母还有下划线_
        var reg6 = /\w/gim;
        var str6 = "a_>fgeaih*#35";
        str6 = str6.replace(reg6, 'T');
        console.log(str6);

输出

TT>TTTTTT*#TT
\W

和\w正好相反,指非数字和字母还有下划线的所有字符

        // W:非(任意数字和字母还有下划线_)的其它字符
        var reg7 = /\W/gim;
        var str7 = "a_>fgeaih*#35";
        str7 = str7.replace(reg7, 'T');
        console.log(str7);

输出:

a_TfgeaihTT35
.

.是指除了换行符外的任意字符

        // .是指除了换行符外的任意字符
        var reg8 = /./gim;
        var str8 = "a_>.fgeaih*#35";
        str8 = str8.replace(reg8, 'T');
        console.log(str8);

输出

TTTTTTTTTTTTT

如果我们想匹配.只需要加上转义符\即可

        // .想匹配. 需要加转义符\
        var reg9 = /\./gim;
        var str9 = "a_>.fgeaih*#35";
        str9 = str9.replace(reg9, 'T');
        console.log(str9);

结果

a_>.fgeaih*#35
\s和\S

\s是匹配任意的空白符,包括空格、制表符、换页符等等
\S是匹配任意的非空白符,即s取反

        // s 空白符
        var reg10 = /s/;
        var str10 = "\nabad\na cg";
        str10 = str10.replace(reg10, 'T');
        console.log(str10);

输出


abad
a cg
\d和\D

\d表示匹配所有数字
\D表示数字外的其它字符

        // d所有数字
        var reg11 = /\d/igm;
        var str11 = "agwa54sges";
        str11 = str11.replace(reg11, 'T');
        console.log(str11);

输出

agwaTTsges
\b

\b匹配单词的开始或者结束

        // \b匹配单词的开始或者结束
        var reg12 = /\b/igm;
        var str12 = "hello world";
        str12 = str12.replace(reg12, "A");
        console.log(str12);

输出

AhelloA AworldA
^和$

^字符的开始
$字符的结束

        // ^字符的开始
        var reg13 = /^a/igm;
        var str13 = "ahello worldab";
        str13 = str13.replace(reg13, "T");
        console.log(str13);

结果

Thello worldab
        // $字符的结束
        var reg14 = /b$/igm;
        var str14 = "ahello worldab";
        str14 = str14.replace(reg14, "T");
        console.log(str14);

输出结果

ahello worldaT

字符集合

[ ]

表示[ ]中任何一个出现的字符都可以匹配

        // []
        var reg15 = /[ah]/igm;
        var str15 = "ahello worldab";
        str15 = str15.replace(reg15, "T");
        console.log(str15);

结果

TThello worldTb
[^]

[^]取反

        // [^]取反
        var reg16 = /[^ah]/igm;
        var str16 = "ahello worldab";
        str16 = str16.replace(reg16, "T");
        console.log("str16: " + str16);

结果

ahTTTTTTTTTTaT
[-]

[-]表示范围

        // [-]表示范围
        var reg17 = /[a-z]/igm;
        var str17 = "ahello worldab";
        str17 = str17.replace(reg17, "T");
        console.log("str17: " + str17);

结果:

TTTTTT TTTTTTT
|

|表示或者

        // [|]表示或者
        var reg18 = /[a|z]/igm;
        var str18 = "ahelloz worldab";
        str18 = str18.replace(reg18, "T");
        console.log("str18: " + str18);

结果

ThelloT worldTb

出现次数

*出现0次或者多次
+出现1次或者多次
?出现0次或者1次
{n}出现n次或者多次
{n,}出现n次或者多次
{n,m}出现n到m次

        // 出现次数
        var reg19 = /a{2}/igm;
        var str19 = "ahelloz worldaab";
        str19 = str19.replace(reg19, "T");
        console.log("str19: " + str19);

结果

ahelloz worldTb

js中获取html中标签值的方式

function checkRegist() {
    // DOM document
    var elementById = document.getElementById("unameText");
    //BOM方式获取 Browser
    //var uname = document.forms[0].uname;

    return true;
}

注册界面

输入用户信息后给出相关提示

输入用户信息后给出相关提示

用户名失焦后校验是否已经被注册

在这里插入图片描述

相关代码

regist.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>尚硅谷会员注册页面</title>
    <link type="text/css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
    <link rel="stylesheet" th:href="@{/static/css/register.css}"/>
    <style type="text/css">
        .login_form {
            height: 420px;
            margin-top: 25px;
        }
    </style>
    <script language="JavaScript" th:src="@{/static/script/regist.js}"></script>
</head>
<body>
<div id="login_header">
    <a href="../../index.html">
        <img class="logo_img" alt="" th:src="@{/static/img/logo.gif}"/>
    </a>
</div>

<div class="login_banner">
    <div class="register_form">
        <h1>注册尚硅谷会员</h1>
        <form th:action="@{/user.do}" th:method="post" onsubmit="return checkRegist();">
            <input type="hidden" name="operate" value="regist"></input>
            <div class="form-item">
                <div>
                    <label>用户名称:</label>
                    <input id="unameText" type="text" placeholder="请输入用户名" name="uname" value="hsp123"
                           onblur="ckUname(this.value)"/>
                </div>
                <span id="unameSpan" class="errMess">用户名应为6~16位数组和字母组成</span>
            </div>
            <div class="form-item">
                <div>
                    <label>用户密码:</label>
                    <input id="pwdText" type="password" placeholder="请输入密码" name="pwd"/>
                </div>
                <span id="pwdSpan" class="errMess">密码的长度至少为8位</span>
            </div>
            <div class="form-item">
                <div>
                    <label>确认密码:</label>
                    <input id="confirmPwdText" type="password" placeholder="请输入确认密码" name="pwd"/>
                </div>
                <span id="confirmPwdSpan" class="errMess">密码两次输入不一致</span>
            </div>
            <div class="form-item">
                <div>
                    <label>用户邮箱:</label>
                    <input id="emailText" type="text" placeholder="请输入邮箱" name="email"/>
                </div>
                <span id="emailSpan" class="errMess">请输入正确的邮箱格式</span>
            </div>
            <div class="form-item">
                <div>
                    <label>验证码:</label>
                    <div class="verify">
                        <input id="kaptchaText" type="text" name="verifyCode" placeholder=""/>
                        <img th:src="@{/kaptcha.jpg}" alt=""/>
                    </div>
                </div>
                <span id="kaptchaSpan" class="errMess">请输入正确的验证码</span>
                <!--<input id="kaptchaTrueText" type="hidden" th:value="${session.KAPTCHA_SESSION_KEY}">-->
            </div>
            <button class="btn">注册</button>
        </form>
    </div>
</div>
<div id="bottom">
      <span>
        尚硅谷书城.Copyright &copy;2015
      </span>
</div>
</body>
</html>

regist.js异步请求

function checkRegist() {
    // DOM document
    var unameText = $("unameText");
    var uname = unameText.value;

    var unameSpan = $("unameSpan");


    //BOM方式获取 Browser
    //var uname = document.forms[0].uname;
    //用户名不为空,用户名应为6~16位数组和字母组成
    if (null != uname) {
        var unameReg = new RegExp("\\w{6,16}");
        if (unameReg.test(uname)) {
            unameSpan.style.visibility = "hidden";
        } else {
            unameSpan.style.visibility = "visible";
            return false;
        }
    } else {
        unameSpan.style.visibility = "visible";
        return false;
    }

    var pwdText = $("pwdText");
    var pwd = pwdText.value;

    var pwdSpan = $("pwdSpan");
    //密码不为空,密码应为:密码的长度至少为8位
    if (null != pwd) {
        var pwdReg = new RegExp(".{8,}");
        if (pwdReg.test(pwd)) {
            pwdSpan.style.visibility = "hidden";
        } else {
            pwdSpan.style.visibility = "visible";
            return false;
        }
    } else {
        pwdSpan.style.visibility = "visible";
        return false;
    }


    var confirmPwdText = $("confirmPwdText");
    var confirmPwd = confirmPwdText.value;

    var confirmPwdSpan = $("confirmPwdSpan");
    //确认密码不为空,两次密码输入是否一致
    if (null != confirmPwd) {
        if (confirmPwd == pwd) {
            confirmPwdSpan.style.visibility = "hidden";
        } else {
            confirmPwdSpan.style.visibility = "visible";
            return false;
        }
    } else {
        confirmPwdSpan.style.visibility = "visible";
        return false;
    }


    var emailText = $("emailText");
    var email = emailText.value;

    var emailSpan = $("emailSpan");
    //用户邮箱
    if (null != email) {
        var emailReg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/;
        if (emailReg.test(email)) {
            emailSpan.style.visibility = "hidden";
        } else {
            emailSpan.style.visibility = "visible";
            return false;
        }
    } else {
        emailSpan.style.visibility = "visible";
        return false;
    }


    var kaptchaText = $("kaptchaText");
    var kaptcha = kaptchaText.value;

    var kaptchaSpan = $("kaptchaSpan");

    // var kaptchaTrueText = $("kaptchaTrueText");
    // var kaptchaTrue = kaptchaTrueText.value;

    // 验证码
    if (null != kaptcha) {
        if (kaptcha.length == 5) {
            kaptchaSpan.style.visibility = "hidden";
        } else {
            kaptchaSpan.style.visibility = "visible";
            return false;
        }
    } else {
        kaptchaSpan.style.visibility = "visible";
        return false;
    }


    return true;
}

function $(id) {
    return document.getElementById(id);
}

var xmlHttpRequest;

// 如果需要发异步请求,我们需要一个关键的对象XMLHttpRequest
function createXMLHttpRequest() {
    // 符合DOM2标准的浏览器创建方式
    if (window.XMLHttpRequest) {
        xmlHttpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP")
        } catch (e) {
            xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP")
        }
    }
}

function ckUname(uname) {
    createXMLHttpRequest();
    var url = "user.do?operate=ckUname&uname=" + uname;
    xmlHttpRequest.open("GET", url, true);
    // 设置回调函数
    xmlHttpRequest.onreadystatechange = ckUnameCB;
    // 发送请求
    xmlHttpRequest.send();
}

function ckUnameCB() {
    if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
        // 表示服务器端响应给我的文本内容
        //alert(xmlHttpRequest.responseText);
        var responseText = xmlHttpRequest.responseText;
        // {'uname':'1'}
        //var result = eval(responseText);
        //alert(responseText);
        if (responseText == "{'uname':'1'}") {
            alert("用户名已经被注册");
        } else {
            alert("用户名可以被注册");
        }
    }
}

UserController.java

package com.atguigu.book.controller;

import com.atguigu.book.pojo.Cart;
import com.atguigu.book.pojo.User;
import com.atguigu.book.service.BookService;
import com.atguigu.book.service.CartItemService;
import com.atguigu.book.service.UserService;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @ClassName: UserController
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class UserController {
    private UserService userService;
    private CartItemService cartItemService;

    public String login(String uname, String pwd, HttpSession session) {
        User user = userService.login(uname, pwd);
        System.out.println("user = " + user);

        if (null != user) {
            // 加载购物车的信息
            Cart cart = cartItemService.getCart(user);
            user.setCart(cart);

            // 保存的user是加载了购物车信息的user
            session.setAttribute("currUser", user);
            // 加载价格查询
            session.setAttribute("minPrice", null);
            session.setAttribute("maxPrice", null);

            return "redirect:book.do";
        } else {
            return "user/login";
        }

    }


    public String regist(String uname, String pwd, String email, String verifyCode, HttpSession session, HttpServletResponse response) throws IOException {

        // 获取验证码
        Object kaptcha_session_key = session.getAttribute("KAPTCHA_SESSION_KEY");

        if (null == kaptcha_session_key || !verifyCode.equals((String) kaptcha_session_key)) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            //out.println("<script language = 'javascript'>'alert('验证码不正确!');window.location.href='page.do?operate=page&page=user/regist';</script>");
            out.println("<script language='javascript'>alert('验证码不正确!');</script>");
            return "user/regist";
        } else {
            if (verifyCode.equals((String) kaptcha_session_key)) {
                userService.registe(new User(uname, pwd, email, 0));
                return "user/login";
            }
        }

        return "user/login";

    }

    public String ckUname(String uname) {
        User user = userService.getUser(uname);
        if (null != user) {
            // 表示用户名已经被占用。不能注册
            return "json:{'uname':'1'}";
            //return "ajax:1";
        } else {
            // 用户名未查询到,可以注册
            return "json:{'uname':'0'}";
            //return "ajax:0";
        }
    }
}

DispatcherServlet.java

中央控制器增加逻辑
中央控制器增加逻辑

else if(methodReturnStr.startsWith("json:")){
                        String jsonStr = methodReturnStr.substring("json:".length());
                        PrintWriter out = response.getWriter();
                        out.print(jsonStr);
                        out.flush();
                    }

总结

今日内容:

  1. 注册页面表单验证
    (1) 有一个事件 onsubmit ,
    οnsubmit=“return false” , 那么表单点击提交按钮时不会提交
    οnsubmit=“return true” , 那么表单点击提交按钮时会提交

(2) 获取文档中某一个节点的方式:

//DOM:Document
//var unameTxt = document.getElementById("unameTxt");
//BOM:Browser
//document.forms[0].uname
  1. 原生的Ajax(了解)
    第一步: 客户端发送异步请求;并绑定对结果处理的回调函数
    (1) html相关代码:
 <input type="text" name="uname" onblur="ckUname()"/>

(2) 定义ckUname方法:
- 创建XMLHttpRequest对象
- XMLHttpRequest对象操作步骤:
- open(url,“GET”,true)
- onreadyStateChange 设置回调
- send() 发送请求
- 在回调函数中需要判断XMLHttpRequest对象的状态:
readyState(0-4) , status(200)
0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.

0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了

第二步:服务器端做校验,然后将校验结果响应给客户端

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

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

相关文章

C语言经典题目—单链表求和

练习的题目<单链表求和>题目难度较小。 1、题目描述 小明输入了一个长度为 n 的数组&#xff0c;他想把这个数组转换成链表&#xff0c;链表上每个节点的值对应数组中一个元素的值&#xff0c;然后遍历链表并求和各节点的值。输入描述&#xff1a; 第一行输入一个正整数…

Linux下内存空间分配、物理地址与虚拟地址映射

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。如果需要连续的物理页&#xff0c;可以使用此函数&#xff0c;这是内核中内存分配的常用方式&#xff0c;也是大多数情况下应该使用的内存分配方式。 传递给函数的最常用的标志是GTP_A…

火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

近日&#xff0c;火山引擎A/B测试平台—— DataTester 对产品内A/B实验的“可视化编辑器”进行了新的升级&#xff0c;对交互、预览、Xpath的层次结构视图等能力均做了优化。 据介绍&#xff0c;火山引擎DataTester的可视化编辑器&#xff0c;可以让用户无需编写任何代码&#…

基于java+springboot+mybatis+vue+mysql的CSGO游戏比赛赛事管理系统

项目介绍 CSGO赛事管理系统利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点。比如计算检索速度特别快、可靠性特别高、存储容量特别大、保密性特别好、可保存时间特别长、成本特别低等。在工作效率上&#xff0c;能够得到极大地提高&#xff0…

基于JAVA+SpringMVC+Mybatis+Vue+MYSQL的大健康老年公寓管理系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。 管理员后台页面&#xff1a; 功能&#xff1a;主页、个人中心、护理人员管理、收费标准管理、接待登记管理、房间信息管理、床位信息管理…

ASEMI肖特基二极管MBR30200FCT封装,MBR30200FCT体积

编辑-Z ASEMI肖特基二极管MBR30200FCT参数&#xff1a; 型号&#xff1a;MBR30200FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;140V 最大直流阻断电压&#xff08;VDC&#xff09…

Android 相机预览 横屏竖屏 -- 显示

相机在设备上处于固定位置&#xff0c;无论设备是否 是手机、平板电脑或计算机。当设备方向更改时&#xff0c; 相机方向更改。常见的布局显示比率是 4:3。 对于前置摄像头&#xff0c;图像缓冲区逆时针旋转&#xff08;从 传感器的自然方向&#xff09;对于后置摄像头&#xf…

机械硬盘如何克隆至固态硬盘,如何把硬盘系统克隆到固态硬盘

由于电脑的磁盘空间是既定的&#xff0c;随着使用年限越来越长&#xff0c;电脑磁盘空间已经不满足实际的需求了。为了拓展磁盘空间&#xff0c;就可以使用磁盘克隆的方法来扩展磁盘空间。因此&#xff0c;在本文中&#xff0c;易我小编将讲解硬盘克隆的相关理论知识&#xff0…

非零基础自学Golang 第7章 函数 7.5 匿名函数和闭包

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.5 匿名函数和闭包7.5.1 定义和使用匿名函数7.5.2 闭包的定义7.5.3 闭包的“记忆力”第7章 函数 7.5 匿名函数和闭包 匿名函数即在需要函数时定义函数&#xff0c;匿名函数能以变量方式传递&#xff0c;它常常被用于…

【图像评价】图像质量评价【含GUI Matlab源码 1373期】

⛄一、简介 理论知识参考文献&#xff1a;图像印刷质量的客观评价——以报纸印刷为例 ⛄二、部分源代码 function varargout IQA(varargin) % Begin initialization code - DO NOT EDIT gui_Singleton 1; gui_State struct(‘gui_Name’, mfilename, … ‘gui_Singleton…

C++模板(初阶)

本章主要讲解三个部分&#xff1a;泛型编程、函数模板、类模板 目录 泛型编程 函数模板 函数模板概念 函数模板的格式 函数模板的原理 函数模板的实例化 隐式实例化 显式实例化 模板参数的匹配原则 类模板 泛型编程 先来大致说一下什么是泛型编程. 在计算机程序设计领…

如何安装第三方的Python包?

目录 什么是第三方包 常见的第三方包 如何安装 方法1&#xff1a;命令行 方法2&#xff1a;在IDE中用图形界面操作 什么是第三方包 我们知道&#xff0c;在Python中包就是把一些同类型的功能封装到一处&#xff0c;包含了函数、类、变量等可供外界使用。使用的方法就是在文…

肠道微生物群、营养与长期疾病风险:母婴视角

谷禾健康 怀孕的母亲与体内的胎儿是息息相关的。由于婴儿接触母体微生物群&#xff0c;母亲和孩子之间的微生物联系在怀孕期间形成。而宿主与微生物群的联系在出生后成熟&#xff0c;并进化成为个体生命中最重要的共生关系之一&#xff0c;对响应营养和环境刺激的稳态调节至关重…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…

单调队列算法 - 滑动窗口问题(常见模型:找出滑动窗口中的最大值/最小值)

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点✔ 蓝色文字表示&#xff1a…

ASEMI肖特基二极管MBR10100FCT图片,MBR10100FCT大小

编辑-Z ASEMI肖特基二极管MBR10100FCT参数&#xff1a; 型号&#xff1a;MBR10100FCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;70V 最大直流阻断电压&#xff08;VDC&#xff09;…

SpringBoot整合Druid数据源

SpringBoot整合Druid数据源1.使用Druid数据源2.完整的Druid配置3.为 DruidDataSource 绑定全局配置文件中的参数4.配置Druid数据源监控5.配置 filter 过滤器1.使用Druid数据源 <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency><gr…

方差分析 / 主成分分析 / 因子分析 / 聚类分析

一.方差分析 水平&#xff1a;因素的不同状态&#xff0c;分组是按照因素的不同水平划分的 因变量&#xff1a;在分组试验中&#xff0c;对试验对象所观测记录的变量&#xff0c;它是受各因素影响的变量 常见的方差分析类型&#xff1a;单因素方差分析&#xff0c;多因素方差…

RK3568平台开发系列讲解(调试篇)如何跟踪系统事件

🚀返回专栏总目录 文章目录 一、ltrace二、strace三、ptrace沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文我们要介绍 Linux 上两个非常有用的工具:ltrace 和 strace。在分析软件的运行过程、调试疑难 Bug、执行性能分析和调优等方面,它们都是非常有用的辅助…

肠道核心菌属——优/真杆菌属(Eubacterium),你为什么要关心它?

谷禾健康 Eubacterium 通常翻译为真杆菌属或优杆菌属 Eubacterium&#xff0c;革兰氏阳性细菌&#xff0c;属于真杆菌科&#xff0c;厚壁菌门。 Eubacterium 是在健康人结肠中发现的一种重要的肠道细菌&#xff0c;它是人类肠道微生物群的核心菌属之一&#xff0c;并显示…