用户中心(终)

news2024/11/26 2:41:22

文章目录

    • 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

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

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

相关文章

Redis Zset的底层原理

Redis Zset的底层原理 ZSet也就是SortedSet&#xff0c;其中每一个元素都需要指定一个score值和member值&#xff1a; 可以根据score值排序后member必须唯一可以根据member查询分数 因此&#xff0c;zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学…

Node.js -- MongoDB

文章目录 1. 相关介绍2. 核心概念3. 命令行交互3.1数据库命令3.2 集合命令3.3 文档命令 4. 数据库应用场景4.1 新增4.2 删除4.3 更新4.4 查询 5. 图形化工具Robo 3T 1. 相关介绍 一、简介 Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库&#xff0c;官方地址https://…

jupyter notebook使用与本地位置设置

本地安装好Anaconda之后&#xff0c;自带的有Jupter notebook。 使用jupyter notebook 使用jupyter notebook时&#xff0c;可以直接打开或者搜索打开&#xff1a; 打开后&#xff0c;我们生成的或者编辑的一些文件&#xff0c;都可以看到&#xff0c;如下&#xff1a; j…

基于Spring Boot的心灵治愈交流平台设计与实现

基于Spring Boot的心灵治愈交流平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器&#xff0c;用来存放Java对象。 集合在存放对象的时候&#xff0c;不同的容器&#xff0c;存放的方法实现是不一样的&#xff0c; Java中将这些不同实现的容器&#xff0c;往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…

挑战一周完成Vue3项目Day4: 用户管理+角色管理+菜单管理+首页+暗黑模式/主题切换

一、用户管理 1.静态搭建 src/views/acl/user/index.vue <template><el-card style"height:80px;"><el-form :inline"true" class"form"><el-form-item label"用户名&#xff1a;"><el-input placehold…

Golang | Leetcode Golang题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; func minPathSum(grid [][]int) int {if len(grid) 0 || len(grid[0]) 0 {return 0}rows, columns : len(grid), len(grid[0])dp : make([][]int, rows)for i : 0; i < len(dp); i {dp[i] make([]int, columns)}dp[0][0] grid[0][0]…

vscode 插件 code settings sync(配置云端同步)

vscode 插件 code settings sync&#xff08;配置云端同步&#xff09; 电脑A和B&#xff0c;vscode配置都在A电脑上&#xff0c;此时你想要将A电脑的vscode配置同步到B电脑的vscode中 第一步&#xff1a;A电脑和B电脑都需要在VSCode中安装下图插件 code settings sync 第二步&…

免费开源语音克隆-GPT-SoVITS-WebUI只需 5 秒的声音样本

语音克隆-GPT-SoVITS-WebUI 强大的少样本语音转换与语音合成Web用户界面。 功能&#xff1a; 零样本文本到语音&#xff08;TTS&#xff09;&#xff1a; 输入 5 秒的声音样本&#xff0c;即刻体验文本到语音转换。 少样本 TTS&#xff1a; 仅需 1 分钟的训练数据即可微调模型…

[随记]Mac安装Docker及运行开源Penpot

下载Docker Desktop for Mac&#xff1a;https://www.docker.com/products/docker-desktop/ 安装Docker Desktop for Mac&#xff0c;安装完成后&#xff0c;启动Docker&#xff0c;然后在终端输入&#xff1a; docker version 在Mac电脑的Desktop&#xff0c;随便创建一个文…

国产服务器操作系统部署NTP服务 _ 统信UOS _ 麒麟 _ 中科方德

原文链接&#xff1a;国产服务器操作系统部署NTP服务 | 统信UOS | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;在保持服务器时间的精确同步方面&#xff0c;时间同步服务器&#xff08;NTP服务器&#xff09;扮演着至关重要的角色&#xff0c;它能确保系统操作的时…

JAVA面试专题-微服务篇

Spring cloud Spring Cloud 5大组件有哪些 注册中心/配置中心&#xff1a;nacos 负载均衡&#xff1a;Ribbon 服务远程调用&#xff1a;Feign 服务保护&#xff1a;sentinel 服务网关&#xff1a;Gateway 微服务注册和发现 nacos和eureka的区别 负载均衡 微服务向Ribbon发送…

计算机系统的多级层次结构

计算机系统的层次结构 计算机系统最底部的两个底层结构 那我们上一篇文章所举的例子来看:(ps:如果还没有看请查收~各个硬件的工作原理-CSDN博客) 第一条指令是二进制机器指令,它被分为了9个微指令 如下图: 由于传统的机器只能识别二进制指令,而这种指令用来编程是非常不方便的…

与Apollo共创生态:探索自动驾驶的未来蓝图

目录 引言Apollo开放平台Apollo开放平台企业生态计划Apollo X 企业自动驾驶解决方案&#xff1a;加速企业场景应用落地Apollo开放平台携手伙伴共创生态生态共创会员权益 个人心得与展望技术的多元化应用数据驱动的智能化安全与可靠性的重视 结语 引言 就在2024年4月19日&#x…

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1&#xff1a;计算&#xff1a; 解&#xff1a; 解析&#xff1a;①左边的置换是1保持不变&#xff0c;2变成3&#xff0c;3变成4&#xff0c;4变成5&#xff0c;5变成2&#xff0c;因此可以简写为(2345)&#xff1b;右边的置换是2和5保持不变&#xff0c;1变成3&#xff…

如何将数据导入python

Python导入数据的三种方式&#xff1a; 1、通过标准的Python库导入CSV文件 Python提供了一个标准的类库CSV文件。这个类库中的reader()函数用来导入CSV文件。当CSV文件被读入后&#xff0c;可以利用这些数据生成一个NumPy数组&#xff0c;用来训练算法模型。 from csv import…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

【跟马少平老师学AI】-【神经网络是怎么实现的】(七-1)词向量

一句话归纳&#xff1a; 1&#xff09;神经网络不仅可以处理图像&#xff0c;还可以处理文本。 2&#xff09;神经网络处理文本&#xff0c;先要解决文本的表示&#xff08;图像的表示用像素RGB&#xff09;。 3&#xff09;独热编码词向量&#xff1a; 词表&#xff1a;{我&am…

SQL——高级教程【菜鸟教程】

SQL连接 左连接&#xff1a;SQL LEFT JOIN 关键字 左表相当于主表&#xff0c;不管与右表匹不匹配都会显示所有数据 右表就只会显示和左表匹配的内容。 //例显示&#xff1a;左表的name&#xff0c;有表的总数&#xff0c;时间 SELECT Websites.name, access_log.count, acc…

逻辑漏洞:水平越权、垂直越权靶场练习

目录 1、身份认证失效漏洞实战 2、YXCMS检测数据比对弱&#xff08;水平越权&#xff09; 3、MINICMS权限操作无验证&#xff08;垂直越权&#xff09; 1、身份认证失效漏洞实战 上一篇学习了水平越权和垂直越权的相关基本知识&#xff0c;在本篇还是继续学习&#xff0c;这…