Files
MER-2.2_2601/mer_uniapp/subPackage/pages/diyPage/merchant.vue

421 lines
11 KiB
Vue
Raw Normal View History

<template>
<!-- 店铺街 -->
<view>
<view class='indexList tui-skeleton' :style="[boxStyle]" v-if="merList.length>0">
<view class='title acea-row row-between-wrapper'>
<view class='text line1 tui-skeleton-rect acea-row'>
<image :src="logoUrl"></image>
<text class='label' :style="[titleColor]">{{dataConfig.titleConfig.val}}</text>
</view>
<view class='more tui-skeleton-rect fs-12' :style="[moreColor]" hover-class="none" @click="more()">
更多
<text class="iconfont icon-ic_rightarrow fs-12"></text>
</view>
</view>
<view class='tips mb20'>Good brand store</view>
<view class='merList' :style="[gridGap]" v-if="listStyle == 0">
<view class='item' v-for="(item,index) in merList" :key='index'>
<navigator :url="`/pages/merchant/home/index?merId=${item.id}`" hover-class="none">
<view class='pic tui-skeleton-rect'>
<easy-loadimage :image-src="item.coverImage"
:radius="dataConfig.contentStyle.val*2+'rpx'"></easy-loadimage>
</view>
<image class="lines left" :src="urlDomain+'crmebimage/presets/lianjie.png'"></image>
<view v-show="logoShow" class='logo tui-skeleton-rect'>
<image :src='item.rectangleLogo'></image>
</view>
<image class="lines right" :src="urlDomain+'crmebimage/presets/lianjie.png'"></image>
<view class='merName tui-skeleton-rect'>
<view class='neme line1 line-heightOne' v-show="nameShow" :style="[nameColor]">{{item.name}}</view>
<view v-show="typeShow"><text class='label'
:style="[labelColor]">{{item.typeId | merchantTypeFilter}}</text></view>
</view>
</navigator>
</view>
</view>
<view v-if="listStyle == 1">
<mer-card :merchantList="merList" :merchantStyle="merchantStyle" :isShowHome="isShowHome" :isStreet="true" :isHome="true"></mer-card>
</view>
</view>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
getMerListbyidsApi,
getRegionMerListApi
} from '@/api/merchant.js';
import merCard from '@/components/merchantList/index.vue'
import easyLoadimage from '@/components/base/easy-loadimage.vue';
import {indexMerchantApi} from "@/api/product";
let app = getApp()
export default {
name: 'merchantList',
props: {
dataConfig: {
type: Object,
default: () => {}
},
// 圈层ID集合逗号分隔
regionIds: {
type: String,
default: ''
}
},
data() {
return {
urlDomain: this.$Cache.get("imgHost"),
merList: [],
isShowHome: {} ,//首页中展示字段判断
merchantStyle: null ,//样式二中的样式集合
themeColor:this.$options.filters.filterTheme(app.globalData.theme),
num: 50,
params: {
circleIds: '',
merIds: '',
num: ''
}
}
},
components: {
merCard,
easyLoadimage
},
computed: {
// 页面类型,商城首页还是圈层首页
fromToType(){
return this.dataConfig.fromToType ? this.dataConfig.fromToType : ''
},
//店铺数据类型0默认1自定义
listConfig(){
return this.dataConfig.listConfig.tabVal
},
//店铺数据自定义选中商户的id集合
activeValueMer(){
return this.dataConfig.activeValueMer.activeValue
},
//样式类型01
listStyle() {
return this.dataConfig.tabConfig.tabVal
},
//最外层盒子的样式
boxStyle() {
return {
borderRadius: this.dataConfig.bgStyle.val * 2 + 'rpx',
background: `linear-gradient(${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`,
margin: this.dataConfig.mbConfig.val * 2 + 'rpx' + ' ' + '20rpx' + ' ' + 0,
padding: this.dataConfig.upConfig.val * 2 + 'rpx' + ' ' + '10px' + ' ' + this.dataConfig.downConfig
.val * 2 + 'rpx'
}
},
//图片样式
contentStyle() {
return {
'border-radius': this.dataConfig.contentStyle.val + 'px',
}
},
//内容间距
gridGap() {
return {
'grid-gap': this.dataConfig.contentConfig.val + 'px'
}
},
//标题颜色
titleColor() {
return {
'color': this.dataConfig.titleColor.color[0].item
}
},
//名称颜色
nameColor() {
return {
'color': this.dataConfig.nameColor.color[0].item
}
},
//更多颜色
moreColor() {
return {
'color': this.dataConfig.moreColor.color[0].item
}
},
// 价格颜色
priceColor(){
return {
'color': this.dataConfig.themeStyleConfig.tabVal?this.dataConfig.priceColor.color[0].item:this.themeColor
}
},
//标题图片
logoUrl() {
return this.dataConfig.logoConfig.url
},
//标签
labelColor() {
return {
'backgroundColor': this.dataConfig.themeStyleConfig.tabVal?this.dataConfig.labelColor.color[0].item:this.themeColor,
'color': this.dataConfig.labelFontColor.color[0].item
}
},
//店铺名称
nameShow() {
if (this.dataConfig.typeConfig.activeValue.indexOf(0) !== -1) {
return true;
} else {
return false;
}
},
//店铺logo
logoShow() {
if (this.dataConfig.typeConfig.activeValue.indexOf(1) !== -1) {
return true;
} else {
return false;
}
},
//店铺类型
typeShow() {
if (this.dataConfig.typeConfig.activeValue.indexOf(2) !== -1) {
return true;
} else {
return false;
}
},
//店铺数量
numConfig(){
return this.dataConfig.numConfig.val
}
},
mounted() {
this.merchantStyle = {
contentStyle: this.contentStyle,
nameColor: this.nameColor,
labelColor: this.labelColor,
priceColor: this.priceColor
}
this.isShowHome = {
typeShow: this.typeShow,
nameShow: this.nameShow,
logoShow: this.logoShow
}
// 监听位置变化事件
uni.$on('locationChanged', this.handleLocationChanged);
this.$store.dispatch('MerCategoryList');
this.$store.dispatch('MerTypeList');
this.loadMerchantData();
},
methods: {
loadMerchantData() {
this.params.circleIds = this.regionIds
if(this.listConfig === 0){
this.params.num = this.numConfig
this.params.merIds = ''
}else{
this.params.merIds = this.activeValueMer.join(',')
this.params.num = ''
}
this.getMerList();
},
// 处理位置变化事件
handleLocationChanged() {
// 重新加载商户数据
this.merList = [];
this.loadMerchantData();
// 判断是圈层模式还是平台模式
// if (this.fromToType === 'regionHome') {
// // 圈层商户列表 - 使用最新位置信息
// this.getRegionMerListWithLocation();
// } else {
// // 平台商户列表 - 根据配置重新加载
// if (this.listConfig === 0) {
// this.getMerList();
// } else {
// this.getMerListbyids();
// }
// }
},
// 位置变化后的圈层商户列表 - 使用最新位置信息
async getRegionMerListWithLocation(){
try {
// 从位置缓存获取最新位置
const locationInfo = uni.getStorageSync('location_info');
if (this.fromToType === 'regionHome') {
// 没有位置信息时回退到使用regionIds
return this.getRegionMerList();
}
const params = {
num: this.num,
latitude: locationInfo.latitude,
longitude: locationInfo.longitude
};
const { data } = await getRegionMerListApi(params);
// 如果位置查询返回空数据回退到regionIds查询
if (!data || data.length === 0) {
return this.getRegionMerList();
}
this.merList = data || [];
} catch (error) {
console.error('获取圈层商户列表失败:', error);
// 出错时也回退到regionIds查询
this.getRegionMerList();
}
},
// 圈层商户列表 - 初始化时使用props中的regionIds
async getRegionMerList(){
try {
const params = {
num: this.num,
regionIds: this.regionIds
};
const { data } = await getRegionMerListApi(params);
this.merList = data || [];
} catch (error) {
console.error('获取圈层商户列表失败:', error);
this.merList = [];
}
},
more() {
// 判断是否是圈层模式,传递相应参数
if (this.regionIds) {
// 圈层模式:传递圈层参数
const url = `/pages/merchant/merchant_street/index?fromRegion=true&regionIds=${this.regionIds}`;
this.$util.navigateTo(url);
} else {
// 平台模式:使用默认配置链接
this.$util.navigateTo(this.dataConfig.linkConfig.val);
}
},
//默认店铺数据
getMerList() {
indexMerchantApi(this.params).then((res) => {
this.merList = res.data.list;
});
},
//自定义店铺数据
getMerListbyids(){
getMerListbyidsApi(this.activeValueMer.join(',')).then((res) => {
this.merList = res.data;
});
}
},
beforeDestroy() {
// 清理事件监听器
uni.$off('locationChanged', this.handleLocationChanged);
}
}
</script>
<style lang="scss" scoped>
.indexList {}
.merList {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
width: 100%;
.item {
position: relative;
.lines {
width: 8rpx;
height: 34rpx;
position: absolute;
z-index: 1;
}
.left {
left: 14rpx;
top: 204rpx;
}
.right {
right: 14rpx;
top: 204rpx;
}
.pic {
width: 100%;
height: 220rpx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.logo {
width: 150rpx;
height: 44rpx;
background: #FFFFFF;
box-shadow: 0rpx 3rpx 6rpx 1rpx rgba(0, 0, 0, 0.1000);
border-radius: 33rpx;
opacity: 1;
margin: auto;
position: absolute;
z-index: 1;
left: 16%;
top: 59%;
image {
margin: auto;
width: 130rpx;
height: 44rpx;
display: block;
}
}
.merName {
width: 100%;
height: 110rpx;
background: #FFFFFF;
border-radius: 14rpx;
opacity: 1;
padding: 30rpx 0 14rpx 0;
display: flex;
flex-direction: column;
align-items: center;
.neme {
font-weight: bold;
color: #333333;
font-size: 22rpx;
text-align: center;
margin-bottom: 4rpx;
width: 210rpx;
}
.label {
height: 28rpx;
line-height: 28rpx;
border-radius: 14rpx;
opacity: 1;
text-align: center;
font-size: 18rpx;
padding: 0 12rpx;
}
}
}
}
.fs-12{
font-size: 24rpx !important;
}
</style>