From d22f5bdfdaa8502a5f2496248da932b3c50c1fd0 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Thu, 16 Dec 2021 16:06:25 +0800 Subject: [PATCH] finish video add/update/list --- src/main/resources/templates/febs/views/video/video/video-source-add.html | 48 +++ src/main/java/cc/mrbird/febs/video/controller/AdminVideoController.java | 23 + src/main/resources/templates/febs/views/video/video/video-list.html | 43 ++ src/main/java/cc/mrbird/febs/video/mapper/VideoMasterDataMapper.java | 7 src/main/resources/templates/febs/views/video/video/video-source-list-select.html | 9 src/main/resources/mapper/video/VideoMasterDataMapper.xml | 5 src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java | 120 +++++++ src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java | 5 src/main/java/cc/mrbird/febs/video/entity/VideoMasterInfoEntity.java | 11 src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java | 8 src/main/resources/mapper/video/VideoMasterItemsMapper.xml | 34 ++ src/main/java/cc/mrbird/febs/video/entity/VideoMasterDataEntity.java | 22 + src/main/resources/templates/febs/views/video/video/video-update.html | 413 +++++++++++++++++++++++++++ src/main/resources/templates/febs/views/video/video/video-source-list.html | 9 src/main/resources/mapper/video/VideoMasterInfoMapper.xml | 42 ++ src/main/resources/templates/febs/views/video/video/video-add.html | 73 +--- src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java | 6 src/main/java/cc/mrbird/febs/video/controller/ViewController.java | 7 src/main/java/cc/mrbird/febs/video/mapper/VideoMasterInfoMapper.java | 1 src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java | 9 20 files changed, 829 insertions(+), 66 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/video/controller/AdminVideoController.java b/src/main/java/cc/mrbird/febs/video/controller/AdminVideoController.java index 0803bcc..aac1578 100644 --- a/src/main/java/cc/mrbird/febs/video/controller/AdminVideoController.java +++ b/src/main/java/cc/mrbird/febs/video/controller/AdminVideoController.java @@ -113,14 +113,31 @@ @RequiresPermissions("source:view") @ControllerEndpoint(operation = "视频列表", exceptionMessage = "获取视频列表失败") public FebsResponse videoList(VideoMasterInfoEntity info, QueryRequest request) { - return new FebsResponse().success(); + return new FebsResponse().success().data(getDataTable(this.videoMasterInfoService.findInPage(info, request))); } @PostMapping("/video/add") @RequiresPermissions("source:add") + @ControllerEndpoint(operation = "添加视频", exceptionMessage = "添加视频失败") public FebsResponse videoAdd(@RequestBody VideoMasterInfoEntity info) { - System.out.println(info); - return null; + this.videoMasterInfoService.addVideo(info); + return new FebsResponse().success(); + } + + @PostMapping("/video/update") + @RequiresPermissions("source:update") + @ControllerEndpoint(operation = "修改视频", exceptionMessage = "修改视频失败") + public FebsResponse videoUpdate(@RequestBody VideoMasterInfoEntity info) { + this.videoMasterInfoService.updateVideo(info); + return new FebsResponse().success(); + } + + @PostMapping("/video/changeIsUp/{id}") + @RequiresPermissions("source:update") + @ControllerEndpoint(operation = "上下架", exceptionMessage = "上下架失败") + public FebsResponse changeIsUp(@PathVariable("id") Long id) { + this.videoMasterInfoService.changeIsUp(id); + return new FebsResponse().success(); } } diff --git a/src/main/java/cc/mrbird/febs/video/controller/ViewController.java b/src/main/java/cc/mrbird/febs/video/controller/ViewController.java index 72d6d7c..37390f1 100644 --- a/src/main/java/cc/mrbird/febs/video/controller/ViewController.java +++ b/src/main/java/cc/mrbird/febs/video/controller/ViewController.java @@ -2,7 +2,9 @@ import cc.mrbird.febs.common.entity.FebsConstant; import cc.mrbird.febs.common.utils.FebsUtil; +import cc.mrbird.febs.video.entity.VideoMasterInfoEntity; import cc.mrbird.febs.video.entity.VideoMasterSourceEntity; +import cc.mrbird.febs.video.service.IVideoMasterInfoService; import cc.mrbird.febs.video.service.IVideoMasterSourceService; import lombok.RequiredArgsConstructor; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -16,6 +18,7 @@ public class ViewController { private final IVideoMasterSourceService videoMasterSourceService; + private final IVideoMasterInfoService videoMasterInfoService; @GetMapping(FebsConstant.VIEW_PREFIX + "video/category") @RequiresPermissions("category:view") @@ -64,7 +67,9 @@ @GetMapping(FebsConstant.VIEW_PREFIX + "video/update/{id}") @RequiresPermissions("video:update") - public String videoUpdate(@PathVariable("id") Long id) { + public String videoUpdate(@PathVariable("id") Long id, Model model) { + VideoMasterInfoEntity masterInfo = this.videoMasterInfoService.findById(id); + model.addAttribute("video", masterInfo); return FebsUtil.view("video/video/video-update"); } } diff --git a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterDataEntity.java b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterDataEntity.java new file mode 100644 index 0000000..ef09dd5 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterDataEntity.java @@ -0,0 +1,22 @@ +package cc.mrbird.febs.video.entity; + +import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @author wzy + * @date 2021-12-16 + **/ +@Data +@TableName("video_master_data") +public class VideoMasterDataEntity extends BaseEntity { + + private Long masterId; + + private int starCnt; + + private int collectCnt; + + private int playCnt; +} diff --git a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterInfoEntity.java b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterInfoEntity.java index 56967ba..6dc3f1f 100644 --- a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterInfoEntity.java +++ b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterInfoEntity.java @@ -13,6 +13,8 @@ private String title; + private String code; + private String intro; private String thumb; @@ -31,4 +33,13 @@ @TableField(exist = false) private List<VideoMasterItemsEntity> items; + + @TableField(exist = false) + private int playCnt; + + @TableField(exist = false) + private int collectCnt; + + @TableField(exist = false) + private int starCnt; } diff --git a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java index 0f9b838..6b1043d 100644 --- a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java +++ b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java @@ -1,6 +1,7 @@ package cc.mrbird.febs.video.entity; import cc.mrbird.febs.common.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -20,7 +21,10 @@ private String videoUrl; - private String seq; + private Integer seq; private Long sourceId; + + @TableField(exist = false) + private String sourceName; } diff --git a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java index b12b1e6..9caf4a4 100644 --- a/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java +++ b/src/main/java/cc/mrbird/febs/video/entity/VideoMasterSourceEntity.java @@ -23,6 +23,11 @@ private Integer isDel; /** + * 缩略图 + */ + private String thumb; + + /** * 是否同步修改 */ @TableField(exist = false) diff --git a/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterDataMapper.java b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterDataMapper.java new file mode 100644 index 0000000..2de0ea5 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterDataMapper.java @@ -0,0 +1,7 @@ +package cc.mrbird.febs.video.mapper; + +import cc.mrbird.febs.video.entity.VideoMasterDataEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface VideoMasterDataMapper extends BaseMapper<VideoMasterDataEntity> { +} diff --git a/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterInfoMapper.java b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterInfoMapper.java index 8765524..5c844cc 100644 --- a/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterInfoMapper.java +++ b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterInfoMapper.java @@ -10,4 +10,5 @@ IPage<VideoMasterInfoEntity> selectInPage(@Param("record") VideoMasterInfoEntity record, Page<VideoMasterInfoEntity> page); + VideoMasterInfoEntity selectEntityById(@Param("id") Long id); } diff --git a/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java index f326602..c82f054 100644 --- a/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java +++ b/src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java @@ -4,7 +4,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + public interface VideoMasterItemsMapper extends BaseMapper<VideoMasterItemsEntity> { int updateVideoUrlBySourceId(@Param("url") String url, @Param("sourceId") Long sourceId); + + List<VideoMasterItemsEntity> selectItemsByMasterId(@Param("masterId") Long masterId); + + int deleteNotInIds(@Param("list") List<Long> list, @Param("masterId") Long masterId); + +// int batchInsert(@Param("list") List<VideoMasterItemsEntity> list); } diff --git a/src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java b/src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java index 65f2a25..69da01c 100644 --- a/src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java +++ b/src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java @@ -8,4 +8,13 @@ public interface IVideoMasterInfoService extends IService<VideoMasterInfoEntity> { IPage<VideoMasterInfoEntity> findInPage(VideoMasterInfoEntity info, QueryRequest request); + + void addVideo(VideoMasterInfoEntity info); + + void updateVideo(VideoMasterInfoEntity info); + + VideoMasterInfoEntity findById(Long id); + + void changeIsUp(Long id); } + diff --git a/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java index 47e1216..0b6bdea 100644 --- a/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java @@ -1,14 +1,29 @@ package cc.mrbird.febs.video.service.impl; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.video.entity.VideoMasterDataEntity; import cc.mrbird.febs.video.entity.VideoMasterInfoEntity; +import cc.mrbird.febs.video.entity.VideoMasterItemsEntity; +import cc.mrbird.febs.video.entity.VideoMasterSourceEntity; +import cc.mrbird.febs.video.mapper.VideoMasterDataMapper; import cc.mrbird.febs.video.mapper.VideoMasterInfoMapper; +import cc.mrbird.febs.video.mapper.VideoMasterItemsMapper; +import cc.mrbird.febs.video.mapper.VideoMasterSourceMapper; import cc.mrbird.febs.video.service.IVideoMasterInfoService; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; /** * @author wzy @@ -19,8 +34,111 @@ @RequiredArgsConstructor public class VideoMasterInfoServiceImpl extends ServiceImpl<VideoMasterInfoMapper, VideoMasterInfoEntity> implements IVideoMasterInfoService { + private final VideoMasterItemsMapper videoMasterItemsMapper; + private final VideoMasterSourceMapper videoMasterSourceMapper; + private final VideoMasterDataMapper videoMasterDataMapper; + @Override public IPage<VideoMasterInfoEntity> findInPage(VideoMasterInfoEntity info, QueryRequest request) { - return null; + Page<VideoMasterInfoEntity> page = new Page<>(request.getPageNum(), request.getPageSize()); + return this.baseMapper.selectInPage(info, page); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addVideo(VideoMasterInfoEntity info) { + + this.baseMapper.insert(info); + List<VideoMasterItemsEntity> items = info.getItems(); + if (CollUtil.isEmpty(items)) { + throw new FebsException("章节异常"); + } + + int i = 1; + for (VideoMasterItemsEntity item : items) { + if (StrUtil.isBlank(item.getName())){ + throw new FebsException("章节标题未填写"); + } + VideoMasterSourceEntity source = this.videoMasterSourceMapper.selectById(item.getSourceId()); + item.setMasterId(info.getId()); + item.setSeq(i); + item.setVideoUrl(source.getUrl()); + + this.videoMasterItemsMapper.insert(item); + i++; + } + + VideoMasterDataEntity data = new VideoMasterDataEntity(); + data.setMasterId(info.getId()); + data.setCollectCnt(0); + data.setPlayCnt(0); + data.setStarCnt(0); + this.videoMasterDataMapper.insert(data); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateVideo(VideoMasterInfoEntity info) { + this.baseMapper.updateById(info); + +// List<VideoMasterItemsEntity> beforeItems = this.videoMasterItemsMapper.selectItemsByMasterId(info.getId()); + List<VideoMasterItemsEntity> newItems = info.getItems(); + if (CollUtil.isEmpty(newItems)) { + throw new FebsException("章节异常"); + } + + List<Long> existID = new ArrayList<>(); + List<VideoMasterItemsEntity> newInsert = new ArrayList<>(); + int i = 1; + for (VideoMasterItemsEntity newItem : newItems) { + if (StrUtil.isBlank(newItem.getName())) { + throw new FebsException("章节标题未填写"); + } + + if (newItem.getId() != null) { + newItem.setSeq(i); + this.videoMasterItemsMapper.updateById(newItem); + existID.add(newItem.getId()); + i++; + } else { + newInsert.add(newItem); + } + } + + if (CollUtil.isNotEmpty(existID)) { + this.videoMasterItemsMapper.deleteNotInIds(existID, info.getId()); + } + + if (CollUtil.isNotEmpty(newInsert)) { + for (VideoMasterItemsEntity item : newInsert) { + VideoMasterSourceEntity source = this.videoMasterSourceMapper.selectById(item.getSourceId()); + item.setMasterId(info.getId()); + item.setVideoUrl(source.getUrl()); + item.setSeq(i); + this.videoMasterItemsMapper.insert(item); + + i++; + } + } + } + + @Override + public VideoMasterInfoEntity findById(Long id) { + return this.baseMapper.selectEntityById(id); + } + + @Override + public void changeIsUp(Long id) { + VideoMasterInfoEntity masterInfo = this.baseMapper.selectById(id); + if (masterInfo == null) { + throw new FebsException("视频不存在"); + } + if (AppContants.FLAG_INT_Y.equals(masterInfo.getIsUp())) { + masterInfo.setIsUp(AppContants.FLAG_INT_N); + } else { + masterInfo.setIsUp(AppContants.FLAG_INT_Y); + } + + this.baseMapper.updateById(masterInfo); } } diff --git a/src/main/resources/mapper/video/VideoMasterDataMapper.xml b/src/main/resources/mapper/video/VideoMasterDataMapper.xml new file mode 100644 index 0000000..1a29dae --- /dev/null +++ b/src/main/resources/mapper/video/VideoMasterDataMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cc.mrbird.febs.video.mapper.VideoMasterDataMapper"> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/video/VideoMasterInfoMapper.xml b/src/main/resources/mapper/video/VideoMasterInfoMapper.xml index 07f6288..d22497f 100644 --- a/src/main/resources/mapper/video/VideoMasterInfoMapper.xml +++ b/src/main/resources/mapper/video/VideoMasterInfoMapper.xml @@ -3,6 +3,48 @@ <mapper namespace="cc.mrbird.febs.video.mapper.VideoMasterInfoMapper"> <select id="selectInPage" resultType="cc.mrbird.febs.video.entity.VideoMasterInfoEntity"> + select + a.*, + count(b.id) itemCnt, + c.play_cnt, + c.collect_cnt, + c.star_cnt + from video_master_info a, video_master_items b, video_master_data c + where a.id=b.master_id and a.id=c.master_id + <if test="record.title != null and record.title != ''"> + and a.title like concat('%', #{record.title}, '%') + </if> + group by a.id + </select> + + <resultMap id="videoMasterInfoMap" type="cc.mrbird.febs.video.entity.VideoMasterInfoEntity"> + <id property="id" column="id" /> + <result property="cateIds" column="cate_ids" /> + <result property="code" column="code" /> + <result property="title" column="title" /> + <result property="isFree" column="is_free" /> + <result property="isUp" column="is_up" /> + <result property="intro" column="intro" /> + <result property="thumb" column="thumb" /> + <collection property="items" ofType="cc.mrbird.febs.video.entity.VideoMasterItemsEntity" > + <id property="id" column="item_id" /> + <result property="name" column="name" /> + <result property="thumb" column="item_thumb" /> + <result property="sourceId" column="source_id" /> + <result property="sourceName" column="sourceName" /> + </collection> + </resultMap> + + <select id="selectEntityById" resultMap="videoMasterInfoMap"> + select + a.*, + b.id item_id, + b.name, + b.thumb item_thumb, + b.source_id, + c.name sourceName + from video_master_info a, video_master_items b, video_master_source c + where a.id=b.master_id and a.id=#{id} and b.source_id=c.id </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/video/VideoMasterItemsMapper.xml b/src/main/resources/mapper/video/VideoMasterItemsMapper.xml index e7e8001..b597c27 100644 --- a/src/main/resources/mapper/video/VideoMasterItemsMapper.xml +++ b/src/main/resources/mapper/video/VideoMasterItemsMapper.xml @@ -9,4 +9,38 @@ where source_id=#{sourceId} </update> + <select id="selectItemsByMasterId" resultType="cc.mrbird.febs.video.entity.VideoMasterItemsEntity"> + select * from video_master_items + where master_id=#{masterId} + </select> + + <delete id="deleteNotInIds"> + delete from video_master_items + where master_id=#{masterId} and id not in + <foreach collection="list" item="item" open="(" close=")" separator=","> + #{item} + </foreach> + </delete> + +<!-- <insert id="batchInsert">--> +<!-- insert video_master_items (--> +<!-- revision,--> +<!-- created_by,--> +<!-- created_time,--> +<!-- update_by,--> +<!-- updated_time,--> +<!-- id,--> +<!-- master_id,--> +<!-- name,--> +<!-- thumb,--> +<!-- video_url,--> +<!-- seq,--> +<!-- source_id--> +<!-- ) values--> +<!-- <foreach collection="list" item="item" separator=",">--> +<!-- (--> + +<!-- )--> +<!-- </foreach>--> +<!-- </insert>--> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/video/video/video-add.html b/src/main/resources/templates/febs/views/video/video/video-add.html index fd8ad51..a0051eb 100644 --- a/src/main/resources/templates/febs/views/video/video/video-add.html +++ b/src/main/resources/templates/febs/views/video/video/video-add.html @@ -47,6 +47,7 @@ <button type="button" class="layui-btn" id="thumbUpload">上传图片</button> <div class="layui-upload-list"> <img class="layui-upload-img" id="thumb" style="width: 150px;"/> + <input class="layui-input febs-hide" name="thumb" autocomplete="off" /> </div> </div> </div> @@ -64,52 +65,13 @@ <table class="layui-table"> <thead> <tr> - <th>排序</th> - <th>视频标题</th> - <th>视频缩略图</th> + <th>章节标题</th> + <th>缩略图</th> <th>资源名称</th> <th>操作</th> </tr> </thead> <tbody id="itemList"> -<!-- <tr>--> -<!-- <th>--> -<!-- 1--> -<!-- </th>--> -<!-- <th>--> -<!-- <input type="text" class="layui-input" placeholder="" />--> -<!-- </th>--> -<!-- <th>--> -<!-- <div class="upload">--> -<!-- <img class="layui-upload-img item-img febs-hide" style="width: 150px;"/>--> -<!-- <button class="layui-btn layui-btn-xs" type="button">点击上传</button>--> -<!-- <input type="text" class="febs-hide" name="itemThumb" />--> -<!-- </div>--> -<!-- </th>--> -<!-- <th>123</th>--> -<!-- <th>--> -<!-- <button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>--> -<!-- </th>--> -<!-- </tr>--> -<!-- <tr>--> -<!-- <th>--> -<!-- 2--> -<!-- </th>--> -<!-- <th>--> -<!-- <input type="text" class="layui-input" placeholder="" />--> -<!-- </th>--> -<!-- <th>--> -<!-- <div class="upload">--> -<!-- <img class="layui-upload-img item-img" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2Ftp05%2F19100120461512E-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg" style="width: 150px;"/>--> -<!-- <button class="layui-btn layui-btn-xs febs-hide" type="button">点击上传</button>--> -<!-- <input type="text" class="febs-hide" name="itemThumb" />--> -<!-- </div>--> -<!-- </th>--> -<!-- <th>123</th>--> -<!-- <th>--> -<!-- <button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>--> -<!-- </th>--> -<!-- </tr>--> </tbody> </table> </div> @@ -140,10 +102,7 @@ {{# layui.each(d, function(index, item){ }} <tr> <th> - {{item.seq}} <input type="text" class="febs-hide" name="sourceId" value="{{item.id}}"/> - </th> - <th> <input type="text" class="layui-input" name="name" placeholder="" value=""/> </th> <th> @@ -151,11 +110,11 @@ {{# if(!item.thumb || item.thumb == ''){ }} <img class="layui-upload-img item-img febs-hide" src="" style="width: 150px;"/> <button class="layui-btn layui-btn-xs" type="button">点击上传</button> - <input type="text" class="febs-hide" name="itemThumb" /> + <input type="text" class="febs-hide" autocomplete="off" name="itemThumb" /> {{# } else { }} - <img class="layui-upload-img item-img" src="" style="width: 150px;"/> + <img class="layui-upload-img item-img" src="{{item.thumb}}" style="width: 150px;"/> <button class="layui-btn layui-btn-xs febs-hide" type="button">点击上传</button> - <input type="text" class="febs-hide" name="itemThumb" /> + <input type="text" class="febs-hide" autocomplete="off" name="itemThumb" /> {{# } }} </div> </th> @@ -269,6 +228,7 @@ return layer.msg('上传失败'); } + $('#thumb').next().val(res.data[0]) layer.msg('上传成功', {icon: 1}); } ,error: function(){ @@ -350,17 +310,19 @@ itemData.push(data); }); + if (!data.field.thumb) { + febs.alert.warn('未上传缩略图'); + return; + } var field = {}; field.items = itemData; field.title = data.field.title; field.cateIds = cateIds.join(","); field.thumb = data.field.thumb; + field.isFree = data.field.isFree; + field.intro = data.field.intro; console.log(field); - - // febs.post(ctx + 'video/video/add', data.field, function () { - // layer.closeAll(); - // }); $.ajax({ url : ctx + 'video/video/add', @@ -370,9 +332,16 @@ data : JSON.stringify(field), success : function(res) { console.log(res) + if (res.code != 200) { + febs.alert.warn(res.message); + return; + } + febs.alert.success('新增成功'); + $('#febs-video').find('#query').click(); + layer.closeAll(); }, error : function(err) { - + layer.msg("请求错误"); } }) return false; diff --git a/src/main/resources/templates/febs/views/video/video/video-list.html b/src/main/resources/templates/febs/views/video/video/video-list.html index 49123d9..1e72d99 100644 --- a/src/main/resources/templates/febs/views/video/video/video-list.html +++ b/src/main/resources/templates/febs/views/video/video/video-list.html @@ -56,6 +56,14 @@ </div> </div> </div> +<style> + .layui-table-cell { + height: 100%; + } +</style> +<script type="text/html" id="thumbFormat"> + <img src="{{d.thumb}}" /> +</script> <script type="text/html" id="is-up-format"> {{# var status = { @@ -78,6 +86,11 @@ <span shiro:lacksPermission="video:view,video:update,video:delete"> <span class="layui-badge-dot febs-bg-orange"></span> 无权限 </span> + {{# if(d.isUp == 1) { }} + <button lay-event="isUp" type="button" class="layui-btn layui-btn-xs layui-btn-danger isUp">下架</button> + {{# } else { }} + <button lay-event="isUp" type="button" class="layui-btn layui-btn-xs layui-btn-normal isUp">上架</button> + {{# } }} <a lay-event="edit" shiro:hasPermission="video:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> <a lay-event="del" shiro:hasPermission="video:delete"><i class="layui-icon febs-edit-area febs-red"></i></a> @@ -155,16 +168,29 @@ }); } if (layEvent === 'edit') { - febs.modal.open('修改视频', 'video/update/' + data.name, { - area: $(window).width() <= 750 ? '90%' : '50%', - offset: '30px', + febs.modal.open('修改视频', 'video/update/' + data.id, { + area: ['100%', '100%'], btn: ['提交', '取消'], yes: function (index, layero) { - $('#user-update').find('#submit').trigger('click'); + $('#video-update').find('#submit').trigger('click'); }, btn2: function () { layer.closeAll(); } + }); + } + if (layEvent === 'isUp') { + var text; + if (data.isUp == 1) { + text = "下架"; + } else { + text = "上架"; + } + febs.modal.confirm('是否' + text + "该视频", '确定' + text + '该视频?', function () { + febs.post(ctx + 'video/video/changeIsUp/' + data.id, null, function () { + febs.alert.success(text + '视频成功'); + $query.click(); + }); }); } }); @@ -201,11 +227,14 @@ cols: [[ {type: 'checkbox'}, {field: 'title', title: '视频名', minWidth: 100}, - {field: 'thumb', title: '缩略图'}, + {templet: '#thumbFormat', title: '缩略图'}, {title: '是否上架', templet: '#is-up-format'}, {title: '会员', templet: '#is-free-format'}, - {field: 'createdTime', title: '创建时间', minWidth: 180, sort: true}, - {title: '操作', toolbar: '#user-option', minWidth: 140} + {field: 'playCnt', title: '播放量'}, + {field: 'collectCnt', title: '收藏量'}, + {field: 'starCnt', title: '点赞量'}, + {field: 'createdTime', title: '创建时间', minWidth: 180}, + {title: '操作', toolbar: '#user-option'} ]] }); } diff --git a/src/main/resources/templates/febs/views/video/video/video-source-add.html b/src/main/resources/templates/febs/views/video/video/video-source-add.html index 4baab79..f24391d 100644 --- a/src/main/resources/templates/febs/views/video/video/video-source-add.html +++ b/src/main/resources/templates/febs/views/video/video/video-source-add.html @@ -26,12 +26,25 @@ </div> <div class="layui-form-item"> + <label class="layui-form-label">缩略图:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn" id="thumbUpload">上传图片</button> + <div class="layui-upload-list"> + <img class="layui-upload-img" id="thumb" style="width: 150px;"/> + <input class="layui-input febs-hide" name="thumb" autocomplete="off" /> + </div> + </div> + </div> + </div> + + <div class="layui-form-item"> <label class="layui-form-label"></label> <div class="layui-input-block"> <div class="layui-upload-drag" id="upload"> <div class="upload-text" id="upload-text"> <i class="layui-icon layui-icon-upload-drag"></i> - <p>点击上传,或将文件拖拽到此处</p> + <p>点击上传,或将视频文件拖拽到此处</p> </div> <div class="upload-progress" id="upload-progress" style="display: none;"> @@ -69,6 +82,15 @@ form.render(); form.on('submit(source-add-form-submit)', function (data) { + if (!data.field.url) { + febs.alert.warn('未上传视频文件'); + return; + } + + if (!data.field.thumb) { + febs.alert.warn('未上传视频文件'); + return; + } febs.post(ctx + 'video/source/add', data.field, function () { layer.closeAll(); febs.alert.success('新增成功'); @@ -112,5 +134,29 @@ } } }); + + upload.render({ + elem: '#thumbUpload' + ,url: 'common/upload' + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#thumb').attr('src', result); + }); + layer.msg('上传中', {icon: 16, time: 0}); + } + ,done: function(res){ + //如果上传失败 + if(res.code != 200){ + return layer.msg('上传失败'); + } + + $('#thumb').next().val(res.data[0]) + layer.msg('上传成功', {icon: 1}); + } + ,error: function(){ + layer.msg('上传失败'); + } + }); }); </script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/video/video/video-source-list-select.html b/src/main/resources/templates/febs/views/video/video/video-source-list-select.html index a7bf8e7..a79b939 100644 --- a/src/main/resources/templates/febs/views/video/video/video-source-list-select.html +++ b/src/main/resources/templates/febs/views/video/video/video-source-list-select.html @@ -28,6 +28,14 @@ </div> </div> </div> +<style> + .layui-table-cell { + height: 100%; + } +</style> +<script type="text/html" id="thumbFormat"> + <img src="{{d.thumb}}" /> +</script> <script data-th-inline="none" type="text/javascript"> layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () { var $ = layui.jquery, @@ -76,6 +84,7 @@ cols: [[ {type: 'checkbox'}, {field: 'name', title: '视频名称', minWidth: 100}, + {templet: '#thumbFormat', title: '缩略图', minWidth: 100}, {field: 'createdTime', title: '创建时间', minWidth: 180, sort: true} ]] }); diff --git a/src/main/resources/templates/febs/views/video/video/video-source-list.html b/src/main/resources/templates/febs/views/video/video/video-source-list.html index b574f25..f66029b 100644 --- a/src/main/resources/templates/febs/views/video/video/video-source-list.html +++ b/src/main/resources/templates/febs/views/video/video/video-source-list.html @@ -35,6 +35,14 @@ </div> </div> </div> +<style> + .layui-table-cell { + height: 100%; + } +</style> +<script type="text/html" id="thumbFormat"> + <img src="{{d.thumb}}" /> +</script> <script type="text/html" id="source-option"> <span shiro:lacksPermission="source:update,source:delete"> <span class="layui-badge-dot febs-bg-orange"></span> 无权限 @@ -163,6 +171,7 @@ cols: [[ {type: 'checkbox'}, {field: 'name', title: '视频名称', minWidth: 100}, + {templet: '#thumbFormat', title: '缩略图', minWidth: 100}, {field: 'createdTime', title: '创建时间', minWidth: 180, sort: true}, {title: '操作', toolbar: '#source-option', minWidth: 140} ]] diff --git a/src/main/resources/templates/febs/views/video/video/video-update.html b/src/main/resources/templates/febs/views/video/video/video-update.html new file mode 100644 index 0000000..393134e --- /dev/null +++ b/src/main/resources/templates/febs/views/video/video/video-update.html @@ -0,0 +1,413 @@ +<style> + #video-update { + padding: 20px 25px 25px 0; + } + #video-update .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #video-update #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #video-update .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + #video-update .upload { + cursor: pointer; + } +</style> +<div class="layui-fluid" id="video-update"> + <form class="layui-form" action="" lay-filter="video-update-form"> + <input class="layui-input febs-hide" name="id" data-th-value="${video.id}" /> + <div class="layui-form-item"> + <div class="layui-col-md6"> + <label class="layui-form-label febs-form-item-require">视频标题:</label> + <div class="layui-input-block"> + <input type="text" name="title" minlength="2" maxlength="10" lay-verify="range" + autocomplete="off" class="layui-input"> + </div> + </div> + <div class="layui-col-md6"> + <label class="layui-form-label febs-form-item-require">视频分类:</label> + <div class="layui-input-block" id="video-cate"> + </div> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">简介:</label> + <div class="layui-input-block"> + <textarea name="intro" autocomplete="off" placeholder="请输入简介" class="layui-textarea"></textarea> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label">缩略图:</label> + <div class="layui-input-block"> + <div class="layui-upload"> + <button type="button" class="layui-btn" id="thumbUpload">上传图片</button> + <div class="layui-upload-list"> + <img class="layui-upload-img" id="thumb" th:src="${video.thumb}" style="width: 150px;"/> + <input class="layui-input febs-hide" name="thumb" autocomplete="off" /> + </div> + </div> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">章节:</label> + <div class="layui-input-block"> + <button class="layui-btn" type="button" id="addItem">新增章节</button> + </div> + </div> + <div class="layui-form-item"> + <label class="layui-form-label"></label> + <div class="layui-input-block"> + <table class="layui-table"> + <thead> + <tr> + <th>章节标题</th> + <th>缩略图</th> + <th>资源名称</th> + <th>操作</th> + </tr> + </thead> + <tbody id="itemList"> + </tbody> + </table> + </div> + </div> + + <div class="layui-form-item"> + <label class="layui-form-label febs-form-item-require">是否免费:</label> + <div class="layui-input-block"> + <input type="radio" name="isFree" value="1" title="免费"> + <input type="radio" name="isFree" value="2" title="会员"> + </div> + </div> + +<!-- <div class="layui-form-item layui-form-text">--> +<!-- <label class="layui-form-label">备注:</label>--> +<!-- <div class="layui-input-block">--> +<!-- <textarea name="description" maxlength="100" class="layui-textarea"></textarea>--> +<!-- </div>--> +<!-- </div>--> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="video-update-form-submit" id="submit"></button> + <button type="reset" class="layui-btn" id="reset"></button> + </div> + </form> +</div> + +<script type="text/html" id="tableRowTemplate"> + {{# layui.each(d, function(index, item){ }} + <tr> + <th> + <input type="text" class="febs-hide" name="itemId" value="{{item.id}}"/> + <input type="text" class="febs-hide" name="sourceId" value="{{item.sourceId}}"/> + <input type="text" class="layui-input" name="name" value="{{item.name}}"/> + </th> + <th> + <div class="upload{{item.sourceId}}"> + {{# if(!item.thumb || item.thumb == ''){ }} + <img class="layui-upload-img item-img febs-hide" src="" style="width: 150px;"/> + <button class="layui-btn layui-btn-xs" type="button">点击上传</button> + <input type="text" class="febs-hide" autocomplete="off" name="itemThumb" value="{{item.thumb}}" /> + {{# } else { }} + <img class="layui-upload-img item-img" src="{{item.thumb}}" style="width: 150px;"/> + <button class="layui-btn layui-btn-xs febs-hide" type="button">点击上传</button> + <input type="text" class="febs-hide" autocomplete="off" name="itemThumb" value="{{item.thumb}}" /> + {{# } }} + </div> + </th> + <th>{{item.sourceName}}</th> + <th> + <button class="layui-btn layui-btn-xs layui-btn-danger item-delete" type="button">删除</button> + </th> + </tr> + {{# }); }} +</script> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'upload', 'xmSelect', 'laytpl', 'table'], function () { + var $ = layui.$, + febs = layui.febs, + layer = layui.layer, + form = layui.form, + table = layui.table, + $view = $('#video-update'), + upload = layui.upload, + validate = layui.validate, + laytpl = layui.laytpl, + tableUpload, + video = [[${video}]], + templateHtml = tableRowTemplate.innerHTML, + $itemList = $("#itemList"); + + form.verify(validate); + form.render(); + + // 已添加的item数据 + var itemData = []; + var videoCate = xmSelect.render({ + el: '#video-cate', + language: 'zn', + prop : { + value : 'id' + }, + data: [] + }) + + febs.get(ctx + 'video/categoryTree', null, function(res) { + videoCate.update({ + data : res.data, + autoRow: true, + }); + + initValue(); + }); + + function initValue() { + form.val("video-update-form", { + "title" : video.title, + "intro" : video.intro, + "isFree" : video.isFree + "", + "thumb" : video.thumb + }) + + videoCate.setValue(video.cateIds.split(',')); + + var items = video.items; + laytpl(templateHtml).render(items, function(html) { + $itemList.append(html); + }); + + for (var i = 0; i < items.length; i++) { + bindUpload(items[i].sourceId); + var item = {}; + item.id = items[i].sourceId; + itemData.push(item); + } + + deleteBind(); + } + + $("#addItem").on('click', function() { + febs.modal.open('选择视频资源', 'video/source/select/list', { + area: $(window).width() <= 750 ? '90%' : '50%', + offset: '30px', + btn: ['提交', '取消'], + yes: function (index, layero) { + var selectData = table.checkStatus('videoSourceSelectTable').data; + + // 去重 + var noRepeatData = []; + if (itemData.length != 0) { + for (var i = 0; i < selectData.length; i++) { + var flag = true; + for(var j = 0; j < itemData.length; j++) { + if (selectData[i].id == itemData[j].id) { + flag = false; + break; + } + } + + if (flag) { + noRepeatData.push(selectData[i]); + } + } + + } else { + noRepeatData = selectData; + } + + if (noRepeatData.length > 0) { + itemData = itemData.concat(noRepeatData); + // 转化字段 + for (var i = 0; i < noRepeatData.length; i++) { + noRepeatData[i].sourceId = noRepeatData[i].id; + noRepeatData[i].sourceName = noRepeatData[i].name; + noRepeatData[i].name = ""; + noRepeatData[i].id = ""; + } + + laytpl(templateHtml).render(noRepeatData, function(html) { + $itemList.append(html); + }) + + for (var i = 0; i < noRepeatData.length; i++) { + bindUpload(noRepeatData[i].sourceId); + } + } +`` + deleteUnBind(); + deleteBind(); + layer.close(layer.index); + }, + btn2: function () { + layer.close(layer.index); + } + }); + }); + + upload.render({ + elem: '#thumbUpload' + ,url: 'common/upload' + ,before: function(obj){ + //预读本地文件示例,不支持ie8 + obj.preview(function(index, file, result){ + $('#thumb').attr('src', result); + }); + layer.msg('上传中', {icon: 16, time: 0}); + } + ,done: function(res){ + //如果上传失败 + if(res.code != 200){ + return layer.msg('上传失败'); + } + + $('#thumb').next().val(res.data[0]) + layer.msg('上传成功', {icon: 1}); + } + ,error: function(){ + layer.msg('上传失败'); + } + }); + + // 表格中的图片上传 + function bindUpload(id) { + upload.render({ + elem: '.upload' + id + ,url: ctx + 'common/upload' //改成您自己的上传接口 + // ,accept: 'file' + ,before: function(obj){ + var item = this.item; + var $button = $(item).find("button"); + var $img = $(item).find('img'); + + // 如果img标签内没有src,说明没有上传图片,故此时显示的是button,所以需要操作一遍显示隐藏 + if (!$img.attr("src")) { + $button.addClass("febs-hide"); + $img.removeClass("febs-hide"); + } + + obj.preview(function(index, file, result){ + $img.attr('src', result); + }); + + layer.msg('上传中', {icon: 16, time: 0}); + } + ,done: function(res){ + var item = this.item; + var $itemThumb = $(item).find('input[name="itemThumb"]'); + var $button = $(item).find("button"); + var $img = $(item).find('img'); + + //如果上传失败 + if(res.code !== 200){ + layer.msg('上传失败'); + // 上传失败则重置 + $button.removeClass("febs-hide"); + $img.addClass("febs-hide"); + $img.attr('src', ''); + return + } + $itemThumb.val(res.data[0]); + layer.msg('上传完毕', {icon: 1}); + } + ,error: function(){ + return layer.msg('上传失败'); + } + }); + } + + form.on('submit(video-update-form-submit)', function (data) { + var $tr = $("#itemList").find("tr"); + var itemLength = $tr.length; + if (itemLength == 0) { + layer.msg('请添加章节!'); + return; + } + + var cateIds = videoCate.getValue('value'); + if (cateIds.length <= 0) { + febs.alert.warn('至少选择一个目录'); + return false; + } + + var itemData = []; + $tr.each(function() { + var data = {}; + var sourceId = $(this).find("input[name = 'sourceId']").val(); + var itemId = $(this).find("input[name = 'itemId']").val(); + var videoItemName = $(this).find("input[name = 'name']").val(); + var itemThumb = $(this).find("input[name = 'itemThumb']").val(); + + data.sourceId = sourceId; + data.id = itemId; + data.name = videoItemName; + data.thumb = itemThumb; + itemData.push(data); + }); + + if (!data.field.thumb) { + febs.alert.warn('未上传缩略图'); + return; + } + + var field = {}; + field.items = itemData; + field.id = data.field.id; + field.title = data.field.title; + field.cateIds = cateIds.join(","); + field.thumb = data.field.thumb; + field.isFree = data.field.isFree; + field.intro = data.field.intro; + + $.ajax({ + url : ctx + 'video/video/update', + type : "post", + dataType : "json", + contentType : "application/json", + data : JSON.stringify(field), + success : function(res) { + console.log(res) + if (res.code != 200) { + febs.alert.warn(res.message); + return; + } + febs.alert.success('修改成功'); + $('#febs-video').find('#query').click(); + layer.closeAll(); + }, + error : function(err) { + layer.msg("请求错误"); + } + }) + return false; + }); + + function deleteBind() { + $(".item-delete").each(function(index, element) { + $(this).on("click", function() { + var $tr = $(this).parents("tr"); + var id = $tr.find("input[name='sourceId']").val(); + for (var i = 0; i < itemData.length; i++) { + if (itemData[i].id == id) { + itemData.splice(i, 1); + break; + } + } + + $tr.remove(); + }); + }) + } + + function deleteUnBind() { + $(".item-delete").each(function(index, element) { + $(this).unbind('click'); + }) + } + }); +</script> \ No newline at end of file -- Gitblit v1.9.1