index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <template>
  2. <div class="bg-white">
  3. <Header />
  4. <section
  5. class="relative w-full overflow-hidden mt-15 md:pb-30 pb-50 pt-9 h-[400px]"
  6. >
  7. <!-- 轮播背景容器 -->
  8. <div
  9. class="absolute inset-0 flex transition-transform duration-700 ease-in-out"
  10. >
  11. <div class="min-w-full h-full relative">
  12. <video
  13. class="absolute inset-0 w-full h-full object-cover"
  14. autoplay
  15. muted
  16. loop
  17. playsinline
  18. :src="bgvideo"
  19. >
  20. 您的浏览器不支持 HTML5 视频。
  21. </video>
  22. </div>
  23. </div>
  24. <div
  25. class="relative z-10 w-full mx-auto h-full px-20 flex items-center mt-5 pt-10"
  26. >
  27. <div class="max-w-4xl">
  28. <h1
  29. class="text-2xl md:text-4xl text-white/90 pt-2 font-bold leading-tight slide-up-fade-in"
  30. >
  31. 山东科瑞石油技术门户网站 · DeepOil 智慧经营平台
  32. </h1>
  33. <p
  34. class="mt-3 md:text-4 text-sm md:text-base text-white/90 leading-relaxed slide-up-fade-in"
  35. style="animation-delay: 0.2s"
  36. >
  37. 连接经营管理、生产指挥与数据智能,打造石油能源行业的一体化数字化平台,
  38. 为企业提供高效协同、智能决策与可靠的数字化服务。
  39. </p>
  40. <div
  41. class="mt-4 md:mt-6 flex gap-3 slide-up-fade-in"
  42. style="animation-delay: 0.4s"
  43. >
  44. <a
  45. class="bg-[#0644a1] hover:bg-[#0a53c1] text-white px-4 py-2 cursor-pointer"
  46. >
  47. 了解平台
  48. </a>
  49. <a
  50. class="bg-white/10 hover:bg-white/20 text-white px-4 py-2 cursor-pointer"
  51. >
  52. 联系我们
  53. </a>
  54. </div>
  55. </div>
  56. </div>
  57. </section>
  58. <section
  59. class="max-w-[1200px] mx-auto px-2 mb-8 mt-6 flex justify-center items-center gap-3"
  60. >
  61. <p class="text-2xl">提供多维度、更可靠的数智化服务</p>
  62. </section>
  63. <section class="w-full mx-auto px-4 md:px-20 mb-8 mt-5">
  64. <div class="grid gap-5 grid-cols-1 md:grid-cols-2 xl:grid-cols-3">
  65. <CardItem
  66. v-for="card in cards"
  67. :title="card.title"
  68. :id="card.id"
  69. :desc="card.desc"
  70. :items="card.items"
  71. :bg="card.bg"
  72. :bg2="cardBgs"
  73. />
  74. </div>
  75. </section>
  76. <Footer />
  77. </div>
  78. </template>
  79. <script setup lang="ts">
  80. import { onMounted, ref, onUnmounted } from "vue";
  81. import * as authUtil from "@/utils/auth";
  82. import * as dd from "dingtalk-jsapi";
  83. import { getUnreadNotifyMessageCount } from "@/api/user";
  84. import Header from "@components/home/header.vue";
  85. import CardItem from "@components/home/CardItem.vue";
  86. import Footer from "@components/home/Footer.vue";
  87. import img1 from "@/assets/images/1.jpg";
  88. import img2 from "@/assets/images/2.jpg";
  89. import img3 from "@/assets/images/3.jpg";
  90. import caiwu from "@/assets/images/caiwu.png";
  91. import banner1 from "@/assets/images/banner1.jpg";
  92. import banner2 from "@/assets/images/model.jpeg";
  93. import bgvideo from "@/assets/bg.mp4";
  94. import bg2 from "@/assets/images/e4.png";
  95. import g1 from "@/assets/images/g1.png";
  96. import { useRouter } from "vue-router";
  97. import axios from "axios";
  98. import { useUserStore } from "@/stores/useUserStore";
  99. const router = useRouter();
  100. const userStore = useUserStore();
  101. const bgImages = [banner1, caiwu, banner2];
  102. // 2. 定义当前显示的图片索引
  103. const currentBgIndex = ref(0);
  104. // 3. 轮播定时器引用
  105. let bgInterval: number | null = null;
  106. type Card = {
  107. name: string;
  108. title: string;
  109. desc: string;
  110. bg: string;
  111. items: Array<{ label: string; tag?: "新" | "热" }>;
  112. id: string;
  113. };
  114. const cardBgs = [bg2, g1, bg2];
  115. const cards: Card[] = [
  116. {
  117. name: "device",
  118. title: "数字运营平台",
  119. desc: "集成财务、研发、客户、人力等关键业务数据,为管理者提供全局态势感知和战略决策支持",
  120. id: "management",
  121. bg: img1,
  122. items: [
  123. { label: "OA办公" },
  124. { label: "客户管理(CRM)" },
  125. { label: "人力资源(EHR)" },
  126. { label: "供应商管理(SRM)" },
  127. { label: "财务管理(FM)" },
  128. { label: "经营驾驶舱(MC)", tag: "新" },
  129. { label: "项目管理(PM)" },
  130. { label: "技术研发管理" },
  131. { label: "组织资产管理" },
  132. { label: "风控合规管理" },
  133. { label: "战略解码与执行" },
  134. { label: "研发需求管理" },
  135. ],
  136. },
  137. {
  138. name: "scene",
  139. title: "智慧指挥平台",
  140. desc: "深入工业场景,为中小企业数字化升级赋能",
  141. id: "command",
  142. bg: img2,
  143. items: [
  144. { label: "设备管理(PMS)" },
  145. { label: "中航北斗" },
  146. { label: "质量安全管理(QHSE)" },
  147. { label: "智慧连油" },
  148. { label: "智慧注气" },
  149. { label: "智能钻井" },
  150. { label: "智慧压裂" },
  151. { label: "数字油藏" },
  152. { label: "视频中心(VCS)" },
  153. ],
  154. },
  155. {
  156. name: "factory",
  157. title: "Chat BI平台",
  158. desc: "工厂上云,高效协同,生产效率和产品质量提升",
  159. id: "chatbi",
  160. bg: img3,
  161. items: [
  162. { label: "全局数据治理(数据中台)", tag: "热" },
  163. { label: "智能决策" },
  164. { label: "行业AI大模型", tag: "新" },
  165. { label: "AI智能体(智能交互)", tag: "新" },
  166. { label: "工艺文件智能体" },
  167. { label: "集团制度智能体" },
  168. ],
  169. },
  170. ];
  171. async function loginWithDingTalk() {
  172. const ddCorpId = import.meta.env.VITE_DD_CORPID;
  173. const ddClientId = import.meta.env.VITE_DD_CLIENTID;
  174. if (!ddCorpId || !ddClientId) return;
  175. dd.requestAuthCode({
  176. corpId: ddCorpId,
  177. clientId: ddClientId,
  178. success: (res: any) => {
  179. const { code } = res;
  180. axios
  181. .post(
  182. import.meta.env.BASE_URL + "/admin-api/system/auth/h5SocialLogin",
  183. {
  184. code: code,
  185. type: 20,
  186. state: new Date().getTime(),
  187. },
  188. {
  189. headers: {
  190. "Content-Type": "application/json",
  191. "tenant-id": 1,
  192. },
  193. },
  194. )
  195. .then((res) => {
  196. console.log("钉钉免登res>>>>>>>>>>>>>>>>>>", res.data.data);
  197. authUtil.setToken(res.data.data);
  198. router.push({
  199. path: "/login",
  200. });
  201. });
  202. },
  203. fail: (err: any) => {
  204. console.log("err :>> ", err);
  205. },
  206. complete: () => {
  207. console.log("11 :>> ", 11);
  208. },
  209. });
  210. }
  211. function dingTalkAutoLogin() {
  212. const ua = window.navigator.userAgent.toLowerCase();
  213. console.log("ua>>>>>>>>>>>>>>>>>>>>>>> ", ua);
  214. if (ua.includes("dingtalk") || ua.includes("dingtalkwork")) {
  215. loginWithDingTalk();
  216. }
  217. }
  218. const unreadCount = ref(0); // 未读消息数量
  219. // 获得未读消息数
  220. const getUnreadCount = async () => {
  221. getUnreadNotifyMessageCount().then((data) => {
  222. unreadCount.value = data;
  223. });
  224. };
  225. onMounted(() => {
  226. dingTalkAutoLogin();
  227. // 首次加载小红点
  228. // getUnreadCount();
  229. // 轮询刷新小红点
  230. setInterval(
  231. () => {
  232. if (userStore.getIsSetUser) {
  233. console.log("轮询刷新小红点");
  234. getUnreadCount();
  235. } else {
  236. unreadCount.value = 0;
  237. }
  238. },
  239. 1000 * 60 * 1,
  240. );
  241. });
  242. onUnmounted(() => {
  243. if (bgInterval) {
  244. clearInterval(bgInterval);
  245. }
  246. });
  247. </script>
  248. <style scoped>
  249. /* 修改垂直滚动条 */
  250. ::-webkit-scrollbar {
  251. width: 5px; /* 修改宽度 */
  252. }
  253. ::-webkit-scrollbar-thumb {
  254. border-radius: 5px;
  255. }
  256. /* 修改滚动条轨道背景色 */
  257. ::-webkit-scrollbar-track {
  258. background-color: transparent;
  259. }
  260. /* 修改滚动条滑块颜色 */
  261. ::-webkit-scrollbar-thumb {
  262. background-color: #0a5f73;
  263. }
  264. /* 修改滚动条滑块悬停时的颜色 */
  265. ::-webkit-scrollbar-thumb:hover {
  266. background-color: #30459c;
  267. }
  268. .slide-up-fade-in {
  269. opacity: 0;
  270. transform: translateY(20px);
  271. animation: slideUpFadeIn 0.8s forwards ease-out;
  272. }
  273. @keyframes slideUpFadeIn {
  274. to {
  275. opacity: 1;
  276. transform: translateY(0);
  277. }
  278. }
  279. .slide-up-fade-in {
  280. opacity: 0;
  281. transform: translateY(20px);
  282. animation: slideUpFadeIn 0.8s forwards ease-out;
  283. }
  284. @keyframes slideUpFadeIn {
  285. to {
  286. opacity: 1;
  287. transform: translateY(0);
  288. }
  289. }
  290. </style>