Bläddra i källkod

feat: 新增七牛云token

bianzhenhua123 1 månad sedan
förälder
incheckning
71ca506341
25 ändrade filer med 1440 tillägg och 31 borttagningar
  1. 4 0
      micro-common/pom.xml
  2. 29 0
      micro-common/src/main/java/com/poyee/common/config/LimitRule.java
  3. 21 0
      micro-common/src/main/java/com/poyee/common/constant/BusConstants.java
  4. 1 1
      micro-common/src/main/java/com/poyee/common/constant/Constants.java
  5. 33 0
      micro-common/src/main/java/com/poyee/common/constant/RetConstants.java
  6. 4 14
      micro-common/src/main/java/com/poyee/common/dto/OutDTO.java
  7. 19 0
      micro-common/src/main/java/com/poyee/common/dto/qiniu/AntispamDTO.java
  8. 22 0
      micro-common/src/main/java/com/poyee/common/dto/qiniu/CensorDTO.java
  9. 18 0
      micro-common/src/main/java/com/poyee/common/dto/qiniu/CensorResult.java
  10. 18 0
      micro-common/src/main/java/com/poyee/common/dto/qiniu/SceneDetailDTO.java
  11. 17 0
      micro-common/src/main/java/com/poyee/common/dto/qiniu/scenesDTO.java
  12. 2 1
      micro-common/src/main/java/com/poyee/common/utils/StringUtils.java
  13. 36 0
      micro-common/src/main/java/com/poyee/common/utils/bean/JSONTools.java
  14. 5 0
      micro-manager/pom.xml
  15. 2 2
      micro-manager/src/main/java/com/poyee/manager/DictCacheManager.java
  16. 8 0
      micro-manager/src/main/java/com/poyee/manager/QiNiuManager.java
  17. 106 0
      micro-manager/src/main/java/com/poyee/manager/RedisManager.java
  18. 2 2
      micro-manager/src/main/java/com/poyee/manager/impl/DictCacheManagerImpl.java
  19. 17 0
      micro-manager/src/main/java/com/poyee/manager/impl/QiNiuManagerImpl.java
  20. 970 0
      micro-manager/src/main/java/com/poyee/manager/impl/RedisManagerImpl.java
  21. 8 0
      micro-service/src/main/java/com/poyee/service/BusService.java
  22. 38 0
      micro-service/src/main/java/com/poyee/service/impl/BusServiceImpl.java
  23. 2 2
      micro-service/src/main/java/com/poyee/service/impl/DictServiceImpl.java
  24. 28 5
      pom.xml
  25. 30 4
      web-controller/src/main/java/com/poyee/controller/AppCommonController.java

+ 4 - 0
micro-common/pom.xml

@@ -25,6 +25,10 @@
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 29 - 0
micro-common/src/main/java/com/poyee/common/config/LimitRule.java

@@ -0,0 +1,29 @@
+package com.poyee.common.config;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LimitRule {
+    public static final String COMMON="common";
+    public static final String USER="user";
+    public static final String ACT="act";
+    /**需要token*/
+    public static final String ACT_TOKEN="act_token";
+
+    /**几秒内限制*/
+    private int seconds;
+    /**可访问次数*/
+    private int limitCount;
+    /**锁定次数,limitCount相比取更大*/
+    private int lockCount;
+    /**锁定时间*/
+    private int lockTime;
+
+    public boolean enableLimitLock() {
+        return this.getLockTime() > 0 && this.getLockCount() > 0;
+    }
+}

+ 21 - 0
micro-common/src/main/java/com/poyee/common/constant/BusConstants.java

@@ -0,0 +1,21 @@
+package com.poyee.common.constant;
+
+/**
+ * 业务相关敞亮
+ * @author: zhenhua.bian
+ * @date: 2025/10/24
+ */
+public class BusConstants {
+    /**
+     * 七牛云token
+     */
+    public static String QI_NIU_TOKEN = "qiniu_token";
+    public static final long QI_NIU_TOKEN_EXPIRE_TIME = 1800;
+    public static final String bucketName = "tzy-admin-public";
+    public static final String accessKey = "RYT6zfQA5Yf4IKgbaDBPMjEgQmzKdcfN48M8VIvI";
+    public static final String secretKey = "4P9slQYFTQeomzEMRj3Vq8n_WSv3IvbUvTSmwMwa";
+
+    /**
+     * 其他
+     */
+}

+ 1 - 1
micro-common/src/main/java/com/poyee/common/constant/Constants.java

@@ -133,7 +133,7 @@ public class Constants {
 	public static final String CARD_INFO_MARK = "CARD_INFO_MARK_";
 	public static final String CARD_GOODS_ACT_SIGN = "CARD_GOODS_ACT_SIGN";
 	public static final String CARD_INFO_ACT_SIGN = "CARD_INFO_ACT_SIGN";
-	public static Map<String, Object> JSON_HEADS = new HashMap(1) {{
+	public static Map<String, Object> JSON_HEADS = new HashMap<String, Object>() {{
 		put("Content-Type", "application/json");
 	}};
 	public static final String JPUSH_TYPE_TAG = "tags";

+ 33 - 0
micro-common/src/main/java/com/poyee/common/constant/RetConstants.java

@@ -0,0 +1,33 @@
+package com.poyee.common.constant;
+
+/**
+ * 返回值常量
+ */
+public enum RetConstants {
+    SUCCESS(0, "成功"),
+    ERROR(1, "失败"),
+    ERROR_PARAM(2, "参数错误"),
+    ERROR_NOT_LOGIN(3, "未登录"),
+    ERROR_NOT_AUTH(4, "无权限"),
+    ERROR_NOT_EXIST(5, "不存在"),
+    ERROR_NOT_FOUND(501, "获取七牛token失败!"),
+    ERROR_NOT_SUPPORT(7, "不支持"),
+    ERROR_NOT_ALLOW(8, "不允许"),
+    ERROR_NOT_SUPPORT_OPERATION(9, "不支持的操作");
+
+    private final int code;
+    private final String message;
+
+    RetConstants(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}

+ 4 - 14
micro-common/src/main/java/com/poyee/common/dto/OutDTO.java

@@ -1,5 +1,6 @@
 package com.poyee.common.dto;
 
+import com.poyee.common.constant.RetConstants;
 import lombok.Data;
 import lombok.ToString;
 
@@ -157,12 +158,6 @@ public class OutDTO implements Serializable {
         return new OutDTO(true,code,msg);
     }
 
-    public static OutDTO ok(Map data) {
-        OutDTO r = new OutDTO();
-        r.setData(data);
-        return r;
-    }
-
     /**
      * 失败
      * @param code
@@ -182,13 +177,8 @@ public class OutDTO implements Serializable {
         return new OutDTO(false,500,message);
     }
 
-    /**
-     * 无权限访问返回结果
-     */
-    public static OutDTO noauth(String msg) {
-        return error(510, msg);
-    }
-
-
 
+    public static OutDTO errorRet(RetConstants retConstants) {
+        return new OutDTO(false, retConstants.getCode(), retConstants.getMessage());
+    }
 }

+ 19 - 0
micro-common/src/main/java/com/poyee/common/dto/qiniu/AntispamDTO.java

@@ -0,0 +1,19 @@
+package com.poyee.common.dto.qiniu;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author by po'yi
+ * @Classname scenesDTO
+ * @Date 2024/1/4 14:25
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AntispamDTO implements Serializable {
+	private String suggestion;
+	private List<SceneDetailDTO> details;
+}

+ 22 - 0
micro-common/src/main/java/com/poyee/common/dto/qiniu/CensorDTO.java

@@ -0,0 +1,22 @@
+package com.poyee.common.dto.qiniu;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author by po'yi
+ * @Classname CensorDTO
+ * @Date 2022/7/12 16:32
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CensorDTO implements Serializable {
+	private  Integer code;
+	private  String message;
+	private  String entry_id;
+	//suggestion - pass
+	//private Map<String, Object> result;
+	private CensorResult result;
+}

+ 18 - 0
micro-common/src/main/java/com/poyee/common/dto/qiniu/CensorResult.java

@@ -0,0 +1,18 @@
+package com.poyee.common.dto.qiniu;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author by po'yi
+ * @Classname CensorResult
+ * @Date 2024/1/4 14:25
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CensorResult implements Serializable {
+	private String suggestion;
+	private scenesDTO scenes;
+}

+ 18 - 0
micro-common/src/main/java/com/poyee/common/dto/qiniu/SceneDetailDTO.java

@@ -0,0 +1,18 @@
+package com.poyee.common.dto.qiniu;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author by po'yi
+ * @Classname scenesDTO
+ * @Date 2024/1/4 14:25
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class SceneDetailDTO implements Serializable {
+	private String label;
+	private float score;
+}

+ 17 - 0
micro-common/src/main/java/com/poyee/common/dto/qiniu/scenesDTO.java

@@ -0,0 +1,17 @@
+package com.poyee.common.dto.qiniu;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author by po'yi
+ * @Classname scenesDTO
+ * @Date 2024/1/4 14:25
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class scenesDTO implements Serializable {
+	private AntispamDTO antispam;
+}

+ 2 - 1
micro-common/src/main/java/com/poyee/common/utils/StringUtils.java

@@ -1,6 +1,7 @@
 package com.poyee.common.utils;
 
-import com.tzy.common.core.text.StrFormatter;
+
+import com.poyee.common.domain.StrFormatter;
 
 import java.security.SecureRandom;
 import java.util.Collection;

+ 36 - 0
micro-common/src/main/java/com/poyee/common/utils/bean/JSONTools.java

@@ -0,0 +1,36 @@
+package com.poyee.common.utils.bean;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+
+import java.util.List;
+
+public class JSONTools {
+
+	public static String obj2json(Object obj){
+		return JSON.toJSONString(obj);
+	}
+
+	public static Object jsonStr2obj(String json){
+		return JSON.parse(json);
+	}
+
+	public static <T> T  jsonStr2obj(String json,Class<T> classes){
+		return JSON.parseObject(json, classes);
+	}
+
+
+	public static JSONObject parseObject(String json){
+		return JSON.parseObject(json);
+	}
+
+	public static <T> List<T> parseObjectList(String json, Class<T> classes) {
+		return JSON.parseArray(json, classes);
+	}
+
+	public static List<JSONObject> toJsonObjectList(String json) {
+		return JSON.parseArray(json, JSONObject.class);
+	}
+
+}

+ 5 - 0
micro-manager/pom.xml

@@ -21,6 +21,11 @@
             <groupId>com.poyee</groupId>
             <artifactId>micro-dao</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
     </dependencies>
 

+ 2 - 2
micro-manager/src/main/java/com/poyee/manager/cache/DictCache.java → micro-manager/src/main/java/com/poyee/manager/DictCacheManager.java

@@ -1,4 +1,4 @@
-package com.poyee.manager.cache;
+package com.poyee.manager;
 
 import com.poyee.common.domain.entity.SysDictData;
 
@@ -9,6 +9,6 @@ import java.util.List;
  * @author zhenhua.bian
  * @date 2025/10/23
  */
-public interface DictCache {
+public interface DictCacheManager {
     List<SysDictData> getDict(String type);
 }

+ 8 - 0
micro-manager/src/main/java/com/poyee/manager/QiNiuManager.java

@@ -0,0 +1,8 @@
+package com.poyee.manager;
+
+/**
+ * 查询七牛云token
+ */
+public interface QiNiuManager {
+    String getUpToken();
+}

+ 106 - 0
micro-manager/src/main/java/com/poyee/manager/RedisManager.java

@@ -0,0 +1,106 @@
+package com.poyee.manager;
+
+import com.poyee.common.config.LimitRule;
+import org.redisson.api.RLock;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 缓存管理类
+ */
+public interface RedisManager {
+    /**
+     * 通用方法
+     */
+    boolean expire(String key, long time);
+    long getExpire(String key);
+    boolean hasKey(String key);
+    void del(String... key);
+
+    /**
+     * String 类型
+     */
+    Object get(String key);
+    List<Object> multiGet(List<String> keys);
+    boolean set(String key, Object value);
+    boolean set(String key, Object value, long time);
+    long incr(String key, long delta);
+    long decr(String key, long delta);
+
+
+    /**
+     * Hash 类型
+     */
+    Object hget(String key, String item);
+    Map<Object, Object> hmget(String key);
+    Set<Object> hGetKeys(String key);
+    boolean hmset(String key, Map<String, Object> map);
+    boolean hmset(String key, Map<String, Object> map, long time);
+    boolean hset(String key, String item, Object value);
+    long hSize(String key);
+    boolean hset(String key, String item, Object value, long time);
+    void hdel(String key, Object... item);
+    boolean hHasKey(String key, String item);
+    double hincr(String key, String item, double by);
+    double hdecr(String key, String item, double by);
+
+    /**
+     * Set 类型
+     */
+    Set<Object> sGet(String key);
+    boolean sHasKey(String key, Object value);
+    long sSet(String key, Object... values);
+    long sSetAndTime(String key, long time, Object... values);
+    long sGetSetSize(String key);
+    long setRemove(String key, Object... values);
+
+    /**
+     * ZSet 类型
+     */
+    Set<Object> zSGet(String key);
+    boolean zSHasKey(String key, Object value);
+    Boolean zSSet(String key, Object value, double score);
+    long zSSetAndTime(String key, long time, Object... values);
+    long zSGetSetSize(String key);
+    long zSetRemove(String key, Object... values);
+
+    /**
+     * List 类型
+     */
+    List<Object> lGet(String key, long start, long end);
+    Object rightPop(String key);
+    long lGetListSize(String key);
+    Object lGetIndex(String key, long index);
+    boolean lSet(String key, Object value);
+    boolean lPut(String key, List value);
+    boolean lCommit(String key, List value);
+    boolean lSet(String key, Object value, long time);
+    boolean lSet(String key, List<Object> value);
+    boolean lSet(String key, List<Object> value, long time);
+    boolean lUpdateIndex(String key, long index, Object value);
+    long lRemove(String key, long count, Object value);
+
+    /**
+     * lock
+     */
+    RLock lock(String lockKey);
+    RLock lock(String lockKey, long leaseTime);
+    RLock lock(String lockKey, TimeUnit unit, long timeout);
+    boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime);
+    boolean tryLock(String lockKey, TimeUnit unit, long waitTime);
+    void unlock(String lockKey);
+    void unlock(RLock lock);
+
+    /**
+     * 工具
+     */
+    Set<String> keys(String keyPrefix);
+    Object eval(String lua, List<Object> keys, Object... args);
+    boolean tryAccess(String key, int seconds, int limitCount);
+    boolean tryAccess(String key, LimitRule limitRule);
+    Boolean setIfAbsent(String key, String val, int time, TimeUnit timeUnit);
+
+}

+ 2 - 2
micro-manager/src/main/java/com/poyee/manager/impl/DictCacheImpl.java → micro-manager/src/main/java/com/poyee/manager/impl/DictCacheManagerImpl.java

@@ -2,7 +2,7 @@ package com.poyee.manager.impl;
 
 import com.poyee.common.domain.entity.SysDictData;
 import com.poyee.dao.mapper.SysDictDataMapper;
-import com.poyee.manager.cache.DictCache;
+import com.poyee.manager.DictCacheManager;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 
@@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
 import java.util.List;
 
 @Component
-public class DictCacheImpl implements DictCache {
+public class DictCacheManagerImpl implements DictCacheManager {
     @Resource
     private SysDictDataMapper sysDictDataMapper;
     @Override

+ 17 - 0
micro-manager/src/main/java/com/poyee/manager/impl/QiNiuManagerImpl.java

@@ -0,0 +1,17 @@
+package com.poyee.manager.impl;
+
+import com.poyee.common.constant.BusConstants;
+import com.poyee.manager.QiNiuManager;
+import com.qiniu.util.Auth;
+
+public class QiNiuManagerImpl implements QiNiuManager {
+    private static Auth auth = null;
+
+    static {
+        auth = Auth.create(BusConstants.accessKey, BusConstants.secretKey);
+    }
+    @Override
+    public String getUpToken() {
+        return auth.uploadToken(BusConstants.bucketName);
+    }
+}

+ 970 - 0
micro-manager/src/main/java/com/poyee/manager/impl/RedisManagerImpl.java

@@ -0,0 +1,970 @@
+package com.poyee.manager.impl;
+
+import com.poyee.common.config.LimitRule;
+import com.poyee.manager.RedisManager;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RScript;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class RedisManagerImpl implements RedisManager {
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private RedissonClient redissonClient;
+
+    // =============================common============================
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key
+     *            键
+     * @param time
+     *            时间(秒)
+     * @return
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key
+     *            键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key
+     *            键
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key
+     *            可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    // ============================String=============================
+    /**
+     * 普通缓存获取
+     *
+     * @param key
+     *            键
+     * @return 值
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    public List<Object> multiGet(List<String> keys) {
+        if (keys == null || keys.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 批量查询 Redis
+        List<Object> values = redisTemplate.opsForValue().multiGet(keys);
+        // 记录每个 Key 的查询结果大小(可选)
+        if (values != null) {
+            for (int i = 0; i < keys.size(); i++) {
+                String key = keys.get(i);
+                Object value = (i < values.size()) ? values.get(i) : null;
+            }
+        }
+        return values != null ? values : Collections.emptyList();
+    }
+
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @param time
+     *            时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 递增 适用场景: https://blog.csdn.net/y_y_y_k_k_k_k/article/details/79218254 高并发生成订单号,秒杀类的业务逻辑等。。
+     *
+     * @param key
+     *            键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key
+     *            键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    // ================================Map=================================
+    /**
+     * HashGet
+     *
+     * @param key
+     *            键 不能为null
+     * @param item
+     *            项 不能为null
+     * @return 值
+     */
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key
+     *            键
+     * @return 对应的多个键值
+     */
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值key2
+     *
+     * @param key
+     *            键
+     * @return 对应的多个键值
+     */
+    public Set<Object> hGetKeys(String key) {
+        Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
+        return entries.keySet();
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key
+     *            键
+     * @param map
+     *            对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key
+     *            键
+     * @param map
+     *            对应多个键值
+     * @param time
+     *            时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key
+     *            键
+     * @param item
+     *            项
+     * @param value
+     *            值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * hase表数量
+     * @param key
+     * @return
+     */
+    public long hSize(String key) {
+        return redisTemplate.opsForHash().size(key);
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key
+     *            键
+     * @param item
+     *            项
+     * @param value
+     *            值
+     * @param time
+     *            时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key
+     *            键 不能为null
+     * @param item
+     *            项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key
+     *            键 不能为null
+     * @param item
+     *            项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key
+     *            键
+     * @param item
+     *            项
+     * @param by
+     *            要增加几(大于0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key
+     *            键
+     * @param item
+     *            项
+     * @param by
+     *            要减少记(小于0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    // ============================set=============================
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key
+     *            键
+     * @return
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key
+     *            键
+     * @param values
+     *            值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key
+     *            键
+     * @param time
+     *            时间(秒)
+     * @param values
+     *            值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0)
+                expire(key, time);
+            return count;
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key
+     *            键
+     * @return
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key
+     *            键
+     * @param values
+     *            值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    // ============================zset=============================
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key
+     *            键
+     * @return
+     */
+    public Set<Object> zSGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @return true 存在 false不存在
+     */
+    public boolean zSHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    public Boolean zSSet(String key, Object value, double score) {
+        try {
+            return redisTemplate.opsForZSet().add(key, value, score);
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key
+     *            键
+     * @param time
+     *            时间(秒)
+     * @param values
+     *            值 可以是多个
+     * @return 成功个数
+     */
+    public long zSSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0)
+                expire(key, time);
+            return count;
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key
+     *            键
+     * @return
+     */
+    public long zSGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key
+     *            键
+     * @param values
+     *            值 可以是多个
+     * @return 移除的个数
+     */
+    public long zSetRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+    // ===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @取出来的元素 总数 end-start+1
+     *
+     * @param key
+     *            键
+     * @param start
+     *            开始 0 是第一个元素
+     * @param end
+     *            结束 -1代表所有值
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            log.error(key, e);
+            return null;
+        }
+    }
+
+
+    public Object rightPop(String key) {
+        try {
+            return redisTemplate.opsForList().rightPop(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key
+     *            键
+     * @return
+     */
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key
+     *            键
+     * @param index
+     *            索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            log.error(key, e);
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @param
+     *
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public boolean lPut(String key, List value) {
+        if(null == value) return false;
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    public boolean lCommit(String key ,List value){
+        try {
+            redisTemplate.delete(key);
+            lPut(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+    /**
+     * 将list放入缓存
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @param time
+     *            时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key
+     *            键
+     * @param value
+     *            值
+     * @param time
+     *            时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key
+     *            键
+     * @param index
+     *            索引
+     * @param value
+     *            值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            log.error(key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key
+     *            键
+     * @param count
+     *            移除多少个
+     * @param value
+     *            值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            log.error(key, e);
+            return 0;
+        }
+    }
+
+    /**
+     * lock(), 拿不到lock就不罢休,不然线程就一直block
+     */
+    public RLock lock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock();
+        return lock;
+    }
+
+    /**
+     * leaseTime为加锁时间,单位为秒
+     */
+    public RLock lock(String lockKey, long leaseTime) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock(leaseTime, TimeUnit.SECONDS);
+        return lock;
+    }
+
+    /**
+     * timeout为加锁时间,时间单位由unit确定
+     */
+    public RLock lock(String lockKey, TimeUnit unit, long timeout) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.lock(timeout, unit);
+        return lock;
+    }
+
+    /**
+     * tryLock(),马上返回,拿到lock就返回true,不然返回false。
+     * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.
+     */
+    public boolean tryLock(String lockKey, TimeUnit unit, long waitTime, long leaseTime) {
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            return lock.tryLock(waitTime, leaseTime, unit);
+        } catch (Exception e) {
+            log.error("异常:{}", e);
+            return false;
+        }
+    }
+
+    /**
+     * 自动续期锁
+     * @param lockKey
+     * @param unit
+     * @param waitTime
+     * @return
+     */
+    public boolean tryLock(String lockKey, TimeUnit unit, long waitTime) {
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            return lock.tryLock(waitTime, -1, unit);
+        } catch (Exception e) {
+            log.error("异常:{}", e);
+            return false;
+        }
+    }
+
+    /**
+     * 释放 key 的锁
+     */
+    public void unlock(String lockKey) {
+        RLock lock = redissonClient.getLock(lockKey);
+        lock.unlock();
+    }
+
+    /**
+     * 释放锁
+     */
+    public void unlock(RLock lock) {
+        lock.unlock();
+    }
+
+    public  Set<String> keys(String keyPrefix) {
+        return redisTemplate.keys(keyPrefix);
+    }
+
+    public Object eval(String lua,List<Object> keys, Object...  args) {
+        Object eval=redissonClient.getScript().eval(RScript.Mode.READ_WRITE, lua, RScript.ReturnType.VALUE,keys,args);
+        return eval;
+    }
+
+    /**
+     * 访问限制
+     * @param key ip等
+     * @param seconds 秒
+     * @param limitCount 次数
+     * @return
+     */
+    public boolean tryAccess(String key, int seconds, int limitCount) {
+        LimitRule limitRule = new LimitRule();
+        limitRule.setLimitCount(limitCount);
+        limitRule.setSeconds(seconds);
+        return this.tryAccess(key, limitRule);
+    }
+
+
+    /**
+     * 访问限制
+     * @param key ip等
+     * @param limitRule 限制规则
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public boolean tryAccess(String key, LimitRule limitRule) {
+        String newKey = "Limit:" + key;
+        int count = -1;
+        boolean var10=false;
+        try {
+            List<Object> keys = new ArrayList();
+            keys.add(newKey);
+            String[] args = new String[4];
+            args[0]=Math.max(limitRule.getLimitCount(), limitRule.getLockCount()) + "";
+            args[1]=limitRule.getSeconds() + "";
+            args[2]=limitRule.getLockCount() + "";
+            args[3]=limitRule.getLockTime() + "";
+            count = Integer.valueOf(eval(this.buildLimitLuaScript(limitRule.enableLimitLock()), keys, args).toString());
+            var10 = count <= limitRule.getLimitCount();
+        } catch (Exception e) {
+            log.error("lua执行异常:", e);
+        }
+
+        return var10;
+    }
+
+    private String buildLimitLuaScript(boolean isLimit) {
+        StringBuilder lua = new StringBuilder();
+        lua.append("\nlocal c");
+        lua.append("\nc = redis.call('get',KEYS[1])");
+        lua.append("\nif c and tonumber(c) > tonumber(ARGV[1]) then");
+        lua.append("\nreturn c;");
+        lua.append("\nend");
+        lua.append("\nc = redis.call('incr',KEYS[1])");
+        lua.append("\nif tonumber(c) == 1 then");
+        lua.append("\nredis.call('expire',KEYS[1],ARGV[2])");
+        lua.append("\nend");
+        if (isLimit) {
+            lua.append("\nif tonumber(c) > tonumber(ARGV[3]) then");
+            lua.append("\nredis.call('expire',KEYS[1],ARGV[4])");
+            lua.append("\nend");
+        }
+
+        lua.append("\nreturn c;");
+        return lua.toString();
+    }
+
+    public Boolean setIfAbsent(String key, String val, int time, TimeUnit timeUnit) {
+        return redisTemplate.opsForValue().setIfAbsent(key, val, time, timeUnit);
+    }
+}

+ 8 - 0
micro-service/src/main/java/com/poyee/service/BusService.java

@@ -0,0 +1,8 @@
+package com.poyee.service;
+
+/**
+ * 一些通用信息或外部调用
+ */
+public interface BusService {
+    String getQiNiuToken();
+}

+ 38 - 0
micro-service/src/main/java/com/poyee/service/impl/BusServiceImpl.java

@@ -0,0 +1,38 @@
+package com.poyee.service.impl;
+
+import com.poyee.common.constant.BusConstants;
+import com.poyee.common.utils.StringUtils;
+import com.poyee.manager.QiNiuManager;
+import com.poyee.manager.RedisManager;
+import com.poyee.service.BusService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class BusServiceImpl implements BusService {
+    @Resource
+    private RedisManager redisManager;
+
+    @Resource
+    private QiNiuManager qiNiuManager;
+
+    @Override
+    public String getQiNiuToken() {
+        Object cacheStr = redisManager.get(BusConstants.QI_NIU_TOKEN);
+        if (Objects.nonNull(cacheStr) && StringUtils.isNotEmpty(cacheStr.toString())) {
+            return cacheStr.toString();
+        }
+        String upToken = qiNiuManager.getUpToken();
+        if (StringUtils.isNotEmpty(upToken)) {
+            redisManager.set(BusConstants.QI_NIU_TOKEN, upToken, BusConstants.QI_NIU_TOKEN_EXPIRE_TIME);
+        }
+        if (log.isDebugEnabled()) {
+            log.debug("qiNiu={}", upToken);
+        }
+        return upToken;
+    }
+}

+ 2 - 2
micro-service/src/main/java/com/poyee/service/impl/DictServiceImpl.java

@@ -3,7 +3,7 @@ package com.poyee.service.impl;
 import com.alibaba.fastjson2.JSON;
 import com.poyee.common.constant.Constants;
 import com.poyee.common.domain.entity.SysDictData;
-import com.poyee.manager.cache.DictCache;
+import com.poyee.manager.DictCacheManager;
 import com.poyee.service.DictService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -18,7 +18,7 @@ import java.util.stream.Collectors;
 @Service
 public class DictServiceImpl implements DictService {
     @Resource
-    private DictCache dictCache;
+    private DictCacheManager dictCache;
     @Override
     public HashMap<String, List<SysDictData>> getDict(List<String> types, String status) {
         String sqlStatus;

+ 28 - 5
pom.xml

@@ -18,14 +18,15 @@
     </modules>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
+        <sourceEncoding>UTF-8</sourceEncoding>
+        <java.version>1.8</java.version>
         <mahout.version>0.9</mahout.version>
         <dozer.version>6.5.2</dozer.version>
         <bee.version>1.17</bee.version>
         <log.version>1.2.17</log.version>
         <lombok.version>1.18.34</lombok.version>
         <fastjson.version>2.0.10</fastjson.version>
+        <redis.version>3.5.0</redis.version>
     </properties>
 
 	<dependencies>
@@ -39,6 +40,16 @@
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <!-- redis 环境 -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>${redis.version}</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>
@@ -102,16 +113,28 @@
                 <artifactId>fastjson</artifactId>
                 <version>${fastjson.version}</version>
             </dependency>
+            <!--七牛云存储-->
+            <dependency>
+                <groupId>com.qiniu</groupId>
+                <artifactId>qiniu-java-sdk</artifactId>
+                <version>[7.8.0, 7.8.99]</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
     <build>
         <plugins>
             <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
                 <configuration>
-                    <mainClass>com.poyee.controller.DictApplication</mainClass>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${sourceEncoding}</encoding>
+                    <compilerArgs>
+                        <arg>-Xlint:unchecked</arg>
+                    </compilerArgs>
                 </configuration>
             </plugin>
         </plugins>

+ 30 - 4
web-controller/src/main/java/com/poyee/controller/AppCommonController.java

@@ -1,14 +1,14 @@
 package com.poyee.controller;
 
 
+import com.poyee.common.constant.RetConstants;
 import com.poyee.common.domain.entity.SysDictData;
 import com.poyee.common.dto.InDto;
 import com.poyee.common.dto.OutDTO;
+import com.poyee.service.BusService;
 import com.poyee.service.DictService;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.Arrays;
@@ -27,7 +27,15 @@ public class AppCommonController {
     @Resource
     private DictService dictService;
 
-    @RequestMapping("/getDict")
+    @Resource
+    private BusService busService;
+
+    /**
+     * 根据type获取字典数据
+     * @param inDto
+     * @return
+     */
+    @PostMapping("/getDict")
     public OutDTO getDict(@RequestBody InDto inDto) {
         try {
             String type = inDto.getString("type");
@@ -42,4 +50,22 @@ public class AppCommonController {
             return OutDTO.error500("系统异常");
         }
     }
+
+    /**
+     * 查询七牛云token
+     * @return
+     */
+    @PostMapping("/getQnToken")
+    @ResponseBody
+    public OutDTO getQnToken() {
+        try {
+            String token = busService.getQiNiuToken();
+            if (StringUtils.isEmpty(token)) {
+                return OutDTO.errorRet(RetConstants.ERROR_NOT_FOUND);
+            }
+            return OutDTO.ok().put("token", token);
+        } catch (Exception e) {
+            return OutDTO.error500("系统异常");
+        }
+    }
 }