Просмотр исходного кода

Merge branch 'ding_sso' of ruiqigogs/yf-portal-vue into master

yanghao 1 неделя назад
Родитель
Сommit
3a1fc08e8e

+ 24 - 1
src/App.vue

@@ -13,4 +13,27 @@ import { motion } from "motion-v";
   </motion.div>
 </template>
 
-<style scoped></style>
+<style scoped>
+/* 修改垂直滚动条 */
+::-webkit-scrollbar {
+  width: 5px; /* 修改宽度 */
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+}
+
+/* 修改滚动条轨道背景色 */
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
+
+/* 修改滚动条滑块颜色 */
+::-webkit-scrollbar-thumb {
+  background-color: #0a5f73;
+}
+
+/* 修改滚动条滑块悬停时的颜色 */
+::-webkit-scrollbar-thumb:hover {
+  background-color: #30459c;
+}
+</style>

+ 6 - 0
src/api/user.ts

@@ -47,3 +47,9 @@ export const ssoLogin = (data: any) => {
     data,
   });
 };
+
+export const getUnreadNotifyMessageCount = async () => {
+  return await request.get({
+    url: "/admin-api/system/notify-message/get-unread-count",
+  });
+};

BIN
src/assets/images/crm.jpg


BIN
src/assets/images/drive.jpg


BIN
src/assets/images/ehr.jpg


BIN
src/assets/images/fm.jpg


BIN
src/assets/images/oa.jpg


BIN
src/assets/images/pm.jpg


BIN
src/assets/images/think.jpg


+ 24 - 0
src/assets/style/main.css

@@ -6,3 +6,27 @@
     overflow-x: hidden;
   }
 }
+
+/* 修改垂直滚动条 */
+::-webkit-scrollbar {
+  width: 7px; /* 修改宽度 */
+  height: 10px;
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 8px;
+}
+
+/* 修改滚动条轨道背景色 */
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
+
+/* 修改滚动条滑块颜色 */
+::-webkit-scrollbar-thumb {
+  background-color: #cccccc;
+}
+
+/* 修改滚动条滑块悬停时的颜色 */
+::-webkit-scrollbar-thumb:hover {
+  background-color: #69696b;
+}

+ 27 - 27
src/components/home/CardItem.vue

@@ -80,12 +80,12 @@ import { useUserStore } from "@/stores/useUserStore";
 import { getAccessToken } from "@/utils/auth";
 
 // 导入所有图标
-import oaimage from "@/assets/images/oa.png";
-import crmimage from "@/assets/images/crm.png";
-import ehrimage from "@/assets/images/ehr.png";
+import oaimage from "@/assets/images/oa.jpg";
+import crmimage from "@/assets/images/crm.jpg";
+import ehrimage from "@/assets/images/ehr.jpg";
 import scmimage from "@/assets/images/scm.png";
-import erpimage from "@/assets/images/erp.jpg"; // 财务管理系统
-import driveimage from "@/assets/images/drive.png"; // 经营驾驶舱
+import erpimage from "@/assets/images/fm.jpg"; // 财务管理系统
+import driveimage from "@/assets/images/drive.jpg"; // 经营驾驶舱
 import zhanlueimage from "@/assets/images/zhanlue.jpeg"; // 战略解码
 import jishuimage from "@/assets/images/jishu.jpeg"; // 技术研发管理
 import zuzhiimage from "@/assets/images/zuzhi.png"; // 组织资产管理
@@ -97,9 +97,9 @@ import qhseimage from "@/assets/images/qhse.jpeg"; // qhse
 import zuanjingimage from "@/assets/images/zuanjing.jpeg"; //智能钻井
 import yalieimage from "@/assets/images/yalie.png"; //智能压裂
 import zhuqiimage from "@/assets/images/zhuqi.png"; //智能注气
-import pmimage from "@/assets/images/pm.png"; // 项目管理
+import pmimage from "@/assets/images/pm.jpg"; // 项目管理
 import dataimage from "@/assets/images/data.png"; // 全局数据治理
-import thinkimage from "@/assets/images/think.png"; // 智能决策
+import thinkimage from "@/assets/images/think.jpg"; // 智能决策
 import aiimage from "@/assets/images/ai.png"; // AI大模型
 import agentimage from "@/assets/images/agent.jpeg"; // ai智能体
 import videoimage from "@/assets/images/video.png"; // ai智能体
@@ -132,30 +132,30 @@ const props = defineProps<{
 
 // 创建图标映射表
 const iconMap: Record<string, string> = {
-  "OA办公": oaimage,
+  OA办公: oaimage,
   "经营驾驶舱(MC)": driveimage,
-  "战略解码与执行": zhanlueimage,
+  战略解码与执行: zhanlueimage,
   "财务管理(FM)": erpimage,
-  "技术研发管理": jishuimage,
+  技术研发管理: jishuimage,
   "客户管理(CRM)": crmimage,
   "人力资源(EHR)": ehrimage,
   "供应商管理(SRM)": scmimage,
-  "组织资产管理": zuzhiimage,
-  "风控合规管理": safeimage,
-  "中航北斗": zhonghangimage,
+  组织资产管理: zuzhiimage,
+  风控合规管理: safeimage,
+  中航北斗: zhonghangimage,
   "视频中心(VCS)": videoimage,
-  "智能钻井": zuanjingimage,
-  "智慧压裂": yalieimage,
-  "智慧注气": zhuqiimage,
-  "智慧连油": lianyouimage,
+  智能钻井: zuanjingimage,
+  智慧压裂: yalieimage,
+  智慧注气: zhuqiimage,
+  智慧连油: lianyouimage,
   "质量安全管理(QHSE)": qhseimage,
   "设备管理(PMS)": pmsimage,
   "项目管理(PM)": pmimage,
   "全局数据治理(数据中台)": dataimage,
-  "智能决策": thinkimage,
-  "行业AI大模型": aiimage,
+  智能决策: thinkimage,
+  行业AI大模型: aiimage,
   "AI智能体(智能交互)": agentimage,
-  "数字油藏": youimage,
+  数字油藏: youimage,
 };
 const isSpecialSystem = (label: string) => {
   const specialSystems = [
@@ -193,7 +193,7 @@ const handleView = async (item: Item) => {
       if (res) {
         window.open(
           "https://yfoa.keruioil.com/wui/index.html?ssoToken=" + res + "#/main",
-          "_blank"
+          "_blank",
         );
       }
     } else {
@@ -207,7 +207,7 @@ const handleView = async (item: Item) => {
         import.meta.env.VITE_PMS_URL +
           "/portalLogin?username=" +
           userStore.getUser.username,
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });
@@ -228,7 +228,7 @@ const handleView = async (item: Item) => {
       window.open(
         "https://crm-tencent.xiaoshouyi.com/global/sso/callback/00APEB9EEEA9B2E338B686B7ECFA8585808C.action?token=" +
           getAccessToken(),
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });
@@ -244,7 +244,7 @@ const handleView = async (item: Item) => {
           userStore.getUser.username +
           "&" +
           extraParam,
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });
@@ -260,7 +260,7 @@ const handleView = async (item: Item) => {
           userStore.getUser.username +
           "&" +
           extraParam,
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });
@@ -276,7 +276,7 @@ const handleView = async (item: Item) => {
           userStore.getUser.username +
           "&" +
           extraParam,
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });
@@ -292,7 +292,7 @@ const handleView = async (item: Item) => {
           userStore.getUser.username +
           "&" +
           extraParam,
-        "_blank"
+        "_blank",
       );
     } else {
       router.push({ path: "/login" });

+ 13 - 2
src/components/home/header.vue

@@ -264,6 +264,15 @@ import person from "@/assets/images/person.png";
 import { useUserStoreWithOut } from "@/stores/useUserStore";
 const userStore = useUserStoreWithOut();
 
+import {
+  getAccessToken,
+  getRefreshToken,
+  removeToken,
+  setToken,
+} from "@utils/auth";
+
+import { deleteUserCache } from "@hooks/useCache";
+
 // 新增消息中心状态
 const activeTab = ref("messages");
 const messages = ref([
@@ -335,9 +344,11 @@ const login = () => {
 
 const onUserCommand = async (command: string) => {
   if (command === "logout") {
-    await userStore.loginOut();
+    // await userStore.loginOut();
 
-    router.replace("/");
+    deleteUserCache(); // 删除用户缓存
+    removeToken();
+    window.location.reload();
   }
 };
 </script>

+ 24 - 13
src/config/axios/service.ts

@@ -6,6 +6,8 @@ import axios, {
 } from "axios";
 
 import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
+import { useUserStoreWithOut } from "@/stores/useUserStore";
+
 import qs from "qs";
 import { config } from "@/config/axios/config";
 import {
@@ -82,7 +84,7 @@ service.interceptors.request.use(
     // Do something with request error
     console.log(error); // for debug
     return Promise.reject(error);
-  }
+  },
 );
 
 // response 拦截器
@@ -189,37 +191,46 @@ service.interceptors.response.use(
     }
     ElMessage.error(message);
     return Promise.reject(error);
-  }
+  },
 );
 
 const refreshToken = async () => {
+  axios.defaults.headers.common["tenant-id"] = 1;
   return await axios.post(
-    base_url + "/system/auth/refresh-token?refreshToken=" + getRefreshToken()
+    base_url +
+      "/admin-api/system/auth/refresh-token?refreshToken=" +
+      getRefreshToken(),
   );
 };
 const handleAuthorized = () => {
   if (!isRelogin.show) {
-    // 如果已经到登录页面则不进行弹窗提示
     if (window.location.href.includes("login")) {
       return;
     }
     isRelogin.show = true;
     ElMessageBox.confirm("登陆超时,请重新登陆", "确定", {
-      showCancelButton: false,
+      showCancelButton: true,
       closeOnClickModal: false,
       showClose: false,
       closeOnPressEscape: false,
       confirmButtonText: "重新登陆",
+      cancelButtonText: "取消",
       type: "warning",
-    }).then(() => {
-      resetRouter(); // 重置静态路由表
-      deleteUserCache(); // 删除用户缓存
-      removeToken();
-      isRelogin.show = false;
-      // 干掉token后再走一次路由让它过router.beforeEach的校验
-      window.location.href = window.location.href;
-    });
+    })
+      .then(async () => {
+        deleteUserCache(); // 删除用户缓存
+        removeToken();
+        isRelogin.show = false;
+        window.location.href = "/login";
+      })
+      .catch(() => {
+        deleteUserCache(); // 删除用户缓存
+        removeToken();
+        isRelogin.show = false; // 重置显示状态
+        window.location.href = "/";
+      });
   }
   return Promise.reject("登陆超时,请重新登陆");
 };
+
 export { service };

+ 1 - 0
src/main.ts

@@ -4,6 +4,7 @@ import { createApp } from "vue";
 import { setupStore } from "@/stores";
 
 import "./assets/style/main.css";
+import "element-plus/dist/index.css";
 
 import App from "./App.vue";
 import router from "./router";

+ 60 - 10
src/views/index.vue

@@ -66,9 +66,10 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted } from "vue";
+import { onMounted, ref } from "vue";
 import * as authUtil from "@/utils/auth";
 import * as dd from "dingtalk-jsapi";
+import { getUnreadNotifyMessageCount } from "@/api/user";
 import Header from "@components/home/header.vue";
 import CardItem from "@components/home/CardItem.vue";
 import Footer from "@components/home/Footer.vue";
@@ -79,8 +80,11 @@ import bgVideo from "@/assets/bg.mp4";
 import bg2 from "@/assets/images/e4.png";
 import g1 from "@/assets/images/g1.png";
 import { useRouter } from "vue-router";
-const router = useRouter();
 import axios from "axios";
+import { useUserStore } from "@/stores/useUserStore";
+const router = useRouter();
+
+const userStore = useUserStore();
 
 type Card = {
   name: string;
@@ -105,7 +109,7 @@ const cards: Card[] = [
       { label: "供应商管理(SRM)" },
       { label: "财务管理(FM)" },
       { label: "经营驾驶舱(MC)", tag: "新" },
-      { label: "项目管理 (PM)" },
+      { label: "项目管理(PM)" },
 
       { label: "技术研发管理" },
 
@@ -161,7 +165,7 @@ async function loginWithDingTalk() {
 
       axios
         .post(
-          "https://portal.deepoil.cc/admin-api/system/auth/h5SocialLogin",
+          import.meta.env.BASE_URL + "/admin-api/system/auth/h5SocialLogin",
           {
             code: code,
             type: 20,
@@ -194,18 +198,64 @@ async function loginWithDingTalk() {
 }
 
 function dingTalkAutoLogin() {
-  // const ua = window.navigator.userAgent.toLowerCase();
+  const ua = window.navigator.userAgent.toLowerCase();
 
-  // console.log("ua :>> ", ua);
+  console.log("ua>>>>>>>>>>>>>>>>>>>>>>> ", ua);
 
-  // if (!ua.includes("dingtalk") && !ua.includes("dingtalkwork")) return;
-
-  loginWithDingTalk();
+  if (ua.includes("dingtalk") || ua.includes("dingtalkwork")) {
+    loginWithDingTalk();
+  }
 }
 
+const unreadCount = ref(0); // 未读消息数量
+// 获得未读消息数
+const getUnreadCount = async () => {
+  getUnreadNotifyMessageCount().then((data) => {
+    unreadCount.value = data;
+  });
+};
+
 onMounted(() => {
   dingTalkAutoLogin();
+
+  // 首次加载小红点
+  // getUnreadCount();
+  // 轮询刷新小红点
+  setInterval(
+    () => {
+      if (userStore.getIsSetUser) {
+        console.log("轮询刷新小红点");
+        getUnreadCount();
+      } else {
+        unreadCount.value = 0;
+      }
+    },
+    1000 * 60 * 1,
+  );
 });
 </script>
 
-<style scoped></style>
+<style scoped>
+/* 修改垂直滚动条 */
+::-webkit-scrollbar {
+  width: 5px; /* 修改宽度 */
+}
+::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+}
+
+/* 修改滚动条轨道背景色 */
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
+
+/* 修改滚动条滑块颜色 */
+::-webkit-scrollbar-thumb {
+  background-color: #0a5f73;
+}
+
+/* 修改滚动条滑块悬停时的颜色 */
+::-webkit-scrollbar-thumb:hover {
+  background-color: #30459c;
+}
+</style>