| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- /**
- * H5公共工具函数
- * 避免在多个文件中重复定义相同的函数
- */
- const ENTRY_SOURCE_KEY = "entrySource";
- const ENTRY_SOURCE_MY = "my";
- const AUTH_REDIRECT_DONE_KEY = "authRedirectDone";
- // 获取URL参数的工具函数
- function getUrlParams() {
- const params = {};
- const urlSearchParams = new URLSearchParams(window.location.search);
- for (const [key, value] of urlSearchParams) {
- params[key] = decodeURIComponent(value);
- }
- return params;
- }
- function isAuthPage(pathname = window.location.pathname) {
- return /\/(login|autoLogin)\.html$/i.test(pathname || "");
- }
- function getCurrentPageUrl() {
- return `${window.location.origin}${window.location.pathname}${window.location.search}`;
- }
- function getStoredAuthToken() {
- const userInfo = localStorage.getItem("userInfo");
- if (userInfo) {
- try {
- const parsed = JSON.parse(userInfo);
- const token = parsed?.yhsbToken || parsed?.onlineToken || "";
- if (token) {
- return token;
- }
- } catch (error) {
- console.warn("解析 userInfo 获取 token 失败:", error);
- }
- }
- return (
- localStorage.getItem("yhsbToken") ||
- localStorage.getItem("onlineToken") ||
- ""
- );
- }
- // 小程序进入 H5 时,只有 my 页面主动点击进入的场景才会带 entrySource=my。
- // 因此这里把“from=miniprogram 且不是认证页 且没有 entrySource=my”的页面
- // 统一视为消息直达等需先认证的入口,进入登录/自动登录分流。
- // 但如果已经带了 authRedirectDone=1,说明当前页是登录成功后回跳回来的,
- // 本次不应再重复进入登录分流,否则会在业务页和 autoLogin.html 之间循环跳转。
- function isMiniProgramMessageEntry(params = getUrlParams()) {
- return (
- params.from === "miniprogram" &&
- params[ENTRY_SOURCE_KEY] !== ENTRY_SOURCE_MY &&
- params[AUTH_REDIRECT_DONE_KEY] !== "1" &&
- !isAuthPage()
- );
- }
- // 公共层在每个业务 H5 页面初始化前都会先调用这个函数。
- // 一旦命中消息直达分流,就立即跳到 login.html 或 autoLogin.html,
- // 并把当前业务页完整地址放到 redirect 参数里,登录成功后再尝试回到这里。
- function handleMessageEntryAuthRedirect() {
- const params = getUrlParams();
- if (!isMiniProgramMessageEntry(params)) {
- return false;
- }
- const redirectUrl = getCurrentPageUrl();
- const token = getStoredAuthToken();
- const authPage = token ? "autoLogin" : "login";
- const authUrl = `/page/${authPage}.html?entryScene=message&redirect=${encodeURIComponent(
- redirectUrl
- )}`;
- console.log("🔐 检测到消息直达页面,准备跳转认证页:", {
- authPage,
- redirectUrl,
- hasToken: !!token,
- });
- window.location.replace(authUrl);
- return true;
- }
- // 获取设备信息 (优先从URL参数获取,备用从localStorage获取)
- function getDeviceInfo() {
- const urlParams = getUrlParams();
- // 优先从URL参数获取
- let deviceId = urlParams.devId || "";
- let model = urlParams.sbmc || "";
- // 如果URL参数中没有,尝试从localStorage获取
- if (!deviceId || !model) {
- const cachedDeviceInfo = localStorage.getItem("deviceInfo");
- if (cachedDeviceInfo) {
- try {
- const parsed = JSON.parse(cachedDeviceInfo);
- deviceId = deviceId || parsed.deviceId || "";
- model = model || parsed.model || "";
- console.log("🔄 从localStorage获取设备信息:", { deviceId, model });
- } catch (e) {
- console.warn("解析localStorage中的设备信息失败:", e);
- }
- }
- }
- // 如果获取到了设备信息,保存到localStorage作为备用
- if (deviceId && model) {
- const deviceInfo = { deviceId, model };
- localStorage.setItem("deviceInfo", JSON.stringify(deviceInfo));
- }
- return {
- deviceId: deviceId,
- model: model,
- };
- }
- // 获取JSESSIONID (多源获取,确保可用性)
- function getJSessionId() {
- // 优先级:localStorage > URL参数 > Cookie
- let jsessionId = localStorage.getItem("JSESSIONID");
- if (!jsessionId) {
- const urlParams = getUrlParams();
- jsessionId = urlParams.JSESSIONID;
- }
- if (!jsessionId) {
- // 尝试从document.cookie中获取
- const cookies = document.cookie.split(";");
- for (let cookie of cookies) {
- const [name, value] = cookie.trim().split("=");
- if (name === "JSESSIONID") {
- jsessionId = value;
- break;
- }
- }
- }
- console.log("🔍 获取JSESSIONID:", {
- fromLocalStorage: localStorage.getItem("JSESSIONID"),
- fromURL: getUrlParams().JSESSIONID,
- final: jsessionId,
- });
- return jsessionId || "";
- }
- // 保存JSESSIONID到localStorage
- function saveJSessionId(jsessionId) {
- if (jsessionId) {
- localStorage.setItem("JSESSIONID", jsessionId);
- console.log("✅ H5 JSESSIONID已保存:", jsessionId);
- }
- }
- // 模拟微信授权码获取 (H5环境下的处理)
- function getMockWechatCode() {
- // 在H5环境下,我们可以生成一个模拟的code
- // 实际项目中可能需要接入微信H5授权
- return "h5_mock_code_" + Date.now();
- }
- // 用户信息管理
- const userManager = {
- // 保存用户信息
- saveUserInfo(userInfo) {
- console.log("💾 H5保存用户信息:", userInfo);
- localStorage.setItem("userInfo", JSON.stringify(userInfo));
- },
- // 获取保存的用户信息
- getSavedUserInfo() {
- const userInfo = localStorage.getItem("userInfo");
- return userInfo ? JSON.parse(userInfo) : null;
- },
- // 检查登录状态
- checkLoginStatus() {
- const userInfo = localStorage.getItem("userInfo");
- const jsessionId = localStorage.getItem("JSESSIONID");
- console.log("🔍 H5检查登录状态:", {
- hasUserInfo: !!userInfo,
- hasJSessionId: !!jsessionId,
- });
- return {
- isLoggedIn: !!(userInfo && jsessionId),
- userInfo: userInfo ? JSON.parse(userInfo) : null,
- jsessionId: jsessionId,
- };
- },
- // 清除登录信息
- clearLoginInfo() {
- localStorage.removeItem("userInfo");
- localStorage.removeItem("JSESSIONID");
- localStorage.removeItem("deviceInfo");
- console.log("🧹 已清除登录信息");
- },
- };
- // 获取图片URL (用于图片回显)
- function getImageUrl(path) {
- if (!path) return "";
- // 如果已经是完整URL,直接返回
- if (
- path.startsWith("http://") ||
- path.startsWith("https://") ||
- path.startsWith("blob:")
- ) {
- return path;
- }
- // 获取baseUrl (从request中获取或使用默认值)
- const baseUrl = window.request?.defaults?.baseURL || window.location.origin;
- // 构造图片下载URL
- return baseUrl + "/service?ssServ=dlByHttp&type=img&path=" + path;
- }
- // 获取文件URL (用于文件下载)
- function getFileUrl(path) {
- if (!path) return "";
- // 如果已经是完整URL,直接返回
- if (path.startsWith("http://") || path.startsWith("https://")) {
- return path;
- }
- // 获取baseUrl
- const baseUrl = window.request?.defaults?.baseURL || window.location.origin;
- // 构造文件下载URL
- return baseUrl + "/service?ssServ=dlByHttp&type=file&path=" + path;
- }
- // 格式化日期时间 (使用 dayjs)
- function formatDate(dateStr, format = "YYYY-MM-DD HH:mm:ss") {
- if (!dateStr) {
- console.log("formatDate: 时间字符串为空");
- return "";
- }
- console.log("formatDate 输入:", dateStr, "格式要求:", format);
- // 检查 dayjs 是否可用
- if (typeof dayjs === "undefined") {
- console.error("❌ dayjs 未加载,无法格式化时间");
- return dateStr;
- }
- // 清理字符串:移除特殊空格字符(如 \u202F),替换为普通空格
- const cleanedDateStr = String(dateStr)
- .replace(/[\u202F\u00A0]/g, " ") // 替换不间断空格
- .replace(/\s+/g, " ") // 多个空格合并为一个
- .trim();
- console.log("清理后的字符串:", cleanedDateStr);
- // 尝试使用原生 Date 解析(兼容性最好)
- let date = null;
- try {
- const jsDate = new Date(cleanedDateStr);
- if (!isNaN(jsDate.getTime())) {
- date = dayjs(jsDate);
- console.log("✅ 使用 Date 解析成功");
- }
- } catch (e) {
- console.warn("Date 解析失败:", e);
- }
- // 如果 Date 解析失败,尝试直接用 dayjs
- if (!date || !date.isValid()) {
- date = dayjs(cleanedDateStr);
- console.log("尝试使用 dayjs 直接解析");
- }
- console.log("dayjs 解析结果 isValid:", date ? date.isValid() : "null");
- if (!date || !date.isValid()) {
- console.warn("⚠️ 无效的日期格式:", dateStr);
- return ""; // 解析失败返回空字符串
- }
- // dayjs 的格式化 (支持常见格式)
- // dayjs 使用大写的格式标记: YYYY-MM-DD HH:mm:ss
- const result = date.format(format);
- console.log("格式化结果:", result);
- return result;
- }
- window.ENTRY_SOURCE_KEY = ENTRY_SOURCE_KEY;
- window.ENTRY_SOURCE_MY = ENTRY_SOURCE_MY;
- window.getUrlParams = getUrlParams;
- window.isAuthPage = isAuthPage;
- window.getCurrentPageUrl = getCurrentPageUrl;
- window.getStoredAuthToken = getStoredAuthToken;
- window.isMiniProgramMessageEntry = isMiniProgramMessageEntry;
- window.handleMessageEntryAuthRedirect = handleMessageEntryAuthRedirect;
- window.getDeviceInfo = getDeviceInfo;
- window.getJSessionId = getJSessionId;
- window.saveJSessionId = saveJSessionId;
- window.getMockWechatCode = getMockWechatCode;
- window.userManager = userManager;
- window.getImageUrl = getImageUrl;
- window.getFileUrl = getFileUrl;
- window.formatDate = formatDate;
- // 同时挂载到SS.utils下(兼容组件调用)
- if (!window.SS.utils) {
- window.SS.utils = {};
- }
- window.SS.utils.getImageUrl = getImageUrl;
- window.SS.utils.getFileUrl = getFileUrl;
- window.SS.utils.formatDate = formatDate;
- console.log("✅ H5公共工具已加载");
|