flat: 一体机兼容,添加全局事件扫码回调等
This commit is contained in:
38
App.vue
38
App.vue
@@ -1,14 +1,17 @@
|
||||
<script setup>
|
||||
import { reactive, inject, onMounted } from 'vue';
|
||||
import { onLaunch, onShow, onHide } from '@dcloudio/uni-app';
|
||||
import { IncreaseRevie } from '@/common/all-in-one-listen.js';
|
||||
import useUserStore from './stores/useUserStore';
|
||||
import usePageAnimation from './hook/usePageAnimation';
|
||||
import useDictStore from './stores/useDictStore';
|
||||
import { useGlobalInactivity } from '@/hook/useGlobalInactivity';
|
||||
const { $api, navTo, appendScriptTagElement, aes_Decrypt, sm2_Decrypt, safeReLaunch } = inject('globalFunction');
|
||||
import config from '@/config.js';
|
||||
import baseDB from '@/utils/db.js';
|
||||
usePageAnimation();
|
||||
const appword = 'aKd20dbGdFvmuwrt'; // 固定值
|
||||
let uQRListen = null;
|
||||
|
||||
onLaunch((options) => {
|
||||
useDictStore().getDictData();
|
||||
@@ -25,6 +28,7 @@ onLaunch((options) => {
|
||||
useUserStore().logOutApp();
|
||||
useUserStore().changMiniProgramAppStatus(true);
|
||||
useUserStore().changMachineEnv(true);
|
||||
uQRListen = new IncreaseRevie();
|
||||
return;
|
||||
}
|
||||
// 正式上线去除此方法
|
||||
@@ -54,12 +58,40 @@ onHide(() => {
|
||||
console.log('App Hide');
|
||||
});
|
||||
|
||||
const { resume, pause } = useGlobalInactivity(() => {
|
||||
console.warn('【全局】60秒无操作,执行安全登出...');
|
||||
uni.showModal({
|
||||
title: '会话即将过期',
|
||||
content: '长时间无操作,是否继续使用?',
|
||||
showCancel: true,
|
||||
cancelText: '退出',
|
||||
confirmText: '继续',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
resume();
|
||||
} else {
|
||||
handleLogout();
|
||||
}
|
||||
},
|
||||
});
|
||||
}, 60 * 1000);
|
||||
|
||||
function handleLogout() {
|
||||
// 清除 token、跳转登录页
|
||||
uni.clearStorageSync();
|
||||
baseDB.resetAndReinit();
|
||||
useUserStore().logOutApp();
|
||||
pause();
|
||||
}
|
||||
|
||||
// 一体机环境判断
|
||||
function isY9MachineType() {
|
||||
const ua = navigator.userAgent;
|
||||
const isY9Machine = /Y9-ZYYH/i.test(ua); // 匹配机器型号
|
||||
return isY9Machine;
|
||||
}
|
||||
|
||||
// 爱山东环境登录
|
||||
function getUserInfo() {
|
||||
lightAppJssdk.user.getUserInfoWithEncryptedParamByAppId({
|
||||
appId: config.appInfo.loveShandong, // 接入方在成功创建应用后自动生成
|
||||
@@ -180,19 +212,19 @@ uni-modal,
|
||||
|
||||
@font-face {
|
||||
font-family: PingFangSC-Regular;
|
||||
src: url('https://qd.zhaopinzao8dian.com/file/csn/PingFangSC-Regular.woff2') format('woff2');
|
||||
src: url('/static/font/PingFangSC-Regular.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: PingFangSC-Medium;
|
||||
src: url('https://qd.zhaopinzao8dian.com/file/csn/PingFangSC-Medium.woff2') format('woff2');
|
||||
src: url('/static/font/PingFangSC-Medium.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: DIN-Medium;
|
||||
src: url('./static/font/DIN-Medium.woff2') format('woff2');
|
||||
src: url('/static/font/DIN-Medium.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
|
||||
65
common/all-in-one-listen.js
Normal file
65
common/all-in-one-listen.js
Normal file
@@ -0,0 +1,65 @@
|
||||
import {
|
||||
$api
|
||||
} from "./globalFunction";
|
||||
import baseDB from '@/utils/db.js';
|
||||
import useUserStore from '@/stores/useUserStore';
|
||||
|
||||
export class IncreaseRevie {
|
||||
constructor(arg) {
|
||||
this.myEventCallback = this.myCallback.bind(this);
|
||||
this._debounceTimer = null;
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.close();
|
||||
setTimeout(() => {
|
||||
if (window.hh?.on) {
|
||||
window.hh.on('initQRListener', this.myEventCallback);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
close() {
|
||||
if (window.hh?.off) {
|
||||
window.hh.off('initQRListener', this.myEventCallback);
|
||||
}
|
||||
if (this._debounceTimer) {
|
||||
clearTimeout(this._debounceTimer);
|
||||
this._debounceTimer = null;
|
||||
}
|
||||
}
|
||||
|
||||
myCallback(res) {
|
||||
if (this._debounceTimer) {
|
||||
clearTimeout(this._debounceTimer);
|
||||
}
|
||||
|
||||
this._debounceTimer = setTimeout(() => {
|
||||
this.handleDebouncedCallback(res);
|
||||
this._debounceTimer = null;
|
||||
}, 300);
|
||||
}
|
||||
|
||||
async handleDebouncedCallback(res) {
|
||||
if (res.data) {
|
||||
const code = res.data.qrQode
|
||||
console.log('二维码code', code);
|
||||
// 把code给到后端,后端拿code兑换用户信息,给前端返回token进行登录
|
||||
// 一体机用户需要清空indexDB
|
||||
// useUserStore()
|
||||
// .loginSetToken(resData.token)
|
||||
// .then((resume) => {
|
||||
// if (resume.data.jobTitleId) {
|
||||
// useUserStore().initSeesionId();
|
||||
// safeReLaunch('/pages/index/index');
|
||||
// } else {
|
||||
// safeReLaunch('/pages/login/login');
|
||||
// }
|
||||
// });
|
||||
// baseDB.resetAndReinit(); // 清空indexdb
|
||||
} else {
|
||||
$api.msg('识别失败')
|
||||
}
|
||||
}
|
||||
}
|
||||
80
hook/useGlobalInactivity.js
Normal file
80
hook/useGlobalInactivity.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// hook/useGlobalInactivity.js
|
||||
import {
|
||||
onMounted,
|
||||
onUnmounted
|
||||
} from 'vue'
|
||||
|
||||
export function useGlobalInactivity(callback, timeout = 60000) {
|
||||
let timer = null
|
||||
let isPaused = false
|
||||
|
||||
// ===== 高频事件节流 =====
|
||||
let lastActivityTime = 0
|
||||
const THROTTLE_DELAY = 300 // 300ms 内最多响应一次活动
|
||||
|
||||
const handleUserActivity = () => {
|
||||
const now = Date.now()
|
||||
if (now - lastActivityTime > THROTTLE_DELAY) {
|
||||
lastActivityTime = now
|
||||
resetTimer()
|
||||
}
|
||||
}
|
||||
|
||||
// 低频事件(可直接绑定)
|
||||
const lowFreqEvents = ['mousedown', 'click', 'keydown', 'touchstart']
|
||||
// 高频事件(需节流)
|
||||
const highFreqEvents = ['mousemove', 'scroll', 'wheel', 'pointermove']
|
||||
|
||||
const resetTimer = () => {
|
||||
if (isPaused) return
|
||||
if (timer) clearTimeout(timer)
|
||||
timer = setTimeout(() => {
|
||||
callback()
|
||||
pause() // 默认触发后停止
|
||||
}, timeout)
|
||||
}
|
||||
|
||||
const pause = () => {
|
||||
isPaused = true
|
||||
if (timer) {
|
||||
clearTimeout(timer)
|
||||
timer = null
|
||||
}
|
||||
lowFreqEvents.forEach(e => document.removeEventListener(e, resetTimer, true))
|
||||
highFreqEvents.forEach(e => document.removeEventListener(e, handleUserActivity, true))
|
||||
document.removeEventListener('visibilitychange', handleVisibilityChange)
|
||||
}
|
||||
|
||||
const resume = () => {
|
||||
if (!isPaused) return
|
||||
isPaused = false
|
||||
resetTimer()
|
||||
lowFreqEvents.forEach(e => document.addEventListener(e, resetTimer, true))
|
||||
highFreqEvents.forEach(e => document.addEventListener(e, handleUserActivity, true))
|
||||
document.addEventListener('visibilitychange', handleVisibilityChange)
|
||||
}
|
||||
|
||||
const handleVisibilityChange = () => {
|
||||
if (document.hidden) {
|
||||
pause()
|
||||
} else {
|
||||
resume()
|
||||
}
|
||||
}
|
||||
|
||||
const start = () => {
|
||||
if (isPaused) return
|
||||
resetTimer()
|
||||
lowFreqEvents.forEach(e => document.addEventListener(e, resetTimer, true))
|
||||
highFreqEvents.forEach(e => document.addEventListener(e, handleUserActivity, true))
|
||||
document.addEventListener('visibilitychange', handleVisibilityChange)
|
||||
}
|
||||
|
||||
onMounted(start)
|
||||
onUnmounted(pause)
|
||||
|
||||
return {
|
||||
resume,
|
||||
pause
|
||||
}
|
||||
}
|
||||
@@ -368,6 +368,9 @@ function loginbackdoor() {
|
||||
if (isMachineEnv.value) {
|
||||
useUserStore().logOutApp();
|
||||
$api.msg('返回首页');
|
||||
// setTimeout(() => {
|
||||
// window.location.reload();
|
||||
// }, 2000);
|
||||
return;
|
||||
}
|
||||
$api.createRequest('/app/mock/login', {}, 'post').then((resData) => {
|
||||
@@ -1056,4 +1059,4 @@ function complete() {
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
line-height: 90rpx
|
||||
</style>
|
||||
</style>
|
||||
BIN
static/font/PingFangSC-Medium.woff2
Normal file
BIN
static/font/PingFangSC-Medium.woff2
Normal file
Binary file not shown.
BIN
static/font/PingFangSC-Regular.woff2
Normal file
BIN
static/font/PingFangSC-Regular.woff2
Normal file
Binary file not shown.
Reference in New Issue
Block a user