Merge branch 'develop' of https://gitee.com/yudaocode/yudao-mall-uniapp
# Conflicts: # pages/activity/point/list.vuepull/127/head
commit
29a5024468
|
|
@ -8,7 +8,7 @@
|
||||||
:scroll-with-animation="false"
|
:scroll-with-animation="false"
|
||||||
:enable-back-to-top="true"
|
:enable-back-to-top="true"
|
||||||
>
|
>
|
||||||
<s-point-card ref="sPointCardRef" class="ss-p-x-20 ss-m-t-20"/>
|
<s-point-card ref="sPointCardRef" class="ss-p-x-20 ss-m-t-20" />
|
||||||
<s-empty
|
<s-empty
|
||||||
v-if="activityTotal === 0"
|
v-if="activityTotal === 0"
|
||||||
icon="/static/goods-empty.png"
|
icon="/static/goods-empty.png"
|
||||||
|
|
|
||||||
|
|
@ -62,13 +62,14 @@
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 签到说明 TODO @芋艿:【签到】这里改成【已累计签到】;改版,接入 sheepjs -->
|
<!-- 签到说明 TODO @科举:这里改成【已累计签到】 -->
|
||||||
<view class="bg-white ss-m-t-16 ss-p-t-30 ss-p-b-60 ss-p-x-40">
|
<view class="bg-white ss-m-t-16 ss-p-t-30 ss-p-b-60 ss-p-x-40">
|
||||||
<view class="activity-title ss-m-b-30">签到说明</view>
|
<view class="activity-title ss-m-b-30">签到说明</view>
|
||||||
<view class="activity-des">1、已累计签到{{state.signInfo.totalDay}}天</view>
|
<view class="activity-des">1.已累计签到{{ state.signInfo.totalDay }}天</view>
|
||||||
<view class="activity-des">
|
<view class="activity-des">
|
||||||
2、据说连续签到第 {{ state.maxDay }} 天可获得超额积分,一定要坚持签到哦~~~
|
2.据说连续签到第 {{ state.maxDay }} 天可获得超额积分,要坚持签到哦~~
|
||||||
</view>
|
</view>
|
||||||
|
<view class="activity-des"> 3.积分可以在购物时抵现金结算的哦 ~~</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
|
@ -347,8 +348,7 @@
|
||||||
.title {
|
.title {
|
||||||
font-size: 34rpx;
|
font-size: 34rpx;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
// color: var(--ui-BG-Main);
|
color: var(--ui-BG-Main-TC);
|
||||||
color: #ff6000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
|
|
@ -410,12 +410,10 @@
|
||||||
background-color: #f4b409;
|
background-color: #f4b409;
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
font-size: 20rpx;
|
font-size: 20rpx;
|
||||||
color: #a57d3f;
|
color: var(--ui-BG-Main-TC);
|
||||||
line-height: 32rpx;
|
line-height: 32rpx;
|
||||||
}
|
text-align: center;
|
||||||
|
padding: 2rpx;
|
||||||
.venusSelect {
|
|
||||||
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYWFmYjU3Mi03MGJhLTRiNDctOTI2Yi0zOThlZDkzZDkxMDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzkwRkI4NEFEMDFCMTFFODhDNDdBMDVGOTBBN0U2NTQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzkwRkI4NDlEMDFCMTFFODhDNDdBMDVGOTBBN0U2NTQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ZmRjNTM0MmUtNmFkOC1iMDRhLThjZTEtMjk2YWYzM2FkMmUxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjBhYWZiNTcyLTcwYmEtNGI0Ny05MjZiLTM5OGVkOTNkOTEwOSIv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');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.venus {
|
.venus {
|
||||||
|
|
@ -424,7 +422,11 @@
|
||||||
background-size: 100% 100%;
|
background-size: 100% 100%;
|
||||||
width: 56rpx;
|
width: 56rpx;
|
||||||
height: 56rpx;
|
height: 56rpx;
|
||||||
margin: 10rpx 0;
|
margin: 10rpx auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.venusSelect {
|
||||||
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowYWFmYjU3Mi03MGJhLTRiNDctOTI2Yi0zOThlZDkzZDkxMDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzkwRkI4NEFEMDFCMTFFODhDNDdBMDVGOTBBN0U2NTQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzkwRkI4NDlEMDFCMTFFODhDNDdBMDVGOTBBN0U2NTQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ZmRjNTM0MmUtNmFkOC1iMDRhLThjZTEtMjk2YWYzM2FkMmUxIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjBhYWZiNTcyLTcwYmEtNGI0Ny05MjZiLTM5OGVkOTNkOTEwOSIv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');
|
||||||
}
|
}
|
||||||
|
|
||||||
.num {
|
.num {
|
||||||
|
|
@ -435,7 +437,7 @@
|
||||||
.item {
|
.item {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
border-bottom: 1px solid #eee;
|
flex-direction: column;
|
||||||
height: 130rpx;
|
height: 130rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -446,6 +448,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.on {
|
.on {
|
||||||
background-color: #999 !important;
|
color: #f4b409;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,35 @@
|
||||||
<template>
|
<template>
|
||||||
<!-- 聊天虚拟列表 -->
|
<!-- 聊天虚拟列表 -->
|
||||||
<z-paging ref="pagingRef" v-model="messageList" use-chat-record-mode use-virtual-list
|
<z-paging
|
||||||
cell-height-mode="dynamic" default-page-size="20" :auto-clean-list-when-reload="false"
|
ref="pagingRef"
|
||||||
safe-area-inset-bottom bottom-bg-color="#f8f8f8" :back-to-top-style="backToTopStyle"
|
v-model="messageList"
|
||||||
:auto-show-back-to-top="showNewMessageTip" @backToTopClick="onBackToTopClick"
|
use-chat-record-mode
|
||||||
@scrolltoupper="onScrollToUpper" @query="queryList">
|
use-virtual-list
|
||||||
|
cell-height-mode="dynamic"
|
||||||
|
default-page-size="20"
|
||||||
|
:auto-clean-list-when-reload="false"
|
||||||
|
safe-area-inset-bottom
|
||||||
|
bottom-bg-color="#f8f8f8"
|
||||||
|
:back-to-top-style="backToTopStyle"
|
||||||
|
:auto-show-back-to-top="showNewMessageTip"
|
||||||
|
@backToTopClick="onBackToTopClick"
|
||||||
|
@scrolltoupper="onScrollToUpper"
|
||||||
|
@query="queryList"
|
||||||
|
>
|
||||||
<template #top>
|
<template #top>
|
||||||
<!-- 撑一下顶部导航 -->
|
<!-- 撑一下顶部导航 -->
|
||||||
<view :style="{ height: sys_navBar + 'px' }"></view>
|
<view :style="{ height: sys_navBar + 'px' }"></view>
|
||||||
</template>
|
</template>
|
||||||
<!-- style="transform: scaleY(-1)"必须写,否则会导致列表倒置!!! -->
|
<!-- style="transform: scaleY(-1)"必须写,否则会导致列表倒置!!! -->
|
||||||
<!-- 注意不要直接在chat-item组件标签上设置style,因为在微信小程序中是无效的,请包一层view -->
|
<!-- 注意不要直接在chat-item组件标签上设置style,因为在微信小程序中是无效的,请包一层view -->
|
||||||
<template #cell="{item,index}">
|
<template #cell="{ item, index }">
|
||||||
<view style="transform: scaleY(-1)">
|
<view style="transform: scaleY(-1)">
|
||||||
<!-- 消息渲染 -->
|
<!-- 消息渲染 -->
|
||||||
<MessageListItem :message="item" :message-index="index" :message-list="messageList"></MessageListItem>
|
<MessageListItem
|
||||||
|
:message="item"
|
||||||
|
:message-index="index"
|
||||||
|
:message-list="messageList"
|
||||||
|
></MessageListItem>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<!-- 底部聊天输入框 -->
|
<!-- 底部聊天输入框 -->
|
||||||
|
|
@ -34,49 +49,79 @@
|
||||||
import KeFuApi from '@/sheep/api/promotion/kefu';
|
import KeFuApi from '@/sheep/api/promotion/kefu';
|
||||||
import { isEmpty } from '@/sheep/helper/utils';
|
import { isEmpty } from '@/sheep/helper/utils';
|
||||||
import sheep from '@/sheep';
|
import sheep from '@/sheep';
|
||||||
|
import { formatDate } from '@/sheep/util';
|
||||||
|
|
||||||
const sys_navBar = sheep.$platform.navbar;
|
const sys_navBar = sheep.$platform.navbar;
|
||||||
const messageList = ref([]); // 消息列表
|
const messageList = ref([]); // 消息列表
|
||||||
const showNewMessageTip = ref(false); // 显示有新消息提示
|
const showNewMessageTip = ref(false); // 显示有新消息提示
|
||||||
|
const refreshMessage = ref(false); // 更新消息列表
|
||||||
const backToTopStyle = reactive({
|
const backToTopStyle = reactive({
|
||||||
'width': '100px',
|
width: '100px',
|
||||||
'background-color': '#fff',
|
'background-color': '#fff',
|
||||||
'border-radius': '30px',
|
'border-radius': '30px',
|
||||||
'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.1)',
|
'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.1)',
|
||||||
'display': 'flex',
|
display: 'flex',
|
||||||
'justifyContent': 'center',
|
justifyContent: 'center',
|
||||||
'alignItems': 'center',
|
alignItems: 'center',
|
||||||
}); // 返回顶部样式
|
}); // 返回顶部样式
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
pageNo: 1,
|
no: 1, // 查询次数,只用于触底计算
|
||||||
pageSize: 10,
|
limit: 20,
|
||||||
|
createTime: undefined,
|
||||||
});
|
});
|
||||||
const pagingRef = ref(null); // 虚拟列表
|
const pagingRef = ref(null); // 虚拟列表
|
||||||
const queryList = async (pageNo, pageSize) => {
|
const queryList = async (no, limit) => {
|
||||||
// 组件加载时会自动触发此方法,因此默认页面加载时会自动触发,无需手动调用
|
// 组件加载时会自动触发此方法,因此默认页面加载时会自动触发,无需手动调用
|
||||||
// 这里的pageNo和pageSize会自动计算好,直接传给服务器即可
|
queryParams.no = no;
|
||||||
queryParams.pageNo = pageNo;
|
queryParams.limit = limit;
|
||||||
queryParams.pageSize = pageSize;
|
|
||||||
await getMessageList();
|
await getMessageList();
|
||||||
};
|
};
|
||||||
// 获得消息分页列表
|
// 获得消息分页列表
|
||||||
const getMessageList = async () => {
|
const getMessageList = async () => {
|
||||||
const { data } = await KeFuApi.getKefuMessagePage(queryParams);
|
const { data } = await KeFuApi.getKefuMessageList(queryParams);
|
||||||
if (isEmpty(data.list)) {
|
if (isEmpty(data)) {
|
||||||
|
pagingRef.value.completeByNoMore([], true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pagingRef.value.completeByTotal(data.list, data.total);
|
if (queryParams.no > 1 && refreshMessage.value) {
|
||||||
|
const newMessageList = [];
|
||||||
|
for (const message of data) {
|
||||||
|
if (messageList.value.some((val) => val.id === message.id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
newMessageList.push(message);
|
||||||
|
}
|
||||||
|
// 新消息追加到开头
|
||||||
|
messageList.value = [...newMessageList, ...messageList.value];
|
||||||
|
pagingRef.value.updateCache(); // 更新缓存
|
||||||
|
refreshMessage.value = false; // 更新好后重置状态
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data.slice(-1).length > 0) {
|
||||||
|
// 设置最后一次历史查询的最后一条消息的 createTime
|
||||||
|
queryParams.createTime = formatDate(data.slice(-1)[0].createTime);
|
||||||
|
}
|
||||||
|
pagingRef.value.completeByNoMore(data, false);
|
||||||
};
|
};
|
||||||
/** 刷新消息列表 */
|
/** 刷新消息列表 */
|
||||||
const refreshMessageList = (message = undefined) => {
|
const refreshMessageList = async (message = undefined) => {
|
||||||
if (message !== undefined) {
|
if (typeof message !== 'undefined') {
|
||||||
showNewMessageTip.value = true;
|
|
||||||
// 追加数据
|
// 追加数据
|
||||||
pagingRef.value.addChatRecordData([message], false);
|
pagingRef.value.addChatRecordData([message], false);
|
||||||
return;
|
} else {
|
||||||
|
queryParams.createTime = undefined;
|
||||||
|
refreshMessage.value = true;
|
||||||
|
await getMessageList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 若已是第一页则不做处理
|
||||||
|
if (queryParams.no > 1) {
|
||||||
|
showNewMessageTip.value = true;
|
||||||
|
} else {
|
||||||
|
onScrollToUpper();
|
||||||
}
|
}
|
||||||
pagingRef.value.reload();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 滚动到最新消息 */
|
/** 滚动到最新消息 */
|
||||||
const onBackToTopClick = (event) => {
|
const onBackToTopClick = (event) => {
|
||||||
event(false); // 禁用默认操作
|
event(false); // 禁用默认操作
|
||||||
|
|
@ -85,7 +130,7 @@
|
||||||
/** 监听滚动到底部事件(因为 scroll 翻转了顶就是底) */
|
/** 监听滚动到底部事件(因为 scroll 翻转了顶就是底) */
|
||||||
const onScrollToUpper = () => {
|
const onScrollToUpper = () => {
|
||||||
// 若已是第一页则不做处理
|
// 若已是第一页则不做处理
|
||||||
if (queryParams.pageNo === 1) {
|
if (queryParams.no === 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showNewMessageTip.value = false;
|
showNewMessageTip.value = false;
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
<!-- 内容 -->
|
<!-- 内容 -->
|
||||||
<template v-if="message.contentType === KeFuMessageContentTypeEnum.TEXT">
|
<template v-if="message.contentType === KeFuMessageContentTypeEnum.TEXT">
|
||||||
<view class="message-box" :class="{ admin: message.senderType === UserTypeEnum.ADMIN }">
|
<view class="message-box" :class="{ admin: message.senderType === UserTypeEnum.ADMIN }">
|
||||||
<mp-html :content="replaceEmoji(message.content)" />
|
<mp-html :content="replaceEmoji(getMessageContent(message).text || message.content)" />
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="message.contentType === KeFuMessageContentTypeEnum.IMAGE">
|
<template v-if="message.contentType === KeFuMessageContentTypeEnum.IMAGE">
|
||||||
|
|
@ -58,9 +58,9 @@
|
||||||
<su-image
|
<su-image
|
||||||
class="message-img"
|
class="message-img"
|
||||||
isPreview
|
isPreview
|
||||||
:previewList="[sheep.$url.cdn(message.content)]"
|
:previewList="[sheep.$url.cdn(getMessageContent(message).picUrl || message.content)]"
|
||||||
:current="0"
|
:current="0"
|
||||||
:src="sheep.$url.cdn(message.content)"
|
:src="sheep.$url.cdn(getMessageContent(message).picUrl || message.content)"
|
||||||
:height="200"
|
:height="200"
|
||||||
:width="200"
|
:width="200"
|
||||||
mode="aspectFill"
|
mode="aspectFill"
|
||||||
|
|
@ -68,10 +68,12 @@
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="message.contentType === KeFuMessageContentTypeEnum.PRODUCT">
|
<template v-if="message.contentType === KeFuMessageContentTypeEnum.PRODUCT">
|
||||||
|
<div class="ss-m-b-10">
|
||||||
<GoodsItem
|
<GoodsItem
|
||||||
:goodsData="getMessageContent(message)"
|
:goodsData="getMessageContent(message)"
|
||||||
@tap="sheep.$router.go('/pages/goods/index', { id: getMessageContent(message).spuId })"
|
@tap="sheep.$router.go('/pages/goods/index', { id: getMessageContent(message).spuId })"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="message.contentType === KeFuMessageContentTypeEnum.ORDER">
|
<template v-if="message.contentType === KeFuMessageContentTypeEnum.ORDER">
|
||||||
<OrderItem
|
<OrderItem
|
||||||
|
|
@ -84,7 +86,7 @@
|
||||||
v-if="message.senderType === UserTypeEnum.MEMBER"
|
v-if="message.senderType === UserTypeEnum.MEMBER"
|
||||||
class="chat-avatar ss-m-l-24"
|
class="chat-avatar ss-m-l-24"
|
||||||
:src="
|
:src="
|
||||||
sheep.$url.cdn(message.senderAvatar) ||
|
sheep.$url.cdn(userInfo.avatar) ||
|
||||||
sheep.$url.static('/static/img/shop/chat/default.png')
|
sheep.$url.static('/static/img/shop/chat/default.png')
|
||||||
"
|
"
|
||||||
mode="aspectFill"
|
mode="aspectFill"
|
||||||
|
|
@ -101,7 +103,7 @@
|
||||||
import { KeFuMessageContentTypeEnum, UserTypeEnum } from '@/pages/chat/util/constants';
|
import { KeFuMessageContentTypeEnum, UserTypeEnum } from '@/pages/chat/util/constants';
|
||||||
import { emojiList } from '@/pages/chat/util/emoji';
|
import { emojiList } from '@/pages/chat/util/emoji';
|
||||||
import sheep from '@/sheep';
|
import sheep from '@/sheep';
|
||||||
import { formatDate } from '@/sheep/util';
|
import { formatDate, jsonParse } from '@/sheep/util';
|
||||||
import GoodsItem from '@/pages/chat/components/goods.vue';
|
import GoodsItem from '@/pages/chat/components/goods.vue';
|
||||||
import OrderItem from '@/pages/chat/components/order.vue';
|
import OrderItem from '@/pages/chat/components/order.vue';
|
||||||
|
|
||||||
|
|
@ -122,7 +124,9 @@
|
||||||
default: () => [],
|
default: () => [],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const getMessageContent = computed(() => (item) => JSON.parse(item.content)); // 解析消息内容
|
|
||||||
|
const getMessageContent = computed(() => (item) => jsonParse(item.content)); // 解析消息内容
|
||||||
|
const userInfo = computed(() => sheep.$store('user').userInfo);
|
||||||
|
|
||||||
//======================= 工具 =======================
|
//======================= 工具 =======================
|
||||||
|
|
||||||
|
|
@ -145,7 +149,7 @@
|
||||||
let emojiFile = selEmojiFile(item);
|
let emojiFile = selEmojiFile(item);
|
||||||
newData = newData.replace(
|
newData = newData.replace(
|
||||||
item,
|
item,
|
||||||
`<img class="chat-img" style="width: 24px;height: 24px;margin: 0 3px;" src="${sheep.$url.cdn(
|
`<img class="chat-img" style="width: 24px;height: 24px;margin: 0 3px;vertical-align: middle;" src="${sheep.$url.cdn(
|
||||||
'/static/img/chat/emoji/' + emojiFile,
|
'/static/img/chat/emoji/' + emojiFile,
|
||||||
)}"/>`,
|
)}"/>`,
|
||||||
);
|
);
|
||||||
|
|
@ -167,7 +171,7 @@
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.message-item {
|
.message-item {
|
||||||
margin-bottom: 33rpx;
|
margin-bottom: 10rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.date-message,
|
.date-message,
|
||||||
|
|
@ -231,18 +235,23 @@
|
||||||
.message-box {
|
.message-box {
|
||||||
max-width: 50%;
|
max-width: 50%;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 20px;
|
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
padding: 20rpx;
|
padding: 20rpx;
|
||||||
border-radius: 10rpx;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
|
background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient));
|
||||||
|
margin-top: 18px;
|
||||||
|
margin-bottom: 9px;
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-bottom-right-radius: 10px;
|
||||||
|
border-bottom-left-radius: 10px;
|
||||||
&.admin {
|
&.admin {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
color: #333;
|
color: #333;
|
||||||
|
margin-top: 18px;
|
||||||
|
margin-bottom: 9px;
|
||||||
|
border-radius: 0 10px 10px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:deep() {
|
:deep() {
|
||||||
|
|
@ -270,30 +279,6 @@
|
||||||
border-radius: 6rpx;
|
border-radius: 6rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.template-wrap {
|
|
||||||
// width: 100%;
|
|
||||||
padding: 20rpx 24rpx;
|
|
||||||
background: #fff;
|
|
||||||
border-radius: 10rpx;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 26rpx;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #333;
|
|
||||||
margin-bottom: 29rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item {
|
|
||||||
font-size: 24rpx;
|
|
||||||
color: var(--ui-BG-Main);
|
|
||||||
margin-bottom: 16rpx;
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.error-img {
|
.error-img {
|
||||||
width: 400rpx;
|
width: 400rpx;
|
||||||
height: 400rpx;
|
height: 400rpx;
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,35 @@
|
||||||
<template>
|
<template>
|
||||||
<s-layout class="chat-wrap" :title="!isReconnecting ? '连接客服成功' : '会话重连中'" navbar="inner">
|
<s-layout
|
||||||
|
class="chat-wrap"
|
||||||
|
:title="!isReconnecting ? '连接客服成功' : '会话重连中'"
|
||||||
|
navbar="inner"
|
||||||
|
>
|
||||||
<!-- 覆盖头部导航栏背景颜色 -->
|
<!-- 覆盖头部导航栏背景颜色 -->
|
||||||
<div class="page-bg" :style="{ height: sys_navBar + 'px' }"></div>
|
<div class="page-bg" :style="{ height: sys_navBar + 'px' }"></div>
|
||||||
<!-- 聊天区域 -->
|
<!-- 聊天区域 -->
|
||||||
<MessageList ref="messageListRef">
|
<MessageList ref="messageListRef">
|
||||||
<template #bottom>
|
<template #bottom>
|
||||||
<message-input v-model="chat.msg" @on-tools="onTools" @send-message="onSendMessage"></message-input>
|
<message-input
|
||||||
|
v-model="chat.msg"
|
||||||
|
@on-tools="onTools"
|
||||||
|
@send-message="onSendMessage"
|
||||||
|
></message-input>
|
||||||
</template>
|
</template>
|
||||||
</MessageList>
|
</MessageList>
|
||||||
<!-- 聊天工具 -->
|
<!-- 聊天工具 -->
|
||||||
<tools-popup :show-tools="chat.showTools" :tools-mode="chat.toolsMode" @close="handleToolsClose"
|
<tools-popup
|
||||||
@on-emoji="onEmoji" @image-select="onSelect" @on-show-select="onShowSelect">
|
:show-tools="chat.showTools"
|
||||||
<message-input v-model="chat.msg" @on-tools="onTools" @send-message="onSendMessage"></message-input>
|
:tools-mode="chat.toolsMode"
|
||||||
|
@close="handleToolsClose"
|
||||||
|
@on-emoji="onEmoji"
|
||||||
|
@image-select="onSelect"
|
||||||
|
@on-show-select="onShowSelect"
|
||||||
|
>
|
||||||
|
<message-input
|
||||||
|
v-model="chat.msg"
|
||||||
|
@on-tools="onTools"
|
||||||
|
@send-message="onSendMessage"
|
||||||
|
></message-input>
|
||||||
</tools-popup>
|
</tools-popup>
|
||||||
<!-- 商品订单选择 -->
|
<!-- 商品订单选择 -->
|
||||||
<SelectPopup
|
<SelectPopup
|
||||||
|
|
@ -30,10 +48,14 @@
|
||||||
import ToolsPopup from '@/pages/chat/components/toolsPopup.vue';
|
import ToolsPopup from '@/pages/chat/components/toolsPopup.vue';
|
||||||
import MessageInput from '@/pages/chat/components/messageInput.vue';
|
import MessageInput from '@/pages/chat/components/messageInput.vue';
|
||||||
import SelectPopup from '@/pages/chat/components/select-popup.vue';
|
import SelectPopup from '@/pages/chat/components/select-popup.vue';
|
||||||
import { KeFuMessageContentTypeEnum, WebSocketMessageTypeConstants } from '@/pages/chat/util/constants';
|
import {
|
||||||
|
KeFuMessageContentTypeEnum,
|
||||||
|
WebSocketMessageTypeConstants,
|
||||||
|
} from '@/pages/chat/util/constants';
|
||||||
import FileApi from '@/sheep/api/infra/file';
|
import FileApi from '@/sheep/api/infra/file';
|
||||||
import KeFuApi from '@/sheep/api/promotion/kefu';
|
import KeFuApi from '@/sheep/api/promotion/kefu';
|
||||||
import { useWebSocket } from '@/sheep/hooks/useWebSocket';
|
import { useWebSocket } from '@/sheep/hooks/useWebSocket';
|
||||||
|
import { jsonParse } from '@/sheep/util';
|
||||||
|
|
||||||
const sys_navBar = sheep.$platform.navbar;
|
const sys_navBar = sheep.$platform.navbar;
|
||||||
|
|
||||||
|
|
@ -52,7 +74,7 @@
|
||||||
try {
|
try {
|
||||||
const data = {
|
const data = {
|
||||||
contentType: KeFuMessageContentTypeEnum.TEXT,
|
contentType: KeFuMessageContentTypeEnum.TEXT,
|
||||||
content: chat.msg,
|
content: JSON.stringify({ text: chat.msg }),
|
||||||
};
|
};
|
||||||
await KeFuApi.sendKefuMessage(data);
|
await KeFuApi.sendKefuMessage(data);
|
||||||
await messageListRef.value.refreshMessageList();
|
await messageListRef.value.refreshMessageList();
|
||||||
|
|
@ -104,7 +126,7 @@
|
||||||
const res = await FileApi.uploadFile(data.tempFiles[0].path);
|
const res = await FileApi.uploadFile(data.tempFiles[0].path);
|
||||||
msg = {
|
msg = {
|
||||||
contentType: KeFuMessageContentTypeEnum.IMAGE,
|
contentType: KeFuMessageContentTypeEnum.IMAGE,
|
||||||
content: res.data,
|
content: JSON.stringify({ picUrl: res.data }),
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case 'goods':
|
case 'goods':
|
||||||
|
|
@ -134,19 +156,18 @@
|
||||||
//======================= 聊天工具相关 end =======================
|
//======================= 聊天工具相关 end =======================
|
||||||
const { options } = useWebSocket({
|
const { options } = useWebSocket({
|
||||||
// 连接成功
|
// 连接成功
|
||||||
onConnected: async () => {
|
onConnected: async () => {},
|
||||||
},
|
|
||||||
// 收到消息
|
// 收到消息
|
||||||
onMessage: async (data) => {
|
onMessage: async (data) => {
|
||||||
const type = data.type;
|
const type = data.type;
|
||||||
if (!type) {
|
if (!type) {
|
||||||
console.error('未知的消息类型:' + data.value);
|
console.error('未知的消息类型:' + data);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 2.2 消息类型:KEFU_MESSAGE_TYPE
|
// 2.2 消息类型:KEFU_MESSAGE_TYPE
|
||||||
if (type === WebSocketMessageTypeConstants.KEFU_MESSAGE_TYPE) {
|
if (type === WebSocketMessageTypeConstants.KEFU_MESSAGE_TYPE) {
|
||||||
// 刷新消息列表
|
// 刷新消息列表
|
||||||
await messageListRef.value.refreshMessageList(JSON.parse(data.content));
|
await messageListRef.value.refreshMessageList(jsonParse(data.content));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 2.3 消息类型:KEFU_MESSAGE_ADMIN_READ
|
// 2.3 消息类型:KEFU_MESSAGE_ADMIN_READ
|
||||||
|
|
@ -160,7 +181,6 @@
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.chat-wrap {
|
.chat-wrap {
|
||||||
|
|
||||||
.page-bg {
|
.page-bg {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,8 @@
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
methods: { // 开启的提现方式
|
methods: {
|
||||||
|
// 开启的提现方式
|
||||||
type: Array,
|
type: Array,
|
||||||
default: [],
|
default: [],
|
||||||
},
|
},
|
||||||
|
|
@ -57,7 +58,7 @@
|
||||||
|
|
||||||
const typeList = [
|
const typeList = [
|
||||||
{
|
{
|
||||||
// icon: '/static/img/shop/pay/wechat.png', // TODO 芋艿:后续给个 icon
|
icon: '/static/img/shop/pay/wechat.png',
|
||||||
title: '钱包余额',
|
title: '钱包余额',
|
||||||
value: '1',
|
value: '1',
|
||||||
},
|
},
|
||||||
|
|
@ -68,14 +69,19 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: '/static/img/shop/pay/wechat.png',
|
icon: '/static/img/shop/pay/wechat.png',
|
||||||
title: '微信零钱',
|
title: '微信账户', // 微信手动转账
|
||||||
value: '3',
|
value: '3',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: '/static/img/shop/pay/alipay.png',
|
icon: '/static/img/shop/pay/alipay.png',
|
||||||
title: '支付宝账户',
|
title: '支付宝账户',
|
||||||
value: '4',
|
value: '4',
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
icon: '/static/img/shop/pay/wechat.png',
|
||||||
|
title: '微信零钱', // 微信 API 转账
|
||||||
|
value: '5',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function onChange(e) {
|
function onChange(e) {
|
||||||
|
|
@ -89,7 +95,7 @@
|
||||||
}
|
}
|
||||||
// 赋值
|
// 赋值
|
||||||
emits('update:modelValue', {
|
emits('update:modelValue', {
|
||||||
type: state.currentValue
|
type: state.currentValue,
|
||||||
});
|
});
|
||||||
// 关闭弹窗
|
// 关闭弹窗
|
||||||
emits('close');
|
emits('close');
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,9 @@
|
||||||
<view v-if="!state.accountInfo.type" class="empty-text">请选择提现方式</view>
|
<view v-if="!state.accountInfo.type" class="empty-text">请选择提现方式</view>
|
||||||
<view v-if="state.accountInfo.type === '1'" class="empty-text">钱包余额</view>
|
<view v-if="state.accountInfo.type === '1'" class="empty-text">钱包余额</view>
|
||||||
<view v-if="state.accountInfo.type === '2'" class="empty-text">银行卡转账</view>
|
<view v-if="state.accountInfo.type === '2'" class="empty-text">银行卡转账</view>
|
||||||
<view v-if="state.accountInfo.type === '3'" class="empty-text">微信零钱</view>
|
<view v-if="state.accountInfo.type === '3'" class="empty-text">微信账户</view>
|
||||||
<view v-if="state.accountInfo.type === '4'" class="empty-text">支付宝账户</view>
|
<view v-if="state.accountInfo.type === '4'" class="empty-text">支付宝账户</view>
|
||||||
|
<view v-if="state.accountInfo.type === '5'" class="empty-text">微信零钱</view>
|
||||||
<text class="cicon-forward" />
|
<text class="cicon-forward" />
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -48,7 +49,7 @@
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
<!-- 提现账号 -->
|
<!-- 提现账号 -->
|
||||||
<view class="card-title" v-show="['2', '3', '4'].includes(state.accountInfo.type)">
|
<view class="card-title" v-show="['2', '3', '4', '5'].includes(state.accountInfo.type)">
|
||||||
提现账号
|
提现账号
|
||||||
</view>
|
</view>
|
||||||
<view
|
<view
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@
|
||||||
</view>
|
</view>
|
||||||
<view class="flex flex-wrap">
|
<view class="flex flex-wrap">
|
||||||
<text class="default font-color" v-if="state.addressInfo.defaultStatus">[默认]</text>
|
<text class="default font-color" v-if="state.addressInfo.defaultStatus">[默认]</text>
|
||||||
<text class="line2"
|
<text class="line2">
|
||||||
>{{ state.addressInfo.areaName }} {{ state.addressInfo.detailAddress }}</text
|
{{ state.addressInfo.areaName }} {{ state.addressInfo.detailAddress }}
|
||||||
>
|
</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="addressCon" v-else>
|
<view class="addressCon" v-else>
|
||||||
|
|
@ -44,7 +44,11 @@
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 情况二:门店的选择 -->
|
<!-- 情况二:门店的选择 -->
|
||||||
<view class="address flex flex-wrap flex-center ss-row-between" v-else @tap="onSelectAddress">
|
<view
|
||||||
|
class="address flex flex-wrap flex-center ss-row-between"
|
||||||
|
v-if="state.deliveryType === 2"
|
||||||
|
@tap="onSelectAddress"
|
||||||
|
>
|
||||||
<view class="addressCon" v-if="state.pickUpInfo.name">
|
<view class="addressCon" v-if="state.pickUpInfo.name">
|
||||||
<view class="name"
|
<view class="name"
|
||||||
>{{ state.pickUpInfo.name }}
|
>{{ state.pickUpInfo.name }}
|
||||||
|
|
|
||||||
|
|
@ -37,14 +37,14 @@
|
||||||
<text class="_icon-forward"></text>
|
<text class="_icon-forward"></text>
|
||||||
</view>
|
</view>
|
||||||
<view class="tool-btn-box ss-flex ss-col-center ss-row-right ss-p-r-20">
|
<view class="tool-btn-box ss-flex ss-col-center ss-row-right ss-p-r-20">
|
||||||
<!-- TODO 功能缺失:填写退货信息 -->
|
|
||||||
<view>
|
<view>
|
||||||
<button
|
<button
|
||||||
class="ss-reset-button tool-btn"
|
class="ss-reset-button tool-btn"
|
||||||
@tap.stop="onApply(order.id)"
|
@tap.stop="onApply(order.id)"
|
||||||
v-if="order?.buttons.includes('cancel')"
|
v-if="order?.buttons.includes('cancel')"
|
||||||
>取消申请</button
|
|
||||||
>
|
>
|
||||||
|
取消申请
|
||||||
|
</button>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,7 @@
|
||||||
|
|
||||||
const addressState = ref({
|
const addressState = ref({
|
||||||
addressInfo: {}, // 选择的收货地址
|
addressInfo: {}, // 选择的收货地址
|
||||||
deliveryType: 1, // 收货方式:1-快递配送,2-门店自提
|
deliveryType: undefined, // 收货方式:1-快递配送,2-门店自提
|
||||||
isPickUp: true, // 门店自提是否开启
|
isPickUp: true, // 门店自提是否开启
|
||||||
pickUpInfo: {}, // 选择的自提门店信息
|
pickUpInfo: {}, // 选择的自提门店信息
|
||||||
receiverName: '', // 收件人名称
|
receiverName: '', // 收件人名称
|
||||||
|
|
@ -349,7 +349,7 @@
|
||||||
pointActivityId: state.orderPayload.pointActivityId,
|
pointActivityId: state.orderPayload.pointActivityId,
|
||||||
});
|
});
|
||||||
if (code !== 0) {
|
if (code !== 0) {
|
||||||
return;
|
return code;
|
||||||
}
|
}
|
||||||
state.orderInfo = data;
|
state.orderInfo = data;
|
||||||
state.couponInfo = data.coupons || [];
|
state.couponInfo = data.coupons || [];
|
||||||
|
|
@ -357,20 +357,41 @@
|
||||||
if (state.orderInfo.address) {
|
if (state.orderInfo.address) {
|
||||||
addressState.value.addressInfo = state.orderInfo.address;
|
addressState.value.addressInfo = state.orderInfo.address;
|
||||||
}
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
onLoad(async (options) => {
|
onLoad(async (options) => {
|
||||||
|
// 解析参数
|
||||||
if (!options.data) {
|
if (!options.data) {
|
||||||
sheep.$helper.toast('参数不正确,请检查!');
|
sheep.$helper.toast('参数不正确,请检查!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
state.orderPayload = JSON.parse(options.data);
|
state.orderPayload = JSON.parse(options.data);
|
||||||
await getOrderInfo();
|
|
||||||
// 获取交易配置
|
// 获取交易配置
|
||||||
const { data, code } = await TradeConfigApi.getTradeConfig();
|
const { data, code } = await TradeConfigApi.getTradeConfig();
|
||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
addressState.value.isPickUp = data.deliveryPickUpEnabled;
|
addressState.value.isPickUp = data.deliveryPickUpEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 价格计算
|
||||||
|
// 情况一:先自动选择“快递物流”
|
||||||
|
addressState.value.deliveryType = 1;
|
||||||
|
let orderCode = await getOrderInfo();
|
||||||
|
if (orderCode === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 情况二:失败,再自动选择“门店自提”
|
||||||
|
if (addressState.value.isPickUp) {
|
||||||
|
addressState.value.deliveryType = 2;
|
||||||
|
let orderCode = await getOrderInfo();
|
||||||
|
if (orderCode === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 情况三:都失败,则不选择
|
||||||
|
addressState.value.deliveryType = undefined;
|
||||||
|
await getOrderInfo();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 使用 watch 监听地址和配送方式的变化
|
// 使用 watch 监听地址和配送方式的变化
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,9 @@ const KeFuApi = {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
getKefuMessagePage: (params) => {
|
getKefuMessageList: (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: '/promotion/kefu-message/page',
|
url: '/promotion/kefu-message/list',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
params,
|
params,
|
||||||
custom: {
|
custom: {
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@ const TradeConfigApi = {
|
||||||
return request({
|
return request({
|
||||||
url: `/trade/config/get`,
|
url: `/trade/config/get`,
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
|
custom: {
|
||||||
|
showLoading: false,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,9 @@ const OrderApi = {
|
||||||
if (!(data.pointActivityId > 0)) {
|
if (!(data.pointActivityId > 0)) {
|
||||||
delete data2.pointActivityId;
|
delete data2.pointActivityId;
|
||||||
}
|
}
|
||||||
|
if (!(data.deliveryType > 0)) {
|
||||||
|
delete data2.deliveryType;
|
||||||
|
}
|
||||||
// 解决 SpringMVC 接受 List<Item> 参数的问题
|
// 解决 SpringMVC 接受 List<Item> 参数的问题
|
||||||
delete data2.items;
|
delete data2.items;
|
||||||
for (let i = 0; i < data.items.length; i++) {
|
for (let i = 0; i < data.items.length; i++) {
|
||||||
|
|
|
||||||
|
|
@ -57,8 +57,9 @@
|
||||||
<view class="ss-m-b-24 cotBu-txt">
|
<view class="ss-m-b-24 cotBu-txt">
|
||||||
{{
|
{{
|
||||||
item.validityType == 1
|
item.validityType == 1
|
||||||
? sheep.$helper.timeFormat(item.validStartTime, 'yyyy.mm.dd') -
|
? sheep.$helper.timeFormat(item.validStartTime, 'yyyy-mm-dd') +
|
||||||
sheep.$helper.timeFormat(item.validEndTime, 'yyyy.mm.dd')
|
'-' +
|
||||||
|
sheep.$helper.timeFormat(item.validEndTime, 'yyyy-mm-dd')
|
||||||
: '领取后' + item.fixedStartTerm + '-' + item.fixedEndTerm + '天可用'
|
: '领取后' + item.fixedStartTerm + '-' + item.fixedEndTerm + '天可用'
|
||||||
}}
|
}}
|
||||||
</view>
|
</view>
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,25 @@
|
||||||
<!-- 装修商品组件:标题栏 -->
|
<!-- 装修商品组件:标题栏 -->
|
||||||
<template>
|
<template>
|
||||||
<view class="ss-title-wrap ss-flex ss-col-center" :class="[state.typeMap[data.textAlign]]" :style="[bgStyle, { marginLeft: `${data.space}px` }]">
|
<view
|
||||||
|
class="ss-title-wrap ss-flex ss-col-center"
|
||||||
|
:class="[state.typeMap[data.textAlign]]"
|
||||||
|
:style="[bgStyle, { marginLeft: `${data.space}px` }]"
|
||||||
|
>
|
||||||
<view class="title-content">
|
<view class="title-content">
|
||||||
<!-- 主标题 -->
|
<!-- 主标题 -->
|
||||||
<view v-if="data.title" class="title-text" :style="[titleStyles]">{{ data.title }}</view>
|
<view v-if="data.title" class="title-text" :style="[titleStyles]">{{ data.title }}</view>
|
||||||
<!-- 副标题 -->
|
<!-- 副标题 -->
|
||||||
<view v-if="data.description" :style="[descStyles]" class="sub-title-text">{{ data.description }}</view>
|
<view v-if="data.description" :style="[descStyles]" class="sub-title-text">{{
|
||||||
|
data.description
|
||||||
|
}}</view>
|
||||||
</view>
|
</view>
|
||||||
<!-- 查看更多 -->
|
<!-- 查看更多 -->
|
||||||
<view v-if="data.more?.show" class="more-box ss-flex ss-col-center" @tap="sheep.$router.go(data.more.url)"
|
<view
|
||||||
:style="{color: data.descriptionColor}">
|
v-if="data.more?.show"
|
||||||
|
class="more-box ss-flex ss-col-center"
|
||||||
|
@tap="sheep.$router.go(data.more.url)"
|
||||||
|
:style="{ color: data.descriptionColor }"
|
||||||
|
>
|
||||||
<view class="more-text" v-if="data.more.type !== 'icon'">{{ data.more.text }} </view>
|
<view class="more-text" v-if="data.more.type !== 'icon'">{{ data.more.text }} </view>
|
||||||
<text class="_icon-forward" v-if="data.more.type !== 'text'"></text>
|
<text class="_icon-forward" v-if="data.more.type !== 'text'"></text>
|
||||||
</view>
|
</view>
|
||||||
|
|
@ -20,10 +30,7 @@
|
||||||
/**
|
/**
|
||||||
* 标题栏
|
* 标题栏
|
||||||
*/
|
*/
|
||||||
import {
|
import { reactive, computed } from 'vue';
|
||||||
reactive,
|
|
||||||
computed
|
|
||||||
} from 'vue';
|
|
||||||
import sheep from '@/sheep';
|
import sheep from '@/sheep';
|
||||||
|
|
||||||
// 数据
|
// 数据
|
||||||
|
|
@ -50,15 +57,11 @@
|
||||||
// 设置背景样式
|
// 设置背景样式
|
||||||
const bgStyle = computed(() => {
|
const bgStyle = computed(() => {
|
||||||
// 直接从 props.styles 解构
|
// 直接从 props.styles 解构
|
||||||
const {
|
const { bgType, bgImg, bgColor } = props.styles;
|
||||||
bgType,
|
|
||||||
bgImg,
|
|
||||||
bgColor
|
|
||||||
} = props.styles;
|
|
||||||
|
|
||||||
// 根据 bgType 返回相应的样式
|
// 根据 bgType 返回相应的样式
|
||||||
return {
|
return {
|
||||||
background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
|
background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -66,7 +69,7 @@
|
||||||
const titleStyles = {
|
const titleStyles = {
|
||||||
color: props.data.titleColor,
|
color: props.data.titleColor,
|
||||||
fontSize: `${props.data.titleSize}px`,
|
fontSize: `${props.data.titleSize}px`,
|
||||||
textAlign: props.data.textAlign
|
textAlign: props.data.textAlign,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 副标题
|
// 副标题
|
||||||
|
|
@ -74,7 +77,7 @@
|
||||||
color: props.data.descriptionColor,
|
color: props.data.descriptionColor,
|
||||||
textAlign: props.data.textAlign,
|
textAlign: props.data.textAlign,
|
||||||
fontSize: `${props.data.descriptionSize}px`,
|
fontSize: `${props.data.descriptionSize}px`,
|
||||||
fontWeight: `${props.data.descriptionWeight}px`,
|
fontWeight: `${props.data.descriptionWeight}`,
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import dayjs from "dayjs";
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将一个整数转换为分数保留两位小数
|
* 将一个整数转换为分数保留两位小数
|
||||||
|
|
@ -6,10 +6,10 @@ import dayjs from "dayjs";
|
||||||
* @return {number} 分数
|
* @return {number} 分数
|
||||||
*/
|
*/
|
||||||
export const formatToFraction = (num) => {
|
export const formatToFraction = (num) => {
|
||||||
if (typeof num === 'undefined') return 0
|
if (typeof num === 'undefined') return 0;
|
||||||
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num
|
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num;
|
||||||
return parseFloat((parsedNumber / 100).toFixed(2))
|
return parseFloat((parsedNumber / 100).toFixed(2));
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将一个数转换为 1.00 这样
|
* 将一个数转换为 1.00 这样
|
||||||
|
|
@ -19,26 +19,26 @@ export const formatToFraction = (num) => {
|
||||||
* @return {string} 分数
|
* @return {string} 分数
|
||||||
*/
|
*/
|
||||||
export const floatToFixed2 = (num) => {
|
export const floatToFixed2 = (num) => {
|
||||||
let str = '0.00'
|
let str = '0.00';
|
||||||
if (typeof num === 'undefined') {
|
if (typeof num === 'undefined') {
|
||||||
return str
|
return str;
|
||||||
}
|
}
|
||||||
const f = formatToFraction(num)
|
const f = formatToFraction(num);
|
||||||
const decimalPart = f.toString().split('.')[1]
|
const decimalPart = f.toString().split('.')[1];
|
||||||
const len = decimalPart ? decimalPart.length : 0
|
const len = decimalPart ? decimalPart.length : 0;
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 0:
|
case 0:
|
||||||
str = f.toString() + '.00'
|
str = f.toString() + '.00';
|
||||||
break
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
str = f.toString() + '.0'
|
str = f.toString() + '.0';
|
||||||
break
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
str = f.toString()
|
str = f.toString();
|
||||||
break
|
break;
|
||||||
}
|
}
|
||||||
return str
|
return str;
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将一个分数转换为整数
|
* 将一个分数转换为整数
|
||||||
|
|
@ -47,11 +47,11 @@ export const floatToFixed2 = (num) => {
|
||||||
* @return {number} 整数
|
* @return {number} 整数
|
||||||
*/
|
*/
|
||||||
export const convertToInteger = (num) => {
|
export const convertToInteger = (num) => {
|
||||||
if (typeof num === 'undefined') return 0
|
if (typeof num === 'undefined') return 0;
|
||||||
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num
|
const parsedNumber = typeof num === 'string' ? parseFloat(num) : num;
|
||||||
// TODO 分转元后还有小数则四舍五入
|
// TODO 分转元后还有小数则四舍五入
|
||||||
return Math.round(parsedNumber * 100)
|
return Math.round(parsedNumber * 100);
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 时间日期转换
|
* 时间日期转换
|
||||||
|
|
@ -64,16 +64,16 @@ export const convertToInteger = (num) => {
|
||||||
* @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
|
* @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
|
||||||
* @returns {string} 返回拼接后的时间字符串
|
* @returns {string} 返回拼接后的时间字符串
|
||||||
*/
|
*/
|
||||||
export function formatDate(date, format= 'YYYY-MM-DD HH:mm:ss') {
|
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
|
||||||
// 日期不存在,则返回空
|
// 日期不存在,则返回空
|
||||||
if (!date) {
|
if (!date) {
|
||||||
return ''
|
return '';
|
||||||
}
|
}
|
||||||
// 日期存在,则进行格式化
|
// 日期存在,则进行格式化
|
||||||
if (format === undefined) {
|
if (format === undefined) {
|
||||||
format = 'YYYY-MM-DD HH:mm:ss'
|
format = 'YYYY-MM-DD HH:mm:ss';
|
||||||
}
|
}
|
||||||
return dayjs(date).format(format)
|
return dayjs(date).format(format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -85,16 +85,22 @@ export function formatDate(date, format= 'YYYY-MM-DD HH:mm:ss') {
|
||||||
* @param {*} children 孩子节点字段 默认 'children'
|
* @param {*} children 孩子节点字段 默认 'children'
|
||||||
* @param {*} rootId 根Id 默认 0
|
* @param {*} rootId 根Id 默认 0
|
||||||
*/
|
*/
|
||||||
export function handleTree(data, id = 'id', parentId = 'parentId', children = 'children', rootId = 0) {
|
export function handleTree(
|
||||||
|
data,
|
||||||
|
id = 'id',
|
||||||
|
parentId = 'parentId',
|
||||||
|
children = 'children',
|
||||||
|
rootId = 0,
|
||||||
|
) {
|
||||||
// 对源数据深度克隆
|
// 对源数据深度克隆
|
||||||
const cloneData = JSON.parse(JSON.stringify(data))
|
const cloneData = JSON.parse(JSON.stringify(data));
|
||||||
// 循环所有项
|
// 循环所有项
|
||||||
const treeData = cloneData.filter(father => {
|
const treeData = cloneData.filter((father) => {
|
||||||
let branchArr = cloneData.filter(child => {
|
let branchArr = cloneData.filter((child) => {
|
||||||
//返回每一项的子级数组
|
//返回每一项的子级数组
|
||||||
return father[id] === child[parentId]
|
return father[id] === child[parentId];
|
||||||
});
|
});
|
||||||
branchArr.length > 0 ? father.children = branchArr : '';
|
branchArr.length > 0 ? (father.children = branchArr) : '';
|
||||||
//返回第一层
|
//返回第一层
|
||||||
return father[parentId] === rootId;
|
return father[parentId] === rootId;
|
||||||
});
|
});
|
||||||
|
|
@ -120,14 +126,28 @@ export function resetPagination(pagination) {
|
||||||
* @param source 源对象
|
* @param source 源对象
|
||||||
*/
|
*/
|
||||||
export const copyValueToTarget = (target, source) => {
|
export const copyValueToTarget = (target, source) => {
|
||||||
const newObj = Object.assign({}, target, source)
|
const newObj = Object.assign({}, target, source);
|
||||||
// 删除多余属性
|
// 删除多余属性
|
||||||
Object.keys(newObj).forEach((key) => {
|
Object.keys(newObj).forEach((key) => {
|
||||||
// 如果不是target中的属性则删除
|
// 如果不是target中的属性则删除
|
||||||
if (Object.keys(target).indexOf(key) === -1) {
|
if (Object.keys(target).indexOf(key) === -1) {
|
||||||
delete newObj[key]
|
delete newObj[key];
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
// 更新目标对象值
|
// 更新目标对象值
|
||||||
Object.assign(target, newObj)
|
Object.assign(target, newObj);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析 JSON 字符串
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
*/
|
||||||
|
export function jsonParse(str) {
|
||||||
|
try {
|
||||||
|
return JSON.parse(str);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`str[${str}] 不是一个 JSON 字符串`);
|
||||||
|
return '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue