首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go1.20+React18 如何实现修改密码功能?

大家好,我是张大鹏,今天又来给大家分享技术文章了。

今天要给大家分享的是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,都是目前世界上顶流的技术,在全球范围内使用人数都非常广泛,非常值得学习。

今天的分享就到这里了,谢谢大家~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230605A00Z0R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com