Files
MER-2.2_2601/mer_uniapp/subPackage/pages/diyPage/merchant.vue
2026-03-08 20:07:52 +08:00

421 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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>