金诚优选前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

844 lines
23 KiB

  1. <template>
  2. <view>
  3. <view id="find-search">
  4. <view class="menu-box">
  5. <view class="navbar">
  6. <view class="item" :class="activeIndex == 0? 'active' : ''" @tap="tabClick" data-index="0" style="flex:.5">
  7. <span>全部</span>
  8. </view>
  9. <view class="item" :class="activeIndex == index+1 ? 'active' : ''" @tap="tabClick" v-for="(item, index) in conditions.categories" :key="index" v-if="index < 2" :data-index="index+1" :data-id="item.id">
  10. <span>{{item.name}}</span>
  11. </view>
  12. <view class="item" :class="activeIndex == 3 ? 'active' : ''" @tap="moreClick" style="flex:.8">
  13. <span>更多
  14. <view class="iconfont icon-jiantou"></view>
  15. </span>
  16. </view>
  17. <view class="item" @tap="filterClick" style="flex: .5">
  18. <span>筛选
  19. <view class="iconfont icon-filter"></view>
  20. </span>
  21. </view>
  22. </view>
  23. <!-- 点击更多弹出-->
  24. <view class="more-list" v-if="isMore && conditions.categories.length">
  25. <view class="item" :class="item.id == category_id ? 'active' : ''" v-for="(item, index) in conditions.categories" :key="index" @tap="changeCategories" :data-index="index" :data-id="item.id">{{item.name}}</view>
  26. </view>
  27. </view>
  28. <view class="content-box">
  29. <view v-if="list && list[0]">
  30. <view v-for="(items, idx) in list" :key="idx" >
  31. <view class="something__box" v-for="(item, index) in items" :key="index" >
  32. <view class="li-item">
  33. <view class="something__item">
  34. <view class="item__user">
  35. <view class="user__img">
  36. <image :src="item.avatar"></image>
  37. </view>
  38. <view class="user__title">
  39. <view class="title__box">
  40. <view class="title__title">
  41. <span>{{item.nick_name}}</span>
  42. </view>
  43. </view>
  44. <!--<view class="title__stick">
  45. <i class="iconfont icon&#45;&#45;zhidingtuijian"></i>
  46. </view>-->
  47. </view>
  48. </view>
  49. <view class="item__content">
  50. <view class="item__title" @tap="copyText" :data-txt="item.description">
  51. {{item.description}}
  52. </view>
  53. <!--<view class="read__more" bindtap="more">
  54. {{text}}
  55. </view>-->
  56. <view class="item__list" v-if="item.img_list.length==1">
  57. <!--如果图片长度为1显示一张-->
  58. <view class="img">
  59. <image mode="widthFix" :src="item.img_list[0]"></image>
  60. </view>
  61. <!-- <view class="list__li">
  62. <view style="background: url('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1524827781748&di=d50541539b9b5f3850170d97854fc380&imgtype=0&src=http%3A%2F%2Fwww.pp3.cn%2Fuploads%2F201704%2F20170815006.jpg'); background-position: center;background-repeat: no-repeat;background-size: cover;">
  63. <span></span>
  64. </view>
  65. </view>-->
  66. </view>
  67. <view class="item__list" v-else>
  68. <view class="list__li" v-for="(i, imgkey) in item.img_list" :key="imgkey" @tap="preImage" :data-index="index" :data-idx="idx" :data-url="i">
  69. <view :style="'background: url(' + i + '); background-position: center;background-repeat: no-repeat;background-size: cover;'">
  70. <span></span>
  71. </view>
  72. </view>
  73. </view>
  74. <view class="time-txet">{{item.created_at}}</view>
  75. <view class="tags" v-if="item.tags_list">
  76. <view class="tag-item" v-for="(tag, n) in item.tags_list" :key="n">{{tag}}</view>
  77. </view>
  78. <view class="goods-box" v-if="item.goods" @tap="jumpDetail" :data-id="item.goods.id">
  79. <view class="left-box">
  80. <image :src="item.goods.img"></image>
  81. </view>
  82. <view class="right-box">
  83. <view class="name">
  84. {{item.goods.name}}
  85. </view>
  86. <view class="money"> {{item.goods.sell_price}}</view>
  87. </view>
  88. </view>
  89. </view>
  90. </view>
  91. <view class="bottom-btn mx-1px-top">
  92. <view class="btn" :class="item.is_favorite ? 'active' : ''" :data-islike="item.is_favorite" @tap="favoriteClick" :data-index="index" :data-idx="idx" :data-id="item.id">
  93. <span class="iconfont icon-Group3"></span>
  94. <block v-if="item.is_favorite">已收藏</block>
  95. <block v-else>收藏</block>
  96. </view>
  97. <view class="btn" @tap="downloadImgs" :data-urls="item.img_list">
  98. <span class="iconfont icon-Group5"></span>
  99. 下载
  100. </view>
  101. </view>
  102. </view>
  103. <!--<view class="index__end" wx:if="{{page == total_pages}}">
  104. 已经全部加载完毕
  105. </view>-->
  106. </view>
  107. </view>
  108. </view>
  109. <view v-else class="no-data">暂无数据</view>
  110. </view>
  111. <view class="maks" v-if="isMore" @tap="moreClick"></view>
  112. <!-- 筛选-->
  113. <view class="filter-box" v-if="isFitter" @tap="filterClick">
  114. <view class="content">
  115. <view class="select" v-if="conditions.brands.length">
  116. <view class="topic">
  117. 品牌
  118. <span>单选</span>
  119. </view>
  120. <view class="list">
  121. <view class="item" :class="index == brandIndex ? 'active' : ''" v-for="(item, index) in conditions.brands" :key="index" @tap.stop="radioBrand" :data-id="item.id" :data-name="item.name" :data-index="index">
  122. {{item.name}}
  123. </view>
  124. </view>
  125. </view>
  126. <view class="select" v-if="conditions.tags.length">
  127. <view class="topic">
  128. 推荐标签
  129. <span>最多选2个</span>
  130. </view>
  131. <view class="list">
  132. <view class="item" :class="item.isChoose == true ? 'active':''" v-for="(item, index) in conditions.tags" :key="index" catchtap="checkboxTag" :data-index="index" :data-id="item.id" :data-name="item.name" :data-isChoose="item.isChoose">
  133. {{item.name}}
  134. </view>
  135. </view>
  136. </view>
  137. <view class="btn-box">
  138. <view class="btn reset" catchtap="reset">重置</view>
  139. <view class="btn confirm" catchtap="confirm">确定</view>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. </view>
  145. </template>
  146. <script>
  147. //import { config, pageLogin, getUrl, sandBox, cookieStorage } from '../../../lib/myapp.js';
  148. import {pageLogin, getUrl,config} from '@/common/js/utils.js';
  149. let a;
  150. export default {
  151. data() {
  152. return {
  153. banner: [],
  154. conditions: '',
  155. //筛选条件
  156. list: [],
  157. more: true,
  158. page: '',
  159. isFitter: false,
  160. brandIndex: -1,
  161. brandItem: '',
  162. tagItem: [],
  163. category_id: '',
  164. //分类id
  165. activeIndex: 0,
  166. isMore: false,
  167. category_index: -1,
  168. isFavorite: false,
  169. tagIds: [],
  170. isTab: true,
  171. keywords: '',
  172. init: false
  173. };
  174. },
  175. //下拉刷新
  176. onReachBottom() {
  177. if (this.more) {
  178. let page = this.page + 1;
  179. let brand_id = this.brandItem.id || '';
  180. let tags = '';
  181. let arr = [];
  182. if (this.tagItem.length) {
  183. this.tagItem.forEach(val => {
  184. arr.push(val.id);
  185. });
  186. tags = arr.join(',');
  187. }
  188. this.getContentList(page, brand_id, this.category_id, tags, this.keywords);
  189. } else {
  190. wx.showToast({
  191. image: '../../../static/error.png',
  192. title: '再拉也没有啦'
  193. });
  194. }
  195. },
  196. onShow() {
  197. if (a) {
  198. a = false;
  199. return;
  200. }
  201. this.getConditions();
  202. this.getContentList(1, '', '', '', this.keywords);
  203. },
  204. onLoad(e) {
  205. if (e.keywords) {
  206. this.setData({
  207. keywords: e.keywords
  208. });
  209. }
  210. },
  211. components: {},
  212. props: {},
  213. methods: {
  214. //点击分类
  215. tabClick(e) {
  216. let index = e.currentTarget.dataset.index;
  217. let id = e.currentTarget.dataset.id || '';
  218. this.setData({
  219. activeIndex: index,
  220. category_id: id
  221. });
  222. let brand_id = this.brandItem.id || '';
  223. let tags = '';
  224. let arr = [];
  225. if (this.tagItem.length) {
  226. this.tagItem.forEach(val => {
  227. arr.push(val.id);
  228. });
  229. tags = arr.join(',');
  230. }
  231. this.getContentList(1, brand_id, this.category_id, tags, this.keywords, true);
  232. },
  233. //点击更多
  234. moreClick() {
  235. this.setData({
  236. isMore: !this.isMore
  237. });
  238. },
  239. changeCategories(e) {
  240. let id = e.currentTarget.dataset.id;
  241. let index = e.currentTarget.dataset.index;
  242. if (this.conditions.categories.length >= 2) {
  243. if (index >= 2) {
  244. this.setData({
  245. activeIndex: 3
  246. });
  247. } else {
  248. this.setData({
  249. activeIndex: index + 1
  250. });
  251. }
  252. }
  253. this.setData({
  254. category_id: id,
  255. category_index: index
  256. });
  257. let brand_id = this.brandItem.id || '';
  258. let tags = '';
  259. let arr = [];
  260. if (this.tagItem.length) {
  261. this.tagItem.forEach(val => {
  262. arr.push(val.id);
  263. });
  264. tags = arr.join(',');
  265. }
  266. this.moreClick();
  267. this.getContentList(1, brand_id, this.category_id, tags, this.keywords, true);
  268. },
  269. jumpDetail(e) {
  270. let id = e.currentTarget.dataset.id;
  271. wx.navigateTo({
  272. url: `/pages/store/detail/detail?id=${id}`
  273. });
  274. },
  275. //获取筛选条件
  276. getConditions() {
  277. wx.showLoading({
  278. title: "加载中",
  279. mask: true
  280. });
  281. this.$http.get({
  282. api: 'api/discover/conditions'
  283. }).then(res => {
  284. if (res.statusCode == 200) {
  285. res = res.data;
  286. if (res.status) {
  287. if (res.data.tags && res.data.tags.length) {
  288. res.data.tags.forEach(val => {
  289. val.isChoose = false;
  290. });
  291. }
  292. this.setData({
  293. conditions: res.data
  294. });
  295. } else {
  296. wx.showModal({
  297. content: res.message || '请求失败',
  298. showCancel: false
  299. });
  300. }
  301. } else {
  302. wx.showModal({
  303. content: res.message || '请求失败',
  304. showCancel: false
  305. });
  306. }
  307. // this.setData({
  308. // show: false
  309. // });
  310. this.show=false;
  311. wx.hideLoading();
  312. }).catch(rej => {
  313. wx.hideLoading();
  314. wx.showModal({
  315. content: res.message || '请求失败',
  316. showCancel: false
  317. });
  318. });
  319. },
  320. //预览图片
  321. preImage(e) {
  322. a = true;
  323. var url = e.currentTarget.dataset.url;
  324. var findex = e.currentTarget.dataset.idx;
  325. var index = e.currentTarget.dataset.index;
  326. wx.previewImage({
  327. current: url,
  328. // 当前显示图片的http链接
  329. urls: this.list[findex][index].img_list // 需要预览的图片http链接列表
  330. });
  331. },
  332. //获取文章列表
  333. getContentList(page, brand_id, category_id, tags, keywords, is_tab) {
  334. wx.showLoading({
  335. title: "加载中",
  336. mask: true
  337. });
  338. let token = this.$cookieStorage.get('user_token');
  339. let tagList = '';
  340. if (tags) {
  341. tagList = tags.split(',').sort(function (a, b) {
  342. return a - b;
  343. }).join(',');
  344. }
  345. this.$http.get({
  346. api: 'api/discover/content/list',
  347. data: {
  348. page: page,
  349. brand_id: brand_id,
  350. category_id: category_id,
  351. tags: tagList,
  352. keywords: keywords
  353. },
  354. header: {
  355. Authorization: token
  356. }
  357. }).then(res => {
  358. if (res.statusCode == 200) {
  359. res = res.data;
  360. if (res.status) {
  361. if (is_tab) {
  362. this.setData({
  363. list: []
  364. });
  365. }
  366. let pages = res.meta.pagination;
  367. let current_page = pages.current_page;
  368. let total_pages = pages.total_pages;
  369. this.setData({
  370. // [`list[${page - 1}]`]: res.data,
  371. more: current_page < total_pages,
  372. page: current_page
  373. });
  374. this.list[page-1]=res.data;
  375. } else {
  376. wx.showModal({
  377. content: res.message || '请求失败',
  378. showCancel: false
  379. });
  380. }
  381. } else {
  382. wx.showModal({
  383. content: res.message || '请求失败',
  384. showCancel: false
  385. });
  386. }
  387. // this.setData({
  388. // show: false
  389. // });
  390. this.show=false;
  391. wx.hideLoading();
  392. }).catch(rej => {
  393. wx.hideLoading();
  394. wx.showModal({
  395. content: res.message || '请求失败',
  396. showCancel: false
  397. });
  398. });
  399. },
  400. //点击筛选
  401. filterClick() {
  402. this.setData({
  403. isFitter: !this.isFitter
  404. });
  405. },
  406. radioBrand(e) {
  407. let index = e.currentTarget.dataset.index;
  408. let id = e.currentTarget.dataset.id;
  409. let name = e.currentTarget.dataset.name;
  410. this.setData({
  411. brandIndex: index,
  412. brandItem: {
  413. id:id,
  414. name:name
  415. }
  416. });
  417. },
  418. checkboxTag(e) {
  419. let tags = this.conditions.tags; //渲染的数据
  420. let index = e.currentTarget.dataset.index;
  421. let item = {
  422. id:e.currentTarget.dataset.id,
  423. name:e.currentTarget.dataset.name,
  424. isChoose:e.currentTarget.dataset.isChoose
  425. };
  426. let tagItem = this.tagItem;
  427. let tagIds = this.tagIds;
  428. let idsIndex = tagIds.indexOf(item.id);
  429. if (idsIndex == -1) {
  430. if (tagItem.length < 2) {
  431. tags[index].isChoose = true;
  432. tagItem.push(item);
  433. tagIds.push(item.id);
  434. this.setData({
  435. tagItem: tagItem,
  436. tagIds: tagIds,
  437. 'conditions.tags': tags
  438. });
  439. } else {
  440. wx.showToast({
  441. title: '最多选择两个',
  442. icon: 'none'
  443. });
  444. }
  445. } else {
  446. tagItem.splice(idsIndex, 1);
  447. tagIds.splice(idsIndex, 1);
  448. tags[index].isChoose = false;
  449. this.setData({
  450. tagItem: tagItem,
  451. tagIds: tagIds,
  452. 'conditions.tags': tags
  453. });
  454. }
  455. },
  456. //重置标签
  457. reset() {
  458. let tags = this.conditions.tags;
  459. tags.forEach(val => {
  460. val.isChoose = false;
  461. });
  462. this.setData({
  463. brandIndex: -1,
  464. tagItem: [],
  465. tagIds: [],
  466. 'conditions.tags': tags
  467. });
  468. },
  469. //确认筛选
  470. confirm() {
  471. let brand_id = this.brandItem.id || '';
  472. let tags = '';
  473. let arr = [];
  474. if (this.tagItem.length) {
  475. this.tagItem.forEach(val => {
  476. arr.push(val.id);
  477. });
  478. tags = arr.join(',');
  479. }
  480. this.getContentList(1, brand_id, this.category_id, tags, this.keywords, true);
  481. this.filterClick();
  482. },
  483. //收藏内容
  484. addFavorite(content_id, idx, index) {
  485. let token = this.$cookieStorage.get('user_token');
  486. wx.showLoading({
  487. title: "收藏中",
  488. mask: true
  489. });
  490. this.$http.post({
  491. api: 'api/content/favorite/add',
  492. header: {
  493. Authorization: token
  494. },
  495. data: {
  496. content_id: content_id
  497. }
  498. }).then(res => {
  499. if (res.statusCode == 200) {
  500. res = res.data;
  501. if (res.status) {
  502. let items = this.list[idx];
  503. let item = items[index];
  504. item.is_favorite = 1;
  505. this.$set(this.list, idx, items)
  506. } else {
  507. wx.showModal({
  508. content: res.message || '请求失败',
  509. showCancel: false
  510. });
  511. }
  512. } else {
  513. wx.showModal({
  514. content: res.message || '请求失败',
  515. showCancel: false
  516. });
  517. }
  518. wx.hideLoading();
  519. }).catch(rej => {
  520. wx.hideLoading();
  521. wx.showModal({
  522. content: res.message || '请求失败',
  523. showCancel: false
  524. });
  525. });
  526. },
  527. deleteFavorite(content_id, idx, index) {
  528. let token = this.$cookieStorage.get('user_token');
  529. wx.showLoading({
  530. title: "取消中",
  531. mask: true
  532. });
  533. this.$http.post({
  534. api: 'api/content/favorite/delete',
  535. header: {
  536. Authorization: token
  537. },
  538. data: {
  539. content_id: content_id
  540. }
  541. }).then(res => {
  542. if (res.statusCode == 200) {
  543. res = res.data;
  544. if (res.status) {
  545. let items = this.list[idx];
  546. let item = items[index];
  547. item.is_favorite = 0;
  548. this.$set(this.list, idx, items)
  549. } else {
  550. wx.showModal({
  551. content: res.message || '请求失败',
  552. showCancel: false
  553. });
  554. }
  555. } else {
  556. wx.showModal({
  557. content: res.message || '请求失败',
  558. showCancel: false
  559. });
  560. }
  561. wx.hideLoading();
  562. }).catch(rej => {
  563. wx.hideLoading();
  564. wx.showModal({
  565. content: res.message || '请求失败',
  566. showCancel: false
  567. });
  568. });
  569. },
  570. favoriteClick(e) {
  571. let token = this.$cookieStorage.get('user_token');
  572. if (token) {
  573. let islike = e.currentTarget.dataset.islike;
  574. let idx = e.currentTarget.dataset.idx;
  575. let index = e.currentTarget.dataset.index;
  576. let id = e.currentTarget.dataset.id;
  577. if (islike == 0) {
  578. this.addFavorite(id, idx, index);
  579. } else if (islike == 1) {
  580. this.deleteFavorite(id, idx, index);
  581. }
  582. } else {
  583. let url = getUrl();
  584. wx.navigateTo({
  585. url: "/pages/user/register/register?url=" + url
  586. });
  587. }
  588. },
  589. //复制文案
  590. copyText(e) {
  591. let txt = e.currentTarget.dataset.txt;
  592. wx.setClipboardData({
  593. data: txt,
  594. success() {
  595. wx.showToast({
  596. title: "复制成功"
  597. });
  598. }
  599. });
  600. },
  601. //获取授权
  602. writePhotosAlbum(successFun, failFun) {
  603. // #ifdef MP-WEIXIN
  604. wx.getSetting({
  605. success(res) {
  606. if (!res.authSetting['scope.writePhotosAlbum']) {
  607. wx.authorize({
  608. scope: 'scope.writePhotosAlbum',
  609. success: function () {
  610. successFun && successFun();
  611. },
  612. fail: function (res) {
  613. wx.hideLoading();
  614. wx.showModal({
  615. title: '提示',
  616. content: "小程序需要您的微信授权保存图片,是否重新授权?",
  617. showCancel: true,
  618. cancelText: "否",
  619. confirmText: "是",
  620. success: function (res2) {
  621. if (res2.confirm) {
  622. //用户点击确定'
  623. wx.openSetting({
  624. success: res3 => {
  625. if (res3.authSetting['scope.writePhotosAlbum']) {
  626. //已授权
  627. successFun && successFun();
  628. } else {
  629. failFun && failFun();
  630. }
  631. }
  632. });
  633. } else {
  634. failFun && failFun();
  635. }
  636. }
  637. });
  638. }
  639. });
  640. } else {
  641. successFun && successFun();
  642. }
  643. }
  644. });
  645. // #endif
  646. // #ifdef APP-PLUS
  647. var that = this;
  648. uni.getSystemInfo({
  649. success(result) {
  650. if(result.platform == 'android'){
  651. that.requestAndroidPermission(successFun);
  652. } else if(result.platform == 'ios'){
  653. that.requestIosPermission(successFun)
  654. }
  655. }
  656. })
  657. // #endif
  658. },
  659. //ios app权限设置
  660. requestIosPermission(successFun){
  661. var result = permision.judgeIosPermission('photoLibrary');
  662. if(result){
  663. successFun && successFun();
  664. }else{
  665. //打开授权,iOS上如果没有调用过的权限,不会出现在权限设置界面。
  666. permision.gotoAppPermissionSetting()
  667. }
  668. },
  669. //安卓 app 权限设施
  670. async requestAndroidPermission(successFun) {
  671. var result = await permision.requestAndroidPermission("android.permission.WRITE_EXTERNAL_STORAGE")
  672. var strStatus
  673. if (result == 1) {
  674. strStatus = "已获得授权";
  675. successFun && successFun();
  676. } else if (result == 0) {
  677. strStatus = "未获得授权";
  678. permision.gotoAppPermissionSetting()
  679. } else {
  680. strStatus = "被永久拒绝权限"
  681. permision.gotoAppPermissionSetting()
  682. }
  683. },
  684. //下载多张图片
  685. downloadImgs(e) {
  686. let urlsList = e.currentTarget.dataset.urls;
  687. if (urlsList && urlsList.length) {
  688. var _this = this; // 获取权限
  689. this.writePhotosAlbum(function success() {
  690. wx.showLoading({
  691. title: '加载中',
  692. mask: true
  693. });
  694. _this.queue(urlsList).then(res => {
  695. wx.hideLoading();
  696. wx.showToast({
  697. title: '下载完成'
  698. });
  699. }).catch(err => {
  700. wx.hideLoading();
  701. console.log(err);
  702. });
  703. }, function fail() {
  704. wx.showToast({
  705. title: '您拒绝了保存到相册',
  706. icon: 'none'
  707. });
  708. });
  709. } else {
  710. return;
  711. }
  712. },
  713. // 队列
  714. queue(urls) {
  715. let promise = Promise.resolve();
  716. urls.forEach((url, index) => {
  717. promise = promise.then(() => {
  718. return this.download(url);
  719. });
  720. });
  721. return promise;
  722. },
  723. // 下载
  724. download(url) {
  725. return new Promise((resolve, reject) => {
  726. wx.downloadFile({
  727. url: url,
  728. success: function (res) {
  729. var temp = res.tempFilePath;
  730. wx.saveImageToPhotosAlbum({
  731. filePath: temp,
  732. success: function (res) {
  733. resolve(res);
  734. },
  735. fail: function (err) {
  736. reject(res);
  737. }
  738. });
  739. },
  740. fail: function (err) {
  741. reject(err);
  742. }
  743. });
  744. });
  745. },
  746. setData: function (obj) {
  747. let that = this;
  748. let keys = [];
  749. let val, data;
  750. Object.keys(obj).forEach(function (key) {
  751. keys = key.split('.');
  752. val = obj[key];
  753. data = that.$data;
  754. keys.forEach(function (key2, index) {
  755. if (index + 1 == keys.length) {
  756. that.$set(data, key2, val);
  757. } else {
  758. if (!data[key2]) {
  759. that.$set(data, key2, {});
  760. }
  761. }
  762. data = data[key2];
  763. });
  764. });
  765. }
  766. },
  767. computed: {},
  768. watch: {}
  769. };
  770. </script>
  771. <style rel="stylesheet/less" lang="less">
  772. @import "findSearch";
  773. </style>