商品详情.评价页面.购物车页面.首页轮播图.搜索功能.分类接口
							parent
							
								
									6a327ac0e7
								
							
						
					
					
						commit
						f4c1b30f2e
					
				|  | @ -1,160 +1,170 @@ | |||
| <!-- 页面  --> | ||||
| <template> | ||||
|   <s-layout title="全部评价"> | ||||
|     <su-tabs | ||||
|       :list="state.type" | ||||
|       :scrollable="false" | ||||
|       @change="onTabsChange" | ||||
|       :current="state.currentTab" | ||||
|     ></su-tabs> | ||||
|     <view class="ss-m-t-20"> | ||||
|       <view class="list-item" v-for="item in state.pagination.data" :key="item"> | ||||
|         <comment-item :item="item"></comment-item> | ||||
|       </view> | ||||
|     </view> | ||||
|     <s-empty v-if="state.pagination.total === 0" text="暂无数据" icon="/static/data-empty.png" /> | ||||
|     <uni-load-more | ||||
|       v-if="state.pagination.total > 0" | ||||
|       :status="state.loadStatus" | ||||
|       :content-text="{ | ||||
| 	<s-layout title="全部评价"> | ||||
| 		<su-tabs :list="state.type" :scrollable="false" @change="onTabsChange" :current="state.currentTab"></su-tabs> | ||||
| 		<view class="ss-m-t-20"> | ||||
| 			<view class="list-item" v-for="item in state.pagination.data" :key="item"> | ||||
| 				<comment-item :item="item"></comment-item> | ||||
| 			</view> | ||||
| 		</view> | ||||
| 		<s-empty v-if="state.pagination.total === 0" text="暂无数据" icon="/static/data-empty.png" /> | ||||
| 		<uni-load-more v-if="state.pagination.total > 0" :status="state.loadStatus" :content-text="{ | ||||
|         contentdown: '上拉加载更多', | ||||
|       }" | ||||
|       @tap="loadmore" | ||||
|     /> | ||||
|   </s-layout> | ||||
|       }" @tap="loadmore" /> | ||||
| 	</s-layout> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
|   import sheep from '@/sheep'; | ||||
|   import { onLoad, onReachBottom } from '@dcloudio/uni-app'; | ||||
|   import { computed, reactive } from 'vue'; | ||||
|   import _ from 'lodash'; | ||||
|   import commentItem from '../components/detail/comment-item.vue'; | ||||
| 	import sheep from '@/sheep'; | ||||
| 	import { | ||||
| 		onLoad, | ||||
| 		onReachBottom | ||||
| 	} from '@dcloudio/uni-app'; | ||||
| 	import { | ||||
| 		computed, | ||||
| 		reactive | ||||
| 	} from 'vue'; | ||||
| 	import _ from 'lodash'; | ||||
| 	import commentItem from '../components/detail/comment-item.vue'; | ||||
| 
 | ||||
|   const pagination = { | ||||
|     data: [], | ||||
|     current_page: 1, | ||||
|     total: 1, | ||||
|     last_page: 1, | ||||
|   }; | ||||
|   const state = reactive({ | ||||
|     list: [], | ||||
|     type: [], | ||||
|     currentTab: 0, | ||||
|     pagination: { | ||||
|       data: [], | ||||
|       current_page: 1, | ||||
|       total: 1, | ||||
|       last_page: 1, | ||||
|     }, | ||||
|     commentId: 0, | ||||
|     code: 'all', | ||||
|   }); | ||||
|   // 切换选项卡 | ||||
|   function onTabsChange(e) { | ||||
|     state.pagination = pagination | ||||
|     state.currentTab = e.index; | ||||
|     state.code = e.code; | ||||
|     getList(state.commentId, e.code); | ||||
|   } | ||||
|   async function getType(id) { | ||||
|     const { error, data } = await sheep.$api.goods.getType(id); | ||||
|     if (error === 0) { | ||||
|       state.type = data; | ||||
|     } | ||||
|   } | ||||
|   async function getList(id, code, page = 1, list_rows = 6) { | ||||
|     state.loadStatus = 'loading'; | ||||
|     let res = await sheep.$api.goods.comment(id, { | ||||
|       type: code, | ||||
|       list_rows, | ||||
|       page, | ||||
|     }); | ||||
|     if (res.error === 0) { | ||||
|         let orderList = _.concat(state.pagination.data, res.data.data); | ||||
|         state.pagination = { | ||||
|           ...res.data, | ||||
|           data: orderList, | ||||
|         }; | ||||
|       if (state.pagination.current_page < state.pagination.last_page) { | ||||
|         state.loadStatus = 'more'; | ||||
|       } else { | ||||
|         state.loadStatus = 'noMore'; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   // 加载更多 | ||||
|   function loadmore() { | ||||
|     if (state.loadStatus !== 'noMore') { | ||||
|       getList(state.commentId, state.code, state.pagination.current_page + 1); | ||||
|     } | ||||
|   } | ||||
|   onLoad((options) => { | ||||
|     state.commentId = options.id; | ||||
|     getType(state.commentId); | ||||
|     getList(state.commentId); | ||||
|   }); | ||||
|   // 上拉加载更多 | ||||
|   onReachBottom(() => { | ||||
|     loadmore(); | ||||
|   }); | ||||
| 	const pagination = { | ||||
| 		data: [], | ||||
| 		current_page: 1, | ||||
| 		total: 1, | ||||
| 		last_page: 1, | ||||
| 	}; | ||||
| 	const state = reactive({ | ||||
| 		list: [], | ||||
| 		type: [], | ||||
| 		currentTab: 0, | ||||
| 		pagination: { | ||||
| 			data: [], | ||||
| 			current_page: 1, | ||||
| 			total: 1, | ||||
| 			last_page: 1, | ||||
| 		}, | ||||
| 		commentId: 0, | ||||
| 		code: 0, | ||||
| 	}); | ||||
| 	// 切换选项卡 | ||||
| 	function onTabsChange(e) { | ||||
| 		state.pagination = pagination | ||||
| 		state.currentTab = e.index; | ||||
| 		state.code = e.code; | ||||
| 		getList(state.commentId, e.code); | ||||
| 	} | ||||
| 	async function getType(id) { | ||||
| 		const { | ||||
| 			error, | ||||
| 			data | ||||
| 		} = await sheep.$api.goods.getType(id); | ||||
| 		if (error === 0) { | ||||
| 			console.log(data) | ||||
| 			// state.type = data; | ||||
| 			state.type = [{code:0,name:'全部'},{code:1,name:'好评'},{code:2,name:'中评'},{code:3,name:'差评'}]; | ||||
| 		} | ||||
| 	} | ||||
| 	async function getList(id, code=0, page = 1, list_rows = 6) { | ||||
| 		state.loadStatus = 'loading'; | ||||
| 		let res = await sheep.$api.goods.comment2(id, { | ||||
| 			type: code, | ||||
| 			pageSize: list_rows, | ||||
| 			pageNo: page, | ||||
| 		}); | ||||
| 		console.log(res); | ||||
| 		if (res.code === 0) { | ||||
| 			let orderList = _.concat(state.pagination.data, res.data.list); | ||||
| 			state.pagination = { | ||||
| 				...res.data, | ||||
| 				data: orderList, | ||||
| 			}; | ||||
| 			if (state.pagination.current_page < state.pagination.last_page) { | ||||
| 				state.loadStatus = 'more'; | ||||
| 			} else { | ||||
| 				state.loadStatus = 'noMore'; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	// 加载更多 | ||||
| 	function loadmore() { | ||||
| 		if (state.loadStatus !== 'noMore') { | ||||
| 			getList(state.commentId, state.code, state.pagination.current_page + 1); | ||||
| 		} | ||||
| 	} | ||||
| 	onLoad((options) => { | ||||
| 		state.commentId = options.id; | ||||
| 		getType(state.commentId); | ||||
| 		getList(state.commentId); | ||||
| 	}); | ||||
| 	// 上拉加载更多 | ||||
| 	onReachBottom(() => { | ||||
| 		loadmore(); | ||||
| 	}); | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
|   .list-item { | ||||
|     padding: 32rpx 30rpx 20rpx 20rpx; | ||||
|     background: #fff; | ||||
|     .avatar { | ||||
|       width: 52rpx; | ||||
|       height: 52rpx; | ||||
|       border-radius: 50%; | ||||
|     } | ||||
|     .nickname { | ||||
|       font-size: 26rpx; | ||||
|       font-weight: 500; | ||||
|       color: #999999; | ||||
|     } | ||||
|     .create-time { | ||||
|       font-size: 24rpx; | ||||
|       font-weight: 500; | ||||
|       color: #c4c4c4; | ||||
|     } | ||||
|     .content-title { | ||||
|       font-size: 26rpx; | ||||
|       font-weight: 400; | ||||
|       color: #666666; | ||||
|       line-height: 42rpx; | ||||
|     } | ||||
|     .content-img { | ||||
|       width: 174rpx; | ||||
|       height: 174rpx; | ||||
|     } | ||||
|     .cicon-info-o { | ||||
|       font-size: 26rpx; | ||||
|       color: #c4c4c4; | ||||
|     } | ||||
|     .foot-title { | ||||
|       font-size: 24rpx; | ||||
|       font-weight: 500; | ||||
|       color: #999999; | ||||
|     } | ||||
|   } | ||||
| 	.list-item { | ||||
| 		padding: 32rpx 30rpx 20rpx 20rpx; | ||||
| 		background: #fff; | ||||
| 
 | ||||
|   .btn-box { | ||||
|     width: 100%; | ||||
|     height: 120rpx; | ||||
|     background: #fff; | ||||
|     border-top: 2rpx solid #eee; | ||||
|   } | ||||
|   .tab-btn { | ||||
|     width: 130rpx; | ||||
|     height: 62rpx; | ||||
|     background: #eeeeee; | ||||
|     border-radius: 31rpx; | ||||
|     font-size: 28rpx; | ||||
|     font-weight: 400; | ||||
|     color: #999999; | ||||
|     border: 1px solid #e5e5e5; | ||||
|     margin-right: 10rpx; | ||||
|   } | ||||
| </style> | ||||
| 		.avatar { | ||||
| 			width: 52rpx; | ||||
| 			height: 52rpx; | ||||
| 			border-radius: 50%; | ||||
| 		} | ||||
| 
 | ||||
| 		.nickname { | ||||
| 			font-size: 26rpx; | ||||
| 			font-weight: 500; | ||||
| 			color: #999999; | ||||
| 		} | ||||
| 
 | ||||
| 		.create-time { | ||||
| 			font-size: 24rpx; | ||||
| 			font-weight: 500; | ||||
| 			color: #c4c4c4; | ||||
| 		} | ||||
| 
 | ||||
| 		.content-title { | ||||
| 			font-size: 26rpx; | ||||
| 			font-weight: 400; | ||||
| 			color: #666666; | ||||
| 			line-height: 42rpx; | ||||
| 		} | ||||
| 
 | ||||
| 		.content-img { | ||||
| 			width: 174rpx; | ||||
| 			height: 174rpx; | ||||
| 		} | ||||
| 
 | ||||
| 		.cicon-info-o { | ||||
| 			font-size: 26rpx; | ||||
| 			color: #c4c4c4; | ||||
| 		} | ||||
| 
 | ||||
| 		.foot-title { | ||||
| 			font-size: 24rpx; | ||||
| 			font-weight: 500; | ||||
| 			color: #999999; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	.btn-box { | ||||
| 		width: 100%; | ||||
| 		height: 120rpx; | ||||
| 		background: #fff; | ||||
| 		border-top: 2rpx solid #eee; | ||||
| 	} | ||||
| 
 | ||||
| 	.tab-btn { | ||||
| 		width: 130rpx; | ||||
| 		height: 62rpx; | ||||
| 		background: #eeeeee; | ||||
| 		border-radius: 31rpx; | ||||
| 		font-size: 28rpx; | ||||
| 		font-weight: 400; | ||||
| 		color: #999999; | ||||
| 		border: 1px solid #e5e5e5; | ||||
| 		margin-right: 10rpx; | ||||
| 	} | ||||
| </style> | ||||
|  | @ -5,19 +5,19 @@ | |||
|         <image class="avatar" :src="sheep.$url.cdn(item.user_avatar)"></image> | ||||
|       </view> | ||||
|       <view class="nickname ss-m-r-20"> | ||||
|         {{ item.user_nickname }} | ||||
|         {{ item.userNickname }} | ||||
|       </view> | ||||
|       <view class=""> | ||||
|         <uni-rate :readonly="true" v-model="item.level" size="18" /> | ||||
|         <uni-rate :readonly="true" v-model="item.scores" size="18" /> | ||||
|       </view> | ||||
|     </view> | ||||
|     <view class="content"> | ||||
|       {{ item.content }} | ||||
|     </view> | ||||
|     <view class="ss-m-t-24" v-if="item.images?.length"> | ||||
|     <view class="ss-m-t-24" v-if="item.picUrls?.length"> | ||||
|       <scroll-view class="scroll-box" scroll-x scroll-anchoring> | ||||
|         <view class="ss-flex"> | ||||
|           <view v-for="(item, index) in item.images" :key="item" class="ss-m-r-10"> | ||||
|           <view v-for="(item, index) in item.picUrls" :key="item" class="ss-m-r-10"> | ||||
|             <su-image class="content-img" isPreview :previewList="state.commentImages" :current="index" :src="item" | ||||
|               :height="120" :width="120" mode="aspectFill"></su-image> | ||||
|           </view> | ||||
|  |  | |||
|  | @ -46,10 +46,10 @@ | |||
|   async function getComment(id) { | ||||
|     const { data } = await sheep.$api.goods.comment(id, { | ||||
|       list_rows: 3, | ||||
|     }); | ||||
| 	console.log(data) | ||||
|     });   | ||||
| 	 const {data:datas} = await sheep.$api.goods.comment2(id); | ||||
|     state.commentList = data; | ||||
|     state.total = data.total; | ||||
|     state.total = datas.total; | ||||
|   } | ||||
|   onBeforeMount(() => { | ||||
|     getComment(props.goodsId); | ||||
|  |  | |||
|  | @ -95,7 +95,7 @@ | |||
|         <!-- 评价 --> | ||||
|         <detail-comment-card class="detail-comment-selector" :goodsId="state.goodsId" /> | ||||
|         <!-- 详情 --> | ||||
|         <detail-content-card class="detail-content-selector" :content="state.goodsInfo.content" /> | ||||
|         <detail-content-card class="detail-content-selector" :content="state.goodsInfo.description" /> | ||||
| 
 | ||||
|         <!-- 活动跳转 --> | ||||
|         <detail-activity-tip | ||||
|  |  | |||
|  | @ -261,12 +261,12 @@ | |||
|       sort: Sort, | ||||
|       order: Order, | ||||
|       category_id: !keyword ? categoryId : '', | ||||
|       list_rows, | ||||
|       pageSize:list_rows, | ||||
|       keyword: keyword, | ||||
|       page, | ||||
|       pageNo:page, | ||||
|     }); | ||||
|     if (res.error === 0) { | ||||
|         let couponList = _.concat(state.pagination.data, res.data.data); | ||||
|     if (res.code === 0) { | ||||
|         let couponList = _.concat(state.pagination.data, res.data.list); | ||||
|         state.pagination = { | ||||
|           ...res.data, | ||||
|           data: couponList, | ||||
|  |  | |||
|  | @ -36,19 +36,19 @@ | |||
|               /> | ||||
|             </label> | ||||
|             <s-goods-item | ||||
|               :title="item.goods.title" | ||||
|               :img="item.sku_price.image || item.goods.image" | ||||
|               :price="item.sku_price.price" | ||||
|               :skuText="item.sku_price.goods_sku_text" | ||||
|               :title="item.spu.name" | ||||
|               :img="item.spu.picUrl || item.goods.image" | ||||
|               :price="item.sku.price/100" | ||||
|               :skuText="item.sku.properties.length>1? item.sku.properties.reduce((items2,items)=>items2.valueName+' '+items.valueName):item.sku.properties[0].valueName" | ||||
|               priceColor="#FF3000" | ||||
|               :titleWidth="400" | ||||
|             > | ||||
|               <template v-if="!state.editMode" v-slot:tool> | ||||
|                 <su-number-box | ||||
|                   :min="0" | ||||
|                   :max="item.sku_price.stock" | ||||
|                   :max="item.sku.stock" | ||||
|                   :step="1" | ||||
|                   v-model="item.goods_num" | ||||
|                   v-model="item.count" | ||||
|                   @change="onNumberChange($event, item)" | ||||
|                 ></su-number-box> | ||||
|               </template> | ||||
|  | @ -112,9 +112,9 @@ | |||
|     isAllSelected: computed(() => cart.isAllSelected), | ||||
|     totalPriceSelected: computed(() => cart.totalPriceSelected), | ||||
|   }); | ||||
| 
 | ||||
|   // 单选选中 | ||||
|   function onSelectSingle(id) { | ||||
| 	  console.log('单选') | ||||
|     cart.selectSingle(id); | ||||
|   } | ||||
|   // 全选 | ||||
|  | @ -154,7 +154,7 @@ | |||
|     if(cartItem.goods_num === e) return; | ||||
|     cartItem.goods_num = e; | ||||
|     cart.update({ | ||||
|       goods_id: cartItem.goods_id, | ||||
|       goods_id: cartItem.id, | ||||
|       goods_num: e, | ||||
|       goods_sku_price_id: cartItem.goods_sku_price_id, | ||||
|     }); | ||||
|  |  | |||
|  | @ -1,250 +1,232 @@ | |||
| <template> | ||||
|   <s-layout title="分类" tabbar="/pages/index/category" :bgStyle="{ color: '#fff' }"> | ||||
|     <view class="s-category"> | ||||
|       <view class="three-level-wrap ss-flex ss-col-top" :style="[{ height: pageHeight + 'px' }]"> | ||||
|         <scroll-view class="side-menu-wrap" scroll-y :style="[{ height: pageHeight + 'px' }]"> | ||||
|           <view | ||||
|             class="menu-item ss-flex" | ||||
|             v-for="(item, index) in state.categoryList?.children" | ||||
|             :key="item.id" | ||||
|             :class="[{ 'menu-item-active': index == state.activeMenu }]" | ||||
|             @tap="onMenu(index)" | ||||
|           > | ||||
|             <view class="menu-title ss-line-1"> | ||||
|               {{ item.name }} | ||||
|             </view> | ||||
|           </view> | ||||
|         </scroll-view> | ||||
|         <scroll-view | ||||
|           class="goods-list-box" | ||||
|           scroll-y | ||||
|           :style="[{ height: pageHeight + 'px' }]" | ||||
|           v-if="state.categoryList?.children?.length" | ||||
|         > | ||||
|           <image | ||||
|             v-if="state.categoryList.children[state.activeMenu].image" | ||||
|             class="banner-img" | ||||
|             :src="sheep.$url.cdn(state.categoryList.children[state.activeMenu].image)" | ||||
|             mode="widthFix" | ||||
|           > | ||||
|           </image> | ||||
|           <first-one | ||||
|             v-if="state.categoryList.style === 'first_one'" | ||||
|             :data="state.categoryList" | ||||
|             :activeMenu="state.activeMenu" | ||||
|             :pagination="state.pagination" | ||||
|           /> | ||||
|           <first-two | ||||
|             v-if="state.categoryList.style === 'first_two'" | ||||
|             :data="state.categoryList" | ||||
|             :activeMenu="state.activeMenu" | ||||
|             :pagination="state.pagination" | ||||
|           /> | ||||
|           <second-one | ||||
|             v-if="state.categoryList.style === 'second_one'" | ||||
|             :data="state.categoryList" | ||||
|             :activeMenu="state.activeMenu" | ||||
|             :pagination="state.pagination" | ||||
|           /> | ||||
|           <third-one | ||||
|             v-if="state.categoryList.style === 'third_one'" | ||||
|             :data="state.categoryList" | ||||
|             :activeMenu="state.activeMenu" | ||||
|             :pagination="state.pagination" | ||||
|           /> | ||||
|           <uni-load-more | ||||
|             v-if=" | ||||
| 	<s-layout title="分类" tabbar="/pages/index/category" :bgStyle="{ color: '#fff' }"> | ||||
| 		<view class="s-category"> | ||||
| 			<view class="three-level-wrap ss-flex ss-col-top" :style="[{ height: pageHeight + 'px' }]"> | ||||
| 				<scroll-view class="side-menu-wrap" scroll-y :style="[{ height: pageHeight + 'px' }]"> | ||||
| 					<view class="menu-item ss-flex" v-for="(item, index) in state.categoryList?.children" :key="item.id" | ||||
| 						:class="[{ 'menu-item-active': index == state.activeMenu }]" @tap="onMenu(index)"> | ||||
| 						<view class="menu-title ss-line-1"> | ||||
| 							{{ item.name }} | ||||
| 						</view> | ||||
| 					</view> | ||||
| 				</scroll-view> | ||||
| 				<scroll-view class="goods-list-box" scroll-y :style="[{ height: pageHeight + 'px' }]" | ||||
| 					v-if="state.categoryList?.children?.length"> | ||||
| 					<image v-if="state.categoryList.children[state.activeMenu].image" class="banner-img" | ||||
| 						:src="sheep.$url.cdn(state.categoryList.children[state.activeMenu].image)" mode="widthFix"> | ||||
| 					</image> | ||||
| 					<first-one v-if="state.categoryList.style === 'first_one'" :data="state.categoryList" | ||||
| 						:activeMenu="state.activeMenu" :pagination="state.pagination" /> | ||||
| 					<first-two v-if="state.categoryList.style === 'first_two'" :data="state.categoryList" | ||||
| 						:activeMenu="state.activeMenu" :pagination="state.pagination" /> | ||||
| 					<second-one v-if="state.categoryList.style === 'second_one'" :data="state.categoryList" | ||||
| 						:activeMenu="state.activeMenu" :pagination="state.pagination" /> | ||||
| 					<third-one v-if="state.categoryList.style === 'third_one'" :data="state.categoryList" | ||||
| 						:activeMenu="state.activeMenu" :pagination="state.pagination" /> | ||||
| 					<uni-load-more v-if=" | ||||
|               (state.categoryList.style === 'first_one' || | ||||
|                 state.categoryList.style === 'first_two') && | ||||
|               state.pagination.total > 0 | ||||
|             " | ||||
|             :status="state.loadStatus" | ||||
|             :content-text="{ | ||||
|             " :status="state.loadStatus" :content-text="{ | ||||
|               contentdown: '点击查看更多', | ||||
|             }" | ||||
|             @tap="loadmore" | ||||
|           /> | ||||
|         </scroll-view> | ||||
|       </view> | ||||
|     </view> | ||||
|   </s-layout> | ||||
|             }" @tap="loadmore" /> | ||||
| 				</scroll-view> | ||||
| 			</view> | ||||
| 		</view> | ||||
| 	</s-layout> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
|   import secondOne from './components/second-one.vue'; | ||||
|   import thirdOne from './components/third-one.vue'; | ||||
|   import firstOne from './components/first-one.vue'; | ||||
|   import firstTwo from './components/first-two.vue'; | ||||
|   import sheep from '@/sheep'; | ||||
| 	import secondOne from './components/second-one.vue'; | ||||
| 	import thirdOne from './components/third-one.vue'; | ||||
| 	import firstOne from './components/first-one.vue'; | ||||
| 	import firstTwo from './components/first-two.vue'; | ||||
| 	import sheep from '@/sheep'; | ||||
| 
 | ||||
|   import { onLoad, onReachBottom } from '@dcloudio/uni-app'; | ||||
|   import { computed, reactive } from 'vue'; | ||||
|   import _ from 'lodash'; | ||||
|   const state = reactive({ | ||||
|     categoryList: [], | ||||
|     activeMenu: '0', | ||||
| 	import { | ||||
| 		onLoad, | ||||
| 		onReachBottom | ||||
| 	} from '@dcloudio/uni-app'; | ||||
| 	import { | ||||
| 		computed, | ||||
| 		reactive | ||||
| 	} from 'vue'; | ||||
| 	import _ from 'lodash'; | ||||
| 	const state = reactive({ | ||||
| 		categoryList: [], | ||||
| 		activeMenu: '0', | ||||
| 
 | ||||
|     pagination: { | ||||
|       data: [], | ||||
|       current_page: 1, | ||||
|       total: 1, | ||||
|       last_page: 1, | ||||
|     }, | ||||
|     loadStatus: '', | ||||
|   }); | ||||
| 		pagination: { | ||||
| 			data: [], | ||||
| 			current_page: 1, | ||||
| 			total: 1, | ||||
| 			last_page: 1, | ||||
| 		}, | ||||
| 		loadStatus: '', | ||||
| 	}); | ||||
| 
 | ||||
|   const { screenHeight, safeAreaInsets, screenWidth, safeArea } = sheep.$platform.device; | ||||
|   const pageHeight = computed(() => safeArea.height - 44 - 50); | ||||
| 	const { | ||||
| 		screenHeight, | ||||
| 		safeAreaInsets, | ||||
| 		screenWidth, | ||||
| 		safeArea | ||||
| 	} = sheep.$platform.device; | ||||
| 	const pageHeight = computed(() => safeArea.height - 44 - 50); | ||||
| 
 | ||||
|   async function getList(options) { | ||||
|     const { error, data } = await sheep.$api.category.list({ | ||||
|       id: options.id, | ||||
|     }); | ||||
|     if (error === 0) { | ||||
|       state.categoryList = data; | ||||
|     } | ||||
|   } | ||||
| 	async function getList(options) { | ||||
| 		const { | ||||
| 			code, | ||||
| 			data | ||||
| 		} = await sheep.$api.category.list({ | ||||
| 			id: options.id, | ||||
| 		}); | ||||
| 		if (code === 0) { | ||||
| 			state.categoryList = { | ||||
| 				children: data | ||||
| 			}; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|   const onMenu = (val) => { | ||||
|     state.activeMenu = val; | ||||
|     if (state.categoryList.style === 'first_one' || state.categoryList.style === 'first_two') { | ||||
|       state.pagination = { | ||||
|         data: [], | ||||
|         current_page: 1, | ||||
|         total: 1, | ||||
|         last_page: 1, | ||||
|       }; | ||||
|       getGoodsList(state.categoryList.children[val].id); | ||||
|     } | ||||
|   }; | ||||
| 	const onMenu = (val) => { | ||||
| 		state.activeMenu = val; | ||||
| 		if (state.categoryList.style === 'first_one' || state.categoryList.style === 'first_two') { | ||||
| 			state.pagination = { | ||||
| 				data: [], | ||||
| 				current_page: 1, | ||||
| 				total: 1, | ||||
| 				last_page: 1, | ||||
| 			}; | ||||
| 		} | ||||
| 		// 这段代码本来是在判断里的 | ||||
| 		getGoodsList(state.categoryList.children[val].id); | ||||
| 	}; | ||||
| 
 | ||||
|   async function getGoodsList(id, page = 1, list_rows = 6) { | ||||
|     state.loadStatus = 'loading'; | ||||
|     const res = await sheep.$api.goods.list({ | ||||
|       category_id: id, | ||||
|       list_rows, | ||||
|       page, | ||||
|     }); | ||||
|     if (res.error === 0) { | ||||
|       let couponList = _.concat(state.pagination.data, res.data.data); | ||||
|       state.pagination = { | ||||
|         ...res.data, | ||||
|         data: couponList, | ||||
|       }; | ||||
|       if (state.pagination.current_page < state.pagination.last_page) { | ||||
|         state.loadStatus = 'more'; | ||||
|       } else { | ||||
|         state.loadStatus = 'noMore'; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   // 加载更多 | ||||
|   function loadmore() { | ||||
|     if (state.loadStatus !== 'noMore') { | ||||
|       getGoodsList( | ||||
|         state.categoryList.children[state.activeMenu].id, | ||||
|         state.pagination.current_page + 1, | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
|   onLoad(async (options) => { | ||||
|     await getList(options); | ||||
|     if (state.categoryList.style === 'first_one' || state.categoryList.style === 'first_two') { | ||||
|       getGoodsList(state.categoryList.children[0].id); | ||||
|     } | ||||
|   }); | ||||
|   onReachBottom(() => { | ||||
|     loadmore(); | ||||
|   }); | ||||
| 	async function getGoodsList(id, page = 1, list_rows = 6) { | ||||
| 		state.loadStatus = 'loading'; | ||||
| 		const res = await sheep.$api.goods.list({ | ||||
| 			categoryId: id, | ||||
| 			pageSize:list_rows, | ||||
| 			pageNo:page, | ||||
| 		}); | ||||
| 		if (res.code === 0) { | ||||
| 			let couponList = _.concat(state.pagination.data, res.data.list); | ||||
| 			state.pagination = { | ||||
| 				...res.data, | ||||
| 				data: couponList, | ||||
| 			}; | ||||
| 			console.log(state.pagination) | ||||
| 			if (state.pagination.current_page < state.pagination.last_page) { | ||||
| 				state.loadStatus = 'more'; | ||||
| 			} else { | ||||
| 				state.loadStatus = 'noMore'; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	// 加载更多 | ||||
| 	function loadmore() { | ||||
| 		if (state.loadStatus !== 'noMore') { | ||||
| 			getGoodsList( | ||||
| 				state.categoryList.children[state.activeMenu].id, | ||||
| 				state.pagination.current_page + 1, | ||||
| 			); | ||||
| 		} | ||||
| 	} | ||||
| 	onLoad(async (options) => { | ||||
| 		await getList(options); | ||||
| 		if (state.categoryList.style === 'first_one' || state.categoryList.style === 'first_two') { | ||||
| 			getGoodsList(state.categoryList.children[0].id); | ||||
| 		} | ||||
| 	}); | ||||
| 	onReachBottom(() => { | ||||
| 		loadmore(); | ||||
| 	}); | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
|   .s-category { | ||||
|     :deep() { | ||||
|       .side-menu-wrap { | ||||
|         width: 200rpx; | ||||
|         height: 100%; | ||||
|         padding-left: 12rpx; | ||||
|         background-color: #f6f6f6; | ||||
| 	.s-category { | ||||
| 		:deep() { | ||||
| 			.side-menu-wrap { | ||||
| 				width: 200rpx; | ||||
| 				height: 100%; | ||||
| 				padding-left: 12rpx; | ||||
| 				background-color: #f6f6f6; | ||||
| 
 | ||||
|         .menu-item { | ||||
|           width: 100%; | ||||
|           height: 88rpx; | ||||
|           position: relative; | ||||
|           transition: all linear 0.2s; | ||||
| 				.menu-item { | ||||
| 					width: 100%; | ||||
| 					height: 88rpx; | ||||
| 					position: relative; | ||||
| 					transition: all linear 0.2s; | ||||
| 
 | ||||
|           .menu-title { | ||||
|             line-height: 32rpx; | ||||
|             font-size: 30rpx; | ||||
|             font-weight: 400; | ||||
|             color: #333; | ||||
|             margin-left: 28rpx; | ||||
|             position: relative; | ||||
|             z-index: 0; | ||||
| 					.menu-title { | ||||
| 						line-height: 32rpx; | ||||
| 						font-size: 30rpx; | ||||
| 						font-weight: 400; | ||||
| 						color: #333; | ||||
| 						margin-left: 28rpx; | ||||
| 						position: relative; | ||||
| 						z-index: 0; | ||||
| 
 | ||||
|             &::before { | ||||
|               content: ''; | ||||
|               width: 64rpx; | ||||
|               height: 12rpx; | ||||
|               background: linear-gradient( | ||||
|                 90deg, | ||||
|                 var(--ui-BG-Main-gradient), | ||||
|                 var(--ui-BG-Main-light) | ||||
|               ) !important; | ||||
|               position: absolute; | ||||
|               left: -64rpx; | ||||
|               bottom: 0; | ||||
|               z-index: -1; | ||||
|               transition: all linear 0.2s; | ||||
|             } | ||||
|           } | ||||
| 						&::before { | ||||
| 							content: ''; | ||||
| 							width: 64rpx; | ||||
| 							height: 12rpx; | ||||
| 							background: linear-gradient(90deg, | ||||
| 									var(--ui-BG-Main-gradient), | ||||
| 									var(--ui-BG-Main-light)) !important; | ||||
| 							position: absolute; | ||||
| 							left: -64rpx; | ||||
| 							bottom: 0; | ||||
| 							z-index: -1; | ||||
| 							transition: all linear 0.2s; | ||||
| 						} | ||||
| 					} | ||||
| 
 | ||||
|           &.menu-item-active { | ||||
|             background-color: #fff; | ||||
|             border-radius: 20rpx 0 0 20rpx; | ||||
| 					&.menu-item-active { | ||||
| 						background-color: #fff; | ||||
| 						border-radius: 20rpx 0 0 20rpx; | ||||
| 
 | ||||
|             &::before { | ||||
|               content: ''; | ||||
|               position: absolute; | ||||
|               right: 0; | ||||
|               bottom: -20rpx; | ||||
|               width: 20rpx; | ||||
|               height: 20rpx; | ||||
|               background: radial-gradient(circle at 0 100%, transparent 20rpx, #fff 0); | ||||
|             } | ||||
| 						&::before { | ||||
| 							content: ''; | ||||
| 							position: absolute; | ||||
| 							right: 0; | ||||
| 							bottom: -20rpx; | ||||
| 							width: 20rpx; | ||||
| 							height: 20rpx; | ||||
| 							background: radial-gradient(circle at 0 100%, transparent 20rpx, #fff 0); | ||||
| 						} | ||||
| 
 | ||||
|             &::after { | ||||
|               content: ''; | ||||
|               position: absolute; | ||||
|               top: -20rpx; | ||||
|               right: 0; | ||||
|               width: 20rpx; | ||||
|               height: 20rpx; | ||||
|               background: radial-gradient(circle at 0% 0%, transparent 20rpx, #fff 0); | ||||
|             } | ||||
| 						&::after { | ||||
| 							content: ''; | ||||
| 							position: absolute; | ||||
| 							top: -20rpx; | ||||
| 							right: 0; | ||||
| 							width: 20rpx; | ||||
| 							height: 20rpx; | ||||
| 							background: radial-gradient(circle at 0% 0%, transparent 20rpx, #fff 0); | ||||
| 						} | ||||
| 
 | ||||
|             .menu-title { | ||||
|               font-weight: 600; | ||||
| 						.menu-title { | ||||
| 							font-weight: 600; | ||||
| 
 | ||||
|               &::before { | ||||
|                 left: 0; | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
| 							&::before { | ||||
| 								left: 0; | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
|       .goods-list-box { | ||||
|         background-color: #fff; | ||||
|         width: calc(100vw - 100px); | ||||
|         padding: 10px; | ||||
|       } | ||||
| 			.goods-list-box { | ||||
| 				background-color: #fff; | ||||
| 				width: calc(100vw - 100px); | ||||
| 				padding: 10px; | ||||
| 			} | ||||
| 
 | ||||
|       .banner-img { | ||||
|         width: calc(100vw - 130px); | ||||
|         border-radius: 5px; | ||||
|         margin-bottom: 20rpx; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| </style> | ||||
| 			.banner-img { | ||||
| 				width: calc(100vw - 130px); | ||||
| 				border-radius: 5px; | ||||
| 				margin-bottom: 20rpx; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| </style> | ||||
|  | @ -1,70 +1,84 @@ | |||
| <template> | ||||
|   <view v-if="template"> | ||||
|     <s-layout | ||||
|       title="首页" | ||||
|       navbar="custom" | ||||
|       tabbar="/pages/index/index" | ||||
|       :bgStyle="template.style?.background" | ||||
|       :navbarStyle="template.style?.navbar" | ||||
|       onShareAppMessage | ||||
|     > | ||||
|       <s-block v-for="(item, index) in template.data" :key="index" :styles="item.style"> | ||||
|         <s-block-item :type="item.type" :data="item.data" :styles="item.style" /> | ||||
|       </s-block> | ||||
|       <!-- 广告模块 --> | ||||
|       <s-popup-image /> | ||||
|     </s-layout> | ||||
|   </view> | ||||
| 	<view v-if="template"> | ||||
| 		<s-layout title="首页" navbar="custom" tabbar="/pages/index/index" :bgStyle="template.style?.background" | ||||
| 			:navbarStyle="template.style?.navbar" onShareAppMessage> | ||||
| 			<s-block v-for="(item, index) in template.data" :key="index" :styles="item.style"> | ||||
| 				<s-block-item :type="item.type" :data="item.data" :styles="item.style" /> | ||||
| 			</s-block> | ||||
| 			<!-- 广告模块 --> | ||||
| 			<s-popup-image /> | ||||
| 		</s-layout> | ||||
| 	</view> | ||||
| </template> | ||||
| 
 | ||||
| <script setup> | ||||
|   import { computed } from 'vue'; | ||||
|   import { onLoad, onPageScroll, onPullDownRefresh } from '@dcloudio/uni-app'; | ||||
|   import sheep from '@/sheep'; | ||||
|   import $share from '@/sheep/platform/share'; | ||||
| 	import { | ||||
| 		computed | ||||
| 	} from 'vue'; | ||||
| 	import { | ||||
| 		onLoad, | ||||
| 		onPageScroll, | ||||
| 		onPullDownRefresh | ||||
| 	} from '@dcloudio/uni-app'; | ||||
| 	import sheep from '@/sheep'; | ||||
| 	import $share from '@/sheep/platform/share'; | ||||
| 	import index2Api from '@/sheep/api/index2'; | ||||
| 	// 隐藏原生tabBar | ||||
| 	uni.hideTabBar(); | ||||
| 
 | ||||
|   // 隐藏原生tabBar | ||||
|   uni.hideTabBar(); | ||||
| 	const template = computed(() => sheep.$store('app').template?.home); | ||||
| 	// 在此处拦截改变一下首页轮播图 此处先写死后期复活 | ||||
| 	(async function() { | ||||
| 		let { | ||||
| 			data | ||||
| 		} = await index2Api.decorate(); | ||||
| 		template.value.data[0].data.list = JSON.parse(data[0].value).map(item => { | ||||
| 			return { | ||||
| 				src: item.picUrl, | ||||
| 				url: item.url, | ||||
| 				title: item.name, | ||||
| 				type: "image" | ||||
| 			} | ||||
| 		}) | ||||
| 	}()) | ||||
| 
 | ||||
|   const template = computed(() => sheep.$store('app').template?.home); | ||||
| 	onLoad((options) => { | ||||
| 		// #ifdef MP | ||||
| 		// 小程序识别二维码 | ||||
| 		if (options.scene) { | ||||
| 			const sceneParams = decodeURIComponent(options.scene).split('='); | ||||
| 			options[sceneParams[0]] = sceneParams[1]; | ||||
| 		} | ||||
| 		// #endif | ||||
| 
 | ||||
|   onLoad((options) => { | ||||
|     // #ifdef MP | ||||
|     // 小程序识别二维码 | ||||
|     if (options.scene) { | ||||
|       const sceneParams = decodeURIComponent(options.scene).split('='); | ||||
|       options[sceneParams[0]] = sceneParams[1]; | ||||
|     } | ||||
|     // #endif | ||||
| 		// 预览模板 | ||||
| 		if (options.templateId) { | ||||
| 			sheep.$store('app').init(options.templateId); | ||||
| 		} | ||||
| 
 | ||||
|     // 预览模板 | ||||
|     if (options.templateId) { | ||||
|       sheep.$store('app').init(options.templateId); | ||||
|     } | ||||
| 		// 解析分享信息 | ||||
| 		if (options.spm) { | ||||
| 			$share.decryptSpm(options.spm); | ||||
| 		} | ||||
| 
 | ||||
|     // 解析分享信息 | ||||
|     if (options.spm) { | ||||
|       $share.decryptSpm(options.spm); | ||||
|     } | ||||
| 		// 进入指定页面(完整页面路径) | ||||
| 		if (options.page) { | ||||
| 			sheep.$router.go(decodeURIComponent(options.page)); | ||||
| 		} | ||||
| 
 | ||||
|     // 进入指定页面(完整页面路径) | ||||
|     if (options.page) { | ||||
|       sheep.$router.go(decodeURIComponent(options.page)); | ||||
|     } | ||||
| 		// TODO 芋艿:测试接口的调用 | ||||
| 		sheep.$api.app.test(); | ||||
| 	}); | ||||
| 
 | ||||
|     // TODO 芋艿:测试接口的调用 | ||||
|     sheep.$api.app.test(); | ||||
|   }); | ||||
| 	// 下拉刷新 | ||||
| 	onPullDownRefresh(() => { | ||||
| 		sheep.$store('app').init(); | ||||
| 		setTimeout(function() { | ||||
| 			uni.stopPullDownRefresh(); | ||||
| 		}, 800); | ||||
| 	}); | ||||
| 
 | ||||
|   // 下拉刷新 | ||||
|   onPullDownRefresh(() => { | ||||
|     sheep.$store('app').init(); | ||||
|     setTimeout(function () { | ||||
|       uni.stopPullDownRefresh(); | ||||
|     }, 800); | ||||
|   }); | ||||
| 
 | ||||
|   onPageScroll(() => {}); | ||||
| 	onPageScroll(() => {}); | ||||
| </script> | ||||
| 
 | ||||
| <style></style> | ||||
| <style></style> | ||||
|  | @ -1,9 +1,10 @@ | |||
| import request from '@/sheep/request'; | ||||
| import request2 from '@/sheep/request2'; | ||||
| 
 | ||||
| export default { | ||||
|   list: (data) => | ||||
|     request({ | ||||
|       url: 'cart', | ||||
|     request2({ | ||||
|       url: 'trade/cart/list', | ||||
|       method: 'GET', | ||||
|       custom: { | ||||
|         showLoading: false, | ||||
|  | @ -25,14 +26,14 @@ export default { | |||
|     }), | ||||
|   // 删除购物车
 | ||||
|   delete: (ids) => | ||||
|     request({ | ||||
|       url: 'cart/' + ids, | ||||
|     request2({ | ||||
|       url: 'trade/cart/delete?ids=' + ids, | ||||
|       method: 'DELETE', | ||||
|     }), | ||||
|   update: (data) => | ||||
|     request({ | ||||
|       url: 'cart', | ||||
|       method: 'POST', | ||||
|     request2({ | ||||
|       url: 'trade/cart/update-count', | ||||
|       method: 'PUT', | ||||
|       data: { | ||||
|         ...data, | ||||
|         type: 'cover', | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| import request from '@/sheep/request'; | ||||
| import request2 from '@/sheep/request2'; | ||||
| 
 | ||||
| export default { | ||||
|   list: (params) => | ||||
|     request({ | ||||
|       url: 'category', | ||||
|     request2({ | ||||
|       url: 'product/category/list', | ||||
|       method: 'GET', | ||||
|       params, | ||||
|     }), | ||||
|  |  | |||
|  | @ -16,8 +16,8 @@ export default { | |||
| 
 | ||||
|   // 商品列表
 | ||||
|   list: (params) => | ||||
|     request({ | ||||
|       url: 'goods/goods', | ||||
|     request2({ | ||||
|       url: 'product/spu/page', | ||||
|       method: 'GET', | ||||
|       params, | ||||
|       custom: { | ||||
|  | @ -49,6 +49,16 @@ export default { | |||
|         showError: false, | ||||
|       }, | ||||
|     }), | ||||
|   comment2: (id, params = {pageNo:1,pageSize:10,type:0}) => | ||||
|     request2({ | ||||
|       url: 'product/comment/page?spuId='+id, | ||||
|       method: 'GET', | ||||
|       params, | ||||
|       custom: { | ||||
|         showLoading: false, | ||||
|         showError: false, | ||||
|       }, | ||||
|     }), | ||||
|   // 商品评价类型
 | ||||
|   getType: (id) => | ||||
|     request({ | ||||
|  |  | |||
|  | @ -0,0 +1,9 @@ | |||
| import request2 from '@/sheep/request2'; | ||||
| 
 | ||||
| export default { | ||||
|   decorate: () => | ||||
|     request2({ | ||||
|       url: 'promotion/decorate/list?page=1', | ||||
|       method: 'GET', | ||||
|     }), | ||||
| }; | ||||
|  | @ -68,7 +68,7 @@ const http = new Request({ | |||
|  */ | ||||
| http.interceptors.request.use( | ||||
|   (config) => { | ||||
| 	  console.log(config); | ||||
| 	  // console.log(config);
 | ||||
|     if (config.custom.auth && !$store('user').isLogin) { | ||||
|       showAuthModal(); | ||||
|       return Promise.reject(); | ||||
|  | @ -110,7 +110,7 @@ http.interceptors.response.use( | |||
|     } | ||||
| 
 | ||||
|     response.config.custom.showLoading && closeLoading(); | ||||
|     if (response.data.error !== 0) { | ||||
|     if (response.data.code !== 0) { | ||||
|       if (response.config.custom.showError) | ||||
|         uni.showToast({ | ||||
|           title: response.data.msg || '服务器开小差啦,请稍后再试~', | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ const cart = defineStore({ | |||
|       if (!state.selectedIds.length) return price.toFixed(2); | ||||
|       state.list.forEach((item) => { | ||||
|         price += state.selectedIds.includes(item.id) | ||||
|           ? Number(item.sku_price.price) * item.goods_num | ||||
|           ? Number(item.sku.price/100) * item.count | ||||
|           : 0; | ||||
|       }); | ||||
|       return price.toFixed(2); | ||||
|  | @ -24,9 +24,9 @@ const cart = defineStore({ | |||
|   actions: { | ||||
|     // 获取购物车列表
 | ||||
|     async getList() { | ||||
|       const { data, error } = await cartApi.list(); | ||||
|       if (error === 0) { | ||||
|         this.list = data; | ||||
|       const { data, code } = await cartApi.list(); | ||||
|       if (code === 0) { | ||||
|         this.list = data.validList; | ||||
|       } | ||||
|     }, | ||||
|     // 添加购物车
 | ||||
|  | @ -44,8 +44,8 @@ const cart = defineStore({ | |||
|     // 更新购物车
 | ||||
|     async update(goodsInfo) { | ||||
|       const { error } = await cartApi.update({ | ||||
|         goods_id: goodsInfo.goods_id, | ||||
|         goods_num: goodsInfo.goods_num, | ||||
|         id: goodsInfo.goods_id, | ||||
|         count: goodsInfo.goods_num, | ||||
|         goods_sku_price_id: goodsInfo.goods_sku_price_id, | ||||
|       }); | ||||
|       if (error === 0) { | ||||
|  | @ -58,8 +58,8 @@ const cart = defineStore({ | |||
|       if (typeof ids === 'array') { | ||||
|         ids = ids.join(','); | ||||
|       } | ||||
|       const { error } = await cartApi.delete(ids); | ||||
|       if (error === 0) { | ||||
|       const { code } = await cartApi.delete(ids); | ||||
|       if (code === 0) { | ||||
|         this.selectAll(false); | ||||
|         this.getList(); | ||||
|       } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 落日晚风
						落日晚风