From 4b21638981b5437bd1889384d45bdfda7ccf4662 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sat, 4 Jan 2020 14:41:51 +0800 Subject: [PATCH 1/5] =?UTF-8?q?[=E9=80=80=E5=8D=A1][=E6=96=B0=E5=A2=9E]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/market/MarketDoController.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/controller/market/MarketDoController.java diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/market/MarketDoController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/market/MarketDoController.java new file mode 100644 index 000000000..d632fb296 --- /dev/null +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/market/MarketDoController.java @@ -0,0 +1,95 @@ +package com.iformall.controller.market; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.SystemControllerLog; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.*; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.enums.*; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.*; +import com.iformall.service.*; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 数据初始化 + */ +@Slf4j +@RestController +@RequestMapping("markdo") +public class MarketDoController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxRefundOrderService wxRefundOrderService; + + @Autowired + private WxAppinfoService wxAppinfoService; + + @ApiOperation(value = "退券退款", notes = "{\"couponOrderId\":\"string\"}") + @PostMapping("/refund") + @SystemControllerLog(description = "券包-退券退款") + public ResultData create(@RequestBody Map paramMap) { + logger.debug("[" + getIpAddr() + "] WxCouponOrderController::create"); + //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); + //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); + logger.info(paramMap.toString()); + String tenantId = paramMap.get("tenantId"); + String couponOrderIdStr = paramMap.get("couponOrderId"); + if (StringUtils.isBlank(tenantId)) { + logger.error("tenantId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if (StringUtils.isBlank(couponOrderIdStr)) { + logger.error("couponOrderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + Long couponOrderId = 0L; + try { + couponOrderId = Long.valueOf(couponOrderIdStr); + } catch (NumberFormatException e) { + logger.error("couponOrderId参数不正确: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + + TenantEntity tenantEntity = new TenantEntity() {{ + setTenantId(tenantId); + }}; + + WxAppinfo appinfoQ = new WxAppinfo(); + appinfoQ.updateTenantInfo(tenantEntity); + appinfoQ.setType(EnumAppType.B.getCode()); + PageInfo appinfoPageInfo = wxAppinfoService.listAsPage(appinfoQ, 1, 1); + if (appinfoPageInfo.getList().size() > 0) { + WxAppinfo appinfo = appinfoPageInfo.getList().get(0); + if (appinfo != null) { + try { + wxRefundOrderService.createRefundOrder(appinfo, couponOrderId, EnumPayType.PAY_ADMIN_REFUND, null); + return new ResultData(); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.REFUND_ORDER_ERROR); + } + } + } + return new ResultData(ErrorCode.REFUND_ORDER_ERROR.getCode(), "AppInfo获取失败"); + } +} From 04ae1c8bc7d73e367d3ef28e85db055b2d794103 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sat, 4 Jan 2020 15:09:58 +0800 Subject: [PATCH 2/5] =?UTF-8?q?[=E9=80=80=E5=8D=A1][=E6=96=B0=E5=A2=9E]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/WxRefundOrderServiceImpl.java | 16 +++++ .../java/com/iformall/config/ShiroConfig.java | 9 ++- .../java/com/iformall/config/WebConfig.java | 8 ++- .../com/iformall/config/WechatMpConfig.java | 32 ++++++++++ .../iformall/config/WechatWebProperties.java | 59 +++++++++++++++++++ .../controller/sys/HomeController.java | 17 ++++++ .../controller/sys/WechatLoginController.java | 22 ++++++- .../shiro/MyRetryLimitCredentialsMatcher.java | 18 ------ .../com/iformall/ueditor/ActionEnter.java | 2 +- .../com/iformall/ueditor/ConfigManager.java | 17 +++++- .../com/iformall/ueditor/upload/Uploader.java | 36 +++++++++-- .../java/com/iformall/utils/UrlCheck.java | 1 + 12 files changed, 202 insertions(+), 35 deletions(-) create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/config/WechatMpConfig.java create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/config/WechatWebProperties.java diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java index b5f34710d..e6b8e0a7d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRefundOrderServiceImpl.java @@ -76,6 +76,9 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { @Autowired WxCUserMapper wxCUserMapper; + @Autowired + WxCardInfoMapper cardInfoMapper; + JSONObject errorRefundReqMap = JSON.parseObject("{\n" + " \"SYSTEMERROR\": {\n" + @@ -361,6 +364,19 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); } + // 卡退款,把卡余额设为0 + if (wxCouponOrder.getCouponType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { + WxCardInfo updateCardInfo = new WxCardInfo(); + updateCardInfo.setId(couponOrderId); + updateCardInfo.setRemainingAmount(0); + try { + cardInfoMapper.updateById(updateCardInfo); + } catch (Exception e) { + logger.error("db failed: wxCardInfo-" + couponOrderId + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + } + } + // 查找支付订单 WxPayOrder payOrderQ = new WxPayOrder(); payOrderQ.updateTenantInfo(wxCouponOrder); diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkSysAdmin/src/main/java/com/iformall/config/ShiroConfig.java index 112d749b2..5252e3a6e 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/config/ShiroConfig.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/config/ShiroConfig.java @@ -167,10 +167,10 @@ public class ShiroConfig { } @Bean - public SecurityManager securityManager(@Qualifier("myRetryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) { + public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //设置realm. - securityManager.setRealm(myShiroRealm(matcher)); + securityManager.setRealm(myShiroRealm()); // 自定义缓存实现 使用redis //securityManager.setCacheManager(cacheManager()); // 自定义session管理 使用redis @@ -179,9 +179,9 @@ public class ShiroConfig { } @Bean - public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) { + public MyShiroRealm myShiroRealm() { MyShiroRealm myShiroRealm = new MyShiroRealm(); - myShiroRealm.setCredentialsMatcher(matcher); + myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher()); return myShiroRealm; } @@ -194,7 +194,6 @@ public class ShiroConfig { * * @return */ - @Bean(name = "myRetryLimitCredentialsMatcher") public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() { MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher(); diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/WebConfig.java b/mallinkSysAdmin/src/main/java/com/iformall/config/WebConfig.java index d08ea21f5..0c0299e73 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/config/WebConfig.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/config/WebConfig.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.iformall.interceptor.HttpServletRequestWrapperFilter; import com.iformall.interceptor.RequestInterceptor; +import com.iformall.service.MallResourceService; import com.iformall.ueditor.ActionEnter; import com.iformall.ueditor.ConfigManager; import com.iformall.ueditor.UEditorConfig; @@ -44,10 +45,13 @@ public class WebConfig implements WebMvcConfigurer { @Autowired private RequestInterceptor requestInterceptor; + @Autowired + private MallResourceService mallResourceService; + @Bean @ConditionalOnMissingBean(ActionEnter.class) public ActionEnter actionEnter() { - ActionEnter actionEnter = new ActionEnter(ConfigManager.getInstance(uEditorConfig, awsProperty)); + ActionEnter actionEnter = new ActionEnter(ConfigManager.getInstance(uEditorConfig, awsProperty, mallResourceService)); return actionEnter; } @@ -72,7 +76,7 @@ public class WebConfig implements WebMvcConfigurer { * * @return */ - @Bean + @Bean("myCharacterEncodingFilter") public Filter characterEncodingFilter() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/WechatMpConfig.java b/mallinkSysAdmin/src/main/java/com/iformall/config/WechatMpConfig.java new file mode 100644 index 000000000..4433386c9 --- /dev/null +++ b/mallinkSysAdmin/src/main/java/com/iformall/config/WechatMpConfig.java @@ -0,0 +1,32 @@ +package com.iformall.config; + +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.config.WxMpConfigStorage; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +public class WechatMpConfig { + + @Autowired + private WechatWebProperties wechatWebProperties; + + @Bean + public WxMpService wxMpService() { + //创建WxMpService实例并设置appid和sectret + WxMpService wxMpService = new WxMpServiceImpl(); + //这里的设置方式是跟着这个sdk的文档写的 + wxMpService.setWxMpConfigStorage(wxConfigProvider()); + return wxMpService; + } + + public WxMpConfigStorage wxConfigProvider(){ + WxMpDefaultConfigImpl wxConfigProvider = new WxMpDefaultConfigImpl(); + wxConfigProvider.setAppId(wechatWebProperties.getAppId()); + wxConfigProvider.setSecret(wechatWebProperties.getSecret()); + return wxConfigProvider; + } +} diff --git a/mallinkSysAdmin/src/main/java/com/iformall/config/WechatWebProperties.java b/mallinkSysAdmin/src/main/java/com/iformall/config/WechatWebProperties.java new file mode 100644 index 000000000..0b9047399 --- /dev/null +++ b/mallinkSysAdmin/src/main/java/com/iformall/config/WechatWebProperties.java @@ -0,0 +1,59 @@ +package com.iformall.config; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Stormeye + */ +@Component +@ConfigurationProperties(prefix = "wechat.web") +public class WechatWebProperties { + /** + * 设置微信第三方平台-微信登录的web应用appid + */ + private String appId; + + /** + * 设置微信第三方平台-微信登录的web应用app secret + */ + private String secret; + + /** + * 网页URL + * @return + */ + private String url; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, + ToStringStyle.MULTI_LINE_STYLE); + } +} diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/HomeController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/HomeController.java index 4acaa91f5..259cde4b6 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/HomeController.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/HomeController.java @@ -132,6 +132,7 @@ public class HomeController extends BaseController { UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); subject.login(token); isLogin = true; + logger.info("ADMIN USER:"+user.getUsername() + ", password:" + user.getPassword()); } catch (UnknownAccountException e) { logger.error(e.getMessage()); return new ResultData(ErrorCode.USER_IS_EMPTY); @@ -221,6 +222,14 @@ public class HomeController extends BaseController { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } } + if (user == null) { + logger.error(ErrorCode.USER_IS_EMPTY.getMessage()); + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + if (user.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) { + logger.error(ErrorCode.USER_IS_LOCKED.getMessage()); + return new ResultData(ErrorCode.USER_IS_LOCKED); + } boolean isLogin = false; try { @@ -327,6 +336,14 @@ public class HomeController extends BaseController { List userList = mallUserInfoService.getUserByPhone(phone); if(userList.size() == 1) { MallUserInfoVo user = userList.get(0); + if (user == null) { + logger.error(ErrorCode.USER_IS_EMPTY.getMessage()); + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + if (user.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) { + logger.error(ErrorCode.USER_IS_LOCKED.getMessage()); + return new ResultData(ErrorCode.USER_IS_LOCKED); + } // check 验证码正确 boolean isValidCode = false; try { diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java index 6ab138a15..d268b79a4 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/sys/WechatLoginController.java @@ -1,6 +1,7 @@ package com.iformall.controller.sys; import com.alibaba.fastjson.JSON; +import com.iformall.annotation.SystemControllerLog; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; @@ -9,6 +10,7 @@ import com.iformall.domain.po.MallUserAction; import com.iformall.domain.po.MallUserInfo; import com.iformall.domain.vo.MallUserInfoVo; import com.iformall.enums.EnumMallUserAction; +import com.iformall.enums.EnumMallUserStatus; import com.iformall.enums.EnumUserAdmin; import com.iformall.service.MallUserActionService; import com.iformall.service.MallUserInfoService; @@ -122,6 +124,14 @@ public class WechatLoginController extends BaseController { Map ret = new HashMap<>(); // 唯一用户 MallUserInfo user = userList.get(0); + if (user == null) { + ret.put("code", ErrorCode.USER_IS_EMPTY.getCode()); + ret.put("message", ErrorCode.USER_IS_EMPTY.getMessage()); + } + if (user.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) { + ret.put("code", ErrorCode.USER_IS_LOCKED.getCode()); + ret.put("message", ErrorCode.USER_IS_LOCKED.getMessage()); + } boolean isLogin = false; try { Subject subject = SecurityUtils.getSubject(); @@ -156,7 +166,7 @@ public class WechatLoginController extends BaseController { response.addCookie(unameCookie); MallUserAction action = new MallUserAction(); - action.setTenantId(info.getTenantId()); + action.updateTenantInfo(info); action.setType(EnumMallUserAction.CONTROLLER.getCode()); action.setIp(ipaddress); action.setUserId(info.getId()); @@ -271,6 +281,12 @@ public class WechatLoginController extends BaseController { log.info("KEY: " + openKey + " deleted"); MallUserInfo userInfo = mallUserInfoService.getByUsername(userName); + if (userInfo == null) { + return new ResultData(ErrorCode.USER_IS_EMPTY); + } + if (userInfo.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(userInfo.getStatus())) { + return new ResultData(ErrorCode.USER_IS_LOCKED); + } if(userInfo.getWebOpenId().equals(openId)) { boolean isLogin = false; try { @@ -291,7 +307,7 @@ public class WechatLoginController extends BaseController { response.addCookie(unameCookie); MallUserAction action = new MallUserAction(); - action.setTenantId(info.getTenantId()); + action.updateTenantInfo(info); action.setType(EnumMallUserAction.CONTROLLER.getCode()); action.setIp(ipaddress); action.setUserId(info.getId()); @@ -322,6 +338,7 @@ public class WechatLoginController extends BaseController { @ApiOperation(value = "微信第三方登录绑定", notes = "请配置此callback到网页redirect_uri") @GetMapping("bindWebOpenId") + @SystemControllerLog(description = "微信第三方登录绑定") public void userBindWebOpenId(String code, String state, HttpServletRequest request, HttpServletResponse response) { log.debug("[" + getIpAddr() + "] WechatLoginController::bindWebOpenId"); String host = request.getHeader("host"); @@ -368,6 +385,7 @@ public class WechatLoginController extends BaseController { @ApiOperation(value = "微信第三方登录解绑", notes = "请配置此callback到网页redirect_uri") @GetMapping("cleanWebOpenId") + @SystemControllerLog(description = "微信第三方登录解绑") public ResultData cleanWebOpenId(@ModelAttribute MallUserInfo userInfo) { log.debug("[" + getIpAddr() + "] WechatLoginController::cleanWebOpenId"); MallUserInfo user = getUser(); diff --git a/mallinkSysAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java b/mallinkSysAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java index e71e52c61..f08030e1c 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java @@ -1,23 +1,13 @@ package com.iformall.shiro; -import com.iformall.common.ErrorCode; -import com.iformall.domain.po.MallUserInfo; import com.iformall.enums.EnumLoginType; -import com.iformall.enums.EnumMallUserStatus; -import com.iformall.service.MallUserInfoService; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.authc.DisabledAccountException; -import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.springframework.context.annotation.Configuration; -import javax.annotation.Resource; - @Configuration public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher { - @Resource - private MallUserInfoService userService; @Override public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) { @@ -26,14 +16,6 @@ public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher { if(tk.getType().equals(EnumLoginType.NOPASSWD)){ // 获取用户的输入的账号. String username = (String)tk.getPrincipal(); - MallUserInfo user = userService.getByUsername(username); - if(user == null) { - throw new UnknownAccountException(ErrorCode.USER_IS_EMPTY.getMessage()); - } - // 用户被禁用 - if(user.getStatus()==null ||!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) { - throw new DisabledAccountException(ErrorCode.USER_IS_LOCKED.getMessage()); - } return true; } boolean matches = super.doCredentialsMatch(authcToken, info); diff --git a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ActionEnter.java b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ActionEnter.java index be78d3668..a8ece41d2 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ActionEnter.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ActionEnter.java @@ -69,7 +69,7 @@ public class ActionEnter { case ActionMap.UPLOAD_VIDEO: case ActionMap.UPLOAD_FILE: conf = this.configManager.getConfig(actionCode); - state = new Uploader(request, conf).doExec(); + state = new Uploader(request, conf, configManager.getMallResourceService()).doExec(); break; case ActionMap.CATCH_IMAGE: diff --git a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ConfigManager.java b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ConfigManager.java index 036c95c77..4b0246ea3 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ConfigManager.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/ConfigManager.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.iformall.config.AwsProperty; +import com.iformall.service.MallResourceService; import com.iformall.ueditor.define.ActionMap; import java.io.*; @@ -28,13 +29,15 @@ public final class ConfigManager { //配置信息 private UEditorConfig uEditorConfig; private AwsProperty awsProperty; + private MallResourceService mallResourceService; /* * 通过一个给定的路径构建一个配置管理器, 该管理器要求地址路径所在目录下必须存在config.properties文件 */ - private ConfigManager(UEditorConfig uEditorConfig, AwsProperty awsProperty) throws IOException { + private ConfigManager(UEditorConfig uEditorConfig, AwsProperty awsProperty, MallResourceService mallResourceService) throws IOException { this.uEditorConfig = uEditorConfig; this.awsProperty = awsProperty; + this.mallResourceService = mallResourceService; String configPath = uEditorConfig.getConfig(); configPath = configPath == null || configPath.isEmpty() ? configFileName : configPath; this.initEnv(configPath); @@ -46,10 +49,10 @@ public final class ConfigManager { * @param uEditorConfig 配置文件 * @return 配置管理器实例或者null */ - public static ConfigManager getInstance(UEditorConfig uEditorConfig, AwsProperty awsProperty) { + public static ConfigManager getInstance(UEditorConfig uEditorConfig, AwsProperty awsProperty, MallResourceService mallResourceService) { try { - return new ConfigManager(uEditorConfig, awsProperty); + return new ConfigManager(uEditorConfig, awsProperty, mallResourceService); } catch (Exception e) { System.err.println("UEditor ConfigManager load error~"); return null; @@ -57,6 +60,14 @@ public final class ConfigManager { } + public MallResourceService getMallResourceService() { + return mallResourceService; + } + + public void setMallResourceService(MallResourceService mallResourceService) { + this.mallResourceService = mallResourceService; + } + // 验证配置文件加载是否正确 public boolean valid() { return this.jsonConfig != null; diff --git a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/upload/Uploader.java b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/upload/Uploader.java index 1e6e33caf..dcb6d548d 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/ueditor/upload/Uploader.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/ueditor/upload/Uploader.java @@ -12,10 +12,15 @@ import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; +import com.iformall.domain.po.MallResource; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.service.MallResourceService; import com.iformall.shiro.UserSession; import com.iformall.ueditor.define.BaseState; import com.iformall.ueditor.define.State; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; @@ -33,11 +38,18 @@ public class Uploader { private HttpServletRequest request = null; private Map conf = null; + private MallResourceService mallResourceService = null; private AmazonS3 s3 = null; - public Uploader(HttpServletRequest request, Map conf) { + private String getFileName(TenantEntity tenantEntity, String fileName) { + fileName = tenantEntity.getTenantId() + "/" + fileName; + return fileName; + } + + public Uploader(HttpServletRequest request, Map conf, MallResourceService mallResourceService) { this.request = request; this.conf = conf; + this.mallResourceService = mallResourceService; this.s3 = AmazonS3ClientBuilder.standard() .withRegion(conf.get("clientRegion").toString()) .withCredentials(new AWSCredentialsProvider() { @@ -63,14 +75,22 @@ public class Uploader { this.conf); } else { MultipartFile multiReq= ((MultipartHttpServletRequest) this.request).getFile("upfile"); - String tenantId = (String)SecurityUtils.getSubject().getSession().getAttribute(UserSession.tenantId); + Session session = SecurityUtils.getSubject().getSession(); + String tenantId = (String)session.getAttribute(UserSession.tenantId); + TenantEntity tenantEntity = new TenantEntity(){{ + setTenantId(tenantId); + }}; + if (StringUtils.isBlank(tenantId)) { + logger.error("TENANT is null"); + } String fileName = UUID.randomUUID().toString(); int dot = multiReq.getOriginalFilename().lastIndexOf('.'); if (dot >= 0) { - fileName = tenantId + "/" + fileName + multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); + String fileFormat = multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); + fileName = getFileName(tenantEntity, fileName + fileFormat); } else { - fileName = tenantId + "/" + fileName; + fileName = getFileName(tenantEntity, fileName); } state = state = new BaseState(true); @@ -89,7 +109,15 @@ public class Uploader { .withCannedAcl(CannedAccessControlList.PublicRead)); URL url = s3.getUrl(conf.get("bucketName").toString(), fileName); //logger.info(url.toString()); + state.putInfo("url", url.toString()); + + MallResource mr = new MallResource(); + mr.updateTenantInfo(tenantEntity); + mr.setBucket(conf.get("bucketName").toString()); + mr.setS3Key(fileName); + mr.setUrl(url.toString()); + mallResourceService.saveOrUpdate(mr); } catch (AmazonServiceException ase) { /* logger.warn("Caught an AmazonServiceException, which " + diff --git a/mallinkSysAdmin/src/main/java/com/iformall/utils/UrlCheck.java b/mallinkSysAdmin/src/main/java/com/iformall/utils/UrlCheck.java index 2a4dcf90a..0d53a0c2b 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/utils/UrlCheck.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/utils/UrlCheck.java @@ -7,6 +7,7 @@ public class UrlCheck { public static boolean checkUrl(String url) { return url.contains("awsFileUpload") + || url.contains("awsImgUpload") || url.contains("awsFilesUpload") || url.contains("downQrCode") || url.contains("cimgUpload") From 991c87271d8862ab35734c81993110aa31b59095 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Fri, 10 Jan 2020 21:50:09 +0800 Subject: [PATCH 3/5] =?UTF-8?q?[=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81][?= =?UTF-8?q?=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/iformall/utils/RedisLock.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java index d9bdeb9d2..e8e8b99af 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java @@ -4,9 +4,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import java.util.concurrent.TimeUnit; + /** * RedisLock * User: Stormeye @@ -29,17 +32,19 @@ public class RedisLock { * @return */ public boolean lock(String key,String value){ - if(stringRedisTemplate.opsForValue().setIfAbsent(key,value)){//对应setnx命令 + ValueOperations operations = stringRedisTemplate.opsForValue(); + if(operations.setIfAbsent(key,value)){//对应setnx命令 + operations.set(key, value, 1, TimeUnit.SECONDS); //可以成功设置,也就是key不存在 return true; } //判断锁超时 - 防止原来的操作异常,没有运行解锁操作 防止死锁 - String currentValue = stringRedisTemplate.opsForValue().get(key); + String currentValue = operations.get(key); //如果锁过期 if(!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()){//currentValue不为空且小于当前时间 //获取上一个锁的时间value - String oldValue =stringRedisTemplate.opsForValue().getAndSet(key,value);//对应getset,如果key存在 + String oldValue =operations.getAndSet(key,value);//对应getset,如果key存在 //假设两个线程同时进来,key被占用了。获取的值currentValue=A(get取的旧的值肯定是一样的),两个线程的value都是B,key都是K.锁时间已经过期了。 //而这里面的getAndSet一次只会一个执行,也就是一个执行之后,上一个的value已经变成了B。只有一个线程获取的上一个值会是A,另一个线程拿到的值是B。 From c719171e30c8ce08dc809c9a9c8eed070123fb0c Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Fri, 10 Jan 2020 21:51:35 +0800 Subject: [PATCH 4/5] =?UTF-8?q?[=E5=BA=93=E5=AD=98][=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/service/impl/WxOrderServiceImpl.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 5acd05fa3..e7d4bfe2a 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -487,13 +487,7 @@ public class WxOrderServiceImpl implements WxOrderService { try { // 减库存 - int num = wxCouponMapper.reduceInventory(coupon.getId(), 1, coupon.getRemainInventory()); - if (num == 0) { - // 解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券减库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } + wxCouponMapper.reduceInventory(coupon.getId(), 1, coupon.getRemainInventory()); } catch (RuntimeException e) { // 解锁 redisLock.unlock(couponIdStr, timeStr); From 86e016f398de6cf1fca3d64225fad0dc12d73b23 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Fri, 10 Jan 2020 22:43:59 +0800 Subject: [PATCH 5/5] =?UTF-8?q?[=E5=BA=93=E5=AD=98][=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/service/impl/WxOrderServiceImpl.java | 13 ++++++++----- .../src/main/java/com/iformall/utils/RedisLock.java | 1 - 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index e7d4bfe2a..0dbee96e3 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -487,12 +487,17 @@ public class WxOrderServiceImpl implements WxOrderService { try { // 减库存 - wxCouponMapper.reduceInventory(coupon.getId(), 1, coupon.getRemainInventory()); + int num = wxCouponMapper.reduceInventory(coupon.getId(), 1, coupon.getRemainInventory()); + if (num <= 0) { + logger.error("此券减库存失败, couponId: " + couponIdStr); + throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } } catch (RuntimeException e) { - // 解锁 - redisLock.unlock(couponIdStr, timeStr); logger.error("此券减库存失败, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); + } finally { + // 解锁 + redisLock.unlock(couponIdStr, timeStr); } } @@ -527,8 +532,6 @@ public class WxOrderServiceImpl implements WxOrderService { try { int num = wxCouponMapper.backInventory(coupon.getId(), 1, coupon.getRemainInventory()); if (num <= 0) { - // 解锁 - redisLock.unlock(couponIdStr, timeStr); logger.error("此券加库存失败, couponId: " + couponIdStr); throw new MallinkException(ErrorCode.ORDER_IS_FAIL); } diff --git a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java index e8e8b99af..67e2f388b 100644 --- a/mallinkService/src/main/java/com/iformall/utils/RedisLock.java +++ b/mallinkService/src/main/java/com/iformall/utils/RedisLock.java @@ -34,7 +34,6 @@ public class RedisLock { public boolean lock(String key,String value){ ValueOperations operations = stringRedisTemplate.opsForValue(); if(operations.setIfAbsent(key,value)){//对应setnx命令 - operations.set(key, value, 1, TimeUnit.SECONDS); //可以成功设置,也就是key不存在 return true; }