11. 实现业务功能--获取用户信息

目录

1. 实现 Controller

2. 单体测试

3. 修复返回值存在的缺陷

3.1 用户的隐私数据:密码的密文和盐不能显示

3.2 将值为 null 的字段可以进行过滤

3.3 时间的格式需要进行处理,如 yyyy-mmmm-ddd  HH:mm:ss

3.4 data 属性没有返回 

4. 实现前端页面

5. 根据用户的 ID 获取用户信息

5.1 创建 Service 接口

5.2 实现 Service 接口

5.3 编写测试方法

5.4 实现 Controller

 5.5 单体测试


1. 实现 Controller

@ApiOperation("获取用户信息")@ResponseBody@GetMapping("/info")public AppResult<User> getUserInfo (HttpServletRequest request) {// 获取session对象HttpSession session = request.getSession(false);// 判断 session 是否有效if (session == null || session.getAttribute(AppConfig.SESSION_USER_KEY) == null) {return AppResult.failed("用户未登录");}// 退出成功响应User user = (User) session.getAttribute(AppConfig.SESSION_USER_KEY);return AppResult.success(user);}

2. 单体测试

先进行登录: 

 获取信息:

3. 修复返回值存在的缺陷

我们可以看到在返回的结果存在的问题:

3.1 用户的隐私数据:密码的密文和盐不能显示

        在 JSON 序列化的时候把相应的字段排除掉。 在对应的字段加上如下图所示的注解:

 重新运行后,可以看到已经成功将隐私字段进行了排除显示:

3.2 将值为 null 的字段可以进行过滤

添加以下配置: 

重新运行后: 

3.3 时间的格式需要进行处理,如 yyyy-mmmm-ddd  HH:mm:ss

添加以下配置:  

重新运行后: 

3.4 data 属性没有返回 

但是此时由于设置了不为 null 时才参与 JSON 初始化,导致了 data 属性没有返回:

 通过添加注解: @JsonInclude(JsonInclude.Include.ALWAYS) 可以解决上述问题。

测试:

4. 实现前端页面

    //========================= 获取用户信息 =======================// 成功后,手动设置用户信息// $('#index_nav_avatar').css('background-image', 'url(' + user.avatarUrl + ')');$.ajax({type : 'GET',url : 'user/info',// 成功回调success : function(respData) {// ⽤状态码判断是否成功if (respData.code == 0) {// 成功// 获取用户信息let user = respData.data;// 设置用户头像的默认值if(!user.avatarUrl){user.avatarUrl = avatarUrl;}// 设置用户头像$('#index_nav_avatar').css('background-image', 'url(' + user.avatarUrl + ')');// 设置昵称$('#index_nav_nickname').html(user.nickname);// 设置用户组let subName = user.isAdmin == 1 ? '管理员' : '普通用户';$('#index_nav_name_sub').html(subName);} else {// 失败$.toast({heading : '警告',text : respData.message,icon : 'Warning'});}},// 失败(HTTP)error: function() {$.toast({heading : '错误',text : '出错了,请联系管理员',icon : 'error'});}});

最终的运行结果如图所示: 


5. 根据用户的 ID 获取用户信息

用户提交请求,服务器根据是否传入 Id 参数决定返回哪个用户的详情。
1. 没有用户 Id,从 session 中取出当前登录的用户信息
2. 传入用户 Id,从数据库中查询(根据 id 去查)

参数要求:

参数名描述类型默认值条件
id用户 IDlong可以为空

5.1 创建 Service 接口

    /*** 根据用户 Id查询用户信息* @param Id* @return User*/User selectById(Long Id);

5.2 实现 Service 接口

@Overridepublic User selectById(Long id) {// 非空检验if(id == null || id < 0){// 打印日志log.warn(ResultCode.FAILED_PARAMS_VALIDATE.toString());// 抛出异常throw new ApplicationException(AppResult.failed(ResultCode.FAILED_PARAMS_VALIDATE));}// 使用 DAO 查询User user = userMapper.selectByPrimaryKey(id);return user;}

5.3 编写测试方法

@Testvoid selectById() throws JsonProcessingException {User user = userService.selectById(1l);System.out.println(objectMapper.writeValueAsString(user));user = userService.selectById(2l);System.out.println(objectMapper.writeValueAsString(user));user = userService.selectById(8l);System.out.println(objectMapper.writeValueAsString(user));}

测试通过: 

5.4 实现 Controller

@ApiOperation("获取用户信息")@ResponseBody@GetMapping("/info")public AppResult<User> getUserInfo (HttpServletRequest request,@ApiParam("⽤⼾Id") @RequestParam(value = "id", required = false) Long id) {// 定义返回的 User 对象User user;// 根据用户传入的 Id 值,获取 User 对象的方式if(id == null){// 获取session对象HttpSession session = request.getSession(false);// 退出成功响应user = (User) session.getAttribute(AppConfig.SESSION_USER_KEY);}else{// 从数据库中查询user = userService.selectById(id);}// 返回结果return AppResult.success(user);}

 5.5 单体测试

登录后,输入要查询的 Id(主键):

登录后,未输入 Id 查询时返回登录信息: 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis日志工厂

一、LOG4J 特点&#xff1a;可控制日志信息输送的目的地是控制台、文件等。 可控制每一条日志的输出格式&#xff1b; 通过定义每一条日志信息的级别&#xff0c;能够更加细致的控制日志的生成过程&#xff1b; 通过一个配置文件来灵活的进行配置&#xff0c;而不需要修改应…

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作&#xff0c;然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…

时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍…

C++系列-内存模型

内存模型 内存模型四个区代码区全局区栈区堆区内存开辟和释放在堆区开辟数组 内存模型四个区 不同区域存放的数据生命周期是不同的&#xff0c;更为灵活。 代码区&#xff1a;存放函数体的二进制代码&#xff0c;操作系统管理。全局区&#xff1a;存放全局变量&#xff0c;常…

计算机竞赛 python+大数据校园卡数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…

【网络架构】华为hw交换机网络高可用网络架构拓扑图以及配置

一、网络拓扑 1.网络架构 核心层:接入网络----路由器 汇聚层:vlan间通信 创建vlan ---什么是vlan:虚拟局域网,在大型平面网络中,为了实现广播控制引入了vlan,可以根据功能或者部门等创建vlan,再把相关的端口加入到vlan.为了实现不用交换机上的相同vlan通信,需要配置中继,为了…

论文笔记 Graph Attention Networks

2018 ICLR 1 intro 1.1. GCN的不足 无法完成inductive任务 inductive任务是指&#xff1a; 训练阶段与测试阶段需要处理的graph不同。通常是训练阶段只是在子图上进行&#xff0c;测试阶段需要处理未知的顶点。GGN 的参数依赖于邻接矩阵A/拉普拉斯矩阵L&#xff0c;所以换了…

STM32--DMA

文章目录 DMA简介DMA特性 DMA框图DMA基本结构DMA请求数据宽度对齐DMA数据转运工程DMAADC多通道 DMA简介 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预&#xff0c;数据可以通过DMA快速地移动&#xff0c;这就节省了CPU的…

STL——stack和queue

一、stack和queue stl中提供了栈和队列配接器供我们使用&#xff0c;以后就可以直接使用了。不需要我们自己造轮子。 使用细节参考文档就可以&#xff0c;与之学过的容器并无二致。栈和队列的特性我们再学习数据结构时已经了解了。这里就不在赘述了。 stack - C Reference (…

vite+vue3项目配置cdn引入在线依赖

采用ejs的方式 安装语法依赖 npm install vite-plugin-ejs -D配置暴露数据 vite.config.js文件&#xff1a; import { fileURLToPath, URL } from node:url import { defineConfig, loadEnv } from vite import vue from vitejs/plugin-vue import vueJsx from vitejs/plug…

分布式锁实现方式

分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做&#xff0c;一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上&#xff0c;也可以部署在多台机器上。但是每一个系统不是独立的&#xff0c;不是完全独立的。需要相互通信&#xff…

vue 关闭prettier警告warn

这个就是我们创建vue cli的时候 把这个给默认上了 关闭这个只需在.eslintrc.js页面里边添加一行代码"prettier/prettier": "off"

34.Netty源码之Netty如何处理网络请求

highlight: arduino-light 通过前面两节源码课程的学习&#xff0c;我们知道 Netty 在服务端启动时会为创建 NioServerSocketChannel&#xff0c;当客户端新连接接入时又会创建 NioSocketChannel&#xff0c;不管是服务端还是客户端 Channel&#xff0c;在创建时都会初始化自己…

线程池原理

一、线程池的定义 线程池&#xff0c;按照配置参数&#xff08;核心线程数、最大线程数等&#xff09;创建并管理若干线程对象&#xff0c;没有任务的时候&#xff0c;这些线程都处于等待空闲状态。如果有新的线程任务&#xff0c;就分配一个空闲线程执行。如果所有线程都处于…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

Dubbo使用

<!--dubbo--><dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency>接口 public interface IUseService {public String…

设计模式之状态模式(State)的C++实现

1、状态模式的提出 在组件功能开发过程中&#xff0c;某些对象的状态经常面临变化&#xff0c;不同的状态&#xff0c;其对象的操作行为不同。比如根据状态写的if else条件情况&#xff0c;且这种条件变化是经常变化的&#xff0c;这样的代码不易维护。可以使用状态模式解决这…

安全学习DAY16_信息打点-CDN绕过

信息打点-CDN绕过 文章目录 信息打点-CDN绕过本节思维导图相关链接&工具站&项目工具前置知识&#xff1a;CDN配置&#xff1a;配置1&#xff1a;加速域名-需要启用加速的域名配置2&#xff1a;加速区域-需要启用加速的地区配置3&#xff1a;加速类型-需要启用加速的资源…

VGG分类实战:猫狗分类

关于数据集 数据集选择的是Kaggle上的Cat and Dog&#xff0c;猫狗图片数量上达到了上万张。你可以通过这里进入Kaggle下载数据集Cat and Dog | Kaggle。 在我的Github仓库当中也放了猫狗图片各666张。 VGG网络 VGG的主要特点是使用了一系列具有相同尺寸 3x3 大小的卷积核进…

vue3生命周期

原理 vue3也提供了Composition API形式的生命周期钩子&#xff0c;与vue2.x中钩子对应关系如下&#xff1a; beforeCreate setup&#xff08;&#xff09; created setup&#xff08;&#xff09; beforeMountonBeforeMount mountedonMounted beforeUpdateonBeforeUpdate updat…