Ver código fonte

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

# Conflicts:
#	src/main/resources/application-dev.yml
#	src/main/resources/application-pre.yml
#	src/main/resources/application-prod.yml
大数据与最优化研究所 1 ano atrás
pai
commit
45bf2d1518

+ 1 - 1
src/main/java/com/xjrsoft/module/student/dto/PbVXsxxsfytbExcelDto.java

@@ -16,7 +16,7 @@ import java.util.List;
 */
 @Data
 @EqualsAndHashCode(callSuper = false)
-public class PbVXsxxsfytbExcelDto {
+public class PbVXsxxsfytbExcelDto extends PbVXsxxsfytbPageDto {
 
     /**
      * 主键

+ 0 - 7
src/main/java/com/xjrsoft/module/student/vo/PbVXsxxsfytbExcelVo.java

@@ -60,13 +60,6 @@ public class PbVXsxxsfytbExcelVo {
     @ApiModelProperty("应缴金额 ")
     private BigDecimal factar;
     /**
-    * 欠费金额
-    */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("欠费金额")
-    @ApiModelProperty("欠费金额")
-    private BigDecimal arrearagemny;
-    /**
     * 实缴金额
     */
     @ContentStyle(dataFormat = 49)

+ 54 - 1
src/main/java/com/xjrsoft/module/system/controller/LoginController.java

@@ -1,7 +1,9 @@
 package com.xjrsoft.module.system.controller;
 
+import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.jwt.JWT;
@@ -11,8 +13,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.sms.SmsCtcc;
+import com.xjrsoft.common.utils.QrCodeUtil;
 import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.config.KeyCloakConfig;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
@@ -23,8 +28,11 @@ import com.xjrsoft.module.system.dto.KeyCloakLoginInfoDto;
 import com.xjrsoft.module.system.dto.LoginByCodeDto;
 import com.xjrsoft.module.system.dto.LoginCaptchaDto;
 import com.xjrsoft.module.system.dto.LoginDto;
+import com.xjrsoft.module.system.dto.LoginQRCodeDto;
 import com.xjrsoft.module.system.service.ILoginService;
 import com.xjrsoft.module.system.service.IOauthService;
+import com.xjrsoft.module.system.vo.LoginCheckQRCodeVo;
+import com.xjrsoft.module.system.vo.LoginQRCodeVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -38,6 +46,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
@@ -69,6 +78,8 @@ public class LoginController {
 
     private IOauthService oauthService;
 
+    private final CommonPropertiesConfig commonPropertiesConfig;
+
     @PostMapping("/login")
     @ApiOperation(value = "登录", notes = "传入账号:account,密码:password")
     @XjrLog(value = "账号密码登录成功")
@@ -83,8 +94,50 @@ public class LoginController {
         return R.ok(loginService.loginByCode(dto));
     }
 
+    @GetMapping(value = "/loginQRCode")
+    @ApiOperation(value="登录-二维码")
+    @SaCheckPermission("wfstudenttextbookclaim:detail")
+    public RT<LoginQRCodeVo> qrcode() throws Exception {
+        String url = commonPropertiesConfig.getDomainApp() + "/system/QR-code-login?";
+        int width = 200;
+        int height = 200;
+        int margin = 1;
+
+        try {
+            String base64 = QrCodeUtil.createBase64(url, width, height, margin);
+            LoginQRCodeVo loginQRCodeVo = new LoginQRCodeVo();
+            loginQRCodeVo.setImgBase64(base64);
+            long loginCode = IdUtil.getSnowflakeNextId();
+            loginQRCodeVo.setLoginCode(loginCode + "");
+            return RT.ok(loginQRCodeVo);
+        } catch (Exception e) {
+            return RT.error(e.getMessage());
+        }
+    }
+
+    @PostMapping("/QR-code-login")
+    @ApiOperation(value = "二维码登录", notes = "code")
+    @XjrLog(value = "二维码登录")
+    public R loginQRCode(@RequestBody @Valid LoginQRCodeDto dto) throws Exception {
+        return R.ok(loginService.loginQRCode(dto));
+    }
+
+    @PostMapping("/check-QR-code-login")
+    @ApiOperation(value = "验证是否登录成功", notes = "验证是否登录成功")
+    @XjrLog(value = "验证是否登录成功")
+    public RT<LoginCheckQRCodeVo> checkLoginQRCode(@RequestBody @Valid String loginCode) {
+        String token = redisUtil.get(loginCode);
+        LoginCheckQRCodeVo loginCheckQRCodeVo = new LoginCheckQRCodeVo();
+        loginCheckQRCodeVo.setToken(token);
+        loginCheckQRCodeVo.setStatus(0);
+        if(StrUtil.isEmpty(token)){
+            loginCheckQRCodeVo.setStatus(1);
+        }
+        return RT.ok(loginCheckQRCodeVo);
+    }
+
     @PostMapping("/bindOpenid")
-    @ApiOperation(value = "登录", notes = "code")
+    @ApiOperation(value = "登录", notes = "登录")
     @XjrLog(value = "code换Openid并绑定")
     public R bindOpenid(@RequestBody @Valid LoginByCodeDto dto) throws Exception {
         return R.ok(loginService.bindOpenid(dto));

+ 18 - 0
src/main/java/com/xjrsoft/module/system/dto/LoginQRCodeDto.java

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class LoginQRCodeDto {
+    @ApiModelProperty("openId")
+    @NotBlank(message = "openId不能为空!")
+    private String openId;
+
+    @ApiModelProperty("loginCode")
+    @NotBlank(message = "loginCode不能为空!")
+    private String loginCode;
+
+}

+ 9 - 0
src/main/java/com/xjrsoft/module/system/service/ILoginService.java

@@ -4,6 +4,7 @@ import com.xjrsoft.module.system.dto.CreateTokenDto;
 import com.xjrsoft.module.system.dto.LoginByCodeDto;
 import com.xjrsoft.module.system.dto.LoginCaptchaDto;
 import com.xjrsoft.module.system.dto.LoginDto;
+import com.xjrsoft.module.system.dto.LoginQRCodeDto;
 import com.xjrsoft.module.system.vo.CreateTokenVo;
 import com.xjrsoft.module.system.vo.ImgCaptchaVo;
 import com.xjrsoft.module.system.vo.LoginByCodeVo;
@@ -26,4 +27,12 @@ public interface ILoginService {
     CreateTokenVo createToken(CreateTokenDto dto);
 
     ImgCaptchaVo imgCaptcha();
+
+    /**
+     * 微信公众号扫码登录
+     * @param dto
+     * @return
+     * @throws Exception
+     */
+    Boolean loginQRCode(LoginQRCodeDto dto) throws Exception;
 }

+ 26 - 0
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -37,6 +37,7 @@ import com.xjrsoft.module.system.dto.CreateTokenDto;
 import com.xjrsoft.module.system.dto.LoginByCodeDto;
 import com.xjrsoft.module.system.dto.LoginCaptchaDto;
 import com.xjrsoft.module.system.dto.LoginDto;
+import com.xjrsoft.module.system.dto.LoginQRCodeDto;
 import com.xjrsoft.module.system.service.ILoginService;
 import com.xjrsoft.module.system.vo.CreateTokenVo;
 import com.xjrsoft.module.system.vo.ImgCaptchaVo;
@@ -192,6 +193,31 @@ public class LoginServiceImpl implements ILoginService {
         return new ImgCaptchaVo(rKey, captcha.toBase64());
     }
 
+    @Override
+    public Boolean loginQRCode(LoginQRCodeDto dto) throws Exception {
+        if (licenseConfig.getEnabled()) {
+            //查出所有在线用户
+            List<String> onlineUser = StpUtil.searchSessionId("", 0, -1, true);
+
+            //如果已经登录人数超过授权人数  不允许登录
+            if (onlineUser.size() >= licenseConfig.getLoginMax()) {
+                throw new MyException("登录人数超过授权人数,无法登录,请联系管理员!");
+            }
+        }
+
+        User loginUser = userService.getOne(
+            Wrappers.lambdaQuery(User.class)
+            .eq(User::getOpenId, dto.getOpenId())
+        );
+
+        if (loginUser == null) {
+            throw new MyException("未能查询到您的用户信息");
+        }
+        LoginVo pc = getLoginInfo(loginUser, "PC");
+        redisUtil.set(dto.getLoginCode(), pc.getToken(), 5 * 60);
+        return Boolean.TRUE;
+    }
+
     private LoginVo getLoginInfo(User loginUser, String loginType) throws Exception {
         LoginVo result = new LoginVo();
         if (loginUser.getEnabledMark() == EnabledMark.DISABLED.getCode()) {

+ 19 - 0
src/main/java/com/xjrsoft/module/system/vo/LoginCheckQRCodeVo.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.system.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2024/3/22
+ */
+@Data
+public class LoginCheckQRCodeVo {
+
+    @ApiModelProperty("token")
+    private String token;
+
+    @ApiModelProperty("状态(0:未失效 1:失效)")
+    private Integer status;
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/system/vo/LoginQRCodeVo.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.system.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author dzx
+ * @date 2024/3/22
+ */
+@Data
+public class LoginQRCodeVo {
+
+    @ApiModelProperty("二维码base64")
+    private String imgBase64;
+
+    @ApiModelProperty("登录编码")
+    private String loginCode;
+
+}

+ 1 - 0
src/main/resources/application-dev.yml

@@ -109,6 +109,7 @@ xjrsoft:
       - /system/bindOpenid # 绑定openid
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
+      - /system/loginQRCode
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 1 - 0
src/main/resources/application-pre.yml

@@ -93,6 +93,7 @@ xjrsoft:
       - /system/bindOpenid # 绑定openid
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
+      - /system/loginQRCode
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 1 - 0
src/main/resources/application-prod.yml

@@ -88,6 +88,7 @@ xjrsoft:
       - /system/bindOpenid # 绑定openid
       - /schedule/schedule/receive-msg
       - /system/check-QR-code-login
+      - /system/loginQRCode
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25