退出登录后选择记住登录状态回显用户名和密码

news2025/1/21 0:55:51

项目背景 : react + ant

需求 : 退出登录后 , 选择了记住登录 , 回显用户名和密码 ; 未选择记住 , 则不回显用户名和密码

如图






注意 : 发现一个鸡肋的问题 , 未勾选退出后 , 还是会回显 , 后来我查看了cookie和自己的逻辑都没问题 , 原来是因为我保存了密码 , 浏览器保存后自动渲染了...


代码实现  , 逻辑不复杂
 

  // 确认登录
  const onFinish = async userInfo => {
    setLoading(true)
    setSubmitLoginName('正在登录...')
    console.log('userInfo.password', md5(userInfo.password))
    console.log('userInfo', userInfo)

    const data = await login({
      ...userInfo,
      password: md5(userInfo.password)
    })

    console.log('data', data)

    console.log('userInfo.password', md5(userInfo.password))

    if (data.code === 200) {
      localStorage.setItem('userName', data.username)
      localStorage.setItem('userId', data.userId)
      localStorage.setItem('token', data.token)
      setLoading(false)
      setSubmitLoginName('登录')
      setTimeout(() => {
        navigate('/dashboard/analysis')
      }, 300)
    } else {
      form.setFields([{ name: 'password', errors: [data.msg] }])
      setLoading(false)
    }

    localStorage.setItem(
      window.envConfig['ROOT_APP_INFO'],
      JSON.stringify({
        data: data
      })
    )

    return
  }

  useEffect(() => {
    // 仅在组件挂载时运行
    const initializeForm = async () => {
      const loginChecked = getCookies('loginChecked')
      if (loginChecked) {
        try {
          const { checked, password, account } = JSON.parse(
            decrypt(loginChecked)
          )
          setChecked(checked)
          // 自动填充表单
          await form.setFieldsValue({
            account,
            password
          })
          // 如果记住登录状态被勾选,则自动聚焦到登录按钮
          if (checked) {
            const loginButton = document.querySelector('.login-form-button')
            loginButton && loginButton.focus()
          }
        } catch (error) {
          console.error('Error initializing form fields:', error)
          // 处理解密或解析错误
          removeCookies('loginChecked', 7) // 出错时清理无效的cookie
        }
      }
    }

    initializeForm()
  }, []) // 空依赖数组表示仅在组件挂载和卸载时运行

  // 记住密码
  const onChange = async e => {
    const loginChecked = getCookies('loginChecked')
    if (loginChecked) {
      setChecked(false)
      removeCookies('loginChecked', 7)
    } else {
      let values = await form.validateFields()
      values.checked = e.target.checked
      setChecked(e.target.checked)
      setCookies('loginChecked', encrypt(JSON.stringify(values)), 7) //7天有效期
    }
  }

    <Form
                name='normal_login'
                className='login-form'
                form={form}
                initialValues={{ remember: false }}
                onFinish={onFinish}
              >
                {/* 用户名 */}
                <Form.Item
                  colon={false}
                  name='account'
                  validateTrigger={['onChange', 'onBlur']} // 添加这一行来触发onChange和onBlur时的验证
                  rules={[
                    { required: true, message: t('userRules') },
                    { min: 6, message: t('userMinLength') },
                    { max: 12, message: t('userMaxLength') },
                    {
                      // pattern: /^[0-9a-zA-Z@~!#$%^&*`.-_]{1,}$/,
                      message: t('noLaw')
                    }
                  ]}
                >
                  <Input
                    size='large'
                    placeholder={t('username')}
                    style={customInputStyle}
                    prefix={
                      <img
                        src={login_user}
                        alt='icon'
                        style={{
                          width: '18px',
                          height: '16px',
                          position: 'absolute',
                          left: '0'
                        }}
                      />
                    }
                    allowClear
                  />
                </Form.Item>

                {/* 密码 */}
                <Form.Item
                  colon={false}
                  name='password'
                  validateTrigger={['onChange', 'onBlur']} // 添加这一行来触发onChange和onBlur时的验证
                  rules={[
                    {
                      required: true,
                      whitespace: false,
                      message: t('passwordRules')
                    },
                    { min: 6, message: t('pasMinLength') },
                    { max: 12, message: t('pasMaxLength') },
                    {
                      pattern: /^[0-9a-zA-Z@~!#$%^&*`_]{1,}$/,
                      message: t('constitute')
                    }
                  ]}
                >
                  <Input.Password
                    style={customInputStyle}
                    prefix={
                      <img
                        src={login_suo}
                        alt='icon'
                        style={{
                          width: '18px',
                          height: '16px',
                          position: 'absolute',
                          left: '0'
                        }}
                      />
                    }
                    type='password'
                    placeholder={t('password')}
                    size='large'
                  />
                </Form.Item>

                <Checkbox onChange={onChange} checked={checked}>
                  {t('remember')}
                </Checkbox>

                <Form.Item colon={false}>
                  <Button
                    type='primary'
                    htmlType='submit'
                    className='login-form-button'
                    loading={loading}
                    disabled={loading}
                  >
                    {t('login')}
                  </Button>
                </Form.Item>
              </Form>

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

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

相关文章

C# 代码配置的艺术

文章目录 1、代码配置的定义及其在软件工程中的作用2、C# 代码配置的基本概念和工具3、代码配置的实践步骤4、实现代码配置使用属性&#xff08;Properties&#xff09;使用配置文件&#xff08;Config Files&#xff09;使用依赖注入&#xff08;Dependency Injection&#xf…

Echarts 让柱状图在图表中展示,离开X轴

文章目录 需求分析需求 分析 话不多说,直接源码展示 option = {title: {text: Waterfall Chart,subtext: Li

数据隐私重塑:Web3时代的隐私保护创新

随着数字化时代的不断深入&#xff0c;数据隐私保护已经成为了人们越来越关注的焦点之一。而在这个数字化时代的新篇章中&#xff0c;Web3技术作为下一代互联网的代表&#xff0c;正在为数据隐私保护带来全新的创新和可能性。本文将深入探讨数据隐私的重要性&#xff0c;Web3时…

数字孪生技术为何备受各行业青睐?

数字孪生技术近年来在各行业中受到越来越多的重视&#xff0c;这是因为它具备了显著的优势和广泛的应用前景。数字孪生是指利用数字化技术&#xff0c;在虚拟空间中创建一个与现实世界对应的虚拟模型&#xff0c;通过数据的实时交互和反馈&#xff0c;实现对物理实体的模拟和监…

嵌入式Linux复制剪切删除指令详解

指令操作 1. cp 复制指令 a. 用法&#xff1a;cp [ 选项 ] [ 源文件或目录 ] [ 目标文件或目录 ]&#xff1b; b. 用途&#xff1a;用于复制文件或目录&#xff1b; c. 通常情况下&#xff0c;复制的都不是空文件夹&#xff0c;所以直接使用 cp 复制空文件会失败&#xff0…

三体中的冯诺依曼

你叫冯诺依曼&#xff0c;是一位科学家。你无法形容眼前的现态&#xff0c;你不知道下一次自己葬身火海会是多久&#xff0c;你也不知道会不会下一秒就会被冰封&#xff0c;你唯一知道的&#xff0c;就是自己那寥寥无几的科学知识&#xff0c;你可能会抱着他们终身&#xff0c;…

全国产飞腾模块麒麟信安操作系统安全漏洞

1、背景介绍 目前在全国产飞腾模块上部署了麒麟信安操作系统&#xff0c;经第三方机构检测存在以下漏洞 操作系统版本为 内核版本为 openssh版本为 2、openssh CBC模式漏洞解决 首先查看ssh加密信息 nmap --script "ssh2*" 127.0.0.1 | grep -i cbc 可以通过修改/…

结构设计模式 - 代理设计模式 - JAVA

代理设计模式 一. 介绍二. 代码示例2.1 定义 CommandExecutor 类2.2 定义 CommandExecutorProxy代理类2.3 模拟客户端2.4 测试结果 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子…

数据结构(三)循环链表 约瑟夫环

文章目录 一、循环链表&#xff08;一&#xff09;概念&#xff08;二&#xff09;示意图&#xff08;三&#xff09;操作1. 创建循环链表&#xff08;1&#xff09;函数声明&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 2. 插入&#xff08;头插&#x…

【数据分享】中国劳动统计年鉴(1991-2023)

大家好&#xff01;今天我要向大家介绍一份重要的中国劳动统计数据资源——《中国劳动统计年鉴》。这份年鉴涵盖了从1991年到2023年中国劳动统计全面数据&#xff0c;并提供限时免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 1991年以来&#xff0c;中…

玄机平台应急响应—Linux日志分析

1、前言 啥是日志呢&#xff0c;日志就是字面意思&#xff0c;用来记录你干了啥事情。日志大体可以分为网站日志和系统日志&#xff0c;网站日志呢就是记录哪个用户在哪里什么时候干了啥事&#xff0c;以及其它的与网站相关的事情。系统日志呢&#xff0c;就是记录你的电脑系统…

飞腾+FPGA多U多串全国产工控主机

飞腾多U多串工控主机基于国产化飞腾高性能8核D2000处理器平台的国产自主可控解决方案&#xff0c;搭载国产化固件,支持UOS、银河麒麟等国产操作系统&#xff0c;满足金融系统安全运算需求&#xff0c;实现从硬件、操作系统到应用的完全国产、自主、可控&#xff0c;是国产金融信…

【计算机毕设】基于SpringBoot的房产销售系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 随着房地产市场的发展和互联网技术的进步&#xff0c;传统的房产销售模式逐渐向线上转移。设计并实现一个基于Spring Boot的房产销售系统&#xff0…

用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯

接线图&#xff1a; 2 :实验目的&#xff1a; 利用pwm实现呼吸灯。 关键PWM定时器设置&#xff1a; 代码部分&#xff1a; int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

神经网络---卷积神经网络CNN

一、从前馈神经网络到CNN 前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;是最基础的神经网络模型&#xff0c;也被称为多层感知机&#xff08;MLP&#xff09;。 它由多个神经元组成&#xff0c;每个神经元与前一层的所有神经元相连&#xff0c;形成一个“…

【C语言】基于C语言实现的贪吃蛇游戏

【C语言】基于C语言实现的贪吃蛇游戏 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…

【kubernetes】探索k8s集群的存储卷、pvc和pv

目录 一、emptyDir存储卷 1.1 特点 1.2 用途 1.3部署 二、hostPath存储卷 2.1部署 2.1.1在 node01 节点上创建挂载目录 2.1.2在 node02 节点上创建挂载目录 2.1.3创建 Pod 资源 2.1.4访问测试 2.2 特点 2.3 用途 三、nfs共享存储卷 3.1特点 3.2用途 3.3部署 …

放开了去的 ulimit

放开了去的 ulimit 放开了去的 ulimitulimit简介临时修改打开文件数目永久修改系统总打开句柄限制更多信息 放开了去的 ulimit ulimit简介 对于高并发或者频繁读写文件的应用程序而言&#xff0c;有时可能需要修改系统能够打开的最多文件句柄数&#xff0c;否则就可能会出现t…

【网络原理】HTTP|认识请求“报头“|Host|Content-Length|Content-Type|UA|Referer|Cookie

目录 认识请求"报头"(header) Host Content-Length Content-Type User-Agent(简称UA) Referer &#x1f4a1;Cookie&#xff08;最重要的一个header&#xff0c;开发&面试高频问题&#xff09; 1.Cookie是啥&#xff1f; 2.Cookie怎么存的&#xff1f; …

系统架构设计师【第8章】: 系统质量属性与架构评估 (核心总结)

文章目录 8.1 软件系统质量属性8.1.1 质量属性概念8.1.2 面向架构评估的质量属性8.1.3 质量属性场景描述 8.2 系统架构评估8.2.1 系统架构评估中的重要概念8.2.2 系统架构评估方法 8.3 ATAM方法架构评估实践8.3.1 阶段1—演示&#xff08;Presentation&#xff09;8.3…