wangliang 3 年之前
父节点
当前提交
e775665570
共有 23 个文件被更改,包括 1160 次插入24 次删除
  1. 99 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TSAuthDto.java
  2. 84 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TSAuth.java
  3. 42 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/AuthEnum.java
  4. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TSAuthMapper.java
  5. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TSAuthService.java
  6. 20 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TSAuthServiceImpl.java
  7. 5 0
      distributed-print-business/src/main/resources/mapper/TSAuthMapper.xml
  8. 117 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java
  9. 25 0
      pom.xml
  10. 20 0
      teachcloud-common/pom.xml
  11. 88 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/LoginParam.java
  12. 107 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/EditResult.java
  13. 123 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/BasicVerifyCode.java
  14. 16 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/BasicVerifyCodeMapper.java
  15. 18 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/BasicVerifyCodeService.java
  16. 24 2
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java
  17. 139 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/BasicVerifyCodeServiceImpl.java
  18. 153 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java
  19. 23 0
      teachcloud-report-business/src/main/resources/mapper/BasicVerifyCodeMapper.xml
  20. 0 4
      teachcloud-report/pom.xml
  21. 12 2
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/TeachcloudReportApplication.java
  22. 7 7
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java
  23. 6 8
      teachcloud-report/src/main/resources/application-dev.properties

+ 99 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TSAuthDto.java

@@ -0,0 +1,99 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.AuthEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 授权配置 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/26
+ */
+public class TSAuthDto implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "accessKey")
+    private String accessKey;
+
+    @ApiModelProperty(value = "accessSecret")
+    private String accessSecret;
+
+    @ApiModelProperty(value = "离线授权证书")
+    private String description;
+
+    @ApiModelProperty(value = "授权类型")
+    private AuthEnum type;
+
+    @ApiModelProperty(value = "过期时间")
+    private Long expireTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getAccessSecret() {
+        return accessSecret;
+    }
+
+    public void setAccessSecret(String accessSecret) {
+        this.accessSecret = accessSecret;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public AuthEnum getType() {
+        return type;
+    }
+
+    public void setType(AuthEnum type) {
+        this.type = type;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+}

+ 84 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TSAuth.java

@@ -0,0 +1,84 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.AuthEnum;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 激活授权配置表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+@ApiModel(value = "TSAuth对象", description = "激活授权配置表")
+public class TSAuth extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "accessKey")
+    private String accessKey;
+
+    @ApiModelProperty(value = "accessSecret")
+    private String accessSecret;
+
+    @ApiModelProperty(value = "离线授权证书")
+    private String description;
+
+    @ApiModelProperty(value = "授权类型")
+    private AuthEnum type;
+
+    public TSAuth(){
+
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getAccessSecret() {
+        return accessSecret;
+    }
+
+    public void setAccessSecret(String accessSecret) {
+        this.accessSecret = accessSecret;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public AuthEnum getType() {
+        return type;
+    }
+
+    public void setType(AuthEnum type) {
+        this.type = type;
+    }
+}

+ 42 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/AuthEnum.java

@@ -0,0 +1,42 @@
+package com.qmth.distributed.print.business.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 授权配置类型
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/26
+ */
+public enum AuthEnum {
+
+    ON_LINE("在线激活"),
+
+    OFF_LINE("离线激活");
+
+    AuthEnum(String title) {
+        this.title = title;
+    }
+
+    private String title;
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (AuthEnum e : AuthEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TSAuthMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.TSAuth;
+
+/**
+ * <p>
+ * 激活授权配置表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+public interface TSAuthMapper extends BaseMapper<TSAuth> {
+
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TSAuthService.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.entity.TSAuth;
+
+/**
+ * <p>
+ * 激活授权配置表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+public interface TSAuthService extends IService<TSAuth> {
+
+}

+ 20 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TSAuthServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.entity.TSAuth;
+import com.qmth.distributed.print.business.mapper.TSAuthMapper;
+import com.qmth.distributed.print.business.service.TSAuthService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 激活授权配置表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+@Service
+public class TSAuthServiceImpl extends ServiceImpl<TSAuthMapper, TSAuth> implements TSAuthService {
+
+}

+ 5 - 0
distributed-print-business/src/main/resources/mapper/TSAuthMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.distributed.print.business.mapper.TSAuthMapper">
+
+</mapper>

+ 117 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/TSAuthController.java

@@ -0,0 +1,117 @@
+package com.qmth.distributed.print.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.core.solar.crypto.AppLicenseUtil;
+import com.qmth.boot.core.solar.model.AppControl;
+import com.qmth.boot.core.solar.model.AppInfo;
+import com.qmth.boot.core.solar.service.SolarService;
+import com.qmth.boot.tools.device.DeviceInfo;
+import com.qmth.distributed.print.business.bean.dto.TSAuthDto;
+import com.qmth.distributed.print.business.entity.TSAuth;
+import com.qmth.distributed.print.business.service.TSAuthService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.util.JacksonUtil;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * <p>
+ * 激活授权配置表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-04-26
+ */
+@Api(tags = "授权配置Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.auth}")
+//@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
+@Validated
+public class TSAuthController {
+    private final static Logger log = LoggerFactory.getLogger(TSAuthController.class);
+
+    @Resource
+    TSAuthService tsAuthService;
+
+    @Resource
+    SolarService solarService;
+
+    @ApiOperation(value = "授权配置信息")
+    @ApiResponses({@ApiResponse(code = 200, message = "授权配置信息", response = TSAuthDto.class)})
+    @RequestMapping(value = "/info", method = RequestMethod.POST)
+    public Result info() {
+        Long schoolId = SystemConstant.getHeadOrUserSchoolId();
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "保存或更新授权配置信息")
+    @ApiResponses({@ApiResponse(code = 200, message = "授权配置信息", response = TSAuth.class)})
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public void save(@Valid @RequestBody TSAuth tsAuth, BindingResult bindingResult) {
+//        if (bindingResult.hasErrors()) {
+//            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+//        }
+        Long schoolId = SystemConstant.getHeadOrUserSchoolId();
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        DeviceInfo deviceInfo = new DeviceInfo();
+        log.info("DeviceInfo.current():{}", JacksonUtil.parseJson(DeviceInfo.current()));
+        log.info("deviceInfo.getComputer():{}", JacksonUtil.parseJson(deviceInfo.getComputer()));
+        log.info("deviceInfo.getDiskStore():{}", JacksonUtil.parseJson(deviceInfo.getDiskStore()));
+        log.info("deviceInfo.getNetworkInterface():{}", JacksonUtil.parseJson(deviceInfo.getNetworkInterface()));
+        log.info("deviceInfo.getProcessor():{}", JacksonUtil.parseJson(deviceInfo.getProcessor()));
+        log.info("deviceInfo.uuid():{}", deviceInfo.uuid());
+
+        AppControl appControl = solarService.getAppControl();
+        log.info("appControl:{}", JacksonUtil.parseJson(appControl));
+//        List<OrgInfo> orgInfoList = solarService.getOrgList();
+//        log.info("orgInfoList:{}", JacksonUtil.parseJson(orgInfoList));
+        AppInfo appInfo = solarService.getAppInfo();
+        log.info("appInfo:{}", JacksonUtil.parseJson(appInfo));
+//        solarService.update();
+        try {
+//            ByteArray byteArray = AppLicenseUtil.buildDeviceInfo();
+//            log.info("byteArray:{}", byteArray.value());
+//            solarService.update(byteArray.value());
+            HttpServletResponse response = ServletUtil.getResponse();
+            response.setHeader("Content-Disposition", "attachment; filename=" + urlEncode("device.info"));
+            IOUtils.copy(new ByteArrayInputStream(AppLicenseUtil.buildDeviceInfo().value()), response.getOutputStream());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+//        return ResultUtil.ok(true);
+    }
+
+    /**
+     * URL 编码, Encode默认为UTF-8.
+     */
+    public static String urlEncode(String part) {
+        try {
+            return URLEncoder.encode(part, SystemConstant.CHARSET_NAME);
+        } catch (UnsupportedEncodingException e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+}

+ 25 - 0
pom.xml

@@ -124,6 +124,31 @@
                 <artifactId>data-mybatis-plus</artifactId>
                 <version>${qmth.boot.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>tools-device</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-solar</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-logging</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-models</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.qmth.boot</groupId>
+                <artifactId>core-retrofit</artifactId>
+                <version>${qmth.boot.version}</version>
+            </dependency>
             <dependency>
                 <groupId>io.springfox</groupId>
                 <artifactId>springfox-swagger-ui</artifactId>

+ 20 - 0
teachcloud-common/pom.xml

@@ -30,6 +30,26 @@
             <groupId>com.qmth.boot</groupId>
             <artifactId>core-fss</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>tools-device</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-solar</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-logging</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-models</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.boot</groupId>
+            <artifactId>core-retrofit</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>

+ 88 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/params/LoginParam.java

@@ -0,0 +1,88 @@
+package com.qmth.teachcloud.report.business.bean.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description: 用户登录
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/4/23
+ */
+public class LoginParam {
+
+    @ApiModelProperty(value = "验证码")
+    private String code;
+
+    @ApiModelProperty(value = "学校代码")
+    @NotBlank(message = "学校代码不能为空")
+    private String schoolCode;
+
+    @ApiModelProperty(value = "用户手机号(优先给用户填的手机号发短信)")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "登录名")
+//    @NotBlank(message = "请输入登录名")
+    @Length(message = "登录名不能超过{max}个字符", max = 50)
+    private String loginName;
+
+    @ApiModelProperty(value = "密码")
+//    @NotBlank(message = "请输入密码")
+    @Length(message = "密码不能少于{min}位", min = 6)
+    @Length(message = "密码不能超过{max}位", max = 30)
+    private String password;
+
+    @ApiModelProperty(value = "登录类型")
+    private String type;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

+ 107 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/result/EditResult.java

@@ -0,0 +1,107 @@
+package com.qmth.teachcloud.report.business.bean.result;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * @Description: 新增/更新返回值
+ * @Author: CaoZixuan
+ * @Date: 2021-03-22
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class EditResult implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "更新时间")
+    Long updateTime;
+
+    @ApiModelProperty(value = "成功状态")
+    Boolean success;
+
+    @ApiModelProperty(value = "附件url")
+    String url;
+
+    @ApiModelProperty(value = "pdf总页数")
+    Integer pages;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Boolean success) {
+        this.success = success;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getPages() {
+        return pages;
+    }
+
+    public void setPages(Integer pages) {
+        this.pages = pages;
+    }
+
+    public Long getUpdateTime() {
+        if (Objects.isNull(updateTime)) {
+            return System.currentTimeMillis();
+        } else {
+            return updateTime;
+        }
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public EditResult(Long id) {
+        this.id = id;
+        ServletUtil.setRequestId(Arrays.asList(id));
+    }
+
+    public EditResult(Boolean success) {
+        this.success = success;
+    }
+
+    public EditResult(Long id, String url) {
+        this.id = id;
+        this.url = url;
+    }
+
+    public EditResult(Long id, String url, Integer pages) {
+        this.id = id;
+        this.url = url;
+        this.pages = pages;
+    }
+
+    public EditResult(String url) {
+        this.url = url;
+    }
+
+    public EditResult() {
+    }
+}

+ 123 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/entity/BasicVerifyCode.java

@@ -0,0 +1,123 @@
+package com.qmth.teachcloud.report.business.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 短信验证码记录表
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+@TableName("basic_verify_code")
+public class BasicVerifyCode extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "org_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long orgId;
+
+    /**
+     * 用户ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("user_id")
+    private Long userId;
+    /**
+     * 手机号
+     */
+    @TableField("mobile_number")
+    private String mobileNumber;
+    /**
+     * 到期时间
+     */
+    @TableField("expire_time")
+    private Long expireTime;
+    /**
+     * 单位(秒)
+     */
+    @TableField("valid_period")
+    private Integer validPeriod;
+    /**
+     * 4位数字
+     */
+    @TableField("verify_code")
+    private String verifyCode;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Integer getValidPeriod() {
+        return validPeriod;
+    }
+
+    public void setValidPeriod(Integer validPeriod) {
+        this.validPeriod = validPeriod;
+    }
+
+    public String getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(String verifyCode) {
+        this.verifyCode = verifyCode;
+    }
+
+}

+ 16 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/mapper/BasicVerifyCodeMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.report.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.report.business.entity.BasicVerifyCode;
+
+/**
+ * <p>
+ * 短信验证码记录表 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+public interface BasicVerifyCodeMapper extends BaseMapper<BasicVerifyCode> {
+
+}

+ 18 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/BasicVerifyCodeService.java

@@ -0,0 +1,18 @@
+package com.qmth.teachcloud.report.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.report.business.entity.BasicVerifyCode;
+
+/**
+ * <p>
+ * 短信验证码记录表 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+public interface BasicVerifyCodeService extends IService<BasicVerifyCode> {
+
+    void sendVeirfyCode(String mobileNumber, SysUser sysUser);
+}

+ 24 - 2
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/ReportCommonService.java

@@ -1,10 +1,11 @@
 package com.qmth.teachcloud.report.business.service;
 
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.report.business.bean.result.*;
-import com.qmth.teachcloud.report.business.entity.TAExamCourse;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 /**
@@ -104,4 +105,25 @@ public interface ReportCommonService {
      * 武汉大学退出
      */
     public void whuLogout() throws IOException;
+
+    /**
+     * 保存附件
+     *
+     * @param file
+     * @param md5
+     * @param type
+     * @return
+     */
+    public BasicAttachment saveAttachment(MultipartFile file, String md5, UploadFileEnum type);
+
+    /**
+     * 保存附件公用
+     *
+     * @param file
+     * @param md5
+     * @param type
+     * @param objId
+     * @return
+     */
+    public BasicAttachment saveAttachmentCommon(MultipartFile file, String md5, UploadFileEnum type, Long objId);
 }

+ 139 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/BasicVerifyCodeServiceImpl.java

@@ -0,0 +1,139 @@
+package com.qmth.teachcloud.report.business.service.impl;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
+import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.SysConfigService;
+import com.qmth.teachcloud.report.business.entity.BasicVerifyCode;
+import com.qmth.teachcloud.report.business.mapper.BasicVerifyCodeMapper;
+import com.qmth.teachcloud.report.business.service.BasicVerifyCodeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * <p>
+ * 短信验证码记录表 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+@Service
+public class BasicVerifyCodeServiceImpl extends ServiceImpl<BasicVerifyCodeMapper, BasicVerifyCode> implements BasicVerifyCodeService {
+
+    @Autowired
+    private DictionaryConfig dictionaryConfig;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Override
+    public void sendVeirfyCode(String mobileNumber, SysUser sysUser) {
+        SysConfig sysConfig = sysConfigService.getByKey("sys.code.enable");
+        if (sysConfig.getConfigValue() == null) {
+            throw ExceptionResultEnum.ERROR.exception("短信验证码启用开关未设置");
+        }
+        if (sysConfig.getConfigValue().equals("false")) {
+            throw ExceptionResultEnum.ERROR.exception("短信验证码已关闭");
+        }
+        QueryWrapper<BasicVerifyCode> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(BasicVerifyCode::getMobileNumber, mobileNumber).eq(BasicVerifyCode::getUserId, sysUser.getId());
+        BasicVerifyCode basicVerifyCode = this.getOne(wrapper);
+        if (basicVerifyCode != null) {
+            Date oldCreateTime = new Date(basicVerifyCode.getCreateTime());
+            Integer sendInterval = dictionaryConfig.smsDomain().getCodeSendInterval();
+            if ((System.currentTimeMillis() - oldCreateTime.getTime()) < sendInterval * 1000) {
+                throw ExceptionResultEnum.ERROR.exception("发送验证码过于频繁,请" + sendInterval + "秒之后再试");
+            }
+        }
+        try {
+            StringBuilder sb = new StringBuilder();
+            sb.append((int) ((Math.random() * 9 + 1) * 1000));
+            String verifyCode = sb.toString();
+            System.setProperty("sun.net.client.defaultConnectTimeout", "180000");
+            System.setProperty("sun.net.client.defaultReadTimeout", "18000");
+            // 初始化ascClient需要的几个参数
+            final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)
+            final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)
+            // 替换成你的AK
+            final String accessKeyId = dictionaryConfig.smsDomain().getAliyunSMSKey();// 你的accessKeyId,参考本文档步骤2
+            final String accessKeySecret = dictionaryConfig.smsDomain().getAliyunSMSSecret();// 你的accessKeySecret,参考本文档步骤2
+            // 初始化ascClient,暂时不支持多region(请勿修改)
+            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
+            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+            IAcsClient acsClient = new DefaultAcsClient(profile);
+            // 组装请求对象
+            SendSmsRequest request = new SendSmsRequest();
+            // 使用post提交
+            request.setMethod(MethodType.POST);
+            // 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
+            request.setPhoneNumbers(mobileNumber);
+            // 必填:短信签名-可在短信控制台中找到
+            request.setSignName(dictionaryConfig.smsDomain().getAliyunSMSSignName());
+            // 必填:短信模板-可在短信控制台中找到
+            request.setTemplateCode(dictionaryConfig.smsDomain().getAliyunSMSTplCode());
+            // 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+            // 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
+            request.setTemplateParam("{\"code\":\"" + verifyCode + "\"}");
+            // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
+            // request.setSmsUpExtendCode("90997");
+            // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+            // request.setOutId("yourOutId");
+            // 请求失败这里会抛ClientException异常
+            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
+                // 请求成功
+                Integer codeExpiredTime = dictionaryConfig.smsDomain().getCodeExpiredTime();
+                if (basicVerifyCode == null) {
+                    basicVerifyCode = new BasicVerifyCode();
+                    basicVerifyCode.setUserId(sysUser.getId());
+                    basicVerifyCode.setSchoolId(sysUser.getSchoolId());
+                    basicVerifyCode.setMobileNumber(mobileNumber);
+                    basicVerifyCode.setExpireTime(processMiniute(new Date(), codeExpiredTime));
+                    basicVerifyCode.setValidPeriod(codeExpiredTime);
+                    basicVerifyCode.setVerifyCode(verifyCode);
+                    basicVerifyCode.setCreateId(sysUser.getId());
+                    basicVerifyCode.setCreateTime(System.currentTimeMillis());
+                    this.save(basicVerifyCode);
+                } else {
+                    basicVerifyCode.setExpireTime(processMiniute(new Date(), codeExpiredTime));
+                    basicVerifyCode.setValidPeriod(codeExpiredTime);
+                    basicVerifyCode.setVerifyCode(verifyCode);
+                    basicVerifyCode.setUpdateId(sysUser.getId());
+                    basicVerifyCode.setUpdateTime(System.currentTimeMillis());
+                    this.updateById(basicVerifyCode);
+                }
+            } else {
+                if ("isv.MOBILE_NUMBER_ILLEGAL".equals(sendSmsResponse.getCode())) {
+                    throw ExceptionResultEnum.ERROR.exception("非法手机号");
+                } else {
+                    throw ExceptionResultEnum.ERROR.exception(sendSmsResponse.getMessage());
+                }
+            }
+        } catch (ClientException e) {
+            String error = e.getMessage();
+            throw ExceptionResultEnum.ERROR.exception("请重新获取验证码");
+        }
+    }
+
+    private static Long processMiniute(Date oldTime, int m) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(oldTime);
+        calendar.add(Calendar.MINUTE, m);
+        return calendar.getTime().getTime();
+    }
+}

+ 153 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/ReportCommonServiceImpl.java

@@ -1,10 +1,20 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
+import com.itextpdf.text.pdf.PdfReader;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
+import com.qmth.teachcloud.common.service.BasicAttachmentService;
+import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.common.util.JacksonUtil;
+import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.report.business.bean.result.*;
 import com.qmth.teachcloud.report.business.entity.TAExamCourse;
@@ -17,18 +27,24 @@ import com.qmth.teachcloud.report.business.enums.PublishStatusEnum;
 import com.qmth.teachcloud.report.business.service.*;
 import com.qmth.teachcloud.report.business.utils.AnalyzeScopeUtil;
 import com.qmth.teachcloud.report.business.utils.MathUtil;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
+import java.io.File;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -73,6 +89,15 @@ public class ReportCommonServiceImpl implements ReportCommonService {
     @Resource
     TBExamCourseService tbExamCourseService;
 
+    @Autowired
+    private DictionaryConfig dictionaryConfig;
+
+    @Resource
+    BasicAttachmentService basicAttachmentService;
+
+    @Resource
+    private FileStoreUtil fileStoreUtil;
+
     /**
      * 学院学科报表查询科目信息
      *
@@ -564,4 +589,131 @@ public class ReportCommonServiceImpl implements ReportCommonService {
         response.setHeader("Access-Control-Allow-Origin", "*");
         response.sendRedirect(redirectURL);
     }
+
+    /**
+     * 保存附件
+     *
+     * @param file
+     * @param md5
+     * @param type
+     * @return
+     */
+    @Override
+    @Transactional
+    public BasicAttachment saveAttachment(MultipartFile file, String md5, UploadFileEnum type) {
+        return saveAttachmentCommon(file, md5, type, null);
+    }
+
+    /**
+     * 保存附件公用
+     *
+     * @param file
+     * @param md5
+     * @param type
+     * @param objId
+     * @return
+     */
+    @Override
+    public BasicAttachment saveAttachmentCommon(MultipartFile file, String md5, UploadFileEnum type, Long objId) {
+        if (Objects.isNull(type)) {
+            throw ExceptionResultEnum.ATTACHMENT_TYPE_EMPTY.exception();
+        }
+        BasicAttachment basicAttachment = null;
+        try {
+            // TODO: 2022/4/14 临时测试生成user
+//            SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+            SysUser requestUser = new SysUser();
+            requestUser.setId(1L);
+
+
+            int temp = file.getOriginalFilename().lastIndexOf(".");
+            String fileName = file.getOriginalFilename().substring(0, temp);
+            String format = file.getOriginalFilename().substring(temp, file.getOriginalFilename().length());
+            List<String> attachmentTypeList = dictionaryConfig.sysDomain().getAttachmentType();
+            if (Objects.nonNull(format)) {
+                long count = attachmentTypeList.stream().filter(s -> format.equalsIgnoreCase(s)).count();
+                if (count == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("文件格式只能为" + attachmentTypeList.toString());
+                }
+            }
+            int attachmentLength = dictionaryConfig.sysDomain().getAttachmentLength().intValue();
+            if (Objects.nonNull(fileName) && fileName.length() > attachmentLength) {
+                throw ExceptionResultEnum.ERROR.exception("文件名长度不能超过" + attachmentLength + "个字符");
+            }
+            long size = file.getSize();
+            BigDecimal b = new BigDecimal(size);
+            BigDecimal num = new BigDecimal(1024);
+            b = b.divide(num, 2, BigDecimal.ROUND_HALF_UP).divide(num, 2, BigDecimal.ROUND_HALF_UP)
+                    .setScale(2, BigDecimal.ROUND_HALF_UP);
+            double attachmentSize = dictionaryConfig.sysDomain().getAttachmentSize().doubleValue();
+            if (b.doubleValue() > attachmentSize) {
+                throw ExceptionResultEnum.ERROR.exception("文件大小不能超过" + attachmentSize + "MB");
+            }
+            log.info("fileName:{}", fileName);
+            log.info("format:{}", format);
+            log.info("size:{}", b);
+            log.info("getOriginalFilename:{}", file.getOriginalFilename());
+            String fileMd5 = DigestUtils.md5Hex(file.getBytes());
+            log.info("fileMd5:{}", fileMd5);
+            log.info("md5:{}", md5);
+            if (!Objects.equals(fileMd5, md5)) {
+                throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+            }
+            boolean oss = dictionaryConfig.sysDomain().isOss();
+            LocalDateTime nowTime = LocalDateTime.now();
+            StringJoiner stringJoiner = new StringJoiner("");
+            if (!oss) {
+                stringJoiner.add(SystemConstant.TEMP_FILES_DIR).add(File.separator);
+            }
+            stringJoiner.add(type.getTitle()).add(File.separator);
+//            else if (type == UploadFileEnum.PAPER) {//试卷需要单独
+//                stringJoiner.add(type.getTitle()).add(File.separator);
+//            } else if (type == UploadFileEnum.UPLOAD) {
+//                stringJoiner.add(type.getTitle()).add(File.separator);
+//            }
+            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+
+            JSONObject jsonObject = new JSONObject();
+            stringJoiner.add(File.separator).add(SystemConstant.getUuid()).add(format);
+            if (oss) {//上传至oss\
+                String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
+                fileStoreUtil.ossUpload(dirName, file.getInputStream(), md5, type.getFssType());
+
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
+                jsonObject.put(SystemConstant.PATH, dirName);
+            } else {//上传至服务器
+                File finalFile = new File(stringJoiner.toString());
+                if (!finalFile.exists()) {
+                    finalFile.getParentFile().mkdirs();
+                    finalFile.createNewFile();
+                }
+                FileUtils.copyInputStreamToFile(file.getInputStream(), finalFile);
+                jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
+                jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
+            }
+            jsonObject.put(SystemConstant.UPLOAD_TYPE, type);
+
+            basicAttachment = new BasicAttachment(jsonObject.toJSONString(), fileName, format, b, fileMd5, requestUser.getId(), objId);
+            basicAttachmentService.save(basicAttachment);
+
+            // pdf需要读取总页数
+            Integer pages = 0;
+            if (".pdf".equals(format)) {
+                PdfReader pdfReader = new PdfReader(file.getBytes());
+                pages = pdfReader.getNumberOfPages();
+            }
+            basicAttachment.setPages(pages);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            basicAttachmentService.deleteAttachment(basicAttachment);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return basicAttachment;
+    }
 }

+ 23 - 0
teachcloud-report-business/src/main/resources/mapper/BasicVerifyCodeMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.teachcloud.report.business.mapper.BasicVerifyCodeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.report.business.entity.BasicVerifyCode">
+    <result column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="mobile_number" property="mobileNumber" />
+        <result column="expire_time" property="expireTime" />
+        <result column="valid_period" property="validPeriod" />
+        <result column="verify_code" property="verifyCode" />
+        <result column="create_id" property="createId" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        user_id, mobile_number, expire_time, valid_period, verify_code, create_id, create_time
+    </sql>
+
+</mapper>

+ 0 - 4
teachcloud-report/pom.xml

@@ -21,10 +21,6 @@
         <dependency>
             <groupId>com.qmth.teachcloud.report.business</groupId>
             <artifactId>teachcloud-report-business</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.qmth.distributed.print.business</groupId>
-            <artifactId>distributed-print-business</artifactId>
         </dependency>
 		<dependency>
 			<groupId>com.qmth.teachcloud.common.api</groupId>

+ 12 - 2
teachcloud-report/src/main/java/com/qmth/teachcloud/report/TeachcloudReportApplication.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.report;
 
 import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
+import com.qmth.teachcloud.common.threadPool.MyThreadPool;
 import com.qmth.teachcloud.report.auth.TeachcloudReportAuthenticationService;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
@@ -8,15 +9,18 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.task.TaskExecutor;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import javax.annotation.Resource;
 
 @SpringBootApplication(scanBasePackages = "com.qmth.*")
-@MapperScan({"com.qmth.distributed.print.business.mapper","com.qmth.teachcloud.report.business.mapper","com.qmth.teachcloud.common.mapper"})
+@MapperScan({"com.qmth.distributed.print.business.mapper", "com.qmth.teachcloud.report.business.mapper", "com.qmth.teachcloud.common.mapper"})
 //主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
-@EntityScan(basePackages = {"com.qmth.distributed.print.business.entity","com.qmth.teachcloud.report.business.entity","com.qmth.teachcloud.common.entity"}) // 用来扫描和发现指定包及其子包中的Entity定义
+@EntityScan(basePackages = {"com.qmth.distributed.print.business.entity", "com.qmth.teachcloud.report.business.entity", "com.qmth.teachcloud.common.entity"})
+// 用来扫描和发现指定包及其子包中的Entity定义
 @EnableTransactionManagement // spring开启事务支持
 @EnableAsync // 开启异步任务
 @EnableCaching // 开启缓存注解
@@ -35,4 +39,10 @@ public class TeachcloudReportApplication {
             registration.setDefault(teachcloudReportAuthenticationService);
         };
     }
+
+    @Primary
+    @Bean
+    public TaskExecutor primaryTaskExecutor() {
+        return new MyThreadPool();
+    }
 }

+ 7 - 7
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java

@@ -5,11 +5,6 @@ import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
-import com.qmth.distributed.print.business.bean.params.LoginParam;
-import com.qmth.distributed.print.business.bean.result.EditResult;
-import com.qmth.distributed.print.business.entity.BasicVerifyCode;
-import com.qmth.distributed.print.business.service.BasicVerifyCodeService;
-import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
@@ -21,6 +16,11 @@ import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.report.business.bean.params.LoginParam;
+import com.qmth.teachcloud.report.business.bean.result.EditResult;
+import com.qmth.teachcloud.report.business.entity.BasicVerifyCode;
+import com.qmth.teachcloud.report.business.service.BasicVerifyCodeService;
+import com.qmth.teachcloud.report.business.service.ReportCommonService;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -65,7 +65,7 @@ public class SysController {
     RedisUtil redisUtil;
 
     @Resource
-    PrintCommonService printCommonService;
+    ReportCommonService reportCommonService;
 
     @Resource
     TBTaskService tbTaskService;
@@ -246,7 +246,7 @@ public class SysController {
                              @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
         BasicAttachment basicAttachment = null;
         try {
-            basicAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
+            basicAttachment = reportCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
             if (Objects.isNull(basicAttachment)) {
                 throw ExceptionResultEnum.ATTACHMENT_ERROR.exception();
             }

+ 6 - 8
teachcloud-report/src/main/resources/application-dev.properties

@@ -25,12 +25,10 @@ com.qmth.redis.db=1
 #com.qmth.redis.password=123456
 
 #mysql\u914D\u7F6E
-com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-com.qmth.mysql.username=${db.username}
-com.qmth.mysql.password=${db.password}
-com.qmth.mysql.min-idle=40
-com.qmth.mysql.max-pool-size=200
-com.qmth.mysql.log-level=debug
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
 
 #\u963F\u91CC\u4E91OSS\u914D\u7F6E
 aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
@@ -99,7 +97,7 @@ prefix.url.analyze=report/analyze
 
 #\u65E5\u5FD7\u914D\u7F6E
 com.qmth.logging.root-level=info
-com.qmth.logging.file-path=/ONLINE_EXAM/teachcloud-report/tomcat/logs/teachcloud-report.log
+com.qmth.logging.file-path=/Users/king/Downloads/teachcloud-report.log
 
 #\u5F15\u5165task\u914D\u7F6E\u6587\u4EF6
 #spring.profiles.include=task
@@ -135,4 +133,4 @@ sms.config.aliyunSMSAuditWillExpireCode=SMS_217436302
 sms.config.aliyunSMSAuditOverdueCode=SMS_217416271
 
 yun.mark.url=https://www.markingcloud.com
-yun.mark.studentScoreApi=/api/exam/student/score
+yun.mark.studentScoreApi=/api/exam/student/score