Explorar o código

电影推广页

chenbiao %!s(int64=3) %!d(string=hai) anos
pai
achega
464da7b8a8

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/request/tmdb/DiscoverParams.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.request.tmdb;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author chan
+ * @date 2023/1/5 11:38 AM
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DiscoverParams {
+    private String with_genres = null;
+
+    private String sort_by = null;
+
+    private String watch_region = null;
+
+    private String without_companies = null;
+
+    public void setWith_genres(String with_genres) {
+        if(StringUtils.isBlank(with_genres)){
+            return;
+        }
+        this.with_genres = with_genres;
+    }
+
+    public void setSort_by(String sort_by) {
+        if(StringUtils.isBlank(sort_by)){
+            return;
+        }
+        this.sort_by = sort_by;
+    }
+
+    public void setWatch_region(String watch_region) {
+        if(StringUtils.isBlank(watch_region)){
+            return;
+        }
+        this.watch_region = watch_region;
+    }
+
+    public void setWithout_companies(String without_companies) {
+        if(StringUtils.isBlank(without_companies)){
+            return;
+        }
+        this.without_companies = without_companies;
+    }
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/response/tmdb/Trending.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.response.tmdb;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2023/1/4 12:03 PM
+ */
+@Data
+public class Trending {
+
+    @JsonProperty("adult")
+    private Boolean adult;
+
+    @JsonProperty("backdrop_path")
+    private String backdropPath;
+
+    private Integer id;
+
+    private String title;
+
+    @JsonProperty("original_language")
+    private String originalLanguage;
+
+    @JsonProperty("original_title")
+    private String originalTitle;
+
+    private String overview;
+
+    @JsonProperty("poster_path")
+    private String posterPath;
+
+    @JsonProperty("media_type")
+    private String mediaType;
+
+    @JsonProperty("genre_ids")
+    private List<Integer> genreIds;
+
+    private Double popularity;
+
+    @JsonProperty("releaseDate")
+    private String release_date;
+
+    private Boolean video;
+
+    @JsonProperty("voteAverage")
+    private Double vote_average;
+
+    @JsonProperty("vote_count")
+    private Integer voteCount;
+
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/model/response/tmdb/WatchProviders.java

@@ -0,0 +1,19 @@
+package com.cyksj.model.response.tmdb;
+
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2023/1/4 3:48 PM
+ */
+@Data
+public class WatchProviders {
+
+    private Integer display_priority;
+
+    private String logo_path;
+
+    private String provider_name;
+
+    private Integer provider_id;
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/response/tmdb/WatchProvidersRegions.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.response.tmdb;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2023/1/4 12:03 PM
+ */
+@Data
+public class WatchProvidersRegions {
+
+    private String iso_3166_1;
+
+    private String english_name;
+
+    private String native_name;
+}

+ 6 - 0
netflix-service/pom.xml

@@ -29,6 +29,12 @@
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.holgerbrandl</groupId>
+            <artifactId>themoviedbapi</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 10 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -310,6 +310,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (shopConfig != null) {
 			shopId = shopConfig.getAppId();
 		}
+		orderDon.setType(OrderDon.Type.ALI_PAY);
 		orderDon.setShopId(shopId);
 		this.updateById(orderDon);
 		H5JsPayParams params = weChatService.getJsPayParams(
@@ -386,9 +387,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (null == order) {
 			throw BusinessRuntimeException.getInstance("订单不存在.");
 		}
+		String appId = map.get("mch_id");
 
 		// 校验签名
-		boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(Optional.ofNullable(order.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID)).getSecret());
+		boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(appId).getSecret());
 		if (!f) {
 			log.error("回调数据:{}", map);
 			throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
@@ -409,6 +411,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		order.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 
 		order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
+		order.setShopId(appId);
 
 		if (StringUtils.isBlank(order.getOpenId())) {
 			order.setOpenId(map.get("openid"));
@@ -650,13 +653,15 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	@Override
 	public AliPayParams aliPay(Long orderId, String productCode) throws Exception {
 		OrderDon orderDon = getById(orderId);
-		String appId = null;
+		String appId = ShopConfig.ZFB_DEFAULT_APP_ID;
+
 		if (orderDon.getPopularizeId() != null) {
 			ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"zfb");
 			if (shopConfig != null) {
 				appId = shopConfig.getAppId();
 			}
 		}
+		orderDon.setType(OrderDon.Type.ALI_PAY);
 		orderDon.setShopId(appId);
 		this.updateById(orderDon);
 		return commonAliPay(orderId, productCode, appId);
@@ -676,7 +681,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getPopularizeId() == null) {
 			orderDon.setShopId(null);
 		}
-		boolean signVerified = AlipaySignature.rsaCheckV1(params,shopConfigMapper.getByAppId((Optional.ofNullable(orderDon.getShopId()).orElse(ShopConfig.ZFB_DEFAULT_APP_ID))).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		String appId = params.get("app_id");
+		boolean signVerified = AlipaySignature.rsaCheckV1(params,shopConfigMapper.getByAppId(appId).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
 		if (!signVerified) {
 			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
 			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
@@ -698,6 +704,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setTransactionId(transactionId);
 		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
 		orderDon.setPayTime(payTime);
+		orderDon.setShopId(appId);
 		//修改车位状态并发送模板消息
 		updateCarParkAndSendMsg(goodsDon, sku, orderDon);
 		orderDon.setType(OrderDon.Type.ALI_PAY);

+ 24 - 0
netflix-service/src/main/java/com/cyksj/util/TmdbUtil.java

@@ -0,0 +1,24 @@
+package com.cyksj.util;
+
+import info.movito.themoviedbapi.TmdbApi;
+
+/**
+ * @author chan
+ * @date 2023/1/3 11:57 AM
+ */
+public class TmdbUtil {
+
+    public static final String apiKey = "717fac62b4e7dce0d54159c29f46900c";
+
+    private static TmdbApi instance;
+
+
+    //加锁变成多线程安全
+    public static synchronized TmdbApi getInstance(){
+        if (instance == null){
+            instance = new TmdbApi(apiKey);
+        }
+        return instance;
+    }
+
+}

+ 218 - 0
netflix-web/src/main/java/com/cyksj/web/controller/tmdb/TmdbController.java

@@ -0,0 +1,218 @@
+package com.cyksj.web.controller.tmdb;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.request.tmdb.DiscoverParams;
+import com.cyksj.model.response.tmdb.Trending;
+import com.cyksj.model.response.tmdb.WatchProviders;
+import com.cyksj.model.response.tmdb.WatchProvidersRegions;
+import com.cyksj.util.TmdbUtil;
+import info.movito.themoviedbapi.TmdbApi;
+import info.movito.themoviedbapi.TmdbSearch;
+import info.movito.themoviedbapi.TvResultsPage;
+import info.movito.themoviedbapi.model.Genre;
+import info.movito.themoviedbapi.model.MovieDb;
+import info.movito.themoviedbapi.model.core.MovieResultsPage;
+import info.movito.themoviedbapi.model.core.ResultsPage;
+import info.movito.themoviedbapi.model.tv.TvSeries;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author chan
+ * @date 2023/1/4 10:48 AM
+ */
+@RestController
+@RequestMapping("/tmdb")
+@RequiredArgsConstructor
+public class TmdbController {
+
+    /**
+     * 搜索
+     */
+    @GetMapping("/search")
+    public Result<TmdbSearch.MultiListResultsPage> search(String keywords, Integer page){
+        TmdbApi tmdbApi = TmdbUtil.getInstance();
+        return GatewayResponse.SUCCESS.newBuilder().toResult(tmdbApi.getSearch().searchMulti(keywords,"zh-CN",page));
+    }
+
+    /**
+     * 趋势
+     * timeWindows  day 日趋势 week 周趋势
+     */
+    @GetMapping("/trending")
+    public Result<ResultsPage<Trending>>trending(String timeWindows){
+        String all = HttpUtil.get(String.format("https://api.themoviedb.org/3/trending/%s/%s" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN", "all", timeWindows));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(JSONUtil.parseObj(all).toBean(ResultsPage.class));
+    }
+
+    /**
+     * 首页tv热门
+     */
+    @GetMapping("/tv/popular")
+    public Result<TvResultsPage>tvPopular(Integer page){
+        TvResultsPage popular = TmdbUtil.getInstance().getTvSeries().getPopular("zh-CN", page);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(popular);
+    }
+
+    /**
+     * 首页电影热门
+     */
+    @GetMapping("/movie/popular")
+    public Result<MovieResultsPage>moviePopular(Integer page){
+        MovieResultsPage popularMovies = TmdbUtil.getInstance().getMovies().getPopularMovies("zh-CN", page);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(popularMovies);
+    }
+
+    /**
+     * 首页tv高分
+     */
+    @GetMapping("/tv/top")
+    public Result<TvResultsPage>tvTop(Integer page){
+        TvResultsPage popular = TmdbUtil.getInstance().getTvSeries().getTopRated("zh-CN", page);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(popular);
+    }
+
+    /**
+     * 首页电影高分
+     */
+    @GetMapping("/movie/top")
+    public Result<MovieResultsPage>movieTop(Integer page){
+        MovieResultsPage popularMovies = TmdbUtil.getInstance().getMovies().getTopRatedMovies("zh-CN", page);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(popularMovies);
+    }
+
+    /**
+     * 地区列表
+     */
+    @GetMapping("/watch/providers/regions")
+    public Result<ResultsPage<WatchProvidersRegions>>watchProvidersRegions(){
+        ResultsPage<WatchProvidersRegions> regions = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/watch/providers/regions" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN")).toBean(ResultsPage.class);
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult(regions);
+    }
+
+    /**
+     * 可观看供应商
+     * watch_region 地区
+     */
+    @GetMapping("/watch/providers/movie")
+    public Result<ResultsPage<WatchProviders>> watchProvidersMovie(String watch_region){
+        String url = "https://api.themoviedb.org/3/watch/providers/movie" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN";
+        if (StringUtils.isNotBlank(watch_region)) {
+            url += "&watch_region=" + watch_region;
+        }
+        ResultsPage<WatchProviders> regions = JSONUtil.parseObj(HttpUtil.get(url)).toBean(ResultsPage.class);
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult(regions);
+    }
+
+    /**
+     * 可观看供应商
+     * watch_region 地区
+     */
+    @GetMapping("/watch/providers/tv")
+    public Result<ResultsPage<WatchProviders>>watchProvidersTv(String watch_region){
+        String url = "https://api.themoviedb.org/3/watch/providers/tv" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN";
+        if (StringUtils.isNotBlank(watch_region)) {
+            url += "&watch_region=" + watch_region;
+        }
+        ResultsPage<WatchProviders> regions = JSONUtil.parseObj(
+                HttpUtil.get(url))
+                .toBean(ResultsPage.class);
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult(regions);
+    }
+
+    /**
+     * 发现tv
+     */
+    @GetMapping("/tv/discover")
+    public Result<TvResultsPage>tvDiscover(Integer page, DiscoverParams discoverParams) throws Exception {
+        Map<String, Object> map = Jsons.toMap(JSONUtil.toJsonStr(discoverParams));
+        map.put("page",page);
+        map.put("api_key",TmdbUtil.apiKey);
+        map.put("language","zh-CN");
+        TvResultsPage resultsPage = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/discover/tv?" +  HttpUtil.toParams(map))).toBean(TvResultsPage.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(resultsPage);
+    }
+
+    /**
+     * 发现电影
+     */
+    @GetMapping("/movie/discover")
+    public Result<MovieResultsPage>movieDiscover(Integer page, DiscoverParams discoverParams){
+        Map<String, Object> map = Jsons.toMap(discoverParams);
+        map.put("page",page);
+        map.put("api_key",TmdbUtil.apiKey);
+        map.put("language","zh-CN");
+        MovieResultsPage popularMovies = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/discover/movie?" +  HttpUtil.toParams(map))).toBean(MovieResultsPage.class);
+
+        return GatewayResponse.SUCCESS.newBuilder().toResult(popularMovies);
+    }
+
+    /**
+     * 电影标签
+     */
+    @GetMapping("/genre/movie/list")
+    public Result<List<Genre>> genreList(){
+        List<Genre> genreList = TmdbUtil.getInstance().getGenre().getGenreList("zh-CN");
+        return GatewayResponse.SUCCESS.newBuilder().toResult(genreList);
+    }
+
+    /**
+     * tv标签
+     */
+    @GetMapping("/genre/tv/list")
+    public Result<List<Genre>> tvGenreList(){
+        List<Genre> genreList = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/genre/tv/list" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN")).getJSONArray("genres").toList(Genre.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(genreList);
+    }
+
+    /**
+     * 电影详情
+     */
+    @GetMapping("/movie/{movie_id}")
+    public Result<MovieDb> movieDetail(@PathVariable Integer movie_id){
+        MovieDb movie = TmdbUtil.getInstance().getMovies().getMovie(movie_id, "zh-CN");
+       return GatewayResponse.SUCCESS.newBuilder().toResult(movie);
+    }
+
+    /**
+     * tv详情
+     */
+    @GetMapping("/tv/{tv_id}")
+    public Result<TvSeries> tvDetail(@PathVariable Integer tv_id){
+        TvSeries series = TmdbUtil.getInstance().getTvSeries().getSeries(tv_id, "zh-CN");
+       return GatewayResponse.SUCCESS.newBuilder().toResult(series);
+    }
+
+    /**
+     * 电影可观看供应商
+     */
+    @GetMapping("/movie/{movie_id}/watch/providers")
+    public Result<Map<String,Object>> movieProviders(@PathVariable String movie_id){
+        Map<String,Object> result = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/movie/" + movie_id+ "/watch/providers" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN")).getBean("results",Map.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(result);
+    }
+
+    /**
+     * tv可观看供应商
+     */
+    @GetMapping("/tv/{tv_id}/watch/providers")
+    public Result<Map<String,Object>> tvProviders(@PathVariable String tv_id) {
+        Map<String,Object> result = JSONUtil.parseObj(HttpUtil.get("https://api.themoviedb.org/3/tv/" + tv_id+ "/watch/providers" + "?api_key=" + TmdbUtil.apiKey + "&language=zh-CN")).getBean("results",Map.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(result);
+    }
+
+}

+ 6 - 1
pom.xml

@@ -75,6 +75,12 @@
                 <version>1.26.0</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.github.holgerbrandl</groupId>
+                <artifactId>themoviedbapi</artifactId>
+                <version>1.12</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -120,7 +126,6 @@
             <artifactId>bean-searcher-boot-starter</artifactId>
             <version>3.8.0</version>
         </dependency>
-
     </dependencies>
 
     <build>