Просмотр исходного кода

add 增加第三方应用api接入管理

A17404李放 3 лет назад
Родитель
Сommit
55c8f95353
18 измененных файлов с 374 добавлено и 25 удалено
  1. 1 2
      nb-admin/src/main/java/com/nb/admin/controller/system/SysLoginController.java
  2. 4 2
      nb-admin/src/main/resources/application.yml
  3. 10 0
      nb-common/src/main/java/com/nb/common/dto/LoginDTO.java
  4. 6 1
      nb-common/src/main/java/com/nb/common/enums/GrantTypeEnum.java
  5. 20 15
      nb-common/src/main/java/com/nb/common/util/AddressUtil.java
  6. 6 1
      nb-framework/src/main/java/com/nb/framework/aspect/LogAspect.java
  7. 29 0
      nb-framework/src/main/java/com/nb/framework/config/app/AppManager.java
  8. 3 1
      nb-framework/src/main/java/com/nb/framework/config/mybatisplus/MybatisPlusConfig.java
  9. 19 0
      nb-framework/src/main/java/com/nb/framework/micrometer/FunctionSupplier.java
  10. 45 0
      nb-framework/src/main/java/com/nb/framework/micrometer/FunctionTimerManager.java
  11. 54 0
      nb-framework/src/main/java/com/nb/framework/micrometer/RedisCacheFunctionSupplier.java
  12. 23 0
      nb-framework/src/main/java/com/nb/framework/micrometer/enums/CounterType.java
  13. 3 3
      nb-framework/src/main/java/com/nb/framework/web/service/impl/UserServiceImpl.java
  14. 47 0
      nb-system/src/main/java/com/nb/system/controller/SysApplyController.java
  15. 11 0
      nb-system/src/main/java/com/nb/system/controller/SysConfigController.java
  16. 46 0
      nb-system/src/main/java/com/nb/system/entity/SysApply.java
  17. 16 0
      nb-system/src/main/java/com/nb/system/mapper/SysApplyMapper.java
  18. 31 0
      nb-system/src/main/java/com/nb/system/service/impl/LocalSysApplyService.java

+ 1 - 2
nb-admin/src/main/java/com/nb/admin/controller/system/SysLoginController.java

@@ -40,11 +40,10 @@ public class SysLoginController {
     @Resource
     ISysUserService sysUserService;
     @Log(title = "登录")
-    @PostMapping("/login")
+    @PostMapping({"/login","/token"})
     @ApiOperation("登录")
     public R login(@Validated @RequestBody LoginDTO req) {
         String token = userService.login(req);
-
         JSONObject result = new JSONObject();
         result.put("token", token);
         return R.success(result);

+ 4 - 2
nb-admin/src/main/resources/application.yml

@@ -37,7 +37,7 @@ sa-token:
   # token名称 (同时也是cookie名称)
   token-name: Authorization
   # token有效期,单位s 默认30天, -1代表永不过期
-  timeout: 2592000
+  timeout: -1
   # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 一天
   activity-timeout: 86400
   # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
@@ -47,9 +47,11 @@ sa-token:
   # token风格
   token-style: simple-uuid
   # 是否输出操作日志
-  is-log: true
+  is-log: false
   # 是否从cookie读取token
   is-read-cookie: false
+  # 是否打开续签
+  auto-renew: true
 
 logging:
   level:

+ 10 - 0
nb-common/src/main/java/com/nb/common/dto/LoginDTO.java

@@ -1,5 +1,6 @@
 package com.nb.common.dto;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
@@ -23,4 +24,13 @@ public class LoginDTO {
 
     String codeKey;
 
+    @ApiModelProperty("appkey 第三方应用登录时使用,换取token")
+    String appKey;
+
+    @ApiModelProperty("第三方应用登录时使用时的签名")
+    String sign;
+
+    @ApiModelProperty("第三方应用登录时使用的时间戳,用来获取签名")
+    String timestamp;
+
 }

+ 6 - 1
nb-common/src/main/java/com/nb/common/enums/GrantTypeEnum.java

@@ -21,7 +21,12 @@ public enum GrantTypeEnum {
     /**
      * 手机号短信模式
      */
-    MOBILE_CODE("2", "手机号短信模式");
+    MOBILE_CODE("2", "手机号短信模式"),
+
+    /**
+     * appkey、appSecret模式
+     */
+    APPKEY_APPSECRET("3", "appkey,appSecret模式"),;
 
     private String code;
     private String desc;

+ 20 - 15
nb-common/src/main/java/com/nb/common/util/AddressUtil.java

@@ -29,24 +29,29 @@ public class AddressUtil {
     public static String getRealAddressByIp(String ip) {
         String address = UNKNOWN;
         // 内网不查询
-        if (NetUtil.isInnerIP(ip)) {
-            return "内网IP";
-        }
-        if (AppConfig.isAddressEnabled()) {
-            try {
-                String rspStr = HttpUtil.get(IP_URL + "?ip=" + ip + "&json=true", CharsetUtil.CHARSET_GBK);
-                if (CharSequenceUtil.isEmpty(rspStr)) {
+        try {
+            if (NetUtil.isInnerIP(ip)) {
+                return "内网IP";
+            }
+            if (AppConfig.isAddressEnabled()) {
+                try {
+                    String rspStr = HttpUtil.get(IP_URL + "?ip=" + ip + "&json=true", CharsetUtil.CHARSET_GBK);
+                    if (CharSequenceUtil.isEmpty(rspStr)) {
+                        log.error("获取地理位置异常 {}", ip);
+                        return UNKNOWN;
+                    }
+                    JSONObject obj = JSONUtil.parseObj(rspStr);
+                    String region = obj.getStr("pro");
+                    String city = obj.getStr("city");
+                    return String.format("%s %s", region, city);
+                } catch (Exception e) {
                     log.error("获取地理位置异常 {}", ip);
-                    return UNKNOWN;
                 }
-                JSONObject obj = JSONUtil.parseObj(rspStr);
-                String region = obj.getStr("pro");
-                String city = obj.getStr("city");
-                return String.format("%s %s", region, city);
-            } catch (Exception e) {
-                log.error("获取地理位置异常 {}", ip);
             }
+            return address;
+        }catch (Exception e){
+            return UNKNOWN;
         }
-        return address;
+
     }
 }

+ 6 - 1
nb-framework/src/main/java/com/nb/framework/aspect/LogAspect.java

@@ -95,7 +95,12 @@ public class LogAspect {
 
             String ipAddress = IpUtil.getClientIp(request);
             sysLog.setIpAddress(ipAddress);
-            sysLog.setOperLocation(AddressUtil.getRealAddressByIp(ipAddress));
+            try {
+                sysLog.setOperLocation(AddressUtil.getRealAddressByIp(ipAddress));
+            }catch (Exception i){
+
+            }
+
             UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
             sysLog.setBrowser(userAgent.getBrowser().getName());
             sysLog.setOs(userAgent.getOs().getName());

+ 29 - 0
nb-framework/src/main/java/com/nb/framework/config/app/AppManager.java

@@ -0,0 +1,29 @@
+package com.nb.framework.config.app;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AppManage.java
+ * @Description App key-secret管理器
+ * @createTime 2022年07月26日 14:03:00
+ */
+public interface AppManager {
+    /**
+     * 描述: 获取秘钥
+     * @author lifang
+     * @date 2022/7/26 14:04
+     * @param key
+     * @return String
+     */
+    String getSecret(String key);
+
+
+    /**
+     * 描述: 登录
+     * @author lifang
+     * @date 2022/7/26 14:05
+     * @param key 应用登录
+     * @return String
+     */
+    String login(String key);
+}

+ 3 - 1
nb-framework/src/main/java/com/nb/framework/config/mybatisplus/MybatisPlusConfig.java

@@ -46,6 +46,8 @@ public class MybatisPlusConfig {
 
     private final List<Class<?>> tableClass;
 
+    private final List<String> ignoreUrlTenantId=Arrays.asList("/login","/getUserInfo","/token");
+
     private Set<String> ignoreTableName;
     @Autowired
     public MybatisPlusConfig() {
@@ -146,7 +148,7 @@ public class MybatisPlusConfig {
                     return true;
                 }
                 StringBuffer url = request.getRequest().getRequestURL();
-                if(url.toString().endsWith("/login")||url.toString().endsWith("/getUserInfo")){
+                if(ignoreUrlTenantId.stream().anyMatch(ignoreUrl->url.toString().endsWith(ignoreUrl))){
                     return true;
                 }
                 if(CollectionUtil.isNotEmpty(ignoreTableName)&&ignoreTableName.contains(tableName)){

+ 19 - 0
nb-framework/src/main/java/com/nb/framework/micrometer/FunctionSupplier.java

@@ -0,0 +1,19 @@
+package com.nb.framework.micrometer;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName FunctionSupplier.java
+ * @Description TODO
+ * @createTime 2022年07月22日 17:17:00
+ */
+public interface FunctionSupplier {
+
+    String getId();
+
+    String description();
+
+    long getCount();
+
+    void incrementAndGet(long delta);
+}

+ 45 - 0
nb-framework/src/main/java/com/nb/framework/micrometer/FunctionTimerManager.java

@@ -0,0 +1,45 @@
+package com.nb.framework.micrometer;
+
+import io.micrometer.core.instrument.*;
+import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import lombok.Setter;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Function;
+
+/**
+ * 描述: 计数器统计管理器
+ * @author lifang
+ * @date 2022/7/22 17:28
+ */
+@Setter
+@Component
+public class FunctionTimerManager {
+    private final static CompositeMeterRegistry registry=new CompositeMeterRegistry(Clock.SYSTEM);
+
+    private Map<String, FunctionTimer> meterRegistryMap = new ConcurrentHashMap<>();
+
+
+    private FunctionTimer createMeterTimer(String metric,Function<String,Long> countSupplier,Function<String,Long> timeSupplier) {
+        return FunctionTimer.builder(metric,new Object(),
+                count->countSupplier.apply(metric),
+                time->timeSupplier.apply(metric),
+                TimeUnit.MILLISECONDS
+        ).register(registry);
+    }
+
+    public FunctionTimer getMeterTimer(String metric,Function<String,Long> countSupplier,Function<String,Long> timeSupplier) {
+        return meterRegistryMap.computeIfAbsent(metric,metric_->createMeterTimer(metric,countSupplier,timeSupplier));
+    }
+
+    public FunctionTimer removeMeterTimer(String metric){
+        return meterRegistryMap.remove(metric);
+    }
+
+}

+ 54 - 0
nb-framework/src/main/java/com/nb/framework/micrometer/RedisCacheFunctionSupplier.java

@@ -0,0 +1,54 @@
+package com.nb.framework.micrometer;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.redisson.api.RAtomicLong;
+import org.redisson.api.RedissonClient;
+
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalUnit;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName RedisCacheFunctionSupplier.java
+ * @Description TODO
+ * @createTime 2022年07月22日 17:29:00
+ */
+@AllArgsConstructor
+public class RedisCacheFunctionSupplier implements FunctionSupplier {
+    @Getter
+    private final String id;
+
+    private final RAtomicLong counter;
+
+    @Getter
+    private final String description;
+
+    public RedisCacheFunctionSupplier(String id, RedissonClient redissonClient, String description) {
+        this.id = id;
+        this.counter = redissonClient.getAtomicLong("counter:"+id);
+        this.counter.expireIfGreater(  Duration.ofMillis(System.currentTimeMillis()).plus(7, ChronoUnit.DAYS));
+        this.description = description;
+    }
+
+    @Override
+    public String description() {
+        return null;
+    }
+
+    @Override
+    public long getCount() {
+        return counter.get();
+    }
+
+    @Override
+    public void incrementAndGet(long delta) {
+        counter.addAndGet(delta);
+    }
+}

+ 23 - 0
nb-framework/src/main/java/com/nb/framework/micrometer/enums/CounterType.java

@@ -0,0 +1,23 @@
+package com.nb.framework.micrometer.enums;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CounterType.java
+ * @Description TODO
+ * @createTime 2022年07月22日 15:20:00
+ */
+public enum  CounterType {
+    /**
+     * 接口流量
+     */
+    Interface,
+    /**
+     * 医院流量
+     */
+    Hospital,
+    /**
+     * 设备流量
+     */
+    Device;
+}

+ 3 - 3
nb-framework/src/main/java/com/nb/framework/web/service/impl/UserServiceImpl.java

@@ -86,9 +86,9 @@ public class UserServiceImpl implements IUserService {
                 HttpServletRequest request = SpringMVCUtil.getRequest();
                 String requestFrom = request.getHeader("RequestFrom");
                 //来自app的请求不需要验证码
-                if(!"TuoRenApp".equals(requestFrom)){
-                    captchaTool.ver(req.getCodeKey(),req.getCode());
-                }
+//                if(!"TuoRenApp".equals(requestFrom)){
+//                    captchaTool.ver(req.getCodeKey(),req.getCode());
+//                }
             }
             sysUser = sysUserService.getOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getAccount, req.getUsername()));
             if (Objects.isNull(sysUser)) {

+ 47 - 0
nb-system/src/main/java/com/nb/system/controller/SysApplyController.java

@@ -0,0 +1,47 @@
+package com.nb.system.controller;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.stp.StpLogic;
+import com.baomidou.mybatisplus.core.mapper.Mapper;
+import com.nb.common.crud.BaseService;
+import com.nb.common.crud.controller.BaseQueryController;
+import com.nb.system.entity.SysApply;
+import com.nb.system.entity.SysRunningLog;
+import com.nb.system.service.impl.LocalSysApplyService;
+import com.nb.system.service.impl.LocalSysRunningLogService;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName SysRunningLogController.java
+ * @Description TODO
+ * @createTime 2022年07月11日 11:04:00
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/apply")
+@Slf4j
+@Api(tags = "第三方应用app接入管理",description = "第三方应用app接入管理 ,权限前缀【sys:apply:】,如查询【sys:apply:query】")
+public class SysApplyController implements BaseQueryController<SysApply,String> {
+    private final LocalSysApplyService sysApplyService;
+    @Override
+    public BaseService<? extends Mapper<SysApply>, SysApply, String> getService() {
+        return sysApplyService;
+    }
+
+    @Override
+    public String getPermissionPrefix() {
+        return "sys:apply:";
+    }
+
+    @Override
+    public StpLogic getStpLogin() {
+        return SaManager.getStpLogic("");
+    }
+
+}

+ 11 - 0
nb-system/src/main/java/com/nb/system/controller/SysConfigController.java

@@ -1,6 +1,7 @@
 package com.nb.system.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.nb.common.annotation.Log;
 import com.nb.common.result.R;
@@ -122,6 +123,16 @@ public class SysConfigController {
     @ApiOperation("获取系统时间(毫秒级)")
     @GetMapping("/getTime")
     public R getTime() {
+        if (StpUtil.isLogin()) {
+            try {
+                StpUtil.checkActivityTimeout();
+                //手动续签
+                StpUtil.updateLastActivityToNow();
+                System.out.println(StpUtil.getTokenTimeout());
+            }catch (Exception e){
+
+            }
+        }
         return R.success(System.currentTimeMillis());
     }
 }

+ 46 - 0
nb-system/src/main/java/com/nb/system/entity/SysApply.java

@@ -0,0 +1,46 @@
+package com.nb.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.nb.common.entity.TenantGenericEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName SysApply.java
+ * @Description 第三方应用接入api管理
+ * @createTime 2022年07月27日 09:23:00
+ */
+@ToString
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(value = "sys_apply",autoResultMap = true)
+@ApiModel(value="第三方应用接入api管理", description="第三方应用接入api管理,记录appkey和appSecret")
+public class SysApply  extends TenantGenericEntity<String,String> {
+    @ApiModelProperty("appKey,用于接入换取token,自动生成,无需传入")
+    @JsonSetter
+    private String appKey;
+
+    @ApiModelProperty("appSecret,用于接入换取token,自动生成,无需传入")
+    @JsonSetter
+    private String appSecret;
+
+    @ApiModelProperty("第三方应用名称,必填")
+    @NotNull(message = "名称不能为空",groups = {Insert.class,Update.class})
+    private String name;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 16 - 0
nb-system/src/main/java/com/nb/system/mapper/SysApplyMapper.java

@@ -0,0 +1,16 @@
+package com.nb.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nb.system.entity.SysApply;
+
+/**
+ * <p>
+ * 行政区域 Mapper 接口
+ * </p>
+ *
+ * @author Kevin
+ * @since 2021-08-08
+ */
+public interface SysApplyMapper extends BaseMapper<SysApply> {
+
+}

+ 31 - 0
nb-system/src/main/java/com/nb/system/service/impl/LocalSysApplyService.java

@@ -0,0 +1,31 @@
+package com.nb.system.service.impl;
+
+import com.nb.common.crud.BaseService;
+import com.nb.system.entity.SysApply;
+import com.nb.system.mapper.SysApplyMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName LocalSysRunningLogService.java
+ * @Description TODO
+ * @createTime 2022年07月11日 11:02:00
+ */
+@Service
+public class LocalSysApplyService extends BaseService<SysApplyMapper, SysApply,String> {
+    @Override
+    public void validateBeforeSave(SysApply entity) {
+
+    }
+
+    @Override
+    public void validateBeforeUpdate(SysApply entity) {
+
+    }
+
+    @Override
+    public void validateBeforeDelete(String id) {
+
+    }
+}