Sfoglia il codice sorgente

verify code login.

deason 5 anni fa
parent
commit
a9a3d88af3

+ 45 - 0
examcloud-core-basic-api-provider/src/main/java/cn/com/qmth/examcloud/core/basic/api/controller/VerifyCodeController.java

@@ -0,0 +1,45 @@
+package cn.com.qmth.examcloud.core.basic.api.controller;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.basic.service.VerifyCodeService;
+import cn.com.qmth.examcloud.core.basic.service.bean.VerifyCodeLoginInfo;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import cn.com.qmth.examcloud.web.support.Naked;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 验证码相关接口
+ */
+@RestController
+@Api(tags = "验证码相关接口")
+@RequestMapping("/api/ecs_core")
+public class VerifyCodeController extends ControllerSupport {
+
+    @Autowired
+    private VerifyCodeService verifyCodeService;
+
+    @Naked
+    @ApiOperation(value = "验证码生成接口")
+    @PostMapping(value = "/verifyCode/generate")
+    public String generate(@RequestParam Long rootOrgId, @RequestParam String accountValue) {
+        return verifyCodeService.verifyCodeGenerate(rootOrgId, accountValue);
+    }
+
+    @Naked
+    @ApiOperation(value = "验证码登录接口")
+    @PostMapping(value = "/verifyCode/login")
+    public User login(@RequestBody VerifyCodeLoginInfo info) {
+        return verifyCodeService.verifyCodeLogin(info);
+    }
+
+    @Naked
+    @ApiOperation(value = "Resource接口")
+    @GetMapping(value = "/resource/{uuid}.js")
+    public void resource(@PathVariable String uuid) {
+        verifyCodeService.verifyCodeResource(uuid);
+    }
+
+}

+ 117 - 0
examcloud-core-basic-base/src/main/java/cn/com/qmth/examcloud/core/basic/base/util/VerifyCode.java

@@ -0,0 +1,117 @@
+package cn.com.qmth.examcloud.core.basic.base.util;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+
+import javax.imageio.ImageIO;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Random;
+
+/**
+ * 数字公式验证码
+ */
+public class VerifyCode {
+
+    private static final char[] OPS = new char[]{'+', '-', '*'};
+
+    /**
+     * 生成验证码图片
+     */
+    public static Result generateVerifyCode() {
+        int width = 80;
+        int height = 32;
+
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        Graphics graphics = image.getGraphics();// 画笔
+        graphics.setColor(new Color(0xDCDCDC));// 背景色
+        graphics.fillRect(0, 0, width, height);
+
+        graphics.setColor(Color.black);// 边框色
+        graphics.drawRect(0, 0, width - 1, height - 1);
+
+        // 生成N个干扰点
+        Random random = new Random();
+        for (int i = 0; i < 50; i++) {
+            int x = random.nextInt(width);
+            int y = random.nextInt(height);
+            graphics.drawOval(x, y, 0, 0);
+        }
+
+        // 随机生成三个数字、并组合成一个数学公式
+        String verifyCode = new StringBuilder()
+                .append(random.nextInt(10))
+                .append(OPS[random.nextInt(3)])
+                .append(random.nextInt(10))
+                .append(OPS[random.nextInt(3)])
+                .append(random.nextInt(10))
+                .toString();
+
+        graphics.setColor(new Color(0, 100, 0));
+        graphics.setFont(new Font("Candara", Font.BOLD, 24));
+        graphics.drawString(verifyCode, 8, 24);
+        graphics.dispose();
+
+        Integer result;
+        try {
+            // 将验证码的字符串算出结果
+            ScriptEngineManager manager = new ScriptEngineManager();
+            ScriptEngine engine = manager.getEngineByName("JavaScript");
+            result = (Integer) engine.eval(verifyCode);
+        } catch (Exception e) {
+            throw new StatusException("500", "验证码图片生成失败!", e);
+        }
+
+        return new Result(image, result);
+    }
+
+    public static byte[] imageToBytes(BufferedImage image) {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try {
+            ImageIO.write(image, "JPEG", out);
+        } catch (IOException e) {
+            throw new StatusException("500", "验证码图片处理失败!", e);
+        }
+        return out.toByteArray();
+    }
+
+    public static class Result implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private BufferedImage image;// 验证码图片
+
+        private Integer result;// 验证码结果
+
+        public Result(BufferedImage image, Integer result) {
+            this.image = image;
+            this.result = result;
+        }
+
+        public Result() {
+
+        }
+
+        public BufferedImage getImage() {
+            return image;
+        }
+
+        public void setImage(BufferedImage image) {
+            this.image = image;
+        }
+
+        public Integer getResult() {
+            return result;
+        }
+
+        public void setResult(Integer result) {
+            this.result = result;
+        }
+    }
+
+}

+ 30 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/VerifyCodeService.java

@@ -0,0 +1,30 @@
+package cn.com.qmth.examcloud.core.basic.service;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.basic.service.bean.VerifyCodeLoginInfo;
+
+/**
+ * 验证码相关接口
+ */
+public interface VerifyCodeService {
+
+    /**
+     * 验证码生成接口
+     *
+     * @return 字符串:base64 + uuid
+     */
+    String verifyCodeGenerate(Long rootOrgId, String accountValue);
+
+    /**
+     * 验证码登录接口
+     *
+     * @return 登录成功信息
+     */
+    User verifyCodeLogin(VerifyCodeLoginInfo info);
+
+    /**
+     * Resource接口
+     */
+    void verifyCodeResource(String uuid);
+
+}

+ 79 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/bean/VerifyCodeLoginInfo.java

@@ -0,0 +1,79 @@
+package cn.com.qmth.examcloud.core.basic.service.bean;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 验证码登陆信息
+ */
+public class VerifyCodeLoginInfo implements JsonSerializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("顶级机构ID")
+    private Long rootOrgId;
+
+    @ApiModelProperty("登陆账号类型")
+    private String accountType;
+
+    @ApiModelProperty("登陆账号")
+    private String accountValue;
+
+    @ApiModelProperty("登陆账号密码")
+    private String password;
+
+    @ApiModelProperty("验证码编号")
+    private String uuid;
+
+    @ApiModelProperty("验证码结果")
+    private Integer verifyCode;
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public String getAccountType() {
+        return accountType;
+    }
+
+    public void setAccountType(String accountType) {
+        this.accountType = accountType;
+    }
+
+    public String getAccountValue() {
+        return accountValue;
+    }
+
+    public void setAccountValue(String accountValue) {
+        this.accountValue = accountValue;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public Integer getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(Integer verifyCode) {
+        this.verifyCode = verifyCode;
+    }
+
+}

+ 62 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/impl/VerifyCodeServiceImpl.java

@@ -0,0 +1,62 @@
+package cn.com.qmth.examcloud.core.basic.service.impl;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.commons.util.UUID;
+import cn.com.qmth.examcloud.core.basic.base.util.VerifyCode;
+import cn.com.qmth.examcloud.core.basic.service.VerifyCodeService;
+import cn.com.qmth.examcloud.core.basic.service.bean.VerifyCodeLoginInfo;
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 验证码相关接口
+ */
+@Service
+public class VerifyCodeServiceImpl implements VerifyCodeService {
+
+    private static final Logger log = LoggerFactory.getLogger(VerifyCodeServiceImpl.class);
+
+    /**
+     * 验证码生成接口
+     *
+     * @return 字符串:base64 + uuid
+     */
+    @Override
+    public String verifyCodeGenerate(Long rootOrgId, String accountValue) {
+        VerifyCode.Result result = VerifyCode.generateVerifyCode();
+        log.info(String.format("accountValue = %s, generateVerifyCode = %s", accountValue, result.getResult()));
+
+        byte[] bytes = VerifyCode.imageToBytes(result.getImage());
+        String base64 = Base64.encodeBase64String(bytes);
+
+        //todo
+
+        return base64 + "#" + UUID.randomUUID();
+    }
+
+    /**
+     * 验证码登录接口
+     *
+     * @return 登录成功信息
+     */
+    @Override
+    public User verifyCodeLogin(VerifyCodeLoginInfo info) {
+
+        System.out.println(info.getVerifyCode());
+        //todo
+
+        return null;
+    }
+
+    /**
+     * Resource接口
+     */
+    @Override
+    public void verifyCodeResource(String uuid) {
+        System.out.println(uuid);
+        //todo
+    }
+
+}