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