Files
ruo-shan-cloud-pharmacy/miniprogram/app.ts
T
2026-09-01 17:37:58 +08:00

136 lines
3.7 KiB
TypeScript

// app.ts
import { checkUpdate } from './utils/updateManager'
import { BASE_URL } from './env'
// 域名包含 .test. 则为测试环境,不拦截登录
const isTestDomain = (): boolean => BASE_URL.includes('.test.');
// 判断是否在 PC/Mac 环境运行
const isPCEnvironment = (): boolean => {
const sysInfo = wx.getSystemInfoSync();
return ['windows', 'mac'].includes(sysInfo.platform);
};
// 需要随登录态一起清理的 storage key
const LOGIN_STORAGE_KEYS = [
'mbuId', 'userName', 'openId', 'unionId', 'addressId', 'defualtAddress'
] as const;
// 获取安全区域信息(延迟初始化,避免模块加载时调用 wx API)
function getSafeArea() {
// @ts-ignore
const info = wx.getWindowInfo();
return {
safeBottom: info.safeArea.bottom - info.safeArea.height,
safeTop: info.safeArea.top * 2,
};
}
export { };
App<IAppOption>({
globalData: {
isLogin: false,
wasLogin: false,
safeBottom: 0,
safeTop: 0,
store: {},
joinedArray: [],
sseStore: {
chat: [],
system: [],
product: []
},
isModalShowing: false,
},
async onLaunch(props: any) {
// 初始化安全区域
const { safeBottom, safeTop } = getSafeArea();
this.globalData.safeBottom = safeBottom;
this.globalData.safeTop = safeTop;
// PC/Mac 环境拦截(测试域名不拦截)
if (!isTestDomain() && isPCEnvironment()) {
wx.showModal({
title: "提示",
content: "该环境无法使用",
showCancel: false,
confirmText: "我知道了"
});
return;
}
// 处理 OAuth state
const state = props.query?.state;
if (state) {
wx.setStorageSync('state', state);
} else {
wx.removeStorageSync('state');
}
// 检查小程序版本更新
checkUpdate();
},
onHide() {
},
checkLoginState() {
const openId = wx.getStorageSync('openId');
const unionId = wx.getStorageSync('unionId');
const userId = wx.getStorageSync('userId');
const isLoggedIn = !!(openId && unionId && userId);
if (!isLoggedIn) {
// 清理登录相关缓存
LOGIN_STORAGE_KEYS.forEach(key => wx.removeStorageSync(key));
}
// 记录上一次登录状态,用于判断是否从已登录变为未登录
const prev = this.globalData.isLogin;
this.globalData.isLogin = isLoggedIn;
this.globalData.wasLogin = prev;
return isLoggedIn;
},
login(value: string) {
if (!this.checkLoginState()) {
wx.reLaunch({ url: `/pages/login/login?back=${value}` });
return false;
}
return true;
},
redirectLogin() {
if (this.checkLoginState()) {
return true;
}
// 已有 modal 在展示,避免重复弹窗
if (this.globalData.isModalShowing) {
return false;
}
this.globalData.isModalShowing = true;
const content = this.globalData.wasLogin
? '登录状态失效,请重新登录!'
: '请登录获取完整服务!';
wx.showModal({
title: '登录提示',
content,
confirmText: '去登录',
success: (options) => {
if (options.confirm) {
wx.navigateTo({ url: '/pages/login/login' });
}
},
complete: () => {
this.globalData.isModalShowing = false;
}
});
return false;
}
});