From 3d531b98cd7e6edcff151f567c757dd098ae2032 Mon Sep 17 00:00:00 2001 From: 王彪总 Date: Tue, 26 May 2026 14:22:32 +0800 Subject: [PATCH] fix(config): 更新配置文件和修复分页计算问题 --- docs/app_version.sql | 25 +++++++++++++++++++++++++ java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java | 9 +++++++-- java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java | 15 +++++++++------ java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java | 9 +++++++-- service-api/src/main/java/com/java110/api/components/uploadFile/UploadFileComponent.java | 16 ++++++++++++++++ service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java | 7 ++++--- service-api/src/main/java/com/java110/api/controller/component/CallComponentController.java | 33 +++++++++++++++++++++++++++++++++ service-api/src/main/resources/.!78575!wechatAuth.properties | 13 +++++++++++++ service-api/src/main/resources/application-dev.yml | 4 ++-- service-api/src/main/resources/application-dynamic.yml | 4 ++-- service-api/src/main/resources/application-zihao.yml | 4 ++-- service-common/src/main/java/com/java110/common/smo/impl/FileInnerServiceSMOImpl.java | 10 ++++++---- service-user/src/main/java/com/java110/user/cmd/property/CheckVersionCmd.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/cmd/property/DeleteAppVersionCmd.java | 41 +++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/cmd/property/ListAppVersionsCmd.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/cmd/property/SaveAppVersionCmd.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/cmd/property/UpdateAppVersionCmd.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/dao/impl/AppVersionV1ServiceDaoImpl.java | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ service-user/src/main/java/com/java110/user/dao/property/IAppVersionV1ServiceDao.java | 13 +++++++++++++ service-user/src/main/resources/mapper/property/AppVersionMapper.xml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 20 files changed, 493 insertions(+), 23 deletions(-) create mode 100644 docs/app_version.sql create mode 100644 service-api/src/main/resources/.!78575!wechatAuth.properties create mode 100644 service-user/src/main/java/com/java110/user/cmd/property/CheckVersionCmd.java create mode 100644 service-user/src/main/java/com/java110/user/cmd/property/DeleteAppVersionCmd.java create mode 100644 service-user/src/main/java/com/java110/user/cmd/property/ListAppVersionsCmd.java create mode 100644 service-user/src/main/java/com/java110/user/cmd/property/SaveAppVersionCmd.java create mode 100644 service-user/src/main/java/com/java110/user/cmd/property/UpdateAppVersionCmd.java create mode 100644 service-user/src/main/java/com/java110/user/dao/impl/AppVersionV1ServiceDaoImpl.java create mode 100644 service-user/src/main/java/com/java110/user/dao/property/IAppVersionV1ServiceDao.java create mode 100644 service-user/src/main/resources/mapper/property/AppVersionMapper.xml diff --git a/docs/app_version.sql b/docs/app_version.sql new file mode 100644 index 0000000..dcc11f2 --- /dev/null +++ b/docs/app_version.sql @@ -0,0 +1,25 @@ +-- App version check table +DROP TABLE IF EXISTS `app_version`; +CREATE TABLE `app_version` ( + `id` int NOT NULL AUTO_INCREMENT, + `av_id` varchar(30) NOT NULL COMMENT 'version ID', + `version_code` int NOT NULL COMMENT 'e.g. 100', + `version_name` varchar(20) NOT NULL COMMENT 'e.g. 1.0.0', + `download_url` varchar(500) NOT NULL COMMENT 'APK download URL', + `force_update` tinyint DEFAULT 0 COMMENT '0=optional 1=force', + `update_message` text COMMENT 'update description', + `platform` varchar(10) DEFAULT 'android' COMMENT 'android/ios', + `status_cd` varchar(2) DEFAULT '0', + `create_time` timestamp DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_platform` (`platform`, `status_cd`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- Seed data: current version +INSERT INTO `app_version` (`av_id`, `version_code`, `version_name`, `download_url`, `force_update`, `update_message`, `platform`, `status_cd`) +VALUES ('AV20260518001', 100, '1.0.0', 'https://spms.xrparking.cn/app/download', 0, '初始版本', 'android', '0'); +INSERT INTO c_service (service_id, service_code, business_type_cd, name, seq, is_instance, url, method, timeout, retry_count, provide_app_id, status_cd) +VALUES ('SVCPROPVER', 'property.checkVersion', 'API', '版本检查', 1, 'CMD', 'http://user-service', 'POST', 60, 3, '8000418002', '0'); + +INSERT INTO c_route (app_id, service_id, order_type_cd, invoke_limit_times, invoke_model, status_cd) +VALUES ('992020022270580001', 'SVCPROPVER', 'Q', -1, 'S', '0'); diff --git a/java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java b/java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java index a1fa071..8fa5fec 100644 --- a/java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java +++ b/java110-core/src/main/java/com/java110/core/client/CosUploadTemplate.java @@ -39,6 +39,11 @@ public class CosUploadTemplate { */ public String upload(String imageBase64, String server, int port, String userName, String userPassword, String ftpPath) { + return upload(imageBase64, server, port, userName, userPassword, ftpPath, "jpg"); + } + + public String upload(String imageBase64, String server, int port, + String userName, String userPassword, String ftpPath, String suffix) { if (imageBase64 == null || imageBase64.isEmpty()) { throw new IllegalArgumentException("上传文件失败: 文件内容为空"); } @@ -60,9 +65,9 @@ public class CosUploadTemplate { fileName += ".jpg"; } else if (imageBase64.contains("data:application/octet-stream;base64,")) { imageBase64 = imageBase64.replace("data:application/octet-stream;base64,", ""); - fileName += ".jpg"; + fileName += "." + suffix; } else { - fileName += ".jpg"; + fileName += "." + suffix; } urlPath = IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/" + fileName; byte[] context = Base64Convert.base64ToByte(imageBase64); diff --git a/java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java b/java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java index 586881a..5929737 100755 --- a/java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java +++ b/java110-core/src/main/java/com/java110/core/client/FtpUploadTemplate.java @@ -47,6 +47,11 @@ public class FtpUploadTemplate { */ public String upload(String imageBase64, String server, int port, String userName, String userPassword, String ftpPath) { + return upload(imageBase64, server, port, userName, userPassword, ftpPath, "jpg"); + } + + public String upload(String imageBase64, String server, int port, + String userName, String userPassword, String ftpPath, String suffix) { if (imageBase64 == null || imageBase64.isEmpty()) { throw new IllegalArgumentException("上传文件失败: 文件内容为空"); } @@ -55,7 +60,6 @@ public class FtpUploadTemplate { ByteArrayInputStream is = null; try { ftpClient = new FTPClient(); - // request.setCharacterEncoding("utf-8"); if (!ftpClient.isConnected()) { ftpClient.connect(server, port); } @@ -63,10 +67,9 @@ public class FtpUploadTemplate { ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpPath = ftpPath + IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/"; - mkDir(ftpClient, ftpPath);// 创建目录 - // 设置上传目录 must + mkDir(ftpClient, ftpPath); ftpClient.changeWorkingDirectory(ftpPath); - if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK). + if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) { LOCAL_CHARSET = "UTF-8"; } fileName = UUID.randomUUID().toString(); @@ -81,9 +84,9 @@ public class FtpUploadTemplate { fileName += ".jpg"; } else if (imageBase64.contains("data:application/octet-stream;base64,")) { imageBase64 = imageBase64.replace("data:application/octet-stream;base64,", ""); - fileName += ".jpg"; + fileName += "." + suffix; } else { - fileName += ".jpg"; + fileName += "." + suffix; } FTPFile[] fs = ftpClient.listFiles(fileName); if (fs.length == 0) { diff --git a/java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java b/java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java index 2ed85a5..a2b5127 100755 --- a/java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java +++ b/java110-core/src/main/java/com/java110/core/client/OssUploadTemplate.java @@ -42,6 +42,11 @@ public class OssUploadTemplate { */ public String upload(String imageBase64, String server, int port, String userName, String userPassword, String ftpPath) { + return upload(imageBase64, server, port, userName, userPassword, ftpPath, "jpg"); + } + + public String upload(String imageBase64, String server, int port, + String userName, String userPassword, String ftpPath, String suffix) { if (imageBase64 == null || imageBase64.isEmpty()) { throw new IllegalArgumentException("上传文件失败: 文件内容为空"); } @@ -64,9 +69,9 @@ public class OssUploadTemplate { fileName += ".jpg"; } else if (imageBase64.contains("data:application/octet-stream;base64,")) { imageBase64 = imageBase64.replace("data:application/octet-stream;base64,", ""); - fileName += ".jpg"; + fileName += "." + suffix; } else { - fileName += ".jpg"; + fileName += "." + suffix; } urlPath = IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/" + fileName; byte[] context = Base64Convert.base64ToByte(imageBase64); diff --git a/service-api/src/main/java/com/java110/api/components/uploadFile/UploadFileComponent.java b/service-api/src/main/java/com/java110/api/components/uploadFile/UploadFileComponent.java index 67342d9..5d2e104 100644 --- a/service-api/src/main/java/com/java110/api/components/uploadFile/UploadFileComponent.java +++ b/service-api/src/main/java/com/java110/api/components/uploadFile/UploadFileComponent.java @@ -46,6 +46,22 @@ public class UploadFileComponent { } /** + * 上传APK文件 + */ + public ResponseEntity uploadApk(IPageData pd, MultipartFile uploadFile) throws Exception { + JSONObject paramIn = JSONObject.parseObject(pd.getReqData()); + String originalFilename = uploadFile.getOriginalFilename(); + String suffix = "apk"; + if (originalFilename != null && originalFilename.contains(".")) { + suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); + } + paramIn.put("suffix", suffix); + IPageData newPd = PageData.newInstance().builder(pd.getUserId(), pd.getUserName(), pd.getToken(), paramIn.toJSONString(), pd.getComponentCode(), pd.getComponentMethod(), "", + pd.getSessionId(), pd.getAppId(), pd.getHeaders()); + return addFileSMOImpl.saveFile(newPd, uploadFile); + } + + /** * 上传图片(兼容 base64 JSON 和 multipart 文件两种方式) * * @param pd 页面数据封装 diff --git a/service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java b/service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java index b5efaf7..1a50d2e 100644 --- a/service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java +++ b/service-api/src/main/java/com/java110/api/configuration/ServiceConfiguration.java @@ -17,10 +17,10 @@ public class ServiceConfiguration { @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); - //文件最大 - factory.setMaxFileSize(1024*1024*50); //KB,MB + //文件最大 200MB + factory.setMaxFileSize(1024*1024*200); //KB,MB /// 设置总上传数据总大小 - factory.setMaxRequestSize(1024*1024*50); + factory.setMaxRequestSize(1024*1024*200); return factory.createMultipartConfig(); } @Bean @@ -138,6 +138,7 @@ public class ServiceConfiguration { exclusions.append("/app/fee.listOwnerTelOweFee,");// 根据手机号查询欠费 exclusions.append("/app/mall.queryCommunityRecommend,");// 查询项目推荐 exclusions.append("/app/file/userfile/download/*,");// 下载文件 + exclusions.append("/app/downloadApk,");// APK下载代理 diff --git a/service-api/src/main/java/com/java110/api/controller/component/CallComponentController.java b/service-api/src/main/java/com/java110/api/controller/component/CallComponentController.java index de95216..fd4d299 100644 --- a/service-api/src/main/java/com/java110/api/controller/component/CallComponentController.java +++ b/service-api/src/main/java/com/java110/api/controller/component/CallComponentController.java @@ -41,6 +41,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; @@ -334,6 +336,37 @@ public class CallComponentController extends DefaultAbstractComponentSMO { } /** + * APK 文件下载代理 + * 通过后端代理下载OSS上的APK文件,避免OSS禁止APK公网分发的问题 + */ + @RequestMapping(path = "/app/downloadApk") + public void downloadApk(@RequestParam String file, HttpServletResponse response) { + InputStream is = null; + OutputStream os = null; + try { + Object componentInstance = ApplicationContextFactory.getBean("ossUploadTemplate"); + Method m = componentInstance.getClass().getDeclaredMethod("download", String.class); + is = (InputStream) m.invoke(componentInstance, file); + + response.setContentType("application/vnd.android.package-archive"); + response.setHeader("Content-Disposition", "attachment; filename=\"app-release.apk\""); + os = response.getOutputStream(); + byte[] buffer = new byte[4096]; + int len; + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + os.flush(); + } catch (Exception e) { + logger.error("APK下载失败", e); + try { response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在"); } catch (Exception ignored) {} + } finally { + try { if (is != null) is.close(); } catch (Exception ignored) {} + try { if (os != null) os.close(); } catch (Exception ignored) {} + } + } + + /** * 刷新 pd 对象 * * @param request HttpServletRequest 对象 diff --git a/service-api/src/main/resources/.!78575!wechatAuth.properties b/service-api/src/main/resources/.!78575!wechatAuth.properties new file mode 100644 index 0000000..0cef977 --- /dev/null +++ b/service-api/src/main/resources/.!78575!wechatAuth.properties @@ -0,0 +1,13 @@ +java110.auth.wechat.sessionHost=https://api.weixin.qq.com/sns/jscode2session +java110.auth.wechat.appId=wxf83d66b0e9f5964d +java110.auth.wechat.secret=cc +java110.auth.wechat.grantType=authorization_code +java110.auth.wechat.key=key +java110.auth.wechat.mchId=mchId +java110.auth.wechat.wxPayUnifiedOrder=https://api.mch.weixin.qq.com/pay/unifiedorder +java110.auth.wechat.wxNotifyUrl=http://www.vipwuye.com/app/payment/notify +java110.auth.wechat.rentingNotifyUrl=http://www.vipwuye.com/app/payment/rentingNotify +java110.auth.wechat.goodsNotifyUrl=http://www.vipwuye.com/goods/notify +java110.auth.wechat.oweFeeNotifyUrl=http://www.vipwuye.com/app/payment/oweFeeNotify +java110.auth.wechat.tempCarFeeNotifyUrl=http://www.vipwuye.com/app/payment/tempCarFeeNotifyUrl + diff --git a/service-api/src/main/resources/application-dev.yml b/service-api/src/main/resources/application-dev.yml index ab14448..bb8acff 100755 --- a/service-api/src/main/resources/application-dev.yml +++ b/service-api/src/main/resources/application-dev.yml @@ -16,8 +16,8 @@ server: spring: servlet: multipart: - maxFileSize: 50MB - maxRequestSize: 50MB + maxFileSize: 200MB + maxRequestSize: 200MB http: encoding: charset: UTF-8 diff --git a/service-api/src/main/resources/application-dynamic.yml b/service-api/src/main/resources/application-dynamic.yml index 3275aac..bae70af 100644 --- a/service-api/src/main/resources/application-dynamic.yml +++ b/service-api/src/main/resources/application-dynamic.yml @@ -16,8 +16,8 @@ server: spring: servlet: multipart: - maxFileSize: 50MB - maxRequestSize: 50MB + maxFileSize: 200MB + maxRequestSize: 200MB http: encoding: charset: UTF-8 diff --git a/service-api/src/main/resources/application-zihao.yml b/service-api/src/main/resources/application-zihao.yml index 3cab977..01cd30a 100644 --- a/service-api/src/main/resources/application-zihao.yml +++ b/service-api/src/main/resources/application-zihao.yml @@ -16,8 +16,8 @@ server: spring: servlet: multipart: - maxFileSize: 50MB - maxRequestSize: 50MB + maxFileSize: 200MB + maxRequestSize: 200MB http: encoding: charset: UTF-8 diff --git a/service-common/src/main/java/com/java110/common/smo/impl/FileInnerServiceSMOImpl.java b/service-common/src/main/java/com/java110/common/smo/impl/FileInnerServiceSMOImpl.java index d25071a..8603e11 100755 --- a/service-common/src/main/java/com/java110/common/smo/impl/FileInnerServiceSMOImpl.java +++ b/service-common/src/main/java/com/java110/common/smo/impl/FileInnerServiceSMOImpl.java @@ -51,24 +51,26 @@ public class FileInnerServiceSMOImpl extends BaseServiceSMO implements IFileInne String fileName = ""; String ossSwitch = MappingCache.getValue(MappingConstant.FILE_DOMAIN, OSSUtil.OSS_SWITCH); + String suffix = fileDto.getSuffix(); + if (suffix == null || suffix.isEmpty()) suffix = "jpg"; + if (OSSUtil.OSS_SWITCH_OSS.equals(ossSwitch)) { fileName = ossUploadTemplate.upload(fileDto.getContext(), java110Properties.getFtpServer(), java110Properties.getFtpPort(), java110Properties.getFtpUserName(), - java110Properties.getFtpUserPassword(), ROOT_PATH); + java110Properties.getFtpUserPassword(), ROOT_PATH, suffix); } else if (COSUtil.COS_SWITCH_COS.equals(ossSwitch)) { fileName = cosUploadTemplate.upload(fileDto.getContext(), java110Properties.getFtpServer(), java110Properties.getFtpPort(), java110Properties.getFtpUserName(), - java110Properties.getFtpUserPassword(), ROOT_PATH); + java110Properties.getFtpUserPassword(), ROOT_PATH, suffix); } else { String ftpServer = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_SERVER); int ftpPort = Integer.parseInt(MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_PORT)); String ftpUserName = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERNAME); String ftpUserPassword = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERPASSWORD); - //String ftpPath = "hc/"; fileName = ftpUploadTemplate.upload(fileDto.getContext(), ftpServer, ftpPort, ftpUserName, - ftpUserPassword, ROOT_PATH); + ftpUserPassword, ROOT_PATH, suffix); } return fileName; } diff --git a/service-user/src/main/java/com/java110/user/cmd/property/CheckVersionCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/CheckVersionCmd.java new file mode 100644 index 0000000..2be5fb6 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/cmd/property/CheckVersionCmd.java @@ -0,0 +1,73 @@ +package com.java110.user.cmd.property; + +import com.alibaba.fastjson.JSONObject; +import com.java110.core.annotation.Java110Cmd; +import com.java110.core.context.ICmdDataFlowContext; +import com.java110.core.event.cmd.Cmd; +import com.java110.core.event.cmd.CmdEvent; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import com.java110.vo.ResultVo; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; + +@Java110Cmd(serviceCode = "property.checkVersion") +public class CheckVersionCmd extends Cmd { + + @Autowired + private IAppVersionV1ServiceDao appVersionV1ServiceDao; + + @Override + public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + } + + @Override + public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + int currentCode = reqJson.getIntValue("versionCode"); + String platform = reqJson.containsKey("platform") ? reqJson.getString("platform") : "android"; + + Map params = new HashMap<>(); + params.put("platform", platform); + Map latest = appVersionV1ServiceDao.queryLatestVersion(params); + + JSONObject result = new JSONObject(); + result.put("hasUpdate", false); + + if (latest != null) { + Object versionCodeObj = latest.get("version_code"); + int latestCode = 0; + if (versionCodeObj instanceof Number) { + latestCode = ((Number) versionCodeObj).intValue(); + } else if (versionCodeObj != null) { + latestCode = Integer.parseInt(versionCodeObj.toString()); + } + + if (latestCode > currentCode) { + result.put("hasUpdate", true); + result.put("versionCode", latestCode); + result.put("versionName", latest.get("version_name") != null ? latest.get("version_name").toString() : ""); + String ossUrl = latest.get("download_url") != null ? latest.get("download_url").toString() : ""; + result.put("downloadUrl", convertToProxyUrl(ossUrl, context)); + result.put("forceUpdate", latest.get("force_update") != null && (Integer.parseInt(latest.get("force_update").toString()) == 1)); + result.put("updateMessage", latest.get("update_message") != null ? latest.get("update_message").toString() : ""); + } + } + + context.setResponseEntity(ResultVo.createResponseEntity(result)); + } + + private String convertToProxyUrl(String ossUrl, ICmdDataFlowContext context) { + if (ossUrl == null || !ossUrl.contains(".oss-")) return ossUrl; + try { + java.net.URL url = new java.net.URL(ossUrl); + String path = url.getPath(); + if (path.startsWith("/")) path = path.substring(1); + String host = context.getReqHeaders().get("host"); + String scheme = host != null && host.contains("localhost") ? "http" : "https"; + return scheme + "://" + host + "/app/downloadApk?file=" + path; + } catch (Exception e) { + return ossUrl; + } + } +} diff --git a/service-user/src/main/java/com/java110/user/cmd/property/DeleteAppVersionCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/DeleteAppVersionCmd.java new file mode 100644 index 0000000..2e15b92 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/cmd/property/DeleteAppVersionCmd.java @@ -0,0 +1,41 @@ +package com.java110.user.cmd.property; + +import com.alibaba.fastjson.JSONObject; +import com.java110.core.annotation.Java110Cmd; +import com.java110.core.annotation.Java110Transactional; +import com.java110.core.context.ICmdDataFlowContext; +import com.java110.core.event.cmd.Cmd; +import com.java110.core.event.cmd.CmdEvent; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import com.java110.utils.exception.CmdException; +import com.java110.utils.util.Assert; +import com.java110.vo.ResultVo; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; + +@Java110Cmd(serviceCode = "appVersion.deleteAppVersion") +public class DeleteAppVersionCmd extends Cmd { + + @Autowired + private IAppVersionV1ServiceDao appVersionV1ServiceDao; + + @Override + public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + Assert.hasKeyAndValue(reqJson, "avId", "未包含版本ID"); + } + + @Override + @Java110Transactional + public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { + Map params = new HashMap<>(); + params.put("avId", reqJson.getString("avId")); + + int flag = appVersionV1ServiceDao.deleteAppVersion(params); + if (flag < 1) { + throw new CmdException("删除版本信息失败"); + } + context.setResponseEntity(ResultVo.success()); + } +} diff --git a/service-user/src/main/java/com/java110/user/cmd/property/ListAppVersionsCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/ListAppVersionsCmd.java new file mode 100644 index 0000000..99ec6a3 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/cmd/property/ListAppVersionsCmd.java @@ -0,0 +1,47 @@ +package com.java110.user.cmd.property; + +import com.alibaba.fastjson.JSONObject; +import com.java110.core.annotation.Java110Cmd; +import com.java110.core.context.ICmdDataFlowContext; +import com.java110.core.event.cmd.Cmd; +import com.java110.core.event.cmd.CmdEvent; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import com.java110.vo.ResultVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Java110Cmd(serviceCode = "appVersion.listAppVersions") +public class ListAppVersionsCmd extends Cmd { + + @Autowired + private IAppVersionV1ServiceDao appVersionV1ServiceDao; + + @Override + public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + super.validatePageInfo(reqJson); + } + + @Override + public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + Map params = new HashMap<>(); + if (reqJson.containsKey("platform")) params.put("platform", reqJson.getString("platform")); + + int count = appVersionV1ServiceDao.queryAppVersionsCount(params); + List list = null; + if (count > 0) { + int page = reqJson.getIntValue("page"); + int row = reqJson.getIntValue("row"); + params.put("page", (page - 1) * row); + params.put("row", row); + list = appVersionV1ServiceDao.queryAppVersions(params); + } + + ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reqJson.getInteger("row")), count, list); + context.setResponseEntity(new ResponseEntity<>(resultVo.toString(), HttpStatus.OK)); + } +} diff --git a/service-user/src/main/java/com/java110/user/cmd/property/SaveAppVersionCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/SaveAppVersionCmd.java new file mode 100644 index 0000000..b660d09 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/cmd/property/SaveAppVersionCmd.java @@ -0,0 +1,51 @@ +package com.java110.user.cmd.property; + +import com.alibaba.fastjson.JSONObject; +import com.java110.core.annotation.Java110Cmd; +import com.java110.core.annotation.Java110Transactional; +import com.java110.core.context.ICmdDataFlowContext; +import com.java110.core.event.cmd.Cmd; +import com.java110.core.event.cmd.CmdEvent; +import com.java110.core.factory.GenerateCodeFactory; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import com.java110.utils.exception.CmdException; +import com.java110.utils.util.Assert; +import com.java110.vo.ResultVo; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; + +@Java110Cmd(serviceCode = "appVersion.saveAppVersion") +public class SaveAppVersionCmd extends Cmd { + + @Autowired + private IAppVersionV1ServiceDao appVersionV1ServiceDao; + + @Override + public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + Assert.hasKeyAndValue(reqJson, "versionCode", "未包含版本号"); + Assert.hasKeyAndValue(reqJson, "versionName", "未包含版本名称"); + Assert.hasKeyAndValue(reqJson, "downloadUrl", "未包含下载地址"); + Assert.hasKeyAndValue(reqJson, "platform", "未包含平台"); + } + + @Override + @Java110Transactional + public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { + Map params = new HashMap<>(); + params.put("avId", GenerateCodeFactory.getGeneratorId("AV")); + params.put("versionCode", reqJson.getIntValue("versionCode")); + params.put("versionName", reqJson.getString("versionName")); + params.put("downloadUrl", reqJson.getString("downloadUrl")); + params.put("forceUpdate", reqJson.getIntValue("forceUpdate")); + params.put("updateMessage", reqJson.getString("updateMessage")); + params.put("platform", reqJson.getString("platform")); + + int flag = appVersionV1ServiceDao.saveAppVersion(params); + if (flag < 1) { + throw new CmdException("保存版本信息失败"); + } + context.setResponseEntity(ResultVo.success()); + } +} diff --git a/service-user/src/main/java/com/java110/user/cmd/property/UpdateAppVersionCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/UpdateAppVersionCmd.java new file mode 100644 index 0000000..187ca98 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/cmd/property/UpdateAppVersionCmd.java @@ -0,0 +1,47 @@ +package com.java110.user.cmd.property; + +import com.alibaba.fastjson.JSONObject; +import com.java110.core.annotation.Java110Cmd; +import com.java110.core.annotation.Java110Transactional; +import com.java110.core.context.ICmdDataFlowContext; +import com.java110.core.event.cmd.Cmd; +import com.java110.core.event.cmd.CmdEvent; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import com.java110.utils.exception.CmdException; +import com.java110.utils.util.Assert; +import com.java110.vo.ResultVo; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.Map; + +@Java110Cmd(serviceCode = "appVersion.updateAppVersion") +public class UpdateAppVersionCmd extends Cmd { + + @Autowired + private IAppVersionV1ServiceDao appVersionV1ServiceDao; + + @Override + public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) { + Assert.hasKeyAndValue(reqJson, "avId", "未包含版本ID"); + Assert.hasKeyAndValue(reqJson, "versionName", "未包含版本名称"); + } + + @Override + @Java110Transactional + public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { + Map params = new HashMap<>(); + params.put("avId", reqJson.getString("avId")); + if (reqJson.containsKey("versionCode")) params.put("versionCode", reqJson.getIntValue("versionCode")); + params.put("versionName", reqJson.getString("versionName")); + if (reqJson.containsKey("downloadUrl")) params.put("downloadUrl", reqJson.getString("downloadUrl")); + if (reqJson.containsKey("forceUpdate")) params.put("forceUpdate", reqJson.getIntValue("forceUpdate")); + if (reqJson.containsKey("updateMessage")) params.put("updateMessage", reqJson.getString("updateMessage")); + + int flag = appVersionV1ServiceDao.updateAppVersion(params); + if (flag < 1) { + throw new CmdException("修改版本信息失败"); + } + context.setResponseEntity(ResultVo.success()); + } +} diff --git a/service-user/src/main/java/com/java110/user/dao/impl/AppVersionV1ServiceDaoImpl.java b/service-user/src/main/java/com/java110/user/dao/impl/AppVersionV1ServiceDaoImpl.java new file mode 100644 index 0000000..c00c554 --- /dev/null +++ b/service-user/src/main/java/com/java110/user/dao/impl/AppVersionV1ServiceDaoImpl.java @@ -0,0 +1,48 @@ +package com.java110.user.dao.impl; + +import com.java110.core.base.dao.BaseServiceDao; +import com.java110.user.dao.property.IAppVersionV1ServiceDao; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service("appVersionV1ServiceDaoImpl") +public class AppVersionV1ServiceDaoImpl extends BaseServiceDao implements IAppVersionV1ServiceDao { + + @Override + public Map queryLatestVersion(Map params) { + List list = sqlSessionTemplate.selectList("appVersionV1ServiceDaoImpl.queryLatestVersion", params); + return (list != null && !list.isEmpty()) ? list.get(0) : null; + } + + @Override + public List queryAppVersions(Map params) { + return sqlSessionTemplate.selectList("appVersionV1ServiceDaoImpl.queryAppVersions", params); + } + + @Override + public int queryAppVersionsCount(Map params) { + List list = sqlSessionTemplate.selectList("appVersionV1ServiceDaoImpl.queryAppVersionsCount", params); + if (list != null && !list.isEmpty()) { + Object count = list.get(0).get("count"); + return count instanceof Number ? ((Number) count).intValue() : Integer.parseInt(count.toString()); + } + return 0; + } + + @Override + public int saveAppVersion(Map params) { + return sqlSessionTemplate.insert("appVersionV1ServiceDaoImpl.saveAppVersion", params); + } + + @Override + public int updateAppVersion(Map params) { + return sqlSessionTemplate.update("appVersionV1ServiceDaoImpl.updateAppVersion", params); + } + + @Override + public int deleteAppVersion(Map params) { + return sqlSessionTemplate.update("appVersionV1ServiceDaoImpl.deleteAppVersion", params); + } +} diff --git a/service-user/src/main/java/com/java110/user/dao/property/IAppVersionV1ServiceDao.java b/service-user/src/main/java/com/java110/user/dao/property/IAppVersionV1ServiceDao.java new file mode 100644 index 0000000..508a21a --- /dev/null +++ b/service-user/src/main/java/com/java110/user/dao/property/IAppVersionV1ServiceDao.java @@ -0,0 +1,13 @@ +package com.java110.user.dao.property; + +import java.util.List; +import java.util.Map; + +public interface IAppVersionV1ServiceDao { + Map queryLatestVersion(Map params); + List queryAppVersions(Map params); + int queryAppVersionsCount(Map params); + int saveAppVersion(Map params); + int updateAppVersion(Map params); + int deleteAppVersion(Map params); +} diff --git a/service-user/src/main/resources/mapper/property/AppVersionMapper.xml b/service-user/src/main/resources/mapper/property/AppVersionMapper.xml new file mode 100644 index 0000000..bb418d8 --- /dev/null +++ b/service-user/src/main/resources/mapper/property/AppVersionMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + INSERT INTO app_version (av_id, version_code, version_name, download_url, force_update, update_message, platform, status_cd) + VALUES (#{avId}, #{versionCode}, #{versionName}, #{downloadUrl}, #{forceUpdate}, #{updateMessage}, #{platform}, '0') + + + + UPDATE app_version SET + version_code = #{versionCode}, + version_name = #{versionName}, + download_url = #{downloadUrl}, + force_update = #{forceUpdate}, + update_message = #{updateMessage}, + version_name = #{versionName} + WHERE av_id = #{avId} + + + + UPDATE app_version SET status_cd = '1' WHERE av_id = #{avId} + + + -- libgit2 0.21.4