后端系统开发之——功能完善

原文地址:https://blog.yiming1234.cn/?p=830

下面是正文内容:

前言

通过SpringBoot开发用户模块的部分也就差不多要结束了,这一片文章就主要提一些在系统开发中需要注意到的细节部分和功能,也就是剩余的部分。

但是这个专栏只介绍了系统后端用户模块的开发,因为用户模块在大部分java后端的开发上都是通用必须掌握的。

而系统需要实现的具体功能比如说文章的发表,出入库的登记查询等等,则需要另起专栏去进行描述。

正文

获取更新用户信息/更新用户密码

由于这一部分接口的开发,和前面提到的注册登录接口的开发步骤大同小异,所以就合并之后简单描述一下了。

Controller层(UserController.java)

@GetMapping("/userinfo")public Result<User> userinfo(/*@RequestHeader(name = "Authorization") String token*/){//根据用户名查询用户/*Map<String, Object> map = JwtUtil.parseToken(token);String username = (String) map.get("username");*/Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User user = userService.findByUserName(username);return Result.success(user);}@PtachMapping("/update")public Result<User> update(@RequestBody User user){userService.update(user);return Result.success();}@PatchMapping("/updateAvatar")public Result updateAvater(@RequestParam @URL String avatarUrl){userService.updateAvatar(avatarUrl);return Result.success();}

Service层(UserServiceImpl.java)

    @Overridepublic void update(User user){user.setUpdateTime(LocalDateTime.now());userMapper.update(user);}@Overridepublic void updateAvatar(String avatarUrl){Map<String,Object> map = ThreadLocalUtil.get();Integer id = (Integer) map.get("id");userMapper.updateAvatar(avatarUrl,id);}@Overridepublic void updatePwd(String newPwd){Map<String,Object> map = ThreadLocalUtil.get();Integer id = (Integer) map.get("id");userMapper.updatePwd(Md5Util.getMD5String(newPwd),id);}

Mapper层(UserMapper.java)

@Update("update user set nickname=#{nickname},email=#{email},update_time=#{updateTime} where id=#{id}")void update(User user);@Update("update user set user_pic=#{avatarUrl},update_time=now() where id=#{id}")void updateAvatar(String avatarUrl, Integer id);@Update("update user set password=#{md5String},update_time=now() where id=#{id}")void updatePwd(String md5String, Integer id);

更改密码后Jwt令牌的及时失效

需要用到Redis服务。

Redis是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。

作为缓存存储系统非常流行,可以将经常访问的数据存储在内存中,以加快读取速度,减轻后端数据库的负载。可用于存储会话数据,以实现分布式会话管理,提高可扩展性和性能。

首先从github上下载redis

Releases · tporadowski/redis · GitHub

解压后cd命令切换至根目录下启动,看到下面的界面

redis-server.exe redis.windows.conf

然后在pom.xml中添加下面的字段

<!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

将application.yml修改为如下

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/big_eventusername: rootpassword: rootdata:redis:host: localhostport: 6379mybatis:configuration:map-underscore-to-camel-case: true #开启驼峰命名和下划线命名的自动转换

针对Redis需要做出的修改:登录成功后需要将token储存至Redis中,系统内页面在访问时验证需要从Redis中获取token,密码更新后需要删除Redis中对应的token。

修改UserController.java中的内容

@Autowiredprivate StringRedisTemplate stringRedisTemplate;
@PostMapping("/login")public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password){//根据用户名查询用户User loginUser = userService.findByUserName(username);//判断该用户是否存在if (loginUser==null){return Result.error("用户名不存在");}//判断密码是否正确,传入参数加密后与数据库中的密文进行比对if (Md5Util.getMD5String(password).equals(loginUser.getPassword())) {//登录成功Map<String,Object> claims = new HashMap<>();claims.put("id",loginUser.getId());claims.put("username",loginUser.getUsername());String token = JwtUtil.genToken(claims);//把token存储到redis中ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.set(token,token, 1, TimeUnit.HOURS);return Result.success(token);}return Result.error("密码错误");}

 @PatchMapping("/updatePwd")public Result updatePwd(@RequestBody Map<String, String> params,@RequestHeader("Authorization") String token){//校验参数String oldPwd = params.get("old_pwd");String newPwd = params.get("new_pwd");String rePwd = params.get("re_pwd");if (!StringUtils.hasLength(oldPwd)|| !StringUtils.hasLength(newPwd)|| !StringUtils.hasLength(rePwd)){return Result.error("缺少必要的参数");}//原密码是否正确,调用原密码和old_pwd进行比较Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User loginUser = userService.findByUserName(username);if(!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd))){return Result.error("原密码错误");}if(!rePwd.equals(rePwd)){return Result.error("两次填写的密码不一致");}//调用service完成密码更新userService.updatePwd(newPwd);//删除redis中对应的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.getOperations().delete(token);return Result.success("密码修改成功");}

修改LoginInterceptor.java中的内容

    @Autowiredprivate StringRedisTemplate stringRedisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token = request.getHeader("Authorization");//验证tokentry {//从redis中获取相同的tokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if (redisToken==null){throw new RuntimeException();}Map<String, Object> claims = JwtUtil.parseToken(token);//把业务数据储存到ThreadLocal中ThreadLocalUtil.set(claims);//放行return true;} catch (Exception e) {response.setStatus(401);//不放行return false;}

SpringBoot项目部署

SpringBoot项目在后端程序员电脑上正常运行之后,就需要打包上传至公司服务器,进行项目部署。

在pom.xml中 <dependecies>和</project>之间添加下面的字段用于打包

<build><plugins><!--打包操作--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.2.3</version></plugin></plugins></build>

在右侧边栏找到package字样,点击运行等程序跑完。

这里需要注意的是:SpringBoot在进行自动化打包的时候,是会默认测试Test环境下的java类能否正常运行的。要么在打包的时候选择skip跳过,要么就确保测试类能够正常运行。

如果配置了Redis那么也同时需要把redis打开。

还有就是打包的时候要把项目关了,不然就会报错8080端口占用。

可以看到已经打包成功了,这里就不上传服务器,假设本地Windows电脑为服务端进行测试

jdk需要至少版本17,找到打包好的jar包,直接java -jar system-1.0-SNAPSHOT.jar启动

由于还没有编写前端页面,所以还是只能通过Apifox来进行试验,这里就进行演示了。

结束

其实还有一些比如说多环境(测试,开发,生产)下的开发,本地电脑属性的配置等等内容没有介绍,但由于是小项目没有这个必要,所以也就不进行过多的赘述了。

关于后端系统开发的专栏就暂且告一段落了。

尾声

后面开始就要进行Vue.js的工程化部署以及前后端的连接了,大家可以点个关注跟进一下。

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

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

相关文章

测试开发工程师(QA)职业到底需要干些什么?part3:算法QA

算法测试/评测QA工作主要是评估和测试深度学习、计算机视觉、智能机器人、虚拟个人助理、自然语言处理—语音识别、自然语言处理—通用、实时语音翻译、情境感知计算、手势控制、视觉内容自动识别、推荐引擎等的性能和效果。以下是该工作的一般流程和任务&#xff1a; 数据收集…

紫鸾5.0:紫光云新一代敏捷应用开发平台全家桶

曾几何时&#xff0c;“瀑布式”占据了二十世纪软件开发的主流&#xff0c;开发时间往往以年计&#xff0c;一款软件应用动辄几年才能交付。而随着社会生产力的跃升&#xff0c;“瀑布式”已严重跟不上时代的节奏&#xff0c;2001年&#xff0c;“敏捷宣言”的发布&#xff0c;…

C++运算符重载中的引用返回

文章目录 引言原因1.为了支持链式调用2.避免不必要的对象创建和复制3.保持语义一致性 引言 在C编程语言中&#xff0c;运算符重载是一项强大的特性&#xff0c;它允许程序员为自定义类型重新定义或重载已有的运算符&#xff0c;从而使得这些类型能够像内置类型一样使用运算符。…

聊一下大模型的函数调用-Function call

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

SpringBoot项目防重复提交

解压工具包&#xff0c;放入工具组件下引入maven依赖 <dependency><groupId>com.wx</groupId><artifactId>wx-idempotent</artifactId> </dependency> 使用方式&#xff1a; 直接注解&#xff1a;默认时间1s内不可重复使用&#xff0c;默…

cesium-剖面分析

直接上代码 <template><div id"cesiumContainer" class"content"></div><div id"toolbar" class"nameButton"><el-breadcrumb :separator-icon"ArrowRight"><el-breadcrumb-item>三维…

Windows服务器性能监控

Windows服务器操作系统设计用于运行在客户端-服务器架构内的服务器上&#xff0c;这些服务器通常设计用于处理繁重的工作负载&#xff0c;并作为企业中涉及的大多数软件操作的骨干。因此&#xff0c;为了防止由于性能问题而导致的任何服务损失并保持操作的无缝流&#xff0c;Wi…

ESCTF赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳&#xff0c;直接拖入ida分析分析函数逻辑&#xff1a;ida打开如下&#xff1a;提取出全局变量res的数据后&#xff0c;编写异或脚本进行解密&#xff1a; a[0xBF, …

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA&#xff0c;初始时指向正上方&#xff08;Y 轴正向&#xff09;。 在平面中有若干物件&#xff0c;第 i 个物件的坐标为&#xff08;,)&#xff0c;价值为 。 当棒扫到某个物件时&#xff0c;棒的长度会瞬间增长 &#xff…

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…

2024年蓝牙耳机怎么选?五大爆火真无线蓝牙耳机推荐大公开!

​随着科技的进步&#xff0c;越来越多的用户倾向选择无线蓝牙耳机&#xff0c;摆脱有线耳机的束缚&#xff0c;享受更加自由的音乐体验。为了帮助大家选购到适合自己的蓝牙耳机&#xff0c;我整理了一些目前市面上我个人认为性能优异的款式&#xff0c;与大家分享。 一、蓝牙耳…

Linux(centos7)部署hadoop集群

部署环境要求:已完成JDK环境部署、配置完成固定IP、SSH免费登录、防火墙关闭等。 1、下载、上传主机 官网:https://hadoop.apache.org 2、解压缩、创建软连接 解压: tar -zxvf hadoop-3.3.6.tar.gz软连接: ln -s /usr/local/apps/hadoop-3.3.6 hadoop3、文件配置 hadoo…