Ver Fonte

添加app升级功能

luobo há 4 anos atrás
pai
commit
0b7b04e44e

+ 219 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppUpgradeController.java

@@ -0,0 +1,219 @@
+package com.ruoyi.web.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.Arrays;
+import java.util.Map;
+
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.exception.CustomException;
+import com.ruoyi.common.utils.ReadAPPUtil;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.framework.web.service.TokenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.app.domain.TAppUpgrade;
+import com.ruoyi.app.service.ITAppUpgradeService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * app升级
+ *
+ * @author luobo
+ * @date 2020-10-28
+ */
+@Api(value = "app升级", tags = "app升级")
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/appUpgrade")
+public class TAppUpgradeController extends BaseController {
+
+    private final ITAppUpgradeService iTAppUpgradeService;
+    private final TokenService tokenService;
+    /**
+     * 查询app升级列表
+     */
+    @ApiOperation("查询app升级列表")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TAppUpgrade tAppUpgrade) {
+        startPage();
+        LambdaQueryWrapper<TAppUpgrade> lqw = new LambdaQueryWrapper<TAppUpgrade>();
+        if (StringUtils.isNotBlank(tAppUpgrade.getName())) {
+            lqw.like(TAppUpgrade::getName, tAppUpgrade.getName());
+        }
+        if (StringUtils.isNotBlank(tAppUpgrade.getIconUrl())) {
+            lqw.eq(TAppUpgrade::getIconUrl, tAppUpgrade.getIconUrl());
+        }
+        if (tAppUpgrade.getUpgradeMode() != null) {
+            lqw.eq(TAppUpgrade::getUpgradeMode, tAppUpgrade.getUpgradeMode());
+        }
+        if (StringUtils.isNotBlank(tAppUpgrade.getUpgradeNote())) {
+            lqw.eq(TAppUpgrade::getUpgradeNote, tAppUpgrade.getUpgradeNote());
+        }
+        if (StringUtils.isNotBlank(tAppUpgrade.getUpgradeUrl())) {
+            lqw.eq(TAppUpgrade::getUpgradeUrl, tAppUpgrade.getUpgradeUrl());
+        }
+        if (tAppUpgrade.getUpgradeType() != null) {
+            lqw.eq(TAppUpgrade::getUpgradeType, tAppUpgrade.getUpgradeType());
+        }
+        if (tAppUpgrade.getUserId() != null) {
+            lqw.eq(TAppUpgrade::getUserId, tAppUpgrade.getUserId());
+        }
+        if (tAppUpgrade.getPlatformType() != null) {
+            lqw.eq(TAppUpgrade::getPlatformType, tAppUpgrade.getPlatformType());
+        }
+        List<TAppUpgrade> list = iTAppUpgradeService.list(lqw);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出app升级列表
+     */
+    @ApiOperation("导出app升级列表")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:export')")
+    //@Log(title = "app升级", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TAppUpgrade tAppUpgrade) {
+        LambdaQueryWrapper<TAppUpgrade> lqw = new LambdaQueryWrapper<TAppUpgrade>(tAppUpgrade);
+        List<TAppUpgrade> list = iTAppUpgradeService.list(lqw);
+        ExcelUtil<TAppUpgrade> util = new ExcelUtil<TAppUpgrade>(TAppUpgrade.class);
+        return util.exportExcel(list, "appUpgrade");
+    }
+
+    /**
+     * 获取app升级详细信息
+     */
+    @ApiOperation("获取app升级详细信息")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return AjaxResult.success(iTAppUpgradeService.getById(id));
+    }
+
+    /**
+     * 新增app升级
+     */
+    @ApiOperation("新增app升级")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:add')")
+    //@Log(title = "app升级", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TAppUpgrade tAppUpgrade) {
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        tAppUpgrade.setUserId(userId);
+        tAppUpgrade.setCreateTime(new Date());
+        tAppUpgrade.setDelFlag("0");
+        return toAjax(iTAppUpgradeService.save(tAppUpgrade) ? 1 : 0);
+    }
+
+    /**
+     * 修改app升级
+     */
+    @ApiOperation("修改app升级")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:edit')")
+    //@Log(title = "app升级", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TAppUpgrade tAppUpgrade) {
+        return toAjax(iTAppUpgradeService.updateById(tAppUpgrade) ? 1 : 0);
+    }
+
+    /**
+     * 删除app升级
+     */
+    @ApiOperation("删除app升级")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:remove')")
+    //@Log(title = "app升级", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(iTAppUpgradeService.removeByIds(Arrays.asList(ids)) ? 1 : 0);
+    }
+
+
+    /**
+     * 上传文件
+     */
+    @ApiOperation("上传文件")
+    @PreAuthorize("@ss.hasPermi('system:appUpgrade:upload')")
+    @PostMapping("/upload")
+    public AjaxResult upload(@RequestParam("file") MultipartFile file) throws Exception {
+        if (file.isEmpty()) {
+            throw new CustomException("上传文件不能为空");
+        }
+
+        File file1 = FileUtils.transfer(file);
+
+        if (file1 == null) {
+            throw new CustomException("上传文件不能为空");
+        }
+        //获取文件后缀
+        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+        Map fileInfo = null;
+
+        //获取文件信息
+        int ptype = 0;
+        if (suffix.equalsIgnoreCase(".ipa")) {
+            fileInfo = ReadAPPUtil.readIPA(file1);
+            ptype = 2;
+        } else {
+            fileInfo = ReadAPPUtil.readAPK(file1);
+            ptype = 1;
+        }
+        if (fileInfo.get("code").equals("-1")) {
+            throw new CustomException(fileInfo.get("error").toString());
+        }
+
+
+        TAppUpgrade entity = new TAppUpgrade();
+        entity.setDelFlag("0");
+        entity.setName(fileInfo.get("name").toString());
+        entity.setPackageName(fileInfo.get("packageName").toString());
+        entity.setVersionCode(fileInfo.get("versionCode").toString());
+        entity.setVersionName(fileInfo.get("versionName").toString());
+        entity.setPlatformType(ptype);
+        entity.setSize((file.getSize()));
+        entity.setSuffix(suffix);
+
+
+        //上传文件
+//        String url = OSSFactory.build().uploadSuffix(file.getBytes(), suffix);
+
+        // 上传文件路径
+        String filePath = RuoYiConfig.getUploadPath();
+        //@TODO 上传添加模块名称 luobo
+
+        filePath += "/appFile";
+        // 上传并返回新文件名称
+        String fileName = FileUploadUtils.upload(filePath, file);
+        entity.setUpgradeUrl(fileName);
+        entity.setUpgradeMode(1);
+        entity.setUpgradeType(1);
+
+        if (file1.exists()) {
+            File del = new File(file1.toURI());
+            del.delete();
+
+        }
+        return AjaxResult.success(entity);
+    }
+
+
+}

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -52,9 +52,9 @@ spring:
   servlet:
      multipart:
        # 单个文件大小
-       max-file-size:  10MB
+       max-file-size:  100MB
        # 设置总上传的文件大小
-       max-request-size:  20MB
+       max-request-size:  200MB
   # 服务模块
   devtools:
     restart:

+ 18 - 0
ruoyi-app/src/main/java/com/ruoyi/app/controller/AppLoginController.java

@@ -5,8 +5,11 @@ import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.app.annotation.PassToken;
 import com.ruoyi.app.base.AppLoginUser;
 import com.ruoyi.app.base.AppTokenService;
+import com.ruoyi.app.domain.dto.CheckAppForm;
 import com.ruoyi.app.domain.vo.AppLoginVo;
 import com.ruoyi.app.domain.vo.AppMemberVo;
+import com.ruoyi.app.domain.vo.AppUpgradeVo;
+import com.ruoyi.app.service.ITAppUpgradeService;
 import com.ruoyi.app.service.ITbAppUserService;
 import com.ruoyi.app.util.AliSMSUtil;
 import com.ruoyi.common.config.RuoYiConfig;
@@ -16,6 +19,7 @@ import com.ruoyi.common.utils.ServletUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.FileUtils;
 import com.ruoyi.common.utils.ip.IpUtils;
+import com.ruoyi.common.validator.ValidatorUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -47,6 +51,7 @@ public class AppLoginController {
 
     private final AppTokenService appTokenService;
     private final ITbAppUserService userService;
+    private final ITAppUpgradeService appUpgradeService;
 
     /**
      * 登录
@@ -223,4 +228,17 @@ public class AppLoginController {
         return AjaxResult.success();
     }
 
+    @PassToken
+    @PostMapping("/checkApp")
+    @ApiOperation(value = "检查app版本", response = AppUpgradeVo.class)
+    public AjaxResult checkApp(@RequestBody CheckAppForm form) {
+        //表单校验
+        ValidatorUtils.validateEntity(form);
+
+        //检查
+        AppUpgradeVo vo = appUpgradeService.checkApp(form);
+
+        return AjaxResult.success(vo);
+    }
+
 }

+ 12 - 1
ruoyi-common/pom.xml

@@ -187,7 +187,18 @@
             <artifactId>gexin-rp-sdk-http</artifactId>
             <version>4.1.1.4</version>
         </dependency>
-
+        <!--解析apk-->
+        <dependency>
+            <groupId>net.dongliu</groupId>
+            <artifactId>apk-parser</artifactId>
+            <version>2.6.10</version>
+        </dependency>
+        <!--解析ipa-->
+        <dependency>
+            <groupId>com.googlecode.plist</groupId>
+            <artifactId>dd-plist</artifactId>
+            <version>1.23</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 179 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/ReadAPPUtil.java

@@ -0,0 +1,179 @@
+package com.ruoyi.common.utils;
+
+import com.dd.plist.NSDictionary;
+import com.dd.plist.NSString;
+import com.dd.plist.PropertyListParser;
+import net.dongliu.apk.parser.ApkFile;
+import net.dongliu.apk.parser.bean.ApkMeta;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+public class ReadAPPUtil {
+    /**
+     * 读取apk
+     *
+     * @param apkUrl
+     * @return
+     */
+    public static Map<String, Object> readAPK(File apkUrl) {
+        Map<String, Object> resMap = new HashMap<String, Object>();
+        try (ApkFile apkFile = new ApkFile(apkUrl)) {
+            ApkMeta apkMeta = apkFile.getApkMeta();
+            //app名称
+            resMap.put("name", apkMeta.getName());
+            //包名
+            resMap.put("packageName", apkMeta.getPackageName());
+            //版本号
+            resMap.put("versionCode", apkMeta.getVersionCode());
+            //版本名
+            resMap.put("versionName", apkMeta.getVersionName());
+//            for (UseFeature feature : apkMeta.getUsesFeatures()) {
+//                System.out.println(feature.getName());
+//            }
+            resMap.put("code", "0");
+            resMap.put("error", "ok");
+        } catch (IOException e) {
+            e.printStackTrace();
+            resMap.put("code", "-1");
+            resMap.put("error", "读取apk文件失败");
+        }
+        return resMap;
+
+    }
+
+    /**
+     * 读取ipa
+     */
+    public static Map<String, Object> readIPA(File ipaURL) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+
+            InputStream is = new FileInputStream(ipaURL);
+            InputStream is2 = new FileInputStream(ipaURL);
+            ZipInputStream zipIns = new ZipInputStream(is);
+            ZipInputStream zipIns2 = new ZipInputStream(is2);
+            ZipEntry ze;
+            ZipEntry ze2;
+            InputStream infoIs = null;
+            NSDictionary rootDict = null;
+            String icon = null;
+            while ((ze = zipIns.getNextEntry()) != null) {
+                if (!ze.isDirectory()) {
+                    String name = ze.getName();
+                    if (null != name &&
+                            name.toLowerCase().contains(".app/info.plist")) {
+                        ByteArrayOutputStream _copy = new
+                                ByteArrayOutputStream();
+                        int chunk = 0;
+                        byte[] data = new byte[1024];
+                        while (-1 != (chunk = zipIns.read(data))) {
+                            _copy.write(data, 0, chunk);
+                        }
+                        infoIs = new ByteArrayInputStream(_copy.toByteArray());
+                        rootDict = (NSDictionary) PropertyListParser.parse(infoIs);
+
+                        //我们可以根据info.plist结构获取任意我们需要的东西
+                        //比如下面我获取图标名称,图标的目录结构请下面图片
+                        //获取图标名称
+//                        NSDictionary iconDict = (NSDictionary) rootDict.get("CFBundleIcons");
+//
+//                        while (null != iconDict) {
+//                            if(iconDict.containsKey("CFBundlePrimaryIcon")){
+//                                NSDictionary CFBundlePrimaryIcon = (NSDictionary)iconDict.get("CFBundlePrimaryIcon");
+//                                if(CFBundlePrimaryIcon.containsKey("CFBundleIconFiles")){
+//                                    NSArray CFBundleIconFiles =(NSArray)CFBundlePrimaryIcon.get("CFBundleIconFiles");
+//                                    icon = CFBundleIconFiles.getArray()[0].toString();
+//                                    if(icon.contains(".png")){
+//                                        icon = icon.replace(".png", "");
+//                                    }
+//                                    System.out.println("获取icon名称:" + icon);
+//                                    break;
+//                                }
+//                            }
+//                        }
+                        break;
+                    }
+                }
+            }
+
+            //根据图标名称下载图标文件到指定位置
+//            while ((ze2 = zipIns2.getNextEntry()) != null) {
+//                if (!ze2.isDirectory()) {
+//                    String name = ze2.getName();
+//                    System.out.println(name);
+//                    if(name.contains(icon.trim())){
+//                        System.out.println(11111);
+//                        FileOutputStream fos = new FileOutputStream(new File("E:\\python\\img\\icon.png"));
+//                        int chunk = 0;
+//                        byte[] data = new byte[1024];
+//                        while(-1!=(chunk=zipIns2.read(data))){
+//                            fos.write(data, 0, chunk);
+//                        }
+//                        fos.close();
+//                        break;
+//                    }
+//                }
+//            }
+
+            ////////////////////////////////////////////////////////////////
+            //如果想要查看有哪些key ,可以把下面注释放开
+//            for (String keyName : rootDict.allKeys()) {
+//				System.out.println(keyName + ":" + rootDict.get(keyName).toString());
+//			  }
+
+
+            //app名称
+            NSString parameters = (NSString) rootDict.objectForKey("CFBundleName");
+            map.put("name", parameters.toString());
+
+
+            // 应用包名
+            parameters = (NSString) rootDict.get("CFBundleIdentifier");
+            map.put("packageName", parameters.toString());
+
+            //应用版本号
+            parameters = (NSString) rootDict.get("CFBundleVersion");
+            map.put("versionCode", parameters.toString());
+            // 应用版本名
+            parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
+            map.put("versionName", parameters.toString());
+
+            map.put("code", "0");
+            map.put("error", "ok");
+
+            /////////////////////////////////////////////////
+            infoIs.close();
+            is.close();
+            zipIns.close();
+
+        } catch (Exception e) {
+            map.put("code", "-1");
+            map.put("error", "读取ipa文件失败");
+        }
+        return map;
+    }
+
+
+    public static void main(String[] args) {
+//        ApkInfo apkInfo = new ApkInfo();
+        System.out.println("======apk=========");
+        String apkUrl = "E:/AndroidStudioProjects/misi/app/release/app-kks.apk";
+        File f = new File(apkUrl);
+        Map<String, Object> mapApk = ReadAPPUtil.readAPK(f);
+        for (String key : mapApk.keySet()) {
+            System.out.println(key + ":" + mapApk.get(key));
+        }
+        System.out.println("======ipa==========");
+        String ipaUrl = "E:/AndroidStudioProjects/misi/app/release/app-kks.ipa";
+        File f2 = new File(ipaUrl);
+        Map<String, Object> mapIpa = ReadAPPUtil.readIPA(f2);
+        for (String key : mapIpa.keySet()) {
+            System.out.println(key + ":" + mapIpa.get(key));
+        }
+    }
+
+}

+ 31 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java

@@ -1,6 +1,7 @@
 package com.ruoyi.common.utils.file;
 
 import com.ruoyi.common.config.RuoYiConfig;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
 import java.net.URL;
@@ -55,6 +56,36 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
             }
         }
     }
+    /**
+     * MultipartFile转File
+     *
+     * @param param
+     * @return
+     */
+    public static File transfer(MultipartFile param) {
+        if (!param.isEmpty()) {
+            File file = null;
+            try {
+                InputStream in = param.getInputStream();
+                file = new File(param.getOriginalFilename());
+                OutputStream out = new FileOutputStream(file);
+                int bytesRead = 0;
+                byte[] buffer = new byte[8192];
+                while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
+                    out.write(buffer, 0, bytesRead);
+                }
+                in.close();
+                out.close();
+                return file;
+            } catch (Exception e) {
+                e.printStackTrace();
+                return file;
+            }
+        }
+        return null;
+    }
+
+
 
     /**
      * 删除文件

+ 3 - 1
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java

@@ -32,7 +32,9 @@ public class MimeTypeUtils
             // 压缩文件
             "rar", "zip", "gz", "bz2",
             // pdf
-            "pdf" };
+            "pdf",
+            //app
+            "apk","ipa"};
 
     public static String getExtension(String prefix)
     {

+ 112 - 0
ruoyi-system/src/main/java/com/ruoyi/app/domain/TAppUpgrade.java

@@ -0,0 +1,112 @@
+package com.ruoyi.app.domain;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import com.ruoyi.common.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * app升级
+ * 
+ * @author luobo
+ * @date 2020-10-28
+ */
+@Data
+@ApiModel(value = "app升级")
+@ToString
+@EqualsAndHashCode
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("t_app_upgrade")
+public class TAppUpgrade implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+
+    /** 系统id */
+    @ApiModelProperty(value="系统id")
+    @TableId(value = "id")
+    private Long id;
+
+    /** 应用名 */
+    @ApiModelProperty(value="应用名")
+    @Excel(name = "应用名")
+    private String name;
+
+    /** 包名 */
+    @ApiModelProperty(value="包名")
+    private String packageName;
+
+    /** 版本 */
+    @ApiModelProperty(value="版本")
+    private String versionName;
+
+    /** vCode */
+    @ApiModelProperty(value="vCode")
+    private String versionCode;
+
+    /** 包大小(B) */
+    @ApiModelProperty(value="包大小(B)")
+    private Long size;
+
+    /** 包后缀 */
+    @ApiModelProperty(value="包后缀")
+    private String suffix;
+
+    /** 图标路径 */
+    @ApiModelProperty(value="图标路径")
+    @Excel(name = "图标路径")
+    private String iconUrl;
+
+    /** 升级方式 1、推荐升级 2、强制升级 */
+    @ApiModelProperty(value="升级方式 1、推荐升级 2、强制升级")
+    @Excel(name = "升级方式 1、推荐升级 2、强制升级")
+    private Integer upgradeMode;
+
+    /** 升级说明 */
+    @ApiModelProperty(value="升级说明")
+    @Excel(name = "升级说明")
+    private String upgradeNote;
+
+    /** 升级url */
+    @ApiModelProperty(value="升级url")
+    @Excel(name = "升级url")
+    private String upgradeUrl;
+
+    /** 升级包类型 1、整包 2、升级包 */
+    @ApiModelProperty(value="升级包类型 1、整包 2、升级包")
+    @Excel(name = "升级包类型 1、整包 2、升级包")
+    private Integer upgradeType;
+
+    /** 创建用户id */
+    @ApiModelProperty(value="创建用户id")
+    @Excel(name = "创建用户id")
+    private Long userId;
+
+    /** 创建时间 */
+    @ApiModelProperty(value="创建时间")
+    private Date createTime;
+
+    /** 1、安卓 2、苹果 */
+    @ApiModelProperty(value="1、安卓 2、苹果")
+    @Excel(name = "1、安卓 2、苹果")
+    private Integer platformType;
+
+    /** 删除标志(0代表存在 1代表删除) */
+    @ApiModelProperty(value="删除标志(0代表存在 1代表删除)")
+    @TableLogic
+    private String delFlag;
+}

+ 23 - 0
ruoyi-system/src/main/java/com/ruoyi/app/domain/dto/CheckAppForm.java

@@ -0,0 +1,23 @@
+package com.ruoyi.app.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("检查app版本")
+public class CheckAppForm {
+
+    @ApiModelProperty("平台;1、安卓 2、苹果")
+    @NotNull(message = "平台类型不能为空")
+    private Integer platformType=1;
+    @ApiModelProperty("包名")
+    @NotBlank(message = "包名不能为空")
+    private String packageName;
+    @ApiModelProperty("手机当前版本号")
+    @NotBlank(message = "手机当前版本号不能为空")
+    private String versionCode="1";
+}

+ 56 - 0
ruoyi-system/src/main/java/com/ruoyi/app/domain/vo/AppUpgradeVo.java

@@ -0,0 +1,56 @@
+package com.ruoyi.app.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel("升级返回")
+public class AppUpgradeVo {
+    @ApiModelProperty("升级标志 1:需要升级;0:无需升级 ")
+    private Integer status;
+
+    /**
+     * 版本
+     */
+    @ApiModelProperty("升级版本名")
+    private String versionName;
+    /**
+     * vCode
+     */
+    @ApiModelProperty("升级版本号")
+    private String versionCode;
+    /**
+     * 包大小(b)
+     */
+    @ApiModelProperty("升级包大小(B)")
+    private Long size;
+
+    /**
+     * 升级方式 1、推荐升级 2、强制升级
+     */
+    @ApiModelProperty("升级方式 1、推荐升级 2、强制升级")
+    private Integer upgradeMode;
+    /**
+     * 升级说明
+     */
+    @ApiModelProperty("升级说明\\n换行")
+    private String upgradeNote;
+    /**
+     * 升级url
+     */
+    @ApiModelProperty("升级url")
+    private String upgradeUrl;
+    /**
+     * 升级包类型 1、整包 2、升级包
+     */
+    @ApiModelProperty("升级包类型 1、整包 2、升级包")
+    private Integer upgradeType;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty("上传时间")
+    private Date createDate;
+}

+ 14 - 0
ruoyi-system/src/main/java/com/ruoyi/app/mapper/TAppUpgradeMapper.java

@@ -0,0 +1,14 @@
+package com.ruoyi.app.mapper;
+
+import com.ruoyi.app.domain.TAppUpgrade;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * app升级
+ *
+ * @author luobo
+ * @date 2020-10-28
+ */
+public interface TAppUpgradeMapper extends BaseMapper<TAppUpgrade> {
+
+}

+ 22 - 0
ruoyi-system/src/main/java/com/ruoyi/app/service/ITAppUpgradeService.java

@@ -0,0 +1,22 @@
+package com.ruoyi.app.service;
+
+import com.ruoyi.app.domain.TAppUpgrade;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.app.domain.dto.CheckAppForm;
+import com.ruoyi.app.domain.vo.AppUpgradeVo;
+
+/**
+ * app升级
+ *
+ * @author luobo
+ * @date 2020-10-28
+ */
+public interface ITAppUpgradeService extends IService<TAppUpgrade> {
+
+    /**
+     * 返回最新版本,当前版本一至时返回null
+     * @param form
+     * @return
+     */
+    AppUpgradeVo checkApp(CheckAppForm form);
+}

+ 73 - 0
ruoyi-system/src/main/java/com/ruoyi/app/service/impl/TAppUpgradeServiceImpl.java

@@ -0,0 +1,73 @@
+package com.ruoyi.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.app.domain.dto.CheckAppForm;
+import com.ruoyi.app.domain.vo.AppUpgradeVo;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.app.mapper.TAppUpgradeMapper;
+import com.ruoyi.app.domain.TAppUpgrade;
+import com.ruoyi.app.service.ITAppUpgradeService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * app升级
+ *
+ * @author luobo
+ * @date 2020-10-28
+ */
+@Service
+public class TAppUpgradeServiceImpl extends ServiceImpl<TAppUpgradeMapper, TAppUpgrade> implements ITAppUpgradeService {
+
+
+    @Override
+    public AppUpgradeVo checkApp(CheckAppForm form) {
+        LambdaQueryWrapper<TAppUpgrade> queryWrapper= new LambdaQueryWrapper<TAppUpgrade>()
+                .eq(TAppUpgrade::getPackageName,form.getPackageName())
+                .eq(TAppUpgrade::getPlatformType,form.getPlatformType());
+        List<TAppUpgrade> list = list(queryWrapper);
+        AppUpgradeVo upgradeVo = new AppUpgradeVo();
+        if (list==null && list.size()<=0){
+            //没有版本信息
+            upgradeVo.setStatus(0);
+            return upgradeVo;
+        }
+
+
+        Integer oldCode =Integer.parseInt(form.getVersionCode().replace(".","").replace("/","").replace("\\",""));
+
+
+        Map<Integer,TAppUpgrade> data = new HashMap<>();
+
+        Integer newCode = 0;
+
+        TAppUpgrade newEntity = null;
+
+        for (TAppUpgrade item :list){
+            Integer code =Integer.parseInt(item.getVersionCode().replace(".","").replace("/","").replace("\\",""));
+            if (code>oldCode && newCode < code){
+                newCode = code;
+                newEntity = item;
+            }
+        }
+        if (newCode == 0){
+            //没有版本信息
+            upgradeVo.setStatus(0);
+            return upgradeVo;
+        }
+        upgradeVo.setStatus(1);
+        upgradeVo.setSize(newEntity.getSize());
+        upgradeVo.setUpgradeMode(newEntity.getUpgradeMode());
+        upgradeVo.setUpgradeNote(newEntity.getUpgradeNote());
+        upgradeVo.setUpgradeType(newEntity.getUpgradeType());
+        upgradeVo.setUpgradeUrl(newEntity.getUpgradeUrl());
+        upgradeVo.setVersionCode(newEntity.getVersionCode());
+        upgradeVo.setVersionName(newEntity.getVersionName());
+        upgradeVo.setCreateDate(newEntity.getCreateTime());
+        return upgradeVo;
+    }
+}

+ 27 - 0
ruoyi-system/src/main/resources/mapper/app/TAppUpgradeMapper.xml

@@ -0,0 +1,27 @@
+<?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.ruoyi.app.mapper.TAppUpgradeMapper">
+    
+    <resultMap type="TAppUpgrade" id="TAppUpgradeResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="packageName"    column="package_name"    />
+        <result property="versionName"    column="version_name"    />
+        <result property="versionCode"    column="version_code"    />
+        <result property="size"    column="size"    />
+        <result property="suffix"    column="suffix"    />
+        <result property="iconUrl"    column="icon_url"    />
+        <result property="upgradeMode"    column="upgrade_mode"    />
+        <result property="upgradeNote"    column="upgrade_note"    />
+        <result property="upgradeUrl"    column="upgrade_url"    />
+        <result property="upgradeType"    column="upgrade_type"    />
+        <result property="userId"    column="user_id"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="platformType"    column="platform_type"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+
+</mapper>