admin
2021-09-03 b41a6efe17ba61d150c5a9b7309651cebae54e0d
韩迷TV相关bug修改,电视直播完善(后台+前端API)
31个文件已修改
17个文件已添加
3870 ■■■■■ 已修改文件
src/main/java/com/yeshi/buwan/aspect/SignAspect.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/admin/api/SearchSpecialAdminController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/admin/api/TVLiveCategoryAdminController.java 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/admin/api/TVLiveChannelAdminController.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/api/TVLiveController.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/ConfigParser.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/HomeParser.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/SearchParser.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/HanmiShowDao.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/HanmiShowEpisodeDao.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/VideoHanmiMapDao.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/live/TVLiveCategoryDao.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/dao/search/SearchSpecialDao.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/live/SuperTVLiveCategory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/live/TVLiveCategory.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/live/TVLiveChannel.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/domain/special/SearchSpecial.java 136 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/exception/live/TVLiveCategoryException.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/live/migu/MiguLiveApiUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/juhe/HanmiServiceImpl.java 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveCategoryChannelServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveCategoryServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveChannelServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/recommend/HomeVideoServiceImpl.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/imp/search/SearchSpecialServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/juhe/HanmiService.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/live/TVLiveCategoryChannelService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/inter/live/TVLiveCategoryService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/service/manager/search/SolrShortVideoDataManager.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/util/video/VideoDetailUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/videos/hanmi/HanmiApiUtil.java 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/videos/hanmi/HanmiUtil.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/videos/hanmi/entity/HanmiShowEpisode.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/videos/hanmi/entity/VideoHanmiMap.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/vo/AcceptData.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/vo/tvlive/TVLiveChannelVO.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/consumer.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/fenqu.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/js/navsetting.xml 331 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/tvlive_category_add.html 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/tvlive_category_channel_list.html 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/tvlive_category_list.html 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/tvlive_category_update.html 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/admin/new/tvlive_channel_list.html 469 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/DES.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/video/HanmiTest.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/video/SearchSpecialTest.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/video/VideoResourceVersionTest.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/aspect/SignAspect.java
@@ -40,15 +40,6 @@
        for (Object obj : args) {
            if (obj instanceof AcceptData) {
                acceptData = (AcceptData) obj;
                if (acceptData != null) {
                    if ("ios".equalsIgnoreCase(acceptData.getPlatform())) {
                        acceptData.setChannel("appstore");
                    }
                    //注入detailSystem
                    DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName());
                    acceptData.setDetailSystem(detailSystem);
                }
            } else if (obj instanceof PrintWriter) {
                out = (PrintWriter) obj;
            }
@@ -57,13 +48,13 @@
        //如果是Android新版本则调用新的签名方法
        //布丸3.8.7之后调用新的签名方法
        if (acceptData != null && "android".equalsIgnoreCase(acceptData.getPlatform()) && acceptData.getVersion() >= 105) {
        if (acceptData != null && "android" .equalsIgnoreCase(acceptData.getPlatform()) && acceptData.getVersion() >= 105) {
            Map<String, String[]> params = request.getParameterMap();
            //签名
            List<String> list = new ArrayList<>();
            for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) {
                String key = its.next();
                if ("sign".equalsIgnoreCase(key))
                if ("sign" .equalsIgnoreCase(key))
                    continue;
                list.add(key + "=" + params.get(key)[0]);
            }
@@ -86,6 +77,24 @@
            }
        }
        if (acceptData != null) {
            if ("ios" .equalsIgnoreCase(acceptData.getPlatform())) {
                acceptData.setChannel("appstore");
            }
            if (acceptData.getPackageName().equalsIgnoreCase("com.doudou.ysvideo.lite"))
                acceptData.setPackageName("com.doudou.ysvideo");
            //注入detailSystem
            DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName());
            acceptData.setDetailSystem(detailSystem);
            acceptData.setChildPackage(acceptData.getPackage());
            detailSystem = systemService.getDetailSystemByPackage(acceptData.getChildPackage());
        }
        return joinPoint.proceed(args);
    }
src/main/java/com/yeshi/buwan/controller/admin/api/SearchSpecialAdminController.java
@@ -115,9 +115,7 @@
            out.print(JsonUtil.loadFalseAdmin("id不存在"));
            return;
        }
        old.setAlbumQuery(searchSpecial.getAlbumQuery());
        old.setInternetQuery(searchSpecial.getInternetQuery());
        old.setShortQuery(searchSpecial.getShortQuery());
        old.setContainerList(searchSpecial.getContainerList());
        if (searchSpecial.getColumn() != null)
            old.setColumn(searchSpecial.getColumn());
        if (searchSpecial.getKey() != null) {
src/main/java/com/yeshi/buwan/controller/admin/api/TVLiveCategoryAdminController.java
New file
@@ -0,0 +1,196 @@
package com.yeshi.buwan.controller.admin.api;
import com.google.gson.*;
import com.yeshi.buwan.domain.VideoInfo;
import com.yeshi.buwan.domain.live.SuperTVLiveCategory;
import com.yeshi.buwan.domain.live.TVLiveCategory;
import com.yeshi.buwan.domain.special.Special;
import com.yeshi.buwan.domain.special.SpecialVideo;
import com.yeshi.buwan.domain.special.SuperSpecial;
import com.yeshi.buwan.domain.system.DetailSystem;
import com.yeshi.buwan.domain.system.SystemInfo;
import com.yeshi.buwan.domain.web.DetailSystemSelect;
import com.yeshi.buwan.domain.web.SpecialAdmin;
import com.yeshi.buwan.exception.live.TVLiveCategoryException;
import com.yeshi.buwan.service.imp.SpecialService;
import com.yeshi.buwan.service.imp.SystemService;
import com.yeshi.buwan.service.inter.live.TVLiveCategoryService;
import com.yeshi.buwan.util.*;
import com.yeshi.buwan.web.tag.PageEntity;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.util.*;
@Controller
@RequestMapping("admin/new/api/tvlive/category")
public class TVLiveCategoryAdminController {
    @Resource
    private TVLiveCategoryService tvLiveCategoryService;
    @Resource
    private SystemService systemService;
    private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
        @Override
        public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
            return  src==null? new JsonPrimitive(""): new JsonPrimitive(TimeUtil.getGernalTime(src.getTime(),"yyyy.MM.dd HH:mm"));
        }
    }).create();
    @RequestMapping(value = "/getCategoryList", method = RequestMethod.POST)
    public void getCategoryList(HttpSession session, String detailSystemId, String key, int page, PrintWriter out) {
        SystemInfo systemInfo = SystemUtil.getAdminSelectedSystem(session);
        detailSystemId = StringUtil.isNullOrEmpty(detailSystemId) ? null : detailSystemId;
        List<TVLiveCategory> list = tvLiveCategoryService.list(detailSystemId, systemInfo.getId(), key, page, Constant.pageCount);
        List<DetailSystem> detailSystemList = systemService.getDetailSystemList(systemInfo.getId());
        List<TVLiveCategoryAdmin> resultList = new ArrayList<>();
        if (list != null)
            for (TVLiveCategory category : list) {
                Set<String> selectedDetailSystemSet = new HashSet<>();
                List<SuperTVLiveCategory> superList = tvLiveCategoryService.listSuper(category.getId());
                for (SuperTVLiveCategory cy : superList) {
                    selectedDetailSystemSet.add(cy.getDetailSystemId());
                }
                List<DetailSystemSelect> selectList = new ArrayList<>();
                for (DetailSystem detailSystem : detailSystemList) {
                    detailSystem.setSystem(null);
                    detailSystem.setInfo(null);
                    DetailSystemSelect select = new DetailSystemSelect();
                    select.setDetailSystem(detailSystem);
                    select.setSelected(selectedDetailSystemSet.contains(detailSystem.getId()));
                    selectList.add(select);
                }
                resultList.add(new TVLiveCategoryAdmin(category, selectList));
            }
        long count = tvLiveCategoryService.count(detailSystemId, systemInfo.getId(), key);
        JSONObject data = new JSONObject();
        data.put("pageEntity", new PageEntity(page, Constant.pageCount, (int) count));
        data.put("data", gson.toJson(resultList));
        out.print(JsonUtil.loadTrueAdmin(data.toString()));
    }
    @RequestMapping(value = "/addCategory", method = RequestMethod.POST)
    public void addCategory(TVLiveCategory category, String detailsystemids, HttpSession session, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(category.getName())) {
            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
            return;
        }
        category.setSystemId(SystemUtil.getAdminSelectedSystem(session).getId());
        List<String> detailSystemList = new ArrayList<>();
        if (!StringUtil.isNullOrEmpty(detailsystemids)) {
            String[] sps = detailsystemids.split(",");
            for (String sp : sps) {
                detailSystemList.add(sp);
            }
        }
        try {
            tvLiveCategoryService.addCategory(category, detailSystemList);
            out.print(JsonUtil.loadTrueAdmin(""));
        } catch (TVLiveCategoryException e) {
            out.print(JsonUtil.loadFalseAdmin(e.getMsg()));
        }
    }
    @RequestMapping(value = "/updateCategory", method = RequestMethod.POST)
    public void updateCategory(TVLiveCategory category, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(category.getName())) {
            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
            return;
        }
        tvLiveCategoryService.updateCategory(category);
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    @RequestMapping(value = "/getCategory", method = RequestMethod.POST)
    public void getCategory(String id, PrintWriter out) {
        TVLiveCategory category = tvLiveCategoryService.selectCategoryBuPrimaryKey(id);
        out.print(JsonUtil.loadTrueAdmin(new Gson().toJson(category)));
    }
    /**
     * 删除分类
     *
     * @param ids
     * @param out
     */
    @RequestMapping(value = "/deleteCategory", method = RequestMethod.POST)
    public void deleteCategory(String ids, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(ids)) {
            out.print(JsonUtil.loadFalseAdmin("ids不能为空"));
            return;
        }
        tvLiveCategoryService.deleteCateogry(Arrays.asList(ids.split(",")));
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    @RequestMapping(value = "/deleteSuperCategory", method = RequestMethod.POST)
    public void deleteSuperCategory(String cid, String detailSystemId, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(cid) || StringUtil.isNullOrEmpty(detailSystemId)) {
            out.print(JsonUtil.loadFalseAdmin("信息不完整"));
            return;
        }
        tvLiveCategoryService.deleteSuperCategory(cid, detailSystemId);
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    @RequestMapping(value = "/addSuperCategory", method = RequestMethod.POST)
    public void addSuperCategory(String cid, String detailSystemId, Integer weight, String icon, PrintWriter out) {
        SuperTVLiveCategory superTVLiveCategory = new SuperTVLiveCategory();
        superTVLiveCategory.setCid(cid);
        superTVLiveCategory.setDetailSystemId(detailSystemId);
        superTVLiveCategory.setWeight(weight);
        superTVLiveCategory.setIcon(icon);
        tvLiveCategoryService.addSuperCategory(superTVLiveCategory);
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    class TVLiveCategoryAdmin {
        private TVLiveCategory category;
        private List<DetailSystemSelect> detailSystemSelectList;
        public TVLiveCategoryAdmin(TVLiveCategory category, List<DetailSystemSelect> detailSystemSelectList) {
            this.category = category;
            this.detailSystemSelectList = detailSystemSelectList;
        }
        public TVLiveCategory getCategory() {
            return category;
        }
        public void setCategory(TVLiveCategory category) {
            this.category = category;
        }
        public List<DetailSystemSelect> getDetailSystemSelectList() {
            return detailSystemSelectList;
        }
        public void setDetailSystemSelectList(List<DetailSystemSelect> detailSystemSelectList) {
            this.detailSystemSelectList = detailSystemSelectList;
        }
    }
}
src/main/java/com/yeshi/buwan/controller/admin/api/TVLiveChannelAdminController.java
New file
@@ -0,0 +1,210 @@
package com.yeshi.buwan.controller.admin.api;
import com.google.gson.*;
import com.yeshi.buwan.domain.live.SuperTVLiveCategory;
import com.yeshi.buwan.domain.live.TVLiveCategory;
import com.yeshi.buwan.domain.live.TVLiveCategoryChannelMap;
import com.yeshi.buwan.domain.live.TVLiveChannel;
import com.yeshi.buwan.domain.web.DetailSystemSelect;
import com.yeshi.buwan.exception.live.TVLiveCategoryException;
import com.yeshi.buwan.service.imp.SystemService;
import com.yeshi.buwan.service.inter.live.TVLiveCategoryChannelService;
import com.yeshi.buwan.service.inter.live.TVLiveChannelService;
import com.yeshi.buwan.util.*;
import com.yeshi.buwan.web.tag.PageEntity;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("admin/new/api/tvlive/channel")
public class TVLiveChannelAdminController {
    @Resource
    private TVLiveChannelService tvLiveChannelService;
    @Resource
    private TVLiveCategoryChannelService tvLiveCategoryChannelService;
    @Resource
    private SystemService systemService;
    private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
        @Override
        public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
            return src == null ? new JsonPrimitive("") : new JsonPrimitive(TimeUtil.getGernalTime(src.getTime(), "yyyy.MM.dd HH:mm"));
        }
    }).create();
    @RequestMapping(value = "/getChannelList", method = RequestMethod.POST)
    public void getChannelList(HttpSession session, String categoryId, String key, Integer state, int page, PrintWriter out) {
        List<TVLiveChannel> channelList;
        long count;
        if (StringUtil.isNullOrEmpty(categoryId)) {
            channelList = tvLiveChannelService.list(key, state, page, Constant.pageCount);
            count = tvLiveChannelService.count(key, state);
        } else {
            channelList = tvLiveCategoryChannelService.listChannelByCid(categoryId, key, page, Constant.pageCount);
            count = tvLiveCategoryChannelService.countChannelByCid(categoryId, key);
        }
        JSONObject data = new JSONObject();
        data.put("pageEntity", new PageEntity(page, Constant.pageCount, (int) count));
        data.put("data", gson.toJson(channelList));
        out.print(JsonUtil.loadTrueAdmin(data.toString()));
    }
    @RequestMapping(value = "/addCategoryChannel", method = RequestMethod.POST)
    public void addCategoryChannel(String categoryId, String channelIds, Integer weight, HttpSession session, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(categoryId) || StringUtil.isNullOrEmpty(channelIds)) {
            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
            return;
        }
        String[] channelIdArray = channelIds.split(",");
        for (String channelId : channelIdArray) {
            TVLiveCategoryChannelMap map = new TVLiveCategoryChannelMap();
            map.setWeight(weight);
            map.setCategoryId(categoryId);
            map.setChannelId(channelId);
            tvLiveCategoryChannelService.addMap(map);
        }
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    @RequestMapping(value = "/deleteCategoryChannel", method = RequestMethod.POST)
    public void deleteCategoryChannel(String categoryId, String channelIds, HttpSession session, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(categoryId) || StringUtil.isNullOrEmpty(channelIds)) {
            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
            return;
        }
        String[] channelIdArray = channelIds.split(",");
        for (String channelId : channelIdArray) {
            TVLiveCategoryChannelMap map = tvLiveCategoryChannelService.selectByCategoryIdAndChannelId(categoryId, channelId);
            if (map != null)
                tvLiveCategoryChannelService.deleteByPrimaryKey(map.getId());
        }
        out.print(JsonUtil.loadTrueAdmin(""));
    }
    @RequestMapping(value = "/updateCategoryChannelWeight", method = RequestMethod.POST)
    public void updateCategoryChannelWeight(String categoryId, String channelId, Integer weight, HttpSession session, PrintWriter out) {
        TVLiveCategoryChannelMap oldMap = tvLiveCategoryChannelService.selectByCategoryIdAndChannelId(categoryId, channelId);
        if (oldMap == null) {
            out.print(JsonUtil.loadFalseAdmin("分类的频道不存在"));
            return;
        }
        TVLiveCategoryChannelMap map = new TVLiveCategoryChannelMap();
        map.setId(oldMap.getId());
        map.setWeight(weight);
        tvLiveCategoryChannelService.update(map);
        out.print(JsonUtil.loadTrueAdmin(""));
    }
//    @RequestMapping(value = "/addCategory", method = RequestMethod.POST)
//    public void addCategory(TVLiveCategory category, String detailsystemids, HttpSession session, PrintWriter out) {
//
//        if (StringUtil.isNullOrEmpty(category.getName())) {
//            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
//            return;
//        }
//
//        category.setSystemId(SystemUtil.getAdminSelectedSystem(session).getId());
//
//        List<String> detailSystemList = new ArrayList<>();
//        if (!StringUtil.isNullOrEmpty(detailsystemids)) {
//            String[] sps = detailsystemids.split(",");
//            for (String sp : sps) {
//                detailSystemList.add(sp);
//            }
//        }
//
//        try {
//            tvLiveCategoryService.addCategory(category, detailSystemList);
//            out.print(JsonUtil.loadTrueAdmin(""));
//        } catch (TVLiveCategoryException e) {
//            out.print(JsonUtil.loadFalseAdmin(e.getMsg()));
//        }
//    }
//
//
//    @RequestMapping(value = "/updateCategory", method = RequestMethod.POST)
//    public void updateCategory(TVLiveCategory category, PrintWriter out) {
//
//        if (StringUtil.isNullOrEmpty(category.getName())) {
//            out.print(JsonUtil.loadFalseAdmin("数据不完整"));
//            return;
//        }
//        tvLiveCategoryService.updateCategory(category);
//        out.print(JsonUtil.loadTrueAdmin(""));
//    }
//
//
//    @RequestMapping(value = "/getCategory", method = RequestMethod.POST)
//    public void getCategory(String id, PrintWriter out) {
//        TVLiveCategory category = tvLiveCategoryService.selectCategoryBuPrimaryKey(id);
//        out.print(JsonUtil.loadTrueAdmin(new Gson().toJson(category)));
//    }
//
//
//    /**
//     * 删除分类
//     *
//     * @param ids
//     * @param out
//     */
//    @RequestMapping(value = "/deleteCategory", method = RequestMethod.POST)
//    public void deleteCategory(String ids, PrintWriter out) {
//        if (StringUtil.isNullOrEmpty(ids)) {
//            out.print(JsonUtil.loadFalseAdmin("ids不能为空"));
//            return;
//        }
//        tvLiveCategoryService.deleteCateogry(Arrays.asList(ids.split(",")));
//        out.print(JsonUtil.loadTrueAdmin(""));
//    }
//
//
//    @RequestMapping(value = "/deleteSuperCategory", method = RequestMethod.POST)
//    public void deleteSuperCategory(String cid, String detailSystemId, PrintWriter out) {
//        if (StringUtil.isNullOrEmpty(cid) || StringUtil.isNullOrEmpty(detailSystemId)) {
//            out.print(JsonUtil.loadFalseAdmin("信息不完整"));
//            return;
//        }
//        tvLiveCategoryService.deleteSuperCategory(cid, detailSystemId);
//        out.print(JsonUtil.loadTrueAdmin(""));
//    }
//
//
//    @RequestMapping(value = "/addSuperCategory", method = RequestMethod.POST)
//    public void addSuperCategory(String cid, String detailSystemId, Integer weight, String icon, PrintWriter out) {
//
//        SuperTVLiveCategory superTVLiveCategory = new SuperTVLiveCategory();
//        superTVLiveCategory.setCid(cid);
//        superTVLiveCategory.setDetailSystemId(detailSystemId);
//        superTVLiveCategory.setWeight(weight);
//        superTVLiveCategory.setIcon(icon);
//        tvLiveCategoryService.addSuperCategory(superTVLiveCategory);
//        out.print(JsonUtil.loadTrueAdmin(""));
//    }
}
src/main/java/com/yeshi/buwan/controller/api/TVLiveController.java
New file
@@ -0,0 +1,138 @@
package com.yeshi.buwan.controller.api;
import com.google.gson.*;
import com.yeshi.buwan.domain.live.*;
import com.yeshi.buwan.domain.user.LoginUser;
import com.yeshi.buwan.domain.vip.*;
import com.yeshi.buwan.dto.order.PPTVVideoPrice;
import com.yeshi.buwan.dto.order.PayWayInfoDTO;
import com.yeshi.buwan.exception.PPTVException;
import com.yeshi.buwan.exception.goldcorn.GoldCornException;
import com.yeshi.buwan.exception.order.OrderException;
import com.yeshi.buwan.exception.order.PayException;
import com.yeshi.buwan.exception.vip.VIPException;
import com.yeshi.buwan.exception.vip.VideoBuyRecordException;
import com.yeshi.buwan.live.migu.MiGuLiveListInfo;
import com.yeshi.buwan.live.migu.MiguLiveApiUtil;
import com.yeshi.buwan.service.inter.LoginUserService;
import com.yeshi.buwan.service.inter.juhe.PPTVService;
import com.yeshi.buwan.service.inter.live.*;
import com.yeshi.buwan.service.inter.order.OrderService;
import com.yeshi.buwan.service.inter.system.SystemConfigService;
import com.yeshi.buwan.service.inter.vip.VIPPriceService;
import com.yeshi.buwan.service.inter.vip.VIPService;
import com.yeshi.buwan.util.*;
import com.yeshi.buwan.videos.pptv.entity.PPTVSeries;
import com.yeshi.buwan.videos.pptv.entity.VideoPPTVMap;
import com.yeshi.buwan.vo.AcceptData;
import com.yeshi.buwan.vo.client.user.UserInfoVO;
import com.yeshi.buwan.vo.order.OrderInfoVO;
import com.yeshi.buwan.vo.tvlive.TVLiveChannelVO;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.yeshi.utils.annotation.RequestSerializableByKey;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * 电视直播
 */
@Controller
@RequestMapping("api/v2/tvlive")
public class TVLiveController {
    Logger logger = LoggerFactory.getLogger(TVLiveController.class);
    @Resource
    private TVLiveCategoryService tvLiveCategoryService;
    @Resource
    private TVLiveCategoryChannelService tvLiveCategoryChannelService;
    @Resource
    private TVLiveChannelResourceService tvLiveChannelResourceService;
    @Resource
    private MiGuLiveService miGuLiveService;
    @RequestMapping("getCategory")
    @ResponseBody
    public String getCategory(AcceptData acceptData) {
        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        List<SuperTVLiveCategory> superList = tvLiveCategoryService.listSuper(acceptData.getDetailSystem().getId(), 1, 20);
        List<String> channelIds = new ArrayList<>();
        for (SuperTVLiveCategory category : superList) {
            channelIds.add(category.getCid());
        }
        List<TVLiveCategory> categoryList = tvLiveCategoryService.listByIds(channelIds);
        JSONObject data = new JSONObject();
        data.put("count", categoryList.size());
        data.put("data", gson.toJson(categoryList));
        return JsonUtilV2.loadTrueJson(data.toString());
    }
    @RequestMapping("getChannelList")
    @ResponseBody
    public String getChannelList(AcceptData acceptData, String cid, int page) {
        if (StringUtil.isNullOrEmpty(cid)) {
            return JsonUtilV2.loadFalseJson("cid为空");
        }
        List<TVLiveChannel> channelList = tvLiveCategoryChannelService.listChannelByCid(cid, null, page, Constant.pageCount);
        long count = tvLiveCategoryChannelService.countChannelByCid(cid, null);
        List<TVLiveChannelVO> voList = new ArrayList<>();
        for (TVLiveChannel channel : channelList) {
            voList.add(TVLiveChannelVO.create(channel));
        }
        JSONObject root = new JSONObject();
        root.put("list", new Gson().toJson(voList));
        root.put("count", count);
        return JsonUtilV2.loadTrueJson(root.toString());
    }
    @RequestMapping("getPlayUrl")
    @ResponseBody
    public String getPlayUrl(AcceptData acceptData, String id) {
        if (StringUtil.isNullOrEmpty(id)) {
            return JsonUtilV2.loadFalseJson("id为空");
        }
        //获取播放链接
        List<TVLiveChannelResourceMap> mapList = tvLiveChannelResourceService.listByChannelId(id);
        if (mapList == null || mapList.size() == 0) {
            return JsonUtilV2.loadFalseJson("暂无播放源");
        }
        TVLiveChannelResourceMap map = mapList.get(0);
        String playUrl = null;
        if (map.getResource() == TVLiveResource.migu) {
            MiGuLiveListInfo info = miGuLiveService.selectByPrimaryKey(map.getRid());
            playUrl = MiguLiveApiUtil.getPlayUrl(info.getPID());
        } else if (map.getResource() == TVLiveResource.other) {
        }
        JSONObject root = new JSONObject();
        root.put("playUrl", playUrl);
        return JsonUtilV2.loadTrueJson(root.toString());
    }
}
src/main/java/com/yeshi/buwan/controller/parser/ConfigParser.java
@@ -259,6 +259,14 @@
            adConfig = null;
        adNew.put("other", gson.toJson(adConfig));
        //广告ID
        if (!StringUtil.isNullOrEmpty(map.get("gdt_app_id"))) {
            adNew.put("gdtAppId", map.get("gdt_app_id"));
        }
        if (!StringUtil.isNullOrEmpty(map.get("csj_app_id"))) {
            adNew.put("csjAppId", map.get("csj_app_id"));
        }
        data.put("ad", ad);
        data.put("adNew", adNew);
src/main/java/com/yeshi/buwan/controller/parser/HomeParser.java
@@ -203,8 +203,8 @@
        List<HomeType> list = new ArrayList<>();
        for (HomeType ht : list1)
            list.add(ht);
        if ("309".equals(vtid)) {
            if (!"ios".equalsIgnoreCase(acceptData.getPlatform())) {
        if ("309" .equals(vtid)) {
            if (!"ios" .equalsIgnoreCase(acceptData.getPlatform())) {
                Map<String, String> confMap = configService.getConfigAsMap(detailSystem, acceptData.getVersion());
                String mm = confMap.get("meinv_mm_count");
                int count = Integer.parseInt(mm);
@@ -264,7 +264,7 @@
            }
        }
        if ("huawei".equalsIgnoreCase(channel)) {
        if ("huawei" .equalsIgnoreCase(channel)) {
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).getName().equalsIgnoreCase("美女")) {
                    list.remove(i);
@@ -343,7 +343,7 @@
                    if (adP < homeTypeList.size() && adP > -1) {
                        HomeType homeType = new HomeType();
                        homeType.setAd(ad);
                        if ("1".equalsIgnoreCase(page)) {
                        if ("1" .equalsIgnoreCase(page)) {
                            homeTypeList.add(adP, homeType);
                        }
                        count++;
@@ -590,6 +590,17 @@
        if (StringUtil.isNullOrEmpty(resourceId)) {
            resourceId = internetSearchVideo.getResourceIds().split(",")[0];
        }
        List<Long> resourceList = videoResouceUtil.getAvailableResourceIds(acceptData.getDetailSystem(), acceptData.getVersion(), acceptData.getChannel());
        if (resourceList != null) {
            if (!resourceList.contains(Long.parseLong(resourceId))) {
                out.print(JsonUtil.loadFalseAdmin(""));
                return;
            }
        }
        VideoInfo info = null;
        if (Integer.parseInt(resourceId) == YouKuUtil.RESOURCE_ID) {
            try {
@@ -777,7 +788,7 @@
            data.put("playUrl", playUrl);
            data.put("name", videoName);
            data.put("pptv", true);
            data.put("vip", "1".equalsIgnoreCase(series.getFree()));
            data.put("vip", "1" .equalsIgnoreCase(series.getFree()));
            data.put("sessionId", sessionId);
            out.print(JsonUtil.loadTrueJson(data.toString()));
            LoggerUtil.getUserActiveLogger().info(UserActiveLogFactory.createVideoDetail(new BaseLog(acceptData, loginUid), videoId, series.getName(), from));
@@ -1020,7 +1031,7 @@
    public void isPraise(AcceptData acceptData, HttpServletRequest request, PrintWriter out) {
        DetailSystem detailSystem = systemService.getDetailSystemByPackage(acceptData.getPackageName());
        DetailSystemConfig config = configService.getConfigByKey("banner_praise", detailSystem, acceptData.getVersion());
        if ("是".equals(config.getValue())) {
        if ("是" .equals(config.getValue())) {
            out.print(JsonUtil.loadTrueJson("1"));
        } else {
            out.print(JsonUtil.loadTrueJson("0"));
src/main/java/com/yeshi/buwan/controller/parser/SearchParser.java
@@ -25,6 +25,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@Controller
@@ -87,8 +88,42 @@
        int pageSize = Constant.pageCount;
        boolean hasNextPage = false;
        if (searchSpecial.getAlbumQuery() != null) {
            SolrResultDTO solrResultDTO = solrAlbumVideoDataManager.find(searchSpecial.getAlbumQuery(), pageIndex, pageSize);
        //获取搜索条件
        SearchSpecial.QueryConditions conditions = null;
        if (searchSpecial.getContainerList() != null) {
            //按version排序
            Comparator<SearchSpecial.QueryConditionsContainer> cm = (o1, o2) -> o1.getMinVersion() - o2.getMinVersion();
            Collections.sort(searchSpecial.getContainerList(), cm);
            for (SearchSpecial.QueryConditionsContainer container : searchSpecial.getContainerList()) {
                if (acceptData.getDetailSystem().getId().equalsIgnoreCase(container.getDetailSystemId())) {
                    if (acceptData.getVersion() >= container.getMinVersion()) {
                        if (acceptData.getChannel().equalsIgnoreCase(container.getChannel())) {
                            conditions = container.getQueryConditions();
                            break;
                        }
                    }
                }
            }
            if (conditions == null) {
                for (SearchSpecial.QueryConditionsContainer container : searchSpecial.getContainerList()) {
                    if (acceptData.getDetailSystem().getId().equalsIgnoreCase(container.getDetailSystemId())) {
                        if (acceptData.getVersion() >= container.getMinVersion()) {
                            conditions = container.getQueryConditions();
                            break;
                        }
                    }
                }
            }
        }
        if (conditions.getAlbumQuery() != null) {
            SolrResultDTO solrResultDTO = solrAlbumVideoDataManager.find(conditions.getAlbumQuery(), pageIndex, pageSize);
            if (solrResultDTO != null) {
                List<SolrAlbumVideo> list = solrResultDTO.getVideoList();
                if (list != null) {
@@ -102,8 +137,8 @@
            }
        }
        if (searchSpecial.getInternetQuery() != null) {
            SolrResultDTO solrResultDTO = solrInternetSearchVideoDataManager.find(searchSpecial.getInternetQuery(), pageIndex, pageSize);
        if (conditions.getInternetQuery() != null) {
            SolrResultDTO solrResultDTO = solrInternetSearchVideoDataManager.find(conditions.getInternetQuery(), pageIndex, pageSize);
            if (solrResultDTO != null) {
                List<InternetSearchVideo> list = solrResultDTO.getVideoList();
                if (list != null) {
@@ -117,8 +152,8 @@
            }
        }
        if (searchSpecial.getShortQuery() != null) {
            SolrResultDTO solrResultDTO = solrShortVideoDataManager.find(searchSpecial.getShortQuery(), pageIndex, pageSize);
        if (conditions.getShortQuery() != null) {
            SolrResultDTO solrResultDTO = solrShortVideoDataManager.find(conditions.getShortQuery(), pageIndex, pageSize);
            if (solrResultDTO != null) {
                List<SolrShortVideo> list = solrResultDTO.getVideoList();
                if (list != null) {
@@ -159,7 +194,15 @@
            item.put("name", StringUtil.isNullOrEmpty(map.getShowName()) ? map.getSpecial().getName() : map.getShowName());
            item.put("id", map.getSpecialId());
            item.put("icon", map.getIcon());
            array.add(item);
            String name = item.optString("name");
            //魅族和小米不添加
            if (("xiaomi" .equalsIgnoreCase(acceptData.getChannel()) || "meizu" .equalsIgnoreCase(acceptData.getChannel())) && "hanju-video-types" .equalsIgnoreCase(pid)) {
                if (name.contains("电视剧") || name.contains("电影") || name.contains("综艺") || name.contains("少儿")) {
                    array.add(item);
                }
            } else {
                array.add(item);
            }
        }
        JSONObject data = new JSONObject();
        data.put("list", array);
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/HanmiShowDao.java
New file
@@ -0,0 +1,40 @@
package com.yeshi.buwan.dao.juhe.hanmi;
import com.yeshi.buwan.dao.base.MongodbBaseDao;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@Repository
public class HanmiShowDao extends MongodbBaseDao<HanmiShow> {
    /**
     * 根据ID查询
     *
     * @param ids
     * @return
     */
    public List<HanmiShow> listByIds(List<String> ids) {
        Query query = new Query();
        List<Criteria> whereList = new ArrayList<>();
        for (String id : ids)
            whereList.add(Criteria.where("id").is(id));
        Criteria[] wheres = new Criteria[whereList.size()];
        whereList.toArray(wheres);
        query.addCriteria(new Criteria().orOperator(wheres));
        return findList(query);
    }
    public List<HanmiShow> listAll(int start, int count) {
        Query query = new Query();
        query.skip(start);
        query.limit(count);
        return findList(query);
    }
}
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/HanmiShowEpisodeDao.java
New file
@@ -0,0 +1,42 @@
package com.yeshi.buwan.dao.juhe.hanmi;
import com.yeshi.buwan.dao.base.MongodbBaseDao;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@Repository
public class HanmiShowEpisodeDao extends MongodbBaseDao<HanmiShowEpisode> {
    public List<HanmiShowEpisode> listByShowId(String showId, int start, int count) {
        Query query = new Query();
        query.addCriteria(Criteria.where("showId").is(showId));
        query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "orderBy")));
        return findList(query);
    }
    public HanmiShowEpisode getLatestEpisode(String showId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("showId").is(showId));
        query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "orderBy")));
        query.limit(1);
        return findOne(query);
    }
    public long countByShowId(String showId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("showId").is(showId));
        return count(query);
    }
}
src/main/java/com/yeshi/buwan/dao/juhe/hanmi/VideoHanmiMapDao.java
New file
@@ -0,0 +1,26 @@
package com.yeshi.buwan.dao.juhe.hanmi;
import com.yeshi.buwan.dao.base.MongodbBaseDao;
import com.yeshi.buwan.videos.hanmi.entity.VideoHanmiMap;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
@Repository
public class VideoHanmiMapDao extends MongodbBaseDao<VideoHanmiMap> {
    public VideoHanmiMap selectByVideoId(String videoId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(videoId));
        return findOne(query);
    }
    public VideoHanmiMap selectByShowId(String showId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("showId").is(showId));
        return findOne(query);
    }
}
src/main/java/com/yeshi/buwan/dao/live/TVLiveCategoryDao.java
@@ -42,9 +42,11 @@
        if (daoQuery.name != null) {
            andList.add(Criteria.where("name").regex(daoQuery.name));
        }
        Criteria[] ands = new Criteria[andList.size()];
        andList.toArray(ands);
        query.addCriteria(new Criteria().andOperator(ands));
        if(andList.size()>0) {
            Criteria[] ands = new Criteria[andList.size()];
            andList.toArray(ands);
            query.addCriteria(new Criteria().andOperator(ands));
        }
        return query;
    }
@@ -55,7 +57,7 @@
    public long count(DaoQuery daoQuery) {
        return count(daoQuery);
        return count(getQuery(daoQuery));
    }
@@ -73,6 +75,7 @@
    public static class DaoQuery extends BaseQuery {
        public String name;
        public String systemId;
        public List<Sort.Order> sortList;
    }
}
src/main/java/com/yeshi/buwan/dao/search/SearchSpecialDao.java
@@ -39,18 +39,15 @@
        if (bean.getSystemId() != null) {
            update.set("systemId", bean.getSystemId());
        }
        if (bean.getAlbumQuery() != null) {
            update.set("albumQuery", bean.getAlbumQuery());
        if (bean.getContainerList() != null) {
            update.set("containerList", bean.getContainerList());
        }
        if (bean.getInternetQuery() != null) {
            update.set("internetQuery", bean.getInternetQuery());
        }
        if (bean.getShortQuery() != null) {
            update.set("shortQuery", bean.getShortQuery());
        }
        if (bean.getCreateTime() != null) {
            update.set("createTime", bean.getCreateTime());
        }
        update.set("updateTime", new Date());
        update(query, update);
    }
src/main/java/com/yeshi/buwan/domain/live/SuperTVLiveCategory.java
@@ -17,6 +17,8 @@
    @Indexed
    private String detailSystemId;
    private Integer weight;
    //分类图标
    private String icon;
    private Date createTime;
    private Date updateTime;
@@ -72,4 +74,12 @@
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public String getIcon() {
        return icon;
    }
    public void setIcon(String icon) {
        this.icon = icon;
    }
}
src/main/java/com/yeshi/buwan/domain/live/TVLiveCategory.java
@@ -1,5 +1,6 @@
package com.yeshi.buwan.domain.live;
import com.google.gson.annotations.Expose;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -11,11 +12,15 @@
@Document(collection = "tvLiveCategory")
public class TVLiveCategory {
    @Expose
    @Id
    private String id;
    @Expose
    private String name;
    @Expose
    private String icon;
    private Integer weight;
    private String systemId;
    private Date createTime;
    private Date updateTime;
@@ -66,4 +71,12 @@
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public String getSystemId() {
        return systemId;
    }
    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }
}
src/main/java/com/yeshi/buwan/domain/live/TVLiveChannel.java
@@ -1,5 +1,6 @@
package com.yeshi.buwan.domain.live;
import com.google.gson.annotations.Expose;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -16,8 +17,10 @@
    //隐藏
    public final static int STATE_HIDDEN = 0;
    @Expose
    @Id
    private String id;
    @Expose
    private String name;
    private String hPicture;
    private String vPicture;
src/main/java/com/yeshi/buwan/domain/special/SearchSpecial.java
@@ -7,6 +7,7 @@
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
/**
 * 搜索专题
@@ -20,12 +21,9 @@
    @Indexed
    private String key;
    private String systemId;
    //专辑查询
    private SolrVideoSearchFilter albumQuery;
    //全网搜查询
    private SolrVideoSearchFilter internetQuery;
    //短视频
    private SolrShortVideoSearchFilter shortQuery;
    //查询条件的版本分布与系统分布
    private List<QueryConditionsContainer> containerList;
    //备注
    private String remarks;
@@ -64,22 +62,6 @@
        this.systemId = systemId;
    }
    public SolrVideoSearchFilter getAlbumQuery() {
        return albumQuery;
    }
    public void setAlbumQuery(SolrVideoSearchFilter albumQuery) {
        this.albumQuery = albumQuery;
    }
    public SolrVideoSearchFilter getInternetQuery() {
        return internetQuery;
    }
    public void setInternetQuery(SolrVideoSearchFilter internetQuery) {
        this.internetQuery = internetQuery;
    }
    public Date getCreateTime() {
        return createTime;
    }
@@ -94,15 +76,6 @@
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public SolrShortVideoSearchFilter getShortQuery() {
        return shortQuery;
    }
    public void setShortQuery(SolrShortVideoSearchFilter shortQuery) {
        this.shortQuery = shortQuery;
    }
    public String getName() {
@@ -128,4 +101,105 @@
    public void setColumn(Integer column) {
        this.column = column;
    }
    public List<QueryConditionsContainer> getContainerList() {
        return containerList;
    }
    public void setContainerList(List<QueryConditionsContainer> containerList) {
        this.containerList = containerList;
    }
    /**
     * 搜索专题查询的条件
     */
    public static class QueryConditions {
        //专辑查询
        private SolrVideoSearchFilter albumQuery;
        //全网搜查询
        private SolrVideoSearchFilter internetQuery;
        //短视频
        private SolrShortVideoSearchFilter shortQuery;
        public QueryConditions(SolrVideoSearchFilter albumQuery, SolrVideoSearchFilter internetQuery, SolrShortVideoSearchFilter shortQuery) {
            this.albumQuery = albumQuery;
            this.internetQuery = internetQuery;
            this.shortQuery = shortQuery;
        }
        public SolrVideoSearchFilter getAlbumQuery() {
            return albumQuery;
        }
        public void setAlbumQuery(SolrVideoSearchFilter albumQuery) {
            this.albumQuery = albumQuery;
        }
        public SolrVideoSearchFilter getInternetQuery() {
            return internetQuery;
        }
        public void setInternetQuery(SolrVideoSearchFilter internetQuery) {
            this.internetQuery = internetQuery;
        }
        public SolrShortVideoSearchFilter getShortQuery() {
            return shortQuery;
        }
        public void setShortQuery(SolrShortVideoSearchFilter shortQuery) {
            this.shortQuery = shortQuery;
        }
    }
    public static class QueryConditionsContainer {
        private QueryConditions queryConditions;
        private String detailSystemId;
        private String channel;
        private int minVersion;
        public QueryConditionsContainer(QueryConditions queryConditions, String detailSystemId, String channel, int minVersion) {
            this.queryConditions = queryConditions;
            this.detailSystemId = detailSystemId;
            this.channel = channel;
            this.minVersion = minVersion;
        }
        public QueryConditionsContainer() {
        }
        public QueryConditions getQueryConditions() {
            return queryConditions;
        }
        public void setQueryConditions(QueryConditions queryConditions) {
            this.queryConditions = queryConditions;
        }
        public String getDetailSystemId() {
            return detailSystemId;
        }
        public void setDetailSystemId(String detailSystemId) {
            this.detailSystemId = detailSystemId;
        }
        public int getMinVersion() {
            return minVersion;
        }
        public void setMinVersion(int minVersion) {
            this.minVersion = minVersion;
        }
        public String getChannel() {
            return channel;
        }
        public void setChannel(String channel) {
            this.channel = channel;
        }
    }
}
src/main/java/com/yeshi/buwan/exception/live/TVLiveCategoryException.java
@@ -12,5 +12,13 @@
        this.msg = msg;
    }
    @Override
    public String getMsg() {
        return msg;
    }
    @Override
    public int getCode() {
        return code;
    }
}
src/main/java/com/yeshi/buwan/live/migu/MiguLiveApiUtil.java
@@ -14,6 +14,15 @@
    private static String LIVE_CATE = "[{\"name\":\"热门\",\"vomsID\":\"e7716fea6aa1483c80cfc10b7795fcb8\"},{\"name\":\"央视\",\"vomsID\":\"a5f78af9d160418eb679a6dd0429c920\"},{\"name\":\"卫视\",\"vomsID\":\"0847b3f6c08a4ca28f85ba5701268424\"},{\"name\":\"地方\",\"vomsID\":\"855e9adc91b04ea18ef3f2dbd43f495b\"},{\"name\":\"追剧\",\"vomsID\":\"dd5311d848b54c56acba186ff1107236\"},{\"name\":\"影视\",\"vomsID\":\"10b0d04cb23d4ac5945c4bc77c7ac44e\"},{\"name\":\"体育\",\"vomsID\":\"7538163cdac044398cb292ecf75db4e0\"},{\"name\":\"新闻\",\"vomsID\":\"c584f67ad63f4bc983c31de3a9be977c\"},{\"name\":\"教育\",\"vomsID\":\"af72267483d94275995a4498b2799ecd\"},{\"name\":\"熊猫\",\"vomsID\":\"e76e56e88fff4c11b0168f55e826445d\"},{\"name\":\"娱乐\",\"vomsID\":\"192a12edfef04b5eb616b878f031f32f\"},{\"name\":\"少儿\",\"vomsID\":\"fc2f5b8fd7db43ff88c4243e731ecede\"},{\"name\":\"纪实\",\"vomsID\":\"e1165138bdaa44b9a3138d74af6c6673\"},{\"name\":\"印象天下\",\"vomsID\":\"72504196e156468b873a39734f0af7db\"},{\"name\":\"特色\",\"vomsID\":\"f24ab89d1ad94b66b623945ae0c1350e\"},{\"name\":\"购物\",\"vomsID\":\"5938b5e060964fae9fe22ca20fbd5d6a\"}]";
    /**
     * 获取播放链接
     *
     * @param pid
     * @return
     */
    public static String getPlayUrl(String pid) {
        return "https://m.miguvideo.com/mgs/msite/prd/detail.html?cid=" + pid;
    }
    public static List<MiGuLiveListInfo> getLiveList(String vomsID) {
src/main/java/com/yeshi/buwan/service/imp/juhe/HanmiServiceImpl.java
New file
@@ -0,0 +1,325 @@
package com.yeshi.buwan.service.imp.juhe;
import com.yeshi.buwan.dao.VideoInfoDao;
import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowDao;
import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowEpisodeDao;
import com.yeshi.buwan.dao.juhe.hanmi.VideoHanmiMapDao;
import com.yeshi.buwan.dao.video.AlbumVideoMapDao;
import com.yeshi.buwan.domain.AdminInfo;
import com.yeshi.buwan.domain.VideoDetailInfo;
import com.yeshi.buwan.domain.VideoInfo;
import com.yeshi.buwan.domain.VideoResource;
import com.yeshi.buwan.domain.entity.PlayUrl;
import com.yeshi.buwan.domain.video.AlbumVideoMap;
import com.yeshi.buwan.service.imp.CategoryVideoService;
import com.yeshi.buwan.service.imp.ResourceVideoService;
import com.yeshi.buwan.service.imp.VideoInfoService;
import com.yeshi.buwan.service.imp.VideoResourceService;
import com.yeshi.buwan.service.inter.juhe.HanmiService;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.TimeUtil;
import com.yeshi.buwan.util.mq.CMQManager;
import com.yeshi.buwan.videos.hanmi.HanmiUtil;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode;
import com.yeshi.buwan.videos.hanmi.entity.VideoHanmiMap;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Service
public class HanmiServiceImpl implements HanmiService {
    @Resource
    private HanmiShowDao hanmiShowDao;
    @Resource
    private HanmiShowEpisodeDao hanmiShowEpisodeDao;
    @Resource
    private VideoHanmiMapDao videoHanmiMapDao;
    @Resource
    private VideoInfoService videoInfoService;
    @Resource
    private VideoInfoDao videoInfoDao;
    @Resource
    private ResourceVideoService resourceVideoService;
    @Resource
    private CategoryVideoService categoryVideoService;
    @Resource
    private VideoResourceService videoResourceService;
    @Resource
    private AlbumVideoMapDao albumVideoMapDao;
    public List<VideoDetailInfo> getVideoDetailList(String videoId, int page, int pageSize) {
        //查询专辑
        VideoHanmiMap videoHanmiMap = videoHanmiMapDao.selectByVideoId(videoId);
        if (videoHanmiMap == null)
            return null;
        List<HanmiShowEpisode> list = hanmiShowEpisodeDao.listByShowId(videoHanmiMap.getShowId(), (page - 1) * pageSize, pageSize);
        List<VideoDetailInfo> detailInfoList = new ArrayList<>();
        if (list != null)
            for (HanmiShowEpisode a : list)
                detailInfoList.add(HanmiUtil.convertEpisodeToVideoDetail(a));
        return detailInfoList;
    }
    // 获取最新一集的详情
    public VideoDetailInfo getLatestVideoDetail(String videoId) {
        VideoHanmiMap videoHanmiMap = videoHanmiMapDao.selectByVideoId(videoId);
        if (videoHanmiMap == null)
            return null;
        HanmiShowEpisode episode = hanmiShowEpisodeDao.getLatestEpisode(videoHanmiMap.getShowId());
        if (episode != null)
            return HanmiUtil.convertEpisodeToVideoDetail(episode);
        return null;
    }
    @Override
    public void saveShow(HanmiShow show) {
        if (show.getCreateTime() == null) {
            show.setCreateTime(new Date());
        }
        show.setUpdateTime(new Date());
        hanmiShowDao.save(show);
        if (show.getEpisodeList() != null) {
            for (HanmiShowEpisode episode : show.getEpisodeList()) {
                if (episode.getShowId() == null) {
                    episode.setShowId(show.getId());
                }
                if (episode.getCreateTime() == null) {
                    episode.setCreateTime(new Date());
                }
                if (episode.getId() == null) {
                    episode.setId(HanmiShowEpisode.createId(show.getId(), episode.getTag()));
                }
//                if (hanmiShowEpisodeDao.get(episode.getId()) != null)
//                    continue;
                hanmiShowEpisodeDao.save(episode);
            }
        }
    }
    @Override
    public void addToVideoInfo(HanmiShow show) {
        if (StringUtil.isNullOrEmpty(show.getTitle())) {
            return;
        }
        VideoInfo newVideoInfo = convertShowToVideoInfo(show);
        VideoHanmiMap map = videoHanmiMapDao.selectByShowId(show.getId());
        if (map != null) {//渠道视频已经存在
            VideoInfo videoInfo = videoInfoService.getVideoInfo(map.getVideoId() + "");
            if (videoInfo == null)
                return;
            newVideoInfo.setId(videoInfo.getId());
            if (!newVideoInfo.getTag().equalsIgnoreCase(videoInfo.getTag()) || newVideoInfo.getVideocount() != videoInfo.getVideocount()) {
                newVideoInfo.setCreatetime(videoInfo.getCreatetime());
                //更新信息tag信息
                videoInfo.setLatestHpicture(newVideoInfo.getLatestHpicture());
                videoInfo.setLatestVpicture(newVideoInfo.getLatestVpicture());
                videoInfo.setVideocount(newVideoInfo.getVideocount());
                videoInfo.setTag(newVideoInfo.getTag());
                videoInfo.setPicture(newVideoInfo.getPicture());
                videoInfo.setHpicture(newVideoInfo.getHpicture());
                videoInfo.setVpicture(newVideoInfo.getVpicture());
                videoInfo.setShow(newVideoInfo.getShow());
                videoInfo.setVideoType(newVideoInfo.getVideoType());
                videoInfo.setUpdatetime(newVideoInfo.getUpdatetime());
                videoInfoDao.update(videoInfo);
            }
        } else {//视频不存在
            //判断2个视频实体是否为同一视频
            VideoInfo oldVideo = videoInfoService.getExistSameVideoWithTime(newVideoInfo);
            if (oldVideo == null) {
                //添加视频
                Serializable id = videoInfoDao.save(newVideoInfo);
                newVideoInfo.setId(id + "");
            } else {//为同一视频
                //更新tag
                newVideoInfo.setId(oldVideo.getId());
                oldVideo.setLatestHpicture(newVideoInfo.getLatestHpicture());
                oldVideo.setLatestVpicture(newVideoInfo.getLatestVpicture());
                oldVideo.setVideocount(newVideoInfo.getVideocount());
                oldVideo.setTag(newVideoInfo.getTag());
                oldVideo.setPicture(newVideoInfo.getPicture());
                oldVideo.setHpicture(newVideoInfo.getHpicture());
                oldVideo.setVpicture(newVideoInfo.getVpicture());
                oldVideo.setShow(newVideoInfo.getShow());
                oldVideo.setVideoType(newVideoInfo.getVideoType());
                oldVideo.setUpdatetime(newVideoInfo.getUpdatetime());
                videoInfoDao.update(oldVideo);
            }
            //加入专辑视频映射
            AlbumVideoMap vmap = new AlbumVideoMap();
            vmap.setId(newVideoInfo.getId());
            vmap.setCreateTime(new Date());
            vmap.setVideoId(newVideoInfo.getId());
            vmap.setRootVideoType(newVideoInfo.getVideoType().getId());
            vmap.setVideoCount(newVideoInfo.getVideocount());
            albumVideoMapDao.save(vmap);
            //加入映射
            VideoHanmiMap vi = new VideoHanmiMap();
            vi.setShowId(show.getId());
            vi.setVideoId(newVideoInfo.getId());
            videoHanmiMapDao.save(vi);
        }
        //添加视频来源映射
        resourceVideoService.addVideoResource(newVideoInfo.getId(), HanmiUtil.RESOURCE_ID + "");
        //添加视频分类映射
        categoryVideoService.addCategoryVideo(newVideoInfo.getId(), newVideoInfo.getVideoType().getId());
        //加入专辑搜索引擎
        CMQManager.getInstance().addSolrMsg(newVideoInfo.getId());
    }
    @Override
    public PlayUrl getPlayUrl(String detailSystemId, int resourceId, String id, String videoId) {
        HanmiShowEpisode album = hanmiShowEpisodeDao.get(id);
        VideoResource vr = videoResourceService.getResource(resourceId + "");
        int t = HanmiUtil.getPlayType(album);
        PlayUrl pu = new PlayUrl();
        pu.setParams("");
        pu.setPlayType(t);
        pu.setResource(vr);
        if (t == HanmiUtil.PLAY_NONE) {
            pu.setUrl("");
        } else if (t == HanmiUtil.PLAY_HTML || t == HanmiUtil.PLAY_SDK) {
            pu.setUrl(album.getPlayUrl());
        }
        return pu;
    }
    @Override
    public int getShowType(String videoid) {
        VideoHanmiMap map = videoHanmiMapDao.selectByVideoId(videoid);
        if (map != null) {
            HanmiShow show = hanmiShowDao.get(map.getShowId());
            if (show != null) {
                if ("韩剧".equalsIgnoreCase(show.getType())) {
                    return 2;
                }
            }
        }
        return 1;
    }
    @Override
    public VideoInfo convertShowToVideoInfo(HanmiShow show) {
        Calendar ca = Calendar.getInstance();
        ca.setTimeInMillis(TimeUtil.convertGernalTime(show.getRelaseDate(), "yyyy-MM-dd"));
        int day = ca.get(Calendar.DAY_OF_MONTH);
        int month = ca.get(Calendar.MONTH) + 1;
        int year = ca.get(Calendar.YEAR);
        VideoInfo video = new VideoInfo();
        video.setArea(show.getArea());
        video.setBaseurl(show.getUrl());
        video.setCanSave(false);
        video.setCommentCount(0);
        video.setCreatetime(System.currentTimeMillis());
        video.setDay(day + "");
        video.setYear(year + "");
        video.setMonth(month + "");
        video.setDirector(show.getDirector());
        video.setFinish("1");
        video.setIntroduction(show.getDesc());
        video.setMainActor(show.getActors());
        video.setName(show.getTitle());
        video.setNowNumber(show.getEpisodeList().size() + "");
        video.setOrderby("0" + "");
        video.setPicture(show.getPicture());
        video.setVpicture(show.getPicture());
        video.setScore(show.getScore());
        video.setShare("0");
        video.setShow("1");
        video.setThirdType("1");
        video.setTotalNumber("0");
        video.setWatchCount(0 + "");
        video.setAdmin(new AdminInfo("1"));
        video.setContentType(1);
        video.setCommentCount(0);
        String tag = show.getTag();
        video.setTag(tag);
        long videoCount = show.getEpisodeList().size();
        if (videoCount == 0L)
            videoCount = 1;
        video.setVideocount((int) videoCount);
        video.setUpdatetime(System.currentTimeMillis() + "");
        video.setVideoType(HanmiUtil.getVideoType(show));
        return video;
    }
    @Override
    public HanmiShow selectShowById(String id) {
        return hanmiShowDao.get(id);
    }
    @Override
    public long countById(String id) {
        return hanmiShowEpisodeDao.countByShowId(id);
    }
    @Override
    public void deleteByShowId(String id) {
        hanmiShowDao.delete(id);
        long count = hanmiShowEpisodeDao.countByShowId(id);
        int page = (int) count / 100 + 1;
        for (int i = 0; i < page; i++) {
            List<HanmiShowEpisode> episodes = hanmiShowEpisodeDao.listByShowId(id, i * 100, 100);
            for (HanmiShowEpisode episode : episodes) {
                hanmiShowEpisodeDao.delete(episode.getId());
            }
        }
        VideoHanmiMap bean = videoHanmiMapDao.selectByShowId(id);
        if (bean != null) {
            videoHanmiMapDao.delete(bean.getVideoId());
            //删除资源
            resourceVideoService.delete(bean.getVideoId() + "", HanmiUtil.RESOURCE_ID + "");
            resourceVideoService.delete(bean.getVideoId() + "", HanmiUtil.RESOURCE_ID + "");
        }
    }
    @Override
    public List<HanmiShow> listByIds(List<String> idsList) {
        return hanmiShowDao.listByIds(idsList);
    }
    @Override
    public HanmiShow getShowDetail(String id) {
        HanmiShow show = hanmiShowDao.get(id);
        if (show != null) {
            show.setEpisodeList(hanmiShowEpisodeDao.listByShowId(id, 0, 1000));
        }
        return show;
    }
}
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveCategoryChannelServiceImpl.java
@@ -49,7 +49,7 @@
    @Override
    public List<TVLiveChannel> listChannelByCid(String cid, String nameKey, int page, int pageSize) {
        //查询Map
        List<TVLiveCategoryChannelMap> mapList = tvLiveCategoryChannelMapDao.listByCid(cid, page, pageSize);
        List<TVLiveCategoryChannelMap> mapList = tvLiveCategoryChannelMapDao.listByCid(cid, (page-1)*pageSize, pageSize);
        if (mapList == null || mapList.size() == 0)
            return null;
        List<String> cids = new ArrayList<>();
@@ -84,5 +84,12 @@
        return tvLiveCategoryChannelMapDao.findList(query);
    }
    @Override
    public TVLiveCategoryChannelMap selectByCategoryIdAndChannelId(String categoryId, String channelId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("channelId").is(channelId).and("categoryId").is(categoryId));
        return tvLiveCategoryChannelMapDao.findOne(query);
    }
}
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveCategoryServiceImpl.java
@@ -8,6 +8,8 @@
import com.yeshi.buwan.service.inter.live.TVLiveCategoryService;
import com.yeshi.buwan.util.StringUtil;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -62,9 +64,9 @@
    }
    @Override
    public List<TVLiveCategory> list(String detailSystemId, String nameKey, int page, int pageSize) {
    public List<TVLiveCategory> list(String detailSystemId, String systemId, String nameKey, int page, int pageSize) {
        if (detailSystemId != null) {
            List<SuperTVLiveCategory> superTVLiveCategoryList = superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, page, pageSize);
            List<SuperTVLiveCategory> superTVLiveCategoryList = superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, (page - 1) * pageSize, pageSize);
            if (superTVLiveCategoryList == null || superTVLiveCategoryList.size() == 0)
                return null;
            List<String> cids = new ArrayList<>();
@@ -86,6 +88,7 @@
            return resultList;
        } else {
            TVLiveCategoryDao.DaoQuery daoQuery = new TVLiveCategoryDao.DaoQuery();
            daoQuery.systemId = systemId;
            daoQuery.start = (page - 1) * pageSize;
            daoQuery.count = pageSize;
            daoQuery.name = nameKey;
@@ -95,14 +98,33 @@
    }
    @Override
    public long count(String detailSystemId, String nameKey) {
    public long count(String detailSystemId, String systemId, String nameKey) {
        if (detailSystemId != null) {
            return superTVLiveCategoryDao.countByDetailSystemId(detailSystemId);
        } else {
            TVLiveCategoryDao.DaoQuery daoQuery = new TVLiveCategoryDao.DaoQuery();
            daoQuery.name = nameKey;
            daoQuery.systemId = systemId;
            return tvLiveCategoryDao.count(daoQuery);
        }
    }
    @Override
    public List<TVLiveCategory> listByIds(List<String> idList) {
        Criteria[] ors = new Criteria[idList.size()];
        for (int i = 0; i < idList.size(); i++) {
            ors[i] = Criteria.where("_id").is(idList.get(i));
        }
        Query query = new Query();
        query.addCriteria(new Criteria().orOperator(ors));
        return tvLiveCategoryDao.findList(query);
    }
    @Override
    public List<SuperTVLiveCategory> listSuper(String detailSystemId, int page, int pageSize) {
        return superTVLiveCategoryDao.listByDetailSystemId(detailSystemId, (page - 1) * pageSize, pageSize);
    }
    @Override
@@ -135,4 +157,16 @@
        if (sc != null)
            deleteSuperCategory(sc.getId());
    }
    @Override
    public List<SuperTVLiveCategory> listSuper(String cid) {
        return superTVLiveCategoryDao.listByCid(cid);
    }
    @Override
    public TVLiveCategory selectCategoryBuPrimaryKey(String id) {
        return tvLiveCategoryDao.get(id);
    }
}
src/main/java/com/yeshi/buwan/service/imp/live/TVLiveChannelServiceImpl.java
@@ -88,4 +88,5 @@
        daoQuery.name = name;
        return tvLiveChannelDao.count(daoQuery);
    }
}
src/main/java/com/yeshi/buwan/service/imp/recommend/HomeVideoServiceImpl.java
@@ -112,8 +112,9 @@
    }
    private List<HomeVideo> betchInternetVideos(List<HomeVideo> homeVideoList) {
        for (HomeVideo hv : homeVideoList) {
    private List<HomeVideo> betchInternetVideos(List<HomeVideo> homeVideoList, List<Long> resourceIds) {
        for (int i = 0; i < homeVideoList.size(); i++) {
            HomeVideo hv = homeVideoList.get(i);
            if (hv == null || hv.getVideo() != null || StringUtil.isNullOrEmpty(hv.getVideoId())) {
                continue;
            }
@@ -122,15 +123,28 @@
            }
            InternetSearchVideo internetSearchVideo = internetSearchVideoService.selectByPrimaryKeyCache(hv.getVideoId());
            if (internetSearchVideo != null) {
                hv.setVideo(VideoInfoFactory.create(internetSearchVideo));
                String[] rids = internetSearchVideo.getResourceIds().split(",");
                List<Long> ridList = new ArrayList<>();
                for (String rid : rids) {
                    ridList.add(Long.parseLong(rid));
                }
                ridList.retainAll(resourceIds);
                if (ridList.size() > 0)
                    hv.setVideo(VideoInfoFactory.create(internetSearchVideo));
                else {
                    homeVideoList.remove(i);
                    i--;
                }
            }
        }
        return homeVideoList;
    }
    private List<HomeVideo> betchShortVideos(List<HomeVideo> homeVideoList) {
        for (HomeVideo hv : homeVideoList) {
    private List<HomeVideo> betchShortVideos(List<HomeVideo> homeVideoList, List<Long> resourceIds) {
        for (int i = 0; i < homeVideoList.size(); i++) {
            HomeVideo hv = homeVideoList.get(i);
            if (hv == null || hv.getVideo() != null || StringUtil.isNullOrEmpty(hv.getVideoId())) {
                continue;
            }
@@ -140,7 +154,13 @@
            SolrShortVideo shortVideo = solrShortVideoDataManager.findOne(hv.getVideoId());
            if (shortVideo != null) {
                hv.setVideo(VideoInfoFactory.create(shortVideo));
                Long rid = Long.parseLong(shortVideo.getResourceId() + "");
                if (resourceIds.contains(rid)) {
                    hv.setVideo(VideoInfoFactory.create(shortVideo));
                } else {
                    homeVideoList.remove(i);
                    i--;
                }
            }
        }
@@ -180,8 +200,8 @@
        });
        List<VideoInfo> videoInfoList = new ArrayList<>();
        homeVideos = betchInternetVideos(homeVideos);
        homeVideos = betchShortVideos(homeVideos);
        homeVideos = betchInternetVideos(homeVideos, resourceIds);
        homeVideos = betchShortVideos(homeVideos, resourceIds);
        for (int i = 0; i < homeVideos.size(); i++) {
            if (homeVideos.get(i).getVideo() == null) {
                homeVideos.remove(i);
@@ -197,7 +217,7 @@
            }
        }
        videoInfoExtraService.batchExtra(videoInfoList, resourceIds);
        return betchInternetVideos(homeVideos);
        return betchInternetVideos(homeVideos, resourceIds);
    }
    @Override
src/main/java/com/yeshi/buwan/service/imp/search/SearchSpecialServiceImpl.java
@@ -79,7 +79,7 @@
            throw new Exception("参数不完整");
        }
        if (special.getAlbumQuery() == null && special.getInternetQuery() == null && special.getShortQuery() == null) {
        if (special.getContainerList() == null || special.getContainerList().size() == 0) {
            throw new Exception("搜索条件不能都为空");
        }
src/main/java/com/yeshi/buwan/service/inter/juhe/HanmiService.java
New file
@@ -0,0 +1,83 @@
package com.yeshi.buwan.service.inter.juhe;
import com.yeshi.buwan.domain.VideoDetailInfo;
import com.yeshi.buwan.domain.VideoInfo;
import com.yeshi.buwan.domain.entity.PlayUrl;
import com.yeshi.buwan.exception.video.IqiyiVideoSolrException;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.iqiyi.entity.IqiyiAlbum2;
import java.util.List;
public interface HanmiService {
    /**
     * 获取视频详情
     *
     * @param videoId
     * @return
     */
    public List<VideoDetailInfo> getVideoDetailList(String videoId, int page, int pageSize);
    /**
     * 获取最新一集的详情
     *
     * @param videoId
     * @return
     */
    public VideoDetailInfo getLatestVideoDetail(String videoId);
    /**
     * 保存专辑
     *
     * @param show
     */
    public void saveShow(HanmiShow show);
    /**
     * 将专辑添加到视频
     *
     * @param show
     */
    public void addToVideoInfo(HanmiShow show);
    public PlayUrl getPlayUrl(String detailSystemId, int resourceId, String id, String videoId);
    public int getShowType(String videoid);
    public VideoInfo convertShowToVideoInfo(HanmiShow show);
    public HanmiShow selectShowById(String id);
    public long countById(String id);
    /**
     * 根据专辑ID删除
     *
     * @param id
     */
    public void deleteByShowId(String id);
    /**
     * 根据ID查询
     *
     * @param idsList
     * @return
     */
    public List<HanmiShow> listByIds(List<String> idsList);
    /**
     * 韩迷show详情
     *
     * @param id
     * @return
     */
    public HanmiShow getShowDetail(String id);
}
src/main/java/com/yeshi/buwan/service/inter/live/TVLiveCategoryChannelService.java
@@ -32,4 +32,6 @@
    public List<TVLiveCategoryChannelMap> listByChannelId(String channelId);
    public TVLiveCategoryChannelMap selectByCategoryIdAndChannelId(String categoryId, String channelId);
}
src/main/java/com/yeshi/buwan/service/inter/live/TVLiveCategoryService.java
@@ -23,14 +23,22 @@
     * 列表查询
     *
     * @param detailSystemId
     * @param systemId
     * @param nameKey
     * @param page
     * @param pageSize
     * @return
     */
    public List<TVLiveCategory> list(String detailSystemId, String nameKey, int page, int pageSize);
    public List<TVLiveCategory> list(String detailSystemId, String systemId, String nameKey, int page, int pageSize);
    public long count(String detailSystemId, String nameKey);
    public long count(String detailSystemId, String systemId, String nameKey);
    public List<TVLiveCategory> listByIds(List<String> idList);
    public List<SuperTVLiveCategory> listSuper(String detailSystemId, int page, int pageSize);
    //系统分类映射
@@ -47,4 +55,9 @@
    public void deleteSuperCategory(String categoryId, String detailSystemId);
    public List<SuperTVLiveCategory> listSuper(String cid);
    public TVLiveCategory selectCategoryBuPrimaryKey(String id);
}
src/main/java/com/yeshi/buwan/service/manager/search/SolrShortVideoDataManager.java
@@ -6,9 +6,9 @@
import com.yeshi.buwan.domain.solr.SolrShortVideo;
import com.yeshi.buwan.dto.search.SolrResultDTO;
import com.yeshi.buwan.dto.search.SolrShortVideoSearchFilter;
import com.yeshi.buwan.iqiyi.util.IqiyiUtil;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.video.VideoUtil;
import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil2;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -170,7 +170,7 @@
                return null;
            PlayUrl pu = new PlayUrl();
            pu.setParams("");
            pu.setPlayType(IqiyiUtil.PLAY_HTML);
            pu.setPlayType(IqiyiUtil2.PLAY_HTML);
            pu.setResource(videoResource);
            pu.setUrl(solrShortVideo.getPlayUrl());
            return pu;
src/main/java/com/yeshi/buwan/util/video/VideoDetailUtil.java
@@ -6,6 +6,7 @@
import com.yeshi.buwan.domain.entity.PlayUrl;
import com.yeshi.buwan.videos.funtv.FunTVUtil;
import com.yeshi.buwan.videos.funtv.FunTVUtil2;
import com.yeshi.buwan.videos.hanmi.HanmiUtil;
import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil;
import com.yeshi.buwan.videos.iqiyi.util.IqiyiUtil2;
import com.yeshi.buwan.videos.mogotv.MogoTVUtil;
@@ -86,6 +87,9 @@
    @Resource
    private BilibiliVideoService bilibiliVideoService;
    @Resource
    private HanmiService hanmiService;
    @Resource
    private BilibiliUtil bilibiliUtil;
@@ -232,6 +236,8 @@
                return tencentVideoService.getVideoDetailList(videoid, page, pageSize);
            case BilibiliUtil.RESOURCE_ID:
                return bilibiliVideoService.getVideoDetailList(videoid, page, pageSize);
            case HanmiUtil.RESOURCE_ID:
                return hanmiService.getVideoDetailList(videoid, page, pageSize);
            default:
                return null;
        }
@@ -255,6 +261,8 @@
                return soHuService.getLatestVideoDetail(videoid);
            case MogoTVUtil.RESOURCE_ID:
                return soHuService.getLatestVideoDetail(videoid);
            case HanmiUtil.RESOURCE_ID:
                return hanmiService.getLatestVideoDetail(videoid);
            default:
                return null;
        }
@@ -275,6 +283,8 @@
                return soHuUtil.getShowType(videoid);
            case YouKuUtil.RESOURCE_ID:
                return soHuUtil.getShowType(videoid);
            case HanmiUtil.RESOURCE_ID:
                return hanmiService.getShowType(videoid);
            default:
                return 1;
        }
@@ -316,6 +326,8 @@
                return tencentVideoUtil.getPlayUrl(detailSystemId, id, type, resourceid, videoid);
            case BilibiliUtil.RESOURCE_ID:
                return bilibiliUtil.getPlayUrl(detailSystemId, id, type, resourceid, videoid);
            case HanmiUtil.RESOURCE_ID:
                return hanmiService.getPlayUrl(detailSystemId, resourceid, id, videoid);
            default:
                return null;
        }
src/main/java/com/yeshi/buwan/videos/hanmi/HanmiApiUtil.java
@@ -1,18 +1,15 @@
package com.yeshi.buwan.videos.hanmi;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
public class HanmiApiUtil {
@@ -22,20 +19,49 @@
        return parseShowDetail(show);
    }
    private static Map<String, String> getHeaders() {
        Map<String, String> headers = new HashMap<>();
        headers.put("sec-fetch-dest", "document");
        headers.put("sec-fetch-mode", "navigate");
        headers.put("sec-fetch-site", "same-origin");
        headers.put("sec-fetch-user", "?1");
        headers.put("upgrade-insecure-requests", "1");
        return headers;
    }
    private static Document getDoc(String link, Map<String, String> headres) throws IOException {
        Connection connection = Jsoup.connect(link).timeout(60000);
        if (headres != null)
            for (Iterator<String> its = headres.keySet().iterator(); its.hasNext(); ) {
                String key = its.next();
                connection = connection.header(key, headres.get(key));
            }
        Document doc = connection
                .userAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1").get();
        return doc;
    }
    public static HanmiShow parseShowDetail(HanmiShow show) throws Exception {
        if (show.getUrl() == null || !show.getUrl().startsWith("https://www.hmtv.me/show/")) {
            throw new Exception("链接不合法");
        }
        Document doc = Jsoup.connect(show.getUrl()).timeout(60000).referrer("https://www.hmtv.me/hanju").userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36").get();
        Document doc = getDoc(show.getUrl(), getHeaders());
        Element root = doc.getElementsByClass("video-content").get(0);
        Element titleItem = root.getElementsByClass("article-title").get(0);
        //标题
        String title = titleItem.getElementsByClass("item-title").get(0).ownText();
        String title = null;
        try {
            title = titleItem.getElementsByClass("item-title").get(0).ownText();
        } catch (IndexOutOfBoundsException e) {
        }
        String year = titleItem.getElementsByClass("item-year").get(0).ownText();
        String year = null;
        try {
            year = titleItem.getElementsByClass("item-year").get(0).ownText();
        } catch (IndexOutOfBoundsException e) {
        }
        //节目信息
        Element videoBox = root.getElementsByClass("video_box").get(0);
@@ -57,14 +83,34 @@
        Element eposide = root.getElementsByClass("video_list_li").get(0);
        Elements eposides = eposide.getElementsByTag("a");
        List<HanmiShowEpisode> episodeList = new ArrayList<>();
        for (int i = 0; i < eposides.size(); i++) {
            String href = eposides.get(i).attr("href");
            String tag = eposides.get(i).ownText();
        //电影
        if (show.getType() != null && show.getType().contains("影")) {
            int index = 0;
//            for (int i = 0; i < eposides.size(); i++) {
//                String tag = eposides.get(i).ownText();
//                if (tag.contains("HD")) {
//                    index = i;
//                    break;
//                }
//            }
            String href = eposides.get(index).attr("href");
            HanmiShowEpisode ep = new HanmiShowEpisode();
            ep.setOrderBy(i + 1);
            ep.setOrderBy(0);
            ep.setPlayUrl("https://www.hmtv.me" + href);
            ep.setTag(tag);
            ep.setTag(show.getTitle() != null ? show.getTitle() : title);
            episodeList.add(ep);
        } else {
            for (int i = 0; i < eposides.size(); i++) {
                String href = eposides.get(i).attr("href");
                String tag = eposides.get(i).ownText();
                HanmiShowEpisode ep = new HanmiShowEpisode();
                ep.setOrderBy(i + 1);
                ep.setPlayUrl("https://www.hmtv.me" + href);
                ep.setTag(tag);
                episodeList.add(ep);
            }
        }
        //简介
@@ -73,10 +119,12 @@
        if (show.getTitle() == null)
            show.setTitle(title.split(" ")[0]);
        show.setYear(year.replace("(", "").replace(")", ""));
        show.setPicture(picture);
        if (infos.get("主演") != null)
            show.setActors(infos.get("主演").replace("/", ","));
            show.setActors(infos.get("主演").
                    replace("/", ","));
        if (infos.get("导演") != null)
            show.setDirector(infos.get("导演"));
        if (infos.get("类型") != null)
@@ -84,9 +132,39 @@
        if (infos.get("国家/地区") != null)
            show.setArea(infos.get("国家/地区"));
        if (infos.get("首播") != null)
            show.setRelaseDate(infos.get("首播").substring(0, infos.get("首播").indexOf("(") > -1 ? infos.get("首播").indexOf("(") : infos.get("首播").length()));
            show.setRelaseDate(infos.get("首播").
        show.setId(show.getUrl().replace("https://www.hmtv.me/show/", "").trim());
                    substring(0, infos.get("首播").
                            indexOf("(") > -1 ? infos.get("首播").
                            indexOf("(") : infos.get("首播").
                            length()));
        if (infos.get("上映日期") != null)
            show.setRelaseDate(infos.get("上映日期").
                    substring(0, infos.get("上映日期").
                            indexOf("(") > -1 ? infos.get("上映日期").
                            indexOf("(") : infos.get("上映日期").
                            length()));
        if (year == null && show.getRelaseDate() != null) {
            year = show.getRelaseDate().split("-")[0];
        }
        show.setYear(year.replace("(", "").
                replace(")", ""));
        show.setId(show.getUrl().
                replace("https://www.hmtv.me/show/", "").
                trim());
        show.setEpisodeList(episodeList);
        show.setUrl(show.getUrl());
        show.setDesc(desc.trim());
@@ -95,8 +173,18 @@
    public static List<HanmiShow> parseList(String listUrl) throws IOException {
        Map<String, String> headers = new HashMap<>();
        headers.put("sec-fetch-dest", "document");
        headers.put("sec-fetch-mode", "navigate");
        headers.put("sec-fetch-site", "same-origin");
        headers.put("sec-fetch-user", "?1");
        headers.put("upgrade-insecure-requests", "1");
        List<HanmiShow> list = new ArrayList<>();
        Document doc = Jsoup.connect(listUrl).timeout(60000).referrer("https://www.hmtv.me/hanju").userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36").get();
        Document doc = getDoc(listUrl, headers);
        String type = doc.getElementsByClass("list-content").get(0).getElementsByClass("title").get(0).getElementsByTag("strong").text();
        Element root = doc.getElementsByClass("m-movies").get(0);
        Elements items = root.getElementsByClass("u-movie");
        for (int i = 0; i < items.size(); i++) {
@@ -110,11 +198,53 @@
                show.setScore(score);
            }
            show.setTitle(item.getElementsByTag("h2").get(0).getElementsByTag("a").get(0).ownText());
            show.setType(type);
            show.setId(show.getUrl().
                    replace("https://www.hmtv.me/show/", "").
                    trim());
            list.add(show);
        }
        return list;
    }
    /**
     * 根据链接获取剧集
     *
     * @param playUrl
     * @return
     */
    public static List<HanmiShowEpisode> getShowEpisodesFromPlayUrl(String playUrl) throws IOException {
        List<HanmiShowEpisode> episodeList = new ArrayList<>();
        Document doc = getDoc(playUrl, null);
        Element els = doc.getElementById("playnav");
        Elements items = els.getElementsByTag("li");
        int playIndex = -1;
        for (int i = 0; i < items.size(); i++) {
            String name = items.get(i).text();
            if (name.contains("HM")) {
                playIndex = i;
                break;
            }
        }
        if (playIndex < 0)
            return null;
        Element tab = doc.getElementById("playcontainer").getElementsByClass("tab").get(playIndex);
        Elements es = tab.getElementsByTag("a");
        for (int i = 0; i < es.size(); i++) {
            HanmiShowEpisode episode = new HanmiShowEpisode();
            String href = "https://www.hmtv.me" + es.get(i).attr("href");
            String name = es.get(i).text();
            episode.setTag(name);
            episode.setPlayUrl(href);
            episode.setOrderBy(i + 1);
            episodeList.add(episode);
        }
        return episodeList;
    }
    public static List<HanmiShow> parseDetailList(List<HanmiShow> showList) throws Exception {
        List<HanmiShow> list = new ArrayList<>();
@@ -129,7 +259,8 @@
    }
    public static void main(String[] args) throws Exception {
        parseDetailList(parseList("https://www.hmtv.me/hanju"));
        List<HanmiShowEpisode> list = getShowEpisodesFromPlayUrl("https://www.hmtv.me/vplay/MTExNS0xLTA=.html");
        System.out.println(list);
    }
}
src/main/java/com/yeshi/buwan/videos/hanmi/HanmiUtil.java
New file
@@ -0,0 +1,75 @@
package com.yeshi.buwan.videos.hanmi;
import com.yeshi.buwan.domain.AdminInfo;
import com.yeshi.buwan.domain.VideoDetailInfo;
import com.yeshi.buwan.domain.VideoType;
import com.yeshi.buwan.service.inter.juhe.HanmiService;
import com.yeshi.buwan.util.video.VideoConstant;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
public class HanmiUtil {
    private final Logger logger = LoggerFactory.getLogger("HanmiUtil");
    public final static int PLAY_NONE = 0;// 不能播放
    public final static int PLAY_HTML = 1;// 跳转移动端网页播放
    public final static int PLAY_SDK = 2;// 嵌套网页播放
    public final static int RESOURCE_ID = 28;
    public final static String RESOURCE_NAME = "韩迷TV";
    @Resource
    private HanmiService hanmiService;
    private void saveShow(List<HanmiShow> list) {
        if (list == null)
            return;
        for (HanmiShow show : list)
            hanmiService.saveShow(show);
    }
    public static VideoType getVideoType(HanmiShow show) {
        switch (show.getType()) {
            case "韩剧":
                return new VideoType(VideoConstant.VIDEO_CATEGORY_DIANSHIJU);
            case "韩综":
            case "综艺":
                return new VideoType(VideoConstant.VIDEO_CATEGORY_ZONGYI);
            case "韩影":
            case "电影":
                return new VideoType(VideoConstant.VIDEO_CATEGORY_DIANYING);
        }
        return null;
    }
    public static VideoDetailInfo convertEpisodeToVideoDetail(HanmiShowEpisode episode) {
        VideoDetailInfo vi = new VideoDetailInfo();
        vi.setAdmin(new AdminInfo("1"));
        vi.setId(null);
        vi.setIntroduction("");
        vi.setExtraId(episode.getId());
        vi.setName(episode.getTag());
        vi.setTag(episode.getTag());
        vi.setType("album");
        return vi;
    }
    public static int getPlayType(HanmiShowEpisode album) {
        int type = PLAY_SDK;
        return type;
    }
}
src/main/java/com/yeshi/buwan/videos/hanmi/entity/HanmiShowEpisode.java
@@ -1,5 +1,6 @@
package com.yeshi.buwan.videos.hanmi.entity;
import com.yeshi.buwan.util.StringUtil;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -19,7 +20,7 @@
    public static String createId(String showId, String tag) {
        return showId + "#" + tag;
        return StringUtil.Md5(showId + "#" + tag);
    }
src/main/java/com/yeshi/buwan/videos/hanmi/entity/VideoHanmiMap.java
New file
@@ -0,0 +1,44 @@
package com.yeshi.buwan.videos.hanmi.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Document(collection = "videoHanmiMap")
public class VideoHanmiMap {
    public VideoHanmiMap() {
    }
    @Id
    private String videoId;
    @Indexed
    private String showId;
    private Date createTime;
    public String getVideoId() {
        return videoId;
    }
    public void setVideoId(String videoId) {
        this.videoId = videoId;
    }
    public String getShowId() {
        return showId;
    }
    public void setShowId(String showId) {
        this.showId = showId;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}
src/main/java/com/yeshi/buwan/vo/AcceptData.java
@@ -17,6 +17,12 @@
    private String Package;
    private String uid;
    private String utdId;
    private String childPackage;
    //注入detailSystem
    private DetailSystem detailSystem;
    //注入childDetailSystem
    private DetailSystem childDetailSystem;
    public String getUtdId() {
        return utdId;
@@ -26,8 +32,7 @@
        this.utdId = utdId;
    }
    //注入detailSystem
    private DetailSystem detailSystem;
    public DetailSystem getDetailSystem() {
@@ -151,4 +156,20 @@
    public void setPackage(String aPackage) {
        Package = aPackage;
    }
    public String getChildPackage() {
        return childPackage;
    }
    public void setChildPackage(String childPackage) {
        this.childPackage = childPackage;
    }
    public DetailSystem getChildDetailSystem() {
        return childDetailSystem;
    }
    public void setChildDetailSystem(DetailSystem childDetailSystem) {
        this.childDetailSystem = childDetailSystem;
    }
}
src/main/java/com/yeshi/buwan/vo/tvlive/TVLiveChannelVO.java
New file
@@ -0,0 +1,75 @@
package com.yeshi.buwan.vo.tvlive;
import com.yeshi.buwan.domain.live.TVLiveChannel;
import com.yeshi.buwan.util.StringUtil;
public class TVLiveChannelVO {
    private String id;
    private String name;
    private String picture;
    private String nowProgram;
    private String nextProgram;
    public static TVLiveChannelVO create(TVLiveChannel tvLiveChannel) {
        TVLiveChannelVO vo = new TVLiveChannelVO();
        vo.setId(tvLiveChannel.getId());
        vo.setName(tvLiveChannel.getName());
        vo.setPicture(tvLiveChannel.gethPicture());
        if (!StringUtil.isNullOrEmpty(tvLiveChannel.getNowProgram()) && !StringUtil.isNullOrEmpty(tvLiveChannel.getNowProgramTime())) {
            vo.setNowProgram(tvLiveChannel.getNowProgramTime() + " " + tvLiveChannel.getNowProgram());
        } else {
            vo.setNowProgram("暂无节目信息");
        }
        if (!StringUtil.isNullOrEmpty(tvLiveChannel.getNextProgram()) && !StringUtil.isNullOrEmpty(tvLiveChannel.getNextProgramTime())) {
            vo.setNowProgram(tvLiveChannel.getNextProgramTime() + " " + tvLiveChannel.getNextProgram());
        } else {
            vo.setNowProgram("暂无节目信息");
        }
        return vo;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPicture() {
        return picture;
    }
    public void setPicture(String picture) {
        this.picture = picture;
    }
    public String getNowProgram() {
        return nowProgram;
    }
    public void setNowProgram(String nowProgram) {
        this.nowProgram = nowProgram;
    }
    public String getNextProgram() {
        return nextProgram;
    }
    public void setNextProgram(String nextProgram) {
        this.nextProgram = nextProgram;
    }
}
src/main/resources/consumer.xml
@@ -9,9 +9,9 @@
        <dubbo:parameter key="qos.port" value="33333"></dubbo:parameter>
    </dubbo:application>
    <dubbo:registry address="zookeeper://172.16.16.46:2181"/>
    <!--<dubbo:registry address="zookeeper://172.16.16.46:2181"/>-->
    <!--<dubbo:registry address="zookeeper://193.112.35.168:2182"/>-->
    <dubbo:registry address="zookeeper://193.112.35.168:2182"/>
    <dubbo:annotation package="com"/>
src/main/webapp/admin/new/fenqu.html
@@ -142,6 +142,7 @@
                <option value="22">爱奇艺2</option>
                <option value="21">Acfun</option>
                <option value="25">PPTV</option>
                <option value="28">韩迷TV</option>
            </select>
src/main/webapp/admin/new/js/navsetting.xml
@@ -1,177 +1,192 @@
<?xml version="1.0" encoding="UTF-8"?>
<nav>
    <topNav url="shuju.html" name="数据">
        <!--二级菜单下面的东西 -->
        <secondNav url="shuju.html" name="数据汇总">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="shuju_play.html" name="播放数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_register.html" name="注册数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_comment.html" name="评论数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_search.html" name="搜索数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_attention.html" name="关注数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_collect.html" name="收藏数据">
            <!-- 网页链接 -->
        </secondNav>
    </topNav>
    <topNav url="tuijian-lanmuneirong.html" name="推荐">
        <!--二级菜单下面的东西 -->
    <topNav url="shuju.html" name="数据">
        <!--二级菜单下面的东西 -->
        <secondNav url="shuju.html" name="数据汇总">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="shuju_play.html" name="播放数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_register.html" name="注册数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_comment.html" name="评论数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_search.html" name="搜索数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_attention.html" name="关注数据">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="shuju_collect.html" name="收藏数据">
            <!-- 网页链接 -->
        </secondNav>
    </topNav>
    <topNav url="tuijian-lanmuneirong.html" name="推荐">
        <!--二级菜单下面的东西 -->
        <secondNav url="tuijian-home-labels.html" name="顶部标签">
            <!-- 网页链接 -->
            <url>add-tuijian-home-labels.html</url>
            <url>edit-tuijian-home-labels.html</url>
            <url>tuijian-home-labels.html</url>
        </secondNav>
        <secondNav url="tuijian-home-labels.html" name="顶部标签">
            <!-- 网页链接 -->
            <url>add-tuijian-home-labels.html</url>
            <url>edit-tuijian-home-labels.html</url>
            <url>tuijian-home-labels.html</url>
        </secondNav>
        <secondNav url="tuijian-lanmuneirong.html" name="栏目内容">
            <!-- 网页链接 -->
            <url>add-lmneirong.html</url>
            <url>edit-lmneirong.html</url>
            <url>tuijian-lanmuneirong.html</url>
            <url>tuijian-lanmuneirong-videos.html</url>
        <secondNav url="tuijian-lanmuneirong.html" name="栏目内容">
            <!-- 网页链接 -->
            <url>add-lmneirong.html</url>
            <url>edit-lmneirong.html</url>
            <url>tuijian-lanmuneirong.html</url>
            <url>tuijian-lanmuneirong-videos.html</url>
        </secondNav>
        <secondNav url="tuijian-banner.html" name="推荐Banner">
            <!-- 网页链接 -->
            <url>add-banner.html</url>
            <url>edit-banner.html</url>
        </secondNav>
        <secondNav url="tuijian-sousuopb.html" name="搜索屏蔽">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="HotSearch.html" name="热门搜索">
            <!-- 网页链接 -->
            <url>add-hotSearch.html</url>
        </secondNav>
    </topNav>
    <topNav url="fenqu.html" name="分区">
        <!--二级菜单下面的东西 -->
        <secondNav url="fenqu.html" name="分区视频">
            <!-- 网页链接 -->
            <url>add-fqmovie.html</url>
        </secondNav>
        <secondNav url="fenqu-banner.html" name="分区banner">
            <!-- 网页链接 -->
            <url>add-fenqubanner.html</url>
            <url>edit-recommend-banner.html</url>
        </secondNav>
        <secondNav url="topManage.html" name="榜首管理">
            <url>edit-top.html</url>
        </secondNav>
        <secondNav url="shiping-fenlei.html" name="视频分类">
            <url>shiping-fenlei.html</url>
            <url>add-shipingfenlei.html</url>
            <url>edit-shipingfenlei.html</url>
            <url>areaList.html</url>
            <url>edit-area.html</url>
        </secondNav>
        <secondNav url="banquanshiping.html" name="版权视频">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        </secondNav>
        <secondNav url="tuijian-banner.html" name="推荐Banner">
            <!-- 网页链接 -->
            <url>add-banner.html</url>
            <url>edit-banner.html</url>
        </secondNav>
        <secondNav url="tuijian-sousuopb.html" name="搜索屏蔽">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="HotSearch.html" name="热门搜索">
            <!-- 网页链接 -->
            <url>add-hotSearch.html</url>
        </secondNav>
    </topNav>
    <topNav url="fenqu.html" name="分区">
        <!--二级菜单下面的东西 -->
        <secondNav url="fenqu.html" name="分区视频">
            <!-- 网页链接 -->
            <url>add-fqmovie.html</url>
        </secondNav>
        <secondNav url="fenqu-banner.html" name="分区banner">
            <!-- 网页链接 -->
            <url>add-fenqubanner.html</url>
            <url>edit-recommend-banner.html</url>
        </secondNav>
        <secondNav url="topManage.html" name="榜首管理">
            <url>edit-top.html</url>
        </secondNav>
        <secondNav url="shiping-fenlei.html" name="视频分类">
            <url>shiping-fenlei.html</url>
            <url>add-shipingfenlei.html</url>
            <url>edit-shipingfenlei.html</url>
            <url>areaList.html</url>
            <url>edit-area.html</url>
        </secondNav>
        <secondNav url="banquanshiping.html" name="版权视频">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="fenqu-search-special-position.html" name="搜索专题位置">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="fenqu-search-special-position.html" name="搜索专题位置">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="fenqu-search-special.html" name="搜索专题">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="fenqu-search-special.html" name="搜索专题">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
    </topNav>
    </topNav>
    <topNav url="vip-user-list.html" name="用户">
        <!--二级菜单下面的东西 -->
        <secondNav url="vip-user-list.html" name="会员列表">
            <!-- 网页链接 -->
            <url>add-zhuanti.html</url>
        </secondNav>
        <secondNav url="vip-order-list.html" name="会员订单">
            <!-- 网页链接 -->
            <url>add-star.html</url>
        </secondNav>
    </topNav>
    <topNav url="vip-user-list.html" name="用户">
        <!--二级菜单下面的东西 -->
        <secondNav url="vip-user-list.html" name="会员列表">
            <!-- 网页链接 -->
            <url>add-zhuanti.html</url>
        </secondNav>
        <secondNav url="vip-order-list.html" name="会员订单">
            <!-- 网页链接 -->
            <url>add-star.html</url>
        </secondNav>
    </topNav>
    <topNav url="faxian.html" name="发现">
        <!--二级菜单下面的东西 -->
        <secondNav url="faxian.html" name="专题合辑">
            <!-- 网页链接 -->
            <url>add-zhuanti.html</url>
        </secondNav>
        <secondNav url="faxian-star.html" name="明星合辑">
            <!-- 网页链接 -->
            <url>add-star.html</url>
        </secondNav>
        <secondNav url="faxian-shop.html" name="发现商品">
            <!-- 网页链接 -->
        </secondNav>
    <topNav url="faxian.html" name="发现">
        <!--二级菜单下面的东西 -->
        <secondNav url="faxian.html" name="专题合辑">
            <!-- 网页链接 -->
            <url>add-zhuanti.html</url>
        </secondNav>
        <secondNav url="faxian-star.html" name="明星合辑">
            <!-- 网页链接 -->
            <url>add-star.html</url>
        </secondNav>
        <secondNav url="faxian-shop.html" name="发现商品">
            <!-- 网页链接 -->
        </secondNav>
        <secondNav url="comment-list.html" name="评论管理">
            <!-- 网页链接 -->
        </secondNav>
    </topNav>
    <topNav url="shezhi.html" name="设置">
        <!--二级菜单下面的东西 -->
        <secondNav url="shezhi.html" name="TOP通知栏">
            <!-- 网页链接 -->
            <url>add-toptongzhi.html</url>
            <url>edit-toptongzhi.html</url>
        </secondNav>
        <secondNav url="send-message.html" name="消息推送">
            <url></url>
        </secondNav>
        <secondNav url="share.html" name="分享内容">
            <!-- 网页链接 -->
            <url>add-share.html</url>
        </secondNav>
        <secondNav url="production.html" name="产品信息">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="systemlist.html" name="系统列表">
            <!-- 网页链接 -->
            <url>add-system.html</url>
        </secondNav>
        <secondNav url="systemcanshu.html" name="系统参数">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="comment-list.html" name="评论管理">
            <!-- 网页链接 -->
        </secondNav>
    </topNav>
        <secondNav url="iqiyi-update.html" name="爱奇艺专辑更新">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
    <topNav url="tvlive_category_list.html" name="电视直播">
        <!--二级菜单下面的东西 -->
        <secondNav url="tvlive_category_list.html" name="直播分类">
            <!-- 网页链接 -->
            <url>tvlive_category_add.html</url>
            <url>tvlive_category_update.html</url>
            <url>tvlive_category_channel_list.html</url>
        </secondNav>
        <secondNav url="tvlive_channel_list.html" name="频道列表">
            <!-- 网页链接 -->
            <url>tvlive_channel_add.html</url>
        </secondNav>
    </topNav>
        <secondNav url="add-bilibili-video.html" name="B站视频更新">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
    <topNav url="shezhi.html" name="设置">
        <!--二级菜单下面的东西 -->
        <secondNav url="shezhi.html" name="TOP通知栏">
            <!-- 网页链接 -->
            <url>add-toptongzhi.html</url>
            <url>edit-toptongzhi.html</url>
        </secondNav>
        <secondNav url="send-message.html" name="消息推送">
            <url></url>
        </secondNav>
        <secondNav url="share.html" name="分享内容">
            <!-- 网页链接 -->
            <url>add-share.html</url>
        </secondNav>
        <secondNav url="production.html" name="产品信息">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="systemlist.html" name="系统列表">
            <!-- 网页链接 -->
            <url>add-system.html</url>
        </secondNav>
        <secondNav url="systemcanshu.html" name="系统参数">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="ad-update.html" name="广告设置">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="iqiyi-update.html" name="爱奇艺专辑更新">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="add-bilibili-video.html" name="B站视频更新">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="ad-update.html" name="广告设置">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="cache-update.html" name="清除缓存">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
        <secondNav url="cache-update.html" name="清除缓存">
            <!-- 网页链接 -->
            <url></url>
        </secondNav>
    </topNav>
    </topNav>
</nav>
src/main/webapp/admin/new/tvlive_category_add.html
New file
@@ -0,0 +1,157 @@
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="referrer" content="never">
    <title>添加顶部标签</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/maincontent.css" rel="stylesheet">
    <link href="css/tablestyle.css" rel="stylesheet">
    <style>
        .form-group {
            margin-bottom: 30px;
        }
        .checkbox input[type=checkbox] {
            top: 6px;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
</nav>
<div id="mainbody">
    <div id="sidebar">
        <dl>
        </dl>
    </div>
    <div id="neirong">
        <div class="erjidh">
            <ol class="breadcrumb">
                <li>
                    <a href="tvlive_category_list.html">电视直播分类</a>
                </li>
                <li class="active">添加分类</li>
            </ol>
        </div>
        <form class="form-horizontal" role="form">
            <div class="form-group">
            <label for="input1" class="changdu1 control-label">名称</label>
            <div class="col-sm-7">
                <input type="text" class="form-control" id="name" placeholder="必须填写">
            </div>
        </div>
            <div class="form-group">
                <label for="input2" class="changdu1 control-label">权重</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="weight" placeholder="必须填写">
                </div>
            </div>
            <div class="form-group">
                <label for="input1" class="changdu1 control-label">图标链接</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="icon" placeholder="可不填">
                </div>
            </div>
            <div class="form-group">
                <label for="input7" class="changdu1 control-label">媒体</label>
                <div class="col-sm-7 detailsystem">
                </div>
            </div>
            <div class="button0">
                <div class="button">
                    <button type="button" class="btn btn-primary save">保存</button>
                </div>
                <div class="button">
                    <input type="reset" class="btn btn-default" value="重置"/>
                </div>
            </div>
        </form>
    </div>
</div>
<script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/nav.js"></script>
<script src="js/common.js"></script>
<script src="layer/layer.js"></script>
<script>
    $(function () {
        $.post('api/videoType/getAllVideoType', function (data) {
            if (data.code == 0) {
                var list = data.list;
                for (var i = 0; i < list.length; i++) {
                    var vt = list[i];
                    var vid = vt.id;
                    $("#classtype").append("<option key='" + vid + "'>" + vt.name + "</option>")
                }
            }
        }, 'json')
        $.post('api/common/detailsystemlist', function (data) {
            if (data.code == 0) {
                var dsStr = "";
                data.data.forEach(function (ds) {
                    dsStr += "<div class='checkbox '><label>";
                    dsStr += "<input type='checkbox' value=" + ds.id + ">";
                    dsStr += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + ds.name;
                    dsStr += "</label></div>";
                });
                $(".detailsystem").html(dsStr);
            }
        }, 'json');
        $(".save").click(function () {
            var $detailsystems = $(".detailsystem input[type=checkbox]");
            var dess = "";
            for (var i = 0; i < $detailsystems.length; i++) {
                if ($detailsystems.eq(i).is(":checked")) {
                    dess += $detailsystems.eq(i).val() + ",";
                }
            }
            if (dess.length > 0)
                dess = dess.substr(0, dess.length - 1);
            var index = layer.load(0, {
                'shade': false
            });
            $.post('api/tvlive/category/addCategory', {
                'name': $("#name").val(),
                'weight': $("#weight").val(),
                'icon': $("#icon").val(),
                'detailsystemids': dess,
            }, function (data) {
                layer.close(index);
                if (data.code == 0) {
                    layer.msg("添加成功");
                } else {
                    layer.msg(data.msg);
                }
                doResponse(data, function () {
                });
            }, 'json');
        });
    });
</script>
</body>
</html>
src/main/webapp/admin/new/tvlive_category_channel_list.html
New file
@@ -0,0 +1,364 @@
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="referrer" content="never">
    <title>电视直播-频道列表</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/maincontent.css" rel="stylesheet">
    <style>
        .search {
            display: inline;
            width: auto;
        }
        .h-picture {
            width: 120px;
        }
        .v-picture {
            height: 120px;
        }
        .form-group {
            margin-bottom: 20px;
        }
        .bianhao {
            margin: 0;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
</nav>
<div id="mainbody">
    <div id="sidebar">
    </div>
    <div id="neirong">
        <div class="erjidh search-div" style="padding: 10px;">
            <div class="form-group search" role="search">
                <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索">
            </div>
            <button type="button" class="btn btn-default search-button">搜索</button>
        </div>
        <div class="bottom">
            <div class="qx">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" class="check-all" value="#">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全选</label>
                </div>
            </div>
            <button class="btn btn-warning pl-del" type="button">批量删除</button>
            <div class="page">
                <ul class="pagination">
                    <li class="disabled pre">
                        <a href="#">&laquo;</a>
                    </li>
                    <li class="active">
                        <a href="#">1</a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#" class="next">&raquo;</a>
                    </li>
                </ul>
                <div class="form-group">
                    <div class="tzan">
                        <button type="button" class="btn btn-primary">跳转</button>
                    </div>
                    <div class="tz">
                        <input class="form-control" type="text" placeholder="页数">
                    </div>
                </div>
            </div>
        </div>
        <div class="zhuti">
            <div class="zhutisousuo">
                <table class="table">
                    <thead>
                    <th width="5%">选择</th>
                    <th width="10%">编号</th>
                    <th width="9%">频道名称</th>
                    <th width="9%">封面横图</th>
                    <th width="9%">封面竖图</th>
                    <th width="9%">当前节目信息</th>
                    <th width="9%">下个节目信息</th>
                    <th width="8%">状态</th>
                    <th width="12%">创建时间</th>
                    <th width="12%">更新时间</th>
                    <th width="5%">删除</th>
                    <th width="5%">编辑</th>
                    </thead>
                    <tbody>
                    <tr v-for="(item,index) in list">
                        <td>
                            <div class="xuanze">
                                <label>
                                    <input type="checkbox" class="check-item" v-bind:keys="item.id"
                                           value="#">
                                </label>
                            </div>
                        </td>
                        <td>
                            <div class="bianhao">{{item.id}}</div>
                        </td>
                        <td>
                            <div class="bianhao name">
                                <a href="#">{{item.name}}</a>
                            </div>
                        </td>
                        <td>
                            <img class="h-picture" v-bind:src="item.hPicture" v-if="item.hPicture">
                        </td>
                        <td>
                            <img class="v-picture" v-bind:src="item.vPicture" v-if="item.vPicture">
                        </td>
                        <td>
                            <div class="bianhao">
                                {{item.nowProgramTime}}
                                <br>
                                {{item.nowProgram}}
                            </div>
                        </td>
                        <td>
                            <div class="bianhao">
                                {{item.nextProgramTime}}
                                <br>
                                {{item.nextProgram}}
                            </div>
                        </td>
                        <td>{{item.state==1?'显示':'隐藏'}}</td>
                        <td class="">{{item.createTime}}</td>
                        <td class="">{{item.updateTime}}</td>
                        <td>
                            <div class="anniu"><img src="image/dustbin.png" class="delete"
                                                    v-on:click="deleteCategoryChannel(item.id,index)">
                            </div>
                        </td>
                        <td>
                            <div class="anniu">
                                <a v-bind:keys="item.id" href="javascript:void(0)" class="edit"
                                   v-on:click="changeWeight(item.id)"><img
                                        src="image/bianji.png"></a>
                            </div>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div class="bottom">
            <div class="qx">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" class="check-all" value="#">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全选</label>
                </div>
            </div>
            <button class="btn btn-warning pl-del" type="button">批量删除</button>
            <div class="page">
                <ul class="pagination">
                    <li class="disabled pre">
                        <a href="#">&laquo;</a>
                    </li>
                    <li class="active">
                        <a href="#">1</a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#" class="next">&raquo;</a>
                    </li>
                </ul>
                <div class="form-group">
                    <div class="tzan">
                        <button type="button" class="btn btn-primary">跳转</button>
                    </div>
                    <div class="tz">
                        <input class="form-control" type="text" placeholder="页数">
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/page.js"></script>
    <script src="js/nav.js"></script>
    <script src="js/common.js"></script>
    <script src="js/vue.min.js"></script>
    <script src="layer/layer.js"></script>
    <script>
        $(function () {
            function getQueryString(name) {
                var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
                var r = window.location.search.substr(1).match(reg);
                if (r != null) return unescape(r[2]);
                return null;
            };
            const categoryId = getQueryString("id");
            var app = new Vue({
                el: "#neirong",
                data: {
                    list: [],
                },
                methods: {
                    channelList: function (page) {
                        if (!categoryId) {
                            return;
                        }
                        var index = layer.load(1, {
                            shade: false
                        })
                        var data = {
                            "page": page,
                            "key": $("#kw").val(),
                            "categoryId": categoryId
                        };
                        $.post('api/tvlive/channel/getChannelList', data, function (data) {
                            layer.close(index);
                            if (data.code != 0)
                                return;
                            app.list = data.data.data;
                            fillPage(data.data.pageEntity, function (pageIndex) {
                                app.channelList(pageIndex);
                            });
                        }, 'json');
                    },
                    changeWeight: function (id) {
                        layer.prompt({title: '修改权重', formType: 1}, function (text, index) {
                            layer.close(index);
                            $.post('api/tvlive/channel/updateCategoryChannelWeight', {
                                channelId: id,
                                categoryId: categoryId,
                                weight: text
                            }, function (data) {
                                if (data.code != 0) {
                                    layer.msg(data.msg);
                                } else {
                                    layer.msg("修改成功");
                                }
                            }, 'json');
                        });
                    },
                    deleteCategoryChannel: function (id, index) {
                        var indexDialog = layer.confirm('是否删除该条目?', {
                            btn: ['是', '否'] //按钮
                        }, function () {
                            $.post('api/tvlive/channel/deleteCategoryChannel', {
                                categoryId: categoryId,
                                channelIds: id
                            }, function (data) {
                                layer.close(indexDialog);
                                if (data.code == 0) {
                                    if (index > -1) {
                                        app.list.splice(index, 1);
                                    } else {
                                        var ids = id.split(",");
                                        console.log(ids);
                                        for (var i = 0; i < ids.length; i++) {
                                            for (var j = 0; j < app.list.length; j++) {
                                                console.log(app.list[j].special.id + ":" + ids[i])
                                                if (app.list[j].special.id == ids[i]) {
                                                    app.list.splice(j, 1);
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    layer.msg("删除成功");
                                } else {
                                    layer.msg(data.msg);
                                }
                            }, 'json');
                        }, function () {
                        });
                    },
                }
            });
            $(".search-div .search-button").click(function () {
                app.channelList(1);
            });
            app.channelList(1);
            function getCheckedItems() {
                var ids = "";
                for (var i = 0; i < $(".check-item").length; i++) {
                    if ($(".check-item").eq(i).is(':checked')) {
                        ids += $(".check-item").eq(i).attr("keys") + ",";
                    }
                }
                if (ids.length > 0)
                    ids = ids.substr(0, ids.length - 1);
                return ids;
            }
            $(".check-all").change(function () {
                if (this.checked) {
                    $(".check-item").each(function () {
                        this.checked = true;
                    })
                }
                else {
                    $(".check-item").each(function () {
                        this.checked = false;
                    })
                }
            });
            $(".pl-del").click(function () {
                var ids = getCheckedItems();
                if (ids.length < 1) {
                    layer.msg("请选择栏目");
                    return;
                }
                app.deleteCategoryChannel(ids, -1);
            });
        });
    </script>
</body>
</html>
src/main/webapp/admin/new/tvlive_category_list.html
New file
@@ -0,0 +1,291 @@
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="referrer" content="never">
    <title>电视直播-分类列表</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/maincontent.css" rel="stylesheet">
    <style>
        .search {
            display: inline;
            width: auto;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
</nav>
<div id="mainbody">
    <div id="sidebar">
    </div>
    <div id="neirong">
        <div class="erjidh search-div" style="padding: 10px;">
            <select name="select" class="form-control search select-detailsystem">
            </select>
            <div class="form-group search" role="search">
                <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索">
            </div>
            <button type="button" class="btn btn-default search-button">搜索</button>
            <div class="tianjia" class="search">
                <a href="tvlive_category_add.html" class="btn btn-primary" role="button">添加分类&nbsp;+</a>
            </div>
        </div>
        <div class="zhuti">
            <div class="zhutisousuo">
                <table class="table">
                    <thead>
                    <th width="5%">选择</th>
                    <th width="10%">编号</th>
                    <th width="9%">分类名称</th>
                    <th width="20%">APP名称</th>
                    <th width="8%">图标</th>
                    <th width="10%">权重</th>
                    <th width="12%">创建时间</th>
                    <th width="12%">更新时间</th>
                    <th width="5%">删除</th>
                    <th width="5%">编辑</th>
                    </thead>
                    <tbody>
                    <tr v-for="(item,index) in list">
                        <td>
                            <div class="xuanze">
                                <label>
                                    <input type="checkbox" class="check-item" v-bind:keys="item.category.id"
                                           value="#">
                                </label>
                            </div>
                        </td>
                        <td>
                            <div class="bianhao">{{item.category.id}}</div>
                        </td>
                        <td>
                            <div class="bianhao name">
                                <a v-bind:href="'tvlive_category_channel_list.html?id='+item.category.id">{{item.category.name}}</a>
                            </div>
                        </td>
                        <td class="apps">
                            <div class="appname" v-for="ds in item.detailSystemSelectList">
                                <div class="checkbox">
                                    <label>
                                        <input type="checkbox" value="#" v-bind:checked="ds.selected"
                                               v-on:click="changeSuper(item.category.id,ds.detailSystem.id,$event)">
                                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ds.detailSystem.appName}}</label>
                                </div>
                            </div>
                        </td>
                        <td style="text-align:center;line-height:105px;"><img v-bind:src="item.category.icon"
                                                                              v-if="item.category.icon"></td>
                        <td style="text-align:center;line-height:105px;">{{item.category.weight}}</td>
                        <td style="text-align:center;line-height:105px;" class="">{{item.category.createTime}}</td>
                        <td style="text-align:center;line-height:105px;" class="">{{item.category.updateTime}}</td>
                        <td>
                            <div class="anniu"><img src="image/dustbin.png" class="delete"
                                                    v-on:click="deleteCategory(item.category.id,index)">
                            </div>
                        </td>
                        <td>
                            <div class="anniu">
                                <a v-bind:keys="item.category.id" href="javascript:void(0)" class="edit"
                                   v-on:click="edit(item.category.id)"><img
                                        src="image/bianji.png"></a>
                            </div>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div class="bottom">
            <div class="qx">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" class="check-all" value="#">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全选</label>
                </div>
            </div>
            <button class="btn btn-warning pl-del" type="button">批量删除</button>
            <div class="page">
                <ul class="pagination">
                    <li class="disabled pre">
                        <a href="#">&laquo;</a>
                    </li>
                    <li class="active">
                        <a href="#">1</a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#" class="next">&raquo;</a>
                    </li>
                </ul>
                <div class="form-group">
                    <div class="tzan">
                        <button type="button" class="btn btn-primary">跳转</button>
                    </div>
                    <div class="tz">
                        <input class="form-control" type="text" placeholder="页数">
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/page.js"></script>
    <script src="js/nav.js"></script>
    <script src="js/common.js"></script>
    <script src="js/vue.min.js"></script>
    <script src="layer/layer.js"></script>
    <script>
        $(function () {
            var app = new Vue({
                el: "#neirong",
                data: {
                    list: [],
                },
                methods: {
                    categoryList: function (page) {
                        var index = layer.load(1, {
                            shade: false
                        })
                        var data = {
                            "page": page,
                            "key": $("#kw").val()
                        };
                        var detailSystemId = $(".search-div .select-detailsystem").val();
                        if (detailSystemId&&detailSystemId!='0') {
                            data.detailSystemId = detailSystemId;
                        }
                        $.post('api/tvlive/category/getCategoryList', data, function (data) {
                            layer.close(index);
                            if (data.code != 0)
                                return;
                            app.list = data.data.data;
                            fillPage(data.data.pageEntity, function (pageIndex) {
                                app.categoryList(pageIndex);
                            });
                        }, 'json');
                    },
                    changeSuper: function (id, detailSystemId, e) {
                        if ($(e.target).is(":checked")) {
                            $.post('api/tvlive/category/addSuperCategory', {
                                "cid": id,
                                "detailSystemId": detailSystemId
                            }, function (data) {
                                if (data.code != 0) {
                                    layer.msg(data.msg);
                                } else {
                                    layer.msg("操作成功");
                                }
                            }, 'json');
                        } else {
                            $.post('api/tvlive/category/deleteSuperCategory', {
                                "cid": id,
                                "detailSystemId": detailSystemId
                            }, function (data) {
                                if (data.code != 0) {
                                    layer.msg(data.msg);
                                } else {
                                    layer.msg("操作成功");
                                }
                            }, 'json');
                        }
                    },
                    deleteCategory: function (id, index) {
                        var indexDialog = layer.confirm('是否删除该条目?', {
                            btn: ['是', '否'] //按钮
                        }, function () {
                            $.post('api/tvlive/category/deleteCategory', {
                                'ids': id
                            }, function (data) {
                                layer.close(indexDialog);
                                if (data.code == 0) {
                                    if (index > -1) {
                                        app.list.splice(index, 1);
                                    } else {
                                        var ids = id.split(",");
                                        console.log(ids);
                                        for (var i = 0; i < ids.length; i++) {
                                            for (var j = 0; j < app.list.length; j++) {
                                                console.log(app.list[j].category.id + ":" + ids[i])
                                                if (app.list[j].category.id == ids[i]) {
                                                    app.list.splice(j, 1);
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    layer.msg("删除成功");
                                } else {
                                    layer.msg(data.msg);
                                }
                            }, 'json');
                        }, function () {
                        });
                    },
                    edit: function (id) {
                        window.location.href = "tvlive_category_update.html?id=" + id;
                    }
                }
            });
            $(".search-div .search-button").click(function () {
                app.categoryList(1);
            });
            app.categoryList(1);
            function getCheckedItems() {
                var ids = "";
                for (var i = 0; i < $(".check-item").length; i++) {
                    if ($(".check-item").eq(i).is(':checked')) {
                        ids += $(".check-item").eq(i).attr("keys") + ",";
                    }
                }
                if (ids.length > 0)
                    ids = ids.substr(0, ids.length - 1);
                return ids;
            }
            $(".pl-del").click(function () {
                var ids = getCheckedItems();
                if (ids.length < 1) {
                    layer.msg("请选择栏目");
                    return;
                }
                app.deleteCategory(ids, -1);
            });
        });
    </script>
</body>
</html>
src/main/webapp/admin/new/tvlive_category_update.html
New file
@@ -0,0 +1,197 @@
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="referrer" content="never">
    <title>添加推荐Banner</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/maincontent.css" rel="stylesheet">
    <link href="css/tablestyle.css" rel="stylesheet">
    <style>
        .form-group {
            margin-bottom: 30px;
        }
        .checkbox input[type=checkbox] {
            top: 6px;
        }
        #container-video {
            display: block;
        }
        #container-web {
            display: none;
        }
        #container-special {
            display: none;
        }
        #dialog-chooselink {
            padding: 20px;
        }
        #dialog-chooselink select {
            width: 100px;
        }
        #dialog-chooselink label {
            display: inline;
        }
        #dialog-chooselink input[type=text] {
            display: inline;
            width: 500px;
        }
        #dialog-chooselink ul {
            display: block;
            list-style: none;
        }
        #dialog-chooselink ul li {
            display: inline;
            list-style: none;
            width: 33%;
            float: left;
        }
        #dialog-chooselink input[type=radio] {
            width: 20px;
            height: 20px;
        }
        #dialog-chooselink .search-result {
            height: 630px;
            overflow-y: scroll;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
</nav>
<div id="mainbody">
    <div id="sidebar">
        <dl>
        </dl>
    </div>
    <div id="neirong">
        <div class="erjidh">
            <ol class="breadcrumb">
                <li>
                    <a href="tvlive_category_list.html">分类列表</a>
                </li>
                <li class="active">修改内容</li>
            </ol>
        </div>
        <form class="form-horizontal">
            <div class="form-group">
                <label for="input1" class="changdu1 control-label">分类名称</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="name" readonly>
                </div>
            </div>
            <div class="form-group">
                <label for="input2" class="changdu1 control-label">权重</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="weight" placeholder="必须填写">
                </div>
            </div>
            <div class="form-group">
                <label for="input1" class="changdu1 control-label">图标</label>
                <div class="col-sm-7">
                    <input type="text" class="form-control" id="icon">
                </div>
            </div>
            <div class="button0">
                <div class="button">
                    <button type="button" class="btn btn-primary save">保存</button>
                </div>
                <div class="button">
                    <input type="reset" class="btn btn-default" value="重置"/>
                </div>
            </div>
        </form>
    </div>
</div>
<script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/nav.js"></script>
<script src="js/common.js"></script>
<script src="layer/layer.js"></script>
<script>
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]);
        return null;
    }
    var id = getQueryString("id");
    $(function () {
        var inx = layer.load(0, {
            "shade": false
        });
        $.post('api/tvlive/category/getCategory', {
            'id': id
        }, function (data) {
            layer.close(inx);
            if (data.code == 0) {
                $("#icon").val(data.data.icon);
                $("#weight").val(data.data.weight);
                $("#name").val(data.data.name);
            }
            doResponse(data, function () {
            });
        }, 'json');
    });
</script>
<script>
    var index;
    $(function () {
        $(".save").click(function () {
            var index = layer.load(0, {
                'shade': false
            });
            $.post('/BuWan/admin/new/api/tvlive/category/updateCategory', {
                'id': id,
                'icon': $("#icon").val(),
                'weight': $("#weight").val(),
                'name': $("#name").val(),
            }, function (data) {
                layer.close(index);
                layer.msg(data.msg);
                if (data.code == 0) {
                    layer.msg("修改成功");
                } else {
                    layer.msg(data.msg);
                }
                doResponse(data, function () {
                });
            }, 'json');
        });
    });
</script>
</body>
</html>
src/main/webapp/admin/new/tvlive_channel_list.html
New file
@@ -0,0 +1,469 @@
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="referrer" content="never">
    <title>电视直播-频道列表</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/maincontent.css" rel="stylesheet">
    <style>
        .search {
            display: inline;
            width: auto;
        }
        .h-picture {
            width: 120px;
        }
        .v-picture {
            height: 120px;
        }
        .form-group {
            margin-bottom: 20px;
        }
        .bianhao {
            margin: 0;
        }
    </style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
</nav>
<div id="mainbody">
    <div id="sidebar">
    </div>
    <div id="neirong">
        <div class="erjidh search-div" style="padding: 10px;">
            <select name="select" class="form-control search select-state">
                <option value="-1">全部</option>
                <option value="1">显示</option>
                <option value="0">隐藏</option>
            </select>
            <div class="form-group search" role="search">
                <input type="text" class="form-control search" id="kw" style="width: 200px;" placeholder="搜索">
            </div>
            <button type="button" class="btn btn-default search-button">搜索</button>
            <div class="tianjia" class="search">
                <a href="add-tuijian-home-labels.html" class="btn btn-primary" role="button">添加标签&nbsp;+</a>
            </div>
        </div>
        <div class="bottom">
            <div class="qx">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" class="check-all" value="#">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全选</label>
                </div>
            </div>
            <button class="btn btn-primary  pl-add-to-category" type="button">添加到分类</button>
            <button class="btn btn-warning pl-del" type="button">批量删除</button>
            <div class="page">
                <ul class="pagination">
                    <li class="disabled pre">
                        <a href="#">&laquo;</a>
                    </li>
                    <li class="active">
                        <a href="#">1</a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#" class="next">&raquo;</a>
                    </li>
                </ul>
                <div class="form-group">
                    <div class="tzan">
                        <button type="button" class="btn btn-primary">跳转</button>
                    </div>
                    <div class="tz">
                        <input class="form-control" type="text" placeholder="页数">
                    </div>
                </div>
            </div>
        </div>
        <div class="zhuti">
            <div class="zhutisousuo">
                <table class="table">
                    <thead>
                    <th width="5%">选择</th>
                    <th width="10%">编号</th>
                    <th width="9%">频道名称</th>
                    <th width="9%">封面横图</th>
                    <th width="9%">封面竖图</th>
                    <th width="9%">当前节目信息</th>
                    <th width="9%">下个节目信息</th>
                    <th width="8%">状态</th>
                    <th width="12%">创建时间</th>
                    <th width="12%">更新时间</th>
                    <th width="12%">操作</th>
                    <th width="5%">删除</th>
                    <th width="5%">编辑</th>
                    </thead>
                    <tbody>
                    <tr v-for="(item,index) in list">
                        <td>
                            <div class="xuanze">
                                <label>
                                    <input type="checkbox" class="check-item" v-bind:keys="item.id"
                                           value="#">
                                </label>
                            </div>
                        </td>
                        <td>
                            <div class="bianhao">{{item.id}}</div>
                        </td>
                        <td>
                            <div class="bianhao name">
                                <a href="#">{{item.name}}</a>
                            </div>
                        </td>
                        <td>
                            <img class="h-picture" v-bind:src="item.hPicture" v-if="item.hPicture">
                        </td>
                        <td>
                            <img class="v-picture" v-bind:src="item.vPicture" v-if="item.vPicture">
                        </td>
                        <td>
                            <div class="bianhao">
                                {{item.nowProgramTime}}
                                <br>
                                {{item.nowProgram}}
                            </div>
                        </td>
                        <td>
                            <div class="bianhao">
                                {{item.nextProgramTime}}
                                <br>
                                {{item.nextProgram}}
                            </div>
                        </td>
                        <td>{{item.state==1?'显示':'隐藏'}}</td>
                        <td class="">{{item.createTime}}</td>
                        <td class="">{{item.updateTime}}</td>
                        <td class="">
                            <div class="btn btn-primary" v-on:click="showCategorySelect(item.id)">添加到分类</div>
                        </td>
                        <td>
                            <div class="anniu"><img src="image/dustbin.png" class="delete"
                                                    v-on:click="deleteSpecial(item.id,index)">
                            </div>
                        </td>
                        <td>
                            <div class="anniu">
                                <a v-bind:keys="item.id" href="javascript:void(0)" class="edit"
                                   v-on:click="edit(item.id)"><img
                                        src="image/bianji.png"></a>
                            </div>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div class="bottom">
            <div class="qx">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" class="check-all" value="#">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全选</label>
                </div>
            </div>
            <button class="btn btn-primary  pl-add-to-category" type="button">添加到分类</button>
            <button class="btn btn-warning pl-del" type="button">批量删除</button>
            <div class="page">
                <ul class="pagination">
                    <li class="disabled pre">
                        <a href="#">&laquo;</a>
                    </li>
                    <li class="active">
                        <a href="#">1</a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#" class="next">&raquo;</a>
                    </li>
                </ul>
                <div class="form-group">
                    <div class="tzan">
                        <button type="button" class="btn btn-primary">跳转</button>
                    </div>
                    <div class="tz">
                        <input class="form-control" type="text" placeholder="页数">
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!-- 分类选择 -->
    <div class="modal fade" id="categoryDialog" tabindex="-1" role="dialog" aria-hidden="true" style="width: ">
        <input type="hidden" class="channelids"/>
        <div class="modal-dialog">
            <div class="modal-content" style="width: 500px;margin: 0 auto">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                    <h4 class="modal-title" id="myModalLabel">分类选择</h4>
                </div>
                <div class="modal-body ">
                    <div class="form-horizontal">
                        <div class="form-group">
                            <label for="input1" class="changdu1 control-label col-sm-2">分类</label>
                            <div class="col-sm-10">
                                <select class="form-control category">
                                    <option>分类1</option>
                                </select>
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="input1" class="changdu1 control-label col-sm-2">权重</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control weight" placeholder="可不填写">
                            </div>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary">确定</button>
                </div>
            </div>
        </div>
    </div>
    <script src="//cdn.bootcss.com/jquery/1.10.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <script src="js/page.js"></script>
    <script src="js/nav.js"></script>
    <script src="js/common.js"></script>
    <script src="js/vue.min.js"></script>
    <script src="layer/layer.js"></script>
    <script>
        $(function () {
            var app = new Vue({
                el: "#neirong",
                data: {
                    list: [],
                },
                methods: {
                    specialList: function (page) {
                        var index = layer.load(1, {
                            shade: false
                        })
                        var data = {
                            "page": page,
                            "key": $("#kw").val()
                        };
                        if (parseInt($(".search-div .select-state").val()) > 0) {
                            data.state = $(".search-div .select-state").val();
                        }
                        $.post('api/tvlive/channel/getChannelList', data, function (data) {
                            layer.close(index);
                            if (data.code != 0)
                                return;
                            app.list = data.data.data;
                            fillPage(data.data.pageEntity, function (pageIndex) {
                                app.specialList(pageIndex);
                            });
                        }, 'json');
                    },
                    changeSuper: function (id, detailSystemId, e) {
                        if ($(e.target).is(":checked")) {
                            $.post('api/homerecommend/addSuperSpecial', {
                                "id": id,
                                "detailSystemId": detailSystemId
                            }, function (data) {
                                if (data.code != 0) {
                                    layer.msg(data.msg);
                                } else {
                                    layer.msg("操作成功");
                                }
                            }, 'json');
                        } else {
                            $.post('api/homerecommend/deleteSuperSpecial', {
                                "id": id,
                                "detailSystemId": detailSystemId
                            }, function (data) {
                                if (data.code != 0) {
                                    layer.msg(data.msg);
                                } else {
                                    layer.msg("操作成功");
                                }
                            }, 'json');
                        }
                    },
                    deleteSpecial: function (id, index) {
                        var indexDialog = layer.confirm('是否删除该条目?', {
                            btn: ['是', '否'] //按钮
                        }, function () {
                            $.post('api/homerecommend/deleteSpcial', {
                                'ids': id
                            }, function (data) {
                                layer.close(indexDialog);
                                if (data.code == 0) {
                                    if (index > -1) {
                                        app.list.splice(index, 1);
                                    } else {
                                        var ids = id.split(",");
                                        console.log(ids);
                                        for (var i = 0; i < ids.length; i++) {
                                            for (var j = 0; j < app.list.length; j++) {
                                                console.log(app.list[j].special.id + ":" + ids[i])
                                                if (app.list[j].special.id == ids[i]) {
                                                    app.list.splice(j, 1);
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    layer.msg("删除成功");
                                } else {
                                    layer.msg(data.msg);
                                }
                            }, 'json');
                        }, function () {
                        });
                    },
                    edit: function (id) {
                        window.location.href = "edit-tuijian-home-labels.html?id=" + id;
                    },
                    showCategorySelect: function (ids) {
                        $("#categoryDialog .btn-primary").unbind();
                        $("#categoryDialog .channelids").val(ids);
                        $("#categoryDialog .btn-primary").bind("click", function () {
                            var data = {
                                channelIds: ids,
                                categoryId: $("#categoryDialog select").val()
                            };
                            if ($("#categoryDialog .weight").val()) {
                                data.weight = $("#categoryDialog .weight").val();
                            }
                            $.post('api/tvlive/channel/addCategoryChannel', data, function (data) {
                                if (data.code == 0) {
                                    layer.msg("添加成功")
                                } else {
                                    layer.msg(data.msg);
                                }
                            }, 'json');
                        })
                        $("#categoryDialog").modal("show");
                    },
                    getCategorys: function () {
                        $.post('api/tvlive/category/getCategoryList', {page: 1}, function (data) {
                            if (data.code != 0)
                                return;
                            data = data.data.data;
                            $("#categoryDialog .category").empty();
                            for (var i = 0; i < data.length; i++) {
                                $("#categoryDialog .category").append("<option value='" + data[i].category.id + "'>" + data[i].category.name + "</option>");
                            }
                        }, 'json');
                    }
                }
            });
            $(".search-div .search-button").click(function () {
                app.specialList(1);
            });
            app.specialList(1);
            app.getCategorys();
            function getCheckedItems() {
                var ids = "";
                for (var i = 0; i < $(".check-item").length; i++) {
                    if ($(".check-item").eq(i).is(':checked')) {
                        ids += $(".check-item").eq(i).attr("keys") + ",";
                    }
                }
                if (ids.length > 0)
                    ids = ids.substr(0, ids.length - 1);
                return ids;
            }
            $(".check-all").change(function () {
                if (this.checked) {
                    $(".check-item").each(function () {
                        this.checked = true;
                    })
                }
                else {
                    $(".check-item").each(function () {
                        this.checked = false;
                    })
                }
            });
            $(".pl-del").click(function () {
                var ids = getCheckedItems();
                if (ids.length < 1) {
                    layer.msg("请选择栏目");
                    return;
                }
                app.deleteSpecial(ids, -1);
            });
            $(".pl-add-to-category").click(function () {
                var ids = getCheckedItems();
                if (ids.length < 1) {
                    layer.msg("请选择栏目");
                    return;
                }
                app.showCategorySelect(ids);
            });
        });
    </script>
</body>
</html>
src/test/java/com/hxh/spring/test/DES.java
@@ -9,7 +9,7 @@
public class DES {
    @org.junit.Test
    public void test1() {
        String st = "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";
        String st = "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";
        System.out.println(DESUtil.decode(st));
    }
src/test/java/com/hxh/spring/test/video/HanmiTest.java
New file
@@ -0,0 +1,85 @@
package com.hxh.spring.test.video;
import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowDao;
import com.yeshi.buwan.dao.juhe.hanmi.HanmiShowEpisodeDao;
import com.yeshi.buwan.service.inter.juhe.HanmiService;
import com.yeshi.buwan.videos.hanmi.HanmiApiUtil;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShow;
import com.yeshi.buwan.videos.hanmi.entity.HanmiShowEpisode;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration(locations = {"classpath:spring.xml"})
@WebAppConfiguration
public class HanmiTest {
    @Resource
    private HanmiService hanmiService;
    @Resource
    private HanmiShowEpisodeDao hanmiShowEpisodeDao;
    @Resource
    private HanmiShowDao hanmiShowDao;
    @Test
    public void addHanJu() throws Exception {
        for (int i = 1; i < 5; i++) {
            List<HanmiShow> showList = HanmiApiUtil.parseDetailList(HanmiApiUtil.parseList("https://www.hmtv.me/dianying/page/" + i));
            for (HanmiShow show : showList) {
                hanmiService.saveShow(show);
//                hanmiService.deleteByShowId(show.getId());
            }
        }
    }
    @Test
    public void addToVideo() throws IOException {
        for (int i = 2; i < 5; i++) {
            List<HanmiShow> showList = HanmiApiUtil.parseList("https://www.hmtv.me/hanju/page/" + i);
            Collections.reverse(showList);
            for (HanmiShow show : showList) {
                show.setId(show.getUrl().replace("https://www.hmtv.me/show/", "").trim());
                show = hanmiService.getShowDetail(show.getId());
                if (show != null)
                    hanmiService.addToVideoInfo(show);
            }
        }
    }
    @Test
    public void test() {
        List<HanmiShow> list = hanmiShowDao.listAll(0, 100);
        for (HanmiShow show : list) {
            List<HanmiShowEpisode> epList = hanmiShowEpisodeDao.listByShowId(show.getId(), 0, 1);
            if (epList != null && epList.size() > 0) {
                try {
                    List<HanmiShowEpisode> episodeList = HanmiApiUtil.getShowEpisodesFromPlayUrl(epList.get(0).getPlayUrl());
                    if (episodeList != null)
                        for (HanmiShowEpisode episode : episodeList) {
                            episode.setShowId(show.getId());
                            episode.setId(HanmiShowEpisode.createId(episode.getShowId(), episode.getTag()));
                            episode.setCreateTime(new Date());
                            hanmiShowEpisodeDao.save(episode);
                        }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
src/test/java/com/hxh/spring/test/video/SearchSpecialTest.java
@@ -1,6 +1,7 @@
package com.hxh.spring.test.video;
import com.yeshi.buwan.dao.search.SearchSpecialDao;
import com.yeshi.buwan.domain.solr.SolrShortVideo;
import com.yeshi.buwan.domain.special.SearchSpecial;
import com.yeshi.buwan.domain.special.SearchSpecialPosition;
@@ -18,6 +19,7 @@
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
//
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@@ -33,6 +35,9 @@
    @Resource
    private SearchSpecialPositionMapService searchSpecialPositionMapService;
    @Resource
    private SearchSpecialDao searchSpecialDao;
    @Test
@@ -64,8 +69,8 @@
        filter.setArea("韩国");
        filter.setContentType(1);
        filter.setVideoType(150);
        searchSpecial.setAlbumQuery(filter);
        searchSpecial.setInternetQuery(filter);
        filter.setResourceIds(Arrays.asList(new String[]{"25","28"}));
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -77,8 +82,7 @@
        filter.setArea("韩国");
        filter.setContentType(1);
        filter.setVideoType(151);
        searchSpecial.setAlbumQuery(filter);
        searchSpecial.setInternetQuery(filter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)}));
        searchSpecial.setColumn(3);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -90,8 +94,7 @@
        filter.setArea("韩国");
        filter.setContentType(1);
        filter.setVideoType(152);
        searchSpecial.setAlbumQuery(filter);
        searchSpecial.setInternetQuery(filter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)}));
        searchSpecial.setColumn(3);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -103,8 +106,7 @@
        filter.setArea("日本");
//        filter.setContentType(1);
        filter.setVideoType(153);
        searchSpecial.setAlbumQuery(filter);
        searchSpecial.setInternetQuery(filter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, filter, null), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -117,7 +119,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
//        sfilter.setTag();
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -130,7 +132,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
        sfilter.setTag("八卦");
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -142,7 +144,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
        sfilter.setTag("新闻");
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -154,7 +156,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
        sfilter.setTag("明星");
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -166,7 +168,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
        sfilter.setTag("热点");
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -179,7 +181,7 @@
        sfilter.setAreas(Arrays.asList(new String[]{"韩国", "日韩"}));
        sfilter.setRootVideoType(155);
        sfilter.setTag("音乐");
        searchSpecial.setShortQuery(sfilter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, sfilter), "48", null, 1)}));
        searchSpecial.setColumn(2);
        searchSpecial.setSystemId(systemId + "");
        searchSpecialService.save(searchSpecial);
@@ -195,9 +197,7 @@
        filter.setRootVideoType(155);
        filter.setSortKey("third_update_time");
        searchSpecial.setAlbumQuery(null);
        searchSpecial.setInternetQuery(null);
        searchSpecial.setShortQuery(filter);
        searchSpecial.setContainerList(Arrays.asList(new SearchSpecial.QueryConditionsContainer[]{new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(null, null, filter), "48", null, 1)}));
        searchSpecial.setColumn(1);
        searchSpecial.setSystemId(2 + "");
        searchSpecialService.save(searchSpecial);
@@ -311,4 +311,18 @@
        searchSpecialPositionMapService.add(map);
    }
    @Test
    public void repaireSpecial() {
        SearchSpecial special = searchSpecialDao.get("3#hanju-shaoer");
        SolrVideoSearchFilter filter = new SolrVideoSearchFilter();
        filter.setArea("日本");
        filter.setContentType(1);
        filter.setVideoType(153);
        filter.setResourceIds(Arrays.asList(new String[]{"25","28"}));
        special.getContainerList().add(new SearchSpecial.QueryConditionsContainer(new SearchSpecial.QueryConditions(filter, null, null), "48", "meizu", 1));
        special.setContainerList(special.getContainerList());
        searchSpecialDao.save(special);
    }
}
src/test/java/com/hxh/spring/test/video/VideoResourceVersionTest.java
@@ -68,10 +68,23 @@
    @Test
    public void addHJAndroid() {
        String[] resourceIds = null;
        resourceIds = new String[]{"13", "20", "17", "19", "21", "22", "24","26", "27", "25"};
        resourceIds = new String[]{"13", "20", "17", "19", "21", "22", "24","26", "27", "25","28"};
        for (String rid : resourceIds) {
            try {
                videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, null));
                videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, "meizu"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Test
    public void addHJMZ() {
        String[] resourceIds = null;
        resourceIds = new String[]{ "25","28"};
        for (String rid : resourceIds) {
            try {
                videoResourceVersionMapService.add(new VideoResourceVersionMap("48", 1, rid, "meizu"));
            } catch (Exception e) {
                e.printStackTrace();
            }