Pārlūkot izejas kodu

add 输注历史排序

18339543638 3 gadi atpakaļ
vecāks
revīzija
02ed0c63f8

+ 23 - 1
nb-admin/src/test/java/com/nb/admin/FileUploadTest.java

@@ -4,10 +4,18 @@ import cn.hutool.core.io.FileUtil;
 import com.nb.oss.strategy.MinioUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.redisson.api.RMap;
+import org.redisson.api.RMapCache;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalUnit;
+import java.util.concurrent.TimeUnit;
+
 /**
  * @Author longsanlang
  * @Date 2022-04-06 17:55:44
@@ -17,12 +25,26 @@ import org.springframework.test.context.junit4.SpringRunner;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = AdminApplication.class)
 public class FileUploadTest {
-    @Autowired
+    @Autowired(required = false)
     MinioUtil minioUtil;
 
+    @Autowired
+    RedissonClient redissonClient;
+
     @Test
     public void upload(){
         String s = minioUtil.uploadObject(FileUtil.getInputStream(FileUtil.file("C:\\Users\\JR\\Desktop\\新疆患者数据.xls")), "/docker-compose.yml");
         System.out.println(s);
     }
+
+    @Test
+    public void test() throws InterruptedException {
+        RMapCache<String, String> mapCache = redissonClient.getMapCache("localhost:123");
+        mapCache.put("1","1",3,TimeUnit.SECONDS);
+        System.out.println(mapCache.get("1"));
+        System.out.println(mapCache.getWithTTLOnly("1"));
+        Thread.sleep(4000);
+        System.out.println(mapCache.get("1"));
+        System.out.println(mapCache.getWithTTLOnly("1"));
+    }
 }

+ 1 - 1
nb-auth/src/main/java/com/nb/auth/granter/TokenParameter.java

@@ -23,7 +23,7 @@ public class TokenParameter {
     @ApiModelProperty("密码  账密登录、app医生登录、疼痛小管家账密登录时使用")
     String password;
 
-    @ApiModelProperty("验证码,web账密登录时使用")
+    @ApiModelProperty("验证码,web账密登录、疼痛小管家手机验证码时使用")
     String code;
 
     @ApiModelProperty("验证码key,web账密登录时使用")

+ 1 - 1
nb-auth/src/main/java/com/nb/auth/sa/SaTokenConfig.java

@@ -54,7 +54,7 @@ public class SaTokenConfig {
         IGNORE_URL.add("/v2/api-docs/*");
         IGNORE_URL.add("/v2/api-docs");
         IGNORE_URL.add("/v1/**");
-        IGNORE_URL.add("/authority/captcha/**");
+        IGNORE_URL.add("/**/captcha/**");
         IGNORE_URL.add("/system/curl/**");
         IGNORE_URL.add("/system/sysConfig/getTime");
         IGNORE_URL.add("/system/sysDept/**");

+ 0 - 1
nb-im/src/main/java/com/nb/im/listener/ConsultMsgListener.java

@@ -32,7 +32,6 @@ import org.springframework.transaction.annotation.Transactional;
 @AllArgsConstructor
 public class ConsultMsgListener {
 
-    private final LocalImMsgService chatRoomMsgService;
     private final LocalImRoomUserService roomUserService;
     private final LocalImRoomService chatRoomService;
     private final ImRoomOperatorManager operatorManager;

+ 48 - 8
nb-service/app-assistant/src/main/java/com/nb/app/assistant/auth/AppAssistantUserOperator.java

@@ -1,14 +1,25 @@
 package com.nb.app.assistant.auth;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.nb.app.assistant.api.feign.result.AssistantUserResult;
 import com.nb.app.assistant.controller.vo.AssistantUserVo;
+import com.nb.app.assistant.entity.AssistantUserEntity;
+import com.nb.app.assistant.service.LocalAssistantUserService;
+import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
+import com.nb.auth.bean.LoginUser;
 import com.nb.auth.controller.vo.AccountInfoVO;
 import com.nb.auth.controller.vo.RouteItemVO;
 import com.nb.auth.controller.vo.UserInfoVO;
 import com.nb.auth.enums.GrantTypeEnum;
 import com.nb.auth.granter.IAccountOperator;
+import com.nb.auth.utils.SecurityUtil;
+import com.nb.core.exception.CustomException;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -19,15 +30,24 @@ import java.util.Set;
  * @createTime 2022年08月10日 10:52:00
  */
 @Component
-public class AppAssistantUserOperator implements IAccountOperator<AssistantUserVo> {
+@AllArgsConstructor
+public class AppAssistantUserOperator implements IAccountOperator<AssistantUserResult> {
+    private final LocalAssistantUserService userService;
     @Override
     public boolean matchGrantType(GrantTypeEnum type) {
-        return GrantTypeEnum.APP_ASSISTANT_PASSWORD.equals(type);
+        return GrantTypeEnum.APP_ASSISTANT_PASSWORD.equals(type)
+                ||GrantTypeEnum.APP_ASSISTANT_ONCELICK.equals(type);
     }
 
     @Override
     public UserInfoVO getUserInfo() {
-        return null;
+        UserInfoVO userInfoVO = new UserInfoVO();
+        AssistantUserEntity user = userService.getBaseMapper().selectById(SecurityUtil.getStpLogic().getLoginIdAsString());
+        userInfoVO.setUserId(user.getId());
+        userInfoVO.setUsername(user.getPhone());
+        userInfoVO.setRealName(user.getNickname());
+        userInfoVO.setAvatar(user.getAvatar());
+        return userInfoVO;
     }
 
     @Override
@@ -41,17 +61,37 @@ public class AppAssistantUserOperator implements IAccountOperator<AssistantUserV
     }
 
     @Override
-    public AccountInfoVO<AssistantUserVo> getAccountInfo() {
-        return null;
+    public AccountInfoVO<AssistantUserResult> getAccountInfo() {
+        AssistantUserResult user = userService.getById(SecurityUtil.getStpLogic().getLoginIdAsString());
+        AccountInfoVO<AssistantUserResult> result = new AccountInfoVO();
+        result.setAvatar(user.getAvatar());
+        result.setRealName(user.getNickname());
+        return result;
     }
 
-    @Override
-    public void saveAccountInfo(AccountInfoVO<AssistantUserVo> req) {
 
+    @Override
+    public void saveAccountInfo(AccountInfoVO<AssistantUserResult> req) {
+        LoginUser<String> loginUser = SecurityUtil.getLoginUser();
+        AssistantUserEntity source = new AssistantUserEntity();
+        source.setId(loginUser.getId());
+        source.setAvatar(req.getAvatar());
+        source.setNickname(req.getRealName());
+        userService.updateById(source);
     }
 
     @Override
     public boolean updatePass(String oldPass, String newPass) {
-        return false;
+        // 密码解密
+        String userId = String.valueOf(String.valueOf(SecurityUtil.getId()));
+        AssistantUserEntity userEntity = userService.getBaseMapper().selectById(userId);
+        if (!SecurityUtil.matchesPassword(oldPass, userEntity.getPassword())) {
+            throw new CustomException("旧密码不正确");
+        }
+        String encryptPassword = SecurityUtil.encryptPassword(newPass);
+        return userService
+                .update(new UpdateWrapper<AssistantUserEntity>()
+                        .lambda().eq(AssistantUserEntity::getId,userId)
+                        .set(AssistantUserEntity::getPassword,encryptPassword));
     }
 }

+ 2 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/auth/AppAssistantGranter.java → nb-service/app-assistant/src/main/java/com/nb/app/assistant/auth/AssistantPasswordGranter.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.nb.app.assistant.api.feign.result.AssistantUserResult;
 import com.nb.app.assistant.entity.AssistantUserEntity;
 import com.nb.app.assistant.service.LocalAssistantUserService;
+import com.nb.app.assistant.utils.CaptchaUtil;
 import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.enums.GrantTypeEnum;
@@ -33,7 +34,7 @@ import static com.nb.auth.utils.SecurityUtil.LOGIN_USER_KEY;
 @Component
 @Slf4j
 @AllArgsConstructor
-public class AppAssistantGranter implements IAuthGranter {
+public class AssistantPasswordGranter implements IAuthGranter {
     private final LocalAssistantUserService assistantUserService;
     @Override
     public GrantTypeEnum getType() {

+ 94 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/auth/AssistantPhoneGranter.java

@@ -0,0 +1,94 @@
+package com.nb.app.assistant.auth;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.nb.app.assistant.entity.AssistantUserEntity;
+import com.nb.app.assistant.enums.CaptchaEnum;
+import com.nb.app.assistant.service.LocalAssistantUserService;
+import com.nb.app.assistant.utils.CaptchaUtil;
+import com.nb.app.msg.bean.MsgBean;
+import com.nb.app.msg.enums.MsgEnum;
+import com.nb.app.msg.event.SaveMsgEvent;
+import com.nb.auth.bean.LoginUser;
+import com.nb.auth.enums.GrantTypeEnum;
+import com.nb.auth.enums.StpTypeEnum;
+import com.nb.auth.granter.IAuthGranter;
+import com.nb.auth.granter.TokenParameter;
+import com.nb.auth.utils.SecurityUtil;
+import com.nb.core.enums.UserPlatformEnum;
+import com.nb.core.exception.CustomException;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import static com.nb.auth.utils.SecurityUtil.LOGIN_USER_KEY;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AppAssistantGranter.java
+ * @Description TODO
+ * @createTime 2022年08月10日 10:16:00
+ */
+@Component
+@Slf4j
+@AllArgsConstructor
+public class AssistantPhoneGranter implements IAuthGranter {
+    private final LocalAssistantUserService assistantUserService;
+    private final CaptchaUtil captchaUtil;
+    @Override
+    public GrantTypeEnum getType() {
+        return GrantTypeEnum.APP_ASSISTANT_ONCELICK;
+    }
+
+    @Override
+    public LoginUser grant(TokenParameter source) {
+        if (StrUtil.isBlank(source.getUsername())) {
+            throw new CustomException("手机号不能为空");
+        }
+        if (StrUtil.isBlank(source.getCode())) {
+            throw new CustomException("验证码不能为空");
+        }
+        captchaUtil.verifyCode(CaptchaEnum.PHONE_LOGIN,source.getUsername(),source.getCode());
+
+        AssistantUserEntity user = assistantUserService.getOne(Wrappers.lambdaQuery(AssistantUserEntity.class)
+                .eq(AssistantUserEntity::getPhone, source.getUsername())
+                .last("limit 1"));
+
+       //自动注册
+        if(user==null){
+            user=new AssistantUserEntity();
+            user.setPhone(source.getUsername());
+            user.setNickname(source.getUsername());
+            user.setPassword(SecurityUtil.encryptPassword("123456"));
+            assistantUserService.save(user);
+        }
+        log.info("登录用户:{}", source.getUsername());
+
+        // 登录
+        SecurityUtil.getStpLogic(StpTypeEnum.ASSISTANT.getText()).login(user.getId());
+        LoginUser<String> loginUser = new LoginUser();
+        loginUser.setToken(SecurityUtil.getStpLogic().getTokenValue());
+        loginUser.setUserPlatform(UserPlatformEnum.APP_ASSIST.getCode());
+        loginUser.setGrantType(source.getGrantType());
+        loginUser.setUsername(source.getUsername());
+        loginUser.setSys(true);
+        loginUser.setId(user.getId());
+        loginUser.setLoginType(StpTypeEnum.ASSISTANT.getText());
+        fillUserAgentInfo(loginUser);
+        // 设置用户信息
+        SecurityUtil.getStpLogic(StpTypeEnum.ASSISTANT.getText()).getTokenSession().set(LOGIN_USER_KEY,loginUser);
+
+        SpringUtil.publishEvent(new SaveMsgEvent(this,
+                MsgBean.builder()
+                        .msgType(MsgEnum.REGISTER)
+                        .senderId("1")
+                        .senderNickname("系统管理员")
+                        .receiverId(user.getId())
+                        .receiverName(user.getNickname())
+                        .sys(true)
+                        .build()));
+        return loginUser;
+    }
+}

+ 32 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/CaptchaController.java

@@ -0,0 +1,32 @@
+package com.nb.app.assistant.controller;
+
+import com.nb.app.assistant.controller.vo.CaptureVo;
+import com.nb.app.assistant.utils.CaptchaUtil;
+import com.nb.core.result.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptureController.java
+ * @Description TODO
+ * @createTime 2022年08月24日 09:49:00
+ */
+@AllArgsConstructor
+@RestController("/assist/capture")
+@Api(tags = "验证码")
+public class CaptchaController {
+    private final CaptchaUtil captchaUtil;
+
+    @PostMapping("/create")
+    @ApiOperation("获取短信验证码")
+    public R<String> capture(@RequestBody @Validated CaptureVo vo){
+        return R.success(captchaUtil.getCode(vo.getType(),vo.getPhone()));
+    }
+}

+ 22 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/vo/CaptureVo.java

@@ -0,0 +1,22 @@
+package com.nb.app.assistant.controller.vo;
+
+import com.nb.app.assistant.enums.CaptchaEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptureVo.java
+ * @Description TODO
+ * @createTime 2022年08月24日 09:55:00
+ */
+@Data
+@ApiModel("验证码")
+public class CaptureVo {
+    @ApiModelProperty(value = "验证码用途",example = "0",allowableValues = "0、短信验证码")
+    private CaptchaEnum type;
+    @ApiModelProperty("手机号")
+    private String phone;
+}

+ 30 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/enums/CaptchaEnum.java

@@ -0,0 +1,30 @@
+package com.nb.app.assistant.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptchaEnum.java
+ * @Description TODO
+ * @createTime 2022年08月24日 11:01:00
+ */
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum  CaptchaEnum  implements IEnum<Integer> {
+    PHONE_LOGIN(0,"短信登录")
+    ;
+    /**
+     * 与枚举ordinal保持一致
+     */
+    @Getter
+    @ApiModelProperty("编码")
+    private Integer value;
+    @Getter
+    @ApiModelProperty("内容")
+    private String text;
+}

+ 53 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/utils/CaptchaUtil.java

@@ -0,0 +1,53 @@
+package com.nb.app.assistant.utils;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.nb.app.assistant.enums.CaptchaEnum;
+import com.nb.core.exception.CustomException;
+import org.redisson.api.RMapCache;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName CaptureUtil.java
+ * @Description TODO
+ * @createTime 2022年08月24日 09:58:00
+ */
+@Component
+public class CaptchaUtil {
+    private final RMapCache<String, String> codeCache;
+    public CaptchaUtil(RedissonClient redissonClient) {
+        codeCache = redissonClient.getMapCache("assist:phone:code");
+    }
+
+    public String getCode(CaptchaEnum type, String codeKey){
+        String key =getKey(type.name(),codeKey);
+
+        String result = codeCache.getWithTTLOnly(key);
+        if (StrUtil.isNullOrUndefined(result)) {
+            result= RandomUtil.randomNumbers(4);
+            codeCache.put(key,result,5, TimeUnit.MINUTES);
+        }
+        return result;
+    }
+
+    public boolean verifyCode(CaptchaEnum type,String codeKey,String code){
+        String key = getKey(type.name(),codeKey);
+        String result = codeCache.getWithTTLOnly(key);
+        if (StrUtil.isNullOrUndefined(result)) {
+            throw new CustomException("验证码已失效");
+        }
+        if(!result.equals(code)){
+            throw new CustomException("验证码错误");
+        }
+        return true;
+    }
+
+    private String getKey(String type, String codeKey){
+        return type+"-"+codeKey;
+    }
+}