279 lines
10 KiB
Plaintext
Raw Permalink Normal View History

2025-03-11 17:57:17 +08:00
<template>
<view class="page" :style="{height: height+'px'}" v-if="onlyFromCamera">
<barcode :style="{height: height+'px'}" id="hs-scan" class="barcode" ref="barcode" autostart
frameColor="#0cff00" scanbarColor="#0cff00" background="#000000" :filters="fil" @marked="success"
@error="error">
</barcode>
<view @click="back" class="back" hover-class="css-hover">
<image :src="scan_img.back" style="width: 28px;height: 28px;"></image>
</view>
<text class="msg">{{msg}}</text>
<view class="flash" :style="{bottom: (height/2 - 120)+'px'}" @click="toFlash()" hover-class="css-hover">
<image class="flash-img" :src="flash_img" style="width: 30px;height: 30px;"></image>
<text class="flash-text" :class="flash?'flash-on':''">{{flash?"轻触关闭":"轻触点亮"}}</text>
</view>
</view>
<view class="page" :style="{height: height+'px'}" v-else>
<barcode :style="{height: height+'px'}" id="hs-scan" class="barcode" ref="barcode" autostart
frameColor="#0cff00" scanbarColor="#0cff00" background="#000000" :filters="fil" @marked="success"
@error="error">
</barcode>
<view @click="back" class="back" hover-class="css-hover">
<image :src="scan_img.back" style="width: 28px;height: 28px;"></image>
</view>
<text class="msg">{{msg}}</text>
<view class="flash" :style="{bottom: (height/2 - 120)+'px'}" @click="toFlash()" hover-class="css-hover">
<image class="flash-img" :src="flash_img" style="width: 30px;height: 30px;"></image>
<text class="flash-text" :class="flash?'flash-on':''">{{flash?"轻触关闭":"轻触点亮"}}</text>
</view>
<view @click="toScan" class="album" hover-class="css-hover">
<image :src="scan_img.album" style="height: 26px;width: 26px;"></image>
</view>
</view>
</view>
</template>
<script>
const _image = {
flash_off: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABSElEQVRoge2UMS9DYRRAP20MdOhuEIOIFbXZGAw2xMpiM0vslf6Cpt1MJBabxSLEJuEPiMEiFsSKY3mSG9K+vtfvvit1T3K39+49p2kbguM4/wugBqwrzCJQ0pZfRZe6dsCacsC+akASMQMsKcwC2l8hxxpgA7hWnEPtgJ3Yv9of3BQZcAWcRZpni4CpiHsvPaDHQwMVsBJpZwW4KypgGfhMjr0CtT73DQOn4kM5juXa7eimiHgBZnPuKQMnQv4CGInt2+n4rjj8BEzn2NEUO26BqoZrN4GGEHgAJjK8uyfevQfGFFU7SgwBLfrjEZgsXF5ElICjnPJvwLyZvIiYE1LnQDtlvv8A2tbuIYRfAVs9PP+ePNsswi8VD7DGA6zxAGs8wBoPsMYDrPEAawYt4ADYTpmPvxyQBQ+IAjCaRGSdcWt3xwkhfAHeC7+Yzq/O8QAAAABJRU5ErkJggg==',
flash_on: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABi0lEQVRoge2WPyhFYRiHT0n5k4GyuINRWe5gYrqJQiyKzYRJsir/VgMx3JgMjOyGmyxSVqOSwU0pumVg4zHc9+bonO9c5/rOfTu376lv+r2d9/fU+erzPIej/gBTQB5oqTK3BbwBuYiZduAcWLJeNGLpLWX2qsxdydxaxMyhzNzYb2peOi1Lv4DxiLmKwLohn/V9ZzS5xuHLj2X5E9BlmDEKAD3Ai+QHyTcOFugEHqXApmHmTPL5kGxVsgegI/nGIQA54BoYMuTdwCTQFJL1AkfAQPJNGxFgGHgGShbOqYbAMvYoOoEaBBYtCtxrCLRSvgcjFk5f3QVEYhCYsXDatATGLPw+BZXyPonCP8p/AlltgawUqYUT1fIV+HnYxeEdyGh39zzP84CMFIrDtnbvXwA7McqXMDzB1QAmYghcavcN4AS0MQhcAPsEL3gqBF6BZsk20ihw58sWnEDSNKJA0ZetpFEAYBeYA4ppFTDhBKzjBLRxAto4AW2cgDZOQBugH/j4o0Beu6/DIXwDQ+8GvfIPRuwAAAAASUVORK5CYII=',
back: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADjElEQVRoge2aW08TQRiGh4QYwg0iSv0fEKAChaRNKychIVj1Qv+UGqOXGhJCDEoiaEwTwqWmGg+pRq64IB5impa0C9vT40W30G6325nulgXDm+xNd3fmfWa+mZ2Zr0Kc6z8V0AH0GleH135sBVwF7gHPgK9AmnqljXtPgbuAz2vTHcAs8BooAjmgYGHcrILxbBHYBGZOvIcM4z8MMzKm7WAKwHdg+iSM9wPrRqUlB8bNKlHukRfA5XaZDwB/Ad1F42bpwB9g1G3z88jHuFMVDJA5N827HTLNVDLqnHVqfpxyy3ulHHCtVfM+yjFf9BCgSHlMXGkFYIP2DlhZHQLrquav423Lm1UEQrLmO4BvnD6AL8h8sYEbKEyXOzs7bG1tUSrJT1L5fJ5YLMbu7q4qxIwMwFskWz+RSNDV1YUQgmg0Sj6fb/qOpmmEw2GEEPT09LC3tycLUAA2mpn3yZoHWF5eRghxdC0tLdlCaJpGKBSqeScWi8lWV4FovNQA7qAw82SzWQYGBqQgrMwHg0GpXquSDty0A3gCKJWYTqfx+/01xqampjg8PDx6Zn9/n9HR0Zpn5ubm0HXlWToHPLID+KxaIkAmkyEQCFhCuGi+oo92AJlWS00mkwwODtYYXVxcJBgM1oVNNptttRqA/UbmLzgpFco9MTExUWPYxZavVqcVwCU3Sm4E4aJ5gN62AVgNaiEEkUiEg4MDN6qABgCOQ6iR+TZA1IeQ00FsFTqRSIShoaGa3+bn552GkvUgNgA+tVKiVcsvLCyQy+XIZDJMTk7W3AuHw0564oMdwGMUd2DJZLLua1wxX1EjCE3TVM3ngId2AFEUlhK6rjf8gJmVSqUYHh6uAy0WlVbtOWDRDqAPhaX0yspKjaHp6WlL83YQ29vbKgB54GJDAAPiDZIr0ng8Tmdnp5T5aoiRkRGEEHR3d6vsCQrAK1vzBoDShiYej7O2tqa0qtQ0jdXVVRKJhPQ7KGxozvaW0oAY52QPspqpBIxJma+CeM7pOFbRgRUl8wZAH/Abb0OpAPzEau0jCTFGee71IpxKlFvf35L5Koize7hrgqikhdqtIm4er1dBBCgftCovYBSkAb9wO8FRBdEPvMR5bsysSu+u0a4UkwnE7SRfgpNI8pkgKmnWTY7TrDLriTzH6aoNvEizWsD4gNvAA+A9kLIwngLeAfeBW3id6G4mztJfDc7lQP8ALX0r5IbFIHwAAAAASUVORK5CYII=',
album: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoge3YO2gUURiG4WgUMeINQ7xgFZDYiIWilSBesbQTxSKFNipi4Q0URIkgWEhsLAUbsUiTwl6xSCFGIWorIghRRLyLyWMxZ/G4zk5ms7szK+wHpznzH/733ZnZOTNdXZ100kknbRv0YR8GcbTgMRh6980GvB+jmFZ+piUs/XnhN2GyXObUTGLTTPDL8DZadBc7MSA5K0WOgdD7bsTzFsuyBC5Exefruu5aGJyNuC5kFT4NRc8wt0DGzGBuxDaeVfg5FA1XzS/GTXwKx59ge6vBqxhuhN5fsooquRrNdeORfzONvYXQJxyXo97pV0cNgf0p8JU8/h8ErmQITKG73QVOZghMFgHfqMBKvKshcKntBcL8Hryvgr+H+YXQdzUoEI6txjHJQ6Wwf5+of2MCZadtBDAPt/AKJ+pY1zYC56rupW0515UvgDX+bEcqGcOcHGvbQuC29BzKsbZcAWxV+w3vNXoKFcAqOZ8DmIOHNeArOV2YAK5Hv9zaHAIHZoCHD+htuQC2VTUenQF+ib9fU7Nyq6UCkkthLKXxvozGQznh4Rc2tFLgYI3GL6TcD1iHH3UIwP2WCKBHcs3XyqmUNSN1wlfyz16rGQLVT9DqfMSqqH7PLOHhOeY1TQC9kn+JmTKCBZKd68sGBGCwmQLDdTT+LrkZG80bLKpX4FsouBHNDeBnE4Bmk4sRx80w9zUVPhRNhKKxaO5MKehJ7kQcj8PcRJbAtWjx4TC3EDuwq+CxE0sDw5GIayhLoM+fd98pyZahH8tLGusDw1RgmsSKmgJBYje+pp/RUvNd3s+Zkq3veMnAcR5gcy74KpEtOC75ElHGGMTGusE76aSTTgrLbyY65XbJ3W1oAAAAAElFTkSuQmCC',
};
const SCAN_MAPS = {
[0]: "QR_CODE",
[1]: "EAN_13",
[2]: "EAN_8",
[3]: "AZTEC",
[4]: "DATA_MATRIX",
[5]: "UPC_A",
[6]: "UPC_E",
[7]: "CODABAR",
[8]: "CODE_39",
[9]: "CODE_93",
[10]: "CODE_128",
[11]: "CODE_25",
[13]: "PDF_417",
[14]: "RSS_14",
[15]: "RSSEXPANDED"
};
export default {
data: {
evalName: "hs-scancode", //扫码回调监听事件
flash: false, //手电筒
vibrate: true, //震动
sound: "none", //声音 none default
fil: [0, 1, 2], //条码类型
msg: "扫码", //提示文本
height: 600, //高度
isDark: null, //状态栏前景色 黑色
fullScreen: false, //是否全屏
onlyFromCamera: false, //从相册获取
},
computed: {
scan_img() {
return _image
},
flash_img() {
return this.flash ? _image.flash_on : _image.flash_off;
},
},
onLoad(p) {
//参数
if (p.evalName) this.evalName = p.evalName;
if (p.flash) this.flash = p.flash == 'true';
if (p.vibrate) this.vibrate = p.vibrate == 'true';
if (p.sound) this.sound = p.sound;
if (p.msg) this.msg = p.msg;
if (p.fil) this.fil = p.fil.split(',').map(x => parseInt(x));
if (p.fullScreen) this.fullScreen = p.fullScreen == 'true';
if (p.onlyFromCamera) this.onlyFromCamera = p.onlyFromCamera == 'true';
this.setFullOrStatus(true);
uni.getSystemInfo({
success: res => this.height = res.windowHeight
});
setTimeout(() => {
this.toStart();
this.webviewInit();
}, 100);
},
onUnload() {
this.setFullOrStatus(false);
this.toFlash(false);
uni.$off(this.evalName);
},
onBackPress(e) {
if (e.from === 'backbutton') this.back(0);
else this.setFullOrStatus(false);
},
methods: {
webviewInit() {
var pages = getCurrentPages();
var currentWebview = pages[pages.length - 1].$getAppWebview();
//ios 左滑关闭
currentWebview.addEventListener('popGesture', e => {
const type = e.type,
result = e.result;
if (type === 'start') {
this.setFullOrStatus(false);
this.toFlash(false);
this.toCancel();
} else if (type === 'end' && result) {
this.back(0)
} else if (type === 'end' && !result) {
this.setFullOrStatus(true);
this.toStart();
}
});
},
success(e) {
uni.$emit(this.evalName, [null, {
"hsScanCode": true,
"result": e.detail.message,
"scanType": SCAN_MAPS[e.detail.code],
"charSet": "utf8",
"path": e.detail.file || "",
"errMsg": "scanCode:ok"
}]);
},
error(e, cancel) {
uni.$emit(this.evalName, [{
"hsScanCode": true,
"errMsg": cancel === true ? "scanCode:fail cancel" : "scanCode:fail"
}, null]);
if (!cancel) this.toStart();
},
toStart: function() {
this.$refs.barcode && this.$refs.barcode.start({
conserve: false,
vibrate: this.vibrate,
sound: this.sound,
});
},
toCancel: function() {
this.$refs.barcode.cancel();
},
toFlash: function(t) {
this.flash = t == null ? !this.flash : t;
this.$refs.barcode.setFlash(this.flash);
},
toScan: async function() {
this.toCancel();
const [e, res] = await uni.chooseImage({
count: 1,
sizeType: ['original'],
sourceType: ['album']
});
if (res && res.tempFilePaths.length > 0) {
const barcodeModule = uni.requireNativePlugin('barcodeScan');
barcodeModule.scan(res.tempFilePaths[0], e => {
if (e.detail.type === "success") {
this.success(e);
} else {
this.error(e);
}
this.toStart();
});
} else {
this.toStart();
}
},
back(t) {
const p = {
delta: 1
}
this.setFullOrStatus(false);
this.toCancel();
this.toFlash(false);
if (t !== 0) uni.navigateBack(p);
},
setFullOrStatus(t) {
if (this.isDark == null) this.isDark = this.getStatusBarStyle() !== 'light';
this.isDark && plus.navigator.setStatusBarStyle(t ? "light" : "dark");
this.fullScreen && plus.navigator.setFullscreen(t)
},
getStatusBarStyle() {
let style = plus.navigator.getStatusBarStyle()
if (style === 'UIStatusBarStyleBlackTranslucent' || style === 'UIStatusBarStyleBlackOpaque' || style ===
'null') {
style = 'light'
} else if (style === 'UIStatusBarStyleDefault') {
style = 'dark'
}
return style
}
}
}
</script>
<style scoped>
.page {
top: 0;
position: fixed;
width: 750rpx;
justify-content: center;
align-items: center;
background-color: #000000;
}
.back {
position: fixed;
left: 5px;
top: 20px;
border-radius: 50;
padding: 15px;
}
.msg {
position: fixed;
top: 90px;
width: 750rpx;
text-align: center;
color: #FFFFFF;
font-size: 16px;
}
.css-hover {
opacity: .4;
}
.barcode {
width: 750rpx;
height: 100%;
background-color: #000000;
}
.flash {
position: absolute;
bottom: 500rpx;
justify-content: center;
align-items: center;
padding: 8px;
}
.flash-text {
margin-top: 3px;
color: #bfbfbf;
font-size: 12px;
}
.flash-on {
color: #FFFFFF;
}
.album {
position: fixed;
bottom: 60px;
right: 30px;
height: 42px;
width: 42px;
padding: 16px;
background-color: rgba(157, 157, 157, .3);
border-radius: 50;
justify-content: center;
align-items: center;
}
</style>