电商后台管理系统

我要开发同款
居右连2023年08月02日
108阅读
所属分类电商运维

作品详情

异常处理
Spring为了整合全局异常的处理(不用在每个方法下捕获或者抛出异常从而达到处理异常的机制),开发了如下注解:

@RestControllerAdvice 定义全局异常的处理类 返回值JSON串
@ExceptionHandler 标识拦截的异常的类型,如果类型匹配,则执行方法
@RestControllerAdvice
public class MyExceptionAdvice {
//写法:1.运行时异常(通用) 2.自定义异常信息 3.拦截所有异常Exception
@ExceptionHandler(RuntimeException.class)
public Object exception(Exception e){
//需求: 如果遇到异常,应该提示用户201/失败信息.
e.printStackTrace();
return SysResult.fail();
}
}
业务返回
满足不同业务需求的返回不同结果,方便前端识别业务执行成功与否,以便执行不同的操作.

@Data
@Accessors(chain = true)
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
public class SysResult implements Serializable {//实现接口是一种规范性写法
private Integer status;//状态码信息200 201
private String msg;//服务器返回的提示信息
private Object data;//返回的业务数据,不清楚是什么类型,就用object
//为了用户使用VO对象更加的方便,重载一些方法,简化程序的调用
public static SysResult fail(){
return new SysResult(201,"业务执行失败",null);
}
//1.不带参数的正确返回
public static SysResult success(){
return new SysResult(200,"业务执行成功",null);
}
//2.带返回值的正确返回 用户传递什么/返回值就是什么
public static SysResult success(Object data){
return new SysResult(200,"服务器处理成功",data);
}
//3.带返回值,带提示信息
public static SysResult success(String msg, Object data){
return new SysResult(200,msg,data);
}
}
用户登录
登录安全问题(token)
为了防止直接跳转网页,用户登录成功后会返回一个token标识,后续跳转页面时,会监测是否带有token标识,有则可以跳转,没有则不能执行相关业务.若后续关闭系统则需要重新登录并获取token标识.

业务实现
业务需求文档
需求:检测用户登录操作
URL: /login
请求类型: Post请求
接收参数: User对象
返回值: Sysresult对象
Controller层:

//检测用户登录操作
@PostMapping("/login")
public SysResult login(@RequestBody User user){
System.out.println(user);
//token用于用户名和密码的校验,防止直接跳转网页
//token 有值则业务正确 null 业务操作失败
String token = userService.login(user);
if (token == null){
return SysResult.fail();
}
return SysResult.success(token);
}
Service层:

public String login(User user) {
String password = user.getPassword();//明文密码,需要加密,利用DigestUtils
//byte[] passByte = password.getBytes();
String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());
//根据用户名和密文查询数据库
//根据对象中不为null的属性充当where条件
user.setPassword(md5Pass);
QueryWrapper qw = new QueryWrapper(user);
User userDB = userMapper.selectOne(qw);
//查询结果是否有效
if (userDB == null){//用户名密码错误 返回null
return null;
}
//用户名密码均正确 返回一个独一无二的token 利用UUID
return UUID.randomUUID().toString()
.replace("-", "");
}

用户管理
用户列表
列表分页
需求:分页查询用户列表信息
URL:/list?query,pagenum,pagesize
请求类型:get
接收参数:PageResult对象
返回值:SysResult
Controller层:

/**
* 获取用户列表信息
* 参数:PageResult对象进行接收 传递3个参数
* 返回值:SysResult对象 参数(PageResult对象) 返回5个参数
* 我们想要的数据封装在sysResult对象的data属性里,data属性也即PageResult对象,
* 前端再根据需要,从data属性里面抽取需要的数据
*/
@GetMapping("/list")
public SysResult getUserList(PageResult pageResult){
return SysResult.success(userService.getUserList(pageResult));
}
Service层:

public PageResult getUserList(PageResult pageResult){
//参数1: page分页对象
Page page = new Page(pageResult.getPageNum(),pageResult.getPageSize());
//参数2:分页的查询条件 username模糊查询 注意bug:如果用户没有传递query,模糊查询一样拼接,与理想不符
QueryWrapper qw = new QueryWrapper();
boolean flag = StringUtils.hasLength(pageResult.getQuery());
qw.like(flag,"username",pageResult.getQuery());
//page 原本两个参数 根据分页查询返回 total/分页后的记录records 4个参数
page = userMapper.selectPage(page, qw);

List userList = page.getRecords();
long total = page.getTotal();
System.out.println(total);

return pageResult.setTotal(total).setRows(userList);
}

商品管理
商品列表
列表分页
需求:分页查询商品
URL:/item/getItemList?query,pagenum,pagesize
请求类型:get
接收参数:PageResult对象
返回值:Sysresult
Controller层:

@GetMapping("/getItemList")
public SysResult getItemList(PageResult pageResult){
pageResult = itemService.getItemList(pageResult);
return SysResult.success(pageResult);
}
Service层:

public PageResult getItemList(PageResult pageResult) {
Page page = new Page(pageResult.getPageNum(),pageResult.getPageSize());
QueryWrapper qw = new QueryWrapper();
//query有值才拼接
boolean flag = StringUtils.hasLength(pageResult.getQuery());
qw.like(flag, "title", pageResult.getQuery());
page = itemMapper.selectPage(page, qw);
return pageResult.setTotal(page.getTotal()).setRows(page.getRecords());
}
商品分类
查询商品等级分类信息
需求:按照商品的level等级,查询出对应等级的商品分类信息
URL:/itemCat/findItemCatList/{level}
请求类型:get
接收参数:level
返回值:SysResult对象
Controller层:

@GetMapping("/findItemCatList/{level}")
public SysResult findItemCatList(@PathVariable Integer level){
List itemCatList = itemCatService.findItemCatList(level);
return SysResult.success(itemCatList);
}
Service层:

方式1:利用map集合封装所有的父子级关系

public List findItemCatList(Integer level) {
long start = System.currentTimeMillis();
//map集合封装的是所有父子级关系
Map map = initMap();
//只获取一级,即parend_id=0
if (level == 1) return map.get(0);
//获取二级 1/2
if (level == 2) return getLevel2List(map);
//获取1/2/3级
else return getLevel3List(map);
}
/**
* 1.封装Map集合 Map
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论