collect.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <template>
  2. <div class="sld_collect_wrapper">
  3. <MemberTitle
  4. :memberTitle="collectIndex == 1 ? L['收藏的商品'] : L['店铺收藏']"
  5. style="padding-left: 20px"
  6. ></MemberTitle>
  7. <div class="wrapper_main myorder sld_collect">
  8. <div class="sld_follow_m" v-loading="loading">
  9. <!-- 选择横幅 -->
  10. <!-- <div class="sld_h3_wrap clearfix">
  11. <div class="sld_grade_nav fl">
  12. <a
  13. :class="1 === collectIndex ? 'on' : ''"
  14. @click="switchCollect(1)"
  15. >
  16. {{ L["收藏的商品"] }}</a
  17. >
  18. <a
  19. :class="2 === collectIndex ? 'on' : ''"
  20. @click="switchCollect(2)"
  21. >
  22. {{ L["店铺收藏"] }}
  23. </a>
  24. </div>
  25. <div
  26. class="sld_option fr"
  27. v-show="1 === collectIndex && collectGoodsData.list.length"
  28. >
  29. <div
  30. class="sld_option_list fl"
  31. v-show="optAct"
  32. @click="selectAll(true)"
  33. >
  34. <span ref="chooseWord">{{ L["全选"] }}</span>
  35. </div>
  36. <div
  37. class="sld_option_list fl"
  38. v-show="optAct"
  39. @click="selectAll(false)"
  40. >
  41. <span>{{ L["取消全选"] }}</span>
  42. </div>
  43. <div
  44. class="sld_option_list fl"
  45. v-show="optAct"
  46. @click="cancelCollect"
  47. >
  48. <span>{{ L["取消收藏"] }}</span>
  49. </div>
  50. <button class="sld_option_btn fr" @click="optAct = !optAct">
  51. {{ L["管理"] }}
  52. </button>
  53. </div>
  54. </div> -->
  55. <!-- 收藏的商品 -->
  56. <div class="fav_goods_list" v-show="1 === collectIndex">
  57. <ul class="clearfix">
  58. <li
  59. class="sld_follow_goods"
  60. v-for="(item, index) in collectGoodsData.list"
  61. :key="index"
  62. >
  63. <div class="cg_img">
  64. <nuxt-link
  65. :to="'/goods/detail/'+ calcProductName(item.goodsName) +'_'+ item.productId"
  66. target="_blank"
  67. >
  68. <coverImage :src="item.productImage" class="lazy" />
  69. <div class="mask" v-if="item.state !== 3">
  70. <div class="circle">{{ L['已下架'] }}</div>
  71. </div>
  72. </nuxt-link>
  73. </div>
  74. <p class="cg_price clearfix">
  75. <span class="fl"
  76. ><strong>{{item.goodsMoney}}</strong></span
  77. >
  78. </p>
  79. <p class="cg_name">
  80. <em v-if="isOwnStore">{{ L["自营"] }}</em>
  81. {{ item.goodsName }} {{ item.goodsBrief }}
  82. </p>
  83. <div class="cg_btns">
  84. <nuxt-link
  85. :to="'/store/'+ calcProductName(item.storeName) +'_'+ item.storeId"
  86. class="govendor"
  87. target="_blank"
  88. >{{ L["进入店铺"] }}</nuxt-link
  89. >
  90. </div>
  91. <div class="check_wrap" v-show="optAct">
  92. <input
  93. type="checkbox"
  94. name="option"
  95. :id="`GoodsCheck${index}`"
  96. class="item_check"
  97. :value="item.productId"
  98. v-model="chosedItem"
  99. />
  100. <label :for="`GoodsCheck${index}`" class="border">
  101. <!-- <div class="checklogo"></div> -->
  102. </label>
  103. </div>
  104. </li>
  105. <SldCommonEmpty
  106. v-show="!collectGoodsData.list.length && !loading"
  107. totalWidth="1003"
  108. :tip="L['暂无收藏商品']"
  109. />
  110. </ul>
  111. <!-- 分页 -->
  112. <div class="flex_row_end_center sld_pagination">
  113. <el-pagination
  114. @current-change="handleCurrentChange"
  115. v-model:currentPage="pageData.current"
  116. :page-size="pageData.pageSize"
  117. layout="prev, pager, next, jumper"
  118. :total="pageData.total"
  119. :hide-on-single-page="true"
  120. >
  121. </el-pagination>
  122. </div>
  123. </div>
  124. <!-- 收藏的店铺 -->
  125. <div class="fav_store_list" v-show="2 === collectIndex">
  126. <!-- 普通关注的店铺 -->
  127. <!-- <div v-else>-->
  128. <div v-for="(item1, index1) in commonFollowStore" :key="index1">
  129. <CollectStoreItem
  130. :item="item1"
  131. :ItemIndex="index1"
  132. @collectStoreUpdate="collectStoreUpdate"
  133. collectStoreIndex="2"
  134. >
  135. </CollectStoreItem>
  136. </div>
  137. <SldCommonEmpty
  138. v-show="!collectLength.commonLength && !loading"
  139. totalWidth="1003"
  140. :tip="L['暂无收藏店铺']"
  141. />
  142. <!-- 分页 -->
  143. <div class="flex_row_end_center sld_pagination">
  144. <el-pagination
  145. @current-change="handleStoreCurrentChange"
  146. v-model:currentPage="pageDataStore.current"
  147. :page-size="pageDataStore.pageSize"
  148. layout="prev, pager, next, jumper"
  149. :total="pageDataStore.total"
  150. :hide-on-single-page="true"
  151. >
  152. </el-pagination>
  153. </div>
  154. <!-- </div>-->
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </template>
  160. <script setup>
  161. import { ElPagination,ElMessage,ElMessageBox } from "element-plus";
  162. import {
  163. reactive,
  164. getCurrentInstance,
  165. onMounted,
  166. ref,
  167. watchEffect,
  168. watch,
  169. } from "vue";
  170. // import { lang_zn } from "@/assets/language/zh";
  171. import { getCurLanguage } from '@/composables/common.js';
  172. // const L = lang_zn;
  173. const L = getCurLanguage();
  174. definePageMeta({
  175. layout: "member",
  176. middleware: ["auth"],
  177. });
  178. const route = useRoute();
  179. const loading = ref(false)
  180. const collectIndex = ref(1); //收藏的商品和店铺的切换标志
  181. const collectStoreIndex = ref(1); //切换收藏店铺 普通关注和特别关注 的标志值
  182. const collectGoodsData = reactive({
  183. list: [],
  184. }); //收藏的商品
  185. const specialFollowStore = ref([]); //特殊收藏的店铺
  186. const commonFollowStore = ref([]); //普通收藏的店铺
  187. const { proxy } = getCurrentInstance();
  188. const optAct = ref(false); //显示操作
  189. const chosedItem = ref([]); //取消收藏选择的商品集合
  190. const collectGoodsChoose = ref("/member/chooseAll.png");
  191. const cartListData = reactive({ data: [] }); //获取vux的store中的购物车数据
  192. const collectLength = reactive({
  193. commonLength: 0,
  194. specialLength: 0,
  195. });
  196. const pageData = reactive({
  197. current: 1,
  198. pageSize: 10,
  199. total: null,
  200. });
  201. const pageDataStore = reactive({
  202. current: 1,
  203. pageSize: 5,
  204. total: null,
  205. });
  206. const params = reactive({
  207. current: pageData.current,
  208. });
  209. const paramsStore = reactive({
  210. current: pageDataStore.current,
  211. pageSize: pageDataStore.pageSize,
  212. });
  213. //获取数据,初始化
  214. const getInitData = (params) => {
  215. loading.value = true;
  216. get("v3/member/front/followProduct/list", params).then((res) => {
  217. //获取收藏商品信息
  218. if (res.state == 200) {
  219. collectGoodsData.list = res.data.list;
  220. pageData.current = res.data.pagination.current;
  221. pageData.pageSize = res.data.pagination.pageSize;
  222. pageData.total = res.data.pagination.total;
  223. }
  224. }).finally(() => {
  225. loading.value = false;
  226. })
  227. };
  228. const getStoreData = (paramsStore) => {
  229. loading.value = true;
  230. get("v3/member/front/followStore/list",paramsStore).then((res) => {
  231. //获取收藏店铺信息
  232. if (res.state == 200) {
  233. // specialFollowStore.value = res.data.storeList.filter(
  234. // (item) => item.isTop == 1
  235. // );
  236. commonFollowStore.value = res.data.storeList.filter(
  237. // (item) => item.isTop == 0
  238. (item) => item
  239. );
  240. collectLength.specialLength = specialFollowStore.value.length;
  241. collectLength.commonLength = commonFollowStore.value.length;
  242. pageDataStore.current = res.data.pagination.current;
  243. pageDataStore.pageSize = res.data.pagination.pageSize;
  244. pageDataStore.total = res.data.pagination.total;
  245. }
  246. }).finally(() => {
  247. loading.value = false;
  248. })
  249. };
  250. //切换收藏商品和店铺
  251. const switchCollect = (index) => {
  252. collectIndex.value = index;
  253. };
  254. const handlePrevClickChange = (e) => {
  255. proxy.$refs.chooseWord.style.color = "";
  256. params.current = e;
  257. getInitData(params);
  258. };
  259. const handleNextClickChange = (e) => {
  260. proxy.$refs.chooseWord.style.color = "";
  261. params.current = e;
  262. getInitData(params);
  263. };
  264. const handleCurrentChange = (e) => {
  265. proxy.$refs.chooseWord.style.color = "";
  266. params.current = e;
  267. getInitData(params);
  268. };
  269. // 关注店铺分页
  270. const handleStorePrevClickChange = (e) => {
  271. paramsStore.current = e;
  272. getStoreData(paramsStore);
  273. };
  274. const handleStoreNextClickChange = (e) => {
  275. paramsStore.current = e;
  276. getStoreData(paramsStore);
  277. };
  278. const handleStoreCurrentChange = (e) => {
  279. paramsStore.current = e;
  280. getStoreData(paramsStore);
  281. };
  282. //切换收藏店铺的特别关注和普通关注
  283. const switchStoreType = (index) => {
  284. collectStoreIndex.value = index;
  285. };
  286. //取消商品收藏的post操作
  287. const cancelCollect = () => {
  288. if (chosedItem.value.length > 0) {
  289. ElMessageBox.confirm("确定取消收藏吗?", "提示", {
  290. confirmButtonText: "确定",
  291. cancelButtonText: "取消",
  292. type: "warning",
  293. })
  294. .then(() => {
  295. cancelConfirm();
  296. })
  297. .catch(() => {});
  298. } else {
  299. ElMessage.warning({
  300. message: "请选择商品",
  301. offset: 95,
  302. center: true,
  303. });
  304. }
  305. };
  306. //取消收藏的确认事件
  307. const cancelConfirm = () => {
  308. let params = {
  309. isCollect: false,
  310. productIds: chosedItem.value.join(","),
  311. };
  312. post("v3/member/front/followProduct/edit", params).then((res) => {
  313. if (res.state == 200) {
  314. chosedItem.value = [];
  315. getInitData();
  316. ElMessage(res.msg);
  317. }
  318. });
  319. };
  320. const collectStoreUpdate = () => {
  321. getStoreData(paramsStore);
  322. };
  323. //全选或反选操作
  324. const selectAll = (checks) => {
  325. if (checks) {
  326. let listArr = [];
  327. collectGoodsData.list.forEach((item) => {
  328. listArr.push(item.productId);
  329. });
  330. chosedItem.value = listArr;
  331. proxy.$refs.chooseWord.style.color = "$colorMain";
  332. collectGoodsChoose.value = ref("/member/chooseAll_red.png");
  333. } else {
  334. chosedItem.value = [];
  335. proxy.$refs.chooseWord.style.color = "";
  336. collectGoodsChoose.value = ref("/member/chooseAll.png");
  337. }
  338. };
  339. watch(chosedItem, () => {
  340. if (chosedItem.value.length == collectGoodsData.list.length) {
  341. proxy.$refs.chooseWord.style.color = "$colorMain";
  342. collectGoodsChoose.value = ref("/member/chooseAll_red.png");
  343. } else {
  344. proxy.$refs.chooseWord.style.color = "";
  345. collectGoodsChoose.value = ref("/member/chooseAll.png");
  346. }
  347. });
  348. watchEffect(() => {
  349. if (route.query.type == "store") {
  350. collectIndex.value = 2;
  351. } else {
  352. collectIndex.value = 1;
  353. }
  354. });
  355. onMounted(() => {
  356. getInitData(params);
  357. getStoreData(paramsStore);
  358. if (route.query.type == "store") {
  359. collectIndex.value = 2;
  360. } else {
  361. collectIndex.value = 1;
  362. }
  363. });
  364. </script>
  365. <style lang="scss" scoped>
  366. @import "@/assets/style/base.scss";
  367. @import "@/assets/style/member/collect.scss";
  368. .sld_pagination {
  369. margin-top: 20px;
  370. }
  371. </style>