diff --git a/yshop-admin/src/main/resources/config/application-prod.yml b/yshop-admin/src/main/resources/config/application-prod.yml index 85bbe2a..a818452 100644 --- a/yshop-admin/src/main/resources/config/application-prod.yml +++ b/yshop-admin/src/main/resources/config/application-prod.yml @@ -6,7 +6,7 @@ spring: druid: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://42.194.212.185:3308/yinyao?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://localhost:3308/yinyao?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull username: yinyao password: NGdtmCHnWnLHBPME diff --git a/yshop-app/src/main/java/co/yixiang/modules/shop/rest/IndexController.java b/yshop-app/src/main/java/co/yixiang/modules/shop/rest/IndexController.java index 1f6aafa..5ca7f31 100644 --- a/yshop-app/src/main/java/co/yixiang/modules/shop/rest/IndexController.java +++ b/yshop-app/src/main/java/co/yixiang/modules/shop/rest/IndexController.java @@ -99,7 +99,10 @@ public class IndexController { // Set bestSubjectCategoryList = subjectCategoryService.lambdaQuery().eq(YxStoreSubjectCategory::getType, "音乐学院").list().stream().map(YxStoreSubjectCategory::getId).collect(Collectors.toSet()); Set freeSubjectCategoryList = subjectCategoryService.lambdaQuery().ne(YxStoreSubjectCategory::getType, "音乐学院").list().stream().map(YxStoreSubjectCategory::getId).collect(Collectors.toSet()); - + List freeSubjectList = subjectService.lambdaQuery().in(YxStoreSubject::getCategoryId, freeSubjectCategoryList).orderByDesc(YxStoreSubject::getCreateTime).last("limit 50").list(); + List paySubjectList = subjectService.lambdaQuery().in(YxStoreSubject::getCategoryId, bestSubjectCategoryList).orderByDesc(YxStoreSubject::getCreateTime).last("limit 50").list(); + subjectService.setSubjectViews(freeSubjectList); + subjectService.setSubjectViews(paySubjectList); IndexVo indexVo = IndexVo.builder() .banner(systemGroupDataService.getDatas(ShopConstants.YSHOP_HOME_BANNER)) @@ -113,8 +116,8 @@ public class IndexController { .roll(systemGroupDataService.getDatas(ShopConstants.YSHOP_HOME_ROLL_NEWS)) .seckillList(storeSeckillService.getList(1, 4)) .seckillVolumeList(subjectVolumeService.lambdaQuery().eq(YxStoreSubjectVolume::getIsSpike, 1).eq(YxStoreSubjectVolume::getIsShow, 1).list()) - .freeSubjectList(subjectService.lambdaQuery().in(YxStoreSubject::getCategoryId, freeSubjectCategoryList).orderByDesc(YxStoreSubject::getCreateTime).last("limit 50").list()) - .paySubjectList(subjectService.lambdaQuery().in(YxStoreSubject::getCategoryId, bestSubjectCategoryList).orderByDesc(YxStoreSubject::getCreateTime).last("limit 50").list()) + .freeSubjectList(freeSubjectList) + .paySubjectList(paySubjectList) .liveList(wechatLiveService.getList(1,4,0)) .build(); diff --git a/yshop-app/src/main/java/co/yixiang/modules/subject/rest/AppSubjectNodeController.java b/yshop-app/src/main/java/co/yixiang/modules/subject/rest/AppSubjectNodeController.java index 77b1524..cdc162b 100644 --- a/yshop-app/src/main/java/co/yixiang/modules/subject/rest/AppSubjectNodeController.java +++ b/yshop-app/src/main/java/co/yixiang/modules/subject/rest/AppSubjectNodeController.java @@ -4,10 +4,14 @@ import cn.hutool.core.util.NumberUtil; import co.yixiang.api.ApiResult; import co.yixiang.common.bean.LocalUser; import co.yixiang.domain.BaseDomain; +import co.yixiang.modules.logging.aop.log.Log; +import co.yixiang.modules.shop.domain.YxMaterial; +import co.yixiang.modules.shop.service.YxMaterialService; import co.yixiang.modules.subject.domain.YxStoreSubjectNode; import co.yixiang.modules.subject.domain.YxStoreSubjectNodeViews; import co.yixiang.modules.subject.service.YxStoreSubjectNodeService; import co.yixiang.modules.subject.service.YxStoreSubjectNodeViewsService; +import co.yixiang.modules.tools.domain.dto.QiniuTaskDTO; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,6 +34,8 @@ public class AppSubjectNodeController { private final YxStoreSubjectNodeService nodeService; private final YxStoreSubjectNodeViewsService nodeViewsService; + private final YxMaterialService materialService; + @ApiOperation(value = "查询商品分类") @GetMapping("/type/list") @@ -94,4 +100,49 @@ public class AppSubjectNodeController { return ApiResult.ok(list); } + @ApiOperation("任务回调") + @PostMapping("/notify/qiniu") + public ApiResult taskNotify(@RequestBody QiniuTaskDTO dto) { + if(dto.getCode() != 0) { + return ApiResult.ok(); + } + String key = dto.getInput().getKodo_file().getKey(); + List nodeList = nodeService.lambdaQuery().like(YxStoreSubjectNode::getVideoUrl, key).list(); + + if(CollectionUtils.isNotEmpty(nodeList)) { + YxStoreSubjectNode yxStoreSubjectNode = nodeList.get(0); + String videoUrl = yxStoreSubjectNode.getVideoUrl(); + yxStoreSubjectNode.setVideoUrl(rename(videoUrl, "_transcode.mp4")); + yxStoreSubjectNode.setPoster(rename(videoUrl, "_poster.jpg")); + + nodeService.updateById(yxStoreSubjectNode); + } + + List materialList = materialService.lambdaQuery().like(YxMaterial::getUrl, key).eq(YxMaterial::getType, "video").list(); + if(CollectionUtils.isNotEmpty(materialList)) { + YxMaterial yxMaterial = materialList.get(0); + String url = yxMaterial.getUrl(); + + yxMaterial.setUrl(rename(url, "_transcode.mp4")); + yxMaterial.setThumb(rename(url, "_poster.jpg")); + + materialService.updateById(yxMaterial); + } + return ApiResult.ok("我知道了"); + } + + + String rename(String str, String ext) { + int dotIndex = str.lastIndexOf('.'); + if (dotIndex != -1) { + String modifiedString = str.substring(0, dotIndex) + ext; + return modifiedString; + + }else { + String modifiedString = str + ext; + return modifiedString; + + } + } + } diff --git a/yshop-app/src/main/resources/config/application-prod.yml b/yshop-app/src/main/resources/config/application-prod.yml index 2ada2cd..1cc5178 100644 --- a/yshop-app/src/main/resources/config/application-prod.yml +++ b/yshop-app/src/main/resources/config/application-prod.yml @@ -5,7 +5,7 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://42.194.212.185:3308/yinyao?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull + url: jdbc:mysql://localhost:3308/yinyao?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull username: yinyao password: NGdtmCHnWnLHBPME # 从库数据源 diff --git a/yshop-mall/src/main/java/co/yixiang/modules/product/service/impl/YxStoreProductServiceImpl.java b/yshop-mall/src/main/java/co/yixiang/modules/product/service/impl/YxStoreProductServiceImpl.java index fcaed68..74f1db4 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/product/service/impl/YxStoreProductServiceImpl.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/product/service/impl/YxStoreProductServiceImpl.java @@ -556,8 +556,13 @@ public class YxStoreProductServiceImpl extends BaseServiceImpl create(@Validated @RequestBody YxStoreSubject resources){ return new ResponseEntity<>(yxStoreSubjectService.saveRel(resources),HttpStatus.CREATED); } @@ -93,6 +97,7 @@ public class YxStoreSubjectController { @Log("修改课程") @ApiOperation("修改课程") @PreAuthorize("@el.check('admin','yxStoreSubject:edit')") + @CacheEvict(cacheNames = ShopConstants.YSHOP_REDIS_INDEX_KEY,allEntries = true) public ResponseEntity update(@Validated @RequestBody YxStoreSubject resources){ yxStoreSubjectService.updateById(resources); return new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectNodeController.java b/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectNodeController.java index fc2c3bc..4a07731 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectNodeController.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectNodeController.java @@ -11,6 +11,9 @@ import java.util.Arrays; import co.yixiang.dozer.service.IGenerator; import co.yixiang.modules.shop.domain.YxMaterial; import co.yixiang.modules.shop.service.YxMaterialService; +import co.yixiang.modules.tools.domain.dto.QiniuTaskDTO; +import co.yixiang.modules.tools.domain.dto.QiniuTaskOp; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import co.yixiang.modules.logging.aop.log.Log; @@ -102,4 +105,7 @@ public class YxStoreSubjectNodeController { }); return new ResponseEntity<>(HttpStatus.OK); } + + + } diff --git a/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectVolumeController.java b/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectVolumeController.java index 5f8cd84..28482cf 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectVolumeController.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/subject/rest/YxStoreSubjectVolumeController.java @@ -8,6 +8,8 @@ */ package co.yixiang.modules.subject.rest; import java.util.Arrays; + +import co.yixiang.constant.ShopConstants; import co.yixiang.dozer.service.IGenerator; import co.yixiang.exception.BadRequestException; import lombok.AllArgsConstructor; @@ -16,6 +18,7 @@ import co.yixiang.modules.subject.domain.YxStoreSubjectVolume; import co.yixiang.modules.subject.service.YxStoreSubjectVolumeService; import co.yixiang.modules.subject.service.dto.YxStoreSubjectVolumeQueryCriteria; import co.yixiang.modules.subject.service.dto.YxStoreSubjectVolumeDto; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -68,6 +71,7 @@ public class YxStoreSubjectVolumeController { @Log("新增subjectLevel") @ApiOperation("新增subjectLevel") @PreAuthorize("@el.check('admin','yxStoreSubjectVolume:add')") + @CacheEvict(cacheNames = ShopConstants.YSHOP_REDIS_INDEX_KEY,allEntries = true) public ResponseEntity create(@Validated @RequestBody YxStoreSubjectVolume resources){ return new ResponseEntity<>(yxStoreSubjectVolumeService.save(resources),HttpStatus.CREATED); } @@ -76,6 +80,7 @@ public class YxStoreSubjectVolumeController { @Log("修改subjectLevel") @ApiOperation("修改subjectLevel") @PreAuthorize("@el.check('admin','yxStoreSubjectVolume:edit')") + @CacheEvict(cacheNames = ShopConstants.YSHOP_REDIS_INDEX_KEY,allEntries = true) public ResponseEntity update(@Validated @RequestBody YxStoreSubjectVolume resources){ if(resources.getIsSpike() == 1) { if(resources.getSpikeStartTime() == null) { diff --git a/yshop-mall/src/main/java/co/yixiang/modules/subject/service/YxStoreSubjectService.java b/yshop-mall/src/main/java/co/yixiang/modules/subject/service/YxStoreSubjectService.java index 6cfafee..5692625 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/subject/service/YxStoreSubjectService.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/subject/service/YxStoreSubjectService.java @@ -49,4 +49,6 @@ public interface YxStoreSubjectService extends BaseService{ YxStoreSubject getByIdRel(Long id); boolean saveRel(YxStoreSubject entity); + + void setSubjectViews(List storeSubjects); } diff --git a/yshop-mall/src/main/java/co/yixiang/modules/subject/service/impl/YxStoreSubjectServiceImpl.java b/yshop-mall/src/main/java/co/yixiang/modules/subject/service/impl/YxStoreSubjectServiceImpl.java index b812ecf..e3dde44 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/subject/service/impl/YxStoreSubjectServiceImpl.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/subject/service/impl/YxStoreSubjectServiceImpl.java @@ -8,6 +8,7 @@ */ package co.yixiang.modules.subject.service.impl; +import co.yixiang.constant.ShopConstants; import co.yixiang.modules.product.domain.YxStoreProduct; import co.yixiang.modules.product.service.YxStoreProductService; import co.yixiang.modules.subject.domain.YxStoreSubject; @@ -28,6 +29,7 @@ import co.yixiang.common.utils.QueryHelpPlus; import co.yixiang.utils.FileUtil; import co.yixiang.modules.subject.service.YxStoreSubjectService; import co.yixiang.modules.subject.service.dto.YxStoreSubjectDto; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -83,6 +85,7 @@ public class YxStoreSubjectServiceImpl extends BaseServiceImpl storeSubjects) { + Set subjectIds = storeSubjects.stream().map(YxStoreSubject::getId).collect(Collectors.toSet()); + List list = volumeService.lambdaQuery().in(YxStoreSubjectVolume::getSubjectId, subjectIds).list(); + Map> collect = list.stream().collect(Collectors.groupingBy(YxStoreSubjectVolume::getSubjectId)); + + storeSubjects.forEach(item -> { + List volumeList = collect.get(item.getId()); + if(CollectionUtils.isNotEmpty(volumeList)) { + int sum = volumeList.stream().mapToInt(YxStoreSubjectVolume::getSales).sum(); + int fakeSum = volumeList.stream().mapToInt(YxStoreSubjectVolume::getFakeSales).sum(); + item.setSales(sum + fakeSum); + }else { + item.setSales(0); + } + }); + + } + @Override //@Cacheable public PageResult queryAll(YxStoreSubjectQueryCriteria criteria, Pageable pageable) { @@ -180,4 +202,7 @@ public class YxStoreSubjectServiceImpl extends BaseServiceImpl create(@Validated @RequestBody YxMaterial resources){ if("video".equals(resources.getType())) { - +// String url = resources.getUrl(); +// resources.setUrl(rename(url, "_transcode.mp4")); } resources.setCreateId(SecurityUtils.getUsername()); return new ResponseEntity<>(yxMaterialService.save(resources),HttpStatus.CREATED); } + String rename(String str, String ext) { + int dotIndex = str.lastIndexOf('.'); + if (dotIndex != -1) { + String modifiedString = str.substring(0, dotIndex) + ext; + return modifiedString; + + }else { + String modifiedString = str + ext; + return modifiedString; + + } + } + + @PutMapping @Log("修改素材管理") @ApiOperation("修改素材管理") diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskCond.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskCond.java new file mode 100644 index 0000000..8902655 --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskCond.java @@ -0,0 +1,6 @@ +package co.yixiang.modules.tools.domain.dto; + +public class QiniuTaskCond { + private String expression; + private QiniuTaskResult result; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskDTO.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskDTO.java new file mode 100644 index 0000000..a753db3 --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskDTO.java @@ -0,0 +1,32 @@ +package co.yixiang.modules.tools.domain.dto; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPObject; +import lombok.Data; + +import java.util.List; + +@Data +public class QiniuTaskDTO { + //版本号,新版本统一都为“v3” + private String version; + // 任务ID + private String id; + // 云处理请求的请求id,主要用于七牛技术人员的问题排查 + private String reqid; + //默认使用队列为:default.sys + private String pipeline; + + private Integer code; + + private String desc; + + // 任务创建的时间戳,单位为毫秒 + private Long created_at; + + private QiniuTaskInput input; + + private List ops; + +} + diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskFop.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskFop.java new file mode 100644 index 0000000..ee8d7f4 --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskFop.java @@ -0,0 +1,11 @@ +package co.yixiang.modules.tools.domain.dto; + +import lombok.Data; + +@Data +public class QiniuTaskFop { + private String cmd; + private String input_from; + + private QiniuTaskResult result; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskInput.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskInput.java new file mode 100644 index 0000000..fa4a49c --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskInput.java @@ -0,0 +1,8 @@ +package co.yixiang.modules.tools.domain.dto; + +import lombok.Data; + +@Data +public class QiniuTaskInput { + private QiniuTaskKodoFile kodo_file; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskKodoFile.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskKodoFile.java new file mode 100644 index 0000000..cca196c --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskKodoFile.java @@ -0,0 +1,10 @@ +package co.yixiang.modules.tools.domain.dto; + +import lombok.Data; + +@Data +public class QiniuTaskKodoFile { + private String bucket; + private String key; + private Boolean hash; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskOp.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskOp.java new file mode 100644 index 0000000..3a7050a --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskOp.java @@ -0,0 +1,11 @@ +package co.yixiang.modules.tools.domain.dto; + +import lombok.Data; + +@Data +public class QiniuTaskOp { + private String id; + private QiniuTaskFop fop; + + private String[] depends; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskResult.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskResult.java new file mode 100644 index 0000000..808b8d5 --- /dev/null +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/domain/dto/QiniuTaskResult.java @@ -0,0 +1,8 @@ +package co.yixiang.modules.tools.domain.dto; + +public class QiniuTaskResult { + private String code; + private String desc; + private Boolean hasOutput; + private String[] output; +} diff --git a/yshop-tools/src/main/java/co/yixiang/modules/tools/rest/QiniuController.java b/yshop-tools/src/main/java/co/yixiang/modules/tools/rest/QiniuController.java index c1c601c..0b3e0b9 100644 --- a/yshop-tools/src/main/java/co/yixiang/modules/tools/rest/QiniuController.java +++ b/yshop-tools/src/main/java/co/yixiang/modules/tools/rest/QiniuController.java @@ -8,9 +8,12 @@ package co.yixiang.modules.tools.rest; import co.yixiang.modules.logging.aop.log.Log; import co.yixiang.modules.tools.domain.QiniuConfig; import co.yixiang.modules.tools.domain.QiniuContent; +import co.yixiang.modules.tools.domain.dto.QiniuTaskDTO; +import co.yixiang.modules.tools.domain.dto.QiniuTaskOp; import co.yixiang.modules.tools.service.QiNiuService; import co.yixiang.modules.tools.service.QiniuConfigService; import co.yixiang.modules.tools.service.dto.QiniuQueryCriteria; +import com.alibaba.fastjson.JSONObject; import com.qiniu.util.Auth; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -33,6 +36,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -50,6 +54,7 @@ public class QiniuController { private final QiniuConfigService qiniuConfigService; + public QiniuController(QiNiuService qiNiuService, QiniuConfigService qiniuConfigService) { this.qiNiuService = qiNiuService; this.qiniuConfigService = qiniuConfigService; @@ -137,4 +142,7 @@ public class QiniuController { String upToken = auth.uploadToken(qiniuConfig.getBucket()); return new ResponseEntity<>(upToken,HttpStatus.OK); } + + + }