大家好,我是张大鹏,今天又来给大家分享技术文章了。
今天要给大家分享的是Go1.20+React18+MySQL8如何实现前后端分离的用户修改密码功能。
首先,当用户登录以后,顶部导航中会显示一个修改密码的按钮,如图:
接着,当用户点击修改密码的时候,跳转到修改密码的页面,如图:
用户修改完毕以后,如果修改失败,要提示修改失败的信息:
如果修改成功,要提示修改成功并跳转到登录页面,让用户用新密码重新登录。
这个功能描述起来比较简单,但是实际上操作起来需要花不少功夫的。因为咱们时前后端分离的项目,不仅需要前端代码,还需要后端代码。接下来,大鹏带大家分别实现。
首先是后端,执行流程如下:
提取请求数据
校验密码是否一致
校验用户名是否存在
校验旧密码是否正确
对新密码进行加密
对加密后的新密码更新到数据库
返回响应结果
后端接口的完整代码如下:
func handleUpdatePassword(c *zdpgo_api.Context) {
// 提取请求数据
var req updatePasswordRequest
err := c.ShouldBindJSON(&req)
if err != nil {
c.ResponseFailureWithError(err)
return
}
// 校验密码是否一致
if req.Password != req.RePassword {
c.ResponseFailureArgs("两次密码不一致")
return
}
// 查询用户名是否存在
_, password, privateKey, err := db.UserIsExists(req.Username)
if err != nil {
log.Printf("根据用户名查询用户失败:%s\n", err.Error())
c.ResponseFailureNotFound("不存在该用户")
return
}
// 校验密码是否正确
if !util.CheckPassword(privateKey, req.OldPassword, password) {
c.ResponseFailureArgs("用户密码不正确")
return
}
// 密码加密
userPassword := util.Password(privateKey, req.Password)
// 保存到数据库
err = db.UserUpdatePassword(req.Username, userPassword)
if err != nil {
c.ResponseFailure("修改用户密码到数据库失败")
return
}
// 返回
c.ResponseSuccessNoData()
}
然后是前端,前端头部的导航代码如下:
{
key: "user",
label: `${userStateValue.username}`,
children: [
{
key: "user-logout",
label: "退出登录"
},
{
key: "user-updatepassword",
label: "修改密码"
},
{
key: "user-info",
label: "个人中心"
},
]
},
点击的时候,跳转到修改密码界面的代码如下:
const onClick: MenuProps['onClick'] = (e) => {
switch (e.key) {
case "user-logout":
console.log("注销登录")
// 设置用户
setUser(currVal => {
console.log("设置用户状态:", currVal)
return {
username: "",
role: "",
auths: [],
menus: []
}
})
// 清空缓存
clearUserInfo()
messageApi.open({
type: 'success',
content: '退出登录成功',
});
// 跳转到登录页面
setTimeout(() => navigate("/login"), 500)
break
case "user-updatepassword":
navigate("/user-updatepassword")
break
default:
console.log("暂不支持此操作")
}
};
修改用户密码界面的完整代码如下:
import {useEffect} from "react";
import {Button, Form, Input, message} from "antd";
import {apiUpdateUserPassword, updatePasswordRequest} from "../api/auth.ts";
import {useNavigate} from "react-router-dom";
import {useRecoilValue} from "recoil";
import {userState} from "../state/user.ts";
import {clearUserInfo} from "../util/storage.ts";
// 用户更新组件
function UserUpdatePassword() {
// 路由器
const navigate = useNavigate()
// 全局的用户状态
const userStateValue = useRecoilValue(userState);
// 消息提示
const [messageApi, contextHolder] = message.useMessage();
// 表单信息
const [form] = Form.useForm();
// 表单布局
const layout = {
labelCol: {span: 8},
wrapperCol: {span: 16},
};
// 按钮布局
const tailLayout = {
wrapperCol: {offset: 8, span: 16},
};
// 提交表单
const onFinish = (data: updatePasswordRequest) => {
console.log("要修改密码的参数:", data)
apiUpdateUserPassword(data).then(() => {
messageApi.open({
type: 'success',
content: '修改密码成功',
});
clearUserInfo()
setTimeout(() => navigate("/login"), 1000)
}).catch(err => {
console.log("更新密码失败", err)
messageApi.open({
type: 'warning',
content: "密码错误,请检查后重试",
});
})
};
// 重置表单
const onReset = () => {
// 修改表单默认信息
form.setFieldsValue({
username: userStateValue.username,
old_password: "",
password: "",
re_password: "",
});
};
// 加载要修改的用户信息
useEffect(() => {
// 设置标题
document.title = "修改密码"
onReset() // 重置表单
}, [])
return (
{...layout}
form={form}
name="control-hooks"
onFinish={onFinish}
style={{maxWidth: 600}}
>
{contextHolder}
placeholder="请输入旧密码"
/>
placeholder="请输入新密码"
/>
placeholder="请确认新密码"
/>
提交
重置
);
}
export default UserUpdatePassword
执行密码修改的核心代码如下:
const onFinish = (data: updatePasswordRequest) => {
console.log("要修改密码的参数:", data)
apiUpdateUserPassword(data).then(() => {
messageApi.open({
type: 'success',
content: '修改密码成功',
});
clearUserInfo()
setTimeout(() => navigate("/login"), 1000)
}).catch(err => {
console.log("更新密码失败", err)
messageApi.open({
type: 'warning',
content: "密码错误,请检查后重试",
});
})
};
以上就行今天要给大家分享的全部内容了。无论是Go还是React,都是目前世界上顶流的技术,在全球范围内使用人数都非常广泛,非常值得学习。
今天的分享就到这里了,谢谢大家~
领取专属 10元无门槛券
私享最新 技术干货