730 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			730 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <template>
 | ||
|   <view class="table pr" :style="'zoom:' + size + ';'">
 | ||
|     <view class="v-tr" style="display: flex">
 | ||
|       <view
 | ||
|         class="v-td"
 | ||
|         :class="{
 | ||
|           colspan: Array.isArray(treeData.children)
 | ||
|             ? treeData.children.length * 2
 | ||
|             : 1,
 | ||
|           parentLevel:
 | ||
|             Array.isArray(treeData.children) && treeData.children.length,
 | ||
|           extend:
 | ||
|             Array.isArray(treeData.children) &&
 | ||
|             treeData.children.length &&
 | ||
|             treeData.extend,
 | ||
|         }"
 | ||
|       >
 | ||
|         <view :class="{ node: true }">
 | ||
|           <view
 | ||
|             class="person"
 | ||
|             :class="Array.isArray(treeData.class) ? treeData.class : []"
 | ||
|           >
 | ||
|             <view class="Poster1">
 | ||
|               <view class="pop_top">
 | ||
|                 <view class="pop_top">
 | ||
|                   <view>
 | ||
|                     <image
 | ||
|                       crossorigin="anonymous"
 | ||
|                       data-etype="image"
 | ||
|                       :data-enode="treeData.avatarUrl"
 | ||
|                       :src="'data:image/png;base64,' + treeData.avatarUrlBase64"
 | ||
|                       mode="aspectFit"
 | ||
|                       class="poster1"
 | ||
|                     ></image>
 | ||
|                   </view>
 | ||
|                   <view>
 | ||
|                     <image
 | ||
|                       crossorigin="anonymous"
 | ||
|                       data-etype="image"
 | ||
|                       :data-enode="treeData.countryUrl2"
 | ||
|                       :src="
 | ||
|                         'data:image/png;base64,' + treeData.countryUrl2Base64
 | ||
|                       "
 | ||
|                       mode="aspectFit"
 | ||
|                       class="poster2"
 | ||
|                     ></image>
 | ||
|                   </view>
 | ||
|                 </view>
 | ||
|                 <view class="top_right">
 | ||
|                   <image
 | ||
|                     crossorigin="anonymous"
 | ||
|                     data-etype="image"
 | ||
|                     :data-enode="treeData.settleCountryUrl2"
 | ||
|                     :src="
 | ||
|                       'data:image/png;base64,' +
 | ||
|                       treeData.settleCountryUrl2Base64
 | ||
|                     "
 | ||
|                     mode="aspectFit"
 | ||
|                     class="poster2"
 | ||
|                   ></image>
 | ||
|                   <view style="margin-top: 18rpx"> 结算国家 </view>
 | ||
|                 </view>
 | ||
|               </view>
 | ||
|               <view class="pop_center">
 | ||
|                 <view class="center_flex">
 | ||
|                   <view class="c1">会员编号</view>
 | ||
|                   <view class="c2">{{ treeData.memberCode }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="center_flex">
 | ||
|                   <view class="c1">会员姓名</view>
 | ||
|                   <view class="c2">{{ treeData.name }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="center_flex">
 | ||
|                   <view class="c1">支付时间</view>
 | ||
|                   <view class="c2">{{ treeData.payDate }}</view>
 | ||
|                 </view>
 | ||
|               </view>
 | ||
|               <view class="pop_bottom">
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt1">业绩</view>
 | ||
|                   <view class="bt1">左区</view>
 | ||
|                   <view class="bt1">右区</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">真实新增</view>
 | ||
|                   <view class="bt2">{{ treeData.leftRealNewPv }}</view>
 | ||
|                   <view class="bt2">{{ treeData.rightRealNewPv }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">首购新增</view>
 | ||
|                   <view class="bt2">{{ treeData.leftFirstPurchaseAdd }}</view>
 | ||
|                   <view class="bt2">{{ treeData.rightFirstPurchaseAdd }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">复购新增</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.leftRepeatPurchaseSurplus
 | ||
|                   }}</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.rightRepeatPurchaseSurplus
 | ||
|                   }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">真实累计</view>
 | ||
|                   <view class="bt2">{{ treeData.leftRealTotal }}</view>
 | ||
|                   <view class="bt2">{{ treeData.rightRealTotal }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">首购累计</view>
 | ||
|                   <view class="bt2">{{ treeData.leftFirstTotal }}</view>
 | ||
|                   <view class="bt2">{{ treeData.rightFirstTotal }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">复购累计</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.leftRepeatPurchaseTotal
 | ||
|                   }}</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.rightRepeatPurchaseTotal
 | ||
|                   }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">首购结余</view>
 | ||
|                   <view class="bt2">{{ treeData.leftFirstSurplus }}</view>
 | ||
|                   <view class="bt2">{{ treeData.rightFirstSurplus }}</view>
 | ||
|                 </view>
 | ||
|                 <view class="b_flex">
 | ||
|                   <view class="bt2">复购结余</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.leftRepeatPurchaseSurplus
 | ||
|                   }}</view>
 | ||
|                   <view class="bt2">{{
 | ||
|                     treeData.rightRepeatPurchaseSurplus
 | ||
|                   }}</view>
 | ||
|                 </view>
 | ||
|               </view>
 | ||
|             </view>
 | ||
|             <view class="flex_btn">
 | ||
|               <view
 | ||
|                 @click.stop="downImage('Poster1')"
 | ||
|                 class="goTop_btn"
 | ||
|                 style="backgroundcolor: #ee1e26"
 | ||
|               >
 | ||
|                 下载图片
 | ||
|               </view>
 | ||
|               <view
 | ||
|                 @click.stop="copyText(treeData)"
 | ||
|                 class="goTop_btn"
 | ||
|                 style="backgroundcolor: #f37825"
 | ||
|               >
 | ||
|                 复制文字
 | ||
|               </view>
 | ||
|               <view
 | ||
|                 @click.stop="clickTop(treeData)"
 | ||
|                 class="goTop_btn"
 | ||
|                 style="backgroundcolor: #21c8f4"
 | ||
|               >
 | ||
|                 置顶
 | ||
|               </view>
 | ||
|             </view>
 | ||
|           </view>
 | ||
|         </view>
 | ||
|       </view>
 | ||
|     </view>
 | ||
|     <view
 | ||
|       class="v-tr"
 | ||
|       v-if="
 | ||
|         Array.isArray(treeData.children) &&
 | ||
|         treeData.children.length &&
 | ||
|         treeData.extend
 | ||
|       "
 | ||
|     >
 | ||
|       <view
 | ||
|         v-for="(children, index) in treeData.children"
 | ||
|         :key="index"
 | ||
|         colspan="2"
 | ||
|         class="childLevel v-td"
 | ||
|       >
 | ||
|         <TreeChart
 | ||
|           :json="children"
 | ||
|           :left="0"
 | ||
|           :top="0"
 | ||
|           @click-node="clickNode"
 | ||
|           @click-top="clickTop"
 | ||
|         />
 | ||
|       </view>
 | ||
|     </view>
 | ||
|     <Eposter
 | ||
|       width="750"
 | ||
|       height="1334"
 | ||
|       :list="list"
 | ||
|       backgroundColor="rgb(255, 255, 255)"
 | ||
|       @on-success="onSuccess"
 | ||
|       ref="Eposter"
 | ||
|     >
 | ||
|     </Eposter>
 | ||
|   </view>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| import html2canvas from 'html2canvas'
 | ||
| import Eposter from '@/components/architectures/Poster.vue'
 | ||
| import * as arc from '@/config/architecture.js'
 | ||
| export default {
 | ||
|   components: {
 | ||
|     Eposter,
 | ||
|   },
 | ||
|   name: 'TreeChart',
 | ||
|   props: ['json', 'size'],
 | ||
|   data() {
 | ||
|     return {
 | ||
|       treeData: {},
 | ||
|       list: [],
 | ||
|     }
 | ||
|   },
 | ||
|   watch: {
 | ||
|     json: {
 | ||
|       handler: function (Props) {
 | ||
|         let extendKey = function (jsonData) {
 | ||
|           jsonData.extend =
 | ||
|             jsonData.extend === void 0 ? true : !!jsonData.extend
 | ||
|           if (Array.isArray(jsonData.children)) {
 | ||
|             jsonData.children.forEach(c => {
 | ||
|               extendKey(c)
 | ||
|             })
 | ||
|           }
 | ||
|           return jsonData
 | ||
|         }
 | ||
|         if (Props) {
 | ||
|           arc
 | ||
|             .getUrlBase({
 | ||
|               countryUrl2: extendKey(Props).countryUrl2,
 | ||
|               settleCountryUrl2: extendKey(Props).settleCountryUrl2,
 | ||
|               avatarUrl: extendKey(Props).avatarUrl,
 | ||
|             })
 | ||
|             .then(res => {
 | ||
|               extendKey(Props).countryUrl2Base64 = res.countryUrl2Base64
 | ||
|               extendKey(Props).settleCountryUrl2Base64 =
 | ||
|                 res.settleCountryUrl2Base64
 | ||
|               extendKey(Props).avatarUrlBase64 = res.avatarUrlBase64
 | ||
|               this.treeData = extendKey(Props)
 | ||
|             })
 | ||
|         }
 | ||
|       },
 | ||
|       immediate: true,
 | ||
|     },
 | ||
|   },
 | ||
|   methods: {
 | ||
|     //复制文字
 | ||
|     copyText() {
 | ||
|       let self = this
 | ||
|       let md = self.treeData
 | ||
|       let text = `会员编号:${md.memberCode} \n会员姓名:${md.name}支付时间:${md.payDate} \n业绩  左区  右区 \n真实新增  ${md.leftRealNewPv}  ${md.rightRealNewPv} \n首购新增  ${md.leftFirstPurchaseAdd}  ${md.rightFirstPurchaseAdd} \n复购新增  ${md.leftRepeatPurchaseSurplus}  ${md.rightRepeatPurchaseSurplus} \n真实累计  ${md.leftRealTotal}  ${md.rightRealTotal} \n首购累计  ${md.leftFirstTotal}  ${md.rightFirstTotal} \n复购累计  ${md.leftRepeatPurchaseTotal}  ${md.rightRepeatPurchaseTotal} \n首购结余  ${md.leftFirstSurplus}  ${md.rightFirstSurplus} \n复购结余  ${md.leftRepeatPurchaseSurplus}  ${md.rightRepeatPurchaseSurplus} \n`
 | ||
|       uni.setClipboardData({
 | ||
|         data: text,
 | ||
|         success: function (res) {
 | ||
|           uni.getClipboardData({
 | ||
|             success: function (res) {
 | ||
|               uni.showToast({
 | ||
|                 title: '复制成功',
 | ||
|               })
 | ||
|             },
 | ||
|           })
 | ||
|         },
 | ||
|       })
 | ||
|     },
 | ||
|     //下载图片
 | ||
|     downImage(elClass) {
 | ||
|       this.$refs.Eposter.createForElRect(elClass, false)
 | ||
|     },
 | ||
|     downloadImg() {
 | ||
|       let self = this
 | ||
|       let element = document.querySelector('.Poster1')
 | ||
|       uni.showLoading({
 | ||
|         title: '图片保存中',
 | ||
|       })
 | ||
|       html2canvas(element)
 | ||
|         .then(function (canvas) {
 | ||
|           let dataURL = canvas.toDataURL('image/jpeg')
 | ||
|           let link = document.createElement('a')
 | ||
|           link.style.display = 'none'
 | ||
|           link.href = dataURL
 | ||
|           link.download = 'image.jpg'
 | ||
|           document.body.appendChild(link)
 | ||
|           link.click()
 | ||
|           document.body.removeChild(link)
 | ||
|           uni.showToast({
 | ||
|             icon: 'none',
 | ||
|             title: '保存成功',
 | ||
|             duration: 2000,
 | ||
|           })
 | ||
|           uni.hideLoading()
 | ||
|         })
 | ||
|         .catch(function (error) {
 | ||
|           uni.hideLoading()
 | ||
|           uni.showModal({
 | ||
|             title: '保存失败',
 | ||
|           })
 | ||
|         })
 | ||
|     },
 | ||
|     onSuccess(val) {
 | ||
|       this.posterImg = val
 | ||
|       this.downloadImg(this.posterImg)
 | ||
|     },
 | ||
|     toggleExtend: function (treeData) {
 | ||
|       treeData.extend = !treeData.extend
 | ||
|       this.$forceUpdate()
 | ||
|     },
 | ||
|     clickTop(e) {
 | ||
|       this.$emit('click-top', e)
 | ||
|     },
 | ||
|   },
 | ||
| }
 | ||
| </script>
 | ||
| 
 | ||
| <style scoped lang="scss">
 | ||
| .flex_btn {
 | ||
|   display: flex;
 | ||
|   justify-content: space-between;
 | ||
|   align-items: center;
 | ||
|   color: #ffffff;
 | ||
| 
 | ||
|   .goTop_btn {
 | ||
|     padding: 10rpx 10rpx;
 | ||
|     border-radius: 8rpx;
 | ||
|     font-size: 22rpx;
 | ||
|     margin: 0 auto;
 | ||
|     width: 100rpx;
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| .Poster1 {
 | ||
|   width: 670rpx;
 | ||
|   font-size: 24rpx;
 | ||
|   color: #333333;
 | ||
| 
 | ||
|   // background-color: pink;
 | ||
|   .pop_top {
 | ||
|     display: flex;
 | ||
|     justify-content: space-between;
 | ||
|     align-items: center;
 | ||
| 
 | ||
|     .poster1 {
 | ||
|       height: 88rpx;
 | ||
|       width: 88rpx;
 | ||
|     }
 | ||
| 
 | ||
|     .poster2 {
 | ||
|       width: 88rpx;
 | ||
|       height: 54rpx;
 | ||
|       border-radius: 10rpx;
 | ||
|       margin-left: 20rpx;
 | ||
|     }
 | ||
| 
 | ||
|     .top_right {
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
|       align-items: center;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .pop_center {
 | ||
|     .center_flex {
 | ||
|       display: flex;
 | ||
|       align-items: center;
 | ||
|       margin-top: 20rpx;
 | ||
| 
 | ||
|       .c1 {
 | ||
|         width: 20%;
 | ||
|       }
 | ||
| 
 | ||
|       .c2 {
 | ||
|         width: 80%;
 | ||
|         display: flex;
 | ||
|         justify-content: center;
 | ||
|         align-items: center;
 | ||
|         background: #f3f3f3;
 | ||
|         border: 2rpx solid #eeeeee;
 | ||
|         border-radius: 8rpx;
 | ||
|         padding: 10rpx 0;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .pop_bottom {
 | ||
|     margin: 20rpx 0;
 | ||
|     border-top: 2rpx solid #eeeeee;
 | ||
|     border-top: 2rpx solid #eeeeee;
 | ||
| 
 | ||
|     .b_flex {
 | ||
|       display: flex;
 | ||
| 
 | ||
|       .bt1 {
 | ||
|         display: flex;
 | ||
|         justify-content: center;
 | ||
|         align-items: center;
 | ||
|         margin-top: 22rpx;
 | ||
|         flex: 1;
 | ||
|       }
 | ||
| 
 | ||
|       .bt2 {
 | ||
|         display: flex;
 | ||
|         justify-content: center;
 | ||
|         align-items: center;
 | ||
|         margin-top: 22rpx;
 | ||
|         flex: 1;
 | ||
|         background: #f3f3f3;
 | ||
|         border: 2rpx solid #eeeeee;
 | ||
|         border-radius: 8rpx;
 | ||
|         padding: 12rpx 0;
 | ||
|         margin: 11rpx 18rpx;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   .btn_box {
 | ||
|     display: flex;
 | ||
|     align-items: center;
 | ||
|     justify-content: space-between;
 | ||
| 
 | ||
|     .small-btn {
 | ||
|       width: 312rpx;
 | ||
|       height: 72rpx;
 | ||
|       background: #005bac;
 | ||
|       border-radius: 34rpx;
 | ||
|       font-size: 28rpx;
 | ||
|       font-weight: 400;
 | ||
|       color: #ffffff;
 | ||
|       display: flex;
 | ||
|       justify-content: center;
 | ||
|       align-items: center;
 | ||
|     }
 | ||
| 
 | ||
|     .small-text-btn {
 | ||
|       width: 312rpx;
 | ||
|       height: 72rpx;
 | ||
|       border: 1px solid #005bac;
 | ||
|       border-radius: 34rpx;
 | ||
|       display: flex;
 | ||
|       justify-content: center;
 | ||
|       align-items: center;
 | ||
|       font-size: 28rpx;
 | ||
|       color: #005bac;
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| .f18 {
 | ||
|   font-size: 18rpx;
 | ||
| }
 | ||
| 
 | ||
| .pv-btn {
 | ||
|   width: 200rpx;
 | ||
|   height: 50rpx;
 | ||
|   background-color: #b2821e;
 | ||
|   color: #fff;
 | ||
|   font-size: 20rpx;
 | ||
|   line-height: 50rpx;
 | ||
|   display: flex;
 | ||
|   align-items: center;
 | ||
|   margin: auto;
 | ||
|   margin-top: 12rpx;
 | ||
|   margin-bottom: 12rpx;
 | ||
| }
 | ||
| 
 | ||
| .next-btn {
 | ||
|   border-radius: 50%;
 | ||
|   background: none;
 | ||
|   width: 40rpx;
 | ||
|   height: 40rpx;
 | ||
|   margin: auto;
 | ||
|   padding: 0;
 | ||
|   display: flex;
 | ||
|   justify-content: center;
 | ||
|   align-items: center;
 | ||
| }
 | ||
| 
 | ||
| .table {
 | ||
|   border-collapse: separate !important;
 | ||
|   border-spacing: 0 !important;
 | ||
|   width: 100%;
 | ||
| }
 | ||
| 
 | ||
| .v-tr {
 | ||
|   display: inline-flex;
 | ||
|   justify-content: center;
 | ||
|   align-items: flex-start;
 | ||
|   /* width: 100%; */
 | ||
| }
 | ||
| 
 | ||
| .v-td {
 | ||
|   position: relative;
 | ||
|   vertical-align: top;
 | ||
|   padding: 0 0 130rpx 0;
 | ||
|   text-align: center;
 | ||
| }
 | ||
| 
 | ||
| .extend_handle {
 | ||
|   position: absolute;
 | ||
|   left: 50%;
 | ||
|   bottom: 30rpx;
 | ||
|   width: 10rpx;
 | ||
|   height: 10rpx;
 | ||
|   padding: 10rpx;
 | ||
|   transform: translate3d(-30rpx, 0, 0);
 | ||
|   cursor: pointer;
 | ||
| }
 | ||
| 
 | ||
| .extend_handle:before {
 | ||
|   content: '';
 | ||
|   display: block;
 | ||
|   width: 100%;
 | ||
|   height: 100%;
 | ||
|   box-sizing: border-box;
 | ||
|   border: 4rpx solid;
 | ||
|   border-color: #f2f2f2 #f2f2f2 transparent transparent;
 | ||
|   transform: rotateZ(135deg);
 | ||
|   transform-origin: 50% 50% 0;
 | ||
|   transition: transform ease 300ms;
 | ||
| }
 | ||
| 
 | ||
| .extend_handle:hover:before {
 | ||
|   border-color: #f2f2f2 #f2f2f2 transparent transparent;
 | ||
| }
 | ||
| 
 | ||
| .extend .extend_handle:before {
 | ||
|   transform: rotateZ(-45deg);
 | ||
| }
 | ||
| 
 | ||
| .extend::after {
 | ||
|   content: '';
 | ||
|   position: absolute;
 | ||
|   left: 50%;
 | ||
|   bottom: 84rpx;
 | ||
|   height: 84rpx;
 | ||
|   border-left: 4rpx solid #f2f2f2;
 | ||
|   transform: translate3d(-2rpx, 0, 0);
 | ||
| }
 | ||
| 
 | ||
| .childLevel::before {
 | ||
|   content: '';
 | ||
|   position: absolute;
 | ||
|   left: 50%;
 | ||
|   bottom: 100%;
 | ||
|   height: 84rpx;
 | ||
|   border-left: 4rpx solid #f2f2f2;
 | ||
|   transform: translate3d(-2rpx, 0, 0);
 | ||
| }
 | ||
| 
 | ||
| .childLevel::after {
 | ||
|   content: '';
 | ||
|   position: absolute;
 | ||
|   left: 0;
 | ||
|   right: 0;
 | ||
|   top: -88rpx;
 | ||
|   border-top: 4rpx solid #f2f2f2;
 | ||
| }
 | ||
| 
 | ||
| .childLevel:first-child:before,
 | ||
| .childLevel:last-child:before {
 | ||
|   display: none;
 | ||
| }
 | ||
| 
 | ||
| .childLevel:first-child:after {
 | ||
|   left: 50%;
 | ||
|   height: 84rpx;
 | ||
|   border: 4rpx solid;
 | ||
|   border-color: #f2f2f2 transparent transparent #f2f2f2;
 | ||
|   border-radius: 6rpx 0 0 0;
 | ||
|   transform: translate3d(2rpx, 0, 0);
 | ||
| }
 | ||
| 
 | ||
| .childLevel:last-child:after {
 | ||
|   right: 50%;
 | ||
|   height: 84rpx;
 | ||
|   border: 4rpx solid;
 | ||
|   border-color: #f2f2f2 #f2f2f2 transparent transparent;
 | ||
|   border-radius: 0 6rpx 0 0;
 | ||
|   transform: translate3d(-2rpx, 0, 0);
 | ||
| }
 | ||
| 
 | ||
| .childLevel:first-child.childLevel:last-child::after {
 | ||
|   left: auto;
 | ||
|   border-radius: 0;
 | ||
|   border-color: transparent #f2f2f2 transparent transparent;
 | ||
|   transform: translate3d(2rpx, 0, 0);
 | ||
| }
 | ||
| 
 | ||
| .node {
 | ||
|   position: relative;
 | ||
|   display: inline-block;
 | ||
|   margin: 0 10rpx;
 | ||
|   box-sizing: border-box;
 | ||
|   text-align: center;
 | ||
| }
 | ||
| 
 | ||
| .node .person {
 | ||
|   position: relative;
 | ||
|   display: inline-block;
 | ||
|   z-index: 2;
 | ||
|   padding: 23rpx 50rpx;
 | ||
|   background-color: #ffffff;
 | ||
|   box-shadow: 0rpx 3rpx 7rpx 0rpx rgba(0, 0, 0, 0.15);
 | ||
|   border-radius: 15rpx;
 | ||
|   font-size: 22rpx;
 | ||
| }
 | ||
| 
 | ||
| .person_flex {
 | ||
|   display: flex;
 | ||
|   padding: 10rpx 20rpx;
 | ||
|   box-shadow: 0rpx 3rpx 7rpx 0rpx rgba(0, 0, 0, 0.15);
 | ||
|   margin: 0rpx 0 20rpx 0;
 | ||
| }
 | ||
| 
 | ||
| .flex-p1 {
 | ||
|   margin: 0 5rpx;
 | ||
| }
 | ||
| 
 | ||
| .node .person .person-ava {
 | ||
|   width: 88rpx;
 | ||
|   height: 53rpx;
 | ||
|   border-radius: 10rpx;
 | ||
| }
 | ||
| 
 | ||
| .node .person .person-ava1 {
 | ||
|   width: 104rpx;
 | ||
|   height: 104rpx;
 | ||
|   border-radius: 50%;
 | ||
| }
 | ||
| 
 | ||
| .node .person .avat {
 | ||
|   display: block;
 | ||
|   width: 4em;
 | ||
|   height: 4em;
 | ||
|   margin: auto;
 | ||
|   overflow: hidden;
 | ||
|   background: #fff;
 | ||
|   border: 4px solid #f2f2f2;
 | ||
|   box-sizing: border-box;
 | ||
|   border-radius: 0.5em;
 | ||
| }
 | ||
| 
 | ||
| .node .person .avat img {
 | ||
|   width: 100%;
 | ||
|   height: 100%;
 | ||
| }
 | ||
| 
 | ||
| .node .person .name {
 | ||
|   display: block;
 | ||
|   margin: auto;
 | ||
|   overflow: hidden;
 | ||
|   box-sizing: border-box;
 | ||
|   overflow: hidden;
 | ||
|   font-size: 20rpx;
 | ||
|   line-height: 1.5;
 | ||
|   padding-top: 24rpx;
 | ||
| }
 | ||
| 
 | ||
| .node .person .name-bottom {
 | ||
|   display: block;
 | ||
|   margin: auto;
 | ||
|   overflow: hidden;
 | ||
|   border-top: none;
 | ||
|   box-sizing: border-box;
 | ||
|   overflow: hidden;
 | ||
| }
 | ||
| 
 | ||
| .node .person .operation {
 | ||
| }
 | ||
| 
 | ||
| .node.hasMate::after {
 | ||
|   content: '';
 | ||
|   position: absolute;
 | ||
|   left: 2em;
 | ||
|   right: 2em;
 | ||
|   top: 2em;
 | ||
|   border-top: 4px solid #f2f2f2;
 | ||
|   z-index: 1;
 | ||
| }
 | ||
| 
 | ||
| /* 横板 */
 | ||
| .landscape {
 | ||
|   transform: translate(-100%, 0) rotate(-90deg);
 | ||
|   transform-origin: 100% 0;
 | ||
| }
 | ||
| 
 | ||
| .landscape .node {
 | ||
|   text-align: left;
 | ||
|   height: 8em;
 | ||
|   width: 8em;
 | ||
| }
 | ||
| 
 | ||
| .landscape .person {
 | ||
|   position: relative;
 | ||
|   transform: rotate(90deg);
 | ||
|   padding-left: 4.5em;
 | ||
|   height: 4em;
 | ||
|   top: 4em;
 | ||
|   left: -1em;
 | ||
| }
 | ||
| 
 | ||
| .landscape .person .avat {
 | ||
|   position: absolute;
 | ||
|   left: 0;
 | ||
| }
 | ||
| 
 | ||
| .landscape .person .name {
 | ||
|   height: 4em;
 | ||
|   line-height: 4em;
 | ||
| }
 | ||
| 
 | ||
| .landscape .hasMate {
 | ||
|   position: relative;
 | ||
| }
 | ||
| 
 | ||
| .landscape .hasMate .person {
 | ||
|   position: absolute;
 | ||
| }
 | ||
| 
 | ||
| .landscape .hasMate .person:first-child {
 | ||
|   left: auto;
 | ||
|   right: -4em;
 | ||
| }
 | ||
| 
 | ||
| .landscape .hasMate .person:last-child {
 | ||
|   left: -4em;
 | ||
|   margin-left: 0;
 | ||
| }
 | ||
| </style>
 |