From 8bfcdc67288b607e333da334ec84abc58ff6dfc4 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 12 六月 2025 15:11:11 +0800
Subject: [PATCH] 视频表增加字段
---
framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoContentTypeEnum.java | 46 +++++++++++
framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java | 6 +
framework/src/main/java/cn/lili/cos/CosSTS.java | 3
framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java | 14 ++-
framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoTypeEnum.java | 47 +++++++++++
framework/src/main/java/cn/lili/utils/COSUtil.java | 1
buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java | 12 --
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java | 18 ++--
framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoQuery.java | 7 +
framework/src/main/java/cn/lili/modules/lmk/domain/query/ManagerVideoQuery.java | 6 +
framework/src/main/resources/mapper/lmk/VideoMapper.xml | 7 +
manager-api/src/main/java/cn/lili/controller/lmk/VideoController.java | 10 -
framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java | 6
buyer-api/src/main/java/cn/lili/controller/lmk/VideoTagController.java | 7 -
framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java | 2
15 files changed, 147 insertions(+), 45 deletions(-)
diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java
index 1841afb..a1fba30 100644
--- a/buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java
@@ -1,27 +1,21 @@
package cn.lili.controller.lmk;
-import cn.lili.base.AbsQuery;
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.modules.lmk.domain.form.VideoFootPrintForm;
import cn.lili.modules.lmk.domain.form.VideoHomePageInfoForm;
+import cn.lili.modules.lmk.domain.form.WxVideoForm;
import cn.lili.modules.lmk.domain.query.AuthorVideoQuery;
-import cn.lili.modules.member.entity.dos.FootPrint;
import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
import java.util.List;
-import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import cn.lili.modules.lmk.service.VideoService;
import cn.lili.base.Result;
-import cn.lili.modules.lmk.domain.form.VideoForm;
import cn.lili.modules.lmk.domain.query.VideoQuery;
-import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
/**
* 瑙嗛鍐呭 鍓嶇鎺у埗鍣�
@@ -40,13 +34,13 @@
@PostMapping("/publish")
@ApiOperation(value = "鍙戝竷瑙嗛", notes = "鍙戝竷瑙嗛")
- public Result publish(@RequestBody @Validated({Add.class}) VideoForm form) {
+ public Result publish(@RequestBody @Validated({Add.class}) WxVideoForm form) {
return videoService.publish(form);
}
@PutMapping
@ApiOperation(value = "淇敼", notes = "淇敼")
- public Result update(@RequestBody @Validated(Update.class) VideoForm form) {
+ public Result update(@RequestBody @Validated(Update.class) WxVideoForm form) {
return videoService.update(form);
}
diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/VideoTagController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/VideoTagController.java
index 3504538..4ae6ea5 100644
--- a/buyer-api/src/main/java/cn/lili/controller/lmk/VideoTagController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/VideoTagController.java
@@ -1,20 +1,13 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
-import cn.lili.group.Update;
-import cn.lili.modules.lmk.domain.form.VideoForm;
-import cn.lili.modules.lmk.domain.query.VideoQuery;
import cn.lili.modules.lmk.domain.query.WxVideoTagQuery;
-import cn.lili.modules.lmk.service.VideoService;
import cn.lili.modules.lmk.service.VideoTagService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-
-import javax.validation.constraints.NotEmpty;
-import java.util.List;
/**
* 瑙嗛鏍囩 鍓嶇鎺у埗鍣�
diff --git a/framework/src/main/java/cn/lili/cos/CosSTS.java b/framework/src/main/java/cn/lili/cos/CosSTS.java
index ae955e1..4a1e188 100644
--- a/framework/src/main/java/cn/lili/cos/CosSTS.java
+++ b/framework/src/main/java/cn/lili/cos/CosSTS.java
@@ -36,5 +36,6 @@
@ApiModelProperty("region")
private String region;
-
+ @ApiModelProperty("绔偣锛岀敤浜庢嫾鎺ilekey鐩存帴棰勮")
+ private String endpoint;
}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/VideoForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
similarity index 82%
rename from framework/src/main/java/cn/lili/modules/lmk/domain/form/VideoForm.java
rename to framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
index bcf2858..791a4bb 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/form/VideoForm.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
@@ -9,14 +9,13 @@
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
+
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
/**
@@ -27,7 +26,7 @@
*/
@Data
@ApiModel(value = "Video琛ㄥ崟", description = "瑙嗛鍐呭琛ㄥ崟")
-public class VideoForm extends AbsForm {
+public class WxVideoForm extends AbsForm {
@NotBlank(message = "瑙嗛涓嶈兘涓虹┖", groups = {Add.class, Update.class})
@@ -41,6 +40,13 @@
@ApiModelProperty("瑙嗛灏侀潰")
@NotBlank(message = "瑙嗛灏侀潰涓嶈兘涓虹┖", groups = {Add.class, Update.class})
private String cover;
+
+ @ApiModelProperty("瑙嗛鍐呭绫诲瀷锛氳棰戙�佸浘鐗�")
+ @NotBlank(message = "瑙嗛绫诲瀷涓嶈兘涓虹┖")
+ private String videoContentType;
+
+ @ApiModelProperty("鍥剧墖鍒楄〃锛屽鏋渧ideoContentType鏄浘鐗囷紝鍒欏繀椤讳紶鍊�")
+ private List<String> videoImgs;
@ApiModelProperty("瑙嗛鏍囩")
@Length(max = 5, message = "鏈�澶氬彧鑳芥坊鍔犱簲涓爣绛�")
@@ -60,7 +66,7 @@
@Valid
private FileInfoForm fileInfo;
- public static Video getEntityByForm(@NonNull VideoForm form, Video entity) {
+ public static Video getEntityByForm(@NonNull WxVideoForm form, Video entity) {
if(entity == null) {
entity = new Video();
}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java
index 5b59eb5..f2888f2 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
+import cn.lili.modules.lmk.enums.general.VideoTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -24,5 +25,10 @@
@ApiModelProperty(hidden = true)
private Boolean authorSelf;
+ /**
+ * @see cn.lili.modules.lmk.enums.general.VideoTypeEnum
+ */
+ @ApiModelProperty("瑙嗛绫诲瀷锛氳棰戙�佸ぇ鍋ュ悍銆佺鍘紝榛樿涓嶄紶鏌ヨ棰�")
+ private String videoType = VideoTypeEnum.VIDEO.getValue();
}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/ManagerVideoQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/ManagerVideoQuery.java
index 09a5b83..59cfb74 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/query/ManagerVideoQuery.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/ManagerVideoQuery.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
+import cn.lili.modules.lmk.enums.general.VideoTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -29,5 +30,10 @@
@ApiModelProperty("鐘舵��")
private String status;
+ /**
+ * @see cn.lili.modules.lmk.enums.general.VideoTypeEnum
+ */
+ @ApiModelProperty("瑙嗛绫诲瀷锛氳棰戙�佸ぇ鍋ュ悍銆佺鍘紝榛樿涓嶄紶鏌ヨ棰�")
+ private String videoType = VideoTypeEnum.VIDEO.getValue();
}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoQuery.java
index ac1a18d..8aa7959 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoQuery.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoQuery.java
@@ -2,6 +2,8 @@
import cn.lili.base.AbsQuery;
import java.util.List;
+
+import cn.lili.modules.lmk.enums.general.VideoTypeEnum;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@@ -25,5 +27,10 @@
@ApiModelProperty("瑙嗛鏉ユ簮锛歳ecommend鎺ㄨ崘銆乤uthor鏌愪綔鑰呯殑瑙嗛銆乧ollect鏌愪綔鑰呮敹钘忕殑瑙嗛")
private String videoFrom;
+ /**
+ * @see cn.lili.modules.lmk.enums.general.VideoTypeEnum
+ */
+ @ApiModelProperty("瑙嗛绫诲瀷锛氳棰戙�佸ぇ鍋ュ悍銆佺鍘紝榛樿涓嶄紶鏌ヨ棰�")
+ private String videoType = VideoTypeEnum.VIDEO.getValue();
}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoContentTypeEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoContentTypeEnum.java
new file mode 100644
index 0000000..d805852
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoContentTypeEnum.java
@@ -0,0 +1,46 @@
+package cn.lili.modules.lmk.enums.general;
+
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 瑙嗛鍐呭绫诲瀷
+ *
+ * @author锛歺p
+ * @date锛�2025/5/14 10:30
+ */
+@Getter
+public enum VideoContentTypeEnum {
+
+ VIDEO("video", "瑙嗛"),
+ IMG("img", "鍥剧墖"),
+ ;
+
+ private final String value;
+
+
+ private final String desc;
+
+ VideoContentTypeEnum(String value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ /**
+ * 鑾峰彇鍚箟
+ *
+ * @param value
+ * @return
+ */
+ public static String getDescByValue(String value) {
+ if (StringUtils.isBlank(value)) {
+ return null;
+ }
+ for (VideoContentTypeEnum e : VideoContentTypeEnum.values()){
+ if (value.equals(e.getValue())) {
+ return e.getDesc();
+ }
+ }
+ return null;
+ }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoTypeEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoTypeEnum.java
new file mode 100644
index 0000000..be8baae
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoTypeEnum.java
@@ -0,0 +1,47 @@
+package cn.lili.modules.lmk.enums.general;
+
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 瑙嗛绫诲瀷
+ *
+ * @author锛歺p
+ * @date锛�2025/5/14 10:30
+ */
+@Getter
+public enum VideoTypeEnum {
+
+ VIDEO("video", "瑙嗛"),
+ HEALTH("health", "澶у仴搴�"),
+ COOK("cook", "绁炲帹"),
+ ;
+
+ private final String value;
+
+
+ private final String desc;
+
+ VideoTypeEnum(String value, String desc) {
+ this.value = value;
+ this.desc = desc;
+ }
+
+ /**
+ * 鑾峰彇鍚箟
+ *
+ * @param value
+ * @return
+ */
+ public static String getDescByValue(String value) {
+ if (StringUtils.isBlank(value)) {
+ return null;
+ }
+ for (VideoTypeEnum e : VideoTypeEnum.values()){
+ if (value.equals(e.getValue())) {
+ return e.getDesc();
+ }
+ }
+ return null;
+ }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java
index 2b91e57..4b2675f 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java
@@ -49,7 +49,7 @@
*
* @return
*/
- IPage recommendVideo(IPage page);
+ IPage recommendVideo(IPage page, @Param("query") VideoQuery query);
/**
* 鎵归噺鏇存柊瑙嗛鏀惰棌鏁伴噺
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java b/framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java
index 01b4655..0a4b93d 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java
@@ -23,14 +23,14 @@
* @param form
* @return
*/
- Result add(VideoForm form);
+ Result add(WxVideoForm form);
/**
* 淇敼
* @param form
* @return
*/
- Result update(VideoForm form);
+ Result update(WxVideoForm form);
/**
* 鎵归噺鍒犻櫎
@@ -72,7 +72,7 @@
* @param form
* @return
*/
- Result publish(VideoForm form);
+ Result publish(WxVideoForm form);
/**
* 骞冲彴绔棰戝垎椤�
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
index b892c29..a9875df 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
@@ -6,10 +6,7 @@
import cn.lili.modules.lmk.domain.query.AuthorVideoQuery;
import cn.lili.modules.lmk.domain.query.ManagerVideoQuery;
import cn.lili.modules.lmk.domain.vo.*;
-import cn.lili.modules.lmk.enums.general.TagCreateTypeEnum;
-import cn.lili.modules.lmk.enums.general.VideoStatusEnum;
-import cn.lili.modules.lmk.enums.general.VideoSupportOpEnum;
-import cn.lili.modules.lmk.enums.general.ViewTypeEnum;
+import cn.lili.modules.lmk.enums.general.*;
import cn.lili.modules.lmk.service.*;
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.Member;
@@ -65,8 +62,8 @@
* @return
*/
@Override
- public Result add(VideoForm form) {
- Video entity = VideoForm.getEntityByForm(form, null);
+ public Result add(WxVideoForm form) {
+ Video entity = WxVideoForm.getEntityByForm(form, null);
baseMapper.insert(entity);
return Result.ok("娣诲姞鎴愬姛");
}
@@ -77,7 +74,7 @@
* @return
*/
@Override
- public Result update(VideoForm form) {
+ public Result update(WxVideoForm form) {
Video entity = baseMapper.selectById(form.getId());
// 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
@@ -151,12 +148,13 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public Result publish(VideoForm form) {
+ public Result publish(WxVideoForm form) {
// 1.淇濆瓨瑙嗛
- Video video = VideoForm.getEntityByForm(form, null);
+ Video video = WxVideoForm.getEntityByForm(form, null);
video.setAuthorId(UserContext.getCurrentUserId());
video.setStatus(VideoStatusEnum.AUDITING.getValue());
video.setCoverUrl(form.getCover());
+ video.setVideoType(VideoTypeEnum.VIDEO.getValue());
baseMapper.insert(video);
// 2.澶勭悊鏍囩
List<VideoTagRef> videoTagRefs = form.getTags().stream().map(tag -> {
@@ -268,7 +266,7 @@
IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
switch (query.getVideoFrom()) {
case "recommend":
- baseMapper.recommendVideo(page);
+ baseMapper.recommendVideo(page, query);
break;
case "author":
AuthorVideoQuery query1 = new AuthorVideoQuery();
diff --git a/framework/src/main/java/cn/lili/utils/COSUtil.java b/framework/src/main/java/cn/lili/utils/COSUtil.java
index 41e525b..c6b5731 100644
--- a/framework/src/main/java/cn/lili/utils/COSUtil.java
+++ b/framework/src/main/java/cn/lili/utils/COSUtil.java
@@ -114,6 +114,7 @@
cosSTS.setStsEndTime(cosSTS.getStsStartTime() + cosConfigProperty.getDurationSeconds() - 30);
cosSTS.setBucket(cosConfigProperty.getBucket());
cosSTS.setRegion(cosConfigProperty.getRegion());
+ cosSTS.setEndpoint(cosConfigProperty.getEndpoint());
return cosSTS;
} catch (Exception e) {
e.printStackTrace();
diff --git a/framework/src/main/resources/mapper/lmk/VideoMapper.xml b/framework/src/main/resources/mapper/lmk/VideoMapper.xml
index d28f9d9..c9ae243 100644
--- a/framework/src/main/resources/mapper/lmk/VideoMapper.xml
+++ b/framework/src/main/resources/mapper/lmk/VideoMapper.xml
@@ -141,7 +141,7 @@
) AS LVT ON LV.id = LVT.video_id
</if>
WHERE
- LV.delete_flag = 0
+ LV.delete_flag = 0 AND LV.video_type = #{query.videoType}
<if test="query.title != null and query.title != ''">AND LV.title LIKE CONCAT('%', #{query.title}, '%')</if>
<if test="query.authorId != null and query.authorId != ''">AND LV.author_id = #{query.authorId}</if>
<if test="query.status != null and query.status != ''">AND LV.status = #{query.status}</if>
@@ -176,7 +176,7 @@
lmk_video LV
LEFT JOIN li_member LM ON LV.author_id = LM.id
WHERE
- LV.delete_flag = 0 AND LV.status = '1'
+ LV.delete_flag = 0 AND LV.status = '1' AND LV.video_type = #{query.videoType}
</select>
@@ -272,6 +272,7 @@
AND LV.status = '1'
</if>
AND LV.author_id = #{query.authorId}
+ AND LV.video_type = #{query.videoType}
ORDER BY
LV.collect_num DESC
</select>
@@ -305,7 +306,7 @@
INNER JOIN lmk_video LV ON LMC.ref_id = LV.id AND LV.delete_flag = 0 AND LV.status = '1'
LEFT JOIN li_member LM ON LV.author_id = LM.id
WHERE
- LMC.delete_flag = 0 AND LMC.user_id = #{query.authorId} AND LMC.collect_type = 'video'
+ LMC.delete_flag = 0 AND LMC.user_id = #{query.authorId} AND LMC.collect_type = 'video' AND LV.video_type = #{query.videoType}
ORDER BY
LMC.create_time DESC
</select>
diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/VideoController.java b/manager-api/src/main/java/cn/lili/controller/lmk/VideoController.java
index de00a7a..b496f0d 100644
--- a/manager-api/src/main/java/cn/lili/controller/lmk/VideoController.java
+++ b/manager-api/src/main/java/cn/lili/controller/lmk/VideoController.java
@@ -5,20 +5,16 @@
import cn.lili.modules.lmk.domain.form.VideoAuditingForm;
import cn.lili.modules.lmk.domain.form.VideoDownForm;
import cn.lili.modules.lmk.domain.form.VideoRecommendForm;
+import cn.lili.modules.lmk.domain.form.WxVideoForm;
import cn.lili.modules.lmk.domain.query.ManagerVideoQuery;
import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
import java.util.List;
-import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import cn.lili.modules.lmk.service.VideoService;
import cn.lili.base.Result;
-import cn.lili.modules.lmk.domain.form.VideoForm;
-import cn.lili.modules.lmk.domain.query.VideoQuery;
-import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
@@ -38,13 +34,13 @@
@PostMapping
@ApiOperation(value = "娣诲姞", notes = "娣诲姞")
- public Result add(@RequestBody @Validated(Add.class) VideoForm form) {
+ public Result add(@RequestBody @Validated(Add.class) WxVideoForm form) {
return videoService.add(form);
}
@PutMapping
@ApiOperation(value = "淇敼", notes = "淇敼")
- public Result update(@RequestBody @Validated(Update.class) VideoForm form) {
+ public Result update(@RequestBody @Validated(Update.class) WxVideoForm form) {
return videoService.update(form);
}
--
Gitblit v1.8.0