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

项目背景 : 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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】解决Python报错:ModuleNotFoundError: No module named ‘xxx.yyy‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

企业如何进行快递运费对账?

在电子面单寄件取代手写纸质面单之后&#xff0c;加上月结寄件模式的推行&#xff0c;企业快递运费对账&#xff0c;成了行政的一个难题...... 早期的手写纸质面单寄件&#xff0c;企业行政或者财务相关人员&#xff0c;遵循寄前审批&#xff0c;寄后报销的原则进行对账。随着电…

WebGoat靶场搭建

WebGoat靶场介绍 WebGoat是一个由OWASP&#xff08;Open Web Application Security Project&#xff09;组织开发的应用平台&#xff0c;专门用于进行Web应用程序安全漏洞的实验。它旨在通过模拟各种安全漏洞&#xff0c;帮助用户了解和学习如何识别和防御这些漏洞。WebGoat基…

Python导出Jira列表

import requests import urllib3 urllib3.disable_warnings() from jira import JIRA import pandas as pd def login_jira(username,password):jira JIRA("https://jira.cn/",basic_auth(username,password))#projectsjira.project(id13)# jqlproject"云链-…

跨境电商如何有效做好店铺账号管理?

跨境电商有效做好店铺账号管理至关重要&#xff0c;类似亚马逊、Temu、TikTok、ebay跨境电商账号涉及多个方面&#xff0c;包括多个账户的安全性、合规性、操作效率等。以下是一些我自己实操的策略和实践&#xff0c;希望能够帮助大家更好地管理跨境电商店铺账号。 一、哪些行为…

CISCN 2022 初赛 ez_usb

还是从第一个 URB向后看 发现 同时 存在 2.8.1 2.10.1 2.4.1 但是显然 2.4.1 是7个字节 不满足 usb流量要求 只考虑 2.8.1 和 2.10.1 tshark -r ez_usb.pcapng -T json -Y "usb.src \"2.8.1\"" -e usbhid.data > 281.json 正常取数据即可 import js…

Ubuntu基础使用

快捷键&#xff1a; 命令行打开快捷方式&#xff1a;Ctrl Alt T Ctrl l 清屏 截屏&#xff1a; LinuxOS命令&#xff1a; 显示当前工作目录所有内容&#xff1a;ls &#xff08;-a -l、-lh&#xff09; -a 输入全部内容&#xff08;包括隐藏文件&#xff09; -l 竖向展示…

opencv-python(一)

1. 图片加载与显示 import cv2 import numpy as npif __name__"__main__":rose cv2.imread(./rose.jpeg)print(rose.shape)print(type(rose))cv2.imshow(rose,rose) # 弹出窗口cv2.waitKey() # 等待键盘输入&#xff0c;任意输入&#xff0c;触发这行代码&#xff…

java mybatis处理大数据量,开启二级缓存和配置,及注意事项,已解决

注意事项&#xff1a; 尽量避免使用下面方式写sql否则会降低服务器性能&#xff1a; mybatis二级缓存开启后&#xff0c;避免使用事务注解&#xff08;加上事务注解后二级缓存数据会导致两次访问不一致问题&#xff09;&#xff1a; 3. 返回的对象实体类&#xff0c;要实现Se…

超融合架构下,虚拟机高可用机制如何构建?

作者&#xff1a;SmartX 产品部 钟锦锌 虚拟机高可用&#xff08;High Availability&#xff0c;简称 HA&#xff09;是虚拟化/超融合平台最常用、关键的功能之一&#xff0c;可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此&#xff0c;为了充分保障…

Ollama+OpenWebUI+Phi3本地大模型入门

文章目录 Ollama+OpenWebUI+Phi3本地大模型入门一、基础环境二、Ollama三、OpenWebUI + Phi3Ollama+OpenWebUI+Phi3本地大模型入门 完全不懂大模型的请绕道,相信我李一舟的课程比较适合 Ollama提供大模型运行环境,OpenWebUI提供UI,Phi3就是那个大模型。 当然,Ollama支持超级…

单片机串口接收负数的处理方法

dp80中有很多外设处理相关的都是有符号数据。 如dpm计算的结果&#xff0c;插入dpm后有时候会得到0xFFFFFFFE-2&#xff08;从调试界面也可以看到&#xff09;。

JS-09-es6常用知识1

目录 1 模板字符串 1.1 模板字符串基本用法 1.2 模板字符串解决了一些痛点 2 解构赋值 2.1 对象的解构赋值 2.2 函数参数的解构赋值 2.3 补写&#xff1a;属性的简写 3 rest参数 3.1 arguments 3.2 rest参数 3.3 补充&#xff1a;判断数据类型 4 箭头函数 4.1 …

AI大模型的生命周期:从开发到退役的全面解析

前言 人工智能大模型&#xff08;AI大模型&#xff09;是当前AI领域的一大热点&#xff0c;它们具有强大的计算能力和广泛的应用前景。本文将全面介绍AI大模型的基础知识、训练过程、使用方法和应用场景。 一、初步了解AI大模型 AI大模型&#xff0c;通常指的是参数量达到亿…

Superset二次开发之Github项目推送到GitLab仓库

以下是从GitHub克隆Superset项目并将其推送到GitLab的详细操作步骤 lab 地址: xxx lab 配置: 生成SSH密钥 ssh-keygen -t rsa -b 4096 -C "邮箱地址" 默认情况下密钥会生成在~/.ssh (/c/Users/Administrator/.ssh/id_rsa)目录下。 公钥添加到GitLab: 打开公钥文件…

通过Excel,生成sql,将A表数据插入B表

文章目录 投机取巧的方式,进行表数据初始化通过navicat搜索A表数据,然后复制进excel中通过excel的函数方式,将该批量数据自动生成插入B表的sql语句然后一次性拷贝生成的sql语句,放进navicat中一次执行,直接完成数据初始化

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 本文最终目的是编写一个按键拍照的例程序&#xff1a; 为以后的专用场景的模型训练做准备&#xff0c;因为训练自己的模型需要大量的图片&a…

算法简单笔记4

5月31号&#xff0c;明天决赛&#xff0c;今天脑子也是一滩浆糊&#xff0c;踏马的一道题也做不出来&#xff0c;超级难受&#xff0c;只好简单复盘一下两道之前的题目&#xff0c;看完就差不多了&#xff0c;再学也没啥用了&#xff0c;写完这两题题解我就回去打把steam绝地求…

TH方程学习(3)

一、编程实现 根据论文给出的案例&#xff0c;使用TH方程进行数值仿真 1.初始化条件 %% 参考文献<New State Transition Matrix for Relative Motion on an Aribitrary Elliptical Orbit> %% 作者 Yamanaka Koji clc;clear global miu Re miu 3.986e5; Re 6378.137;…

使用pkg打包了一个使用了sqlite3的nodejs项目,启动后闪退

从截图来看&#xff0c;问题出在 sqlite3 模块上。说明在打包过程中&#xff0c;sqlite3 模块的 .node 文件没有正确加载。 紧急解决方法&#xff1a; 其实就是exe文件还需要node_modules中的sqlite3 依赖&#xff0c;我们直接在系统顶级放一个node_modules&#xff0c;且其中只…