소스 검색

前端文件上传所需数据接口

Cuiyongming 2 년 전
부모
커밋
1efaf8e09f

+ 27 - 0
Source/group-platform/admin/src/main/java/com/younike/admin/controller/system/FileUploadController.java

@@ -4,6 +4,8 @@ import com.younike.common.annotation.RestAuth;
 import com.younike.common.bean.APIResult;
 import com.younike.common.bean.VideoUploadResult;
 import com.younike.common.constant.ResultPacketCode;
+import com.younike.common.core.dto.AjaxResult;
+import com.younike.common.utils.oss.AliyunOSSUtil;
 import com.younike.common.utils.oss.service.IStorageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -15,8 +17,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author chenpengfei
@@ -32,6 +37,9 @@ public class FileUploadController {
     @Value("${oss.filehost}")
     String fileHost;
 
+    @Resource
+    private AliyunOSSUtil aliyunOSSUtil;
+
     @Autowired
     public FileUploadController(IStorageService storageService) {
         log.info("storageService--------------" + storageService);
@@ -174,5 +182,24 @@ public class FileUploadController {
         return result;
     }
 
+    @GetMapping("/getAsign")
+    @PermitAll
+    @ApiOperation("服务人员端获取文件服务器host")
+    @ApiResponses({
+            @ApiResponse(responseCode = "200", description = "请求成功"),
+            @ApiResponse(responseCode = "150", description = "请求参数不正确"),
+            @ApiResponse(responseCode = "404", description = "请求路径没有或页面跳转路径不对")
+    })
+    public AjaxResult getServerFileAsign(){
+
+        Map<String, String> signature;
+
+        try{
+            signature = aliyunOSSUtil.createSignature();
+        }catch (Exception e){
+            return AjaxResult.error();
+        }
+        return AjaxResult.success(signature);
+    }
 
 }

+ 2 - 2
Source/group-platform/admin/src/main/java/com/younike/store/controller/StoreCategoryController.java

@@ -89,7 +89,7 @@ public class StoreCategoryController extends BaseController {
      * 获取门店分类树状图
      */
     @GetMapping("/storeCategoryTree")
-    public APIResult getStoreCategoryTree() {
-        return ResultGenerator.getSuccessResult(storeCategoryService.getStoreCategoryTree());
+    public APIResult getStoreCategoryTree(@RequestBody StoreCategory storeCategory) {
+        return ResultGenerator.getSuccessResult(storeCategoryService.getStoreCategoryTree(storeCategory));
     }
 }

+ 15 - 3
Source/group-platform/admin/src/main/java/com/younike/store/controller/StoreController.java

@@ -4,6 +4,7 @@ package com.younike.store.controller;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.younike.service.pojo.vo.StoreVo;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -58,13 +59,24 @@ public class StoreController extends BaseController {
     /**
      * 新增门店基础信息
      */
+//    @RequiresPermissions("store:add")
+//    @OpLog(title = "门店基础信息", type = BusinessType.INSERT)
+//    @PostMapping
+//    public APIResult add(@RequestBody Store store) {
+//        return ResultGenerator.getSuccessResult(storeService.save(store));
+//    }
+
+    /**
+     * 商家端创建门店
+     */
     @RequiresPermissions("store:add")
-    @OpLog(title = "门店基础信息", type = BusinessType.INSERT)
+    @OpLog(title = "创建门店", type = BusinessType.INSERT)
     @PostMapping
-    public APIResult add(@RequestBody Store store) {
-        return ResultGenerator.getSuccessResult(storeService.save(store));
+    public APIResult add(@RequestBody StoreVo store) {
+        return ResultGenerator.getSuccessResult(storeService.add(store));
     }
 
+
     /**
      * 修改门店基础信息
      */

+ 209 - 5
Source/group-platform/common/src/main/java/com/younike/common/utils/oss/AliyunOSSUtil.java

@@ -1,21 +1,31 @@
 package com.younike.common.utils.oss;
 
+import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.ClientException;
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.OSSException;
-import com.aliyun.oss.model.CannedAccessControlList;
-import com.aliyun.oss.model.CreateBucketRequest;
-import com.aliyun.oss.model.PutObjectRequest;
-import com.aliyun.oss.model.PutObjectResult;
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.aliyun.oss.model.*;
 import com.younike.common.bean.VideoUploadResult;
 import com.younike.common.utils.string.StringUtils;
 import lombok.extern.log4j.Log4j2;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.io.File;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.net.URI;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 /**
  * @author chenpengfei
@@ -30,6 +40,15 @@ public class AliyunOSSUtil implements InitializingBean {
     String bucketName;
     @Value("${oss.filehost}")
     private String getFileHost;
+
+    @Value("${oss.keyid}")
+    private String keyid;
+    @Value("${oss.endpoint}")
+    private String endpoint;
+    @Value("${oss.keysecret}")
+    private String keysecret;
+    @Value("${oss.filepath}")
+    private String filePath;
     @Resource
     private OSSClient client;
 
@@ -173,4 +192,189 @@ public class AliyunOSSUtil implements InitializingBean {
         return urls;
     }
 
+
+    /**
+     * 由前端调用成临时的签名
+     * @return
+     * @throws UnsupportedEncodingException
+     */
+    public Map<String, String> createSignature() throws UnsupportedEncodingException {
+        String host = getFileHost;
+        OSSClient client = new OSSClient(endpoint, keyid, keysecret);
+        long expireTime = 30;
+        long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
+        Date expiration = new Date(expireEndTime);
+        PolicyConditions policyConds = new PolicyConditions();
+        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
+        policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, filePath);
+        String postPolicy = client.generatePostPolicy(expiration, policyConds);
+        byte[] binaryData = postPolicy.getBytes("utf-8");
+        String encodedPolicy = BinaryUtil.toBase64String(binaryData);
+        String postSignature = client.calculatePostSignature(postPolicy);
+        Map<String, String> respMap = new LinkedHashMap<String, String>();
+        respMap.put("accessid", keyid);
+        respMap.put("policy", encodedPolicy);
+        respMap.put("signature", postSignature);
+        respMap.put("dir", filePath);
+        respMap.put("host", host);
+        respMap.put("expire", String.valueOf(expireEndTime / 1000));
+        JSONObject jasonCallback = new JSONObject();
+        jasonCallback.put("callbackUrl", "");
+        jasonCallback.put("callbackBody",
+                "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
+        jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
+        String base64CallbackBody = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
+        respMap.put("callback", base64CallbackBody);
+        return  respMap;
+    }
+
+    /**
+     * 前端上传成功后
+     * OSS回调处理业务
+     * @param request
+     * @return
+     */
+    public boolean callbackService(HttpServletRequest request) throws IOException {
+        //读取参数
+        String ossCallbackBody = GetPostBody(request.getInputStream(),Integer.parseInt(request.getHeader("content-length")));
+        log.info("ossCallbackBody:"+ossCallbackBody);
+        //验证参数
+        boolean bool = VerifyOSSCallbackRequest(request, ossCallbackBody);
+        log.info("verify result : " + bool);
+        return bool;
+    }
+
+
+    /**
+     * 获取Post消息体
+     *
+     * @param is
+     * @param contentLen
+     * @return
+     */
+    private String GetPostBody(InputStream is, int contentLen) {
+        if (contentLen > 0) {
+            int readLen = 0;
+            int readLengthThisTime = 0;
+            byte[] message = new byte[contentLen];
+            try {
+                while (readLen != contentLen) {
+                    readLengthThisTime = is.read(message, readLen, contentLen - readLen);
+                    if (readLengthThisTime == -1) {// Should not happen.
+                        break;
+                    }
+                    readLen += readLengthThisTime;
+                }
+                return new String(message);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 验证上传回调的Request
+     *
+     * @param request
+     * @param ossCallbackBody
+     */
+    private boolean VerifyOSSCallbackRequest(HttpServletRequest request, String ossCallbackBody)
+            throws NumberFormatException, IOException {
+        boolean ret = false;
+        String autorizationInput = new String(request.getHeader("Authorization"));
+        log.info("autorizationInput:"+autorizationInput);
+        String pubKeyInput = request.getHeader("x-oss-pub-key-url");
+        log.info("pubKeyInput:"+pubKeyInput);
+        byte[] authorization = BinaryUtil.fromBase64String(autorizationInput);
+        byte[] pubKey = BinaryUtil.fromBase64String(pubKeyInput);
+        String pubKeyAddr = new String(pubKey);
+        if (!pubKeyAddr.startsWith("http://gosspublic.alicdn.com/")
+                && !pubKeyAddr.startsWith("https://gosspublic.alicdn.com/")) {
+            System.out.println("pub key addr must be oss addrss");
+            return false;
+        }
+        String retString = executeGet(pubKeyAddr);
+        retString = retString.replace("-----BEGIN PUBLIC KEY-----", "");
+        retString = retString.replace("-----END PUBLIC KEY-----", "");
+        String queryString = request.getQueryString();
+        String uri = request.getRequestURI();
+        String decodeUri = java.net.URLDecoder.decode(uri, "UTF-8");
+        String authStr = decodeUri;
+        if (queryString != null && !queryString.equals("")) {
+            authStr += "?" + queryString;
+        }
+        authStr += "\n" + ossCallbackBody;
+        ret = doCheck(authStr, authorization, retString);
+        return ret;
+    }
+
+
+    /**
+     * 获取public key
+     * @param url
+     * @return
+     */
+    private String executeGet(String url) {
+        BufferedReader in = null;
+
+        String content = null;
+        try {
+            // 定义HttpClient
+            @SuppressWarnings("resource")
+            DefaultHttpClient client = new DefaultHttpClient();
+            // 实例化HTTP方法
+            HttpGet request = new HttpGet();
+            request.setURI(new URI(url));
+            HttpResponse response = client.execute(request);
+
+            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+            StringBuffer sb = new StringBuffer("");
+            String line = "";
+            String NL = System.getProperty("line.separator");
+            while ((line = in.readLine()) != null) {
+                sb.append(line + NL);
+            }
+            in.close();
+            content = sb.toString();
+        } catch (Exception e) {
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();// 最后要关闭BufferedReader
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            return content;
+        }
+    }
+
+
+    /**
+     * 验证RSA
+     *
+     * @param content
+     * @param sign
+     * @param publicKey
+     * @return
+     */
+    private static boolean doCheck(String content, byte[] sign, String publicKey) {
+        try {
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            byte[] encodedKey = BinaryUtil.fromBase64String(publicKey);
+            PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+            java.security.Signature signature = java.security.Signature.getInstance("MD5withRSA");
+            signature.initVerify(pubKey);
+            signature.update(content.getBytes());
+            boolean bverify = signature.verify(sign);
+            return bverify;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
 }

+ 1 - 1
Source/group-platform/service/src/main/java/com/younike/service/mapper/StoreCategoryMapper.java

@@ -17,5 +17,5 @@ public interface StoreCategoryMapper extends BaseMapper<StoreCategory> {
      * 获取门店分类树状图
      * @return
      */
-    List<StoreCategoryVo> getStoreCategoryTree();
+    List<StoreCategoryVo> getStoreCategoryTree(StoreCategory storeCategory);
 }

+ 4 - 0
Source/group-platform/service/src/main/java/com/younike/service/mapper/StoreMapper.java

@@ -3,6 +3,10 @@ package com.younike.service.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.younike.service.pojo.Store;
+import com.younike.service.pojo.StoreImage;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 门店基础信息Mapper接口

+ 3 - 0
Source/group-platform/service/src/main/java/com/younike/service/pojo/vo/StoreCategoryVo.java

@@ -8,5 +8,8 @@ import java.util.List;
 @Data
 public class StoreCategoryVo extends StoreCategory {
 
+    /**
+     * 门店子分类集合
+     */
     private List<StoreCategoryVo> children;
 }

+ 65 - 0
Source/group-platform/service/src/main/java/com/younike/service/pojo/vo/StoreVo.java

@@ -0,0 +1,65 @@
+package com.younike.service.pojo.vo;
+
+import javax.validation.constraints.NotNull;
+import com.younike.service.pojo.StoreImage;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class StoreVo {
+
+    /** 门店类型:001-非餐饮、002-餐饮 */
+    @NotNull(message = "门店类型不能为空")
+    private String storeType;
+
+    /** 门店名称 */
+    @NotNull(message = "门店名称不能为空")
+    private String storeName;
+
+    /** 门店电话1 */
+    @NotNull(message = "门店电话不能为空")
+    private String storePhoneOne;
+
+    /** 门店电话2 */
+    @NotNull(message = "门店电话不能为空")
+    private String storePhoneTwo;
+
+    /** 门店所在区域 */
+    @NotNull(message = "门店所在区域不能为空")
+    private String address;
+
+    /** 详细地址 */
+    @NotNull(message = "详细地址不能为空")
+    private String detail;
+
+    /** 门店位置经度 */
+    @NotNull(message = "门店位置经度不能为空")
+    private BigDecimal longitude;
+
+    /** 门店位置纬度 */
+    @NotNull(message = "门店位置纬度不能为空")
+    private BigDecimal latitude;
+
+    /** 门店品类ID(关联到store_category表) */
+    @NotNull(message = "门店品类不能为空")
+    private String categoryId;
+
+    /** 补充说明文字 */
+    @NotNull(message = "补充说明不能为空")
+    private String remarks;
+
+    /** 法人身份证正面/人像面 */
+    @NotNull(message = "缺少法人身份证正面/人像面")
+    private String legalPersonFrontImg;
+
+    /** 法人身份证反面/国徽面 */
+    @NotNull(message = "缺少法人身份证反面/国徽面")
+    private String legalPersonBackImg;
+
+    /**
+     * 其他证件(如餐饮服务许可证,卫生许可证等)
+     */
+    private List<StoreImage> storeImageList;
+}

+ 1 - 1
Source/group-platform/service/src/main/java/com/younike/service/service/IStoreCategoryService.java

@@ -26,5 +26,5 @@ public interface IStoreCategoryService extends IService<StoreCategory>{
      * 获取门店分类树状图
      * @return
      */
-    List<StoreCategoryVo> getStoreCategoryTree();
+    List<StoreCategoryVo> getStoreCategoryTree(StoreCategory storeCategory);
 }

+ 12 - 0
Source/group-platform/service/src/main/java/com/younike/service/service/IStoreService.java

@@ -2,8 +2,11 @@ package com.younike.service.service;
 
 import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.younike.common.bean.APIResult;
 import com.younike.service.pojo.Store;
 import com.younike.common.core.page.PageParam;
+import com.younike.service.pojo.vo.StoreVo;
+
 /**
  * 门店基础信息Service接口
  *
@@ -20,4 +23,13 @@ public interface IStoreService extends IService<Store>{
      */
     public PageParam<Store> page(PageParam<Store> pageParam);
 
+    /**
+     * 商家端创建门店
+     * @param store
+     * @return
+     */
+    Boolean add(StoreVo store);
+
+
+
 }

+ 3 - 3
Source/group-platform/service/src/main/java/com/younike/service/service/impl/StoreCategoryServiceImpl.java

@@ -44,9 +44,9 @@ public class StoreCategoryServiceImpl extends ServiceImpl<StoreCategoryMapper, S
      * @return
      */
     @Override
-    public List<StoreCategoryVo> getStoreCategoryTree() {
-
-        return baseMapper.getStoreCategoryTree();
+    public List<StoreCategoryVo> getStoreCategoryTree(StoreCategory storeCategory) {
+        List<StoreCategoryVo> storeCategoryTree = baseMapper.getStoreCategoryTree(storeCategory);
+        return storeCategoryTree;
     }
 
 }

+ 42 - 0
Source/group-platform/service/src/main/java/com/younike/service/service/impl/StoreServiceImpl.java

@@ -3,13 +3,23 @@ package com.younike.service.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.younike.common.bean.APIResult;
+import com.younike.common.bean.ResultGenerator;
+import com.younike.common.constant.ResultPacketCode;
 import com.younike.service.mapper.StoreMapper;
 import com.younike.service.pojo.Store;
+import com.younike.service.pojo.StoreImage;
+import com.younike.service.pojo.vo.StoreVo;
+import com.younike.service.service.IStoreImageService;
 import com.younike.service.service.IStoreService;
 import com.younike.common.core.page.PageParam;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * 门店基础信息Service业务层处理
  *
@@ -21,6 +31,9 @@ import org.springframework.transaction.annotation.Transactional;
 public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store>  implements IStoreService {
 
 
+    @Autowired
+    private IStoreImageService storeImageService;
+
     /**
      * 自定义分页逻辑 这里就省略掉
      * @param pageParam
@@ -37,4 +50,33 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store>  implement
         return page;
     }
 
+    /**
+     * 商家端创建门店
+     * @param vo
+     * @return
+     */
+    @Override
+    public Boolean add(StoreVo vo) {
+
+        //商家基础信息
+//        Store store = new Store();
+//        BeanUtils.copyProperties(vo,store);
+//        //生成id
+//        store.setStoreId("1");
+//        store.setUpdatedBy("当前用户");
+//
+//        for ( StoreImage image:vo.getStoreImageList()) {
+//            image.setStoreImgId("1");
+//            image.setStoreId("1");
+//        }
+//        if(vo.getStoreImageList().size()>0){
+//            //批量添加
+//            if(!storeImageService.saveBatch(vo.getStoreImageList())){
+//                throw new ArithmeticException("添加商家相关图片信息失败");
+//            }
+//        }
+//        this.save(store);
+        return true;
+    }
+
 }

+ 16 - 5
Source/group-platform/service/src/main/resources/mapper/system/StoreCategoryMapper.xml

@@ -40,7 +40,7 @@
         <result property="updatedTime" column="updated_time"/>
         <result property="version" column="version"/>
         <result property="remark" column="remark"/>
-        <collection property="children" select="gradeCommentId" column="parent_id"
+        <collection property="children" select="getStoreCategoryId" column="store_category_id"
                     ofType="com.younike.service.pojo.vo.StoreCategoryVo">
         </collection>
     </resultMap>
@@ -50,12 +50,23 @@
         select store_category_id, biz_type, category_name, parent_id, icon, is_enable, index_show, type, sorting, del_flag, created_by, created_time, updated_by, updated_time, version, remark from store_category
     </sql>
 <!--获取门店分类树状图 (只查询一级分类)-->
-    <select id="getStoreCategoryTree" resultMap="StoreCategoryResultVo">
-        <include refid="selectStoreCategoryVo"/>  where parent_id=0 and del_flag=0 ORDER BY sorting,created_time  desc
+    <select id="getStoreCategoryTree" resultMap="StoreCategoryResultVo" resultType="com.younike.service.pojo.StoreCategory">
+        <include refid="selectStoreCategoryVo"/>
+          where parent_id=0
+          and del_flag=0
+          and is_enable=1
+        <if test="bizType != null and bizType != ''">
+            AND biz_type =#{bizType}
+        </if>
+          ORDER BY sorting,created_time  desc
     </select>
 
-    <select id="gradeCommentId" resultMap="com.younike.service.mapper.StoreCategoryMapper.StoreCategoryResultVo">
-        <include refid="selectStoreCategoryVo"/>  where comment_id=#{parent_id} and del_flag=0 ORDER BY sorting,created_time  desc
+    <select id="getStoreCategoryId" resultMap="com.younike.service.mapper.StoreCategoryMapper.StoreCategoryResultVo">
+        <include refid="selectStoreCategoryVo"/>
+          where parent_id=#{store_category_id}
+          and del_flag=0
+          and is_enable=1
+          ORDER BY sorting,created_time  desc
     </select>
 
 </mapper>