2
1

2 Commitit 9d6dae4d30 ... b1cc25123d

Tekijä SHA1 Viesti Päivämäärä
  杨旭朋 b1cc25123d Merge remote-tracking branch 'origin/yxp' into yxp 1 viikko sitten
  杨旭朋 b8f4cd90ff Merge remote-tracking branch 'origin/yxp' into yxp 1 viikko sitten

+ 40 - 0
src/main/java/com/futu/course/common/utils/CopyUtil.java

@@ -0,0 +1,40 @@
+package com.futu.course.common.utils;
+
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 实体字段的值复制工具类
+ */
+public class CopyUtil {
+
+    public static <T> List<T> copyList(List source, Class<T> clazz) {
+        List<T> target = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(source)){
+            if (!CollectionUtils.isEmpty(source)){
+                for (Object c: source) {
+                    T obj = copy(c, clazz);
+                    target.add(obj);
+                }
+            }
+        }
+        return target;
+    }
+
+    public static <T> T copy(Object source, Class<T> clazz) {
+        if (source == null) {
+            return null;
+        }
+        T obj = null;
+        try {
+            obj = clazz.newInstance();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        BeanUtils.copyProperties(source, obj);
+        return obj;
+    }
+}

+ 66 - 0
src/main/java/com/futu/course/common/utils/EmojiConverterUtil.java

@@ -0,0 +1,66 @@
+package com.futu.course.common.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author 杨杨吖
+ * @QQ 823208782
+ * @WX yjqi12345678
+ * @create 2022-03-24 10:38
+ */
+public class EmojiConverterUtil {
+
+    /**
+     * 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集)
+     * @param str
+     * @return
+     */
+    public static String emojiConvert(String str)
+    {
+        String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";
+
+        Pattern pattern = Pattern.compile(patternString);
+        Matcher matcher = pattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while(matcher.find()) {
+            try {
+                matcher.appendReplacement(
+                        sb,
+                        "[["
+                                + URLEncoder.encode(matcher.group(1),
+                                "UTF-8") + "]]");
+            } catch(UnsupportedEncodingException e) {
+            }
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    /**
+     * 还原utf8数据库中保存的含转换后emoji表情的字符串
+     * @param str
+     * @return
+     */
+    public static String emojiRecovery(String str){
+        String patternString = "\\[\\[(.*?)\\]\\]";
+
+        Pattern pattern = Pattern.compile(patternString);
+        Matcher matcher = pattern.matcher(str);
+
+        StringBuffer sb = new StringBuffer();
+        while(matcher.find()) {
+            try {
+                matcher.appendReplacement(sb,
+                        URLDecoder.decode(matcher.group(1), "UTF-8"));
+            } catch(UnsupportedEncodingException e) {
+
+            }
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+}

+ 68 - 0
src/main/java/com/futu/course/common/utils/Md5Utils.java

@@ -0,0 +1,68 @@
+package com.futu.course.common.utils;
+import java.security.MessageDigest;
+import java.util.Random;
+
+/**
+ * @version 1.0
+ * @Author ZZX
+ * @Date 2022/12/19 17:35
+ */
+public class Md5Utils {
+    /**
+     * md5 加密
+     *
+     * @param saltAndPwd
+     * @return
+     */
+    public static String encode(String saltAndPwd) {
+        try {
+            return
+                    toHex(MessageDigest.getInstance("MD5").digest(saltAndPwd.getBytes("UTF-8"))).toLowerCase();
+        } catch (Exception e) {
+            throw new RuntimeException("md5 加密", e);
+        }
+    }
+    /**
+     * 十六进制字符
+     */
+    private static final char[] HEX_CHARS =
+            "0123456789ABCDEF".toCharArray();
+    /**
+     * 转换为十六进制字符串
+     *
+     * @param bytes
+     * @return
+     */
+    private static String toHex(byte[] bytes) {
+        StringBuilder str = new StringBuilder(bytes.length * 2);
+        final int fifteen = 0x0f;//十六进制中的 15
+        for (byte b : bytes) {//byte 为 32 位
+            str.append(HEX_CHARS[(b >> 4) & fifteen]);//获取第 25 位到第 28 位的二进制数
+            str.append(HEX_CHARS[b & fifteen]);//获取第 29 位到第 32 位的二进制数
+        }
+        return str.toString();
+    }
+    /**
+     * 随机生成10位密码盐
+     * @return
+     */
+    public static String getSalt() {
+        char[] chars =
+                ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
+                        "1234567890!@#$%^&*()_+").toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 30; i++) {
+            //Random().nextInt()返回值为[0,n)
+            char aChar = chars[new Random().nextInt(chars.length)];
+            sb.append(aChar);
+        }
+        return sb.toString();
+    }
+    // 测试
+    public static void main(String[] args) {
+        String salt = getSalt();// get the salt
+        String pwd = "123456";// the inital pwd
+        String saltPwd = encode(salt + pwd);//calculate the new-pwd by the salt and the inital pwd
+        System.out.println(saltPwd);// sout to test
+    }
+}

+ 73 - 0
src/main/java/com/futu/course/common/utils/SnowflakeIdWorker.java

@@ -0,0 +1,73 @@
+package com.futu.course.common.utils;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class SnowflakeIdWorker {
+    // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
+    private final long twepoch = 1288834974657L;
+    // 机器标识位数
+    private final long workerIdBits = 5L;
+    // 数据标识位数
+    private final long datacenterIdBits = 5L;
+    // 支持的最大机器标识数
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+    // 支持的最大数据标识数
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+    // 序列在id中占的位数
+    private final long sequenceBits = 12L;
+    // 机器ID向左移12位
+    private final long workerIdShift = sequenceBits;
+    // 数据标识符向左移17位(12+5)
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+    // 时间戳向左移22位(5+5+12)
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+    private long workerId;
+    private long datacenterId;
+    private long sequence = 0L;
+    private long lastTimestamp = -1L;
+    private final AtomicLong sequenceGenerator = new AtomicLong(0L);
+
+    public SnowflakeIdWorker(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            sequence = 0L;
+        }
+        lastTimestamp = timestamp;
+        return ((timestamp - twepoch) << timestampLeftShift) |
+                (datacenterId << datacenterIdShift) |
+                (workerId << workerIdShift) |
+                sequence;
+    }
+
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+}

+ 21 - 0
src/main/java/com/futu/course/common/utils/ThreadLocalUtil.java

@@ -0,0 +1,21 @@
+package com.futu.course.common.utils;
+
+
+
+public class ThreadLocalUtil {
+    // 提供ThreadLocal对象
+    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
+    // 获取数据的方法,根据键获取值
+    public static <T> T get(){
+        return (T) THREAD_LOCAL.get();
+    }
+    // 存储数据的方法,储存键值对
+    public static void set(Object value){
+        THREAD_LOCAL.set(value);
+    }
+    // 删除数据的方法,清除ThreadLocal,防止内存溢出
+    public static void remove(){
+        THREAD_LOCAL.remove();
+    }
+
+}

+ 13 - 1
src/main/java/com/futu/course/user/controller/UserAddressController.java

@@ -27,7 +27,19 @@ public class UserAddressController {
         return userAddressService.selUserDefault();
     }
     @PostMapping("addUserAddress")
-    public UserAddress addUserAddress(@RequestBody UserAddress userAddress){
+    public String  addUserAddress(@RequestBody UserAddress userAddress){
         return userAddressService.addUserAddress(userAddress);
     }
+    @PostMapping("AltUserAddress")
+    public String updateUserAddress(@RequestBody UserAddress userAddress) {
+       return userAddressService.updateUserAddress(userAddress);
+    }
+    @PostMapping("DelUserAddress")
+    public String DelUserAddress(@RequestParam("id") Long id) {
+        return userAddressService.DelUserAddress(id);
+    }
+    @PostMapping("AltUserAddressDefault")
+    public String AltUserAddressDefault(@RequestParam("id") Long id) {
+        return userAddressService.AltUserAddressDefault(id);
+    }
 }

+ 71 - 23
src/main/java/com/futu/course/user/service/impl/UserAddressServiceImpl.java

@@ -3,6 +3,7 @@ package com.futu.course.user.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.futu.course.common.utils.SnowflakeIdWorker;
 import com.futu.course.user.domain.UserAddress;
 import com.futu.course.user.service.UserAddressService;
 import com.futu.course.user.mapper.UserAddressMapper;
@@ -12,13 +13,14 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
-* @author yuu
-* @description 针对表【user_address(收货地址表)】的数据库操作Service实现
-* @createDate 2025-05-05 18:52:53
-*/
+ * @author yuu
+ * @description 针对表【user_address(收货地址表)】的数据库操作Service实现
+ * @createDate 2025-05-05 18:52:53
+ */
 @Service
-public class UserAddressServiceImpl extends ServiceImpl<UserAddressMapper, UserAddress> implements UserAddressService{
-    private final Long uid=1919928855523627008L;
+public class UserAddressServiceImpl extends ServiceImpl<UserAddressMapper, UserAddress> implements UserAddressService {
+    private final Long uid = 1919928855523627008L;
+
     /**
      * @title: UserAddressList
      * @desc: 查询用户所有地址
@@ -31,37 +33,83 @@ public class UserAddressServiceImpl extends ServiceImpl<UserAddressMapper, UserA
         LambdaQueryWrapper<UserAddress> eq = Wrappers.<UserAddress>lambdaQuery().eq(UserAddress::getUserId, uid);
         return this.list(eq);
     }
-/**
- * @title: selUserDefault
- * @desc:  查询用户的默认地址如果只有一条数据则默认
- * @params
- * @return: UserAddress
- * @author: 杨旭朋
- * @date: 2025/5/12 9:06
- */
+
+    /**
+     * @title: selUserDefault
+     * @desc: 查询用户的默认地址如果只有一条数据则默认
+     * @params
+     * @return: UserAddress
+     * @author: 杨旭朋
+     * @date: 2025/5/12 9:06
+     */
     public UserAddress selUserDefault() {
         List<UserAddress> userAddresses = this.UserAddressList();
         UserAddress userAddressDefault = new UserAddress();
         // 判断用户地址数量如果为1则设为默认地址
-        if (userAddresses.size() == 1){
+        if (userAddresses.size() == 1) {
             userAddresses.get(0).setIsDefault(1);
             this.updateById(userAddresses.get(0));
-            userAddressDefault=userAddresses.get(0);
-        }else {
+            userAddressDefault = userAddresses.get(0);
+        } else {
             for (UserAddress userAddress : userAddresses) {
-                if (userAddress.getIsDefault() == 1){
-                    userAddressDefault=userAddress;
+                if (userAddress.getIsDefault() == 1) {
+                    userAddressDefault = userAddress;
                 }
             }
         }
         return userAddressDefault;
     }
 
-    public UserAddress addUserAddress(UserAddress userAddress) {
+    /**
+     * @title: addUserAddress
+     * @desc: “添加地址”
+     * @params “UserAddress”
+     * @return: String
+     * @author: 杨旭朋
+     * @date: 2025/5/12 9:41
+     */
+    public String addUserAddress(UserAddress userAddress) {
         userAddress.setUserId(uid);
-//        SnowflakeIdWorker snowflakeIdWorker=new SnowflakeIdWorker(1,1);
-//        long l = snowflakeIdWorker.nextId();
-        return null;
+        SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(1, 1);
+        long l = snowflakeIdWorker.nextId();
+        userAddress.setId(l);
+        boolean save = this.save(userAddress);
+        return save ? "添加成功" : "添加失败";
+    }
+
+    public String updateUserAddress(UserAddress userAddress) {
+        boolean b = this.updateById(userAddress);
+        return b ? "修改成功" : "修改失败";
+    }
+
+    /**
+     * @title: DelUserAddress
+     * @desc: "删除用户地址"
+     * @params Long
+     * @return: String
+     * @author: 杨旭朋
+     * @date: 2025/5/12 10:54
+     */
+    public String DelUserAddress(Long id) {
+        return this.removeById(id) ? "删除成功" : "删除失败";
+    }
+
+    /**
+     * @title: AltUserAddressDefault
+     * @desc: 修改用户默认地址
+     * @params Long
+     * @return: String
+     * @author: 杨旭朋
+     * @date: 2025/5/12 10:53
+     */
+    public String AltUserAddressDefault(Long id) {
+//        取消原有地址的默认状态
+        UserAddress userAddress = this.selUserDefault();
+        userAddress.setIsDefault(0);
+        this.updateById(userAddress);
+        UserAddress byId = this.getById(id);
+        byId.setIsDefault(1);
+        return this.updateById(byId) ? "修改成功" : "修改失败";
     }
 }