智慧保安后台管理-外网项目备份
钟日健
2022-02-17 6e92753127f80b0f16da74908242c45793372ca2
材料上传接口新增
6 files modified
4 files added
441 ■■■■■ changed files
Dockerfile 2 ●●●●● patch | view | raw | blame | history
Jenkinsfile 83 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/licet/mapper/LicetMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/licetuser/controller/LicetuserController.java 177 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/licetuser/entity/Licetuser.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/licetuser/mapper/LicetuserMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/signature/entity/BaseSign.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/signature/util/SignUtils.java 95 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/signature/util/SysApiCo.java 13 ●●●●● patch | view | raw | blame | history
src/main/resources/application.yml 5 ●●●● patch | view | raw | blame | history
Dockerfile
@@ -1,7 +1,5 @@
FROM bladex/alpine-java:openjdk8-openj9_cn_slim
MAINTAINER smallchill@163.com
RUN mkdir -p /blade
WORKDIR /blade
Jenkinsfile
New file
@@ -0,0 +1,83 @@
pipeline {
  agent {
    node {
      label 'maven'
    }
  }
  stages {
    stage('拉取代码') {
      agent none
      steps {
        container('base') {
          git(credentialsId: 'jf-blit', url: 'http://s16s652780.51mypc.cn:49896/r/zhba_management_w.git', branch: 'master', changelog: true, poll: false)
        }
      }
    }
    stage('unit test') {
      steps {
        container('maven') {
          sh 'mvn clean -o -gs `pwd`/configuration/settings.xml test'
        }
      }
    }
    stage('build & push') {
      steps {
        container('maven') {
          sh 'mvn -o -Dmaven.test.skip=true -gs `pwd`/configuration/settings.xml clean package'
          sh 'docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
          withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
          }
        }
      }
    }
    stage('push latest') {
      when {
        branch 'master'
      }
      steps {
        container('maven') {
          sh 'docker tag  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
          sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
        }
      }
    }
    stage('deploy to dev') {
      steps {
        input(id: 'deploy-to-dev', message: 'deploy to dev?')
        kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
    stage('deploy to production') {
      steps {
        input(id: 'deploy-to-production', message: 'deploy to production?')
        kubernetesDeploy(configs: 'deploy/prod-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
  }
  environment {
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'docker.io'
    DOCKERHUB_NAMESPACE = 'docker_username'
    GITHUB_ACCOUNT = 'kubesphere'
    APP_NAME = 'devops-java-sample'
  }
  parameters {
    string(name: 'TAG_NAME', defaultValue: '', description: '')
  }
}
src/main/java/org/springblade/modules/licet/mapper/LicetMapper.xml
@@ -12,7 +12,7 @@
    <select id="selectLicetPage" resultMap="licetResultMap">
        select * from sys_licet where is_deleted = 0
        select * from sys_licet where 1=1 order by id asc
    </select>
</mapper>
src/main/java/org/springblade/modules/licetuser/controller/LicetuserController.java
@@ -16,6 +16,8 @@
 */
package org.springblade.modules.licetuser.controller;
import io.minio.*;
import io.minio.errors.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -23,20 +25,31 @@
import lombok.AllArgsConstructor;
import javax.validation.Valid;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.config.FtpConfig;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.FTP.FtpUtil;
import org.springblade.modules.licet.entity.Licet;
import org.springblade.modules.licet.service.ILicetService;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.licetuser.entity.Licetuser;
import org.springblade.modules.licetuser.vo.LicetuserVO;
import org.springblade.modules.licetuser.service.ILicetuserService;
import org.springblade.core.boot.ctrl.BladeController;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.stream.Collectors;
import static org.springblade.common.config.FtpConfig.*;
/**
 *  控制器
@@ -51,6 +64,8 @@
public class LicetuserController extends BladeController {
    private final ILicetuserService licetuserService;
    private final ILicetService licetService;
    /**
     * 详情
@@ -176,5 +191,165 @@
        return R.status(licetuserService.removeByIds(Func.toLongList(ids)));
    }
    /**
     * 许可审批备案文件上传(对接政务平台)
     * @param file 文件
     * @param licetId 附件材料id
     * @param ptype 类型
     * @param cardid 用户唯一id
     * @return
     */
    @PostMapping("/liceUpload")
    public R liceUpload(@RequestParam MultipartFile file, String licetId, String ptype, String cardid) throws IOException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, ServerException, ErrorResponseException, XmlParserException, InsufficientDataException, InternalException {
        //文件上传
        String urls = putFile(file);
        String link = urls.split(",")[0];
        //内网
        String inlink = urls.split(",")[1];
        Licetuser licetuser = new Licetuser();
        licetuser.setPtype(ptype);
        Licet licet = new Licet();
        licet.setPtype(ptype);
        //查看当前模板是第几个
        List<Licet> list = licetService.list(Condition.getQueryWrapper(licet));
        Integer index = 0;
        if (list.size()>0){
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).getId().equals(Integer.parseInt(licetId))){
                    index = i;
                }
            }
        }
        licetuser.setUserid(cardid);
        //查询上传的材料信息
        Licetuser licetuser1 = licetuserService.getOne(Condition.getQueryWrapper(licetuser));
        if (null==licetuser1){
            licetuser.setLicetId(licetId);
            licetuser.setLinks(link);
            //设置下标
            licetuser.setTemplateid(index.toString());
            //新增
            licetuserService.save(licetuser);
            //数据同步
//            String s1 =
//                "insert into sys_licetuser(id,userid,ptype,templateid,links,licet_id) " +
//                    "values(" + "'" + licetuser.getId() + "'" + "," +
//                    "'" + licetuser.getUserid() + "'" + "," +
//                    "'" + licetuser.getPtype() + "'" + "," +
//                    "'" + licetuser.getTemplateid() + "'" + "," +
//                    "'" + inlink + "'" + "," +
//                    "'" + licetuser.getLicetId() + "'" + ")";
//            FtpUtil.sqlFileUpload(s1);
            String s1 =
                "insert into sys_licetuser(id,userid,ptype,templateid,links) " +
                    "values(" + "'" + licetuser.getId() + "'" + "," +
                    "'" + licetuser.getUserid() + "'" + "," +
                    "'" + licetuser.getPtype() + "'" + "," +
                    "'" + licetuser.getTemplateid() + "'" + "," +
                    "'" + inlink + "'" + ")";
            FtpUtil.sqlFileUpload(s1);
        }else {
            //判断是否是重复上传
            List<String> asList = Arrays.asList(licetuser1.getLicetId().split(","));
            List<String> linksList = Arrays.asList(licetuser1.getLinks().split(","));
            boolean status = asList.contains(licetId);
            if(status) {
                //重复上传
                int i = 0;
                for (int j = 0; j < asList.size(); j++) {
                    if (asList.get(j).equals(licetId)){
                        i = j;
                    }
                }
                //替换link
                linksList.set(i,link);
                licetuser1.setLinks(StringUtils.join(linksList.toArray(), ","));
            }else {
                //替换 下标集合,id集合,links
                licetuser1.setTemplateid(licetuser1.getTemplateid()+","+index);
                licetuser1.setLicetId(licetuser1.getLicetId()+","+licetId);
                licetuser1.setLinks(licetuser1.getLinks()+","+link);
            }
            //修改
            licetuserService.updateById(licetuser1);
            //内网 links
            String url = "";
            String[] split = licetuser1.getLinks().split(",");
            for (int i = 0; i < split.length; i++) {
                String s = split[i].substring(26);
                String[] splits = split[i].split("/");
                url += FtpConfig.ip +"/zhba/upload/picture/"+ splits[6] + ",";
            }
            String inlinks = url.substring(0, url.length() - 1);
            //同步数据
//            String s1 = "update sys_licetuser set userid = " + "'" + licetuser1.getUserid() + "'" +
//                ",ptype = " + "'" + licetuser1.getPtype() + "'" +
//                ",templateid = " + "'" + licetuser1.getTemplateid() + "'" +
//                ",links = " + "'" + inlinks + "'" +
//                ",licet_id = " + "'" + licetuser1.getLicetId() + "'" +
//                " " + "where id = " + "'" + licetuser1.getId() + "'";
//            FtpUtil.sqlFileUpload(s1);
            String s1 = "update sys_licetuser set userid = " + "'" + licetuser1.getUserid() + "'" +
                ",ptype = " + "'" + licetuser1.getPtype() + "'" +
                ",templateid = " + "'" + licetuser1.getTemplateid() + "'" +
                ",links = " + "'" + inlinks + "'" +
                " " + "where id = " + "'" + licetuser1.getId() + "'";
            FtpUtil.sqlFileUpload(s1);
        }
        return R.data("成功");
    }
    /**
     * 文件上传
     * @param file
     */
    private String putFile(MultipartFile file) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        String url = "http://223.82.109.183:2081";
        String access = "zhbaadmin";
        String secret = "zhbapassword";
        String bucket = "zhba";
        MinioClient minioClient =
            MinioClient.builder()
                .endpoint(url)
                .credentials(access, secret)
                .build();
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!isExist) {
            // 创建一个名为zip的存储桶,用于zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build());
        }
        String fileName = file.getOriginalFilename();
        String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "")
            + fileName.substring(fileName.lastIndexOf("."));
        InputStream in = file.getInputStream();
        String[] split = newName.split("/");
        //创建头部信息
        Map<String, String> headers = new HashMap<>(1 << 2);
        //添加自定义内容类型
        headers.put("Content-Type", "application/octet-stream");
        //上传
        minioClient.putObject(
            PutObjectArgs.builder().bucket(bucket).object(newName).stream(
                in, in.available(), -1)
                .headers(headers)
                .build());
        InputStream inputStream = file.getInputStream();
        FtpUtil.uploadFile(FtpConfig.ftpHost, ftpPort, FtpConfig.ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream);
        in.close();
        String urls = "http://223.82.109.183:2081/zhba/" + newName;
        //内网
        String inUrl = FtpConfig.ip + "/zhba/" + newName;
        //返回url
        return urls+","+inUrl;
    }
}
src/main/java/org/springblade/modules/licetuser/entity/Licetuser.java
@@ -40,22 +40,31 @@
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
    * 用户id
    */
        @ApiModelProperty(value = "用户id")
        private String userid;
    private String userid;
    /**
    * 获取模板信息条件,0:保安服务许可申请,1:保安培训许可申请,2:设立分公司备案,3:自招保安单位备案,4:自招保安单位撤销备案,5:跨区域经营备案,6:武装押运许可申请,7:保安服务公司法人变更
    */
        @ApiModelProperty(value = "获取模板信息条件,0:保安服务许可申请,1:保安培训许可申请,2:设立分公司备案,3:自招保安单位备案,4:自招保安单位撤销备案,5:跨区域经营备案,6:武装押运许可申请,7:保安服务公司法人变更")
        private String ptype;
    private String ptype;
    /**
    * 以上传的文件id,关联模板id
    * 以上传的文件id,关联模板下标  0,1.....
    */
        @ApiModelProperty(value = "以上传的文件id,关联模板id")
        private String templateid;
        private String links;
    private String templateid;
    /**
     * 模板文件链接
     */
    private String links;
    /**
     * 以上传的文件id,关联模板id
     */
    private String licetId;
}
src/main/java/org/springblade/modules/licetuser/mapper/LicetuserMapper.java
@@ -39,6 +39,13 @@
     * @return
     */
    List<LicetuserVO> selectLicetuserPage(IPage page, LicetuserVO licetuser);
    /**
     * 查询是否已经上传
     * @param userid
     * @param ptype
     * @return
     */
    Map liceIn(String userid,String ptype);
}
src/main/java/org/springblade/modules/signature/entity/BaseSign.java
New file
@@ -0,0 +1,32 @@
package org.springblade.modules.signature.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * 第三方接口对接密钥
 */
@SuppressWarnings("deprecation")
@Data
public class BaseSign implements Serializable{
    private static final long serialVersionUID = 8126572563688838556L;
    /**
     * 签名
     */
    private String sign;
    /**
     * 密钥ID
     */
    private String accessKeyId;
    /**
     * 访问时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date accessDate;
}
src/main/java/org/springblade/modules/signature/util/SignUtils.java
New file
@@ -0,0 +1,95 @@
package org.springblade.modules.signature.util;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.common.utils.Md5SignUtil;
import org.springblade.modules.signature.entity.BaseSign;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
 * 签名验证工具类
 * @author Administrator
 * @since 2022-02-15
 */
@Slf4j
public class SignUtils {
    public static String prodSign(BaseSign sign, String accessKeySecret) throws IOException {
        Map<String, Object> map = new HashMap<>();
        map.put("sign",sign.getSign());
        map.put("accessKeyId",sign.getAccessKeyId());
//        map.put("accessDate",sign.getAccessKeyId());
        return Md5SignUtil.signRequest(map,accessKeySecret);
    }
    public static void checkSign(BaseSign signRo, SysApiCo apiCo) throws IOException {
        // 验证账号是否存在
        checkAccessKey(apiCo);
        // 验证账号是否有效
        checkStatus(apiCo);
        // 验证账号是否到期
        checkVldToTm(apiCo);
        // 验证是否有接口访问权限
        checkMethod(apiCo);
        // 验证访问时间是否有效
//        checkAccessDate(signRo);
        // 验证签名是否有效
        checkSign(signRo, apiCo.getAkSecret());
    }
    private static void checkSign(BaseSign signRo, String accessKeySecret) throws IOException {
        String sign = prodSign(signRo, accessKeySecret);
        if (!StringUtils.equals(sign, signRo.getSign())) {
        }
    }
    private static void checkAccessKey(SysApiCo apiCo) {
        if (null == apiCo) {
//            BssExpUtils.error("用户密钥不存在", log);
        }
    }
    private static void checkStatus(SysApiCo apiCo) {
//        if (apiCo.getStatus() == SysApiEn.Status.DISABLE.cd()) {
//            BssExpUtils.error("用户密钥停用", log);
//        }
    }
    @SuppressWarnings("deprecation")
    private static void checkMethod(SysApiCo apiCo) {
        String methodStr = apiCo.getMethod();
        if (StringUtils.isNotBlank(methodStr)) {
//            HttpServletRequest request = HttpRequestUtils.getHttpServletRequest();
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
            String reqtMethod = StringUtils.replaceAll(StringUtils.substring(request.getRequestURI(), 1), "/", ".");
            methodStr = StringUtils.replaceAll(methodStr, ",", ",");
            String[] methods = StringUtils.split(methodStr, ",");
            boolean authz = false;
            for (String method : methods) {
                if (StringUtils.equals(StringUtils.trim(method), reqtMethod)) {
                    authz = true;
                    break;
                }
            }
            if (!authz) {
//                BssExpUtils.error("没有访问该方法权限", log);
            }
        }
    }
    private static void checkVldToTm(SysApiCo apiCo) {
//        Date vldToTm = apiCo.getVldToTm();
//        if (null != vldToTm && DateUtils.compareMill(vldToTm, DateUtils.getCurrentTime()) > 0) {
//            BssExpUtils.error("账号到期", log);
//        }
    }
}
src/main/java/org/springblade/modules/signature/util/SysApiCo.java
New file
@@ -0,0 +1,13 @@
package org.springblade.modules.signature.util;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysApiCo implements Serializable {
    private String method;
    private String AkSecret;
}
src/main/resources/application.yml
@@ -201,7 +201,10 @@
      - /blade-resource/attach/detail
      - /registerUnit/save
      - /zc/inster
      - /licetuser/liceUpload
      - /licetuser/list
      - /permit/save
      - /licet/list
    #授权认证配置
    auth: