From ad399295c16835dc01e5fddfe2e88f772a2318a8 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Sun, 24 Aug 2025 15:57:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A6=E8=BE=86=E6=8A=A5?= =?UTF-8?q?=E6=8D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sczx/car/controller/CarController.java | 11 ++- .../java/com/sczx/car/dto/CarDamageReq.java | 19 ++++ .../com/sczx/car/dto/SimpleUserInfoDTO.java | 38 ++++++++ .../com/sczx/car/mapper/CarDamageMapper.java | 16 ++++ .../java/com/sczx/car/po/CarDamagePO.java | 91 +++++++++++++++++++ .../sczx/car/repository/CarDamageRepo.java | 16 ++++ .../repository/impl/CarDamageRepoImpl.java | 20 ++++ .../java/com/sczx/car/service/CarService.java | 8 +- .../sczx/car/service/impl/CarServiceImpl.java | 29 ++++++ src/main/java/com/sczx/car/util/JwtUtil.java | 68 +++++++++++++- src/main/resources/mapper/CarDamageMapper.xml | 5 + 11 files changed, 313 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/sczx/car/dto/CarDamageReq.java create mode 100644 src/main/java/com/sczx/car/dto/SimpleUserInfoDTO.java create mode 100644 src/main/java/com/sczx/car/mapper/CarDamageMapper.java create mode 100644 src/main/java/com/sczx/car/po/CarDamagePO.java create mode 100644 src/main/java/com/sczx/car/repository/CarDamageRepo.java create mode 100644 src/main/java/com/sczx/car/repository/impl/CarDamageRepoImpl.java create mode 100644 src/main/resources/mapper/CarDamageMapper.xml diff --git a/src/main/java/com/sczx/car/controller/CarController.java b/src/main/java/com/sczx/car/controller/CarController.java index 44eec0f..1e37a63 100644 --- a/src/main/java/com/sczx/car/controller/CarController.java +++ b/src/main/java/com/sczx/car/controller/CarController.java @@ -3,13 +3,11 @@ package com.sczx.car.controller; import com.sczx.car.common.Result; import com.sczx.car.dto.CarDTO; -import com.sczx.car.dto.RentCarRuleDTO; +import com.sczx.car.dto.CarDamageReq; import com.sczx.car.dto.req.CarQueryConditionReq; import com.sczx.car.service.CarService; -import com.sczx.car.service.RentCarRuleService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -42,4 +40,11 @@ public class CarController { public Result countCarByStoreId(@RequestParam(name = "storeId") Long storeId){ return Result.ok(carService.countCarByStoreId(storeId)); } + + @ApiOperation(value = "车辆报损") + @PostMapping("/carDamage") + public Result carDamage(@RequestBody CarDamageReq req){ + carService.carDamage(req); + return Result.ok(true); + } } diff --git a/src/main/java/com/sczx/car/dto/CarDamageReq.java b/src/main/java/com/sczx/car/dto/CarDamageReq.java new file mode 100644 index 0000000..2895bbf --- /dev/null +++ b/src/main/java/com/sczx/car/dto/CarDamageReq.java @@ -0,0 +1,19 @@ +package com.sczx.car.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "车辆报损请求", description = "车辆报损请求") +@Data +public class CarDamageReq { + @ApiModelProperty("关联车辆ID,外键关联zc_car表") + private Long carId; + + @ApiModelProperty("报损类型") + private String damageType; + + @ApiModelProperty("报损原因") + private String damageReason; + +} diff --git a/src/main/java/com/sczx/car/dto/SimpleUserInfoDTO.java b/src/main/java/com/sczx/car/dto/SimpleUserInfoDTO.java new file mode 100644 index 0000000..38d7855 --- /dev/null +++ b/src/main/java/com/sczx/car/dto/SimpleUserInfoDTO.java @@ -0,0 +1,38 @@ +package com.sczx.car.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "基本用户信息") +@Data +public class SimpleUserInfoDTO { + + @ApiModelProperty(value = "用户id") + private Integer userId; + + @ApiModelProperty(value = "用户姓名") + private String userName; + + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + @ApiModelProperty(value = "角色id") + private Integer roleId; + + @ApiModelProperty(value = "小程序类型") + private String miniProgramType; + + @ApiModelProperty("头像") + private String avatarUrl; + + @ApiModelProperty("微信小程序 openid") + private String wechatOpenid; + + @ApiModelProperty("支付宝小程序 userid") + private String alipayUserid; + + @ApiModelProperty("是否认证0未认证1已认证") + private Integer authed; + +} diff --git a/src/main/java/com/sczx/car/mapper/CarDamageMapper.java b/src/main/java/com/sczx/car/mapper/CarDamageMapper.java new file mode 100644 index 0000000..6809dbf --- /dev/null +++ b/src/main/java/com/sczx/car/mapper/CarDamageMapper.java @@ -0,0 +1,16 @@ +package com.sczx.car.mapper; + +import com.sczx.car.po.CarDamagePO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 车辆报损记录表 Mapper 接口 + *

+ * + * @author zhangli + * @since 2025-08-24 15:40:46 + */ +public interface CarDamageMapper extends BaseMapper { + +} diff --git a/src/main/java/com/sczx/car/po/CarDamagePO.java b/src/main/java/com/sczx/car/po/CarDamagePO.java new file mode 100644 index 0000000..acfa66c --- /dev/null +++ b/src/main/java/com/sczx/car/po/CarDamagePO.java @@ -0,0 +1,91 @@ +package com.sczx.car.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 车辆报损记录表 + *

+ * + * @author zhangli + * @since 2025-08-24 15:40:46 + */ +@Getter +@Setter +@TableName("zc_car_damage") +@ApiModel(value = "CarDamagePO对象", description = "车辆报损记录表") +public class CarDamagePO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("报损记录ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("关联车辆ID,外键关联zc_car表") + private Long carId; + + @ApiModelProperty("报损类型") + private String damageType; + + @ApiModelProperty("报损原因") + private String damageReason; + + @ApiModelProperty("报损提交人姓名") + private String submitterName; + + @ApiModelProperty("报损提交时间") + private LocalDateTime submitTime; + + @ApiModelProperty("报损状态(0:待审核,1:审核通过,2:审核不通过,3:已处理)") + private Integer damageStatus; + + @ApiModelProperty("审核人姓名") + private String auditorName; + + @ApiModelProperty("审核时间") + private LocalDateTime auditTime; + + @ApiModelProperty("审核意见") + private String auditComment; + + @ApiModelProperty("状态(0正常 1停用)") + private String status; + + @ApiModelProperty("删除标志(0代表存在 2代表删除)") + private String delFlag; + + @ApiModelProperty("创建者") + private String createBy; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新者") + private String updateBy; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("备注信息") + private String remark; + + @ApiModelProperty("扩展字段1") + private String extend1; + + @ApiModelProperty("扩展字段2") + private String extend2; + + @ApiModelProperty("扩展字段3") + private String extend3; + + +} diff --git a/src/main/java/com/sczx/car/repository/CarDamageRepo.java b/src/main/java/com/sczx/car/repository/CarDamageRepo.java new file mode 100644 index 0000000..3976ba4 --- /dev/null +++ b/src/main/java/com/sczx/car/repository/CarDamageRepo.java @@ -0,0 +1,16 @@ +package com.sczx.car.repository; + +import com.sczx.car.po.CarDamagePO; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 车辆报损记录表 服务类 + *

+ * + * @author zhangli + * @since 2025-08-24 15:40:46 + */ +public interface CarDamageRepo extends IService { + +} diff --git a/src/main/java/com/sczx/car/repository/impl/CarDamageRepoImpl.java b/src/main/java/com/sczx/car/repository/impl/CarDamageRepoImpl.java new file mode 100644 index 0000000..f36d0bb --- /dev/null +++ b/src/main/java/com/sczx/car/repository/impl/CarDamageRepoImpl.java @@ -0,0 +1,20 @@ +package com.sczx.car.repository.impl; + +import com.sczx.car.po.CarDamagePO; +import com.sczx.car.mapper.CarDamageMapper; +import com.sczx.car.repository.CarDamageRepo; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 车辆报损记录表 服务实现类 + *

+ * + * @author zhangli + * @since 2025-08-24 15:40:46 + */ +@Service +public class CarDamageRepoImpl extends ServiceImpl implements CarDamageRepo { + +} diff --git a/src/main/java/com/sczx/car/service/CarService.java b/src/main/java/com/sczx/car/service/CarService.java index 2ca3f06..3a797a5 100644 --- a/src/main/java/com/sczx/car/service/CarService.java +++ b/src/main/java/com/sczx/car/service/CarService.java @@ -1,8 +1,8 @@ package com.sczx.car.service; import com.sczx.car.dto.CarDTO; +import com.sczx.car.dto.CarDamageReq; import com.sczx.car.dto.req.CarQueryConditionReq; -import com.sczx.car.po.CarPO; /** * @Author: 张黎 @@ -23,4 +23,10 @@ public interface CarService { * @return */ Long countCarByStoreId(Long storeId); + + /** + * 车辆报损 + * @param req + */ + void carDamage(CarDamageReq req); } diff --git a/src/main/java/com/sczx/car/service/impl/CarServiceImpl.java b/src/main/java/com/sczx/car/service/impl/CarServiceImpl.java index bdb9da4..d52ff07 100644 --- a/src/main/java/com/sczx/car/service/impl/CarServiceImpl.java +++ b/src/main/java/com/sczx/car/service/impl/CarServiceImpl.java @@ -3,14 +3,21 @@ package com.sczx.car.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.sczx.car.convert.CarConvert; import com.sczx.car.dto.CarDTO; +import com.sczx.car.dto.CarDamageReq; +import com.sczx.car.dto.SimpleUserInfoDTO; import com.sczx.car.dto.req.CarQueryConditionReq; +import com.sczx.car.exception.BizException; +import com.sczx.car.po.CarDamagePO; import com.sczx.car.po.CarPO; +import com.sczx.car.repository.CarDamageRepo; import com.sczx.car.repository.CarRepo; import com.sczx.car.service.CarService; +import com.sczx.car.util.JwtUtil; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Objects; /** @@ -23,6 +30,12 @@ public class CarServiceImpl implements CarService { @Autowired private CarRepo carRepo; + + @Autowired + private CarDamageRepo carDamageRepo; + + @Autowired + private JwtUtil jwtUtil; @Override public CarDTO getCarByCondition(CarQueryConditionReq req) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -40,4 +53,20 @@ public class CarServiceImpl implements CarService { public Long countCarByStoreId(Long storeId) { return carRepo.count(new LambdaQueryWrapper().eq(CarPO::getStoreId, storeId)); } + + @Override + public void carDamage(CarDamageReq req) { + SimpleUserInfoDTO userInfoDTO = jwtUtil.getUserInfoFromToken(); + CarPO carPO = carRepo.getById(req.getCarId()); + if (carPO == null) { + throw new BizException("车辆不存在"); + } + CarDamagePO carDamagePO = new CarDamagePO(); + carDamagePO.setCarId(req.getCarId()); + carDamagePO.setDamageType(req.getDamageType()); + carDamagePO.setDamageReason(req.getDamageReason()); + carDamagePO.setSubmitterName(userInfoDTO.getUserName()); + carDamagePO.setSubmitTime(LocalDateTime.now()); + carDamageRepo.save(carDamagePO); + } } diff --git a/src/main/java/com/sczx/car/util/JwtUtil.java b/src/main/java/com/sczx/car/util/JwtUtil.java index fca4f0c..28e1fdd 100644 --- a/src/main/java/com/sczx/car/util/JwtUtil.java +++ b/src/main/java/com/sczx/car/util/JwtUtil.java @@ -1,5 +1,8 @@ package com.sczx.car.util; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; +import com.sczx.car.dto.SimpleUserInfoDTO; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @@ -7,9 +10,13 @@ import io.jsonwebtoken.security.Keys; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import javax.crypto.SecretKey; +import javax.servlet.http.HttpServletRequest; import java.util.Date; +import java.util.Map; /** * @Author: 张黎 @@ -30,16 +37,38 @@ public class JwtUtil { // this.key = Keys.secretKeyFor(SignatureAlgorithm.HS512); log.info("JWT 密钥:{}", secretKey); } - - public String generateToken(String username, String role) { + // 支持自定义 claims 的 generateToken 方法 + public String generateToken(SimpleUserInfoDTO simpleUserInfoDTO, String subject){ + Map claims = Maps.newHashMap(); + claims.put("userInfo", simpleUserInfoDTO.getUserId()); return Jwts.builder() - .setSubject(username) - .claim("role", role) + .setClaims(claims) // 设置自定义 claims + .setSubject(subject) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .signWith(key, SignatureAlgorithm.HS512) .compact(); } + // 从 token 中提取某个字段 + public T getClaim(String token, String claimKey, Class clazz) { + return Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody() + .get(claimKey, clazz); + } + + // 从 token 中提取某个对象类型的字段(支持复杂对象) + public T getClaimFromToken(String token, String claimKey, Class targetClass) { + return Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody() + .get(claimKey, targetClass); + } + public String extractUsername(String token) { return Jwts.parserBuilder() .setSigningKey(key) @@ -60,4 +89,35 @@ public class JwtUtil { return false; } } + + public HttpServletRequest getCurrentRequest() { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + return attributes != null ? attributes.getRequest() : null; + } + + /** + * 获取当前请求的Authorization头内容 + * @return Authorization头的值,如果不存在则返回null + */ + public String getAuthorizationHeader() { + HttpServletRequest request = getCurrentRequest(); + return request != null ? request.getHeader("Authorization") : null; + } + + /** + * 从token中获取用户信息 + * @return 用户信息 + */ + public SimpleUserInfoDTO getUserInfoFromToken() { + String authHeader = getAuthorizationHeader(); + log.info("token:{}",authHeader); + if (authHeader != null && authHeader.startsWith("Bearer ")) { + String token = authHeader.substring(7); + String userInfoJson = getClaim(token, "userInfo", String.class); + // 进行token验证等操作 + return JSONObject.parseObject(userInfoJson, SimpleUserInfoDTO.class); + }else { + throw new RuntimeException("token不存在"); + } + } } diff --git a/src/main/resources/mapper/CarDamageMapper.xml b/src/main/resources/mapper/CarDamageMapper.xml new file mode 100644 index 0000000..4421571 --- /dev/null +++ b/src/main/resources/mapper/CarDamageMapper.xml @@ -0,0 +1,5 @@ + + + + +