Procházet zdrojové kódy

浏览器icon设置

kyoyue před 6 měsíci
rodič
revize
4a04d2f04f
5 změnil soubory, kde provedl 218 přidání a 163 odebrání
  1. 1 1
      .vscode/settings.json
  2. 183 161
      index.html
  3. 1 0
      src/api/model/baseModel.ts
  4. 15 0
      src/main.ts
  5. 18 1
      src/store/modules/user.ts

+ 1 - 1
.vscode/settings.json

@@ -69,7 +69,7 @@
     "editor.defaultFormatter": "esbenp.prettier-vscode"
   },
   "[html]": {
-    "editor.defaultFormatter": "esbenp.prettier-vscode"
+    "editor.defaultFormatter": "vscode.html-language-features"
   },
   "[css]": {
     "editor.defaultFormatter": "esbenp.prettier-vscode"

+ 183 - 161
index.html

@@ -1,167 +1,189 @@
 <!doctype html>
 <html lang="en" id="htmlRoot">
-  <head>
-    <meta charset="UTF-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-    <meta name="renderer" content="webkit" />
-    <meta
-      name="viewport"
-      content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
-    />
-    <!-- <title><%= VITE_GLOB_APP_TITLE %></title> -->
-    <!-- <link rel="icon" href="./src/assets/images/gooki.ico" /> -->
-    <title>{{title}}</title>
-    <link rel="icon" href="./src/assets/images/gooki.ico" />
-  </head>
-  <body>
-    <div id="app">
-      <style>
-        html {
-          /* same as ant-design-vue/dist/reset.css setting, avoid the title line-height changed */
-          line-height: 1.15;
-        }
-
-        html[data-theme='dark'] .app-loading {
-          background-color: #2c344a;
-        }
-
-        html[data-theme='dark'] .app-loading .app-loading-title {
-          color: rgb(255 255 255 / 85%);
-        }
-
-        .app-loading {
-          display: flex;
-          flex-direction: column;
-          align-items: center;
-          justify-content: center;
-          width: 100%;
-          height: 100%;
-          background-color: #f4f7f9;
-        }
-
-        .app-loading .app-loading-wrap {
-          display: flex;
-          position: absolute;
-          top: 50%;
-          left: 50%;
-          flex-direction: column;
-          align-items: center;
-          justify-content: center;
-          transform: translate3d(-50%, -50%, 0);
-        }
-
-        .app-loading .dots {
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          padding: 98px;
-        }
-
-        .app-loading .app-loading-title {
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          margin-top: 30px;
-          color: rgb(0 0 0 / 85%);
-          font-size: 30px;
-        }
-
-        .app-loading .app-loading-logo {
-          display: block;
-          width: 90px;
-          margin: 0 auto;
-          margin-bottom: 20px;
-        }
-
-        .dot {
-          display: inline-block;
-          position: relative;
-          box-sizing: border-box;
-          width: 48px;
-          height: 48px;
-          margin-top: 30px;
-          transform: rotate(45deg);
-          animation: ant-rotate 1.2s infinite linear;
-          font-size: 32px;
-        }
-
-        .dot i {
-          display: block;
-          position: absolute;
-          width: 20px;
-          height: 20px;
-          transform: scale(0.75);
-          transform-origin: 50% 50%;
-          animation: ant-spin-move 1s infinite linear alternate;
-          border-radius: 100%;
-          opacity: 0.3;
-          background-color: #0065cc;
-        }
-
-        .dot i:nth-child(1) {
-          top: 0;
-          left: 0;
-        }
-
-        .dot i:nth-child(2) {
-          top: 0;
-          right: 0;
-          animation-delay: 0.4s;
-        }
-
-        .dot i:nth-child(3) {
-          right: 0;
-          bottom: 0;
-          animation-delay: 0.8s;
-        }
-
-        .dot i:nth-child(4) {
-          bottom: 0;
-          left: 0;
-          animation-delay: 1.2s;
-        }
-
-        @keyframes ant-rotate {
-          to {
-            transform: rotate(405deg);
-          }
-        }
 
-        @keyframes ant-spin-move {
-          to {
-            opacity: 1;
-          }
-        }
-      </style>
-      <div class="app-loading">
-        <div class="app-loading-wrap">
-          <img src="/resource/img/gooki.ico" id="loadingImage" class="app-loading-logo" alt="Logo" />
-          <div class="app-loading-dots">
-            <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
-          </div>
-          <div class="app-loading-title"><%= VITE_GLOB_APP_TITLE %></div>
+<head>
+  <meta charset="UTF-8" />
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+  <meta name="renderer" content="webkit" />
+  <meta name="viewport"
+    content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" />
+  <title>{{title}}</title>
+  <link rel="icon" href="" id="favicon" />
+</head>
+
+<body>
+  <div id="app">
+    <style>
+      html {
+        /* same as ant-design-vue/dist/reset.css setting, avoid the title line-height changed */
+        line-height: 1.15;
+      }
+
+      html[data-theme='dark'] .app-loading {
+        background-color: #2c344a;
+      }
+
+      html[data-theme='dark'] .app-loading .app-loading-title {
+        color: rgb(255 255 255 / 85%);
+      }
+
+      .app-loading {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        width: 100%;
+        height: 100%;
+        background-color: #f4f7f9;
+      }
+
+      .app-loading .app-loading-wrap {
+        display: flex;
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        transform: translate3d(-50%, -50%, 0);
+      }
+
+      .app-loading .dots {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        padding: 98px;
+      }
+
+      .app-loading .app-loading-title {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        margin-top: 30px;
+        color: rgb(0 0 0 / 85%);
+        font-size: 30px;
+      }
+
+      .app-loading .app-loading-logo {
+        display: block;
+        width: 90px;
+        margin: 0 auto;
+        margin-bottom: 20px;
+      }
+
+      .dot {
+        display: inline-block;
+        position: relative;
+        box-sizing: border-box;
+        width: 48px;
+        height: 48px;
+        margin-top: 30px;
+        transform: rotate(45deg);
+        animation: ant-rotate 1.2s infinite linear;
+        font-size: 32px;
+      }
+
+      .dot i {
+        display: block;
+        position: absolute;
+        width: 20px;
+        height: 20px;
+        transform: scale(0.75);
+        transform-origin: 50% 50%;
+        animation: ant-spin-move 1s infinite linear alternate;
+        border-radius: 100%;
+        opacity: 0.3;
+        background-color: #0065cc;
+      }
+
+      .dot i:nth-child(1) {
+        top: 0;
+        left: 0;
+      }
+
+      .dot i:nth-child(2) {
+        top: 0;
+        right: 0;
+        animation-delay: 0.4s;
+      }
+
+      .dot i:nth-child(3) {
+        right: 0;
+        bottom: 0;
+        animation-delay: 0.8s;
+      }
+
+      .dot i:nth-child(4) {
+        bottom: 0;
+        left: 0;
+        animation-delay: 1.2s;
+      }
+
+      @keyframes ant-rotate {
+        to {
+          transform: rotate(405deg);
+        }
+      }
+
+      @keyframes ant-spin-move {
+        to {
+          opacity: 1;
+        }
+      }
+    </style>
+    <div class="app-loading">
+      <div class="app-loading-wrap">
+        <!-- <img :src="avatarUrl || ''" id="loadingImage" class="app-loading-logo" alt="Logo" /> -->
+        <img id="loadingImage" class="app-loading-logo" alt="Logo" />
+        <div class="app-loading-dots">
+          <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
+        </div>
+        <div class="app-loading-title">
+          <!-- <%= VITE_GLOB_APP_TITLE %> -->
+          Loading...
         </div>
       </div>
     </div>
-    <script type="module" src="/src/main.ts"></script>
-    <script>
-     document.addEventListener('DOMContentLoaded', () => {
-        const title = localStorage.getItem('departmentName') || 'Default Title';
-        const avatar = localStorage.getItem('avatar') || '/src/assets/images/gooki.ico';
-
-        // 设置文档标题
-        document.title = title;
-
-        // 设置图标
-        const link = document.querySelector("link[rel~='icon']");
-        if (link) {
-          link.href = avatar;
-        }
-        const loadingImage = document.getElementById('loadingImage');
-        if (loadingImage) {
-          loadingImage.src = avatar;
-        }
-      });
-    </script>
-  </body>
-</html>
+  </div>
+  <script type="module" src="/src/main.ts"></script>
+  <script>
+      document.addEventListener('DOMContentLoaded', function () {
+          // 从 localStorage 获取数据
+          const title = localStorage.getItem('departmentName') || '';
+          const avatarUrl = localStorage.getItem('avatar') || '';
+
+          // 设置页面标题
+          document.title = title;
+
+          // 更新 favicon 图标
+          function updateFavicon(url) {
+            let link = document.querySelector("link[rel~='icon']");
+            if (!link) {
+              link = document.createElement('link');
+              link.rel = 'icon';
+              document.head.appendChild(link);
+            }
+            link.href = url ? `${url}?v=${new Date().getTime()}` : '';
+          }
+          updateFavicon(avatarUrl);
+
+          // 设置加载页面中的图标和标题
+          const loadingImage = document.getElementById('loadingImage');
+          if (loadingImage) {
+            if (avatarUrl) {
+              loadingImage.src = avatarUrl; // 设置图标路径
+              loadingImage.style.display = 'block'; // 显示图标
+            } else {
+              loadingImage.style.display = 'none'; // 隐藏图标
+            }
+          }
+
+          const loadingTitle = document.querySelector('.app-loading-title');
+          if (loadingTitle) {
+            loadingTitle.textContent = title || 'Loading...'; // 设置标题
+          }
+        });
+  </script>
+</body>
+
+</html>

+ 1 - 0
src/api/model/baseModel.ts

@@ -51,6 +51,7 @@ export interface BaseIDsReq {
   ids?: any[];
   departmentName: string;
   avatar: string;
+  departmentRemark: string;
   contactIds?: any[];
   labelIds?: any[];
   updateType?: number;//1 批量追加标签 -1 批量移除标签

+ 15 - 0
src/main.ts

@@ -20,6 +20,21 @@ import { setupStore } from '@/store';
 
 import App from './App.vue';
 
+declare global {
+  interface Window {
+    updateFavicon: (url: string) => void;
+  }
+}
+// 定义全局的更新 favicon 函数
+window.updateFavicon = function (url: string) {
+  let link = document.querySelector("link[rel~='icon']") as HTMLLinkElement;
+  if (!link) {
+    link = document.createElement('link') as HTMLLinkElement;
+    link.rel = 'icon';
+    document.head.appendChild(link);
+  }
+  link.href = url;
+};
 async function bootstrap() {
   const app = createApp(App);
 

+ 18 - 1
src/store/modules/user.ts

@@ -127,12 +127,27 @@ export const useUserStore = defineStore({
         this.setToken(token);
         const userInfo = await getSysInfo();
         localStorage.setItem('departmentName', userInfo.data.departmentName);
-        localStorage.setItem('avatar', userInfo.data.avatar);
+        localStorage.setItem('avatar', userInfo.data.departmentRemark);
+        // 更新 favicon
+        this.updateFavicon(userInfo.data.departmentRemark);
         return this.afterLoginAction(goHome);
       } catch (error) {
         return Promise.reject(error);
       }
     },
+    // 更新 favicon 的函数
+    updateFavicon(url: string) {
+      // 使用类型断言将 link 显式转换为 HTMLLinkElement
+      let link = document.querySelector("link[rel~='icon']") as HTMLLinkElement;
+      if (!link) {
+        // 如果没有找到 link 标签,则创建一个新的 link 标签,并设置为 HTMLLinkElement 类型
+        link = document.createElement('link') as HTMLLinkElement;
+        link.rel = 'icon';
+        document.head.appendChild(link);
+      }
+      // 设置 favicon 的 href,使用时间戳避免缓存
+      link.href = url ? `${url}?v=${new Date().getTime()}` : './src/assets/images/gooki.ico';
+    },
     /**
      * @description: login by email
      */
@@ -228,6 +243,8 @@ export const useUserStore = defineStore({
           await doLogout();
           localStorage.removeItem('departmentName');
           localStorage.removeItem('avatar');
+          // 更新图标为默认值
+          window.updateFavicon(''); // 设置为默认图标的路径
           console.log('logout successful');
         } catch {
           console.log('注销Token失败');