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

HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)

引言

在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用,承载着信息交互的重任。

而表单验证与提交机制,无疑是表单处理的核心与精髓所在。表单验证能够确保用户输入的数据符合预期格式与要求,有效防止非法数据的提交,从而为数据的准确性与完整性筑牢防线,为后续的业务逻辑处理奠定坚实基础。例如在注册表单中,对用户名长度、密码强度、邮箱格式等进行验证,可避免无效或恶意数据进入系统。表单提交机制则专注于将用户输入的数据准确无误地发送至服务器,实现前后端的数据交互,触发后续的业务流程,如登录验证、数据存储等。

掌握表单验证与提交机制,对于前端开发者而言,不仅能够显著提升 Web 应用的交互性与用户体验,还能增强应用的安全性与稳定性,有效抵御诸如 SQL 注入、XSS 攻击等潜在风险,让应用在复杂的网络环境中稳健运行。

初窥门径:HTML 表单基础回顾

在深入探索 HTML 表单处理的进阶知识之前,有必要先对表单的基础知识进行回顾,这不仅能帮助我们更好地理解后续的进阶内容,还能为实际应用打下坚实的基础。

表单元素介绍

HTML 表单包含了多种类型的元素,这些元素是构成表单的基本组件,每种元素都有其独特的用途和属性。

  • 文本框(<input type="text">:最常见的表单元素之一,用于收集用户的单行文本输入,如用户名、搜索关键词等。通过设置name属性可以为文本框命名,方便在提交表单时识别数据;placeholder属性则可以提供提示信息,引导用户输入正确格式的数据,比如 “请输入您的用户名” 。例如:<input type="text" name="username" placeholder="请输入用户名">。
  • 密码框(<input type="password">:专门用于输入密码,其输入内容会以掩码形式显示,如星号或圆点,以保护用户隐私。同样具有name属性,在表单提交时用于标识密码数据。例如:<input type="password" name="password"> 。
  • 单选框(<input type="radio">:用于从一组选项中选择一个选项,例如性别选择(男 / 女)、是否同意条款等。同一组单选框需要设置相同的name属性值,通过value属性来区分不同的选项。当checked属性被设置时,该单选框会默认被选中。例如:
 

<input type="radio" name="gender" value="male" checked> 男

<input type="radio" name="gender" value="female"> 女

  • 复选框(<input type="checkbox">:允许用户从一组选项中选择多个选项,常用于收集用户的兴趣爱好、选择多个项目等场景。同样通过name属性来标识一组复选框,value属性表示每个选项的值,checked属性用于设置默认选中状态。例如:
 

<input type="checkbox" name="hobbies" value="reading"> 阅读

<input type="checkbox" name="hobbies" value="sports"> 运动

<input type="checkbox" name="hobbies" value="music"> 音乐

  • 下拉列表(<select><option>:<select>标签用于创建下拉列表,<option>标签则定义了下拉列表中的具体选项。通过name属性为下拉列表命名,value属性指定每个选项提交的值,selected属性可以设置默认选中的选项。例如:
 

<select name="country">

<option value="china">中国</option>

<option value="usa">美国</option>

<option value="japan">日本</option>

</select>

  • 文本域(<textarea>:用于收集用户的多行文本输入,比如用户的留言、评论、描述等。可以通过rows和cols属性来设置文本域的行数和列数,也可以使用 CSS 的height和width属性来控制其尺寸大小。name属性同样用于标识文本域数据。例如:<textarea name="message" rows="5" cols="30"></textarea> 。
  • 提交按钮(<input type="submit"><button type="submit">:用于触发表单的提交操作,将用户输入的数据发送到服务器。<input type="submit">通过value属性设置按钮显示的文本,<button type="submit">标签内的文本即为按钮显示内容。例如:<input type="submit" value="提交"> 或 <button type="submit">提交</button> 。
  • 重置按钮(<input type="reset"><button type="reset">:用于将表单中的所有输入数据重置为初始状态,方便用户重新填写表单。同样,<input type="reset">通过value属性设置按钮文本,<button type="reset">标签内的文本为按钮显示内容。例如:<input type="reset" value="重置"> 或 <button type="reset">重置</button> 。
  • 文件上传框(<input type="file">:允许用户选择本地文件并上传到服务器,常用于头像上传、文件提交等场景。通过name属性标识文件数据,accept属性可以限制允许上传的文件类型,如.jpg,.png等。例如:<input type="file" name="avatar" accept=".jpg,.png"> 。

表单基本结构与属性

HTML 表单通过<form>标签来定义,它是一个容器,用于包裹所有的表单元素,并定义表单提交的相关属性。<form>标签具有以下常用属性:

  • action:指定表单数据提交到的目标 URL 地址,该地址通常是服务器端的一个脚本或接口,用于处理表单提交的数据。例如:<form action="submit.php">,表示将表单数据提交到当前目录下的submit.php文件进行处理。如果省略action属性,表单数据将提交到当前页面。
  • method:规定表单数据提交的 HTTP 方法,常见的值有GET和POST。
    • GET方法会将表单数据附加在 URL 的查询字符串中进行提交,数据会显示在浏览器的地址栏中,因此不太适合提交敏感信息,并且对提交的数据长度有限制(一般为 2048 个字符左右,不同浏览器可能有所差异) 。例如,当使用GET方法提交表单时,URL 可能会类似这样:http://example.com/search.php?keyword=apple&category=fruit,其中keyword和category是表单字段的名称,apple和fruit是对应的值。
    • POST方法则将表单数据放在 HTTP 请求的消息体中进行提交,数据不会显示在地址栏中,相对更安全,并且对提交的数据量没有严格限制,适合提交大量数据或敏感信息,如用户的登录密码、详细的注册信息等。
  • target:用于指定提交表单后,服务器响应结果的显示位置。常见的值有:
    • _self:在当前窗口打开响应结果,这是默认值。例如,当用户提交表单后,服务器返回的页面将直接在当前浏览器窗口中显示。
    • _blank:在新的浏览器窗口或标签页中打开响应结果。常用于需要在新窗口中展示结果的场景,比如提交订单后跳转到支付页面,新窗口可以方便用户在不离开当前页面的情况下进行支付操作。
    • _parent:在父框架中打开响应结果,如果表单是嵌套在框架中的,该属性可使响应结果显示在父框架中。
    • _top:在整个浏览器窗口中打开响应结果,会取消所有的框架结构,常用于防止表单提交后在框架中显示异常。

这些属性的合理设置,对于表单的正常提交和数据处理至关重要,在实际开发中需要根据具体需求进行选择和配置 。

登堂入室:表单验证机制深度剖析

客户端验证

HTML5 内置验证属性

HTML5 为表单验证带来了极大的便利,引入了一系列实用的内置验证属性,使开发者能够轻松实现基本的表单验证功能,无需编写大量的 JavaScript 代码。

  • required 属性:该属性用于指定输入字段为必填项。当用户尝试提交表单时,如果某个设置了required属性的字段为空,浏览器会阻止表单提交,并显示默认的错误提示信息。例如,在一个注册表单中,用户名和密码字段通常是必填的,可以这样设置:
 

<input type="text" name="username" required placeholder="请输入用户名">

<input type="password" name="password" required placeholder="请输入密码">

当用户未填写用户名或密码就点击提交按钮时,浏览器会弹出提示,告知用户需要填写这些必填字段。

  • pattern 属性:pattern属性允许开发者使用正则表达式来定义输入字段的格式规则。通过这个属性,可以对用户输入的数据进行精确的格式验证,例如验证手机号码、邮箱地址、身份证号码等特定格式的数据。以验证手机号码为例,中国手机号码一般为 11 位数字,可以使用如下正则表达式:
 

<input type="text" name="phone" pattern="[0-9]{11}" title="请输入11位手机号码" required>

在上述代码中,pattern="[0-9]{11}"表示输入内容必须是 11 位数字,title属性用于提供更详细的错误提示信息,当用户输入不符合该格式时,浏览器会显示title指定的提示内容。

  • min 和 max 属性:这两个属性主要用于数值类型的输入字段,如<input type="number">或<input type="date">,用于限制用户输入的数值范围或日期范围。比如在一个商品数量选择表单中,限制用户选择的数量在 1 到 100 之间:
 

<input type="number" name="quantity" min="1" max="100" required>

当用户输入的数量小于 1 或大于 100 时,浏览器会阻止表单提交,并显示相应的错误提示,告知用户输入值必须在指定范围内。

  • minlength 和 maxlength 属性:针对文本类型的输入字段,minlength和maxlength属性用于限制输入字符串的最小长度和最大长度。例如,设置密码长度为 6 到 12 位:
 

<input type="password" name="password" minlength="6" maxlength="12" required>

这样,当用户输入的密码长度小于 6 或大于 12 时,浏览器会提示用户输入长度不符合要求。

  • type 属性:HTML5 为<input>元素新增了多种type属性值,每种类型都自带特定的验证规则。例如:
    • type="email":用于验证输入是否为有效的邮箱地址格式,如user@example.com。如果用户输入的内容不符合邮箱格式,浏览器将阻止表单提交并给出提示。
    • type="url":验证输入是否为有效的 URL 地址,如Example Domain。当输入的不是合法的 URL 时,会触发验证错误。
    • type="number":确保输入为数字类型,并且可以结合min和max属性限制数字范围。

这些 HTML5 内置验证属性,为表单验证提供了简单而有效的方式,大大提升了开发效率和用户体验 。

JavaScript 验证方法

虽然 HTML5 内置验证属性能够满足大部分基本的验证需求,但在实际应用中,往往还需要更复杂的验证逻辑,这时候就需要借助 JavaScript 来编写自定义验证函数。

JavaScript 可以通过获取表单元素的值,然后使用各种条件判断和正则表达式来进行验证。例如,验证密码强度是一个常见的需求,要求密码必须包含大小写字母、数字和特殊字符,且长度至少为 8 位。可以编写如下 JavaScript 函数:

 

function validatePassword(password) {

const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;

return regex.test(password);

}

在表单提交事件中调用这个函数进行验证:

 

<form onsubmit="return validatePassword(this.password.value)">

<input type="password" name="password" placeholder="请输入密码">

<input type="submit" value="提交">

</form>

当用户点击提交按钮时,validatePassword函数会检查密码是否符合设定的强度规则,如果不符合,函数返回false,表单将不会被提交。

又如,验证邮箱格式除了使用 HTML5 的type="email"属性外,也可以用 JavaScript 的正则表达式实现更灵活的验证:

 

function validateEmail(email) {

const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

return regex.test(email);

}

在表单中调用:

 

<form onsubmit="return validateEmail(this.email.value)">

<input type="text" name="email" placeholder="请输入邮箱">

<input type="submit" value="提交">

</form>

这样,开发者可以根据具体的业务需求,利用 JavaScript 编写各种复杂的验证逻辑,增强表单验证的功能和灵活性 。

验证状态与反馈

在客户端验证过程中,了解表单控件的验证状态并向用户提供清晰的错误反馈至关重要,这直接影响用户体验和数据的准确性。HTML5 引入了ValidityState对象,通过它可以获取表单控件的各种验证状态信息。

ValidityState对象包含多个属性,用于描述表单控件的验证情况:

  • valid:一个布尔值,表示表单控件是否通过了所有的验证约束条件。如果所有约束都满足,valid为true;否则为false。例如:
 

const input = document.getElementById('username');

const isValid = input.validity.valid;

if (isValid) {

// 表单控件验证通过

} else {

// 表单控件验证失败

}

  • valueMissing:当表单控件设置了required属性且用户未填写任何值时,该属性为true。常用于提示用户必填字段不能为空:
 

if (input.validity.valueMissing) {

input.setCustomValidity('该字段为必填项,请填写');

} else {

input.setCustomValidity('');

}

  • typeMismatch:如果输入值的类型与表单控件指定的类型不匹配,此属性为true。比如type="email"的输入框中输入了非邮箱格式的值:
 

if (input.validity.typeMismatch) {

input.setCustomValidity('请输入有效的邮箱地址');

} else {

input.setCustomValidity('');

}

  • patternMismatch:当输入值不符合pattern属性定义的正则表达式模式时,该属性为true:
 

if (input.validity.patternMismatch) {

input.setCustomValidity('输入格式不符合要求,请重新输入');

} else {

input.setCustomValidity('');

}

  • tooLong:若输入值的长度超过了maxlength属性设定的值,此属性为true:
 

if (input.validity.tooLong) {

input.setCustomValidity('输入内容过长,请缩短');

} else {

input.setCustomValidity('');

}

为了向用户提供直观的错误反馈,可以在表单控件旁边显示错误信息,或者使用弹窗提示。例如,使用setCustomValidity方法设置自定义错误信息,并在输入框获得焦点时清除错误提示:

 

<input type="text" id="username" required pattern="[a-zA-Z]{3,}" />

<span id="error-msg"></span>

<script>

const input = document.getElementById('username');

const errorMsg = document.getElementById('error-msg');

input.addEventListener('input', function () {

if (input.validity.valid) {

errorMsg.textContent = '';

} else {

if (input.validity.valueMissing) {

errorMsg.textContent = '请输入用户名';

} else if (input.validity.patternMismatch) {

errorMsg.textContent = '用户名必须为3位以上字母';

}

}

});

</script>

通过这种方式,用户在输入过程中就能及时了解自己的输入是否符合要求,提高了表单填写的准确性和效率 。

服务器端验证

必要性阐述

尽管客户端验证能够在用户输入数据时即时反馈错误,减轻服务器负担并提升用户体验,但服务器端验证同样不可或缺,它是保障数据完整性和安全性的最后一道防线。

客户端验证很容易被绕过,一些恶意用户可以通过修改前端代码、禁用 JavaScript 或者使用专门工具来跳过客户端的验证机制,直接向服务器提交非法数据。例如,在登录表单中,恶意用户可能通过修改前端代码,绕过密码强度验证,尝试用简单密码登录系统;在注册表单中,绕过用户名唯一性验证,使用已存在的用户名进行注册。

服务器端验证能够确保所有提交的数据都经过严格检查,防止非法数据进入数据库,从而维护数据的完整性和一致性。同时,它还能有效抵御各种恶意攻击,如 SQL 注入攻击、跨站脚本攻击(XSS)等。例如,在处理用户提交的表单数据时,如果没有在服务器端进行严格的输入过滤和验证,攻击者可能会在输入框中注入恶意 SQL 语句,试图获取或篡改数据库中的数据;或者注入恶意脚本,在其他用户浏览页面时执行恶意操作。

因此,服务器端验证对于保障 Web 应用的安全性和稳定性至关重要,它与客户端验证相互配合,共同为数据的可靠性和系统的安全保驾护航 。

常见验证方式

服务器端验证通常依赖于后端编程语言及其相关的验证库来实现。不同的后端语言都有各自强大的验证工具和框架,以下是一些常见后端语言的验证方式:

  • PHP:PHP 有许多优秀的验证库,如PHP Validation。使用该库可以方便地验证各种数据类型,如邮箱、手机号码、日期等,还能进行自定义规则验证。例如,验证邮箱地址:
 

require_once 'validation.php';

$email = $_POST['email'];

if (!validate_email($email)) {

echo '请输入有效的邮箱地址';

}

  • Python(Flask 框架):在 Flask 应用中,可以使用WTForms库进行表单验证。它提供了丰富的验证器,支持数据类型验证、必填项验证、长度验证等。例如,定义一个简单的表单验证类:
 

from flask_wtf import FlaskForm

from wtforms import StringField, PasswordField

from wtforms.validators import DataRequired, Email, Length

class LoginForm(FlaskForm):

username = StringField('用户名', validators=[DataRequired()])

password = PasswordField('密码', validators=[DataRequired(), Length(min=6)])

email = StringField('邮箱', validators=[DataRequired(), Email()])

在视图函数中使用这个表单类进行验证:

 

@app.route('/login', methods=['GET', 'POST'])

def login():

form = LoginForm()

if form.validate_on_submit():

# 表单验证通过,处理业务逻辑

pass

else:

# 表单验证失败,返回错误信息

pass

  • Java(Spring Boot 框架):Spring Boot 提供了强大的验证机制,通过javax.validation包和相关注解来实现验证。例如,使用@NotEmpty注解验证字符串不能为空,@Email注解验证邮箱格式:
 

import javax.validation.constraints.Email;

import javax.validation.constraints.NotEmpty;

public class User {

@NotEmpty(message = "用户名不能为空")

private String username;

@NotEmpty(message = "密码不能为空")

@Size(min = 6, message = "密码长度至少为6位")

private String password;

@NotEmpty(message = "邮箱不能为空")

@Email(message = "请输入有效的邮箱地址")

private String email;

// 省略getter和setter方法

}

在控制器中进行验证:

 

import org.springframework.validation.annotation.Validated;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RestController;

@RestController

@Validated

public class UserController {

@PostMapping("/register")

public String register(@RequestBody @Validated User user) {

// 表单验证通过,处理注册逻辑

return "注册成功";

}

}

这些后端验证方式都能够根据具体的业务需求,对用户提交的数据进行全面、严格的验证,确保只有合法的数据能够进入系统 。

相关文章:

HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)

引言 在前端开发的广袤领域中&#xff0c;HTML 表单处理堪称基石般的存在&#xff0c;是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单&#xff0c;到功能多样的搜索栏、反馈表单&#xff0c;HTML 表单如同桥梁&#xff0c;紧密连接着用户与 Web 应用…...

23.linux下电脑健康检查

电脑健康检查 硬盘 工具 sudo apt-get install smartmontools检查命令 sudo smartctl -a /dev/sdb1输出结果 # smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-52-generic] (local build) # Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools…...

数据库自然连接详解

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 数据库自然连接详解 自然连接&#xff08;Natural Join&#xff09;是一种在关系型数据库中用于合并两个或多个表的数据的操作。它基于表之间的公共列&#xff0c;自动识别具有相同列名的列&#xff0c;并…...

说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说MyBatis一、二级缓存和Spring一二级缓存有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…...

蓝桥杯题型分布2

蓝桥杯 蓝桥杯题型分类2素数孪生素数素数个数朴素筛法求素数线性筛法求素数 因数分解试除法分解质因数 等差素数列梅森素数组素数素数环找素数(分段筛&#xff09;连续素数和小明的素数对疑似素数质数拆分纯质数超级质数质数日期质数游戏2魔法阵的能量阿坤老师切割年糕阶乘分解…...

北京交通大学第三届C语言积分赛

作者有言在先&#xff1a; 题解的作用是交流思路&#xff0c;不是抄作业的。可以把重点放在思路分析上而不是代码上&#xff0c;毕竟每个人的代码风格是不一样的&#xff0c;看别人的代码就跟做程序填空题一样。先看明白思路再看代码。 还有就是&#xff0c;deepseek真的很好用…...

ESP32学习 -从STM32工程架构进阶到ESP32架构

ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释&#xff0c;并与STM32&#xff08;以STM32CubeIDE为例&#xff09;的常见结构进行对比&#xff0c;帮助你理解两者的差异&#xff1a; 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…...

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…...

【HTML 基础教程】HTML 元素

HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 *元素内容结束标签 *<p>这是一个段落</p><a href"default.htm">这是一个链接</a><br>换行 *开始标签常被称为起始标签&#xff08;opening tag&#xff09;&#xff0c;结束标签常称…...

解锁智能制造新体验:兰亭妙微 UE/UI 设计赋能行业变革

在智能制造时代的滚滚浪潮中&#xff0c;企业的数字化转型不仅是技术的革新&#xff0c;更是用户体验与交互界面的全面升级。然而&#xff0c;许多制造企业在这一转型过程中&#xff0c;面临着一系列 UI/UE 设计难题&#xff0c;严重阻碍了企业的数字化发展进程。兰亭妙微凭借专…...

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…...

如何使用动作捕捉系统训练人形机器人

随着人形机器人变得越来越先进&#xff0c;使用动作捕捉系统教会它们如何像人类一样移动成为了人形机器人领域正在研究的全新方向。本文探讨了如何使用Xsens技术捕捉精确的人类运动数据&#xff0c;使机器人能够通过人工智能和机器学习安全高效地学习、适应和执行复杂任务。 近…...

Vue.js 和 Vue 3 全面详解指南

1. Vue.js 基础介绍 1.1 什么是 Vue.js Vue.js(简称 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。与其他框架不同,Vue 被设计为可以逐步采用。Vue 的核心库只关注视图层,易于上手,便于与其他库或既有项目整合。 Vue 由尤雨溪(Evan You)在 2014 年创建。尤雨…...

OpenRAND可重复的随机数生成库

OpenRAND 是一个 C++ 库,旨在通过提供强大且可复制的随机数生成解决方案来促进可重复的科学研究。它是一个简单的仅头文件库,性能可移植,统计稳健,并且易于集成到任何 HPC 计算项目中。 特征 跨平台支持:OpenRAND 旨在跨各种平台无缝工作,包括 CPU 和 GPU。其仅标题库设计…...

内网渗透技术 Docker逃逸技术(提权)研究 CSMSF

目录 如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境 方法一&#xff1a;检查文件系统 方法二&#xff1a;查看进程 方法三&#xff1a;检查网络配置 方法四&#xff1a;检查环境变量 方法五&#xff1a;检查挂载点 总结 2. 如果是Docker环境&#x…...

生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店

前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的&#xff0c;然而切换到cmd时&#xff0c;突然发现cmd中无法识别anaconda的python环境&#xff0c;竟然打开了应用商店让我安装Python&#xff0c;这当然是不对的。 解决 这是因为…...

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…...

Oracle到达梦数据库迁移:技术要点与实践分享

一、达梦数据库简介 达梦数据库(DM,Dameng Database)是国内自主研发的具有自主知识产权的大型通用数据库管理系统,具备以下显著特点: 1.高性能:高效的存储与计算分离架构:达梦数据库采用先进的存储与计算分离架构,能够根据业务需求灵活分配存储和计算资源,大大提高了…...

word写latex-Mathtype安装成功-方法

MathType安装报错 想在word写latexMathtype, 网上搜教程安装&#xff0c; 结果一直报错一直删重来&#xff0c; 一直报错一直删了重来 一直报错一直删了重来来来&#xff0c; 就这么反反复复一直不好 网上的教程都是教你不是删mathtype, 就是删office 时代变了啊&#x…...

【踩坑日记】springboot 打包后实现类无法找到

试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构...

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…...

Linux (Centos7)安装Mongodb4.0.28

一、官网下载安装包上传到服务器系统 官网&#xff1a;https://www.mongodb.com/try/download/community 放在/opt/software目录下&#xff1a; 二、解压至/usr/local目录下&#xff0c;并重新命名为mongodb [rootlocalhost software]# tar -zxvf mongodb-linux-x86_64-rhel7…...

数据库设计-笔记4

1.操作词汇简介 insert&#xff1a;用于向表中插入新记录。 delete&#xff1a;用于从表中删除记录。 update&#xff1a;用于修改表中已有的记录。 select&#xff1a;用于从表中检索数据。 2.代码基础(增删改&#xff09; -- 修改表中的信息 -- 修改表名 alter table s…...

基于python的图书管理系统设计与实现

摘要 21世纪的今天&#xff0c;随着计算机技术和网络技术的的不断推广发展和应用&#xff0c;图书馆管理方式也应该随之而更新&#xff0c;借由人力进行繁杂重复的图书管理工作已经不再可取&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0…...

10-- 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战(包你看一遍全记住)

&#x1f6e1;️ 网络攻击防御原理全景解析 | 从单包攻防到DDoS军团作战 如果你也对网络工程师的内容感兴趣的话&#xff0c;欢迎看我的最新文章9–BGP路由黑洞&#xff08;超万字大解析&#xff09;&#xff1a;网络世界的“百慕大三角“逃生指南(BGP路由配置实验含路由黑洞,…...

RAG专栏:向量数据库

一、数据库分类 键值数据库&#xff08;Key-Value&#xff09;&#xff1a;通常用于简单的数据存储&#xff0c;通过键来快速访问数据。文档数据库&#xff08;Document&#xff09;&#xff1a;用于存储文档结构的数据&#xff0c;如 JSON 格式。图数据库&#xff08;Graph&a…...

【GPUStack】【dify】【RAGflow】:本地部署GPUStack并集成到dify和RAGflow

目录 Nvidia-Driver CUDA NVIDIA Container Toolkit&#xff08;新版本的docker不用安装&#xff0c;自带&#xff09; Docker 部署GPUStack Text Embeddings 部署模型库模型 测试 部署开源模型&#xff08;modelscope&#xff09; dify 集成 RAGflow集成 Nvidia-Dri…...

第12章:优化并发_《C++性能优化指南》notes

优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案&#xff1a; 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别&#xff1a;std::thread直接管理线程&#xf…...

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…...

HarmonyOs-ArkUI List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…...