提交 ab9d570f 编写于 作者: 寒風冷度夜雨's avatar 寒風冷度夜雨 🈴

message:宠物商城项目

desc:商品模块
author:王荣力
time:20230919
上级 669cf6d5
......@@ -17,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* <p>
* 商品表 前端控制器
......@@ -26,7 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
* @since 2023-09-19
*/
@RestController
@RequestMapping("/api/pet-product")
@RequestMapping(value = "/api/pet-product",produces = "application/json;charset=UTF-8")
public class PetProductController {
@Autowired
......@@ -39,13 +41,13 @@ public class PetProductController {
* @return 商品id
*/
@PostMapping("/create")
public JsonResponse create(@RequestBody ProductSaveDTO productSaveDTO) {
public JsonResponse create(@RequestBody ProductSaveDTO productSaveDTO, HttpServletRequest request) {
try {
String id = "";
if (productSaveDTO.getProductId() == null) {
id = petProductService.create(productSaveDTO);
id = petProductService.create(productSaveDTO,request);
} else {
id = petProductService.update(productSaveDTO);
id = petProductService.update(productSaveDTO,request);
}
return JsonResponse.ok(id);
} catch (Exception e) {
......
......@@ -8,6 +8,8 @@ import cn.youle.pet.shop.pojo.vo.product.ProductDetailVO;
import cn.youle.pet.shop.pojo.vo.product.ProductListVO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
/**
* <p>
* 商品表 服务类
......@@ -24,7 +26,7 @@ public interface IPetProductService extends IService<PetProduct> {
* @param productSaveDTO 前端输入
* @return 商品id
*/
String create(ProductSaveDTO productSaveDTO);
String create(ProductSaveDTO productSaveDTO, HttpServletRequest request);
/**
* 修改商品
......@@ -32,7 +34,7 @@ public interface IPetProductService extends IService<PetProduct> {
* @param productSaveDTO 前端输入
* @return 商品id
*/
String update(ProductSaveDTO productSaveDTO);
String update(ProductSaveDTO productSaveDTO, HttpServletRequest request);
/**
* 查询商品详情
......
......@@ -19,6 +19,9 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......@@ -139,6 +142,10 @@ public class PetAdminsServiceImpl extends ServiceImpl<PetAdminsMapper, PetAdmins
BeanUtils.copyProperties(tokenVO,loginResVO);
loginResVO.setJwt(token);
// Subject subject = SecurityUtils.getSubject();
// AuthenticationToken authenticationToken = new JWTToken(token);
// subject.login(authenticationToken);
log.info("登录成功,返回前端:" + JSON.toJSONString(loginResVO));
return loginResVO;
}
......
......@@ -14,6 +14,7 @@ import cn.youle.pet.shop.pojo.vo.product.ProductListVO;
import cn.youle.pet.shop.service.IPetProductService;
import cn.youle.pet.shop.shiro.auth.TokenVO;
import cn.youle.pet.shop.utils.GetUserInfoUtils;
import cn.youle.pet.shop.utils.JWTUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -25,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -52,7 +54,7 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
* @return 商品id
*/
@Override
public String create(ProductSaveDTO productSaveDTO) {
public String create(ProductSaveDTO productSaveDTO, HttpServletRequest request) {
log.info("=========================开始添加商品获取前端输入:{}=========================", JSON.toJSONString(productSaveDTO));
if (productSaveDTO == null) {
log.error("@@@@@@@@@@@@@@@@@@@@@前端输入为空@@@@@@@@@@@@@@@@@@@@@");
......@@ -61,8 +63,8 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
long snowflakeNextId = IdUtil.getSnowflakeNextId();
PetProduct petProduct = new PetProduct();
BeanUtils.copyProperties(productSaveDTO,petProduct);
TokenVO userInfo = getUserInfo();
BeanUtils.copyProperties(productSaveDTO, petProduct);
TokenVO userInfo = getUserInfo(request);
petProduct.setId(snowflakeNextId);
petProduct.setCreatedBy(userInfo.getName());
petProduct.setCreatedTime(LocalDateTimeUtil.now());
......@@ -84,11 +86,11 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
* @return 商品id
*/
@Override
public String update(ProductSaveDTO productSaveDTO) {
public String update(ProductSaveDTO productSaveDTO, HttpServletRequest request) {
log.info("=========================开始更新商品获取前端输入:{}=========================", JSON.toJSONString(productSaveDTO));
PetProduct petProduct = checkProduct(productSaveDTO.getProductId());
BeanUtils.copyProperties(productSaveDTO,petProduct);
TokenVO userInfo = getUserInfo();
BeanUtils.copyProperties(productSaveDTO, petProduct);
TokenVO userInfo = getUserInfo(request);
petProduct.setUpdatedBy(userInfo.getName());
petProduct.setUpdatedTime(LocalDateTimeUtil.now());
......@@ -99,13 +101,13 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
return petProduct.getId() + "";
}
private PetProduct checkProduct(Long id){
if(id == null){
private PetProduct checkProduct(Long id) {
if (id == null) {
log.error("@@@@@@@@@@@@@@@@@@@@@id为空@@@@@@@@@@@@@@@@@@@@@");
throw new PetShopException("没有对应的商品编码");
}
PetProduct petProduct = petProductMapper.selectById(id);
if(petProduct == null){
if (petProduct == null) {
log.error("@@@@@@@@@@@@@@@@@@@@@没有对应的商品@@@@@@@@@@@@@@@@@@@@@");
throw new PetShopException("没有对应的商品");
}
......@@ -123,9 +125,9 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
log.info("=========================开始查询商品详情获取前端输入:{}=========================", JSON.toJSONString(productDetailDTO));
PetProduct petProduct = checkProduct(productDetailDTO.getId());
ProductDetailVO productDetailVO = new ProductDetailVO();
BeanUtils.copyProperties(petProduct,productDetailVO);
BeanUtils.copyProperties(petProduct, productDetailVO);
log.info("=========================查询商品详情成功,即将返回:{}=========================",JSON.toJSONString(productDetailVO));
log.info("=========================查询商品详情成功,即将返回:{}=========================", JSON.toJSONString(productDetailVO));
return productDetailVO;
}
......@@ -141,7 +143,7 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
log.info("=========================开始查询商品列表获取前端输入:{}=========================", JSON.toJSONString(productListDTO));
ProductListVO productListVO = new ProductListVO();
List<PetProduct> petProducts = petProductMapper.selectByListDto(productListDTO);
if(CollectionUtils.isEmpty(petProducts)){
if (CollectionUtils.isEmpty(petProducts)) {
log.error("@@@@@@@@@@@@@@@@@@@@@没有对应的数据@@@@@@@@@@@@@@@@@@@@@");
throw new PetShopException("没有对应的数据");
}
......@@ -151,7 +153,7 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
List<ProductDetailVO> productDetailVOList = new ArrayList<>();
for (PetProduct petProduct : collect) {
ProductDetailVO productDetailVO = new ProductDetailVO();
BeanUtils.copyProperties(petProduct,productDetailVO);
BeanUtils.copyProperties(petProduct, productDetailVO);
productDetailVOList.add(productDetailVO);
}
......@@ -159,7 +161,7 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
productListVO.setProductDetailVOList(productDetailVOList);
productListVO.setCurrentPage(productListDTO.getCurrentPage());
productListVO.setPageSize(productListDTO.getPageSize());
log.info("=========================查询商品列表成功,即将返回:{}=========================",JSON.toJSONString(productListDTO));
log.info("=========================查询商品列表成功,即将返回:{}=========================", JSON.toJSONString(productListDTO));
return productListVO;
}
......@@ -172,7 +174,7 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
*/
@Override
public int delete(ProductDetailDTO productDetailDTO) {
log.info("===============准备开始删除获取前端输入:{}===============",JSON.toJSONString(productDetailDTO));
log.info("===============准备开始删除获取前端输入:{}===============", JSON.toJSONString(productDetailDTO));
PetProduct petProduct = checkProduct(productDetailDTO.getId());
TokenVO userInfo = GetUserInfoUtils.getUserInfo();
......@@ -197,10 +199,23 @@ public class PetProductServiceImpl extends ServiceImpl<PetProductMapper, PetProd
log.info("=========================开始更新商品状态获取前端输入:{}=========================", JSON.toJSONString(productDetailDTO));
}
private TokenVO getUserInfo(){
Subject subject = SecurityUtils.getSubject();
TokenVO tokenVO = (TokenVO) subject.getPrincipal();
if(tokenVO == null){
/**
* 发送验证码
*
* @return
*/
private String sendMessage() {
return null;
}
private TokenVO getUserInfo(HttpServletRequest request) {
String authorization = request.getHeader("Authorization");
TokenVO tokenVO = JWTUtil.parseToken(authorization);
// Subject subject = SecurityUtils.getSubject();
// log.info("获取登录信息:{}",subject);
// log.info("获取登录后信息:{}",subject.getPrincipal());
// TokenVO tokenVO = (TokenVO) subject.getPrincipal();
if (tokenVO == null) {
throw new PetShopException("请先登录");
}
return tokenVO;
......
package cn.youle.pet.shop.shiro;
import cn.youle.pet.shop.shiro.auth.ResultVO;
import cn.youle.pet.shop.utils.JWTToken;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.Filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class JwtFilter extends BasicHttpAuthenticationFilter implements Filter {
/**
* 执行登录
* @param request
* @param response
* @return
* @throws Exception
*/
@Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String token = httpServletRequest.getHeader("Authorization");
JWTToken jwtToken = new JWTToken(token);
// 提交给realm进行登入,如果错误他会抛出异常并被捕获
try {
getSubject(request, response).login(jwtToken);
// 如果没有抛出异常则代表登入成功,返回true
return true;
} catch (AuthenticationException e) {
//SerializerFeature.WriteMapNullValue为了null属性也输出json的键值对
HttpServletResponse res = (HttpServletResponse) response;
Object o = JSONObject.toJSONString(new ResultVO().setMsg("无访问权限,原因是:" + e.getMessage()).setCode(401),
SerializerFeature.WriteMapNullValue);
res.setStatus(401);
res.setCharacterEncoding("utf-8");
res.getWriter().print(o);
return false;
}
}
/**
* 执行登录认证
*
* @param request
* @param response
* @param mappedValue
* @return
*/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
try {
return executeLogin(request, response);
} catch (Exception e) {
log.error("JwtFilter过滤验证失败!");
return false;
}
}
/**
* 对跨域提供支持
* @param request
* @param response
* @return
* @throws Exception
*/
@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
// 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
httpServletResponse.setStatus(HttpStatus.OK.value());
return false;
}
return super.preHandle(request, response);
}
}
......@@ -4,6 +4,7 @@ import cn.youle.pet.shop.exception.PetShopException;
import cn.youle.pet.shop.mapper.*;
import cn.youle.pet.shop.pojo.entity.*;
import cn.youle.pet.shop.shiro.auth.TokenVO;
import cn.youle.pet.shop.utils.JWTToken;
import cn.youle.pet.shop.utils.JWTUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
......@@ -50,6 +51,11 @@ public class MyRealm extends AuthorizingRealm {
@Autowired
private PetRolePermissionMapper petRolePermissionMapper;
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof JWTToken;
}
/**
* 授权
*
......@@ -116,8 +122,8 @@ public class MyRealm extends AuthorizingRealm {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
log.info("==================授权成功==================");
info.addStringPermissions(permissions);
info.addRoles(roles);
// info.addStringPermissions(permissions);
// info.addRoles(roles);
return info;
}
......@@ -130,24 +136,27 @@ public class MyRealm extends AuthorizingRealm {
log.info("==================开始认证==================");
if (authenticationToken == null) {
// 报错
throw new PetShopException("没有需要认证的数据");
throw new AuthenticationException("没有需要认证的数据");
}
log.info("用户输入的内容:{},{}",authenticationToken.getCredentials(),authenticationToken.getPrincipal());
String token = (String) authenticationToken.getCredentials();
if (token == null) {
throw new AuthenticationException("token为空");
}
// 解析token
TokenVO tokenVO = JWTUtil.parseToken(token);
if (tokenVO == null) {
throw new PetShopException("解析token出错");
throw new AuthenticationException("解析token出错");
}
// 解密获取username,用于和数据库进行对比
String count = tokenVO.getCount();
List<PetAdmins> petAdmins = petAdminsMapper.selectList(new LambdaQueryWrapper<PetAdmins>().eq(PetAdmins::getCount, count));
if (CollectionUtils.isEmpty(petAdmins)) {
// 报错
throw new PetShopException("没有该用户");
throw new AuthenticationException("没有该用户");
}
PetAdmins admins = petAdmins.get(0);
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(admins.getName(), admins.getPassword(), getName());
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(tokenVO, token, getName());
log.info("==================认证成功==================");
return info;
......
......@@ -3,11 +3,13 @@ package cn.youle.pet.shop.shiro;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;
......@@ -33,11 +35,18 @@ public class ShiroConfig {
map.put("/api/pet-admins/login","anon");
map.put("/api/pet-admins/register","anon");
map.put("/api/pet-admins/checkLogin","anon");
map.put("/api/pet-product/*","authc");
map.put("/api/pet-product/*","anon");
map.put("/common/upload","anon");
map.put("/common/download","anon");
// Map<String, Filter> filterMap = new LinkedHashMap<>();
// filterMap.put("authc",new FormAuthenticationFilter());
// filterMap.put("jwt",new JwtFilter());
// shiroFilterFactoryBean.setFilters(filterMap);
// 对所有用户认证
map.put("/**","authc");
// map.put("/api/**","jwt");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
......
package cn.youle.pet.shop.shiro.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@Accessors(chain = true)
public class ResultVO<T> {
private Integer code;
private String msg;
private T data;
public ResultVO(){
}
public ResultVO(int code, String msg, T obj){
this.code = code;
this.msg = msg;
this.data = obj;
}
}
......@@ -68,6 +68,7 @@ public class JWTUtil {
* @return
*/
public static TokenVO parseToken(String jwt) {
log.info("获取的token数据:{}",jwt);
TokenVO tokenVO = new TokenVO();
try {
Claims body = Jwts.parser().setSigningKey(KEY).parseClaimsJws(jwt).getBody();
......
spring.datasource.url=jdbc:mysql://localhost:3306/pets?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
logging.level.cn.youle.pet.shop=trace
......
......@@ -9,3 +9,8 @@ mybatis-plus.mapper-locations=classpath:/mapper/*.xml
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
spring.datasource.url=jdbc:mysql://localhost:3306/pets?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册