index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. <template>
  2. <z-paging
  3. class="content-page-wrap flex-column"
  4. ref="paging"
  5. v-model="videoList"
  6. @query="getVideoList"
  7. :refresher-enabled="false"
  8. >
  9. <template #top>
  10. <view style="padding: 30rpx">
  11. <top-main></top-main>
  12. <view class="search-box flex-left">
  13. <view @click="toSearch" class="flex-1">
  14. <u-input
  15. placeholder="电影 / 电视剧 / 动漫"
  16. height="72rpx"
  17. >
  18. <template #prefix>
  19. <image
  20. src="@/static/img/icon-search.svg"
  21. style="
  22. width: 48rpx;
  23. height: 48rpx;
  24. margin-right: 20rpx;
  25. "
  26. ></image>
  27. </template>
  28. </u-input>
  29. </view>
  30. <view @click="goHistory" class="input-right flex-left">
  31. <image src="@/static/img/icon-history.svg"></image>
  32. </view>
  33. </view>
  34. <view style="margin-top: 30rpx">
  35. <u-tabs
  36. :list="tabList"
  37. keyName="title"
  38. lineWidth="0"
  39. lineHeight="0"
  40. :activeStyle="{
  41. color: '#000000',
  42. fontWeight: 'bold',
  43. transform: 'scale(1.05)',
  44. fontSize: '40rpx',
  45. }"
  46. :inactiveStyle="{
  47. color: '#717171',
  48. transform: 'scale(1)',
  49. fontSize: '30rpx',
  50. }"
  51. itemStyle="padding: 0 42rpx 0 0; height: 70rpx;"
  52. @click="setTabSelect"
  53. ></u-tabs>
  54. </view>
  55. </view>
  56. </template>
  57. <!-- 推荐视频 -->
  58. <template v-if="tabIndex == 0">
  59. <!-- 轮播图 -->
  60. <view style="margin-bottom: 30rpx">
  61. <image src="@/static/img/user-manual.svg" @click="openFile"></image>
  62. <!-- <u-swiper
  63. :list="['@/static/img/user-manual.svg']"
  64. height="380rpx"
  65. radius="10rpx"
  66. indicator
  67. indicatorMode="line"
  68. imgMode="aspectFill"
  69. keyName="image_url"
  70. showTitle
  71. circular
  72. @click="openFile"
  73. ></u-swiper> -->
  74. </view>
  75. <!-- 推荐卡片 -->
  76. <view class="flex-column" v-for="(card, index) in videoList">
  77. <view
  78. class="flex-column"
  79. style="background-color: #fff; border-radius: 20rpx"
  80. >
  81. <view class="hotMain flex-column">
  82. <view
  83. class="flex-row justify-between"
  84. style="padding: 10rpx 0"
  85. >
  86. <text style="font-weight: 600; font-size: 36rpx">{{
  87. card.title
  88. }}</text>
  89. <!-- <view
  90. style="border-radius: 50px; padding: 5rpx 20rpx"
  91. @tap="toMore(card)"
  92. >
  93. <u-icon
  94. name="arrow-right"
  95. color="#717171"
  96. size="36rpx"
  97. bold
  98. ></u-icon>
  99. </view> -->
  100. </view>
  101. <view
  102. class="flex-row flex-wrap"
  103. style="padding: 5rpx 0"
  104. >
  105. <view
  106. class="videoCardMain flex-column"
  107. v-for="(video, index) in card.children"
  108. :key="index"
  109. @tap="goPlayVideo(video)"
  110. >
  111. <view class="videoCardImgBox">
  112. <image
  113. class="videoCardImg"
  114. :src="video.img"
  115. mode="aspectFill"
  116. ></image>
  117. <text class="video-state">
  118. <!-- {{ video.state }} -->
  119. 正片
  120. </text>
  121. </view>
  122. <view class="videoCardName line_1">
  123. {{ video.title }}
  124. </view>
  125. </view>
  126. </view>
  127. </view>
  128. </view>
  129. </view>
  130. </template>
  131. <!-- 其他视频 -->
  132. <template v-else>
  133. <view class="tag-box">
  134. <scroll-view
  135. class="hideScrollbar"
  136. :scroll-left="scrollLeft"
  137. :scroll-x="true"
  138. :show-scrollbar="false"
  139. v-for="(item, index) in searchData"
  140. :key="index"
  141. >
  142. <text class="tag-row title">{{ item.title }}</text>
  143. <view
  144. v-for="(items, indexs) in item.labelArr"
  145. :key="indexs"
  146. class="tag-row"
  147. >
  148. <text
  149. class="label"
  150. :class="{
  151. active: items.value == selectTags[index],
  152. }"
  153. @click="handleTag(index, items.value)"
  154. >{{ items.label }}</text
  155. >
  156. </view>
  157. </scroll-view>
  158. </view>
  159. <view class="flex-row flex-wrap">
  160. <view
  161. class="videoCardMain flex-column"
  162. v-for="(item, index) in videoList"
  163. :key="index"
  164. @click="goPlayVideo(item)"
  165. >
  166. <view class="videoCardImgBox">
  167. <image
  168. class="videoCardImg"
  169. :src="item.img"
  170. mode="aspectFill"
  171. ></image>
  172. <text class="video-state">
  173. <!-- {{ video.state }} -->
  174. 正片
  175. </text>
  176. </view>
  177. <view class="videoCardName line_1">
  178. {{ item.title }}
  179. </view>
  180. </view>
  181. </view>
  182. </template>
  183. </z-paging>
  184. </template>
  185. <script>
  186. import topMain from "@/components/topMain";
  187. import { listPackage } from "@/utils/apiMethods.js";
  188. export default {
  189. components: {
  190. topMain,
  191. },
  192. data() {
  193. return {
  194. tabIndex: 0,
  195. scrollLeft: 0,
  196. selectTags: ["", "", "", "", "1"], //选中的标签数据
  197. //搜索内容
  198. searchData: [
  199. {
  200. title: "类型:",
  201. labelArr: [
  202. { label: "全部", value: "" },
  203. // { label: "Netflix", value: "Netflix" },
  204. { label: "剧情", value: "剧情" },
  205. { label: "喜剧", value: "喜剧" },
  206. { label: "动作", value: "动作" },
  207. { label: "爱情", value: "爱情" },
  208. { label: "恐怖", value: "恐怖" },
  209. { label: "惊悚", value: "惊悚" },
  210. { label: "犯罪", value: "犯罪" },
  211. { label: "科幻", value: "科幻" },
  212. { label: "悬疑", value: "悬疑" },
  213. { label: "奇幻", value: "奇幻" },
  214. { label: "冒险", value: "冒险" },
  215. { label: "战争", value: "战争" },
  216. { label: "历史", value: "历史" },
  217. { label: "古装", value: "古装" },
  218. { label: "家庭", value: "家庭" },
  219. { label: "传记", value: "传记" },
  220. { label: "武侠", value: "武侠" },
  221. { label: "歌舞", value: "歌舞" },
  222. { label: "短片", value: "短片" },
  223. { label: "动画", value: "动画" },
  224. { label: "儿童", value: "儿童" },
  225. { label: "职场", value: "职场" },
  226. ],
  227. },
  228. {
  229. title: "地区:",
  230. labelArr: [
  231. { label: "全部", value: "" },
  232. { label: "大陆", value: "中国大陆" },
  233. { label: "香港", value: "中国香港" },
  234. { label: "台湾", value: "中国台湾" },
  235. { label: "美国", value: "美国" },
  236. { label: "日本", value: "日本" },
  237. { label: "韩国", value: "韩国" },
  238. { label: "英国", value: "英国" },
  239. { label: "法国", value: "法国" },
  240. { label: "德国", value: "德国" },
  241. { label: "印度", value: "印度" },
  242. { label: "泰国", value: "泰国" },
  243. { label: "丹麦", value: "丹麦" },
  244. { label: "瑞典", value: "瑞典" },
  245. { label: "巴西", value: "巴西" },
  246. { label: "加拿大", value: "加拿大" },
  247. { label: "俄罗斯", value: "俄罗斯" },
  248. { label: "意大利", value: "意大利" },
  249. { label: "比利时", value: "比利时" },
  250. { label: "爱尔兰", value: "爱尔兰" },
  251. { label: "西班牙", value: "西班牙" },
  252. { label: "澳大利亚", value: "澳大利亚" },
  253. { label: "其他", value: "其他" },
  254. ],
  255. },
  256. {
  257. title: "语言:",
  258. labelArr: [
  259. { label: "全部", value: "" },
  260. { label: "国语", value: "国语" },
  261. { label: "粤语", value: "粤语" },
  262. { label: "英语", value: "英语" },
  263. { label: "日语", value: "日语" },
  264. { label: "韩语", value: "韩语" },
  265. { label: "法语", value: "法语" },
  266. { label: "其他", value: "其他" },
  267. ],
  268. },
  269. {
  270. title: "年份:",
  271. labelArr: [
  272. { label: "全部", value: "" },
  273. { label: "2024", value: "2024" },
  274. { label: "2023", value: "2023" },
  275. { label: "2022", value: "2022" },
  276. { label: "2021", value: "2021" },
  277. { label: "2020", value: "2020" },
  278. { label: "10年代", value: "2010_2019" },
  279. { label: "00年代", value: "2000_2009" },
  280. { label: "90年代", value: "1990_1999" },
  281. { label: "80年代", value: "1980_1989" },
  282. { label: "更早", value: "1979" },
  283. ],
  284. },
  285. {
  286. title: "排序:",
  287. labelArr: [
  288. { label: "综合", value: "1" },
  289. { label: "最新", value: "2" },
  290. { label: "最热", value: "3" },
  291. { label: "评分", value: "4" },
  292. ],
  293. },
  294. ],
  295. // {
  296. // title: "类型:",
  297. // labelArr: [
  298. // { label: "全部", value: "" },
  299. // { label: "逆袭", value: "逆袭" },
  300. // { label: "甜宠", value: "甜宠" },
  301. // { label: "虐恋", value: "虐恋" },
  302. // { label: "穿越", value: "穿越" },
  303. // { label: "重生", value: "重生" },
  304. // { label: "剧情", value: "剧情" },
  305. // { label: "科幻", value: "科幻" },
  306. // { label: "武侠", value: "武侠" },
  307. // { label: "爱情", value: "爱情" },
  308. // { label: "动作", value: "动作" },
  309. // { label: "战争", value: "战争" },
  310. // { label: "冒险", value: "冒险" },
  311. // { label: "其它", value: "其它" },
  312. // ],
  313. // },
  314. tabList: [
  315. {
  316. title: "推荐",
  317. url: "https://www.keke1.app",
  318. },
  319. {
  320. title: "电影",
  321. url: "https://www.keke1.app/show/1",
  322. },
  323. {
  324. title: "连续剧",
  325. url: "https://www.keke1.app/show/2",
  326. },
  327. {
  328. title: "动漫",
  329. url: "https://www.keke1.app/show/3",
  330. },
  331. {
  332. title: "综艺",
  333. url: "https://www.keke1.app/show/4",
  334. },
  335. {
  336. title: "短剧",
  337. url: "https://www.keke1.app/show/6",
  338. },
  339. ],
  340. videoList: [],
  341. isLoading: false,
  342. };
  343. },
  344. methods: {
  345. openFile() {
  346. uni.navigateTo({
  347. url: `/pages/index/policy`,
  348. });
  349. // uni.openDocument({
  350. // filePath: "/Movie/static/INK视频用户手册.doc",
  351. // success: function (res) {
  352. // console.log(res, "打开文件成功");
  353. // },
  354. // fail: (err) => {
  355. // uni.showToast({
  356. // title: "打开文件失败请重试",
  357. // icon: "none",
  358. // });
  359. // },
  360. // });
  361. },
  362. // 前往历记录列表
  363. goHistory() {
  364. uni.navigateTo({
  365. url: `/pages/my/viewHistorys`,
  366. });
  367. },
  368. toSearch() {
  369. uni.navigateTo({
  370. url: "/pages/serach/serach",
  371. });
  372. },
  373. search() {
  374. let vm = this;
  375. vm.videoList = [];
  376. vm.$refs.paging.reload();
  377. // vm.getVideoList();
  378. },
  379. handleTag(index, val) {
  380. let vm = this;
  381. vm.selectTags[index] = val;
  382. vm.search();
  383. },
  384. async getHomeData() {
  385. let vm = this;
  386. let data = [];
  387. for (let i = 1; i < 6; i++) {
  388. data.push(await vm.getRecommendItme(i));
  389. }
  390. vm.$refs.paging.complete(data);
  391. },
  392. //获取视频列表
  393. getVideoList(pageNo = 1) {
  394. let vm = this;
  395. if (vm.tabIndex == 0) {
  396. this.getHomeData();
  397. } else {
  398. this.getTabData(pageNo);
  399. }
  400. },
  401. getTabData(pageNo) {
  402. let vm = this;
  403. uni.showLoading({
  404. title: "加载中",
  405. });
  406. let str = vm.selectTags.join("-");
  407. let url = `${vm.tabList[vm.tabIndex].url}-${str}-${pageNo}.html`;
  408. vm.isLoading = true;
  409. uni.request({
  410. url: url,
  411. method: "GET",
  412. success: async (res) => {
  413. uni.hideLoading();
  414. let data = listPackage(res.data, true);
  415. vm.$refs.paging.complete(data);
  416. },
  417. fail: (err) => {
  418. uni.hideLoading();
  419. vm.$refs.paging.complete(false);
  420. },
  421. });
  422. },
  423. getRecommendItme(i) {
  424. let vm = this;
  425. return new Promise((resolve, reject) => {
  426. let str = vm.selectTags.join("-");
  427. let url = `${vm.tabList[i].url}-${str}-${1}.html`;
  428. let titleMap = {
  429. 1: "热门电影",
  430. 2: "热门连续剧",
  431. 3: "热门动漫",
  432. 4: "热门综艺",
  433. 5: "热门短剧",
  434. };
  435. uni.request({
  436. url: url, // 接口地址
  437. method: "GET", // 请求方法,可选值:GET、POST等
  438. success: (res) => {
  439. let obj = {
  440. title: titleMap[i],
  441. url: url,
  442. children: listPackage(res.data).splice(0, 6),
  443. };
  444. resolve(obj);
  445. },
  446. fail: (err) => {
  447. reject();
  448. },
  449. });
  450. });
  451. },
  452. goPlayVideo(row) {
  453. uni.navigateTo({
  454. url: "/pages/play/play?url=" + row.url,
  455. });
  456. },
  457. setTabSelect(data) {
  458. let vm = this;
  459. vm.tabIndex = data.index;
  460. vm.selectTags = ["", "", "", "", "1"];
  461. vm.scrollLeft = 0;
  462. vm.search();
  463. },
  464. },
  465. };
  466. </script>
  467. <style lang="less" scoped>
  468. .tag-box {
  469. margin: 40rpx 0 0;
  470. .title {
  471. margin-right: 20rpx;
  472. }
  473. .tag-row {
  474. display: flex;
  475. align-items: center;
  476. .label {
  477. padding: 12rpx 18rpx;
  478. color: #5c5c5c;
  479. font-size: 28rpx;
  480. border-radius: 8rpx;
  481. }
  482. .active {
  483. color: #1dbc46;
  484. background: #d0f8dd;
  485. }
  486. }
  487. /deep/.uni-scroll-view-content {
  488. display: flex;
  489. margin: 0 18rpx 34rpx 0;
  490. }
  491. }
  492. </style>