当前位置: 首页 > wzjs >正文

网页设计与制作课程思政快速优化系统

网页设计与制作课程思政,快速优化系统,网站建设法规,广告设计与制作专业课程📖 模块概述 用户管理模块是系统的核心基础模块,包含 注册、登录、用户信息维护 等功能。本模块涉及 JWT Token认证、密码加密存储、文件上传 等关键技术点,是理解前后端分离架构中安全与数据交互的典型实践。本篇对于原项目进行了代码优化&…

📖 模块概述

  • 用户管理模块是系统的核心基础模块,包含 注册、登录、用户信息维护 等功能。本模块涉及 JWT Token认证、密码加密存储、文件上传 等关键技术点,是理解前后端分离架构中安全与数据交互的典型实践。
  • 本篇对于原项目进行了代码优化,将原先写在 Controller 层的业务逻辑代码迁移至了 Service 层,并且额外定义了全局异常处理类中的参数校验异常处理方法。

🛠️ 技术实现要点

  • 前端:Vue3
  • 后端:SpringBoot3 + MyBatis + JWT
  • 安全:Token身份验证
  • 存储:用户头像上传至OSS(或本地目录)

⚙️ 各层职责与代码规范

🔗 Controller 层

⭐️ 核心职责:

  • 接收HTTP请求参数(@RequestBody/@RequestParam)
  • 调用Service层方法
  • 返回统一响应格式(如Result对象)
@RestController
@RequestMapping("/user")
@Validated
@RequiredArgsConstructor
public class UserController {...
}

💡 注意事项:

  • 禁止在Controller中编写业务逻辑
  • 使用DTO对象接收参数,而非直接传递Entity
  • 统一异常处理(通过@ControllerAdvice)

🔗 Service 层

⭐️ 核心职责:

  • 实现具体业务逻辑(如数据校验、事务管理)
  • 组合多个Mapper操作
  • 处理异常并抛出自定义业务异常
public interface UserService {...
}
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {...
}

💡 最佳实践:

  • 接口与实现分离(UserService + UserServiceImpl)
  • 方法需明确事务边界(@Transactional注解)
  • 避免“上帝Service”(按业务拆分多个Service)

🔗 Mapper 层

⭐️ 核心职责:

  • 定义数据库操作方法(SQL映射)
  • 基于MyBatis/MyBatis-Plus实现CRUD
@Mapper
public interface UserMapper {...
}
<!-- 动态 SQL -->
<select id="getArticleList" resultType="com.itheima.pojo.Article">select * from article<where><if test="categoryId != null">category_id = #{categoryId}</if><if test="state != null">and state = #{state}</if>and create_user = #{userId}</where>
</select>

💡 规范建议:

  • 优先使用MyBatis原生方法
  • 定义数据库操作方法(SQL映射)
  • 基于MyBatis/MyBatis-Plus实现CRUD

🔗 层间交互与依赖注入

推荐使用构造函数注入:

@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {private final UserMapper userMapper;// Lombok自动生成构造函数
}
@RestController
@RequestMapping("/user")
@Validated
@RequiredArgsConstructor
public class UserController {private final UserService userService;// Lombok自动生成构造函数
}
层级对象类型说明
ControllerDTO(请求/响应对象)屏蔽Entity细节,保证接口安全
ServiceEntity、DTO、VO内部处理使用Entity,返回VO
MapperEntity、Query对象直接与数据库表结构对应

🔍 功能实现详解

🎯 注册

🧩 Controller 层

请求路径:/user/register
请求方式:POST
接口描述:该接口用于注册新用户

@PostMapping("/register")
public Result register(@Validated RegisterOrLoginDTO dto) {return userService.register(dto.getUsername(), dto.getPassword());
}

🧩 Service 层

  • 接口
// 根据用户名查询用户
User findByUsername(String username);// 注册
Result register(String username, String password);
  • 实现
/*** 根据用户名查询用户* * @param username 需要查询的用户名* @return 查询到的用户对象*/
@Override
public User findByUsername(String username) {return userMapper.findByUsername(username);
}
/*** 注册* * @param username 需要注册的用户名* @param password 需要注册的密码* @return 注册结果*/@Overridepublic Result register(String username, String password) {User user = findByUsername(username);if (user != null) {return Result.error("用户名已被占用");}userMapper.add(username, Md5Util.getMD5String(password));return Result.success();}

🧩 Mapper 层

// 根据用户名查询用户
@Select("select * from user where username = #{username}")
User findByUsername(String username);

🎯 登录

🧩 Controller 层

请求路径:/user/login
请求方式:POST
接口描述:该接口用于登录

@PostMapping("/login")
public Result login(@Validated RegisterOrLoginDTO dto) {return userService.authenticateUser(dto.getUsername(), dto.getPassword());
}

🧩 Service 层

  • 接口
// 登录验证
Result authenticateUser(String username, String password);
  • 实现
/*** 登录** @param username 用户名* @param password 密码* @return 登录结果*/
@Override
public Result authenticateUser(String username, String password) {User user = findByUsername(username);if (user == null) {return Result.error("用户不存在");}if (Md5Util.getMD5String(password).equals(user.getPassword())) {// 登录成功Map<String, Object> claims = new HashMap<>();claims.put("id", user.getId());claims.put("username", user.getUsername());String token = JwtUtil.genToken(claims);return Result.success(token);}return Result.error("密码错误!");
}

🧩 Mapper 层

// 无

🎯 获取用户详细信息

🧩 Controller 层

请求路径:/user/userInfo
请求方式:GET
接口描述:该接口用于获取当前已登录用户的详细信息

@GetMapping("/userInfo")
public Result<User> getUserInfo() {return userService.getUserInfo();
}

🧩 Service 层

  • 接口
// 获取用户信息
Result<User> getUserInfo();
  • 实现
/*** 获取用户信息** @return 用户信息*/
@Override
public Result<User> getUserInfo() {Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User user = findByUsername(username);return Result.success(user);
}

🧩 Mapper 层

// 无

🎯 更新用户基本信息

🧩 Controller 层

请求路径:/user/update
请求方式:PUT
接口描述:该接口用于更新已登录用户的基本信息(除头像和密码)

@PutMapping("/update")
public Result update(@RequestBody @Validated User user) {return userService.update(user);
}

🧩 Service 层

  • 接口
// 更新
Result update(User user);
  • 实现
/*** 更新用户昵称和邮箱** @param user 用户对象*/
@Override
public Result update(User user) {user.setUpdateTime(LocalDateTime.now());userMapper.update(user);return Result.success();
}

🧩 Mapper 层

// 修改昵称和邮箱
@Update("update user set nickname = #{nickname}, email = #{email}, update_time = #{updateTime} where id = #{id}")
void update(User user);

🎯 更新用户头像

🧩 Controller 层

请求路径:/user/updateAvatar
请求方式:PATCH
接口描述:该接口用于更新已登录用户的头像

@PatchMapping("updateAvatar")
public Result updateAvatar(@RequestParam @URL String avatarUrl) {return userService.updateAvatar(avatarUrl);
}

🧩 Service 层

  • 接口
// 更新头像
Result updateAvatar(String avatarUrl);
  • 实现
/*** 更新用户头像** @param avatarUrl 用户头像地址*/
@Override
public Result updateAvatar(String avatarUrl) {Map<String, Object> map = ThreadLocalUtil.get();Integer id = (Integer) map.get("id");userMapper.updateAvatar(avatarUrl, id);return Result.success();
}

🧩 Mapper 层

// 修改头像
@Update("update user set user_pic = #{avatarUrl}, update_time = now() where id = #{id}")
void updateAvatar(String avatarUrl, Integer id);

🎯 更新用户密码

🧩 Controller 层

请求路径:/user/updatePwd
请求方式:PATCH
接口描述:该接口用于更新已登录用户的密码

@PatchMapping("/updatePwd")
public Result updatePwd(@RequestBody @Validated PwdUpdateDTO dto) {return userService.updatePwd(dto);
}

🧩 Service 层

  • 接口
// 更新密码
Result updatePwd(PwdUpdateDTO dto);
  • 实现
/*** 更新用户密码** @param dto 密码传输对象* @return 更新密码结果*/
@Override
public Result updatePwd(PwdUpdateDTO dto) {// 1.校验参数if (!StringUtils.hasLength(dto.getOldPwd())|| !StringUtils.hasLength(dto.getNewPwd())|| !StringUtils.hasLength(dto.getRePwd())) {return Result.error("缺少必要的参数");}// 2.校验旧密码Map<String, Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User loginUser = findByUsername(username);if (loginUser == null) {return Result.error("用户不存在");}if (!loginUser.getPassword().equals(Md5Util.getMD5String(dto.getOldPwd()))) {return Result.error("旧密码填写错误");}if (!dto.getNewPwd().equals(dto.getRePwd())) {return Result.error("两次密码不一致");}if (loginUser.getPassword().equals(Md5Util.getMD5String(dto.getNewPwd()))) {return Result.error("新密码不能与旧密码相同");}// 3.更新密码userMapper.updatePwd(Md5Util.getMD5String(dto.getNewPwd()), loginUser.getId());return Result.success();
}

🧩 Mapper 层

// 修改密码
@Update("update user set password = #{md5String}, update_time = now() where id = #{id}")
void updatePwd(String md5String, Integer id);
http://www.dtcms.com/wzjs/131889.html

相关文章:

  • 现在怎么做网站美发培训职业学校
  • 男女做污的事情网站2022年适合小学生的新闻
  • 做网站原型的简单工具河南最近的热搜事件
  • 网站建设按什么合同交印花税百度框架户开户渠道
  • 网页设计的工作流程广东短视频seo营销
  • b2b2c系统平台win10必做的优化
  • 自己做网站花多少钱it培训机构排名前十
  • 专业做鞋子的网站媒介星软文平台官网
  • 广西住房和城乡建设厅网站金戈枸橼酸西地那非
  • 自适应网站制作好口碑关键词优化
  • 徐州优化网站建设友情链接有哪些作用
  • 试析媒体网站品牌建设武汉seo排名扣费
  • 通辽市住房和城乡建设委员会网站it培训机构推荐
  • 建立公司官网seo为什么要进行外部优化
  • 动态网站建设包括哪些方面同城推广引流平台
  • 电子商务网站经营特色分析的主要内容包括软件开发
  • 电商网站的程序有哪些搜索引擎广告投放
  • 网站html优化app软件开发
  • 网站301设置优化关键词的公司
  • 网站内链怎么做更好百度统计代码
  • 建设网站企业注册人员廊坊网站设计
  • 网站怎么推广效果好简单网页设计模板html
  • 安贞做网站公司安卓优化大师官网下载
  • 网站如何集成微信支付中国关键词网站
  • 营销型网站建设解决方案免费的建站平台
  • 上线了做网站怎么查看厦门seo全网营销
  • 广告联盟网站怎么做电商大数据查询平台
  • 网站建设评比办法黑龙江最新疫情通报
  • 龙华做棋牌网站建设哪家便宜推广网站文案
  • index.html网站怎么做营销与销售的区别