2024-08-28 11:20:29 +00:00
|
|
|
|
<template>
|
|
|
|
|
|
<view :class="theme_view">
|
|
|
|
|
|
<!-- 简洁的数据,一般列表展示使用 -->
|
2025-08-01 15:06:19 +00:00
|
|
|
|
<view v-if="propIsTerse" class="terse-content margin-top cp">
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<block v-if="data != null && data_field.length > 0">
|
2024-11-20 13:05:32 +00:00
|
|
|
|
<block v-for="(item, index) in data_field" :key="index">
|
2025-12-29 10:13:28 +00:00
|
|
|
|
<view v-if="(item.is_hide || 0) == 0" class="item margin-top-xs" :class="propClass">
|
2024-08-28 11:20:29 +00:00
|
|
|
|
<text class="cr-grey margin-right-xl">{{ item.name }}</text>
|
2025-04-03 14:23:03 +00:00
|
|
|
|
<block v-if="item.type == 'images'">
|
2025-12-29 10:13:28 +00:00
|
|
|
|
<image v-if="(data[item.field] || null) != null" :src="data[item.field]" :data-value="data[item.field]" @tap.stop="images_show_event" mode="aspectFit" class="br-f5 radius panel-item-images"></image>
|
|
|
|
|
|
</block>
|
|
|
|
|
|
<block v-else-if="item.type == 'many_images'">
|
|
|
|
|
|
<view v-if="(data[item.field] || null) != null && data[item.field].length > 0" class="dis-inline-block va-m">
|
|
|
|
|
|
<view class="flex-row gap-5">
|
|
|
|
|
|
<block v-for="(items, indexs) in data[item.field]" :key="indexs">
|
|
|
|
|
|
<image :src="items" :data-value="items" @tap.stop="images_show_event" mode="aspectFit" class="br-f5 radius panel-item-images"></image>
|
|
|
|
|
|
</block>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2025-04-03 14:23:03 +00:00
|
|
|
|
</block>
|
|
|
|
|
|
<text v-else class="cr-base">{{ data[item.field] }}</text>
|
2025-12-29 10:13:28 +00:00
|
|
|
|
<view v-if="(item.is_copy || 0) == 1 && data[item.field] !== ''" class="dis-inline-block margin-left" data-event="copy" :data-value="data[item.field]" @tap.stop="text_event_handle">
|
2024-08-28 11:20:29 +00:00
|
|
|
|
<iconfont name="icon-copy" size="28rpx" class="cr-grey"></iconfont>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2024-11-20 13:05:32 +00:00
|
|
|
|
</block>
|
|
|
|
|
|
<view v-if="propIsItemShowMax > 0 && propIsItemShowMax < data_field.length" @tap.stop="item_more_event" class="margin-top-sm tc">
|
2024-12-17 09:03:45 +00:00
|
|
|
|
<text class="cr-grey-c margin-right-sm">{{ $t('common.view_more') }}</text>
|
|
|
|
|
|
<iconfont :name="'icon-arrow-' + (more_status ? 'top' : 'bottom')" size="28rpx" color="#ccc"></iconfont>
|
2024-08-29 09:35:32 +00:00
|
|
|
|
</view>
|
2024-08-28 11:20:29 +00:00
|
|
|
|
</block>
|
|
|
|
|
|
<slot></slot>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
<!-- 详情面板数据 -->
|
|
|
|
|
|
<view v-else class="padding-horizontal-main padding-top-main">
|
2025-10-23 16:15:04 +00:00
|
|
|
|
<view class="panel-item padding-main border-radius-main bg-white">
|
2024-12-17 09:03:45 +00:00
|
|
|
|
<view v-if="(propTitle || null) != null" class="br-b padding-bottom-main fw-b text-size">{{ propTitle }}</view>
|
2024-08-28 11:20:29 +00:00
|
|
|
|
<view class="panel-content oh">
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<block v-if="data != null && data_field.length > 0">
|
2024-11-20 13:05:32 +00:00
|
|
|
|
<block v-for="(item, index) in data_field" :key="index">
|
2024-12-17 09:03:45 +00:00
|
|
|
|
<view v-if="(item.is_hide || 0) == 0" class="item br-b-f5 oh padding-vertical-main">
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<view class="title fl padding-right-main cr-grey">{{ item.name }}</view>
|
|
|
|
|
|
<view class="content fl br-l padding-left-main">
|
|
|
|
|
|
<block v-if="item.type == 'images'">
|
2025-04-03 14:23:03 +00:00
|
|
|
|
<image v-if="(data[item.field] || null) != null" :src="data[item.field]" :data-value="data[item.field]" @tap.stop="images_show_event" mode="aspectFit" class="panel-item-images"></image>
|
2024-08-29 09:35:32 +00:00
|
|
|
|
</block>
|
2025-12-29 10:13:28 +00:00
|
|
|
|
<block v-else-if="item.type == 'many_images'">
|
|
|
|
|
|
<view v-if="(data[item.field] || null) != null && data[item.field].length > 0" class="dis-inline-block va-m">
|
|
|
|
|
|
<view class="flex-row gap-5">
|
|
|
|
|
|
<block v-for="(items, indexs) in data[item.field]" :key="indexs">
|
|
|
|
|
|
<image :src="items" :data-value="items" @tap.stop="images_show_event" mode="aspectFit" class="br-f5 radius panel-item-images"></image>
|
|
|
|
|
|
</block>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</block>
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<text v-else>{{ data[item.field] }}</text>
|
2025-12-29 10:13:28 +00:00
|
|
|
|
<view v-if="(item.is_copy || 0) == 1 && data[item.field] !== ''" class="dis-inline-block margin-left" data-event="copy" :data-value="data[item.field]" @tap.stop="text_event_handle">
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<iconfont name="icon-copy" size="28rpx" class="cr-grey lh-il"></iconfont>
|
|
|
|
|
|
</view>
|
2024-08-28 11:20:29 +00:00
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
2024-11-20 13:05:32 +00:00
|
|
|
|
</block>
|
2025-04-03 14:23:03 +00:00
|
|
|
|
<view v-if="propIsItemShowMax > 0 && propIsItemShowMax < data_field.length" @tap.stop="item_more_event" class="margin-top-sm tc">
|
2024-12-17 09:03:45 +00:00
|
|
|
|
<text class="cr-grey-c margin-right-sm">{{ $t('common.view_more') }}</text>
|
|
|
|
|
|
<iconfont :name="'icon-arrow-' + (more_status ? 'top' : 'bottom')" size="28rpx" color="#ccc"></iconfont>
|
2024-08-29 09:35:32 +00:00
|
|
|
|
</view>
|
2024-08-28 11:20:29 +00:00
|
|
|
|
</block>
|
|
|
|
|
|
<slot></slot>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</view>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
|
|
|
const app = getApp();
|
2024-12-17 09:03:45 +00:00
|
|
|
|
import componentNoData from '@/components/no-data/no-data';
|
2024-08-28 11:20:29 +00:00
|
|
|
|
export default {
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
theme_view: app.globalData.get_theme_value_view(),
|
2024-08-29 09:35:32 +00:00
|
|
|
|
data: null,
|
|
|
|
|
|
data_field: [],
|
2024-12-17 09:03:45 +00:00
|
|
|
|
more_status: false,
|
2024-08-28 11:20:29 +00:00
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
components: {
|
2024-12-17 09:03:45 +00:00
|
|
|
|
componentNoData,
|
2024-08-28 11:20:29 +00:00
|
|
|
|
},
|
|
|
|
|
|
props: {
|
|
|
|
|
|
// 标题
|
|
|
|
|
|
propTitle: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: '',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 数据
|
|
|
|
|
|
propData: {
|
|
|
|
|
|
type: [Object, String],
|
|
|
|
|
|
default: '',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 数据字段
|
|
|
|
|
|
propDataField: {
|
2025-08-01 15:06:19 +00:00
|
|
|
|
type: [Array,String],
|
|
|
|
|
|
default: '',
|
2024-08-28 11:20:29 +00:00
|
|
|
|
},
|
2024-08-29 09:35:32 +00:00
|
|
|
|
// 数据项最大展示数量(0则显示全部)
|
|
|
|
|
|
propIsItemShowMax: {
|
2025-04-06 05:31:09 +00:00
|
|
|
|
type: [Number,String],
|
2024-08-29 09:35:32 +00:00
|
|
|
|
default: 0,
|
|
|
|
|
|
},
|
2024-11-20 13:05:32 +00:00
|
|
|
|
// 指定字段
|
|
|
|
|
|
propAppointField: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: '',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 排除字段
|
|
|
|
|
|
propExcludeField: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: '',
|
|
|
|
|
|
},
|
2024-08-28 11:20:29 +00:00
|
|
|
|
// 无数据提示状态
|
|
|
|
|
|
propNoDataStatus: {
|
|
|
|
|
|
type: [Number, String],
|
|
|
|
|
|
default: 3,
|
|
|
|
|
|
},
|
|
|
|
|
|
// 无数据提示内容
|
|
|
|
|
|
propNoDataMsg: {
|
|
|
|
|
|
type: [String],
|
|
|
|
|
|
default: '',
|
|
|
|
|
|
},
|
|
|
|
|
|
// 是否简洁的模式展示
|
|
|
|
|
|
propIsTerse: {
|
|
|
|
|
|
type: Boolean,
|
|
|
|
|
|
default: false,
|
2024-12-17 09:03:45 +00:00
|
|
|
|
},
|
2025-12-29 10:13:28 +00:00
|
|
|
|
// class
|
|
|
|
|
|
propClass: {
|
|
|
|
|
|
type: String,
|
|
|
|
|
|
default: 'single-text'
|
|
|
|
|
|
}
|
2024-08-28 11:20:29 +00:00
|
|
|
|
},
|
2024-08-29 09:35:32 +00:00
|
|
|
|
// 属性值改变监听
|
|
|
|
|
|
watch: {
|
|
|
|
|
|
// 数据改变
|
2024-12-17 09:03:45 +00:00
|
|
|
|
propData(value, old_value) {
|
|
|
|
|
|
this.data = value;
|
|
|
|
|
|
},
|
2024-08-29 09:35:32 +00:00
|
|
|
|
},
|
|
|
|
|
|
// 页面被展示
|
2024-12-17 09:03:45 +00:00
|
|
|
|
created: function (e) {
|
2024-08-29 09:35:32 +00:00
|
|
|
|
this.setData({
|
2024-12-17 09:03:45 +00:00
|
|
|
|
data: this.propData,
|
2024-08-29 09:35:32 +00:00
|
|
|
|
});
|
|
|
|
|
|
this.data_field_handle(this.propDataField);
|
|
|
|
|
|
},
|
2024-08-28 11:20:29 +00:00
|
|
|
|
methods: {
|
2024-08-29 09:35:32 +00:00
|
|
|
|
// 数据字段处理
|
|
|
|
|
|
data_field_handle(data) {
|
2025-08-01 15:06:19 +00:00
|
|
|
|
if((data || null) != null && data.length > 0) {
|
|
|
|
|
|
var appoint = (this.propAppointField || null) == null ? [] : this.propAppointField.split(',');
|
|
|
|
|
|
var exclude = (this.propExcludeField || null) == null ? [] : this.propExcludeField.split(',');
|
|
|
|
|
|
var temp_data = [];
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
|
for (var i in data) {
|
|
|
|
|
|
if ((exclude.length == 0 && appoint.length > 0 && appoint.indexOf(data[i]['field']) != -1) || (appoint.length == 0 && (exclude.length == 0 || exclude.indexOf(data[i]['field']) == -1))) {
|
|
|
|
|
|
data[i]['is_hide'] = (data[i]['is_hide'] || 0) == 0 ? (index >= this.propIsItemShowMax && this.propIsItemShowMax > 0 ? 1 : 0) : 0;
|
|
|
|
|
|
temp_data.push(data[i]);
|
|
|
|
|
|
index++;
|
|
|
|
|
|
}
|
2024-11-20 13:05:32 +00:00
|
|
|
|
}
|
2025-08-01 15:06:19 +00:00
|
|
|
|
this.setData({
|
|
|
|
|
|
data_field: temp_data,
|
|
|
|
|
|
});
|
2024-08-29 09:35:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2024-08-28 11:20:29 +00:00
|
|
|
|
// 文本事件
|
|
|
|
|
|
text_event_handle(e) {
|
|
|
|
|
|
app.globalData.text_event_handle(e);
|
2024-08-29 09:35:32 +00:00
|
|
|
|
},
|
|
|
|
|
|
|
2025-04-03 14:23:03 +00:00
|
|
|
|
// 图片预览
|
|
|
|
|
|
images_show_event(e) {
|
|
|
|
|
|
app.globalData.image_show_event(e);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2024-08-29 09:35:32 +00:00
|
|
|
|
// 数据项更多事件
|
|
|
|
|
|
item_more_event(e) {
|
|
|
|
|
|
this.data_field_handle(this.data_field);
|
|
|
|
|
|
this.setData({
|
2024-12-17 09:03:45 +00:00
|
|
|
|
more_status: !this.more_status,
|
2024-08-29 09:35:32 +00:00
|
|
|
|
});
|
2025-04-03 14:23:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-08-28 11:20:29 +00:00
|
|
|
|
};
|
|
|
|
|
|
</script>
|
2024-08-29 09:35:32 +00:00
|
|
|
|
<style scoped>
|
2025-12-29 10:13:28 +00:00
|
|
|
|
.terse-content .item {
|
|
|
|
|
|
min-height: 40rpx;
|
2025-08-01 15:06:19 +00:00
|
|
|
|
}
|
2024-08-29 09:35:32 +00:00
|
|
|
|
.panel-item-images {
|
|
|
|
|
|
width: 40rpx;
|
|
|
|
|
|
height: 40rpx;
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|