2 文件已重命名
65个文件已修改
1 文件已复制
8个文件已添加
| | |
| | | |
| | | <properties> |
| | | <org.hibernate.version>4.1.2</org.hibernate.version> |
| | | <org.springframework-version>4.0.3.RELEASE</org.springframework-version> |
| | | <org.springframework-version>4.3.0.RELEASE</org.springframework-version> |
| | | <spring.mongodb.version>1.10.10.RELEASE</spring.mongodb.version> |
| | | <solrj.version>7.5.0</solrj.version> |
| | | <solrj.version>5.5.5</solrj.version> |
| | | <logback.version>1.2.3</logback.version> |
| | | </properties> |
| | | |
| | |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-context-support</artifactId> |
| | | <version>${org.springframework-version}</version> |
| | | <version>4.3.1.RELEASE</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-aop</artifactId> |
| | | <version>${org.springframework-version}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework</groupId> |
| | | <artifactId>spring-beans</artifactId> |
| | | <version>5.0.2.RELEASE</version> |
| | | <scope>compile</scope> |
| | | <version>4.3.0.RELEASE</version> |
| | | </dependency> |
| | | |
| | | <!-- Spring AOP --> |
| | |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.apache.httpcomponents</groupId> |
| | | <artifactId>httpclient</artifactId> |
| | | <version>4.5.3</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>commons-io</groupId> |
| | | <artifactId>commons-io</artifactId> |
| | | <version>2.5</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.janeluo</groupId> |
| | | <artifactId>ikanalyzer</artifactId> |
| | | <version>2012_u6</version> |
| | | </dependency> |
| | | <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-solr --> |
| | | <!--spring data solr--> |
| | | <dependency> |
| | | <groupId>org.springframework.data</groupId> |
| | | <artifactId>spring-data-solr</artifactId> |
| | | <version>4.0.3.RELEASE</version> |
| | | <version>2.1.3.RELEASE</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.springframework.data</groupId> |
| | | <artifactId>spring-data-commons</artifactId> |
| | | <version>2.3.0.RELEASE</version> |
| | | </dependency> |
| | | |
| | | |
| | | <dependency> |
| | | <groupId>com.xuxueli</groupId> |
| | |
| | | <groupId>com.qcloud</groupId> |
| | | <artifactId>cmq-http-client</artifactId> |
| | | <version>1.0.7</version> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>org.slf4j</groupId> |
| | | <artifactId>slf4j-log4j12</artifactId> |
| | | </exclusion> |
| | | <exclusion> |
| | | <groupId>log4j</groupId> |
| | | <artifactId>log4j</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | <!-- 支付宝相关 --> |
| | |
| | | </dependency> |
| | | |
| | | |
| | | <dependency> |
| | | <groupId>vpush</groupId> |
| | | <artifactId>vpush-server-sdk</artifactId> |
| | | <version>2.2</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>opush</groupId> |
| | | <artifactId>opush-server-sdk</artifactId> |
| | | <version>1.0.6</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>mipush</groupId> |
| | | <artifactId>MiPush_SDK_Server_Http</artifactId> |
| | | <version>1.0.11</version> |
| | | </dependency> |
| | | |
| | | |
| | | </dependencies> |
| | |
| | | if (!sign.equalsIgnoreCase(acceptData.getSign())) { |
| | | if (out == null) |
| | | out = response.getWriter(); |
| | | System.out.println("签名错误"); |
| | | out.print(JsonUtil.loadFalseJson("签名错误")); |
| | | return null; |
| | | } |
| | | |
| | | } else { |
| | |
| | | |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.ResponseBody; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.io.PrintWriter; |
| | | |
| | | @Controller |
| | | @RequestMapping("monitor") |
| | | public class MonitorController { |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrDataManager; |
| | | private SolrAlbumVideoDataManager solrDataManager; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | @RequestMapping(value = "/addhometype", method = RequestMethod.POST) |
| | | public void addHomeType(@Valid HomeType homeType, String detailsystemids, BindingResult bingdingResult, |
| | | public void addHomeType(@Valid HomeType homeType, String detailsystemids, BindingResult bingdingResult, HttpSession session, |
| | | PrintWriter out) { |
| | | if (bingdingResult.hasErrors()) {// 错误 |
| | | |
| | | } |
| | | homeType.setCreatetime(System.currentTimeMillis() + ""); |
| | | homeType.setSystem(SystemUtil.getAdminSelectedSystem(session)); |
| | | Serializable id = homeTypeService.addHomeType(homeType); |
| | | |
| | | if (id != null && !StringUtil.isNullOrEmpty(detailsystemids)) { |
| | |
| | | @RequestMapping(value = "/gethometype", method = RequestMethod.POST) |
| | | public void getHomeType(long id, PrintWriter out) { |
| | | HomeType ht = homeTypeService.getHomeTypeById(id + ""); |
| | | ht.setSystem(null); |
| | | ht.setAdmin(null); |
| | | List<DetailSystemSelect> selectList = homeTypeService.getDetailSystemSelectByType(id + ""); |
| | | Gson gson = new GsonBuilder().create(); |
| | | JSONObject object = new JSONObject(); |
| | |
| | | import java.io.PrintWriter; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | import com.google.common.base.Function; |
| | | import com.google.common.collect.Maps; |
| | | import com.google.gson.Gson; |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.video.VideoInfoExtra; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.iqiyi.IqiYiNewAPI; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.util.Constant; |
| | | import com.yeshi.buwan.vo.video.VideoAdminInfoVO; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | |
| | | import com.yeshi.buwan.service.imp.VideoManager; |
| | | import com.yeshi.buwan.util.JsonUtil; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | | import com.yeshi.buwan.web.tag.PageEntity; |
| | | |
| | | import net.sf.json.JSONArray; |
| | |
| | | private ThreadPoolTaskExecutor taskExecutor; |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrAlbumDataManager; |
| | | private SolrAlbumVideoDataManager solrAlbumDataManager; |
| | | |
| | | @Resource |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | @RequestMapping(value = "/changevideoshow", method = RequestMethod.POST) |
| | | public void changeVideoShow(String id, int show, PrintWriter out) { |
| | |
| | | } |
| | | |
| | | @RequestMapping(value = "/videolist", method = RequestMethod.POST) |
| | | public void videoList(int videotype, int page, String key, String type, String resourceIds, int contenttype, PrintWriter out) { |
| | | public void videoList(int videotype, int page, String key, String type, String resourceIds, int contenttype, String freeType, PrintWriter out) { |
| | | |
| | | if (StringUtil.isNullOrEmpty(type)) { |
| | | type = "name"; |
| | | } |
| | | |
| | | Integer freeTypeInt = null; |
| | | if (!StringUtil.isNullOrEmpty(freeType)) { |
| | | freeTypeInt = Integer.parseInt(freeType); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | filter.setSortKey("updateTime"); |
| | | |
| | | filter.setFreeType(freeTypeInt); |
| | | |
| | | SolrResultDTO dto = solrAlbumDataManager.find(filter, page, Constant.pageCount); |
| | | if (dto.getVideoList() != null) |
| | | for (SolrVideo videoInfo : dto.getVideoList()) |
| | | for (SolrAlbumVideo videoInfo : (List<SolrAlbumVideo>) dto.getVideoList()) |
| | | voList.add(VideoAdminInfoVO.create(videoInfo)); |
| | | count = dto.getTotalCount(); |
| | | } else { |
| | |
| | | for (VideoInfo videoInfo : list) |
| | | voList.add(VideoAdminInfoVO.create(videoInfo)); |
| | | } |
| | | |
| | | List<String> ids = new ArrayList<>(); |
| | | for (VideoAdminInfoVO a : voList) { |
| | | ids.add(a.getId()); |
| | | } |
| | | |
| | | List<VideoInfoExtra> extraList = videoInfoExtraService.listByIds(ids); |
| | | |
| | | Map<String, VideoInfoExtra> maps = Maps.uniqueIndex(extraList.iterator(), new Function<VideoInfoExtra, String>() { |
| | | @Override |
| | | public String apply(VideoInfoExtra extra) { |
| | | return extra.getId(); |
| | | } |
| | | }); |
| | | //过滤图片 |
| | | for (VideoAdminInfoVO a : voList) { |
| | | VideoInfoExtra extra = maps.get(a.getId()); |
| | | if (extra != null) { |
| | | if (!StringUtil.isNullOrEmpty(extra.gethPosterPicture())) |
| | | a.setPicture(extra.gethPosterPicture()); |
| | | } |
| | | } |
| | | |
| | | |
| | | JSONObject object = new JSONObject(); |
| | | object.put("code", 0); |
| | | JSONObject data = new JSONObject(); |
| | |
| | | out.print(data); |
| | | } |
| | | |
| | | @RequestMapping("getVideoInfoExtra") |
| | | public void getVideoInfoExtra(String id, PrintWriter out) { |
| | | VideoInfoExtra extra = videoInfoExtraService.getById(id); |
| | | JSONObject object = new JSONObject(); |
| | | if (extra != null) { |
| | | object.put("code", 0); |
| | | object.put("data", new Gson().toJson(extra)); |
| | | } else { |
| | | object.put("code", 1); |
| | | object.put("msg", "无附加信息"); |
| | | } |
| | | out.print(object); |
| | | } |
| | | |
| | | @RequestMapping("updateVideoInfoExtra") |
| | | public void updateVideoInfoExtra(String id, String vPicture, String hPicture, PrintWriter out) { |
| | | VideoInfoExtra extra = new VideoInfoExtra(); |
| | | extra.setId(id); |
| | | if (StringUtil.isNullOrEmpty(vPicture)) { |
| | | vPicture = ""; |
| | | } |
| | | |
| | | extra.setvPosterPicture(vPicture); |
| | | |
| | | if (StringUtil.isNullOrEmpty(hPicture)) { |
| | | hPicture = ""; |
| | | } |
| | | |
| | | extra.sethPosterPicture(hPicture); |
| | | |
| | | videoInfoExtraService.save(extra); |
| | | |
| | | JSONObject object = new JSONObject(); |
| | | object.put("code", 0); |
| | | out.print(object); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.yeshi.buwan.controller.admin.api; |
| | | |
| | | import com.google.gson.*; |
| | | import com.yeshi.buwan.acFun.AcFunUtil; |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.vip.UserVIPInfo; |
| | | import com.yeshi.buwan.domain.vip.VIPOrderRecord; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.iqiyi.IqiYiNewAPI; |
| | | import com.yeshi.buwan.iqiyi.util.IqiyiUtil; |
| | | import com.yeshi.buwan.service.imp.ClassService; |
| | | import com.yeshi.buwan.service.imp.ResourceVideoService; |
| | | import com.yeshi.buwan.service.imp.VideoManager; |
| | | import com.yeshi.buwan.service.inter.vip.VIPService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.util.Constant; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | | import com.yeshi.buwan.vo.video.VideoAdminInfoVO; |
| | | import com.yeshi.buwan.web.tag.PageEntity; |
| | | import net.sf.json.JSONArray; |
| | | import net.sf.json.JSONObject; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestMethod; |
| | |
| | | import org.yeshi.utils.JsonUtil; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.PrintWriter; |
| | | import java.lang.reflect.Type; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | if (extra == null) |
| | | extra = loginUserService.initExtra(loginUid); |
| | | |
| | | //是否有pptvuid |
| | | |
| | | if (extra != null && StringUtil.isNullOrEmpty(extra.getPptvUid())) { |
| | | extra = loginUserService.initPPTVUid(extra.getId()); |
| | | } |
| | | |
| | | //需要初始化VIP信息 |
| | | vipService.initUserVipInfo(loginUid); |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | LoginUser lu = null; |
| | | try { |
| | | LoginUser lu = userService.login(loginInfoDto); |
| | | if (lu != null) { |
| | | JSONObject object = new JSONObject(); |
| | | object.put("LoginUid", lu.getId()); |
| | | out.print(JsonUtil.loadTrueJson(object.toString())); |
| | | } else { |
| | | lu = userService.login(loginInfoDto); |
| | | if (lu == null) { |
| | | out.print(JsonUtil.loadFalseJson("登录失败")); |
| | | return; |
| | | } |
| | | } catch (LoginUserException e) { |
| | | //用户不存在 |
| | | if (e.getCode() == LoginUserException.CODE_NO_USER && loginTypeInt == LoginUser.LOGIN_TYPE_EMAIL) { |
| | | if (e.getCode() == LoginUserException.CODE_NO_USER && loginTypeInt != LoginUser.LOGIN_TYPE_EMAIL) { |
| | | //注册 |
| | | try { |
| | | userService.register(loginInfoDto); |
| | | lu = userService.register(loginInfoDto); |
| | | } catch (RegisterUserException e1) { |
| | | out.print(JsonUtil.loadFalseJson("登录失败")); |
| | | return; |
| | | } |
| | | |
| | | } else { |
| | | out.print(JsonUtil.loadFalseJson(e.getMessage())); |
| | | return; |
| | | } |
| | | } |
| | | if (lu != null) { |
| | | JSONObject object = new JSONObject(); |
| | | object.put("LoginUid", lu.getId()); |
| | | object.put("Portrait", lu.getPortrait()); |
| | | object.put("NickName", lu.getName()); |
| | | out.print(JsonUtil.loadTrueJson(object.toString())); |
| | | } else { |
| | | out.print(JsonUtil.loadFalseJson("登录失败")); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | import com.yeshi.buwan.exception.user.LoginUserException; |
| | | import com.yeshi.buwan.exception.user.RegisterUserException; |
| | | import com.yeshi.buwan.service.imp.*; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.util.JuHe.VideoResourceUtil; |
| | | import com.yeshi.buwan.util.annotation.RequireUid; |
| | |
| | | @Resource |
| | | private VideoInfoService videoInfoService; |
| | | @Resource |
| | | private SolrAlbumDataManager solrDataManager; |
| | | private SolrAlbumVideoDataManager solrDataManager; |
| | | @Resource |
| | | private ConfigParser configParser; |
| | | |
| | |
| | | package com.yeshi.buwan.dao; |
| | | |
| | | import com.yeshi.buwan.dao.base.BaseDao; |
| | | import com.yeshi.buwan.query.BaseQuery; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.Session; |
| | | import org.springframework.orm.hibernate4.HibernateCallback; |
| | |
| | | @Repository |
| | | public class VideoInfoDao extends BaseDao<VideoInfo> { |
| | | |
| | | |
| | | /** |
| | | * 选择性更新 |
| | | * |
| | | * @param bean |
| | | */ |
| | | public void updateSelective(VideoInfo bean) { |
| | | List<String> wheres = new ArrayList<>(); |
| | | List<Serializable> params = new ArrayList<>(); |
| | | |
| | | if (bean.getTag() != null) { |
| | | wheres.add("vi.tag=?"); |
| | | params.add(bean.getTag()); |
| | | } |
| | | if (bean.getTotalNumber() != null) { |
| | | wheres.add("vi.totalNumber=?"); |
| | | params.add(bean.getTotalNumber()); |
| | | } |
| | | |
| | | if (bean.getPicture() != null) { |
| | | wheres.add("vi.picture=?"); |
| | | params.add(bean.getPicture()); |
| | | } |
| | | if (bean.getName() != null) { |
| | | wheres.add("vi.name=?"); |
| | | params.add(bean.getName()); |
| | | } |
| | | if (bean.getIntroduction() != null) { |
| | | wheres.add("vi.introduction=?"); |
| | | params.add(bean.getIntroduction()); |
| | | } |
| | | if (bean.getDuration() != null) { |
| | | wheres.add("vi.duration=?"); |
| | | params.add(bean.getDuration()); |
| | | } |
| | | if (bean.getMainActor() != null) { |
| | | wheres.add("vi.mainActor=?"); |
| | | params.add(bean.getMainActor()); |
| | | } |
| | | if (bean.getYear() != null) { |
| | | wheres.add("vi.year=?"); |
| | | params.add(bean.getYear()); |
| | | } |
| | | if (bean.getBeizhu() != null) { |
| | | wheres.add("vi.beizhu=?"); |
| | | params.add(bean.getBeizhu()); |
| | | } |
| | | if (bean.getQulity() != null) { |
| | | wheres.add("vi.qulity=?"); |
| | | params.add(bean.getQulity()); |
| | | } |
| | | if (bean.getScore() != null) { |
| | | wheres.add("vi.score=?"); |
| | | params.add(bean.getScore()); |
| | | } |
| | | if (bean.getShare() != null) { |
| | | wheres.add("vi.share=?"); |
| | | params.add(bean.getShare()); |
| | | } |
| | | if (bean.getShow() != null) { |
| | | wheres.add("vi.show=?"); |
| | | params.add(bean.getShow()); |
| | | } |
| | | if (bean.getWatchCount() != null) { |
| | | wheres.add("vi.watchCount=?"); |
| | | params.add(bean.getWatchCount()); |
| | | } |
| | | if (bean.getOrderby() != null) { |
| | | wheres.add("vi.orderby=?"); |
| | | params.add(bean.getOrderby()); |
| | | } |
| | | if (bean.getNowNumber() != null) { |
| | | wheres.add("vi.nowNumber=?"); |
| | | params.add(bean.getNowNumber()); |
| | | } |
| | | if (bean.getFinish() != null) { |
| | | wheres.add("vi.finish=?"); |
| | | params.add(bean.getFinish()); |
| | | } |
| | | if (bean.getBaseurl() != null) { |
| | | wheres.add("vi.baseurl=?"); |
| | | params.add(bean.getBaseurl()); |
| | | } |
| | | if (bean.getMonth() != null) { |
| | | wheres.add("vi.month=?"); |
| | | params.add(bean.getMonth()); |
| | | } |
| | | if (bean.getDay() != null) { |
| | | wheres.add("vi.day=?"); |
| | | params.add(bean.getDay()); |
| | | } |
| | | if (bean.getArea() != null) { |
| | | wheres.add("vi.area=?"); |
| | | params.add(bean.getArea()); |
| | | } |
| | | if (bean.getFocus() != null) { |
| | | wheres.add("vi.focus=?"); |
| | | params.add(bean.getFocus()); |
| | | } |
| | | if (bean.getLeafctgs() != null) { |
| | | wheres.add("vi.leafctgs=?"); |
| | | params.add(bean.getLeafctgs()); |
| | | } |
| | | if (bean.getDirector() != null) { |
| | | wheres.add("vi.director=?"); |
| | | params.add(bean.getDirector()); |
| | | } |
| | | if (bean.getKeyword() != null) { |
| | | wheres.add("vi.keyword=?"); |
| | | params.add(bean.getKeyword()); |
| | | } |
| | | if (bean.getVpicture() != null) { |
| | | wheres.add("vi.vpicture=?"); |
| | | params.add(bean.getVpicture()); |
| | | } |
| | | if (bean.getHpicture() != null) { |
| | | wheres.add("vi.hpicture=?"); |
| | | params.add(bean.getHpicture()); |
| | | } |
| | | if (bean.getLatestVpicture() != null) { |
| | | wheres.add("vi.latestVpicture=?"); |
| | | params.add(bean.getLatestVpicture()); |
| | | } |
| | | if (bean.getLatestHpicture() != null) { |
| | | wheres.add("vi.latestHpicture=?"); |
| | | params.add(bean.getLatestHpicture()); |
| | | } |
| | | if (bean.getContentType() != null) { |
| | | wheres.add("vi.contentType=?"); |
| | | params.add(bean.getContentType()); |
| | | } |
| | | if (bean.getCanSave() != null) { |
| | | wheres.add("vi.canSave=?"); |
| | | params.add(bean.getCanSave()); |
| | | } |
| | | if (bean.getAdmin() != null) { |
| | | wheres.add("vi.admin=?"); |
| | | params.add(bean.getAdmin()); |
| | | } |
| | | if (bean.getVideoType() != null) { |
| | | wheres.add("vi.videoType=?"); |
| | | params.add(bean.getVideoType()); |
| | | } |
| | | if (bean.getCommentCount() != null) { |
| | | wheres.add("vi.commentCount=?"); |
| | | params.add(bean.getCommentCount()); |
| | | } |
| | | if (bean.getLatestWatchCount() != null) { |
| | | wheres.add("vi.latestWatchCount=?"); |
| | | params.add(bean.getLatestWatchCount()); |
| | | } |
| | | if (bean.getVideocount() != null) { |
| | | wheres.add("vi.videocount=?"); |
| | | params.add(bean.getVideocount()); |
| | | } |
| | | |
| | | |
| | | if (bean.getType() != null) { |
| | | wheres.add("vi.type=?"); |
| | | params.add(bean.getType()); |
| | | } |
| | | |
| | | wheres.add("vi.updatetime=?"); |
| | | params.add(System.currentTimeMillis() + ""); |
| | | |
| | | String hql = "update VideoInfo vi set " + StringUtil.concat(wheres, ",") + " where vi.id=" + bean.getId(); |
| | | |
| | | Serializable[] ps = new Serializable[params.size()]; |
| | | params.toArray(ps); |
| | | update(hql, ps); |
| | | } |
| | | |
| | | |
| | | public List<VideoInfo> list(DaoQuery query) { |
| | | String hql = "from VideoInfo vi "; |
| | | List<Serializable> paramList = new ArrayList<>(); |
| | | List<String> andList = new ArrayList<>(); |
| | | if (query.show != null) { |
| | | andList.add("vi.show= ?"); |
| | | paramList.add(query.show); |
| | | } |
| | | |
| | | if (query.name != null) { |
| | | andList.add("vi.name= ?"); |
| | | paramList.add(query.name); |
| | | } |
| | | |
| | | |
| | | if (query.minId != null) { |
| | | andList.add("vi.id>=" + query.minId); |
| | | } |
| | | |
| | | if (andList.size() > 0) { |
| | | hql += "where " + StringUtil.concat(andList, " and "); |
| | | } |
| | | |
| | | Serializable[] params = new Serializable[paramList.size()]; |
| | | paramList.toArray(params); |
| | | return findList(hql, (int) query.start, query.count, params); |
| | | } |
| | | |
| | | public long count(DaoQuery query) { |
| | | String hql = "from VideoInfo vi "; |
| | | List<Serializable> paramList = new ArrayList<>(); |
| | | List<String> andList = new ArrayList<>(); |
| | | if (query.show != null) { |
| | | andList.add("vi.show= ?"); |
| | | paramList.add(query.show); |
| | | } |
| | | |
| | | if (query.name != null) { |
| | | andList.add("vi.name= ?"); |
| | | paramList.add(query.name); |
| | | } |
| | | |
| | | |
| | | if (query.minId != null) { |
| | | andList.add("vi.id>=" + query.minId); |
| | | } |
| | | |
| | | if (andList.size() > 0) { |
| | | hql += "where " + StringUtil.concat(andList, " and "); |
| | | } |
| | | |
| | | |
| | | Serializable[] params = new Serializable[paramList.size()]; |
| | | paramList.toArray(params); |
| | | return getCount(hql, params); |
| | | } |
| | | |
| | | /** |
| | | * 根据名字查询 |
| | | * |
| | |
| | | * @return |
| | | */ |
| | | public List<VideoInfo> listByName(String name, int start, int count) { |
| | | return list("from VideoInfo vi where vi.name=?", start, count, new Serializable[]{name}); |
| | | DaoQuery query = new DaoQuery(); |
| | | query.start = start; |
| | | query.count = count; |
| | | query.name = name; |
| | | return list(query); |
| | | } |
| | | |
| | | |
| | |
| | | }); |
| | | } |
| | | |
| | | public static class DaoQuery extends BaseQuery { |
| | | public String show; |
| | | public String name; |
| | | public Long minId; |
| | | } |
| | | |
| | | } |
| | |
| | | import org.springframework.orm.hibernate4.HibernateCallback; |
| | | import org.springframework.orm.hibernate4.HibernateTemplate; |
| | | import org.springframework.stereotype.Repository; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.transaction.Transactional; |
| | | import java.io.Serializable; |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | public List<T> findList(String hql, final int start, final int count, final Serializable[] params) { |
| | | final String tempsql = hql; |
| | | return (List<T>) hibernateTemplate.execute(new HibernateCallback() { |
| | | public Object doInHibernate(Session session) throws HibernateException { |
| | | Query query = session.createQuery(tempsql); |
| | | if (params != null) |
| | | for (int i = 0; i < params.length; i++) { |
| | | query.setParameter(i, params[i]); |
| | | } |
| | | query.setFirstResult(start); |
| | | query.setMaxResults(count); |
| | | log.info("list"); |
| | | return query.list(); |
| | | } |
| | | }); |
| | | |
| | | } |
| | | |
| | | |
| | | public void update(String hql, final Serializable[] params) { |
| | | hibernateTemplate.execute(new HibernateCallback() { |
| | |
| | | mongoTemplate.remove(query, getEntityClass()); |
| | | } |
| | | |
| | | public void deleteByPrimaryKey(Object id) { |
| | | Query query = Query.query(Criteria.where("_id").is(id)); |
| | | mongoTemplate.remove(query, getEntityClass()); |
| | | } |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | protected Class<T> getEntityClass() { |
| | | Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) |
New file |
| | |
| | | package com.yeshi.buwan.dao.video; |
| | | |
| | | import com.yeshi.buwan.dao.base.MongodbBaseDao; |
| | | import com.yeshi.buwan.domain.video.AlbumVideoMap; |
| | | import com.yeshi.buwan.domain.video.VideoInfoExtra; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.data.mongodb.core.query.Update; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Repository |
| | | public class VideoInfoExtraDao extends MongodbBaseDao<VideoInfoExtra> { |
| | | |
| | | /** |
| | | * 选择性更新 |
| | | * |
| | | * @param extra |
| | | */ |
| | | public void updateSelective(VideoInfoExtra extra) { |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("id").is(extra.getId())); |
| | | |
| | | Update update = new Update(); |
| | | if (extra.gethPosterPicture() != null) { |
| | | update.set("hPosterPicture", extra.gethPosterPicture()); |
| | | } |
| | | |
| | | if (extra.getvPosterPicture() != null) { |
| | | update.set("vPosterPicture", extra.getvPosterPicture()); |
| | | } |
| | | update.set("updateTime", new Date()); |
| | | update(query, update); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 根据ID查询 |
| | | * |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | public List<VideoInfoExtra> listByIds(List<String> ids) { |
| | | 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 query = new Query(); |
| | | query.addCriteria(new Criteria().orOperator(wheres)); |
| | | return findList(query); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | import javax.persistence.Transient; |
| | | |
| | | import com.google.gson.annotations.Expose; |
| | | import org.springframework.data.annotation.Id; |
| | | |
| | | /** |
| | | * 视频信息 |
| | |
| | | */ |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @Id |
| | | @Expose |
| | | // @Field |
| | | private String id; |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String tag; |
| | | |
| | | private String totalNumber;// 所有集数 |
| | | |
| | | @Expose |
| | | private Long createtime; |
| | | |
| | | private String updatetime; |
| | | |
| | | @Expose |
| | | private String picture; |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String name; |
| | | |
| | | @Expose |
| | |
| | | private String duration; |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String mainActor; |
| | | @Expose |
| | | private String year; |
| | | @Expose |
| | | private VideoType videoType; |
| | | private String orderby; |
| | | @Expose |
| | | private String thirdType = "0"; |
| | | |
| | | private AdminInfo admin; |
| | | @Expose |
| | | private String beizhu; |
| | | @Expose |
| | | private String qulity; |
| | | @Expose |
| | | private long createtime; |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String score; |
| | | @Expose |
| | | private String watchCount; |
| | | private String share;// 是否必须分享 |
| | | |
| | | private String show; |
| | | @Expose |
| | | private String watchCount; |
| | | private String orderby; |
| | | @Expose |
| | | private String nowNumber;// 更新到了第几集 |
| | | @Expose |
| | | private String finish;// 是否更新完了?0-没有 1-更新完了 |
| | | private String baseurl;// 专辑的地址c |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String share;// 是否必须分享 |
| | | private String totalNumber;// 所有集数 |
| | | |
| | | @Expose |
| | | // @Field |
| | | private String tag; |
| | | |
| | | @Expose |
| | | // @Field |
| | | private boolean canSave;// 0-不能缓存 1-能缓存 |
| | | @Expose |
| | | private String area;// 地区 |
| | | |
| | | @Expose |
| | | private int commentCount; |
| | | |
| | | // @Field |
| | | private String updatetime; |
| | | private String month; |
| | | private String day; |
| | | |
| | | @Expose |
| | | private List<VideoResource> resourceList; |
| | | private List<VideoType> typeList; |
| | | |
| | | private String area;// 地区 |
| | | private String focus;// 看点 |
| | | private String leafctgs; |
| | | |
| | | private String director; |
| | | private String keyword; |
| | | |
| | | // 内容类型 |
| | | private int contentType; |
| | | @Expose |
| | | private int showType;// 1-长条 2-短条 |
| | | |
| | | @Expose |
| | | private String playPicture; |
| | | |
| | | @Expose |
| | | private String vpicture; |
| | | @Expose |
| | | private String hpicture; |
| | | |
| | | private String latestVpicture; |
| | | private String latestHpicture; |
| | | // 内容类型 |
| | | private Integer contentType; |
| | | @Expose |
| | | private Boolean canSave;// 0-不能缓存 1-能缓存 |
| | | private AdminInfo admin; |
| | | @Expose |
| | | private VideoType videoType; |
| | | @Expose |
| | | private Integer commentCount; |
| | | private Integer latestWatchCount; |
| | | private Integer videocount; |
| | | |
| | | private int latestWatchCount; |
| | | private int videocount; |
| | | |
| | | //非数据库缓存数据 |
| | | @Expose |
| | | private String thirdType = "0"; |
| | | @Expose |
| | | private List<VideoResource> resourceList; |
| | | private List<VideoType> typeList; |
| | | @Expose |
| | | private int showType;// 1-长条 2-短条 |
| | | @Expose |
| | | private String playPicture; |
| | | //0-免费 1-VIP 2-用券 |
| | | //免费类型 |
| | | @Expose |
| | | @Transient |
| | | private int free; |
| | | |
| | | |
| | | @Transient |
| | | private VideoResourceMapExtraInfo videoResourceMapExtraInfo; |
| | |
| | | this.videoResourceMapExtraInfo = videoResourceMapExtraInfo; |
| | | } |
| | | |
| | | public int getVideocount() { |
| | | public Integer getVideocount() { |
| | | return videocount; |
| | | } |
| | | |
| | | public void setVideocount(int videocount) { |
| | | public void setVideocount(Integer videocount) { |
| | | this.videocount = videocount; |
| | | } |
| | | |
| | | public int getLatestWatchCount() { |
| | | public Integer getLatestWatchCount() { |
| | | return latestWatchCount; |
| | | } |
| | | |
| | | public void setLatestWatchCount(int latestWatchCount) { |
| | | public void setLatestWatchCount(Integer latestWatchCount) { |
| | | this.latestWatchCount = latestWatchCount; |
| | | } |
| | | |
| | |
| | | this.showType = showType; |
| | | } |
| | | |
| | | public int getContentType() { |
| | | public Integer getContentType() { |
| | | return contentType; |
| | | } |
| | | |
| | | public void setContentType(int contentType) { |
| | | public void setContentType(Integer contentType) { |
| | | this.contentType = contentType; |
| | | } |
| | | |
| | |
| | | this.typeList = typeList; |
| | | } |
| | | |
| | | public int getCommentCount() { |
| | | public Integer getCommentCount() { |
| | | return commentCount; |
| | | } |
| | | |
| | | public void setCommentCount(int commentCount) { |
| | | public void setCommentCount(Integer commentCount) { |
| | | this.commentCount = commentCount; |
| | | } |
| | | |
| | |
| | | this.area = area; |
| | | } |
| | | |
| | | private String director; |
| | | |
| | | public String getDirector() { |
| | | return director; |
| | |
| | | return serialVersionUID; |
| | | } |
| | | |
| | | public boolean isCanSave() { |
| | | |
| | | public Boolean getCanSave() { |
| | | return canSave; |
| | | } |
| | | |
| | | public void setCanSave(boolean canSave) { |
| | | public void setCanSave(Boolean canSave) { |
| | | this.canSave = canSave; |
| | | } |
| | | |
| | |
| | | this.qulity = qulity; |
| | | } |
| | | |
| | | public long getCreatetime() { |
| | | public Long getCreatetime() { |
| | | return createtime; |
| | | } |
| | | |
| | | public void setCreatetime(long createtime) { |
| | | public void setCreatetime(Long createtime) { |
| | | this.createtime = createtime; |
| | | } |
| | | |
| | | // 用作分類統計 |
| | | // @Field |
| | | |
| | | private String type; |
| | | |
| | | public String getType() { |
| | |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import org.omg.CORBA.PRIVATE_MEMBER; |
| | | |
| | | public class PlayUrl { |
| | | import java.io.Serializable; |
| | | |
| | | public class PlayUrl implements Serializable { |
| | | @Expose |
| | | private VideoResource resource; |
| | | @Expose |
copy from src/main/java/com/yeshi/buwan/domain/SolrVideo.java
copy to src/main/java/com/yeshi/buwan/domain/solr/SolrAlbumVideo.java
File was copied from src/main/java/com/yeshi/buwan/domain/SolrVideo.java |
| | |
| | | package com.yeshi.buwan.domain; |
| | | package com.yeshi.buwan.domain.solr; |
| | | |
| | | import org.apache.solr.client.solrj.beans.Field; |
| | | import org.springframework.data.solr.core.mapping.Indexed; |
| | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * 搜索引擎中保存的视频对象 |
| | | * 搜索引擎中保存的专辑对象 |
| | | */ |
| | | public class SolrVideo implements Serializable { |
| | | public class SolrAlbumVideo implements Serializable { |
| | | public final static int FREE_TYPE_FREE = 0; |
| | | //VIP |
| | | public final static int FREE_TYPE_VIP = 1; |
| | | //用券 |
| | | public final static int FREE_TYPE_COUPON = 2; |
| | | |
| | | |
| | | |
| | | @Field |
| | | private String id; |
| | | @Field |
| | |
| | | @Field |
| | | @Indexed |
| | | private String resourceIds;//视频资源ID列表 |
| | | |
| | | @Field("free_type") |
| | | @Indexed |
| | | private int freeType;//免费类型 |
| | | |
| | | |
| | | |
| | | |
| | | public long getUpdateTime() { |
| | |
| | | public void setUpdatetime(String updatetime) { |
| | | this.updatetime = updatetime; |
| | | } |
| | | |
| | | |
| | | public int getFreeType() { |
| | | return freeType; |
| | | } |
| | | |
| | | public void setFreeType(int freeType) { |
| | | this.freeType = freeType; |
| | | } |
| | | } |
File was renamed from src/main/java/com/yeshi/buwan/domain/SolrVideo.java |
| | |
| | | package com.yeshi.buwan.domain; |
| | | package com.yeshi.buwan.domain.solr; |
| | | |
| | | import org.apache.solr.client.solrj.beans.Field; |
| | | import org.springframework.data.solr.core.mapping.Indexed; |
| | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * 搜索引擎中保存的视频对象 |
| | | * 搜索引擎中保存的一般视频对象 |
| | | */ |
| | | public class SolrVideo implements Serializable { |
| | | public class SolrCommonVideo implements Serializable { |
| | | @Field |
| | | private String id; |
| | | @Field |
| | | private String mainactor; |
| | | @Field |
| | | private int show; |
| | | @Field("latest_hpicture") |
| | | private String latestHpicture; |
| | | @Field |
| | | private String name; |
| | | @Field |
| | | private String tag; |
| | | @Field |
| | | private String duration; |
| | | @Field |
| | |
| | | @Field("latest_vpicture") |
| | | private String latestVpicture; |
| | | @Field |
| | | private String tag; |
| | | @Field |
| | | private String hpicture; |
| | | @Field("latest_hpicture") |
| | | private String latestHpicture; |
| | | @Field |
| | | private String area; |
| | | @Field |
| | |
| | | private int commentcount; |
| | | @Field |
| | | private int videocount; |
| | | @Field |
| | | private String name; |
| | | |
| | | @Field |
| | | private String updatetime; |
| | | @Field |
| | | private long updateTime; |
| | | @Indexed |
| | | @Field("root_video_type") |
| | | private long rootVideoType;//视频主分类 |
| | | @Indexed |
| | | @Field("video_types") |
| | | private String videoTypes; |
| | | |
| | | @Field |
| | | private String year; |
| | | @Field |
| | |
| | | public void setUpdatetime(String updatetime) { |
| | | this.updatetime = updatetime; |
| | | } |
| | | |
| | | |
| | | public String getVideoTypes() { |
| | | return videoTypes; |
| | | } |
| | | |
| | | public void setVideoTypes(String videoTypes) { |
| | | this.videoTypes = videoTypes; |
| | | } |
| | | } |
New file |
| | |
| | | package com.yeshi.buwan.domain.video; |
| | | |
| | | import org.springframework.data.annotation.Id; |
| | | import org.springframework.data.mongodb.core.mapping.Document; |
| | | |
| | | import java.util.Date; |
| | | |
| | | @Document(collection = "videoInfoExtra") |
| | | public class VideoInfoExtra { |
| | | |
| | | @Id |
| | | private String id; |
| | | //封面横图 |
| | | private String hPosterPicture; |
| | | //封面竖图 |
| | | private String vPosterPicture; |
| | | private Date createTime; |
| | | private Date updateTime; |
| | | |
| | | public String getId() { |
| | | return id; |
| | | } |
| | | |
| | | public void setId(String id) { |
| | | this.id = id; |
| | | } |
| | | |
| | | public String gethPosterPicture() { |
| | | return hPosterPicture; |
| | | } |
| | | |
| | | public void sethPosterPicture(String hPosterPicture) { |
| | | this.hPosterPicture = hPosterPicture; |
| | | } |
| | | |
| | | public String getvPosterPicture() { |
| | | return vPosterPicture; |
| | | } |
| | | |
| | | public void setvPosterPicture(String vPosterPicture) { |
| | | this.vPosterPicture = vPosterPicture; |
| | | } |
| | | |
| | | public Date getCreateTime() { |
| | | return createTime; |
| | | } |
| | | |
| | | public void setCreateTime(Date createTime) { |
| | | this.createTime = createTime; |
| | | } |
| | | |
| | | public Date getUpdateTime() { |
| | | return updateTime; |
| | | } |
| | | |
| | | public void setUpdateTime(Date updateTime) { |
| | | this.updateTime = updateTime; |
| | | } |
| | | } |
| | |
| | | package com.yeshi.buwan.dto.search; |
| | | |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | |
| | | import java.util.List; |
| | | |
| | | public class SolrResultDTO { |
| | | private List<SolrVideo> videoList; |
| | | private List videoList; |
| | | private int totalCount; |
| | | |
| | | public SolrResultDTO(List<SolrVideo> videoList, int totalCount) { |
| | | public SolrResultDTO(List videoList, int totalCount) { |
| | | this.videoList = videoList; |
| | | this.totalCount = totalCount; |
| | | } |
| | | |
| | | public List<SolrVideo> getVideoList() { |
| | | public List getVideoList() { |
| | | return videoList; |
| | | } |
| | | |
| | | public void setVideoList(List<SolrVideo> videoList) { |
| | | public void setVideoList(List videoList) { |
| | | this.videoList = videoList; |
| | | } |
| | | |
| | |
| | | private String[] resourceIds; |
| | | private String sortKey; |
| | | |
| | | private Integer freeType; |
| | | |
| | | public String getDirector() { |
| | | return director; |
| | | } |
| | |
| | | public void setResourceIds(String[] resourceIds) { |
| | | this.resourceIds = resourceIds; |
| | | } |
| | | |
| | | public Integer getFreeType() { |
| | | return freeType; |
| | | } |
| | | |
| | | public void setFreeType(Integer freeType) { |
| | | this.freeType = freeType; |
| | | } |
| | | } |
| | |
| | | |
| | | import com.xxl.job.core.biz.model.ReturnT; |
| | | import com.xxl.job.core.handler.annotation.XxlJob; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrCommonVideoDataManager; |
| | | import com.yeshi.buwan.util.SolrUtil; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import org.springframework.stereotype.Component; |
| | | import org.yeshi.utils.LinuxRemoteCommandUtil; |
| | | |
| | |
| | | public class SolrJob { |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrAlbumDataManager; |
| | | private SolrAlbumVideoDataManager solrAlbumDataManager; |
| | | |
| | | @Resource |
| | | private SolrCommonVideoDataManager solrCommonVideoDataManager; |
| | | |
| | | @XxlJob("solr-watch") |
| | | public ReturnT<String> reStartSolr(String param) throws Exception { |
| | |
| | | return ReturnT.SUCCESS; |
| | | } |
| | | |
| | | @XxlJob("solr-syncCommonVideo") |
| | | public ReturnT<String> syncCommonVideo(String param) throws Exception { |
| | | Long minId = null; |
| | | if (!StringUtil.isNullOrEmpty(param)) { |
| | | minId = Long.parseLong(param); |
| | | } |
| | | //同步视频 |
| | | solrCommonVideoDataManager.syncAllVideo(minId); |
| | | return ReturnT.SUCCESS; |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import com.xxl.job.core.biz.model.ReturnT; |
| | | import com.xxl.job.core.handler.annotation.XxlJob; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | public class VideoUpdateJob { |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrAlbumDataManager; |
| | | private SolrAlbumVideoDataManager solrAlbumDataManager; |
| | | |
| | | /** |
| | | * 同步所有专辑 |
| | |
| | | import com.yeshi.buwan.pptv.entity.PPTVSeries; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | | import com.yeshi.buwan.util.log.LoggerUtil; |
| | | import net.sf.json.JSONArray; |
| | | import net.sf.json.JSONObject; |
| | | import org.apache.commons.httpclient.HttpClient; |
| | |
| | | Map<String, String> params = new HashMap<>(); |
| | | params.put("uid", uid); |
| | | // String result = baseRequest("https://coapi.pptv.com/coapi-web/api/http/sopRequest", params, "pptv.channel.openid.get"); |
| | | String result = baseRequest("http://coapiwebsit.cnsuning.com/coapi-web/api/http/sopRequest", params, "pptv.channel.openid.get"); |
| | | String result = baseRequest("https://coapi.pptv.com/coapi-web/api/http/sopRequest", params, "pptv.channel.openid.get"); |
| | | System.out.println(result); |
| | | JSONObject resultJSON = JSONObject.fromObject(result); |
| | | JSONObject response = resultJSON.optJSONObject("response"); |
| | |
| | | * @param code |
| | | */ |
| | | public static boolean login(String code) { |
| | | String url = String.format("https://coapi.pptv.com/coapi-web/api/getUserToken/%s/%s.htm", APP_KEY, code); |
| | | String url = String.format("https://coapi.pptv.com/coapi-web/api/getUserToken/%s/%s.htm", APP_KEY,URLEncoder.encode(code)); |
| | | String result = HttpUtil.get(url); |
| | | System.out.println(result); |
| | | JSONObject resultJSON = JSONObject.fromObject(result); |
| | |
| | | params.put("orderTime", TimeUtil.getGernalTime(orderTime.getTime(), "yyyy-MM-dd HH:mm:ss")); |
| | | params.put("sign", StringUtil.Md5(String.format("%s&%s&%s&%s", openId, params.get("channel"), orderNo, "2MnD8nCWu7EzbiJ"))); |
| | | String result = get("http://billing.api.pptv.com/cusp/jointMember", params); |
| | | LoggerUtil.getVIPLogger().info("开通会员-订单号:{},结果:{}", orderNo, result); |
| | | System.out.println(result); |
| | | JSONObject data = JSONObject.fromObject(result); |
| | | if (data.optInt("errorCode") == 0) { |
| | |
| | | import com.yeshi.buwan.service.inter.vip.VIPPriceService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | |
| | | |
| | | /** |
| | | * 购买VIP |
| | | * |
| | | * @param record |
| | | * @throws PPTVException |
| | | * @throws VIPException |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void buyVIP(VIPOrderRecord record) throws PPTVException, VIPException { |
| | | if (record.getState() != VIPOrderRecord.STATE_PAY) { |
| | | throw new VIPException(11, "尚未支付成功"); |
New file |
| | |
| | | package com.yeshi.buwan.query; |
| | | |
| | | public class BaseQuery { |
| | | public long start; |
| | | public int count; |
| | | } |
| | |
| | | session.flush(); |
| | | session.getTransaction().commit(); |
| | | } catch (Exception e) { |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | } catch (Exception e) { |
| | | isS = false; |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return isS; |
| | |
| | | |
| | | import com.yeshi.buwan.domain.DetailSystem; |
| | | import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import com.yeshi.buwan.util.JuHe.VideoResourceUtil; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.SQLQuery; |
| | |
| | | private CategoryRecommendVideoService categoryRecommendVideoService; |
| | | |
| | | @Resource |
| | | private VideoResourceMapExtraInfoService videoResourceMapExtraInfoService; |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | @Resource |
| | | private VideoResourceUtil videoResourceUtil; |
| | |
| | | } |
| | | }); |
| | | |
| | | return videoResourceMapExtraInfoService.batchExtraInfo(videoInfoList, resourceList); |
| | | return videoInfoExtraService.batchExtra(videoInfoList, resourceList); |
| | | } |
| | | |
| | | public CategoryRecommendCacheVideo getByVid(String vid) { |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.orm.hibernate4.HibernateCallback; |
| | | import org.springframework.stereotype.Service; |
| | | import org.yeshi.utils.StringUtil; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | |
| | | } |
| | | } |
| | | |
| | | public List<CategoryVideo> getCategoryList(List<VideoInfo> videoInfoList) { |
| | | String hql = "from CategoryVideo cv where "; |
| | | List<String> orList=new ArrayList<>(); |
| | | for (VideoInfo videoInfo : videoInfoList) { |
| | | orList.add( "cv.video.id=" + videoInfo.getId() ); |
| | | } |
| | | hql+= StringUtil.concat(orList," or "); |
| | | return categoryVideoDao.list(hql); |
| | | } |
| | | |
| | | } |
| | |
| | | import javax.annotation.Resource; |
| | | |
| | | import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import org.hibernate.CacheMode; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.Session; |
| | |
| | | private VideoInfoDao videoInfoDao; |
| | | @Resource |
| | | private SuperVideoTypeDao superVideoTypeDao; |
| | | |
| | | @Resource |
| | | private VideoResourceMapExtraInfoService videoResourceMapExtraInfoService; |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | public List<VideoType> getTypeList() { |
| | | List<VideoType> list = videoTypeDao.list("from VideoType v where v.show='1' and v.parent=null"); |
| | |
| | | dataList.add(info); |
| | | } |
| | | |
| | | dataList = videoResourceMapExtraInfoService.batchExtraInfo(dataList, resourceIdList); |
| | | dataList = videoInfoExtraService.batchExtra(dataList, resourceIdList); |
| | | |
| | | return dataList; |
| | | } |
| | |
| | | public void initExtra(LoginUserExtra extra) { |
| | | if (extra.getCreateTime() == null) |
| | | extra.setCreateTime(new Date()); |
| | | extra.setPptvUid(PPTVUtil.getPPTVUid(extra.getId())); |
| | | loginUserExtraDao.save(extra); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | public LoginUserExtra initPPTVUid(String uid) { |
| | | LoginUserExtra extra = loginUserExtraDao.get(uid); |
| | | if (extra != null) { |
| | | LoginUserExtra update = new LoginUserExtra(uid); |
| | | update.setPptvUid(PPTVUtil.getPPTVUid(uid)); |
| | | loginUserExtraDao.updateSelective(update); |
| | | extra.setPptvUid(update.getPptvUid()); |
| | | } |
| | | return extra; |
| | | } |
| | | |
| | | @Override |
| | | public void updateSelectiveByPrimaryKey(LoginUser loginUser) { |
| | | loginUserDao.updateSelective(loginUser); |
| | | } |
| | |
| | | |
| | | import com.yeshi.buwan.dao.*; |
| | | import com.yeshi.buwan.domain.*; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.web.DetailSystemSelect; |
| | | import com.yeshi.buwan.domain.web.HotSearchAdmin; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.util.factory.VideoInfoFactory; |
| | | import com.yeshi.buwan.util.video.VideoConstant; |
| | |
| | | @Resource |
| | | private DetailSystemDao detailSystemDao; |
| | | @Resource |
| | | private SolrAlbumDataManager solrAlbumDataManager; |
| | | private SolrAlbumVideoDataManager solrAlbumDataManager; |
| | | |
| | | @Resource |
| | | private VideoResourceMapExtraInfoService videoResourceMapExtraInfoService; |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | @SuppressWarnings("rawtypes") |
| | | @Cacheable(value = "userCache", key = "'suggestSearch'+'-'+#key+'-'+#system") |
| | |
| | | if (solrResultDTO != null) { |
| | | albumCount = solrResultDTO.getTotalCount(); |
| | | |
| | | for (SolrVideo sv : solrResultDTO.getVideoList()) { |
| | | for (SolrAlbumVideo sv : (List<SolrAlbumVideo>) solrResultDTO.getVideoList()) { |
| | | VideoInfo video = VideoInfoFactory.create(sv); |
| | | video.setShowType(1); |
| | | if (!StringUtil.isNullOrEmpty(video.getMainActor())) { |
| | |
| | | } |
| | | |
| | | //获取附加信息 |
| | | list = videoResourceMapExtraInfoService.batchExtraInfo(list, resourceList); |
| | | list = videoInfoExtraService.batchExtra(list, resourceList); |
| | | |
| | | return new VideoListResultVO(list, videoType == 0 ? albumCount : 1000L); |
| | | } |
| | |
| | | import javax.annotation.Resource; |
| | | |
| | | import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.Session; |
| | | import org.springframework.cache.annotation.Cacheable; |
| | |
| | | @Resource |
| | | private DetailSystemDao detailSystemDao; |
| | | |
| | | |
| | | @Resource |
| | | private VideoResourceMapExtraInfoService videoResourceMapExtraInfoService; |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | public StarService() { |
| | | |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | list = videoResourceMapExtraInfoService.batchExtraInfo(list, resourceList); |
| | | list = videoInfoExtraService.batchExtra(list, resourceList); |
| | | return list; |
| | | } |
| | | |
| | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | LogHelper.error(e.getMessage()); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | LogHelper.print("统计完成..."); |
| | |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | session.getTransaction().commit(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | import com.yeshi.buwan.dto.user.QQUserInfo; |
| | | import com.yeshi.buwan.exception.user.LoginUserException; |
| | | import com.yeshi.buwan.exception.user.RegisterUserException; |
| | | import com.yeshi.buwan.service.inter.LoginUserService; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.Session; |
| | | import org.springframework.cache.annotation.Cacheable; |
| | |
| | | |
| | | @Resource |
| | | private LoginUserExtraDao loginUserExtraDao; |
| | | |
| | | @Resource |
| | | private LoginUserService loginUserService; |
| | | |
| | | |
| | | // 用户操作 |
| | |
| | | * |
| | | * @param dto |
| | | */ |
| | | public void register(LoginInfoDto dto) throws RegisterUserException { |
| | | public LoginUser register(LoginInfoDto dto) throws RegisterUserException { |
| | | LoginUser loginUser = null; |
| | | LoginUserExtra loginUserExtra = null; |
| | | switch (dto.getLoginType()) { |
| | |
| | | loginUser.setLoginType(LoginUser.LOGIN_TYPE_QQ); |
| | | loginUser.setQqOpenId(dto.getQqUserInfo().getOpenId()); |
| | | loginUser.setName(dto.getQqUserInfo().getName()); |
| | | loginUser.setPortrait(dto.getQqUserInfo().getPortrait()); |
| | | |
| | | |
| | | loginUserExtra = new LoginUserExtra(); |
| | |
| | | loginUser.setWxUnionId(dto.getWeiXinUser().getUnionid()); |
| | | loginUser.setName(dto.getWeiXinUser().getNickname()); |
| | | loginUser.setWxOpenId(dto.getWeiXinUser().getOpenid()); |
| | | loginUser.setPortrait(dto.getWeiXinUser().getHeadimgurl()); |
| | | |
| | | |
| | | loginUserExtra = new LoginUserExtra(); |
| | |
| | | |
| | | loginUserExtra.setId(loginUser.getId()); |
| | | loginUserExtra.setCreateTime(new Date()); |
| | | loginUserExtraDao.save(loginUserExtra); |
| | | loginUserService.initExtra(loginUserExtra); |
| | | |
| | | return loginUser; |
| | | } |
| | | |
| | | public LoginUser getLoginUser(String id) { |
| | |
| | | package com.yeshi.buwan.service.imp; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.ArrayList; |
| | | import java.util.Calendar; |
| | | import java.util.List; |
| | | import java.util.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | import com.yeshi.buwan.util.HibernateSessionFactory; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | | import com.yeshi.buwan.util.mq.CMQManager; |
| | | import com.yeshi.buwan.util.video.VideoConstant; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.SQLQuery; |
| | |
| | | |
| | | |
| | | /** |
| | | * 是否存在相同的视频 |
| | | * 是否存在相同的视频(根据名称与上映时间) |
| | | * |
| | | * @param newVideoInfo |
| | | * @return |
| | | */ |
| | | public VideoInfo getExistSameVideo(VideoInfo newVideoInfo) { |
| | | public VideoInfo getExistSameVideoWithTime(VideoInfo newVideoInfo) { |
| | | int year = Integer.parseInt(newVideoInfo.getYear()); |
| | | List<VideoInfo> list = videoInfoDao.listByName(newVideoInfo.getName(), 0, 5); |
| | | if (list != null && list.size() > 0) |
| | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 根据名称与主演 |
| | | * |
| | | * @param newVideoInfo |
| | | * @return |
| | | */ |
| | | public VideoInfo getExistSameVideoWithDirector(VideoInfo newVideoInfo) { |
| | | List<VideoInfo> list = videoInfoDao.listByName(newVideoInfo.getName(), 0, 5); |
| | | if (list != null && list.size() > 0) { |
| | | if (VideoConstant.isMainCategory(newVideoInfo.getVideoType().getId())) { |
| | | for (int i = 0; i < list.size(); i++) { |
| | | VideoInfo vi = list.get(i); |
| | | if (getSameDirectorOrActorCount(vi.getDirector(), newVideoInfo.getDirector()) > 0 || getSameDirectorOrActorCount(vi.getMainActor(), newVideoInfo.getMainActor()) > 0) { |
| | | // if (getSameDirectorOrActorCount(vi.getMainActor(), newVideoInfo.getMainActor()) > 0) { |
| | | return list.get(i); |
| | | // } |
| | | } |
| | | } |
| | | } else { |
| | | return list.get(0); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private int getSameDirectorOrActorCount(String d1, String d2) { |
| | | if (!StringUtil.isNullOrEmpty(d1) && !StringUtil.isNullOrEmpty(d2)) { |
| | | List<String> d1List = new ArrayList<>(); |
| | | if (d1.contains("/")) { |
| | | d1List.addAll(Arrays.asList(d1.trim().split("/"))); |
| | | } else { |
| | | d1List.addAll(Arrays.asList(d1.trim().split(" "))); |
| | | } |
| | | |
| | | List<String> d2List = new ArrayList<>(); |
| | | if (d2.contains("/")) |
| | | d2List.addAll(Arrays.asList(d2.trim().split("/"))); |
| | | else |
| | | d2List.addAll(Arrays.asList(d2.trim().split(" "))); |
| | | |
| | | d1List.retainAll(d2List); |
| | | |
| | | return d1List.size(); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | public List<VideoInfo> listByVideoIds(List<String> videoIds) { |
| | | return videoInfoDao.listByVideoIds(videoIds); |
| | |
| | | videoInfoDao.statisticVideoExtraInfo(videoId); |
| | | } |
| | | |
| | | /** |
| | | * 列表查询 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | | public List<VideoInfo> list(VideoInfoDao.DaoQuery query) { |
| | | return videoInfoDao.list(query); |
| | | } |
| | | |
| | | public long count(VideoInfoDao.DaoQuery query) { |
| | | return videoInfoDao.count(query); |
| | | } |
| | | |
| | | |
| | | public void updateVideoInfo(VideoInfo videoInfo) { |
| | | VideoInfo oldVideo = videoInfoDao.find(VideoInfo.class, videoInfo.getId()); |
| | | if (oldVideo == null) |
| | | return; |
| | | |
| | | videoInfoDao.updateSelective(videoInfo); |
| | | //是否需要更新搜索引擎 |
| | | boolean needUpdateSolr = false; |
| | | //tag变化 |
| | | if (videoInfo.getTag() != null && !videoInfo.getTag().equalsIgnoreCase(oldVideo.getTag())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | //名称变化 |
| | | if (videoInfo.getName() != null && !videoInfo.getName().equalsIgnoreCase(oldVideo.getName())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | //picture变化 |
| | | if (videoInfo.getHpicture() != null && !videoInfo.getHpicture().equalsIgnoreCase(oldVideo.getHpicture())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | if (videoInfo.getVpicture() != null && !videoInfo.getVpicture().equalsIgnoreCase(oldVideo.getVpicture())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | if (videoInfo.getPicture() != null && !videoInfo.getPicture().equalsIgnoreCase(oldVideo.getPicture())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | //视频类型发生变化 |
| | | if (videoInfo.getVideoType() != null && (oldVideo.getVideoType() == null || videoInfo.getVideoType().getId() != oldVideo.getVideoType().getId())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | //是否显示 |
| | | if (videoInfo.getShow() != null && !videoInfo.getShow().equalsIgnoreCase(oldVideo.getShow())) { |
| | | needUpdateSolr = true; |
| | | } |
| | | |
| | | if (needUpdateSolr) { |
| | | CMQManager.getInstance().addSolrMsg(videoInfo.getId()); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | package com.yeshi.buwan.service.imp; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | import com.yeshi.buwan.dao.VideoResourceDao; |
| | | import com.yeshi.buwan.domain.LeShiAccount; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import net.sf.json.JSONArray; |
| | | import net.sf.json.JSONObject; |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.SQLQuery; |
| | | import org.hibernate.Session; |
| | | import org.springframework.orm.hibernate4.HibernateCallback; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import com.yeshi.buwan.dao.VideoResourceDao; |
| | | import com.yeshi.buwan.domain.LeShiAccount; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | |
| | | import net.sf.json.JSONArray; |
| | | import net.sf.json.JSONObject; |
| | | import javax.annotation.Resource; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | public class VideoResourceService { |
| | |
| | | } |
| | | } else {//视频不存在 |
| | | //判断2个视频实体是否为同一视频 |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideo(newVideoInfo); |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideoWithTime(newVideoInfo); |
| | | if (oldVideo == null) { |
| | | //添加视频 |
| | | Serializable id = videoInfoDao.save(newVideoInfo); |
| | |
| | | } |
| | | } else {//视频不存在 |
| | | //判断2个视频实体是否为同一视频 |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideo(newVideoInfo); |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideoWithTime(newVideoInfo); |
| | | if (oldVideo == null) { |
| | | //添加视频 |
| | | Serializable id = videoInfoDao.save(newVideoInfo); |
| | |
| | | logger.error("saveVideoInfo"); |
| | | logger.error(e.getMessage()); |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return null; |
| | |
| | | } catch (Exception e) { |
| | | logger.error("insertAlbumToVideoInfo"); |
| | | logger.error(e.getMessage()); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | e.printStackTrace(); |
| | | } |
| | |
| | | } |
| | | } else {//视频不存在 |
| | | //判断2个视频实体是否为同一视频 |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideo(newVideoInfo); |
| | | VideoInfo oldVideo = videoInfoService.getExistSameVideoWithDirector(newVideoInfo); |
| | | if (oldVideo == null) { |
| | | //添加视频 |
| | | Serializable id = videoInfoDao.save(newVideoInfo); |
| | |
| | | VideoPPTVMap map = videoPPTVMapDao.selectByInfoId(infoId); |
| | | if (map == null) |
| | | return; |
| | | videoPPTVMapDao.delete(map.getVideoId()); |
| | | videoPPTVMapDao.deleteByPrimaryKey(map.getVideoId()); |
| | | resourceVideoService.delete(map.getVideoId() + "", PPTVUtil.RESOURCE_ID + ""); |
| | | } |
| | | |
| | |
| | | session.getTransaction().commit(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return vid; |
| | |
| | | return true; |
| | | } |
| | | } catch (Exception e) { |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | } |
| | | return false; |
New file |
| | |
| | | package com.yeshi.buwan.service.imp.video; |
| | | |
| | | import com.google.common.base.Function; |
| | | import com.google.common.collect.Maps; |
| | | import com.yeshi.buwan.dao.video.VideoInfoExtraDao; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.video.VideoInfoExtra; |
| | | import com.yeshi.buwan.service.inter.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Service |
| | | public class VideoInfoExtraServiceImpl implements VideoInfoExtraService { |
| | | |
| | | @Resource |
| | | private VideoInfoExtraDao videoInfoExtraDao; |
| | | |
| | | @Resource |
| | | private VideoResourceMapExtraInfoService videoResourceMapExtraInfoService; |
| | | |
| | | @Override |
| | | public VideoInfoExtra getById(String id) { |
| | | return videoInfoExtraDao.get(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<VideoInfoExtra> listByIds(List<String> ids) { |
| | | List<VideoInfoExtra> list = videoInfoExtraDao.listByIds(ids); |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | public void save(VideoInfoExtra extra) { |
| | | //是否存在 |
| | | VideoInfoExtra old = videoInfoExtraDao.get(extra.getId()); |
| | | if (old == null) { |
| | | extra.setCreateTime(new Date()); |
| | | videoInfoExtraDao.save(extra); |
| | | return; |
| | | } |
| | | videoInfoExtraDao.updateSelective(extra); |
| | | } |
| | | |
| | | @Override |
| | | public void batchExtra(List<VideoInfo> videoInfoList) { |
| | | List<String> ids = new ArrayList<>(); |
| | | for (VideoInfo videoInfo : videoInfoList) { |
| | | ids.add(videoInfo.getId()); |
| | | } |
| | | List<VideoInfoExtra> list = videoInfoExtraDao.listByIds(ids); |
| | | Map<String, VideoInfoExtra> maps = Maps.uniqueIndex(list.iterator(), new Function<VideoInfoExtra, String>() { |
| | | @Override |
| | | public String apply(VideoInfoExtra extra) { |
| | | return extra.getId(); |
| | | } |
| | | }); |
| | | |
| | | for (VideoInfo vi : videoInfoList) { |
| | | VideoInfoExtra extra = maps.get(vi.getId()); |
| | | if (extra != null) { |
| | | if (!StringUtil.isNullOrEmpty(extra.getvPosterPicture())) { |
| | | vi.setVpicture(extra.getvPosterPicture()); |
| | | } |
| | | |
| | | if (!StringUtil.isNullOrEmpty(extra.gethPosterPicture())) { |
| | | vi.setHpicture(extra.gethPosterPicture()); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public List<VideoInfo> batchExtra(List<VideoInfo> videoInfoList, List<Long> resourceIds) { |
| | | batchExtra(videoInfoList); |
| | | videoResourceMapExtraInfoService.batchExtraInfo(videoInfoList, resourceIds); |
| | | return videoInfoList; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | public LoginUserExtra initExtra(String uid); |
| | | |
| | | |
| | | |
| | | public LoginUserExtra initPPTVUid(String uid); |
| | | |
| | | |
| | | /** |
| | | * 根据主键更新 |
| | | * |
New file |
| | |
| | | package com.yeshi.buwan.service.inter.video; |
| | | |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.video.VideoInfoExtra; |
| | | |
| | | import java.util.List; |
| | | |
| | | public interface VideoInfoExtraService { |
| | | |
| | | |
| | | public VideoInfoExtra getById(String id); |
| | | |
| | | |
| | | /** |
| | | * 主键查询 |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | public List<VideoInfoExtra> listByIds(List<String> ids); |
| | | |
| | | |
| | | /** |
| | | * 保存信息 |
| | | * |
| | | * @param extra |
| | | */ |
| | | public void save(VideoInfoExtra extra); |
| | | |
| | | /** |
| | | * 批量查询 |
| | | * |
| | | * @param videoInfoList |
| | | */ |
| | | public void batchExtra(List<VideoInfo> videoInfoList); |
| | | |
| | | |
| | | /** |
| | | * 批量查询 |
| | | * |
| | | * @param videoInfoList |
| | | * @param resourceIds |
| | | */ |
| | | public List<VideoInfo> batchExtra(List<VideoInfo> videoInfoList, List<Long> resourceIds); |
| | | |
| | | } |
File was renamed from src/main/java/com/yeshi/buwan/service/manager/SolrAlbumDataManager.java |
| | |
| | | package com.yeshi.buwan.service.manager; |
| | | |
| | | import com.yeshi.buwan.domain.ResourceVideo; |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.domain.video.AlbumVideoMap; |
| | |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | 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.VideoResourceMapExtraInfoService; |
| | | import com.yeshi.buwan.service.inter.juhe.AlbumVideoMapService; |
| | | import com.yeshi.buwan.service.inter.video.VideoInfoExtraService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.factory.SolrVideoFactory; |
| | | import org.apache.solr.client.solrj.response.UpdateResponse; |
| | |
| | | import org.springframework.data.solr.core.SolrTemplate; |
| | | import org.springframework.data.solr.core.query.Criteria; |
| | | import org.springframework.data.solr.core.query.Query; |
| | | import org.springframework.data.solr.core.query.SimpleFilterQuery; |
| | | import org.springframework.data.solr.core.query.SimpleQuery; |
| | | import org.springframework.data.solr.core.query.result.ScoredPage; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | * 搜索引擎-专辑数据管理 |
| | | */ |
| | | @Component |
| | | public class SolrAlbumDataManager { |
| | | public class SolrAlbumVideoDataManager { |
| | | |
| | | private final static String CORE_NAME = "buwan_album"; |
| | | private final String CORE_NAME = "buwan_album"; |
| | | |
| | | private final Logger logger = LoggerFactory.getLogger(SolrAlbumDataManager.class); |
| | | private final Logger logger = LoggerFactory.getLogger(SolrAlbumVideoDataManager.class); |
| | | |
| | | @Resource |
| | | private SolrTemplate solrTemplate; |
| | |
| | | private ResourceVideoService resourceVideoService; |
| | | |
| | | |
| | | @Resource |
| | | private VideoInfoExtraService videoInfoExtraService; |
| | | |
| | | @Resource |
| | | private VideoResourceService videoResourceService; |
| | | |
| | | |
| | | public void saveOrUpdate(VideoInfo videoInfo) { |
| | | UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, SolrVideoFactory.create(videoInfo, videoInfo.getResourceList())); |
| | | List<VideoResource> resourceList = videoResourceService.getResourceList(); |
| | | List<Long> rids = new ArrayList<>(); |
| | | for (VideoResource vr : resourceList) { |
| | | rids.add(Long.parseLong(vr.getId())); |
| | | } |
| | | |
| | | List<VideoInfo> videoList = new ArrayList<>(); |
| | | videoList.add(videoInfo); |
| | | videoInfoExtraService.batchExtra(videoList, rids); |
| | | |
| | | |
| | | UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, SolrVideoFactory.createAlbum(videoInfo, videoInfo.getResourceList())); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | |
| | | } |
| | | |
| | | public void saveOrUpdate(List<VideoInfo> videoInfoList) { |
| | | List<SolrVideo> solrVideoList = new ArrayList<>(); |
| | | List<VideoResource> resourceList = videoResourceService.getResourceList(); |
| | | List<Long> rids = new ArrayList<>(); |
| | | for (VideoResource vr : resourceList) { |
| | | rids.add(Long.parseLong(vr.getId())); |
| | | } |
| | | videoInfoExtraService.batchExtra(videoInfoList, rids); |
| | | |
| | | |
| | | List<SolrAlbumVideo> solrVideoList = new ArrayList<>(); |
| | | for (VideoInfo vi : videoInfoList) { |
| | | solrVideoList.add(SolrVideoFactory.create(vi, vi.getResourceList())); |
| | | solrVideoList.add(SolrVideoFactory.createAlbum(vi, vi.getResourceList())); |
| | | } |
| | | UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, solrVideoList); |
| | | if (updateResponse.getStatus() == 0) { |
| | |
| | | // } |
| | | // } |
| | | public void deleteById(String id) { |
| | | UpdateResponse updateResponse = solrTemplate.deleteByIds(CORE_NAME, id); |
| | | UpdateResponse updateResponse = solrTemplate.deleteById(CORE_NAME, id); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | |
| | | } |
| | | } |
| | | |
| | | public SolrVideo findOne(String id) { |
| | | Optional<SolrVideo> solrVideo = solrTemplate.getById(CORE_NAME, id, SolrVideo.class); |
| | | return solrVideo.get(); |
| | | public SolrAlbumVideo findOne(String id) { |
| | | SolrAlbumVideo solrVideo = solrTemplate.getById(CORE_NAME, id, SolrAlbumVideo.class); |
| | | return solrVideo; |
| | | } |
| | | |
| | | public SolrResultDTO find(SolrVideoSearchFilter filter, int page, int pageSize) { |
| | |
| | | Query query = null; |
| | | if (!StringUtil.isNullOrEmpty(filter.getKey())) { |
| | | //solr精准检索需要带引号 |
| | | query = new SimpleQuery("name:\"" + filter.getKey() + "\""); |
| | | query = new SimpleQuery(new Criteria("name").expression("\"" + filter.getKey() + "\"").or("mainactor").expression("\"" + filter.getKey() + "\"")); |
| | | } else if (!StringUtil.isNullOrEmpty(filter.getActor())) { |
| | | query = new SimpleQuery(new Criteria("mainactor").expression("\"" + filter.getActor() + "\"")); |
| | | } else if (!StringUtil.isNullOrEmpty(filter.getDirector())) { |
| | | query = new SimpleQuery(new Criteria("director").expression("\"" + filter.getDirector() + "\"")); |
| | | } else { |
| | | query = new SimpleQuery(); |
| | | query = new SimpleQuery("*:*"); |
| | | } |
| | | Criteria criteria = new Criteria("contenttype").is(filter.getContentType()); |
| | | |
| | | |
| | | if (filter.getVideoType() != null) { |
| | | criteria = criteria.and("root_video_type").is(filter.getVideoType()); |
| | | } |
| | | |
| | | if (filter.getActor() != null) { |
| | | criteria = criteria.and("mainactor").expression("\"" + filter.getActor() + "\""); |
| | | } |
| | | |
| | | if (filter.getDirector() != null) { |
| | | criteria = criteria.and("director").expression("\"" + filter.getDirector() + "\""); |
| | | query.addFilterQuery(new SimpleFilterQuery(Criteria.where("root_video_type").is(filter.getVideoType()))); |
| | | } |
| | | |
| | | if (filter.getResourceIds() != null && filter.getResourceIds().length > 0) { |
| | | criteria = criteria.and("resourceIds").contains(filter.getResourceIds()); |
| | | query.addFilterQuery(new SimpleFilterQuery(Criteria.where("resourceIds").contains(filter.getResourceIds()))); |
| | | } |
| | | if(filter.getFreeType()!=null){ |
| | | query.addFilterQuery(new SimpleFilterQuery(Criteria.where("free_type").is(filter.getFreeType()))); |
| | | } |
| | | |
| | | |
| | | /** 添加条件 */ |
| | | if (criteria != null) |
| | | query.addCriteria(criteria); |
| | | |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset((page - 1) * pageSize * 1L); |
| | | query.setOffset((page - 1) * pageSize); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(pageSize); |
| | | if (StringUtil.isNullOrEmpty(filter.getSortKey())) { |
| | |
| | | } else { |
| | | query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey())); |
| | | } |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrVideo.class); |
| | | |
| | | |
| | | ScoredPage<SolrAlbumVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrAlbumVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrVideo> list = result.getContent(); |
| | | List<SolrAlbumVideo> list = result.getContent(); |
| | | return new SolrResultDTO(list, (int) result.getTotalElements()); |
| | | } |
| | | |
| | | public List<String> getSuggestKeyList(String key) { |
| | | Query query = new SimpleQuery("name:\"" + key + "\""); |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset(0L); |
| | | query.setOffset(0); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(10); |
| | | ScoredPage<SolrVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrVideo.class); |
| | | ScoredPage<SolrAlbumVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrAlbumVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrVideo> list = result.getContent(); |
| | | List<SolrAlbumVideo> list = result.getContent(); |
| | | List<String> keyList = new ArrayList<>(); |
| | | for (SolrVideo sv : list) |
| | | for (SolrAlbumVideo sv : list) |
| | | if (!keyList.contains(sv.getName())) |
| | | keyList.add(sv.getName()); |
| | | return keyList; |
| | |
| | | vi.setResourceList(map.get(vi.getId())); |
| | | } |
| | | } |
| | | |
| | | saveOrUpdate(videoList); |
| | | } catch (Exception e) { |
| | | logger.error("专辑搜索引擎数据同步失败"); |
| | | logger.error("专辑搜索引擎数据同步失败",e); |
| | | } |
| | | } |
| | | } |
| | |
| | | AlbumVideoMap map = albumVideoMapService.selectByVideoId(videoId); |
| | | if (map == null) |
| | | return; |
| | | |
| | | VideoInfo video = videoInfoService.getVideoInfo(videoId); |
| | | if (video != null) { |
| | | List<ResourceVideo> rvList = resourceVideoService.getResourceList(video.getId()); |
New file |
| | |
| | | package com.yeshi.buwan.service.manager; |
| | | |
| | | import com.yeshi.buwan.dao.VideoInfoDao; |
| | | import com.yeshi.buwan.domain.*; |
| | | import com.yeshi.buwan.domain.solr.SolrCommonVideo; |
| | | import com.yeshi.buwan.domain.solr.SolrCommonVideo; |
| | | import com.yeshi.buwan.domain.video.AlbumVideoMap; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | 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.inter.juhe.AlbumVideoMapService; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.factory.SolrVideoFactory; |
| | | import org.apache.solr.client.solrj.response.UpdateResponse; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.data.domain.Sort; |
| | | import org.springframework.data.solr.core.SolrTemplate; |
| | | import org.springframework.data.solr.core.query.Criteria; |
| | | import org.springframework.data.solr.core.query.Query; |
| | | import org.springframework.data.solr.core.query.SimpleQuery; |
| | | import org.springframework.data.solr.core.query.result.ScoredPage; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 搜索引擎-专辑数据管理 |
| | | */ |
| | | @Component |
| | | public class SolrCommonVideoDataManager { |
| | | |
| | | private final String CORE_NAME = "buwan_video"; |
| | | |
| | | private final Logger logger = LoggerFactory.getLogger(SolrCommonVideoDataManager.class); |
| | | |
| | | @Resource |
| | | private SolrTemplate solrTemplate; |
| | | |
| | | @Resource |
| | | private AlbumVideoMapService albumVideoMapService; |
| | | |
| | | @Resource |
| | | private VideoInfoService videoInfoService; |
| | | |
| | | @Resource |
| | | private ResourceVideoService resourceVideoService; |
| | | |
| | | @Resource |
| | | private CategoryVideoService categoryVideoService; |
| | | |
| | | |
| | | public void saveOrUpdate(VideoInfo videoInfo) { |
| | | UpdateResponse updateResponse = solrTemplate.saveBean(CORE_NAME, SolrVideoFactory.createAlbum(videoInfo, videoInfo.getResourceList())); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 保存到搜索文档 |
| | | * |
| | | * @param videoInfoList |
| | | */ |
| | | public void saveOrUpdate(List<VideoInfo> videoInfoList) { |
| | | List<SolrCommonVideo> solrVideoList = new ArrayList<>(); |
| | | for (VideoInfo vi : videoInfoList) { |
| | | solrVideoList.add(SolrVideoFactory.createCommon(vi, vi.getTypeList(), vi.getResourceList())); |
| | | } |
| | | UpdateResponse updateResponse = solrTemplate.saveBeans(CORE_NAME, solrVideoList); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | public void deleteById(String id) { |
| | | UpdateResponse updateResponse = solrTemplate.deleteById(CORE_NAME, id); |
| | | if (updateResponse.getStatus() == 0) { |
| | | solrTemplate.commit(CORE_NAME); |
| | | } else { |
| | | solrTemplate.rollback(CORE_NAME); |
| | | } |
| | | } |
| | | |
| | | public SolrCommonVideo findOne(String id) { |
| | | SolrCommonVideo solrVideo = solrTemplate.getById(CORE_NAME, id, SolrCommonVideo.class); |
| | | return solrVideo; |
| | | } |
| | | |
| | | public SolrResultDTO find(SolrVideoSearchFilter filter, int page, int pageSize) { |
| | | if (filter.getKey() == null) { |
| | | filter.setKey(""); |
| | | } |
| | | logger.info(filter.getKey() + "#" + page); |
| | | Query query = null; |
| | | if (!StringUtil.isNullOrEmpty(filter.getKey())) { |
| | | //solr精准检索需要带引号 |
| | | query = new SimpleQuery("name:\"" + filter.getKey() + "\""); |
| | | } else { |
| | | query = new SimpleQuery(); |
| | | } |
| | | Criteria criteria = new Criteria("contenttype").is(filter.getContentType()); |
| | | |
| | | if (filter.getVideoType() != null) { |
| | | criteria = criteria.and("root_video_type").is(filter.getVideoType()); |
| | | } |
| | | |
| | | if (filter.getActor() != null) { |
| | | criteria = criteria.and("mainactor").expression("\"" + filter.getActor() + "\""); |
| | | } |
| | | |
| | | if (filter.getDirector() != null) { |
| | | criteria = criteria.and("director").expression("\"" + filter.getDirector() + "\""); |
| | | } |
| | | |
| | | if (filter.getResourceIds() != null && filter.getResourceIds().length > 0) { |
| | | criteria = criteria.and("resourceIds").contains(filter.getResourceIds()); |
| | | } |
| | | |
| | | |
| | | /** 添加条件 */ |
| | | if (criteria != null) |
| | | query.addCriteria(criteria); |
| | | |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset((page - 1) * pageSize); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(pageSize); |
| | | if (StringUtil.isNullOrEmpty(filter.getSortKey())) { |
| | | query.addSort(new Sort(Sort.Direction.DESC, "year")); |
| | | } else { |
| | | query.addSort(new Sort(Sort.Direction.DESC, filter.getSortKey())); |
| | | } |
| | | ScoredPage<SolrCommonVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrCommonVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrCommonVideo> list = result.getContent(); |
| | | return new SolrResultDTO(list, (int) result.getTotalElements()); |
| | | } |
| | | |
| | | public List<String> getSuggestKeyList(String key) { |
| | | Query query = new SimpleQuery("name:\"" + key + "\""); |
| | | /** 设置分页开始记录数(第一页) 默认0 */ |
| | | query.setOffset(0); |
| | | /** 设置每页显示记录数,默认10 */ |
| | | query.setRows(10); |
| | | ScoredPage<SolrCommonVideo> result = solrTemplate.queryForPage(CORE_NAME, query, SolrCommonVideo.class); |
| | | System.out.println("总记录数:" + result.getTotalElements()); |
| | | List<SolrCommonVideo> list = result.getContent(); |
| | | List<String> keyList = new ArrayList<>(); |
| | | for (SolrCommonVideo sv : list) |
| | | if (!keyList.contains(sv.getName())) |
| | | keyList.add(sv.getName()); |
| | | return keyList; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 同步所有专辑 |
| | | */ |
| | | public void syncAllVideo(Long minId) { |
| | | VideoInfoDao.DaoQuery query = new VideoInfoDao.DaoQuery(); |
| | | query.show = 1 + ""; |
| | | query.minId=minId; |
| | | |
| | | long count = videoInfoService.count(query); |
| | | int pageSize = 100; |
| | | int pageCount = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); |
| | | for (int i = 0; i < pageCount; i++) { |
| | | //查询第一个数据 |
| | | query.start = i * pageSize; |
| | | query.minId = null; |
| | | query.count = 1; |
| | | List<VideoInfo> list = videoInfoService.list(query); |
| | | if (list == null || list.size() == 0) |
| | | continue; |
| | | |
| | | query.minId = Long.parseLong(list.get(0).getId()); |
| | | query.count = pageSize; |
| | | list = videoInfoService.list(query); |
| | | if (list == null || list.size() == 0) |
| | | continue; |
| | | |
| | | //拉取分类 |
| | | List<CategoryVideo> categoryVideoList = categoryVideoService.getCategoryList(list); |
| | | Map<String, List<VideoType>> typeMap = new HashMap<>(); |
| | | for (CategoryVideo cv : categoryVideoList) { |
| | | if (cv == null || cv.getVideo() == null || cv.getVideoType() == null) |
| | | continue; |
| | | if (typeMap.get(cv.getVideo().getId()) == null) |
| | | typeMap.put(cv.getVideo().getId(), new ArrayList<>()); |
| | | typeMap.get(cv.getVideo().getId()).add(cv.getVideoType()); |
| | | } |
| | | for (VideoInfo videoInfo : list) { |
| | | videoInfo.setTypeList(typeMap.get(videoInfo.getId())); |
| | | } |
| | | |
| | | |
| | | //拉取资源 |
| | | List<ResourceVideo> rvList = resourceVideoService.getResourceList(list); |
| | | Map<String, List<VideoResource>> map = new HashMap<>(); |
| | | for (ResourceVideo rv : rvList) { |
| | | if (rv.getVideo() != null && rv.getResource() != null) { |
| | | if (map.get(rv.getVideo().getId()) == null) |
| | | map.put(rv.getVideo().getId(), new ArrayList<>()); |
| | | map.get(rv.getVideo().getId()).add(rv.getResource()); |
| | | } |
| | | } |
| | | for (VideoInfo vi : list) { |
| | | if (map.get(vi.getId()) != null) { |
| | | vi.setResourceList(map.get(vi.getId())); |
| | | } |
| | | } |
| | | |
| | | try { |
| | | saveOrUpdate(list); |
| | | } catch (Exception e) { |
| | | logger.error("一般视频搜索引擎数据同步失败",e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // public void syncAlbum(String videoId) { |
| | | // AlbumVideoMap map = albumVideoMapService.selectByVideoId(videoId); |
| | | // if (map == null) |
| | | // return; |
| | | // VideoInfo video = videoInfoService.getVideoInfo(videoId); |
| | | // if (video != null) { |
| | | // List<ResourceVideo> rvList = resourceVideoService.getResourceList(video.getId()); |
| | | // List<VideoResource> vrList = new ArrayList<>(); |
| | | // for (ResourceVideo rv : rvList) |
| | | // vrList.add(rv.getResource()); |
| | | // video.setResourceList(vrList); |
| | | // saveOrUpdate(video); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | |
| | | |
| | | public static boolean isUpdate = false;// 是否在上传应用市场; |
| | | |
| | | public static boolean IsOutNet = false;// 是否为外网 |
| | | public static boolean IsOutNet = true;// 是否为外网 |
| | | |
| | | public static boolean JobTasker = false; |
| | | |
| | |
| | | // } |
| | | |
| | | } catch (Exception e) { |
| | | if (session.getTransaction().isActive()) |
| | | session.getTransaction().rollback(); |
| | | e.printStackTrace(); |
| | | } finally { |
| | |
| | | import com.yeshi.buwan.service.inter.juhe.FunTV2Service; |
| | | import com.yeshi.buwan.service.inter.juhe.Iqiyi2Service; |
| | | import com.yeshi.buwan.service.inter.juhe.PPTVService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.util.mq.CMQManager; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | private VideoInfoService videoInfoService; |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrDataManager; |
| | | private SolrAlbumVideoDataManager solrDataManager; |
| | | |
| | | @Resource |
| | | private Iqiyi2Service iqiyi2Service; |
| | |
| | | package com.yeshi.buwan.util.factory; |
| | | |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.CategoryVideo; |
| | | import com.yeshi.buwan.domain.VideoType; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.util.VideoTypeUtil; |
| | | import com.yeshi.buwan.domain.solr.SolrCommonVideo; |
| | | import org.yeshi.utils.StringUtil; |
| | | |
| | | import java.util.ArrayList; |
| | |
| | | public class SolrVideoFactory { |
| | | |
| | | |
| | | public static SolrVideo create(VideoInfo videoInfo, List<VideoResource> videoResources) { |
| | | SolrVideo solrVideo = new SolrVideo(); |
| | | public static SolrAlbumVideo createAlbum(VideoInfo videoInfo, List<VideoResource> videoResources) { |
| | | SolrAlbumVideo solrVideo = new SolrAlbumVideo(); |
| | | solrVideo.setMainactor(videoInfo.getMainActor()); |
| | | solrVideo.setShow(Integer.parseInt(videoInfo.getShow())); |
| | | solrVideo.setLatestHpicture(videoInfo.getLatestHpicture()); |
| | |
| | | solrVideo.setResourceIds(StringUtil.concat(resourceIds, ",")); |
| | | } |
| | | |
| | | solrVideo.setFreeType(videoInfo.getFree()); |
| | | |
| | | return solrVideo; |
| | | } |
| | | |
| | | |
| | | public static SolrCommonVideo createCommon(VideoInfo videoInfo, List<VideoType> typeList, List<VideoResource> videoResources) { |
| | | SolrCommonVideo solrVideo = new SolrCommonVideo(); |
| | | solrVideo.setMainactor(videoInfo.getMainActor()); |
| | | solrVideo.setShow(Integer.parseInt(videoInfo.getShow())); |
| | | solrVideo.setLatestHpicture(videoInfo.getLatestHpicture()); |
| | | solrVideo.setDuration(videoInfo.getDuration()); |
| | | solrVideo.setScore(videoInfo.getScore()); |
| | | solrVideo.setVpicture(videoInfo.getVpicture()); |
| | | solrVideo.setLatestVpicture(videoInfo.getLatestVpicture()); |
| | | solrVideo.setId(videoInfo.getId()); |
| | | solrVideo.setTag(videoInfo.getTag()); |
| | | solrVideo.setHpicture(videoInfo.getHpicture()); |
| | | solrVideo.setArea(videoInfo.getArea()); |
| | | solrVideo.setCreatetime(videoInfo.getCreatetime() + ""); |
| | | solrVideo.setWatchcount(Integer.parseInt(videoInfo.getWatchCount())); |
| | | solrVideo.setDirector(videoInfo.getDirector()); |
| | | solrVideo.setPicture(videoInfo.getPicture()); |
| | | solrVideo.setContenttype(videoInfo.getContentType()); |
| | | solrVideo.setSolrTime(new Date()); |
| | | solrVideo.setCommentcount(videoInfo.getCommentCount()); |
| | | solrVideo.setVideocount(videoInfo.getVideocount()); |
| | | solrVideo.setName(videoInfo.getName()); |
| | | solrVideo.setUpdatetime(videoInfo.getUpdatetime()); |
| | | if (videoInfo.getUpdatetime() != null) |
| | | solrVideo.setUpdateTime(Long.parseLong(videoInfo.getUpdatetime())); |
| | | if (videoInfo.getVideoType() != null) |
| | | solrVideo.setRootVideoType(videoInfo.getVideoType().getId()); |
| | | |
| | | if (typeList != null && typeList.size() > 0) { |
| | | VideoType videoType = typeList.get(0); |
| | | if (videoType.getParent() != null) { |
| | | solrVideo.setRootVideoType(videoType.getParent().getId()); |
| | | } else { |
| | | solrVideo.setRootVideoType(videoType.getId()); |
| | | } |
| | | List<Long> ids = new ArrayList<>(); |
| | | for (VideoType cv : typeList) { |
| | | ids.add(cv.getId()); |
| | | } |
| | | solrVideo.setVideoTypes(StringUtil.concat(ids, ",")); |
| | | } |
| | | |
| | | solrVideo.setYear(videoInfo.getYear()); |
| | | |
| | | if (videoResources != null && videoResources.size() > 0) { |
| | | List<String> resourceIds = new ArrayList<>(); |
| | | for (VideoResource vr : videoResources) { |
| | | resourceIds.add(vr.getId()); |
| | | } |
| | | solrVideo.setResourceIds(StringUtil.concat(resourceIds, ",")); |
| | | } |
| | | |
| | | return solrVideo; |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.yeshi.buwan.util.factory; |
| | | |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoType; |
| | | |
| | | public class VideoInfoFactory { |
| | | |
| | | |
| | | public static VideoInfo create(SolrVideo solrVideo) { |
| | | public static VideoInfo create(SolrAlbumVideo solrVideo) { |
| | | VideoInfo video = new VideoInfo(); |
| | | video.setMainActor(solrVideo.getMainactor()); |
| | | video.setShow(solrVideo.getShow() + ""); |
| | |
| | | package com.yeshi.buwan.vo.video; |
| | | |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.domain.solr.SolrAlbumVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.TimeUtil; |
| | |
| | | private String updatetime; |
| | | private String show; |
| | | private String tag; |
| | | private Integer freeType; |
| | | |
| | | public Integer getFreeType() { |
| | | return freeType; |
| | | } |
| | | |
| | | public void setFreeType(Integer freeType) { |
| | | this.freeType = freeType; |
| | | } |
| | | |
| | | public void setShow(String show) { |
| | | this.show = show; |
| | |
| | | } |
| | | |
| | | |
| | | public static VideoAdminInfoVO create(SolrVideo solrVideo) { |
| | | public static VideoAdminInfoVO create(SolrAlbumVideo solrVideo) { |
| | | VideoAdminInfoVO vo = new VideoAdminInfoVO(); |
| | | vo.setId(solrVideo.getId()); |
| | | vo.setName(solrVideo.getName()); |
| | |
| | | StringUtil.isNullOrEmpty(solrVideo.getUpdatetime() + "") ? "0" : solrVideo.getUpdatetime() + ""), |
| | | "yyyy-MM-dd")); |
| | | vo.setTag(solrVideo.getTag()); |
| | | vo.setFreeType(solrVideo.getFreeType()); |
| | | return vo; |
| | | } |
| | | |
| | |
| | | </logger> |
| | | |
| | | <!--视频搜索关键词 --> |
| | | <logger name="com.yeshi.buwan.service.manager.SolrAlbumDataManager" level="INFO" additivity="true"> |
| | | <logger name="com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager" level="INFO" additivity="true"> |
| | | <appender-ref ref="searchAppender"></appender-ref> |
| | | </logger> |
| | | |
| | |
| | | solr.url=http://203.195.196.115:8983/solr |
| | | solr.url=http://193.112.35.168:9983/solr |
| | | solr.user=solr |
| | | solr.pwd=IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c= |
| | |
| | | </logger> |
| | | |
| | | <!--视频搜索关键词 --> |
| | | <logger name="com.yeshi.buwan.service.manager.SolrAlbumDataManager" level="INFO" additivity="true"> |
| | | <logger name="com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager" level="INFO" additivity="true"> |
| | | <appender-ref ref="searchAppender"></appender-ref> |
| | | </logger> |
| | | |
| | |
| | | solr.url=http://172.16.16.12:8983/solr/buwan_album |
| | | solr.url=http://172.16.16.12:8983/solr |
| | |
| | | <beans xmlns="http://www.springframework.org/schema/beans" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xmlns:solr="http://www.springframework.org/schema/data/solr" |
| | | xmlns:mongo="http://www.springframework.org/schema/data/mongo" |
| | | xsi:schemaLocation="http://www.springframework.org/schema/data/solr |
| | | http://www.springframework.org/schema/data/solr/spring-solr.xsd |
| | | http://www.springframework.org/schema/beans |
| | | http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> |
| | | xsi:schemaLocation="http://www.springframework.org/schema/beans |
| | | https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr.xsd"> |
| | | |
| | | |
| | | <solr:solr-client id="solrClient" url="${solr.url}" /> |
| | | |
| | | |
| | | |
| | | <!--<bean id="solrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">--> |
| | | <!--<constructor-arg value="${solr.url}"></constructor-arg>--> |
| | | <!--</bean>--> |
| | | <solr:solr-client id="client" url="${solr.url}"></solr:solr-client> |
| | | |
| | | <bean id="solrTemplate" |
| | | class="org.springframework.data.solr.core.SolrTemplate"> |
| | | <constructor-arg ref="solrServer"/> |
| | | <constructor-arg name="solrClient" ref="client"/> |
| | | </bean> |
| | | </beans> |
| | |
| | | </script> |
| | | <script> |
| | | function addVideoType(key,orderby,name,beizhu,iconFile,iconUrl,show){ |
| | | var showtitle=$("#input6").is(":checked")?1:0; |
| | | $.post("api/videoType/addVideoType",{"pid":key,"orderby":orderby,"name":name,"beizhu":beizhu,"iconFile":iconFile,"iconUrl":iconUrl,"show":show,"showTitle":showtitle},function(data){ |
| | | if(data == "yes") { |
| | | layer.alert('保存成功!', { |
| | |
| | | .checkbox input[type=checkbox] { |
| | | top: 6px; |
| | | } |
| | | img{ |
| | | margin-bottom: 10px; |
| | | } |
| | | </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="tuijian-lanmuneirong.html">栏目视频</a> |
| | | </li> |
| | | <li class="active">修改视频信息</li> |
| | | </ol> |
| | | </div> |
| | | <div> |
| | | <div style="width: 700px;margin: 50px auto"> |
| | | <form class="form-horizontal" role="form"> |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">名称</label> |
| | | <label for="input1" class="changdu1 control-label">封面横图</label> |
| | | |
| | | <div class="col-sm-7"> |
| | | <input type="text" class="form-control disabled" id="name" placeholder=""> |
| | | <img style="width: 200px;" class="picture-img-h"/> |
| | | <input type="text" class="form-control" id="hPosterPicture" placeholder=""> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="form-group"> |
| | | <label for="input1" class="changdu1 control-label">图片</label> |
| | | <label for="input2" class="changdu1 control-label">封面竖图</label> |
| | | <div class="col-sm-7"> |
| | | <img style="width: 200px;" class="picture-img" /> |
| | | <input type="text" class="form-control" id="picture" 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="tag" 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="orderby" placeholder=""> |
| | | <img style="width: 200px;" class="picture-img-v"/> |
| | | <input type="text" class="form-control" id="vPosterPicture" placeholder=""> |
| | | </div> |
| | | </div> |
| | | </form> |
| | |
| | | <div class="button"> |
| | | <button type="button" class="btn btn-primary save">保存</button> |
| | | </div> |
| | | <div class="button"> |
| | | <a href="tuijian-lanmuneirong.html" class="btn btn-default" role="button">取消</a> |
| | | </div> |
| | | <!--<div class="button">--> |
| | | <!--<button type="reset" class="btn btn-primary reset">重置</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/nav.js"></script> |
| | | <script src="js/common.js"></script> |
| | | <script src="layer/layer.js"></script> |
| | | <script> |
| | |
| | | if(r != null) return unescape(r[2]); |
| | | return null; |
| | | } |
| | | |
| | | $(function() { |
| | | //获取参数 |
| | | var id = getQueryString("id"); |
| | |
| | | var index = layer.load(0, { |
| | | 'shade': false |
| | | }); |
| | | $.post('../new/api/home/gethomevideo', { |
| | | $.post('../new/api/video/getVideoInfoExtra', { |
| | | 'id': id |
| | | }, function(data) { |
| | | layer.close(index); |
| | | $("#name").val(data.data.video.name); |
| | | $("#tag").val(data.data.tag); |
| | | $("#picture").val(data.data.picture); |
| | | $("#orderby").val(data.data.orderby); |
| | | $(".picture-img").attr("src", data.data.picture); |
| | | if (data.code == 0) { |
| | | if (data.data.hPosterPicture) { |
| | | $("#hPosterPicture").val(data.data.hPosterPicture); |
| | | $(".picture-img-h").attr("src", data.data.hPosterPicture); |
| | | } |
| | | |
| | | if (data.data.vPosterPicture) { |
| | | $("#vPosterPicture").val(data.data.vPosterPicture); |
| | | $(".picture-img-v").attr("src", data.data.vPosterPicture); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | }, 'json'); |
| | | |
| | | $(".save").click(function() { |
| | |
| | | if(dess.length > 0) |
| | | dess = dess.substr(0, dess.length - 1); |
| | | |
| | | $.post('../new/api/home/updatehomevideo', { |
| | | $.post('../new/api/video/updateVideoInfoExtra', { |
| | | 'id': id, |
| | | 'tag': $("#tag").val(), |
| | | 'picture': $("#picture").val(), |
| | | 'orderby':$("#orderby").val() |
| | | 'vPicture': $("#vPosterPicture").val(), |
| | | 'hPicture': $("#hPosterPicture").val(), |
| | | }, function(data) { |
| | | layer.close(index); |
| | | if (data.code == 0) { |
| | | layer.msg("修改成功"); |
| | | } else { |
| | | layer.msg(data.msg); |
| | | } |
| | | |
| | | doResponse(data, function() { |
| | | |
| | | }); |
| | |
| | | <option value="25">PPTV</option> |
| | | </select> |
| | | |
| | | |
| | | <select name="select" class="form-control search freeType"> |
| | | <option value="">--请选择收费类型--</option> |
| | | <option value="0">免费</option> |
| | | <option value="1">会员</option> |
| | | </select> |
| | | |
| | | |
| | | <select name="select" class="form-control search type"> |
| | | <option value="name" selected>片名</option> |
| | | <option value="actor">主演</option> |
| | |
| | | <img alt src="image/banner/青云志.jpg" class="video-img" style="width: 240px;"> |
| | | |
| | | <span style="position: absolute;right: 2px;bottom: 2px;color: red" class="tag"></span> |
| | | |
| | | <img src="image/icon_vip.png" |
| | | style="position: absolute;right: 0px;top: 0px;height: 40px;" |
| | | class="vip"/> |
| | | </div> |
| | | </td> |
| | | <td width="17%"> |
| | |
| | | </td> |
| | | <td width="7%"> |
| | | <div class="anniu"> |
| | | <a key="370" class="edit" onclick="p_del()"><img src="image/bianji.png"></a> |
| | | <a key="370" target="_blank" class="edit"><img src="image/bianji.png"></a> |
| | | </div> |
| | | </td> |
| | | </tr> |
| | |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | |
| | | <div id="dialog-chooselink" style="display: none;"> |
| | | <select name="select" class="form-control addType"> |
| | |
| | | "detailsystem": $(".search-div .select-detailsystem").val(), |
| | | "type": $(".search-div .type").val(), |
| | | "contenttype": $(".contenttype").val(), |
| | | "freeType": $(".freeType").val(), |
| | | "key": $("#kw").val(), |
| | | "resourceIds": JSON.stringify(resourceIds) |
| | | }, function (data) { |
| | |
| | | fk.find(".edit").attr("key", da.id); |
| | | fk.find(".delete").attr("key", da.id); |
| | | fk.find(".source").text(da.source); |
| | | fk.find(".edit").attr("href","edit-lmneirong-video.html?id=" + da.id); |
| | | |
| | | if (da.freeType == 1) |
| | | fk.find(".vip").css("display", "block"); |
| | | else |
| | | fk.find(".vip").css("display", "none"); |
| | | fk.css("display", "table-row"); |
| | | } |
| | | |
| | |
| | | |
| | | }); |
| | | |
| | | $(".table .anniu .edit").bind("click", function () { |
| | | |
| | | }); |
| | | // $(".table .anniu .edit").bind("click", function () { |
| | | // var id = $(this).attr("key"); |
| | | // $("#video-edit-frame").attr("src", "edit-lmneirong-video.html?id=" + id); |
| | | // $("#video-edit").modal("show") |
| | | // }); |
| | | |
| | | }, 'json'); |
| | | } |
| | |
| | | }); |
| | | |
| | | $(".table .anniu .edit").bind("click", function() { |
| | | window.location.href = "edit-lmneirong-video.html?id=" + $(this).attr("key"); |
| | | // window.location.href = "edit-lmneirong-video.html?id=" + $(this).attr("key"); |
| | | }); |
| | | |
| | | }, 'json'); |
| | |
| | | import com.yeshi.buwan.service.imp.AcFunTemporaryService; |
| | | import com.yeshi.buwan.util.BeanUtil; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import com.yeshi.buwan.util.video.AcfunApiUtil; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.test.context.ContextConfiguration; |
| | | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 |
| | | @ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | @WebAppConfiguration |
| | | //@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 |
| | | //@ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | //@WebAppConfiguration |
| | | public class AcfunTest { |
| | | |
| | | @Resource |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | @Test |
| | | public void getVideoList() { |
| | | AcfunApiUtil.videoList(""); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | @Test |
| | | public void refound() { |
| | | String orderNo = "buwan_vip_48"; |
| | | String orderNo = "buwan_vip_80"; |
| | | try { |
| | | AlipayH5PayUtil.refund(getAppInfo(), orderNo, null, new BigDecimal("14.8"), orderNo+"_1"); |
| | | } catch (AlipayApiException e) { |
| | |
| | | |
| | | import org.hibernate.HibernateException; |
| | | import org.hibernate.Session; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.orm.hibernate4.HibernateCallback; |
| | | |
| | | import com.yeshi.buwan.dao.VideoInfoDao; |
| | |
| | | import com.yeshi.buwan.iqiyi.entity.VideoIqiyi; |
| | | import com.yeshi.buwan.service.imp.ClearService; |
| | | import com.yeshi.buwan.util.BeanUtil; |
| | | import org.springframework.test.context.ContextConfiguration; |
| | | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; |
| | | import org.springframework.test.context.web.WebAppConfiguration; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | /** |
| | | * 清除时间比较久远的小视频数据 |
| | | * |
| | | * @author Administrator |
| | | * |
| | | */ |
| | | @RunWith(SpringJUnit4ClassRunner.class) |
| | | @ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | @WebAppConfiguration |
| | | public class ClearVideo { |
| | | |
| | | public static void main(String[] args) { |
| | | @Resource |
| | | public ClearService clearService; |
| | | |
| | | @Test |
| | | public void main() { |
| | | // ClearService clearService = BeanUtil.getBean(ClearService.class); |
| | | // for (int i = 0; i < 1000; i++) { |
| | | // clearService.clearDependVideo(); |
| | | // } |
| | | ClearService clearService = BeanUtil.getBean(ClearService.class); |
| | | |
| | | for (int i = 0; i < 300; i++) { |
| | | long[] typeIds = new long[] { 299,242,216,249,290,219 }; |
| | | for (long id : typeIds) { |
| | | clearService.clearVideos(new long[] { id }, "2019-01-20"); |
| | | clearService.clearVideos(new long[]{id}, "2021-02-01"); |
| | | } |
| | | } |
| | | // } |
| | |
| | | |
| | | } |
| | | |
| | | @Test |
| | | public void clearDepend(){ |
| | | clearService.clearDependVideo(); |
| | | } |
| | | |
| | | } |
| | |
| | | package com.hxh.spring.test; |
| | | |
| | | import com.yeshi.buwan.util.DESUtil; |
| | | |
| | | public class DES { |
| | | @org.junit.Test |
| | | public void test1() { |
| | | // StringBuilder builder = new StringBuilder("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"); |
| | | // System.out.println(DESUtil.decode(builder.toString())); |
| | | System.out.println(DESUtil.decode("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")); |
| | | } |
| | | } |
| | |
| | | |
| | | import com.yeshi.buwan.dao.base.MongodbBaseDao; |
| | | import com.yeshi.buwan.dao.video.VideoResourceVersionMapDao; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.video.VideoResourceVersionMap; |
| | | import com.yeshi.buwan.service.inter.video.VideoResourceVersionMapService; |
| | | import org.yeshi.utils.generater.SpringComponentGenerater; |
| | |
| | | @org.junit.Test |
| | | public void createDao() { |
| | | try { |
| | | SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(MongodbBaseDao.class).setDaoPackageName("com.yeshi.buwan.dao.video").setEntityClass(VideoResourceVersionMap.class).create(), "D:\\workspace\\BuWan\\src\\main\\java\\com\\yeshi\\buwan\\dao\\video\\"); |
| | | SpringComponentGenerater.createMongoDao(new MongoDBDaoData.Builder().setBaseDaoClass(MongodbBaseDao.class).setDaoPackageName("com.yeshi.buwan.dao.video").setEntityClass(VideoInfo.class).create(), "D:\\workspace\\BuWan\\src\\main\\java\\com\\yeshi\\buwan\\dao\\video\\"); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | |
| | | |
| | | import com.google.gson.Gson; |
| | | import com.yeshi.buwan.dao.juhe.iqiyi.IqiyiAlbum2Dao; |
| | | import com.yeshi.buwan.dao.juhe.iqiyi.VideoIqiyi2Dao; |
| | | import com.yeshi.buwan.dao.juhe.iqiyi.VideoIqiyiDao; |
| | | import com.yeshi.buwan.domain.ResourceVideo; |
| | | import com.yeshi.buwan.domain.VideoInfo; |
| | | import com.yeshi.buwan.domain.VideoResource; |
| | | import com.yeshi.buwan.funtv.FunTVUtil2; |
| | | import com.yeshi.buwan.funtv.entity.VideoFunTV2; |
| | | import com.yeshi.buwan.iqiyi.IqiYiNewAPI; |
| | | import com.yeshi.buwan.iqiyi.entity.IqiyiAlbum2; |
| | | import com.yeshi.buwan.iqiyi.entity.VideoIqiyi; |
| | | import com.yeshi.buwan.iqiyi.entity.VideoIqiyi2; |
| | | import com.yeshi.buwan.iqiyi.util.IqiyiUtil; |
| | | import com.yeshi.buwan.iqiyi.util.IqiyiUtil2; |
| | | import com.yeshi.buwan.iqiyi.vo.IqiyiAlbumListResult; |
| | | import com.yeshi.buwan.job.SMSJob; |
| | | import com.yeshi.buwan.job.video.Iqiyi2VideoUpdate; |
| | | import com.yeshi.buwan.query.Iqiyi2AlbumQuery; |
| | | 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.inter.juhe.Iqiyi2Service; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.util.*; |
| | | import com.yeshi.buwan.util.mq.CMQManager; |
| | | import net.sf.json.JSONArray; |
| | |
| | | private VideoInfoService videoInfoService; |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrDataManager; |
| | | private SolrAlbumVideoDataManager solrDataManager; |
| | | |
| | | @Test |
| | | public void addResources() { |
| | |
| | | import com.yeshi.buwan.pptv.entity.PPTVSeries; |
| | | import com.yeshi.buwan.service.inter.LoginUserService; |
| | | import com.yeshi.buwan.service.inter.juhe.PPTVService; |
| | | import com.yeshi.buwan.util.log.LoggerUtil; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.test.context.ContextConfiguration; |
| | | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; |
| | | import org.springframework.test.context.web.WebAppConfiguration; |
| | | import org.yeshi.utils.HtmlToolUtil; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.List; |
| | |
| | | } |
| | | } |
| | | |
| | | @Test |
| | | public void login() { |
| | | PPTVApiUtil.login("zcoAY6ev7RpYSLzXKtWybniCK+sgBiCARUii_uyNdFw-"); |
| | | } |
| | | |
| | | |
| | | @Test |
| | | public void getApiDetail() { |
| | |
| | | public void getOpenId() { |
| | | //CODE:XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg= |
| | | // PPTVApiUtil.login("XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg="); |
| | | String pptvUid = PPTVUtil.decryptPPTVCode("XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg=").pptvUid; |
| | | String pptvUid = "buwan_844600";//PPTVUtil.decryptPPTVCode("XefbSM0H8BC9kaEGEjHF2U7wd6Sd9ec1oSUmG1gZDTg=").pptvUid; |
| | | String openId = PPTVApiUtil.getOpenId(pptvUid); |
| | | System.out.println(openId); |
| | | |
| | |
| | | |
| | | @Test |
| | | public void addVideoInfo() { |
| | | PPTVSeries series = pptvService.getSeriesDetail("4205"); |
| | | PPTVSeries series = pptvService.getSeriesDetail("26796"); |
| | | pptvService.addToVideoInfo(series); |
| | | } |
| | | |
| | | @Test |
| | | public void offline() { |
| | | List<String[]> list = HtmlToolUtil.parseSQLYogExportHtmData("C:\\Users\\Administrator\\Desktop\\草稿\\PPTV重复的电视剧.htm", 1); |
| | | for (int i = 1000; i < list.size(); i++) { |
| | | String[] sts = list.get(i); |
| | | String name = sts[0]; |
| | | Query query = new Query(); |
| | | query.addCriteria(Criteria.where("name").is(name)); |
| | | PPTVSeries series = pptvSeriesDao.findOne(query); |
| | | if (series != null) { |
| | | pptvService.offLineSeries(series.getInfoID()); |
| | | //添加到详情 |
| | | try { |
| | | Thread.sleep(1000 * 3L); |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | series = pptvService.getSeriesDetail(series.getInfoID()); |
| | | pptvService.addToVideoInfo(series); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | @Test |
| | | public void logs() { |
| | | LoggerUtil.getVIPLogger().info("123123"); |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | package com.hxh.spring.test; |
| | | |
| | | import com.yeshi.buwan.dao.HomeNoticeDao; |
| | | import com.yeshi.buwan.domain.SolrVideo; |
| | | import com.yeshi.buwan.dto.search.SolrResultDTO; |
| | | import com.yeshi.buwan.dto.search.SolrVideoSearchFilter; |
| | | import com.yeshi.buwan.service.imp.VideoInfoService; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumDataManager; |
| | | import org.apache.http.auth.Credentials; |
| | | import org.apache.http.auth.UsernamePasswordCredentials; |
| | | import org.apache.solr.client.solrj.SolrClient; |
| | | import org.apache.solr.client.solrj.impl.HttpSolrClient; |
| | | import com.yeshi.buwan.service.manager.SolrAlbumVideoDataManager; |
| | | import com.yeshi.buwan.service.manager.SolrCommonVideoDataManager; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.data.solr.core.SolrTemplate; |
| | | import org.springframework.data.solr.server.support.HttpSolrClientFactory; |
| | | 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.security.Principal; |
| | | import java.util.Optional; |
| | | |
| | | |
| | | //Optional@RunWith(SpringJUnit4ClassRunner.class) |
| | | //@ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | //@WebAppConfiguration |
| | | @RunWith(SpringJUnit4ClassRunner.class) |
| | | @ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | @WebAppConfiguration |
| | | public class SolrTest { |
| | | |
| | | @Resource |
| | | private SolrAlbumDataManager solrDataManager; |
| | | private SolrAlbumVideoDataManager solrDataManager; |
| | | |
| | | @Resource |
| | | private SolrCommonVideoDataManager solrCommonVideoDataManager; |
| | | |
| | | @Resource |
| | | private VideoInfoService videoInfoService; |
| | |
| | | |
| | | @Test |
| | | public void addSolrAlbum() { |
| | | // solrDataManager.syncAlbum("8224447"); |
| | | SolrClient solrClient = new HttpSolrClient.Builder("http://203.195.196.115:8983/solr").build(); |
| | | Credentials credentials = new UsernamePasswordCredentials("solr", "IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="); |
| | | HttpSolrClientFactory factory = new HttpSolrClientFactory(solrClient, null, null); |
| | | SolrTemplate solrTemplate = new SolrTemplate(factory); |
| | | solrTemplate.afterPropertiesSet(); |
| | | Optional<SolrVideo> solrVideoOptional = solrTemplate.getById("buwan_album", "8077525", SolrVideo.class); |
| | | System.out.println(solrVideoOptional); |
| | | solrDataManager.syncAllAlbum(); |
| | | System.out.println(); |
| | | } |
| | | |
| | | |
| | | @Test |
| | | public void syncSolrCommonVideo() { |
| | | // solrCommonVideoDataManager.syncAllVideo(); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | import org.junit.Test; |
| | | |
| | | import com.yeshi.buwan.util.BeanUtil; |
| | | import com.yeshi.buwan.util.email.MailSenderUtil; |
| | | import com.yeshi.buwan.util.news.SouGouParser; |
| | | |
| | | public class SouGouTest { |
| | | @Test |
| | | public void sougouTest() { |
New file |
| | |
| | | package com.hxh.spring.test; |
| | | |
| | | import com.yeshi.buwan.dao.user.LoginUserDao; |
| | | import com.yeshi.buwan.dao.user.LoginUserExtraDao; |
| | | import com.yeshi.buwan.domain.user.LoginUser; |
| | | import com.yeshi.buwan.domain.user.LoginUserExtra; |
| | | import com.yeshi.buwan.util.StringUtil; |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | 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.util.List; |
| | | |
| | | @RunWith(SpringJUnit4ClassRunner.class) |
| | | @ContextConfiguration(locations = {"classpath:spring.xml"}) |
| | | @WebAppConfiguration |
| | | public class UserTest { |
| | | |
| | | @Resource |
| | | private LoginUserExtraDao loginUserExtraDao; |
| | | |
| | | @Resource |
| | | private LoginUserDao loginUserDao; |
| | | |
| | | @Test |
| | | public void test() { |
| | | Query query = new Query(); |
| | | List<LoginUserExtra> extraList = loginUserExtraDao.findList(query); |
| | | for (LoginUserExtra extra : extraList) { |
| | | LoginUser user = loginUserDao.find(LoginUser.class, extra.getId()); |
| | | if (user != null && StringUtil.isNullOrEmpty(user.getPortrait())) { |
| | | if (!StringUtil.isNullOrEmpty(extra.getWxPortrait())) { |
| | | user.setPortrait(extra.getWxPortrait()); |
| | | loginUserDao.update(user); |
| | | } else if (!StringUtil.isNullOrEmpty(extra.getQqPortrait())) { |
| | | user.setPortrait(extra.getQqPortrait()); |
| | | loginUserDao.update(user); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | import com.yeshi.buwan.domain.vip.VIPPrice; |
| | | import com.yeshi.buwan.domain.vip.VIPPriceType; |
| | | import com.yeshi.buwan.exception.vip.VIPException; |
| | | import com.yeshi.buwan.pptv.PPTVVipManager; |
| | | import com.yeshi.buwan.service.inter.vip.VIPPriceService; |
| | | import com.yeshi.buwan.service.inter.vip.VIPService; |
| | | import com.yeshi.buwan.util.Constant; |
| | |
| | | |
| | | @Resource |
| | | private VIPService vipService; |
| | | |
| | | @Resource |
| | | private PPTVVipManager pptvVipManager; |
| | | |
| | | @Test |
| | | public void addVIPPrice() { |
| | |
| | | |
| | | @Test |
| | | public void paySuccess() { |
| | | try { |
| | | vipService.checkOrderPayState(23 + ""); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | // try { |
| | | // vipService.paySuccess("",VIPOrderRecord.PAY_WAY_WX,new BigDecimal("14.8"),) |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | |
| | | |
| | | @Test |
| | | public void test3() throws Exception { |
| | | |
| | | vipService.checkOrderPayState(54+""); |
| | | |
| | | VIPOrderRecord record = vipService.getOrderRecord("82"); |
| | | pptvVipManager.buyVIP(record); |
| | | } |
| | | |
| | | } |