电商生鲜网站开发(二)——后台开发:用户模块
电商生鲜网站开发(二)——后台开发:用户模块
文章目录
- 电商生鲜网站开发(二)——后台开发:用户模块
- 接口设计
- 开发任务与知识点
- 案例:注册接口
- 统一处理异常
- Java异常体系
- 案例:登录接口
接口设计
https://blog.csdn.net/a2272062968/article/details/123385857
开发任务与知识点
登录
注册
重名校验
@Overridepublic void register(String userName, String password) throws MallException, NoSuchAlgorithmException {//查询用户名是否已存在User result = userMapper.selectByName(userName);if (result != null) {throw new MallException(MallExceptionEnum.NAME_EXISTED);}//写入数据库User user = new User();user.setUsername(userName);
// user.setPassword(password);user.setPassword(MD5Utils.getMD5Str(password));int count = userMapper.insertSelective(user);if (count == 0) {throw new MallException(MallExceptionEnum.INSERT_FAILED);}}
密码加密存储
MD5加密类
package com.learn2333.freshmall.util;import com.learn2333.freshmall.common.Constant;
import org.apache.tomcat.util.codec.binary.Base64;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** MD5工具*/
public class MD5Utils {public static String getMD5Str(String strValue) throws NoSuchAlgorithmException {MessageDigest md5 = MessageDigest.getInstance("MD5");return Base64.encodeBase64String(md5.digest((strValue+ Constant.SALT).getBytes()));}
}
Session的使用(保存登录信息)用户控制层,登录时增加用户对象(抹除密码信息),退出时清空用户对象
越权交验(没有登录不能修改、只能修改自己用户的)
统一响应对象
package com.learn2333.freshmall.common;import com.learn2333.freshmall.exception.MallExceptionEnum;/*** 通用返回对象*/
public class ApiRestResponse<T> {//状态码private Integer status;//信息private String msg;//范型的dataprivate T data;//正常的状态码private static final int OK_CODE = 10000;//信息private static final String OK_MSG = "SUCCESS";public ApiRestResponse(Integer status, String msg, T data) {this.status = status;this.msg = msg;this.data = data;}public ApiRestResponse(Integer status, String msg) {this.status = status;this.msg = msg;}public ApiRestResponse() {this(OK_CODE, OK_MSG);}//成功 返回默认状态码(无参构造函数的2个常量)public static <T> ApiRestResponse<T> success() {return new ApiRestResponse<>();}//成功 返回默认状态码和数据public static <T> ApiRestResponse<T> success(T result) {ApiRestResponse<T> response = new ApiRestResponse<>();response.setData(result);return response;}//失败 传入状态码和信息public static <T> ApiRestResponse<T> error(Integer code, String msg) {return new ApiRestResponse<>(code, msg);}//失败 传入定义的异常枚举public static <T> ApiRestResponse<T> error(MallExceptionEnum ex) {return new ApiRestResponse<>(ex.getCode(), ex.getMsg());}@Overridepublic String toString() ...
get,set方法
}
异常枚举
Java异常体系
Postman实操
统一异常处理(使用过滤器)
更新个人信息
另外系统中的常量可定义常量类存储
package com.learn2333.freshmall.common;/*** 常量值*/
public class Constant {//用于加密MD5的盐值public static final String SALT = "https://learn2333.com/666";//session中用户对象的keypublic static final String MALL_USER = "mall_user";
}
案例:注册接口
@PostMapping("/register")
@ResponseBody
public ApiRestResponse register(@RequestParam("userName") String userName,@RequestParam("password") String password)
完成注册接口交验,用户名,密码
如果交验失败返回创建的通用返回对象
通用返回对象类中包含状态码,信息,范型的data,构造方法返回成功状态码,如果失败则可以传入定义的异常枚举
异常枚举中存放着所有异常的状态码和信息
交验通过调用userService中的register注册接口
注册接口实现内容要先查询交验用户名是否为存在,如果存在直接抛出自定义的通用异常即可
自定义的通用异常接收异常枚举,每次要抛出不同的异常信息定义异常枚举传入再抛出即可
如果用户名不存在正常注册
UserMapper中定义selectByName查询用户名,返回user对象
转到mapper.xml书写sql语句
userMapper.insertSelective(user)
方法是插入user中不为空的数据,该方法会返回一个数字代表修改了几条数据
判断如果返回的书==0,则插入失败,抛出自定义的数据插入失败自定义异常类并传入异常枚举
回到控制类,返回自定义的通用返回对象成功ApiRestResponse.success()
(如果此前失败了则不会执行到此,直接被抛出异常了)
使用Postman测试post接口
统一处理异常
目的是对前端结构统一保证安全,因为post请求一个接口如果出现异常可能返回许多不同的参数
抛出异常,直接转化为Json的APIResponse
抛出重名异常
之前的请求返回
统一异常后的返回
GlobalExceptionHandler.java 开发过滤器处理异常
package com.learn2333.freshmall.exception;import com.learn2333.freshmall.common.ApiRestResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;/*** 处理统一异常的handler*/
@ControllerAdvice
public class GlobalExceptionHandler {private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(Exception.class)@ResponseBodypublic Object handleException(Exception e) {log.error("Default Exception: ", e);return ApiRestResponse.error(MallExceptionEnum.SYSTEM_ERROR);}@ExceptionHandler(MallException.class)@ResponseBodypublic Object handleMallException(MallException e) {log.error("MallException: ", e);return ApiRestResponse.error(e.getCode(), e.getMessage());}
}
自定义异常类
package com.learn2333.freshmall.exception;/*** 统一异常*///了解完下面java异常体系后,可知道这里继承可将Exception改为RuntimeException运行时异常,因为这里要抛出的都是我们自定义的异常枚举,这样我们抛出异常的时候就不用再每次都增加方法签名了,而作用上一样的
public class MallException extends RuntimeException {private final Integer code;private final String message;public MallException(Integer code, String msg) {this.code = code;this.message = msg;}public MallException(MallExceptionEnum exceptionEnum) {this(exceptionEnum.getCode(), exceptionEnum.getMsg());}get方法
}
根据程序开发过程需要增加自定义的异常枚举信息来配合异常类抛出
package com.learn2333.freshmall.exception;/*** 异常枚举*/
public enum MallExceptionEnum {NEED_USER_NAME(10001, "用户名不能为空"),NEED_PASSWORD(10002, "密码不能为空"),PASSWORD_TOO_SHORT(10003, "密码长度不能小于8位"),NAME_EXISTED(10004, "注册失败,不允许重名"),INSERT_FAILED(10005, "数据插失败入"),WRONG_PASSWORD(10006, "密码错误"),NEED_LOGIN(10007, "用户未登录"),UPDATE_FAILED(10008, "更新失败"),NEED_ADMIN(10009, "无管理员权限"),SYSTEM_ERROR(20000, "系统异常");Integer code;String msg;MallExceptionEnum(Integer code, String msg) {this.code = code;this.msg = msg;}get,set方法
}
通过统一返回对象类处理抛出的异常枚举信息并返回失败数据
package com.learn2333.freshmall.common;import com.learn2333.freshmall.exception.MallExceptionEnum;/*** 通用返回对象*/
public class ApiRestResponse<T> {//状态码private Integer status;//信息private String msg;//范型的dataprivate T data;//正常的状态码private static final int OK_CODE = 10000;//信息private static final String OK_MSG = "SUCCESS";public ApiRestResponse(Integer status, String msg, T data) {this.status = status;this.msg = msg;this.data = data;}public ApiRestResponse(Integer status, String msg) {this.status = status;this.msg = msg;}public ApiRestResponse() {this(OK_CODE, OK_MSG);}//成功 返回默认状态码(无参构造函数的2个常量)public static <T> ApiRestResponse<T> success() {return new ApiRestResponse<>();}//成功 返回默认状态码和数据public static <T> ApiRestResponse<T> success(T result) {ApiRestResponse<T> response = new ApiRestResponse<>();response.setData(result);return response;}//失败 传入状态码和信息public static <T> ApiRestResponse<T> error(Integer code, String msg) {return new ApiRestResponse<>(code, msg);}//失败 传入定义的异常枚举public static <T> ApiRestResponse<T> error(MallExceptionEnum ex) {return new ApiRestResponse<>(ex.getCode(), ex.getMsg());}@Overridepublic String toString() {get,set;
Java异常体系
案例:登录接口
功能分析
登录状态要保持
session保存用户信息的实现方案
之后的访问,会先从session中获取用户信息,然后在执行业务逻辑
总结:
定义返回统一响应对象ApiRestResponse
登录状态使用session保持
统一异常处理,自定义异常枚举从底层不断向上抛出,使用ApiRestResponse返回异常信息
常见错误:
响应对象不规范(返回参数不一致等)
异常不统一处理,存在安全隐患
电商生鲜网站开发(二)——后台开发:用户模块相关推荐
- 电商生鲜网站开发(三)——后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧
电商生鲜网站开发(三)--后台开发:商品分类模块-Redis/Swagger/统一身份校验/IDEA技巧 分类层级 在商品分类上需要继续做归类操作 分类设置成三级 层级太深的弊端:对用户不友好,不利于 ...
- 电商生鲜网站开发(四)——后台开发:商品模块-图片上传/多条件拼接sql
电商生鲜网站开发(四)--后台开发:商品模块-图片上传/多条件拼接sql 增加商品 上传图片 更新商品 删除商品 批量上下架 图片上传功能 文件名UUID 通用唯一识别码(Universally Un ...
- 电商生鲜网站开发(一)——Spring Boot项目开发准备
本系列内容完成Spring Boot框架的电商生鲜网站开发的完整案例,前后端分离开发的案例,先开发后端接口后开发前端,最后部署等待. Spring Boot项目开发准备 文章目录 Spring Boo ...
- 电商4.0项目【三】: 用户模块(8081)
文章目录 1. 用户模块(8081) 1.1 搭建环境 1.1.1 后端web服务:changgou4-service-web 1.1.2 后端创建JavaBean:User 1.1.3 前端页面:创 ...
- 电商Sass平台-商城运营后台原型-仓储管理-订单管理-店铺运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-流量分析-电商erp后台管理-用户权限-销量分析
axure作品内容介绍:电商Sass平台-商城运营后台原型-仓储管理-订单管理-平台运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-店铺装修-门店管理-商品档案- ...
- 电商购物网站开发需要注意这些问题
在当下的网络营销市场中,电商购物网站之间的竞争还是很激烈的,各行各业的企业纷纷掺入其中,这势必会为当下的营销市场带来混乱且持久的战役.而在如此激烈的购物网站市场竞争中,如果想要做出改变就要懂得购物网站 ...
- 常见的社交电商有哪些类型?如何开发社交零售电商平台?
电子商务在我国已经走过20余年,如今,商家获客难.获客成本高是电商人共同的难题,在这种电商饱和的状态下,电商逐步进入社交经济以此来推动电商行业发展. 一.社交电商是什么? 大家都在说社交电商,顾名思义 ...
- weui移动商城源码.zip_商城网站建设二次开发需要多久?难度大吗?
很多人在早期建设了当时较为流行的商城网站进行使用,但随着市场的变化以及消费者年龄层的变化,以往的商城形式已经不能帮助商家获得新用户了,这时就需要商家将网站进行二次开发或是重新建设网站.那今天就来看看, ...
- 现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售
终于发售了,啥也不想说了,喜欢的或需要的就点击 链接 进去购买吧. 另外此书将作为 2017 PHP全球开发者大会 现场活动用书 天猫购书 包邮 PHP7实践指南:O2O网站与App后台开发 数据库设 ...
最新文章
- keepalived mysql集群_keepalived + Mysql(主主)实现高可用集群
- IDEA不认识jstl
- procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介
- logo语言是计算机语言吗,什么是LOGO语言?
- 操作系统的功能、作用、分类
- 算法 图4 哈利·波特的考试
- ?username=王二麻子age=18转换成对象?
- Android9 更改系统默认输入法
- 2021钳工技能高考成绩查询,这里有2021钳工时间和报名费用以及流程
- centOS7 防火墙关闭 远程端口无法访问问题
- C#链接SQL知识点
- multiple definition of...
- java integer long 转换_long(Long)与int(Integer)之间的转换
- 联邦学习 Federated Learning 相关资料整理
- sleep的睡眠机制
- 【人工智能实验】卷积神经网络CNN框架的实现与应用-手写数字识别
- 当企业服务总线遇到云服务
- 音乐类APP开发强化社交属性,行业前景被看好
- 物体围绕某个点旋转一定角度
- android万能播放器,Android万能视频播放器05-音视频同步
热门文章
- 天气显示服务器不可用,Windows7系统小工具天气不显示提示所在的地区无法使用服务...
- TI DSP系列分类
- 国产单片机GD32系列开坑,带你零死角玩转GD32 第五章
- c语言程序设计理论考试,《C语言程序设计》理论试题库-程序题100例
- python应用seo_Python有助于学习SEO吗?
- BottomNavigationBar(Materia-Design风格)
- ShellNet:Efficient Point Cloud Convolutional Neural Networks using Concentric Shells Statics
- NSIS制作安装包软件
- [转载]苹果公司与分工原理
- 记录第一个360浏览器翻译插件