chore(组件): 引入DiyMinx的js及修复组件错误

This commit is contained in:
2025-12-26 16:35:15 +08:00
parent d1778c1fd7
commit 40f5f63096
51 changed files with 14579 additions and 13800 deletions

View File

@@ -3,29 +3,29 @@
<view class="article-wrap" :style="warpCss"> <view class="article-wrap" :style="warpCss">
<view :class="['list-wrap', value.style]" :style="warpCss"> <view :class="['list-wrap', value.style]" :style="warpCss">
<!-- 自动垂直滚动 --> <!-- 自动垂直滚动 -->
<swiper class="auto-scroll-swiper" <swiper class="auto-scroll-swiper" :style="swiperStyle" :vertical="swiperConfig.vertical !== false"
:style="swiperStyle" :autoplay="swiperConfig.autoplay !== false" :circular="swiperConfig.circular !== false"
:vertical="swiperConfig.vertical !== false" :interval="swiperConfig.interval || 3000" :duration="swiperConfig.duration || 500"
:autoplay="swiperConfig.autoplay !== false"
:circular="swiperConfig.circular !== false"
:interval="swiperConfig.interval || 3000"
:duration="swiperConfig.duration || 500"
:display-multiple-items="safeDisplayMultipleItems"> :display-multiple-items="safeDisplayMultipleItems">
<swiper-item v-for="(item, index) in list" :key="index" @click="toDetail(item)"> <swiper-item v-for="(item, index) in list" :key="index" @click="toDetail(item)">
<view class="swiper-item-content"> <view class="swiper-item-content">
<view :class="['item', value.ornament.type]" :style="itemCss"> <view :class="['item', value.ornament.type]" :style="itemCss">
<view class="article-img"> <view class="article-img">
<image class="cover-img" :src="$util.img(item.cover_img)" mode="widthFix" @error="imgError(index)" /> <image class="cover-img" :src="$util.img(item.cover_img)" mode="widthFix"
@error="imgError(index)" />
</view> </view>
<view class="info-wrap"> <view class="info-wrap">
<text class="title">{{ item.article_title }}</text> <text class="title">{{ item.article_title }}</text>
<text class="desc" style="color:#888;font-size: 24rpx; display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;overflow: hidden;text-overflow: ellipsis;">{{ item.article_abstract }}</text> <text class="desc"
style="color:#888;font-size: 24rpx; display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;overflow: hidden;text-overflow: ellipsis;">{{
item.article_abstract }}</text>
<view class="read-wrap"> <view class="read-wrap">
<block v-if="item.category_name"> <block v-if="item.category_name">
<text class="category-icon"></text> <text class="category-icon"></text>
<text>{{ item.category_name }}</text> <text>{{ item.category_name }}</text>
</block> </block>
<text class="date">{{ $util.timeStampTurnTime(item.create_time, 'date') }}</text> <text class="date">{{ $util.timeStampTurnTime(item.create_time, 'date')
}}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -38,225 +38,228 @@
</template> </template>
<script> <script>
// 文章 import DiyMinx from './minx.js'
export default { // 文章
name: 'diy-article', export default {
props: { name: 'diy-article',
value: { props: {
type: Object value: {
type: Object
}
},
mixins: [DiyMinx],
data() {
return {
list: [],
loading: true,
skeletonConfig: {
gridRows: 1,
gridRowsGap: '40rpx',
headWidth: '160rpx',
headHeight: '160rpx',
textRows: 2
} }
};
},
created() {
this.getList();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getList();
}
},
computed: {
// 获取swiper配置默认空对象
swiperConfig() {
return this.value?.swiperConfig || {};
}, },
data() { // 安全的display-multiple-items值确保不大于swiper-item数量
safeDisplayMultipleItems() {
const displayCount = this.swiperConfig.displayMultipleItems || 3;
const actualCount = this.list.length;
return actualCount > 0 ? Math.min(displayCount, actualCount) : 1;
},
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// swiper容器样式
swiperStyle() {
// 从swiperConfig获取高度默认600rpx
const height = this.swiperConfig.swiperHeight || 600;
return { return {
list: [], height: height + 'rpx',
loading: true, width: '100%'
skeletonConfig: {
gridRows: 1,
gridRowsGap: '40rpx',
headWidth: '160rpx',
headHeight: '160rpx',
textRows: 2
}
}; };
}, },
created() { // 子项样式
this.getList(); itemCss() {
}, var obj = '';
watch: { obj += 'background-color:' + this.value.elementBgColor + ';';
// 组件刷新监听 if (this.value.elementAngle == 'round') {
componentRefresh: function (nval) { obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
this.getList(); obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
}, if (this.value.ornament.type == 'shadow') {
computed: { obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color;
// 获取swiper配置默认空对象
swiperConfig() {
return this.value?.swiperConfig || {};
},
// 安全的display-multiple-items值确保不大于swiper-item数量
safeDisplayMultipleItems() {
const displayCount = this.swiperConfig.displayMultipleItems || 3;
const actualCount = this.list.length;
return actualCount > 0 ? Math.min(displayCount, actualCount) : 1;
},
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// swiper容器样式
swiperStyle() {
// 从swiperConfig获取高度默认600rpx
const height = this.swiperConfig.swiperHeight || 600;
return {
height: height + 'rpx',
width: '100%'
};
},
// 子项样式
itemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color;
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color;
}
return obj;
} }
}, if (this.value.ornament.type == 'stroke') {
methods: { obj += 'border:' + '2rpx solid ' + this.value.ornament.color;
getList() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.article_id_arr = this.value.articleIds.toString();
}
this.$api.sendRequest({
url: '/api/article/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
let data = res.data;
this.list = data;
}
this.loading = false;
}
});
},
toDetail(item) {
this.$util.redirectTo('/pages_tool/article/detail', {
article_id: item.article_id
});
},
imgError(index) {
if (this.list[index]) this.list[index].cover_img = this.$util.getDefaultImage().article;
} }
return obj;
} }
}; },
methods: {
getList() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.article_id_arr = this.value.articleIds.toString();
}
this.$api.sendRequest({
url: '/api/article/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
let data = res.data;
this.list = data;
}
this.loading = false;
}
});
},
toDetail(item) {
this.$util.redirectTo('/pages_tool/article/detail', {
article_id: item.article_id
});
},
imgError(index) {
if (this.list[index]) this.list[index].cover_img = this.$util.getDefaultImage().article;
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.article-wrap { .article-wrap {
.list-wrap { .list-wrap {
.auto-scroll-swiper { .auto-scroll-swiper {
height: 600rpx; /* 可以根据需要调整高度 */ height: 600rpx;
width: 100%; /* 可以根据需要调整高度 */
width: 100%;
.swiper-item-content { .swiper-item-content {
padding: 10rpx 20rpx; padding: 10rpx 20rpx;
box-sizing: border-box; box-sizing: border-box;
}
} }
}
.item {
margin: 0;
margin-bottom: 24rpx;
}
.style-1 .item {
padding: 20rpx;
}
&.style-1 {
.item { .item {
margin: 0; display: flex;
margin-bottom: 24rpx; margin-top: 0;
}
.style-1 .item { &:first-of-type {
padding: 20rpx;
}
&.style-1 {
.item {
display: flex;
margin-top: 0; margin-top: 0;
}
&:first-of-type { .article-img {
margin-top: 0; margin-right: 20rpx;
width: 160rpx;
height: 160rpx;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
image {
width: 100%;
} }
}
.article-img { .info-wrap {
margin-right: 20rpx; flex: 1;
width: 160rpx; display: flex;
height: 160rpx; flex-direction: column;
justify-content: space-between;
.title {
font-weight: bold;
margin-bottom: 10rpx;
overflow: hidden; overflow: hidden;
display: flex; text-overflow: ellipsis;
align-items: center; display: -webkit-box;
justify-content: center; -webkit-line-clamp: 2;
-webkit-box-orient: vertical;
image { font-size: 30rpx;
width: 100%; line-height: 1.5;
}
} }
.info-wrap { .abstract {
flex: 1; overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
font-size: $font-size-tag;
}
.read-wrap {
display: flex; display: flex;
flex-direction: column; color: #999ca7;
justify-content: space-between; justify-content: flex-start;
align-items: center;
margin-top: 10rpx;
line-height: 1;
.title { text {
font-weight: bold;
margin-bottom: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
font-size: 30rpx;
line-height: 1.5;
}
.abstract {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
font-size: $font-size-tag; font-size: $font-size-tag;
} }
.read-wrap { .iconfont {
display: flex; font-size: 36rpx;
color: #999ca7; vertical-align: bottom;
justify-content: flex-start; margin-right: 10rpx;
align-items: center; }
margin-top: 10rpx;
line-height: 1;
text { .category-icon {
font-size: $font-size-tag; width: 8rpx;
} height: 8rpx;
border-radius: 50%;
background: $base-color;
margin-right: 10rpx;
}
.iconfont { .date {
font-size: 36rpx; margin-left: 20rpx;
vertical-align: bottom;
margin-right: 10rpx;
}
.category-icon {
width: 8rpx;
height: 8rpx;
border-radius: 50%;
background: $base-color;
margin-right: 10rpx;
}
.date {
margin-left: 20rpx;
}
} }
} }
} }
} }
} }
} }
}
</style> </style>

View File

@@ -1,444 +1,453 @@
<template> <template>
<view data-component-name="diy-audio"> <view data-component-name="diy-audio">
<view class="fui-audio style1" :style="{background:value.background}" v-if="value.type == 'style-2'"> <view class="fui-audio style1" :style="{ background: value.background }" v-if="value.type == 'style-2'">
<view class="content" style="padding-top: 20rpx;"> <view class="content" style="padding-top: 20rpx;">
<view class="name" :style="{color:value.textcolor}">{{value.text}}</view> <view class="name" :style="{ color: value.textcolor }">{{ value.text }}</view>
<view class="author" :style="{color:value.subtitlecolor}">{{value.desc}}----{{value.id}}</view> <view class="author" :style="{ color: value.subtitlecolor }">{{ value.desc }}----{{ value.id }}</view>
</view> </view>
<view class="progress"> <view class="progress">
<view class="progressBar" :style="{width:audiowidth}"></view> <view class="progressBar" :style="{ width: audiowidth }"></view>
</view> </view>
<view class="time" :style="{color:value.timecolor}"> <view class="time" :style="{ color: value.timecolor }">
{{audiotime}} {{ audiotime }}
</view> </view>
<view @click="play()" class="start" :class="status?'iconj icon-07zanting':'iconj icon-bofang'" style="padding-top: 18rpx"></view> <view @click="play()" class="start" :class="status ? 'iconj icon-07zanting' : 'iconj icon-bofang'"
style="padding-top: 18rpx"></view>
</view> </view>
<view class="fui-audio style3" :style="{background:value.background}" v-else> <view class="fui-audio style3" :style="{ background: value.background }" v-else>
<!-- <audio src="/static/audio/bgm.mp3" controls loop></audio> --> <!-- <audio src="/static/audio/bgm.mp3" controls loop></audio> -->
<view class="img"> <view class="img">
<image :src="$util.img(value.imageUrl)"></image> <image :src="$util.img(value.imageUrl)"></image>
</view> </view>
<view class="content"> <view class="content">
<view class="name" :style="{color:value.textcolor}">{{value.text}}</view> <view class="name" :style="{ color: value.textcolor }">{{ value.text }}</view>
<view class="author" :style="{color:value.subtitlecolor}">{{value.desc}}</view> <view class="author" :style="{ color: value.subtitlecolor }">{{ value.desc }}</view>
</view> </view>
<view class="progress"> <view class="progress">
<view class="progressBar" :style="{width:audiowidth}"></view> <view class="progressBar" :style="{ width: audiowidth }"></view>
</view> </view>
<view class="time" :style="{color:value.timecolor}"> <view class="time" :style="{ color: value.timecolor }">
<!-- {{audios[value.id].audiotime}} --> <!-- {{audios[value.id].audiotime}} -->
{{audiotime}} {{ audiotime }}
</view> </view>
<view @click="play()" class="start" :class="status?'iconj icon-07zanting':'iconj icon-bofang'"></view> <view @click="play()" class="start" :class="status ? 'iconj icon-07zanting' : 'iconj icon-bofang'"></view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
// 音频 import DiyMinx from './minx.js'
export default { // 音频
name: 'diy-audio', export default {
props: { name: 'diy-audio',
value: { props: {
type: Object value: {
type: Object
}
},
mixins: [DiyMinx],
data() {
return {
audiosObj: [],
audios: {},
audioContext: null,
audiotime: '00:01',
audiowidth: 0,
status: 0,//1播放0停止
};
},
created() {
// console.log(this.value)
this.audios[this.value.id] = {
audiotime: '00:01',
audiowidth: 0
}
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
videoWarpCss: function () {
var obj = '';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
}, return obj;
data() { }
return { },
audiosObj:[], methods: {
audios: {},
audioContext:null, play() {
audiotime:'00:01',
audiowidth:0, var t = this.value.id, a = this.audiosObj[t] || !1;
status:0,//1播放0停止 var e = {
}; audio: this.$util.img(this.value.audioUrl),
},
created() {
// console.log(this.value)
this.audios[this.value.id] = {
audiotime:'00:01',
audiowidth:0
} }
}, if (!a) {
watch: { a = uni.createInnerAudioContext("audio_" + t);
// 组件刷新监听 var i = this.audiosObj;
componentRefresh: function(nval) {} i[t] = a, this.audiosObj = i
}, // uni.setStorageSync('audio_list',audio_list)
computed: { var audio_list = uni.getStorageSync('audio_list') ? uni.getStorageSync('audio_list') : []
videoWarpCss: function() { if (audio_list.includes(t) == false) {
var obj = ''; audio_list.push(t)
if (this.value.componentAngle == 'round') { uni.setStorageSync('audio_list', audio_list)
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
return obj;
} }
console.log(uni.getStorageSync('audio_list'))
var n = this;
// console.log(a)
a.onPlay(function () {
var e = setInterval(function () {
var i = a.currentTime / a.duration * 100 + "%", s = Math.floor(Math.ceil(a.currentTime) / 60), o = (Math.ceil(a.currentTime) % 60 / 100).toFixed(2).slice(-2), r = Math.ceil(a.currentTime);
s < 10 && (s = "0" + s);
var u = s + ":" + o, c = n.audios;
// console.log(i)
c[t].audiowidth = i, c[t].Time = e, c[t].audiotime = u, c[t].seconds = r, n.audios = c;
}, 1e3);
});
var s = n.$util.img(n.value.audioUrl), o = n.audios[n.value.id].seconds || 0, r = 0, u = 1;
0 == u && a.onEnded(function (e) {
c[t].status = !1, n.status = !1, c[t].seconds = 0, console.log(c), n.audios = c;
});
var c = n.audios;
c[t] || (c[t] = {}), a.paused && 0 == o ? (a.src = s, a.play(), 1 == u && (a.loop = !0),
c[t].status = !0, n.status = !0, n.pauseOther(t)) : a.paused && o > 0 ? (a.play(), 0 == r ? a.seek(o) : a.seek(0),
c[t].status = !0, n.status = !0, n.pauseOther(t)) : (a.pause(), c[t].status = !1, n.status = !1), n.audios = c;
console.log(n.audios)
}, },
methods: { pauseOther: function (e) {
var t = this;
play(){ // console.log(this.audiosObj[this.value.id]);
var i = this.audiosObj[this.value.id], a = this.value.id
var t = this.value.id, a = this.audiosObj[t] || !1; // console.log(i)
var e = { // console.log(a)
audio:this.$util.img(this.value.audioUrl), // if (a != e) {
} // i.pause();
if (!a) { // var n = t.audios;
a = uni.createInnerAudioContext("audio_" + t); // n[a] && (n[a].status = !1, this.audios=n);
var i = this.audiosObj; // }
i[t] = a, this.audiosObj = i var audios = document.getElementsByTagName("audio");
// uni.setStorageSync('audio_list',audio_list) // 暂停函数
var audio_list = uni.getStorageSync('audio_list')?uni.getStorageSync('audio_list'):[] function pauseAll() {
if(audio_list.includes(t) == false){
audio_list.push(t)
uni.setStorageSync('audio_list',audio_list)
}
}
console.log(uni.getStorageSync('audio_list'))
var n = this;
// console.log(a)
a.onPlay(function() {
var e = setInterval(function() {
var i = a.currentTime / a.duration * 100 + "%", s = Math.floor(Math.ceil(a.currentTime) / 60), o = (Math.ceil(a.currentTime) % 60 / 100).toFixed(2).slice(-2), r = Math.ceil(a.currentTime);
s < 10 && (s = "0" + s);
var u = s + ":" + o, c = n.audios;
// console.log(i)
c[t].audiowidth = i, c[t].Time = e, c[t].audiotime = u, c[t].seconds = r, n.audios = c;
}, 1e3);
});
var s = n.$util.img(n.value.audioUrl), o = n.audios[n.value.id].seconds || 0, r = 0, u = 1;
0 == u && a.onEnded(function(e) {
c[t].status = !1,n.status=!1,c[t].seconds = 0,console.log(c),n.audios = c;
});
var c = n.audios;
c[t] || (c[t] = {}), a.paused && 0 == o ? (a.src = s, a.play(), 1 == u && (a.loop = !0),
c[t].status = !0,n.status=!0, n.pauseOther(t)) : a.paused && o > 0 ? (a.play(), 0 == r ? a.seek(o) : a.seek(0),
c[t].status = !0,n.status=!0, n.pauseOther(t)) : (a.pause(), c[t].status = !1,n.status=!1),n.audios = c;
console.log(n.audios)
},
pauseOther: function(e) {
var t = this;
// console.log(this.audiosObj[this.value.id]);
var i = this.audiosObj[this.value.id],a = this.value.id
// console.log(i)
// console.log(a)
// if (a != e) {
// i.pause();
// var n = t.audios;
// n[a] && (n[a].status = !1, this.audios=n);
// }
var audios = document.getElementsByTagName("audio");
// 暂停函数
function pauseAll() {
var self = this; var self = this;
[].forEach.call(audios, function (i) { [].forEach.call(audios, function (i) {
// 将audios中其他的audio全部暂停 // 将audios中其他的audio全部暂停
i !== self && i.pause(); i !== self && i.pause();
}) })
}
// 给play事件绑定暂停函数
[].forEach.call(audios, function (i) {
i.addEventListener("play", pauseAll.bind(i));
})
// var audio_list = uni.getStorageSync('audio_list')
// audio_list.forEach(function(value, index) {
// if (value != e) {
// console.log(e)
// uni.createInnerAudioContext("audio_" + value).pause();
// }
// });
// this.audiosObj.forEach(function(value, index) {
// console.log(value);
// });
// this.each(this.audiosObj, function(a, i) {
// if (a != e) {
// i.pause();
// var n = t.data.audios;
// n[a] && (n[a].status = !1, t.setData({
// audios: n
// }));
// }
// });
},
play_bak(){
var t = this.value.id
this.audioContext = uni.createInnerAudioContext("audio_" + this.value.id);
this.audioContext.src = this.$util.img(this.value.audioUrl);
var that = this
if(this.status == 1){
this.audioContext.pause();
this.status = 0
return false
}
this.audioContext.play();
this.status = 1
this.audioContext.onCanplay(function(s){
var e = setInterval(function() {
var i = parseFloat(that.audioContext.currentTime) / parseFloat(that.audioContext.duration) * 100 + "%", s = Math.floor(Math.ceil(that.audioContext.currentTime) / 60), o = (Math.ceil(that.audioContext.currentTime) % 60 / 100).toFixed(2).slice(-2), r = Math.ceil(that.audioContext.currentTime);
s < 10 && (s = "0" + s);
var u = s + ":" + o, c = that.audios;
c[t].audiowidth = i, c[t].Time = e, c[t].audiotime = u, c[t].seconds = r
that.audios = c
// console.log(c)
console.log(that.audios[that.value.id].audiotime)
that.audiotime = that.audios[that.value.id].audiotime
that.audiowidth = that.audios[that.value.id].audiowidth
console.log(i)
that.lyg = i
}, 1e3);
});
this.audioContext.onEnded(() => {
console.log('播放结束');
this.status = 0
});
} }
// 给play事件绑定暂停函数
[].forEach.call(audios, function (i) {
i.addEventListener("play", pauseAll.bind(i));
})
// var audio_list = uni.getStorageSync('audio_list')
// audio_list.forEach(function(value, index) {
// if (value != e) {
// console.log(e)
// uni.createInnerAudioContext("audio_" + value).pause();
// }
// });
// this.audiosObj.forEach(function(value, index) {
// console.log(value);
// });
// this.each(this.audiosObj, function(a, i) {
// if (a != e) {
// i.pause();
// var n = t.data.audios;
// n[a] && (n[a].status = !1, t.setData({
// audios: n
// }));
// }
// });
},
play_bak() {
var t = this.value.id
this.audioContext = uni.createInnerAudioContext("audio_" + this.value.id);
this.audioContext.src = this.$util.img(this.value.audioUrl);
var that = this
if (this.status == 1) {
this.audioContext.pause();
this.status = 0
return false
}
this.audioContext.play();
this.status = 1
this.audioContext.onCanplay(function (s) {
var e = setInterval(function () {
var i = parseFloat(that.audioContext.currentTime) / parseFloat(that.audioContext.duration) * 100 + "%", s = Math.floor(Math.ceil(that.audioContext.currentTime) / 60), o = (Math.ceil(that.audioContext.currentTime) % 60 / 100).toFixed(2).slice(-2), r = Math.ceil(that.audioContext.currentTime);
s < 10 && (s = "0" + s);
var u = s + ":" + o, c = that.audios;
c[t].audiowidth = i, c[t].Time = e, c[t].audiotime = u, c[t].seconds = r
that.audios = c
// console.log(c)
console.log(that.audios[that.value.id].audiotime)
that.audiotime = that.audios[that.value.id].audiotime
that.audiowidth = that.audios[that.value.id].audiowidth
console.log(i)
that.lyg = i
}, 1e3);
});
this.audioContext.onEnded(() => {
console.log('播放结束');
this.status = 0
});
} }
}; }
};
</script> </script>
<style scoped> <style scoped>
.fui-audio {
width: 100%;
border: 1rpx solid #eeeeee;
padding: 0 30rpx 0 20rpx;
box-sizing: border-box;
position: relative;
overflow: hidden;
background: #fff;
}
.fui-audio { .fui-audio .img {
width: 100%; width: 100rpx;
border: 1rpx solid #eeeeee; height: 100rpx;
padding: 0 30rpx 0 20rpx; background: #000;
box-sizing: border-box; }
position: relative;
overflow: hidden;
background: #fff;
}
.fui-audio .img { .fui-audio .img image {
width: 100rpx; width: 100%;
height: 100rpx; height: 100%;
background: #000; }
}
.fui-audio .img image { .fui-audio .name {
width: 100%; font-size: 26rpx;
height: 100%; color: #333;
} }
.fui-audio .name { .fui-audio .author {
font-size: 26rpx; font-size: 26rpx;
color: #333; color: #666;
} }
.fui-audio .author { .fui-audio .time {
font-size: 26rpx; font-size: 24rpx;
color: #666; color: #999;
} }
.fui-audio .time { .fui-audio .start {
font-size: 24rpx; border: 0;
color: #999; padding: 0;
} margin: 0;
font-size: 28rpx;
}
.fui-audio .start { .progressBar {
border: 0; height: 2rpx;
padding: 0; width: 0;
margin: 0; background: #333;
font-size: 28rpx; }
}
.progressBar { .fui-audio.style1 {
height: 2rpx; height: 86rpx;
width: 0; line-height: 82rpx;
background: #333; }
}
.fui-audio.style1 { .fui-audio.style1 .img,
height: 86rpx; .fui-audio.style2 .img {
line-height: 82rpx; display: none;
} }
.fui-audio.style1 .img,.fui-audio.style2 .img { .fui-audio.style1 .name,
display: none; .fui-audio.style2 .name {
} float: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 300rpx;
}
.fui-audio.style1 .name,.fui-audio.style2 .name { .fui-audio.style1 .author,
float: left; .fui-audio.style2 .author {
overflow: hidden; float: left;
text-overflow: ellipsis; margin-left: 12rpx;
white-space: nowrap; overflow: hidden;
max-width: 300rpx; text-overflow: ellipsis;
} white-space: nowrap;
max-width: 200rpx;
}
.fui-audio.style1 .author,.fui-audio.style2 .author { .fui-audio.style1 .time,
float: left; .fui-audio.style4 .time {
margin-left: 12rpx; display: none;
overflow: hidden; }
text-overflow: ellipsis;
white-space: nowrap;
max-width: 200rpx;
}
.fui-audio.style1 .time,.fui-audio.style4 .time { .fui-audio.style1 .start {
display: none; position: absolute;
} top: 0rpx;
right: 40rpx;
width: 40rpx;
height: 40rpx;
color: #000;
}
.fui-audio.style1 .start { .fui-audio.style1 .progress {
position: absolute; position: absolute;
top: 0rpx; bottom: 0;
right: 40rpx; left: 0;
width: 40rpx; right: 0;
height: 40rpx; }
color: #000;
}
.fui-audio.style1 .progress { .fui-audio.style2 {
position: absolute; height: 86rpx;
bottom: 0; line-height: 82rpx;
left: 0; }
right: 0;
}
.fui-audio.style2 { .fui-audio.style2 .img {
height: 86rpx; display: none;
line-height: 82rpx; }
}
.fui-audio.style2 .img { .fui-audio.style2 .time {
display: none; position: absolute;
} top: 0;
right: 30rpx;
}
.fui-audio.style2 .time { .fui-audio.style2 .name {
position: absolute; margin-left: 70rpx;
top: 0; }
right: 30rpx;
}
.fui-audio.style2 .name { .fui-audio.style2 .start {
margin-left: 70rpx; position: absolute;
} top: 0rpx;
left: 30rpx;
width: 30rpx;
height: 30rpx;
color: #000;
}
.fui-audio.style2 .start { .fui-audio.style2 .progress,
position: absolute; .fui-audio.style3 .progress {
top: 0rpx; display: none;
left: 30rpx; }
width: 30rpx;
height: 30rpx;
color: #000;
}
.fui-audio.style2 .progress,.fui-audio.style3 .progress { .fui-audio.style3 {
display: none; padding: 8rpx;
} }
.fui-audio.style3 { .fui-audio.style3 .start {
padding: 8rpx; position: absolute;
} top: 30rpx;
left: 28rpx;
width: 56rpx;
height: 56rpx;
color: #fff;
/* border: 2rpx solid #fff; */
border-radius: 50%;
text-indent: 18rpx;
line-height: 56rpx;
}
.fui-audio.style3 .start { .fui-audio.style3 .img,
position: absolute; .fui-audio.style4 .img {
top: 30rpx; float: left;
left: 28rpx; margin-right: 20rpx;
width: 56rpx; }
height: 56rpx;
color: #fff;
/* border: 2rpx solid #fff; */
border-radius: 50%;
text-indent: 18rpx;
line-height: 56rpx;
}
.fui-audio.style3 .img,.fui-audio.style4 .img { .fui-audio.style3 .content {
float: left; width: 468rpx;
margin-right: 20rpx; }
}
.fui-audio.style3 .content { .fui-audio.style3 .content,
width: 468rpx; .fui-audio.style4 .content {
} float: left;
height: 100rpx;
display: flex;
flex-direction: column;
justify-content: center;
}
.fui-audio.style3 .content,.fui-audio.style4 .content { .fui-audio.style3 .content .name {
float: left; height: 40rpx;
height: 100rpx; overflow: hidden;
display: flex; text-overflow: ellipsis;
flex-direction: column; white-space: nowrap;
justify-content: center; }
}
.fui-audio.style3 .content .name { .fui-audio.style3 .content .author {
height: 40rpx; overflow: hidden;
overflow: hidden; text-overflow: ellipsis;
text-overflow: ellipsis; white-space: nowrap;
white-space: nowrap; }
}
.fui-audio.style3 .content .author { .fui-audio.style3 .time {
overflow: hidden; position: absolute;
text-overflow: ellipsis; top: 40rpx;
white-space: nowrap; right: 30rpx;
} }
.fui-audio.style3 .time { .fui-audio.style4 {
position: absolute; padding: 10rpx;
top: 40rpx; }
right: 30rpx;
}
.fui-audio.style4 { .fui-audio.style4 .content {
padding: 10rpx; padding-bottom: 18rpx;
} height: 82rpx;
width: 500rpx;
}
.fui-audio.style4 .content { .fui-audio.style4 .start {
padding-bottom: 18rpx; position: absolute;
height: 82rpx; top: 32rpx;
width: 500rpx; right: 30rpx;
} width: 30rpx;
height: 30rpx;
color: #000;
}
.fui-audio.style4 .start { .fui-audio.style4 .name {
position: absolute; line-height: 1.2;
top: 32rpx; overflow: hidden;
right: 30rpx; text-overflow: ellipsis;
width: 30rpx; white-space: nowrap;
height: 30rpx; }
color: #000;
}
.fui-audio.style4 .name { .fui-audio.style4 .author {
line-height: 1.2; line-height: 1.2;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.fui-audio.style4 .author { .fui-audio.style4 .progress {
line-height: 1.2; background: #f5f5f5;
overflow: hidden; height: 4rpx;
text-overflow: ellipsis; position: absolute;
white-space: nowrap; bottom: 24rpx;
} left: 130rpx;
right: 30rpx;
border-radius: 2rpx;
overflow: hidden;
}
.fui-audio.style4 .progress { .fui-audio.style4 .progressBar {
background: #f5f5f5; height: 4rpx;
height: 4rpx; }
position: absolute;
bottom: 24rpx;
left: 130rpx;
right: 30rpx;
border-radius: 2rpx;
overflow: hidden;
}
.fui-audio.style4 .progressBar {
height: 4rpx;
}
.diy-audio>>>.uni-video-container { .diy-audio>>>.uni-video-container {
background-color: transparent; background-color: transparent;
} }
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -5,14 +5,18 @@
<view class="item" v-for="(item, index) in tabBarList.list" :key="item.id" @click="redirectTo(item.link)"> <view class="item" v-for="(item, index) in tabBarList.list" :key="item.id" @click="redirectTo(item.link)">
<view class="bd"> <view class="bd">
<block v-if="item.link.wap_url == '/pages_goods/cart'"> <block v-if="item.link.wap_url == '/pages_goods/cart'">
<view class="icon" v-if="tabBarList.type == 1 || tabBarList.type == 2" :animation="cartAnimation" id="tabbarCart"> <view class="icon" v-if="tabBarList.type == 1 || tabBarList.type == 2"
:animation="cartAnimation" id="tabbarCart">
<block v-if="verify(item.link)"> <block v-if="verify(item.link)">
<image v-if="item.selected_icon_type == 'img'" :src="$util.img(item.selectedIconPath)" /> <image v-if="item.selected_icon_type == 'img'"
<diy-icon v-if="item.selected_icon_type == 'icon'" :icon="item.selectedIconPath" :value="item.selected_style ? item.selected_style : null"></diy-icon> :src="$util.img(item.selectedIconPath)" />
<diy-icon v-if="item.selected_icon_type == 'icon'" :icon="item.selectedIconPath"
:value="item.selected_style ? item.selected_style : null"></diy-icon>
</block> </block>
<block v-else> <block v-else>
<image v-if="item.icon_type == 'img'" :src="$util.img(item.iconPath)" /> <image v-if="item.icon_type == 'img'" :src="$util.img(item.iconPath)" />
<diy-icon v-if="item.icon_type == 'icon'" :icon="item.iconPath" :value="item.style ? item.style : null"></diy-icon> <diy-icon v-if="item.icon_type == 'icon'" :icon="item.iconPath"
:value="item.style ? item.style : null"></diy-icon>
</block> </block>
<view class="cart-count-mark font-size-activity-tag" <view class="cart-count-mark font-size-activity-tag"
:class="{ max: item.link.wap_url == '/pages_goods/cart' && cartNumber > 99 }" :class="{ max: item.link.wap_url == '/pages_goods/cart' && cartNumber > 99 }"
@@ -24,21 +28,27 @@
<block v-else> <block v-else>
<view class="icon" v-if="tabBarList.type == 1 || tabBarList.type == 2"> <view class="icon" v-if="tabBarList.type == 1 || tabBarList.type == 2">
<block v-if="verify(item.link)"> <block v-if="verify(item.link)">
<image v-if="item.selected_icon_type == 'img'" :src="$util.img(item.selectedIconPath)" /> <image v-if="item.selected_icon_type == 'img'"
:src="$util.img(item.selectedIconPath)" />
<diy-icon v-if="item.selected_icon_type == 'icon'" :icon="item.selectedIconPath" <diy-icon v-if="item.selected_icon_type == 'icon'" :icon="item.selectedIconPath"
:value="item.selected_style ? item.selected_style : null"></diy-icon> :value="item.selected_style ? item.selected_style : null"></diy-icon>
</block> </block>
<block v-else> <block v-else>
<image v-if="item.icon_type == 'img'" :src="$util.img(item.iconPath)" /> <image v-if="item.icon_type == 'img'" :src="$util.img(item.iconPath)" />
<diy-icon v-if="item.icon_type == 'icon'" :icon="item.iconPath" :value="item.style ? item.style : null"></diy-icon> <diy-icon v-if="item.icon_type == 'icon'" :icon="item.iconPath"
:value="item.style ? item.style : null"></diy-icon>
</block> </block>
</view> </view>
</block> </block>
<view class="label" v-if="(tabBarList.type == 1 || tabBarList.type == 3) && tabBarList.theme == 'diy'" :style="{ color: verify(item.link) ? tabBarList.textHoverColor : tabBarList.textColor }"> <view class="label"
{{ lang =='en-us'?item.en_text:item.text }} v-if="(tabBarList.type == 1 || tabBarList.type == 3) && tabBarList.theme == 'diy'"
:style="{ color: verify(item.link) ? tabBarList.textHoverColor : tabBarList.textColor }">
{{ lang == 'en-us' ? item.en_text : item.text }}
</view> </view>
<view class="label" v-if="(tabBarList.type == 1 || tabBarList.type == 3) && tabBarList.theme == 'default'" :style="{ color: verify(item.link) ? 'var(--base-color)' : '#333333' }"> <view class="label"
{{ lang =='en-us'?item.en_text:item.text }} v-if="(tabBarList.type == 1 || tabBarList.type == 3) && tabBarList.theme == 'default'"
:style="{ color: verify(item.link) ? 'var(--base-color)' : '#333333' }">
{{ lang == 'en-us' ? item.en_text : item.text }}
</view> </view>
</view> </view>
</view> </view>
@@ -49,173 +59,210 @@
</template> </template>
<script> <script>
export default { import DiyMinx from './minx.js'
name: 'diy-bottom-nav', // 底部导航栏
props: { export default {
value: { name: 'diy-bottom-nav',
type: Object props: {
}, value: {
name: { type: Object
type: String,
default: ''
}
}, },
data() { name: {
return { type: String,
lang:uni.getStorageSync("lang"), default: ''
currentRoute: '', //当前页面路径 }
jumpFlag: true, //是否可以跳转,防止重复点击 },
cartAnimation: {} mixins: [DiyMinx],
}; data() {
}, return {
mounted() { lang: uni.getStorageSync("lang"),
let currentPage = getCurrentPages()[getCurrentPages().length - 1]; currentRoute: '', //当前页面路径
if (currentPage && currentPage.route) { jumpFlag: true, //是否可以跳转,防止重复点击
this.currentRoute = currentPage.route; cartAnimation: {}
} };
this.$nextTick(() => { },
if (!this.$store.state.cartPosition) { mounted() {
let query = uni.createSelectorQuery().in(this); let currentPage = getCurrentPages()[getCurrentPages().length - 1];
query.select('#tabbarCart') if (currentPage && currentPage.route) {
.boundingClientRect(data => { this.currentRoute = currentPage.route;
if (data) this.$store.commit('setCartPosition', data); }
}).exec(); this.$nextTick(() => {
if (!this.$store.state.cartPosition) {
let query = uni.createSelectorQuery().in(this);
query.select('#tabbarCart')
.boundingClientRect(data => {
if (data) this.$store.commit('setCartPosition', data);
}).exec();
query.select('.tab-bar') query.select('.tab-bar')
.boundingClientRect(data => { .boundingClientRect(data => {
if (data) this.$store.commit('setTabBarHeight', data.height + if (data) this.$store.commit('setTabBarHeight', data.height +
'px'); 'px');
}).exec(); }).exec();
}
});
},
computed: {
cartChange() {
return this.$store.state.cartChange;
} }
}, });
watch: { },
cartChange: function (nval, oval) { computed: {
if (nval > oval) { cartChange() {
let animation = uni.createAnimation({ return this.$store.state.cartChange;
duration: 200, }
timingFunction: 'ease' },
}); watch: {
animation.scale(1.2).step(); cartChange: function (nval, oval) {
if (nval > oval) {
let animation = uni.createAnimation({
duration: 200,
timingFunction: 'ease'
});
animation.scale(1.2).step();
this.cartAnimation = animation.export();
setTimeout(() => {
animation.scale(1).step();
this.cartAnimation = animation.export(); this.cartAnimation = animation.export();
setTimeout(() => { }, 300);
animation.scale(1).step();
this.cartAnimation = animation.export();
}, 300);
}
}
},
methods: {
redirectTo(link) {
this.$emit('callback');
this.$util.diyRedirectTo(link);
},
verify(link) {
if (link == null || link == '' || !link.wap_url) return false;
if (this.name) {
var url = this.currentRoute + '?name=' + this.name;
} else {
var url = this.currentRoute;
}
// 首页特殊处理
if (link.wap_url == '/pages/index/index' && this.name == 'DIY_VIEW_INDEX') {
return true;
} else if (url && link.wap_url.indexOf(url) != -1) {
return true;
}
return false;
} }
} }
}; },
methods: {
redirectTo(link) {
this.$emit('callback');
this.$util.diyRedirectTo(link);
},
verify(link) {
if (link == null || link == '' || !link.wap_url) return false;
if (this.name) {
var url = this.currentRoute + '?name=' + this.name;
} else {
var url = this.currentRoute;
}
// 首页特殊处理
if (link.wap_url == '/pages/index/index' && this.name == 'DIY_VIEW_INDEX') {
return true;
} else if (url && link.wap_url.indexOf(url) != -1) {
return true;
}
return false;
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.placeholder { .placeholder {
height: 112rpx; height: 112rpx;
&.bluge { &.bluge {
height: 180rpx; height: 180rpx;
}
} }
}
.safe-area { .safe-area {
padding-bottom: 0; padding-bottom: 0;
padding-bottom: constant(safe-area-inset-bottom); padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);
} }
.tab-bar { .tab-bar {
background-color: #fff; background-color: #fff;
box-sizing: border-box; box-sizing: border-box;
position: fixed; position: fixed;
left: 0;
bottom: 0;
width: 100%;
z-index: 998;
display: flex;
border-top: 2rpx solid #f5f5f5;
padding-bottom: 0;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
.tabbar-border {
background-color: rgba(255, 255, 255, 0.329412);
position: absolute;
left: 0; left: 0;
bottom: 0; top: 0;
width: 100%; width: 100%;
z-index: 998; height: 2rpx;
display: flex; -webkit-transform: scaleY(0.5);
border-top: 2rpx solid #f5f5f5; transform: scaleY(0.5);
padding-bottom: 0; }
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
.tabbar-border { .item {
background-color: rgba(255, 255, 255, 0.329412); display: flex;
position: absolute; align-items: center;
left: 0; -webkit-box-orient: vertical;
top: 0; -webkit-box-direction: normal;
width: 100%; flex: 1;
height: 2rpx; flex-direction: column;
-webkit-transform: scaleY(0.5); padding-bottom: 10rpx;
transform: scaleY(0.5); box-sizing: border-box;
.bd {
position: relative;
height: 100rpx;
flex-direction: column;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
.icon {
position: relative;
display: inline-block;
margin-top: 10rpx;
width: 40rpx;
height: 40rpx;
font-size: 40rpx;
line-height: 40rpx;
image {
width: 100%;
height: 100%;
}
>view {
height: inherit;
display: flex;
align-items: center;
}
.bar-icon {
font-size: 42rpx;
}
}
.label {
position: relative;
text-align: center;
font-size: 24rpx;
line-height: 1;
margin-top: 12rpx;
}
} }
.item { &.bulge {
display: flex;
align-items: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
flex: 1;
flex-direction: column;
padding-bottom: 10rpx;
box-sizing: border-box;
.bd { .bd {
position: relative; position: relative;
height: 100rpx; height: 100rpx;
flex-direction: column; flex-direction: column;
text-align: center; text-align: center;
display: flex;
justify-content: center;
align-items: center;
.icon { .icon {
position: relative; margin-top: -60rpx;
display: inline-block; margin-bottom: 4rpx;
margin-top: 10rpx; border-radius: 50%;
width: 40rpx; width: 100rpx;
height: 40rpx; height: 102rpx;
font-size: 40rpx; padding: 10rpx;
line-height: 40rpx; border-top: 2rpx solid #f5f5f5;
background-color: #fff;
box-sizing: border-box;
image { image {
width: 100%; width: 100%;
height: 100%; height: 100%;
} border-radius: 50%;
>view {
height: inherit;
display: flex;
align-items: center;
}
.bar-icon {
font-size: 42rpx;
} }
} }
@@ -223,71 +270,37 @@
position: relative; position: relative;
text-align: center; text-align: center;
font-size: 24rpx; font-size: 24rpx;
line-height: 1; height: 40rpx;
margin-top: 12rpx; line-height: 40rpx;
}
}
&.bulge {
.bd {
position: relative;
height: 100rpx;
flex-direction: column;
text-align: center;
.icon {
margin-top: -60rpx;
margin-bottom: 4rpx;
border-radius: 50%;
width: 100rpx;
height: 102rpx;
padding: 10rpx;
border-top: 2rpx solid #f5f5f5;
background-color: #fff;
box-sizing: border-box;
image {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.label {
position: relative;
text-align: center;
font-size: 24rpx;
height: 40rpx;
line-height: 40rpx;
}
}
}
.cart-count-mark {
position: absolute;
top: -8rpx;
right: -18rpx;
width: 24rpx;
height: 24rpx !important;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
padding: 6rpx;
border-radius: 50%;
z-index: 99;
&.max {
width: 40rpx;
border-radius: 24rpx;
right: -28rpx;
} }
} }
} }
}
.tab-bar-placeholder { .cart-count-mark {
padding-bottom: calc(constant(safe-area-inset-bottom) + 112rpx); position: absolute;
padding-bottom: calc(env(safe-area-inset-bottom) + 112rpx); top: -8rpx;
right: -18rpx;
width: 24rpx;
height: 24rpx !important;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
padding: 6rpx;
border-radius: 50%;
z-index: 99;
&.max {
width: 40rpx;
border-radius: 24rpx;
right: -28rpx;
}
}
} }
}
.tab-bar-placeholder {
padding-bottom: calc(constant(safe-area-inset-bottom) + 112rpx);
padding-bottom: calc(env(safe-area-inset-bottom) + 112rpx);
}
</style> </style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@
<script> <script>
// 自定义扩展组件 // 自定义扩展组件
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-comp-extend', name: 'diy-comp-extend',
props: { props: {
@@ -11,11 +12,12 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return {}; return {};
}, },
computed: {}, computed: {},
created() {}, created() { },
methods: {} methods: {}
}; };
</script> </script>

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,11 @@
<template> <template>
<view :style="componentStyle"> <view :style="componentStyle">
<scroll-view <scroll-view :class="['graphic-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:class="['graphic-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]" :scroll-x="value.showStyle == 'singleSlide'">
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<view <view v-for="(item, index) in value.list" :key="index"
v-for="(item, index) in value.list"
:key="index"
:class="['graphic-nav-item', value.mode, value.mode === 'text' ? 'newright' : '']" :class="['graphic-nav-item', value.mode, value.mode === 'text' ? 'newright' : '']"
:style="{ width: (100 / value.rowCount + '%') + ';' }" :style="{ width: (100 / value.rowCount + '%') + ';' }">
>
<view style="display:flex;"> <view style="display:flex;">
<view :style="{ <view :style="{
'line-height': '1.2;', 'line-height': '1.2;',
@@ -18,14 +13,8 @@
'font-weight': '600;', 'font-weight': '600;',
'color': value.font.titlecolor + ';' 'color': value.font.titlecolor + ';'
}"> }">
<uv-count-to <uv-count-to :ref="`countTo-${index}`" :autoplay="true" :startVal="30" :endVal="item.title"
:ref="`countTo-${index}`" :decimals="getvalue(item.title)" decimal="."></uv-count-to>
:autoplay="true"
:startVal="30"
:endVal="item.title"
:decimals="getvalue(item.title)"
decimal="."
></uv-count-to>
<text :style="{ <text :style="{
'margin-left': '4rpx;', 'margin-left': '4rpx;',
'font-size': (value.font.unitsize * 2 + 'rpx') + ';', 'font-size': (value.font.unitsize * 2 + 'rpx') + ';',
@@ -51,7 +40,8 @@
<script> <script>
import uvCountTo from '@/components/uv-count-to/uv-count-to.vue' import uvCountTo from '@/components/uv-count-to/uv-count-to.vue'
import nsLogin from '@/components/ns-login/ns-login.vue' import nsLogin from '@/components/ns-login/ns-login.vue'
import DiyMinx from './minx.js'
// 自定义数字展示
export default { export default {
name: 'diy-digit', name: 'diy-digit',
components: { components: {
@@ -64,6 +54,7 @@ export default {
default: () => ({}) default: () => ({})
} }
}, },
mixins: [DiyMinx],
data() { data() {
return { return {
pageWidth: '', pageWidth: '',

View File

@@ -1,47 +1,50 @@
<template> <template>
<view data-component-name="diy-fenxiao-goods-list" class="diy-fenxiao" v-if="list.length" :class="['goods-list', value.template, value.style]" :style="goodsListWarpCss"> <view data-component-name="diy-fenxiao-goods-list" class="diy-fenxiao" v-if="list.length"
<view class="goods-item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> :class="['goods-list', value.template, value.style]" :style="goodsListWarpCss">
<view class="goods-item" v-for="(item, index) in list" :key="index" @click="toDetail(item)"
:class="[value.ornament.type]" :style="goodsItemCss">
<view class="goods-img" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="goods-img" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imgError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imgError(index)" />
</view> </view>
<view class="info-wrap" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl || value.btnStyle.control"> <view class="info-wrap"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl || value.btnStyle.control">
<view class="name-wrap"> <view class="name-wrap">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]" :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
>
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
</view> </view>
<view class="pro-info"> <view class="pro-info">
<view class="discount-price"> <view class="discount-price">
<view class="price-wrap" v-if="value.priceStyle.mainControl"> <view class="price-wrap" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }"> </text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }">{{ item.commission_money.split('.')[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }"> </text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }">{{ '.' + item.commission_money.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }">{{
item.commission_money.split('.')[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor : '' }">{{ '.' +
item.commission_money.split('.')[1] }}</text>
</view> </view>
<view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 0" <view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 0" :style="{
:style="{ background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '',
background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '', color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '',
color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '', borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx' }" @click.stop="followGoods(item, index)">
}"
@click.stop="followGoods(item, index)"
>
关注 关注
</view> </view>
<view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 1" <view class="sale-btn" v-if="value.btnStyle.control && item.is_collect == 1" :style="{
:style="{ background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '',
background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '', color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '',
color: value.btnStyle.theme == 'diy' ? value.btnStyle.textColor : '', borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx'
borderRadius: value.btnStyle.aroundRadius * 2 + 'rpx' }" @click.stop="delFollowTip(item, index)">
}"
@click.stop="delFollowTip(item, index)"
>
取消关注 取消关注
</view> </view>
</view> </view>
<view class="delete-price" v-if="value.priceStyle.lineControl" :style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }"> <view class="delete-price" v-if="value.priceStyle.lineControl"
:style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">
{{ item.discount_price }} {{ item.discount_price }}
</view> </view>
</view> </view>
@@ -51,6 +54,8 @@
</template> </template>
<script> <script>
// 自定义分晓商品列表
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-fenxiao-goods-list', name: 'diy-fenxiao-goods-list',
props: { props: {
@@ -58,6 +63,7 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return { return {
list: [], list: [],
@@ -80,7 +86,7 @@ export default {
}, },
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) { componentRefresh: function (nval) {
this.getData(); this.getData();
} }
}, },
@@ -209,8 +215,7 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.diy-fenxiao { .diy-fenxiao {}
}
// 商品列表单列样式 // 商品列表单列样式
.goods-list.row1-of1 { .goods-list.row1-of1 {
@@ -218,9 +223,11 @@ export default {
background-color: #fff; background-color: #fff;
display: flex; display: flex;
margin-bottom: 20rpx; margin-bottom: 20rpx;
&:last-of-type { &:last-of-type {
margin-bottom: 0; margin-bottom: 0;
} }
&.shadow { &.shadow {
margin: 8rpx 8rpx 20rpx 8rpx; margin: 8rpx 8rpx 20rpx 8rpx;
} }
@@ -229,6 +236,7 @@ export default {
width: 180rpx; width: 180rpx;
overflow: hidden; overflow: hidden;
margin-right: 20rpx; margin-right: 20rpx;
image { image {
width: 100%; width: 100%;
} }
@@ -244,9 +252,11 @@ export default {
.name-wrap { .name-wrap {
flex: 1; flex: 1;
margin-bottom: 10rpx; margin-bottom: 10rpx;
.goods-name { .goods-name {
font-size: $font-size-base; font-size: $font-size-base;
line-height: 1.3; line-height: 1.3;
&.multi-hidden { &.multi-hidden {
height: 72rpx; height: 72rpx;
} }
@@ -257,25 +267,31 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
.sale { .sale {
font-size: 20rpx; font-size: 20rpx;
line-height: 1; line-height: 1;
color: #999; color: #999;
} }
.discount-price { .discount-price {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 10rpx; margin-bottom: 10rpx;
.price-wrap { .price-wrap {
white-space: nowrap; white-space: nowrap;
.unit { .unit {
font-size: $font-size-tag; font-size: $font-size-tag;
color: $base-color; color: $base-color;
} }
.price { .price {
font-size: $font-size-toolbar; font-size: $font-size-toolbar;
} }
text { text {
font-weight: bold; font-weight: bold;
color: $base-color; color: $base-color;
@@ -291,6 +307,7 @@ export default {
font-size: $font-size-activity-tag; font-size: $font-size-activity-tag;
} }
} }
.sale-btn { .sale-btn {
position: absolute; position: absolute;
right: 20rpx; right: 20rpx;
@@ -310,6 +327,7 @@ export default {
.goods-list.row1-of2 { .goods-list.row1-of2 {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
.goods-item { .goods-item {
position: relative; position: relative;
background: #fff; background: #fff;
@@ -317,24 +335,30 @@ export default {
margin-right: 20rpx; margin-right: 20rpx;
margin-top: 20rpx; margin-top: 20rpx;
width: calc(50% - 10rpx); width: calc(50% - 10rpx);
&:nth-child(2n + 2) { &:nth-child(2n + 2) {
width: calc(50% - 11rpx); width: calc(50% - 11rpx);
margin-right: 0; margin-right: 0;
} }
&:nth-of-type(1), &:nth-of-type(1),
&:nth-of-type(2) { &:nth-of-type(2) {
margin-top: 0; margin-top: 0;
} }
&.shadow { &.shadow {
width: calc(50% - 18rpx); width: calc(50% - 18rpx);
&:nth-child(2n-1) { &:nth-child(2n-1) {
margin-left: 8rpx; margin-left: 8rpx;
} }
&:nth-of-type(1), &:nth-of-type(1),
&:nth-of-type(2) { &:nth-of-type(2) {
margin-top: 8rpx; margin-top: 8rpx;
} }
} }
.goods-img { .goods-img {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
@@ -355,9 +379,11 @@ export default {
.name-wrap { .name-wrap {
margin-bottom: 10rpx; margin-bottom: 10rpx;
.goods-name { .goods-name {
font-size: $font-size-base; font-size: $font-size-base;
line-height: 1.3; line-height: 1.3;
&.multi-hidden { &.multi-hidden {
height: 72rpx; height: 72rpx;
} }
@@ -369,24 +395,30 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
.sale { .sale {
font-size: 20rpx; font-size: 20rpx;
line-height: 1; line-height: 1;
color: #999; color: #999;
} }
.discount-price { .discount-price {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.price-wrap { .price-wrap {
white-space: nowrap; white-space: nowrap;
.unit { .unit {
font-size: $font-size-tag; font-size: $font-size-tag;
color: $base-color; color: $base-color;
} }
.price { .price {
font-size: $font-size-toolbar; font-size: $font-size-toolbar;
} }
text { text {
font-weight: bold; font-weight: bold;
color: $base-color; color: $base-color;
@@ -402,6 +434,7 @@ export default {
font-size: $font-size-activity-tag; font-size: $font-size-activity-tag;
} }
} }
.sale-btn { .sale-btn {
position: absolute; position: absolute;
right: 20rpx; right: 20rpx;

View File

@@ -1,8 +1,12 @@
<template> <template>
<view data-component-name="diy-float-btn" class="float-btn" :class="{ left_top: value.bottomPosition == 1, right_top: value.bottomPosition == 2, left_bottom: value.bottomPosition == 3, right_bottom: value.bottomPosition == 4 }" :style="style"> <view data-component-name="diy-float-btn" class="float-btn"
:class="{ left_top: value.bottomPosition == 1, right_top: value.bottomPosition == 2, left_bottom: value.bottomPosition == 3, right_bottom: value.bottomPosition == 4 }"
:style="style">
<block v-for="(item, index) in value.list" :key="index"> <block v-for="(item, index) in value.list" :key="index">
<view class="button-box" @click="$util.diyRedirectTo(item.link)" :style="{ width: value.imageSize + 'px', height: value.imageSize + 'px', fontSize: value.imageSize + 'px' }"> <view class="button-box" @click="$util.diyRedirectTo(item.link)"
<image v-if="!item.iconType || item.iconType == 'img'" :src="$util.img(item.imageUrl)" mode="aspectFit" :show-menu-by-longpress="true"/> :style="{ width: value.imageSize + 'px', height: value.imageSize + 'px', fontSize: value.imageSize + 'px' }">
<image v-if="!item.iconType || item.iconType == 'img'" :src="$util.img(item.imageUrl)" mode="aspectFit"
:show-menu-by-longpress="true" />
<diy-icon v-else-if="item.iconType && item.iconType == 'icon'" :icon="item.icon" <diy-icon v-else-if="item.iconType && item.iconType == 'icon'" :icon="item.icon"
:value="item.style ? item.style : null"></diy-icon> :value="item.style ? item.style : null"></diy-icon>
</view> </view>
@@ -11,104 +15,109 @@
</template> </template>
<script> <script>
// 获取系统状态栏的高度 // 自定义浮动按钮
let systemInfo = uni.getSystemInfoSync(); import DiyMinx from './minx.js'
export default { // 获取系统状态栏的高度
name: 'diy-float-btn', let systemInfo = uni.getSystemInfoSync();
props: {
value: { // 自定义浮动按钮
type: Object, export default {
default: () => { name: 'diy-float-btn',
return {}; props: {
} value: {
} type: Object,
}, default: () => {
data() { return {};
return {
navHeight: 0,
statusBarHeight: systemInfo.statusBarHeight
};
},
created() {},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {}
},
components: {},
methods: {},
computed: {
style() {
let style = {},
height = 54;
// #ifdef MP
height = systemInfo.platform == 'ios' ? 54 : 58;
// #endif
switch (parseInt(this.value.bottomPosition)) {
case 1:
style.top = (this.navHeight + this.statusBarHeight + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 2:
style.top = (this.navHeight + this.statusBarHeight + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 3:
style.bottom = (100 + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 4:
style.bottom = (100 + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
}
return this.$util.objToStyle(style);
} }
} }
}; },
mixins: [DiyMinx],
data() {
return {
navHeight: 0,
statusBarHeight: systemInfo.statusBarHeight
};
},
created() { },
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
components: {},
methods: {},
computed: {
style() {
let style = {},
height = 54;
// #ifdef MP
height = systemInfo.platform == 'ios' ? 54 : 58;
// #endif
switch (parseInt(this.value.bottomPosition)) {
case 1:
style.top = (this.navHeight + this.statusBarHeight + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 2:
style.top = (this.navHeight + this.statusBarHeight + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 3:
style.bottom = (100 + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
case 4:
style.bottom = (100 + parseInt(this.value.btnBottom)) * 2 + 'rpx';
break;
}
return this.$util.objToStyle(style);
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.float-btn { .float-btn {
position: fixed; position: fixed;
bottom: 20%; bottom: 20%;
right: 40rpx; right: 40rpx;
z-index: 990; z-index: 990;
&.left_top { &.left_top {
top: 100rpx; top: 100rpx;
left: 30rpx; left: 30rpx;
}
&.right_top {
top: 100rpx;
right: 30rpx;
}
&.left_bottom {
bottom: 160rpx;
left: 30rpx;
padding-bottom: constant(safe-area-inset-bottom);
/*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom);
/*兼容 IOS>11.2*/
}
&.right_bottom {
bottom: 160rpx;
right: 30rpx;
padding-bottom: constant(safe-area-inset-bottom);
/*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom);
/*兼容 IOS>11.2*/
}
.button-box {
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
} }
&.right_top { image {
top: 100rpx; width: 100%;
right: 30rpx; height: 100%;
}
&.left_bottom {
bottom: 160rpx;
left: 30rpx;
padding-bottom: constant(safe-area-inset-bottom);
/*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom);
/*兼容 IOS>11.2*/
}
&.right_bottom {
bottom: 160rpx;
right: 30rpx;
padding-bottom: constant(safe-area-inset-bottom);
/*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom);
/*兼容 IOS>11.2*/
}
.button-box {
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
}
image {
width: 100%;
height: 100%;
}
} }
} }
}
</style> </style>

View File

@@ -7,23 +7,25 @@
</template> </template>
<script> <script>
// 关注公众号 // 关注公众号展示
export default { import DiyMinx from './minx.js'
name: 'diy-follow-official-account', export default {
props: { name: 'diy-follow-official-account',
value: { props: {
type: Object value: {
} type: Object
}, }
data() { },
return {}; mixins: [DiyMinx],
}, data() {
watch: { return {};
// 组件刷新监听 },
componentRefresh: function(nval) {} watch: {
}, // 组件刷新监听
methods: {} componentRefresh: function (nval) { }
}; },
methods: {}
};
</script> </script>
<style></style> <style></style>

View File

@@ -1,110 +1,114 @@
<template> <template>
<view data-component-name="diy-form" class="diy-from" :style="style"> <view data-component-name="diy-form" class="diy-from" :style="style">
<view class="fui-cell-group"> <view class="fui-cell-group">
<view class="fui-cell "> <view class="fui-cell ">
<view class="fui-cell-label ">您的姓名</view> <view class="fui-cell-label ">您的姓名</view>
<view class="fui-cell-info"> <view class="fui-cell-info">
<input v-model="Form.realname" class="fui-input" placeholder="请输入您的姓名" value=""></input> <input v-model="Form.realname" class="fui-input" placeholder="请输入您的姓名" value=""></input>
</view>
</view>
<view class="fui-cell ">
<view class="fui-cell-label">手机号码</view>
<view class="fui-cell-info">
<input v-model="Form.mobile" class="fui-input" maxlength="11" placeholder="请输入您的手机号" type="number" ></input>
</view>
</view>
<view class="fui-cell ">
<view class="fui-cell-label">您的邮箱</view>
<view class="fui-cell-info">
<input v-model="Form.mailbox" class="fui-input" placeholder="请输入您的邮箱" type="text" ></input>
</view>
</view>
<view class="fui-cell">
<view class="fui-cell-label">所在城市</view>
<view class="fui-cell-info">
<input v-model="Form.citys" class="fui-input" placeholder="请输入您的所在地" value=""></input>
</view>
</view>
<view class="fui-cell">
<view class="fui-cell-label">备注</view>
<view class="fui-cell-info">
<input v-model="Form.remark" class="fui-input" placeholder="请输入备注" value=""></input>
</view>
</view> </view>
</view> </view>
<view @click="submitform" class="fui-btn btn-danger block mtop">提交信息</view> <view class="fui-cell ">
<view class="fui-cell-label">手机号码</view>
<view class="fui-cell-info">
<input v-model="Form.mobile" class="fui-input" maxlength="11" placeholder="请输入您的手机号"
type="number"></input>
</view>
</view>
<view class="fui-cell ">
<view class="fui-cell-label">您的邮箱</view>
<view class="fui-cell-info">
<input v-model="Form.mailbox" class="fui-input" placeholder="请输入您的邮箱" type="text"></input>
</view>
</view>
<view class="fui-cell">
<view class="fui-cell-label">所在城市</view>
<view class="fui-cell-info">
<input v-model="Form.citys" class="fui-input" placeholder="请输入您的所在地" value=""></input>
</view>
</view>
<view class="fui-cell">
<view class="fui-cell-label">备注</view>
<view class="fui-cell-info">
<input v-model="Form.remark" class="fui-input" placeholder="请输入备注" value=""></input>
</view>
</view>
</view>
<view @click="submitform" class="fui-btn btn-danger block mtop">提交信息</view>
</view> </view>
</template> </template>
<script> <script>
export default { // 自定义表单
name: 'diy-from', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-from',
type: Object props: {
} value: {
}, type: Object
data() {
return {
loading: true,
markers:[],
Form:{
realname:'',
mobile:'',
mailbox:'',
citys:'',
remark:'',
}
};
},
created() {
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
// this.getDataList();
}
},
computed: {
markerst(){
return [{
id:1,
latitude:this.value.list[0].lat,
longitude:this.value.list[0].lng
}]
},
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
submitform(){
this.$api.sendRequest({
url: '/api/member/information',
data: this.Form,
success: res => {
this.$util.showToast({
title: res.message
});
}
});
}
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
markers: [],
Form: {
realname: '',
mobile: '',
mailbox: '',
citys: '',
remark: '',
}
};
},
created() {
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
// this.getDataList();
}
},
computed: {
markerst() {
return [{
id: 1,
latitude: this.value.list[0].lat,
longitude: this.value.list[0].lng
}]
},
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
submitform() {
this.$api.sendRequest({
url: '/api/member/information',
data: this.Form,
success: res => {
this.$util.showToast({
title: res.message
});
}
});
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.diy-from{ .diy-from {
background: #fff; background: #fff;
padding-bottom: 20rpx; padding-bottom: 20rpx;
border-radius: 10rpx; border-radius: 10rpx;
} }
</style> </style>

View File

@@ -2,11 +2,14 @@
<x-skeleton data-component-name="diy-goods-brand" type="waterfall" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-goods-brand" type="waterfall" :loading="loading" :configs="skeletonConfig">
<view :class="['brand-wrap', value.ornament.type]" :style="warpCss"> <view :class="['brand-wrap', value.ornament.type]" :style="warpCss">
<view :class="[value.style]"> <view :class="[value.style]">
<view class="title-wrap" v-show="value.title" :style="{ color: value.textColor, fontWeight: value.fontWeight ? 'bold' : '' }">{{ value.title }} <view class="title-wrap" v-show="value.title"
:style="{ color: value.textColor, fontWeight: value.fontWeight ? 'bold' : '' }">{{ value.title }}
</view> </view>
<view class="ul-wrap"> <view class="ul-wrap">
<view class="li-item" v-for="(item, index) in list" :key="index"> <view class="li-item" v-for="(item, index) in list" :key="index">
<image class="brand-pic" :src="$util.img(item.image_url)" mode="aspectFit" @click="handlerClick(item)" @tap="handlerClick(item)" @error="imgError(index)" :style="itemCss"/> <image class="brand-pic" :src="$util.img(item.image_url)" mode="aspectFit"
@click="handlerClick(item)" @tap="handlerClick(item)" @error="imgError(index)"
:style="itemCss" />
</view> </view>
</view> </view>
</view> </view>
@@ -15,153 +18,155 @@
</template> </template>
<script> <script>
// 商品品牌 // 商品品牌
import uniGrid from '@/components/uni-grid/uni-grid.vue'; import uniGrid from '@/components/uni-grid/uni-grid.vue';
import uniGridItem from '@/components/uni-grid-item/uni-grid-item.vue'; import uniGridItem from '@/components/uni-grid-item/uni-grid-item.vue';
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
// 自定义商品品牌展示
export default { export default {
name: 'diy-goods-brand', name: 'diy-goods-brand',
props: { props: {
value: { value: {
type: Object type: Object
}
},
components: {
uniGrid,
uniGridItem
},
data() {
return {
list: [],
loading: true,
skeletonConfig: {
gridRows: 2,
gridColumns: 4,
gridRowsGap: '20rpx',
headWidth: '120rpx',
headHeight: '120rpx',
textShow: false
} }
}, };
components: { },
uniGrid, created() {
uniGridItem this.getBrandList();
}, },
data() { mixins: [DiyMinx],
return { watch: {
list: [], // 组件刷新监听
loading: true, componentRefresh: function (nval) {
skeletonConfig: {
gridRows: 2,
gridColumns: 4,
gridRowsGap: '20rpx',
headWidth: '120rpx',
headHeight: '120rpx',
textShow: false
}
};
},
created() {
this.getBrandList(); this.getBrandList();
}, }
mixins: [DiyMinx], },
watch: { computed: {
// 组件刷新监听 warpCss() {
componentRefresh: function(nval) { var obj = '';
this.getBrandList(); obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
}, if (this.value.ornament.type == 'shadow') {
computed: { obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color;
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color;
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color;
}
return obj;
},
// 子项样式
itemCss() {
var obj = '';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return obj;
} }
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color;
}
return obj;
}, },
methods: { // 子项样式
getBrandList() { itemCss() {
var data = { var obj = '';
page: 1, if (this.value.elementAngle == 'round') {
page_size: this.value.count obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
}; obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
if (this.value.sources == 'diy') { obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
data.page_size = 0; obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
data.brand_id_arr = this.value.brandIds.toString(); }
} return obj;
}
},
methods: {
getBrandList() {
var data = {
page: 1,
page_size: this.value.count
};
if (this.value.sources == 'diy') {
data.page_size = 0;
data.brand_id_arr = this.value.brandIds.toString();
}
this.$api.sendRequest({ this.$api.sendRequest({
url: '/api/goodsbrand/page', url: '/api/goodsbrand/page',
data: data, data: data,
success: res => { success: res => {
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
let data = res.data; let data = res.data;
this.list = data.list; this.list = data.list;
}
this.loading = false;
} }
}); this.loading = false;
}, }
toDetail(item) { });
this.$util.redirectTo('/pages_goods/list', { },
brand_id: item.brand_id toDetail(item) {
}); this.$util.redirectTo('/pages_goods/list', {
}, brand_id: item.brand_id
imgError(index) { });
if (this.list[index]) this.list[index].image_url = this.$util.getDefaultImage().goods; },
}, imgError(index) {
async handlerClick(item) { if (this.list[index]) this.list[index].image_url = this.$util.getDefaultImage().goods;
await this.__$emitEvent({eventName: 'goods-brand-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { },
async handlerClick(item) {
await this.__$emitEvent({
eventName: 'goods-brand-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.toDetail(item); this.toDetail(item);
}}) }
}, })
} },
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
.brand-wrap { .brand-wrap {
&.shadow { &.shadow {
margin-left: 8rpx; margin-left: 8rpx;
margin-right: 8rpx; margin-right: 8rpx;
margin-top: 8rpx; margin-top: 8rpx;
margin-bottom: 8rpx; margin-bottom: 8rpx;
}
.style-1 {
.title-wrap {
text-align: center;
padding: 20rpx 0 10rpx;
} }
.style-1 { .ul-wrap {
.title-wrap { display: flex;
text-align: center; flex-wrap: wrap;
padding: 20rpx 0 10rpx; padding: 20rpx;
}
.ul-wrap { .li-item {
display: flex; display: flex;
flex-wrap: wrap; align-items: center;
padding: 20rpx; justify-content: center;
width: calc(100% / 4 - 20rpx) !important;
height: 124rpx;
margin: 10rpx;
background-color: #fff;
.li-item { .brand-pic {
display: flex; width: 100%;
align-items: center; height: 100%;
justify-content: center;
width: calc(100% / 4 - 20rpx) !important;
height: 124rpx;
margin: 10rpx;
background-color: #fff;
.brand-pic {
width: 100%;
height: 100%;
}
} }
} }
} }
} }
}
</style> </style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +1,29 @@
<template> <template>
<view data-component-name="diy-graphic-nav" :style="componentStyle"> <view data-component-name="diy-graphic-nav" :style="componentStyle">
<block v-if="value.showStyle == 'pageSlide'"> <block v-if="value.showStyle == 'pageSlide'">
<swiper :class="['graphic-nav', 'pageSlide', value.carousel.type]" circular :indicator-dots="false" :style="swiperHeight" @change="swiperChange"> <swiper :class="['graphic-nav', 'pageSlide', value.carousel.type]" circular :indicator-dots="false"
:style="swiperHeight" @change="swiperChange">
<swiper-item class="graphic-nav-wrap" <swiper-item class="graphic-nav-wrap"
v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))"> v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))">
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list" <view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list"
:key="index" :key="index"
v-if="index >= [(numItem) * (value.pageCount * value.rowCount)] && index < [(numItem+1) * (value.pageCount * value.rowCount)]" v-if="index >= [(numItem) * (value.pageCount * value.rowCount)] && index < [(numItem + 1) * (value.pageCount * value.rowCount)]"
:style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)"> :style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)">
<!-- #endif --> <!-- #endif -->
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
<view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list" <view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list"
:key="index" :key="index"
v-if="index >= [(numItem - 1) * (value.pageCount * value.rowCount)] && index < [numItem * (value.pageCount * value.rowCount)]" v-if="index >= [(numItem - 1) * (value.pageCount * value.rowCount)] && index < [numItem * (value.pageCount * value.rowCount)]"
:style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)"> :style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)">
<!-- #endif --> <!-- #endif -->
<view class="graphic-img" v-if="value.mode != 'text'" <view class="graphic-img" v-if="value.mode != 'text'"
:style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }"> :style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }">
<image v-if="item.iconType == 'img'" <image v-if="item.iconType == 'img'"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
mode="aspectFill" mode="aspectFill"
:style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', borderRadius: value.aroundRadius * 2 + 'rpx' }" :style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', borderRadius: value.aroundRadius * 2 + 'rpx' }"
:show-menu-by-longpress="true"/> :show-menu-by-longpress="true" />
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" <diy-icon v-if="item.iconType == 'icon'" :icon="item.icon"
:value="item.style ? item.style : null" :value="item.style ? item.style : null"
@@ -37,43 +38,48 @@
:style="{ fontSize: value.font.size * 2 + 'rpx', fontWeight: value.font.weight, color: value.font.color }"> :style="{ fontSize: value.font.size * 2 + 'rpx', fontWeight: value.font.weight, color: value.font.color }">
{{ item.title }} {{ item.title }}
</text> </text>
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
</view> </view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef MP --> <!-- #ifdef MP -->
</view> </view>
<!-- #endif --> <!-- #endif -->
</swiper-item> </swiper-item>
</swiper> </swiper>
<view class="swiper-dot-box" v-if="isIndicatorDots" :class="value.carousel.type"> <view class="swiper-dot-box" v-if="isIndicatorDots" :class="value.carousel.type">
<view v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))" :key="numIndex"> <view v-for="(numItem, numIndex) in Math.ceil(value.list.length / (value.pageCount * value.rowCount))"
<view class="swiper-dot" :class="{'active':numIndex==swiperCurrent}"></view> :key="numIndex">
<view class="swiper-dot" :class="{ 'active': numIndex == swiperCurrent }"></view>
</view> </view>
</view> </view>
</block> </block>
<scroll-view v-else :scroll-x="value.showStyle == 'singleSlide'" :class="['graphic-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle ]"> <scroll-view v-else :scroll-x="value.showStyle == 'singleSlide'"
:class="['graphic-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]">
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<!-- #endif --> <!-- #endif -->
<view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list" :key="index" :style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)"> <view class="graphic-nav-item" :class="[value.mode]" v-for="(item, index) in value.list" :key="index"
<view class="graphic-img" v-if="value.mode != 'text'" :style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }"> :style="{ width: 100 / value.rowCount + '%' }" @click="redirectTo(item.link)">
<view class="graphic-img" v-if="value.mode != 'text'"
:style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }">
<image v-if="item.iconType == 'img'" <image v-if="item.iconType == 'img'"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
mode="aspectFill" mode="aspectFill"
:style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', borderRadius: value.aroundRadius * 2 + 'rpx' }" :style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', borderRadius: value.aroundRadius * 2 + 'rpx' }"
:show-menu-by-longpress="true"/> :show-menu-by-longpress="true" />
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" <diy-icon v-if="item.iconType == 'icon'" :icon="item.icon"
:value="item.style ? item.style : null" :value="item.style ? item.style : null"
:style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon> :style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon>
<text :class="['tag', { alone: value.mode == 'text' }]" v-if="item.label.control" <text :class="['tag', { alone: value.mode == 'text' }]" v-if="item.label.control"
:style="{ color: item.label.textColor, backgroundImage: 'linear-gradient(' + item.label.bgColorStart + ',' + item.label.bgColorEnd + ')' }"> :style="{ color: item.label.textColor, backgroundImage: 'linear-gradient(' + item.label.bgColorStart + ',' + item.label.bgColorEnd + ')' }">
{{ item.label.text }} {{ item.label.text }}
</text> </text>
</view> </view>
<text v-if="value.mode != 'img'" class="graphic-text" :style="{ fontSize: value.font.size * 2 + 'rpx', fontWeight: value.font.weight, color: value.font.color }"> <text v-if="value.mode != 'img'" class="graphic-text"
:style="{ fontSize: value.font.size * 2 + 'rpx', fontWeight: value.font.weight, color: value.font.color }">
{{ item.title }} {{ item.title }}
</text> </text>
</view> </view>
@@ -88,222 +94,225 @@
</template> </template>
<script> <script>
export default { // 自定义图形导航
name: 'diy-graphic-nav', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-graphic-nav',
type: Object props: {
} value: {
}, type: Object
data() {
return {
pageWidth: '',
indicatorDots: false,
swiperCurrent: 0
};
},
created() {},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {}
},
computed: {
componentStyle() {
var css = '';
css += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
css += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament
.color :
'') + ';';
css += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color :
'') + ';';
return css;
},
// 滑块容器的高度
swiperHeight() {
var css = '';
var height = 0;
if (this.value.mode == 'graphic') {
height = (21 + 6 + 14 + 8 + this.value.imageSize) * this.value
.pageCount; // 21 = 文字高度8 = 文字上边距14 = 上下内边距8 = 外边距
} else if (this.value.mode == 'img') {
height = (14 + 8 + this.value.imageSize) * this.value.pageCount; // 14 = 上下内边距8 = 外边距
} else if (this.value.mode == 'text') {
height = (21 + 14 + 8) * this.value.pageCount; // 21 = 文字高度14 = 上下内边距8 = 外边距
}
css += 'height:' + height * 2 + 'rpx';
return css;
},
// 是否显示轮播点
isIndicatorDots() {
var bool = true;
bool = this.value.carousel.type == 'hide' || Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount)) == 1 ? false : true;
return bool;
}
},
methods: {
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
console.log(link)
this.$util.diyRedirectTo(link);
},
swiperChange(e) {
this.swiperCurrent = e.detail.current
}
} }
}; },
mixins: [DiyMinx],
data() {
return {
pageWidth: '',
indicatorDots: false,
swiperCurrent: 0
};
},
created() { },
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
componentStyle() {
var css = '';
css += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
css += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament
.color :
'') + ';';
css += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color :
'') + ';';
return css;
},
// 滑块容器的高度
swiperHeight() {
var css = '';
var height = 0;
if (this.value.mode == 'graphic') {
height = (21 + 6 + 14 + 8 + this.value.imageSize) * this.value
.pageCount; // 21 = 文字高度8 = 文字上边距14 = 上下内边距8 = 外边距
} else if (this.value.mode == 'img') {
height = (14 + 8 + this.value.imageSize) * this.value.pageCount; // 14 = 上下内边距8 = 外边距
} else if (this.value.mode == 'text') {
height = (21 + 14 + 8) * this.value.pageCount; // 21 = 文字高度14 = 上下内边距8 = 外边距
}
css += 'height:' + height * 2 + 'rpx';
return css;
},
// 是否显示轮播点
isIndicatorDots() {
var bool = true;
bool = this.value.carousel.type == 'hide' || Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount)) == 1 ? false : true;
return bool;
}
},
methods: {
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
console.log(link)
this.$util.diyRedirectTo(link);
},
swiperChange(e) {
this.swiperCurrent = e.detail.current
}
}
};
</script> </script>
<style> <style>
/* 固定显示 */ /* 固定显示 */
.graphic-nav.fixed-layout>>>.uni-scroll-view-content { .graphic-nav.fixed-layout>>>.uni-scroll-view-content {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
} }
/* 单行滑动 */ /* 单行滑动 */
.graphic-nav.singleSlide>>>.uni-scroll-view-content { .graphic-nav.singleSlide>>>.uni-scroll-view-content {
display: flex; display: flex;
} }
.graphic-nav.pageSlide>>>.uni-swiper-dots-horizontal { .graphic-nav.pageSlide>>>.uni-swiper-dots-horizontal {
bottom: 0rpx; bottom: 0rpx;
} }
.graphic-nav.pageSlide.straightLine>>>.uni-swiper-dot { .graphic-nav.pageSlide.straightLine>>>.uni-swiper-dot {
width: 30rpx; width: 30rpx;
border-radius: 0; border-radius: 0;
height: 8rpx; height: 8rpx;
} }
.graphic-nav.pageSlide.circle>>>.uni-swiper-dot { .graphic-nav.pageSlide.circle>>>.uni-swiper-dot {
width: 14rpx; width: 14rpx;
height: 14rpx; height: 14rpx;
} }
</style> </style>
<style lang="scss"> <style lang="scss">
.graphic-nav { .graphic-nav {
padding: 16rpx; padding: 16rpx;
box-sizing: border-box;
&.singleSlide {
.graphic-nav-item {
flex-shrink: 0;
}
}
&.pageSlide {
position: relative;
.graphic-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
}
.graphic-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box; box-sizing: border-box;
&.singleSlide { .graphic-text {
.graphic-nav-item { padding-top: 12rpx;
flex-shrink: 0; line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone {
padding-top: 0;
} }
} }
&.pageSlide { &.text {
position: relative;
.graphic-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
}
.graphic-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.graphic-text { .graphic-text {
padding-top: 12rpx; padding-top: 0;
line-height: 1.5; }
white-space: nowrap; }
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone { .graphic-img {
padding-top: 0; position: relative;
} display: flex;
align-items: center;
justify-content: center;
width: 100rpx;
height: 100rpx;
font-size: 90rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
} }
&.text { .icon {
font-size: 50rpx;
.graphic-text { color: $color-sub;
padding-top: 0;
}
}
.graphic-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100rpx;
height: 100rpx;
font-size: 90rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: $color-sub;
}
} }
} }
} }
}
.swiper-dot-box { .swiper-dot-box {
width: 100%; width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
margin-top: -20rpx; margin-top: -20rpx;
padding-bottom: 8rpx; padding-bottom: 8rpx;
.swiper-dot {
background-color: rgba(0, 0, 0, .3);
margin: 8rpx;
&.active {
background-color: rgba(0, 0, 0, 1);
}
}
&.straightLine {
.swiper-dot { .swiper-dot {
background-color: rgba(0, 0, 0, .3); width: 30rpx;
margin: 8rpx; border-radius: 0;
height: 8rpx;
&.active {
background-color: rgba(0, 0, 0, 1);
}
} }
&.straightLine {
.swiper-dot {
width: 30rpx;
border-radius: 0;
height: 8rpx;
}
}
&.circle {
.swiper-dot {
width: 15rpx;
border-radius: 50%;
height: 15rpx;
}
}
} }
&.circle {
.swiper-dot {
width: 15rpx;
border-radius: 50%;
height: 15rpx;
}
}
}
</style> </style>

View File

@@ -55,7 +55,8 @@
<template v-if="item.componentName == 'Search'"> <template v-if="item.componentName == 'Search'">
<!-- 搜索 --> <!-- 搜索 -->
<diy-search :value="item" :topNavColor="topNavColor" :global="diyGlobalData.global" :haveTopCategory="haveTopCategory" :followOfficialAccount="followOfficialAccount"></diy-search> <diy-search :value="item" :topNavColor="topNavColor" :global="diyGlobalData.global"
:haveTopCategory="haveTopCategory" :followOfficialAccount="followOfficialAccount"></diy-search>
</template> </template>
<template v-if="item.componentName == 'RichText'"> <template v-if="item.componentName == 'RichText'">
@@ -85,7 +86,8 @@
<template v-if="item.componentName == 'ManyGoodsList'"> <template v-if="item.componentName == 'ManyGoodsList'">
<!-- 多商品组 --> <!-- 多商品组 -->
<diy-many-goods-list :value="item" :global="diyGlobalData.global" :scrollTop="scrollTop"></diy-many-goods-list> <diy-many-goods-list :value="item" :global="diyGlobalData.global"
:scrollTop="scrollTop"></diy-many-goods-list>
</template> </template>
<template v-if="item.componentName == 'RubikCube'"> <template v-if="item.componentName == 'RubikCube'">
@@ -256,96 +258,98 @@
</template> </template>
<script> <script>
// 组件组 // 组件组展示
export default { import DiyMinx from './minx.js'
components: {}, export default {
props: { components: {},
diyData: { props: {
type: Object diyData: {
}, type: Object
scrollTop: {
type: [String, Number],
default: '0'
},
haveTopCategory: {
type: Boolean
},
followOfficialAccount: {
type: Object
},
}, },
data() { scrollTop: {
return { type: [String, Number],
diyGlobalData: null default: '0'
};
}, },
created() { haveTopCategory: {
this.diyGlobalData = JSON.parse(JSON.stringify(this.diyData)); type: Boolean
}, },
computed: { followOfficialAccount: {
topNavColor() { type: Object
var color = ''; },
if (this.diyData.global.topNavBg) { },
color = 'transparent'; mixins: [DiyMinx],
if (this.scrollTop > 20) { data() {
color = this.diyData.global.topNavColor; return {
} else { diyGlobalData: null
color = 'transparent'; };
} },
} else { created() {
this.diyGlobalData = JSON.parse(JSON.stringify(this.diyData));
},
computed: {
topNavColor() {
var color = '';
if (this.diyData.global.topNavBg) {
color = 'transparent';
if (this.scrollTop > 20) {
color = this.diyData.global.topNavColor; color = this.diyData.global.topNavColor;
} else {
color = 'transparent';
} }
return color; } else {
}, color = this.diyData.global.topNavColor;
// 修改属性样式 }
setPagestyle() { return color;
this.diyGlobalData.value.forEach((item, index) => { },
item.pageStyle = ''; // 修改属性样式
// 给每个组件增加位置属性,用于定位,搜索、分类导航等定位 setPagestyle() {
item.moduleIndex = index + 1; this.diyGlobalData.value.forEach((item, index) => {
item.pageStyle = '';
// 给每个组件增加位置属性,用于定位,搜索、分类导航等定位
item.moduleIndex = index + 1;
// 特殊处理搜索框 当显示位置为滚动至顶部固定时,只设置背景颜色 // 特殊处理搜索框 当显示位置为滚动至顶部固定时,只设置背景颜色
if (item.componentName == 'Search' && item.positionWay == 'fixed') { if (item.componentName == 'Search' && item.positionWay == 'fixed') {
// item.pageStyle = 'background-color:' + item.pageBgColor + ';'; // item.pageStyle = 'background-color:' + item.pageBgColor + ';';
return false; return false;
} }
item.pageStyle += 'background-color:' + item.pageBgColor + ';'; item.pageStyle += 'background-color:' + item.pageBgColor + ';';
if (item.margin) { if (item.margin) {
item.pageStyle += 'padding-top:' + item.margin.top * 2 + 'rpx' + ';'; item.pageStyle += 'padding-top:' + item.margin.top * 2 + 'rpx' + ';';
item.pageStyle += 'padding-bottom:' + item.margin.bottom * 2 + 'rpx' + ';'; item.pageStyle += 'padding-bottom:' + item.margin.bottom * 2 + 'rpx' + ';';
item.pageStyle += 'padding-right:' + item.margin.both * 2 + 'rpx' + ';'; item.pageStyle += 'padding-right:' + item.margin.both * 2 + 'rpx' + ';';
item.pageStyle += 'padding-left:' + item.margin.both * 2 + 'rpx' + ';'; item.pageStyle += 'padding-left:' + item.margin.both * 2 + 'rpx' + ';';
}
});
return this.diyGlobalData.value;
},
// 过滤组件的渲染
diyDataArray() {
let data = [],
showModuleData = this.$store.state.diyGroupShowModule ? JSON.parse(this.$store.state
.diyGroupShowModule) : '';
if (showModuleData.length) {
if (showModuleData.includes('null')) return [];
let diyDataArr = this.setPagestyle;
diyDataArr.forEach((item, index) => {
if (showModuleData.includes(item.componentName)) {
data.push(item);
} }
}); });
} else data = this.setPagestyle;
return this.diyGlobalData.value; return data;
}, }
// 过滤组件的渲染 },
diyDataArray() { methods: {}
let data = [], };
showModuleData = this.$store.state.diyGroupShowModule ? JSON.parse(this.$store.state
.diyGroupShowModule) : '';
if (showModuleData.length) {
if (showModuleData.includes('null')) return [];
let diyDataArr = this.setPagestyle;
diyDataArr.forEach((item, index) => {
if (showModuleData.includes(item.componentName)) {
data.push(item);
}
});
} else data = this.setPagestyle;
return data;
}
},
methods: {}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.diy-group { .diy-group {
width: 100%; width: 100%;
} }
</style> </style>

View File

@@ -5,7 +5,9 @@
<view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" <view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)"
:class="[value.ornament.type]" :style="goodsItemCss"> :class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(index)"> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(index)">
</image> </image>
</view> </view>
<view class="content" <view class="content"
@@ -16,9 +18,14 @@
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ item.groupbuy_price.split('.')[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ '.' + item.groupbuy_price.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.groupbuy_price.split('.')[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
'.' + item.groupbuy_price.split('.')[1] }}</text>
</view> </view>
<button v-if="value.btnStyle.control" :style="{ <button v-if="value.btnStyle.control" :style="{
background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '', background: value.btnStyle.theme == 'diy' ? 'linear-gradient(to right,' + value.btnStyle.bgColorStart + ',' + value.btnStyle.bgColorEnd + ')' : '',
@@ -32,51 +39,79 @@
</template> </template>
<template v-if="value.template == 'horizontal-slide'"> <template v-if="value.template == 'horizontal-slide'">
<scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false"> <scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false">
<view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)"
:class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
<image class="bg" v-if="value.saleStyle.control" :src="$util.img('public/uniapp/groupbuy/bg.png')" mode="widthFix"/> :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
<view class="num" v-if="value.saleStyle.control" :style="{ color: value.theme == 'diy' ? value.saleStyle.color : '' }"> @error="imageError(index)" />
<image class="bg" v-if="value.saleStyle.control"
:src="$util.img('public/uniapp/groupbuy/bg.png')" mode="widthFix" />
<view class="num" v-if="value.saleStyle.control"
:style="{ color: value.theme == 'diy' ? value.saleStyle.color : '' }">
已团{{ item.sell_num }} 已团{{ item.sell_num }}
</view> </view>
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ item.groupbuy_price.split('.')[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ '.' + item.groupbuy_price.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.groupbuy_price.split('.')[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
'.' + item.groupbuy_price.split('.')[1] }}</text>
</view> </view>
<view class="original-price price-font" v-if="value.priceStyle.lineControl" :style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">¥{{ item.price }}</view> <view class="original-price price-font" v-if="value.priceStyle.lineControl"
:style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">¥{{
item.price }}</view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper" :style="{ height: swiperHeight }"> <swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper"
<swiper-item v-for="(pageItem, pageIndex) in page" :key="pageIndex" :class="['swiper-item', (list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']"> :style="{ height: swiperHeight }">
<swiper-item v-for="(pageItem, pageIndex) in page" :key="pageIndex"
:class="['swiper-item', (list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']">
<view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex" <view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex"
@click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(dataIndex)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
<image class="bg" v-if="value.saleStyle.control" :src="$util.img('public/uniapp/groupbuy/bg.png')" mode="widthFix"/> :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
<view class="num" v-if="value.saleStyle.control" :style="{ color: value.theme == 'diy' ? value.saleStyle.color : '' }">已团{{ item.sell_num }}</view> @error="imageError(dataIndex)" />
<image class="bg" v-if="value.saleStyle.control"
:src="$util.img('public/uniapp/groupbuy/bg.png')" mode="widthFix" />
<view class="num" v-if="value.saleStyle.control"
:style="{ color: value.theme == 'diy' ? value.saleStyle.color : '' }">已团{{
item.sell_num }}</view>
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ item.groupbuy_price.split('.')[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{ '.' + item.groupbuy_price.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.groupbuy_price.split('.')[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
'.' + item.groupbuy_price.split('.')[1] }}</text>
</view> </view>
<view class="original-price price-font" v-if="value.priceStyle.lineControl" :style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">¥{{ item.price }}</view> <view class="original-price price-font" v-if="value.priceStyle.lineControl"
:style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">¥{{
item.price }}</view>
</view> </view>
</view> </view>
</swiper-item> </swiper-item>
@@ -87,376 +122,379 @@
</template> </template>
<script> <script>
export default { // 自定义团购展示
name: 'diy-groupbuy', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-groupbuy',
type: Object props: {
} value: {
}, type: Object
data() {
return {
loading: true,
skeletonType: '',
skeletonConfig: {},
list: [],
page: 1
};
},
created() {
this.initSkeleton();
this.getData();
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
this.getData();
}
},
computed: {
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// 商品项样式
goodsItemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = '';
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this
.value.goodsMarginNum * 2);
else width = [screenWidth - this.rpxUpPx(20) * 2 - this.rpxUpPx(200) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
obj += 'margin-left:' + width + 'px;';
obj += 'margin-right:' + width + 'px;';
}
return obj;
},
swiperHeight() {
if (this.value.nameLineMode == 'multiple') return this.value.ornament.type == 'shadow' ? '404rpx' :
'392rpx';
return this.value.ornament.type == 'shadow' ? '376rpx' : '368rpx';
}
},
methods: {
initSkeleton() {
if (this.value.template == 'row1-of1') {
// 单列 风格
this.skeletonType = 'list';
this.skeletonConfig = {
textRows: 2
};
} else if (this.value.template == 'horizontal-slide') {
// 横向滑动 风格
this.skeletonType = 'waterfall';
this.skeletonConfig = {
gridRows: 1,
gridColumns: 3,
headHeight: '200rpx',
textRows: 2,
textWidth: ['100%', '80%']
};
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = (screenWidth * parseInt(res)) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/groupbuy/api/goods/lists',
data: data,
success: res => {
if (res.code == 0) {
this.list = res.data;
// 切屏滚动,每页显示固定数量
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3;
let temp = [];
this.page = Math.ceil(this.list.length / size);
for (var i = 0; i < this.page; i++) {
temp[i] = [];
for (var j = i * size; j < this.list.length; j++) {
if (temp[i].length == size) break;
temp[i].push(this.list[j]);
}
}
this.list = temp;
}
this.loading = false;
}
}
});
},
toDetail(e) {
this.$util.redirectTo('/pages_promotion/groupbuy/detail', {
groupbuy_id: e.groupbuy_id
});
},
imageError(index) {
this.list[index].goods_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
}
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
skeletonType: '',
skeletonConfig: {},
list: [],
page: 1
};
},
created() {
this.initSkeleton();
this.getData();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getData();
}
},
computed: {
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// 商品项样式
goodsItemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = '';
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this
.value.goodsMarginNum * 2);
else width = [screenWidth - this.rpxUpPx(20) * 2 - this.rpxUpPx(200) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
obj += 'margin-left:' + width + 'px;';
obj += 'margin-right:' + width + 'px;';
}
return obj;
},
swiperHeight() {
if (this.value.nameLineMode == 'multiple') return this.value.ornament.type == 'shadow' ? '404rpx' :
'392rpx';
return this.value.ornament.type == 'shadow' ? '376rpx' : '368rpx';
}
},
methods: {
initSkeleton() {
if (this.value.template == 'row1-of1') {
// 单列 风格
this.skeletonType = 'list';
this.skeletonConfig = {
textRows: 2
};
} else if (this.value.template == 'horizontal-slide') {
// 横向滑动 风格
this.skeletonType = 'waterfall';
this.skeletonConfig = {
gridRows: 1,
gridColumns: 3,
headHeight: '200rpx',
textRows: 2,
textWidth: ['100%', '80%']
};
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = (screenWidth * parseInt(res)) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/groupbuy/api/goods/lists',
data: data,
success: res => {
if (res.code == 0) {
this.list = res.data;
// 切屏滚动,每页显示固定数量
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3;
let temp = [];
this.page = Math.ceil(this.list.length / size);
for (var i = 0; i < this.page; i++) {
temp[i] = [];
for (var j = i * size; j < this.list.length; j++) {
if (temp[i].length == size) break;
temp[i].push(this.list[j]);
}
}
this.list = temp;
}
this.loading = false;
}
}
});
},
toDetail(e) {
this.$util.redirectTo('/pages_promotion/groupbuy/detail', {
groupbuy_id: e.groupbuy_id
});
},
imageError(index) {
this.list[index].goods_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
/deep/.uni-scroll-view ::-webkit-scrollbar { /deep/.uni-scroll-view ::-webkit-scrollbar {
/* 隐藏滚动条,但依旧具备可以滚动的功能 */ /* 隐藏滚动条,但依旧具备可以滚动的功能 */
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
/deep/::-webkit-scrollbar { /deep/::-webkit-scrollbar {
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
scroll-view ::-webkit-scrollbar { scroll-view ::-webkit-scrollbar {
width: 0; width: 0;
height: 0; height: 0;
background-color: transparent; background-color: transparent;
touch-action: none; touch-action: none;
} }
.diy-groupbuy { .diy-groupbuy {
&.row1-of1 { &.row1-of1 {
.item { .item {
display: flex; display: flex;
margin-bottom: 20rpx; margin-bottom: 20rpx;
padding: 16rpx; padding: 16rpx;
&.shadow { &.shadow {
margin: 8rpx 8rpx 20rpx 8rpx; margin: 8rpx 8rpx 20rpx 8rpx;
} }
&:last-child { &:last-child {
margin-bottom: 0; margin-bottom: 0;
padding-bottom: 20rpx; padding-bottom: 20rpx;
} }
.img-wrap { .img-wrap {
width: 200rpx;
height: 200rpx;
>image {
width: 200rpx; width: 200rpx;
height: 200rpx; }
}
>image { .goods-name {
width: 200rpx; margin-top: 6rpx;
line-height: 1.5;
}
.content {
flex: 1;
margin-left: 20rpx;
position: relative;
.discount-price {
white-space: nowrap;
font-weight: bold;
position: absolute;
bottom: 20rpx;
left: 0;
display: flex;
align-items: baseline;
line-height: 1;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
} }
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
button {
position: absolute;
bottom: 10rpx;
right: 20rpx;
margin: 0;
padding: 0 20rpx;
background-color: $base-color;
color: #fff;
min-width: 112rpx;
height: 52rpx;
line-height: 52rpx;
font-size: $font-size-tag;
}
}
}
}
&.horizontal-slide {
.scroll {
width: calc(100% - 40rpx);
padding: 20rpx;
line-height: 1;
white-space: nowrap;
.item.shadow {
margin-bottom: 8rpx;
}
}
.flex-between {
justify-content: space-between;
}
.item {
display: inline-block;
width: 200rpx;
overflow: hidden;
box-sizing: border-box;
&:nth-child(3n + 3) {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
position: relative;
overflow: hidden;
margin: 0 auto;
>image {
width: 200rpx;
}
.bg {
position: absolute;
width: 100%;
height: 60rpx;
bottom: 0;
left: 0;
z-index: 2;
}
.num {
width: 180rpx;
position: absolute;
bottom: 10rpx;
padding-left: 20rpx;
font-size: 20rpx;
line-height: 1;
color: #ffffff;
z-index: 3;
}
}
.content {
padding: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
&.multi-content {
height: 158rpx;
box-sizing: border-box;
} }
.goods-name { .goods-name {
margin-top: 6rpx; line-height: 1.3;
line-height: 1.5;
&.multi-hidden {
white-space: break-spaces;
}
} }
.content { .discount-price {
flex: 1; white-space: nowrap;
margin-left: 20rpx; margin-top: auto;
position: relative; font-weight: bold;
line-height: 1;
.discount-price { .unit {
white-space: nowrap;
font-weight: bold;
position: absolute;
bottom: 20rpx;
left: 0;
display: flex;
align-items: baseline;
line-height: 1;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
button {
position: absolute;
bottom: 10rpx;
right: 20rpx;
margin: 0;
padding: 0 20rpx;
background-color: $base-color;
color: #fff;
min-width: 112rpx;
height: 52rpx;
line-height: 52rpx;
font-size: $font-size-tag; font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
} }
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
.original-price {
font-size: $font-size-tag;
color: $color-tip;
line-height: 1;
text-decoration: line-through;
} }
} }
} }
&.horizontal-slide { .swiper {
.scroll { width: 100%;
width: calc(100% - 40rpx); white-space: nowrap;
padding: 20rpx; padding: 20rpx;
line-height: 1; box-sizing: border-box;
white-space: nowrap;
.item.shadow { .swiper-item {
margin-bottom: 8rpx; display: flex;
} align-items: center;
}
.flex-between {
justify-content: space-between;
} }
.item { .item {
display: inline-block;
width: 200rpx; width: 200rpx;
overflow: hidden;
box-sizing: border-box;
&:nth-child(3n + 3) {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
position: relative;
overflow: hidden;
margin: 0 auto;
>image {
width: 200rpx;
}
.bg {
position: absolute;
width: 100%;
height: 60rpx;
bottom: 0;
left: 0;
z-index: 2;
}
.num {
width: 180rpx;
position: absolute;
bottom: 10rpx;
padding-left: 20rpx;
font-size: 20rpx;
line-height: 1;
color: #ffffff;
z-index: 3;
}
}
.content {
padding: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
&.multi-content {
height: 158rpx;
box-sizing: border-box;
}
.goods-name {
line-height: 1.3;
&.multi-hidden {
white-space: break-spaces;
}
}
.discount-price {
white-space: nowrap;
margin-top: auto;
font-weight: bold;
line-height: 1;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
.original-price {
font-size: $font-size-tag;
color: $color-tip;
line-height: 1;
text-decoration: line-through;
}
}
}
.swiper {
width: 100%;
white-space: nowrap;
padding: 20rpx;
box-sizing: border-box;
.swiper-item {
display: flex;
align-items: center;
}
.item {
width: 200rpx;
}
} }
} }
} }
}
</style> </style>

View File

@@ -4,6 +4,7 @@
<script> <script>
// 辅助空白 // 辅助空白
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-horz-blank', name: 'diy-horz-blank',
props: { props: {
@@ -11,15 +12,16 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return {}; return {};
}, },
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
computed: { computed: {
horzBlankGaugeWrap: function() { horzBlankGaugeWrap: function () {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';'; obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') { if (this.value.componentAngle == 'round') {
@@ -32,7 +34,7 @@ export default {
return obj; return obj;
} }
}, },
created() {}, created() { },
methods: {} methods: {}
}; };
</script> </script>

View File

@@ -1,9 +1,11 @@
<template> <template>
<view data-component-name="diy-horz-line" :style="{ borderTop: '2rpx ' + value.borderStyle + ' ' + value.color }"></view> <view data-component-name="diy-horz-line" :style="{ borderTop: '2rpx ' + value.borderStyle + ' ' + value.color }">
</view>
</template> </template>
<script> <script>
// 辅助线 // 辅助线
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-horz-line', name: 'diy-horz-line',
props: { props: {
@@ -11,12 +13,13 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return {}; return {};
}, },
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
methods: {} methods: {}
}; };

View File

@@ -1,73 +1,77 @@
<template> <template>
<view data-component-name="diy-hot-area" :style="hotAreaWarp" class="hot-area-box"> <view data-component-name="diy-hot-area" :style="hotAreaWarp" class="hot-area-box">
<view class="simple-graph-wrap"> <view class="simple-graph-wrap">
<image :style="{ height: value.imgHeight }" :src="$util.img(value.imageUrl)" mode="widthFix" :show-menu-by-longpress="true"/> <image :style="{ height: value.imgHeight }" :src="$util.img(value.imageUrl)" mode="widthFix"
:show-menu-by-longpress="true" />
<!-- 热区功能 --> <!-- 热区功能 -->
<view class="heat-map" v-for="(mapItem, mapIndex) in value.heatMapData" :key="mapIndex" :style="{ <view class="heat-map" v-for="(mapItem, mapIndex) in value.heatMapData" :key="mapIndex" :style="{
width: mapItem.width + '%', width: mapItem.width + '%',
height: mapItem.height + '%', height: mapItem.height + '%',
left: mapItem.left + '%', left: mapItem.left + '%',
top: mapItem.top + '%' top: mapItem.top + '%'
}" @click.stop="$util.diyRedirectTo(mapItem.link)"></view> }" @click.stop="$util.diyRedirectTo(mapItem.link)"></view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
export default { // 热区展示
name: 'diy-hot-area', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-hot-area',
type: Object, props: {
default: () => { value: {
return {}; type: Object,
} default: () => {
return {};
} }
}, }
data() { },
return {}; mixins: [DiyMinx],
}, data() {
created() {}, return {};
watch: { },
// 组件刷新监听 created() { },
componentRefresh: function(nval) {} watch: {
}, // 组件刷新监听
computed: { componentRefresh: function (nval) { }
hotAreaWarp: function() { },
var obj = ''; computed: {
obj = 'background-color:' + this.value.componentBgColor + ';'; hotAreaWarp: function () {
if (this.value.componentAngle == 'round') { var obj = '';
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; obj = 'background-color:' + this.value.componentBgColor + ';';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; if (this.value.componentAngle == 'round') {
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
} obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
return obj; obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
}, return obj;
methods: {} }
}; },
methods: {}
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.hot-area-box { .hot-area-box {
position: relative; position: relative;
width: 100%;
overflow: hidden;
box-sizing: border-box;
}
.simple-graph-wrap {
line-height: 0;
overflow: hidden;
position: relative;
image {
width: 100%; width: 100%;
overflow: hidden;
box-sizing: border-box;
} }
.simple-graph-wrap { .heat-map {
line-height: 0; position: absolute;
overflow: hidden;
position: relative;
image {
width: 100%;
}
.heat-map {
position: absolute;
}
} }
}
</style> </style>

View File

@@ -5,80 +5,84 @@
</template> </template>
<script> <script>
export default { // 图标展示
name: 'diy-icon', import DiyMinx from './minx.js'
props: { export default {
icon: { name: 'diy-icon',
type: String, props: {
default: '' icon: {
}, type: String,
value: { default: ''
type: Object,
default: function () {
return null;
}
}
}, },
computed: { value: {
iconClass(){ type: Object,
var _class = ' ' + this.icon; default: function () {
if (this.value && this.value.iconColor.length > 1) _class += ' gradient'; return null;
return _class;
},
iconBgStyle(){
if (!this.value) return {};
var style = {
'border-radius': this.value.bgRadius + '%',
'background': ''
};
if (this.value.iconBgImg) style['background'] += 'url('+ this.$util.img(this.value.iconBgImg) +') no-repeat bottom / contain'
if (this.value.iconBgColor.length) {
if (style.background) style.background += ',';
if (this.value.iconBgColor.length == 1) {
style.background += this.value.iconBgColor[0];
} else {
style['background'] += 'linear-gradient('+ this.value.iconBgColorDeg +'deg, '+ this.value.iconBgColor.join(',') +')';
}
}
return this.$util.objToStyle(style);
},
iconStyle(){
if (!this.value) return {};
var style = {
'font-size': this.value.fontSize + '%'
}
if (this.value.iconColor.length == 1) {
style.color = this.value.iconColor[0];
} else {
style['background'] = 'linear-gradient('+ this.value.iconColorDeg +'deg, '+ this.value.iconColor.join(',') +')';
}
return this.$util.objToStyle(style);
} }
} }
},
mixins: [DiyMinx],
computed: {
iconClass() {
var _class = ' ' + this.icon;
if (this.value && this.value.iconColor.length > 1) _class += ' gradient';
return _class;
},
iconBgStyle() {
if (!this.value) return {};
var style = {
'border-radius': this.value.bgRadius + '%',
'background': ''
};
if (this.value.iconBgImg) style['background'] += 'url(' + this.$util.img(this.value.iconBgImg) + ') no-repeat bottom / contain'
if (this.value.iconBgColor.length) {
if (style.background) style.background += ',';
if (this.value.iconBgColor.length == 1) {
style.background += this.value.iconBgColor[0];
} else {
style['background'] += 'linear-gradient(' + this.value.iconBgColorDeg + 'deg, ' + this.value.iconBgColor.join(',') + ')';
}
}
return this.$util.objToStyle(style);
},
iconStyle() {
if (!this.value) return {};
var style = {
'font-size': this.value.fontSize + '%'
}
if (this.value.iconColor.length == 1) {
style.color = this.value.iconColor[0];
} else {
style['background'] = 'linear-gradient(' + this.value.iconColorDeg + 'deg, ' + this.value.iconColor.join(',') + ')';
}
return this.$util.objToStyle(style);
}
} }
}
</script> </script>
<style lang="scss"> <style lang="scss">
.diy-icon { .diy-icon {
width: 100%; width: 100%;
height: 100%; height: 100%;
font-size: 100%; font-size: 100%;
color: #000; color: #000;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.js-icon { .js-icon {
font-size: 50%; font-size: 50%;
line-height:1; line-height: 1;
padding: 1rpx; padding: 1rpx;
&.gradient {
-webkit-background-clip:text!important; &.gradient {
-webkit-text-fill-color:transparent; -webkit-background-clip: text !important;
} -webkit-text-fill-color: transparent;
} }
} }
}
</style> </style>

View File

@@ -1,42 +1,26 @@
<template> <template>
<view :style="componentStyle"> <view :style="componentStyle">
<scroll-view <scroll-view :class="['image-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:class="['image-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]" :scroll-x="value.showStyle == 'singleSlide'">
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<view <view v-for="(item, index) in value.list" :key="index" :class="['image-nav-item', value.mode]"
v-for="(item, index) in value.list" style="margin-right: 28rpx;">
:key="index"
:class="['image-nav-item', value.mode]"
style="margin-right: 28rpx;"
>
<!-- 图片部分 --> <!-- 图片部分 -->
<view v-if="value.mode != 'text'" class="image-img" :style="{ <view v-if="value.mode != 'text'" class="image-img" :style="{
'font-size': (value.imageSize * 2 + 'rpx') + ';', 'font-size': (value.imageSize * 2 + 'rpx') + ';',
'width': (item.imgWidth / 2 + 'rpx') + ';', 'width': (item.imgWidth / 2 + 'rpx') + ';',
'height': (item.imgHeight / 2 + 'rpx') + ';' 'height': (item.imgHeight / 2 + 'rpx') + ';'
}"> }">
<image <image v-if="item.link.wap_url" :style="{
v-if="item.link.wap_url" 'width': (item.imgWidth / 2 + 'rpx') + ';',
:style="{ 'height': (item.imgHeight / 2 + 'rpx') + ';'
'width': (item.imgWidth / 2 + 'rpx') + ';', }" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
'height': (item.imgHeight / 2 + 'rpx') + ';' :show-menu-by-longpress="true" @tap="redirectTo(item.link)"></image>
}" <image v-else :style="{
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')" 'width': (item.imgWidth / 2 + 'rpx') + ';',
:show-menu-by-longpress="true" 'height': (item.imgHeight / 2 + 'rpx') + ';'
@tap="redirectTo(item.link)" }" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
></image> :show-menu-by-longpress="true" @tap="previewImg(item.imageUrl)"></image>
<image
v-else
:style="{
'width': (item.imgWidth / 2 + 'rpx') + ';',
'height': (item.imgHeight / 2 + 'rpx') + ';'
}"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
:show-menu-by-longpress="true"
@tap="previewImg(item.imageUrl)"
></image>
</view> </view>
<!-- 文字部分 --> <!-- 文字部分 -->
@@ -55,6 +39,7 @@
<script> <script>
import nsLogin from '@/components/ns-login/ns-login.vue' import nsLogin from '@/components/ns-login/ns-login.vue'
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-image-nav', name: 'diy-image-nav',
@@ -67,6 +52,7 @@ export default {
default: () => ({}) default: () => ({})
} }
}, },
mixins: [DiyMinx],
data() { data() {
return { return {
pageWidth: '', pageWidth: '',
@@ -116,7 +102,7 @@ export default {
isIndicatorDots() { isIndicatorDots() {
return this.value.carousel.type != 'hide' && return this.value.carousel.type != 'hide' &&
1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount)); 1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount));
} }
}, },
methods: { methods: {
@@ -125,9 +111,9 @@ export default {
uni.previewImage({ uni.previewImage({
current: 0, current: 0,
urls: [this.$util.img(imageUrl)], urls: [this.$util.img(imageUrl)],
success: (res) => {}, success: (res) => { },
fail: (res) => {}, fail: (res) => { },
complete: (res) => {} complete: (res) => { }
}); });
}, },

View File

@@ -2,31 +2,37 @@
<view data-component-name="diy-img-ads" class="single-graph"> <view data-component-name="diy-img-ads" class="single-graph">
<view :style="imgAdsMarginWarp" class="swiper-box"> <view :style="imgAdsMarginWarp" class="swiper-box">
<block v-if="imgAdsValue.list.length == 1"> <block v-if="imgAdsValue.list.length == 1">
<view class="simple-graph-wrap" :style="imgAdsSwiper" @click="handlerClick(imgAdsValue.list[0].link)" @tap="handlerClick(imgAdsValue.list[0].link)"> <view class="simple-graph-wrap" :style="imgAdsSwiper" @click="handlerClick(imgAdsValue.list[0].link)"
<image :style="{ height: imgAdsValue.list[0].imgHeight }" :src="$util.img(imgAdsValue.list[0].imageUrl)" mode="widthFix" :show-menu-by-longpress="true"/> @tap="handlerClick(imgAdsValue.list[0].link)">
<image :style="{ height: imgAdsValue.list[0].imgHeight }"
:src="$util.img(imgAdsValue.list[0].imageUrl)" mode="widthFix" :show-menu-by-longpress="true" />
</view> </view>
</block> </block>
<swiper v-else class="swiper" :style="{ height: swiperHeight }" :class="{ <swiper v-else class="swiper" :style="{ height: swiperHeight }" :class="{
'swiper-left': imgAdsValue.indicatorLocation == 'left', 'swiper-left': imgAdsValue.indicatorLocation == 'left',
'swiper-right': imgAdsValue.indicatorLocation == 'right', 'swiper-right': imgAdsValue.indicatorLocation == 'right',
'ns-indicator-dots': imgAdsValue.carouselStyle == 'line' 'ns-indicator-dots': imgAdsValue.carouselStyle == 'line'
}" :autoplay="true" :interval="imgAdsValue.interval" circular="true" :indicator-dots="isDots" }" :autoplay="true" :interval="imgAdsValue.interval" circular="true" :indicator-dots="isDots"
indicator-color="rgba(130, 130, 130, .5)" :indicator-active-color="imgAdsValue.indicatorColor" indicator-color="rgba(130, 130, 130, .5)" :indicator-active-color="imgAdsValue.indicatorColor"
@change="swiperChange"> @change="swiperChange">
<swiper-item class="swiper-item" :style="imgAdsSwiper" v-for="(item, index) in imgAdsValue.list" :key="index" v-if="item.imageUrl" @click="handlerClick(item.link)" @tap="handlerClick(item.link)"> <swiper-item class="swiper-item" :style="imgAdsSwiper" v-for="(item, index) in imgAdsValue.list"
:key="index" v-if="item.imageUrl" @click="handlerClick(item.link)" @tap="handlerClick(item.link)">
<view class="item" :style="imgAdsSwiper + 'height: ' + item.imgHeight"> <view class="item" :style="imgAdsSwiper + 'height: ' + item.imgHeight">
<image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'" :show-menu-by-longpress="true"/> <image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'"
:show-menu-by-longpress="true" />
</view> </view>
</swiper-item> </swiper-item>
</swiper> </swiper>
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<view v-if="imgAdsValue.list.length > 1 && value.indicatorIsShow" :class="[ <view v-if="imgAdsValue.list.length > 1 && value.indicatorIsShow" :class="[
'swiper-dot-box', 'swiper-dot-box',
{ straightLine: imgAdsValue.carouselStyle == 'line' }, { straightLine: imgAdsValue.carouselStyle == 'line' },
{ 'swiper-left': imgAdsValue.indicatorLocation == 'left' }, { 'swiper-left': imgAdsValue.indicatorLocation == 'left' },
{ 'swiper-right': imgAdsValue.indicatorLocation == 'right' } { 'swiper-right': imgAdsValue.indicatorLocation == 'right' }
]"> ]">
<view v-for="(numItem, numIndex) in imgAdsValue.list.length" :key="numIndex" :class="['swiper-dot', { active: numIndex == swiperIndex }]" :style="[numIndex == swiperIndex && { backgroundColor: imgAdsValue.indicatorColor }]"></view> <view v-for="(numItem, numIndex) in imgAdsValue.list.length" :key="numIndex"
:class="['swiper-dot', { active: numIndex == swiperIndex }]"
:style="[numIndex == swiperIndex && { backgroundColor: imgAdsValue.indicatorColor }]"></view>
</view> </view>
<!-- #endif --> <!-- #endif -->
</view> </view>
@@ -34,277 +40,279 @@
</template> </template>
<script> <script>
// 图片广告 // 图片广告
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-img-ads', name: 'diy-img-ads',
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {};
}
} }
}
},
data() {
return {
isDots: true,
swiperHeight: 0,
imgAdsValue: null, // 深拷贝一遍数据,防止动态计算图片展示尺寸的时候,影响到父级的数据,导致二次渲染的时候,数据错误
swiperIndex: 0
};
},
created() {
this.calcSingleRow();
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
imgAdsMarginWarp: function () {
var obj = '';
obj = 'background-color:' + this.value.componentBgColor + ';';
return obj;
}, },
data() { imgAdsSwiper: function () {
return { var obj = '';
isDots: true, if (this.value.componentAngle == 'round') {
swiperHeight: 0, obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
imgAdsValue: null, // 深拷贝一遍数据,防止动态计算图片展示尺寸的时候,影响到父级的数据,导致二次渲染的时候,数据错误 obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
swiperIndex: 0 obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}; obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
},
created() {
this.calcSingleRow();
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function(nval) {}
},
computed: {
imgAdsMarginWarp: function() {
var obj = '';
obj = 'background-color:' + this.value.componentBgColor + ';';
return obj;
},
imgAdsSwiper: function() {
var obj = '';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
singleGraphBg: function() {
var imgArr = [];
for (let i = 0; i < this.imgAdsValue.list.length; i++) {
let item = this.imgAdsValue.list[i];
imgArr[i] = parseFloat(item.imgHeight);
}
imgArr.sort(function(a, b) {
return b - a;
});
var obj = '';
obj += 'background-color:' + this.imgAdsValue.backgroundColor + ';';
obj += 'height:' + imgArr[0] * (this.imgAdsValue.backgroundHeight / 100) * 2 + 'rpx;';
return obj;
} }
return obj;
}, },
methods: { singleGraphBg: function () {
swiperChange(e) { var imgArr = [];
this.swiperIndex = e.detail.current; for (let i = 0; i < this.imgAdsValue.list.length; i++) {
}, let item = this.imgAdsValue.list[i];
calcSingleRow() { imgArr[i] = parseFloat(item.imgHeight);
let minHeight = 0; }
let systemInfo = uni.getSystemInfoSync() imgArr.sort(function (a, b) {
// 深拷贝一层数据,防止数据更改越权 return b - a;
this.imgAdsValue = JSON.parse(JSON.stringify(this.value)); });
this.imgAdsValue.list.forEach((item, index) => { var obj = '';
var ratio = item.imgHeight / item.imgWidth; obj += 'background-color:' + this.imgAdsValue.backgroundColor + ';';
item.imgWidth = systemInfo.windowWidth; obj += 'height:' + imgArr[0] * (this.imgAdsValue.backgroundHeight / 100) * 2 + 'rpx;';
item.imgWidth -= this.value.margin.both * 2; return obj;
item.imgHeight = item.imgWidth * ratio; }
},
methods: {
swiperChange(e) {
this.swiperIndex = e.detail.current;
},
calcSingleRow() {
let minHeight = 0;
let systemInfo = uni.getSystemInfoSync()
// 深拷贝一层数据,防止数据更改越权
this.imgAdsValue = JSON.parse(JSON.stringify(this.value));
this.imgAdsValue.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth;
item.imgWidth = systemInfo.windowWidth;
item.imgWidth -= this.value.margin.both * 2;
item.imgHeight = item.imgWidth * ratio;
// 获取最大高度 if (maxHeight == 0 || maxHeight < item.imgHeight) maxHeight = item.imgHeight; // 获取最大高度 if (maxHeight == 0 || maxHeight < item.imgHeight) maxHeight = item.imgHeight;
if (minHeight == 0 || minHeight > item.imgHeight) minHeight = item.imgHeight; if (minHeight == 0 || minHeight > item.imgHeight) minHeight = item.imgHeight;
}); });
this.imgAdsValue.list.forEach((item, index) => { this.imgAdsValue.list.forEach((item, index) => {
item.imgHeight = minHeight + 'px'; item.imgHeight = minHeight + 'px';
this.swiperHeight = minHeight + 'px'; this.swiperHeight = minHeight + 'px';
}); });
this.imgAdsValue.indicatorColor = this.imgAdsValue.indicatorColor || '#fff'; this.imgAdsValue.indicatorColor = this.imgAdsValue.indicatorColor || '#fff';
if (this.value.indicatorIsShow === undefined) { if (this.value.indicatorIsShow === undefined) {
this.value.indicatorIsShow = true; // 控制指示点是否展示 this.value.indicatorIsShow = true; // 控制指示点是否展示
} }
// 是否显示指示器 // 是否显示指示器
if (this.imgAdsValue.list.length <= 1) { if (this.imgAdsValue.list.length <= 1) {
this.isDots = false;
}
// #ifdef H5
this.isDots = this.value.indicatorIsShow;
// #endif
// #ifdef MP-WEIXIN
this.isDots = false; this.isDots = false;
// #endif }
},
async handlerClick(link) { // #ifdef H5
await this.__$emitEvent({eventName: 'img-ads-tap', data: link, promiseCallback: (event, handler, awaitedResult) => { this.isDots = this.value.indicatorIsShow;
// #endif
// #ifdef MP-WEIXIN
this.isDots = false;
// #endif
},
async handlerClick(link) {
await this.__$emitEvent({
eventName: 'img-ads-tap', data: link, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.$util.diyRedirectTo(link); this.$util.diyRedirectTo(link);
}}) }
}, })
} },
}; }
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.single-graph { .single-graph {
width: 100%;
line-height: 0;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
box-sizing: border-box;
}
.simple-graph-wrap {
line-height: 0;
overflow: hidden;
position: relative;
image {
width: 100%; width: 100%;
line-height: 0;
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
box-sizing: border-box;
} }
.simple-graph-wrap { .heat-map {
line-height: 0; position: absolute;
overflow: hidden; }
}
.item.active text {
background: rgba(0, 0, 0, 0.3);
position: absolute;
bottom: 0;
color: #ffffff;
font-size: $font-size-tag;
width: 100%;
left: 0;
line-height: 40rpx;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
padding: 0 10rpx;
text-align: center;
}
.swiper-box {
position: relative;
width: 100%;
overflow: hidden;
box-sizing: border-box;
}
.swiper {
margin: 0 auto;
overflow: hidden;
}
.swiper-item {
width: 100%;
height: auto !important;
display: flex;
justify-content: center;
flex-direction: column;
// position: relative;
overflow: hidden;
.item {
width: 100%;
height: auto;
text-align: center;
position: relative; position: relative;
overflow: hidden;
image { image {
width: 100%; width: 100%;
max-width: 100%;
height: 100%;
will-change: transform;
} }
.heat-map { .heat-map {
position: absolute; position: absolute;
} }
} }
}
.item.active text { .swiper-dot-box {
background: rgba(0, 0, 0, 0.3); position: absolute;
position: absolute; bottom: 20rpx;
bottom: 0; width: 100%;
color: #ffffff; display: flex;
font-size: $font-size-tag; align-items: center;
width: 100%; justify-content: center;
left: 0; padding: 0 40rpx 8rpx;
line-height: 40rpx; box-sizing: border-box;
white-space: nowrap;
text-overflow: ellipsis; &.swiper-left {
overflow: hidden; justify-content: flex-start;
padding: 0 10rpx;
text-align: center;
} }
.swiper-box { &.swiper-right {
position: relative; justify-content: flex-end;
width: 100%;
overflow: hidden;
box-sizing: border-box;
} }
.swiper { .swiper-dot {
margin: 0 auto; background-color: #b2b2b2;
overflow: hidden; width: 15rpx;
} border-radius: 50%;
height: 15rpx;
margin: 8rpx;
.swiper-item { &.active {
width: 100%; background-color: rgba(0, 0, 0, 1);
height: auto !important;
display: flex;
justify-content: center;
flex-direction: column;
// position: relative;
overflow: hidden;
.item {
width: 100%;
height: auto;
text-align: center;
position: relative;
overflow: hidden;
image {
width: 100%;
max-width: 100%;
height: 100%;
will-change: transform;
}
.heat-map {
position: absolute;
}
} }
} }
.swiper-dot-box { &.straightLine {
position: absolute;
bottom: 20rpx;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 0 40rpx 8rpx;
box-sizing: border-box;
&.swiper-left {
justify-content: flex-start;
}
&.swiper-right {
justify-content: flex-end;
}
.swiper-dot { .swiper-dot {
background-color: #b2b2b2; width: 18rpx;
width: 15rpx; height: 6rpx;
border-radius: 50%; border-radius: 4rpx;
height: 15rpx;
margin: 8rpx;
&.active { &.active {
width: 36rpx;
background-color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 1);
} }
} }
&.straightLine {
.swiper-dot {
width: 18rpx;
height: 6rpx;
border-radius: 4rpx;
&.active {
width: 36rpx;
background-color: rgba(0, 0, 0, 1);
}
}
}
} }
}
/* 隐藏滚动条,但依旧具备可以滚动的功能 */ /* 隐藏滚动条,但依旧具备可以滚动的功能 */
/deep/.uni-scroll-view::-webkit-scrollbar { /deep/.uni-scroll-view::-webkit-scrollbar {
display: none; display: none;
} }
.swiper /deep/ .uni-swiper-dots-horizontal { .swiper /deep/ .uni-swiper-dots-horizontal {
bottom: 25rpx; bottom: 25rpx;
} }
.swiper-left /deep/ .uni-swiper-dots-horizontal { .swiper-left /deep/ .uni-swiper-dots-horizontal {
left: 40rpx; left: 40rpx;
transform: translate(0); transform: translate(0);
} }
.swiper-right /deep/ .uni-swiper-dots-horizontal { .swiper-right /deep/ .uni-swiper-dots-horizontal {
right: 40rpx; right: 40rpx;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
transform: translate(0); transform: translate(0);
} }
.carousel-angle /deep/ .uni-swiper-dots-horizontal .uni-swiper-dot { .carousel-angle /deep/ .uni-swiper-dots-horizontal .uni-swiper-dot {
width: 24rpx; width: 24rpx;
border-radius: 0; border-radius: 0;
height: 8rpx; height: 8rpx;
} }
.swiper.ns-indicator-dots /deep/ .uni-swiper-dot { .swiper.ns-indicator-dots /deep/ .uni-swiper-dot {
width: 18rpx; width: 18rpx;
height: 6rpx; height: 6rpx;
border-radius: 4rpx; border-radius: 4rpx;
} }
.swiper.ns-indicator-dots /deep/ .uni-swiper-dot-active { .swiper.ns-indicator-dots /deep/ .uni-swiper-dot-active {
width: 36rpx; width: 36rpx;
} }
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,20 @@
<template> <template>
<view data-component-name="diy-kefu" class="diy-kefu" :style="style"> <view data-component-name="diy-kefu" class="diy-kefu" :style="style">
<view class="fui-list-group merchgroup" v-for="(item,index) in value.list"> <view class="fui-list-group merchgroup" v-for="(item, index) in value.list">
<view class="fui-list jump" v-if="index == 0"> <view class="fui-list jump" v-if="index == 0">
<view class="fui-list-media"> <view class="fui-list-media">
<image class="round" :src="$util.img(item.imageUrl)" style="border-radius:6rpx"></image> <image class="round" :src="$util.img(item.imageUrl)" style="border-radius:6rpx"></image>
</view> </view>
<view class="fui-list-inner" > <view class="fui-list-inner">
<view class="title" style="color: ;height: 75rpx;"> <view class="title" style="height: 75rpx;">
<text style="font-weight:600" :style="{color:item.textColor}">{{item.title}}</text> <text style="font-weight:600" :style="{ color: item.textColor }">{{ item.title }}</text>
<view class="subtitle" style="font-size:24rpx" :style="{color:item.textColor}">{{item.desc}}</view> <view class="subtitle" style="font-size:24rpx" :style="{ color: item.textColor }">{{ item.desc }}
</view>
</view> </view>
</view> </view>
<view class="fui-remark jump" style="padding-right: 20rpx; text-align: center; line-height: 140rpx;"> <view class="fui-remark jump" style="padding-right: 20rpx; text-align: center; line-height: 140rpx;">
<span style="font-size:24rpx;padding: 14rpx 18rpx;border-radius:8rpx" :style="{background:item.BtBgColor,color:item.BtColor}" @click="previewSqs()">立即添加</span> <span style="font-size:24rpx;padding: 14rpx 18rpx;border-radius:8rpx"
:style="{ background: item.BtBgColor, color: item.BtColor }" @click="previewSqs()">立即添加</span>
</view> </view>
</view> </view>
</view> </view>
@@ -20,52 +22,53 @@
</template> </template>
<script> <script>
export default { // 客服展示
name: 'diy-picture', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-kefu',
type: Object props: {
} value: {
}, type: Object
data() {
return {
loading: true,
};
},
created() {
// this.getDataList();
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
// this.getDataList();
}
},
computed: {
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
previewSqs(){
var img = this.$util.img(this.value.list[1].imageUrl)
uni.previewImage({
current: img,
urls: [img]
})
}
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
};
},
created() {
// this.getDataList();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
// this.getDataList();
}
},
computed: {
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
previewSqs() {
var img = this.$util.img(this.value.list[1].imageUrl)
uni.previewImage({
current: img,
urls: [img]
})
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss"></style>
</style>

View File

@@ -1,77 +1,80 @@
<template> <template>
<view data-component-name="diy-picture" class="diy-picture" :style="style"> <view data-component-name="diy-picture" class="diy-picture" :style="style">
<view class="fui-cell-group"> <view class="fui-cell-group">
<!-- <image mode="widthFix" style="width: 100%;" :src="$util.img(item.imageUrl)"></image> --> <!-- <image mode="widthFix" style="width: 100%;" :src="$util.img(item.imageUrl)"></image> -->
<view v-for="(item,index) in value.list" @click="redirectTo(item.link)" class="fui-cell" :class="item.iconType == 'img'?'img-cell':''"> <view v-for="(item, index) in value.list" @click="redirectTo(item.link)" class="fui-cell"
<view class="fui-cell-icon" style="color:diyitem.style.iconcolo"> :class="item.iconType == 'img' ? 'img-cell' : ''">
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" <view class="fui-cell-icon" :style="{ 'color': item.style ? item.style.iconColor : '#333' }">
:value="item.style ? item.style : null" <diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" :value="item.style ? item.style : null"
:style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon> :style="{ maxWidth: value.imageSize * 2 + 'rpx', maxHeight: value.imageSize * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon>
<image v-if="item.iconType == 'img'" mode="widthFix" :src="$util.img(item.imageUrl)" style="border-radius:6rpx;width: 60rpx;"></image> <image v-if="item.iconType == 'img'" mode="widthFix" :src="$util.img(item.imageUrl)"
</view> style="border-radius:6rpx;width: 60rpx;"></image>
<view class="fui-cell-text" style="color:#333;">{{item.title}}</view> </view>
<view class="fui-cell-remark" style="font-size: 24rpx;">{{lang=='en-us'?'view':'查看'}}</view> <view class="fui-cell-text" style="color:#333;">{{ item.title }}</view>
</view> <view class="fui-cell-remark" style="font-size: 24rpx;">{{ lang == 'en-us' ? 'view' : '查看' }}</view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
export default { // 自定义列表菜单展示
name: 'diy-listmenu', import DiyMinx from './minx.js'
props: { export default {
value: { name: 'diy-listmenu',
type: Object props: {
} value: {
}, type: Object
data() {
return {
loading: true,
lang:uni.getStorageSync("lang")//en-us 英文
};
},
created() {
// this.getDataList();
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
// this.getDataList();
}
},
computed: {
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if(this.value.margin.top > 0)css += 'margin-top:' + this.value.margin.top * 2 + 'rpx;';
return css;
}
},
methods: {
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
this.$util.diyRedirectTo(link);
},
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
lang: uni.getStorageSync("lang")//en-us 英文
};
},
created() {
// this.getDataList();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
// this.getDataList();
}
},
computed: {
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.margin.top > 0) css += 'margin-top:' + this.value.margin.top * 2 + 'rpx;';
return css;
}
},
methods: {
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
this.$util.diyRedirectTo(link);
},
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.img-cell{ .img-cell {
padding:0 16rpx !important; padding: 0 16rpx !important;
} }
</style> </style>

View File

@@ -1,14 +1,19 @@
<template> <template>
<x-skeleton data-component-name="diy-live" type="banner" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-live" type="banner" :loading="loading" :configs="skeletonConfig">
<view class="live-wrap" @click="handlerClick(liveInfo.roomid)" @tap="handlerClick(liveInfo.roomid)" v-if="liveInfo"> <view class="live-wrap" @click="handlerClick(liveInfo.roomid)" @tap="handlerClick(liveInfo.roomid)"
v-if="liveInfo">
<view class="banner-wrap"> <view class="banner-wrap">
<image :src="liveInfo.banner != '' ? $util.img(liveInfo.banner) : $util.img('public/uniapp/live/live_default_banner.png')" <image
mode="widthFix" @error="liveInfo.banner = $util.img('public/uniapp/live/live_default_banner.png')"/> :src="liveInfo.banner != '' ? $util.img(liveInfo.banner) : $util.img('public/uniapp/live/live_default_banner.png')"
mode="widthFix"
@error="liveInfo.banner = $util.img('public/uniapp/live/live_default_banner.png')" />
<view class="shade"></view> <view class="shade"></view>
<view class="wrap"> <view class="wrap">
<view class="room-name"> <view class="room-name">
<text class="status-name font-size-base" :class="{ 'color-base-bg': liveInfo.live_status == '101' }"> <text class="status-name font-size-base"
<text class="iconfont icon-zhibozhong font-size-sub" v-if="liveInfo.live_status == '101'"></text> :class="{ 'color-base-bg': liveInfo.live_status == '101' }">
<text class="iconfont icon-zhibozhong font-size-sub"
v-if="liveInfo.live_status == '101'"></text>
<text class="iconfont icon-zhibojieshu font-size-sub" v-else></text> <text class="iconfont icon-zhibojieshu font-size-sub" v-else></text>
{{ liveInfo.status_name }} {{ liveInfo.status_name }}
</text> </text>
@@ -18,7 +23,9 @@
</view> </view>
<view class="room-info" v-if="value.isShowAnchorInfo || value.isShowLiveGood"> <view class="room-info" v-if="value.isShowAnchorInfo || value.isShowLiveGood">
<block v-if="value.isShowAnchorInfo"> <block v-if="value.isShowAnchorInfo">
<image :src="liveInfo.anchor_img != '' ? $util.img(liveInfo.anchor_img) : $util.getDefaultImage().head" class="anchor-img" @error="liveInfo.anchor_img = $util.getDefaultImage().head"/> <image
:src="liveInfo.anchor_img != '' ? $util.img(liveInfo.anchor_img) : $util.getDefaultImage().head"
class="anchor-img" @error="liveInfo.anchor_img = $util.getDefaultImage().head" />
<text class="anchor-name">主播{{ liveInfo.anchor_name }}</text> <text class="anchor-name">主播{{ liveInfo.anchor_name }}</text>
</block> </block>
<text class="separate" v-if="value.isShowAnchorInfo && value.isShowLiveGood">|</text> <text class="separate" v-if="value.isShowAnchorInfo && value.isShowLiveGood">|</text>
@@ -31,219 +38,222 @@
</template> </template>
<script> <script>
// 直播 // 直播
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
components: {}, components: {},
name: 'diy-live', name: 'diy-live',
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {};
} }
}
},
data() {
return {
loading: true,
skeletonConfig: {
headHeight: '200rpx'
},
liveInfo: {
banner: '',
anchor_img: ''
} }
},
data() {
return {
loading: true,
skeletonConfig: {
headHeight: '200rpx'
},
liveInfo: {
banner: '',
anchor_img: ''
}
}; };
}, },
created() { created() {
this.getLiveInfo();
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getLiveInfo(); this.getLiveInfo();
}, }
mixins: [DiyMinx], },
watch: { methods: {
// 组件刷新监听 getLiveInfo() {
componentRefresh: function(nval) { this.$api.sendRequest({
this.getLiveInfo(); url: '/live/api/live/info',
} success: res => {
}, if (res.code == 0 && res.data) {
methods: { this.liveInfo = res.data;
getLiveInfo() { this.getLiveStatus();
this.$api.sendRequest({ } else {
url: '/live/api/live/info', this.liveInfo = null;
success: res => {
if (res.code == 0 && res.data) {
this.liveInfo = res.data;
this.getLiveStatus();
} else {
this.liveInfo = null;
}
this.loading = false;
} }
}); this.loading = false;
}, }
entryRoom(roomId) { });
// #ifdef MP-WEIXIN },
wx.navigateTo({ entryRoom(roomId) {
url: `plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=${roomId}` // #ifdef MP-WEIXIN
}); wx.navigateTo({
// #endif url: `plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=${roomId}`
}, });
getLiveStatus() { // #endif
// #ifdef MP-WEIXIN },
let livePlayer = requirePlugin('live-player-plugin'); getLiveStatus() {
// #ifdef MP-WEIXIN
let livePlayer = requirePlugin('live-player-plugin');
livePlayer.getLiveStatus({ livePlayer.getLiveStatus({
room_id: this.liveInfo.roomid
}).then(res => {
const liveStatus = res.liveStatus;
if (liveStatus && liveStatus != this.liveInfo.live_status) {
this.changeLiveStatus(liveStatus);
}
})
.catch(err => {
console.log('get live status', err);
});
// 往后间隔1分钟或更慢的频率去轮询获取直播状态
var timer = setInterval(() => {
livePlayer
.getLiveStatus({
room_id: this.liveInfo.roomid room_id: this.liveInfo.roomid
}).then(res => { })
.then(res => {
const liveStatus = res.liveStatus; const liveStatus = res.liveStatus;
if (liveStatus && liveStatus != this.liveInfo.live_status) { if (liveStatus && liveStatus != this.liveInfo.live_status) {
this.changeLiveStatus(liveStatus); this.changeLiveStatus(liveStatus);
} }
}) if (this.$util.inArray(liveStatus, [103, 104, 106, 107])) {
.catch(err => {console.log('get live status', err); clearInterval(timer);
});
// 往后间隔1分钟或更慢的频率去轮询获取直播状态
var timer = setInterval(() => {
livePlayer
.getLiveStatus({
room_id: this.liveInfo.roomid
})
.then(res => {
const liveStatus = res.liveStatus;
if (liveStatus && liveStatus != this.liveInfo.live_status) {
this.changeLiveStatus(liveStatus);
}
if (this.$util.inArray(liveStatus, [103, 104, 106, 107])) {
clearInterval(timer);
}
})
.catch(err => {
console.log('get live status', err);
});
}, 60000);
// #endif
},
changeLiveStatus(status) {
this.$api.sendRequest({
url: '/live/api/live/modifyLiveStatus',
data: {
room_id: this.liveInfo.roomid,
status: status
},
success: res => {
if (res.code == 0) {
this.getLiveInfo();
} }
})
.catch(err => {
console.log('get live status', err);
});
}, 60000);
// #endif
},
changeLiveStatus(status) {
this.$api.sendRequest({
url: '/live/api/live/modifyLiveStatus',
data: {
room_id: this.liveInfo.roomid,
status: status
},
success: res => {
if (res.code == 0) {
this.getLiveInfo();
} }
}); }
}, });
async handlerClick(roomid) { },
await this.__$emitEvent({eventName: 'live-tap', data: roomid, promiseCallback: (event, handler, awaitedResult) => { async handlerClick(roomid) {
await this.__$emitEvent({
eventName: 'live-tap', data: roomid, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.entryRoom(roomid); this.entryRoom(roomid);
}}) }
}, })
} },
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
.live-wrap { .live-wrap {
background: #fff; background: #fff;
border-radius: 16rpx; border-radius: 16rpx;
overflow: hidden; overflow: hidden;
}
.banner-wrap {
width: 100%;
position: relative;
line-height: 1;
display: flex;
image {
width: 100%;
} }
.banner-wrap { .shade {
width: 100%; width: 100%;
position: relative; height: 100%;
line-height: 1; position: absolute;
display: flex; background: rgba($color: #888, $alpha: 0.3);
left: 0;
top: 0;
z-index: 5;
}
image { .wrap {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 10;
padding: 26rpx 20rpx;
box-sizing: border-box;
.room-name {
font-size: $font-size-toolbar;
color: #fff;
line-height: 1;
width: 100%; width: 100%;
} white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: flex;
align-items: center;
.shade { .status-name {
width: 100%; display: inline-block;
height: 100%; font-size: $font-size-activity-tag;
position: absolute;
background: rgba($color: #888, $alpha: 0.3);
left: 0;
top: 0;
z-index: 5;
}
.wrap {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 10;
padding: 26rpx 20rpx;
box-sizing: border-box;
.room-name {
font-size: $font-size-toolbar;
color: #fff; color: #fff;
line-height: 1; padding: 8rpx 12rpx;
width: 100%; background-color: rgba(0, 0, 0, 0.6);
white-space: nowrap; border-radius: 36rpx;
overflow: hidden; margin-right: 20rpx;
text-overflow: ellipsis;
display: flex;
align-items: center;
.status-name { .icon-zhibozhong {
display: inline-block;
font-size: $font-size-activity-tag; font-size: $font-size-activity-tag;
color: #fff; color: #fff;
padding: 8rpx 12rpx; margin-right: 9rpx;
background-color: rgba(0, 0, 0, 0.6);
border-radius: 36rpx;
margin-right: 20rpx;
.icon-zhibozhong {
font-size: $font-size-activity-tag;
color: #fff;
margin-right: 9rpx;
}
} }
} }
} }
} }
}
.room-info { .room-info {
padding: 20rpx 30rpx; padding: 20rpx 30rpx;
background: #fff; background: #fff;
display: flex; display: flex;
.anchor-img { .anchor-img {
width: 60rpx; width: 60rpx;
height: 60rpx; height: 60rpx;
border-radius: 50%; border-radius: 50%;
overflow: hidden; overflow: hidden;
margin-right: 20rpx; margin-right: 20rpx;
}
.anchor-name,
.goods-text {
font-size: $font-size-base;
line-height: 60rpx;
}
.separate {
color: #808080;
margin: 0 10rpx;
line-height: 56rpx;
}
} }
.anchor-name,
.goods-text {
font-size: $font-size-base;
line-height: 60rpx;
}
.separate {
color: #808080;
margin: 0 10rpx;
line-height: 56rpx;
}
}
</style> </style>
<style scoped> <style scoped>
.coupon-all>>>.uni-scroll-view::-webkit-scrollbar { .coupon-all>>>.uni-scroll-view::-webkit-scrollbar {
display: none; display: none;
} }
</style> </style>

View File

@@ -1,255 +1,260 @@
<template> <template>
<view data-component-name="diy-many-goods-list" class="many-goods-list"> <view data-component-name="diy-many-goods-list" class="many-goods-list">
<scroll-view scroll-x="true" class="many-goods-list-head" :scroll-into-view="'a' + cateIndex" :style="manyWrapCss"> <scroll-view scroll-x="true" class="many-goods-list-head" :scroll-into-view="'a' + cateIndex"
<view v-for="(item, index) in value.list" class="scroll-item" :class="{ active: index == cateIndex }" :id="'a' + index" :key="index" @click="handlerClick({item,index})" @tap="handlerClick({item,index})"> :style="manyWrapCss">
<view v-for="(item, index) in value.list" class="scroll-item" :class="{ active: index == cateIndex }"
:id="'a' + index" :key="index" @click="handlerClick({ item, index })" @tap="handlerClick({ item, index })">
<view class="split-line" v-if="index > 0"></view> <view class="split-line" v-if="index > 0"></view>
<view class="cate"> <view class="cate">
<view class="name" :style="{ color : value.headStyle.titleColor }">{{ item.title }}</view> <view class="name" :style="{ color: value.headStyle.titleColor }">{{ item.title }}</view>
<view class="desc" :class="{ 'color-base-bg': index == cateIndex && item.desc }">{{ item.desc }} <view class="desc" :class="{ 'color-base-bg': index == cateIndex && item.desc }">{{ item.desc }}
</view> </view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<view class="many-goods-list-fill" :style="{'height': manyInfo.height}" v-if="fixedTop"></view> <view class="many-goods-list-fill" :style="{ 'height': manyInfo.height }" v-if="fixedTop"></view>
<diy-goods-list class="many-goods-list-body" v-if="goodsValue" :value="goodsValue" ref="diyGoodsList"></diy-goods-list> <diy-goods-list class="many-goods-list-body" v-if="goodsValue" :value="goodsValue"
ref="diyGoodsList"></diy-goods-list>
</view> </view>
</template> </template>
<script> <script>
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-many-goods-list', name: 'diy-many-goods-list',
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {};
}
},
scrollTop: {
type: [Number, String]
},
global: {
type: Object,
default: () => {
return {};
}
} }
}, },
data() { scrollTop: {
return { type: [Number, String]
cateIndex: 0, // 当前选中的分类id
goodsValue: null, // 商品列表数据
manyInfo: {
bodyHeight: 0,
bodyTop: 0,
height: 0,
top: 0
}
};
}, },
created() { global: {
type: Object,
default: () => {
return {};
}
}
},
data() {
return {
cateIndex: 0, // 当前选中的分类id
goodsValue: null, // 商品列表数据
manyInfo: {
bodyHeight: 0,
bodyTop: 0,
height: 0,
top: 0
}
};
},
created() {
this.changeCateIndex(this.value.list[0], 0, true);
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.changeCateIndex(this.value.list[0], 0, true); this.changeCateIndex(this.value.list[0], 0, true);
}, },
mixins: [DiyMinx], scrollTop: function (nval) {
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
this.changeCateIndex(this.value.list[0], 0, true);
},
scrollTop: function(nval) {
const query = uni.createSelectorQuery().in(this);
query
.select('.many-goods-list')
.boundingClientRect(data => {
if (data) {
this.manyInfo.top = data.top;
}
})
.exec();
query
.select('.many-goods-list .many-goods-list-body')
.boundingClientRect(data => {
if (data) {
this.manyInfo.bodyHeight = (data.height || 0);
this.manyInfo.bodyTop = (data.top || 0);
}
})
.exec();
}
},
computed: {
fixedTop() {
let diyPositionObj = JSON.parse(JSON.stringify(this.$store.state.diyGroupPositionObj));
let positionHeight = 0;
let height = 0;
delete diyPositionObj.diyManyGoodsList;
if (diyPositionObj) {
let arr = Object.values(diyPositionObj);
arr.forEach((item, index) => {
positionHeight += item.originalVal; //定位的高度【搜索框+导航分类+自定义头部】
});
}
if (this.manyInfo.top < positionHeight && (this.manyInfo.bodyTop + this.manyInfo.bodyHeight >
positionHeight + Number.parseFloat(this.manyInfo.height))) {
height = positionHeight;
}
return height;
},
manyWrapCss() {
let html = '';
html += `position: ${this.fixedTop ? 'fixed' : 'initial'};`
html += `top: ${this.fixedTop}px;`
if (!this.global.topNavBg)
html += `background-color: #fff;`
else
html += `background-color: ${this.fixedTop ? this.global.topNavColor : 'transparent'};`
return html;
}
},
mounted() {
const query = uni.createSelectorQuery().in(this); const query = uni.createSelectorQuery().in(this);
query query
.select('.many-goods-list .many-goods-list-head') .select('.many-goods-list')
.boundingClientRect(data => { .boundingClientRect(data => {
if (data) { if (data) {
this.manyInfo.height = (data.height || 0) + 'px'; this.manyInfo.top = data.top;
// 向vuex中的diyIndexPositionObj增加多商品组件定位位置
let diyManyGoodsList = {
originalVal: data.height || 0 //自身高度 px
}
this.$store.commit('setDiyGroupPositionObj', {
diyManyGoodsList: diyManyGoodsList
});
} }
}) })
.exec(); .exec();
},
methods: {
changeCateIndex(item, index, isFirst) {
this.cateIndex = index;
this.goodsValue = {
sources: item.sources,
categoryId: item.categoryId,
categoryName: item.categoryName,
goodsId: item.goodsId,
componentBgColor: this.value.componentBgColor,
componentAngle: this.value.componentAngle,
topAroundRadius: this.value.topAroundRadius,
bottomAroundRadius: this.value.bottomAroundRadius,
elementBgColor: this.value.elementBgColor,
elementAngle: this.value.elementAngle,
topElementAroundRadius: this.value.topElementAroundRadius,
bottomElementAroundRadius: this.value.bottomElementAroundRadius,
count: this.value.count,
nameLineMode: this.value.nameLineMode,
template: this.value.template,
style: this.value.style,
ornament: this.value.ornament,
sortWay: this.value.sortWay,
saleStyle: this.value.saleStyle,
tag: this.value.tag,
btnStyle: this.value.btnStyle,
goodsNameStyle: this.value.goodsNameStyle,
theme: this.value.theme,
priceStyle: this.value.priceStyle,
slideMode: this.value.slideMode,
imgAroundRadius: this.value.imgAroundRadius,
margin: this.value.margin,
goodsMarginType: this.value.goodsMarginType,
goodsMarginNum: this.value.goodsMarginNum
};
// 如果是第一次加载,不需要执行下面代码 query
if (isFirst) return; .select('.many-goods-list .many-goods-list-body')
this.$refs.diyGoodsList.goodsValue = this.goodsValue; .boundingClientRect(data => {
this.$refs.diyGoodsList.getGoodsList(); if (data) {
}, this.manyInfo.bodyHeight = (data.height || 0);
async handlerClick({item,index}) { this.manyInfo.bodyTop = (data.top || 0);
await this.__$emitEvent({eventName: 'many-goods-list-tap', data: {item,index}, promiseCallback: (event, handler, awaitedResult) => { }
})
.exec();
}
},
computed: {
fixedTop() {
let diyPositionObj = JSON.parse(JSON.stringify(this.$store.state.diyGroupPositionObj));
let positionHeight = 0;
let height = 0;
delete diyPositionObj.diyManyGoodsList;
if (diyPositionObj) {
let arr = Object.values(diyPositionObj);
arr.forEach((item, index) => {
positionHeight += item.originalVal; //定位的高度【搜索框+导航分类+自定义头部】
});
}
if (this.manyInfo.top < positionHeight && (this.manyInfo.bodyTop + this.manyInfo.bodyHeight >
positionHeight + Number.parseFloat(this.manyInfo.height))) {
height = positionHeight;
}
return height;
},
manyWrapCss() {
let html = '';
html += `position: ${this.fixedTop ? 'fixed' : 'initial'};`
html += `top: ${this.fixedTop}px;`
if (!this.global.topNavBg)
html += `background-color: #fff;`
else
html += `background-color: ${this.fixedTop ? this.global.topNavColor : 'transparent'};`
return html;
}
},
mounted() {
const query = uni.createSelectorQuery().in(this);
query
.select('.many-goods-list .many-goods-list-head')
.boundingClientRect(data => {
if (data) {
this.manyInfo.height = (data.height || 0) + 'px';
// 向vuex中的diyIndexPositionObj增加多商品组件定位位置
let diyManyGoodsList = {
originalVal: data.height || 0 //自身高度 px
}
this.$store.commit('setDiyGroupPositionObj', {
diyManyGoodsList: diyManyGoodsList
});
}
})
.exec();
},
methods: {
changeCateIndex(item, index, isFirst) {
this.cateIndex = index;
this.goodsValue = {
sources: item.sources,
categoryId: item.categoryId,
categoryName: item.categoryName,
goodsId: item.goodsId,
componentBgColor: this.value.componentBgColor,
componentAngle: this.value.componentAngle,
topAroundRadius: this.value.topAroundRadius,
bottomAroundRadius: this.value.bottomAroundRadius,
elementBgColor: this.value.elementBgColor,
elementAngle: this.value.elementAngle,
topElementAroundRadius: this.value.topElementAroundRadius,
bottomElementAroundRadius: this.value.bottomElementAroundRadius,
count: this.value.count,
nameLineMode: this.value.nameLineMode,
template: this.value.template,
style: this.value.style,
ornament: this.value.ornament,
sortWay: this.value.sortWay,
saleStyle: this.value.saleStyle,
tag: this.value.tag,
btnStyle: this.value.btnStyle,
goodsNameStyle: this.value.goodsNameStyle,
theme: this.value.theme,
priceStyle: this.value.priceStyle,
slideMode: this.value.slideMode,
imgAroundRadius: this.value.imgAroundRadius,
margin: this.value.margin,
goodsMarginType: this.value.goodsMarginType,
goodsMarginNum: this.value.goodsMarginNum
};
// 如果是第一次加载,不需要执行下面代码
if (isFirst) return;
this.$refs.diyGoodsList.goodsValue = this.goodsValue;
this.$refs.diyGoodsList.getGoodsList();
},
async handlerClick({ item, index }) {
await this.__$emitEvent({
eventName: 'many-goods-list-tap', data: { item, index }, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.changeCateIndex(item, index, false); this.changeCateIndex(item, index, false);
}}) }
}, })
} },
}; }
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.many-goods-list-head { .many-goods-list-head {
left: 0; left: 0;
right: 0; right: 0;
z-index: 5; z-index: 5;
background-color: #fff; background-color: #fff;
} }
scroll-view { scroll-view {
width: 100%; width: 100%;
white-space: nowrap; white-space: nowrap;
box-sizing: border-box; box-sizing: border-box;
padding: 20rpx 0; padding: 20rpx 0;
.scroll-item { .scroll-item {
display: inline-block;
text-align: center;
vertical-align: top;
width: calc(25% - 40rpx);
position: relative;
padding: 0 20rpx;
&:first-child {
width: calc(25% - 20rpx);
padding-left: 0;
}
.split-line {
display: inline-block; display: inline-block;
text-align: center; width: 1rpx;
vertical-align: top; height: 30rpx;
width: calc(25% - 40rpx); background-color: #e5e5e5;
position: relative; position: absolute;
padding: 0 20rpx; left: 0;
top: 50%;
&:first-child { transform: translateY(-50%);
width: calc(25% - 20rpx); }
padding-left: 0;
}
.split-line {
display: inline-block;
width: 1rpx;
height: 30rpx;
background-color: #e5e5e5;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
&.active {
.name {
font-weight: bold;
}
.desc {
color: #ffffff;
border-radius: 20rpx;
}
}
&.active {
.name { .name {
font-size: 32rpx; font-weight: bold;
color: $color-title;
line-height: 1;
}
.cate {
display: inline-block;
} }
.desc { .desc {
font-size: $font-size-tag; color: #ffffff;
color: $color-tip; border-radius: 20rpx;
height: 36rpx;
line-height: 36rpx;
margin-top: 10rpx;
min-width: 120rpx;
max-width: 220rpx;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 10rpx;
} }
} }
.name {
font-size: 32rpx;
color: $color-title;
line-height: 1;
}
.cate {
display: inline-block;
}
.desc {
font-size: $font-size-tag;
color: $color-tip;
height: 36rpx;
line-height: 36rpx;
margin-top: 10rpx;
min-width: 120rpx;
max-width: 220rpx;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 10rpx;
}
} }
}
</style> </style>

View File

@@ -1,17 +1,12 @@
<template> <template>
<view data-component-name="diy-map" class="diy-map" :style="style"> <view data-component-name="diy-map" class="diy-map" :style="style">
<view class="fui-list-group merchgroup" style="margin-top:0" v-for="(item,index) in value.list"> <view class="fui-list-group merchgroup" style="margin-top:0" v-for="(item, index) in value.list">
<map <map id="map" style="width: 100%; height:600rpx" scale="12" :markers="markerst" bindupdated="bindupdated"
id="map" :longitude="item.lng" :latitude="item.lat" show-location>
style="width: 100%; height:600rpx" <cover-view
scale="12" style="position:absolute;right:10px;bottom:30rpx;z-index:99999;background:#4390FF;padding:5px 10px;wxcs_style_padding:10rpx 20rpx;border-radius:8rpx;color: #fff;"
:markers="markerst" @click="handlerClick(item)" @tap="handlerClick(item)">
bindupdated="bindupdated" <cover-view style="font-size:24rpx">一键导航</cover-view>
:longitude="item.lng"
:latitude="item.lat"
show-location>
<cover-view style="position:absolute;right:10px;bottom:30rpx;z-index:99999;background:#4390FF;padding:5px 10px;wxcs_style_padding:10rpx 20rpx;border-radius:8rpx;color: #fff;" @click="handlerClick(item)" @tap="handlerClick(item)">
<cover-view style="font-size:24rpx">一键导航</cover-view>
</cover-view> </cover-view>
</map> </map>
</view> </view>
@@ -20,68 +15,68 @@
</template> </template>
<script> <script>
// 地图 // 地图
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-map', name: 'diy-map',
props: { props: {
value: { value: {
type: Object type: Object
}
},
data() {
return {
loading: true,
markers: []
};
},
created() {
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
// this.getDataList();
}
},
computed: {
markerst() {
return [{
id: 1,
latitude: this.value.list[0].lat,
longitude: this.value.list[0].lng
}]
},
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
return css;
}
},
methods: {
tomap(item) {
uni.openLocation({
latitude: parseFloat(item.lat),
longitude: parseFloat(item.lng),
name: "一键导航",
})
}, },
data() { async handlerClick(item) {
return { await this.__$emitEvent({
loading: true, eventName: 'map-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
markers:[]
};
},
created() {
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
// this.getDataList();
}
},
computed: {
markerst(){
return [{
id:1,
latitude:this.value.list[0].lat,
longitude:this.value.list[0].lng
}]
},
style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
tomap(item){
uni.openLocation({
latitude: parseFloat(item.lat),
longitude: parseFloat(item.lng),
name:"一键导航",
})
},
async handlerClick(item) {
await this.__$emitEvent({eventName: 'map-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.tomap(item); this.tomap(item);
}}) }
} })
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss"></style>
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -2,53 +2,75 @@
<view data-component-name="diy-member-my-order" class="common-wrap" :style="warpCss"> <view data-component-name="diy-member-my-order" class="common-wrap" :style="warpCss">
<view class="order-wrap"> <view class="order-wrap">
<view class="status-wrap"> <view class="status-wrap">
<view class="item-wrap" @click="redirect('/pages_order/list?status=waitpay')" style="margin-right: 10rpx;"> <view class="item-wrap" @click="redirect('/pages_order/list?status=waitpay')"
style="margin-right: 10rpx;">
<view class="icon-block"> <view class="icon-block">
<template v-if="value.style == 3"> <template v-if="value.style == 3">
<image :src="$util.img('public/uniapp/member/order/wait_pay.png')" mode="widthFix"/> <image :src="$util.img('public/uniapp/member/order/wait_pay.png')" mode="widthFix" />
<view class="icon-shade" :style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_pay_shade.png') + ')'"></view> <view class="icon-shade"
:style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_pay_shade.png') + ')'">
</view>
</template> </template>
<template v-else> <template v-else>
<diy-icon :icon="value.icon.waitPay.icon" v-if="value.icon.waitPay" :value="value.icon.waitPay.style ? value.icon.waitPay.style : null"></diy-icon> <diy-icon :icon="value.icon.waitPay.icon" v-if="value.icon.waitPay"
:value="value.icon.waitPay.style ? value.icon.waitPay.style : null"></diy-icon>
</template> </template>
<text v-if="orderNum.waitpay > 0" class="order-num color-base-bg price-font">{{ orderNum.waitpay > 99 ? '99+' : orderNum.waitpay }}</text> <text v-if="orderNum.waitpay > 0" class="order-num color-base-bg price-font">{{ orderNum.waitpay
> 99 ? '99+' :
orderNum.waitpay }}</text>
</view> </view>
<view class="title">{{ $lang('waitpay') }}</view> <view class="title">{{ $lang('waitpay') }}</view>
</view> </view>
<view class="item-wrap" @click="redirect('/pages_order/list?status=waitsend')" style="margin-right: 10rpx;"> <view class="item-wrap" @click="redirect('/pages_order/list?status=waitsend')"
style="margin-right: 10rpx;">
<view class="icon-block"> <view class="icon-block">
<template v-if="value.style == 3"> <template v-if="value.style == 3">
<image :src="$util.img('public/uniapp/member/order/wait_send.png')" mode="widthFix"></image> <image :src="$util.img('public/uniapp/member/order/wait_send.png')" mode="widthFix"></image>
<view class="icon-shade" :style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_send_shade.png') + ')'"></view> <view class="icon-shade"
:style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_send_shade.png') + ')'">
</view>
</template> </template>
<template v-else> <template v-else>
<diy-icon :icon="value.icon.waitSend.icon" v-if="value.icon.waitSend" :value="value.icon.waitSend.style ? value.icon.waitSend.style : null"></diy-icon> <diy-icon :icon="value.icon.waitSend.icon" v-if="value.icon.waitSend"
:value="value.icon.waitSend.style ? value.icon.waitSend.style : null"></diy-icon>
</template> </template>
<text v-if="orderNum.waitsend > 0" class="order-num color-base-bg price-font">{{ orderNum.waitsend > 99 ? '99+' : orderNum.waitsend }}</text> <text v-if="orderNum.waitsend > 0" class="order-num color-base-bg price-font">{{
orderNum.waitsend > 99 ? '99+'
: orderNum.waitsend }}</text>
</view> </view>
<view class="title">{{ $lang('waitsend') }}</view> <view class="title">{{ $lang('waitsend') }}</view>
</view> </view>
<view class="item-wrap" @click="redirect('/pages_order/list?status=waitconfirm')" style="margin-right: 10rpx;"> <view class="item-wrap" @click="redirect('/pages_order/list?status=waitconfirm')"
style="margin-right: 10rpx;">
<view class="icon-block"> <view class="icon-block">
<template v-if="value.style == 3"> <template v-if="value.style == 3">
<image :src="$util.img('public/uniapp/member/order/wait_confirm.png')" mode="widthFix"/> <image :src="$util.img('public/uniapp/member/order/wait_confirm.png')" mode="widthFix" />
<view class="icon-shade" :style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_confirm_shade.png') + ')'"></view> <view class="icon-shade"
:style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_confirm_shade.png') + ')'">
</view>
</template> </template>
<template v-else> <template v-else>
<diy-icon :icon="value.icon.waitConfirm.icon" v-if="value.icon.waitConfirm" :value="value.icon.waitConfirm.style ? value.icon.waitConfirm.style : null"></diy-icon> <diy-icon :icon="value.icon.waitConfirm.icon" v-if="value.icon.waitConfirm"
:value="value.icon.waitConfirm.style ? value.icon.waitConfirm.style : null"></diy-icon>
</template> </template>
<text v-if="orderNum.waitconfirm > 0" class="order-num color-base-bg price-font">{{ orderNum.waitconfirm > 99 ? '99+' : orderNum.waitconfirm }}</text> <text v-if="orderNum.waitconfirm > 0" class="order-num color-base-bg price-font">{{
orderNum.waitconfirm > 99 ?
'99+' : orderNum.waitconfirm }}</text>
</view> </view>
<view class="title">{{ $lang('waitconfirm') }}</view> <view class="title">{{ $lang('waitconfirm') }}</view>
</view> </view>
<view class="item-wrap" @click="redirect('/pages_order/list?status=waitrate')" style="margin-right: 10rpx;"> <view class="item-wrap" @click="redirect('/pages_order/list?status=waitrate')"
style="margin-right: 10rpx;">
<view class="icon-block"> <view class="icon-block">
<template v-if="value.style == 3"> <template v-if="value.style == 3">
<image :src="$util.img('public/uniapp/member/order/wait_use.png')" mode="widthFix"/> <image :src="$util.img('public/uniapp/member/order/wait_use.png')" mode="widthFix" />
<view class="icon-shade" :style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_rate_shade.png') + ')'"></view> <view class="icon-shade"
:style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/wait_rate_shade.png') + ')'">
</view>
</template> </template>
<template v-else> <template v-else>
<diy-icon :icon="value.icon.waitUse.icon" v-if="value.icon.waitUse" :value="value.icon.waitUse.style ? value.icon.waitUse.style : null"></diy-icon> <diy-icon :icon="value.icon.waitUse.icon" v-if="value.icon.waitUse"
:value="value.icon.waitUse.style ? value.icon.waitUse.style : null"></diy-icon>
</template> </template>
<!-- <text v-if="orderNum.wait_use > 0" class="order-num color-base-bg price-font">{{ orderNum.wait_use > 99 ? '99+' : orderNum.wait_use }}</text> --> <!-- <text v-if="orderNum.wait_use > 0" class="order-num color-base-bg price-font">{{ orderNum.wait_use > 99 ? '99+' : orderNum.wait_use }}</text> -->
</view> </view>
@@ -57,13 +79,18 @@
<view class="item-wrap" @click="redirect('/pages_tool/order/activist')"> <view class="item-wrap" @click="redirect('/pages_tool/order/activist')">
<view class="icon-block"> <view class="icon-block">
<template v-if="value.style == 3"> <template v-if="value.style == 3">
<image :src="$util.img('public/uniapp/member/order/refunding.png')" mode="widthFix"/> <image :src="$util.img('public/uniapp/member/order/refunding.png')" mode="widthFix" />
<view class="icon-shade" :style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/refunding_shade.png') + ')'"></view> <view class="icon-shade"
:style="'-webkit-mask-image: url(' + $util.img('public/uniapp/member/order/refunding_shade.png') + ')'">
</view>
</template> </template>
<template v-else> <template v-else>
<diy-icon :icon="value.icon.refunding.icon" v-if="value.icon.refunding" :value="value.icon.refunding.style ? value.icon.refunding.style : null"></diy-icon> <diy-icon :icon="value.icon.refunding.icon" v-if="value.icon.refunding"
:value="value.icon.refunding.style ? value.icon.refunding.style : null"></diy-icon>
</template> </template>
<text v-if="orderNum.refunding > 0" class="order-num color-base-bg price-font">{{ orderNum.refunding > 99 ? '99+' : orderNum.refunding }}</text> <text v-if="orderNum.refunding > 0" class="order-num color-base-bg price-font">{{
orderNum.refunding > 99 ?
'99+' : orderNum.refunding }}</text>
</view> </view>
<view class="title">{{ $lang('activist') }}</view> <view class="title">{{ $lang('activist') }}</view>
</view> </view>
@@ -74,176 +101,179 @@
</template> </template>
<script> <script>
// 自定义会员中心——我的订单 // 自定义会员中心——我的订单展示
export default { import DiyMinx from './minx.js'
name: 'diy-member-my-order', export default {
props: { name: 'diy-member-my-order',
value: { props: {
type: Object value: {
type: Object
}
},
mixins: [DiyMinx],
data() {
return {
orderNum: {
waitpay: 0,
waitsend: 0,
waitconfirm: 0,
refunding: 0,
wait_use: 0,
waitrate: 0
} }
};
},
created() {
this.init();
},
watch: {
storeToken(nVal, oVal) {
this.init();
}, },
data() { // 组件刷新监听
return { componentRefresh: function (nval) {
orderNum: { this.init();
}
},
computed: {
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
init() {
if (this.storeToken) {
this.getOrderNum();
} else {
this.orderNum = {
waitpay: 0, waitpay: 0,
waitsend: 0, waitsend: 0,
waitconfirm: 0, waitconfirm: 0,
refunding: 0, refunding: 0,
wait_use: 0, wait_use: 0,
waitrate: 0 waitrate: 0
} };
};
},
created() {
this.init();
},
watch: {
storeToken(nVal, oVal) {
this.init();
},
// 组件刷新监听
componentRefresh: function(nval) {
this.init();
} }
}, },
computed: { /**
warpCss() { * 获取订单数量
var obj = ''; */
obj += 'background-color:' + this.value.componentBgColor + ';'; getOrderNum() {
if (this.value.componentAngle == 'round') { this.$api.sendRequest({
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; url: '/api/order/num',
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; data: {
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; order_status: 'waitpay,waitsend,waitconfirm,refunding,wait_use,waitrate'
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; },
} success: res => {
return obj; if (res.code == 0) {
} this.orderNum = res.data;
}, } else {
methods: { this.orderNum = {
init() { waitpay: 0,
if (this.storeToken) { waitsend: 0,
this.getOrderNum(); waitconfirm: 0,
} else { refunding: 0,
this.orderNum = { wait_use: 0,
waitpay: 0, waitrate: 0
waitsend: 0, };
waitconfirm: 0,
refunding: 0,
wait_use: 0,
waitrate: 0
};
}
},
/**
* 获取订单数量
*/
getOrderNum() {
this.$api.sendRequest({
url: '/api/order/num',
data: {
order_status: 'waitpay,waitsend,waitconfirm,refunding,wait_use,waitrate'
},
success: res => {
if (res.code == 0) {
this.orderNum = res.data;
} else {
this.orderNum = {
waitpay: 0,
waitsend: 0,
waitconfirm: 0,
refunding: 0,
wait_use: 0,
waitrate: 0
};
}
} }
});
},
/**
* 跳转
* @param {Object} url
*/
redirect(url) {
if (this.storeToken) {
this.$util.redirectTo(url);
} else {
this.$refs.login.open(url);
} }
});
},
/**
* 跳转
* @param {Object} url
*/
redirect(url) {
if (this.storeToken) {
this.$util.redirectTo(url);
} else {
this.$refs.login.open(url);
} }
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
.common-wrap { .common-wrap {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
}
.order-wrap {
.status-wrap {
display: flex;
padding: 30rpx 0;
align-items: center;
justify-content: center;
color: #333;
} }
.order-wrap { .item-wrap {
.status-wrap { flex: 1;
text-align: center;
background: #f6f7f9;
padding: 20rpx 0;
.icon-block {
width: 60rpx;
height: 60rpx;
font-size: 60rpx;
margin: 4rpx auto;
position: relative;
&>image {
position: absolute;
top: 5%;
right: 5%;
width: 90%;
height: 90%;
z-index: 5;
}
.icon-shade {
width: 90%;
height: 90%;
position: absolute;
z-index: 4;
top: 5%;
right: 5%;
background: $base-color;
-webkit-mask: no-repeat center / contain;
}
}
.order-num {
position: absolute;
top: 0;
right: 0;
transform: translate(50%, -50%);
box-sizing: border-box;
color: #ffffff;
line-height: 1.2;
text-align: center;
font-size: 24rpx;
padding: 0 6rpx;
min-width: 30rpx;
border-radius: 16rpx;
height: 30rpx;
display: flex; display: flex;
padding: 30rpx 0;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
color: #333;
} }
.item-wrap { .title {
flex: 1; font-size: 26rpx;
text-align: center;
background: #f6f7f9;
padding: 20rpx 0;
.icon-block {
width: 60rpx;
height: 60rpx;
font-size: 60rpx;
margin: 4rpx auto;
position: relative;
&>image {
position: absolute;
top: 5%;
right: 5%;
width: 90%;
height: 90%;
z-index: 5;
}
.icon-shade {
width: 90%;
height: 90%;
position: absolute;
z-index: 4;
top: 5%;
right: 5%;
background: $base-color;
-webkit-mask: no-repeat center / contain;
}
}
.order-num {
position: absolute;
top: 0;
right: 0;
transform: translate(50%, -50%);
box-sizing: border-box;
color: #ffffff;
line-height: 1.2;
text-align: center;
font-size: 24rpx;
padding: 0 6rpx;
min-width: 30rpx;
border-radius: 16rpx;
height: 30rpx;
display: flex;
align-items: center;
justify-content: center;
}
.title {
font-size: 26rpx;
}
} }
} }
}
</style> </style>

View File

@@ -3,9 +3,11 @@
<x-skeleton type="list" :loading="loading" :configs="skeletonConfig" v-if="value.ornament.type == 'default'"> <x-skeleton type="list" :loading="loading" :configs="skeletonConfig" v-if="value.ornament.type == 'default'">
<view class="merch-wrap" :style="warpCss"> <view class="merch-wrap" :style="warpCss">
<view :class="['list-wrap', value.style]" :style="warpCss"> <view :class="['list-wrap', value.style]" :style="warpCss">
<view :class="['item', value.ornament.type]" v-for="(item, index) in list" :key="index" :style="itemCss" @click="handlerClick(item)" @tap="handlerClick(item)"> <view :class="['item', value.ornament.type]" v-for="(item, index) in list" :key="index"
:style="itemCss" @click="handlerClick(item)" @tap="handlerClick(item)">
<view class="merch-img"> <view class="merch-img">
<image class="cover-img" :src="$util.img(item.merch_image)" mode="widthFix" @error="imgError(index)" /> <image class="cover-img" :src="$util.img(item.merch_image)" mode="widthFix"
@error="imgError(index)" />
</view> </view>
<view class="info-wrap"> <view class="info-wrap">
<text class="title">{{ item.merch_name }}</text> <text class="title">{{ item.merch_name }}</text>
@@ -17,21 +19,22 @@
</view> </view>
</x-skeleton> </x-skeleton>
<view v-else :style="warpCss"> <view v-else :style="warpCss">
<scroll-view :scroll-x="true" :class="['merch-nav', 'singleSlide' ]"> <scroll-view :scroll-x="true" :class="['merch-nav', 'singleSlide']">
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<!-- #endif --> <!-- #endif -->
<view class="merch-nav-item graphic" v-for="(item, index) in list" :key="index" :style="{ width: 100 / 4 + '%' }" @click="handlerClick(item)" @tap="handlerClick(item)"> <view class="merch-nav-item graphic" v-for="(item, index) in list" :key="index"
<view class="graphic-img" v-if="value.mode != 'text'" :style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }"> :style="{ width: 100 / 4 + '%' }" @click="handlerClick(item)" @tap="handlerClick(item)">
<image <view class="graphic-img" v-if="value.mode != 'text'"
:style="{ fontSize: value.imageSize * 2 + 'rpx', width: value.imageSize * 2 + 'rpx', height: value.imageSize * 2 + 'rpx' }">
<image
:src="$util.img(item.merch_image) || $util.img('public/uniapp/default_img/goods.png')" :src="$util.img(item.merch_image) || $util.img('public/uniapp/default_img/goods.png')"
mode="aspectFill" mode="aspectFill" :show-menu-by-longpress="true"
:show-menu-by-longpress="true" style="max-width: 80rpx; max-height: 80rpx; border-radius: 50rpx;" />
style="max-width: 80rpx; max-height: 80rpx; border-radius: 50rpx;"
/>
</view> </view>
<text class="graphic-text" style="font-size: 28rpx; font-weight: normal; color: rgb(48, 49, 51);"> <text class="graphic-text"
style="font-size: 28rpx; font-weight: normal; color: rgb(48, 49, 51);">
{{ item.merch_name }} {{ item.merch_name }}
</text> </text>
</view> </view>
@@ -45,314 +48,318 @@
</template> </template>
<script> <script>
// 文章 // 文章
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-article', name: 'diy-article',
props: { props: {
value: { value: {
type: Object type: Object
}
},
data() {
return {
list: [
/*{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
}*/
],
loading: true,
skeletonConfig: {
gridRows: 1,
gridRowsGap: '40rpx',
headWidth: '160rpx',
headHeight: '160rpx',
textRows: 2
} }
}, };
data() { },
return { created() {
list: [ this.getList();
/*{ },
merch_name:'品牌', mixins: [DiyMinx],
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg' watch: {
}, // 组件刷新监听
{ componentRefresh: function (nval) {
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
},
{
merch_name:'品牌',
merch_image:'http://saas.cn//upload/4/common/images/20240824/20240824040223172448654356147.jpg'
}*/
],
loading: true,
skeletonConfig: {
gridRows: 1,
gridRowsGap: '40rpx',
headWidth: '160rpx',
headHeight: '160rpx',
textRows: 2
}
};
},
created() {
this.getList(); this.getList();
}, }
mixins: [DiyMinx], },
watch: { computed: {
// 组件刷新监听 warpCss() {
componentRefresh: function (nval) { var obj = '';
this.getList(); obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
console.log(obj)
return obj;
}, },
computed: { // 子项样式
warpCss() { itemCss() {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';'; obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.componentAngle == 'round') { if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
console.log(obj) if (this.value.ornament.type == 'shadow') {
return obj; obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color;
}, }
// 子项样式 if (this.value.ornament.type == 'stroke') {
itemCss() { obj += 'border:' + '2rpx solid ' + this.value.ornament.color;
var obj = ''; }
obj += 'background-color:' + this.value.elementBgColor + ';'; return obj;
if (this.value.elementAngle == 'round') { }
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;'; },
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;'; methods: {
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;'; getList() {
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;'; console.log(121)
} var data = {
if (this.value.ornament.type == 'shadow') { num: this.value.count
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color; };
} console.log(this.value)
if (this.value.ornament.type == 'stroke') { if (this.value.sources == 'diy') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color; data.num = 0;
} data.merch_id_arr = this.value.merchIds.toString();
return obj;
} }
},
methods: {
getList() {
console.log(121)
var data = {
num: this.value.count
};
console.log(this.value)
if (this.value.sources == 'diy') {
data.num = 0;
data.merch_id_arr = this.value.merchIds.toString();
}
this.$api.sendRequest({ this.$api.sendRequest({
url: '/merch/api/merch/lists', url: '/merch/api/merch/lists',
data: data, data: data,
success: res => { success: res => {
if (res.code == 0 && res.data) { if (res.code == 0 && res.data) {
let data = res.data; let data = res.data;
this.list = data; this.list = data;
}
this.loading = false;
} }
}); this.loading = false;
}, }
toDetail(item) { });
this.$util.redirectTo('/pages_promotion/merch/detail', { },
merch_id: item.merch_id toDetail(item) {
}); this.$util.redirectTo('/pages_promotion/merch/detail', {
}, merch_id: item.merch_id
imgError(index) { });
if (this.list[index]) this.list[index].merch_image = this.$util.getDefaultImage().article; },
}, imgError(index) {
async handlerClick(item) { if (this.list[index]) this.list[index].merch_image = this.$util.getDefaultImage().article;
await this.__$emitEvent({eventName: 'merch-list-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { },
async handlerClick(item) {
await this.__$emitEvent({
eventName: 'merch-list-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.toDetail(item); this.toDetail(item);
}}) }
} })
} }
}; }
};
</script> </script>
<style> <style>
/* 单行滑动 */ /* 单行滑动 */
.merch-nav.singleSlide>>>.uni-scroll-view-content { .merch-nav.singleSlide>>>.uni-scroll-view-content {
display: flex; display: flex;
} }
</style> </style>
<style lang="scss"> <style lang="scss">
.merch-nav {
padding: 16rpx;
box-sizing: border-box;
.merch-nav { &.singleSlide {
padding: 16rpx; .merch-nav-item {
box-sizing: border-box; flex-shrink: 0;
}
&.singleSlide {
.merch-nav-item {
flex-shrink: 0;
}
}
&.pageSlide {
position: relative;
.merch-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
}
.merch-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.graphic-text {
padding-top: 12rpx;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone {
padding-top: 0;
}
}
&.text {
.graphic-text {
padding-top: 0;
}
}
.graphic-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100rpx;
height: 100rpx;
font-size: 24rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: $color-sub;
}
}
}
} }
.merch-wrap {
.list-wrap { &.pageSlide {
&.style-1 { position: relative;
.item {
.merch-nav-wrap {
display: flex;
flex-wrap: wrap;
width: 100%;
height: 100%;
}
}
.merch-nav-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 14rpx 0;
box-sizing: border-box;
.graphic-text {
padding-top: 12rpx;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
text-align: center;
&.alone {
padding-top: 0;
}
}
&.text {
.graphic-text {
padding-top: 0;
}
}
.graphic-img {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100rpx;
height: 100rpx;
font-size: 24rpx;
.tag {
position: absolute;
top: -10rpx;
right: -24rpx;
color: #fff;
border-radius: 24rpx;
border-bottom-left-radius: 0;
transform: scale(0.8);
padding: 8rpx 16rpx;
line-height: 1;
font-size: 24rpx;
}
.icon {
font-size: 50rpx;
color: $color-sub;
}
}
}
}
.merch-wrap {
.list-wrap {
&.style-1 {
.item {
display: flex;
padding: 20rpx;
margin-top: 24rpx;
&:first-of-type {
margin-top: 0;
}
.merch-img {
margin-right: 20rpx;
width: 160rpx;
height: 160rpx;
overflow: hidden;
display: flex; display: flex;
padding: 20rpx; align-items: center;
margin-top: 24rpx; justify-content: center;
&:first-of-type { image {
margin-top: 0; width: 100%;
}
}
.info-wrap {
// flex: 1;
// display: flex;
// flex-direction: column;
// justify-content: space-between;
.desc {
color: #888
} }
.merch-img { .title {
margin-right: 20rpx; font-weight: bold;
width: 160rpx; // margin-bottom: 10rpx;
height: 160rpx;
overflow: hidden; overflow: hidden;
display: flex; text-overflow: ellipsis;
align-items: center; display: -webkit-box;
justify-content: center; -webkit-line-clamp: 2;
-webkit-box-orient: vertical;
image { font-size: 30rpx;
width: 100%; line-height: 1.5;
}
} }
.info-wrap { .abstract {
// flex: 1; overflow: hidden;
// display: flex; text-overflow: ellipsis;
// flex-direction: column; display: -webkit-box;
// justify-content: space-between; -webkit-line-clamp: 2;
.desc{ -webkit-box-orient: vertical;
color:#888 font-size: $font-size-tag;
} }
.title {
font-weight: bold;
// margin-bottom: 10rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
font-size: 30rpx;
line-height: 1.5;
}
.abstract { .read-wrap {
overflow: hidden; display: flex;
text-overflow: ellipsis; color: #999ca7;
display: -webkit-box; justify-content: flex-start;
-webkit-line-clamp: 2; align-items: center;
-webkit-box-orient: vertical; margin-top: 10rpx;
line-height: 1;
text {
font-size: $font-size-tag; font-size: $font-size-tag;
} }
.read-wrap { .iconfont {
display: flex; font-size: 36rpx;
color: #999ca7; vertical-align: bottom;
justify-content: flex-start; margin-right: 10rpx;
align-items: center; }
margin-top: 10rpx;
line-height: 1;
text { .category-icon {
font-size: $font-size-tag; width: 8rpx;
} height: 8rpx;
border-radius: 50%;
background: $base-color;
margin-right: 10rpx;
}
.iconfont { .date {
font-size: 36rpx; margin-left: 20rpx;
vertical-align: bottom;
margin-right: 10rpx;
}
.category-icon {
width: 8rpx;
height: 8rpx;
border-radius: 50%;
background: $base-color;
margin-right: 10rpx;
}
.date {
margin-left: 20rpx;
}
} }
} }
} }
} }
} }
} }
}
</style> </style>

View File

@@ -3,36 +3,45 @@
<view class="diy-notes" :style="{ backgroundColor: value.componentBgColor }"> <view class="diy-notes" :style="{ backgroundColor: value.componentBgColor }">
<view class="diy-notes-top"> <view class="diy-notes-top">
<view class="notes-title" :style="{ color: value.titleTextColor }">{{ value.title }}</view> <view class="notes-title" :style="{ color: value.titleTextColor }">{{ value.title }}</view>
<view class="notes-more" @click="toMore()" :style="{ color: value.moreTextColor }">{{ value.more }}</view> <view class="notes-more" @click="toMore()" :style="{ color: value.moreTextColor }">{{ value.more }}
</view>
</view> </view>
<scroll-view class="diy-notes-box" scroll-x="true" show-scrollbar="true"> <scroll-view class="diy-notes-box" scroll-x="true" show-scrollbar="true">
<view class="notes-box-item" v-for="(item, i) in dataList" :key="i" @click="handlerClick(item)" @tap="handlerClick(item)" <view class="notes-box-item" v-for="(item, i) in dataList" :key="i" @click="handlerClick(item)"
:style="notesItemStyle"> @tap="handlerClick(item)" :style="notesItemStyle">
<view class="notes-item" v-if="item.status == 1"> <view class="notes-item" v-if="item.status == 1">
<view class="notes-item-con"> <view class="notes-item-con">
<view class="notes-title">{{ item.note_title }}</view> <view class="notes-title">{{ item.note_title }}</view>
<view class="notes-highlights-list" v-if="value.notesLabel == 1 && item.goods_highlights"> <view class="notes-highlights-list" v-if="value.notesLabel == 1 && item.goods_highlights">
<text class="color-base-bg" v-for="(labelItem, labelIndex) in item.label" :key="labelIndex">{{ labelItem }}</text> <text class="color-base-bg" v-for="(labelItem, labelIndex) in item.label"
:key="labelIndex">{{ labelItem }}</text>
</view> </view>
<view class="notes-intro"> <view class="notes-intro">
<text class="notes-label color-base-text">#{{ item.note_type == 'goods_item' ? '单品介绍' : '掌柜说' }}#</text> <text class="notes-label color-base-text">#{{ item.note_type == 'goods_item' ? '单品介绍' :
'掌柜说' }}#</text>
{{ item.note_abstract }} {{ item.note_abstract }}
</view> </view>
</view> </view>
<view class="notes-img-wrap" :class="{ 'notes-img-wrap-list': item.cover_type == 1 }"> <view class="notes-img-wrap" :class="{ 'notes-img-wrap-list': item.cover_type == 1 }">
<image v-if="item.cover_type == 0" :src="$util.img(item.img)" @error="imageError(i)" mode="aspectFill" class="notes-item-image"/> <image v-if="item.cover_type == 0" :src="$util.img(item.img)" @error="imageError(i)"
<image v-else v-for="(imgItem, imgIndex) in item.img" :key="imgIndex" :src="$util.img(imgItem)" @error="imageError(i)" mode="aspectFit" class="notes-item-image-li"/> mode="aspectFill" class="notes-item-image" />
<image v-else v-for="(imgItem, imgIndex) in item.img" :key="imgIndex"
:src="$util.img(imgItem)" @error="imageError(i)" mode="aspectFit"
class="notes-item-image-li" />
</view> </view>
<view class="notes-item-con"> <view class="notes-item-con">
<view class="notes-info" v-if="(value.readNum == 1 && item.is_show_read_num == 1) || (value.uploadTime == 1 && item.is_show_release_time == 1)"> <view class="notes-info"
v-if="(value.readNum == 1 && item.is_show_read_num == 1) || (value.uploadTime == 1 && item.is_show_release_time == 1)">
<view class="notes-num"> <view class="notes-num">
<text v-show="value.uploadTime == 1 && item.is_show_release_time == 1">{{ item.update_time_day }}</text> <text v-show="value.uploadTime == 1 && item.is_show_release_time == 1">{{
item.update_time_day }}</text>
</view> </view>
<view class="notes-num"> <view class="notes-num">
<text v-show="value.readNum == 1 && item.is_show_read_num == 1">阅读 {{ item.initial_read_num + item.read_num }}</text> <text v-show="value.readNum == 1 && item.is_show_read_num == 1">阅读 {{
item.initial_read_num + item.read_num }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -46,314 +55,316 @@
</template> </template>
<script> <script>
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-notes', name: 'diy-notes',
props: { props: {
value: { value: {
type: Object type: Object
}
},
data() {
return {
loading: true,
skeletonConfig: {
itemDirection: 'column',
headWidth: '100%',
headHeight: '320rpx',
textRows: 2,
textWidth: ['100%', '80%']
},
dataList: [],
giveLikeFlag: false
};
},
created() {
this.getDataList();
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getDataList();
}
},
computed: {
notesItemStyle() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
}, return css;
data() { }
return { },
loading: true, methods: {
skeletonConfig: { refresh() {
itemDirection: 'column',
headWidth: '100%',
headHeight: '320rpx',
textRows: 2,
textWidth: ['100%', '80%']
},
dataList: [],
giveLikeFlag: false
};
},
created() {
this.getDataList(); this.getDataList();
}, },
mixins: [DiyMinx], getDataList() {
watch: { var data = {
// 组件刷新监听 num: this.value.count
componentRefresh: function(nval) { };
this.getDataList();
if (this.value.sources == 'diy') {
data.num = 0;
data.note_id_arr = this.value.noteId.toString();
} }
},
computed: {
notesItemStyle() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return css;
}
},
methods: {
refresh() {
this.getDataList();
},
getDataList() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') { this.$api.sendRequest({
data.num = 0; url: '/notes/api/notes/lists',
data.note_id_arr = this.value.noteId.toString(); data: data,
} success: res => {
var data = res.data;
this.$api.sendRequest({ this.dataList = [];
url: '/notes/api/notes/lists', if (data) {
data: data, for (var i = 0; i < data.length; i++) {
success: res => { var item = {};
var data = res.data; item = data[i];
this.dataList = []; if (data[i].cover_type == 1) {
if (data) { item.img = data[i].cover_img.split(',');
for (var i = 0; i < data.length; i++) { } else {
var item = {}; item.img = data[i].cover_img;
item = data[i];
if (data[i].cover_type == 1) {
item.img = data[i].cover_img.split(',');
} else {
item.img = data[i].cover_img;
}
if (data[i].upload_time) {
item.update_time_day = this.$util.timeStampTurnTime(data[i].upload_time)
.split(' ')[0];
} else {
item.update_time_day = this.$util.timeStampTurnTime(data[i].create_time)
.split(' ')[0];
}
item.label = data[i].goods_highlights.split(',');
this.dataList.push(item);
} }
}
this.loading = false;
}
});
},
toMore() {
this.$util.redirectTo('/pages_tool/store_notes/note_list');
},
toDetail(id) {
this.$util.redirectTo('/pages_tool/store_notes/note_detail', {
note_id: id
});
},
/* 点赞 */
giveLike(noteId, index) {
if (!this.storeToken) {
this.$refs.login.open('/pages/index/index');
return;
}
if (this.giveLikeFlag) return false; if (data[i].upload_time) {
this.giveLikeFlag = true; item.update_time_day = this.$util.timeStampTurnTime(data[i].upload_time)
.split(' ')[0];
var url = this.dataList[index].is_dianzan == 1 ? '/notes/api/record/delete' : '/notes/api/record/add'; } else {
this.$api.sendRequest({ item.update_time_day = this.$util.timeStampTurnTime(data[i].create_time)
url: url, .split(' ')[0];
data: {
note_id: noteId
},
success: res => {
this.giveLikeFlag = false;
if (res.code == 0 && res.data > 0) {
if (this.noteType != 'goods_item')
this.dataList[index].dianzan_num = this.dataList[index].is_dianzan == 1 ? this.dataList[index].dianzan_num - 1 : this.dataList[index].dianzan_num + 1;
else {
this.dataList[index].dianzan_num = this.dataList[index].is_dianzan == 1 ? this.dataList[index].dianzan_num - 1 : this.dataList[index].dianzan_num + 1;
} }
this.dataList[index].is_dianzan = this.dataList[index].is_dianzan == 1 ? 0 : 1;
} else { item.label = data[i].goods_highlights.split(',');
this.$util.showToast({ this.dataList.push(item);
title: res.message
});
} }
} }
}); this.loading = false;
}, }
imageError(index) { });
this.dataList[index].img = this.$util.getDefaultImage().goods; },
this.$forceUpdate(); toMore() {
}, this.$util.redirectTo('/pages_tool/store_notes/note_list');
async handlerClick(item) { },
await this.__$emitEvent({eventName: 'notes-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { toDetail(id) {
this.$util.redirectTo('/pages_tool/store_notes/note_detail', {
note_id: id
});
},
/* 点赞 */
giveLike(noteId, index) {
if (!this.storeToken) {
this.$refs.login.open('/pages/index/index');
return;
}
if (this.giveLikeFlag) return false;
this.giveLikeFlag = true;
var url = this.dataList[index].is_dianzan == 1 ? '/notes/api/record/delete' : '/notes/api/record/add';
this.$api.sendRequest({
url: url,
data: {
note_id: noteId
},
success: res => {
this.giveLikeFlag = false;
if (res.code == 0 && res.data > 0) {
if (this.noteType != 'goods_item')
this.dataList[index].dianzan_num = this.dataList[index].is_dianzan == 1 ? this.dataList[index].dianzan_num - 1 : this.dataList[index].dianzan_num + 1;
else {
this.dataList[index].dianzan_num = this.dataList[index].is_dianzan == 1 ? this.dataList[index].dianzan_num - 1 : this.dataList[index].dianzan_num + 1;
}
this.dataList[index].is_dianzan = this.dataList[index].is_dianzan == 1 ? 0 : 1;
} else {
this.$util.showToast({
title: res.message
});
}
}
});
},
imageError(index) {
this.dataList[index].img = this.$util.getDefaultImage().goods;
this.$forceUpdate();
},
async handlerClick(item) {
await this.__$emitEvent({
eventName: 'notes-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.toDetail(item.note_id); this.toDetail(item.note_id);
}}) }
} })
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
scroll-view ::-webkit-scrollbar { scroll-view ::-webkit-scrollbar {
width: 0; width: 0;
height: 0; height: 0;
background-color: transparent; background-color: transparent;
touch-action: none; touch-action: none;
}
.diy-notes {
width: 100%;
box-sizing: border-box;
}
.diy-notes-top {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
.notes-title {
width: 70%;
font-size: 28rpx;
font-weight: 600;
} }
.diy-notes { .notes-more {
font-size: $font-size-tag;
color: #858585;
}
.notes-more::after {
font-family: 'iconfont';
content: '\e6a3';
font-size: $font-size-tag;
line-height: 1;
position: relative;
margin-left: 4rpx;
}
}
.diy-notes-box {
width: 100%;
padding: 30rpx 0 20rpx;
}
.notes-box-item {
width: calc(100% - 8rpx);
margin: 0 auto;
height: 100%;
margin-bottom: 30rpx;
border-radius: 10rpx;
overflow: hidden;
-moz-box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
-webkit-box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
.notes-item {
width: 100%; width: 100%;
height: 100%;
padding: 20rpx;
box-sizing: border-box; box-sizing: border-box;
} }
.diy-notes-top { .notes-img-wrap {
width: 100%; position: relative;
height: 300rpx;
.notes-item-image {
width: 100%;
height: 300rpx;
object-fit: cover;
}
.notes-label {
display: inline-block;
position: absolute;
left: 20rpx;
bottom: 20rpx;
max-width: calc(100vh - 40rpx);
background-color: #ffffff;
line-height: 36rpx;
padding: 0 10rpx 0 4rpx;
}
}
.notes-img-wrap-list {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; flex-wrap: wrap;
box-sizing: border-box; height: auto;
image {
width: calc((100% - 40rpx) / 3);
height: 210rpx;
margin-top: 20rpx;
&:nth-child(-n + 3) {
margin-top: 0;
}
}
&:after {
content: '';
width: calc((100% - 40rpx) / 3);
}
}
.notes-item-con {
.notes-title { .notes-title {
width: 70%; font-size: 30rpx;
font-size: 28rpx;
font-weight: 600; font-weight: 600;
line-height: 44rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
} }
.notes-more { .notes-highlights-list {
font-size: $font-size-tag; text {
color: #858585;
}
.notes-more::after {
font-family: 'iconfont';
content: '\e6a3';
font-size: $font-size-tag;
line-height: 1;
position: relative;
margin-left: 4rpx;
}
}
.diy-notes-box {
width: 100%;
padding: 30rpx 0 20rpx;
}
.notes-box-item {
width: calc(100% - 8rpx);
margin: 0 auto;
height: 100%;
margin-bottom: 30rpx;
border-radius: 10rpx;
overflow: hidden;
-moz-box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
-webkit-box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.02);
.notes-item {
width: 100%;
height: 100%;
padding: 20rpx;
box-sizing: border-box;
}
.notes-img-wrap {
position: relative;
height: 300rpx;
.notes-item-image {
width: 100%;
height: 300rpx;
object-fit: cover;
}
.notes-label {
display: inline-block; display: inline-block;
position: absolute; color: #ffffff;
left: 20rpx; font-size: 24rpx;
bottom: 20rpx;
max-width: calc(100vh - 40rpx);
background-color: #ffffff;
line-height: 36rpx; line-height: 36rpx;
padding: 0 10rpx 0 4rpx; padding: 0 10rpx;
border-radius: 4rpx;
margin: 0 5rpx;
} }
} }
.notes-img-wrap-list { .notes-intro {
margin: 4rpx 0 8rpx;
line-height: 40rpx;
overflow: hidden;
text {
float: left;
margin-right: 16rpx;
}
}
.notes-info {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
flex-wrap: wrap; align-items: center;
height: auto; margin-top: 20rpx;
image { .notes-num {
width: calc((100% - 40rpx) / 3); >text {
height: 210rpx; display: flex;
margin-top: 20rpx; align-items: center;
font-size: $font-size-tag;
color: #969799;
&:nth-child(-n + 3) { text.iconfont {
margin-top: 0; font-size: 26rpx;
} margin-right: 6rpx;
}
&:after {
content: '';
width: calc((100% - 40rpx) / 3);
}
}
.notes-item-con {
.notes-title {
font-size: 30rpx;
font-weight: 600;
line-height: 44rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.notes-highlights-list {
text {
display: inline-block;
color: #ffffff;
font-size: 24rpx;
line-height: 36rpx;
padding: 0 10rpx;
border-radius: 4rpx;
margin: 0 5rpx;
}
}
.notes-intro {
margin: 4rpx 0 8rpx;
line-height: 40rpx;
overflow: hidden;
text {
float: left;
margin-right: 16rpx;
}
}
.notes-info {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20rpx;
.notes-num {
>text {
display: flex;
align-items: center;
font-size: $font-size-tag;
color: #969799;
text.iconfont {
font-size: 26rpx;
margin-right: 6rpx;
}
} }
} }
} }
} }
} }
}
</style> </style>

View File

@@ -2,18 +2,24 @@
<view data-component-name="diy-notice" class="diy-notice"> <view data-component-name="diy-notice" class="diy-notice">
<view :class="['notice', value.contentStyle]" :style="noticeWrapCss"> <view :class="['notice', value.contentStyle]" :style="noticeWrapCss">
<image v-if="value.iconType == 'img'" class="notice-img" :src="$util.img(value.imageUrl)" mode="heightFix"/> <image v-if="value.iconType == 'img'" class="notice-img" :src="$util.img(value.imageUrl)"
<diy-icon v-if="value.iconType == 'icon'" :icon="value.icon" :value="value.style ? value.style : 'null'" :style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon> mode="heightFix" />
<diy-icon v-if="value.iconType == 'icon'" :icon="value.icon" :value="value.style ? value.style : 'null'"
:style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx', width: '100%', height: '100%' }"></diy-icon>
<view class="notice-xian"></view> <view class="notice-xian"></view>
<view class="main-wrap"> <view class="main-wrap">
<!-- 横向滚动 --> <!-- 横向滚动 -->
<view class="horizontal-wrap" v-if="value.scrollWay == 'horizontal'"> <view class="horizontal-wrap" v-if="value.scrollWay == 'horizontal'">
<view class="marquee-wrap"> <view class="marquee-wrap">
<view class="marquee" :style="marqueeStyle"> <view class="marquee" :style="marqueeStyle">
<text v-for="(item, index) in list" :key="index" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item.title }}</text> <text v-for="(item, index) in list" :key="index"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
item.title }}</text>
</view> </view>
<view class="marquee" :style="marqueeAgainStyle"> <view class="marquee" :style="marqueeAgainStyle">
<text v-for="(item, index) in list" :key="index" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item.title }}</text> <text v-for="(item, index) in list" :key="index"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
item.title }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -22,7 +28,8 @@
<template v-if="value.scrollWay == 'upDown'"> <template v-if="value.scrollWay == 'upDown'">
<swiper :vertical="true" :duration="500" autoplay="true" circular="true"> <swiper :vertical="true" :duration="500" autoplay="true" circular="true">
<swiper-item v-for="(item, index) in list" :key="index" @touchmove.prevent.stop> <swiper-item v-for="(item, index) in list" :key="index" @touchmove.prevent.stop>
<text class="beyond-hiding using-hidden" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }"> <text class="beyond-hiding using-hidden"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">
{{ item.title }} {{ item.title }}
</text> </text>
</swiper-item> </swiper-item>
@@ -46,255 +53,257 @@
</view> </view>
</template> </template>
<script> <script>
// 公告 // 公告展示
export default { import DiyMinx from './minx.js'
name: 'diy-notice', export default {
props: { name: 'diy-notice',
value: { props: {
type: Object value: {
type: Object
}
},
mixins: [DiyMinx],
data() {
return {
list: [],
notice: '', // 当前点击的弹框内容
marqueeWrapWidth: 0, // 容器宽度
marqueeWidth: 0, // 公告内容累加宽度
marqueeStyle: '', // 横向滚动样式
marqueeAgainStyle: '', // 横向滚动复制样式
time: 0, // 滚动完成时间
delayTime: 1000 // 动画延迟时间
};
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
if (this.value.sources == 'initial') this.getData();
}
},
created() { },
mounted() {
// 数据源:公告系统
if (this.value.sources == 'initial') {
this.getData();
} else {
this.list = this.value.list;
this.bindCrossSlipEvent();
}
},
computed: {
noticeWrapCss: function () {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
}, return obj;
data() { }
return { },
list: [], methods: {
notice: '', // 当前点击的弹框内容 getData() {
marqueeWrapWidth: 0, // 容器宽度 var data = {
marqueeWidth: 0, // 公告内容累加宽度 page_size: 0
marqueeStyle: '', // 横向滚动样式
marqueeAgainStyle: '', // 横向滚动复制样式
time: 0, // 滚动完成时间
delayTime: 1000 // 动画延迟时间
}; };
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
if (this.value.sources == 'initial') this.getData();
}
},
created() {},
mounted() {
// 数据源:公告系统
if (this.value.sources == 'initial') { if (this.value.sources == 'initial') {
this.getData(); data.page_size = this.value.count;
} else {
this.list = this.value.list;
this.bindCrossSlipEvent();
} }
},
computed: { if (this.value.noticeIds.length) {
noticeWrapCss: function() { data.id_arr = this.value.noticeIds.toString();
var obj = ''; data.page_size = 0;
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
} }
}, this.$api.sendRequest({
methods: { url: '/api/notice/page',
getData() { data: data,
var data = { success: res => {
page_size: 0 if (res.code == 0 && res.data) {
}; this.list = res.data.list;
this.bindCrossSlipEvent();
if (this.value.sources == 'initial') {
data.page_size = this.value.count;
}
if (this.value.noticeIds.length) {
data.id_arr = this.value.noticeIds.toString();
data.page_size = 0;
}
this.$api.sendRequest({
url: '/api/notice/page',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data.list;
this.bindCrossSlipEvent();
}
} }
});
},
toLink(item) {
if (this.value.sources == 'initial') {
this.$util.redirectTo('/pages_tool/notice/detail', {
notice_id: item.id
});
} else if (!item) {
this.$util.redirectTo('/pages_tool/notice/list');
} else if (Object.keys(item.link).length > 1) {
this.$util.diyRedirectTo(item.link);
} else {
// 如果不设置跳转链接,则点击弹框展示
this.notice = item.title;
this.$refs.noticePopup.open();
} }
}, });
closeNoticePopup() { },
this.$refs.noticePopup.close(); toLink(item) {
}, if (this.value.sources == 'initial') {
// 绑定横向滚动事件 this.$util.redirectTo('/pages_tool/notice/detail', {
bindCrossSlipEvent() { notice_id: item.id
if (this.value.scrollWay == 'horizontal') { });
setTimeout(() => { } else if (!item) {
this.$nextTick(() => { this.$util.redirectTo('/pages_tool/notice/list');
uni.createSelectorQuery() } else if (Object.keys(item.link).length > 1) {
.in(this) this.$util.diyRedirectTo(item.link);
.select('.marquee-wrap') } else {
.boundingClientRect(res => { // 如果不设置跳转链接,则点击弹框展示
this.marqueeWrapWidth = res.width; this.notice = item.title;
const query = uni.createSelectorQuery().in(this); this.$refs.noticePopup.open();
query }
.select('.marquee') },
.boundingClientRect(data => { closeNoticePopup() {
this.marqueeWidth = data.width + 30; // 30px是间距 this.$refs.noticePopup.close();
this.time = Math.ceil(this.marqueeWidth * 10); },
// 绑定横向滚动事件
bindCrossSlipEvent() {
if (this.value.scrollWay == 'horizontal') {
setTimeout(() => {
this.$nextTick(() => {
uni.createSelectorQuery()
.in(this)
.select('.marquee-wrap')
.boundingClientRect(res => {
this.marqueeWrapWidth = res.width;
const query = uni.createSelectorQuery().in(this);
query
.select('.marquee')
.boundingClientRect(data => {
this.marqueeWidth = data.width + 30; // 30px是间距
this.time = Math.ceil(this.marqueeWidth * 10);
if (this.marqueeWrapWidth > this.marqueeWidth) { if (this.marqueeWrapWidth > this.marqueeWidth) {
this.marqueeStyle = `animation: none;`; this.marqueeStyle = `animation: none;`;
this.marqueeAgainStyle = 'display:none;'; this.marqueeAgainStyle = 'display:none;';
} else { } else {
this.marqueeStyle = ` this.marqueeStyle = `
width: ${this.marqueeWidth}px; width: ${this.marqueeWidth}px;
animation-duration: ${this.time}ms; animation-duration: ${this.time}ms;
animation-delay: ${this.delayTime}ms; animation-delay: ${this.delayTime}ms;
`; `;
this.marqueeAgainStyle = ` this.marqueeAgainStyle = `
width: ${this.marqueeWidth}px; width: ${this.marqueeWidth}px;
left: ${this.marqueeWidth}px; left: ${this.marqueeWidth}px;
animation-duration: ${this.time}ms; animation-duration: ${this.time}ms;
animation-delay: ${this.delayTime}ms; animation-delay: ${this.delayTime}ms;
`; `;
} }
}) })
.exec(); .exec();
}) })
.exec(); .exec();
});
}); });
} });
} }
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
.notice { .notice {
height: 80rpx;
position: relative;
display: flex;
align-items: center;
overflow: hidden;
padding: 20rpx 0 20rpx 20rpx;
font-size: 70rpx;
box-sizing: border-box;
.notice-img {
width: 44rpx;
height: 80rpx; height: 80rpx;
}
.notice-xian {
width: 1rpx;
height: 26rpx;
background-color: #e4e4e4;
margin: 0 22rpx;
}
}
.main-wrap {
display: inline-block;
width: calc(100% - 115rpx);
position: relative;
}
swiper {
height: 50rpx;
}
.beyond-hiding {
display: inline-block;
width: 100%;
white-space: nowrap;
}
.notice-popup {
padding: 0 30rpx 40rpx;
background-color: #fff;
.head-wrap {
font-size: $font-size-toolbar;
line-height: 100rpx;
height: 100rpx;
display: block;
text-align: center;
position: relative; position: relative;
display: flex; border-bottom: 2rpx solid $color-line;
align-items: center; margin-bottom: 20rpx;
overflow: hidden;
padding: 20rpx 0 20rpx 20rpx;
font-size: 70rpx;
box-sizing: border-box;
.notice-img { .iconfont {
width: 44rpx; position: absolute;
height: 80rpx; float: right;
} right: 0;
.notice-xian {
width: 1rpx;
height: 26rpx;
background-color: #e4e4e4;
margin: 0 22rpx;
}
}
.main-wrap {
display: inline-block;
width: calc(100% - 115rpx);
position: relative;
}
swiper {
height: 50rpx;
}
.beyond-hiding {
display: inline-block;
width: 100%;
white-space: nowrap;
}
.notice-popup {
padding: 0 30rpx 40rpx;
background-color: #fff;
.head-wrap {
font-size: $font-size-toolbar; font-size: $font-size-toolbar;
line-height: 100rpx;
height: 100rpx;
display: block;
text-align: center;
position: relative;
border-bottom: 2rpx solid $color-line;
margin-bottom: 20rpx;
.iconfont {
position: absolute;
float: right;
right: 0;
font-size: $font-size-toolbar;
}
}
.content-wrap {
max-height: 600rpx;
overflow-y: auto;
}
button {
margin-top: 40rpx;
} }
} }
.horizontal-wrap { .content-wrap {
height: 30px; max-height: 600rpx;
line-height: 30px; overflow-y: auto;
position: relative;
overflow: hidden;
width: 100%;
} }
.marquee-wrap { button {
display: inline-block; margin-top: 40rpx;
width: 100%;
height: 100%;
vertical-align: middle;
overflow: hidden;
box-sizing: border-box;
position: relative;
} }
}
.marquee { .horizontal-wrap {
display: flex; height: 30px;
position: absolute; line-height: 30px;
white-space: nowrap; position: relative;
animation: marquee 0s 0s linear infinite; overflow: hidden;
width: 100%;
}
text { .marquee-wrap {
margin-left: 40rpx; display: inline-block;
width: 100%;
height: 100%;
vertical-align: middle;
overflow: hidden;
box-sizing: border-box;
position: relative;
}
&:first-child { .marquee {
margin-left: 0; display: flex;
} position: absolute;
white-space: nowrap;
animation: marquee 0s 0s linear infinite;
text {
margin-left: 40rpx;
&:first-child {
margin-left: 0;
} }
} }
}
@keyframes marquee { @keyframes marquee {
0% { 0% {
transform: translateX(0); transform: translateX(0);
}
100% {
transform: translateX(-100%);
}
} }
100% {
transform: translateX(-100%);
}
}
</style> </style>

View File

@@ -39,7 +39,8 @@
</template> </template>
<script> <script>
// 付款码 // 付款码展示
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-payment-qrcode', name: 'diy-payment-qrcode',
props: { props: {
@@ -47,10 +48,11 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return {}; return {};
}, },
created() {}, created() { },
computed: { computed: {
warpCss() { warpCss() {
var obj = ''; var obj = '';
@@ -59,7 +61,7 @@ export default {
}, },
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
methods: { methods: {
toLink() { toLink() {
@@ -72,7 +74,7 @@ export default {
// #ifndef H5 // #ifndef H5
// 允许从相机和相册扫码,h5端不起作用 // 允许从相机和相册扫码,h5端不起作用
uni.scanCode({ uni.scanCode({
success: function(res) { success: function (res) {
console.log('条码类型:' + res.scanType); console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result); console.log('条码内容:' + res.result);
} }
@@ -95,8 +97,10 @@ export default {
display: flex; display: flex;
background-color: #fff; background-color: #fff;
border-radius: 16rpx; border-radius: 16rpx;
.qrocde-left { .qrocde-left {
flex: 1; flex: 1;
.qrocde-desc { .qrocde-desc {
margin-top: 20rpx; margin-top: 20rpx;
margin-bottom: 26rpx; margin-bottom: 26rpx;
@@ -105,16 +109,19 @@ export default {
justify-content: center; justify-content: center;
color: $color-tip; color: $color-tip;
font-size: $font-size-tag; font-size: $font-size-tag;
.iconfont { .iconfont {
margin-left: 10rpx; margin-left: 10rpx;
font-size: $font-size-tag; font-size: $font-size-tag;
font-weight: bold; font-weight: bold;
} }
} }
.qrocde-action { .qrocde-action {
padding-bottom: 36rpx; padding-bottom: 36rpx;
display: flex; display: flex;
justify-content: center; justify-content: center;
button { button {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -123,22 +130,27 @@ export default {
width: 230rpx; width: 230rpx;
height: 86rpx; height: 86rpx;
border-radius: 50rpx; border-radius: 50rpx;
&:first-of-type { &:first-of-type {
margin-right: 46rpx; margin-right: 46rpx;
background-color: $base-color; background-color: $base-color;
} }
&:last-of-type { &:last-of-type {
background-color: #999; background-color: #999;
} }
.iconfont { .iconfont {
margin-right: 10rpx; margin-right: 10rpx;
} }
.action-name { .action-name {
font-size: 30rpx; font-size: 30rpx;
} }
} }
} }
} }
.qrocde-right { .qrocde-right {
position: relative; position: relative;
display: flex; display: flex;
@@ -149,15 +161,18 @@ export default {
width: 90rpx; width: 90rpx;
z-index: 2; z-index: 2;
box-sizing: border-box; box-sizing: border-box;
.name { .name {
font-size: $font-size-sub; font-size: $font-size-sub;
writing-mode: tb-rl; writing-mode: tb-rl;
color: #fff; color: #fff;
letter-spacing: 6rpx; letter-spacing: 6rpx;
} }
.iconfont { .iconfont {
color: #fff; color: #fff;
} }
&::after { &::after {
content: ''; content: '';
position: absolute; position: absolute;
@@ -166,12 +181,13 @@ export default {
width: 500rpx; width: 500rpx;
height: 500rpx; height: 500rpx;
border-radius: 50%; border-radius: 50%;
background-color: $base-color; background-color: $base-color;
transform: translateY(-50%); transform: translateY(-50%);
z-index: -1; z-index: -1;
} }
} }
} }
.payment-popup { .payment-popup {
padding: 0 30rpx 40rpx; padding: 0 30rpx 40rpx;
background-color: #fff; background-color: #fff;
@@ -185,6 +201,7 @@ export default {
position: relative; position: relative;
border-bottom: 2rpx solid $color-line; border-bottom: 2rpx solid $color-line;
margin-bottom: 20rpx; margin-bottom: 20rpx;
.iconfont { .iconfont {
position: absolute; position: absolute;
float: right; float: right;
@@ -192,10 +209,12 @@ export default {
font-size: $font-size-toolbar; font-size: $font-size-toolbar;
} }
} }
.content-wrap { .content-wrap {
max-height: 600rpx; max-height: 600rpx;
overflow-y: auto; overflow-y: auto;
} }
button { button {
margin-top: 40rpx; margin-top: 40rpx;
} }

View File

@@ -1,11 +1,13 @@
<template> <template>
<view data-component-name="diy-picture" class="diy-picture" :style="style"> <view data-component-name="diy-picture" class="diy-picture" :style="style">
<view class="fui-picture"> <view class="fui-picture">
<view v-for="(item,index) in value.list" style="line-height: 0;"> <view v-for="(item, index) in value.list" style="line-height: 0;">
<image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-if="item.link.wap_url" @click="handlerClick(item)" @tap="handlerClick(item)"></image> <image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)"
<image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-else @click="handlerClick(item)" @tap="handlerClick(item)"></image> v-if="item.link.wap_url" @click="handlerClick(item)" @tap="handlerClick(item)"></image>
</view> <image mode="widthFix" style="width: 100%;height:auto" :src="$util.img(item.imageUrl)" v-else
<!-- <view wx:if="{{!childitem.linkurl}}" bindtap="previewImg" data-src="{{childitem.imgurl}}" style="padding:{{diyitem.style.paddingtop==0?0:diyitem.style.paddingtop+'rpx'}} {{diyitem.style.paddingleft==0?0:diyitem.style.paddingleft+'rpx'}}" wx:for="{{diyitem.data}}" wx:for-index="childid" wx:for-item="childitem" wx:key="{{childid}}"> @click="handlerClick(item)" @tap="handlerClick(item)"></image>
</view>
<!-- <view wx:if="{{!childitem.linkurl}}" bindtap="previewImg" data-src="{{childitem.imgurl}}" style="padding:{{diyitem.style.paddingtop==0?0:diyitem.style.paddingtop+'rpx'}} {{diyitem.style.paddingleft==0?0:diyitem.style.paddingleft+'rpx'}}" wx:for="{{diyitem.data}}" wx:for-index="childid" wx:for-item="childitem" wx:key="{{childid}}">
<image mode="widthFix" src="{{childitem.imgurl}}" style="{{bannerheight?'height:'+bannerheight+'px':'height:auto'}}"></image> <image mode="widthFix" src="{{childitem.imgurl}}" style="{{bannerheight?'height:'+bannerheight+'px':'height:auto'}}"></image>
</view> --> </view> -->
</view> </view>
@@ -13,78 +15,78 @@
</template> </template>
<script> <script>
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-picture', name: 'diy-picture',
props: { props: {
value: { value: {
type: Object type: Object
} }
}, },
data() { data() {
return { return {
loading: true, loading: true,
}; };
}, },
created() { created() {
// this.getDataList();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
// this.getDataList(); // this.getDataList();
}, }
watch: { },
// 组件刷新监听 mixins: [DiyMinx],
componentRefresh: function(nval) { computed: {
// this.getDataList(); style() {
var css = '';
css += 'background-color:' + this.value.contentBgColor + ';';
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
return css;
}
},
methods: {
previewImg(img) {
// #ifdef MP-WEIXIN
uni.previewImage({
current: 0,
urls: [this.$util.img(img)],
success: function (res) { },
fail: function (res) { },
complete: function (res) { },
})
// #endif
}, },
mixins: [DiyMinx], redirectTo(link) {
computed: { if (link.wap_url) {
style() { if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
var css = ''; this.$refs.login.open(link.wap_url);
css += 'background-color:' + this.value.contentBgColor + ';'; return;
if (this.value.elementAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
} }
return css;
} }
this.$util.diyRedirectTo(link);
}, },
methods: {
previewImg(img){
// #ifdef MP-WEIXIN
uni.previewImage({
current: 0,
urls: [this.$util.img(img)],
success: function (res) {},
fail: function (res) {},
complete: function (res) {},
})
// #endif
},
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
this.$util.diyRedirectTo(link);
},
async handlerClick(item) { async handlerClick(item) {
await this.__$emitEvent({eventName: 'picture-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { await this.__$emitEvent({
eventName: 'picture-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
if (item.link.wap_url) { if (item.link.wap_url) {
this.redirectTo(item.link); this.redirectTo(item.link);
} else { } else {
this.previewImg(item.imageUrl); this.previewImg(item.imageUrl);
} }
}}) }
} })
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss"></style>
</style>

View File

@@ -2,32 +2,45 @@
<x-skeleton data-component-name="diy-pinfan" :type="skeletonType" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-pinfan" :type="skeletonType" :loading="loading" :configs="skeletonConfig">
<view class="diy-pinfan" :class="[value.template, value.style]" :style="warpCss"> <view class="diy-pinfan" :class="[value.template, value.style]" :style="warpCss">
<template v-if="value.template == 'row1-of1'"> <template v-if="value.template == 'row1-of1'">
<view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)"
:class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image,{size: 'mid'})" mode="widthFix" @error="imageError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(index)" />
</view> </view>
<view class="content" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl || value.btnStyle.control"> <view class="content"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.priceStyle.lineControl || value.btnStyle.control">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="tag-wrap" v-if="value.groupStyle.control || value.saleStyle.control"> <view class="tag-wrap" v-if="value.groupStyle.control || value.saleStyle.control">
<view v-if="value.groupStyle.control" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '', borderColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"> <view v-if="value.groupStyle.control"
<text class="iconfont icon-yonghu3" :style="{ backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"></text> :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '', borderColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }">
<text class="iconfont icon-yonghu3"
:style="{ backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"></text>
<text>{{ item.pintuan_num }}人团</text> <text>{{ item.pintuan_num }}人团</text>
</view> </view>
<view v-if="value.saleStyle.control" :style="{ color: value.theme == 'diy' ? value.saleStyle.color : '', borderColor: value.theme == 'diy' ? value.saleStyle.color : '' }"> <view v-if="value.saleStyle.control"
:style="{ color: value.theme == 'diy' ? value.saleStyle.color : '', borderColor: value.theme == 'diy' ? value.saleStyle.color : '' }">
<text>已拼{{ item.order_num }}</text> <text>已拼{{ item.order_num }}</text>
</view> </view>
</view> </view>
<view class="price-wrap"> <view class="price-wrap">
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ item.pintuan_price.split(".")[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ "."+item.pintuan_price.split(".")[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.pintuan_price.split(".")[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
"." + item.pintuan_price.split(".")[1] }}</text>
</view> </view>
<view class="original-price price-font" v-if="value.priceStyle.lineControl" :style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }"> <view class="original-price price-font" v-if="value.priceStyle.lineControl"
:style="{ color: value.theme == 'diy' ? value.priceStyle.lineColor : '' }">
¥{{ item.price }} ¥{{ item.price }}
</view> </view>
<button v-if="value.btnStyle.control" :style="{ <button v-if="value.btnStyle.control" :style="{
@@ -37,7 +50,8 @@
}"> }">
<text class="text">{{ value.btnStyle.text }}</text> <text class="text">{{ value.btnStyle.text }}</text>
<text class="fan" v-if="item.reward_type == 4">{{ item.reward_type_num }}积分</text> <text class="fan" v-if="item.reward_type == 4">{{ item.reward_type_num }}积分</text>
<text class="fan" v-if="item.reward_type == 1 || item.reward_type == 2">{{ item.reward_type_num }}</text> <text class="fan" v-if="item.reward_type == 1 || item.reward_type == 2">{{
item.reward_type_num }}</text>
<text class="fan" v-if="item.reward_type == 3">返优惠券</text> <text class="fan" v-if="item.reward_type == 3">返优惠券</text>
</button> </button>
</view> </view>
@@ -47,67 +61,101 @@
<template v-if="value.template == 'horizontal-slide'"> <template v-if="value.template == 'horizontal-slide'">
<scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false"> <scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false">
<view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="item" v-for="(item, index) in list" :key="index" @click="toDetail(item)"
:class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image,{size: 'mid'})" mode="widthFix" @error="imageError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(index)" />
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view v-if="value.groupStyle.control" class="num"> <view v-if="value.groupStyle.control" class="num">
<text class="content-tuan-box" :style="{ color: value.theme == 'diy' ? value.groupStyle.color : '', backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"> <text class="content-tuan-box"
:style="{ color: value.theme == 'diy' ? value.groupStyle.color : '', backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }">
{{ item.pintuan_num }}人团 {{ item.pintuan_num }}人团
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 4"> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 4">
{{ item.reward_type_num }}积分 {{ item.reward_type_num }}积分
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 1 || item.reward_type == 2"> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 1 || item.reward_type == 2">
{{ item.reward_type_num }} {{ item.reward_type_num }}
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 3">返优惠券</text> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 3">返优惠券</text>
</view> </view>
<view class="price-wrap" v-if="value.priceStyle.mainControl"> <view class="price-wrap" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ item.pintuan_price.split('.')[0] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ "."+item.pintuan_price.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.pintuan_price.split('.')[0] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
"." + item.pintuan_price.split('.')[1] }}</text>
</view> </view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper" :style="{ height: swiperHeight }"> <swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper"
<swiper-item v-for="(pageItem,pageIndex) in page" :key="pageIndex" :class="['swiper-item',(list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']"> :style="{ height: swiperHeight }">
<view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex" @click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <swiper-item v-for="(pageItem, pageIndex) in page" :key="pageIndex"
:class="['swiper-item', (list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']">
<view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex"
@click="toDetail(item)" :class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image,{size: 'mid'})" mode="widthFix" @error="imageError(dataIndex)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(dataIndex)" />
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view v-if="value.groupStyle.control" class="num"> <view v-if="value.groupStyle.control" class="num">
<text class="content-tuan-box" :style="{ color: value.theme == 'diy' ? value.groupStyle.color : '', backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"> <text class="content-tuan-box"
:style="{ color: value.theme == 'diy' ? value.groupStyle.color : '', backgroundColor: value.theme == 'diy' ? value.groupStyle.bgColor : '' }">
{{ item.pintuan_num }}人团 {{ item.pintuan_num }}人团
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 4"> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 4">
{{ item.reward_type_num }}积分 {{ item.reward_type_num }}积分
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 1 || item.reward_type == 2"> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 1 || item.reward_type == 2">
{{ item.reward_type_num }} {{ item.reward_type_num }}
</text> </text>
<text class="content-tuan-price" :style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }" v-if="item.reward_type == 3"> <text class="content-tuan-price"
:style="{ color: value.theme == 'diy' ? value.groupStyle.bgColor : '' }"
v-if="item.reward_type == 3">
返优惠券 返优惠券
</text> </text>
</view> </view>
<view class="price-wrap" v-if="value.priceStyle.mainControl"> <view class="price-wrap" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ item.pintuan_price.split('.')[1] }}</text> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor +'!important' : '' }">{{ "."+item.pintuan_price.split('.')[1] }}</text> <text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
item.pintuan_price.split('.')[1] }}</text>
<text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">{{
"." + item.pintuan_price.split('.')[1] }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -119,396 +167,264 @@
</template> </template>
<script> <script>
export default { import DiyMinx from './minx.js'
name: 'diy-pinfan', export default {
props: { name: 'diy-pinfan',
value: { props: {
type: Object value: {
} type: Object
},
data() {
return {
loading: true,
skeletonType:'',
skeletonConfig: {},
list: [],
page: 1
};
},
created() {
this.initSkeleton();
this.getData();
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
this.getData();
}
},
computed: {
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// 商品项样式
goodsItemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = "";
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy')
width = this.rpxUpPx(this.value.goodsMarginNum * 2);
else
width = [screenWidth - (this.rpxUpPx(20) * 2) - (this.rpxUpPx(200) * 3) - (this.rpxUpPx(this.value
.margin.both * 2) * 2)] / 6;
obj += 'margin-left:' + width + "px;";
obj += 'margin-right:' + width + "px;";
}
return obj;
},
swiperHeight() {
if (this.value.nameLineMode == 'multiple')
return this.value.ornament.type == 'shadow' ? '444rpx' : '432rpx';
return this.value.ornament.type == 'shadow' ? '404rpx' : '396rpx';
}
},
methods: {
initSkeleton() {
if (this.value.template == 'row1-of1') {
// 单列 风格
this.skeletonType = 'list';
this.skeletonConfig = {
textRows: 3
};
} else if (this.value.template == 'horizontal-slide') {
// 横向滑动 风格
this.skeletonType = 'waterfall';
this.skeletonConfig = {
gridRows: 1,
gridColumns: 3,
headHeight: '200rpx',
textRows: 2,
textWidth: ['100%', '80%']
};
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = screenWidth * parseInt(res) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/pinfan/api/goods/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data;
// 切屏滚动,每页显示固定数量
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3;
let temp = [];
this.page = Math.ceil(this.list.length / size);
for (var i = 0; i < this.page; i++) {
temp[i] = [];
for (var j = i * size; j < this.list.length; j++) {
if (temp[i].length == size) break;
temp[i].push(this.list[j]);
}
}
this.list = temp;
}
}
this.loading = false;
}
});
},
toDetail(e) {
this.$util.redirectTo('/pages_promotion/pinfan/detail', {
pinfan_id: e.pintuan_id
});
},
imageError(index) {
this.list[index].goods_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
}
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
skeletonType: '',
skeletonConfig: {},
list: [],
page: 1
};
},
created() {
this.initSkeleton();
this.getData();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getData();
}
},
computed: {
warpCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
},
// 商品项样式
goodsItemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = "";
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy')
width = this.rpxUpPx(this.value.goodsMarginNum * 2);
else
width = [screenWidth - (this.rpxUpPx(20) * 2) - (this.rpxUpPx(200) * 3) - (this.rpxUpPx(this.value
.margin.both * 2) * 2)] / 6;
obj += 'margin-left:' + width + "px;";
obj += 'margin-right:' + width + "px;";
}
return obj;
},
swiperHeight() {
if (this.value.nameLineMode == 'multiple')
return this.value.ornament.type == 'shadow' ? '444rpx' : '432rpx';
return this.value.ornament.type == 'shadow' ? '404rpx' : '396rpx';
}
},
methods: {
initSkeleton() {
if (this.value.template == 'row1-of1') {
// 单列 风格
this.skeletonType = 'list';
this.skeletonConfig = {
textRows: 3
};
} else if (this.value.template == 'horizontal-slide') {
// 横向滑动 风格
this.skeletonType = 'waterfall';
this.skeletonConfig = {
gridRows: 1,
gridColumns: 3,
headHeight: '200rpx',
textRows: 2,
textWidth: ['100%', '80%']
};
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = screenWidth * parseInt(res) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/pinfan/api/goods/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data;
// 切屏滚动,每页显示固定数量
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3;
let temp = [];
this.page = Math.ceil(this.list.length / size);
for (var i = 0; i < this.page; i++) {
temp[i] = [];
for (var j = i * size; j < this.list.length; j++) {
if (temp[i].length == size) break;
temp[i].push(this.list[j]);
}
}
this.list = temp;
}
}
this.loading = false;
}
});
},
toDetail(e) {
this.$util.redirectTo('/pages_promotion/pinfan/detail', {
pinfan_id: e.pintuan_id
});
},
imageError(index) {
this.list[index].goods_image = this.$util.getDefaultImage().goods;
this.$forceUpdate();
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
/deep/.uni-scroll-view ::-webkit-scrollbar { /deep/.uni-scroll-view ::-webkit-scrollbar {
/* 隐藏滚动条,但依旧具备可以滚动的功能 */ /* 隐藏滚动条,但依旧具备可以滚动的功能 */
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
/deep/::-webkit-scrollbar { /deep/::-webkit-scrollbar {
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
scroll-view ::-webkit-scrollbar { scroll-view ::-webkit-scrollbar {
width: 0; width: 0;
height: 0; height: 0;
background-color: transparent; background-color: transparent;
touch-action: none; touch-action: none;
} }
.diy-pinfan { .diy-pinfan {
&.row1-of1 { &.row1-of1 {
.item { .item {
display: flex;
margin-bottom: 20rpx;
padding: 16rpx;
&.shadow {
margin: 8rpx 8rpx 20rpx 8rpx;
}
&:last-child {
margin-bottom: 0;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
image {
width: 200rpx;
}
}
.content {
flex: 1;
margin-left: 20rpx;
position: relative;
display: flex;
justify-content: space-between;
flex-direction: column;
padding: 6rpx 0;
.goods-name {
line-height: 1.3;
}
.tag-wrap {
display: flex;
align-items: center;
margin-top: 4rpx;
>view {
height: 30rpx;
line-height: 30rpx;
border: 2rpx solid $base-color;
border-radius: 6rpx;
margin-right: 10rpx;
font-size: $font-size-activity-tag;
color: $base-color;
.iconfont {
display: inline-block;
width: 30rpx;
height: 30rpx;
font-size: $font-size-activity-tag;
color: #ffffff;
text-align: center;
margin-right: -6rpx;
background: $base-color;
}
text:last-child {
padding: 0 10rpx;
}
}
}
.price-wrap {
display: flex;
align-items: flex-end;
>view:last-of-type {
flex: 1;
}
.discount-price {
white-space: nowrap;
font-weight: bold;
.unit {
font-size: $font-size-tag;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
.original-price {
font-size: $font-size-tag;
color: $color-tip;
text-decoration: line-through;
margin: 0 10rpx 4rpx 10rpx;
}
}
button {
bottom: 10rpx;
height: 90rpx;
line-height: 40rpx;
padding: 0 16rpx;
margin: 0;
text-align: center;
background-color: $base-color;
color: #ffffff;
.text {
display: block;
margin-top: 6rpx;
font-size: $font-size-tag;
}
.fan {
font-size: $font-size-activity-tag;
}
}
}
}
}
&.horizontal-slide {
display: flex; display: flex;
justify-content: space-around; margin-bottom: 20rpx;
padding: 16rpx;
.scroll { &.shadow {
width: calc(100% - 40rpx); margin: 8rpx 8rpx 20rpx 8rpx;
padding: 20rpx;
line-height: 1;
white-space: nowrap;
.item.shadow {
margin-bottom: 8rpx;
}
} }
.flex-between { &:last-child {
justify-content: space-between; margin-bottom: 0;
} }
.item { .img-wrap {
display: inline-block;
width: 200rpx; width: 200rpx;
overflow: hidden; height: 200rpx;
box-sizing: border-box;
&:nth-child(3n+3) { image {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx; width: 200rpx;
height: 200rpx; }
position: relative; }
overflow: hidden;
margin: 0 auto;
>image { .content {
width: 200rpx; flex: 1;
margin-left: 20rpx;
position: relative;
display: flex;
justify-content: space-between;
flex-direction: column;
padding: 6rpx 0;
.goods-name {
line-height: 1.3;
}
.tag-wrap {
display: flex;
align-items: center;
margin-top: 4rpx;
>view {
height: 30rpx;
line-height: 30rpx;
border: 2rpx solid $base-color;
border-radius: 6rpx;
margin-right: 10rpx;
font-size: $font-size-activity-tag;
color: $base-color;
.iconfont {
display: inline-block;
width: 30rpx;
height: 30rpx;
font-size: $font-size-activity-tag;
color: #ffffff;
text-align: center;
margin-right: -6rpx;
background: $base-color;
}
text:last-child {
padding: 0 10rpx;
}
} }
} }
.content { .price-wrap {
padding: 10rpx;
display: flex; display: flex;
flex-direction: column; align-items: flex-end;
justify-content: space-between;
&.multi-content { >view:last-of-type {
height: 188rpx; flex: 1;
box-sizing: border-box;
} }
.goods-name { .discount-price {
line-height: 1.3;
&.multi-hidden {
white-space: break-spaces;
}
}
.num {
margin-top: auto;
font-size: $font-size-activity-tag;
.content-tuan-box {
border-radius: 4rpx;
color: #ffffff;
background-color: $base-color;
padding: 6rpx;
}
.content-tuan-price {
border-radius: 4rpx;
padding: 4rpx 6rpx;
border: 2rpx solid $base-color;
color: $base-color;
margin-left: -2rpx;
}
}
.price-wrap {
white-space: nowrap; white-space: nowrap;
margin-top: 10rpx;
font-weight: bold; font-weight: bold;
line-height: 1;
.unit { .unit {
font-size: $font-size-tag; font-size: $font-size-tag;
height: 32rpx;
color: $base-color; color: $base-color;
} }
@@ -517,24 +433,158 @@
color: $base-color; color: $base-color;
} }
} }
}
}
.swiper { .original-price {
width: 100%; font-size: $font-size-tag;
white-space: nowrap; color: $color-tip;
padding: 20rpx; text-decoration: line-through;
box-sizing: border-box; margin: 0 10rpx 4rpx 10rpx;
}
.swiper-item {
display: flex;
align-items: center;
} }
.item { button {
width: 200rpx; bottom: 10rpx;
height: 90rpx;
line-height: 40rpx;
padding: 0 16rpx;
margin: 0;
text-align: center;
background-color: $base-color;
color: #ffffff;
.text {
display: block;
margin-top: 6rpx;
font-size: $font-size-tag;
}
.fan {
font-size: $font-size-activity-tag;
}
} }
} }
} }
} }
&.horizontal-slide {
display: flex;
justify-content: space-around;
.scroll {
width: calc(100% - 40rpx);
padding: 20rpx;
line-height: 1;
white-space: nowrap;
.item.shadow {
margin-bottom: 8rpx;
}
}
.flex-between {
justify-content: space-between;
}
.item {
display: inline-block;
width: 200rpx;
overflow: hidden;
box-sizing: border-box;
&:nth-child(3n+3) {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
position: relative;
overflow: hidden;
margin: 0 auto;
>image {
width: 200rpx;
}
}
.content {
padding: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
&.multi-content {
height: 188rpx;
box-sizing: border-box;
}
.goods-name {
line-height: 1.3;
&.multi-hidden {
white-space: break-spaces;
}
}
.num {
margin-top: auto;
font-size: $font-size-activity-tag;
.content-tuan-box {
border-radius: 4rpx;
color: #ffffff;
background-color: $base-color;
padding: 6rpx;
}
.content-tuan-price {
border-radius: 4rpx;
padding: 4rpx 6rpx;
border: 2rpx solid $base-color;
color: $base-color;
margin-left: -2rpx;
}
}
.price-wrap {
white-space: nowrap;
margin-top: 10rpx;
font-weight: bold;
line-height: 1;
.unit {
font-size: $font-size-tag;
height: 32rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
}
}
.swiper {
width: 100%;
white-space: nowrap;
padding: 20rpx;
box-sizing: border-box;
.swiper-item {
display: flex;
align-items: center;
}
.item {
width: 200rpx;
}
}
}
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -2,22 +2,29 @@
<x-skeleton data-component-name="diy-presale" :type="skeletonType" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-presale" :type="skeletonType" :loading="loading" :configs="skeletonConfig">
<view class="diy-presale" v-if="list.length" :class="[value.template, value.style]" :style="warpCss"> <view class="diy-presale" v-if="list.length" :class="[value.template, value.style]" :style="warpCss">
<template v-if="value.template == 'row1-of1'"> <template v-if="value.template == 'row1-of1'">
<view class="item" v-for="(item, index) in list" :key="index" @click="handlerClick(item)" @tap="handlerClick(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="item" v-for="(item, index) in list" :key="index" @click="handlerClick(item)"
@tap="handlerClick(item)" :class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(index)" />
</view> </view>
<view class="content" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.btnStyle.control"> <view class="content"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl || value.btnStyle.control">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ showPrice(item).split('.')[0] }} {{ showPrice(item).split('.')[0] }}
</text> </text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> <text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ '.' + showPrice(item).split('.')[1] }} {{ '.' + showPrice(item).split('.')[1] }}
</text> </text>
</view> </view>
@@ -33,22 +40,29 @@
</template> </template>
<template v-if="value.template == 'horizontal-slide'"> <template v-if="value.template == 'horizontal-slide'">
<scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false"> <scroll-view v-if="value.slideMode == 'scroll'" class="scroll" :scroll-x="true" :show-scrollbar="false">
<view class="item" v-for="(item, index) in list" :key="index" @click="handlerClick(item)" @tap="handlerClick(item)" :class="[value.ornament.type]" :style="goodsItemCss"> <view class="item" v-for="(item, index) in list" :key="index" @click="handlerClick(item)"
@tap="handlerClick(item)" :class="[value.ornament.type]" :style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(index)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(index)" />
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ showPrice(item).split('.')[0] }} {{ showPrice(item).split('.')[0] }}
</text> </text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> <text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ '.' + showPrice(item).split('.')[1] }} {{ '.' + showPrice(item).split('.')[1] }}
</text> </text>
</view> </view>
@@ -56,24 +70,34 @@
</view> </view>
</scroll-view> </scroll-view>
<swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper" :style="{ height: swiperHeight }"> <swiper v-if="value.slideMode == 'slide'" :autoplay="false" class="swiper"
<swiper-item v-for="(pageItem, pageIndex) in page" :key="pageIndex" :class="['swiper-item', (list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']"> :style="{ height: swiperHeight }">
<view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex" @click="handlerClick(item)" @tap="handlerClick(item)":class="[value.ornament.type]" :style="goodsItemCss"> <swiper-item v-for="(pageItem, pageIndex) in page" :key="pageIndex"
:class="['swiper-item', (list.length && [list[pageIndex].length / 3] >= 1) && 'flex-between']">
<view class="item" v-for="(item, dataIndex) in list[pageIndex]" :key="dataIndex"
@click="handlerClick(item)" @tap="handlerClick(item)" :class="[value.ornament.type]"
:style="goodsItemCss">
<view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"> <view class="img-wrap" :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }">
<image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }" :src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix" @error="imageError(dataIndex)"/> <image :style="{ borderRadius: value.imgAroundRadius * 2 + 'rpx' }"
:src="$util.img(item.goods_image, { size: 'mid' })" mode="widthFix"
@error="imageError(dataIndex)" />
</view> </view>
<view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]" v-if="value.goodsNameStyle.control || value.priceStyle.mainControl"> <view :class="['content', { 'multi-content': value.nameLineMode == 'multiple' }]"
v-if="value.goodsNameStyle.control || value.priceStyle.mainControl">
<view v-if="value.goodsNameStyle.control" class="goods-name" <view v-if="value.goodsNameStyle.control" class="goods-name"
:style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }" :style="{ color: value.theme == 'diy' ? value.goodsNameStyle.color : '', fontWeight: value.goodsNameStyle.fontWeight ? 'bold' : '' }"
:class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]"> :class="[{ 'using-hidden': value.nameLineMode == 'single' }, { 'multi-hidden': value.nameLineMode == 'multiple' }]">
{{ item.goods_name }} {{ item.goods_name }}
</view> </view>
<view class="discount-price" v-if="value.priceStyle.mainControl"> <view class="discount-price" v-if="value.priceStyle.mainControl">
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text> <text class="unit price-style small"
<text class="price price-style large" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">¥</text>
<text class="price price-style large"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ showPrice(item).split('.')[0] }} {{ showPrice(item).split('.')[0] }}
</text> </text>
<text class="unit price-style small" :style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }"> <text class="unit price-style small"
:style="{ color: value.theme == 'diy' ? value.priceStyle.mainColor + '!important' : '' }">
{{ '.' + showPrice(item).split('.')[1] }} {{ '.' + showPrice(item).split('.')[1] }}
</text> </text>
</view> </view>
@@ -87,357 +111,359 @@
</template> </template>
<script> <script>
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-presale', name: 'diy-presale',
props: { props: {
value: { value: {
type: Object type: Object
} }
}, },
data() { data() {
return { return {
loading: true, loading: true,
skeletonType:'', skeletonType: '',
skeletonConfig: {}, skeletonConfig: {},
list: [], list: [],
page: 1 page: 1
}; };
}, },
created() { created() {
this.initSkeleton(); this.initSkeleton();
this.getData();
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getData(); this.getData();
}, }
mixins: [DiyMinx], },
watch: { computed: {
// 组件刷新监听 warpCss() {
componentRefresh: function(nval) { var obj = '';
this.getData(); obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
return obj;
}, },
computed: { // 商品项样式
warpCss() { goodsItemCss() {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';'; obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.componentAngle == 'round') { if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;'; obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;'; obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
return obj;
},
// 商品项样式
goodsItemCss() {
var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.elementAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
}
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = '';
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this
.value.goodsMarginNum * 2);
else width = [screenWidth - this.rpxUpPx(20) * 2 - this.rpxUpPx(200) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
obj += 'margin-right:' + width + 'px;';
obj += 'margin-left:' + width + 'px;';
}
return obj;
},
swiperHeight() {
if (this.value.nameLineMode == 'multiple') {
return this.value.ornament.type == 'shadow' ? '390rpx' : '382rpx';
}
return this.value.ornament.type == 'shadow' ? '364rpx' : '348rpx';
} }
if (this.value.ornament.type == 'shadow') {
obj += 'box-shadow:' + '0 0 10rpx ' + this.value.ornament.color + ';';
}
if (this.value.ornament.type == 'stroke') {
obj += 'border:' + '2rpx solid ' + this.value.ornament.color + ';';
}
const screenWidth = uni.getSystemInfoSync().windowWidth;
if (this.value.template == 'horizontal-slide') {
var width = '';
if (this.value.slideMode == 'scroll' && this.value.goodsMarginType == 'diy') width = this.rpxUpPx(this
.value.goodsMarginNum * 2);
else width = [screenWidth - this.rpxUpPx(20) * 2 - this.rpxUpPx(200) * 3 - this.rpxUpPx(this.value
.margin.both * 2) * 2] / 6;
obj += 'margin-right:' + width + 'px;';
obj += 'margin-left:' + width + 'px;';
}
return obj;
}, },
methods: { swiperHeight() {
initSkeleton() { if (this.value.nameLineMode == 'multiple') {
if (this.value.template == 'row1-of1') { return this.value.ornament.type == 'shadow' ? '390rpx' : '382rpx';
}
return this.value.ornament.type == 'shadow' ? '364rpx' : '348rpx';
}
},
methods: {
initSkeleton() {
if (this.value.template == 'row1-of1') {
// 单列 风格 // 单列 风格
this.skeletonType = 'list'; this.skeletonType = 'list';
this.skeletonConfig = { this.skeletonConfig = {
textRows: 2 textRows: 2
};
} else if (this.value.template == 'horizontal-slide') {
// 横向滑动 风格
this.skeletonType = 'waterfall';
this.skeletonConfig = {
gridRows: 1,
gridColumns: 3,
headHeight: '200rpx',
textRows: 2,
textWidth: ['100%', '80%']
};
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = (screenWidth * parseInt(res)) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
}; };
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/presale/api/goods/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data;
// 切屏滚动,每页显示固定数量 } else if (this.value.template == 'horizontal-slide') {
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3; // 横向滑动 风格
let temp = []; this.skeletonType = 'waterfall';
this.page = Math.ceil(this.list.length / size); this.skeletonConfig = {
for (var i = 0; i < this.page; i++) { gridRows: 1,
temp[i] = []; gridColumns: 3,
for (var j = i * size; j < this.list.length; j++) { headHeight: '200rpx',
if (temp[i].length == size) break; textRows: 2,
temp[i].push(this.list[j]); textWidth: ['100%', '80%']
} };
}
},
rpxUpPx(res) {
const screenWidth = uni.getSystemInfoSync().windowWidth;
var data = (screenWidth * parseInt(res)) / 750;
return Math.floor(data);
},
getData() {
var data = {
num: this.value.count
};
if (this.value.sources == 'diy') {
data.num = 0;
data.goods_id_arr = this.value.goodsId.toString();
}
this.$api.sendRequest({
url: '/presale/api/goods/lists',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data;
// 切屏滚动,每页显示固定数量
if (this.value.template == 'horizontal-slide' && this.value.slideMode == 'slide') {
let size = 3;
let temp = [];
this.page = Math.ceil(this.list.length / size);
for (var i = 0; i < this.page; i++) {
temp[i] = [];
for (var j = i * size; j < this.list.length; j++) {
if (temp[i].length == size) break;
temp[i].push(this.list[j]);
} }
this.list = temp;
} }
this.list = temp;
} }
this.loading = false;
} }
}); this.loading = false;
}, }
toDetail(e) { });
this.$util.redirectTo('/pages_promotion/presale/detail', { },
id: e.presale_id toDetail(e) {
}); this.$util.redirectTo('/pages_promotion/presale/detail', {
}, id: e.presale_id
imageError(index) { });
this.list[index].goods_image = this.$util.getDefaultImage().goods; },
this.$forceUpdate(); imageError(index) {
}, this.list[index].goods_image = this.$util.getDefaultImage().goods;
showPrice(data) { this.$forceUpdate();
let price = data.price; },
if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price; showPrice(data) {
return price; let price = data.price;
}, if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price;
async handlerClick(item) { return price;
await this.__$emitEvent({eventName: 'presale-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { },
async handlerClick(item) {
await this.__$emitEvent({
eventName: 'presale-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.toDetail(item); this.toDetail(item);
}}) }
} })
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
/deep/.uni-scroll-view ::-webkit-scrollbar { /deep/.uni-scroll-view ::-webkit-scrollbar {
/* 隐藏滚动条,但依旧具备可以滚动的功能 */ /* 隐藏滚动条,但依旧具备可以滚动的功能 */
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
/deep/::-webkit-scrollbar { /deep/::-webkit-scrollbar {
display: none; display: none;
width: 0; width: 0;
height: 0; height: 0;
color: transparent; color: transparent;
background: transparent; background: transparent;
} }
scroll-view ::-webkit-scrollbar { scroll-view ::-webkit-scrollbar {
width: 0; width: 0;
height: 0; height: 0;
background-color: transparent; background-color: transparent;
touch-action: none; touch-action: none;
} }
.diy-presale { .diy-presale {
&.row1-of1 { &.row1-of1 {
.item { .item {
display: flex; display: flex;
margin-bottom: 20rpx; margin-bottom: 20rpx;
padding: 16rpx; padding: 16rpx;
&.shadow { &.shadow {
margin: 8rpx 8rpx 20rpx 8rpx; margin: 8rpx 8rpx 20rpx 8rpx;
}
&:last-child {
margin-bottom: 0;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
>image {
width: 200rpx;
}
}
.content {
flex: 1;
margin-left: 20rpx;
position: relative;
padding: 6rpx 0;
.goods-name {
line-height: 1.5;
}
.discount-price {
white-space: nowrap;
font-weight: bold;
position: absolute;
bottom: 10rpx;
left: 0;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
button {
position: absolute;
bottom: 10rpx;
right: 20rpx;
margin: 0;
padding: 0 20rpx;
background-color: $base-color;
color: #fff;
min-width: 112rpx;
height: 52rpx;
line-height: 52rpx;
font-size: $font-size-tag;
}
}
}
}
&.horizontal-slide {
.scroll {
width: calc(100% - 40rpx);
padding: 20rpx;
line-height: 1;
white-space: nowrap;
.item.shadow {
margin-bottom: 8rpx;
}
} }
.flex-between { &:last-child {
justify-content: space-between; margin-bottom: 0;
} }
.item { .img-wrap {
display: inline-block;
width: 200rpx; width: 200rpx;
overflow: hidden; height: 200rpx;
box-sizing: border-box;
&:nth-child(3n + 3) { >image {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx; width: 200rpx;
height: 200rpx;
margin: 0 auto;
>image {
width: 200rpx;
}
}
.content {
padding: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
&.multi-content {
height: 134rpx;
box-sizing: border-box;
}
.goods-name {
line-height: 1.3;
&.multi-hidden {
white-space: break-spaces;
}
}
.discount-price {
white-space: nowrap;
margin-top: auto;
font-weight: bold;
line-height: 1;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
} }
} }
.swiper { .content {
padding: 20rpx; flex: 1;
width: 100%; margin-left: 20rpx;
white-space: nowrap; position: relative;
box-sizing: border-box; padding: 6rpx 0;
.swiper-item { .goods-name {
display: flex; line-height: 1.5;
align-items: center;
} }
.item { .discount-price {
width: 200rpx; white-space: nowrap;
font-weight: bold;
position: absolute;
bottom: 10rpx;
left: 0;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
button {
position: absolute;
bottom: 10rpx;
right: 20rpx;
margin: 0;
padding: 0 20rpx;
background-color: $base-color;
color: #fff;
min-width: 112rpx;
height: 52rpx;
line-height: 52rpx;
font-size: $font-size-tag;
} }
} }
} }
} }
&.horizontal-slide {
.scroll {
width: calc(100% - 40rpx);
padding: 20rpx;
line-height: 1;
white-space: nowrap;
.item.shadow {
margin-bottom: 8rpx;
}
}
.flex-between {
justify-content: space-between;
}
.item {
display: inline-block;
width: 200rpx;
overflow: hidden;
box-sizing: border-box;
&:nth-child(3n + 3) {
width: 198rpx;
}
&.shadow {
margin-top: 8rpx;
}
.img-wrap {
width: 200rpx;
height: 200rpx;
margin: 0 auto;
>image {
width: 200rpx;
}
}
.content {
padding: 10rpx;
display: flex;
flex-direction: column;
justify-content: space-between;
&.multi-content {
height: 134rpx;
box-sizing: border-box;
}
.goods-name {
line-height: 1.3;
&.multi-hidden {
white-space: break-spaces;
}
}
.discount-price {
white-space: nowrap;
margin-top: auto;
font-weight: bold;
line-height: 1;
.unit {
font-size: $font-size-tag;
margin-right: 4rpx;
color: $base-color;
}
.price {
font-size: $font-size-toolbar;
color: $base-color;
}
}
}
}
.swiper {
padding: 20rpx;
width: 100%;
white-space: nowrap;
box-sizing: border-box;
.swiper-item {
display: flex;
align-items: center;
}
.item {
width: 200rpx;
}
}
}
}
</style> </style>

View File

@@ -4,17 +4,15 @@
<!-- #ifdef MP --> <!-- #ifdef MP -->
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<!-- #endif --> <!-- #endif -->
<view <view class="quick-nav-item" v-for="(item, index) in value.list" :key="index"
class="quick-nav-item" @click="handlerClick(item)" @tap="handlerClick(item)"
v-for="(item, index) in value.list" :style="{ background: 'linear-gradient(to right,' + item.bgColorStart ? item.bgColorStart : '' + ',' + item.bgColorEnd ? item.bgColorEnd : '' + ')' }">
:key="index"
@click="handlerClick(item)"
@tap="handlerClick(item)"
:style="{ background: 'linear-gradient(to right,' + item.bgColorStart ? item.bgColorStart : '' + ',' + item.bgColorEnd ? item.bgColorEnd : '' + ')' }"
>
<view class="quick-img" v-if="item.imageUrl || item.icon"> <view class="quick-img" v-if="item.imageUrl || item.icon">
<image v-if="item.iconType == 'img'" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')" mode="heightFix" :show-menu-by-longpress="true"></image> <image v-if="item.iconType == 'img'"
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon" :value="item.style ? item.style : null" :style="{ fontSize: '60rpx' }"></diy-icon> :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
mode="heightFix" :show-menu-by-longpress="true"></image>
<diy-icon v-if="item.iconType == 'icon'" :icon="item.icon"
:value="item.style ? item.style : null" :style="{ fontSize: '60rpx' }"></diy-icon>
</view> </view>
<text class="quick-text" :style="{ color: item.textColor }">{{ item.title }}</text> <text class="quick-text" :style="{ color: item.textColor }">{{ item.title }}</text>
</view> </view>
@@ -28,59 +26,61 @@
</template> </template>
<script> <script>
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-quick-nav', name: 'diy-quick-nav',
props: { props: {
value: { value: {
type: Object type: Object
}
},
data() {
return {};
},
created() { },
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
componentStyle() {
var css = '';
css += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
}, css += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament.color : '') + ';';
data() { css += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color : '') + ';';
return {}; return css;
}, }
created() {}, },
mixins: [DiyMinx], methods: {
watch: { redirectTo(link) {
// 组件刷新监听 if (link.wap_url) {
componentRefresh: function(nval) {} if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
}, this.$refs.login.open(link.wap_url);
computed: { return;
componentStyle() {
var css = '';
css += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
css += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
css += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
css += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
} }
css += 'box-shadow:' + (this.value.ornament.type == 'shadow' ? '0 0 10rpx ' + this.value.ornament.color : '') + ';';
css += 'border:' + (this.value.ornament.type == 'stroke' ? '2rpx solid ' + this.value.ornament.color : '') + ';';
return css;
} }
this.$util.diyRedirectTo(link);
}, },
methods: { async handlerClick(item) {
redirectTo(link) { await this.__$emitEvent({
if (link.wap_url) { eventName: 'quick-nav-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
this.$util.diyRedirectTo(link);
},
async handlerClick(item) {
await this.__$emitEvent({eventName: 'quick-nav-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.redirectTo(item.link); this.redirectTo(item.link);
}}) }
} })
} }
}; }
};
</script> </script>
<style> <style>
.quick-nav >>> .uni-scroll-view-content { .quick-nav>>>.uni-scroll-view-content {
display: flex; display: flex;
} }
</style> </style>
@@ -95,9 +95,11 @@
border-radius: 40rpx; border-radius: 40rpx;
margin-right: 20rpx; margin-right: 20rpx;
height: 48rpx; height: 48rpx;
&:first-of-type{
&:first-of-type {
padding-left: 12rpx; padding-left: 12rpx;
} }
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
} }
@@ -106,6 +108,7 @@
margin-right: 6rpx; margin-right: 6rpx;
height: 30rpx; height: 30rpx;
line-height: 1; line-height: 1;
image { image {
width: 30rpx; width: 30rpx;
height: 30rpx; height: 30rpx;

View File

@@ -26,10 +26,10 @@ export default {
mixins: [DiyMinx], mixins: [DiyMinx],
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
computed: { computed: {
richTextWarpCss: function() { richTextWarpCss: function () {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';'; obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') { if (this.value.componentAngle == 'round') {
@@ -41,12 +41,14 @@ export default {
return obj; return obj;
} }
}, },
mounted() {}, mounted() { },
methods: { methods: {
async handlerClick(item) { async handlerClick(item) {
await this.__$emitEvent({eventName: 'rich-text-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { await this.__$emitEvent({
if (!awaitedResult) return; eventName: 'rich-text-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
}}) if (!awaitedResult) return;
}
})
} }
} }
}; };

View File

@@ -8,16 +8,22 @@
<!-- 1左2右 --> <!-- 1左2右 -->
<template v-if="value.mode == 'row1-lt-of2-rt'"> <template v-if="value.mode == 'row1-lt-of2-rt'">
<view class="template-left"> <view class="template-left">
<view :class="['item', value.mode]" @click="handlerClick(value.list[0].link)" @tap="handlerClick(value.list[0].link)" :style="{ marginRight: value.imageGap * 2 + 'rpx', width: list[0].imgWidth, height: list[0].imgHeight + 'px' }"> <view :class="['item', value.mode]" @click="handlerClick(value.list[0].link)"
<image :src="$util.img(value.list[0].imageUrl)" :mode="list[0].imageMode || 'scaleToFill'" :style="list[0].pageItemStyle" :show-menu-by-longpress="true"/> @tap="handlerClick(value.list[0].link)"
:style="{ marginRight: value.imageGap * 2 + 'rpx', width: list[0].imgWidth, height: list[0].imgHeight + 'px' }">
<image :src="$util.img(value.list[0].imageUrl)" :mode="list[0].imageMode || 'scaleToFill'"
:style="list[0].pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
</view> </view>
<view class="template-right"> <view class="template-right">
<template v-for="(item, index) in list"> <template v-for="(item, index) in list">
<template v-if="index > 0"> <template v-if="index > 0">
<view :key="index" :class="['item', value.mode]" @click="handlerClick(item.link)" @tap="handlerClick(item.link)" :style="{ marginBottom: value.imageGap * 2 + 'rpx', width: item.imgWidth, height: item.imgHeight + 'px' }"> <view :key="index" :class="['item', value.mode]" @click="handlerClick(item.link)"
<image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'" :style="item.pageItemStyle" :show-menu-by-longpress="true"/> @tap="handlerClick(item.link)"
:style="{ marginBottom: value.imageGap * 2 + 'rpx', width: item.imgWidth, height: item.imgHeight + 'px' }">
<image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'"
:style="item.pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
</template> </template>
</template> </template>
@@ -27,25 +33,32 @@
<!-- 1左3右 --> <!-- 1左3右 -->
<template v-else-if="value.mode == 'row1-lt-of1-tp-of2-bm'"> <template v-else-if="value.mode == 'row1-lt-of1-tp-of2-bm'">
<view class="template-left"> <view class="template-left">
<view :class="['item', value.mode]" :style="{ marginRight: value.imageGap * 2 + 'rpx', width: list[0].imgWidth, height: list[0].imgHeight + 'px' }" @click="handlerClick(value.list[0].link)" @tap="handlerClick(value.list[0].link)"> <view :class="['item', value.mode]"
<image :src="$util.img(value.list[0].imageUrl)" :mode="list[0].imageMode || 'scaleToFill'" :style="list[0].pageItemStyle" :show-menu-by-longpress="true"/> :style="{ marginRight: value.imageGap * 2 + 'rpx', width: list[0].imgWidth, height: list[0].imgHeight + 'px' }"
@click="handlerClick(value.list[0].link)" @tap="handlerClick(value.list[0].link)">
<image :src="$util.img(value.list[0].imageUrl)" :mode="list[0].imageMode || 'scaleToFill'"
:style="list[0].pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
</view> </view>
<view class="template-right"> <view class="template-right">
<view :class="['item', value.mode]" :style="{ marginBottom: value.imageGap * 2 + 'rpx', width: list[1].imgWidth, height: list[1].imgHeight + 'px' }" @click="handlerClick(value.list[1].link)" @tap="handlerClick(value.list[1].link)"> <view :class="['item', value.mode]"
<image :src="$util.img(value.list[1].imageUrl)" :mode="list[1].imageMode || 'scaleToFill'" :style="list[1].pageItemStyle" :show-menu-by-longpress="true"/> :style="{ marginBottom: value.imageGap * 2 + 'rpx', width: list[1].imgWidth, height: list[1].imgHeight + 'px' }"
@click="handlerClick(value.list[1].link)" @tap="handlerClick(value.list[1].link)">
<image :src="$util.img(value.list[1].imageUrl)" :mode="list[1].imageMode || 'scaleToFill'"
:style="list[1].pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
<view class="template-bottom"> <view class="template-bottom">
<template v-for="(item, index) in list"> <template v-for="(item, index) in list">
<template v-if="index > 1"> <template v-if="index > 1">
<view :key="index" :class="['item', value.mode]" @click="handlerClick(item.link)" @tap="handlerClick(item.link)" <view :key="index" :class="['item', value.mode]" @click="handlerClick(item.link)"
:style="{ @tap="handlerClick(item.link)" :style="{
marginRight: value.imageGap * 2 + 'rpx', marginRight: value.imageGap * 2 + 'rpx',
width: item.imgWidth, width: item.imgWidth,
height: item.imgHeight + 'px' height: item.imgHeight + 'px'
}"> }">
<image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'" :style="item.pageItemStyle" :show-menu-by-longpress="true"/> <image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'"
:style="item.pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
</template> </template>
</template> </template>
@@ -57,7 +70,8 @@
<view :class="['item', value.mode]" v-for="(item, index) in list" :key="index" <view :class="['item', value.mode]" v-for="(item, index) in list" :key="index"
@click="handlerClick(item.link)" @tap="handlerClick(item.link)" @click="handlerClick(item.link)" @tap="handlerClick(item.link)"
:style="{ marginRight: value.imageGap * 2 + 'rpx', marginBottom: value.imageGap * 2 + 'rpx', width: item.widthStyle, height: item.imgHeight + 'px' }"> :style="{ marginRight: value.imageGap * 2 + 'rpx', marginBottom: value.imageGap * 2 + 'rpx', width: item.widthStyle, height: item.imgHeight + 'px' }">
<image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'" :style="item.pageItemStyle" :show-menu-by-longpress="true"/> <image :src="$util.img(item.imageUrl)" :mode="item.imageMode || 'scaleToFill'"
:style="item.pageItemStyle" :show-menu-by-longpress="true" />
</view> </view>
</template> </template>
</view> </view>
@@ -65,459 +79,461 @@
</template> </template>
<script> <script>
// 魔方、橱窗 // 魔方、橱窗
import htmlParser from '@/common/js/html-parser'; import htmlParser from '@/common/js/html-parser';
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-rubik-cube', name: 'diy-rubik-cube',
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {};
}
}
},
data() {
return {
customHtml: ''
};
},
created() {
if (this.value.mode == 'custom-rubik-cube') {
this.value.diyHtml = this.value.diyHtml.replace(/&quot;/g, '"');
this.customHtml = htmlParser(this.value.diyHtml);
} else {
var singleRow = {
'row1-of2': {
ratio: 2,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 2) + 'px) / 2)'
},
'row1-of3': {
ratio: 3,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 4) + 'px) / 3)'
},
'row1-of4': {
ratio: 4,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 6) + 'px) / 4)'
}
};
if (singleRow[this.value.mode]) {
this.calcSingleRow(singleRow[this.value.mode]);
} else if (this.value.mode == 'row2-lt-of2-rt') {
this.calcFourSquare();
} else if (this.value.mode == 'row1-lt-of2-rt') {
this.calcRowOneLeftOfTwoRight();
} else if (this.value.mode == 'row1-tp-of2-bm') {
this.calcRowOneTopOfTwoBottom();
} else if (this.value.mode == 'row1-lt-of1-tp-of2-bm') {
this.calcRowOneLeftOfOneTopOfTwoBottom();
}
}
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function(nval) {}
},
computed: {
list() {
var arr = JSON.parse(JSON.stringify(this.value.list));
arr.forEach((item, index) => {
item.pageItemStyle = this.countBorderRadius(this.value.mode, index);
});
return arr;
},
rubikCubeWrapCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
/**
* 魔方:单行多个,平分宽度
* 公式:
* 宽度:屏幕宽度/2示例375/2=187.5
* 比例:原图高/原图宽示例322/690=0.46
* 高度:宽度*比例示例187.5*0.46=86.25
*/
calcSingleRow(params) {
uni.getSystemInfo({
success: res => {
let maxHeight = 0;
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth;
let width = res.windowWidth - uni.upx2px(this.value.margin.both *
2); // 减去左右间距
if (this.value.imageGap > 0) {
width -= uni.upx2px(params.ratio * this.value.imageGap * 2); // 减去间隙
}
item.imgWidth = width / params.ratio;
item.imgHeight = item.imgWidth * ratio;
if (maxHeight == 0 || maxHeight < item.imgHeight) maxHeight = item
.imgHeight;
})
this.list.forEach((item, index) => {
item.widthStyle = params.width;
item.imgHeight = maxHeight;
});
}
})
},
/**
* 魔方四方型各占50%
*/
calcFourSquare() {
uni.getSystemInfo({
success: res => {
let maxHeightFirst = 0;
let maxHeightTwo = 0;
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth;
item.imgWidth = res.windowWidth;
item.imgWidth -= uni.upx2px(this.value.margin.both * 4);
if (this.value.imageGap > 0) {
item.imgWidth -= uni.upx2px(this.value.imageGap * 2);
}
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
// 获取每行最大高度
if (index <= 1) {
if (maxHeightFirst == 0 || maxHeightFirst < item.imgHeight) {
maxHeightFirst = item.imgHeight;
}
} else if (index > 1) {
if (maxHeightTwo == 0 || maxHeightTwo < item.imgHeight) {
maxHeightTwo = item.imgHeight;
}
}
});
this.list.forEach((item, index) => {
item.imgWidth = 'calc((100% - ' + uni.upx2px(this.value.imageGap * 2) +
'px) / 2)';
item.widthStyle = item.imgWidth;
if (index <= 1) {
item.imgHeight = maxHeightFirst;
} else if (index > 1) {
item.imgHeight = maxHeightTwo;
}
});
}
});
},
/**
* 魔方1左2右
*/
calcRowOneLeftOfTwoRight() {
let rightHeight = 0; // 右侧两图平分高度
let divide = 'left'; // 划分规则leftright
if (this.list[1].imgWidth === this.list[2].imgWidth) divide = 'right';
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
if (index == 0) {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
rightHeight = (item.imgHeight - uni.upx2px(this.value.imageGap * 2)) / 2;
item.imgWidth += 'px';
} else {
item.imgWidth = this.list[0].imgWidth;
item.imgHeight = rightHeight;
}
});
}
});
},
/**
* 魔方1上2下
*/
calcRowOneTopOfTwoBottom() {
var maxHeight = 0;
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
if (index == 0) {
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4);
} else if (index > 0) {
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
}
item.imgHeight = item.imgWidth * ratio;
// 获取最大高度
if (index > 0 && (maxHeight == 0 || maxHeight < item.imgHeight))
maxHeight = item.imgHeight;
});
this.list.forEach((item, index) => {
item.imgWidth += 'px';
item.widthStyle = item.imgWidth;
if (index > 0) item.imgHeight = maxHeight;
});
}
});
},
/**
* 魔方1左3右
*/
calcRowOneLeftOfOneTopOfTwoBottom() {
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
// 左图
if (index == 0) {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
} else if (index == 1) {
item.imgWidth = this.list[0].imgWidth;
item.imgHeight = (this.list[0].imgHeight - uni.upx2px(this.value.imageGap * 2)) / 2;
} else if (index > 1) {
item.imgWidth = (this.list[0].imgWidth - uni.upx2px(this.value.imageGap * 2)) / 2;
item.imgHeight = this.list[1].imgHeight;
}
});
this.list.forEach((item, index) => {
item.imgWidth += 'px';
item.imgHeight;
});
}
});
},
countBorderRadius(type, index) {
var obj = '';
if (this.value.elementAngle == 'right') {
return obj;
}
var defaultData = {
'row1-lt-of2-rt': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-lt-of1-tp-of2-bm': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-tp-of2-bm': [
['border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-top-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row2-lt-of2-rt': [
['border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-bottom-left-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-top-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-of4': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
],
'row1-of3': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
],
'row1-of2': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
]
};
defaultData[type][index].forEach((item, index) => {
// obj += item + ':' + this.value.aroundRadius * 2 + 'rpx;';
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
});
return obj;
},
async handlerClick(link) {
await this.__$emitEvent({eventName: 'rubik-cube-tap', data: link, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
this.$util.diyRedirectTo(link);
}})
} }
} }
}; },
data() {
return {
customHtml: ''
};
},
created() {
if (this.value.mode == 'custom-rubik-cube') {
this.value.diyHtml = this.value.diyHtml.replace(/&quot;/g, '"');
this.customHtml = htmlParser(this.value.diyHtml);
} else {
var singleRow = {
'row1-of2': {
ratio: 2,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 2) + 'px) / 2)'
},
'row1-of3': {
ratio: 3,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 4) + 'px) / 3)'
},
'row1-of4': {
ratio: 4,
width: 'calc((100% - ' + uni.upx2px(this.value.imageGap * 6) + 'px) / 4)'
}
};
if (singleRow[this.value.mode]) {
this.calcSingleRow(singleRow[this.value.mode]);
} else if (this.value.mode == 'row2-lt-of2-rt') {
this.calcFourSquare();
} else if (this.value.mode == 'row1-lt-of2-rt') {
this.calcRowOneLeftOfTwoRight();
} else if (this.value.mode == 'row1-tp-of2-bm') {
this.calcRowOneTopOfTwoBottom();
} else if (this.value.mode == 'row1-lt-of1-tp-of2-bm') {
this.calcRowOneLeftOfOneTopOfTwoBottom();
}
}
},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
list() {
var arr = JSON.parse(JSON.stringify(this.value.list));
arr.forEach((item, index) => {
item.pageItemStyle = this.countBorderRadius(this.value.mode, index);
});
return arr;
},
rubikCubeWrapCss() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
/**
* 魔方:单行多个,平分宽度
* 公式:
* 宽度:屏幕宽度/2示例375/2=187.5
* 比例:原图高/原图宽示例322/690=0.46
* 高度:宽度*比例示例187.5*0.46=86.25
*/
calcSingleRow(params) {
uni.getSystemInfo({
success: res => {
let maxHeight = 0;
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth;
let width = res.windowWidth - uni.upx2px(this.value.margin.both *
2); // 减去左右间距
if (this.value.imageGap > 0) {
width -= uni.upx2px(params.ratio * this.value.imageGap * 2); // 减去间隙
}
item.imgWidth = width / params.ratio;
item.imgHeight = item.imgWidth * ratio;
if (maxHeight == 0 || maxHeight < item.imgHeight) maxHeight = item
.imgHeight;
})
this.list.forEach((item, index) => {
item.widthStyle = params.width;
item.imgHeight = maxHeight;
});
}
})
},
/**
* 魔方四方型各占50%
*/
calcFourSquare() {
uni.getSystemInfo({
success: res => {
let maxHeightFirst = 0;
let maxHeightTwo = 0;
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth;
item.imgWidth = res.windowWidth;
item.imgWidth -= uni.upx2px(this.value.margin.both * 4);
if (this.value.imageGap > 0) {
item.imgWidth -= uni.upx2px(this.value.imageGap * 2);
}
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
// 获取每行最大高度
if (index <= 1) {
if (maxHeightFirst == 0 || maxHeightFirst < item.imgHeight) {
maxHeightFirst = item.imgHeight;
}
} else if (index > 1) {
if (maxHeightTwo == 0 || maxHeightTwo < item.imgHeight) {
maxHeightTwo = item.imgHeight;
}
}
});
this.list.forEach((item, index) => {
item.imgWidth = 'calc((100% - ' + uni.upx2px(this.value.imageGap * 2) +
'px) / 2)';
item.widthStyle = item.imgWidth;
if (index <= 1) {
item.imgHeight = maxHeightFirst;
} else if (index > 1) {
item.imgHeight = maxHeightTwo;
}
});
}
});
},
/**
* 魔方1左2右
*/
calcRowOneLeftOfTwoRight() {
let rightHeight = 0; // 右侧两图平分高度
let divide = 'left'; // 划分规则leftright
if (this.list[1].imgWidth === this.list[2].imgWidth) divide = 'right';
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
if (index == 0) {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
rightHeight = (item.imgHeight - uni.upx2px(this.value.imageGap * 2)) / 2;
item.imgWidth += 'px';
} else {
item.imgWidth = this.list[0].imgWidth;
item.imgHeight = rightHeight;
}
});
}
});
},
/**
* 魔方1上2下
*/
calcRowOneTopOfTwoBottom() {
var maxHeight = 0;
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
if (index == 0) {
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4);
} else if (index > 0) {
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
}
item.imgHeight = item.imgWidth * ratio;
// 获取最大高度
if (index > 0 && (maxHeight == 0 || maxHeight < item.imgHeight))
maxHeight = item.imgHeight;
});
this.list.forEach((item, index) => {
item.imgWidth += 'px';
item.widthStyle = item.imgWidth;
if (index > 0) item.imgHeight = maxHeight;
});
}
});
},
/**
* 魔方1左3右
*/
calcRowOneLeftOfOneTopOfTwoBottom() {
uni.getSystemInfo({
success: res => {
this.list.forEach((item, index) => {
// 左图
if (index == 0) {
var ratio = item.imgHeight / item.imgWidth; // 获取左图的尺寸比例
item.imgWidth = res.windowWidth - uni.upx2px(this.value.margin.both * 4) - uni.upx2px(this.value.imageGap * 2);
item.imgWidth = item.imgWidth / 2;
item.imgHeight = item.imgWidth * ratio;
} else if (index == 1) {
item.imgWidth = this.list[0].imgWidth;
item.imgHeight = (this.list[0].imgHeight - uni.upx2px(this.value.imageGap * 2)) / 2;
} else if (index > 1) {
item.imgWidth = (this.list[0].imgWidth - uni.upx2px(this.value.imageGap * 2)) / 2;
item.imgHeight = this.list[1].imgHeight;
}
});
this.list.forEach((item, index) => {
item.imgWidth += 'px';
item.imgHeight;
});
}
});
},
countBorderRadius(type, index) {
var obj = '';
if (this.value.elementAngle == 'right') {
return obj;
}
var defaultData = {
'row1-lt-of2-rt': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-lt-of1-tp-of2-bm': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-tp-of2-bm': [
['border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-top-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row2-lt-of2-rt': [
['border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-bottom-left-radius'],
['border-top-left-radius', 'border-bottom-right-radius', 'border-top-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius', 'border-top-right-radius']
],
'row1-of4': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
],
'row1-of3': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
],
'row1-of2': [
['border-top-right-radius', 'border-bottom-right-radius'],
['border-top-left-radius', 'border-bottom-left-radius']
]
};
defaultData[type][index].forEach((item, index) => {
// obj += item + ':' + this.value.aroundRadius * 2 + 'rpx;';
obj += 'border-top-left-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomElementAroundRadius * 2 + 'rpx;';
});
return obj;
},
async handlerClick(link) {
await this.__$emitEvent({
eventName: 'rubik-cube-tap', data: link, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
this.$util.diyRedirectTo(link);
}
})
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.rubik-cube { .rubik-cube {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
} }
.rubik-cube .item { .rubik-cube .item {
text-align: center; text-align: center;
line-height: 0; line-height: 0;
overflow: hidden; overflow: hidden;
} }
.rubik-cube .item image { .rubik-cube .item image {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
height: 100%; height: 100%;
} }
// 一行两个 // 一行两个
.rubik-cube .item.row1-of2 { .rubik-cube .item.row1-of2 {
box-sizing: border-box; box-sizing: border-box;
margin-top: 0 !important; margin-top: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube .item.row1-of2:nth-child(1) { .rubik-cube .item.row1-of2:nth-child(1) {
margin-left: 0 !important; margin-left: 0 !important;
} }
.rubik-cube .item.row1-of2:nth-child(2) { .rubik-cube .item.row1-of2:nth-child(2) {
margin-right: 0 !important; margin-right: 0 !important;
} }
// 一行三个 // 一行三个
.rubik-cube .item.row1-of3 { .rubik-cube .item.row1-of3 {
box-sizing: border-box; box-sizing: border-box;
margin-top: 0 !important; margin-top: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube .item.row1-of3:nth-child(1) { .rubik-cube .item.row1-of3:nth-child(1) {
margin-left: 0 !important; margin-left: 0 !important;
} }
.rubik-cube .item.row1-of3:nth-child(3) { .rubik-cube .item.row1-of3:nth-child(3) {
margin-right: 0 !important; margin-right: 0 !important;
} }
// 一行四个 // 一行四个
.rubik-cube .item.row1-of4 { .rubik-cube .item.row1-of4 {
box-sizing: border-box; box-sizing: border-box;
margin-top: 0 !important; margin-top: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube .item.row1-of4:nth-child(1) { .rubik-cube .item.row1-of4:nth-child(1) {
margin-left: 0 !important; margin-left: 0 !important;
} }
.rubik-cube .item.row1-of4:nth-child(4) { .rubik-cube .item.row1-of4:nth-child(4) {
margin-right: 0 !important; margin-right: 0 !important;
} }
// 两左两右 // 两左两右
.rubik-cube .item.row2-lt-of2-rt { .rubik-cube .item.row2-lt-of2-rt {
// width: 50%; // width: 50%;
display: inline-block; display: inline-block;
box-sizing: border-box; box-sizing: border-box;
} }
.rubik-cube .item.row2-lt-of2-rt:nth-child(1) { .rubik-cube .item.row2-lt-of2-rt:nth-child(1) {
margin-left: 0 !important; margin-left: 0 !important;
margin-top: 0 !important; margin-top: 0 !important;
} }
.rubik-cube .item.row2-lt-of2-rt:nth-child(2) { .rubik-cube .item.row2-lt-of2-rt:nth-child(2) {
margin-right: 0 !important; margin-right: 0 !important;
margin-top: 0 !important; margin-top: 0 !important;
} }
.rubik-cube .item.row2-lt-of2-rt:nth-child(3) { .rubik-cube .item.row2-lt-of2-rt:nth-child(3) {
margin-left: 0 !important; margin-left: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube .item.row2-lt-of2-rt:nth-child(4) { .rubik-cube .item.row2-lt-of2-rt:nth-child(4) {
margin-right: 0 !important; margin-right: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
// 一左两右 // 一左两右
.rubik-cube .template-left, .rubik-cube .template-left,
.rubik-cube .template-right { .rubik-cube .template-right {
// width: 50%; // width: 50%;
box-sizing: border-box; box-sizing: border-box;
} }
.rubik-cube .template-left .item.row1-lt-of2-rt:nth-child(1) { .rubik-cube .template-left .item.row1-lt-of2-rt:nth-child(1) {
margin-bottom: 0; margin-bottom: 0;
} }
.rubik-cube .template-right .item.row1-lt-of2-rt:nth-child(2) { .rubik-cube .template-right .item.row1-lt-of2-rt:nth-child(2) {
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube.row1-lt-of2-rt .template-right { .rubik-cube.row1-lt-of2-rt .template-right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
} }
// 一上两下 // 一上两下
.rubik-cube .item.row1-tp-of2-bm:nth-child(1) { .rubik-cube .item.row1-tp-of2-bm:nth-child(1) {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
margin-top: 0 !important; margin-top: 0 !important;
margin-left: 0 !important; margin-left: 0 !important;
margin-right: 0 !important; margin-right: 0 !important;
} }
.rubik-cube .item.row1-tp-of2-bm:nth-child(2) { .rubik-cube .item.row1-tp-of2-bm:nth-child(2) {
// width: 50%; // width: 50%;
box-sizing: border-box; box-sizing: border-box;
margin-left: 0 !important; margin-left: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rubik-cube .item.row1-tp-of2-bm:nth-child(3) { .rubik-cube .item.row1-tp-of2-bm:nth-child(3) {
// width: 50%; // width: 50%;
box-sizing: border-box; box-sizing: border-box;
margin-right: 0 !important; margin-right: 0 !important;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
// 一左三右 // 一左三右
.rubik-cube .template-left .item.row1-lt-of1-tp-of2-bm { .rubik-cube .template-left .item.row1-lt-of1-tp-of2-bm {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
} }
.rubik-cube .template-bottom { .rubik-cube .template-bottom {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.rubik-cube .template-bottom .item:nth-child(2) { .rubik-cube .template-bottom .item:nth-child(2) {
margin-right: 0 !important; margin-right: 0 !important;
} }
</style> </style>

View File

@@ -1,351 +1,370 @@
<template> <template>
<view data-component-name="diy-search" class="diy-search"> <view data-component-name="diy-search" class="diy-search">
<view class="diy-search-wrap" :class="value.positionWay" :style="fixedCss"> <view class="diy-search-wrap" :class="value.positionWay" :style="fixedCss">
<view :class="['search-box','search-box-'+value.searchStyle]" :style="searchWrapCss" @click="handlerSearchClick" @tap="handlerSearchClick"> <view :class="['search-box', 'search-box-' + value.searchStyle]" :style="searchWrapCss"
<block v-if="[1,2].includes(value.searchStyle)"> @click="handlerSearchClick" @tap="handlerSearchClick">
<block v-if="[1, 2].includes(value.searchStyle)">
<view class="img" v-if="value.searchStyle == 2 && value.iconType == 'img'"> <view class="img" v-if="value.searchStyle == 2 && value.iconType == 'img'">
<image :src="$util.img(value.imageUrl)" mode="heightFix"/> <image :src="$util.img(value.imageUrl)" mode="heightFix" />
</view> </view>
<diy-icon class="icon" v-if="value.searchStyle == 2 && value.iconType == 'icon'" :icon="value.icon" <diy-icon class="icon" v-if="value.searchStyle == 2 && value.iconType == 'icon'" :icon="value.icon"
:value="value.style ? value.style : 'null'" :value="value.style ? value.style : 'null'"
:style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx' }"></diy-icon> :style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx' }"></diy-icon>
<view class="search-content" :style="inputStyle"> <view class="search-content" :style="inputStyle">
<input type="text" class="uni-input ns-font-size-base" maxlength="50" :placeholder="value.title" v-model="searchText" @confirm="handlerSearchClick" disabled="true" :placeholderStyle="placeholderStyle" /> <input type="text" class="uni-input ns-font-size-base" maxlength="50" :placeholder="value.title"
<text class="iconfont icon-sousuo3" @click.stop="handlerSearchClick" @tap="handlerSearchClick" :style="{ color: value.textColor ? value.textColor : 'rgba(0,0,0,0)' }"></text> v-model="searchText" @confirm="handlerSearchClick" disabled="true"
:placeholderStyle="placeholderStyle" />
<text class="iconfont icon-sousuo3" @click.stop="handlerSearchClick" @tap="handlerSearchClick"
:style="{ color: value.textColor ? value.textColor : 'rgba(0,0,0,0)' }"></text>
</view> </view>
</block> </block>
<block v-if="value.searchStyle == 3"> <block v-if="value.searchStyle == 3">
<view class="search-content" :style="inputStyle" @click.stop="handlerSearchClick" @tap="handlerSearchClick"> <view class="search-content" :style="inputStyle" @click.stop="handlerSearchClick"
<text class="iconfont icon-sousuo3" :style="{ color: value.textColor ? value.textColor : 'rgba(0,0,0,0)' }"></text> @tap="handlerSearchClick">
<input type="text" class="uni-input ns-font-size-base" maxlength="50" :placeholder="value.title" v-model="searchText" @confirm="handlerSearchClick" disabled="true" @click.stop="handlerSearchClick" @tap="handlerSearchClick" :placeholderStyle="placeholderStyle" /> <text class="iconfont icon-sousuo3"
<text class="search-content-btn" @click.stop="handlerSearchClick" @tap="handlerSearchClick" :style="{ 'backgroundColor': value.pageBgColor ? value.pageBgColor : 'rgba(0,0,0,0)' }">搜索</text> :style="{ color: value.textColor ? value.textColor : 'rgba(0,0,0,0)' }"></text>
<input type="text" class="uni-input ns-font-size-base" maxlength="50" :placeholder="value.title"
v-model="searchText" @confirm="handlerSearchClick" disabled="true"
@click.stop="handlerSearchClick" @tap="handlerSearchClick"
:placeholderStyle="placeholderStyle" />
<text class="search-content-btn" @click.stop="handlerSearchClick" @tap="handlerSearchClick"
:style="{ 'backgroundColor': value.pageBgColor ? value.pageBgColor : 'rgba(0,0,0,0)' }">搜索</text>
</view> </view>
<view class="img" v-if="value.iconType == 'img'" @click.stop="handlerRedirectToClick(value.searchLink)" @tap="handlerRedirectToClick(value.searchLink)"><image :src="$util.img(value.imageUrl)" mode="heightFix"/> <view class="img" v-if="value.iconType == 'img'"
@click.stop="handlerRedirectToClick(value.searchLink)"
@tap="handlerRedirectToClick(value.searchLink)">
<image :src="$util.img(value.imageUrl)" mode="heightFix" />
</view> </view>
<diy-icon class="icon" v-if="value.iconType == 'icon'" :icon="value.icon" <diy-icon class="icon" v-if="value.iconType == 'icon'" :icon="value.icon"
:value="value.style ? value.style : 'null'" :value="value.style ? value.style : 'null'"
:style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx' }" :style="{ maxWidth: 30 * 2 + 'rpx', maxHeight: 30 * 2 + 'rpx' }"
@click.stop="handlerRedirectToClick(value.searchLink)" @tap="handlerRedirectToClick(value.searchLink)"></diy-icon> @click.stop="handlerRedirectToClick(value.searchLink)"
@tap="handlerRedirectToClick(value.searchLink)"></diy-icon>
</block> </block>
</view> </view>
</view> </view>
<!-- 解决fixed定位后导航栏塌陷的问题 --> <!-- 解决fixed定位后导航栏塌陷的问题 -->
<view v-if="value.positionWay == 'fixed'" class="u-navbar-placeholder" :style="{ width: '100%', paddingTop: moduleHeight }"></view> <view v-if="value.positionWay == 'fixed'" class="u-navbar-placeholder"
:style="{ width: '100%', paddingTop: moduleHeight }"></view>
<ns-login ref="login"></ns-login> <ns-login ref="login"></ns-login>
</view> </view>
</template> </template>
<script> <script>
// 获取系统状态栏的高度 // 获取系统状态栏的高度
let systemInfo = uni.getSystemInfoSync(); let systemInfo = uni.getSystemInfoSync();
let menuButtonInfo = {}; let menuButtonInfo = {};
// 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容) // 如果是小程序,获取右上角胶囊的尺寸信息,避免导航栏右侧内容与胶囊重叠(支付宝小程序非本API尚未兼容)
// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ // #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ
menuButtonInfo = uni.getMenuButtonBoundingClientRect(); menuButtonInfo = uni.getMenuButtonBoundingClientRect();
// #endif // #endif
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
// 搜索 // 搜索
export default { export default {
name: 'diy-search', name: 'diy-search',
props: { props: {
value: { value: {
type: Object, type: Object,
default: () => { default: () => {
return {}; return {};
} }
},
topNavColor: String,
global: {
type: Object,
default: () => {
return {};
}
},
haveTopCategory: {
type: Boolean
},
followOfficialAccount: {
type: Object
},
}, },
data() { topNavColor: String,
return { global: {
searchText: '', type: Object,
menuButtonInfo: menuButtonInfo, default: () => {
height: 0, return {};
placeholderHeight: 0, }
moduleHeight: 0
};
}, },
mixins: [DiyMinx], haveTopCategory: {
computed: { type: Boolean
fixedCss() { },
var obj = ''; followOfficialAccount: {
if (this.value.positionWay == 'fixed') { type: Object
let top = this.fixedTop; },
// 固定定位 },
if (this.global.topNavBg) data() {
obj += 'background-color:' + (this.topNavColor == 'transparent' ? this.value.pageBgColor : this return {
.topNavColor) + ';'; searchText: '',
else menuButtonInfo: menuButtonInfo,
obj += 'background-color:' + this.value.pageBgColor + ';'; height: 0,
obj += 'top:' + top + ';'; placeholderHeight: 0,
obj += 'padding-top:' + this.value.margin.top * 2 + 'rpx;'; moduleHeight: 0
obj += 'padding-left:' + this.value.margin.both * 2 + 'rpx;'; };
obj += 'padding-right:' + this.value.margin.both * 2 + 'rpx;'; },
obj += 'padding-bottom:' + this.value.margin.bottom * 2 + 'rpx;'; mixins: [DiyMinx],
computed: {
fixedCss() {
var obj = '';
if (this.value.positionWay == 'fixed') {
let top = this.fixedTop;
// 固定定位
if (this.global.topNavBg)
obj += 'background-color:' + (this.topNavColor == 'transparent' ? this.value.pageBgColor : this
.topNavColor) + ';';
else
obj += 'background-color:' + this.value.pageBgColor + ';';
obj += 'top:' + top + ';';
obj += 'padding-top:' + this.value.margin.top * 2 + 'rpx;';
obj += 'padding-left:' + this.value.margin.both * 2 + 'rpx;';
obj += 'padding-right:' + this.value.margin.both * 2 + 'rpx;';
obj += 'padding-bottom:' + this.value.margin.bottom * 2 + 'rpx;';
} }
return obj; return obj;
}, },
searchWrapCss() { searchWrapCss() {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';'; obj += 'background-color:' + this.value.componentBgColor + ';';
obj += 'text-align:' + this.value.textAlign + ';'; obj += 'text-align:' + this.value.textAlign + ';';
return obj; return obj;
}, },
inputStyle() { inputStyle() {
var obj = ''; var obj = '';
obj += 'background-color:' + this.value.elementBgColor + ';'; obj += 'background-color:' + this.value.elementBgColor + ';';
if (this.value.borderType == 2) { if (this.value.borderType == 2) {
obj += 'border-radius:' + '40rpx;'; obj += 'border-radius:' + '40rpx;';
} }
return obj; return obj;
}, },
placeholderStyle() { placeholderStyle() {
var obj = ''; var obj = '';
if (this.value.textColor) { if (this.value.textColor) {
obj += 'color:' + this.value.textColor; obj += 'color:' + this.value.textColor;
} else {
obj += 'color: rgba(0,0,0,0)';
}
return obj;
},
fixedTop() {
let diyPositionObj = this.$store.state.diyGroupPositionObj;
let data = 0
if (diyPositionObj.diySearch && diyPositionObj.diyIndexPage && diyPositionObj.nsNavbar) {
if (diyPositionObj.diySearch.moduleIndex > diyPositionObj.diyIndexPage.moduleIndex) {
data = diyPositionObj.nsNavbar.originalVal + diyPositionObj.diyIndexPage.originalVal;
} else { } else {
obj += 'color: rgba(0,0,0,0)';
}
return obj;
},
fixedTop() {
let diyPositionObj = this.$store.state.diyGroupPositionObj;
let data = 0
if (diyPositionObj.diySearch && diyPositionObj.diyIndexPage && diyPositionObj.nsNavbar) {
if (diyPositionObj.diySearch.moduleIndex > diyPositionObj.diyIndexPage.moduleIndex) {
data = diyPositionObj.nsNavbar.originalVal + diyPositionObj.diyIndexPage.originalVal;
} else {
data = diyPositionObj.nsNavbar.originalVal;
}
} else if (diyPositionObj.diySearch && diyPositionObj.nsNavbar) {
data = diyPositionObj.nsNavbar.originalVal; data = diyPositionObj.nsNavbar.originalVal;
} }
} else if (diyPositionObj.diySearch && diyPositionObj.nsNavbar) {
data += 'px'; data = diyPositionObj.nsNavbar.originalVal;
return data;
} }
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
}
},
created() {
setTimeout(() => {
// 获取组件的高度默认高度为4545是在375屏幕上的高度
const query = uni.createSelectorQuery();
// #ifdef H5
let cssSelect = '.page-header .u-navbar';
// #endif
// #ifdef MP data += 'px';
let cssSelect = '.page-header >>> .u-navbar'; return data;
// #endif }
query },
.select(cssSelect) watch: {
.boundingClientRect(data => { // 组件刷新监听
if (this.global.navBarSwitch) { componentRefresh: function (nval) {
this.height = data ? data.height : 45; }
} else { },
this.height = data ? data.height : 0; created() {
} setTimeout(() => {
// 如果存在分类导航组件,则追加该组件的高度 // 获取组件的高度默认高度为4545是在375屏幕上的高度
if (this.haveTopCategory) { const query = uni.createSelectorQuery();
this.height += 49; // #ifdef H5
} let cssSelect = '.page-header .u-navbar';
}) // #endif
.exec();
}); // #ifdef MP
if (this.value.positionWay == 'fixed') this.navbarPlaceholderHeight(); let cssSelect = '.page-header >>> .u-navbar';
}, // #endif
mounted() { query
if (this.value.positionWay == 'fixed') .select(cssSelect)
this.setModuleLocationFn(); .boundingClientRect(data => {
}, if (this.global.navBarSwitch) {
methods: { this.height = data ? data.height : 45;
search() { } else {
this.$util.redirectTo('/pages_tool/goods/search'); this.height = data ? data.height : 0;
}, }
redirectTo(link) { // 如果存在分类导航组件,则追加该组件的高度
if (link.wap_url) { if (this.haveTopCategory) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) { this.height += 49;
this.$refs.login.open(link.wap_url);
return;
} }
}
this.$util.diyRedirectTo(link);
},
navbarPlaceholderHeight() {
let height = 0;
setTimeout(() => {
const query = uni.createSelectorQuery().in(this);
query.select('.diy-search-wrap')
.boundingClientRect(data => {
// 获取搜索框自身高度
this.placeholderHeight = data.height;
// 通过搜索框自身高度 - 定位模式下的多出的padding-bottom高度
if (this.placeholderHeight) this.placeholderHeight -= this.value.margin.bottom;
}).exec();
});
},
// 向vuex中的diyIndexPositionObj增加搜索组件定位位置
setModuleLocationFn() {
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this);
query.select('.diy-search-wrap')
.boundingClientRect(data => {
let diySearch = {
originalVal: data.height || 0, //自身高度 px
currVal: 0, //定位高度
moduleIndex: this.value.moduleIndex //组件在diy-group的位置
};
this.moduleHeight = (data.height || 0) + 'px';
this.$store.commit('setDiyGroupPositionObj', {
'diySearch': diySearch
});
}).exec();
}) })
}, .exec();
async handlerRedirectToClick(link) { });
await this.__$emitEvent({eventName: 'search-tap', data: link, promiseCallback: (event, handler, awaitedResult) => { if (this.value.positionWay == 'fixed') this.navbarPlaceholderHeight();
},
mounted() {
if (this.value.positionWay == 'fixed')
this.setModuleLocationFn();
},
methods: {
search() {
this.$util.redirectTo('/pages_tool/goods/search');
},
redirectTo(link) {
if (link.wap_url) {
if (this.$util.getCurrRoute() == 'pages/member/index' && !this.storeToken) {
this.$refs.login.open(link.wap_url);
return;
}
}
this.$util.diyRedirectTo(link);
},
navbarPlaceholderHeight() {
let height = 0;
setTimeout(() => {
const query = uni.createSelectorQuery().in(this);
query.select('.diy-search-wrap')
.boundingClientRect(data => {
// 获取搜索框自身高度
this.placeholderHeight = data.height;
// 通过搜索框自身高度 - 定位模式下的多出的padding-bottom高度
if (this.placeholderHeight) this.placeholderHeight -= this.value.margin.bottom;
}).exec();
});
},
// 向vuex中的diyIndexPositionObj增加搜索组件定位位置
setModuleLocationFn() {
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this);
query.select('.diy-search-wrap')
.boundingClientRect(data => {
let diySearch = {
originalVal: data.height || 0, //自身高度 px
currVal: 0, //定位高度
moduleIndex: this.value.moduleIndex //组件在diy-group的位置
};
this.moduleHeight = (data.height || 0) + 'px';
this.$store.commit('setDiyGroupPositionObj', {
'diySearch': diySearch
});
}).exec();
})
},
async handlerRedirectToClick(link) {
await this.__$emitEvent({
eventName: 'search-tap', data: link, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.redirectTo(link); this.redirectTo(link);
}}) }
}, })
async handlerSearchClick(item) { },
await this.__$emitEvent({eventName: 'search-tap', data: item, promiseCallback: (event, handler, awaitedResult) => { async handlerSearchClick(item) {
await this.__$emitEvent({
eventName: 'search-tap', data: item, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return; if (!awaitedResult) return;
this.search(); this.search();
}}) }
} })
} }
}; }
};
</script> </script>
<style lang="scss"> <style lang="scss">
/deep/ .uni-input-placeholder { /deep/ .uni-input-placeholder {
overflow: initial; overflow: initial;
}
.diy-search-wrap {
overflow: hidden;
}
.fixed {
position: fixed;
left: 0;
right: 0;
top: 0;
z-index: 991;
transition: background 0.3s;
}
.search-box {
position: relative;
display: flex;
align-items: center;
.img {
height: 60rpx;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
} }
.diy-search-wrap { .icon {
overflow: hidden; width: 170rpx;
height: 60rpx;
margin-right: 20rpx;
} }
}
.fixed { .search-box-3 {
position: fixed; .search-content {
left: 0;
right: 0;
top: 0;
z-index: 991;
transition: background 0.3s;
}
.search-box {
position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
height: 68rpx;
.img { .iconfont {
height: 60rpx; position: initial;
margin-right: 20rpx; transform: translateY(0);
image {
width: 100%;
height: 100%;
}
}
.icon {
width: 170rpx;
height: 60rpx;
margin-right: 20rpx;
}
}
.search-box-3 {
.search-content {
display: flex;
align-items: center;
height: 68rpx;
.iconfont {
position: initial;
transform: translateY(0);
width: auto;
margin-left: 26rpx;
margin-right: 12rpx;
font-size: $font-size-base;
line-height: 1;
}
.uni-input {
flex: 1;
padding-left: 0;
height: 68rpx;
}
.search-content-btn {
margin-right: 8rpx;
width: 116rpx;
height: 54rpx;
line-height: 54rpx;
text-align: center;
color: #fff;
border-radius: 30rpx;
}
}
.diy-icon {
margin-left: 20rpx;
margin-right: 0;
width: auto; width: auto;
font-size: 74rpx; margin-left: 26rpx;
margin-right: 12rpx;
font-size: $font-size-base;
line-height: 1;
} }
.img { .uni-input {
margin-left: 20rpx; flex: 1;
margin-right: 0; padding-left: 0;
height: 68rpx;
}
.search-content-btn {
margin-right: 8rpx;
width: 116rpx;
height: 54rpx;
line-height: 54rpx;
text-align: center;
color: #fff;
border-radius: 30rpx;
} }
} }
.search-content { .diy-icon {
flex: 1; margin-left: 20rpx;
margin-right: 0;
width: auto;
font-size: 74rpx;
} }
.search-content input { .img {
box-sizing: border-box; margin-left: 20rpx;
display: block; margin-right: 0;
height: 64rpx;
width: 100%;
padding: 0 20rpx 0 40rpx;
color: #333333;
background: none;
} }
}
.search-content .iconfont { .search-content {
position: absolute; flex: 1;
top: 50%; }
right: 4rpx;
transform: translateY(-50%); .search-content input {
font-size: 30rpx; box-sizing: border-box;
z-index: 10; display: block;
width: 80rpx; height: 64rpx;
font-weight: bold; width: 100%;
text-align: center; padding: 0 20rpx 0 40rpx;
} color: #333333;
background: none;
}
.search-content .iconfont {
position: absolute;
top: 50%;
right: 4rpx;
transform: translateY(-50%);
font-size: 30rpx;
z-index: 10;
width: 80rpx;
font-weight: bold;
text-align: center;
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -2,18 +2,26 @@
<x-skeleton data-component-name="diy-store-label" type="banner" :loading="loading" :configs="skeletonConfig"> <x-skeleton data-component-name="diy-store-label" type="banner" :loading="loading" :configs="skeletonConfig">
<view class="diy-store-label"> <view class="diy-store-label">
<block v-if="businessConfig.store_business == 'store'"> <block v-if="businessConfig.store_business == 'store'">
<scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true"> <scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]"
:style="storeLabelWrapCss" :enable-flex="true">
<view v-for="(item, index) in storeLabel" :key="index" :class="['item']"> <view v-for="(item, index) in storeLabel" :key="index" :class="['item']">
<diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon> <diy-icon v-if="value.icon" class="icon-box" :icon="value.icon"
<text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item }}</text> :value="value.style ? value.style : 'null'"></diy-icon>
<text class="label-name"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
item }}</text>
</view> </view>
</scroll-view> </scroll-view>
</block> </block>
<block v-else> <block v-else>
<scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]" :style="storeLabelWrapCss" :enable-flex="true"> <scroll-view scroll-x="true" :class="[value.contentStyle, { between: list.length == 3 }]"
:style="storeLabelWrapCss" :enable-flex="true">
<view v-for="(item, index) in list" :class="['item']"> <view v-for="(item, index) in list" :class="['item']">
<diy-icon v-if="value.icon" class="icon-box" :icon="value.icon" :value="value.style ? value.style : 'null'"></diy-icon> <diy-icon v-if="value.icon" class="icon-box" :icon="value.icon"
<text class="label-name" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ item.label_name }}</text> :value="value.style ? value.style : 'null'"></diy-icon>
<text class="label-name"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
item.label_name }}</text>
</view> </view>
</scroll-view> </scroll-view>
</block> </block>
@@ -21,150 +29,152 @@
</x-skeleton> </x-skeleton>
</template> </template>
<script> <script>
// 门店标签 // 门店标签
export default { import DiyMinx from './minx.js'
name: 'diy-store-label', export default {
props: { name: 'diy-store-label',
value: { props: {
type: Object value: {
} type: Object
},
data() {
return {
loading: true,
skeletonConfig: {
gridRows: 1,
gridRowsGap: '20rpx',
headHeight: '40rpx',
headBorderRadius: '0'
},
list: [],
notice: '',
storeLabel: [],
businessConfig: ""
};
},
created() {
this.getData();
this.getStoreConfig();
},
watch: {
// 组件刷新监听
componentRefresh: function(nval) {
this.getData();
}
},
computed: {
storeLabelWrapCss: function() {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
getData() {
var data = {
page: 1,
page_size: 0
};
if (this.value.sources == 'initial') {
data.page_size = this.value.count;
} else if (this.value.sources == 'diy') {
data.label_id_arr = this.value.labelIds.toString();
}
this.$api.sendRequest({
url: '/store/api/store/labelPage',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data.list;
}
this.loading = false;
}
});
},
getStoreConfig() {
this.$api.sendRequest({
url: '/store/api/config/config',
success: res => {
if (res.code >= 0) {
this.businessConfig = res.data.business_config;
if (res.data.business_config.store_business == "store") {
this.getStoreInfo();
}
}
}
});
},
getStoreInfo() {
this.$api.sendRequest({
url: '/api/store/info',
success: res => {
if (res.data) {
let label_arr = res.data.label_name.split(",");
let label_count = 3;
if (this.value.sources == 'initial') label_count = this.value.count;
for (let i = 0; i < label_arr.length; i++) {
if (this.storeLabel.length < label_count && label_arr[i] != '') {
this.storeLabel.push(label_arr[i])
}
}
}
}
});
},
} }
}; },
mixins: [DiyMinx],
data() {
return {
loading: true,
skeletonConfig: {
gridRows: 1,
gridRowsGap: '20rpx',
headHeight: '40rpx',
headBorderRadius: '0'
},
list: [],
notice: '',
storeLabel: [],
businessConfig: ""
};
},
created() {
this.getData();
this.getStoreConfig();
},
watch: {
// 组件刷新监听
componentRefresh: function (nval) {
this.getData();
}
},
computed: {
storeLabelWrapCss: function () {
var obj = '';
obj += 'background-color:' + this.value.componentBgColor + ';';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
getData() {
var data = {
page: 1,
page_size: 0
};
if (this.value.sources == 'initial') {
data.page_size = this.value.count;
} else if (this.value.sources == 'diy') {
data.label_id_arr = this.value.labelIds.toString();
}
this.$api.sendRequest({
url: '/store/api/store/labelPage',
data: data,
success: res => {
if (res.code == 0 && res.data) {
this.list = res.data.list;
}
this.loading = false;
}
});
},
getStoreConfig() {
this.$api.sendRequest({
url: '/store/api/config/config',
success: res => {
if (res.code >= 0) {
this.businessConfig = res.data.business_config;
if (res.data.business_config.store_business == "store") {
this.getStoreInfo();
}
}
}
});
},
getStoreInfo() {
this.$api.sendRequest({
url: '/api/store/info',
success: res => {
if (res.data) {
let label_arr = res.data.label_name.split(",");
let label_count = 3;
if (this.value.sources == 'initial') label_count = this.value.count;
for (let i = 0; i < label_arr.length; i++) {
if (this.storeLabel.length < label_count && label_arr[i] != '') {
this.storeLabel.push(label_arr[i])
}
}
}
}
});
},
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
.diy-store-label { .diy-store-label {
.style-1 { .style-1 {
display: flex;
align-items: baseline;
/deep/ .uni-scroll-view-content {
display: flex; display: flex;
align-items: baseline; align-items: center;
}
/deep/ .uni-scroll-view-content { &.between {
display: flex; justify-content: space-between;
align-items: center;
}
&.between { /deep/.uni-scroll-view-content {
justify-content: space-between; justify-content: space-between;
}
}
/deep/.uni-scroll-view-content { .item {
justify-content: space-between; flex-shrink: 0;
} display: flex;
align-items: center;
padding-right: 20rpx;
.icon-box {
font-size: 50rpx;
width: 40rpx;
height: 40rpx;
margin-right: 10rpx;
margin-top: 2rpx;
} }
.item { .label-name {
flex-shrink: 0; line-height: 40rpx;
display: flex; }
align-items: center;
padding-right: 20rpx;
.icon-box { &:last-of-type {
font-size: 50rpx; padding-right: 0;
width: 40rpx;
height: 40rpx;
margin-right: 10rpx;
margin-top: 2rpx;
}
.label-name {
line-height: 40rpx;
}
&:last-of-type {
padding-right: 0;
}
} }
} }
} }
}
</style> </style>

View File

@@ -15,12 +15,14 @@
</view> </view>
<view class="address-wrap" :style="{ color: value.textColor }"> <view class="address-wrap" :style="{ color: value.textColor }">
<text class="iconfont icon-dizhi"></text> <text class="iconfont icon-dizhi"></text>
<text v-if="globalStoreInfo && globalStoreInfo.store_id" @click="mapRoute" class="address">{{ globalStoreInfo.show_address }}</text> <text v-if="globalStoreInfo && globalStoreInfo.store_id" @click="mapRoute" class="address">{{
globalStoreInfo.show_address }}</text>
<text v-else>获取当前位置...</text> <text v-else>获取当前位置...</text>
</view> </view>
</view> </view>
<view class="store-image" @click="selectStore()"> <view class="store-image" @click="selectStore()">
<image :src="$util.img(globalStoreInfo.store_image)" v-if="globalStoreInfo && globalStoreInfo.store_image" mode="aspectFill"></image> <image :src="$util.img(globalStoreInfo.store_image)"
v-if="globalStoreInfo && globalStoreInfo.store_image" mode="aspectFill"></image>
<image :src="$util.getDefaultImage().store" v-else mode="aspectFill"></image> <image :src="$util.getDefaultImage().store" v-else mode="aspectFill"></image>
</view> </view>
</view> </view>
@@ -30,7 +32,8 @@
<view class="store-box store-three" @click="toStoreList()"> <view class="store-box store-three" @click="toStoreList()">
<view class="store-info"> <view class="store-info">
<view class="store-image" @click="selectStore()"> <view class="store-image" @click="selectStore()">
<image :src="$util.img(globalStoreInfo.store_image)" v-if="globalStoreInfo && globalStoreInfo.store_image" mode="aspectFill"></image> <image :src="$util.img(globalStoreInfo.store_image)"
v-if="globalStoreInfo && globalStoreInfo.store_image" mode="aspectFill"></image>
<image :src="$util.getDefaultImage().store" v-else mode="aspectFill"></image> <image :src="$util.getDefaultImage().store" v-else mode="aspectFill"></image>
</view> </view>
<view class="info-box" :style="{ color: value.textColor }"> <view class="info-box" :style="{ color: value.textColor }">
@@ -44,7 +47,8 @@
<text class="title" v-else>定位中...</text> <text class="title" v-else>定位中...</text>
</view> </view>
</view> </view>
<view class="store-icon" @click.stop="search()"><text class="iconfont icon-sousuo3" :style="{ color: value.textColor }"></text></view> <view class="store-icon" @click.stop="search()"><text class="iconfont icon-sousuo3"
:style="{ color: value.textColor }"></text></view>
</view> </view>
</block> </block>
@@ -59,7 +63,8 @@
<text class="title" v-else>定位中...</text> <text class="title" v-else>定位中...</text>
</view> </view>
<view class="store-right-search"> <view class="store-right-search">
<input type="text" class="uni-input font-size-tag" disabled placeholder="商品搜索" @click.stop="search()" /> <input type="text" class="uni-input font-size-tag" disabled placeholder="商品搜索"
@click.stop="search()" />
<text class="iconfont icon-sousuo3" @click.stop="search()"></text> <text class="iconfont icon-sousuo3" @click.stop="search()"></text>
</view> </view>
</view> </view>
@@ -70,6 +75,7 @@
<script> <script>
// 门店展示 // 门店展示
import Map from '@/common/js/map/openMap.js'; import Map from '@/common/js/map/openMap.js';
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-store', name: 'diy-store',
props: { props: {
@@ -77,15 +83,16 @@ export default {
type: Object type: Object
} }
}, },
mixins: [DiyMinx],
data() { data() {
return {}; return {};
}, },
computed: {}, computed: {},
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
created() {}, created() { },
methods: { methods: {
//跳转至门店列表 //跳转至门店列表
toStoreList() { toStoreList() {
@@ -117,6 +124,7 @@ export default {
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.store-info { .store-info {
height: 100rpx; height: 100rpx;
display: flex; display: flex;
@@ -151,6 +159,7 @@ export default {
font-size: $font-size-goods-tag; font-size: $font-size-goods-tag;
} }
} }
.address-wrap { .address-wrap {
line-height: 1.2; line-height: 1.2;
font-size: $font-size-goods-tag; font-size: $font-size-goods-tag;
@@ -193,17 +202,21 @@ export default {
align-self: flex-start; align-self: flex-start;
margin-right: 14rpx; margin-right: 14rpx;
} }
.info-box { .info-box {
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.store-info { .store-info {
height: 106rpx; height: 106rpx;
} }
.switchover { .switchover {
display: flex; display: flex;
width: 120rpx; width: 120rpx;
} }
} }
.store-three { .store-three {
.store-info { .store-info {
height: auto; height: auto;
@@ -211,10 +224,12 @@ export default {
flex-direction: inherit; flex-direction: inherit;
align-items: center; align-items: center;
} }
.info-box { .info-box {
margin-left: 18rpx; margin-left: 18rpx;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.store-icon text { .store-icon text {
font-size: 36rpx; font-size: 36rpx;
color: #fff; color: #fff;
@@ -228,6 +243,7 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
line-height: 1; line-height: 1;
.icon-weizhi { .icon-weizhi {
margin-right: 6rpx; margin-right: 6rpx;
font-size: 28rpx; font-size: 28rpx;

View File

@@ -1,17 +1,21 @@
<template> <template>
<view data-component-name="diy-text" class="diy-text" @click="handlerClick(value.link)" @tap="handlerClick(value.link)" :style="warpCss"> <view data-component-name="diy-text" class="diy-text" @click="handlerClick(value.link)"
<view :class="value.style == 'style-8' ? 'title2' : 'title'" :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor }"> @tap="handlerClick(value.link)" :style="warpCss">
<view :class="value.style == 'style-8' ? 'title2' : 'title'"
:style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor }">
<block v-if="value.style == 'style-0'" style="height: 40rpx; line-height: 40rpx;"> <block v-if="value.style == 'style-0'" style="height: 40rpx; line-height: 40rpx;">
<text :style="{ fontWeight: value.fontWeight}">{{ value.text }}</text> <text :style="{ fontWeight: value.fontWeight }">{{ value.text }}</text>
</block> </block>
<block v-if="value.style == 'style-1'" style="height: 40rpx; line-height: 40rpx;"> <block v-if="value.style == 'style-1'" style="height: 40rpx; line-height: 40rpx;">
<view class="text-left" :style="{ color: value.textColor}"><text></text></view> <view class="text-left" :style="{ color: value.textColor }"><text></text></view>
<text :style="{ fontWeight: value.fontWeight}">{{ value.text }}</text> <text :style="{ fontWeight: value.fontWeight }">{{ value.text }}</text>
<view class="text-right" :style="{ color: value.textColor}"><text></text></view> <view class="text-right" :style="{ color: value.textColor }"><text></text></view>
</block> </block>
<block v-else-if="value.style == 'style-2'"> <block v-else-if="value.style == 'style-2'">
<view class="style2"> <view class="style2">
<text :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{ value.text }}</text> <text
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="xian" :style="{ background: value.textColor }"> <view class="xian" :style="{ background: value.textColor }">
<view class="line-triangle" :style="{ borderColor: value.textColor }"></view> <view class="line-triangle" :style="{ borderColor: value.textColor }"></view>
</view> </view>
@@ -19,13 +23,19 @@
</block> </block>
<block v-else-if="value.style == 'style-3'"> <block v-else-if="value.style == 'style-3'">
<view class="style3"> <view class="style3">
<text :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx' ,fontWeight: value.fontWeight}">{{ value.text }}</text> <text
<view class="inner-line" :style="{ background: value.textColor }"><view class="line-short" :style="{ background: value.textColor }"></view></view> :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="inner-line" :style="{ background: value.textColor }">
<view class="line-short" :style="{ background: value.textColor }"></view>
</view>
</view> </view>
</block> </block>
<block v-else-if="value.style == 'style-4'"> <block v-else-if="value.style == 'style-4'">
<view class="style4"> <view class="style4">
<text :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx',fontWeight: value.fontWeight }">{{ value.text }}</text> <text
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="line-box"> <view class="line-box">
<view class="line-left" :style="{ background: value.textColor }"></view> <view class="line-left" :style="{ background: value.textColor }"></view>
<view class="line-center" :style="{ borderColor: value.textColor }"></view> <view class="line-center" :style="{ borderColor: value.textColor }"></view>
@@ -36,7 +46,9 @@
<block v-else-if="value.style == 'style-5'"> <block v-else-if="value.style == 'style-5'">
<view class="style5"> <view class="style5">
<view class="style5-box" :style="{ color: value.textColor }"> <view class="style5-box" :style="{ color: value.textColor }">
<text class="style5-title" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx' ,fontWeight: value.fontWeight}">{{ value.text }}</text> <text class="style5-title"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="line-left" :style="{ background: value.textColor }"></view> <view class="line-left" :style="{ background: value.textColor }"></view>
<view class="line-right" :style="{ background: value.textColor }"></view> <view class="line-right" :style="{ background: value.textColor }"></view>
</view> </view>
@@ -45,7 +57,9 @@
<block v-else-if="value.style == 'style-6'"> <block v-else-if="value.style == 'style-6'">
<view class="style6"> <view class="style6">
<view class="style6-box" :style="{ color: value.textColor }"> <view class="style6-box" :style="{ color: value.textColor }">
<text class="style6-title" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx',fontWeight: value.fontWeight }">{{ value.text }}</text> <text class="style6-title"
:style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="style6-wrap" :style="{ color: value.textColor }"></view> <view class="style6-wrap" :style="{ color: value.textColor }"></view>
</view> </view>
</view> </view>
@@ -53,7 +67,9 @@
<block v-else-if="value.style == 'style-7'"> <block v-else-if="value.style == 'style-7'">
<view class="style7"> <view class="style7">
<view class="style7-box" :style="{ color: value.textColor }"> <view class="style7-box" :style="{ color: value.textColor }">
<text class="style7-title" :style="{ background: value.textColor, fontSize: value.fontSize * 2 + 'rpx',fontWeight: value.fontWeight }">{{ value.text }}</text> <text class="style7-title"
:style="{ background: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="style7-wrap" :style="{ color: value.textColor }"></view> <view class="style7-wrap" :style="{ color: value.textColor }"></view>
</view> </view>
</view> </view>
@@ -61,8 +77,11 @@
<block v-else-if="value.style == 'style-8'"> <block v-else-if="value.style == 'style-8'">
<view class="style8"> <view class="style8">
<view class="style8-box" :style="{ color: value.textColor }"> <view class="style8-box" :style="{ color: value.textColor }">
<text class="style8-title" :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx',fontWeight: value.fontWeight }">{{ value.text }}</text> <text class="style8-title"
<view class="style8-wrap" :style="{ background: value.textColor, height: value.fontSize * 2 + 'rpx' }"></view> :style="{ color: value.textColor, fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">{{
value.text }}</text>
<view class="style8-wrap"
:style="{ background: value.textColor, height: value.fontSize * 2 + 'rpx' }"></view>
</view> </view>
</view> </view>
</block> </block>
@@ -70,17 +89,24 @@
<view class="style9"> <view class="style9">
<view class="style9-box"> <view class="style9-box">
<view class="style9-center"> <view class="style9-center">
<view class="left-img"><image :src="$util.img('public/uniapp/diy/style9-1.png')"/></view> <view class="left-img">
<text class="style9-title" :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }"> <image :src="$util.img('public/uniapp/diy/style9-1.png')" />
</view>
<text class="style9-title"
:style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }">
{{ value.text }} {{ value.text }}
</text> </text>
<view class="right-img"><image :src="$util.img('public/uniapp/diy/style9-2.png')"/></view> <view class="right-img">
<view class="style9-more" v-if="value.more.isShow" :style="{ color: value.more.color }" @click.stop="handlerClick(value.more.link)" @tap="handlerClick(value.more.link)"> <image :src="$util.img('public/uniapp/diy/style9-2.png')" />
</view>
<view class="style9-more" v-if="value.more.isShow" :style="{ color: value.more.color }"
@click.stop="handlerClick(value.more.link)" @tap="handlerClick(value.more.link)">
{{ value.more.text }} {{ value.more.text }}
<view class="iconfont icon-right" :style="{ color: value.more.color }"></view> <view class="iconfont icon-right" :style="{ color: value.more.color }"></view>
</view> </view>
</view> </view>
<text class="sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text }}</text> <text class="sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text
}}</text>
</view> </view>
</view> </view>
</block> </block>
@@ -88,29 +114,31 @@
<view class="style10"> <view class="style10">
<view class="style10-box"> <view class="style10-box">
<view class="style10-center"> <view class="style10-center">
<view class="left-img"><image :src="$util.img('public/uniapp/diy/style10-1.png')"></image></view> <view class="left-img">
<text <image :src="$util.img('public/uniapp/diy/style10-1.png')"></image>
class="style10-title" </view>
v-if="$util.img('public/uniapp/diy/style10-3.png')" <text class="style10-title" v-if="$util.img('public/uniapp/diy/style10-3.png')" :style="{
:style="{ backgroundImage: 'url(' + $util.img('public/uniapp/diy/style10-3.png') + ')',
backgroundImage: 'url(' + $util.img('public/uniapp/diy/style10-3.png') + ')', backgroundSize: 100 + '%',
backgroundSize: 100 + '%', backgroundPositionY: 93 + '%',
backgroundPositionY: 93 + '%', backgroundRepeat: 'no-repeat',
backgroundRepeat: 'no-repeat', fontSize: value.fontSize * 2 + 'rpx',
fontSize: value.fontSize * 2 + 'rpx', color: value.textColor,
color: value.textColor, fontWeight: value.fontWeight
fontWeight: value.fontWeight }">
}"
>
{{ value.text }} {{ value.text }}
</text> </text>
<view class="right-img"><image :src="$util.img('public/uniapp/diy/style10-2.png')"></image></view> <view class="right-img">
<view class="style10-more" v-if="value.more.isShow" :style="{ color: value.more.color }" @click.stop="handlerClick(value.more.link)" @tap="handlerClick(value.more.link)"> <image :src="$util.img('public/uniapp/diy/style10-2.png')"></image>
</view>
<view class="style10-more" v-if="value.more.isShow" :style="{ color: value.more.color }"
@click.stop="handlerClick(value.more.link)" @tap="handlerClick(value.more.link)">
{{ value.more.text }} {{ value.more.text }}
<view class="iconfont icon-right" :style="{ color: value.more.color }"></view> <view class="iconfont icon-right" :style="{ color: value.more.color }"></view>
</view> </view>
</view> </view>
<text class="sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text }}</text> <text class="sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text
}}</text>
</view> </view>
</view> </view>
</block> </block>
@@ -120,56 +148,55 @@
<view class="style11-conter"> <view class="style11-conter">
<view class="style11-conter-box"> <view class="style11-conter-box">
<view class="left"> <view class="left">
<view class="style11-title" <view class="style11-title" :style="{
:style="{ fontSize: value.fontSize * 2 + 'rpx',
fontSize: value.fontSize * 2 + 'rpx', color: value.textColor,
color: value.textColor, fontWeight: value.fontWeight
fontWeight: value.fontWeight }">
}"
>
{{ value.text }} {{ value.text }}
</view> </view>
<view class="style11-sub" :style="{ color: value.subTitle.color }">{{ value.subTitle.text }}</view> <view class="style11-sub" :style="{ color: value.subTitle.color }">{{
value.subTitle.text }}</view>
</view> </view>
<view class="style11-more" v-if="value.more.isShow" :style="{ color: value.more.color }" @click.stop="$util.diyRedirectTo(value.more.link)"> <view class="style11-more" v-if="value.more.isShow" :style="{ color: value.more.color }"
@click.stop="$util.diyRedirectTo(value.more.link)">
{{ value.more.text }} {{ value.more.text }}
<view class="iconfont icon-right" :style="{ color: value.more.color }"></view> <view class="iconfont icon-right" :style="{ color: value.more.color }"></view>
</view> </view>
<image class="center-img" :src="$util.img('public/uniapp/diy/style11-1.png')" mode="widthFix"></image> <image class="center-img" :src="$util.img('public/uniapp/diy/style11-1.png')"
mode="widthFix"></image>
<image class="right-img" :src="$util.img('public/uniapp/diy/style11-2.png')" mode="widthFix"></image> <image class="right-img" :src="$util.img('public/uniapp/diy/style11-2.png')"
mode="widthFix"></image>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</block> </block>
<view class="style12" v-if="value.style == 'style-12'"> <view class="style12" v-if="value.style == 'style-12'">
<view class="style12-title" <view class="style12-title" :style="{
:style="{ fontSize: value.fontSize * 2 + 'rpx',
fontSize: value.fontSize * 2 + 'rpx', color: value.textColor,
color: value.textColor, fontWeight: value.fontWeight
fontWeight: value.fontWeight }">
}"
>
{{ value.text }} {{ value.text }}
</view> </view>
<text class="style12-sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text }}</text> <text class="style12-sub-title" :style="{ color: value.subTitle.color }">{{ value.subTitle.text
<view class="style12-more" v-if="value.more.isShow" :style="{ color: value.more.color }" @click.stop="$util.diyRedirectTo(value.more.link)"> }}</text>
<view class="style12-more" v-if="value.more.isShow" :style="{ color: value.more.color }"
@click.stop="$util.diyRedirectTo(value.more.link)">
<text>{{ value.more.text }}</text> <text>{{ value.more.text }}</text>
<view class="iconfont icon-right" :style="{ color: value.more.color }"></view> <view class="iconfont icon-right" :style="{ color: value.more.color }"></view>
</view> </view>
</view> </view>
<view class="style13" v-else-if="value.style == 'style-13'"> <view class="style13" v-else-if="value.style == 'style-13'">
<image class="left-img" :src="$util.img('public/uniapp/diy/style13-1.png')" mode="widthFix"></image> <image class="left-img" :src="$util.img('public/uniapp/diy/style13-1.png')" mode="widthFix"></image>
<view <view class="style13-title" :style="{
class="style13-title" fontSize: value.fontSize * 2 + 'rpx',
:style="{ color: value.textColor,
fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight
color: value.textColor, }">
fontWeight: value.fontWeight
}"
>
{{ value.text }} {{ value.text }}
</view> </view>
<image class="right-img" :src="$util.img('public/uniapp/diy/style13-1.png')" mode="widthFix"></image> <image class="right-img" :src="$util.img('public/uniapp/diy/style13-1.png')" mode="widthFix"></image>
@@ -177,19 +204,21 @@
<view class="style14" v-else-if="value.style == 'style-14'"> <view class="style14" v-else-if="value.style == 'style-14'">
<view class="title-wrap"> <view class="title-wrap">
<view class="text"> <view class="text">
<text :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }"> <text
:style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }">
{{ value.text }} {{ value.text }}
</text> </text>
<text class="zone" :style="{ fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">专区</text> <text class="zone"
:style="{ fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight }">专区</text>
</view> </view>
<text class="iconfont icon-danxuan-xuanzhong" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="iconfont icon-danxuan-xuanzhong"
<text class="iconfont icon-danxuan-xuanzhong" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="iconfont icon-danxuan-xuanzhong" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="iconfont icon-danxuan-xuanzhong"
<view :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
class="sub-title" <text class="iconfont icon-danxuan-xuanzhong"
v-show="value.subTitle.text" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
:style="{ fontSize: value.subTitle.fontSize * 2 + 'rpx', color: value.subTitle.color }" <view class="sub-title" v-show="value.subTitle.text"
> :style="{ fontSize: value.subTitle.fontSize * 2 + 'rpx', color: value.subTitle.color }">
{{ value.subTitle.text }} {{ value.subTitle.text }}
</view> </view>
</view> </view>
@@ -206,48 +235,50 @@
<text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="my"> <text class="my">
<text class="yuan" :style="{ backgroundColor: value.textColor, fontWeight: value.fontWeight }"></text> <text class="yuan"
<text class="vertical" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> :style="{ backgroundColor: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="vertical"
:style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
</text> </text>
</view> </view>
<text :style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }"> <text
:style="{ fontSize: value.fontSize * 2 + 'rpx', color: value.textColor, fontWeight: value.fontWeight }">
{{ value.text }} {{ value.text }}
</text> </text>
<view class="ornament" style="margin-left: 40rpx;"> <view class="ornament" style="margin-left: 40rpx;">
<text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> <text class="line" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="my"> <text class="my">
<text class="yuan" :style="{ backgroundColor: value.textColor, fontWeight: value.fontWeight }"></text> <text class="yuan"
<text class="vertical" :style="{ color: value.textColor, fontWeight: value.fontWeight }"></text> :style="{ backgroundColor: value.textColor, fontWeight: value.fontWeight }"></text>
<text class="vertical"
:style="{ color: value.textColor, fontWeight: value.fontWeight }"></text>
</text> </text>
</view> </view>
</view> </view>
<view <view class="sub-title" v-show="value.subTitle.text"
class="sub-title" :style="{ fontSize: value.subTitle.fontSize * 2 + 'rpx', color: value.subTitle.color }">
v-show="value.subTitle.text"
:style="{ fontSize: value.subTitle.fontSize * 2 + 'rpx', color: value.subTitle.color }"
>
{{ value.subTitle.text }} {{ value.subTitle.text }}
</view> </view>
</view> </view>
<!-- 图十六 --> <!-- 图十六 -->
<view class="style16" v-if="value.style == 'style-16'"> <view class="style16" v-if="value.style == 'style-16'">
<view <view class="style16-title" :style="{
class="style16-title" fontSize: value.fontSize * 2 + 'rpx',
:style="{ color: value.textColor,
fontSize: value.fontSize * 2 + 'rpx', fontWeight: value.fontWeight
color: value.textColor, }">
fontWeight: value.fontWeight
}"
>
{{ value.text }} {{ value.text }}
</view> </view>
<view class="style16-sub-title" v-show="value.subTitle.text" :style="{ color: value.subTitle.color, backgroundColor: value.subTitle.bgColor }"> <view class="style16-sub-title" v-show="value.subTitle.text"
<text :class="['js-icon', value.subTitle.icon]" :style="{ backgroundColor: value.subTitle.bgColor }"></text> :style="{ color: value.subTitle.color, backgroundColor: value.subTitle.bgColor }">
<text :class="['js-icon', value.subTitle.icon]"
:style="{ backgroundColor: value.subTitle.bgColor }"></text>
<text :style="{ fontWeight: value.subTitle.fontWeight }">{{ value.subTitle.text }}</text> <text :style="{ fontWeight: value.subTitle.fontWeight }">{{ value.subTitle.text }}</text>
</view> </view>
<view class="style16-more" v-if="value.more.isShow" :style="{ color: value.more.color }" @click.stop="$util.diyRedirectTo(value.more.link)"> <view class="style16-more" v-if="value.more.isShow" :style="{ color: value.more.color }"
@click.stop="$util.diyRedirectTo(value.more.link)">
<text>{{ value.more.text }}</text> <text>{{ value.more.text }}</text>
<view class="iconfont icon-right" :style="{ color: value.more.color }"></view> <view class="iconfont icon-right" :style="{ color: value.more.color }"></view>
</view> </view>
@@ -269,11 +300,11 @@ export default {
data() { data() {
return {}; return {};
}, },
created() {}, created() { },
mixins: [DiyMinx], mixins: [DiyMinx],
watch: { watch: {
// 组件刷新监听 // 组件刷新监听
componentRefresh: function(nval) {} componentRefresh: function (nval) { }
}, },
computed: { computed: {
warpCss() { warpCss() {
@@ -290,10 +321,12 @@ export default {
}, },
methods: { methods: {
async handlerClick(link) { async handlerClick(link) {
await this.__$emitEvent({eventName: 'text-tap', data: link, promiseCallback: (event, handler, awaitedResult) => { await this.__$emitEvent({
if (!awaitedResult) return; eventName: 'text-tap', data: link, promiseCallback: (event, handler, awaitedResult) => {
$util.diyRedirectTo(link); if (!awaitedResult) return;
}}) $util.diyRedirectTo(link);
}
})
} }
} }
}; };
@@ -323,7 +356,7 @@ export default {
width: 100%; width: 100%;
} }
.diy-text .title > text { .diy-text .title>text {
padding: 0 15rpx; padding: 0 15rpx;
} }
@@ -541,9 +574,11 @@ export default {
.style8-box { .style8-box {
text-align: left !important; text-align: left !important;
.style8-title{
.style8-title {
margin-left: 20rpx; margin-left: 20rpx;
} }
.style8-wrap { .style8-wrap {
height: 100%; height: 100%;
position: absolute; position: absolute;
@@ -821,7 +856,8 @@ export default {
font-size: 24rpx; font-size: 24rpx;
margin-right: 8rpx; margin-right: 8rpx;
} }
.iconfont{
.iconfont {
font-size: 24rpx; font-size: 24rpx;
} }
} }
@@ -849,6 +885,7 @@ export default {
transform: rotateY(180deg); transform: rotateY(180deg);
} }
} }
.style14 { .style14 {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -856,28 +893,36 @@ export default {
align-items: center; align-items: center;
flex: 1; flex: 1;
padding: 0 20rpx; padding: 0 20rpx;
text { text {
padding: 0 !important; padding: 0 !important;
} }
.title-wrap { .title-wrap {
.text { .text {
display: inline-block; display: inline-block;
} }
.iconfont { .iconfont {
font-size: 24rpx; font-size: 24rpx;
&:nth-of-type(1) { &:nth-of-type(1) {
margin-left: 20rpx; margin-left: 20rpx;
} }
&:nth-of-type(2) { &:nth-of-type(2) {
opacity: 0.6; opacity: 0.6;
} }
&:nth-of-type(3) { &:nth-of-type(3) {
opacity: 0.4; opacity: 0.4;
} }
} }
.sub-title { .sub-title {
opacity: 0.6; opacity: 0.6;
} }
.more { .more {
text:first-child { text:first-child {
font-size: 28rpx; font-size: 28rpx;
@@ -885,20 +930,25 @@ export default {
} }
} }
} }
.style15 { .style15 {
flex: 1; flex: 1;
text { text {
padding: 0 !important; padding: 0 !important;
line-height: 1; line-height: 1;
} }
.title-wrap { .title-wrap {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.ornament { .ornament {
display: flex; display: flex;
align-items: flex-end; align-items: flex-end;
.line { .line {
border-left: 8rpx solid; border-left: 8rpx solid;
transform: rotate(40deg); transform: rotate(40deg);
@@ -906,6 +956,7 @@ export default {
height: 28rpx; height: 28rpx;
display: block; display: block;
margin-right: 12rpx; margin-right: 12rpx;
&:nth-of-type(2) { &:nth-of-type(2) {
height: 40rpx; height: 40rpx;
margin-right: 10rpx; margin-right: 10rpx;
@@ -913,11 +964,13 @@ export default {
top: 4rpx; top: 4rpx;
} }
} }
.my { .my {
transform: rotate(40deg); transform: rotate(40deg);
line-height: 0; line-height: 0;
position: relative; position: relative;
top: 4rpx; top: 4rpx;
.yuan { .yuan {
font-size: 100rpx; font-size: 100rpx;
border-radius: 50%; border-radius: 50%;
@@ -925,6 +978,7 @@ export default {
height: 8rpx; height: 8rpx;
display: block; display: block;
} }
.vertical { .vertical {
border-left: 8rpx solid; border-left: 8rpx solid;
height: 20rpx; height: 20rpx;
@@ -934,27 +988,32 @@ export default {
} }
} }
} }
.sub-title { .sub-title {
opacity: 0.6; opacity: 0.6;
text-align: center; text-align: center;
} }
} }
.style16 { .style16 {
display: flex; display: flex;
align-items: center; align-items: center;
width: 100%; width: 100%;
padding: 20rpx; padding: 20rpx;
.style16-more { .style16-more {
display: flex; display: flex;
align-items: center; align-items: center;
margin-left: auto; margin-left: auto;
& > text {
&>text {
max-width: 200rpx; max-width: 200rpx;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
} }
} }
.style16-title { .style16-title {
text-align: left; text-align: left;
max-width: 200rpx; max-width: 200rpx;
@@ -962,6 +1021,7 @@ export default {
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
} }
.style16-sub-title { .style16-sub-title {
margin-left: 20rpx; margin-left: 20rpx;
text-align: left; text-align: left;
@@ -976,7 +1036,8 @@ export default {
align-items: center; align-items: center;
padding: 0 20rpx; padding: 0 20rpx;
position: relative; position: relative;
&> .js-icon {
&>.js-icon {
padding: 8rpx; padding: 8rpx;
background-image: radial-gradient(transparent 30%, #fff); background-image: radial-gradient(transparent 30%, #fff);
border-radius: 50%; border-radius: 50%;

View File

@@ -1,98 +1,61 @@
<template> <template>
<view :style="componentStyle"> <view :style="componentStyle">
<!-- 固定布局模式 --> <!-- 固定布局模式 -->
<view v-if="value.showStyle == 'fixed'" :class="['goods-list', 'row1-of' + value.rowCount]" style="padding:20rpx;"> <view v-if="value.showStyle == 'fixed'" :class="['goods-list', 'row1-of' + value.rowCount]"
<view style="padding:20rpx;">
v-for="(item, index) in value.list" <view v-for="(item, index) in value.list" :key="index" class="goods-item" @tap="showVideo(item)">
:key="index"
class="goods-item"
@tap="showVideo(item)"
>
<view class="goods-img-wrap"> <view class="goods-img-wrap">
<image <image class="goods-img" style="border-radius:10rpx 10rpx 0 0;" :src="$util.img(item.imageUrl)"
class="goods-img" mode="widthFix" @error="imgError(index)"></image>
style="border-radius:10rpx 10rpx 0 0;"
:src="$util.img(item.imageUrl)"
mode="widthFix"
@error="imgError(index)"
></image>
<view style="position:absolute;top:10rpx;right:10rpx;"> <view style="position:absolute;top:10rpx;right:10rpx;">
<image style="width:30rpx;" :src="$util.img('addon/personnel/shop/view/enterprise/play.png')" mode="widthFix"></image> <image style="width:30rpx;" :src="$util.img('addon/personnel/shop/view/enterprise/play.png')"
mode="widthFix"></image>
</view> </view>
</view> </view>
<view class="info-wrap"> <view class="info-wrap">
<view <view class="goods-name" :style="{
class="goods-name" 'font-size': (value.font.size * 2 + 'rpx') + ';',
:style="{ 'font-weight': value.font.weight + ';',
'font-size': (value.font.size * 2 + 'rpx') + ';', 'color': value.font.color + ';'
'font-weight': value.font.weight + ';', }">{{ item.title }}</view>
'color': value.font.color + ';'
}"
>{{ item.title }}</view>
</view> </view>
</view> </view>
</view> </view>
<!-- 其他布局模式 --> <!-- 其他布局模式 -->
<scroll-view <scroll-view v-else :class="['video-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
v-else :scroll-x="value.showStyle == 'singleSlide'">
:class="['video-nav', value.showStyle == 'fixed' ? 'fixed-layout' : value.showStyle]"
:scroll-x="value.showStyle == 'singleSlide'"
>
<view class="uni-scroll-view-content"> <view class="uni-scroll-view-content">
<view <view v-for="(item, index) in value.list" :key="index" :class="['video-nav-item', value.mode]"
v-for="(item, index) in value.list" :style="{ width: (100 / value.rowCount + '%') + ';' }" @tap="showVideo(item)">
:key="index"
:class="['video-nav-item', value.mode]"
:style="{ width: (100 / value.rowCount + '%') + ';' }"
@tap="showVideo(item)"
>
<view class="video-img"> <view class="video-img">
<image <image v-if="item.iconType == 'img'" :style="{
v-if="item.iconType == 'img'" 'max-width': '200rpx;',
:style="{ 'max-height': '200rpx;',
'max-width': '200rpx;', 'border-radius': '8rpx;'
'max-height': '200rpx;', }" :src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')" mode="widthFix"
'border-radius': '8rpx;' :show-menu-by-longpress="true"></image>
}"
:src="$util.img(item.imageUrl) || $util.img('public/uniapp/default_img/goods.png')"
mode="widthFix"
:show-menu-by-longpress="true"
></image>
<view style="position:absolute;top:10rpx;right:10rpx;"> <view style="position:absolute;top:10rpx;right:10rpx;">
<image style="width:30rpx;" :src="$util.img('addon/personnel/shop/view/enterprise/play.png')" mode="widthFix"></image> <image style="width:30rpx;"
:src="$util.img('addon/personnel/shop/view/enterprise/play.png')" mode="widthFix">
</image>
</view> </view>
</view> </view>
<view <view class="video-text" :style="{
class="video-text" 'margin-left': '16rpx;',
:style="{ 'font-size': (value.font.size * 2 + 'rpx') + ';',
'margin-left': '16rpx;', 'font-weight': value.font.weight + ';',
'font-size': (value.font.size * 2 + 'rpx') + ';', 'color': value.font.color + ';'
'font-weight': value.font.weight + ';', }">{{ item.title }}</view>
'color': value.font.color + ';'
}"
>{{ item.title }}</view>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<!-- 视频播放弹窗 --> <!-- 视频播放弹窗 -->
<uni-popup <uni-popup ref="videoPopup" type="center" style="background:transparent;width:100%;height:100%;">
ref="videoPopup"
type="center"
style="background:transparent;width:100%;height:100%;"
>
<view class="video-container" style="position:fixed;top:30%;width:100%;left:0;"> <view class="video-container" style="position:fixed;top:30%;width:100%;left:0;">
<video <video class="adaptive-video" :autoPauseIfNavigate="true" :autoPauseIfOpenNative="true"
class="adaptive-video" :autoplay="false" :enableAutoRotation="true" id="myVideo" :src="video_url" :controls="true"></video>
:autoPauseIfNavigate="true"
:autoPauseIfOpenNative="true"
:autoplay="false"
:enableAutoRotation="true"
id="myVideo"
:src="video_url"
:controls="true"
></video>
</view> </view>
</uni-popup> </uni-popup>
</view> </view>
@@ -100,7 +63,7 @@
<script> <script>
import uniPopup from '@/components/uni-popup/uni-popup.vue' import uniPopup from '@/components/uni-popup/uni-popup.vue'
import DiyMinx from './minx.js'
export default { export default {
name: 'diy-video-list', name: 'diy-video-list',
components: { components: {
@@ -112,6 +75,7 @@ export default {
default: () => ({}) default: () => ({})
} }
}, },
mixins: [DiyMinx],
data() { data() {
return { return {
pageWidth: '', pageWidth: '',
@@ -164,7 +128,7 @@ export default {
isIndicatorDots() { isIndicatorDots() {
return this.value.carousel.type != 'hide' && return this.value.carousel.type != 'hide' &&
1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount)); 1 != Math.ceil(this.value.list.length / (this.value.pageCount * this.value.rowCount));
} }
}, },
methods: { methods: {
@@ -207,7 +171,9 @@ export default {
width: calc(33.33% - 15rpx); width: calc(33.33% - 15rpx);
} }
&:nth-of-type(1), &:nth-of-type(2), &:nth-of-type(3) { &:nth-of-type(1),
&:nth-of-type(2),
&:nth-of-type(3) {
margin-top: 0; margin-top: 0;
} }
@@ -223,7 +189,9 @@ export default {
&.shadow { &.shadow {
width: calc(33.3333333% - 18rpx); width: calc(33.3333333% - 18rpx);
&:nth-of-type(1), &:nth-of-type(2), &:nth-of-type(3) { &:nth-of-type(1),
&:nth-of-type(2),
&:nth-of-type(3) {
margin-top: 8rpx; margin-top: 8rpx;
} }
@@ -370,7 +338,8 @@ export default {
margin-right: 0 !important; margin-right: 0 !important;
} }
&:nth-of-type(1), &:nth-of-type(2) { &:nth-of-type(1),
&:nth-of-type(2) {
margin-top: 0; margin-top: 0;
} }
@@ -385,7 +354,8 @@ export default {
margin-right: 8rpx !important; margin-right: 8rpx !important;
} }
&:nth-of-type(1), &:nth-of-type(2) { &:nth-of-type(1),
&:nth-of-type(2) {
margin-top: 8rpx; margin-top: 8rpx;
} }
} }

View File

@@ -1,54 +1,58 @@
<template> <template>
<video data-component-name="diy-video" class="diy-video" :src="$util.img(value.videoUrl)" :poster="$util.img(value.imageUrl)" :style="videoWarpCss" objectFit="cover" @click="handlerClick(value.videoUrl)" @tap="handlerClick(value.videoUrl)"></video> <video data-component-name="diy-video" class="diy-video" :src="$util.img(value.videoUrl)"
:poster="$util.img(value.imageUrl)" :style="videoWarpCss" objectFit="cover"
@click="handlerClick(value.videoUrl)" @tap="handlerClick(value.videoUrl)"></video>
</template> </template>
<script> <script>
// 视频 // 视频
import DiyMinx from './minx.js' import DiyMinx from './minx.js'
export default { export default {
name: 'diy-video', name: 'diy-video',
props: { props: {
value: { value: {
type: Object type: Object
}
},
data() {
return {};
},
created() {},
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function(nval) {}
},
computed: {
videoWarpCss: function() {
var obj = '';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
async handlerClick(videoUrl) {
await this.__$emitEvent({eventName: 'video-tap', data: videoUrl, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
}})
}
} }
}; },
data() {
return {};
},
created() { },
mixins: [DiyMinx],
watch: {
// 组件刷新监听
componentRefresh: function (nval) { }
},
computed: {
videoWarpCss: function () {
var obj = '';
if (this.value.componentAngle == 'round') {
obj += 'border-top-left-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-top-right-radius:' + this.value.topAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-left-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
obj += 'border-bottom-right-radius:' + this.value.bottomAroundRadius * 2 + 'rpx;';
}
return obj;
}
},
methods: {
async handlerClick(videoUrl) {
await this.__$emitEvent({
eventName: 'video-tap', data: videoUrl, promiseCallback: (event, handler, awaitedResult) => {
if (!awaitedResult) return;
}
})
}
}
};
</script> </script>
<style scoped> <style scoped>
video { video {
width: 100%; width: 100%;
} }
.diy-video>>>.uni-video-container { .diy-video>>>.uni-video-container {
background-color: transparent; background-color: transparent;
} }
</style> </style>