一、创建Springboot项目
1.工具类:
Result
类
package com. spring. pojo ;
import lombok. AllArgsConstructor ;
import lombok. Data ;
import lombok. NoArgsConstructor ;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result < T > {
private Integer code;
private String message;
private T data;
public static < E > Result < E > success ( E data) {
return new Result < > ( 0 , "操作成功" , data) ;
}
public static Result success ( ) {
return new Result ( 0 , "操作成功" , null ) ;
}
public static Result error ( String message) {
return new Result ( 1 , message, null ) ;
}
}
ThreadLocalUtil
package com. spring. utils ;
import java. util. HashMap ;
import java. util. Map ;
@SuppressWarnings ( "all" )
public class ThreadLocalUtil {
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal ( ) ;
public static < T > T get ( ) {
return ( T ) THREAD_LOCAL . get ( ) ;
}
public static void set ( Object value) {
THREAD_LOCAL . set ( value) ;
}
public static void remove ( ) {
THREAD_LOCAL . remove ( ) ;
}
}
2.启动类和yaml配置
Springboot
启动类
@SpringBootApplication
public class bigEventApplication {
public static void main ( String [ ] args) {
SpringApplication . run ( bigEventApplication. class , args) ;
}
}
application
.yaml
spring:
datasource:
driver- class - name: com. mysql. cj. jdbc. Driver
url: jdbc: mysql: / / localhost: 3306 / big_event
username: root
password: 123456
servlet:
multipart:
max- file- size: 5 MB
max- request- size: 5 MB
data:
redis:
host: localhost
port: 6379
mybatis:
configuration:
map- underscore- to - camel- case : true # 开启驼峰命名法
3.Maven
配置
< parent>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- parent< / artifactId>
< version> 3.2 .3 < / version>
< / parent>
< dependencies>
< ! -- web-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- web< / artifactId>
< / dependency>
< ! -- mybatis-- >
< dependency>
< groupId> org. mybatis. spring. boot< / groupId>
< artifactId> mybatis- spring- boot- starter< / artifactId>
< version> 3.0 .3 < / version>
< / dependency>
< ! -- mysql驱动-- >
< dependency>
< groupId> com. mysql< / groupId>
< artifactId> mysql- connector- j< / artifactId>
< / dependency>
< ! -- lombok-- >
< dependency>
< groupId> org. projectlombok< / groupId>
< artifactId> lombok< / artifactId>
< / dependency>
< ! -- Validation -- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- validation< / artifactId>
< / dependency>
< ! -- java- jwt-- >
< dependency>
< groupId> com. auth0< / groupId>
< artifactId> java- jwt< / artifactId>
< version> 4.4 .0 < / version>
< / dependency>
< ! -- 单元测试坐标-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- test< / artifactId>
< / dependency>
< ! -- 分页查询-- >
< dependency>
< groupId> com. github. pagehelper< / groupId>
< artifactId> pagehelper- spring- boot- starter< / artifactId>
< version> 2.1 .0 < / version>
< / dependency>
< ! -- 阿里云SDK -- >
< dependency>
< groupId> com. aliyun. oss< / groupId>
< artifactId> aliyun- sdk- oss< / artifactId>
< version> 3.15 .1 < / version>
< / dependency>
< ! -- 处理Java 9 及以上版本的JAXB 问题: -- >
< dependency>
< groupId> jakarta. xml. bind< / groupId>
< artifactId> jakarta. xml. bind- api< / artifactId>
< version> 3.0 .1 < / version>
< / dependency>
< dependency>
< groupId> com. sun. xml. bind< / groupId>
< artifactId> jaxb- impl< / artifactId>
< version> 4.0 .5 < / version>
< / dependency>
< ! -- redis-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- data- redis< / artifactId>
< / dependency>
< / dependencies>
< build>
< plugins>
< plugin>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- maven- plugin< / artifactId>
< version> 3.2 .4 < / version>
< / plugin>
< / plugins>
< / build>
二、后端登录注册部分
(一)、后端注册和登录类:
UserController
类
@RestController
@RequestMapping ( "user" )
@Validated
public class UserController {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private UserService userService;
@PostMapping ( "register" )
public Result register ( @Pattern ( regexp = "^\\S{5,16}$" ) String username, @Pattern ( regexp = "^\\S{5,16}$" ) String password) {
User u = userService. findByUserName ( username) ;
if ( u == null ) {
userService. register ( username, password) ;
return Result . success ( ) ;
} else {
return Result . error ( "用户名已被占用" ) ;
}
}
@PostMapping ( "login" )
public Result < String > login ( @Pattern ( regexp = "^\\S{5,16}$" ) String username, @Pattern ( regexp = "^\\S{5,16}$" ) String password) {
User loginUser = userService. findByName ( 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) ;
ValueOperations < String , String > ops = redisTemplate. opsForValue ( ) ;
ops. set ( token, token, 999 , TimeUnit . DAYS ) ;
return Result . success ( token) ;
}
return Result . error ( "密码错误" ) ;
}
@GetMapping ( "/userInfo" )
public Result < User > userInfo
( ) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
String username = ( String ) map. get ( "username" ) ;
User user = userService. findByName ( username) ;
return Result . success ( user) ;
}
@PutMapping ( "/update" )
public Result update ( @RequestBody @Validated User user) {
userService. update ( user) ;
return Result . success ( ) ;
}
@PatchMapping ( "updateAvatar" )
public Result updateAvatar ( @RequestParam @URL String avatarUrl) {
userService. updateAvatar ( avatarUrl) ;
return Result . success ( ) ;
}
@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 ( "缺少必要参数" ) ;
}
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
String username = ( String ) map. get ( "username" ) ;
User loginUser = userService. findByName ( username) ;
if ( ! loginUser. getPassword ( ) . equals ( Md5Util . getMD5String ( oldPwd) ) ) {
return Result . error ( "原密码填写不正确" ) ;
}
if ( ! newpwd. equals ( rePwd) ) {
return Result . error ( "两次输入的新密码不一致" ) ;
}
userService. updatePwd ( newpwd) ;
ValueOperations < String , String > ops = redisTemplate. opsForValue ( ) ;
ops. getOperations ( ) . delete ( token) ;
return Result . success ( ) ;
}
}
包导入 :
引入了必要的pojo、service、util类以及Spring框架的相关依赖。 类定义 :
@RestController
:声明这是一个REST控制器,处理HTTP请求并返回JSON响应。@RequestMapping("user")
:所有处理的请求路径都以"user"作为前缀。@Validated
:在类级别上使用,表示类中的方法参数将进行数据验证。 依赖注入 :
@Autowired
:用于自动注入依赖的StringRedisTemplate
和UserService
。StringRedisTemplate
用于操作Redis,而UserService
提供了与用户相关的业务逻辑。 工具类引用 :
JwtUtil
:处理JWT(JSON Web Tokens)相关的操作,如生成和解析Token。Md5Util
:提供MD5加密功能,可能用于密码存储。ThreadLocalUtil
:一个线程局部存储 工具类,可能用于存储线程 相关的上下文信息,比如当前登录用户的标识。 其他导入的库和注解 :
jakarta.validation.constraints.Pattern
和 org.hibernate.validator.constraints.URL
:用于数据验证,确保输入符合特定的正则表达式或URL格式。org.springframework.util.StringUtils
:提供字符串操作的实用方法。org.springframework.web.bind.annotation.*
:用于处理HTTP请求的方法注解,如@GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
等
Userservice
类
User findById ( String username) ;
void register ( String username, String password) ;
User findByName ( String username) ;
void update ( User user) ;
void updateAvatar ( String avatarUrl) ;
void updatePwd ( String newpwd) ;
}
UserServiceImpl
package com. spring. service. Impl ;
import com. spring. mapper. UserMapper ;
import com. spring. pojo. User ;
import com. spring. service. UserService ;
import com. spring. utils. Md5Util ;
import com. spring. utils. ThreadLocalUtil ;
import org. springframework. beans. factory. annotation. Autowired ;
import org. springframework. stereotype. Service ;
import java. time. LocalDateTime ;
import java. util. Map ;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findByUserName ( String username) {
return userMapper. findByUserName ( username) ;
}
@Override
public void register ( String username, String password) {
String md5String = Md5Util . getMD5String ( password) ;
userMapper. add ( username, md5String) ;
}
@Override
public User findByName ( String username) {
return userMapper. findByName ( username) ;
}
@Override
public void update ( User user) {
user. setUpdateTime ( LocalDateTime . now ( ) ) ;
userMapper. update ( user) ;
}
@Override
public void updateAvatar ( String avatarUrl) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
Integer id = ( Integer ) map. get ( "id" ) ;
userMapper. updateAvatar ( avatarUrl, id) ;
}
@Override
public void updatePwd ( String newpwd) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
Integer id = ( Integer ) map. get ( "id" ) ;
userMapper. updatePwd ( Md5Util . getMD5String ( newpwd) , id) ;
}
}
UserMapper类
@Mapper
public interface UserMapper {
@Select ( "select * from user where username = #{username} " )
User findById ( String username) ;
@Insert ( "insert into user(username,password,create_time,update_time)" +
" values(#{username},#{md5String},now(),now())" )
void add ( String username, String md5String) ;
@Select ( "select * from user where username = #{username}" )
User findByName ( String username) ;
@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=#{newpwd},update_time= now() where id = #{id}" )
void updatePwd ( String newpwd, Integer id) ;
}
User
类:
package com. spring. pojo ;
import com. fasterxml. jackson. annotation. JsonIgnore ;
import jakarta. validation. constraints. Email ;
import jakarta. validation. constraints. NotEmpty ;
import jakarta. validation. constraints. NotNull ;
import jakarta. validation. constraints. Pattern ;
import lombok. Data ;
import java. time. LocalDateTime ;
@Data
public class User {
@NotNull
private Integer id;
private String username;
@JsonIgnore
private String password;
@NotEmpty
private String nickname;
@Email
private String email;
private String userPic;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
1.register
方法
接口定义:
接口路径:/user/register
请求方法:POST
功能描述:处理用户的注册请求,验证并创建新用户。
请求参数:
username
:用户输入的用户名,通过正则表达式^\\S{5,16}$
验证,确保5到16个非空白字符。password
:用户输入的密码,同样遵循上述正则规则,保证安全性和一致性。
@PostMapping ( "register" )
public Result register ( @Pattern ( regexp = "^\\S{5,16}$" ) String username, @Pattern ( regexp = "^\\S{5,16}$" ) String password) {
User u = userService. findByUserName ( username) ;
if ( u == null ) {
userService. register ( username, password) ;
return Result . success ( ) ;
} else {
return Result . error ( "用户名已被占用" ) ;
}
}
service层:
findById
:根据用户名查询用户对象,如果存在返回用户信息,否则返回null
。register
:接收用户名和密码,执行实际的注册操作,如创建新用户记录。
User findByUserName ( String username) ;
void register ( String username, String password) ;
serviceImpl层:
当用户注册时,输入的明文密码通过Md5Util.getMD5String(password)
方法转换成MD5哈希值。这个哈希值随后被存储到数据库中,而不是原始密码。 当用户登录时,输入的密码同样会被转换成MD5哈希值,然后与数据库中对应用户名的密码哈希值进行比较,如果两者匹配,则密码验证成功。 这样,即使数据库数据泄露,攻击者也无法直接知道用户的明文密码,增加了破解的难度,提高了系统的安全性。
@Override
public User findByUserName ( String username) {
return userMapper. findByUserName ( username) ;
}
@Override
public void register ( String username, String password) {
String md5String = Md5Util . getMD5String ( password) ;
userMapper. add ( username, md5String) ;
}
mapper层:
findById
:使用MyBatis的@Select
注解执行SQL查询,查找用户名对应的用户记录。add
:使用@Insert
注解执行SQL插入,创建新的用户记录。注意这里密码可能已经进行了加密处理(如MD5),以提高安全性。
@Select ( "select * from user where username = #{username} " )
User findByUserName ( String username) ;
@Insert ( "insert into user(username,password,create_time,update_time)" +
"values(#{username},#{md5String},now(),now())" )
void add ( String username, String md5String) ;
业务逻辑:
用户名检查 :调用userService.findById(username)
查询数据库中是否存在相同用户名的用户。如果查询结果u
为空,说明用户名未被占用,执行userService.register(username, password)
进行注册。 注册成功后,返回Result.success()
,表示注册完成。 如果u
非空,说明用户名已被占用,返回Result.error("用户名已被占用")
,提示前端错误信息
2.login
方法
接口定义
接口路径 :/user/login
请求方法 :POST
功能描述 :处理用户的登录请求,验证用户名和密码,返回JWT令牌用于身份验证。
请求参数
username
:用户输入的用户名,遵循正则表达式^\\S{5,16}$
,确保为5至16个字符的非空白字符串。password
:用户输入的密码,同样遵循^\\S{5,16}$
正则规则,保证输入安全。
@PostMapping ( "login" )
public Result < String > login ( @Pattern ( regexp = "^\\S{5,16}$" ) String username, @Pattern ( regexp = "^\\S{5,16}$" ) String password) {
User loginUser = userService. findByName ( 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) ;
ValueOperations < String , String > ops = redisTemplate. opsForValue ( ) ;
ops. set ( token, token, 999 , TimeUnit . DAYS ) ;
return Result . success ( token) ;
}
return Result . error ( "密码错误" ) ;
}
service层:
findByName
:根据用户名查询用户对象,如果存在返回用户信息,否则返回null
。validateLogin
:执行登录验证逻辑,包括用户名存在性和密码正确性。
User findByName ( String username) ;
serviceImpl层:
@Override
public User findByName ( String username) {
return userMapper. findByName ( username) ;
}
mapper层:
findByName
:使用MyBatis的@Select
注解执行SQL查询,查找用户名对应的用户记录。getPasswordByUsername
:如果需要单独查询密码,可以添加一个方法来获取特定用户名的密码。
@Select ( "select * from user where username = #{username}" )
User findByName ( String username) ;
业务逻辑
用户名验证 :
调用userService.findByName(username)
查询数据库中是否存在该用户名的用户。 密码验证 :
如果查询结果loginUser
非空,进行密码验证。 使用Md5Util.getMD5String(password)
对用户输入的密码进行MD5加密。 比较加密后的密码与数据库中用户对象的密码(loginUser.getPassword()
),如果匹配,密码验证通过。 登录成功处理 :
如果密码验证通过,构建JWT令牌的载荷信息,如用户ID和用户名。 使用JwtUtil.genToken(claims)
生成JWT字符串。 存储JWT令牌到Redis,设置一个合适的过期时间,如ops.set(token, token, tokenExpireTime, TimeUnit.SECONDS)
。 返回登录成功的结果,携带JWT令牌,供客户端后续请求使用。 错误处理 :
如果用户名不存在,返回Result.error("用户名不存在")
。 如果密码验证失败,返回Result.error("密码错误")
。
3.userInfo
方法
接口定义
接口路径 :/userInfo
请求方法 :GET
功能描述 :根据请求中的用户标识(通过ThreadLocal存储的用户名)获取并返回用户的详细信息。
@GetMapping ( "/userInfo" )
public Result < User > userInfo ( ) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
String username = ( String ) map. get ( "username" ) ;
User user = userService. findByName ( username) ;
return Result . success ( user) ;
}
service层:
User findByName ( String username) ;
serviceImpl层:
@Override
public User findByName ( String username) {
return userMapper. findByName ( username) ;
}
mapper层:
findByName
:使用MyBatis的@Select
注解执行SQL查询,查找用户名对应的用户记录。
@Select ( "select * from user where username = #{username}" )
User findByName ( String username) ;
请求处理
用户标识提取:
本例中,用户标识(用户名)不是直接从请求头中的Authorization
字段获取,而是利用了ThreadLocal
存储的上下文信息。在之前的登录流程中,登录成功后将用户名等信息存储到了ThreadLocal
中,以便后续请求在同一线程内无需再次传递Token。 解析标识:
直接从ThreadLocalUtil.get()
获取到的Map中提取之前存储的用户名,作为查询数据库的依据。 查询用户信息:
调用userService.findByName(username)
,根据从ThreadLocal
中获取的用户名查询数据库,获取用户详细信息。 响应处理:
查询到用户信息后,通过Result.success(user)
封装用户对象,并作为响应体返回,表示操作成功。
4.update
方法
权限验证:在实际应用中,应确保只有登录用户才能更新自己的信息,需要验证请求中的用户ID与`ThreadLocal`中存储的用户ID一致。
接口定义
接口路径 :/update
请求方法 :PUT
功能描述 :根据请求中携带的用户对象更新用户信息,该对象应包含用户ID,以及其他待更新的属性。
请求参数
用户对象 (User
):包含了待更新的用户信息,如nickname
, email
等。用户ID是必需的,以确定要更新的用户记录。
@PutMapping ( "/update" )
public Result update ( @RequestBody @Validated User user) {
userService. update ( user) ;
return Result . success ( ) ;
}
service层:
void update ( User user) ;
serviceImpl层:
@Override
public void update ( User user) {
user. setUpdateTime ( LocalDateTime . now ( ) ) ;
userMapper. update ( user) ;
}
mapper层:
update
方法使用MyBatis的@Update
注解,执行更新用户信息的SQL,只列出更改的字段,如nickname
, email
等,并设置update_time
。
@Update ( "update user set nickname=#{nickname},email=#{email},update_time=#{updateTime} where id = #{id}" )
void update ( User user) ;
请求处理
数据校验 :
请求体中的User
对象通过@RequestBody
和@Validated
注解进行数据校验,确保必填项完整且格式正确。 更新用户信息 :
将完整的用户对象传递给userService.update(user)
,执行更新操作。 更新逻辑 :
在serviceImpl
层,首先设置updateTime
为当前时间,确保每次更新都有新的更新时间戳。 然后调用userMapper.update(user)
,使用MyBatis的@Update
注解执行SQL,更新指定ID的用户记录。 响应处理 :
更新成功后,返回Result.success()
,表示操作成功。由于更新操作不返回具体的数据对象,因此响应中没有封装用户对象。
5.updateAvatar
方法
接口定义
接口路径 :/update/avatar
请求方法 :PATCH
功能描述 :更新用户的头像URL,请求参数中包含新的头像链接。
请求参数
avatarUrl :用户上传的新头像URL,通过@RequestParam
注解接收,使用@URL
进行URL格式的校验。
@PatchMapping ( "updateAvatar" )
public Result updateAvatar ( @RequestParam @URL String avatarUrl) {
userService. updateAvatar ( avatarUrl) ;
return Result . success ( ) ;
}
service层:
void updateAvatar ( String avatarUrl) ;
serviceImpl层:
@Override
public void updateAvatar ( String avatarUrl) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
Integer id = ( Integer ) map. get ( "id" ) ;
userMapper. updateAvatar ( avatarUrl, id) ;
}
mapper层:
update
方法使用MyBatis的@Update
注解,执行更新用户头像信息的SQL,通过id条件更改头像信息
@Update ( "update user set user_pic=#{avatarUrl},update_time= now() where id = #{id}" )
void updateAvatar ( String avatarUrl, Integer id) ;
请求处理
权限验证 :
在实际应用中,应验证请求中的用户ID与ThreadLocal
中存储的用户ID一致,确保只有登录用户才能更新自己的头像。 更新头像 :
从ThreadLocalUtil.get()
中获取当前登录用户的ID。 调用userService.updateAvatar(avatarUrl)
,传入新的头像URL,执行头像更新操作。 响应处理 :
头像更新成功后,返回Result.success()
,表示操作成功。响应中不包含具体的数据对象。
6.updateAvatar
方法
接口定义
接口路径 :/update/pwd
请求方法 :PATCH
功能描述 :更新用户密码,请求参数中包含旧密码、新密码和确认新密码。
请求参数
old_pwd :当前用户的旧密码。new_pwd :用户设定的新密码。re_pwd :用户确认的新密码,用于校验输入一致性。Authorization :请求头中的Token,用于验证用户身份。
@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 ( "缺少必要参数" ) ;
}
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
String username = ( String ) map. get ( "username" ) ;
User loginUser = userService. findByName ( username) ;
if ( ! loginUser. getPassword ( ) . equals ( Md5Util . getMD5String ( oldPwd) ) ) {
return Result . error ( "原密码填写不正确" ) ;
}
if ( ! newpwd. equals ( rePwd) ) {
return Result . error ( "两次输入的新密码不一致" ) ;
}
userService. updatePwd ( newpwd) ;
ValueOperations < String , String > ops = redisTemplate. opsForValue ( ) ;
ops. getOperations ( ) . delete ( token) ;
return Result . success ( ) ;
}
参数校验
检查参数完整性 :
检查old_pwd
, new_pwd
, re_pwd
是否存在,如果缺失则返回错误信息。 验证原密码 :
使用ThreadLocalUtil.get()
获取当前登录用户信息,然后通过用户名查询用户,对比原密码的正确性。 新密码一致性校验 :
比较new_pwd
和re_pwd
是否一致,不一致则返回错误信息。
service层:
void updatePwd ( String newpwd) ;
serviceImpl层:
安全:密码必须加密存储,这里使用了MD5加密
@Override
public void updatePwd ( String newpwd) {
Map < String , Object > map = ThreadLocalUtil . get ( ) ;
Integer id = ( Integer ) map. get ( "id" ) ;
userMapper. updatePwd ( Md5Util . getMD5String ( newpwd) , id) ;
}
mapper层:
update
方法使用MyBatis的@Update
注解,执行更新用户头像信息的SQL,通过id条件更改头像信息
@Update ( "update user set password=#{newpwd},update_time= now() where id = #{id}" )
void updatePwd ( String newpwd, Integer id) ;
请求处理
权限验证 :
验证请求头中的Token,确保用户已登录并具有修改密码的权限。 密码更新 :
调用userService.updatePwd(newpwd)
,使用新密码的MD5加密版本更新数据库。 清理Token :
为了安全,更新密码后从Redis中删除对应的Token,强制用户重新登录。 响应处理 :
密码更新成功后,返回Result.success()
,表示操作成功。响应中不包含具体的数据对象。