X723595506 1 week ago
parent
commit
cad6355cc2

+ 43 - 0
src/main/java/com/example/course/controller/GoodsController.java

@@ -0,0 +1,43 @@
+package com.example.course.controller;
+
+import cn.hutool.json.JSONUtil;
+import com.example.course.dao.GoodsMapper;
+import com.example.course.dto.GoodsDto;
+import com.example.course.dto.GoodsSelectDto;
+import com.example.course.dto.VerifyDto;
+import com.example.course.service.impl.GoodsServiceImpl;
+import com.example.course.utils.Result;
+import com.example.course.utils.VerifyUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/goods")
+public class GoodsController {
+    @Autowired
+    private GoodsServiceImpl goodsService;
+    @PostMapping("/add")
+    public Result add(@RequestBody GoodsDto dto){
+        return goodsService.add(dto);
+    }
+
+    @PostMapping("/verify")
+    public Result verify(@RequestBody GoodsSelectDto dto, @RequestHeader("reqId")String reqId,@RequestHeader("reqTime")String reqTime,@RequestHeader("appId")Long appId){
+        VerifyDto verifyDto = new VerifyDto();
+        verifyDto.setAppSecret("123");
+        verifyDto.setAppId(appId.toString());
+        verifyDto.setReqId(reqId);
+        verifyDto.setReqTime(reqTime);
+        verifyDto.setSign(dto.getSign());
+        Boolean verify = VerifyUtils.verify(verifyDto);
+        if (!verify){
+            return Result.ERROR(1002,"失败");
+        }
+        List<String> list = new ArrayList<>();
+        list.add("土豆");
+        return Result.OK(list);
+    }
+}

+ 18 - 0
src/main/java/com/example/course/dao/GoodsMapper.java

@@ -0,0 +1,18 @@
+package com.example.course.dao;
+
+import com.example.course.domain.Goods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author 徐乐
+* @description 针对表【goods(商品表)】的数据库操作Mapper
+* @createDate 2025-05-16 09:35:00
+* @Entity com.example.course.domain.Goods
+*/
+public interface GoodsMapper extends BaseMapper<Goods> {
+
+}
+
+
+
+

+ 101 - 0
src/main/java/com/example/course/domain/Goods.java

@@ -0,0 +1,101 @@
+package com.example.course.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 商品表
+ * @TableName goods
+ */
+@TableName(value ="goods")
+@Data
+public class Goods implements Serializable {
+    /**
+     * 商品id
+     */
+    @TableId
+    private Long goodsId;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 商品描述
+     */
+    private String descriptions;
+
+    /**
+     * 商品图片
+     */
+    private String goodsImg;
+
+    /**
+     * 商品内容
+     */
+    private String content;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Goods other = (Goods) that;
+        return (this.getGoodsId() == null ? other.getGoodsId() == null : this.getGoodsId().equals(other.getGoodsId()))
+            && (this.getGoodsName() == null ? other.getGoodsName() == null : this.getGoodsName().equals(other.getGoodsName()))
+            && (this.getDescriptions() == null ? other.getDescriptions() == null : this.getDescriptions().equals(other.getDescriptions()))
+            && (this.getGoodsImg() == null ? other.getGoodsImg() == null : this.getGoodsImg().equals(other.getGoodsImg()))
+            && (this.getContent() == null ? other.getContent() == null : this.getContent().equals(other.getContent()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getGoodsId() == null) ? 0 : getGoodsId().hashCode());
+        result = prime * result + ((getGoodsName() == null) ? 0 : getGoodsName().hashCode());
+        result = prime * result + ((getDescriptions() == null) ? 0 : getDescriptions().hashCode());
+        result = prime * result + ((getGoodsImg() == null) ? 0 : getGoodsImg().hashCode());
+        result = prime * result + ((getContent() == null) ? 0 : getContent().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", goodsId=").append(goodsId);
+        sb.append(", goodsName=").append(goodsName);
+        sb.append(", descriptions=").append(descriptions);
+        sb.append(", goodsImg=").append(goodsImg);
+        sb.append(", content=").append(content);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 26 - 0
src/main/java/com/example/course/dto/GoodsDto.java

@@ -0,0 +1,26 @@
+package com.example.course.dto;
+
+import lombok.Data;
+
+@Data
+public class GoodsDto {
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 商品描述
+     */
+    private String descriptions;
+
+    /**
+     * 商品图片
+     */
+    private String goodsImg;
+
+    /**
+     * 商品内容
+     */
+    private String content;
+}

+ 9 - 0
src/main/java/com/example/course/dto/GoodsSelectDto.java

@@ -0,0 +1,9 @@
+package com.example.course.dto;
+
+import lombok.Data;
+
+@Data
+public class GoodsSelectDto {
+    private Long goodsId;
+    private String sign;
+}

+ 12 - 0
src/main/java/com/example/course/dto/VerifyDto.java

@@ -0,0 +1,12 @@
+package com.example.course.dto;
+
+import lombok.Data;
+
+@Data
+public class VerifyDto {
+    private String appId;
+    private String appSecret;
+    private String reqId;
+    private String reqTime;
+    private String sign;
+}

+ 16 - 0
src/main/java/com/example/course/service/GoodsService.java

@@ -0,0 +1,16 @@
+package com.example.course.service;
+
+import com.example.course.domain.Goods;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.example.course.dto.GoodsDto;
+import com.example.course.utils.Result;
+
+/**
+* @author 徐乐
+* @description 针对表【goods(商品表)】的数据库操作Service
+* @createDate 2025-05-16 09:35:00
+*/
+public interface GoodsService extends IService<Goods> {
+
+    Result add(GoodsDto dto);
+}

+ 41 - 0
src/main/java/com/example/course/service/impl/GoodsServiceImpl.java

@@ -0,0 +1,41 @@
+package com.example.course.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.example.course.domain.Goods;
+import com.example.course.dto.GoodsDto;
+import com.example.course.service.GoodsService;
+import com.example.course.dao.GoodsMapper;
+import com.example.course.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 徐乐
+* @description 针对表【goods(商品表)】的数据库操作Service实现
+* @createDate 2025-05-16 09:35:00
+*/
+@Service
+public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods>
+    implements GoodsService{
+
+    @Autowired
+    private GoodsMapper goodsMapper;
+
+    @Override
+    public Result add(GoodsDto dto) {
+        Goods goods = new Goods();
+        long goodsId = IdUtil.getSnowflake().nextId();
+        goods.setGoodsId(goodsId);
+        goods.setGoodsName(dto.getGoodsName());
+        goods.setDescriptions(dto.getDescriptions());
+        goods.setGoodsImg(dto.getGoodsImg());
+        goods.setContent(dto.getContent());
+        goodsMapper.insert(goods);
+        return Result.OK("添加商品");
+    }
+}
+
+
+
+

+ 33 - 0
src/main/java/com/example/course/utils/Constant.java

@@ -0,0 +1,33 @@
+package com.example.course.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName: Constant
+ * @Author: 振涛教育_李小超
+ * @Date: 2024年2月26日 14:05
+ */
+public class Constant {
+
+
+    public static String TOKEN_NAME = "Authorization";
+
+    /**
+     * 请求响应码常量
+     */
+    public static final Integer RESPONSE_CODE_SUCCESS = 200;
+    public static final Integer RESPONSE_CODE_ERROR = 400;
+    public static final Integer RESPONSE_CODE_ERROR_VERIFY = 1002;
+    public static final Integer RESPONSE_CODE_NO_LOGIN = 402;
+    public static final Integer RESPONSE_CODE_FORBIDDEN = 403;
+
+    public static final Map<Integer, String> RESPONSE_CODE_MAP = new HashMap<>();
+    static {
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_SUCCESS, "请求成功");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_ERROR, "请求失败");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_NO_LOGIN, "没有登录");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_FORBIDDEN, "权限不足");
+    }
+
+}

+ 244 - 0
src/main/java/com/example/course/utils/EraHelper.java

@@ -0,0 +1,244 @@
+package com.example.course.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.security.MessageDigest;
+import java.util.UUID;
+
+
+/**
+ * 项目相关帮助函数。
+ *
+ *
+ */
+public class EraHelper {
+
+
+
+	/**
+	 * 生产新的UUID。
+	 *
+	 * @return uuid
+	 */
+	public static final String newUUID() {
+		return UUID.randomUUID().toString().replaceAll("-", "");
+	}
+
+	/**
+	 * 判断银行卡号是否合法。
+	 *
+	 * @param cardNumber
+	 *            银行卡号
+	 * @return boolean 表示合法
+	 */
+	public static final boolean isBankCard(String cardNumber) {
+		if (cardNumber == null || cardNumber.isEmpty() || cardNumber.length() <= 2) {
+			return false;
+		}
+		char[] chs = cardNumber.trim().toCharArray();
+		int luhmSum = 0;
+		for (int i = chs.length - 2, j = 0; i >= 0; i--, j++) {
+			if (!Character.isDigit(chs[i])) {
+				return false;
+			}
+			int k = chs[i] - '0';
+			if (j % 2 == 0) {
+				k *= 2;
+				k = k / 10 + k % 10;
+			}
+			luhmSum += k;
+		}
+		return ((luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0')) == chs[chs.length - 1];
+	}
+
+	/**
+	 * 获取远程请求IP
+	 *
+	 * @param request
+	 *            HTTP请求
+	 * @return String ip
+	 */
+	public static String getRemoteIP(HttpServletRequest request) {
+		String xff = request.getHeader("X-Forwarded-For");
+		if (xff != null && !xff.isEmpty()) {
+			return xff.split(", ?")[0];
+		} else {
+			return request.getRemoteAddr();
+		}
+	}
+
+	/**
+	 * 判断手机号是否合法。
+	 *
+	 * @param mobile
+	 *            手机号码
+	 * @return boolean 表示合法
+	 */
+	public static boolean isMobile(String mobile) {
+		if (mobile == null || mobile.length() != 11) {
+			return false;
+		}
+		int index = 0;
+		for (char ch : mobile.toCharArray()) {
+			if (index == 0 && ch != '1') {
+				return false;
+			}
+			if (!Character.isDigit(ch)) {
+				return false;
+			}
+			index++;
+		}
+		return true;
+	}
+
+	/**
+	 * 手机号打码
+	 *
+	 * @param mobile
+	 *            手机号码
+	 * @return String 打码后的手机号码
+	 */
+	public static String maskMobile(String mobile) {
+		StringBuilder builder = new StringBuilder();
+		builder.append(mobile, 0, 3);
+		builder.append("****").append(mobile.substring(7));
+		return builder.toString();
+	}
+
+	/**
+	 * 银行卡号打码
+	 *
+	 * @param cardNumber
+	 *            银行卡号
+	 * @return String 打码后的银行卡号
+	 */
+	public static String maskBankCard(String cardNumber) {
+		StringBuilder builder = new StringBuilder();
+		if (cardNumber.length() > 8) {
+			builder.append(cardNumber, 0, 4);
+			builder.append(" **** ").append(" **** ").append(cardNumber.substring(cardNumber.length() - 4));
+		}
+		return builder.toString();
+	}
+
+	/**
+	 * 判断短信验证码是否合法。
+	 *
+	 * @param verifyCode
+	 *            短信验证码
+	 * @return boolean 表示合法
+	 */
+	public static boolean isSMSCode(String verifyCode) {
+		if (verifyCode == null || verifyCode.length() != 4) {
+			return false;
+		}
+		for (char ch : verifyCode.toCharArray()) {
+			if (!Character.isDigit(ch)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 转换为十六进制字符串
+	 *
+	 * @param b
+	 *            字节数组
+	 * @return String 十六进制字符串
+	 */
+	public static String byte2HexStr(byte[] b) {
+		StringBuilder sb = new StringBuilder("");
+		for (int n = 0; n < b.length; n++) {
+			String stmp = Integer.toHexString(b[n] & 0xFF);
+			sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
+		}
+		return sb.toString().toUpperCase().trim();
+	}
+
+
+
+	/**
+	 * 密码等资料混淆摘要
+	 *
+	 * @param content
+	 *            待混淆内容
+	 * @return String
+	 */
+	public static String confuse(String content) {
+		if (content == null || content.isEmpty()) {
+			return null;
+		}
+		try {
+			MessageDigest md5 = MessageDigest.getInstance("MD5");
+			md5.update(content.getBytes("UTF-8"));
+			MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
+			return byte2HexStr(sha256.digest(md5.digest()));
+		} catch (Throwable e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+
+
+
+	private static double EARTH_RADIUS = 6378.137;// 地球半径
+
+	private static double rad(double d) {
+		return d * Math.PI / 180.0;
+	}
+
+	/**
+	 * 计算两个经纬度坐标距离.
+	 *
+	 * @param lat1
+	 * @param lng1
+	 * @param lat2
+	 * @param lng2
+	 * @return double
+	 */
+	public static BigDecimal getDistance(double lat1, double lng1, double lat2, double lng2) {
+		double radLat1 = rad(lat1);
+		double radLat2 = rad(lat2);
+		double a = radLat1 - radLat2;
+		double b = rad(lng1) - rad(lng2);
+		double s = 2 * Math.asin(Math.sqrt(
+				Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
+		s = s * EARTH_RADIUS;
+		return BigDecimal.valueOf(s).setScale(2, BigDecimal.ROUND_HALF_UP);
+	}
+
+	/**
+	 * 判断是否为微信。
+	 *
+	 * @param userAgent
+	 *            终端类型字符串
+	 * @return boolean true表示终端类型为微信
+	 */
+	public static boolean isWeiXin(String userAgent) {
+		return userAgent == null || userAgent.isEmpty() ? false : userAgent.indexOf("MicroMessenger") != -1;
+	}
+
+	/**
+	 * 判断是否为安卓。
+	 *
+	 * @param userAgent
+	 *            终端类型字符串
+	 * @return boolean true表示终端类型为安卓
+	 */
+	public static boolean isAndroid(String userAgent) {
+		return userAgent == null || userAgent.isEmpty() ? false : userAgent.indexOf("Android") != -1;
+	}
+
+	/**
+	 * 判断是否为iPhone。
+	 *
+	 * @param userAgent
+	 *            终端类型字符串
+	 * @return boolean true表示终端类型为iPhone
+	 */
+	public static boolean isIPhone(String userAgent) {
+		return userAgent == null || userAgent.isEmpty() ? false : userAgent.indexOf("iPhone") != -1;
+	}
+}

+ 67 - 0
src/main/java/com/example/course/utils/Result.java

@@ -0,0 +1,67 @@
+package com.example.course.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName: Result 返回结果
+ *  code 响应码 代表请求成功/失败
+ *  message 响应信息
+ *  data 响应数据
+ * @Author: 振涛教育_李小超
+ * @Date: 2024年2月26日 13:58
+ */
+@Data
+public class Result {
+    private Integer code;//状态码
+    private String message;//提示信息
+    private Object data;//数据
+
+    public Result(Integer code, String message, Object data) {
+        this.code = code;
+        this.message = message;
+        this.data = data;
+    }
+
+    public Result() {
+    }
+
+    //成功响应
+    public static Result OK() {
+        return new Result(Constant.RESPONSE_CODE_SUCCESS, "操作成功", null);
+    }
+
+    public static Result OK(Object data) {
+        return new Result(Constant.RESPONSE_CODE_SUCCESS, "操作成功", data);
+    }
+
+    //失败响应
+    public static Result ERROR() {
+        return new Result(Constant.RESPONSE_CODE_ERROR, "操作失败", null);
+    }
+
+    public static Result ERROR(Object data) {
+        return new Result(Constant.RESPONSE_CODE_ERROR, "操作失败", data);
+    }
+
+    public static Result ERROR(String message) {
+        return new Result(Constant.RESPONSE_CODE_ERROR, message, null);
+    }
+    public static Result ERROR(Integer code,String message) {
+        return new Result(Constant.RESPONSE_CODE_ERROR_VERIFY, message, null);
+    }
+
+    //未登录响应
+    public static Result NO_LOGIN(){
+        return new Result(Constant.RESPONSE_CODE_NO_LOGIN, "未登录", null);
+    }
+    public static Result NO_LOGIN(String message){
+        return new Result(Constant.RESPONSE_CODE_NO_LOGIN, message, null);
+    }
+
+    //权限不足响应
+    public static Result FORBIDDEN(){
+        return new Result(Constant.RESPONSE_CODE_FORBIDDEN, "权限不足,禁止访问", null);
+    }
+}

+ 41 - 0
src/main/java/com/example/course/utils/VerifyUtils.java

@@ -0,0 +1,41 @@
+package com.example.course.utils;
+
+import com.example.course.dto.VerifyDto;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class VerifyUtils {
+    public static final Boolean verify(VerifyDto dto){
+        //ASCII码排序
+        TreeMap<String,String> treeMap = new TreeMap<>();
+        treeMap.put("appId",dto.getAppId());
+        treeMap.put("reqId",dto.getReqId());
+        treeMap.put("reqTime",dto.getReqTime());
+        //key=value&key=value最后加一个appSecret
+        StringBuffer buffer = new StringBuffer();
+        boolean flag = true;
+        for (Map.Entry<String, String> entry : treeMap.entrySet()) {
+            if (flag){
+                buffer.append(entry.getKey()).append("=").append(entry.getValue());
+                flag = false;
+            }else{
+                buffer.append("&").append(entry.getKey()).append("=").append(entry.getValue());
+            }
+        }
+        buffer.append(dto.getAppSecret());
+
+        try {
+            String sign = EraHelper.byte2HexStr(MessageDigest.getInstance("MD5").digest(buffer.toString().getBytes("UTF-8")));
+            boolean b = sign.equals(dto.getSign());
+            return b;
+        } catch (NoSuchAlgorithmException e) {
+            return false;
+        } catch (UnsupportedEncodingException e) {
+            return false;
+        }
+    }
+}