Merge branch 'dev' into test
This commit is contained in:
@@ -151,3 +151,13 @@ export function getBargainUserList(data) {
|
|||||||
export function getBargainUserCancel(data) {
|
export function getBargainUserCancel(data) {
|
||||||
return request.post("/bargain/user/cancel", data);
|
return request.post("/bargain/user/cancel", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新品专区
|
||||||
|
* @param {*} data
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function queryNewZone() {
|
||||||
|
return request.get("/newGoods");
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
|
export function getFarmerShop(id) {
|
||||||
|
return request.get("/countyFamous/farmerShop/" + id)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setFarmerShopZan(data) {
|
||||||
|
return request.post("/countyFamous/farmerShop/zan", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFarmerShopNews(data) {
|
||||||
|
return request.get("/countyFamous/farmerShop/news", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function getFarmerShopQualification(data) {
|
||||||
|
return request.get("/countyFamous/farmerShop/qualification", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setFarmerShopCollection(data) {
|
||||||
|
return request.post("/collection/farmerShop/add", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-养生圣地分类列表
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getCategory() {
|
||||||
|
return request.get("/wellness/place/category")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-养生圣地列表
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getWellnessPlace(params) {
|
||||||
|
return request.get("/wellness/place", params)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-展会列表
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getWellnessExhibition(params) {
|
||||||
|
return request.get("/wellness/exhibition", params)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-展会详情
|
||||||
|
* @param {*} id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getWellnessExhibitionDetails(id) {
|
||||||
|
return request.get("/wellness/exhibition/" + id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-养生榜单
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getRank(params) {
|
||||||
|
return request.get("/wellness/place/ranking", params)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-养生食材列表
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getFoods(params) {
|
||||||
|
return request.get("/wellness/place/food", params)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-配方详情
|
||||||
|
* @param {*} id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getFoodDetails(id) {
|
||||||
|
return request.get("/wellness/recipe/" + id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-配方列表
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getRecipe(params) {
|
||||||
|
return request.get("/wellness/recipe", params)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 康养生活-展会轮播图
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getBanner() {
|
||||||
|
return request.get("/wellness/exhibition/banner")
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 省份非遗数据
|
||||||
|
* @param {*} id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getIch(id) {
|
||||||
|
return request.get("/ich/v2/" + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 省份非遗专题数据
|
||||||
|
* @param {*} id
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getIchContent(id) {
|
||||||
|
return request.get("/ich/v2/content/" + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取省份非遗推荐数据
|
||||||
|
* @param {*} params
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function getIchRecommend(params) {
|
||||||
|
return request.get("/ich/v2/recommend", params);
|
||||||
|
}
|
||||||
@@ -236,3 +236,8 @@ export function getHotelShareBackgroundImage(id) {
|
|||||||
export function hotelNewsView(data) {
|
export function hotelNewsView(data) {
|
||||||
return request.post("/api/hotelNews/view", data, {login: true})
|
return request.post("/api/hotelNews/view", data, {login: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function getFarmerShop(id) {
|
||||||
|
return request.get("/api/countyFamous/farmerShop/" + id)
|
||||||
|
}
|
||||||
|
|||||||
@@ -132,3 +132,31 @@ export function getProvinceGoods(parentId, keyword, page) {
|
|||||||
const params = `?parentId=${parentId}&keyword=${keyword}&page=${page}&limit=10`;
|
const params = `?parentId=${parentId}&keyword=${keyword}&page=${page}&limit=10`;
|
||||||
return request.get('/landmarkGoods/productList' + params, {}, {login: false})
|
return request.get('/landmarkGoods/productList' + params, {}, {login: false})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getPorjectRecommend(params) {
|
||||||
|
return request.get('/landmarkGoods/hotelList', params, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getPorjectPolicyFiles(params) {
|
||||||
|
return request.get('/landmarkGoods/policyFiles', params, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getCulture(params) {
|
||||||
|
return request.get('/landmarkGoods/culture', params, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getNews(params) {
|
||||||
|
return request.get('/landmarkGoods/news', params, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hadLike(data) {
|
||||||
|
return request.post('/landmarkGoods/news/zan', data, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hadView(data) {
|
||||||
|
return request.post('/landmarkGoods/news/view', data, {login: false})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getShareImg(id) {
|
||||||
|
return request.get('/landmarkGoods/poster/' + id, {}, {login: false})
|
||||||
|
}
|
||||||
@@ -94,3 +94,8 @@ export function getCountyFamousVillageDetail(id) {
|
|||||||
export function getCountyFamousVillageNews(param) {
|
export function getCountyFamousVillageNews(param) {
|
||||||
return request.get('/countyFamous/village/news', param, { login: true })
|
return request.get('/countyFamous/village/news', param, { login: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取千县分享图
|
||||||
|
export function getShareImg(id) {
|
||||||
|
return request.get('/countyFamous/poster/' + id, {login: true})
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
.box-share {
|
.box-share {
|
||||||
.box-img {
|
.box-img {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 500rpx;
|
width: 600rpx;
|
||||||
height: 632rpx;
|
height: 832rpx;
|
||||||
border-radius: 40rpx;
|
border-radius: 40rpx;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@@ -26,14 +26,14 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.main-img {
|
.main-img {
|
||||||
width: 500rpx;
|
width: 600rpx;
|
||||||
height: 632rpx;
|
height: 832rpx;
|
||||||
border-radius: 40rpx;
|
border-radius: 40rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
width: 500rpx;
|
width: 600rpx;
|
||||||
height: 100rpx;
|
height: 120rpx;
|
||||||
margin-top: 20rpx;
|
margin-top: 20rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
@dark-color: #333333;
|
@dark-color: #333333;
|
||||||
@white-color: #fff;
|
@white-color: #fff;
|
||||||
|
|
||||||
@colors: #C52733, #333333, #fff, #666, #F0F0F0, #999999, #E92727, #FFC543;
|
@colors: #C52733, #333333, #fff, #666, #F0F0F0, #999999, #E92727, #FFC543, #69C573;
|
||||||
@classnames: primary, dark, white, secondary-dark, grey, dark1, red, yellow;
|
@classnames: primary, dark, white, secondary-dark, grey, dark1, red, yellow, success;
|
||||||
/*=====================================*/
|
/*=====================================*/
|
||||||
|
|
||||||
each(@colors, {
|
each(@colors, {
|
||||||
@@ -192,6 +192,9 @@ each(@colors, {
|
|||||||
.v12-full-width{
|
.v12-full-width{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.v12-nowrap{
|
||||||
|
white-space: nowrap
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="slider-banner product-bg">
|
<view class="slider-banner product-bg">
|
||||||
<swiper class="swiper-wrapper" @change="handleChange" v-if="imgUrls.length > 0" :indicator-dots='true' indicator-color="rgba(255, 255, 255, .3)" indicator-active-color="#ffffff">
|
<swiper autoplay circular interval="2000" class="swiper-wrapper" @change="handleChange" v-if="imgUrls.length > 0" :indicator-dots='true' indicator-color="rgba(255, 255, 255, .3)" indicator-active-color="#ffffff">
|
||||||
<block v-for="(item, imgUrlsIndex) in imgUrls" :key="imgUrlsIndex">
|
<block v-for="(item, imgUrlsIndex) in imgUrls" :key="imgUrlsIndex">
|
||||||
<swiper-item>
|
<swiper-item>
|
||||||
<image v-if="!checkIfVideo(item)" :src="item" class="slide-image" />
|
<image v-if="!checkIfVideo(item)" :src="item" class="slide-image" />
|
||||||
<video v-else class="slide-image" @play="storePlayObj" :show-fullscreen-btn="false" :src="item" :id="buildId(imgUrlsIndex)" autoplay controls></video>
|
<video v-else class="slide-image" @play="storePlayObj" :show-fullscreen-btn="false" :src="item" :id="buildId(imgUrlsIndex)" autoplay controls></video>
|
||||||
</swiper-item>
|
</swiper-item>
|
||||||
</block>
|
</block>
|
||||||
</swiper>
|
</swiper>
|
||||||
@@ -38,7 +38,7 @@ export default {
|
|||||||
currentVideo:null,
|
currentVideo:null,
|
||||||
ProductConSwiper: {
|
ProductConSwiper: {
|
||||||
autoplay: {
|
autoplay: {
|
||||||
disableOnInteraction: false,
|
disableOnInteraction: true,
|
||||||
delay: 2000
|
delay: 2000
|
||||||
},
|
},
|
||||||
loop: true,
|
loop: true,
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ export default {
|
|||||||
overscroll-behavior: contain;
|
overscroll-behavior: contain;
|
||||||
}
|
}
|
||||||
.poster-pop {
|
.poster-pop {
|
||||||
width: 4.5 * 100rpx;
|
width: 6 * 100rpx;
|
||||||
height: 8 * 100rpx;
|
height: 8 * 100rpx;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
|||||||
@@ -11,13 +11,13 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="acea-row row-middle">
|
<view class="acea-row row-middle">
|
||||||
<view class="name line1">{{ item.nickname }}</view>
|
<view class="name line1">{{ item.nickname }}</view>
|
||||||
|
<view class="time">{{ item.createTime }} </view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="v12-px-4">
|
<view class="v12-px-4">
|
||||||
<view class="v12-secondary-dark-text v12-font-24 attr-bg"> {{ item.sku }}</view>
|
<view class="v12-secondary-dark-text v12-font-24 attr-bg"> {{ item.sku }}</view>
|
||||||
<view class="start" :class="'star' + item.star"></view>
|
<view class="start" :class="'star' + item.star"></view>
|
||||||
</view>
|
</view>
|
||||||
<!-- <view class="time">{{ item.createTime }} {{ item.sku||'' }}</view> -->
|
|
||||||
<view class="evaluate-infor v12-font-24">{{ item.comment }}</view>
|
<view class="evaluate-infor v12-font-24">{{ item.comment }}</view>
|
||||||
<view class="imgList acea-row">
|
<view class="imgList acea-row">
|
||||||
<view v-if="item.video" class="pictrue">
|
<view v-if="item.video" class="pictrue">
|
||||||
@@ -61,12 +61,12 @@ export default {
|
|||||||
mounted: function() {},
|
mounted: function() {},
|
||||||
methods: {
|
methods: {
|
||||||
dataFormat,
|
dataFormat,
|
||||||
previewImage(imgs,index){
|
previewImage(imgs,index){
|
||||||
uni.previewImage({
|
uni.previewImage({
|
||||||
current:imgs[index],
|
current:imgs[index],
|
||||||
urls:imgs
|
urls:imgs
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@@ -77,4 +77,7 @@ export default {
|
|||||||
width: fit-content;
|
width: fit-content;
|
||||||
border-radius: 12rpx;
|
border-radius: 12rpx;
|
||||||
}
|
}
|
||||||
|
.time{
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
class="sunui-uploader-file"
|
class="sunui-uploader-file"
|
||||||
/>
|
/>
|
||||||
<block v-for="(item, index) in upload_before_list" :key="index">
|
<block v-for="(item, index) in upload_before_list" :key="index">
|
||||||
<view class="sunui-uploader-file" :class="[item.upload_percent < 100 ? 'sunui-uploader-file-status' : '']" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
|
<view class="sunui-uploader-file" :class="[item.upload_percent < 100 ? '' : '']" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
|
||||||
<image class="sunui-uploader-img" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" :src="item.path" mode="aspectFill" @tap="preview(index)" v-if="type === 'image'" />
|
<image class="sunui-uploader-img" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" :src="item.path" mode="aspectFill" @tap="preview(index)" v-if="type === 'image'" />
|
||||||
<video :id="`myVideo_${index}`" :src="item.path" :data-index="index" @play="videoPlay" @error="videoError" controls :enable-play-gesture="true" objectFit="contain" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" v-if="type === 'video'"></video>
|
<video :id="`myVideo_${index}`" :src="item.path" :data-index="index" @play="videoPlay" @error="videoError" controls :enable-play-gesture="true" objectFit="contain" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" v-if="type === 'video'"></video>
|
||||||
<view class="sunui-img-removeicon right" @tap.stop="remove(index)" v-show="upimg_move">x</view>
|
<view class="sunui-img-removeicon right" @tap.stop="remove(index)" v-show="upimg_move">x</view>
|
||||||
<view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{item.upload_percent}}%</view>
|
<!-- <view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{item.upload_percent}}%</view> -->
|
||||||
</view>
|
</view>
|
||||||
</block>
|
</block>
|
||||||
<view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
|
<view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
|
||||||
@@ -185,6 +185,7 @@ export default {
|
|||||||
if (Math.ceil(res.size / 1024) < this.upload_video_max * 1024) {
|
if (Math.ceil(res.size / 1024) < this.upload_video_max * 1024) {
|
||||||
await this.upload_img_size.push(Math.ceil(res.size / 1024));
|
await this.upload_img_size.push(Math.ceil(res.size / 1024));
|
||||||
await this.upload_before_list.push(res);
|
await this.upload_before_list.push(res);
|
||||||
|
this.$forceUpdate()
|
||||||
} else {
|
} else {
|
||||||
this.upload_exceeded_list.push(1);
|
this.upload_exceeded_list.push(1);
|
||||||
|
|
||||||
@@ -219,6 +220,7 @@ export default {
|
|||||||
if (Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024) {
|
if (Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024) {
|
||||||
await this.upload_img_size.push(Math.ceil(res.tempFiles[i].size / 1024));
|
await this.upload_img_size.push(Math.ceil(res.tempFiles[i].size / 1024));
|
||||||
await this.upload_before_list.push(res.tempFiles[i]);
|
await this.upload_before_list.push(res.tempFiles[i]);
|
||||||
|
this.$forceUpdate()
|
||||||
// TODO v3.1增加图片格式限制
|
// TODO v3.1增加图片格式限制
|
||||||
} else {
|
} else {
|
||||||
res.tempFilePaths.splice(i, 1);
|
res.tempFilePaths.splice(i, 1);
|
||||||
@@ -239,6 +241,7 @@ export default {
|
|||||||
}
|
}
|
||||||
this.upload_cache = await res.tempFilePaths;
|
this.upload_cache = await res.tempFilePaths;
|
||||||
this.upload(this.upload_auto);
|
this.upload(this.upload_auto);
|
||||||
|
this.$forceUpdate()
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
@@ -338,7 +341,12 @@ export default {
|
|||||||
|
|
||||||
uploadTask.onProgressUpdate(async (res) => {
|
uploadTask.onProgressUpdate(async (res) => {
|
||||||
// this.upload_before_list[this.upload_before_list.length-1].upload_percent = await res.progress;
|
// this.upload_before_list[this.upload_before_list.length-1].upload_percent = await res.progress;
|
||||||
for(let i in this.upload_before_list) { if(this.upload_before_list[i].upload_percent != 100) { this.upload_before_list[i].upload_percent = await res.progress; break; } };
|
for (let i in this.upload_before_list) {
|
||||||
|
if (this.upload_before_list[i].upload_percent != 100) {
|
||||||
|
console.log(res.progress, '-----------res.progress-----------');
|
||||||
|
this.upload_before_list[i].upload_percent = await res.progress
|
||||||
|
}
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,17 @@ if (NODE_ENV === 'development' || NODE_ENV === 'test') {
|
|||||||
BASE_URL = 'https://shop.xdd618.com/api'
|
BASE_URL = 'https://shop.xdd618.com/api'
|
||||||
SERVICE_URL = 'https://service-test.xdd618.com/api'
|
SERVICE_URL = 'https://service-test.xdd618.com/api'
|
||||||
SERVICE_WS_URL = 'wss://service-test.xdd618.com/ws'
|
SERVICE_WS_URL = 'wss://service-test.xdd618.com/ws'
|
||||||
|
wx.setEnableDebug({
|
||||||
|
enableDebug: false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
if (NODE_ENV === 'prod') {
|
if (NODE_ENV === 'prod') {
|
||||||
BASE_URL = 'https://wxapp.xdd618.com/api'
|
BASE_URL = 'https://wxapp.xdd618.com/api'
|
||||||
SERVICE_URL = 'https://service.xdd618.com/api'
|
SERVICE_URL = 'https://service.xdd618.com/api'
|
||||||
SERVICE_WS_URL = 'wss://service.xdd618.com/ws'
|
SERVICE_WS_URL = 'wss://service.xdd618.com/ws'
|
||||||
|
wx.setEnableDebug({
|
||||||
|
enableDebug: false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const VUE_APP_API_URL = BASE_URL
|
export const VUE_APP_API_URL = BASE_URL
|
||||||
|
|||||||
+79
-2
@@ -42,6 +42,19 @@
|
|||||||
"navigationBarTitleText": "地标好物"
|
"navigationBarTitleText": "地标好物"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/home/searchPage",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "搜索"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/home/newZone",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "新品专区",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/chose-city/chose-city",
|
"path": "pages/chose-city/chose-city",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -90,7 +103,7 @@
|
|||||||
{
|
{
|
||||||
"path": "pages/cloud/haveFun",
|
"path": "pages/cloud/haveFun",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "寻趣味"
|
"navigationBarTitleText": "探索生活好去处"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -392,6 +405,13 @@
|
|||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "inn/farmerStore",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "",
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "inn/innGoodList",
|
"path": "inn/innGoodList",
|
||||||
"style": {
|
"style": {
|
||||||
@@ -540,7 +560,50 @@
|
|||||||
{
|
{
|
||||||
"path": "views/healthList",
|
"path": "views/healthList",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "康养 · 食材"
|
"navigationBarTitleText": "选择城市",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/expoList",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "康养旅居",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/expoDetails",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "文化艺术",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/healthSanctum",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "康养旅居",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/healthFoods",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "康养旅居",
|
||||||
|
"navigationBarBackgroundColor": "#FAEED8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/healthFoodDetails",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "康养旅居",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/healthSearch",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "搜索",
|
||||||
|
"navigationBarBackgroundColor": "#FFFFFF"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -555,6 +618,20 @@
|
|||||||
"navigationBarTitleText": ""
|
"navigationBarTitleText": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "views/heritage/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "非遗文化",
|
||||||
|
"navigationBarBackgroundColor": "#FAEED8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "views/heritage/details",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "非遗文化",
|
||||||
|
"navigationBarBackgroundColor": "#FAEED8"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "views/heritageVideo",
|
"path": "views/heritageVideo",
|
||||||
"style": {
|
"style": {
|
||||||
|
|||||||
@@ -131,7 +131,7 @@
|
|||||||
<view class="v12-mt-3 v12-font-32 v12-dark-text v12-font-weight-600">发现家乡好物</view>
|
<view class="v12-mt-3 v12-font-32 v12-dark-text v12-font-weight-600">发现家乡好物</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="btn-box">
|
<view class="btn-box">
|
||||||
<button class="btn-yes v12-primary" type="mini" v-if="canIUseGetUserProfile" @tap="getUserInfoProfile">快捷登录</button>
|
<button class="btn-yes v12-primary" type="mini" @tap="getUserInfoProfile">快捷登录</button>
|
||||||
<!-- <button class="btn-no" type="default" @tap="back">拒绝</button> -->
|
<!-- <button class="btn-no" type="default" @tap="back">拒绝</button> -->
|
||||||
</view>
|
</view>
|
||||||
<view class="agree-box v12-align-center">
|
<view class="agree-box v12-align-center">
|
||||||
@@ -171,7 +171,6 @@ export default {
|
|||||||
return {
|
return {
|
||||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
authorize: false,
|
authorize: false,
|
||||||
canIUseGetUserProfile: false,
|
|
||||||
agreeInfo: {},
|
agreeInfo: {},
|
||||||
isAgree: [],
|
isAgree: [],
|
||||||
show: false,
|
show: false,
|
||||||
@@ -188,9 +187,6 @@ export default {
|
|||||||
...mapState(['isAuthorization', '$deviceType', 'token']),
|
...mapState(['isAuthorization', '$deviceType', 'token']),
|
||||||
},
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
if (wx.getUserProfile) {
|
|
||||||
this.canIUseGetUserProfile = true
|
|
||||||
}
|
|
||||||
// 先校验用户是否授权,如果没有授权,显示授权按钮
|
// 先校验用户是否授权,如果没有授权,显示授权按钮
|
||||||
getAgree().then(({data}) => this.agreeInfo = data);
|
getAgree().then(({data}) => this.agreeInfo = data);
|
||||||
},
|
},
|
||||||
@@ -227,18 +223,19 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
doneRedirect() {
|
doneRedirect() {
|
||||||
let redirectUrl = cookie.get('redirect') || "";
|
let redirectUrl = cookie.get('redirect') || ''
|
||||||
redirectUrl = redirectUrl.replace(/\ /g, '');
|
redirectUrl = redirectUrl.replace(/\ /g, '')
|
||||||
//如果已经是授权页,跳转主页
|
// 如果已经是授权页,跳转主页
|
||||||
if (redirectUrl == '/pages/authorization/index' || redirectUrl.length === 0) {
|
if (redirectUrl == '/pages/authorization/index' || redirectUrl.length === 0) {
|
||||||
redirectUrl = '/pages/home/index';
|
redirectUrl = '/pages/home/index'
|
||||||
}
|
}
|
||||||
this.$yrouter.reLaunch({
|
this.$yrouter.reLaunch({
|
||||||
path: redirectUrl,
|
path: redirectUrl
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getUserInfoProfile() {
|
getUserInfoProfile() {
|
||||||
if (!this.isAgree[0]) {
|
const _this = this
|
||||||
|
if (!_this.isAgree[0]) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "请先阅读并同意《用户服务协议及隐私政策》",
|
title: "请先阅读并同意《用户服务协议及隐私政策》",
|
||||||
icon: "none",
|
icon: "none",
|
||||||
@@ -246,33 +243,33 @@ export default {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
wx.getUserProfile({
|
wx.getUserProfile({
|
||||||
lang: 'zh_CN',
|
lang: 'zh_CN',
|
||||||
desc: '需要获取您的信息用来展示',
|
desc: '需要获取您的信息用来展示',
|
||||||
success: res => {
|
success: res => {
|
||||||
uni.showLoading({
|
_this.loginReq(res)
|
||||||
title: '登录中',
|
}
|
||||||
})
|
})
|
||||||
login(res).then(e => {
|
},
|
||||||
let db_nickname = e.data.nickname;
|
loginReq(res) {
|
||||||
|
uni.showLoading({
|
||||||
if (db_nickname === null || db_nickname === undefined || db_nickname === "" || db_nickname === "微信用户") {
|
title: '登录中'
|
||||||
this.showFillOut = true;
|
})
|
||||||
} else {
|
login(res).then(e => {
|
||||||
this.doneRedirect();
|
const db_nickname = e.data.nickname
|
||||||
}
|
if (db_nickname === null || db_nickname === undefined || db_nickname === '' || db_nickname === '微信用户') {
|
||||||
}).catch(error => {
|
this.showFillOut = true
|
||||||
uni.showToast({
|
} else {
|
||||||
title: error,
|
this.doneRedirect()
|
||||||
icon: 'none',
|
}
|
||||||
duration: 2000,
|
}).catch(error => {
|
||||||
})
|
uni.showToast({
|
||||||
})
|
title: error,
|
||||||
},
|
icon: 'none',
|
||||||
|
duration: 2000
|
||||||
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
onChooseAvatar(e) {
|
onChooseAvatar(e) {
|
||||||
const {avatarUrl} = e.detail;
|
const {avatarUrl} = e.detail;
|
||||||
this.avatarUrl = avatarUrl;
|
this.avatarUrl = avatarUrl;
|
||||||
|
|||||||
@@ -194,6 +194,7 @@
|
|||||||
iconStyle="color: #fff"
|
iconStyle="color: #fff"
|
||||||
class="num-step"
|
class="num-step"
|
||||||
@change="e => changeNumHandle(index, gIndex, good, e)"
|
@change="e => changeNumHandle(index, gIndex, good, e)"
|
||||||
|
@overlimit="overlimit"
|
||||||
>
|
>
|
||||||
<template v-slot:minus>
|
<template v-slot:minus>
|
||||||
<view class="v12-minus-btn v12-font-bold flex jc-center ai-center">
|
<view class="v12-minus-btn v12-font-bold flex jc-center ai-center">
|
||||||
@@ -413,6 +414,7 @@ export default {
|
|||||||
}
|
}
|
||||||
this.closeAttr()
|
this.closeAttr()
|
||||||
this.getCart()
|
this.getCart()
|
||||||
|
this.getAddress()
|
||||||
},
|
},
|
||||||
onHide() {
|
onHide() {
|
||||||
this.pageToHideHandle()
|
this.pageToHideHandle()
|
||||||
@@ -548,6 +550,7 @@ export default {
|
|||||||
changeNumHandle(index, gIndex, good, e) {
|
changeNumHandle(index, gIndex, good, e) {
|
||||||
const { type } = e
|
const { type } = e
|
||||||
const value = good.cartNum + (type === 'plus' ? 1 : -1)
|
const value = good.cartNum + (type === 'plus' ? 1 : -1)
|
||||||
|
console.log('index', value);
|
||||||
const id = good.id
|
const id = good.id
|
||||||
// uni.showLoading()
|
// uni.showLoading()
|
||||||
changeCartNum(id, value).then(res => {
|
changeCartNum(id, value).then(res => {
|
||||||
@@ -562,6 +565,16 @@ export default {
|
|||||||
}, 3000)
|
}, 3000)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
overlimit(e) {
|
||||||
|
const tip = {
|
||||||
|
'plus': '商品数量超出库存',
|
||||||
|
'minus': '商品数量不能减少了呦~'
|
||||||
|
}
|
||||||
|
uni.showToast({
|
||||||
|
title: tip[e],
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
},
|
||||||
handleIds() {
|
handleIds() {
|
||||||
if (this.selectCount === 0) {
|
if (this.selectCount === 0) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
|
|||||||
@@ -350,6 +350,14 @@ export default {
|
|||||||
url: `/pages/shop/GoodsCon/index?id=${productId}&from=${this.getOptionsParams()}`
|
url: `/pages/shop/GoodsCon/index?id=${productId}&from=${this.getOptionsParams()}`
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
goToExhibition(linkExhibitionId) {
|
||||||
|
if (!linkExhibitionId) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pkg_product/views/expoDetails?id=${linkExhibitionId}&from=${this.getOptionsParams()}`
|
||||||
|
})
|
||||||
|
},
|
||||||
getOptionsParams() {
|
getOptionsParams() {
|
||||||
// 0、特产;1、文玩;2、七彩云上;3、特色礼品;4、康养食材;5、千县名品;6、景点门票
|
// 0、特产;1、文玩;2、七彩云上;3、特色礼品;4、康养食材;5、千县名品;6、景点门票
|
||||||
let from = ''
|
let from = ''
|
||||||
@@ -392,6 +400,9 @@ export default {
|
|||||||
case 2:
|
case 2:
|
||||||
this.goToGoods(banner.linkProductId)
|
this.goToGoods(banner.linkProductId)
|
||||||
break
|
break
|
||||||
|
case 3:
|
||||||
|
this.goToExhibition(banner.linkExhibitionId)
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,19 +159,19 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
|
|
||||||
},
|
|
||||||
onShow() {
|
|
||||||
const memCityName = uni.getStorageSync('cityName')
|
|
||||||
this.page = 1
|
|
||||||
this.currType = {}
|
this.currType = {}
|
||||||
this.typeIndex = 0
|
|
||||||
this.name = ''
|
|
||||||
getHotelTypeList().then(({data}) => {
|
getHotelTypeList().then(({data}) => {
|
||||||
this.typeList = data
|
this.typeList = data
|
||||||
this.currType = data[this.typeIndex]
|
this.currType = data[this.typeIndex]
|
||||||
this.getMapData()
|
this.getMapData()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
},
|
||||||
|
onShow() {
|
||||||
|
const memCityName = uni.getStorageSync('cityName')
|
||||||
|
this.page = 1
|
||||||
|
// this.typeIndex = 0
|
||||||
|
this.name = ''
|
||||||
if (memCityName.length) {
|
if (memCityName.length) {
|
||||||
this.cityName = memCityName
|
this.cityName = memCityName
|
||||||
uni.removeStorageSync('cityName')
|
uni.removeStorageSync('cityName')
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<view class="culture v12-d-grid-columns-2">
|
||||||
|
<view class="img-item " v-for="(item, index) in list" :key="index" @click="viewImg(item)">
|
||||||
|
<image class="img-item" :src="item" mode="widthFix|heightFix" lazy-load="false"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
v-if="list.length === 0"
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
class="img-nodata"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getCulture,
|
||||||
|
} from "@/api/product"
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
landmarkDataId: null
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
list: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
landmarkDataId(value) {
|
||||||
|
if(value) {
|
||||||
|
this.getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
viewImg(item) {
|
||||||
|
uni.previewImage({
|
||||||
|
current: item, // 当前显示图片的http链接
|
||||||
|
urls: this.list || [] // 需要预览的图片http链接列表
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getData() {
|
||||||
|
getCulture({landmarkDataId: this.landmarkDataId}).then(res => {
|
||||||
|
this.list = res.data.cultureImages || []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.culture{
|
||||||
|
grid-gap: 20rpx 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.img-item{
|
||||||
|
width: 340rpx;
|
||||||
|
height: 320rpx;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
<template>
|
||||||
|
<view class="list-box flex flex-wrap">
|
||||||
|
<view
|
||||||
|
v-for="item in goods"
|
||||||
|
:key="item.id"
|
||||||
|
class="item"
|
||||||
|
@click="goGoods(item.productId)"
|
||||||
|
>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/home/mark-land.png'"
|
||||||
|
class="mark-img"
|
||||||
|
/>
|
||||||
|
<image
|
||||||
|
:src="item.storeImage"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="good-img"
|
||||||
|
/>
|
||||||
|
<view class="content flex flex-col jc-between">
|
||||||
|
<view class="more-t bold">{{ item.title }}</view>
|
||||||
|
<view class="one-t desc">{{ item.description }}</view>
|
||||||
|
<view class="flex jc-between ai-center">
|
||||||
|
<text class="price">¥{{ item.price }}</text>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
|
class="btn"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
v-if="goods.length === 0"
|
||||||
|
:src="webUrl + '/20231023131208675588.png'"
|
||||||
|
class="img-nodata"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
goods: {
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goGoods(id) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/shop/GoodsCon/index?id=${id}&from=landmark`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
.list-box {
|
||||||
|
margin-top: 24rpx;
|
||||||
|
padding: 0 20rpx;
|
||||||
|
.item {
|
||||||
|
position: relative;
|
||||||
|
width: 344rpx;
|
||||||
|
margin-right: 22rpx;
|
||||||
|
margin-bottom: 22rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
background: #FFFFFF;
|
||||||
|
overflow: hidden;
|
||||||
|
.mark-img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 3;
|
||||||
|
display: block;
|
||||||
|
width: 84rpx;
|
||||||
|
height: 74rpx;
|
||||||
|
}
|
||||||
|
.good-img {
|
||||||
|
display: block;
|
||||||
|
width: 344rpx;
|
||||||
|
height: 344rpx;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
height: 156rpx;
|
||||||
|
padding: 8rpx 8rpx 18rpx 8rpx;
|
||||||
|
.more-t {
|
||||||
|
font-size: 28rpx;
|
||||||
|
line-height: 36rpx;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.desc {
|
||||||
|
padding: 5rpx 0;
|
||||||
|
height: 34rpx;
|
||||||
|
color: #FFC543;
|
||||||
|
font-size: 24rpx;
|
||||||
|
}
|
||||||
|
.price {
|
||||||
|
font-size: 40rpx;
|
||||||
|
line-height: 40rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #C52733;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
display: block;
|
||||||
|
width: 48rpx;
|
||||||
|
height: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.item:nth-child(2n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.list-wrap {
|
||||||
|
margin: 20rpx 0 0 0;
|
||||||
|
padding: 0 20rpx;
|
||||||
|
.loadend {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,292 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<view v-if="infoArray.length > 0" class="info-wrapper">
|
||||||
|
<view class="info-list">
|
||||||
|
<view v-for="(item, index) in infoArray" :key="index" class="info-item">
|
||||||
|
<view
|
||||||
|
:class="item.isTop === 1 ? 'info-item-top' : ''"
|
||||||
|
:style="{
|
||||||
|
'background-image': item.isTop
|
||||||
|
? 'url(' + webUrl + '/page/hotel/info-top-bg.png)'
|
||||||
|
: 'none',
|
||||||
|
}"
|
||||||
|
class="info-item-header"
|
||||||
|
>
|
||||||
|
<view class="name">
|
||||||
|
{{ item.title }}
|
||||||
|
</view>
|
||||||
|
<view class="intro">
|
||||||
|
{{ item.content }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="info-item-body">
|
||||||
|
<img-box
|
||||||
|
:imgList="item.images"
|
||||||
|
:num="item.images.length"
|
||||||
|
:img-radius="10"
|
||||||
|
style="width: 100%"
|
||||||
|
@click="infoItemViewClick(item)"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view class="info-item-bottom">
|
||||||
|
<view class="time">
|
||||||
|
{{
|
||||||
|
item.createTime
|
||||||
|
? item.createTime.replace(/-/g, ".").substr(0, 10)
|
||||||
|
: ""
|
||||||
|
}}
|
||||||
|
</view>
|
||||||
|
<view class="btns">
|
||||||
|
<view class="flex">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/20230803152147141807.png'"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
<text class="seeNum-txt v12-font-28">{{ item.pv }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="flex">
|
||||||
|
<image
|
||||||
|
v-if="!item.hasZan"
|
||||||
|
:src="webUrl + '/page/hotel/zan-off-2.png'"
|
||||||
|
class="zan-off-icon"
|
||||||
|
@click="likeInfoItemHandle(item, index, item.zan + 1, true)"
|
||||||
|
/>
|
||||||
|
<image
|
||||||
|
v-else
|
||||||
|
:src="webUrl + '/page/hotel/zan-on-2.png'"
|
||||||
|
class="zan-on-icon"
|
||||||
|
@click="likeInfoItemHandle(item, index, item.zan - 1, false)"
|
||||||
|
/>
|
||||||
|
<text
|
||||||
|
v-show="item.zan > 0"
|
||||||
|
:class="item.hasZan ? 'on' : ''"
|
||||||
|
class="seeNum-txt v12-font-28 v12-ml-1"
|
||||||
|
>{{ item.zan }}</text
|
||||||
|
>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/home/no-data-bg.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
class="no-data-loadend"
|
||||||
|
style="width: 100%;"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
v-if="infoArray.length === 0"
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
class="img-nodata"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getNews,
|
||||||
|
hadLike,
|
||||||
|
hadView
|
||||||
|
} from "@/api/product"
|
||||||
|
import imgBox from '@/components/imageTypeSet/imagebox.vue'
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
landmarkDataId: null
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
imgBox
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
infoArray: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
landmarkDataId(value) {
|
||||||
|
if(value) {
|
||||||
|
this.getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getData() {
|
||||||
|
const params = {
|
||||||
|
landmarkDataId: this.landmarkDataId,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999
|
||||||
|
}
|
||||||
|
getNews(params).then(res => {
|
||||||
|
this.infoArray = res.data.records || []
|
||||||
|
})
|
||||||
|
},
|
||||||
|
likeInfoItemHandle(item, index, value, voValue) {
|
||||||
|
hadLike({ landmarkNewsId: item.id }).then(res => {
|
||||||
|
const { success } = res
|
||||||
|
if (success) {
|
||||||
|
this.$dialog.toast({
|
||||||
|
mes: '操作成功!'
|
||||||
|
})
|
||||||
|
this.$set(this.infoArray[index], 'zan', value)
|
||||||
|
this.$set(this.infoArray[index], 'hasZan', voValue)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
infoItemViewClick(item) {
|
||||||
|
uni.$u.debounce(() => {
|
||||||
|
hadView({ landmarkNewsId: item.id }).finally(() => {
|
||||||
|
this.infoArray.map(info => {
|
||||||
|
if (info.id === item.id) {
|
||||||
|
info.pv += 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}, 500)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.info-wrapper{
|
||||||
|
padding: 20px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item + .info-item {
|
||||||
|
margin: 22rpx 0 0 0;
|
||||||
|
}
|
||||||
|
.info-item {
|
||||||
|
border-radius: 10rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
.info-item-header {
|
||||||
|
position: relative;
|
||||||
|
padding: 20rpx 20rpx 0 20rpx;
|
||||||
|
&.info-item-top {
|
||||||
|
padding-top: 60rpx;
|
||||||
|
background-size: 100% 80rpx;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url();
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.intro {
|
||||||
|
margin: 10rpx 0 0 0;
|
||||||
|
color: #666;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-item-body {
|
||||||
|
padding: 0 20rpx 20rpx 20rpx;
|
||||||
|
.video {
|
||||||
|
padding: 20rpx 0 0 0;
|
||||||
|
.video-item {
|
||||||
|
width: 100%;
|
||||||
|
height: 400rpx;
|
||||||
|
border-radius: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-item-bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20rpx;
|
||||||
|
border-top: 1px solid #f1f1f1;
|
||||||
|
font-size: 16px;
|
||||||
|
.time {
|
||||||
|
flex: 1;
|
||||||
|
color: #999999;
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
.btns {
|
||||||
|
display: flex;
|
||||||
|
color: #999;
|
||||||
|
.flex + .flex {
|
||||||
|
margin: 0 0 0 32rpx;
|
||||||
|
}
|
||||||
|
.flex {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
width: 32rpx;
|
||||||
|
height: 32rpx;
|
||||||
|
margin: 0 8rpx 0 0;
|
||||||
|
}
|
||||||
|
.zan-off-icon {
|
||||||
|
width: 32rpx;
|
||||||
|
height: 32rpx;
|
||||||
|
}
|
||||||
|
.zan-on-icon {
|
||||||
|
width: 32rpx;
|
||||||
|
height: 32rpx;
|
||||||
|
}
|
||||||
|
.seeNum-txt {
|
||||||
|
&.on {
|
||||||
|
color: #D81E06;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.more-btn {
|
||||||
|
position: relative;
|
||||||
|
.more-wrapper {
|
||||||
|
position: absolute;
|
||||||
|
right: -20rpx;
|
||||||
|
top: -150rpx;
|
||||||
|
z-index: 5;
|
||||||
|
width: 200rpx;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0px 1px 6px rgba(0,0,0,0.16);
|
||||||
|
.more-item + .more-item {
|
||||||
|
border-top: 1px solid #d5d5d5;
|
||||||
|
}
|
||||||
|
.more-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 70rpx;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
.more-icon {
|
||||||
|
width: 36rpx;
|
||||||
|
height: 36rpx;
|
||||||
|
margin: 0 10rpx 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-item-top {
|
||||||
|
padding-top: 60rpx;
|
||||||
|
background-size: 100% 80rpx;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url();
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.intro {
|
||||||
|
margin: 10rpx 0 0 0;
|
||||||
|
color: #666;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
<template>
|
||||||
|
<view class="policy">
|
||||||
|
<view class="list-item" v-for="(item, index) in currentList" :key="index" @click="fileItemClick(item)">
|
||||||
|
<view class="v12-justify-start v12-align-center">
|
||||||
|
<view class="v12-font-bold v12-font-28">·</view>
|
||||||
|
<view class="item-title">{{ item.title }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="item-action v12-dark"><u-icon name="arrow-right" color="#fff" size="8"></u-icon></view>
|
||||||
|
</view>
|
||||||
|
<view class="more-wrap">
|
||||||
|
<view class="more-btn v12-primary v12-align-center" @click="showMore" v-if="list.length > 0">
|
||||||
|
{{ isMore ? '查看更多' : '查看更多' }}
|
||||||
|
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733 " size="12"></u-icon></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
v-if="list.length === 0"
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
class="img-nodata"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getPorjectPolicyFiles,
|
||||||
|
} from "@/api/product"
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
landmarkDataId: null
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
list: [],
|
||||||
|
currentList: [],
|
||||||
|
isMore: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
landmarkDataId(value) {
|
||||||
|
if(value) {
|
||||||
|
this.getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getData() {
|
||||||
|
const params = {
|
||||||
|
landmarkDataId: this.landmarkDataId,
|
||||||
|
page: 1,
|
||||||
|
limit: 99999
|
||||||
|
}
|
||||||
|
getPorjectPolicyFiles(params).then(res => {
|
||||||
|
this.list = res.data.records || []
|
||||||
|
if(this.isMore) {
|
||||||
|
this.currentList = this.list
|
||||||
|
} else {
|
||||||
|
this.currentList = this.list.filter((item, index) => index < 3)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showMore() {
|
||||||
|
// this.isMore = !this.isMore
|
||||||
|
// if(this.isMore) {
|
||||||
|
// this.currentList = this.list
|
||||||
|
// } else {
|
||||||
|
// this.currentList = this.list.filter((item, index) => index < 3)
|
||||||
|
// }
|
||||||
|
uni.navigateTo({ url: `/pages/home/searchPage?id=${this.landmarkDataId}&type=2` })
|
||||||
|
|
||||||
|
},
|
||||||
|
fileItemClick(file) {
|
||||||
|
const url = file.attachment || ''
|
||||||
|
if (!url) return
|
||||||
|
uni.downloadFile({
|
||||||
|
url,
|
||||||
|
success: res => {
|
||||||
|
const filePath = res.tempFilePath
|
||||||
|
wx.openDocument({
|
||||||
|
filePath,
|
||||||
|
fail: (err) => {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.more-btn{
|
||||||
|
.item-action{
|
||||||
|
width: 20rpx;
|
||||||
|
height: 20rpx;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.policy{
|
||||||
|
padding: 20rpx;
|
||||||
|
background: #f0f0f0;
|
||||||
|
border-radius: 24rpx;
|
||||||
|
}
|
||||||
|
.list-item{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
background: #fff;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
border-radius: 24rpx;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
}
|
||||||
|
.item-action{
|
||||||
|
font-size: 22rpx;
|
||||||
|
width: 24rpx;
|
||||||
|
height: 24rpx;
|
||||||
|
color: #fff;
|
||||||
|
padding: 5rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
line-height: 24rpx;
|
||||||
|
}
|
||||||
|
.item-title{
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #333;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
max-width: 520rpx;
|
||||||
|
}
|
||||||
|
.log-img{
|
||||||
|
width: 68rpx;
|
||||||
|
height: 68rpx;
|
||||||
|
background: rgba(197,39,51,0.39);
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.more-wrap{
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.more-btn{
|
||||||
|
color: #fff;
|
||||||
|
font-size: 28rpx;
|
||||||
|
padding: 5rpx 20rpx;
|
||||||
|
border-radius: 30rpx;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
<template>
|
||||||
|
<view class="projects">
|
||||||
|
<view class="tabs-wrap">
|
||||||
|
<view
|
||||||
|
@click="handleTab(item.value)"
|
||||||
|
class="tab-item"
|
||||||
|
:class="{
|
||||||
|
'tab-isActived': actived === item.value
|
||||||
|
}"
|
||||||
|
v-for="(item, index) in tabs"
|
||||||
|
:key="index">
|
||||||
|
<view
|
||||||
|
:class="{
|
||||||
|
'tab-isActived': actived === item.value,
|
||||||
|
'no-actived-1': actived === 2 && item.value === 1,
|
||||||
|
'no-actived-2': actived === 1 && item.value === 2,
|
||||||
|
'no-actived-3': actived === 3 && item.value === 2,
|
||||||
|
'no-actived-4': actived === 2 && item.value === 3,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<image class="tab-icon" :src="webUrl + '/orderIcon/' + item.icon" mode="aspectFit|aspectFill|widthFix"></image>
|
||||||
|
{{ item.name }}
|
||||||
|
<!-- <view>
|
||||||
|
<view>{{ item.name }}</view>
|
||||||
|
</view> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
class="content"
|
||||||
|
:class="{
|
||||||
|
'first-one': actived === 1,
|
||||||
|
'last-one': actived === 3
|
||||||
|
}"
|
||||||
|
|
||||||
|
>
|
||||||
|
<recommend v-if="actived === 1" :landmarkDataId="landmarkDataId"></recommend>
|
||||||
|
<policy v-if="actived === 2" :landmarkDataId="landmarkDataId"></policy>
|
||||||
|
<serviec v-if="actived === 3" :info="info"></serviec>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import recommend from './recommend.vue'
|
||||||
|
import policy from './policy.vue'
|
||||||
|
import serviec from './serviec.vue'
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
recommend,
|
||||||
|
policy,
|
||||||
|
serviec
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
landmarkDataId: null,
|
||||||
|
info: {
|
||||||
|
default:() => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
actived: 1,
|
||||||
|
tabs: [
|
||||||
|
{name: '企业推荐', value: 1, icon: 'qytj.png'},
|
||||||
|
{name: '政策', value: 2, icon: 'zc.png'},
|
||||||
|
{name: '服务', value: 3, icon: 'fw.png'},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleTab(value) {
|
||||||
|
this.actived = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.tab-icon{
|
||||||
|
height: 30rpx;
|
||||||
|
width: 30rpx;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
}
|
||||||
|
.fit-box-inner{
|
||||||
|
background: #f0f0f0;
|
||||||
|
width: initial;
|
||||||
|
height: inherit;
|
||||||
|
width: 40rpx;
|
||||||
|
}
|
||||||
|
.first-one{
|
||||||
|
border-radius: 0 24rpx 24rpx 24rpx !important;
|
||||||
|
}
|
||||||
|
.last-one{
|
||||||
|
border-radius: 24rpx 0 24rpx 24rpx !important;
|
||||||
|
}
|
||||||
|
.fit-box{
|
||||||
|
width: 40rpx;
|
||||||
|
height: initial;
|
||||||
|
background: #fff;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.projects{
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.tabs-wrap{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.tab-item{
|
||||||
|
text-align: center;
|
||||||
|
flex: 1;
|
||||||
|
font-size: 32rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
background: #fff;
|
||||||
|
view{
|
||||||
|
padding: 20rpx 0;
|
||||||
|
background: #f0f0f0;
|
||||||
|
width: inherit;
|
||||||
|
height: inherit;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.no-actived-1{
|
||||||
|
border-radius: 0 0 24rpx 0 !important;
|
||||||
|
}
|
||||||
|
.no-actived-2{
|
||||||
|
border-radius: 0 0 0 24rpx !important;
|
||||||
|
}
|
||||||
|
.no-actived-3{
|
||||||
|
border-radius: 0 0 24rpx 0 !important;
|
||||||
|
}
|
||||||
|
.no-actived-4{
|
||||||
|
border-radius: 0 0 0 24rpx !important;
|
||||||
|
}
|
||||||
|
.tab-isActived{
|
||||||
|
background: #fff !important;
|
||||||
|
border-radius: 24rpx 24rpx 0 0 !important;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.content{
|
||||||
|
background: #fff;
|
||||||
|
padding: 20rpx 10rpx;
|
||||||
|
border-radius: 24rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
<template>
|
||||||
|
<view class="recommend">
|
||||||
|
<view class="list-item" v-for="(item, index) in currentList" :key="index" @click="toStore(item.hotelId)">
|
||||||
|
<view class="v12-justify-start v12-align-center">
|
||||||
|
<view class="log-img">
|
||||||
|
<image class="log-img" :src="item.logo" mode="aspectFit|aspectFill|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="item-title one-t">{{ item.name }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="item-action-wrap v12-primary">
|
||||||
|
点击查看
|
||||||
|
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733" size="8"></u-icon></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="more-wrap" v-if="isMore ? isMore : list.length > 3">
|
||||||
|
<view class="more-btn v12-primary" @click="showMore">
|
||||||
|
{{ isMore ? '收起' : '查看更多' }}
|
||||||
|
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733 " size="12"></u-icon></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
v-if="list.length === 0"
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
class="img-nodata"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getPorjectRecommend,
|
||||||
|
} from "@/api/product"
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
landmarkDataId: null
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
list: [],
|
||||||
|
currentList: [],
|
||||||
|
isMore: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
landmarkDataId(value) {
|
||||||
|
if(value) {
|
||||||
|
this.getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getData()
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
getData() {
|
||||||
|
getPorjectRecommend({landmarkDataId: this.landmarkDataId}).then(res => {
|
||||||
|
this.list = res.data || []
|
||||||
|
if(this.isMore) {
|
||||||
|
this.currentList = this.list
|
||||||
|
} else {
|
||||||
|
this.currentList = this.list.filter((item, index) => index < 3)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toStore(id) {
|
||||||
|
if (!id) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pagesInn/inn/innHome?id=' + id
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showMore() {
|
||||||
|
this.isMore = !this.isMore
|
||||||
|
if(this.isMore) {
|
||||||
|
this.currentList = this.list
|
||||||
|
} else {
|
||||||
|
this.currentList = this.list.filter((item, index) => index < 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.more-btn{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
.item-action{
|
||||||
|
width: 20rpx;
|
||||||
|
height: 20rpx;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
padding: 5rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.recommend{
|
||||||
|
padding: 20rpx;
|
||||||
|
background: #f0f0f0;
|
||||||
|
border-radius: 24rpx;
|
||||||
|
}
|
||||||
|
.list-item{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
background: #fff;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
border-radius: 24rpx;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
}
|
||||||
|
.item-action-wrap{
|
||||||
|
font-size: 22rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 30rpx;
|
||||||
|
color: #fff;
|
||||||
|
padding: 5rpx 10rpx;
|
||||||
|
}
|
||||||
|
.item-action{
|
||||||
|
width: 20rpx;
|
||||||
|
height: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-left: 10rpx;
|
||||||
|
}
|
||||||
|
.item-title{
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: #333;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
max-width: 180rpx;
|
||||||
|
}
|
||||||
|
.log-img{
|
||||||
|
width: 68rpx;
|
||||||
|
height: 68rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.more-wrap{
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.more-btn{
|
||||||
|
color: #fff;
|
||||||
|
font-size: 28rpx;
|
||||||
|
padding: 5rpx 20rpx;
|
||||||
|
border-radius: 30rpx;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
<template>
|
||||||
|
<view class="service">
|
||||||
|
<view class="map-cont">
|
||||||
|
<map
|
||||||
|
:longitude="info.longitude"
|
||||||
|
:latitude="info.latitude"
|
||||||
|
:markers="[{latitude: info.latitude,longitude: info.longitude,width: 20, height: 25, iconPath: webUrl + '/page/qianxian/icon-location.png'}]"
|
||||||
|
style="width: 100%;height: 100%; border-radius: 20rpx;"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view class="v12-mt-3 info-wrap">
|
||||||
|
<view>
|
||||||
|
<view class="v12-font-32 v12-font-bold v12-mb-2">{{ info.name || '' }}</view>
|
||||||
|
<view class="v12-font-24 v12-mb-1 v12-dark1-text">办公时间:{{ info.officeTime || '' }}</view>
|
||||||
|
<view class="v12-font-24 v12-mb-1 v12-dark1-text">{{ info.address || '' }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="action-wrap">
|
||||||
|
<view @click="showLocation">
|
||||||
|
<view>
|
||||||
|
<image :src="webUrl + '/page/qianxian/icon-addr.png'" class="img" />
|
||||||
|
</view>
|
||||||
|
<view class="text-center">导航</view>
|
||||||
|
</view>
|
||||||
|
<view @click="call">
|
||||||
|
<view>
|
||||||
|
<image :src="webUrl + '/page/qianxian/icon-phone.png'" class="img" />
|
||||||
|
</view>
|
||||||
|
<view class="text-center">客服</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view style="padding: 0 20rpx;"><u-divider></u-divider></view>
|
||||||
|
<view class="intro-wrap">
|
||||||
|
<view class="v12-dark-text v12-font-bold">
|
||||||
|
简介
|
||||||
|
</view>
|
||||||
|
<view class="intro-text">
|
||||||
|
{{ info.intro || '' }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
info: {
|
||||||
|
default: () => {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
console.log(this.info);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
showLocation() {
|
||||||
|
console.log(this.info);
|
||||||
|
|
||||||
|
if (!this.info.latitude || !this.info.longitude) {
|
||||||
|
this.$dialog.error('暂无位置信息')
|
||||||
|
} else {
|
||||||
|
uni.openLocation({
|
||||||
|
latitude: this.info.latitude,
|
||||||
|
longitude: this.info.longitude
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
call() {
|
||||||
|
if (this.info.tel) {
|
||||||
|
uni.makePhoneCall({
|
||||||
|
phoneNumber: this.info.tel
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$dialog.error('电话为空')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.intro-text{
|
||||||
|
color: #999;
|
||||||
|
font-size: 24rpx;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
}
|
||||||
|
.intro-wrap{
|
||||||
|
padding: 0 20rpx 20rpx;
|
||||||
|
}
|
||||||
|
.action-wrap{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.text-center{
|
||||||
|
text-align: center;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-wrap{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 40rpx 20rpx 0;
|
||||||
|
}
|
||||||
|
.service{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.map-cont {
|
||||||
|
height: 400rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
background: #f2f1ed;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.img{
|
||||||
|
display: block;
|
||||||
|
width: 64rpx;
|
||||||
|
height: 64rpx;
|
||||||
|
margin: 0 0 16rpx 16rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
<template>
|
||||||
|
<view v-if="posterImageStatus" class="poster-first">
|
||||||
|
<div class="posterCanvasWarp">
|
||||||
|
<canvas class="posterCanvas" canvas-id="myCanvas"></canvas>
|
||||||
|
</div>
|
||||||
|
<view class="poster-pop" v-show="canvasStatus">
|
||||||
|
<img
|
||||||
|
src="@/static/images/poster-close.png"
|
||||||
|
class="close"
|
||||||
|
@click="posterImageClose"
|
||||||
|
mode="widthFix"
|
||||||
|
/>
|
||||||
|
<image
|
||||||
|
:src="posterImage"
|
||||||
|
alt="tp"
|
||||||
|
class="poster-image"
|
||||||
|
:show-menu-by-longpress="false"
|
||||||
|
mode="widthFix"
|
||||||
|
/>
|
||||||
|
<view class="v12-white-text v12-radius-20 share-btn" @click="saveImg(posterImage)">保存图片</view>
|
||||||
|
</view>
|
||||||
|
<view class="mask"></view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getShareImg } from "@/api/product";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "StorePoster",
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
canvasStatus: false,
|
||||||
|
posterImage: "",
|
||||||
|
posterImageStatus: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted: function () {},
|
||||||
|
methods: {
|
||||||
|
saveImg(url) {
|
||||||
|
uni.showLoading({
|
||||||
|
mask:true,
|
||||||
|
})
|
||||||
|
uni.downloadFile({
|
||||||
|
url: url, // 文件的下载地址
|
||||||
|
success(res) {
|
||||||
|
if (res.statusCode === 200) {
|
||||||
|
let tempFilePath = res.tempFilePath; // 临时文件路径
|
||||||
|
uni.saveImageToPhotosAlbum({
|
||||||
|
filePath: tempFilePath,
|
||||||
|
success:(success)=> {
|
||||||
|
uni.showToast({
|
||||||
|
title: "保存成功",
|
||||||
|
icon: "none",
|
||||||
|
mask: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
fail(err) {
|
||||||
|
uni.showToast({
|
||||||
|
title: "保存失败,请重新尝试",
|
||||||
|
icon: "none",
|
||||||
|
mask: true,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
posterImageClose() {
|
||||||
|
this.posterImageStatus = false;
|
||||||
|
this.canvasStatus = false;
|
||||||
|
this.$emit("setPosterImageStatus");
|
||||||
|
},
|
||||||
|
savePosterPath(id) {
|
||||||
|
uni.showLoading({ title: "海报生成中", mask: true });
|
||||||
|
|
||||||
|
getShareImg(id)
|
||||||
|
.then((res) => {
|
||||||
|
this.canvasStatus = true;
|
||||||
|
this.posterImage = res.data;
|
||||||
|
this.posterImageStatus = true;
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
uni.hideLoading();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="less" lang="less">
|
||||||
|
.share-btn{
|
||||||
|
text-align: center;
|
||||||
|
padding: 20rpx 0;
|
||||||
|
font-size: 28rpx;
|
||||||
|
background: #ff564a;
|
||||||
|
}
|
||||||
|
.poster-first {
|
||||||
|
overscroll-behavior: contain;
|
||||||
|
}
|
||||||
|
.poster-pop {
|
||||||
|
width: 6 * 100rpx;
|
||||||
|
height: 8 * 100rpx;
|
||||||
|
position: fixed;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
z-index: 99;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -4.6 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas {
|
||||||
|
background-color: #ffffff;
|
||||||
|
height: 8 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .poster-image {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .image {
|
||||||
|
width: 4.5 * 100rpx;
|
||||||
|
height: 4.5 * 100rpx;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .text {
|
||||||
|
text-align: center;
|
||||||
|
color: #000000;
|
||||||
|
margin-top: 0.32 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .text.black {
|
||||||
|
height: 0.68 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .text.rad {
|
||||||
|
color: #ff0000;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .code {
|
||||||
|
height: 1.4 * 100rpx;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .code .code-img {
|
||||||
|
width: 33%;
|
||||||
|
padding: 0.06 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .code .code-img image {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.poster-pop .canvas .code .code-text {
|
||||||
|
width: 60%;
|
||||||
|
font-size: 0.12 * 100rpx;
|
||||||
|
line-height: 1.64 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .close {
|
||||||
|
width: 0.46 * 100rpx;
|
||||||
|
height: 0.75 * 100rpx;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: -0.73 * 100rpx;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.poster-pop .save-poster {
|
||||||
|
background-color: #df2d0a;
|
||||||
|
font-size: 0.22 * 100rpx;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
height: 0.76 * 100rpx;
|
||||||
|
line-height: 0.76 * 100rpx;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: -0.04 * 100rpx;
|
||||||
|
}
|
||||||
|
.poster-pop .keep {
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 0.25 * 100rpx;
|
||||||
|
margin-top: 0.1 * 100rpx;
|
||||||
|
}
|
||||||
|
.mask {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background-color: rgba(0, 0, 0, 0.6);
|
||||||
|
z-index: 9;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
+232
-44
@@ -109,12 +109,97 @@
|
|||||||
/>
|
/>
|
||||||
</swiper-item>
|
</swiper-item>
|
||||||
</swiper>
|
</swiper>
|
||||||
<image
|
<!-- <image
|
||||||
v-if="contentFestival.indexImage"
|
v-if="contentFestival.indexImage"
|
||||||
:src="contentFestival.indexImage"
|
:src="contentFestival.indexImage"
|
||||||
mode="scaleToFill"
|
mode="scaleToFill"
|
||||||
@click="goFestival"
|
@click="goFestival"
|
||||||
/>
|
/> -->
|
||||||
|
<!-- <swiper
|
||||||
|
class="swiper"
|
||||||
|
circular
|
||||||
|
autoplay
|
||||||
|
:interval="3000">
|
||||||
|
<swiper-item class="" item-id="" v-if="contentFestival.indexImage">
|
||||||
|
<image
|
||||||
|
:src="contentFestival.indexImage"
|
||||||
|
mode="scaleToFill"
|
||||||
|
@click="goFestival"
|
||||||
|
/>
|
||||||
|
</swiper-item>
|
||||||
|
<swiper-item class="" item-id="">
|
||||||
|
<view class="new-zone-wrap">
|
||||||
|
<view class="kd" @click="toKD">
|
||||||
|
<view class="img-wrap">
|
||||||
|
<image style="width: 112rpx; height:26rpx" :src="webUrl + '/orderIcon/kd.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="tip-img">
|
||||||
|
<image style="width: 142rpx; height:66.11rpx;border-radius: 0" :src="webUrl + '/orderIcon/dot.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="kd-cover">
|
||||||
|
<video v-if="indexVideo" class="kd-cover v12-mt-0" :src="indexVideo" controls :poster="indexVideo + '?vframe/jpg/offset/1'"></video>
|
||||||
|
<view class="enter-btn">点击进入</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="xpsx">
|
||||||
|
<view class="img-wrap">
|
||||||
|
<image style="width: 140rpx; height:26.44rpx" :src="webUrl + '/orderIcon/xp.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="new-zone v12-mt-2" @click="toNewZone">
|
||||||
|
<swiper autoplay circular style="width: 100%;" interval="3000" next-margin="40rpx">
|
||||||
|
<swiper-item v-for="(item, index) in newZone" :key="index">
|
||||||
|
<view class="new-item">
|
||||||
|
<image :src="item.productImage" style="width: 120rpx; height: 120rpx; border-radius:10rpx"></image>
|
||||||
|
<view class="goods-info">
|
||||||
|
<view class="v12-font-22 more-t">{{ item.productTitle }}</view>
|
||||||
|
<view class="v12-primary-text v12-font-bold price-wrap">
|
||||||
|
<text class="v12-font-16">¥</text>
|
||||||
|
<text class="v12-font-24">{{ item.productPrice }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper> -->
|
||||||
|
<view class="new-zone-wrap">
|
||||||
|
<view class="kd" @click="toKD">
|
||||||
|
<view class="img-wrap" style="padding-top: 10rpx; box-sizing:border-box">
|
||||||
|
<image style="width: 112rpx; height:26rpx" :src="webUrl + '/orderIcon/kd.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="tip-img">
|
||||||
|
<image style="width: 142rpx; height:66.11rpx;border-radius: 0" :src="webUrl + '/orderIcon/dot.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="kd-cover">
|
||||||
|
<video play-btn-position="center" v-if="indexVideo" :show-fullscreen-btn="false" class="kd-cover v12-mt-0" :src="indexVideo" controls autoplay :poster="indexVideo + '?vframe/jpg/offset/1'"></video>
|
||||||
|
<view class="enter-btn">点击进入</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="xpsx">
|
||||||
|
<view class="img-wrap">
|
||||||
|
<image style="width: 140rpx; height:26.44rpx" :src="webUrl + '/orderIcon/xp.png'" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="new-zone v12-mt-2" @click="toNewZone">
|
||||||
|
<swiper autoplay circular style="width: 100%;" interval="3000" next-margin="40rpx">
|
||||||
|
<swiper-item v-for="(item, index) in newZone" :key="index">
|
||||||
|
<view class="new-item">
|
||||||
|
<image :src="item.productImage" style="width: 120rpx; height: 120rpx; border-radius:10rpx"></image>
|
||||||
|
<view class="goods-info">
|
||||||
|
<view class="v12-font-22 more-t">{{ item.productTitle }}</view>
|
||||||
|
<view class="v12-primary-text v12-font-bold price-wrap">
|
||||||
|
<text class="v12-font-16">¥</text>
|
||||||
|
<text class="v12-font-24">{{ item.productPrice }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 2022/6/20 add 尖货推荐 -->
|
<!-- 2022/6/20 add 尖货推荐 -->
|
||||||
@@ -291,6 +376,9 @@ export default {
|
|||||||
oldUserPopup: {},
|
oldUserPopup: {},
|
||||||
// 民宿专题轮播
|
// 民宿专题轮播
|
||||||
contentHomestay: [],
|
contentHomestay: [],
|
||||||
|
// 新品推荐
|
||||||
|
newZone: [],
|
||||||
|
indexVideo: '',
|
||||||
// 节日专题
|
// 节日专题
|
||||||
contentFestival: {},
|
contentFestival: {},
|
||||||
pageKeyId: Object.freeze('appIndex'),
|
pageKeyId: Object.freeze('appIndex'),
|
||||||
@@ -329,12 +417,17 @@ export default {
|
|||||||
this.scrollTop = e.scrollTop
|
this.scrollTop = e.scrollTop
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
toKD() {
|
||||||
|
this.$yrouter.push('/pages/VideoPlayBackList/VideoPlayBackList')
|
||||||
|
},
|
||||||
|
toNewZone() {
|
||||||
|
this.$yrouter.push('/pages/home/newZone')
|
||||||
|
},
|
||||||
init() {
|
init() {
|
||||||
getShareImage().then(({ data }) => this.shareAppImg = data)
|
getShareImage().then(({ data }) => this.shareAppImg = data)
|
||||||
sharpBannar().then(res => {
|
sharpBannar().then(res => {
|
||||||
const { data } = res
|
const { data } = res
|
||||||
this.bannerList = data.banner
|
this.bannerList = data.banner || []
|
||||||
this.getPageData()
|
|
||||||
})
|
})
|
||||||
this.getLocationData()
|
this.getLocationData()
|
||||||
},
|
},
|
||||||
@@ -345,54 +438,67 @@ export default {
|
|||||||
this.getLocationData()
|
this.getLocationData()
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
async getLocationData() {
|
getLocationData() {
|
||||||
this.isLocating = true
|
this.isLocating = true
|
||||||
const mapData = await getLocationPromise()
|
getLocationPromise().then(mapData => {
|
||||||
if (mapData.errMsg) {
|
if (mapData.errMsg) {
|
||||||
const { latitude, longitude } = mapData
|
const { latitude, longitude } = mapData
|
||||||
const address = await getCurAddress(latitude, longitude)
|
getCurAddress(latitude, longitude).then(address => {
|
||||||
this.cityName = address[1].data.result.ad_info.city
|
this.cityName = address[1].data.result.ad_info.city
|
||||||
this.isLocating = false
|
this.isLocating = false
|
||||||
|
this.getPageData()
|
||||||
|
}).catch(() => {
|
||||||
|
this.getPageData()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.isLocating = false
|
||||||
|
this.getPageData()
|
||||||
|
}
|
||||||
|
}).catch(() => {
|
||||||
this.getPageData()
|
this.getPageData()
|
||||||
} else {
|
})
|
||||||
this.isLocating = false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
getPageData() {
|
getPageData() {
|
||||||
const _this = this
|
const _this = this
|
||||||
uni.showLoading({ title: '加载中' })
|
uni.showLoading({ title: '加载中' })
|
||||||
getHomeData({ cityName: this.cityName }).then(res => {
|
getHomeData({ cityName: this.cityName }).then(res => {
|
||||||
const { data } = res
|
const { success, data } = res
|
||||||
_this.$set(_this, 'banner', data.banner)
|
if (success && data) {
|
||||||
_this.$set(_this, 'menus', data.menus)
|
_this.$set(_this, 'banner', data.banner || [])
|
||||||
_this.$set(_this, 'landmarkGoodsImage', data.landmarkGoodsImage)
|
_this.$set(_this, 'menus', data.menus || [])
|
||||||
_this.$set(_this, 'countyFamousImage', data.countyFamousImage)
|
_this.$set(_this, 'landmarkGoodsImage', data.landmarkGoodsImage || {})
|
||||||
_this.$set(_this, 'oldUserPopup', data.oldUserPopup)
|
_this.$set(_this, 'countyFamousImage', data.countyFamousImage || {})
|
||||||
_this.$set(_this, 'contentHomestay', data.contentHomestayV2)
|
_this.$set(_this, 'oldUserPopup', data.oldUserPopup || {})
|
||||||
_this.$set(_this, 'contentFestival', data.contentFestivalV2)
|
_this.$set(_this, 'contentHomestay', data.contentHomestayV2 || [])
|
||||||
_this.bastLeftList = []
|
_this.$set(_this, 'contentFestival', data.contentFestivalV2 || [])
|
||||||
_this.bastRightList = []
|
_this.$set(_this, 'newZone', data.newGoods || [])
|
||||||
_this.lotteryCanDraw = data.lotteryCanDraw
|
_this.indexVideo = data.indexVideo ? data.indexVideo.videoUrl : ''
|
||||||
for (let i = 0; i < data.bastList.length; i++) {
|
_this.bastLeftList = []
|
||||||
if (i % 2 === 0) {
|
_this.bastRightList = []
|
||||||
// 店铺排名
|
_this.lotteryCanDraw = data.lotteryCanDraw || false
|
||||||
if (i === 4 && data.hotelList.length > 0) {
|
if (data.bastList) {
|
||||||
_this.bastLeftList.push({
|
for (let i = 0; i < data.bastList.length; i++) {
|
||||||
type: 'hotel',
|
if (i % 2 === 0) {
|
||||||
list: data.hotelList
|
// 店铺排名
|
||||||
})
|
if (i === 4 && data.hotelList.length > 0) {
|
||||||
|
_this.bastLeftList.push({
|
||||||
|
type: 'hotel',
|
||||||
|
list: data.hotelList
|
||||||
|
})
|
||||||
|
}
|
||||||
|
_this.bastLeftList.push(data.bastList[i])
|
||||||
|
}
|
||||||
|
if (i % 2 === 1) {
|
||||||
|
// 尖货专题
|
||||||
|
if (i === 3 && data.contentBest.length > 0) {
|
||||||
|
_this.bastRightList.push({
|
||||||
|
type: 'swiper',
|
||||||
|
list: data.contentBest
|
||||||
|
})
|
||||||
|
}
|
||||||
|
_this.bastRightList.push(data.bastList[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_this.bastLeftList.push(data.bastList[i])
|
|
||||||
}
|
|
||||||
if (i % 2 === 1) {
|
|
||||||
// 尖货专题
|
|
||||||
if (i === 3 && data.contentBest.length > 0) {
|
|
||||||
_this.bastRightList.push({
|
|
||||||
type: 'swiper',
|
|
||||||
list: data.contentBest
|
|
||||||
})
|
|
||||||
}
|
|
||||||
_this.bastRightList.push(data.bastList[i])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
uni.hideLoading()
|
uni.hideLoading()
|
||||||
@@ -796,5 +902,87 @@ export default {
|
|||||||
margin: 0 0 0 20rpx;
|
margin: 0 0 0 20rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
.new-zone-wrap{
|
||||||
|
width: 336rpx;
|
||||||
|
height: 480rpx;
|
||||||
|
background: rgba(240,240,240,0.8);
|
||||||
|
border-radius: 16rpx;
|
||||||
|
padding: 10rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
.kd{
|
||||||
|
width: 100%;
|
||||||
|
height: 266rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
padding: 10rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.xpsx{
|
||||||
|
width: 100%;
|
||||||
|
height: 180rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
padding: 10rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.img-wrap{
|
||||||
|
height: 27rpx;
|
||||||
|
width: 140rpx;
|
||||||
|
image{
|
||||||
|
border-radius: 0 !important;
|
||||||
|
vertical-align: text-top !important
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tip-img{
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.kd-cover{
|
||||||
|
width: 100%;
|
||||||
|
height: 180rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
margin-top: 15rpx;
|
||||||
|
}
|
||||||
|
.enter-btn{
|
||||||
|
color: #333;
|
||||||
|
background-color: rgba(255,255,255,0.6);
|
||||||
|
font-size: 28rpx;
|
||||||
|
width: fit-content;
|
||||||
|
padding: 6rpx 20rpx;
|
||||||
|
border-radius: 100rpx;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 40rpx;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.new-zone{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
.new-item{
|
||||||
|
display: flex;
|
||||||
|
margin-right: 20rpx;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.goods-info{
|
||||||
|
width: 122rpx;
|
||||||
|
height: 110rpx;
|
||||||
|
background: rgba(240,240,240,0.8);
|
||||||
|
border-radius: 0rpx 20rpx 20rpx 0rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 10rpx;
|
||||||
|
}
|
||||||
|
.price-wrap{
|
||||||
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
+141
-131
@@ -1,92 +1,81 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="pkg-product-land-mark">
|
<view class="pkg-product-land-mark">
|
||||||
<view v-if="isLoad">
|
<view v-if="isLoad">
|
||||||
<view class="top-box">
|
<view class="top-wrap">
|
||||||
<view class="nav flex">
|
<view class="top-box">
|
||||||
<view
|
<view class="nav flex">
|
||||||
v-for="(item,index) in navList"
|
<view
|
||||||
:key="index"
|
v-for="(item,index) in navList"
|
||||||
:class="{
|
:key="index"
|
||||||
'active': navIndex === index
|
:class="{
|
||||||
}"
|
'active': navIndex === index
|
||||||
class="flex flex-0 ai-center nav-item"
|
}"
|
||||||
@click="changeNav(index)"
|
class="flex flex-0 ai-center nav-item"
|
||||||
>
|
@click="changeNav(index)"
|
||||||
<image
|
>
|
||||||
:src="webUrl + '/home/landmark-icon.png'"
|
<image
|
||||||
class="bg"
|
:src="webUrl + '/home/landmark-icon.png'"
|
||||||
/>
|
class="bg"
|
||||||
{{ item.provinceName }}
|
/>
|
||||||
|
{{ item.provinceName }}
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
<view class="view-box">
|
||||||
<view class="view-box">
|
<view class="map-box">
|
||||||
<view class="map-box">
|
<image
|
||||||
<image
|
:src="mapData.mapImage"
|
||||||
:src="mapData.mapImage"
|
mode="widthFix"
|
||||||
mode="widthFix"
|
class="img-map"
|
||||||
class="img-map"
|
/>
|
||||||
/>
|
</view>
|
||||||
|
<view class="share-btn" @click="toShare"><u-icon name="share-square" color="#C52733"></u-icon>分享给好友</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view
|
<view
|
||||||
v-if="mapData.middleImage"
|
|
||||||
class="middle-img-wrap"
|
class="middle-img-wrap"
|
||||||
>
|
>
|
||||||
<image
|
<image
|
||||||
|
v-if="mapData.middleImage"
|
||||||
:src="mapData.middleImage"
|
:src="mapData.middleImage"
|
||||||
mode="widthFix"
|
mode="widthFix"
|
||||||
class="img"
|
class="img"
|
||||||
/>
|
/>
|
||||||
|
<view class="tabs-wrap">
|
||||||
|
<view @click="handleTab(item.value)" :class="{ 'tab-actived' : item.value === actived }" class="tab-item" v-for="(item, index) in tabs" :key="index">{{ item.name }}</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="goods.length > 0" class="list-wrap">
|
<view class="list-wrap">
|
||||||
<view class="list-box flex flex-wrap">
|
<view v-if="actived === 1">
|
||||||
<view
|
<projects :landmarkDataId="landmarkDataId" :info="mapData.serviceInfo"></projects>
|
||||||
v-for="item in goods"
|
</view>
|
||||||
:key="item.id"
|
<view v-if="actived === 2">
|
||||||
class="item"
|
<culture :landmarkDataId="landmarkDataId"></culture>
|
||||||
@click="goGoods(item.productId)"
|
</view>
|
||||||
>
|
<view v-if="actived === 3">
|
||||||
<image
|
<information :landmarkDataId="landmarkDataId"></information>
|
||||||
:src="webUrl + '/home/mark-land.png'"
|
</view>
|
||||||
class="mark-img"
|
<view v-if="actived === 4">
|
||||||
/>
|
<goods :goods="goods" v-if="goods.length > 0"></goods>
|
||||||
<image
|
<!-- <image
|
||||||
:src="item.storeImage"
|
v-if="isCompleteLoadGood"
|
||||||
mode="scaleToFill"
|
:src="webUrl + '/home/no-data-bg.png'"
|
||||||
class="good-img"
|
mode="widthFix"
|
||||||
/>
|
class="loadend"
|
||||||
<view class="content flex flex-col jc-between">
|
/> -->
|
||||||
<view class="more-t bold">{{ item.title }}</view>
|
<view class="v12-px-6" >
|
||||||
<view class="one-t desc">{{ item.description }}</view>
|
<u-divider :text="goods.length === 0 ? ' · 暂无数据 · ' : ' · 已经到底啦 · '" textPosition="center"></u-divider>
|
||||||
<view class="flex jc-between ai-center">
|
|
||||||
<text class="price">¥{{ item.price }}</text>
|
|
||||||
<image
|
|
||||||
:src="webUrl + '/home/icon-cart.png'"
|
|
||||||
class="btn"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<image
|
|
||||||
v-if="isCompleteLoadGood"
|
</view>
|
||||||
:src="webUrl + '/home/no-data-bg.png'"
|
|
||||||
mode="widthFix"
|
|
||||||
class="loadend"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
<image
|
|
||||||
v-if="goods.length === 0"
|
|
||||||
:src="webUrl + '/20231023131208675588.png'"
|
|
||||||
class="img-nodata"
|
|
||||||
mode="scaleToFill"
|
|
||||||
/>
|
|
||||||
</view>
|
</view>
|
||||||
<goo-skeleton
|
<goo-skeleton
|
||||||
v-else
|
v-else
|
||||||
:show-avatar="false"
|
:show-avatar="false"
|
||||||
/>
|
/>
|
||||||
|
<shareImg ref="shareImg"></shareImg>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -96,12 +85,31 @@ import {
|
|||||||
getProvinceGoods,
|
getProvinceGoods,
|
||||||
getProvinceList
|
getProvinceList
|
||||||
} from "@/api/product"
|
} from "@/api/product"
|
||||||
|
import goods from "./components/goods.vue"
|
||||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||||
|
import projects from './components/projects.vue'
|
||||||
|
import culture from "./components/culture.vue"
|
||||||
|
import information from "./components/information.vue"
|
||||||
|
import shareImg from "./components/shareImg.vue"
|
||||||
export default {
|
export default {
|
||||||
name: 'LandMarkPage',
|
name: 'LandMarkPage',
|
||||||
|
components: {
|
||||||
|
goods,
|
||||||
|
projects,
|
||||||
|
culture,
|
||||||
|
information,
|
||||||
|
shareImg
|
||||||
|
},
|
||||||
mixins: [pageListenMixins],
|
mixins: [pageListenMixins],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
actived: 1,
|
||||||
|
tabs: [
|
||||||
|
{name: '项目', value: 1},
|
||||||
|
{name: '文化', value: 2},
|
||||||
|
{name: '资讯', value: 3},
|
||||||
|
{name: '产品', value: 4},
|
||||||
|
],
|
||||||
webUrl: this.$VUE_APP_RESOURCES_URL,
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
keyword: '',
|
keyword: '',
|
||||||
isLoad: false,
|
isLoad: false,
|
||||||
@@ -111,10 +119,23 @@ export default {
|
|||||||
mapData: null,
|
mapData: null,
|
||||||
goods: [],
|
goods: [],
|
||||||
isCompleteLoadGood: false,
|
isCompleteLoadGood: false,
|
||||||
pageKeyId: Object.freeze('landmarkGoodsIndex')
|
pageKeyId: Object.freeze('landmarkGoodsIndex'),
|
||||||
|
posterImageStatus: false,
|
||||||
|
sceneId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLoad() {
|
computed: {
|
||||||
|
landmarkDataId() {
|
||||||
|
return this.navList[this.navIndex] ? this.navList[this.navIndex]['id'] : null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
console.log('进入地标页');
|
||||||
|
console.log(opts, '地标opts');
|
||||||
|
if(opts && opts.scene) {
|
||||||
|
console.log(opts.scene, 'opts.scene');
|
||||||
|
this.sceneId = decodeURIComponent(opts.scene).split('&')[0].split('=')[1]
|
||||||
|
}
|
||||||
this.getNavList()
|
this.getNavList()
|
||||||
},
|
},
|
||||||
onHide() {
|
onHide() {
|
||||||
@@ -128,9 +149,19 @@ export default {
|
|||||||
this.fetchGoods()
|
this.fetchGoods()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
toShare() {
|
||||||
|
this.$refs.shareImg.savePosterPath(this.landmarkDataId)
|
||||||
|
},
|
||||||
|
handleTab(value) {
|
||||||
|
this.actived = value
|
||||||
|
},
|
||||||
getNavList() {
|
getNavList() {
|
||||||
getProvinceList().then(({data}) => {
|
getProvinceList().then(({data}) => {
|
||||||
this.navList = data
|
this.navList = data
|
||||||
|
if(this.sceneId) {
|
||||||
|
this.navIndex = this.navList.map(e => +e.id).indexOf(+this.sceneId)
|
||||||
|
console.log(this.navIndex, 'navIndex');
|
||||||
|
}
|
||||||
this.changeNav(this.navIndex)
|
this.changeNav(this.navIndex)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -139,13 +170,14 @@ export default {
|
|||||||
this.page = 1
|
this.page = 1
|
||||||
this.goods = []
|
this.goods = []
|
||||||
this.isCompleteLoadGood = false
|
this.isCompleteLoadGood = false
|
||||||
|
this.actived = 1
|
||||||
this.getMap()
|
this.getMap()
|
||||||
this.fetchGoods()
|
this.fetchGoods()
|
||||||
},
|
},
|
||||||
getMap() {
|
getMap() {
|
||||||
const id = this.navList[this.navIndex]['id']
|
const id = this.navList[this.navIndex]['id']
|
||||||
getProvince(id).then(({data}) => {
|
getProvince(id).then(({data}) => {
|
||||||
this.mapData = data
|
this.mapData = data || {}
|
||||||
this.isLoad = true
|
this.isLoad = true
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -171,9 +203,43 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
.share-btn{
|
||||||
|
color: #C52733;
|
||||||
|
background: rgba(211,92,101,0.5);
|
||||||
|
font-size: 24rpx;
|
||||||
|
width: fit-content;
|
||||||
|
padding: 8rpx 10rpx;
|
||||||
|
border-radius: 20rpx 0 0 20rpx;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 80%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.tabs-wrap{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
padding: 20rpx 20rpx 0;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 36rpx;
|
||||||
|
}
|
||||||
|
.tab-item{
|
||||||
|
|
||||||
|
}
|
||||||
|
.tab-actived{
|
||||||
|
color: #fff;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(to right, #C52733 0%, rgba(211,92,101,0.91) 54%, rgba(255,255,255,0.62) 100%);
|
||||||
|
border-radius: 38rpx 0rpx 0 38rpx;
|
||||||
|
padding: 0 20rpx;
|
||||||
|
}
|
||||||
|
.top-wrap{
|
||||||
|
padding: 20rpx 20rpx 0;
|
||||||
|
}
|
||||||
.pkg-product-land-mark {
|
.pkg-product-land-mark {
|
||||||
padding: 20rpx;
|
|
||||||
background: #f0f0f0;
|
background: #f0f0f0;
|
||||||
|
min-height: 100vh;
|
||||||
.top-box {
|
.top-box {
|
||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
@@ -219,73 +285,14 @@ export default {
|
|||||||
}
|
}
|
||||||
.middle-img-wrap {
|
.middle-img-wrap {
|
||||||
margin: 20rpx 0 0 0;
|
margin: 20rpx 0 0 0;
|
||||||
|
background: #fff;
|
||||||
|
padding: 20rpx;
|
||||||
.img {
|
.img {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.list-box {
|
|
||||||
margin-top: 24rpx;
|
|
||||||
.item {
|
|
||||||
position: relative;
|
|
||||||
width: 344rpx;
|
|
||||||
margin-right: 22rpx;
|
|
||||||
margin-bottom: 22rpx;
|
|
||||||
border-radius: 20rpx;
|
|
||||||
background: #FFFFFF;
|
|
||||||
overflow: hidden;
|
|
||||||
.mark-img {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 3;
|
|
||||||
display: block;
|
|
||||||
width: 84rpx;
|
|
||||||
height: 74rpx;
|
|
||||||
}
|
|
||||||
.good-img {
|
|
||||||
display: block;
|
|
||||||
width: 344rpx;
|
|
||||||
height: 344rpx;
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
height: 156rpx;
|
|
||||||
padding: 8rpx 8rpx 18rpx 8rpx;
|
|
||||||
.more-t {
|
|
||||||
font-size: 28rpx;
|
|
||||||
line-height: 36rpx;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
.desc {
|
|
||||||
padding: 5rpx 0;
|
|
||||||
height: 34rpx;
|
|
||||||
color: #FFC543;
|
|
||||||
font-size: 24rpx;
|
|
||||||
}
|
|
||||||
.price {
|
|
||||||
font-size: 40rpx;
|
|
||||||
line-height: 40rpx;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #C52733;
|
|
||||||
}
|
|
||||||
.btn {
|
|
||||||
display: block;
|
|
||||||
width: 48rpx;
|
|
||||||
height: 48rpx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.item:nth-child(2n) {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.list-wrap {
|
|
||||||
margin: 20rpx 0 0 0;
|
|
||||||
.loadend {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.img-nodata {
|
.img-nodata {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 0;
|
top: 0;
|
||||||
@@ -296,4 +303,7 @@ export default {
|
|||||||
margin-bottom: 60rpx;
|
margin-bottom: 60rpx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.loadend {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
<template>
|
||||||
|
<view class="new-zone-page">
|
||||||
|
<view class="zone-title">
|
||||||
|
<rich-text :nodes="details.title"></rich-text>
|
||||||
|
</view>
|
||||||
|
<view class="banner-zone v12-mt-2">
|
||||||
|
<image class="banner-zone" :src="bannerImage" ></image>
|
||||||
|
|
||||||
|
<!-- <swiper :current="current" interval="3000" circular style="height:760rpx">
|
||||||
|
<swiper-item v-for="(item, index) in details.newProducts" :key="index">
|
||||||
|
</swiper-item>
|
||||||
|
</swiper> -->
|
||||||
|
<view class="swiper-wrap">
|
||||||
|
<swiper @change="handleChange" style="height: 100%;" autoplay circular next-margin="460rpx" interval="4000">
|
||||||
|
<swiper-item v-for="(item, index) in details.newProducts" :key="index" @click="toGoods(item)">
|
||||||
|
<view class="new-card" :class="{'is-actived': current == index}">
|
||||||
|
<image :src="item.productCover" class="new-card-img" mode="heightFix|widthFix"></image>
|
||||||
|
<view class="box-emp"></view>
|
||||||
|
<view class="new-info">
|
||||||
|
<view class="v12-font-26 one-t" style="width: 100px;text-align:center">{{ item.productTitle }}</view>
|
||||||
|
<view class="v12-font-bold">
|
||||||
|
<text>¥</text>
|
||||||
|
<text class=" v12-font-36">{{ item.productPrice }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="buy-btn">即刻选购</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="v12-mt-2 v12-align-center">
|
||||||
|
<view class="primary-title" v-if="details.contentTitle">
|
||||||
|
{{ details.contentTitle }}
|
||||||
|
<view class="title-line"></view>
|
||||||
|
</view>
|
||||||
|
<view class="secondary-title v12-ml-2" v-if="details.contentSubTitle">
|
||||||
|
—
|
||||||
|
{{ details.contentSubTitle }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="cover-img v12-mt-2" v-for="(item, index) in details.contents" :key="index" @click="toGoods(item)">
|
||||||
|
<image :src="item.contentImage" class="cover-img" mode="heightFix|widthFix"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { queryNewZone } from '@/api/activity'
|
||||||
|
export default{
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
details: {},
|
||||||
|
current: 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad() {
|
||||||
|
queryNewZone().then(res => {
|
||||||
|
this.details = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
bannerImage() {
|
||||||
|
return this.details.newProducts && this.details.newProducts[this.current] && this.details.newProducts[this.current].bannerImage
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleChange(e) {
|
||||||
|
this.current = e.detail.current
|
||||||
|
},
|
||||||
|
toGoods(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pages/shop/GoodsCon/index?id=${item.productId}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.new-info{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.box-emp{
|
||||||
|
width: 100%;
|
||||||
|
height: 85rpx;
|
||||||
|
}
|
||||||
|
.buy-btn{
|
||||||
|
border-radius: 100px;
|
||||||
|
width: fit-content;
|
||||||
|
color: #fff;
|
||||||
|
background: #C52733;
|
||||||
|
font-size: 28rpx;
|
||||||
|
padding: 4rpx 20rpx;
|
||||||
|
}
|
||||||
|
.swiper-wrap{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 400rpx;
|
||||||
|
left: 20rpx;
|
||||||
|
bottom: 40rpx;
|
||||||
|
}
|
||||||
|
.new-card{
|
||||||
|
width: 220rpx;
|
||||||
|
height: 240rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
position: absolute;
|
||||||
|
bottom: -17rpx;
|
||||||
|
transition: all ease-in-out 0.3s;
|
||||||
|
scale: 0.85;
|
||||||
|
left: 15rpx;
|
||||||
|
}
|
||||||
|
.is-actived{
|
||||||
|
// width: 225rpx;
|
||||||
|
// height: 260rpx;
|
||||||
|
bottom: 0;
|
||||||
|
scale: 1;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.cover-img{
|
||||||
|
width: 706rpx;
|
||||||
|
height: 400rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.new-card-img{
|
||||||
|
position: absolute;
|
||||||
|
width: 150rpx;
|
||||||
|
height: 150rpx;
|
||||||
|
top: -75rpx;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
}
|
||||||
|
.primary-title{
|
||||||
|
width: fit-content;
|
||||||
|
position: relative;
|
||||||
|
font-size: 34rpx;
|
||||||
|
color: #333333;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
.secondary-title{
|
||||||
|
font-family: Source Han Sans SC;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: #999999;
|
||||||
|
line-height: 40rpx;
|
||||||
|
}
|
||||||
|
.title-line{
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
background: linear-gradient(to right, #C52733 0%, rgba(202,56,67,0.92) 51%, rgba(255,255,255,0) 100%);
|
||||||
|
border-radius: 6rpx;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 3rpx;
|
||||||
|
}
|
||||||
|
.new-zone-page{
|
||||||
|
min-height: 100vh;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.banner-zone{
|
||||||
|
width: 706rpx !important;
|
||||||
|
height: 760rpx !important;
|
||||||
|
border-radius: 20rpx !important;
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
<template>
|
||||||
|
<view class="list-page">
|
||||||
|
<view class="v12-mb-3">
|
||||||
|
<u-search
|
||||||
|
placeholder="请输入关键词查询"
|
||||||
|
v-model="keyword"
|
||||||
|
shape="round"
|
||||||
|
:show-action="false"
|
||||||
|
height="72rpx"
|
||||||
|
@search="handleSearch"
|
||||||
|
bg-color="#fff">
|
||||||
|
</u-search>
|
||||||
|
</view>
|
||||||
|
<view v-if="isLoad" class="file-list">
|
||||||
|
<view
|
||||||
|
v-for="(file, fileIndex) in currentList"
|
||||||
|
:key="fileIndex"
|
||||||
|
class="file-item"
|
||||||
|
@click="fileItemClick(file)"
|
||||||
|
>
|
||||||
|
<view class="name more-t">
|
||||||
|
· {{ file.title }}
|
||||||
|
</view>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/page/qianxian/icon-05.png'"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view v-if="currentList.length === 0" class="no-data-txt">
|
||||||
|
暂无数据~
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<goo-skeleton v-else />
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
getPorjectPolicyFiles,
|
||||||
|
} from "@/api/product"
|
||||||
|
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||||
|
export default {
|
||||||
|
name: 'searchPage',
|
||||||
|
mixins: [pageListenMixins],
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
isLoad: false,
|
||||||
|
pageKeyId: '',
|
||||||
|
list: [],
|
||||||
|
keyword: '',
|
||||||
|
currentList: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(options) {
|
||||||
|
const id = options.id
|
||||||
|
this.getListReq(id)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleSearch() {
|
||||||
|
this.currentList = this.list.filter(item => item.title.indexOf(this.keyword) > -1)
|
||||||
|
},
|
||||||
|
getListReq(id) {
|
||||||
|
const params = {
|
||||||
|
landmarkDataId : id,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999
|
||||||
|
}
|
||||||
|
getPorjectPolicyFiles(params).then(res => {
|
||||||
|
const { success, data } = res
|
||||||
|
if (success) {
|
||||||
|
this.isLoad = true
|
||||||
|
this.list = data.records || []
|
||||||
|
this.currentList = [...this.list]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
fileItemClick(file) {
|
||||||
|
const url = file.attachment || ''
|
||||||
|
if (!url) return
|
||||||
|
uni.downloadFile({
|
||||||
|
url,
|
||||||
|
success: res => {
|
||||||
|
const filePath = res.tempFilePath
|
||||||
|
wx.openDocument({
|
||||||
|
filePath,
|
||||||
|
fail: (err) => {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="less">
|
||||||
|
.list-page {
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 30rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
.file-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 100rpx;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 20rpx;
|
||||||
|
margin: 0 0 20rpx 0;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
line-height: 36rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
.name {
|
||||||
|
width: calc(100% - 40rpx);
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
display: block;
|
||||||
|
width: 26rpx;
|
||||||
|
height: 26rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.loadend {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.no-data-txt {
|
||||||
|
text-align: center;
|
||||||
|
line-height: 200rpx;
|
||||||
|
color: #999;
|
||||||
|
font-size: 36rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -248,6 +248,7 @@ export default {
|
|||||||
keyword: '',
|
keyword: '',
|
||||||
_orderId: '',
|
_orderId: '',
|
||||||
addressId: '',
|
addressId: '',
|
||||||
|
currentRoute: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
@@ -263,7 +264,10 @@ export default {
|
|||||||
this.getOrderListReq();
|
this.getOrderListReq();
|
||||||
uni.$on('chooseAddress', (res) => {
|
uni.$on('chooseAddress', (res) => {
|
||||||
this.addressId = res.id
|
this.addressId = res.id
|
||||||
|
|
||||||
})
|
})
|
||||||
|
const pages = getCurrentPages() // 获取栈实例
|
||||||
|
this.currentRoute = pages[pages.length - 1].route;
|
||||||
},
|
},
|
||||||
onHide() {
|
onHide() {
|
||||||
this.orderList = [];
|
this.orderList = [];
|
||||||
@@ -274,7 +278,9 @@ export default {
|
|||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
addressId(val) {
|
addressId(val) {
|
||||||
if(val) {
|
const pages = getCurrentPages() // 获取栈实例
|
||||||
|
let currentRoute = pages[pages.length - 2].route;
|
||||||
|
if(val && this.currentRoute === currentRoute) {
|
||||||
const params = {
|
const params = {
|
||||||
addressId: this.addressId,
|
addressId: this.addressId,
|
||||||
orderId: this._orderId
|
orderId: this._orderId
|
||||||
|
|||||||
@@ -8,7 +8,10 @@
|
|||||||
<view :class="refundOrder ? 'on' : ''">
|
<view :class="refundOrder ? 'on' : ''">
|
||||||
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-if="orderInfo.isTickets===1 && orderInfo._status._type == 2">待核销</view>
|
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-if="orderInfo.isTickets===1 && orderInfo._status._type == 2">待核销</view>
|
||||||
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-else>{{ getStatus(orderInfo) }}</view>
|
<view class="state v12-primary-text v12-font-32 v12-font-bold" v-else>{{ getStatus(orderInfo) }}</view>
|
||||||
<view v-if="getStatus(orderInfo)!=='待付款'" class="v12-mt-2 v12-font-24 v12-secondary-dark-text" :class="{'fails-bg': orderInfo._status._type == -3}">{{ orderInfo._status._msg }}</view>
|
<view v-if="getStatus(orderInfo)!=='待付款'" class="v12-mt-2 v12-font-24 v12-secondary-dark-text" :class="{'fails-bg': orderInfo._status._type == -3}">
|
||||||
|
<view>{{ orderInfo._status._msg }}</view>
|
||||||
|
<view v-if="orderInfo._status._type == -3">驳回原因: {{ orderInfo.refundRejectReason }}</view>
|
||||||
|
</view>
|
||||||
<view class="pending-payments flex ai-center v12-mt-2 v12-font-24 v12-secondary-dark-text" v-else>
|
<view class="pending-payments flex ai-center v12-mt-2 v12-font-24 v12-secondary-dark-text" v-else>
|
||||||
<text>需支付{{ orderInfo.payPrice }}元,</text>
|
<text>需支付{{ orderInfo.payPrice }}元,</text>
|
||||||
<!-- {{ orderInfo.paymentTimeout }} -->
|
<!-- {{ orderInfo.paymentTimeout }} -->
|
||||||
@@ -336,15 +339,15 @@
|
|||||||
<template v-if="status.type == 1" >
|
<template v-if="status.type == 1" >
|
||||||
<view class="v12-justify-between " style="width: 100%">
|
<view class="v12-justify-between " style="width: 100%">
|
||||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||||
<view class="bnt v12-primary-text v12-primary-border cancel" @click="goGoodsReturn(orderInfo)">申请退款</view>
|
<view class="bnt v12-primary-text v12-primary-border cancel" @click="goGoodsReturn2(orderInfo)">申请退款</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="status.type == 2">
|
<template v-if="status.type == 2">
|
||||||
<view class="v12-justify-between " style="width: 100%">
|
<view class="v12-justify-between " style="width: 100%">
|
||||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||||
<view class="v12-justify-between">
|
<view class="v12-justify-between">
|
||||||
<view class="" style="position: relative">
|
<view class="btn-more" style="position: relative">
|
||||||
<text class="btn-more v12-font-24 v12-mr-2" @click.stop="showMore = !showMore">更多</text>
|
<view class=" v12-font-24 v12-mr-2" @click.stop="showMore = !showMore">更多</view>
|
||||||
<view class="group-float" v-show="showMore" :style="{top: orderInfo.isExtendedDelivery==0 ? '-60px' : '-32px'}">
|
<view class="group-float" v-show="showMore" :style="{top: orderInfo.isExtendedDelivery==0 ? '-60px' : '-32px'}">
|
||||||
<view v-if="orderInfo.isExtendedDelivery==0" class="btn flex jc-center ai-center v12-font-24" @click="toDelay(orderInfo.orderId)">延长收货</view>
|
<view v-if="orderInfo.isExtendedDelivery==0" class="btn flex jc-center ai-center v12-font-24" @click="toDelay(orderInfo.orderId)">延长收货</view>
|
||||||
<view class="btn flex jc-center ai-center v12-font-24" @click="goGoodsReturn(orderInfo)">申请退款</view>
|
<view class="btn flex jc-center ai-center v12-font-24" @click="goGoodsReturn(orderInfo)">申请退款</view>
|
||||||
@@ -362,8 +365,8 @@
|
|||||||
<view class="v12-justify-between " style="width: 100%">
|
<view class="v12-justify-between " style="width: 100%">
|
||||||
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
<view class="bnt v12-dark-text v12-dark-border cancel" @click="goRoom(orderInfo)">联系商家</view>
|
||||||
<view class="v12-justify-between">
|
<view class="v12-justify-between">
|
||||||
<view class="" style="position: relative">
|
<view class="btn-more" style="position: relative">
|
||||||
<text class="btn-more v12-font-24 v12-mr-2" @click="showMore = !showMore">更多</text>
|
<text class=" v12-font-24 v12-mr-2" @click.stop="showMore = !showMore">更多</text>
|
||||||
<view class="group-float" v-show="showMore" :style="{top: '-32px'}">
|
<view class="group-float" v-show="showMore" :style="{top: '-32px'}">
|
||||||
<view class="btn flex jc-center ai-center v12-font-24" @click="goGoodsReturn(orderInfo)">申请退款</view>
|
<view class="btn flex jc-center ai-center v12-font-24" @click="goGoodsReturn(orderInfo)">申请退款</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -546,7 +549,7 @@ export default {
|
|||||||
copyClipboard,
|
copyClipboard,
|
||||||
handleBody() {
|
handleBody() {
|
||||||
this.showMore = false
|
this.showMore = false
|
||||||
this.$forceUpdate()
|
// this.$forceUpdate()
|
||||||
},
|
},
|
||||||
getExpressInfo() {
|
getExpressInfo() {
|
||||||
let params = {
|
let params = {
|
||||||
@@ -587,7 +590,7 @@ export default {
|
|||||||
const ids = res.data.cartInfo.map(e => e.id)
|
const ids = res.data.cartInfo.map(e => e.id)
|
||||||
const addressInfo = res.data.addressInfo
|
const addressInfo = res.data.addressInfo
|
||||||
if (ids.length === 0) return
|
if (ids.length === 0) return
|
||||||
uni.navigateTo({
|
uni.redirectTo({
|
||||||
url: '/pages/order/OrderSubmission/index?id=' + ids.join(',') + '&address=' + JSON.stringify(addressInfo)
|
url: '/pages/order/OrderSubmission/index?id=' + ids.join(',') + '&address=' + JSON.stringify(addressInfo)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -726,12 +729,33 @@ export default {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
goGoodsReturn(orderInfo) {
|
goGoodsReturn(orderInfo) {
|
||||||
|
// fix bug#1631 bug#2488
|
||||||
|
if (parseInt(orderInfo._status._type) === 3) {
|
||||||
|
if(orderInfo.refundSystemStatus === 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '订单已收货,如需退款请联系商家',
|
||||||
|
mask: false,
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pkg_orders/views/refund?id=${orderInfo.orderId}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: `/pkg_orders/views/refund?id=${orderInfo.orderId}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
goGoodsReturn2(orderInfo) {
|
||||||
this.$yrouter.push({
|
this.$yrouter.push({
|
||||||
path: "/pages/order/GoodsReturn/index",
|
path: "/pages/order/GoodsReturn/index",
|
||||||
query: {
|
query: {
|
||||||
id: orderInfo.orderId
|
id: orderInfo.orderId
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
},
|
},
|
||||||
goGroupRule(orderInfo) {
|
goGroupRule(orderInfo) {
|
||||||
this.$yrouter.push({
|
this.$yrouter.push({
|
||||||
@@ -917,6 +941,10 @@ export default {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
.btn-more{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
.u-count-down__text{
|
.u-count-down__text{
|
||||||
color: #999 !important;
|
color: #999 !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -392,10 +392,26 @@ export default {
|
|||||||
let that = this;
|
let that = this;
|
||||||
uni.$on('chooseAddress', (res) => {
|
uni.$on('chooseAddress', (res) => {
|
||||||
console.log('监听到选择收货地址:' + JSON.stringify(res));
|
console.log('监听到选择收货地址:' + JSON.stringify(res));
|
||||||
that.addressInfo = res;
|
setTimeout(() => {
|
||||||
//地址切换也要重新计算一下
|
uni.showModal({
|
||||||
that.computedPrice('onLoad chooseAddress');
|
title:'确定修改地址吗?',
|
||||||
})
|
content: '',
|
||||||
|
showCancel: true,
|
||||||
|
cancelText: '取消',
|
||||||
|
confirmText: '确认',
|
||||||
|
success:(success)=>{
|
||||||
|
if(success.confirm) {
|
||||||
|
that.addressInfo = res;
|
||||||
|
//地址切换也要重新计算一下
|
||||||
|
that.computedPrice('onLoad chooseAddress');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
complete:(complete)=>{
|
||||||
|
uni.hideLoading()
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},1000)
|
||||||
if (that.$yroute.query.pinkid !== undefined) {
|
if (that.$yroute.query.pinkid !== undefined) {
|
||||||
that.pinkId = that.$yroute.query.pinkid;
|
that.pinkId = that.$yroute.query.pinkid;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -211,7 +211,7 @@
|
|||||||
<image class="logo" :src="webUrl+'/orderIcon/资质认证.png'" mode="" style="margin-right:0; width: 32rpx; height:32rpx"/>
|
<image class="logo" :src="webUrl+'/orderIcon/资质认证.png'" mode="" style="margin-right:0; width: 32rpx; height:32rpx"/>
|
||||||
<text class="v12-ml-1 v12-font-28">资质</text>
|
<text class="v12-ml-1 v12-font-28">资质</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="title v12-secondary-dark-text">{{ storeInfo.merName }}</view>
|
<view class="store-title title more-t v12-secondary-dark-text">{{ storeInfo.merName }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="value v12-justify-end v12-align-center">
|
<view class="value v12-justify-end v12-align-center">
|
||||||
<!-- <text class=" v12-dark1-text v12-font-24">库存:{{ attr.productSelect.stock }}</text> -->
|
<!-- <text class=" v12-dark1-text v12-font-24">库存:{{ attr.productSelect.stock }}</text> -->
|
||||||
@@ -1873,7 +1873,12 @@ export default {
|
|||||||
font-size: 0.28 * 100rpx;
|
font-size: 0.28 * 100rpx;
|
||||||
color: #808080;
|
color: #808080;
|
||||||
}
|
}
|
||||||
|
.after-title{
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.store-title{
|
||||||
|
width: 400rpx;
|
||||||
|
}
|
||||||
.product-con .store-info .praise .iconfont {
|
.product-con .store-info .praise .iconfont {
|
||||||
font-size: 0.28 * 100rpx;
|
font-size: 0.28 * 100rpx;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<view class="v12-px-3 v12-py-5 qua-card ">
|
<view class="v12-px-3 v12-py-5 qua-card ">
|
||||||
<view class="v12-white v12-radius-16">
|
<view class="v12-white v12-radius-16">
|
||||||
<view class="v12-justify-between v12-pa-3">
|
<view class="v12-justify-between v12-pa-3">
|
||||||
<text class="v12-font-32 v12-dark-text">
|
<text class="v12-font-32 v12-dark-text name-wrap">
|
||||||
商家名称
|
商家名称
|
||||||
</text>
|
</text>
|
||||||
<text class="v12-font-32 v12-dark-text v12-font-bold">
|
<text class="v12-font-32 v12-dark-text v12-font-bold">
|
||||||
@@ -48,6 +48,10 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
|
.name-wrap{
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-right: 10rpx;
|
||||||
|
}
|
||||||
.qua-card {
|
.qua-card {
|
||||||
}
|
}
|
||||||
.img{
|
.img{
|
||||||
|
|||||||
@@ -37,7 +37,9 @@
|
|||||||
<textarea
|
<textarea
|
||||||
v-model="expect"
|
v-model="expect"
|
||||||
placeholder="商品满足你的期待么?说说你的想法,分享给想买的他们吧~"
|
placeholder="商品满足你的期待么?说说你的想法,分享给想买的他们吧~"
|
||||||
|
:maxlength="140"
|
||||||
/>
|
/>
|
||||||
|
<view class="v12-px-4 v12-font-24 v12-dark1-text v12-mb-3">{{ expect.length || 0 }} / 140</view>
|
||||||
<view class="upload-title">
|
<view class="upload-title">
|
||||||
添加视频/图片
|
添加视频/图片
|
||||||
<text class="txt">
|
<text class="txt">
|
||||||
@@ -141,7 +143,7 @@ export default {
|
|||||||
this.picArr = uploadList
|
this.picArr = uploadList
|
||||||
},
|
},
|
||||||
async submit() {
|
async submit() {
|
||||||
const expect = trim(this.expect)
|
const expect = trim(this.expect).substring(0, 140)
|
||||||
const product_score = this.scoreList[0].index + 1 === 0 ? "" : this.scoreList[0].index + 1
|
const product_score = this.scoreList[0].index + 1 === 0 ? "" : this.scoreList[0].index + 1
|
||||||
const service_score = this.scoreList[1].index + 1 === 0 ? "" : this.scoreList[1].index + 1
|
const service_score = this.scoreList[1].index + 1 === 0 ? "" : this.scoreList[1].index + 1
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="v12-px-6" v-if="items.length > 0">
|
<view class="v12-px-6" v-if="items.length > 0">
|
||||||
<u-divider text=" · 已经到底啦 · " textPosition="center"></u-divider>
|
<u-divider text=" · 已经到底啦 · " textPosition="center"></u-divider>
|
||||||
</view>
|
</view>
|
||||||
<image
|
<image
|
||||||
v-if="items.length === 0"
|
v-if="items.length === 0"
|
||||||
|
|||||||
@@ -117,6 +117,9 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
<view class="v12-px-6" v-if="spreadList.length === 0">
|
||||||
|
<u-divider :text=" ' · 此级别未找到会员 · ' " textPosition="center"></u-divider>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<Loading :loaded="loaded" :loading="loading"></Loading>
|
<Loading :loaded="loaded" :loading="loading"></Loading>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -0,0 +1,975 @@
|
|||||||
|
<template>
|
||||||
|
<view class="container">
|
||||||
|
<hx-navbar
|
||||||
|
:fixed="true"
|
||||||
|
:background-color="[[13,197,197],[13,197,197]]"
|
||||||
|
:pageScroll.sync="scrollData"
|
||||||
|
statusBarFontColor="#ffffff"
|
||||||
|
barPlaceholder="hidden"
|
||||||
|
transparent="auto"
|
||||||
|
color='#ffffff'
|
||||||
|
/>
|
||||||
|
<view>
|
||||||
|
<view class="cover-box">
|
||||||
|
<image
|
||||||
|
v-if="store.coverType === 1"
|
||||||
|
:src="store.cover"
|
||||||
|
class="full-img"
|
||||||
|
mode="widthFix"
|
||||||
|
/>
|
||||||
|
<view
|
||||||
|
v-if="store.coverType === 2"
|
||||||
|
:style="{
|
||||||
|
'width': videoStyle.width,
|
||||||
|
'height': videoStyle.height
|
||||||
|
}"
|
||||||
|
class="video-box"
|
||||||
|
>
|
||||||
|
<video
|
||||||
|
:src="store.cover"
|
||||||
|
:autoplay="true"
|
||||||
|
:controls="true"
|
||||||
|
:loop="false"
|
||||||
|
object-fit="contain"
|
||||||
|
play-btn-position="center"
|
||||||
|
class="video"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="innInfoWrap">
|
||||||
|
<view class="bg-color">
|
||||||
|
<view class="box-mask flex jc-between ai-end">
|
||||||
|
<view class="inn-name flex-0 more-t">{{ store.name }}</view>
|
||||||
|
<view
|
||||||
|
v-if="store.cityName != undefined && store.cityName.length > 0"
|
||||||
|
class="city-section flex jc-end ai-center"
|
||||||
|
>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/20210807215539157727.png'"
|
||||||
|
style="width: 22rpx;height: 22rpx;margin-right: 8rpx;"
|
||||||
|
/>
|
||||||
|
<text class="one-t" style="font-size: 24rpx;color: #fff;">{{ store.cityName }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="body-cont flex ai-end">
|
||||||
|
<view class="inn-logo flex-0">
|
||||||
|
<image :src="store.logo" v-if="store.logo"></image>
|
||||||
|
<image :src="webUrl + '/20230609145651814148.png'" v-else/>
|
||||||
|
</view>
|
||||||
|
<view class="a3 flex jc-between ai-end" style="width: 100%">
|
||||||
|
<view class="inn-owner" style="flex-grow: 1;">{{ store.ownerName }}/店主</view>
|
||||||
|
<view v-if="store.guaranteeValue" class="guarantee flex jc-center ai-center">
|
||||||
|
保证金:{{ store.guaranteeValue }}元
|
||||||
|
</view>
|
||||||
|
<view class="flex ai-center zan-favorite-wrap">
|
||||||
|
<view class="zan-box flex flex-0 ai-end" @click="zanStore">
|
||||||
|
<template v-if="store.hasZan">
|
||||||
|
<image :src="webUrl + '/icon/icon-like.png'" class="img" />
|
||||||
|
<text class="on">{{ store.zan }}</text>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<image :src="webUrl + '/icon/icon-like.png'" class="img" />
|
||||||
|
<text>{{ store.zan }}</text>
|
||||||
|
</template>
|
||||||
|
</view>
|
||||||
|
<view class="flex flex-0 ai-end favorite-box">
|
||||||
|
<image
|
||||||
|
v-if="store.hasFavorite"
|
||||||
|
:src="webUrl + '/icon/icon-star-on.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="icon"
|
||||||
|
@click="doneFavorite"
|
||||||
|
/>
|
||||||
|
<image
|
||||||
|
v-else
|
||||||
|
:src="webUrl + '/icon/icon-star-off.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="icon"
|
||||||
|
@click="doneFavorite"
|
||||||
|
/>
|
||||||
|
<text>{{ store.favoriteCount }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="inn-signature-wrap">
|
||||||
|
<view class="triangle"></view>
|
||||||
|
<view class="inn-signature">
|
||||||
|
{{ store.content }}
|
||||||
|
</view>
|
||||||
|
<!-- <view class="share-btn" @click="changeShare">
|
||||||
|
<image :src="webUrl + '/page/hotel/share.png'" class="img" />
|
||||||
|
</view> -->
|
||||||
|
</view>
|
||||||
|
<view v-if="store.name" class="map-wrapper">
|
||||||
|
<view class="map-cont">
|
||||||
|
<map
|
||||||
|
:longitude="store.longitude"
|
||||||
|
:latitude="store.latitude"
|
||||||
|
style="width: 750rpx;height: 300rpx;"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view class="bg"></view>
|
||||||
|
<view class="map-info">
|
||||||
|
<view class="map-info-hd">
|
||||||
|
<image :src="webUrl + '/page/qianxian/icon-location.png'" class="icon" />
|
||||||
|
</view>
|
||||||
|
<view class="map-info-bd more-t">
|
||||||
|
{{ store.address }}
|
||||||
|
</view>
|
||||||
|
<view class="map-info-ft flex">
|
||||||
|
<view class="item" @click="showLocation">
|
||||||
|
<image :src="webUrl + '/page/qianxian/icon-addr.png'" class="img" />
|
||||||
|
<view>导航</view>
|
||||||
|
</view>
|
||||||
|
<view class="item" @click="call">
|
||||||
|
<image :src="webUrl + '/page/qianxian/icon-phone.png'" class="img" />
|
||||||
|
<view>客服</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="top-tab acea-row row-middle row-center">
|
||||||
|
<view
|
||||||
|
v-for="(item, index) in tabList"
|
||||||
|
:key="index"
|
||||||
|
:class="item.isShow ? '' : 'hide'"
|
||||||
|
class="tab"
|
||||||
|
@click="changeTab(item.value)"
|
||||||
|
>
|
||||||
|
<view :class="activeIndex === index ? 'active' : ''" class="tab-item">
|
||||||
|
{{ item.text }}
|
||||||
|
</view>
|
||||||
|
<!-- <view v-show="activeIndex === index" class="btLine"></view> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view>
|
||||||
|
<view v-if="activeIndex === 0" class="goods-section">
|
||||||
|
<view>
|
||||||
|
<view v-if="store.products && store.products.length > 0">
|
||||||
|
<view class="flex flex-wrap">
|
||||||
|
<view
|
||||||
|
v-for="(item,index) in store.products"
|
||||||
|
:key="index"
|
||||||
|
class="item"
|
||||||
|
@click="goGoodsConByID(item)"
|
||||||
|
>
|
||||||
|
<view>
|
||||||
|
<image
|
||||||
|
:src="item.productImage"
|
||||||
|
class="cover"
|
||||||
|
/>
|
||||||
|
<view class="v12-pt-2 v12-font-bold v12-font-28 more-t v12-px-2">{{ item.productName }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="" style="padding: 20rpx">
|
||||||
|
<view class="v12-justify-between v12-align-center v12-pt-2">
|
||||||
|
<view>
|
||||||
|
<text class="v12-font-bold v12-primary-text v12-font-24">¥</text>
|
||||||
|
<text class="v12-font-bold v12-primary-text v12-font-28">{{ item.productPrice }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="btn">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
|
class="img"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- <view class="price-line flex ai-center">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/20221118104357701129.png'"
|
||||||
|
class="label"
|
||||||
|
mode="scaleToFill"
|
||||||
|
/>
|
||||||
|
<text class="v12-primary-text">¥{{ item.productPrice }}</text>
|
||||||
|
</view> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-else class="tab-no-data">
|
||||||
|
店主还没有上传内容哦~
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- <goo-skeleton v-else /> -->
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
v-if="activeIndex === 1"
|
||||||
|
class="info-section"
|
||||||
|
>
|
||||||
|
<view v-if="isLoadInfoListSuccess">
|
||||||
|
<view v-if="infoArray.length > 0" class="info-wrapper">
|
||||||
|
<view class="info-list">
|
||||||
|
<view
|
||||||
|
v-for="(item, index) in infoArray"
|
||||||
|
:key="index"
|
||||||
|
class="info-item"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
:class="item.isTop === 1 ? 'info-item-top' : ''"
|
||||||
|
:style="{
|
||||||
|
'background-image': item.isTop ? ('url(' + webUrl + '/page/hotel/info-top-bg.png)') : 'none'
|
||||||
|
}"
|
||||||
|
class="info-item-header"
|
||||||
|
@click="infoClick(item)"
|
||||||
|
>
|
||||||
|
<view class="name">
|
||||||
|
{{ item.title }}
|
||||||
|
</view>
|
||||||
|
<view class="intro">
|
||||||
|
{{ item.content }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="info-item-body">
|
||||||
|
<view v-if="item.type === 2" class="video">
|
||||||
|
<video
|
||||||
|
:src="item.video"
|
||||||
|
:poster="item.video + '?vframe/jpg/offset/1'"
|
||||||
|
controls
|
||||||
|
play-btn-position="center"
|
||||||
|
:show-fullscreen-btn="false"
|
||||||
|
class="video-item"
|
||||||
|
@play="infoItemViewClick(item)"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view v-else>
|
||||||
|
<img-box
|
||||||
|
:imgList="item.images"
|
||||||
|
:num="item.images.length"
|
||||||
|
:img-radius="10"
|
||||||
|
style="width: 100%;"
|
||||||
|
@click="infoItemViewClick(item)"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="info-item-bottom">
|
||||||
|
<view class="time">
|
||||||
|
{{ item.createTime ? item.createTime.replace(/-/g, '.').substr(0, 10) : '' }}
|
||||||
|
</view>
|
||||||
|
<view class="btns">
|
||||||
|
<view class="flex">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/20230803152147141807.png'"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
<text class="seeNum-txt">{{ item.pv }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="flex">
|
||||||
|
<image
|
||||||
|
v-if="!item.hasZan"
|
||||||
|
:src="webUrl + '/page/hotel/zan-off-2.png'"
|
||||||
|
class="zan-off-icon"
|
||||||
|
@click="likeInfoItemHandle(item)"
|
||||||
|
/>
|
||||||
|
<image
|
||||||
|
v-else
|
||||||
|
:src="webUrl + '/page/hotel/zan-on-2.png'"
|
||||||
|
class="zan-on-icon"
|
||||||
|
@click="likeInfoItemHandle(item)"
|
||||||
|
/>
|
||||||
|
<text
|
||||||
|
v-show="item.zan > 0"
|
||||||
|
:class="item.zanVo ? 'on' : ''"
|
||||||
|
class="seeNum-txt"
|
||||||
|
>{{ item.zan }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-else class="tab-no-data">
|
||||||
|
店主还没有上传内容哦~
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<goo-skeleton v-else />
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
v-if="activeIndex === 2"
|
||||||
|
class="pics-section"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
v-if="store.cultureImages.length > 0"
|
||||||
|
class="pics-list acea-row"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
v-for="(url, index) in store.cultureImages"
|
||||||
|
:key="index"
|
||||||
|
:style="{ width: picColumnWidth }"
|
||||||
|
class="pics-item"
|
||||||
|
@click="showPic(index)"
|
||||||
|
>
|
||||||
|
<image
|
||||||
|
:style="{
|
||||||
|
width: picColumnWidth,
|
||||||
|
height: picColumnWidth,
|
||||||
|
borderRadius: '20rpx'
|
||||||
|
}"
|
||||||
|
:src="url"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-else class="tab-no-data">
|
||||||
|
店主还没有上传内容哦~
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
v-if="activeIndex === 3"
|
||||||
|
class="qualifications-section"
|
||||||
|
>
|
||||||
|
<view v-if="store.qualifications.length > 0">
|
||||||
|
<image
|
||||||
|
v-for="(item, index) in store.qualifications"
|
||||||
|
:key="index"
|
||||||
|
:src="item"
|
||||||
|
class="store-img"
|
||||||
|
mode="widthFix"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view v-else class="tab-no-data">
|
||||||
|
店主还没有上传内容哦~
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getFarmerShop, setFarmerShopZan, getFarmerShopNews, setFarmerShopCollection } from '@/api/farmer'
|
||||||
|
import { postCountyFamousNewsZan, postCountyFamousNewsView } from '@/api/qianxian'
|
||||||
|
import imgBox from '@/components/imageTypeSet/imagebox.vue'
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
imgBox
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
videoStyle: {
|
||||||
|
width: '750rpx',
|
||||||
|
height: '500rpx'
|
||||||
|
},
|
||||||
|
scrollData: {},
|
||||||
|
id: '',
|
||||||
|
store: {},
|
||||||
|
tabList: [
|
||||||
|
{ text: '商品', value: 0, isShow: true },
|
||||||
|
{ text: '资讯', value: 1, isShow: true },
|
||||||
|
{ text: '文化', value: 2, isShow: true },
|
||||||
|
{ text: '资质', value: 3, isShow: true }
|
||||||
|
],
|
||||||
|
activeIndex: 0,
|
||||||
|
isLoadInfoListSuccess: false,
|
||||||
|
picColumnWidth: '325rpx',
|
||||||
|
infoArray: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onPageScroll(e) {
|
||||||
|
this.scrollData = e
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.id = opts.id
|
||||||
|
this.getFarmerData()
|
||||||
|
uni.getSystemInfo({
|
||||||
|
success: (e) => {
|
||||||
|
// 两列商品宽度
|
||||||
|
this.picColumnWidth = (e.screenWidth - uni.upx2px(60)) / 2 + 'px'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goGoodsConByID(item) {
|
||||||
|
this.$yrouter.push({
|
||||||
|
path: '/pages/shop/GoodsCon/index',
|
||||||
|
query: {
|
||||||
|
id: item.productId
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getNews() {
|
||||||
|
const params = {
|
||||||
|
page: 1,
|
||||||
|
limit: 9999,
|
||||||
|
farmerShopId: this.id
|
||||||
|
}
|
||||||
|
getFarmerShopNews(params).then(res => {
|
||||||
|
this.infoArray = res.data.records || []
|
||||||
|
this.isLoadInfoListSuccess = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
changeTab(index) {
|
||||||
|
this.activeIndex = index
|
||||||
|
if(index === 1) {
|
||||||
|
this.getNews()
|
||||||
|
} else {
|
||||||
|
this.isLoadInfoListSuccess = false
|
||||||
|
}
|
||||||
|
// this.loading = false
|
||||||
|
// // 刷新数据
|
||||||
|
// switch (this.activeIndex) {
|
||||||
|
// case 1:
|
||||||
|
// this.fetchInnInfoList()
|
||||||
|
// break
|
||||||
|
// case 0:
|
||||||
|
// this.fetchGoods()
|
||||||
|
// break
|
||||||
|
// default:
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
showLocation() {
|
||||||
|
if (!this.store.latitude || !this.store.longitude) {
|
||||||
|
this.$dialog.error('暂无位置信息')
|
||||||
|
} else {
|
||||||
|
uni.openLocation({
|
||||||
|
latitude: this.store.latitude,
|
||||||
|
longitude: this.store.longitude
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
likeInfoItemHandle(item) {
|
||||||
|
const params = {
|
||||||
|
countyFamousNewsId: item.id
|
||||||
|
}
|
||||||
|
postCountyFamousNewsZan(params).then(res => {
|
||||||
|
const {success} = res
|
||||||
|
if(success) {
|
||||||
|
this.getNews()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
infoItemViewClick(item) {
|
||||||
|
const params = {
|
||||||
|
countyFamousNewsId: item.id
|
||||||
|
}
|
||||||
|
postCountyFamousNewsView(params).then(res => {
|
||||||
|
const {success} = res
|
||||||
|
if(success) {
|
||||||
|
this.getNews()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
call() {
|
||||||
|
if (this.store.tel != undefined && this.store.tel.length > 0) {
|
||||||
|
uni.makePhoneCall({
|
||||||
|
// 手机号
|
||||||
|
phoneNumber: this.store.tel,
|
||||||
|
// 成功回调
|
||||||
|
success: (res) => {
|
||||||
|
console.log('调用成功!')
|
||||||
|
},
|
||||||
|
// 失败回调
|
||||||
|
fail: (res) => {
|
||||||
|
console.log('调用失败!')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$dialog.error('电话为空')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getFarmerData() {
|
||||||
|
getFarmerShop(this.id).then(res => {
|
||||||
|
this.store = res.data || {}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
zanStore() {
|
||||||
|
const params = {
|
||||||
|
farmerShopId: this.id
|
||||||
|
}
|
||||||
|
setFarmerShopZan(params).then(res => {
|
||||||
|
const {success} = res
|
||||||
|
if(success) {
|
||||||
|
this.getFarmerData()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
doneFavorite() {
|
||||||
|
const params = {
|
||||||
|
farmerShopId: this.id
|
||||||
|
}
|
||||||
|
setFarmerShopCollection(params).then(res => {
|
||||||
|
this.getFarmerData()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
showPic (index) {
|
||||||
|
uni.previewImage({
|
||||||
|
current: index,
|
||||||
|
urls: this.store.cultureImages
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.btn {
|
||||||
|
.img {
|
||||||
|
display: block;
|
||||||
|
width: 48rpx;
|
||||||
|
height: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.container{
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.store-img {
|
||||||
|
width: 686rpx;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.tab-no-data {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #999;
|
||||||
|
line-height: 200rpx;
|
||||||
|
}
|
||||||
|
.btLine {
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
margin-top: 18rpx;
|
||||||
|
background: #0DC5C5;
|
||||||
|
}
|
||||||
|
.pics-box {
|
||||||
|
margin: 36rpx;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.pics-list {
|
||||||
|
position: relative;
|
||||||
|
padding: 20rpx 0;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.pics-list .pics-item {
|
||||||
|
margin-left: 20rpx;
|
||||||
|
margin-top: 10rpx;
|
||||||
|
}
|
||||||
|
.info-section,
|
||||||
|
.pics-section,
|
||||||
|
.qualifications-section {
|
||||||
|
position: relative;
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.info-section,
|
||||||
|
.qualifications-section {
|
||||||
|
padding: 32rpx;
|
||||||
|
}
|
||||||
|
.info-section {
|
||||||
|
word-break: break-all;
|
||||||
|
.info-item + .info-item {
|
||||||
|
margin: 32rpx 0 0 0;
|
||||||
|
}
|
||||||
|
.info-item {
|
||||||
|
border-radius: 10rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
.info-item-header {
|
||||||
|
position: relative;
|
||||||
|
padding: 20rpx 20rpx 0 20rpx;
|
||||||
|
&.info-item-top {
|
||||||
|
padding-top: 60rpx;
|
||||||
|
background-size: 100% 80rpx;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url();
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-size: 16px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.intro {
|
||||||
|
margin: 10rpx 0 0 0;
|
||||||
|
color: #666;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-item-body {
|
||||||
|
padding: 0 20rpx 20rpx 20rpx;
|
||||||
|
.video {
|
||||||
|
padding: 20rpx 0 0 0;
|
||||||
|
.video-item {
|
||||||
|
width: 100%;
|
||||||
|
height: 400rpx;
|
||||||
|
border-radius: 10rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.info-item-bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20rpx;
|
||||||
|
border-top: 1px solid #f1f1f1;
|
||||||
|
font-size: 16px;
|
||||||
|
.time {
|
||||||
|
flex: 1;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.btns {
|
||||||
|
display: flex;
|
||||||
|
color: #999;
|
||||||
|
.flex + .flex {
|
||||||
|
margin: 0 0 0 32rpx;
|
||||||
|
}
|
||||||
|
.flex {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
width: 32rpx;
|
||||||
|
height: 32rpx;
|
||||||
|
margin: 0 8rpx 0 0;
|
||||||
|
}
|
||||||
|
.zan-off-icon {
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
}
|
||||||
|
.zan-on-icon {
|
||||||
|
width: 40rpx;
|
||||||
|
height: 40rpx;
|
||||||
|
}
|
||||||
|
.seeNum-txt {
|
||||||
|
&.on {
|
||||||
|
color: #D81E06;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.more-btn {
|
||||||
|
position: relative;
|
||||||
|
.more-wrapper {
|
||||||
|
position: absolute;
|
||||||
|
right: -20rpx;
|
||||||
|
top: -150rpx;
|
||||||
|
z-index: 5;
|
||||||
|
width: 200rpx;
|
||||||
|
border-radius: 12rpx;
|
||||||
|
background-color: #fff;
|
||||||
|
box-shadow: 0px 1px 6px rgba(0,0,0,0.16);
|
||||||
|
.more-item + .more-item {
|
||||||
|
border-top: 1px solid #d5d5d5;
|
||||||
|
}
|
||||||
|
.more-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
height: 70rpx;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
.more-icon {
|
||||||
|
width: 36rpx;
|
||||||
|
height: 36rpx;
|
||||||
|
margin: 0 10rpx 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.goods-section {
|
||||||
|
padding: 40rpx 32rpx 0;
|
||||||
|
background: #f0f0f0;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
position: relative;
|
||||||
|
width: 332rpx;
|
||||||
|
height: 528rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-right: 22rpx;
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
background: #fff;
|
||||||
|
overflow: hidden;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
.name {
|
||||||
|
padding: 8rpx 6rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 36rpx;
|
||||||
|
color: #333333;
|
||||||
|
height: 70rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price-line {
|
||||||
|
padding: 0 10rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
line-height: 38rpx;
|
||||||
|
color: #ED0F0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sales-line {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
padding: 8rpx 10rpx 18rpx;
|
||||||
|
border-top: 1rpx solid #EFEFEF;
|
||||||
|
font-size: 24rpx;
|
||||||
|
line-height: 34rpx;
|
||||||
|
color: #8D8D8D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item:nth-child(2n) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cover {
|
||||||
|
width: 332rpx;
|
||||||
|
height: 332rpx;
|
||||||
|
background: rgba(255, 255, 255, 0.39);
|
||||||
|
border-radius: 8rpx;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
width: 40rpx;
|
||||||
|
height: 24rpx;
|
||||||
|
margin-right: 4rpx;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
width: 24rpx;
|
||||||
|
height: 24rpx;
|
||||||
|
margin-right: 6rpx;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
.btn-cont {
|
||||||
|
padding: 13rpx 30rpx;
|
||||||
|
border: 1px solid #0DC5C5;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
color: #0DC5C5;
|
||||||
|
.iconfont {
|
||||||
|
margin: 0 0 0 20rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btLine {
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
margin-top: 18rpx;
|
||||||
|
background: #0DC5C5;
|
||||||
|
}
|
||||||
|
.tab-item-active {
|
||||||
|
color:#080F1A;
|
||||||
|
font-size:32rpx;
|
||||||
|
}
|
||||||
|
.tab-item-no-active {
|
||||||
|
color:#A6AAB3;
|
||||||
|
font-size:28rpx;
|
||||||
|
}
|
||||||
|
.top-tab {
|
||||||
|
padding-bottom: 30rpx;
|
||||||
|
padding-top: 30rpx;
|
||||||
|
background: #fff;
|
||||||
|
.tab {
|
||||||
|
width: 20%;
|
||||||
|
.tab-item {
|
||||||
|
height: 52rpx;
|
||||||
|
padding: 0 30rpx;
|
||||||
|
border-radius: 26rpx 0 0 26rpx;
|
||||||
|
font-size: 32rpx;
|
||||||
|
line-height: 52rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
&.active {
|
||||||
|
color: #fff;
|
||||||
|
background: linear-gradient(90deg, #C52733 0%, rgba(211,92,101,0.91) 54%, rgba(255,255,255,0.62) 100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.hide {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map-wrapper {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
height: 200rpx;
|
||||||
|
margin: 20rpx 0 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
.map-cont {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 2;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.3;
|
||||||
|
transform: translateY(-50rpx);
|
||||||
|
}
|
||||||
|
.bg {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 3;
|
||||||
|
height: 60rpx;
|
||||||
|
background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
|
||||||
|
}
|
||||||
|
.map-info {
|
||||||
|
position: relative;
|
||||||
|
z-index: 5;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 40rpx 10rpx 40rpx 32rpx;
|
||||||
|
color: #333;
|
||||||
|
font-size: 14px;
|
||||||
|
background: rgba(255,255,255,0.4);
|
||||||
|
.map-info-hd {
|
||||||
|
.icon {
|
||||||
|
display: block;
|
||||||
|
width: 34rpx;
|
||||||
|
height: 42rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map-info-bd {
|
||||||
|
flex: 1;
|
||||||
|
padding: 0 60rpx 0 20rpx;
|
||||||
|
line-height: 60rpx;
|
||||||
|
}
|
||||||
|
.map-info-ft {
|
||||||
|
.item + .item {
|
||||||
|
margin: 0 0 0 6rpx;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
|
.img {
|
||||||
|
display: block;
|
||||||
|
width: 64rpx;
|
||||||
|
height: 64rpx;
|
||||||
|
margin: 0 0 16rpx 16rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.inn-signature-wrap {
|
||||||
|
position: relative;
|
||||||
|
z-index: 5;
|
||||||
|
padding: 0 32rpx;
|
||||||
|
margin: 20rpx 0 0 0;
|
||||||
|
.triangle {
|
||||||
|
position: absolute;
|
||||||
|
top: -20rpx;
|
||||||
|
left: 72rpx;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 20rpx solid transparent;
|
||||||
|
border-right: 20rpx solid transparent;
|
||||||
|
border-bottom: 24rpx solid rgba(243,243,246,0.39);
|
||||||
|
}
|
||||||
|
.inn-signature {
|
||||||
|
position: relative;
|
||||||
|
padding: 20rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #080F1A;
|
||||||
|
background: #fff;
|
||||||
|
box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.08);
|
||||||
|
}
|
||||||
|
.share-btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: -68rpx;
|
||||||
|
.img {
|
||||||
|
width: 212rpx;
|
||||||
|
height: 60rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.zan-favorite-wrap {
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #333;
|
||||||
|
.on {
|
||||||
|
color: #FF564A;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.zan-box {
|
||||||
|
.img {
|
||||||
|
width: 36rpx;
|
||||||
|
height: 36rpx;
|
||||||
|
margin: 0 8rpx 0 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.favorite-box {
|
||||||
|
.icon {
|
||||||
|
width: 36rpx;
|
||||||
|
height: 36rpx;
|
||||||
|
margin: 0 8rpx 0 30rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.cover-box {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.full-img {
|
||||||
|
width: 750rpx;
|
||||||
|
}
|
||||||
|
.video {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.innInfoWrap {
|
||||||
|
position: relative;
|
||||||
|
margin-top: -76rpx;
|
||||||
|
padding: 20rpx 36rpx;
|
||||||
|
line-height: 1;
|
||||||
|
z-index: 1;
|
||||||
|
.bg-color {
|
||||||
|
position: absolute;
|
||||||
|
top: -5px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 1;
|
||||||
|
height: 50%;
|
||||||
|
background: linear-gradient(-180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
|
||||||
|
|
||||||
|
.box-mask {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 166rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0 32rpx 12rpx 0;
|
||||||
|
|
||||||
|
.city-section {
|
||||||
|
width: 256rpx;
|
||||||
|
margin-left: 20rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.body-cont {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.inn-logo {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 56*2rpx;
|
||||||
|
height: 56*2rpx;
|
||||||
|
margin-right: 18rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inn-logo image {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inn-name {
|
||||||
|
width: 280rpx;
|
||||||
|
font-size: 32rpx;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 48rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inn-owner {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #8B8F99;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="info-item-bottom">
|
<view class="info-item-bottom">
|
||||||
<view class="time">
|
<view class="time">
|
||||||
{{ item.createdTime ? item.createdTime.replace(/-/g, '.').substr(0, 10) : '' }}
|
{{ item.publishTime ? item.publishTime.replace(/-/g, '.').substr(0, 10) : '' }}
|
||||||
</view>
|
</view>
|
||||||
<view class="btns">
|
<view class="btns">
|
||||||
<view class="flex">
|
<view class="flex">
|
||||||
@@ -1022,6 +1022,7 @@ export default {
|
|||||||
font-size: 26rpx;
|
font-size: 26rpx;
|
||||||
line-height: 36rpx;
|
line-height: 36rpx;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
|
height: 70rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.price-line {
|
.price-line {
|
||||||
@@ -1326,6 +1327,7 @@ export default {
|
|||||||
padding: 32rpx;
|
padding: 32rpx;
|
||||||
}
|
}
|
||||||
.info-section {
|
.info-section {
|
||||||
|
word-break: break-all;
|
||||||
.info-item + .info-item {
|
.info-item + .info-item {
|
||||||
margin: 32rpx 0 0 0;
|
margin: 32rpx 0 0 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,9 +26,11 @@
|
|||||||
<textarea
|
<textarea
|
||||||
v-model="form.intro"
|
v-model="form.intro"
|
||||||
placeholder="请输入简介..."
|
placeholder="请输入简介..."
|
||||||
|
maxlength="140"
|
||||||
placeholder-style="font-size:24rpx;color:#C2C5CC;"
|
placeholder-style="font-size:24rpx;color:#C2C5CC;"
|
||||||
class="content-style inp"
|
class="content-style inp"
|
||||||
/>
|
/>
|
||||||
|
<text class="v12-font-24 v12-dark1-text">{{ form.intro.length }} / 140</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="form-item" v-if="showUpload">
|
<view class="form-item" v-if="showUpload">
|
||||||
<view v-if="uploadType === 'image'" class="title">图片(最多9张):</view>
|
<view v-if="uploadType === 'image'" class="title">图片(最多9张):</view>
|
||||||
@@ -152,7 +154,7 @@
|
|||||||
postHotelNewsAdd({
|
postHotelNewsAdd({
|
||||||
hotelId: this.hotelId,
|
hotelId: this.hotelId,
|
||||||
name: this.form.title,
|
name: this.form.title,
|
||||||
intro: this.form.intro,
|
intro: this.form.intro.substring(0, 140),
|
||||||
content: this.form.content.replace(/\<img src/g, '<img style="display: block;max-width: 100%;" src'),
|
content: this.form.content.replace(/\<img src/g, '<img style="display: block;max-width: 100%;" src'),
|
||||||
type: this.uploadType === 'image' ? 'NT_TEXT' : 'NT_VIDEO',
|
type: this.uploadType === 'image' ? 'NT_TEXT' : 'NT_VIDEO',
|
||||||
resources: this.uploadType === 'image' ? this.uploadedFilesArray : [],
|
resources: this.uploadType === 'image' ? this.uploadedFilesArray : [],
|
||||||
|
|||||||
@@ -140,7 +140,7 @@
|
|||||||
<view class="cell acea-row row-between row-middle">
|
<view class="cell acea-row row-between row-middle">
|
||||||
<view class="cell-title">
|
<view class="cell-title">
|
||||||
店铺图片
|
店铺图片
|
||||||
<text class="txt">最多上传9张图片</text>
|
<!-- <text class="txt">最多上传9张图片</text> -->
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -149,7 +149,8 @@
|
|||||||
<tm-upload
|
<tm-upload
|
||||||
:dataList="picsArray"
|
:dataList="picsArray"
|
||||||
:upload_img_wh="(750 - 3 * 16 - 2 * 32) / 3.0"
|
:upload_img_wh="(750 - 3 * 16 - 2 * 32) / 3.0"
|
||||||
:upload_max="10"
|
:upload_max="99999"
|
||||||
|
:upload_count="9999"
|
||||||
:url="uploadUrl"
|
:url="uploadUrl"
|
||||||
:header="uploadHeader"
|
:header="uploadHeader"
|
||||||
@change="uploadedImgChange"
|
@change="uploadedImgChange"
|
||||||
@@ -170,6 +171,7 @@
|
|||||||
:dataList="qualificationsArray"
|
:dataList="qualificationsArray"
|
||||||
:upload_img_wh="(750 - 3 * 16 - 2 * 32) / 3.0"
|
:upload_img_wh="(750 - 3 * 16 - 2 * 32) / 3.0"
|
||||||
:upload_max="10"
|
:upload_max="10"
|
||||||
|
|
||||||
:url="uploadUrl"
|
:url="uploadUrl"
|
||||||
:header="uploadHeader"
|
:header="uploadHeader"
|
||||||
@change="uploadedImg2Change"
|
@change="uploadedImg2Change"
|
||||||
|
|||||||
@@ -93,23 +93,26 @@ export default {
|
|||||||
}
|
}
|
||||||
const res = await takePrize(item.id)
|
const res = await takePrize(item.id)
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
|
console.log('success', '+++++++++++++');
|
||||||
this.$set(this.list[index], 'status', 2)
|
this.$set(this.list[index], 'status', 2)
|
||||||
uni.showModal({
|
uni.showModal({
|
||||||
title: '领取成功',
|
title: '领取成功',
|
||||||
content: '您的奖品已经领取成功,请前往我的订单查看奖品发货信息',
|
content: '您的奖品已经领取成功,请前往积分记录查看奖品发货信息',
|
||||||
cancelText: '下次再说',
|
cancelText: '下次再说',
|
||||||
confirmText: '查看订单',
|
confirmText: '积分记录',
|
||||||
success: function (res) {
|
success: function (res) {
|
||||||
if (res.confirm) {
|
if (res.confirm) {
|
||||||
console.log('用户点击确定')
|
console.log('用户点击确定')
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages/order/MyOrder/index'
|
url: '/pages/user/Points/index'
|
||||||
})
|
})
|
||||||
} else if (res.cancel) {
|
} else if (res.cancel) {
|
||||||
console.log('用户点击取消')
|
console.log('用户点击取消')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
console.log('err', '==========');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,8 @@ export default {
|
|||||||
},
|
},
|
||||||
imgData: [],
|
imgData: [],
|
||||||
shareAppImg: '',
|
shareAppImg: '',
|
||||||
pageKeyId: Object.freeze('lotteryIndex')
|
pageKeyId: Object.freeze('lotteryIndex'),
|
||||||
|
isDisabled: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -155,6 +156,8 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
|
if(this.isDisabled) return
|
||||||
|
this.isDisabled = true
|
||||||
getPrize().then(res => {
|
getPrize().then(res => {
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
this.diceResult = res.data
|
this.diceResult = res.data
|
||||||
@@ -163,12 +166,15 @@ export default {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.showDialog = true
|
this.showDialog = true
|
||||||
this.showResult = true
|
this.showResult = true
|
||||||
|
this.isDisabled = false
|
||||||
this.diceImg = this.lotteryDetail.diceConfig['diceValues'][diceIndex]['diceValueImage']
|
this.diceImg = this.lotteryDetail.diceConfig['diceValues'][diceIndex]['diceValueImage']
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.init()
|
this.init()
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}, 2800)
|
}, 2800)
|
||||||
}
|
}
|
||||||
|
}).catch(() => {
|
||||||
|
this.isDisabled = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -2,24 +2,25 @@
|
|||||||
<view class="common-roomLogs">
|
<view class="common-roomLogs">
|
||||||
<view v-if="list.length > 0">
|
<view v-if="list.length > 0">
|
||||||
<view
|
<view
|
||||||
v-for="(item,index) in list"
|
|
||||||
:key="index"
|
|
||||||
class="item"
|
|
||||||
>
|
>
|
||||||
<u-swipe-action
|
<u-swipe-action
|
||||||
class="v12-mt-3"
|
class="v12-mt-3"
|
||||||
>
|
>
|
||||||
<u-swipe-action-item
|
<u-swipe-action-item
|
||||||
:options="options1"
|
:options="options1"
|
||||||
:key="index"
|
v-for="(item) in list"
|
||||||
|
:key="item.room_id"
|
||||||
|
:name="item.room_id"
|
||||||
|
style="margin-bottom: 10px;"
|
||||||
@click.stop="removeRoom(item.room_id)"
|
@click.stop="removeRoom(item.room_id)"
|
||||||
>
|
>
|
||||||
<view>
|
<view class="item v12-pa-3">
|
||||||
<view class="v12-justify-between v12-pa-3 flex" @click="goRoom(item)">
|
<view class="v12-justify-between flex" @click="goRoom(item)">
|
||||||
<image class="cover flex-0" :src="item.store_avatar || webUrl+'/20221114155314348118.png'"/>
|
<image class="cover flex-0" :src="item.store_avatar || webUrl+'/20221114155314348118.png'"/>
|
||||||
<view>
|
<view>
|
||||||
<view class="flex jc-between ai-center">
|
<view class="flex jc-between ai-center">
|
||||||
<view class="name">{{ item.store_name }}</view>
|
<view class="name more-t">{{ item.store_name }}</view>
|
||||||
<view class="datetime" v-if="item.last_msg">{{ item.last_msg.created_at }}</view>
|
<view class="datetime" v-if="item.last_msg">{{ item.last_msg.created_at }}</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="sub one-t" v-if="item.last_msg">{{ item.last_msg.msg_type===0?item.last_msg.msg_content:'[图片]' }}</view>
|
<view class="sub one-t" v-if="item.last_msg">{{ item.last_msg.msg_type===0?item.last_msg.msg_content:'[图片]' }}</view>
|
||||||
@@ -96,7 +97,11 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.common-roomLogs .u-swipe-action-item{
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
.common-roomLogs {
|
.common-roomLogs {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
@@ -105,7 +110,6 @@ export default {
|
|||||||
background: #F5F5F5;
|
background: #F5F5F5;
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
margin-bottom: 24rpx;
|
|
||||||
border-radius: 8rpx;
|
border-radius: 8rpx;
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
|
|
||||||
@@ -127,6 +131,10 @@ export default {
|
|||||||
font-size: 22rpx;
|
font-size: 22rpx;
|
||||||
line-height: 32rpx;
|
line-height: 32rpx;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
|
width: 240rpx;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sub {
|
.sub {
|
||||||
|
|||||||
@@ -289,7 +289,12 @@
|
|||||||
</u-form-item>
|
</u-form-item>
|
||||||
<u-form-item prop="pics">
|
<u-form-item prop="pics">
|
||||||
<u-cell title="店铺图片" :border="false">
|
<u-cell title="店铺图片" :border="false">
|
||||||
<template #label>
|
<template #icon>
|
||||||
|
<text class="required">*</text>
|
||||||
|
</template>
|
||||||
|
</u-cell>
|
||||||
|
<u-cell :border="false">
|
||||||
|
<template #title>
|
||||||
<u-upload
|
<u-upload
|
||||||
:fileList="pics"
|
:fileList="pics"
|
||||||
:maxCount="9"
|
:maxCount="9"
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
</swiper> -->
|
</swiper> -->
|
||||||
<carousel
|
<carousel
|
||||||
:img-list="templateProperties.page2Links"
|
:img-list="templateProperties.page2Links"
|
||||||
|
:bg-img="templateProperties.page2BackgroundImage"
|
||||||
url-key="image"
|
url-key="image"
|
||||||
@selected="itemClick"
|
@selected="itemClick"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
<view class="page-wrap">
|
<view class="page-wrap">
|
||||||
<view class="page-2">
|
<view class="page-2">
|
||||||
<image
|
<image
|
||||||
:src="templateProperties.page3BackgroundImage"
|
:src="templateProperties.page2BackgroundImage"
|
||||||
class="section-bg"
|
class="section-bg"
|
||||||
mode="widthFix"
|
mode="widthFix"
|
||||||
/>
|
/>
|
||||||
<view class="list flex flex-wrap">
|
<view class="list flex flex-wrap">
|
||||||
<image
|
<image
|
||||||
v-for="(item, index) in templateProperties.page3Links"
|
v-for="(item, index) in templateProperties.page2Links"
|
||||||
:key="index"
|
:key="index"
|
||||||
:src="item.image"
|
:src="item.image"
|
||||||
class="item"
|
class="item"
|
||||||
|
|||||||
@@ -5,9 +5,13 @@
|
|||||||
next-margin="145rpx"
|
next-margin="145rpx"
|
||||||
circular
|
circular
|
||||||
autoplay
|
autoplay
|
||||||
|
:interval="3000"
|
||||||
indicatorDots="true"
|
indicatorDots="true"
|
||||||
indicator-color="#ddd"
|
indicator-color="#ddd"
|
||||||
indicator-active-color="#777"
|
indicator-active-color="#777"
|
||||||
|
:style="{
|
||||||
|
'background-image': `url(${bgImg})`
|
||||||
|
}"
|
||||||
@change="swiperChange"
|
@change="swiperChange"
|
||||||
>
|
>
|
||||||
<swiper-item
|
<swiper-item
|
||||||
@@ -41,6 +45,10 @@
|
|||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
bgImg: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -63,6 +71,7 @@
|
|||||||
.image-container {
|
.image-container {
|
||||||
width: 750rpx;
|
width: 750rpx;
|
||||||
height: 840rpx;
|
height: 840rpx;
|
||||||
|
background-size: 750rpx 840rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.item-img {
|
.item-img {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const themeTemplateMixins = {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
itemClick(item) {
|
itemClick(item) {
|
||||||
|
if (!item.available) return
|
||||||
this.$emit('view', item)
|
this.$emit('view', item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<view class="expo-details">
|
||||||
|
<view v-if="details.video" class="video-wrap">
|
||||||
|
<video id="ky-video" class="ky-video" @error="videoErrorCallback" :show-fullscreen-btn="false" :src="details.video" autoplay controls></video>
|
||||||
|
</view>
|
||||||
|
<view class="expo-item">
|
||||||
|
{{ details.name }}
|
||||||
|
</view>
|
||||||
|
<view class="details-wrap v12-mt-3">
|
||||||
|
<view class="v12-font-bold v12-dark-text v12-font-32 v12-mb-3">展会信息</view>
|
||||||
|
<view class="v12-justify-start v12-mb-3">
|
||||||
|
<view class="tag v12-success v12-white-text v12-font-20 v12-px-2 v12-py-1 v12-radius-50 v12-nowrap">主题</view>
|
||||||
|
<view class="v12-font-bold v12-font-28 v12-dark-text v12-ml-3">{{ details.theme }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-start v12-mb-3">
|
||||||
|
<view class="tag v12-success v12-white-text v12-font-20 v12-px-2 v12-py-1 v12-radius-50 v12-nowrap">内容</view>
|
||||||
|
<rich-text class="v12-ml-3" :nodes="details.content"></rich-text>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-start v12-mb-3">
|
||||||
|
<view class="tag v12-success v12-white-text v12-font-20 v12-px-2 v12-py-1 v12-radius-50 v12-nowrap">时间</view>
|
||||||
|
<view class="v12-font-bold v12-font-28 v12-dark-text v12-ml-3">{{ details.startTime }}--{{ details.endTime }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-start v12-mb-3">
|
||||||
|
<view class="tag v12-success v12-white-text v12-font-20 v12-px-2 v12-py-1 v12-radius-50 v12-nowrap">地点</view>
|
||||||
|
<view class="v12-font-bold v12-font-28 v12-dark-text v12-ml-3">{{ details.address }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="more-wrap v12-mt-3">
|
||||||
|
<view class="v12-justify-between v12-align-center v12-mb-3">
|
||||||
|
<view class="v12-font-bold v12-font-32">其他展会</view>
|
||||||
|
<view class="v12-font-24 v12-align-center" @click="toMore">
|
||||||
|
<text>查看更多</text>
|
||||||
|
<image :src="webUrl + '/orderIcon/arrow.png'" class="arrow-icon v12-ml-1"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
v-for="(item, index) in moreList"
|
||||||
|
:key="index"
|
||||||
|
@click="getOther(item.id)"
|
||||||
|
class="v12-white v12-dark-text v12-font-bold v12-font-26 v12-mb-3 v12-radius-50 v12-pa-2">
|
||||||
|
{{ item.name }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import {getWellnessExhibitionDetails, getWellnessExhibition} from '@/api/health'
|
||||||
|
export default{
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
keyword: '',
|
||||||
|
moreList: [],
|
||||||
|
id: '',
|
||||||
|
details: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.id = opts.id || ''
|
||||||
|
this.getDetails(this.id)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
videoErrorCallback(error) {
|
||||||
|
console.log(error);
|
||||||
|
|
||||||
|
},
|
||||||
|
getDetails(id) {
|
||||||
|
getWellnessExhibitionDetails(id).then(({data}) => {
|
||||||
|
this.details = data
|
||||||
|
this.getOthers()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getOther(id) {
|
||||||
|
this.id = id
|
||||||
|
this.getDetails(this.id)
|
||||||
|
},
|
||||||
|
getOthers() {
|
||||||
|
let params = {
|
||||||
|
page: 1,
|
||||||
|
limit: 5
|
||||||
|
}
|
||||||
|
getWellnessExhibition(params).then(({data}) => {
|
||||||
|
this.moreList = data.records.filter(e => e.id != this.id)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toMore() {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pkg_product/views/expoList'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.arrow-icon{
|
||||||
|
width: 25rpx;
|
||||||
|
height: 25rpx;
|
||||||
|
}
|
||||||
|
.ky-video{
|
||||||
|
height: 400rpx;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.tag{
|
||||||
|
height: 30rpx;
|
||||||
|
}
|
||||||
|
.expo-details{
|
||||||
|
min-height: 100vh;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background: #fff;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.expo-item{
|
||||||
|
padding: 20rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
font-size: 26rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.video-wrap + .expo-item {
|
||||||
|
padding: 30rpx 20rpx 20rpx;
|
||||||
|
margin-top: -20rpx;
|
||||||
|
border-radius: 0 0 20rpx 20rpx;
|
||||||
|
}
|
||||||
|
.details-wrap, .more-wrap{
|
||||||
|
width: 100%;
|
||||||
|
background: #f2f2f2;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<view class="expo-list">
|
||||||
|
<view class="search-wrap">
|
||||||
|
<u-search
|
||||||
|
placeholder="请输入关键字查询"
|
||||||
|
v-model="keyword"
|
||||||
|
shape="round"
|
||||||
|
:showAction="false"
|
||||||
|
@search="getList"
|
||||||
|
></u-search>
|
||||||
|
</view>
|
||||||
|
<view class="expo-wrap">
|
||||||
|
<view
|
||||||
|
class="expo-item"
|
||||||
|
v-for="(item, index) in expoList"
|
||||||
|
:key="index"
|
||||||
|
@click="toDetails(item)"
|
||||||
|
>
|
||||||
|
{{ item.name }}
|
||||||
|
</view>
|
||||||
|
<view v-if="expoList.length === 0">
|
||||||
|
<view class="no-data-wrap v12-justify-center v12-mt-6">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/微信图片_20241009220552.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getWellnessExhibition } from '@/api/health'
|
||||||
|
export default{
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
keyword: '',
|
||||||
|
expoList: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toDetails(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pkg_product/views/expoDetails?id='+item.id
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
const params = {
|
||||||
|
page: 1,
|
||||||
|
limit: 9999,
|
||||||
|
keyword: this.keyword
|
||||||
|
}
|
||||||
|
getWellnessExhibition(params).then((res) => {
|
||||||
|
console.log(res);
|
||||||
|
this.expoList = res.data.records
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.expo-list{
|
||||||
|
height: 100vh;
|
||||||
|
background: #fff;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.expo-item{
|
||||||
|
background-color: #f2f2f2;
|
||||||
|
border-radius: 100rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -356,7 +356,7 @@ export default {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
left: 30rpx;
|
left: 30rpx;
|
||||||
right: 30rpx;
|
right: 30rpx;
|
||||||
bottom: -50rpx;
|
top: 260rpx;
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 30rpx 20rpx 30rpx 30rpx;
|
padding: 30rpx 20rpx 30rpx 30rpx;
|
||||||
border-radius: 20rpx;
|
border-radius: 20rpx;
|
||||||
@@ -400,6 +400,10 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.list-wrap {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
.list-cont {
|
.list-cont {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|||||||
@@ -93,9 +93,9 @@
|
|||||||
<view class="inn-signature">
|
<view class="inn-signature">
|
||||||
{{ inn.shopIntro }}
|
{{ inn.shopIntro }}
|
||||||
</view>
|
</view>
|
||||||
<!-- <view class="share-btn" @click="changeShare">
|
<view class="share-btn" @click="changeShare">
|
||||||
<image :src="webUrl + '/page/hotel/share.png'" class="img" />
|
<image :src="webUrl + '/page/hotel/share.png'" class="img" />
|
||||||
</view> -->
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view v-if="inn.name" class="map-wrapper">
|
<view v-if="inn.name" class="map-wrapper">
|
||||||
<view class="map-cont">
|
<view class="map-cont">
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
v-if="activeIndex === 3"
|
v-if="activeIndex === 3"
|
||||||
class="info-section"
|
class="info-section"
|
||||||
>
|
>
|
||||||
<view v-if="isLoadInfoListSuccess">
|
<view>
|
||||||
<view v-if="infoArray.length > 0" class="info-wrapper">
|
<view v-if="infoArray.length > 0" class="info-wrapper">
|
||||||
<view class="info-list">
|
<view class="info-list">
|
||||||
<view
|
<view
|
||||||
@@ -213,14 +213,11 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<image
|
</view>
|
||||||
:src="webUrl + '/home/no-data-bg.png'"
|
<view class="v12-px-6" >
|
||||||
mode="widthFix"
|
<u-divider :text="infoArray.length === 0 ? ' · 暂无资讯 · ' : ' · 已经到底啦 · '" textPosition="center"></u-divider>
|
||||||
class="no-data-loadend"
|
|
||||||
/>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<goo-skeleton v-else />
|
|
||||||
</view>
|
</view>
|
||||||
<!-- 文化 -->
|
<!-- 文化 -->
|
||||||
<view
|
<view
|
||||||
@@ -293,11 +290,14 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<image
|
<!-- <image
|
||||||
:src="webUrl + '/home/no-data-bg.png'"
|
:src="webUrl + '/home/no-data-bg.png'"
|
||||||
mode="widthFix"
|
mode="widthFix"
|
||||||
class="no-data-loadend"
|
class="no-data-loadend"
|
||||||
/>
|
/> -->
|
||||||
|
<view class="v12-px-6" >
|
||||||
|
<u-divider :text="guideList.length === 0 ? ' · 暂无攻略 · ' : ' · 已经到底啦 · '" textPosition="center"></u-divider>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<goo-skeleton v-else />
|
<goo-skeleton v-else />
|
||||||
</view>
|
</view>
|
||||||
@@ -505,8 +505,8 @@
|
|||||||
v-if="activeIndex === 4"
|
v-if="activeIndex === 4"
|
||||||
class="good-list-wrap"
|
class="good-list-wrap"
|
||||||
>
|
>
|
||||||
<view class="good-list-cont">
|
<view class="good-list-cont v12-d-grid-columns-2">
|
||||||
<view class="list-cont-left">
|
<!-- <view class="list-cont-left">
|
||||||
<view
|
<view
|
||||||
v-for="(item, index) in leftList"
|
v-for="(item, index) in leftList"
|
||||||
:key="index"
|
:key="index"
|
||||||
@@ -537,6 +537,47 @@
|
|||||||
@view="goGoodsCon(item)"
|
@view="goGoodsCon(item)"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
|
</view> -->
|
||||||
|
<view v-for="(item, index) in leftList" :key="index">
|
||||||
|
<view v-if="item.productId" class="v12-white v12-radius-20 f-wrap" @click="goGoodsCon(item)" style="height: 516rpx">
|
||||||
|
<view class="">
|
||||||
|
<view class="focus-img">
|
||||||
|
<image :src="item.productImage" class="img"></image>
|
||||||
|
</view>
|
||||||
|
<view class="more-t v12-pt-2 v12-font-bold v12-font-28 v12-px-2">{{ item.productName }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-between v12-algin-center v12-pa-2">
|
||||||
|
<view>
|
||||||
|
<text class="v12-font-bold v12-primary-text v12-font-24">¥</text>
|
||||||
|
<text class="v12-font-bold v12-primary-text v12-font-28">{{ item.productPrice }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="btn">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/home/icon-cart.png'"
|
||||||
|
class="img"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="!item.productId" class="v12-white v12-radius-20 f-wrap" @click="goStore(item)" style="height: 516rpx">
|
||||||
|
<view>
|
||||||
|
<view class="focus-img">
|
||||||
|
<image :src="item.cover" v-if="item.coverType === 1" class="img" mode="heightFix|widthFix"></image>
|
||||||
|
<video :src="item.cover" v-else :show-center-play-btn="false" :show-fullscreen-btn="false" :show-play-btn="false" class="img" :poster="item.cover + '?vframe/jpg/offset/1'"></video>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/farmer.png'"
|
||||||
|
class="mark-img"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
<view class="more-t v12-pt-2 v12-font-bold v12-font-28 v12-px-2" >{{ item.content }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-start v12-align-center v12-pt-2 v12-px-2 v12-pb-2">
|
||||||
|
<view class="btn v12-mr-2">
|
||||||
|
<image :src="item.logo" class="img v12-radius-100"></image>
|
||||||
|
</view>
|
||||||
|
<view class="one-t v12-font-24 v12-dark1-text" style="width:230rpx">{{ item.name }}/{{ inn.name }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<image
|
<image
|
||||||
@@ -559,7 +600,7 @@
|
|||||||
<image
|
<image
|
||||||
:src="webUrl + '/20230608112219219303.png'"
|
:src="webUrl + '/20230608112219219303.png'"
|
||||||
class="icon"
|
class="icon"
|
||||||
@click="changeShare"
|
@click="closeShare"
|
||||||
/>
|
/>
|
||||||
<image :src="posterUrl" class="main-img" />
|
<image :src="posterUrl" class="main-img" />
|
||||||
</view>
|
</view>
|
||||||
@@ -587,7 +628,8 @@ import {
|
|||||||
getCountyFamousIndustryProject,
|
getCountyFamousIndustryProject,
|
||||||
getCountyFamousInvestmentFile,
|
getCountyFamousInvestmentFile,
|
||||||
getCountyFamousVillage,
|
getCountyFamousVillage,
|
||||||
getCountyFamousCityDetail
|
getCountyFamousCityDetail,
|
||||||
|
getShareImg
|
||||||
} from '@/api/qianxian'
|
} from '@/api/qianxian'
|
||||||
import {formatDateTime} from '@/utils'
|
import {formatDateTime} from '@/utils'
|
||||||
import {getUrlParam} from '@/utils/common.js'
|
import {getUrlParam} from '@/utils/common.js'
|
||||||
@@ -677,6 +719,7 @@ export default {
|
|||||||
if (options.scene || obj.query.scene) {
|
if (options.scene || obj.query.scene) {
|
||||||
const query = options ? decodeURIComponent(options.scene) : decodeURIComponent(obj.query.scene)
|
const query = options ? decodeURIComponent(options.scene) : decodeURIComponent(obj.query.scene)
|
||||||
this.partnerId = getUrlParam(query, 'partnerId') || null
|
this.partnerId = getUrlParam(query, 'partnerId') || null
|
||||||
|
this.id = getUrlParam(query, 'id') || null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.partnerId) cookie.set('spread', this.partnerId)
|
if (this.partnerId) cookie.set('spread', this.partnerId)
|
||||||
@@ -687,6 +730,19 @@ export default {
|
|||||||
this.getListReq()
|
this.getListReq()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
goStore(item) {
|
||||||
|
if (item.farmerShopId === 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: '店铺装修中~',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pagesInn/inn/farmerStore?id=' + item.farmerShopId + '&isQianxian=1&from=famous&isFarmer=1'
|
||||||
|
})
|
||||||
|
},
|
||||||
load() {
|
load() {
|
||||||
this.$refs.uReadMore.init();
|
this.$refs.uReadMore.init();
|
||||||
},
|
},
|
||||||
@@ -744,20 +800,52 @@ export default {
|
|||||||
const { success, data } = res
|
const { success, data } = res
|
||||||
if (success) {
|
if (success) {
|
||||||
const products = data.products || []
|
const products = data.products || []
|
||||||
products.map((item, index) => {
|
const farmerShops = data.farmerShops || []
|
||||||
item.isOldBrand = 0
|
this.leftList = this.sortProductsAndStores(products, farmerShops)
|
||||||
item.isLandmarkGoods = 0
|
console.log(this.leftList);
|
||||||
item.isCountyFamous = 1
|
// products.map((item, index) => {
|
||||||
if (index % 2 === 0) {
|
// item.isOldBrand = 0
|
||||||
this.leftList.push(item)
|
// item.isLandmarkGoods = 0
|
||||||
}
|
// if (index % 2 === 0) {
|
||||||
if (index % 2 === 1) {
|
// this.leftList.push(item)
|
||||||
this.rightList.push(item)
|
// }
|
||||||
}
|
// if (index % 2 === 1) {
|
||||||
})
|
// item.isFarmer = 1
|
||||||
|
// this.rightList.push(item)
|
||||||
|
// }
|
||||||
|
// })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
shuffleArray(array) {
|
||||||
|
for (let i = array.length - 1; i > 0; i--) {
|
||||||
|
let j = Math.floor(Math.random() * (i + 1));
|
||||||
|
[array[i], array[j]] = [array[j], array[i]];
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
},
|
||||||
|
sortProductsAndStores(products, stores) {
|
||||||
|
const randomMap = []
|
||||||
|
const randomProduct = products.length === 0 ? null : products.length === 1 ? products[0] : products[Math.floor(Math.random() * products.length)]
|
||||||
|
const store = stores.length === 0 ? null : stores.length === 1 ? stores[0] : stores[Math.floor(Math.random() * stores.length)]
|
||||||
|
if(!randomProduct && !store) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
if(!randomProduct && store) {
|
||||||
|
return stores
|
||||||
|
}
|
||||||
|
if(randomProduct && !store) {
|
||||||
|
return products
|
||||||
|
}
|
||||||
|
if(randomProduct && store) {
|
||||||
|
randomMap[0] = randomProduct
|
||||||
|
randomMap[1] = store
|
||||||
|
const _p = products.filter(e => e !== randomProduct)
|
||||||
|
const _s = stores.filter(e => e !== store)
|
||||||
|
const concatArr = this.shuffleArray(_p.concat(_s))
|
||||||
|
return randomMap.concat(concatArr);
|
||||||
|
}
|
||||||
|
},
|
||||||
getShopDetailReq() {
|
getShopDetailReq() {
|
||||||
const _this = this
|
const _this = this
|
||||||
getCountyFamousCityShop({ countyFamousDataId: _this.id }).then((res) => {
|
getCountyFamousCityShop({ countyFamousDataId: _this.id }).then((res) => {
|
||||||
@@ -867,7 +955,16 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
changeShare() {
|
changeShare() {
|
||||||
this.showShare = !this.showShare
|
uni.showLoading()
|
||||||
|
getShareImg(this.id).then(res => {
|
||||||
|
this.posterUrl = res.data
|
||||||
|
this.showShare = !this.showShare
|
||||||
|
}).finally(() => {
|
||||||
|
uni.hideLoading()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
closeShare() {
|
||||||
|
this.showShare = false
|
||||||
},
|
},
|
||||||
saveImg() {
|
saveImg() {
|
||||||
const _this = this
|
const _this = this
|
||||||
@@ -1056,7 +1153,36 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
|
||||||
@import "@/assets/css/store.less";
|
@import "@/assets/css/store.less";
|
||||||
|
.focus-img {
|
||||||
|
position: relative;
|
||||||
|
.img {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 345rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.mark-img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 3;
|
||||||
|
display: block;
|
||||||
|
width: 125rpx;
|
||||||
|
height: 83rpx;
|
||||||
|
border-radius: 0 25rpx 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
.img {
|
||||||
|
display: block;
|
||||||
|
width: 48rpx;
|
||||||
|
height: 48rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
.my-inn-page {
|
.my-inn-page {
|
||||||
padding: 0 0 100rpx 0;
|
padding: 0 0 100rpx 0;
|
||||||
background-color: #f6f6f6;
|
background-color: #f6f6f6;
|
||||||
@@ -1469,7 +1595,7 @@ export default {
|
|||||||
.img {
|
.img {
|
||||||
display: block;
|
display: block;
|
||||||
width: 320rpx;
|
width: 320rpx;
|
||||||
height: 360rpx;
|
height: 320rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
}
|
}
|
||||||
&:nth-child(2n) {
|
&:nth-child(2n) {
|
||||||
@@ -1756,9 +1882,11 @@ export default {
|
|||||||
.good-list-cont {
|
.good-list-cont {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
display: flex;
|
// display: flex;
|
||||||
justify-content: space-between;
|
// justify-content: space-between;
|
||||||
padding: 0 21rpx 21rpx 21rpx;
|
padding: 20rpx;
|
||||||
|
grid-column-gap: 10px;
|
||||||
|
grid-row-gap: 10px;
|
||||||
.list-cont-left,
|
.list-cont-left,
|
||||||
.list-cont-right {
|
.list-cont-right {
|
||||||
width: calc(50% - 11rpx);
|
width: calc(50% - 11rpx);
|
||||||
@@ -1777,4 +1905,10 @@ export default {
|
|||||||
.no-data-loadend {
|
.no-data-loadend {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.f-wrap{
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,264 @@
|
|||||||
|
<template>
|
||||||
|
<view class="food-wrap">
|
||||||
|
<view class="v12-mb-3 banner-wrap">
|
||||||
|
<image :src="details.topImage" mode="widthFix" class="banner-wrap"></image>
|
||||||
|
</view>
|
||||||
|
<view class="inro-wrap v12-mb-3 ">
|
||||||
|
<view class="v12-font-36 v12-font-bold v12-dark-text v12-mb-3">{{ details.name }}</view>
|
||||||
|
<view class="v12-font-28 v12-secondary-dark-text">{{ details.content }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="details-list-wrap v12-mb-3 ">
|
||||||
|
<view class="v12-justify-start v12-align-center">
|
||||||
|
<view class="primary-title">
|
||||||
|
<text class="v12-font-34 v12-font-bold">食材清单</text>
|
||||||
|
<view class="slider"></view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-dark1-text v12-font-24 v12-ml-3">/ 新鲜的食材决定药膳的作用</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-white v12-radius-20 v12-pa-2 v12-mt-3">
|
||||||
|
<view class="v12-font-28 v12-font-bold v12-mb-2">主料</view>
|
||||||
|
<view class="v12-d-grid-columns-2 primary-item-wrap">
|
||||||
|
<view v-for="(item, index) in details.mainRecipe" :key="index" class="primary-item v12-justify-start v12-align-center">
|
||||||
|
<view class="primary-img">
|
||||||
|
<image :src="item.recipeImage" class="primary-img" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
<view class="v12-ml-2">
|
||||||
|
<view class="v12-font-26 one-t v12-mb-1" style="width: 160rpx">{{ item.recipeText }}</view>
|
||||||
|
<view class="v12-font-20 v12-primary v12-white-text v12-nowrap v12-px-2 v12-py-1 v12-radius-60" @click="toGoods(item.productId)">+购入同款食材</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-white v12-radius-20 v12-pa-2 v12-mt-3">
|
||||||
|
<view class="v12-font-28 v12-font-bold v12-mb-2">辅料</view>
|
||||||
|
<view class="v12-d-grid-columns-2 primary-item-wrap">
|
||||||
|
<view v-for="(item, index) in details.minorRecipe" :key="index" class="primary-item v12-justify-start v12-align-center">
|
||||||
|
<view class="v12-ml-2">
|
||||||
|
<view class="v12-font-26 one-t v12-mb-1" style="width: 280rpx">
|
||||||
|
<text class="v12-mr-2 v12-font-bold">·</text>
|
||||||
|
<text>{{ item.recipeText }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="step-wrap v12-mb-3">
|
||||||
|
<view class="step-title">
|
||||||
|
<view>烹饪步骤</view>
|
||||||
|
<view class="slider"></view>
|
||||||
|
</view>
|
||||||
|
<view class="steps v12-mt-3">
|
||||||
|
<view v-for="(item, index) in details.cookingSteps" :key="index" class="step-item">
|
||||||
|
<image :src="item.stepImage" mode="widthFix" ></image>
|
||||||
|
<!-- <view class="v12-ml-2 step-info">
|
||||||
|
<view class="v12-font-26 v12-font-bold v12-mb-3">{{ item.text }}</view>
|
||||||
|
<view class="v12-font-26 v12-secondary-dark-text">{{ item.text }}</view>
|
||||||
|
</view> -->
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="tips-wrap">
|
||||||
|
<view class="step-title">
|
||||||
|
<view>养生小tips</view>
|
||||||
|
<view class="slider"></view>
|
||||||
|
</view>
|
||||||
|
<view class="card-wrap v12-mt-3">
|
||||||
|
<!-- <view class="card-item">
|
||||||
|
<view class="card-tag v12-primary v12-white-text">选材</view>
|
||||||
|
<view class="v12-mt-6">
|
||||||
|
<view v-for="(item, index) in tips" :key="index">
|
||||||
|
<text class="v12-primary-text v12-font-bold v12-mr-2">·</text>
|
||||||
|
<text class="v12-font-26 v12-dark-text">{{ item }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card-item v12-mt-3">
|
||||||
|
<view class="card-tag v12-primary v12-white-text">注意事项</view>
|
||||||
|
<view class="v12-mt-6">
|
||||||
|
<view v-for="(item, index) in tips" :key="index">
|
||||||
|
<text class="v12-primary-text v12-font-bold v12-mr-2">·</text>
|
||||||
|
<text class="v12-font-26 v12-dark-text">{{ item }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view> -->
|
||||||
|
<rich-text class="card-item" :nodes="details.remark">
|
||||||
|
|
||||||
|
</rich-text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getFoodDetails } from '@/api/health'
|
||||||
|
export default{
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tips: [
|
||||||
|
'鹌鹑:选择新鲜的鹌鹑,处理清洗干净,去除内脏和杂质',
|
||||||
|
'淮山:选择肉质雪白、无黑点的淮山,去皮切块后应立即',
|
||||||
|
'放入清水中浸泡,以防氧化变黑',
|
||||||
|
'党参:选择色泽黄亮、无霉变、无虫蛀的党参'
|
||||||
|
],
|
||||||
|
primaryList: [
|
||||||
|
{img: '', label: '鹌鹑(2只)'},
|
||||||
|
{img: '', label: '鹌鹑(2只)'},
|
||||||
|
{img: '', label: '鹌鹑(2只)'},
|
||||||
|
{img: '', label: '鹌鹑(2只)'},
|
||||||
|
],
|
||||||
|
secondaryList: [
|
||||||
|
'枸杞(适量)',
|
||||||
|
'姜片(适量)',
|
||||||
|
'盐(适量)',
|
||||||
|
'清水(适量)'
|
||||||
|
],
|
||||||
|
steps: [],
|
||||||
|
id: '',
|
||||||
|
topImage: '',
|
||||||
|
details: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.id = opts.id
|
||||||
|
this.getDetails(opts.id)
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getDetails(id) {
|
||||||
|
getFoodDetails(id).then(res => {
|
||||||
|
this.details = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toGoods(id) {
|
||||||
|
this.$yrouter.push({
|
||||||
|
path: '/pages/shop/GoodsCon/index',
|
||||||
|
query: {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.card-tag{
|
||||||
|
width: fit-content;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
border-radius: 10rpx 0 20rpx 20rpx;
|
||||||
|
position: absolute;
|
||||||
|
top: -12rpx;
|
||||||
|
}
|
||||||
|
.card-tag::after{
|
||||||
|
content: '';
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 8rpx solid transparent !important;
|
||||||
|
border-right: 8rpx solid transparent !important;
|
||||||
|
right: -4px;
|
||||||
|
border-top: 8rpx solid #7D393F !important;
|
||||||
|
border-bottom: 8rpx solid transparent!important;
|
||||||
|
position: absolute;
|
||||||
|
top: 4rpx;
|
||||||
|
rotate: 45deg;
|
||||||
|
}
|
||||||
|
.card-item{
|
||||||
|
position: relative;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.tips-wrap{
|
||||||
|
background: #F2F2F2;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.steps{
|
||||||
|
display: flex;
|
||||||
|
overflow: auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
.step-info{
|
||||||
|
height: inherit;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.step-item{
|
||||||
|
min-width: 482rpx;
|
||||||
|
width: 482rpx;
|
||||||
|
height: 232rpx;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-start;
|
||||||
|
margin-right: 24rpx;
|
||||||
|
// padding: 20rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.step-item:last-child{
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
.step-img{
|
||||||
|
width: 200rpx;
|
||||||
|
height: 200rpx;
|
||||||
|
background: rgba(195,126,126,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.step-title{
|
||||||
|
position: relative;
|
||||||
|
width: fit-content;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 34rpx;
|
||||||
|
}
|
||||||
|
.step-wrap{
|
||||||
|
background: #F2F2F2;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
padding: 20rpx 20rpx 30rpx 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.primary-item-wrap{
|
||||||
|
grid-column-gap: 20rpx;
|
||||||
|
grid-row-gap: 20rpx;
|
||||||
|
|
||||||
|
}
|
||||||
|
.primary-img{
|
||||||
|
width: 124rpx;
|
||||||
|
height: 90rpx;
|
||||||
|
background: rgba(63,20,20,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.primary-item{
|
||||||
|
}
|
||||||
|
.slider{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
background: linear-gradient(to right, #C52733 0%, rgba(255,255,255,0) 100%);
|
||||||
|
border-radius: 6rpx;
|
||||||
|
bottom: 5rpx;
|
||||||
|
}
|
||||||
|
.primary-title{
|
||||||
|
position: relative;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
.food-wrap{
|
||||||
|
min-height: 100vh;
|
||||||
|
background: #fff;
|
||||||
|
padding: 20rpx 20rpx 60rpx 20rpx;
|
||||||
|
}
|
||||||
|
.banner-wrap{
|
||||||
|
width: 100%;
|
||||||
|
height: 360rpx;
|
||||||
|
background: rgba(180,18,18,0.39);
|
||||||
|
border-radius: 40rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.details-list-wrap{
|
||||||
|
background: #F2F2F2;
|
||||||
|
border-radius: 40rpx;
|
||||||
|
padding: 20rpx 20rpx 30rpx 20rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,480 @@
|
|||||||
|
<template>
|
||||||
|
<view class="health-foods">
|
||||||
|
<view class="v12-justify-center">
|
||||||
|
<view
|
||||||
|
class="ys-btn v12-mr-3 v12-radius-100 v12-dark-text v12-px-5 v12-py-2 v12-font-28 v12-font-bold"
|
||||||
|
@click="toSanctun"
|
||||||
|
>养生圣地</view
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="v12-radius-100 v12-primary v12-white-text v12-px-5 v12-py-2 v12-font-28 v12-font-bold"
|
||||||
|
>养生食材</view
|
||||||
|
>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-between v12-align-center v12-mt-5">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/map_dark.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
<view class="v12-font-28 v12-secondary-dark-text v12-mr-3">{{
|
||||||
|
cityName
|
||||||
|
}}</view>
|
||||||
|
<view class="flex-1">
|
||||||
|
<u-search
|
||||||
|
:showAction="false"
|
||||||
|
v-model="keyword"
|
||||||
|
bgColor="#fff"
|
||||||
|
searchIconColor="#C52733"
|
||||||
|
@search="search"
|
||||||
|
></u-search>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<swiper
|
||||||
|
class="v12-justify-between swap"
|
||||||
|
autoplay
|
||||||
|
circular
|
||||||
|
next-margin="300rpx"
|
||||||
|
duration="10000"
|
||||||
|
interval="3000"
|
||||||
|
>
|
||||||
|
<swiper-item v-for="(item, index) in foodItems" :key="index">
|
||||||
|
<view class="trave-item-wrap v12-mr-3 v12-mt-3">
|
||||||
|
<view class="trave-item">
|
||||||
|
<image
|
||||||
|
class="trave-item"
|
||||||
|
mode="widthFix"
|
||||||
|
:src="item.indexImage"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<view class="trave-btn" @click="toDetails(item.id)">
|
||||||
|
<text class="one-t">{{ item.name }}</text>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/arrow.png'"
|
||||||
|
class="arrow-icon v12-ml-1"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
<view class="v12-justify-center v12-mt-3" v-if="rank.length > 0">
|
||||||
|
<image
|
||||||
|
class="title-img"
|
||||||
|
:src="webUrl + '/orderIcon/rankTitle.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<view class="rank-wrap v12-mt-3" v-if="rank.length > 0">
|
||||||
|
<view class="rank-items-wrap">
|
||||||
|
<view class="bee-rank" v-for="(k, i) in rank" :key="i">
|
||||||
|
<image :src="k.backgroundImage" class="bg-img" style="width:inherit" mode="scaleToFill"></image>
|
||||||
|
<view class="rank-title-wrap">
|
||||||
|
<view class="rank-title v12-font-34 v12-font-bold one-t">{{
|
||||||
|
k.title
|
||||||
|
}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-px-2">
|
||||||
|
<view
|
||||||
|
class="rank-item v12-justify-start v12-align-center v12-mb-4"
|
||||||
|
v-for="(item, index) in k.products"
|
||||||
|
@click="toGoods(item.productId)"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="rank-tag"
|
||||||
|
:class="{ 'rank2-bg': index === 1, 'rank3-bg': index === 2 }"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="rank-2"
|
||||||
|
:class="{
|
||||||
|
'rank2-2-bg': index === 1,
|
||||||
|
'rank3-3-bg': index === 2,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="rank-3"
|
||||||
|
:class="{
|
||||||
|
'rank2-4-bg': index === 1,
|
||||||
|
'rank3-4-bg': index === 2,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<view
|
||||||
|
class="rank-4"
|
||||||
|
:class="{
|
||||||
|
'rank2-bg': index === 1,
|
||||||
|
'rank3-bg': index === 2,
|
||||||
|
}"
|
||||||
|
>{{ index + 1 }}</view
|
||||||
|
>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="rank-img">
|
||||||
|
<image
|
||||||
|
:src="item.productImage"
|
||||||
|
mode="widthFix"
|
||||||
|
class="rank-img"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
<view class="v12-ml-2">
|
||||||
|
<view
|
||||||
|
class="v12-font-bold v12-font-24 one-t"
|
||||||
|
style="width: 160rpx"
|
||||||
|
>{{ item.productTitle }}</view
|
||||||
|
>
|
||||||
|
<view class="v12-font-22 more-t">{{ item.productDesc }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="recommend-wrap v12-mt-3">
|
||||||
|
<view class="recommend-title v12-px-3">
|
||||||
|
<text class="v12-dark-text v12-font-36 v12-font-bold">食补推荐</text>
|
||||||
|
<view class="slider"></view>
|
||||||
|
</view>
|
||||||
|
<view class="recommends v12-mt-3">
|
||||||
|
<view
|
||||||
|
class="recommend-item"
|
||||||
|
v-for="(item, index) in recommendItems"
|
||||||
|
:key="index"
|
||||||
|
@click="toGoods(item.productId)"
|
||||||
|
>
|
||||||
|
<view>
|
||||||
|
<view class="recommend-img">
|
||||||
|
<image class="recommend-img" :src="item.image" mode="aspectFit"></image>
|
||||||
|
<view class="name-wrap v12-white-text v12-text-center more-t">{{
|
||||||
|
item.title
|
||||||
|
}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-px-2 v12-font-bold v12-font-28 more-t v12-my-2">{{
|
||||||
|
item.productName
|
||||||
|
}}</view>
|
||||||
|
</view>
|
||||||
|
<view
|
||||||
|
class="v12-justify-between v12-primary-text v12-font-bold v12-px-2 v12-pb-2"
|
||||||
|
>
|
||||||
|
<view class="">
|
||||||
|
<text class="v12-font-32">¥</text>
|
||||||
|
<text class="v12-font-36">{{ item.price }}</text>
|
||||||
|
</view>
|
||||||
|
<view class="cart-img">
|
||||||
|
<image
|
||||||
|
class="cart-img"
|
||||||
|
:src="webUrl + '/orderIcon/组 355.png'"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="recommendItems.length === 0">
|
||||||
|
<view class="no-data-wrap v12-justify-center v12-mt-6">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/微信图片_20241009220552.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getRank, getFoods, getRecipe } from "@/api/health";
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
foodItems: [],
|
||||||
|
recommendItems: [],
|
||||||
|
cityId: "",
|
||||||
|
cityName: "",
|
||||||
|
keyword: "",
|
||||||
|
rank: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.cityId = opts.city;
|
||||||
|
this.cityName = decodeURIComponent(opts.cityName);
|
||||||
|
this.getRank();
|
||||||
|
this.getList();
|
||||||
|
this.getRecipeList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toGoods(id) {
|
||||||
|
this.$yrouter.push({
|
||||||
|
path: "/pages/shop/GoodsCon/index",
|
||||||
|
query: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
toSanctun() {
|
||||||
|
uni.redirectTo({
|
||||||
|
url:
|
||||||
|
"/pkg_product/views/healthSanctum?city=" +
|
||||||
|
this.cityId +
|
||||||
|
"&cityName=" +
|
||||||
|
this.cityName,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getRecipeList() {
|
||||||
|
getRecipe().then((res) => {
|
||||||
|
// console.log(res);
|
||||||
|
this.foodItems = res.data.records;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
toDetails(id) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: "/pkg_product/views/healthFoodDetails?id=" + id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getRank() {
|
||||||
|
let params = {
|
||||||
|
goodCityId: this.cityId,
|
||||||
|
};
|
||||||
|
getRank(params).then((res) => {
|
||||||
|
this.rank = res.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
const params = {
|
||||||
|
goodCityId: this.cityId,
|
||||||
|
keyword: this.keyword,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999,
|
||||||
|
};
|
||||||
|
getFoods(params).then((res) => {
|
||||||
|
this.recommendItems = res.data.records;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
search() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.arrow-icon {
|
||||||
|
width: 25rpx;
|
||||||
|
height: 25rpx;
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
width: 30rpx;
|
||||||
|
height: 30rpx;
|
||||||
|
}
|
||||||
|
.rank2-bg {
|
||||||
|
background-color: #ecdad6 !important;
|
||||||
|
}
|
||||||
|
.rank3-bg {
|
||||||
|
background-color: #dae3f3 !important;
|
||||||
|
}
|
||||||
|
.rank3-3-bg {
|
||||||
|
background-color: #c8c8c8 !important;
|
||||||
|
}
|
||||||
|
.rank2-2-bg {
|
||||||
|
background-color: #d3b9b2 !important;
|
||||||
|
}
|
||||||
|
.rank2-4-bg {
|
||||||
|
background-color: #ad8578 !important;
|
||||||
|
}
|
||||||
|
.rank3-4-bg {
|
||||||
|
background-color: #a5a5a5 !important;
|
||||||
|
}
|
||||||
|
.rank-2 {
|
||||||
|
width: 40rpx; /* 宽度 */
|
||||||
|
height: 45rpx; /* 高度,根据正六边形的几何特性计算 */
|
||||||
|
background-color: #ddc76f; /* 背景颜色 */
|
||||||
|
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.rank-3 {
|
||||||
|
width: 30rpx; /* 宽度 */
|
||||||
|
height: 35rpx; /* 高度,根据正六边形的几何特性计算 */
|
||||||
|
background-color: #ad9161; /* 背景颜色 */
|
||||||
|
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.rank-4 {
|
||||||
|
width: 25rpx; /* 宽度 */
|
||||||
|
height: 28rpx; /* 高度,根据正六边形的几何特性计算 */
|
||||||
|
background-color: #fff3c2; /* 背景颜色 */
|
||||||
|
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.ys-btn {
|
||||||
|
background: #e2d7c3;
|
||||||
|
}
|
||||||
|
.cart-img {
|
||||||
|
width: 48rpx;
|
||||||
|
height: 48rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.bg-img {
|
||||||
|
position: absolute;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.recommends {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
grid-column-gap: 20rpx;
|
||||||
|
grid-row-gap: 20rpx;
|
||||||
|
}
|
||||||
|
.recommend-img {
|
||||||
|
width: 344rpx;
|
||||||
|
height: 344rpx;
|
||||||
|
background: #333;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.name-wrap {
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
width: 100%;
|
||||||
|
padding: 8px 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 70rpx;
|
||||||
|
}
|
||||||
|
.recommend-item {
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.recommend-title {
|
||||||
|
position: relative;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
.slider {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
#c52733 0%,
|
||||||
|
rgba(255, 255, 255, 0) 100%
|
||||||
|
);
|
||||||
|
border-radius: 6rpx;
|
||||||
|
bottom: 5rpx;
|
||||||
|
}
|
||||||
|
.rank-wrap {
|
||||||
|
background: #e2bc8d;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.rank-tag {
|
||||||
|
width: 50rpx; /* 宽度 */
|
||||||
|
height: 55rpx; /* 高度,根据正六边形的几何特性计算 */
|
||||||
|
background-color: #fbeeb7; /* 背景颜色 */
|
||||||
|
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 20rpx;
|
||||||
|
line-height: 55rpx;
|
||||||
|
top: -22.5rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.rank-img {
|
||||||
|
min-width: 104rpx;
|
||||||
|
width: 104rpx;
|
||||||
|
height: 104rpx;
|
||||||
|
background: #666;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.bee-rank,
|
||||||
|
.drug-rank {
|
||||||
|
width: 100%;
|
||||||
|
background: #999;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.rank-title-wrap {
|
||||||
|
height: 140rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.rank-title {
|
||||||
|
width: 200rpx;
|
||||||
|
padding: 10rpx 5rpx;
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
#ffffff 0%,
|
||||||
|
rgba(255, 255, 255, 0) 100%
|
||||||
|
);
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
.rank-items-wrap {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
grid-column-gap: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.rank-item {
|
||||||
|
width: 100%;
|
||||||
|
height: 116rpx;
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 0 10rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.title-img {
|
||||||
|
width: 404rpx;
|
||||||
|
}
|
||||||
|
.health-foods {
|
||||||
|
min-height: 100vh;
|
||||||
|
background-color: #faeed8;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.flex-1 {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.swap {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.trave-item-wrap {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.trave-btn {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
bottom: 30rpx;
|
||||||
|
text-align: center;
|
||||||
|
width: 212rpx;
|
||||||
|
background: rgba(255, 255, 255, 0.7);
|
||||||
|
border-radius: 60rpx;
|
||||||
|
font-size: 28rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.trave-item {
|
||||||
|
width: 382rpx;
|
||||||
|
height: 272rpx;
|
||||||
|
background: rgba(230, 178, 178, 0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,20 +1,26 @@
|
|||||||
<template>
|
<template>
|
||||||
<view class="pkg-product-list">
|
<view class="pkg-product-list">
|
||||||
<view class="first-half">
|
<view class="first-half">
|
||||||
<view class="search-box flex jc-between ai-center">
|
<view class="v12-px-3 v12-mb-4">
|
||||||
<input
|
<!-- <image
|
||||||
v-model="keyword"
|
|
||||||
type="text"
|
|
||||||
placeholder="搜索内容"
|
|
||||||
placeholder-style="color:#949494"
|
|
||||||
@confirm="searchClick"
|
|
||||||
>
|
|
||||||
<image
|
|
||||||
:src="webUrl+'/20220903142935869059.png'"
|
:src="webUrl+'/20220903142935869059.png'"
|
||||||
class="icon"
|
class="icon v12-mr-3"
|
||||||
mode="scaleToFill"
|
mode="scaleToFill"
|
||||||
@click="searchClick"
|
@click="searchClick"
|
||||||
/>
|
/>
|
||||||
|
<input
|
||||||
|
v-model="keyword"
|
||||||
|
type="text"
|
||||||
|
placeholder-style="color:#949494"
|
||||||
|
@confirm="searchClick"
|
||||||
|
> -->
|
||||||
|
<u-search
|
||||||
|
:showAction="false"
|
||||||
|
v-model="keyword"
|
||||||
|
bgColor="#f2f2f2"
|
||||||
|
placeholder="搜索城市"
|
||||||
|
searchIconColor="#C52733"
|
||||||
|
@search="searchClick"></u-search>
|
||||||
</view>
|
</view>
|
||||||
<swiper
|
<swiper
|
||||||
v-if="bannerList.length > 0"
|
v-if="bannerList.length > 0"
|
||||||
@@ -30,13 +36,13 @@
|
|||||||
:key="index"
|
:key="index"
|
||||||
>
|
>
|
||||||
<image
|
<image
|
||||||
:src="item.pic"
|
:src="item.image"
|
||||||
mode="scaleToFill"
|
mode="scaleToFill"
|
||||||
@click="$global.commonJump(item.uniappUrl)"
|
@click="toExpo(item.exhibitionId)"
|
||||||
/>
|
/>
|
||||||
</swiper-item>
|
</swiper-item>
|
||||||
</swiper>
|
</swiper>
|
||||||
<view
|
<!-- <view
|
||||||
v-show="tabIndex === 0"
|
v-show="tabIndex === 0"
|
||||||
class="tab-box flex jc-center ai-center"
|
class="tab-box flex jc-center ai-center"
|
||||||
>
|
>
|
||||||
@@ -65,6 +71,14 @@
|
|||||||
class="active"
|
class="active"
|
||||||
@click="changeTab(1)"
|
@click="changeTab(1)"
|
||||||
/>
|
/>
|
||||||
|
</view> -->
|
||||||
|
<view class="v12-justify-start v12-align-center news-wrap v12-radius-100">
|
||||||
|
<view class="v12-font-bold v12-primary v12-white-text v12-mr-2 v12-pa-2 v12-radius-100 news-title">最新展会</view>
|
||||||
|
<swiper vertical class="text-swpier " autoplay circular duration="500" interval="3000" >
|
||||||
|
<swiper-item v-for="(item, index) in sanctum" :key="index" class="v12-align-center" @click="toExpo(item.id)">
|
||||||
|
<text class="v12-font-28 v12-dark-text one-t" >{{ item.name }}</text>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="body-box">
|
<view class="body-box">
|
||||||
@@ -72,50 +86,51 @@
|
|||||||
<view
|
<view
|
||||||
v-for="(item, index) in asideList"
|
v-for="(item, index) in asideList"
|
||||||
:key="index"
|
:key="index"
|
||||||
:class="index === asideIndex ? 'active' : ''"
|
:class="index === asideIndex ? 'actived' : ''"
|
||||||
class="item flex jc-center ai-center"
|
class="item flex jc-center ai-center "
|
||||||
@click="asideTap(index)"
|
@click="asideTap(index, item.label)"
|
||||||
>
|
>
|
||||||
<text class="one-t">{{ item.label }}</text>
|
<text class="one-t">{{ item.label }}</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="article-box">
|
<view class="article-box">
|
||||||
<scroll-view
|
<view class="v12-mt-2 v12-ml-3 v12-px-1 v12-font-28 v12-dark-text v12-font-bold label-wrap">{{ label }}</view>
|
||||||
v-if="dataList.length > 0"
|
<scroll-view
|
||||||
:style="{'height':listHeight}"
|
v-if="dataList.length > 0"
|
||||||
:enable-flex="true"
|
:style="{'height':listHeight}"
|
||||||
:scroll-anchoring="true"
|
:enable-flex="true"
|
||||||
:scroll-y="true"
|
:scroll-anchoring="true"
|
||||||
:scroll-with-animation="true"
|
:scroll-y="true"
|
||||||
:enable-back-to-top="true"
|
:scroll-with-animation="true"
|
||||||
class="list flex flex-wrap"
|
:enable-back-to-top="true"
|
||||||
@scrolltolower="onLower"
|
class="list flex flex-wrap"
|
||||||
>
|
@scrolltolower="onLower"
|
||||||
|
>
|
||||||
<view
|
<view
|
||||||
v-for="(item, index) in dataList"
|
v-for="(item, index) in dataList"
|
||||||
:key="index"
|
:key="index"
|
||||||
>
|
>
|
||||||
<view
|
<view
|
||||||
v-if="tabIndex === 0"
|
v-if="tabIndex === 0"
|
||||||
class="item item-store"
|
class="city-item"
|
||||||
@click="goStore(item.id)"
|
@click="goStore(item.id, item.cityName)"
|
||||||
>
|
>
|
||||||
<image
|
<image
|
||||||
:src="item.cover + (item.coverType === 2 ? '?vframe/jpg/offset/1' : '')"
|
:src="item.icon"
|
||||||
class="cover"
|
class="cover"
|
||||||
mode="scaleToFill"
|
mode="scaleToFill"
|
||||||
/>
|
/>
|
||||||
<view class="name one-t">{{ item.content }}</view>
|
<!-- <view class="name one-t">{{ item.content }}</view> -->
|
||||||
<view class="price store flex ai-center" style="width: 100%;">
|
<view class="store flex ai-center" style="width: 100%;">
|
||||||
<image
|
<!-- <image
|
||||||
:src="item.logo"
|
:src="item.logo"
|
||||||
class="flex-0"
|
class="flex-0"
|
||||||
mode="scaleToFill"
|
mode="scaleToFill"
|
||||||
/>
|
/> -->
|
||||||
<view class="one-t">{{ item.name }}</view>
|
<view class="one-t v12-font-28 v12-mt-3" style="color: #033333">{{ item.cityName }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view
|
<!-- <view
|
||||||
v-else
|
v-else
|
||||||
class="item"
|
class="item"
|
||||||
@click="goGoods(item.id)"
|
@click="goGoods(item.id)"
|
||||||
@@ -127,7 +142,7 @@
|
|||||||
/>
|
/>
|
||||||
<view class="name more-t">{{ item.storeName }}</view>
|
<view class="name more-t">{{ item.storeName }}</view>
|
||||||
<view class="price">¥{{ item.price }}</view>
|
<view class="price">¥{{ item.price }}</view>
|
||||||
</view>
|
</view> -->
|
||||||
</view>
|
</view>
|
||||||
</scroll-view>
|
</scroll-view>
|
||||||
<view class="tc" v-else>
|
<view class="tc" v-else>
|
||||||
@@ -153,6 +168,7 @@
|
|||||||
// 康养食材
|
// 康养食材
|
||||||
import { fetchCity } from '@/api/wenwan'
|
import { fetchCity } from '@/api/wenwan'
|
||||||
import { wellnessFood, wellnessPlaceList } from '@/api/product'
|
import { wellnessFood, wellnessPlaceList } from '@/api/product'
|
||||||
|
import { getWellnessPlace, getWellnessExhibition, getBanner } from '@/api/health'
|
||||||
import { getProducts } from '@/api/store'
|
import { getProducts } from '@/api/store'
|
||||||
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
import { pageListenMixins } from '@/mixins/pageListenMixins'
|
||||||
export default {
|
export default {
|
||||||
@@ -169,7 +185,9 @@ export default {
|
|||||||
asideList: [],
|
asideList: [],
|
||||||
asideIndex: 0,
|
asideIndex: 0,
|
||||||
dataList: [],
|
dataList: [],
|
||||||
pageKeyId: Object.freeze('wellnessFoodIndex')
|
pageKeyId: Object.freeze('wellnessFoodIndex'),
|
||||||
|
label: '',
|
||||||
|
sanctum: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
@@ -177,13 +195,23 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
init() {
|
init() {
|
||||||
wellnessFood().then(({data}) => {
|
getBanner().then(({data}) => {
|
||||||
this.bannerList = data.banner
|
this.bannerList = data
|
||||||
})
|
})
|
||||||
fetchCity(4).then(({data}) => {
|
fetchCity(4).then(({data}) => {
|
||||||
this.asideList = data.group
|
this.asideList = data.group
|
||||||
|
this.label = this.asideList[this.asideIndex].label
|
||||||
this.searchReq()
|
this.searchReq()
|
||||||
})
|
})
|
||||||
|
getWellnessExhibition().then(({data}) => {
|
||||||
|
this.sanctum = data.records
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toExpo(id) {
|
||||||
|
if(!id) return
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pkg_product/views/expoDetails?id=' + id
|
||||||
|
})
|
||||||
},
|
},
|
||||||
changeTab(index) {
|
changeTab(index) {
|
||||||
if (this.asideList.length === 0) return
|
if (this.asideList.length === 0) return
|
||||||
@@ -198,8 +226,25 @@ export default {
|
|||||||
this.searchReq()
|
this.searchReq()
|
||||||
},
|
},
|
||||||
searchClick() {
|
searchClick() {
|
||||||
this.page = 1
|
// this.page = 1
|
||||||
this.searchReq()
|
// this.searchReq()
|
||||||
|
const searchMap = this.asideList.map((e, i) => {
|
||||||
|
return e.city.map(_e => {
|
||||||
|
return {
|
||||||
|
index: i,
|
||||||
|
..._e
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).flat()
|
||||||
|
// console.log(searchMap);
|
||||||
|
const filterMap = searchMap.filter(el => el.cityName.includes(this.keyword))
|
||||||
|
if(filterMap.length === 0) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
this.asideIndex = filterMap[0].index
|
||||||
|
this.searchReq()
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
searchReq() {
|
searchReq() {
|
||||||
let param = {
|
let param = {
|
||||||
@@ -209,15 +254,18 @@ export default {
|
|||||||
provinceId: this.asideList.length > 0 ? this.asideList[this.asideIndex].provinceId : ''
|
provinceId: this.asideList.length > 0 ? this.asideList[this.asideIndex].provinceId : ''
|
||||||
}
|
}
|
||||||
if (this.tabIndex === 0) {
|
if (this.tabIndex === 0) {
|
||||||
wellnessPlaceList(param).then(({data}) => {
|
// wellnessPlaceList(param).then(({data}) => {
|
||||||
this.handleData(data)
|
// this.handleData(data)
|
||||||
})
|
// })
|
||||||
} else {
|
this.label = this.asideList[this.asideIndex].label
|
||||||
param.isWellnessFood = 1
|
this.dataList = this.asideList[this.asideIndex].city
|
||||||
getProducts(param).then(({data}) => {
|
|
||||||
this.handleData(data)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
// else {
|
||||||
|
// param.isWellnessFood = 1
|
||||||
|
// getProducts(param).then(({data}) => {
|
||||||
|
// this.handleData(data)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
},
|
},
|
||||||
handleData(data) {
|
handleData(data) {
|
||||||
const that = this
|
const that = this
|
||||||
@@ -239,15 +287,16 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
asideTap(index) {
|
asideTap(index, label) {
|
||||||
this.asideIndex = index
|
this.asideIndex = index
|
||||||
this.page = 1
|
this.page = 1
|
||||||
this.dataList = []
|
this.dataList = []
|
||||||
|
this.label = label
|
||||||
this.searchReq()
|
this.searchReq()
|
||||||
},
|
},
|
||||||
goStore(id) {
|
goStore(id, name) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pagesInn/inn/innHome?id=' + id + '&from=wellness'
|
url: '/pkg_product/views/healthSanctum?city=' + id +'&cityName=' + name
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
goGoods(id) {
|
goGoods(id) {
|
||||||
@@ -261,6 +310,32 @@ export default {
|
|||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
@import "@/assets/css/product.less";
|
@import "@/assets/css/product.less";
|
||||||
|
.text-swpier{
|
||||||
|
height: 60rpx;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.cover{
|
||||||
|
width: 160rpx !important;
|
||||||
|
height: 160rpx !important;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
}
|
||||||
|
.city-item{
|
||||||
|
width: 160rpx !important;
|
||||||
|
margin: 30rpx 0rpx 0rpx 20rpx;
|
||||||
|
}
|
||||||
|
.news-title{
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.actived, .label-wrap{
|
||||||
|
border-left: 6rpx solid #C52733;
|
||||||
|
color: #C52733;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.news-wrap{
|
||||||
|
background: rgba(233,233,233,0.39);
|
||||||
|
width: 686rpx;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
.pkg-product-list {
|
.pkg-product-list {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
|
|||||||
@@ -0,0 +1,261 @@
|
|||||||
|
<template>
|
||||||
|
<view class="sanctum-wrap">
|
||||||
|
<view class="v12-justify-center">
|
||||||
|
<view class="v12-mr-3 v12-radius-100 v12-primary v12-white-text v12-px-5 v12-py-2 v12-font-28 v12-font-bold">养生圣地</view>
|
||||||
|
<view class="v12-radius-100 v12-grey v12-dark-text v12-px-5 v12-py-2 v12-font-28 v12-font-bold" @click="toFoods">养生食材</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-between v12-align-center v12-mt-5">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/map_dark.png'"
|
||||||
|
mode="widthFix"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
|
<view class="v12-font-28 v12-secondary-dark-text v12-mr-3">{{ cityName }}</view>
|
||||||
|
<view class="flex-1" @click="search">
|
||||||
|
<u-search searchIconColor="#C52733" :disabled="true" :showAction="false" v-model="keyword" ></u-search>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<swiper v-if="traveItems.length > 0" class="v12-justify-between swap" autoplay circular next-margin="300rpx" duration="10000" interval="3000" >
|
||||||
|
<swiper-item v-for="(item, index) in traveItems" :key="index" >
|
||||||
|
<view class="trave-item v12-mr-3 v12-mt-3">
|
||||||
|
<view class="trave-item">
|
||||||
|
<image class="trave-item" :src="item.cover" v-if="item.coverType === 1"></image>
|
||||||
|
<video class="trave-item" :src="item.cover" :show-fullscreen-btn="false" :show-center-play-btn="flase" :show-play-btn="false" v-if="item.coverType === 2"></video>
|
||||||
|
</view>
|
||||||
|
<view class="trave-btn" @click="toStore(item.hotelId)">
|
||||||
|
<text>旅居预约</text>
|
||||||
|
<image :src="webUrl + '/orderIcon/arrow.png'" class="arrow-icon v12-ml-1"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
<view class="v12-justify-between v12-align-center v12-px-3 v12-mt-3 tabs-wrap">
|
||||||
|
<view
|
||||||
|
class="tab v12-font-34 v12-dark-text v12-mr-5"
|
||||||
|
v-for="(tab, index) in tabs"
|
||||||
|
@click="handleTab(index,tab)"
|
||||||
|
:class="{'v12-font-bold' : index === actived}"
|
||||||
|
:key="index">
|
||||||
|
<text>{{ tab.name }}</text>
|
||||||
|
<view :class="{'slider': index === actived}"></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-justify-between sanctup-items v12-mt-3">
|
||||||
|
<view v-for="(item, index) in items" :key="index" class="v12-pa-1" @click="toStore(item.hotelId)">
|
||||||
|
<view class="img">
|
||||||
|
<image class="img" :src="item.cover" v-if="item.coverType === 1"></image>
|
||||||
|
<video
|
||||||
|
class="img"
|
||||||
|
:src="item.cover"
|
||||||
|
:play-btn-position="center"
|
||||||
|
:show-fullscreen-btn="false"
|
||||||
|
:show-center-play-btn="flase"
|
||||||
|
:show-play-btn="false"
|
||||||
|
:controls="false"
|
||||||
|
v-if="item.coverType === 2">
|
||||||
|
</video>
|
||||||
|
<view class="v12-white-text address">
|
||||||
|
<image
|
||||||
|
class="map-icon v12-mr-1"
|
||||||
|
:src="webUrl + '/orderIcon/map_white.png'"
|
||||||
|
></image>
|
||||||
|
<text class="v12-font-28">{{ item.areaName }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-font-bold v12-font-28 v12-mt-1 more-t desc-txt">{{ item.content }}</view>
|
||||||
|
<view class="v12-justify-start v12-align-center v12-my-1">
|
||||||
|
<view class="atr">
|
||||||
|
<image class="atr" :src="item.logo"></image>
|
||||||
|
</view>
|
||||||
|
<view class="v12-font-26 v12-ml-2 v12-dark-text one-t">{{ item.hotelName }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="items.length === 0" class="v12-justify-center v12-mt-6">
|
||||||
|
<view class="no-data-wrap">
|
||||||
|
<image :src="webUrl + '/orderIcon/微信图片_20241009220552.png'" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getCategory,getWellnessPlace } from '@/api/health'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
tabs: [],
|
||||||
|
items: [],
|
||||||
|
traveItems: [],
|
||||||
|
actived: 0,
|
||||||
|
cityId: '',
|
||||||
|
cityName: '',
|
||||||
|
categoryId: null,
|
||||||
|
keyword: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.cityId = opts.city
|
||||||
|
this.cityName = decodeURIComponent(decodeURIComponent(opts.cityName))
|
||||||
|
getCategory().then(res => {
|
||||||
|
this.tabs = res.data
|
||||||
|
this.categoryId = res.data[0].id
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
this.getTop()
|
||||||
|
},
|
||||||
|
onUnload() {
|
||||||
|
// uni.navigateBack({
|
||||||
|
// delta: 0
|
||||||
|
// })
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleTab(index, tab) {
|
||||||
|
this.actived = index
|
||||||
|
this.categoryId = tab.id
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
toFoods() {
|
||||||
|
uni.redirectTo({
|
||||||
|
url: '/pkg_product/views/healthFoods?city=' + this.cityId + '&cityName=' + this.cityName
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
const params = {
|
||||||
|
goodCityId: this.cityId,
|
||||||
|
categoryId: this.categoryId,
|
||||||
|
keyword: this.keyword,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999
|
||||||
|
}
|
||||||
|
getWellnessPlace(params).then(res => {
|
||||||
|
// console.log(res);
|
||||||
|
this.items = res.data.records
|
||||||
|
})
|
||||||
|
},
|
||||||
|
search() {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pkg_product/views/healthSearch?city=' + this.cityId + '&cityName=' + this.cityName
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getTop() {
|
||||||
|
const params = {
|
||||||
|
goodCityId: this.cityId,
|
||||||
|
categoryId: 0,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999
|
||||||
|
}
|
||||||
|
getWellnessPlace(params).then(res => {
|
||||||
|
// console.log(res);
|
||||||
|
this.traveItems = res.data.records
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toStore(id) {
|
||||||
|
this.$yrouter.push({
|
||||||
|
path: '/pagesInn/inn/innHome',
|
||||||
|
query: {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.tabs-wrap{
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: scroll;
|
||||||
|
.tab:last-child{
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.map-icon{
|
||||||
|
width: 28rpx;
|
||||||
|
height: 28rpx;
|
||||||
|
}
|
||||||
|
.arrow-icon{
|
||||||
|
width: 25rpx;
|
||||||
|
height: 25rpx;
|
||||||
|
}
|
||||||
|
.icon{
|
||||||
|
width: 30rpx;
|
||||||
|
height: 30rpx;
|
||||||
|
}
|
||||||
|
.flex-1{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.swap{
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
.trave-item-wrap{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.trave-btn{
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
bottom: 30rpx;
|
||||||
|
text-align: center;
|
||||||
|
width: 212rpx;
|
||||||
|
background: rgba(255,255,255,0.7);
|
||||||
|
border-radius: 60rpx;
|
||||||
|
font-size: 28rpx;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
}
|
||||||
|
.trave-item{
|
||||||
|
width: 382rpx;
|
||||||
|
height: 272rpx;
|
||||||
|
background: rgba(230,178,178,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.desc-txt {
|
||||||
|
height: 78rpx;
|
||||||
|
line-height: 40rpx;
|
||||||
|
}
|
||||||
|
.address{
|
||||||
|
position: absolute;
|
||||||
|
left: 30rpx;
|
||||||
|
bottom: 30rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.sanctup-items{
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 50% 50%;
|
||||||
|
}
|
||||||
|
.atr{
|
||||||
|
width: 52rpx;
|
||||||
|
height: 52rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.img{
|
||||||
|
width: 320rpx;
|
||||||
|
height: 320rpx;
|
||||||
|
// background: #707070;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.sanctum-wrap{
|
||||||
|
min-height: 100vh;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20rpx ;
|
||||||
|
}
|
||||||
|
.tab{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.slider{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 6rpx;
|
||||||
|
background: linear-gradient(to right, #C52733 0%, rgba(255,255,255,0) 100%);
|
||||||
|
border-radius: 6rpx;
|
||||||
|
bottom: 5rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
<template>
|
||||||
|
<view class="search-page">
|
||||||
|
<view class="v12-mr-3">
|
||||||
|
<u-search searchIconColor="#C52733" :showAction="false" v-model="keyword" @search="search"></u-search>
|
||||||
|
</view>
|
||||||
|
<view v-if="isSearch" class="search-res-wrap">
|
||||||
|
<view class="v12-justify-between sanctup-items v12-mt-3">
|
||||||
|
<view v-for="(item, index) in items" :key="index" class="v12-pa-1" @click="toStore(item.hotelId)">
|
||||||
|
<view class="img">
|
||||||
|
<image class="img" :src="item.cover" v-if="item.coverType === 1"></image>
|
||||||
|
<video
|
||||||
|
class="img"
|
||||||
|
:src="item.cover"
|
||||||
|
:play-btn-position="center"
|
||||||
|
:show-fullscreen-btn="false"
|
||||||
|
:show-play-btn="false"
|
||||||
|
:show-center-play-btn="flase"
|
||||||
|
v-if="item.coverType === 2">
|
||||||
|
</video>
|
||||||
|
<view class="v12-white-text address">
|
||||||
|
<image
|
||||||
|
class="map-icon v12-mr-1"
|
||||||
|
:src="webUrl + '/orderIcon/map_white.png'"
|
||||||
|
></image>
|
||||||
|
<text class="v12-font-28">{{ item.areaName }}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-font-bold v12-font-28 v12-mt-1 more-t desc-txt">{{ item.content }}</view>
|
||||||
|
<view class="v12-justify-start v12-align-center v12-my-1">
|
||||||
|
<view class="atr">
|
||||||
|
<image class="atr" :src="item.logo"></image>
|
||||||
|
</view>
|
||||||
|
<view class="v12-font-26 v12-ml-2 v12-dark-text one-t">{{ item.hotelName }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="items.length === 0 && keyword" class="v12-justify-center v12-mt-16">
|
||||||
|
<view class="no-data-wrap">
|
||||||
|
<image :src="webUrl + '/orderIcon/微信图片_20241009220552.png'" mode="widthFix"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getCategory,getWellnessPlace } from '@/api/health'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
keyword: '',
|
||||||
|
goodCityId: '',
|
||||||
|
isSearch: false,
|
||||||
|
items: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.goodCityId = opts.city
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
search() {
|
||||||
|
const params = {
|
||||||
|
goodCityId: this.goodCityId,
|
||||||
|
categoryId: '',
|
||||||
|
keyword: this.keyword,
|
||||||
|
page: 1,
|
||||||
|
limit: 9999
|
||||||
|
}
|
||||||
|
getWellnessPlace(params).then(res => {
|
||||||
|
this.items = res.data.records
|
||||||
|
}).finally(() => {
|
||||||
|
this.isSearch = true
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toStore(id) {
|
||||||
|
this.$yrouter.push({
|
||||||
|
path: '/pagesInn/inn/innHome',
|
||||||
|
query: {
|
||||||
|
id: id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.map-icon{
|
||||||
|
width: 28rpx;
|
||||||
|
height: 28rpx;
|
||||||
|
}
|
||||||
|
.arrow-icon{
|
||||||
|
width: 25rpx;
|
||||||
|
height: 25rpx;
|
||||||
|
}
|
||||||
|
.icon{
|
||||||
|
width: 30rpx;
|
||||||
|
height: 30rpx;
|
||||||
|
}
|
||||||
|
.address{
|
||||||
|
position: absolute;
|
||||||
|
left: 30rpx;
|
||||||
|
bottom: 30rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.desc-txt {
|
||||||
|
height: 78rpx;
|
||||||
|
line-height: 40rpx;
|
||||||
|
}
|
||||||
|
.search-page{
|
||||||
|
min-height: 100vh;
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.sanctup-items{
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 50% 50%;
|
||||||
|
}
|
||||||
|
.img{
|
||||||
|
width: 320rpx;
|
||||||
|
height: 320rpx;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.atr{
|
||||||
|
width: 52rpx;
|
||||||
|
height: 52rpx;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -42,19 +42,22 @@ export default {
|
|||||||
goDetails(item) {
|
goDetails(item) {
|
||||||
if (!item.isLink) return
|
if (!item.isLink) return
|
||||||
// 1-视频,2-图文(可配置商品),3-商品+视频
|
// 1-视频,2-图文(可配置商品),3-商品+视频
|
||||||
if (item.type === 1) {
|
uni.navigateTo({
|
||||||
uni.navigateTo({
|
url: '/pkg_product/views/heritage/index?id=' + item.id
|
||||||
url: '/pkg_product/views/heritageVideo?id=' + item.id
|
})
|
||||||
})
|
// if (item.type === 1) {
|
||||||
} else if (item.type === 2) {
|
// uni.navigateTo({
|
||||||
uni.navigateTo({
|
// url: '/pkg_product/views/heritage/index?id=' + item.id
|
||||||
url: '/pkg_product/views/heritageGoods?id=' + item.id
|
// })
|
||||||
})
|
// } else if (item.type === 2) {
|
||||||
} else if (item.type === 3) {
|
// uni.navigateTo({
|
||||||
uni.navigateTo({
|
// url: '/pkg_product/views/heritage/index?id=' + item.id
|
||||||
url: '/pkg_product/views/heritageGoodAndVideo?id=' + item.id
|
// })
|
||||||
})
|
// } else if (item.type === 3) {
|
||||||
}
|
// uni.navigateTo({
|
||||||
|
// url: '/pkg_product/views/heritage/index?id=' + item.id
|
||||||
|
// })
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -67,14 +70,27 @@ export default {
|
|||||||
<image style="width: 100%" :src="backgroundImage" mode="widthFix"/>
|
<image style="width: 100%" :src="backgroundImage" mode="widthFix"/>
|
||||||
<view class="item" :style="{'left':item.gx+'rpx','top':item.gy+'rpx'}" v-for="(item,index) in contents"
|
<view class="item" :style="{'left':item.gx+'rpx','top':item.gy+'rpx'}" v-for="(item,index) in contents"
|
||||||
:key="index" @click="goDetails(item)">
|
:key="index" @click="goDetails(item)">
|
||||||
<image class="img-item" :src="item.image"/>
|
<image class="img-item" :src="item.image" :class="{'unlink': !item.isLink}"/>
|
||||||
<view class="title flex jc-center">{{ item.title }}</view>
|
<view
|
||||||
|
class=" v12-text-center v12-white-text v12-radius-80 v12-px-1 title"
|
||||||
|
:class="{
|
||||||
|
'v12-primary': item.isLink,
|
||||||
|
'un-actived': !item.isLink
|
||||||
|
}">
|
||||||
|
{{ item.title }}</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
|
.unlink{
|
||||||
|
filter: grayscale(100%);
|
||||||
|
}
|
||||||
|
.un-actived{
|
||||||
|
background: #494949 !important;
|
||||||
|
background-color: #494949 !important;
|
||||||
|
}
|
||||||
.pkg-product-heritage {
|
.pkg-product-heritage {
|
||||||
image {
|
image {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
@@ -87,10 +103,12 @@ export default {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 160rpx;
|
width: 160rpx;
|
||||||
font-size: 24rpx;
|
font-size: 24rpx;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
.title {
|
.title {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: fit-content;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,231 @@
|
|||||||
|
<template>
|
||||||
|
<view class="details">
|
||||||
|
<view class="top-img">
|
||||||
|
<video class="top-img" :show-fullscreen-btn="false" autoplay play-btn-position="center" :src="details.video"></video>
|
||||||
|
</view>
|
||||||
|
<view class="title-img">
|
||||||
|
<view class="img-wrap">
|
||||||
|
<view class="v12-align-center">
|
||||||
|
<image class="left-img" :src="webUrl + '/orderIcon/左.png'"></image>
|
||||||
|
<view class="v12-align-center text-img-wrap">
|
||||||
|
<image :src="webUrl + '/orderIcon/中.png'"></image>
|
||||||
|
<view class="v12-font-36 d-title">{{ details.name }}</view>
|
||||||
|
</view>
|
||||||
|
<image class="left-img" :src="webUrl + '/orderIcon/右.png'"></image>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-font-26 v12-font-bold v12-dark-text intro-text">{{ details.intro }}</view>
|
||||||
|
</view>
|
||||||
|
<view class="tabs v12-my-3 v12-font-32 v12-font-bold">
|
||||||
|
<view class="tab-btn" :class="{ 'v12-primary': actived === 1, 'v12-white-text': actived === 1 }" @click="handleTab(1)">{{details.pageA.title}}</view>
|
||||||
|
<view class="tab-btn v12-ml-3" :class="{ 'v12-primary': actived === 2, 'v12-white-text': actived === 2 }" @click="handleTab(2)">{{details.pageB.title}}</view>
|
||||||
|
</view>
|
||||||
|
<view class="pageA" v-show="actived === 1">
|
||||||
|
<view class="intro" style="white-space: break-spaces;">
|
||||||
|
{{ details.pageA.content }}
|
||||||
|
</view>
|
||||||
|
<view class="v12-d-grid-columns-2 card-wrap v12-mt-3" v-if="details.pageA && details.pageA.images.length > 0">
|
||||||
|
<view class="card-item" v-for="(item, i) in details.pageA.images" :key="i" @click="viewImg(item)">
|
||||||
|
<image class="card-item-img" :src="item.image" mode="aspectFit|aspectFill|widthFix" lazy-load="false"></image>
|
||||||
|
<view class="v12-justify-center">
|
||||||
|
《
|
||||||
|
<view class="one-t p-name">
|
||||||
|
{{ item.imageText }}
|
||||||
|
</view>
|
||||||
|
》
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-else>
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="img-nodata"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="pageB" v-if="actived === 2">
|
||||||
|
<view class="v12-d-grid-columns-2 card-wrap v12-mt-3">
|
||||||
|
<!-- -->
|
||||||
|
<view class="card-item v12-white v12-radius-20 column-flex" v-for="(item, index) in details.pageB.hotels" :key="index" @click="toStore(item)">
|
||||||
|
<view>
|
||||||
|
<image class="card-item-img" :src="item.cover" mode="aspectFit|aspectFill|widthFix" lazy-load="false"></image>
|
||||||
|
<view class="more-t v12-font-28 v12-font-bold v12-px-2">
|
||||||
|
{{ item.content || '' }}
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="card-footer v12-pa-2">
|
||||||
|
<image class="footer-logo v12-mr-3" :src="item.logo" mode="aspectFit|aspectFill|widthFix" lazy-load="false"> </image>
|
||||||
|
<view class="v12-font-28 one-t name">{{ item.hotelName }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
</view>
|
||||||
|
<view v-if="details.pageB && details.pageB.hotels.length === 0">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="img-nodata"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getIchContent } from '@/api/heritage'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
actived: 1,
|
||||||
|
id: '',
|
||||||
|
details: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.id = opts.id
|
||||||
|
this.getDetails()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
viewImg(item) {
|
||||||
|
uni.previewImage({
|
||||||
|
current: item.image, // 当前显示图片的http链接
|
||||||
|
urls: this.details.pageA.images.map(e => e.image) // 需要预览的图片http链接列表
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleTab(index) {
|
||||||
|
this.actived = index
|
||||||
|
},
|
||||||
|
getDetails() {
|
||||||
|
getIchContent(this.id).then(res => {
|
||||||
|
this.details = res.data || {}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
toStore(item) {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pagesInn/inn/innHome?id=' + item.hotelId
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.column-flex {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
.intro-text{
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 20rpx;
|
||||||
|
}
|
||||||
|
.text-img-wrap{
|
||||||
|
width: fit-content;
|
||||||
|
position: relative;
|
||||||
|
image{
|
||||||
|
width: 100%;
|
||||||
|
height: 70rpx;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.img-wrap{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.left-img{
|
||||||
|
height: 70rpx;
|
||||||
|
width: 60rpx;
|
||||||
|
}
|
||||||
|
.d-title{
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
line-height: 70rpx;
|
||||||
|
}
|
||||||
|
.p-name{
|
||||||
|
max-width: 200rpx;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.card-footer{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.name{
|
||||||
|
width: 200rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.footer-logo{
|
||||||
|
width: 60rpx;
|
||||||
|
height: 60rpx;
|
||||||
|
background: rgba(255,255,255,0.39);
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 2px solid #707070;
|
||||||
|
}
|
||||||
|
.card-wrap{
|
||||||
|
grid-gap: 20rpx 20rpx;
|
||||||
|
}
|
||||||
|
.card-item-img{
|
||||||
|
width: 100%;
|
||||||
|
height: 320rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.intro{
|
||||||
|
width: 100%;
|
||||||
|
background: #FAEED8;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.pageA{
|
||||||
|
width: 100%;
|
||||||
|
background: rgba(255,255,255,1);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
padding: 20rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.tabs{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.tab-btn{
|
||||||
|
width: fit-content;
|
||||||
|
height: 66rpx;
|
||||||
|
border-radius: 36rpx;
|
||||||
|
padding: 0 20rpx;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 66rpx;
|
||||||
|
background: rgba(221,210,190,0.39);
|
||||||
|
}
|
||||||
|
.details{
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 20rpx;
|
||||||
|
background: #FAEED8;
|
||||||
|
}
|
||||||
|
.top-img{
|
||||||
|
width: 100%;
|
||||||
|
height: 400rpx;
|
||||||
|
background: rgba(255,255,255,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.title-img{
|
||||||
|
/* height: 146rpx; */
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 146rpx;
|
||||||
|
margin-top: 24rpx;
|
||||||
|
background: #e0bb8c;
|
||||||
|
padding: 10rpx 60rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,281 @@
|
|||||||
|
<template>
|
||||||
|
<view class="heritage">
|
||||||
|
<view class="search-top">
|
||||||
|
<swiper class="swiper" disable-touch="true" touchable="false" :autoplay="ichData.banners && ichData.banners.length > 1" circular :current="current">
|
||||||
|
<swiper-item class="search-bg" v-for="(item, index) in ichData.banners" :key="index" @click="toDetails(item.ichContentId)">
|
||||||
|
<image class="search-bg" :src="item.image" autoplay mode="aspectFit|aspectFill|widthFix" lazy-load="false"></image>
|
||||||
|
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
<view class="search-input">
|
||||||
|
<u-search
|
||||||
|
:showAction="false"
|
||||||
|
v-model="keyword"
|
||||||
|
placeholder="搜索"
|
||||||
|
searchIconColor="#C52733"
|
||||||
|
:customStyle="{
|
||||||
|
backgroundColor: 'rgba(255,255,255,0.7)',
|
||||||
|
borderRadius: '100rpx'
|
||||||
|
}"
|
||||||
|
@search="searchClick"></u-search>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-mt-6 tab-wrap">
|
||||||
|
<view class="tab-item" v-for="(item, index) in ichData.categories" :key="index" @click="handleTab(index, item)">
|
||||||
|
{{ item.categoryName }}
|
||||||
|
<view :class="{ 'line': actived === index }"></view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="wiper-wrap v12-mt-3">
|
||||||
|
<swiper v-if="contents.length > 0" class="" style="width: 100%;height: 400rpx" :autoplay="contents.length > 2" circular next-margin="400rpx">
|
||||||
|
<swiper-item v-for="(item, index) in contents" :key="index" @click="toDetails(item.ichContentId)">
|
||||||
|
<view class="wiper-item">
|
||||||
|
<image class="wiper-item" :src="item.cover" mode="aspectFit|aspectFill|widthFix" lazy-load="false"> </image>
|
||||||
|
<view class="title-link">
|
||||||
|
<text class="title-link__text one-t v12-font-bold">
|
||||||
|
{{ item.name }}
|
||||||
|
</text>
|
||||||
|
<u-icon name="arrow-right" color="#fff" size="14"></u-icon>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper>
|
||||||
|
<view v-if="contents.length === 0" style="width:100%">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="img-nodata"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<!-- <swiper style="height: 400rpx;" class="v12-justify-between swap v12-mt-3" autoplay circular next-margin="400rpx" duration="10000" interval="3000" >
|
||||||
|
<swiper-item v-for="(item, index) in contents" :key="index" >
|
||||||
|
<view class="wiper-wrap">
|
||||||
|
<view>
|
||||||
|
<video :src="item.video" class="wiper-item" object-fit="cover"></video>
|
||||||
|
<view class="title-link">{{ item.name }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</swiper-item>
|
||||||
|
</swiper> -->
|
||||||
|
<view class="v12-font-36 v12-dark-text v12-font-bold v12-mt-3 tab-item">推荐
|
||||||
|
<view class="line"></view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-d-grid-columns-2 v12-mt-3 row-column-gap">
|
||||||
|
<view class="recommend-item" v-for="(item, index) in recommendList" :key="index" @click="toDetails(item.id)">
|
||||||
|
<image class="recommend-item image" :src="item.recommendImage" mode="aspectFit|aspectFill|widthFix" lazy-load="false"> </image>
|
||||||
|
<view class="recommend-item flex-item">
|
||||||
|
<view class="v12-font-24 v12-white-text"></view>
|
||||||
|
<view class=" intro-bg">
|
||||||
|
<view style="padding: 0 20rpx;">
|
||||||
|
<view class="item-name one-t v12-px-2 v12-white-border v12-white-text v12-font-32 v12-radius-100 v12-mb-2">
|
||||||
|
<text class="title-link__text one-t v12-font-bold">
|
||||||
|
{{ item.name }}
|
||||||
|
</text>
|
||||||
|
<u-icon name="arrow-right" color="#fff" size="16"></u-icon>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view class="v12-white-text v12-font-26 one-t">{{ item.intro }}</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
<view v-if="recommendList.length === 0">
|
||||||
|
<image
|
||||||
|
:src="webUrl + '/orderIcon/wu.png'"
|
||||||
|
mode="scaleToFill"
|
||||||
|
class="img-nodata"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getIch, getIchRecommend } from '@/api/heritage'
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
webUrl: this.$VUE_APP_RESOURCES_URL,
|
||||||
|
ichData: {},
|
||||||
|
id: '',
|
||||||
|
actived: 0,
|
||||||
|
contents: [],
|
||||||
|
recommendList: [],
|
||||||
|
keyword: '',
|
||||||
|
categoryId: '',
|
||||||
|
cacheList: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onLoad(opts) {
|
||||||
|
this.id = opts.id
|
||||||
|
this.getIchData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
searchClick() {
|
||||||
|
this.getRecommend()
|
||||||
|
this.contents = this.cacheList.filter(e => e.name.indexOf(this.keyword) > -1)
|
||||||
|
},
|
||||||
|
getIchData() {
|
||||||
|
getIch(this.id).then(res => {
|
||||||
|
this.ichData = res.data
|
||||||
|
this.cacheList = res.data.categories[0] && res.data.categories[0].contents || []
|
||||||
|
this.contents = this.cacheList
|
||||||
|
this.categoryId = res.data.categories[0].ichCategoryId
|
||||||
|
this.getRecommend()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getRecommend() {
|
||||||
|
const params = {
|
||||||
|
ichDataId: this.ichData.id,
|
||||||
|
keyword: this.keyword,
|
||||||
|
categoryId: this.categoryId
|
||||||
|
}
|
||||||
|
getIchRecommend(params).then(res => {
|
||||||
|
this.recommendList = res.data
|
||||||
|
})
|
||||||
|
},
|
||||||
|
handleTab(index, item) {
|
||||||
|
this.actived = index
|
||||||
|
this.cacheList = item.contents
|
||||||
|
this.contents = this.cacheList.filter(e => e.name.indexOf(this.keyword) > -1)
|
||||||
|
this.categoryId = item.ichCategoryId
|
||||||
|
this.getRecommend()
|
||||||
|
},
|
||||||
|
toDetails(id) {
|
||||||
|
if(!id) return
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pkg_product/views/heritage/details?id=' + id
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.swiper{
|
||||||
|
height: 360rpx;
|
||||||
|
}
|
||||||
|
.intro-bg{
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
background: rgba(0,0,0,0.5);
|
||||||
|
}
|
||||||
|
.row-column-gap{
|
||||||
|
grid-column-gap: 20rpx;
|
||||||
|
grid-row-gap: 20rpx;
|
||||||
|
}
|
||||||
|
.title-link__text{
|
||||||
|
max-width: 200rpx;
|
||||||
|
}
|
||||||
|
.search-top{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.search-input{
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
bottom: 20rpx;
|
||||||
|
padding: 0 40rpx;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.arrow-icon{
|
||||||
|
width: 24rpx;
|
||||||
|
height: 24rpx;
|
||||||
|
}
|
||||||
|
.item-name{
|
||||||
|
width: fit-content;
|
||||||
|
max-width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.flex-item{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
// padding: 20rpx;
|
||||||
|
}
|
||||||
|
.recommend-item{
|
||||||
|
width: 342rpx;
|
||||||
|
height: 400rpx;
|
||||||
|
// background: rgba(255,255,255,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
.image{
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.title-link{
|
||||||
|
position: absolute;
|
||||||
|
width: fit-content;
|
||||||
|
background: rgba(255,255,255,0.5);
|
||||||
|
border-radius: 100rpx;
|
||||||
|
bottom: 20rpx;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
padding: 10rpx 20rpx;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 28rpx;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.wiper-wrap{
|
||||||
|
display: flex;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
.wiper-item{
|
||||||
|
width: 280rpx;
|
||||||
|
height: 400rpx;
|
||||||
|
border-radius: 20rpx;
|
||||||
|
position: relative;
|
||||||
|
margin-right: 20rpx;
|
||||||
|
}
|
||||||
|
.tab-wrap{
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-start;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
.tab-item{
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin-right: 50rpx;
|
||||||
|
font-size: 36rpx;
|
||||||
|
width: fit-content;
|
||||||
|
position: relative;
|
||||||
|
.line{
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
height: 6rpx;
|
||||||
|
border-radius: 16rpx;
|
||||||
|
background: linear-gradient(to right, #C52733 0%, rgba(202,56,67,0.92) 51%, rgba(255,255,255,0) 100%);
|
||||||
|
bottom: 5rpx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tab-item:last-child{
|
||||||
|
margin-right: 0rpx;
|
||||||
|
|
||||||
|
}
|
||||||
|
.heritage{
|
||||||
|
min-height: 100vh;
|
||||||
|
background: #FAEED8;
|
||||||
|
padding: 20rpx;
|
||||||
|
}
|
||||||
|
.search-bg{
|
||||||
|
width: 100%;
|
||||||
|
height: 360rpx;
|
||||||
|
background: rgba(255,255,255,0.39);
|
||||||
|
border-radius: 20rpx;
|
||||||
|
}
|
||||||
|
.img-nodata {
|
||||||
|
position: relative;
|
||||||
|
top: 0;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
width: 352rpx;
|
||||||
|
height: 338rpx;
|
||||||
|
margin-bottom: 60rpx;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -187,7 +187,7 @@ export default {
|
|||||||
.article-box {
|
.article-box {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
.list {
|
.list {
|
||||||
padding: 0 0 20rpx 0;
|
padding: 0 0 40rpx 0;
|
||||||
}
|
}
|
||||||
.item {
|
.item {
|
||||||
width: 345rpx;
|
width: 345rpx;
|
||||||
|
|||||||
@@ -220,7 +220,7 @@
|
|||||||
v-if="tabsIndex === 3"
|
v-if="tabsIndex === 3"
|
||||||
:class="{'manage-state':isManage}"
|
:class="{'manage-state':isManage}"
|
||||||
class="scroll-box county-scroll"
|
class="scroll-box county-scroll"
|
||||||
:style="{background : countyFamousList.length === 0 ? '#f5f5f5' : '#fff !important'}"
|
:style="{background : countyFamousList.length === 0 ? '#f5f5f5' : '#f5f5f5 !important'}"
|
||||||
scroll-y
|
scroll-y
|
||||||
@scrolltolower="fetchCountyFamous()"
|
@scrolltolower="fetchCountyFamous()"
|
||||||
>
|
>
|
||||||
@@ -799,27 +799,35 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.county-list-wrap {
|
.county-list-wrap {
|
||||||
display: flex;
|
// display: flex;
|
||||||
flex-wrap: wrap;
|
// flex-wrap: wrap;
|
||||||
width: 710rpx;
|
// // width: 710rpx;
|
||||||
margin: 0 auto;
|
// justify-content: flex-start;
|
||||||
background-color: #f0f0f0;
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
margin: 0 32rpx;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
grid-column-gap: 10px;
|
||||||
|
grid-row-gap: 10px;
|
||||||
.county-item {
|
.county-item {
|
||||||
width: 344rpx;
|
// width: 320rpx;
|
||||||
height: 440rpx;
|
height: 440rpx;
|
||||||
padding: 12rpx;
|
padding: 12rpx;
|
||||||
margin: 0 22rpx 22rpx 0;
|
// margin: 0 22rpx 22rpx 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
&:nth-child(2n) {
|
display: flex;
|
||||||
margin-right: 0;
|
align-items: center;
|
||||||
}
|
flex-direction: column;
|
||||||
|
// &:nth-child(2n) {
|
||||||
|
// margin-right: 0;
|
||||||
|
// }
|
||||||
.img-wrap {
|
.img-wrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
.cover {
|
.cover {
|
||||||
display: block;
|
display: block;
|
||||||
width: 320rpx;
|
width: 300rpx;
|
||||||
height: 280rpx;
|
height: 280rpx;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
}
|
}
|
||||||
@@ -831,8 +839,9 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.county-info {
|
.county-info {
|
||||||
|
width: 100%;
|
||||||
.name {
|
.name {
|
||||||
width: 100%;
|
width: 280rpx;
|
||||||
padding: 10rpx 0 0 0;
|
padding: 10rpx 0 0 0;
|
||||||
font-size: 36rpx;
|
font-size: 36rpx;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|||||||
+2
-2
@@ -924,10 +924,10 @@ export const handleLoginFailure = () => {
|
|||||||
|
|
||||||
store.commit("logout");
|
store.commit("logout");
|
||||||
store.commit("updateAuthorization", false);
|
store.commit("updateAuthorization", false);
|
||||||
let currentPageUrl = getCurrentPageUrl()
|
const currentPageUrl = getCurrentPageUrl()
|
||||||
// token 失效
|
// token 失效
|
||||||
// 判断当前是不是已经在登录页面或者授权页,防止二次跳转
|
// 判断当前是不是已经在登录页面或者授权页,防止二次跳转
|
||||||
if (store.getters.isAuthorizationPage || getCurrentPageUrl() == '/pages/user/Login/index') {
|
if (store.getters.isAuthorizationPage || currentPageUrl == '/pages/user/Login/index' || currentPageUrl === '/pages/authorization/index') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
store.commit("updateAuthorizationPage", true);
|
store.commit("updateAuthorizationPage", true);
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
import buildURL from '../helpers/buildURL'
|
||||||
|
import buildFullPath from '../core/buildFullPath'
|
||||||
|
import settle from '../core/settle'
|
||||||
|
import {isUndefined} from "../utils"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回可选值存在的配置
|
||||||
|
* @param {Array} keys - 可选值数组
|
||||||
|
* @param {Object} config2 - 配置
|
||||||
|
* @return {{}} - 存在的配置项
|
||||||
|
*/
|
||||||
|
const mergeKeys = (keys, config2) => {
|
||||||
|
let config = {}
|
||||||
|
keys.forEach(prop => {
|
||||||
|
if (!isUndefined(config2[prop])) {
|
||||||
|
config[prop] = config2[prop]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
export default (config) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params, config.paramsSerializer)
|
||||||
|
const _config = {
|
||||||
|
url: fullPath,
|
||||||
|
header: config.header,
|
||||||
|
complete: (response) => {
|
||||||
|
config.fullPath = fullPath
|
||||||
|
response.config = config
|
||||||
|
response.rawData = response.data
|
||||||
|
try {
|
||||||
|
// 对可能字符串不是json 的情况容错
|
||||||
|
if (typeof response.data === 'string') {
|
||||||
|
response.data = JSON.parse(response.data)
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line no-empty
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
settle(resolve, reject, response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let requestTask
|
||||||
|
if (config.method === 'UPLOAD') {
|
||||||
|
delete _config.header['content-type']
|
||||||
|
delete _config.header['Content-Type']
|
||||||
|
let otherConfig = {
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
fileType: config.fileType,
|
||||||
|
// #endif
|
||||||
|
filePath: config.filePath,
|
||||||
|
name: config.name
|
||||||
|
}
|
||||||
|
const optionalKeys = [
|
||||||
|
// #ifdef APP-PLUS || H5
|
||||||
|
'files',
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5
|
||||||
|
'file',
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5 || APP-PLUS
|
||||||
|
'timeout',
|
||||||
|
// #endif
|
||||||
|
'formData'
|
||||||
|
]
|
||||||
|
requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})
|
||||||
|
} else if (config.method === 'DOWNLOAD') {
|
||||||
|
// #ifdef H5 || APP-PLUS
|
||||||
|
if (!isUndefined(config['timeout'])) {
|
||||||
|
_config['timeout'] = config['timeout']
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
requestTask = uni.downloadFile(_config)
|
||||||
|
} else {
|
||||||
|
const optionalKeys = [
|
||||||
|
'data',
|
||||||
|
'method',
|
||||||
|
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
||||||
|
'timeout',
|
||||||
|
// #endif
|
||||||
|
'dataType',
|
||||||
|
// #ifndef MP-ALIPAY
|
||||||
|
'responseType',
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
'sslVerify',
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5
|
||||||
|
'withCredentials',
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
'firstIpv4',
|
||||||
|
// #endif
|
||||||
|
]
|
||||||
|
requestTask = uni.request({..._config, ...mergeKeys(optionalKeys, config)})
|
||||||
|
}
|
||||||
|
if (config.getTask) {
|
||||||
|
config.getTask(requestTask, config)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
|
||||||
|
function InterceptorManager() {
|
||||||
|
this.handlers = []
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new interceptor to the stack
|
||||||
|
*
|
||||||
|
* @param {Function} fulfilled The function to handle `then` for a `Promise`
|
||||||
|
* @param {Function} rejected The function to handle `reject` for a `Promise`
|
||||||
|
*
|
||||||
|
* @return {Number} An ID used to remove interceptor later
|
||||||
|
*/
|
||||||
|
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
|
||||||
|
this.handlers.push({
|
||||||
|
fulfilled: fulfilled,
|
||||||
|
rejected: rejected
|
||||||
|
})
|
||||||
|
return this.handlers.length - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove an interceptor from the stack
|
||||||
|
*
|
||||||
|
* @param {Number} id The ID that was returned by `use`
|
||||||
|
*/
|
||||||
|
InterceptorManager.prototype.eject = function eject(id) {
|
||||||
|
if (this.handlers[id]) {
|
||||||
|
this.handlers[id] = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over all the registered interceptors
|
||||||
|
*
|
||||||
|
* This method is particularly useful for skipping over any
|
||||||
|
* interceptors that may have become `null` calling `eject`.
|
||||||
|
*
|
||||||
|
* @param {Function} fn The function to call for each interceptor
|
||||||
|
*/
|
||||||
|
InterceptorManager.prototype.forEach = function forEach(fn) {
|
||||||
|
this.handlers.forEach(h => {
|
||||||
|
if (h !== null) {
|
||||||
|
fn(h)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default InterceptorManager
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
/**
|
||||||
|
* @Class Request
|
||||||
|
* @description luch-request http请求插件
|
||||||
|
* @Author lu-ch
|
||||||
|
* @Email webwork.s@qq.com
|
||||||
|
* 文档: https://www.quanzhan.co/luch-request/
|
||||||
|
* github: https://github.com/lei-mu/luch-request
|
||||||
|
* DCloud: http://ext.dcloud.net.cn/plugin?id=392
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import dispatchRequest from './dispatchRequest'
|
||||||
|
import InterceptorManager from './InterceptorManager'
|
||||||
|
import mergeConfig from './mergeConfig'
|
||||||
|
import defaults from './defaults'
|
||||||
|
import { isPlainObject } from '../utils'
|
||||||
|
import clone from '../utils/clone'
|
||||||
|
|
||||||
|
export default class Request {
|
||||||
|
/**
|
||||||
|
* @param {Object} arg - 全局配置
|
||||||
|
* @param {String} arg.baseURL - 全局根路径
|
||||||
|
* @param {Object} arg.header - 全局header
|
||||||
|
* @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
|
||||||
|
* @param {String} arg.dataType = [json] - 全局默认的dataType
|
||||||
|
* @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持
|
||||||
|
* @param {Object} arg.custom - 全局默认的自定义参数
|
||||||
|
* @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
|
||||||
|
* @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
|
||||||
|
* @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
|
||||||
|
* @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
|
||||||
|
* @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
|
||||||
|
*/
|
||||||
|
constructor(arg = {}) {
|
||||||
|
if (!isPlainObject(arg)) {
|
||||||
|
arg = {}
|
||||||
|
console.warn('设置全局参数必须接收一个Object')
|
||||||
|
}
|
||||||
|
this.config = clone({...defaults, ...arg})
|
||||||
|
this.interceptors = {
|
||||||
|
request: new InterceptorManager(),
|
||||||
|
response: new InterceptorManager()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Function
|
||||||
|
* @param {Request~setConfigCallback} f - 设置全局默认配置
|
||||||
|
*/
|
||||||
|
setConfig(f) {
|
||||||
|
this.config = f(this.config)
|
||||||
|
}
|
||||||
|
|
||||||
|
middleware(config) {
|
||||||
|
config = mergeConfig(this.config, config)
|
||||||
|
let chain = [dispatchRequest, undefined]
|
||||||
|
let promise = Promise.resolve(config)
|
||||||
|
|
||||||
|
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
|
||||||
|
chain.unshift(interceptor.fulfilled, interceptor.rejected)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
|
||||||
|
chain.push(interceptor.fulfilled, interceptor.rejected)
|
||||||
|
})
|
||||||
|
|
||||||
|
while (chain.length) {
|
||||||
|
promise = promise.then(chain.shift(), chain.shift())
|
||||||
|
}
|
||||||
|
|
||||||
|
return promise
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Function
|
||||||
|
* @param {Object} config - 请求配置项
|
||||||
|
* @prop {String} options.url - 请求路径
|
||||||
|
* @prop {Object} options.data - 请求参数
|
||||||
|
* @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
|
||||||
|
* @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
|
||||||
|
* @prop {Object} [options.header = config.header] - 请求header
|
||||||
|
* @prop {Object} [options.method = config.method] - 请求方法
|
||||||
|
* @returns {Promise<unknown>}
|
||||||
|
*/
|
||||||
|
request(config = {}) {
|
||||||
|
return this.middleware(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
get(url, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
method: 'GET',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
post(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'POST',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #ifndef MP-ALIPAY || MP-KUAISHOU || MP-JD
|
||||||
|
put(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'PUT',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
|
||||||
|
delete(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'DELETE',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef H5 || MP-WEIXIN
|
||||||
|
connect(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'CONNECT',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef H5 || MP-WEIXIN || MP-BAIDU
|
||||||
|
head(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'HEAD',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
|
||||||
|
options(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'OPTIONS',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// #ifdef H5 || MP-WEIXIN
|
||||||
|
trace(url, data, options = {}) {
|
||||||
|
return this.middleware({
|
||||||
|
url,
|
||||||
|
data,
|
||||||
|
method: 'TRACE',
|
||||||
|
...options
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
upload(url, config = {}) {
|
||||||
|
config.url = url
|
||||||
|
config.method = 'UPLOAD'
|
||||||
|
return this.middleware(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
download(url, config = {}) {
|
||||||
|
config.url = url
|
||||||
|
config.method = 'DOWNLOAD'
|
||||||
|
return this.middleware(config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* setConfig回调
|
||||||
|
* @return {Object} - 返回操作后的config
|
||||||
|
* @callback Request~setConfigCallback
|
||||||
|
* @param {Object} config - 全局默认config
|
||||||
|
*/
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
import isAbsoluteURL from '../helpers/isAbsoluteURL'
|
||||||
|
import combineURLs from '../helpers/combineURLs'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new URL by combining the baseURL with the requestedURL,
|
||||||
|
* only when the requestedURL is not already an absolute URL.
|
||||||
|
* If the requestURL is absolute, this function returns the requestedURL untouched.
|
||||||
|
*
|
||||||
|
* @param {string} baseURL The base URL
|
||||||
|
* @param {string} requestedURL Absolute or relative URL to combine
|
||||||
|
* @returns {string} The combined full path
|
||||||
|
*/
|
||||||
|
export default function buildFullPath(baseURL, requestedURL) {
|
||||||
|
if (baseURL && !isAbsoluteURL(requestedURL)) {
|
||||||
|
return combineURLs(baseURL, requestedURL)
|
||||||
|
}
|
||||||
|
return requestedURL
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* 默认的全局配置
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
baseURL: '',
|
||||||
|
header: {},
|
||||||
|
method: 'GET',
|
||||||
|
dataType: 'json',
|
||||||
|
paramsSerializer: null,
|
||||||
|
// #ifndef MP-ALIPAY
|
||||||
|
responseType: 'text',
|
||||||
|
// #endif
|
||||||
|
custom: {},
|
||||||
|
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
||||||
|
timeout: 60000,
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
sslVerify: true,
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5
|
||||||
|
withCredentials: false,
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
firstIpv4: false,
|
||||||
|
// #endif
|
||||||
|
validateStatus: function validateStatus(status) {
|
||||||
|
return status >= 200 && status < 300
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import adapter from '../adapters/index'
|
||||||
|
|
||||||
|
|
||||||
|
export default (config) => {
|
||||||
|
return adapter(config)
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import {deepMerge, isUndefined} from '../utils'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
|
||||||
|
* @param {Array} keys - 配置项
|
||||||
|
* @param {Object} globalsConfig - 当前的全局配置
|
||||||
|
* @param {Object} config2 - 局部配置
|
||||||
|
* @return {{}}
|
||||||
|
*/
|
||||||
|
const mergeKeys = (keys, globalsConfig, config2) => {
|
||||||
|
let config = {}
|
||||||
|
keys.forEach(prop => {
|
||||||
|
if (!isUndefined(config2[prop])) {
|
||||||
|
config[prop] = config2[prop]
|
||||||
|
} else if (!isUndefined(globalsConfig[prop])) {
|
||||||
|
config[prop] = globalsConfig[prop]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param globalsConfig - 当前实例的全局配置
|
||||||
|
* @param config2 - 当前的局部配置
|
||||||
|
* @return - 合并后的配置
|
||||||
|
*/
|
||||||
|
export default (globalsConfig, config2 = {}) => {
|
||||||
|
const method = config2.method || globalsConfig.method || 'GET'
|
||||||
|
let config = {
|
||||||
|
baseURL: config2.baseURL || globalsConfig.baseURL || '',
|
||||||
|
method: method,
|
||||||
|
url: config2.url || '',
|
||||||
|
params: config2.params || {},
|
||||||
|
custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})},
|
||||||
|
header: deepMerge(globalsConfig.header || {}, config2.header || {})
|
||||||
|
}
|
||||||
|
const defaultToConfig2Keys = ['getTask', 'validateStatus', 'paramsSerializer']
|
||||||
|
config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-empty
|
||||||
|
if (method === 'DOWNLOAD') {
|
||||||
|
// #ifdef H5 || APP-PLUS
|
||||||
|
if (!isUndefined(config2.timeout)) {
|
||||||
|
config['timeout'] = config2['timeout']
|
||||||
|
} else if (!isUndefined(globalsConfig.timeout)) {
|
||||||
|
config['timeout'] = globalsConfig['timeout']
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
} else if (method === 'UPLOAD') {
|
||||||
|
delete config.header['content-type']
|
||||||
|
delete config.header['Content-Type']
|
||||||
|
const uploadKeys = [
|
||||||
|
// #ifdef APP-PLUS || H5
|
||||||
|
'files',
|
||||||
|
// #endif
|
||||||
|
// #ifdef MP-ALIPAY
|
||||||
|
'fileType',
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5
|
||||||
|
'file',
|
||||||
|
// #endif
|
||||||
|
'filePath',
|
||||||
|
'name',
|
||||||
|
// #ifdef H5 || APP-PLUS
|
||||||
|
'timeout',
|
||||||
|
// #endif
|
||||||
|
'formData',
|
||||||
|
]
|
||||||
|
uploadKeys.forEach(prop => {
|
||||||
|
if (!isUndefined(config2[prop])) {
|
||||||
|
config[prop] = config2[prop]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// #ifdef H5 || APP-PLUS
|
||||||
|
if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
|
||||||
|
config['timeout'] = globalsConfig['timeout']
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
} else {
|
||||||
|
const defaultsKeys = [
|
||||||
|
'data',
|
||||||
|
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
||||||
|
'timeout',
|
||||||
|
// #endif
|
||||||
|
'dataType',
|
||||||
|
// #ifndef MP-ALIPAY
|
||||||
|
'responseType',
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
'sslVerify',
|
||||||
|
// #endif
|
||||||
|
// #ifdef H5
|
||||||
|
'withCredentials',
|
||||||
|
// #endif
|
||||||
|
// #ifdef APP-PLUS
|
||||||
|
'firstIpv4',
|
||||||
|
// #endif
|
||||||
|
]
|
||||||
|
config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Resolve or reject a Promise based on response status.
|
||||||
|
*
|
||||||
|
* @param {Function} resolve A function that resolves the promise.
|
||||||
|
* @param {Function} reject A function that rejects the promise.
|
||||||
|
* @param {object} response The response.
|
||||||
|
*/
|
||||||
|
export default function settle(resolve, reject, response) {
|
||||||
|
const validateStatus = response.config.validateStatus
|
||||||
|
const status = response.statusCode
|
||||||
|
if (status && (!validateStatus || validateStatus(status))) {
|
||||||
|
resolve(response)
|
||||||
|
} else {
|
||||||
|
reject(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
import * as utils from './../utils'
|
||||||
|
|
||||||
|
function encode(val) {
|
||||||
|
return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a URL by appending params to the end
|
||||||
|
*
|
||||||
|
* @param {string} url The base of the url (e.g., http://www.google.com)
|
||||||
|
* @param {object} [params] The params to be appended
|
||||||
|
* @returns {string} The formatted url
|
||||||
|
*/
|
||||||
|
export default function buildURL(url, params, paramsSerializer) {
|
||||||
|
/*eslint no-param-reassign:0*/
|
||||||
|
if (!params) {
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
|
||||||
|
var serializedParams
|
||||||
|
if (paramsSerializer) {
|
||||||
|
serializedParams = paramsSerializer(params)
|
||||||
|
} else if (utils.isURLSearchParams(params)) {
|
||||||
|
serializedParams = params.toString()
|
||||||
|
} else {
|
||||||
|
var parts = []
|
||||||
|
|
||||||
|
utils.forEach(params, function serialize(val, key) {
|
||||||
|
if (val === null || typeof val === 'undefined') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (utils.isArray(val)) {
|
||||||
|
key = key + '[]'
|
||||||
|
} else {
|
||||||
|
val = [val]
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.forEach(val, function parseValue(v) {
|
||||||
|
if (utils.isDate(v)) {
|
||||||
|
v = v.toISOString()
|
||||||
|
} else if (utils.isObject(v)) {
|
||||||
|
v = JSON.stringify(v)
|
||||||
|
}
|
||||||
|
parts.push(encode(key) + '=' + encode(v))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
serializedParams = parts.join('&')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serializedParams) {
|
||||||
|
var hashmarkIndex = url.indexOf('#')
|
||||||
|
if (hashmarkIndex !== -1) {
|
||||||
|
url = url.slice(0, hashmarkIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
|
||||||
|
}
|
||||||
|
|
||||||
|
return url
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new URL by combining the specified URLs
|
||||||
|
*
|
||||||
|
* @param {string} baseURL The base URL
|
||||||
|
* @param {string} relativeURL The relative URL
|
||||||
|
* @returns {string} The combined URL
|
||||||
|
*/
|
||||||
|
export default function combineURLs(baseURL, relativeURL) {
|
||||||
|
return relativeURL
|
||||||
|
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
|
||||||
|
: baseURL
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether the specified URL is absolute
|
||||||
|
*
|
||||||
|
* @param {string} url The URL to test
|
||||||
|
* @returns {boolean} True if the specified URL is absolute, otherwise false
|
||||||
|
*/
|
||||||
|
export default function isAbsoluteURL(url) {
|
||||||
|
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
|
||||||
|
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
|
||||||
|
// by any combination of letters, digits, plus, period, or hyphen.
|
||||||
|
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
|
||||||
|
}
|
||||||
Vendored
+120
@@ -0,0 +1,120 @@
|
|||||||
|
type AnyObject = Record<string | number | symbol, any>
|
||||||
|
type HttpPromise<T> = Promise<HttpResponse<T>>;
|
||||||
|
type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask
|
||||||
|
export interface RequestTask {
|
||||||
|
abort: () => void;
|
||||||
|
offHeadersReceived: () => void;
|
||||||
|
onHeadersReceived: () => void;
|
||||||
|
}
|
||||||
|
export interface HttpRequestConfig<T = Tasks> {
|
||||||
|
/** 请求基地址 */
|
||||||
|
baseURL?: string;
|
||||||
|
/** 请求服务器接口地址 */
|
||||||
|
url?: string;
|
||||||
|
|
||||||
|
/** 请求查询参数,自动拼接为查询字符串 */
|
||||||
|
params?: AnyObject;
|
||||||
|
/** 请求体参数 */
|
||||||
|
data?: AnyObject;
|
||||||
|
|
||||||
|
/** 文件对应的 key */
|
||||||
|
name?: string;
|
||||||
|
/** HTTP 请求中其他额外的 form data */
|
||||||
|
formData?: AnyObject;
|
||||||
|
/** 要上传文件资源的路径。 */
|
||||||
|
filePath?: string;
|
||||||
|
/** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */
|
||||||
|
files?: Array<{
|
||||||
|
name?: string;
|
||||||
|
file?: File;
|
||||||
|
uri: string;
|
||||||
|
}>;
|
||||||
|
/** 要上传的文件对象,仅H5(2.6.15+)支持 */
|
||||||
|
file?: File;
|
||||||
|
|
||||||
|
/** 请求头信息 */
|
||||||
|
header?: AnyObject;
|
||||||
|
/** 请求方式 */
|
||||||
|
method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD";
|
||||||
|
/** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */
|
||||||
|
dataType?: string;
|
||||||
|
/** 设置响应的数据类型,支付宝小程序不支持 */
|
||||||
|
responseType?: "text" | "arraybuffer";
|
||||||
|
/** 自定义参数 */
|
||||||
|
custom?: AnyObject;
|
||||||
|
/** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */
|
||||||
|
timeout?: number;
|
||||||
|
/** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */
|
||||||
|
firstIpv4?: boolean;
|
||||||
|
/** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */
|
||||||
|
sslVerify?: boolean;
|
||||||
|
/** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */
|
||||||
|
withCredentials?: boolean;
|
||||||
|
|
||||||
|
/** 返回当前请求的task, options。请勿在此处修改options。 */
|
||||||
|
getTask?: (task: T, options: HttpRequestConfig<T>) => void;
|
||||||
|
/** 全局自定义验证器 */
|
||||||
|
validateStatus?: (statusCode: number) => boolean | void;
|
||||||
|
/** params 参数自定义处理 */
|
||||||
|
paramsSerializer?: (params: AnyObject) => string | void;
|
||||||
|
}
|
||||||
|
export interface HttpResponse<T = any> {
|
||||||
|
config: HttpRequestConfig;
|
||||||
|
statusCode: number;
|
||||||
|
cookies: Array<string>;
|
||||||
|
data: T;
|
||||||
|
errMsg: string;
|
||||||
|
header: AnyObject;
|
||||||
|
rawData: T;
|
||||||
|
}
|
||||||
|
export interface HttpUploadResponse<T = any> {
|
||||||
|
config: HttpRequestConfig;
|
||||||
|
statusCode: number;
|
||||||
|
data: T;
|
||||||
|
errMsg: string;
|
||||||
|
rawData: T;
|
||||||
|
}
|
||||||
|
export interface HttpDownloadResponse extends HttpResponse {
|
||||||
|
tempFilePath: string;
|
||||||
|
}
|
||||||
|
export interface HttpError {
|
||||||
|
config: HttpRequestConfig;
|
||||||
|
statusCode?: number;
|
||||||
|
cookies?: Array<string>;
|
||||||
|
data?: any;
|
||||||
|
errMsg: string;
|
||||||
|
header?: AnyObject;
|
||||||
|
}
|
||||||
|
export interface HttpInterceptorManager<V, E = V> {
|
||||||
|
use(
|
||||||
|
onFulfilled?: (config: V) => Promise<V> | V,
|
||||||
|
onRejected?: (config: E) => Promise<E> | E
|
||||||
|
): void;
|
||||||
|
eject(id: number): void;
|
||||||
|
}
|
||||||
|
export abstract class HttpRequestAbstract {
|
||||||
|
constructor(config?: HttpRequestConfig);
|
||||||
|
config: HttpRequestConfig;
|
||||||
|
interceptors: {
|
||||||
|
request: HttpInterceptorManager<HttpRequestConfig, HttpRequestConfig>;
|
||||||
|
response: HttpInterceptorManager<HttpResponse, HttpError>;
|
||||||
|
}
|
||||||
|
middleware<T = any>(config: HttpRequestConfig): HttpPromise<T>;
|
||||||
|
request<T = any>(config: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
get<T = any>(url: string, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
upload<T = any>(url: string, config?: HttpRequestConfig<UniApp.UploadTask>): HttpPromise<T>;
|
||||||
|
delete<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
head<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
post<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
put<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
connect<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
options<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
trace<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
|
||||||
|
|
||||||
|
download(url: string, config?: HttpRequestConfig<UniApp.DownloadTask>): Promise<HttpDownloadResponse>;
|
||||||
|
|
||||||
|
setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare class HttpRequest extends HttpRequestAbstract { }
|
||||||
|
export default HttpRequest;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
import Request from './core/Request'
|
||||||
|
export default Request
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
// utils is a library of generic helper functions non-specific to axios
|
||||||
|
|
||||||
|
var toString = Object.prototype.toString
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a value is an Array
|
||||||
|
*
|
||||||
|
* @param {Object} val The value to test
|
||||||
|
* @returns {boolean} True if value is an Array, otherwise false
|
||||||
|
*/
|
||||||
|
export function isArray (val) {
|
||||||
|
return toString.call(val) === '[object Array]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a value is an Object
|
||||||
|
*
|
||||||
|
* @param {Object} val The value to test
|
||||||
|
* @returns {boolean} True if value is an Object, otherwise false
|
||||||
|
*/
|
||||||
|
export function isObject (val) {
|
||||||
|
return val !== null && typeof val === 'object'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a value is a Date
|
||||||
|
*
|
||||||
|
* @param {Object} val The value to test
|
||||||
|
* @returns {boolean} True if value is a Date, otherwise false
|
||||||
|
*/
|
||||||
|
export function isDate (val) {
|
||||||
|
return toString.call(val) === '[object Date]'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a value is a URLSearchParams object
|
||||||
|
*
|
||||||
|
* @param {Object} val The value to test
|
||||||
|
* @returns {boolean} True if value is a URLSearchParams object, otherwise false
|
||||||
|
*/
|
||||||
|
export function isURLSearchParams (val) {
|
||||||
|
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate over an Array or an Object invoking a function for each item.
|
||||||
|
*
|
||||||
|
* If `obj` is an Array callback will be called passing
|
||||||
|
* the value, index, and complete array for each item.
|
||||||
|
*
|
||||||
|
* If 'obj' is an Object callback will be called passing
|
||||||
|
* the value, key, and complete object for each property.
|
||||||
|
*
|
||||||
|
* @param {Object|Array} obj The object to iterate
|
||||||
|
* @param {Function} fn The callback to invoke for each item
|
||||||
|
*/
|
||||||
|
export function forEach (obj, fn) {
|
||||||
|
// Don't bother if no value provided
|
||||||
|
if (obj === null || typeof obj === 'undefined') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force an array if not already something iterable
|
||||||
|
if (typeof obj !== 'object') {
|
||||||
|
/*eslint no-param-reassign:0*/
|
||||||
|
obj = [obj]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isArray(obj)) {
|
||||||
|
// Iterate over array values
|
||||||
|
for (var i = 0, l = obj.length; i < l; i++) {
|
||||||
|
fn.call(null, obj[i], i, obj)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Iterate over object keys
|
||||||
|
for (var key in obj) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
||||||
|
fn.call(null, obj[key], key, obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为boolean 值
|
||||||
|
* @param val
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
export function isBoolean(val) {
|
||||||
|
return typeof val === 'boolean'
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为真正的对象{} new Object
|
||||||
|
* @param {any} obj - 检测的对象
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
export function isPlainObject(obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Object]'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function equal to merge with the difference being that no reference
|
||||||
|
* to original objects is kept.
|
||||||
|
*
|
||||||
|
* @see merge
|
||||||
|
* @param {Object} obj1 Object to merge
|
||||||
|
* @returns {Object} Result of all merge properties
|
||||||
|
*/
|
||||||
|
export function deepMerge(/* obj1, obj2, obj3, ... */) {
|
||||||
|
let result = {}
|
||||||
|
function assignValue(val, key) {
|
||||||
|
if (typeof result[key] === 'object' && typeof val === 'object') {
|
||||||
|
result[key] = deepMerge(result[key], val)
|
||||||
|
} else if (typeof val === 'object') {
|
||||||
|
result[key] = deepMerge({}, val)
|
||||||
|
} else {
|
||||||
|
result[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0, l = arguments.length; i < l; i++) {
|
||||||
|
forEach(arguments[i], assignValue)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isUndefined (val) {
|
||||||
|
return typeof val === 'undefined'
|
||||||
|
}
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
var clone = (function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
function _instanceof(obj, type) {
|
||||||
|
return type != null && obj instanceof type;
|
||||||
|
}
|
||||||
|
|
||||||
|
var nativeMap;
|
||||||
|
try {
|
||||||
|
nativeMap = Map;
|
||||||
|
} catch(_) {
|
||||||
|
// maybe a reference error because no `Map`. Give it a dummy value that no
|
||||||
|
// value will ever be an instanceof.
|
||||||
|
nativeMap = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var nativeSet;
|
||||||
|
try {
|
||||||
|
nativeSet = Set;
|
||||||
|
} catch(_) {
|
||||||
|
nativeSet = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var nativePromise;
|
||||||
|
try {
|
||||||
|
nativePromise = Promise;
|
||||||
|
} catch(_) {
|
||||||
|
nativePromise = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones (copies) an Object using deep copying.
|
||||||
|
*
|
||||||
|
* This function supports circular references by default, but if you are certain
|
||||||
|
* there are no circular references in your object, you can save some CPU time
|
||||||
|
* by calling clone(obj, false).
|
||||||
|
*
|
||||||
|
* Caution: if `circular` is false and `parent` contains circular references,
|
||||||
|
* your program may enter an infinite loop and crash.
|
||||||
|
*
|
||||||
|
* @param `parent` - the object to be cloned
|
||||||
|
* @param `circular` - set to true if the object to be cloned may contain
|
||||||
|
* circular references. (optional - true by default)
|
||||||
|
* @param `depth` - set to a number if the object is only to be cloned to
|
||||||
|
* a particular depth. (optional - defaults to Infinity)
|
||||||
|
* @param `prototype` - sets the prototype to be used when cloning an object.
|
||||||
|
* (optional - defaults to parent prototype).
|
||||||
|
* @param `includeNonEnumerable` - set to true if the non-enumerable properties
|
||||||
|
* should be cloned as well. Non-enumerable properties on the prototype
|
||||||
|
* chain will be ignored. (optional - false by default)
|
||||||
|
*/
|
||||||
|
function clone(parent, circular, depth, prototype, includeNonEnumerable) {
|
||||||
|
if (typeof circular === 'object') {
|
||||||
|
depth = circular.depth;
|
||||||
|
prototype = circular.prototype;
|
||||||
|
includeNonEnumerable = circular.includeNonEnumerable;
|
||||||
|
circular = circular.circular;
|
||||||
|
}
|
||||||
|
// maintain two arrays for circular references, where corresponding parents
|
||||||
|
// and children have the same index
|
||||||
|
var allParents = [];
|
||||||
|
var allChildren = [];
|
||||||
|
|
||||||
|
var useBuffer = typeof Buffer != 'undefined';
|
||||||
|
|
||||||
|
if (typeof circular == 'undefined')
|
||||||
|
circular = true;
|
||||||
|
|
||||||
|
if (typeof depth == 'undefined')
|
||||||
|
depth = Infinity;
|
||||||
|
|
||||||
|
// recurse this function so we don't reset allParents and allChildren
|
||||||
|
function _clone(parent, depth) {
|
||||||
|
// cloning null always returns null
|
||||||
|
if (parent === null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (depth === 0)
|
||||||
|
return parent;
|
||||||
|
|
||||||
|
var child;
|
||||||
|
var proto;
|
||||||
|
if (typeof parent != 'object') {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_instanceof(parent, nativeMap)) {
|
||||||
|
child = new nativeMap();
|
||||||
|
} else if (_instanceof(parent, nativeSet)) {
|
||||||
|
child = new nativeSet();
|
||||||
|
} else if (_instanceof(parent, nativePromise)) {
|
||||||
|
child = new nativePromise(function (resolve, reject) {
|
||||||
|
parent.then(function(value) {
|
||||||
|
resolve(_clone(value, depth - 1));
|
||||||
|
}, function(err) {
|
||||||
|
reject(_clone(err, depth - 1));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else if (clone.__isArray(parent)) {
|
||||||
|
child = [];
|
||||||
|
} else if (clone.__isRegExp(parent)) {
|
||||||
|
child = new RegExp(parent.source, __getRegExpFlags(parent));
|
||||||
|
if (parent.lastIndex) child.lastIndex = parent.lastIndex;
|
||||||
|
} else if (clone.__isDate(parent)) {
|
||||||
|
child = new Date(parent.getTime());
|
||||||
|
} else if (useBuffer && Buffer.isBuffer(parent)) {
|
||||||
|
if (Buffer.from) {
|
||||||
|
// Node.js >= 5.10.0
|
||||||
|
child = Buffer.from(parent);
|
||||||
|
} else {
|
||||||
|
// Older Node.js versions
|
||||||
|
child = new Buffer(parent.length);
|
||||||
|
parent.copy(child);
|
||||||
|
}
|
||||||
|
return child;
|
||||||
|
} else if (_instanceof(parent, Error)) {
|
||||||
|
child = Object.create(parent);
|
||||||
|
} else {
|
||||||
|
if (typeof prototype == 'undefined') {
|
||||||
|
proto = Object.getPrototypeOf(parent);
|
||||||
|
child = Object.create(proto);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
child = Object.create(prototype);
|
||||||
|
proto = prototype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (circular) {
|
||||||
|
var index = allParents.indexOf(parent);
|
||||||
|
|
||||||
|
if (index != -1) {
|
||||||
|
return allChildren[index];
|
||||||
|
}
|
||||||
|
allParents.push(parent);
|
||||||
|
allChildren.push(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_instanceof(parent, nativeMap)) {
|
||||||
|
parent.forEach(function(value, key) {
|
||||||
|
var keyChild = _clone(key, depth - 1);
|
||||||
|
var valueChild = _clone(value, depth - 1);
|
||||||
|
child.set(keyChild, valueChild);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (_instanceof(parent, nativeSet)) {
|
||||||
|
parent.forEach(function(value) {
|
||||||
|
var entryChild = _clone(value, depth - 1);
|
||||||
|
child.add(entryChild);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i in parent) {
|
||||||
|
var attrs = Object.getOwnPropertyDescriptor(parent, i);
|
||||||
|
if (attrs) {
|
||||||
|
child[i] = _clone(parent[i], depth - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
var objProperty = Object.getOwnPropertyDescriptor(parent, i);
|
||||||
|
if (objProperty.set === 'undefined') {
|
||||||
|
// no setter defined. Skip cloning this property
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child[i] = _clone(parent[i], depth - 1);
|
||||||
|
} catch(e){
|
||||||
|
if (e instanceof TypeError) {
|
||||||
|
// when in strict mode, TypeError will be thrown if child[i] property only has a getter
|
||||||
|
// we can't do anything about this, other than inform the user that this property cannot be set.
|
||||||
|
continue
|
||||||
|
} else if (e instanceof ReferenceError) {
|
||||||
|
//this may happen in non strict mode
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.getOwnPropertySymbols) {
|
||||||
|
var symbols = Object.getOwnPropertySymbols(parent);
|
||||||
|
for (var i = 0; i < symbols.length; i++) {
|
||||||
|
// Don't need to worry about cloning a symbol because it is a primitive,
|
||||||
|
// like a number or string.
|
||||||
|
var symbol = symbols[i];
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
|
||||||
|
if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child[symbol] = _clone(parent[symbol], depth - 1);
|
||||||
|
Object.defineProperty(child, symbol, descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (includeNonEnumerable) {
|
||||||
|
var allPropertyNames = Object.getOwnPropertyNames(parent);
|
||||||
|
for (var i = 0; i < allPropertyNames.length; i++) {
|
||||||
|
var propertyName = allPropertyNames[i];
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
|
||||||
|
if (descriptor && descriptor.enumerable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child[propertyName] = _clone(parent[propertyName], depth - 1);
|
||||||
|
Object.defineProperty(child, propertyName, descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return child;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _clone(parent, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple flat clone using prototype, accepts only objects, usefull for property
|
||||||
|
* override on FLAT configuration object (no nested props).
|
||||||
|
*
|
||||||
|
* USE WITH CAUTION! This may not behave as you wish if you do not know how this
|
||||||
|
* works.
|
||||||
|
*/
|
||||||
|
clone.clonePrototype = function clonePrototype(parent) {
|
||||||
|
if (parent === null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var c = function () {};
|
||||||
|
c.prototype = parent;
|
||||||
|
return new c();
|
||||||
|
};
|
||||||
|
|
||||||
|
// private utility functions
|
||||||
|
|
||||||
|
function __objToStr(o) {
|
||||||
|
return Object.prototype.toString.call(o);
|
||||||
|
}
|
||||||
|
clone.__objToStr = __objToStr;
|
||||||
|
|
||||||
|
function __isDate(o) {
|
||||||
|
return typeof o === 'object' && __objToStr(o) === '[object Date]';
|
||||||
|
}
|
||||||
|
clone.__isDate = __isDate;
|
||||||
|
|
||||||
|
function __isArray(o) {
|
||||||
|
return typeof o === 'object' && __objToStr(o) === '[object Array]';
|
||||||
|
}
|
||||||
|
clone.__isArray = __isArray;
|
||||||
|
|
||||||
|
function __isRegExp(o) {
|
||||||
|
return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
|
||||||
|
}
|
||||||
|
clone.__isRegExp = __isRegExp;
|
||||||
|
|
||||||
|
function __getRegExpFlags(re) {
|
||||||
|
var flags = '';
|
||||||
|
if (re.global) flags += 'g';
|
||||||
|
if (re.ignoreCase) flags += 'i';
|
||||||
|
if (re.multiline) flags += 'm';
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
clone.__getRegExpFlags = __getRegExpFlags;
|
||||||
|
|
||||||
|
return clone;
|
||||||
|
})();
|
||||||
|
|
||||||
|
export default clone
|
||||||
+73
-37
@@ -1,38 +1,61 @@
|
|||||||
import Fly from "flyio/dist/npm/wx";
|
import store from "@/store/index.js";
|
||||||
import {handleLoginFailure} from "@/utils";
|
import Request from "@/utils/luch-request/index.js";
|
||||||
import {VUE_APP_API_URL} from "@/config";
|
|
||||||
import cookie from "@/utils/store/cookie";
|
import cookie from "@/utils/store/cookie";
|
||||||
|
import { handleLoginFailure } from "@/utils";
|
||||||
|
import { VUE_APP_API_URL } from "@/config";
|
||||||
|
|
||||||
const fly = new Fly()
|
const http = new Request();
|
||||||
fly.config.baseURL = VUE_APP_API_URL
|
/* 设置全局配置 */
|
||||||
|
http.setConfig((config) => {
|
||||||
|
config.baseURL = VUE_APP_API_URL;
|
||||||
|
config.timeout = 2 * 60 * 1000;
|
||||||
|
config.method = "POST";
|
||||||
|
config.responseType = "text";
|
||||||
|
config.header = {
|
||||||
|
...config.header,
|
||||||
|
};
|
||||||
|
return config;
|
||||||
|
});
|
||||||
|
|
||||||
fly.interceptors.response.use(
|
|
||||||
response => {
|
// /* 请求之前拦截器 */
|
||||||
// 定时刷新access-token
|
http.interceptors.request.use((config, cancel) => {
|
||||||
return response;
|
const token = cookie.get('login_status');
|
||||||
},
|
config.header = {
|
||||||
error => {
|
...config.header,
|
||||||
if (error.toString() == 'Error: Network Error') {
|
Authorization: token ? ('Bearer ' + token) : ''
|
||||||
console.log('————————')
|
}
|
||||||
console.log('发送请求失败', error)
|
return config;
|
||||||
console.log('————————')
|
});
|
||||||
handleLoginFailure();
|
|
||||||
return Promise.reject({msg: "未登录", toLogin: true});
|
// 必须使用异步函数,注意
|
||||||
} else if (error.status == 401) {
|
http.interceptors.response.use(
|
||||||
console.log('————————')
|
(response) => {
|
||||||
console.log('登录失效 401', error)
|
return response;
|
||||||
console.log('————————')
|
},
|
||||||
handleLoginFailure();
|
(error) => {
|
||||||
return Promise.reject({msg: "未登录", toLogin: true});
|
console.log(error)
|
||||||
} else {
|
if (error.toString() == "Error: Network Error") {
|
||||||
uni.showToast({
|
console.log("————————");
|
||||||
title: '服务开小差了,请稍后再试',
|
console.log("发送请求失败", error);
|
||||||
icon: 'none',
|
console.log("————————");
|
||||||
duration: 3000
|
handleLoginFailure();
|
||||||
})
|
return Promise.reject({ msg: "未登录", toLogin: true });
|
||||||
}
|
} else if (error.status == 401) {
|
||||||
return Promise.reject(error);
|
console.log("————————");
|
||||||
|
console.log("登录失效 401", error);
|
||||||
|
console.log("————————");
|
||||||
|
handleLoginFailure();
|
||||||
|
return Promise.reject({ msg: "未登录", toLogin: true });
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: "服务开小差了,请稍后再试",
|
||||||
|
icon: "none",
|
||||||
|
duration: 3000,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const defaultOpt = {login: true};
|
const defaultOpt = {login: true};
|
||||||
@@ -51,16 +74,29 @@ function baseRequest(options) {
|
|||||||
|
|
||||||
// 结构请求需要的参数
|
// 结构请求需要的参数
|
||||||
const {url, params, data, login, ...option} = options
|
const {url, params, data, login, ...option} = options
|
||||||
|
console.log(params, '=====params');
|
||||||
|
console.log(params, '=====data');
|
||||||
|
console.log(option, '=======option');
|
||||||
|
let _params = {}
|
||||||
|
if(['get', 'GET'].includes(options.method)) {
|
||||||
|
_params = {
|
||||||
|
params: params
|
||||||
|
}
|
||||||
|
} else if (['post', 'POST'].includes(options.method)) {
|
||||||
|
_params = params || data
|
||||||
|
}
|
||||||
|
|
||||||
// 发起请求
|
// 发起请求
|
||||||
return fly.request(url, params || data, {
|
return http[options.method](url, _params).then(res => {
|
||||||
...option
|
|
||||||
}).then(res => {
|
|
||||||
const resData = res.data || {};
|
const resData = res.data || {};
|
||||||
if (res.status !== 200) {
|
if (res.statusCode !== 200) {
|
||||||
return Promise.reject({msg: "请求失败", res, resData});
|
return Promise.reject({msg: "请求失败", res, resData});
|
||||||
}
|
}
|
||||||
if ([401, 403].indexOf(resData.status) !== -1) {
|
if (resData.status === 401) {
|
||||||
|
handleLoginFailure();
|
||||||
|
return Promise.reject({msg: '未登录', res, resData, toLogin: true});
|
||||||
|
}
|
||||||
|
if ([ 403].indexOf(resData.status) !== -1) {
|
||||||
handleLoginFailure();
|
handleLoginFailure();
|
||||||
return Promise.reject({msg: res.data.msg, res, resData, toLogin: true});
|
return Promise.reject({msg: res.data.msg, res, resData, toLogin: true});
|
||||||
} else if (resData.status === 200) {
|
} else if (resData.status === 200) {
|
||||||
@@ -117,4 +153,4 @@ const request = ["post", "put", "patch"].reduce((request, method) => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export default request;
|
export default request
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
import Fly from "flyio/dist/npm/wx";
|
||||||
|
import {handleLoginFailure} from "@/utils";
|
||||||
|
import {VUE_APP_API_URL} from "@/config";
|
||||||
|
import cookie from "@/utils/store/cookie";
|
||||||
|
|
||||||
|
const fly = new Fly()
|
||||||
|
fly.config.baseURL = VUE_APP_API_URL
|
||||||
|
|
||||||
|
fly.interceptors.response.use(
|
||||||
|
response => {
|
||||||
|
// 定时刷新access-token
|
||||||
|
console.log(response);
|
||||||
|
return response;
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
if (error.toString() == 'Error: Network Error') {
|
||||||
|
console.log('————————')
|
||||||
|
console.log('发送请求失败', error)
|
||||||
|
console.log('————————')
|
||||||
|
handleLoginFailure();
|
||||||
|
return Promise.reject({msg: "未登录", toLogin: true});
|
||||||
|
} else if (error.status == 401) {
|
||||||
|
console.log('————————')
|
||||||
|
console.log('登录失效 401', error)
|
||||||
|
console.log('————————')
|
||||||
|
handleLoginFailure();
|
||||||
|
return Promise.reject({msg: "未登录", toLogin: true});
|
||||||
|
} else {
|
||||||
|
uni.showToast({
|
||||||
|
title: '服务开小差了,请稍后再试',
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const defaultOpt = {login: true};
|
||||||
|
|
||||||
|
function baseRequest(options) {
|
||||||
|
|
||||||
|
// 从缓存中获取 token 防止 token 失效后还会继续请求的情况
|
||||||
|
const token = cookie.get('login_status');
|
||||||
|
|
||||||
|
// 合并传参过来的 headers
|
||||||
|
// 如果接口需要登录,携带 token 去请求
|
||||||
|
options.headers = {
|
||||||
|
...options.headers,
|
||||||
|
Authorization: token ? ('Bearer ' + token) : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
// 结构请求需要的参数
|
||||||
|
const {url, params, data, login, ...option} = options
|
||||||
|
console.log(params, '=====params');
|
||||||
|
console.log(params, '=====data');
|
||||||
|
console.log(option, '=======option');
|
||||||
|
// 发起请求
|
||||||
|
return fly.request(url, params || data, {
|
||||||
|
...option
|
||||||
|
}).then(res => {
|
||||||
|
const resData = res.data || {};
|
||||||
|
if (res.status !== 200) {
|
||||||
|
return Promise.reject({msg: "请求失败", res, resData});
|
||||||
|
}
|
||||||
|
if ([401, 403].indexOf(resData.status) !== -1) {
|
||||||
|
handleLoginFailure();
|
||||||
|
return Promise.reject({msg: res.data.msg, res, resData, toLogin: true});
|
||||||
|
} else if (resData.status === 200) {
|
||||||
|
return Promise.resolve(resData, res);
|
||||||
|
} else {
|
||||||
|
// 埋点数据推送、获取店铺分享图片
|
||||||
|
if (url.indexOf('api/systemStats/push') < 0 && url.indexOf('api/hotelMain/shareImage') < 0) {
|
||||||
|
uni.showToast({
|
||||||
|
title: resData.msg,
|
||||||
|
icon: 'none',
|
||||||
|
duration: 3000,
|
||||||
|
success() {
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return Promise.reject({msg: resData.msg, res, data});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* http 请求基础类
|
||||||
|
* 参考文档 https://www.kancloud.cn/yunye/axios/234845
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
const request = ["post", "put", "patch"].reduce((request, method) => {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url string 接口地址
|
||||||
|
* @param data object get参数
|
||||||
|
* @param options object axios 配置项
|
||||||
|
* @returns {AxiosPromise}
|
||||||
|
*/
|
||||||
|
request[method] = (url, data = {}, options = {}) => {
|
||||||
|
return baseRequest(
|
||||||
|
Object.assign({url, data, method}, defaultOpt, options)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
return request;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
["get", "delete", "head"].forEach(method => {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url string 接口地址
|
||||||
|
* @param params object get参数
|
||||||
|
* @param options object axios 配置项
|
||||||
|
* @returns {AxiosPromise}
|
||||||
|
*/
|
||||||
|
request[method] = (url, params = {}, options = {}) => {
|
||||||
|
return baseRequest(
|
||||||
|
Object.assign({url, params, method}, defaultOpt, options)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export default request;
|
||||||
@@ -33,8 +33,8 @@ function clearAll() {
|
|||||||
// uni.clearStorage()
|
// uni.clearStorage()
|
||||||
const res = uni.getStorageInfoSync()
|
const res = uni.getStorageInfoSync()
|
||||||
res.keys.map((item) => {
|
res.keys.map((item) => {
|
||||||
// 不要清除spread和redirect、页面埋点数据
|
// 不要清除spread和redirect、页面埋点和历史搜索数据数据,
|
||||||
if ([pageViewDataCacheKey, 'redirect', 'spread'].includes(item)) {
|
if ([pageViewDataCacheKey, 'redirect', 'spread', 'historyKey'].includes(item)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
remove(item)
|
remove(item)
|
||||||
|
|||||||
Reference in New Issue
Block a user