瀏覽代碼

Merge remote-tracking branch 'origin/yxp' into yxp

杨旭朋 1 周之前
父節點
當前提交
b8f4cd90ff

+ 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();
+    }
+
+}

+ 45 - 0
src/main/java/com/futu/course/user/controller/UserAddressController.java

@@ -0,0 +1,45 @@
+package com.futu.course.user.controller;
+
+import com.futu.course.user.domain.UserAddress;
+import com.futu.course.user.service.impl.UserAddressServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author "杨旭朋"
+ * @ClassName: UserAddressController
+ * @date 2025年05月12日 08:44
+ */
+@RestController
+@RequestMapping("userAddress")
+public class UserAddressController {
+    @Autowired
+    UserAddressServiceImpl userAddressService;
+    @GetMapping("UserAddressList")
+    public List<UserAddress> userArrayList(){
+        return userAddressService.UserAddressList();
+    }
+    @GetMapping("selUserDefault")
+    public UserAddress selUserDefault(){
+        return userAddressService.selUserDefault();
+    }
+    @PostMapping("addUserAddress")
+    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);
+    }
+}

+ 6 - 0
src/main/java/com/futu/course/user/controller/UserController.java

@@ -1,8 +1,11 @@
 package com.futu.course.user.controller;
 
+import com.futu.course.user.domain.User;
+import com.futu.course.user.domain.UserAddress;
 import com.futu.course.user.service.impl.UserServiceImpl;
 import io.minio.errors.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -11,6 +14,8 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.IOException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author "杨旭朋"
@@ -26,4 +31,5 @@ public class UserController {
     public String unload(MultipartFile multipartFile,Long uid) throws ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
         return userService.unload(multipartFile,uid);
     }
+
 }

+ 102 - 6
src/main/java/com/futu/course/user/service/impl/UserAddressServiceImpl.java

@@ -1,20 +1,116 @@
 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;
 import org.springframework.stereotype.Service;
 
+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{
+public class UserAddressServiceImpl extends ServiceImpl<UserAddressMapper, UserAddress> implements UserAddressService {
+    private final Long uid = 1919928855523627008L;
+
+    /**
+     * @title: UserAddressList
+     * @desc: 查询用户所有地址
+     * @params 无
+     * @return: List<UserAddress>
+     * @author: 杨旭朋
+     * @date: 2025/5/12 8:47
+     */
+    public List<UserAddress> UserAddressList() {
+        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
+     */
+    public UserAddress selUserDefault() {
+        List<UserAddress> userAddresses = this.UserAddressList();
+        UserAddress userAddressDefault = new UserAddress();
+        // 判断用户地址数量如果为1则设为默认地址
+        if (userAddresses.size() == 1) {
+            userAddresses.get(0).setIsDefault(1);
+            this.updateById(userAddresses.get(0));
+            userAddressDefault = userAddresses.get(0);
+        } else {
+            for (UserAddress userAddress : userAddresses) {
+                if (userAddress.getIsDefault() == 1) {
+                    userAddressDefault = userAddress;
+                }
+            }
+        }
+        return userAddressDefault;
+    }
+
+    /**
+     * @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();
+        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) ? "修改成功" : "修改失败";
+    }
 }
 
 

+ 5 - 0
src/main/java/com/futu/course/user/service/impl/UserServiceImpl.java

@@ -1,8 +1,11 @@
 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.minio.service.impl.FileServiceImpl;
 import com.futu.course.user.domain.User;
+import com.futu.course.user.domain.UserAddress;
 import com.futu.course.user.service.UserService;
 import com.futu.course.user.mapper.UserMapper;
 import io.minio.errors.*;
@@ -14,6 +17,8 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.IOException;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
 * @author yuu