用户中心(终)

文章目录

    • Ant Design Pro(Umi 框架)
    • ProComponents 高级表单
    • 待优化点 todo
    • 注册逻辑
      • 增加注册页面
      • 页面重定向问题
      • 注册页面
    • **获取用户的登录态**
    • **前端用户管理功能**

Ant Design Pro(Umi 框架)

app.tsx 项目全局入口文件,定义了整个项目中使用的公共数据(比如用户信息)
access.ts 控制用户的访问权限
首次访问页面(刷新页面),进入 app.tsx,执行 getInitialState 方法,该方法的返回值就是全局可用的状态值。

ProComponents 高级表单

  1. 通过 columns 定义表格有哪些列
  2. columns 属性
    1. dataIndex 对应返回数据对象的属性
    2. title 表格列名
    3. copyable 是否允许复制
    4. ellipsis 是否允许缩略
    5. valueType:用于声明这一列的类型(dateTime、select)

待优化点 todo

  • 前端密码重复提示(可能有别的优化方式)
  • 注册没有友好的提示
  • 用户注销
  • 优化查询接口(支持更多查询)

MFSU:前端编译优化

Ant Design 组件库 => React
Ant Design Procomponents => Ant Design
Ant Design Pro 后台管理系统 => Ant Design、React、Ant Design Procomponents、其他的库

注册逻辑

  1. 用户在前端输入账户和密码、以及校验码
  2. 校验用户的账户、密码、校验密码是否符合要求
  3. 非空
  4. 账户不小于 4 位
  5. 密码不小于 8 位
  6. 账户不能重复
  7. 账户不包含特殊字符
  8. 校验密码和密码相同
  9. 对密码进行加密(密码不能直接明文存储到数据库中)
  10. 向数据库插入用户数据

增加注册页面

直接复制登录页面,重命名为Register(复制整个Login文件夹,粘贴到user文件夹下,重命名)image.png
进行名称代码块的修改, 删掉没用的代码。
config/routes.ts 下新建路由,也就是用户要在 URL 里输入什么才能定义到 Register
image.png

页面重定向问题

现在访问/user/register 仍然会跳转登录页面 , 为什么会触发这种自动重定向到登录页的逻辑?

主要就是因为app.tsx 它是咱们这个前端项目的全局文件,里面定义了刚进入一个页面时要执行的逻辑,比如说我们刚进入页面要获取用户信息,如果没获取到用户信息,就重定向到登录页让你登录,那同时,因为使用的这个框架,更偏向于后台管理系统,所以说每个页面都会去校验。如果说用户没登录,没有登录状态,那我们就把它重定向到登录页

在该app.tsx 文件中修改
在这里插入图片描述

注释掉(history.push(loginPath) 表示将浏览器的历史记录重定向到登录页面。)
image.png

注册页面

先写页面再写逻辑
image.png
有关登录的改为注册
注册的逻辑是 账号-密码-确认密码,因此再加个密码框
在这里插入图片描述

修改登录提交按钮为注册
我们去在编译器里找一下 LoginForm 通过 Select Opened File 找到这个文件在哪里,知道是在 ProComponents 里的
image.png
处理提交的逻辑
因为注册的参数和登录的参数不一样,因此我们要进入改一下
在这里插入图片描述

这个 LoginResult 改为 RegisterResult

image.png
进行测试
在这里插入图片描述

image.png
因为这个注册过了,所以会注册失败,这是我们的逻辑,但是在前端没有很好地提示用户,只是显示了“注册失败”。换个账号没注册过的就可以注册成功了,不过我们这里没有正确跳转到登录页
image.png
修改这部分内容
此时我们没有办法去到注册页面(对于用户来说),因为我们在登录页面加个跳转到注册页面的方法
在 Login/index.tsx 文件
image.png
登录页面这样修改即可

获取用户的登录态

我们要先获取到用户的登录态,获取当前登录用户接口,因为已经存到 session 中,因此直接从中取出即可
后端 UserController

    @GetMapping("/current")
    public User getCurrentUser(HttpServletRequest request) {
        Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE);
        User currentUser = (User) userObj;
        if(currentUser == null) {
            return null;
        }
        long id = currentUser.getId();
        // todo 校验用户是否合法
        User user = userService.getById(id);
        return userService.getSafetyUser(user);
    }

UserServiceImpl

这里加个判空,以防传入用户为空时,报错

/**
     * 用户脱敏
     * @param originUser 起始用户
     * @return 安全用户
     */
    @Override
    public User getSafetyUser(User originUser) {
        // 判空
        if (originUser == null) {
            return  null;
        }
        User safetyUser = new User();
        safetyUser.setId(originUser.getId());
        safetyUser.setUsername(originUser.getUsername());
        safetyUser.setUserAccount(originUser.getUserAccount());
        safetyUser.setAvatarUrl(originUser.getAvatarUrl());
        safetyUser.setGender(originUser.getGender());
        safetyUser.setEmail(originUser.getEmail());
        safetyUser.setUserRole(originUser.getUserRole());
        safetyUser.setUserStatus(originUser.getUserStatus());
        safetyUser.setPhone(originUser.getPhone());
        safetyUser.setCreateTime(originUser.getCreateTime());
        return safetyUser;
    }

相应的前端方面,在接口文件api.ts 做修改

/** 获取当前的用户 GET /api/user/current */
export async function currentUser(options?: { [key: string]: any }) {
  return request<API.CurrentUser>('/api/user/current', {
    method: 'GET',
    ...(options || {}),
  });
}

同时在类型定义文件里修改
image.png
在app.tsx文件这样修改
image.png
这里白名单多次使用定义全局变量

const NO_NEED_LOGIN_WHITELIST = ['/user/register', loginPath];

水印(将参数修改为username)

waterMarkProps: {
      content: initialState?.currentUser?.username,
    },

对应头像和用户名(可以全局搜索进行替换)
image.png
如果前端此时左侧菜单栏是空白,配置路由时把 name 字段带上就有了详情官方文档
image.png
成功是这样的
image.png

前端用户管理功能

我们希望是只有管理员才能管理用户
我们先在 pages 下创建个新的包 Admin,然后我们复制个之前写过的 Register 到这个包下,重命名为 UserManage,先弄个页面出来
image.png
去route.ts添加一个路由
image.png
修改访问权限(上图的access)access来自access.ts文件
image.png
修改Admin.tsx文件这样可以访问到子路由
image.png
去官方文档直接用现有的表格ProComponents
image.png
将代码复制到UserManage 下的index.tsx文件下(并进行瘦身和修改)
字段的修改以及列的配置
image.png
为了得到后端数据这样修改不创建searchUsers 接口
image.png

/** 搜索用户 GET /api/user/search */
export async function searchUsers(options?: { [key: string]: any }) {
  return request<API.CurrentUser>('/api/user/search', {
    method: 'GET',
    ...(options || {}),
  });
}

修改头像的渲染逻辑

{
    title: '头像',
    dataIndex: 'avatarUrl',
    render: (_, record) => (
      <div>
        <Image src={record.avatarUrl} width={100} />
      </div>
    ),
  },

修改角色,状态,性别的显示

{
    title: '性别',
    dataIndex: 'gender',
    valueEnum: {
      0:{ text: '男' },
      1:{ text: '女' },
    }
},
{
    title: '状态',
    dataIndex: 'userStatus',
    valueEnum: {
      0:{ text: '正常' },
      1:{ text: '停用' },
    }
},
{
    title: '角色',
    dataIndex: 'userRole',
    valueType: 'select',
    valueEnum: {
      0:{ text: '普通用户', status: "default" },
      1:{ text: '管理员', status: 'Success',},
    }
},

现在页面就显示出来了
image.png

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

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

相关文章

【车载开发系列】MCAL基本概念

【车载开发系列】MCAL基本概念 【车载开发系列】MCAL基本概念 【车载开发系列】MCAL基本概念一. BSW与MCAL1&#xff09;BSW-服务层2&#xff09;BSW-ECU抽象层3&#xff09;MCAL驱动层 二. MCAL基本概念三. MCAL组成1&#xff09;PORT2&#xff09;DIO3&#xff09;ADC4&#…

排序算法——直接插入排序

直接插入排序与希尔排序是插入排序的两个分支&#xff0c;直接插入排序是较为简单的一种排序算法&#xff0c;同时也是众多算法实现或优化的基石。 前提&#xff1a; 插入排序&#xff1a;有一个已经有序的数据序列&#xff0c;要求在这个已经排好的数据序列中插入一个数&…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时&#xff0c;少量的QPS就可能导致带宽使用率被占满&#xff0c;导致Redis实例&#xff0c;乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例&#xff0c;无法使数据分片的内存资源达到均衡 Redis阻…

nginx--自定义日志跳转长连接文件缓存状态页

自定义日志服务 [rootlocalhost ~]# cat /apps/nginx/conf/conf.d/pc.conf server {listen 80;server_name www.fxq.com;error_log /data/nginx/logs/fxq-error.log info;access_log /data/nginx/logs/fxq-access.log main;location / {root /data/nginx/html/pc;index index…

C/C++ BM33 二叉树的镜像

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 镜像说的好听&#xff0c;无非就是换下节点。 题目 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0 ≤ n ≤ 1000 0≤n≤1000 0≤n≤1000&#xff0c; 二叉树每…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

打印机-STM32版本 硬件部分

最终PCB EDA工程: 一、确定芯片型号 根据项目需求&#xff0c;梳理需要用到的功能&#xff0c; 电量检测&#xff1a;ADC 按键&#xff1a;IO input外部中断 LED&#xff1a;IO output 温度检测&#xff1a;ADC 电机控制&#xff1a;IO output 打印通讯&#xff1a;SPI …

淘宝/天猫商品评论API接口:用户反馈实时追踪与商家决策优化

一、引言 在电子商务迅猛发展的今天&#xff0c;淘宝/天猫作为中国最大的电子商务平台之一&#xff0c;为众多商家提供了广阔的舞台。然而&#xff0c;面对日益激烈的市场竞争&#xff0c;如何精准把握用户需求、优化产品策略、提升服务质量&#xff0c;成为摆在众多商家面前的…

Linux环境与历史和Xshell安装与使用

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Linux是一个操作系统.全称叫Linux is not UNIX。由…

【C++】哈希的应用---位图

目录 1、引入 2、位图的概念 3、位图的实现 ①框架的搭建 ②设置存在 ③设置不存在 ④检查存在 ​4、位图计算出现的次数 5、完整代码 1、引入 我们可以看一道面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数…

通过iMock学习Jvmsandbox

Jvm-sandbox Jvm-sandbox基于Jvm-sandbox的Mock平台iMockiMock的工程学习iMock怎么写的&#xff08;sandbox的module应该怎么写&#xff09; Jvm-sandbox Jvm-sandbox是阿里开源的一款java的沙箱&#xff0c;看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。 基于Jvm-san…

智慧旅游开启智慧生活,科技让旅行更轻松:通过智慧旅游,旅行者可以享受到更加便捷、高效的旅行服务,让旅行成为生活的一部分

一、引言 随着科技的飞速发展&#xff0c;我们生活的方方面面都在经历着前所未有的变革。旅游业作为服务业的重要组成部分&#xff0c;也在这场变革中迎来了前所未有的发展机遇。智慧旅游&#xff0c;作为科技与旅游深度融合的产物&#xff0c;正以其独特的魅力&#xff0c;引…

瑞_23种设计模式_解释器模式

文章目录 1 解释器模式&#xff08;Interpreter Pattern&#xff09;1.1 介绍1.2 概述1.2.1 文法&#xff08;语法&#xff09;规则1.2.2 抽象语法树 1.3 解释器模式的结构1.4 解释器模式的优缺点1.5 解释器模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代…

信息时代的智慧导航:高效搜索、信息筛选与信任构建的全面指南!

文章目录 一、高效搜索&#xff1a;快速定位目标信息的秘诀二、信息筛选&#xff1a;去伪存真&#xff0c;找到有价值的信息三、信任构建&#xff1a;深入了解与直接沟通《搜索之道&#xff1a;信息素养与终身学习的新引擎》亮点内容简介目录获取方式 随着科技的飞速发展&#…

小白总结uniapp微信小程序跨域问题的解决(前端)

前言&#xff1a;本人前端小白一枚&#xff0c;在B站听了一个很不错的视频&#xff0c;关于uniapp Vue3超详细教程&#xff0c;有需要的小伙伴可以去听&#xff0c;受益匪浅&#xff0c;下面是该博主的链接&#xff1a; gitee源码地址&#xff1a;https://gitee.com/qingnian8/…

windows 驱动开发-DMA技术(三)

在早期&#xff0c;是按照基于包或者基于流的方式来描述DMA的&#xff0c;不过这个描述可能不准确&#xff0c;故在Vista之后修改为使用数据包/使用公共缓冲区的系统DMA。 简单的解释一下基于包和基于流的说法的原因&#xff0c;数据包是指一个个基于一定大小的数据块&#xf…

Tensorflow2.0笔记 - ResNet实践

本笔记记录使用ResNet18网络结构&#xff0c;进行CIFAR100数据集的训练和验证。由于参数较多&#xff0c;训练时间会比较长&#xff0c;因此只跑了10个epoch&#xff0c;准确率还没有提升上去。 import os import time import tensorflow as tf from tensorflow import keras …

数据库和缓存一致性问题

hello&#xff0c;各位小伙伴们大家好&#xff0c;我是颜书凌&#xff0c;下面给大家讲解一下数据库和缓存的一致性问题&#xff0c;话不多说 1、一致性介绍 一致性就是数据保持一致&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性…

2024年【G3锅炉水处理】试题及解析及G3锅炉水处理模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理试题及解析为正在备考G3锅炉水处理操作证的学员准备的理论考试专题&#xff0c;每个月更新的G3锅炉水处理模拟考试题祝您顺利通过G3锅炉水处理考试。 1、【多选题】在可逆反应中&#xff0c;下面哪…

Node.js -- express 框架

文章目录 1. express 使用2. 路由2.1 路由的使用2.2 获取请求报文参数2.3 获取路由参数2.4 路由参数练习 3. express 响应设置4. 中间件4.1 全局中间件4.2 路由中间件4.3 静态资源中间件 5. 获取请求体数据 body-parser6. 防盗链7. 路由模块化8. 模板引擎8.1 了解EJS8.2 列表渲…