浏览代码

注意事项bug和时间相关修改

zhangjie 4 年之前
父节点
当前提交
d399e9dfc8
共有 4 个文件被更改,包括 102 次插入28 次删除
  1. 1 1
      card/store/card.js
  2. 3 1
      src/main.js
  3. 2 2
      src/modules/login/views/Login.vue
  4. 96 24
      src/plugins/syncServerTime.js

+ 1 - 1
card/store/card.js

@@ -616,7 +616,7 @@ const actions = {
       if (checkElementIsCurColumnFirstType(element)) {
         elementList.unshift(
           getTopicHeadModel(
-            state.cardConfig[`${element.sign}Notice`],
+            state.cardConfig[`${element.sign}Attention`],
             element.sign,
             !curColumnElements.length
           )

+ 3 - 1
src/main.js

@@ -17,7 +17,7 @@ import "element-ui/lib/theme-chalk/index.css";
 import "./assets/styles/index.scss";
 import "../card/assets/styles/module.scss";
 import { PLATFORM, DEVICE_ID } from "./constants/app";
-import { fetchTime } from "./plugins/syncServerTime";
+import { initSyncTime, fetchTime } from "./plugins/syncServerTime";
 
 Vue.use(ElementUI, { size: "medium" });
 
@@ -110,6 +110,7 @@ axios.interceptors.request.use(
 );
 axios.interceptors.response.use(
   response => {
+    initSyncTime(new Date(response.headers.date).getTime());
     // 关闭loading提示
     setTimeout(() => {
       queue.shift();
@@ -118,6 +119,7 @@ axios.interceptors.response.use(
     return response;
   },
   error => {
+    initSyncTime(new Date(error.response.headers.date).getTime());
     // 关闭loading提示
     setTimeout(() => {
       queue.shift();

+ 2 - 2
src/modules/login/views/Login.vue

@@ -77,7 +77,7 @@ import {
 import { Base64 } from "@/plugins/crypto";
 import ResetPwd from "@/modules/base/components/ResetPwd";
 import { ORG_CODE } from "@/constants/app";
-import { syncTime } from "@/plugins/syncServerTime";
+import { initSyncTime } from "@/plugins/syncServerTime";
 
 const wstorage = {
   set(key, value, expire = null) {
@@ -148,7 +148,7 @@ export default {
   methods: {
     async syncServerTime() {
       const time = await getSysTime();
-      syncTime(time);
+      initSyncTime(time);
     },
     async getSmsCodeRequired() {
       const data = await getSysConfig("sys.code.enable");

+ 96 - 24
src/plugins/syncServerTime.js

@@ -1,35 +1,107 @@
-let serverTime = getLocalTime();
-let setTs = [];
+/**
+ *
+ * 方案1:
+ * 前端自动递增同步服务端时间
+ * 缺陷:在系统休眠或页面被隐藏时,js有不再执行的可能,自动同步失效。
+ * 弥补:通过监听页面隐藏事件,记录下次显示页面时的时间差,自动修改正本地服务端时间。
+ * 但这样依旧依赖在下次显示页面前,不能修改本地时间。
+ *
+ * 方案2:
+ * 每次初始化服务端时间时记录本地时间与服务端时间差。
+ * 缺陷:在下次初始化服务端时间前,默认用户不会自己修改系统时间
+ * 弥补:在每次请求响应之后,修正时间差。
+ */
 
-syncTime(serverTime);
+// 方案1:
+// let serverTime = getLocalTime();
+// let pageHideTime = null;
+// let setTs = [];
 
-function getLocalTime() {
-  const time = localStorage.getItem("st");
-  const unvalidVals = ["Infinity", "NaN", "null", "undefined"];
-  return unvalidVals.includes(time) ? Date.now() : time * 1;
-}
+// syncTime(serverTime);
 
-function addSetTime(action, time = 1 * 1000) {
-  setTs.push(setTimeout(action, time));
-}
+// function getLocalTime() {
+//   const st = localStorage.getItem("st");
+//   const unvalidVals = ["Infinity", "NaN", "null", "undefined"];
+//   return unvalidVals.includes(st + "") ? Date.now() : st * 1;
+// }
+
+// function addSetTime(action, time = 1 * 1000) {
+//   setTs.push(setTimeout(action, time));
+// }
+
+// function clearSetTs() {
+//   if (!setTs.length) return;
+//   setTs.forEach(t => clearTimeout(t));
+//   setTs = [];
+// }
+
+// function initSyncTime(time) {
+//   syncTime(time);
+// }
+
+// function syncTime(time) {
+//   // console.log(Date.now() - time);
+//   clearSetTs();
+//   serverTime = time;
+//   localStorage.setItem("st", time);
+//   addSetTime(() => {
+//     syncTime(serverTime + 1000);
+//   });
+// }
 
-function clearSetTs() {
-  if (!setTs.length) return;
-  setTs.forEach(t => clearTimeout(t));
-  setTs = [];
+// function pageHide() {
+//   pageHideTime = Date.now();
+//   clearSetTs();
+// }
+// function pageShow() {
+//   const hideTime = pageHideTime || Date.now();
+//   const hideDuration = Date.now() - hideTime;
+//   // console.log(`隐藏时间:${hideDuration}`);
+//   syncTime(serverTime + hideDuration);
+// }
+
+// function fetchTime() {
+//   return serverTime;
+// }
+
+// window.document.addEventListener("visibilitychange", () => {
+//   if (document.hidden) {
+//     pageHide();
+//     // console.log("隐藏了", Date.now() - serverTime);
+//   } else {
+//     pageShow();
+//     // console.log("显示了", Date.now() - serverTime);
+//   }
+// });
+
+// export { initSyncTime, fetchTime };
+
+// 方案2:
+let initLocalTime = null;
+let initServerTime = null;
+
+function getStorgeTime() {
+  const st = localStorage.getItem("st");
+  const unvalidVals = ["Infinity", "NaN", "null", "undefined"];
+  if (unvalidVals.includes(st + "")) {
+    return [Date.now(), Date.now()];
+  } else {
+    const [s, t] = st.split("_");
+    return [s * 1, t * 1];
+  }
 }
 
-function syncTime(time) {
-  clearSetTs();
-  serverTime = time;
-  localStorage.setItem("st", time);
-  addSetTime(() => {
-    syncTime(serverTime + 1000);
-  });
+const [serverTime, localTime] = getStorgeTime();
+initSyncTime(serverTime, localTime);
+
+function initSyncTime(serverTime, localTime = Date.now()) {
+  initLocalTime = localTime;
+  initServerTime = serverTime;
+  localStorage.setItem("st", `${initLocalTime}_${initServerTime}`);
 }
 
 function fetchTime() {
-  return serverTime;
+  return Date.now() + initServerTime - initLocalTime;
 }
 
-export { syncTime, fetchTime };
+export { initSyncTime, fetchTime };