You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
5.7 KiB
253 lines
5.7 KiB
<template>
|
|
<view class="bank-item" style="background-color: #f40;" :style="bankThem">
|
|
<!-- #ifndef MP -->
|
|
<canvas v-if="showCanvas" class="bank-icon" :id="uuid" :canvas-id="uuid" />
|
|
<!-- #endif -->
|
|
<!-- #ifdef MP -->
|
|
<canvas v-if="showCanvas" class="bank-icon" id="bankIcon" canvas-id="bankIcon" />
|
|
<!-- #endif -->
|
|
<view class="bank-head">
|
|
<image :src="image"></image>
|
|
<view class="bank-info">
|
|
<text class="bank-name">{{bankName}}</text>
|
|
<text class="card-type">{{cardType}}</text>
|
|
</view>
|
|
</view>
|
|
<view class="card-code">
|
|
<text class="omit">****</text>
|
|
<text class="omit">****</text>
|
|
<text class="omit">****</text>
|
|
<text>{{endNumber}}</text>
|
|
</view>
|
|
<image class="bank-watermark" :src="waterMark"></image>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'wanlBank',
|
|
props: {
|
|
bankCode: { type: String, required: true},
|
|
bankName: { type: String, required: true},
|
|
cardType: { type: String, default: '储蓄卡' },
|
|
cardCode: { type: String, required: true}
|
|
},
|
|
computed: {
|
|
waterMark() {
|
|
return this.image;
|
|
},
|
|
endNumber() {
|
|
let length = this.cardCode.length;
|
|
return this.cardCode.substr(length - 4, length);
|
|
}
|
|
},
|
|
data() {
|
|
// #ifndef MP
|
|
const buildUuid = () => {
|
|
return 'bank_' + parseInt(Math.random() * 100000000);
|
|
};
|
|
// #endif
|
|
return {
|
|
bankThem: '',
|
|
image: '',
|
|
showCanvas: true,
|
|
// #ifdef MP
|
|
uuid: 'bankIcon',
|
|
// #endif
|
|
// #ifndef MP
|
|
uuid: buildUuid()
|
|
// #endif
|
|
};
|
|
},
|
|
methods: {
|
|
async buildItem() {
|
|
this.bankThem = uni.getStorageSync(`BANK_${this.bankCode}`);
|
|
|
|
this.image = `/static/images/bank/${this.bankCode}.png`;
|
|
|
|
await this.getThemColor();
|
|
this.showCanvas = false;
|
|
},
|
|
async getThemColor() {
|
|
if(this.bankThem != null && this.bankThem != '') return;
|
|
let bgSize = uni.upx2px(100);
|
|
let iconSize = uni.upx2px(72);
|
|
this.iconContext = uni.createCanvasContext(this.uuid, this);
|
|
this.iconContext.width = bgSize;
|
|
this.iconContext.height = bgSize;
|
|
this.iconContext.fillStyle = '#FFFFFF';
|
|
this.iconContext.beginPath();
|
|
let bgRadio = bgSize / 2;
|
|
this.iconContext.arc(bgRadio, bgRadio, bgRadio - 1 , 0, 2 * Math.PI, 0, true);
|
|
this.iconContext.closePath();
|
|
this.iconContext.fill();
|
|
let iconRadio = bgSize / 2 - iconSize / 2;
|
|
this.iconContext.drawImage(this.image, iconRadio, iconRadio, iconSize, iconSize);
|
|
await this.draw(this.iconContext);
|
|
let imageData = await this.getImageData(iconRadio, iconSize);
|
|
this.parsingImageData(imageData);
|
|
},
|
|
parsingImageData(imageData) {
|
|
let statistics = {};
|
|
for (let i = 0, length = imageData.length; i < length; i += 4) {
|
|
let r = imageData[i];
|
|
let g = imageData[i + 1];
|
|
let b = imageData[i + 2];
|
|
if((r + g + b) < 400) {
|
|
let rgb = [r, g, b];
|
|
let key = rgb.join(', ');
|
|
statistics[key] = statistics[key] == null ? 1 : statistics[key] + 1;
|
|
}
|
|
}
|
|
let maxKey = '';
|
|
Object.keys(statistics).forEach(key => {
|
|
if (maxKey === '') {
|
|
maxKey = key;
|
|
} else {
|
|
maxKey = statistics[maxKey] > statistics[key] ? maxKey : key;
|
|
}
|
|
});
|
|
let beginColor = maxKey.split(', ').map((item, index) => {
|
|
item = parseInt(item);
|
|
if(index > 1) return item;
|
|
let newColor = item + 50;
|
|
return newColor > 255 ? 255 : newColor;
|
|
}).join(', ');
|
|
this.bankThem = `background-image: linear-gradient(45deg, rgba(${beginColor}, 1), rgba(${maxKey}, 1));`;
|
|
uni.setStorageSync(`BANK_${this.bankCode}`, this.bankThem);
|
|
},
|
|
getImageData(radio, size) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.canvasGetImageData({
|
|
canvasId: this.uuid,
|
|
x: radio,
|
|
y: radio,
|
|
width: size,
|
|
height: size,
|
|
success(res) {
|
|
resolve(res.data);
|
|
},
|
|
fail(err) {
|
|
console.log(err);
|
|
reject();
|
|
}
|
|
},
|
|
this
|
|
);
|
|
});
|
|
},
|
|
getBankLogo() {
|
|
return new Promise((resolve, reject) => {
|
|
uni.downloadFile({
|
|
url: this.$wanlshop.appstc(`/bank/${this.bankCode}.png`),
|
|
success(res) {
|
|
resolve(res.tempFilePath);
|
|
},
|
|
fail(err) {
|
|
console.log(err);
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
},
|
|
draw(context, reserve = false) {
|
|
return new Promise((resolve) => {
|
|
context.draw(reserve, () => {
|
|
resolve();
|
|
});
|
|
});
|
|
}
|
|
},
|
|
created() {
|
|
this.$nextTick(() => {
|
|
this.buildItem();
|
|
});
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style>
|
|
.omit {
|
|
font-size: 48rpx;
|
|
margin-right: 30rpx;
|
|
}
|
|
.card-code {
|
|
margin-top: 15rpx;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
color: #FFFFFF;
|
|
font-size: 38rpx;
|
|
|
|
}
|
|
.flex-1 {
|
|
flex: 1;
|
|
}
|
|
.card-type {
|
|
font-size: 24rpx;
|
|
color: #F1F1F1;
|
|
}
|
|
.bank-name {
|
|
font-size: 32rpx;
|
|
color: #FFFFFF;
|
|
}
|
|
.bank-info {
|
|
display: flex;
|
|
flex-direction: column;
|
|
margin-left: 30rpx;
|
|
}
|
|
.bank-head {
|
|
display: flex;
|
|
flex: 1;
|
|
align-items: center;
|
|
}
|
|
.bank-head image {
|
|
width: 100rpx;
|
|
height: 100rpx;
|
|
padding: 15rpx;
|
|
background-color: #FFFFFF;
|
|
border-radius: 50%;
|
|
overflow: hidden;
|
|
}
|
|
.bank-icon {
|
|
position: absolute;
|
|
top: 20rpx;
|
|
left: 20rpx;
|
|
width: 100rpx;
|
|
height: 100rpx;
|
|
}
|
|
|
|
.bank-watermark {
|
|
position: absolute;
|
|
right: 60rpx;
|
|
bottom: -30rpx;
|
|
width: 120rpx;
|
|
height: 120rpx;
|
|
filter: grayscale(100%) brightness(400%);
|
|
opacity: 0.1;
|
|
}
|
|
|
|
.bank-item {
|
|
flex: 1;
|
|
margin-top: 20rpx;
|
|
position: relative;
|
|
border-radius: 20rpx;
|
|
padding: 20rpx;
|
|
}
|
|
|
|
/* .bank-item:after {
|
|
content: "";
|
|
display: block;
|
|
background: inherit;
|
|
filter: blur(10rpx);
|
|
position: absolute;
|
|
width: 100%;
|
|
height: 100%;
|
|
top: 10rpx;
|
|
left: 10rpx;
|
|
z-index: -1;
|
|
opacity: 0.4;
|
|
transform-origin: 0 0;
|
|
border-radius: inherit;
|
|
transform: scale(1, 1);
|
|
} */
|
|
</style>
|
|
|