2026.5.12@霖宇博客制作中遇见的问题

1

one

<el-form :model="passwordForm" :rules="rules" ref="formRef" label-width="100px"> <el-form-item label="原密码" prop="oldPassword"> <el-input v-model="passwordForm.oldPassword" type="password" placeholder="请输入原密码" show-password /> </el-form-item>解读这段代码

这段代码是使用 Vue.js 和 Element Plus UI 库构建的一个表单片段,专门用于收集用户的"原密码"。

下面为你逐层解读:

🧩 整体结构:<el-form> 组件

<el-form> 是 Element Plus 提供的表单容器组件,它负责整合和管理内部所有表单项的数据和校验规则。

  • :model="passwordForm"

  • 这是一个数据绑定。它将表单与一个名为 passwordForm 的响应式数据对象关联起来。表单内所有输入框的值都会同步到这个对象中。

  • :rules="rules"

  • 这是校验规则的绑定。它将一个名为 rules 的对象作为整个表单的校验规则集。这个 rules 对象里定义了每个字段(如 oldPassword)需要遵守的规则,比如是否必填、长度限制等。

  • ref="formRef"

  • 这是一个引用标识。它为这个 <el-form> 组件实例起了一个名字叫 formRef。在 JavaScript 代码中,你可以通过 formRef 来获取这个表单实例,并调用其方法,例如 formRef.value.validate() 来手动触发表单的整体校验。

  • label-width="100px"

  • 这是一个样式设置。它统一设置了表单内所有标签(label)的宽度为 100 像素,使表单看起来更整齐对齐。

✍️ 表单项:<el-form-item> 组件

<el-form-item> 是表单中的单个项目容器,用于包裹一个标签和一个输入控件。

  • label="原密码"

  • 这定义了该表单项的标签文本,即用户看到的"原密码"这几个字。

  • prop="oldPassword"

  • 这是实现校验的关键。它指定了当前这个表单项对应 passwordForm 数据模型中的哪个属性。Element Plus 会根据这个 prop 的值,去 :rules 对象中找到对应的校验规则,并对 passwordForm.oldPassword 的值进行验证。

⌨️ 输入控件:<el-input> 组件

<el-input> 是 Element Plus 提供的输入框组件。

  • v-model="passwordForm.oldPassword"

  • 这是双向数据绑定。它将输入框的值与 passwordForm 对象里的 oldPassword 属性实时同步。用户在输入框中输入内容时,passwordForm.oldPassword 的值会随之改变;反之亦然。

  • type="password"

  • 这指定了输入框的类型为密码框。用户输入的字符会被隐藏,通常显示为圆点或星号。

  • placeholder="请输入原密码"

  • 这是在输入框为空时显示的灰色提示文字。

  • show-password

  • 这是 Element Plus 提供的一个便捷功能。它会在输入框右侧添加一个"小眼睛"图标,用户可以点击该图标来切换显示或隐藏输入的密码明文。

总结来说

这段代码创建了一个带有"原密码"标签的密码输入框。它在视觉上提供了"显示/隐藏密码"的功能,在逻辑上将用户的输入值实时保存到 passwordForm.oldPassword 变量中,并且准备就绪,可以根据预设的规则对这个输入值进行校验。

two

// 密码的校验规则 password: [ // 规则1:必填校验 { required: true, message: '请输入密码', trigger: 'blur' }, // 规则2:限制密码长度在 6 到 20 个字符之间 { min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur' } ],密码中不能包含空格怎么写

要实现密码中不能包含空格,最优雅和直接的方法是使用正则表达式进行校验。

你可以在现有的 password 校验规则数组中添加一个新的规则对象。

🚀 解决方案:使用正则表达式

你可以添加一个 pattern 规则,利用正则表达式 /^\S+$/ 来确保输入的字符串不包含任何空白字符(包括空格、制表符等)。

修改后的代码如下:javascript

编辑

1// 密码的校验规则

2password: [

3 // 规则1:必填校验

4 { required: true, message: '请输入密码', trigger: 'blur' },

5 // 规则2:限制密码长度在 6 到 20 个字符之间

6 { min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur' },

7 // 规则3:禁止输入任何空格

8 { pattern: /^\S+$/, message: '密码中不能包含空格', trigger: 'blur' }

9],

代码解读

  • pattern: /^\S+$/

  • ^ 和 $:分别代表字符串的开始和结束,确保对整个字符串进行匹配。

  • \S:这是一个特殊字符,代表"非空白字符"。它与 \s (代表空格、制表符等) 相反。

  • +:表示前面的元素(即 \S)可以出现一次或多次。

  • 综合起来,/^\S+$/ 的意思是:整个字符串必须完全由一个或多个非空白字符组成。只要出现一个空格,校验就会失败。

✨ 进阶方案:自定义校验函数

如果你的密码规则变得更复杂,比如要求同时包含字母、数字和特殊符号,并且不能有空格,那么使用自定义校验函数 (validator) 会更灵活。javascript

编辑

1// 密码的校验规则

2password: [

3 { required: true, message: '请输入密码', trigger: 'blur' },

4 { min: 6, max: 20, message: '密码长度在 6 到 20 个字符', trigger: 'blur' },

5 // 使用自定义函数进行更复杂的校验

6 {

7 validator: (rule, value, callback) => {

8 if (!value) {

9 // 这个错误会被上面的 required: true 规则捕获,这里可以省略

10 return callback();

11 }

12 // 检查是否包含空格

13 if (/\s/.test(value)) {

14 callback(new Error('密码中不能包含空格'));

15 } else {

16 callback(); // 校验通过

17 }

18 },

19 trigger: 'blur'

20 }

21],

对于你目前的需求,第一种使用 pattern 的方案更加简洁高效。

3

three

username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ],用户名只能输入大小写字母和数字,不能有特殊字符

要实现用户名只能包含大小写字母和数字,你可以利用 Element Plus 表单校验规则中的 pattern 属性,通过一个正则表达式来限制输入内容。

你只需要在现有的 username 规则数组中添加一个新的规则对象即可。

🚀 解决方案:使用正则表达式

添加的规则如下:javascript

编辑

1{ pattern: /^[a-zA-Z0-9]+$/, message: '用户名只能包含字母和数字', trigger: 'blur' }

代码解读

  • pattern: /^[a-zA-Z0-9]+$/

  • ^ 和 $:分别代表字符串的开始和结束,确保对整个字符串进行匹配,而不是部分匹配。

  • a-zA-Z0-9\]:这是一个字符集,表示只允许匹配小写字母 (a-z)、大写字母 (A-Z) 和数字 (0-9)。

  • 综合起来,这个正则表达式的意思是:整个字符串必须完全由一个或多个字母或数字组成。

完整代码示例

将新规则加入后,你的 username 校验规则应该像这样:javascript

编辑

1username: [

2 { required: true, message: '请输入用户名', trigger: 'blur' },

3 { pattern: /^[a-zA-Z0-9]+$/, message: '用户名只能包含字母和数字', trigger: 'blur' }

4],

four

该错误的核心原因是:MySQL 在执行 SQL 更新时,接收到一个本应是整数值的参数(id),但实际传入的却是一个 Java 对象的序列化字节流(以 \xAC\xED\x00\x05 开头,这是 Java 对象序列化特有的魔数)。

从堆栈中的 SQL 语句:

sql

UPDATE admin SET password=? WHERE (id = ?)

可以看到,更新时两个占位符分别对应 password(字符串)和 id(整数)。而错误信息明确指出 "Truncated incorrect INTEGER value",说明在设置 id 参数时,数据库收到的数据不是整数,而是类似 com.blog.personalBlogAdmin.admin.entity.po.Admin 对象的序列化内容。

常见的原因有以下几种:

Mapper 方法参数传递错误

在 AdminMapper 中可能自定义了一个 update 方法,但调用时错误地将整个 Admin 实体对象传给了 id 参数的位置。

例如:adminMapper.update(password, admin) 或 adminMapper.update(admin) 而 SQL 映射中却写了 where id = #{xxx},导致 MyBatis 把 admin 对象尝试转换成 INTEGER。

误用 MyBatis-Plus 的 update 方法

调用 update(T entity, Wrapper<T> wrapper) 时,如果不小心将 entity 传给了 wrapper 参数,或者 Wrapper 中错误地使用了对象而非条件字段,可能导致条件值变成整个对象序列化后的形式。

或者直接写了 adminMapper.update(admin, null),并且 admin 对象的某个字段(如 id)被错误地映射到了 SQL 中的 id 占位符。

使用了不正确的 @Param 注解或 XML 参数引用

若在 Mapper 接口中定义了类似 int update(@Param("password") String password, @Param("admin") Admin admin);,但在 XML 中却写了 where id = #{admin},就会把整个 Admin 对象作为参数填充到 id 位置上。

序列化问题(较少见)

如果某个拦截器或处理器错误地将对象直接写入 JDBC 参数(而不经过类型转换),也可能导致此现象。但从堆栈看,更可能是代码层面的参数错位。

排查建议:

检查 AdminBaseFacade.resetOneselfPassword 方法第 266 行附近的调用,确认传递给 adminMapper.update(...) 的参数是否正确。

如果使用的是 MyBatis-Plus 的 updateById(admin),请确保 admin.getId() 返回的是 Integer 或 Long 类型且不为空;同时确认 admin 对象没有被序列化成奇怪的格式传递到 SQL 中(一般 updateById 不会出现此问题,除非自定义了其他拦截器)。

检查 AdminMapper 中是否存在自定义的 update 方法(XML 或注解),核实参数名称与顺序是否匹配。

简单来说,就是本应放 id 值的地方,放了一个 Java 对象,导致数据库无法把序列化字节流转换成整数。

five

相关推荐
醉逍遥neo1 小时前
mac新电脑-前端开发配置
前端·macos·ghostty
白嫖叫上我2 小时前
Vue3封装主题色完善版
前端
a1117762 小时前
细胞结构实验室(react 开源)
前端·javascript·开源·html
aaaak_2 小时前
PDD 直播间 评论 , wss hex Protobuf 解析流程分析学习
java·前端·学习
ikoala2 小时前
用了几周明基 RD280UG,我终于明白程序员为什么需要一台“专用显示器”
前端·后端·程序员
文心快码BaiduComate2 小时前
Comate搭载DeepSeek-V4
前端·后端
豹哥学前端2 小时前
5分钟搞懂事件委托
前端·javascript·面试
Awu12272 小时前
🍎把数学公式搬进 Web 表格:一个 VTable 实战案例
前端
江无行者2 小时前
aly oss技能应用
前端