This commit is contained in:
ping 2025-11-05 15:38:12 +08:00
commit ff43af5647
35 changed files with 2634 additions and 2001 deletions

View File

@ -1,10 +1,8 @@
.DS_Store .DS_Store
node_modules/ node_modules/
dist/ dist/
<<<<<<< HEAD
======= =======
# src/ # src/
>>>>>>> a3d0bd5845e8b37373bf85c7c40401a7c67884b9
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -6,7 +6,6 @@
<item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" /> <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
</el-menu-item> </el-menu-item>
</app-link> </app-link>
</template> </template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
@ -94,7 +93,17 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.sider{ .sider {
//
::v-deep .nest-menu {
.el-menu-item {
padding-left: 60px !important; // 10px
}
//
.nest-menu .el-menu-item {
padding-left: 100px !important;
}
}
} }
</style> </style>

View File

@ -1,4 +1,3 @@
<!-- Sidebar.vue -->
<template> <template>
<div class="index"> <div class="index">
<div :class="{ 'has-logo': showLogo }" class="sidebar-container"> <div :class="{ 'has-logo': showLogo }" class="sidebar-container">
@ -32,7 +31,7 @@
<script> <script>
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
import SidebarItem from "./SidebarItem.vue"; import SidebarItem from "./SidebarItem.vue";
import variables from "@/styles/variables.scss"; import variables from "@/styles/variables.scss";
import Logo from "./Logo.vue"; import Logo from "./Logo.vue";
@ -108,7 +107,7 @@ export default {
} }
} }
// - //
::v-deep .el-menu-vertical { ::v-deep .el-menu-vertical {
border: none; border: none;
height: 100%; height: 100%;
@ -166,7 +165,7 @@ export default {
.el-menu--popup { .el-menu--popup {
.el-menu-item { .el-menu-item {
&.is-active { &.is-active {
background-color: #d7dafd !important; background-color: #f5f7fa !important;
color: #296ad9 !important; color: #296ad9 !important;
} }
} }

View File

@ -1,10 +1,9 @@
import Vue from 'vue' import Vue from 'vue'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import 'normalize.css/normalize.css' // a modern alternative to CSS resets import 'normalize.css/normalize.css' // a modern alternative to CSS resets
import '@/assets/css/iconfont/iconfont.css' import './assets/css/iconfont/iconfont.css'
import Element from 'element-ui' import Element from 'element-ui'
import './styles/element-variables.scss' import './styles/element-variables.scss'

View File

@ -300,31 +300,54 @@ export const constantRoutes = [
*/ */
export const asyncRoutes = [ export const asyncRoutes = [
// 全部产品 - 一级菜单
// 全部产品 - 一级菜单(无子路由)
{ {
path: "/product", path: "/product",
component: Layout, component: Layout,
redirect: "/product/overview",
meta: { meta: {
title: "全部产品", title: "全部产品",
fullPath: "/product", fullPath: "/product",
noCache: true, noCache: true,
icon: "el-icon-s-platform" icon: "el-icon-goods"
}, },
alwaysShow: true,
children: [ children: [
{ {
path: "overview", path: "",
component: () => import('../views/customer/orderManagement/index.vue'), component: () => import('@/views/product/productHome/productIndex/index.vue'),
name: 'ProductOverview', name: 'ProductHome',
meta: { meta: {
title: "资源概览", title: "全部产品",
fullPath: "/product/overview", fullPath: "/product",
noCache: true noCache: true
} }
}, },
] ]
}, },
{
path: "/overview",
component: Layout,
meta: {
title: "资源概览",
fullPath: "/overview",
noCache: true,
icon: "el-icon-s-data"
},
children: [
{
path: "",
component: () => import('@/views/product/productHome/productIndex/index.vue'),
name: 'ResourceOverview',
meta: {
title: "资源概览",
fullPath: "/overview",
noCache: true
}
}
]
},
{ {
path: "/orderManagement", path: "/orderManagement",
@ -340,15 +363,11 @@ export const asyncRoutes = [
alwaysShow: true, alwaysShow: true,
children: [ children: [
{ {
path: "baidu", path: "orderManagement",
component: () => import('@/views/product/productHome/productIndex/index.vue'), component: () => import("@/views/customer/orderManagement"),
name: 'BaiduOrder', name: "OrderManagement",
meta: { meta: { title: "百度订单", fullPath: "/customer/orderManagement", noCache: true, },
title: "百度订单", },
fullPath: "/product/overview",
noCache: true
}
}
] ]
}, },
@ -362,20 +381,16 @@ export const asyncRoutes = [
title: "资源管理", title: "资源管理",
fullPath: "/resourceManagement", fullPath: "/resourceManagement",
noCache: true, noCache: true,
icon: "el-icon-copy-document" icon: "el-icon-s-management"
}, },
alwaysShow: true, alwaysShow: true,
children: [ children: [
{ {
path: "baidu", path: "userResource", component: () => import(
component: () => import('@/views/product/productHome/productIndex/index.vue'), // "@/views/customer/userResource/iframeJiNan.vue"//iframe报错
name: 'BaiduResource', "@/views/customer/userResource"
meta: { ), name: "userResource", meta: { title: "百度资源", fullPath: "/customer/userResource", noCache: true },
title: "百度资源", },
fullPath: "/resourceManagement/baidu",
noCache: true
}
}
] ]
}, },
@ -783,163 +798,258 @@ export const asyncRoutes = [
{ {
}, },
// // 客户 // 工单管理 - 变为一级菜单
{ {
path: "/customer", component: Layout, redirect: "/customer/workOrderManagement", meta: { path: "/workOrderManagement",
title: "客户", icon: "el-icon-s-custom", noCache: true, fullPath: "/customer", component: Layout,
meta: {
title: "工单管理",
icon: "el-icon-s-ticket",
noCache: true,
fullPath: "/workOrderManagement"
}, },
children: [ children: [
// 工单
{ {
path: "workOrderManagement", path: "index",
component: () => import("@/views/customer/workOrderManagement"), component: () => import("@/views/customer/workOrderManagement"),
name: "WorkOrderManagement", name: "WorkOrderManagement",
meta: { title: "工单管理", fullPath: "/customer/workOrderManagement" }, meta: { title: "工单管理", fullPath: "/workOrderManagement/index" },
}, }
// 退订 ]
{
path: "unsubscribe",
component: () => import("@/views/customer/unsubscribe"),
name: "Unsubscribe",
alwaysShow: true, // 确保父菜单始终显示
meta: {
title: "退订管理",
alwaysShow: true
},
children: [
{
path: "BaiduNetdisk",
component: () => import("@/views/customer/unsubscribe/BaiduNetdisk.vue"),
name: "BaiduNetdisk",
meta: { title: "百度云" }
},
]
},
// 完善信息
{
path: 'approve',
component: () => import('@/views/customer/ncApprove/index.vue'),
name: "Approve",
meta: { title: "信息完善", fullPath: "/customer/ncApprove" },
},
// 渠道管理
{
hidden: true,
path: "channelMangement",
component: () => import("@/views/customer/channelMangement/index.vue"),
name: "ChannelMangement",
meta: { title: "渠道管理", fullPath: "/customer/channelMangement" },
},
//渠道产品管理
{
hidden: true,
path: "channelProductMangement",
component: () => import("@/views/customer/channelMangement/channelProductMangement/index.vue"),
name: "channelProductMangement",
meta: { title: "渠道产品管理", fullPath: "/customer/channelMangement/channelProductMangement", noCache: true },
},
// 无权限
{
hidden: true,
path: "noChannelPermission",
component: () => import("@/views/customer/channelMangement/noChannelPermission/index.vue"),
name: "noChannelPermission",
meta: { title: "无权限", fullPath: "/customer/channelMangement/noChannelPermission", noCache: true },
},
// 聊天
{
hidden: true,
path: "chat",
component: () => import("@/views/product/productHome/chat/index.vue"),
name: "chat",
meta: {
title: "聊天", fullPath: "/product/productHome/chat", noCache: true
},
},
// 个人中心
{
hidden: true,
path: "customerInformation",
component: () => import("@/views/customer/customerInformation"),
name: "customerInformation",
meta: { title: "个人中心", fullPath: "/customer/customerInformation" },
},
// 充值管理
{
path: "rechargeRecord",
component: () => import("@/views/customer/rechargeRecord"),
name: "RechargeRecord",
meta: { title: "充值管理", fullPath: "/customer/rechargeRecord" },
},
// 订单管理
{
path: "orderManagement",
component: () => import("@/views/customer/orderManagement"),
name: "OrderManagement",
meta: { title: "产品订单", fullPath: "/customer/orderManagement", noCache: true, },
},
// 订单详情
{
path: "orderDetil",
component: () => import("@/views/customer/orderDetil"),
name: "orderDetil",
hidden: true,
meta: { title: "订单详情", fullPath: "/customer/orderDetil", noCache: true, },
},
// 促销邀请码
{
hidden: true,
path: "promotionalInvitationCode",
component: () => import("@/views/customer/promotionalInvitationCode"),
name: "PromotionalInvitationCode",
meta: { title: "促销邀请码", fullPath: "/customer/promotionalInvitationCode" },
},
// 资源示例
{
path: "userResource", component: () => import(
// "@/views/customer/userResource/iframeJiNan.vue"//iframe报错
"@/views/customer/userResource"
), name: "userResource", meta: { title: "资源实例", fullPath: "/customer/userResource", noCache: true },
},
// ssh登录
{
path: "sshTerminal",
component: () => import(
// "@/views/customer/userResource/iframeJiNan.vue"//iframe报错
"@/views/customer/userResource/SshTerminal.vue"
),
name: "sshTerminal",
meta: { title: "ssh登录", fullPath: "/customer/SshTerminal", noCache: true },
},
// 审批记录
{
hidden: true, path: "approvalRecord", component: () => import(
// "@/views/customer/approvalRecord/iframeJiNan.vue"//iframe报错
"@/views/customer/approvalRecord"
), name: "approvalRecord", meta: { title: "审批记录", fullPath: "/customer/approvalRecord" },
},
// 发票管理
{
path: "invoice",
component: () => import("@/views/customer/invoice"),
name: "Invoice",
meta: { title: "发票管理", fullPath: "/customer/invoice" },
},
// 产品最新页
{
hidden: true,
path: "productIndex",
component: () => import("@/views/product/productHome/productIndex/index.vue"),
name: "ProductIndex",
meta: { title: "产品最新页", fullPath: "/product/productHome/productIndex", noCache: true },
},],
}, },
// 退订管理 - 变为一级菜单(包含子菜单)
{
path: "/unsubscribeManagement",
component: Layout,
redirect: "/unsubscribeManagement/BaiduNetdisk", // 修正重定向路径
alwaysShow: true, // 添加这个属性到路由层级不是meta里面
meta: {
title: "退订管理",
icon: "el-icon-circle-close",
noCache: true,
fullPath: "/unsubscribeManagement"
},
children: [
{
path: "BaiduNetdisk",
component: () => import("@/views/customer/unsubscribe/BaiduNetdisk.vue"),
name: "BaiduNetdisk",
meta: {
title: "百度云",
fullPath: "/unsubscribeManagement/BaiduNetdisk"
}
}
]
},
// 信息完善 - 变为一级菜单
{
path: "/informationPerfect",
component: Layout,
meta: {
title: "信息完善",
icon: "el-icon-edit-outline",
noCache: true,
fullPath: "/informationPerfect"
},
children: [
{
path: "index",
component: () => import('@/views/customer/ncApprove/index.vue'),
name: "InformationPerfect",
meta: { title: "信息完善", fullPath: "/informationPerfect/index" },
}
]
},
// 充值管理 - 变为一级菜单
{
path: "/rechargeManagement",
component: Layout,
meta: {
title: "充值管理",
icon: "el-icon-money",
noCache: true,
fullPath: "/rechargeManagement"
},
children: [
{
path: "index",
component: () => import("@/views/customer/rechargeRecord"),
name: "RechargeManagement",
meta: { title: "充值管理", fullPath: "/rechargeManagement/index" },
}
]
},
// 发票管理 - 变为一级菜单
{
path: "/invoiceManagement",
component: Layout,
meta: {
title: "发票管理",
icon: "el-icon-document",
noCache: true,
fullPath: "/invoiceManagement"
},
children: [
{
path: "index",
component: () => import("@/views/customer/invoice"),
name: "InvoiceManagement",
meta: { title: "发票管理", fullPath: "/invoiceManagement/index" },
}
]
},
// // 客户 - 注释掉
// {
// path: "/customer", component: Layout, redirect: "/customer/workOrderManagement", meta: {
// title: "客户", icon: "el-icon-s-custom", noCache: true, fullPath: "/customer",
// },
// children: [
// // 工单
// {
// path: "workOrderManagement",
// component: () => import("@/views/customer/workOrderManagement"),
// name: "WorkOrderManagement",
// meta: { title: "工单管理", fullPath: "/customer/workOrderManagement" },
// },
// // 退订
// {
// path: "unsubscribe",
// component: () => import("@/views/customer/unsubscribe"),
// name: "Unsubscribe",
// alwaysShow: true, // 确保父菜单始终显示
// meta: {
// title: "退订管理",
// alwaysShow: true
// },
// children: [
// {
// path: "BaiduNetdisk",
// component: () => import("@/views/customer/unsubscribe/BaiduNetdisk.vue"),
// name: "BaiduNetdisk",
// meta: { title: "百度云" }
// },
// ]
// },
// // 完善信息
// {
// path: 'approve',
// component: () => import('@/views/customer/ncApprove/index.vue'),
// name: "Approve",
// meta: { title: "信息完善", fullPath: "/customer/ncApprove" },
// },
// // 渠道管理
// {
// hidden: true,
// path: "channelMangement",
// component: () => import("@/views/customer/channelMangement/index.vue"),
// name: "ChannelMangement",
// meta: { title: "渠道管理", fullPath: "/customer/channelMangement" },
// },
// //渠道产品管理
// {
// hidden: true,
// path: "channelProductMangement",
// component: () => import("@/views/customer/channelMangement/channelProductMangement/index.vue"),
// name: "channelProductMangement",
// meta: { title: "渠道产品管理", fullPath: "/customer/channelMangement/channelProductMangement", noCache: true },
// },
// // 无权限
// {
// hidden: true,
// path: "noChannelPermission",
// component: () => import("@/views/customer/channelMangement/noChannelPermission/index.vue"),
// name: "noChannelPermission",
// meta: { title: "无权限", fullPath: "/customer/channelMangement/noChannelPermission", noCache: true },
// },
// // 聊天
// {
// hidden: true,
// path: "chat",
// component: () => import("@/views/product/productHome/chat/index.vue"),
// name: "chat",
// meta: {
// title: "聊天", fullPath: "/product/productHome/chat", noCache: true
// },
// },
// // 个人中心
// {
// hidden: true,
// path: "customerInformation",
// component: () => import("@/views/customer/customerInformation"),
// name: "customerInformation",
// meta: { title: "个人中心", fullPath: "/customer/customerInformation" },
// },
// // 充值管理
// {
// path: "rechargeRecord",
// component: () => import("@/views/customer/rechargeRecord"),
// name: "RechargeRecord",
// meta: { title: "充值管理", fullPath: "/customer/rechargeRecord" },
// },
// // 订单管理
// // {
// // path: "orderManagement",
// // component: () => import("@/views/customer/orderManagement"),
// // name: "OrderManagement",
// // meta: { title: "产品订单", fullPath: "/customer/orderManagement", noCache: true, },
// // },
// // 订单详情
// {
// path: "orderDetil",
// component: () => import("@/views/customer/orderDetil"),
// name: "orderDetil",
// hidden: true,
// meta: { title: "订单详情", fullPath: "/customer/orderDetil", noCache: true, },
// },
// // 促销邀请码
// {
// hidden: true,
// path: "promotionalInvitationCode",
// component: () => import("@/views/customer/promotionalInvitationCode"),
// name: "PromotionalInvitationCode",
// meta: { title: "促销邀请码", fullPath: "/customer/promotionalInvitationCode" },
// },
// // 资源示例
// // ssh登录
// // {
// // path: "sshTerminal",
// // component: () => import(
// // // "@/views/customer/userResource/iframeJiNan.vue"//iframe报错
// // "@/views/customer/userResource/SshTerminal.vue"
// // ),
// // name: "sshTerminal",
// // meta: { title: "ssh登录", fullPath: "/customer/SshTerminal", noCache: true },
// // },
// // 审批记录
// {
// hidden: true, path: "approvalRecord", component: () => import(
// // "@/views/customer/approvalRecord/iframeJiNan.vue"//iframe报错
// "@/views/customer/approvalRecord"
// ), name: "approvalRecord", meta: { title: "审批记录", fullPath: "/customer/approvalRecord" },
// },
// // 发票管理
// {
// path: "invoice",
// component: () => import("@/views/customer/invoice"),
// name: "Invoice",
// meta: { title: "发票管理", fullPath: "/customer/invoice" },
// },
// // 产品最新页
// {
// hidden: true,
// path: "productIndex",
// component: () => import("@/views/product/productHome/productIndex/index.vue"),
// name: "ProductIndex",
// meta: { title: "产品最新页", fullPath: "/product/productHome/productIndex", noCache: true },
// },],
// },
// 资质审核 // 资质审核
{ {
path: "/qualificationReview", path: "/qualificationReview",
@ -992,7 +1102,7 @@ export const asyncRoutes = [
component: Layout, component: Layout,
name: "demandMangement", name: "demandMangement",
redirect: "/demandMangement/index", redirect: "/demandMangement/index",
meta: { fullPath: "/demandMangement", title: "需求管理", noCache: true, icon: 'el-icon-s-home' }, meta: { fullPath: "/demandMangement", title: "需求管理", noCache: true, icon: 'el-icon-s-claim' },
children: [ children: [
{ {
path: "index", path: "index",
@ -1013,7 +1123,7 @@ export const asyncRoutes = [
component: Layout, component: Layout,
name: "productMangement", name: "productMangement",
redirect: "/productMangement/index", redirect: "/productMangement/index",
meta: { fullPath: "/productMangement", title: "商品管理", noCache: true, icon: 'el-icon-s-home' }, meta: { fullPath: "/productMangement", title: "商品管理", noCache: true, icon: 'el-icon-s-shop' },
children: [ children: [
{ {
path: "index", path: "index",
@ -1725,8 +1835,12 @@ export const asyncRoutes = [
}, },
{ {
path: "/administrator", component: Layout, redirect: "/administrator/index", meta: { path: "/administrator", component: Layout, redirect: "/administrator/index", meta: {
title: "企业管理", icon: "el-icon-s-tools", noCache: true, fullPath: "/administrator", title: "企业管理",
}, children: [ icon: "el-icon-s-custom",
noCache: true,
fullPath: "/administrator"
},
children: [
{ {
path: "departmentManagement", path: "departmentManagement",
component: () => import("@/views/administrator/departmentManagement"), component: () => import("@/views/administrator/departmentManagement"),

View File

@ -16,8 +16,11 @@ function filterAsyncRoutes(routes, permissions) {
// 检查当前路由是否在权限列表中 // 检查当前路由是否在权限列表中
const hasPermission = permissions.some(p => p.path === route.meta?.fullPath); const hasPermission = permissions.some(p => p.path === route.meta?.fullPath);
// 如果当前路由有权限,则加入结果 // 特殊处理:确保"全部产品"和"资源概览"这两个一级路由始终显示
if (hasPermission) { const isCriticalRoute = route.path === "/product" || route.path === "/overview";
// 如果当前路由有权限或者是关键路由,则加入结果
if (hasPermission || isCriticalRoute) {
res.push(tmpRoute); res.push(tmpRoute);
} }
// 如果没有直接权限,但有子路由,递归处理子路由 // 如果没有直接权限,但有子路由,递归处理子路由
@ -34,18 +37,18 @@ function filterAsyncRoutes(routes, permissions) {
} }
// 新增:为普通用户添加订单管理和资源管理路由 // 新增:为普通用户添加订单管理和资源管理路由
function addUserRoutes(routes, userType) { function addUserRoutes(routes, userType, orgType) {
console.log("addUserRoutes - userType:", userType); console.log("addUserRoutes - userType:", userType, "orgType:", orgType);
// 如果是普通用户org_type为2添加订单管理和资源管理路由 const userRoutes = [];
if (userType === 'user') {
// 如果是普通用户org_type为2或userType为user添加订单管理和资源管理路由
if (userType === 'user' || orgType == 2) {
const orderManagementRoute = routes.find(route => route.path === "/orderManagement"); const orderManagementRoute = routes.find(route => route.path === "/orderManagement");
const resourceManagementRoute = routes.find(route => route.path === "/resourceManagement"); const resourceManagementRoute = routes.find(route => route.path === "/resourceManagement");
const userRoutes = [];
if (orderManagementRoute) { if (orderManagementRoute) {
console.log("添加订单管理路由"); console.log("添加订单管理路由");
userRoutes.push(JSON.parse(JSON.stringify(orderManagementRoute))); // 深拷贝 userRoutes.push(JSON.parse(JSON.stringify(orderManagementRoute))); // 深拷贝
} }
@ -53,11 +56,21 @@ function addUserRoutes(routes, userType) {
console.log("添加资源管理路由"); console.log("添加资源管理路由");
userRoutes.push(JSON.parse(JSON.stringify(resourceManagementRoute))); // 深拷贝 userRoutes.push(JSON.parse(JSON.stringify(resourceManagementRoute))); // 深拷贝
} }
return userRoutes;
} }
return []; // 新增:为所有用户添加五个新的客户菜单
const newCustomerRoutes = [
routes.find(route => route.path === "/workOrderManagement"),
routes.find(route => route.path === "/unsubscribeManagement"),
routes.find(route => route.path === "/informationPerfect"),
routes.find(route => route.path === "/rechargeManagement"),
routes.find(route => route.path === "/invoiceManagement")
].filter(route => route); // 过滤掉undefined
console.log("添加新的客户菜单路由:", newCustomerRoutes.map(r => r.path));
userRoutes.push(...newCustomerRoutes);
return userRoutes;
} }
function filterRoutesMobile(routes) { function filterRoutesMobile(routes) {
@ -145,20 +158,18 @@ const actions = {
accessedRoutes = []; accessedRoutes = [];
} }
// 新增:为普通用户添加订单管理和资源管理路由 // 新增:为普通用户添加订单管理和资源管理路由以及新的五个客户菜单
if (userType === 'user' || orgType == 2) { console.log("为用户添加特定路由");
console.log("为普通用户添加订单管理和资源管理路由"); const userSpecificRoutes = addUserRoutes(asyncRoutes, userType, orgType);
const userSpecificRoutes = addUserRoutes(asyncRoutes, userType);
// 确保不重复添加路由 // 确保不重复添加路由
userSpecificRoutes.forEach(route => { userSpecificRoutes.forEach(route => {
if (!accessedRoutes.some(r => r.path === route.path)) { if (!accessedRoutes.some(r => r.path === route.path)) {
accessedRoutes.push(route); accessedRoutes.push(route);
} }
}); });
console.log("添加用户特定路由后的accessedRoutes:", accessedRoutes); console.log("添加用户特定路由后的accessedRoutes:", accessedRoutes);
}
} }
console.log("ACTION generateRoutes - calculated accessedRoutes:", accessedRoutes); console.log("ACTION generateRoutes - calculated accessedRoutes:", accessedRoutes);

View File

@ -32,3 +32,63 @@
.mt20{ .mt20{
margin-top: 20px; margin-top: 20px;
} }
/* ::v-deep .table-header {
background: !important;
color: #ffffff !important;
font-weight: bold;
text-align: center;
} */
/* 全局表格头部样式 - 蓝色渐变 */
.el-table .el-table__header th,
.el-table .el-table__header .el-table__cell {
background: #409EFF !important;
color: #ffffff !important;
font-weight: bold !important;
text-align: center !important;
border-bottom: none !important;
}
/* 处理表格边框情况 */
.el-table--border .el-table__header th,
.el-table--border .el-table__header .el-table__cell {
border-right: 1px solid #a0cfff !important;
}
.el-table--border .el-table__header th:last-child,
.el-table--border .el-table__header .el-table__cell:last-child {
border-right: none !important;
}
/* 鼠标悬停效果 */
.el-table .el-table__header th:hover,
.el-table .el-table__header .el-table__cell:hover {
background: linear-gradient(135deg, #66b1ff, #409eff) !important;
}
/* 科技蓝紫渐变滚动条 */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: linear-gradient(180deg, #f8faff 0%, #f0f4ff 100%);
border-radius: 6px;
box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.05);
}
::-webkit-scrollbar-thumb {
background: #C6D7EB;
border-radius: 6px;
border: 1.5px solid #f8faff;
box-shadow: 0 1px 4px rgba(99, 102, 241, 0.25);
}
::-webkit-scrollbar-thumb:hover {
background: #C6D7EB;
box-shadow: 0 1px 6px rgba(99, 102, 241, 0.35);
}
::-webkit-scrollbar-thumb:active {
background: #C6D7EB;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

View File

Before

Width:  |  Height:  |  Size: 790 KiB

After

Width:  |  Height:  |  Size: 790 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@ -1,127 +1,161 @@
<template> <template>
<div style="width: 100%;"> <div style="width: 100%;">
<div class="banner"> <div class="banner">
<span v-if="JSON.stringify(logoInfoNew)!=='{}'" style="font-size: 38px"> <div v-if="JSON.stringify(logoInfoNew) !== '{}'" style="font-size: 38px;">
{{ logoInfoNew.home.bannerTitle }} <span style="color: #0e0b0b">{{ translations[language].slogan }}</span> <!-- 开元云 标题 -->
</span> <div>{{ logoInfoNew.home.bannerTitle }}</div>
<p style="color: #0e0b0b">全球领先的AI服务运营商</p>
</div>
</div> </div>
<div class="mainBox" style="padding-top: 35px"> <div class="mainBox" style="padding-top: 35px">
<div class="inBox"> <div class="inBox">
<div class="leftBox"> <div class="leftBox">
<img v-if="JSON.stringify(logoInfoNew)!=='{}'" <p class="leftBoxtitle">关于<span class="gradient-text">我们</span></p>
:src="logoInfoNew.home.logoImg" <!-- <img v-if="JSON.stringify(logoInfoNew) !== '{}'" :src="logoInfoNew.home.logoImg" alt=""> -->
alt="">
</div> </div>
<div v-if="JSON.stringify(logoInfoNew)!=='{}'" class="rightBox"> <div v-if="JSON.stringify(logoInfoNew) !== '{}'" class="rightBox">
<p v-for="(i,index) in logoInfoNew.about.content" :key="index"> <p v-for="(i, index) in logoInfoNew.about.content" :key="index">
{{ i }} {{ i }}
</p> </p>
</div> </div>
</div> </div>
</div> </div>
<!-- 公司资质 -->
<div class="zizhi"> <div class="zizhi">
<div style="width: 1400px;"> <div style="width: 1400px;">
<div style="text-align:center;font-size: 26px;font-weight: bold;margin: 55px 0;width: 100%;margin-bottom: 50px"> <div style="text-align:center;font-size: 30px;font-weight: bold;margin: 55px 0;width: 100%;margin-bottom: 50px">
{{ translations[language].qualifications }} 公司<span class="gradient-text">资质</span>
</div> </div>
<LogoTwo></LogoTwo> <LogoTwo></LogoTwo>
</div> </div>
</div> </div>
<!-- 企业文化 -->
<div class="why"> <div class="enterprise">
<ul class="whyUl"> <div class="enterprise-inner">
<li> <div class="left-box">
<span class="icon"><img src="./img/1.png" alt=""></span> <div class="left-title">
<div class="title">{{ translations[language].mission }}</div> <span>企业<span class="gradient-text">文化</span></span>
<div class="description">
<span style="color:#222F60;font-weight: bold;margin-bottom: 10px;display: flex;justify-content: center;align-items: center">
{{ translations[language].missionContent }}
</span>
</div> </div>
</li> </div>
<li> <div class="right-box">
<span class="icon"><img src="./img/2.png" alt=""></span> <div class="item">
<div class="title">{{ translations[language].vision }}</div> <div class="item-img">
<div class="description"> <img src="./img/sm.png" alt="使命图标">
<span style="color:#222F60;font-weight: bold;margin-bottom: 10px;display: flex;justify-content: center;align-items: center"> </div>
{{ translations[language].visionContent }} <div class="item-content">
</span> <div class="item-tit">
<div>使命</div>
<div>Mission</div>
</div>
<div class="item-text">
<p>让AI无处不在让智能如此简单</p>
</div>
</div>
</div> </div>
</li> <div class="item">
<li> <div class="item-img">
<span class="icon"><img src="./img/3.png" alt=""></span> <img src="./img/yj.png" alt="愿景图标">
<div class="title">{{ translations[language].values }}</div> </div>
<div class="description"> <div class="item-content">
<span style="color:#222F60;font-weight: bold;margin-bottom: 10px;display: flex;justify-content: center;align-items: center"> <div class="item-tit">
{{ translations[language].valuesContent }} <div>愿景</div>
</span> <div>Vision</div>
</div>
<div class="item-text">
<p>全球领先的AI服务运营商</p>
</div>
</div>
</div> </div>
</li> <div class="item">
</ul> <div class="item-img">
<img src="./img/jzg.png" alt="价值观图标">
</div>
<div class="item-content">
<div class="item-tit">
<div>价值观</div>
<div>Value</div>
</div>
<div class="item-text">
<p>卓越开放创新</p>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<div class="ad"> <!-- 优势 -->
<div style="text-align:center;font-size: 26px;font-weight: bold;margin: 55px 0;width: 100%;margin-bottom: 50px"> <div class="advantage">
{{ translations[language].platformAdvantages }} <div class="advantage-tit">
<span>平台<span class="gradient-text">优势</span></span>
</div> </div>
<ul class="adUl"> <!-- 优势列表 -->
<li> <div class="advantage-content">
<div class="iconBox"> <div class="advantage-grid">
<img src="./img/5.png" alt=""> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage1.png') + ')' }">
<div class="content-wrapper">
<div class="top-tit">
精准定位
</div>
<div class="btm-tit">
专注于为各行业提供专业高效的人工智能解决方案助力企业智能化转型
</div>
</div>
</div> </div>
<div class="content"> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage2.png') + ')' }">
<span>{{ translations[language].advantage1Title }}</span> <div class="content-wrapper">
<span class="description">{{ translations[language].advantage1Desc }}</span> <div class="top-tit">
技术服务
</div>
<div class="btm-tit">
提供人工智能相关的技术服务为企业解决复杂的技术难题
</div>
</div>
</div> </div>
</li> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage3.png') + ')' }">
<li> <div class="content-wrapper">
<div class="iconBox"> <div class="top-tit">
<img src="./img/6.png" alt=""> 产品定制
</div>
<div class="btm-tit">
根据企业的特定需求定制开发人工智能产品满足不同场景的应用需求
</div>
</div>
</div> </div>
<div class="content"> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage4.png') + ')' }">
<span>{{ translations[language].advantage2Title }}</span> <div class="content-wrapper">
<span class="description">{{ translations[language].advantage2Desc }}</span> <div class="top-tit">
产业赋能
</div>
<div class="btm-tit">
通过人工智能技术为传统产业赋能提升产业的竞争力和创新能力
</div>
</div>
</div> </div>
</li> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage5.png') + ')' }">
<li> <div class="content-wrapper">
<div class="iconBox"> <div class="top-tit">
<img src="./img/7.png" alt=""> 一站式本地化服务
</div>
<div class="btm-tit">
从售前售中到售后提供一站式全方位服务
</div>
</div>
</div> </div>
<div class="content"> <div class="advantage-item" :style="{ backgroundImage: 'url(' + require('./img/advantage6.png') + ')' }">
<span>{{ translations[language].advantage3Title }}</span> <div class="content-wrapper">
<span class="description">{{ translations[language].advantage3Desc }}</span> <div class="top-tit">
提供AI基础设施与模型服务
</div>
<div class="btm-tit">
提供整体底层技术架构和系统支持及模型服务
</div>
</div>
</div> </div>
</li> </div>
<li> </div>
<div class="iconBox"> <!-- 优势列表完 -->
<img src="./img/4.png" alt="">
</div>
<div class="content">
<span>{{ translations[language].advantage4Title }}</span>
<span class="description">{{ translations[language].advantage4Desc }}</span>
</div>
</li>
<li>
<div class="iconBox">
<img src="./img/2.png" alt="">
</div>
<div class="content">
<span>{{ translations[language].advantage5Title }}</span>
<span class="description">{{ translations[language].advantage5Desc }}</span>
</div>
</li>
<li>
<div class="iconBox">
<img src="./img/8.png" alt="">
</div>
<div class="content">
<span>{{ translations[language].advantage6Title }}</span>
<span class="description">{{ translations[language].advantage6Desc }}</span>
</div>
</li>
</ul>
</div> </div>
</div> </div>
</template> </template>
@ -129,75 +163,14 @@
<script> <script>
import Vue from 'vue' import Vue from 'vue'
import LogoTwo from "@/views/homePage/mainPage/logoG/logoTwo.vue"; import LogoTwo from "@/views/homePage/mainPage/logoG/logoTwo.vue";
import {mapGetters, mapState} from "vuex"; import { mapGetters, mapState } from "vuex";
//
import { languageStore, languageBus } from '@/utils/language'
export default Vue.extend({ export default Vue.extend({
name: "about", name: "about",
components: {LogoTwo}, components: { LogoTwo },
data() { data() {
return { return {
language: 'zh', // languagetranslations
languageChangedHandler: null,
translations: {
zh: {
slogan: '全球领先的AI服务运营商',
qualifications: '公司资质',
mission: '使命',
missionContent: '让AI无处不在让智能如此简单',
vision: '愿景',
visionContent: '全球领先的AI服务运营商',
values: '价值观',
valuesContent: '卓越、开放、创新',
platformAdvantages: '平台优势',
advantage1Title: '精准定位',
advantage1Desc: '专注于为各行业提供专业、高效的人工智能解决方案,助力企业智能化转型。',
advantage2Title: '技术服务',
advantage2Desc: '提供人工智能相关的技术服务,为企业解决复杂的技术难题。',
advantage3Title: '产品定制',
advantage3Desc: '根据企业的特定需求,定制开发人工智能产品,满足不同场景的应用需求。',
advantage4Title: '产业赋能',
advantage4Desc: '通过人工智能技术,为传统产业赋能,提升产业的竞争力和创新能力。',
advantage5Title: '一站式、本地化服务',
advantage5Desc: '从售前、售中到售后提供一站式全方位服务',
advantage6Title: '提供AI基础设施与模型服务',
advantage6Desc: '提供整体底层技术架构和系统支持及模型服务'
},
en: {
slogan: 'Leading AI Service Operator Worldwide',
qualifications: 'Company Qualifications',
mission: 'Mission',
missionContent: 'Make AI ubiquitous and intelligence so simple',
vision: 'Vision',
visionContent: 'Global Leading AI Service Operator',
values: 'Values',
valuesContent: 'Excellence, Openness, Innovation',
platformAdvantages: 'Platform Advantages',
advantage1Title: 'Precise Positioning',
advantage1Desc: 'Focus on providing professional and efficient AI solutions for various industries to help enterprises achieve intelligent transformation.',
advantage2Title: 'Technical Services',
advantage2Desc: 'Provide AI-related technical services to help enterprises solve complex technical problems.',
advantage3Title: 'Product Customization',
advantage3Desc: 'Customize AI products according to specific enterprise needs to meet application requirements in different scenarios.',
advantage4Title: 'Industry Empowerment',
advantage4Desc: 'Empower traditional industries through AI technology, enhancing industry competitiveness and innovation capability.',
advantage5Title: 'One-stop, Localized Service',
advantage5Desc: 'Provide comprehensive one-stop services from pre-sales to after-sales',
advantage6Title: 'AI Infrastructure & Model Services',
advantage6Desc: 'Provide overall underlying technical architecture, system support, and model services'
}
}
}
},
created() {
//
this.initLanguage()
},
beforeDestroy() {
//
if (this.languageChangedHandler) {
languageBus.$off('language-changed', this.languageChangedHandler)
} }
}, },
computed: { computed: {
@ -222,41 +195,29 @@ export default Vue.extend({
}, },
}, },
methods: { methods: {
// // initLanguage
initLanguage() {
// store
this.language = languageStore.getLanguage()
console.log('about页面初始化语言:', this.language)
// 便
this.languageChangedHandler = (lang) => {
console.log('about页面接收到语言变化:', lang)
this.language = lang
}
//
languageBus.$on('language-changed', this.languageChangedHandler)
}
} }
}) })
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.banner { .banner {
background: url("./img/banner.png") no-repeat center center; background: url("./img/Newbanner.png") no-repeat top center;
display: flex; display: flex;
justify-content: center; justify-content: center;
background-size: cover; background-size: cover;
align-items: center; align-items: center;
height: 250px; height: 500px;
flex-direction: column; flex-direction: column;
font-weight: bold; font-weight: bold;
span {
div {
background: linear-gradient(to right, #275AFF, #2EBDFA); background: linear-gradient(to right, #275AFF, #2EBDFA);
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
color: transparent; color: transparent;
display: inline-block; display: inline-block;
text-align: center;
} }
} }
@ -266,6 +227,7 @@ export default Vue.extend({
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
background: linear-gradient(180deg, #fff 0%, #f6f8fd 40%, #fff 100%);
.inBox { .inBox {
display: flex; display: flex;
@ -276,6 +238,14 @@ export default Vue.extend({
.leftBox { .leftBox {
width: 25%; width: 25%;
height: 100%; height: 100%;
display: flex;
justify-content: center;
align-items: flex-start;
.leftBoxtitle {
font-size: 30px;
font-weight: bold;
}
img { img {
width: 300px; width: 300px;
@ -290,105 +260,275 @@ export default Vue.extend({
} }
} }
.why { /* 企业文化部分样式 */
.enterprise {
width: 100%; width: 100%;
background: linear-gradient(180deg, #d7e9ff 0%, #fff 100%);
padding: 80px 0;
display: flex; display: flex;
flex-direction: column; justify-content: center;
justify-content: flex-start;
align-items: center;
height: 500px;
background: url("./img/jiajiebg.png");
background-position: center;
background-size: cover;
.whyUl {
padding-top: 90px;
width: 1300px;
display: flex;
justify-content: space-around;
align-items: center;
li {
width: 280px;
height: 310px;
background: white;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0 20px;
img {
width: 47px;
height: 45px;
}
.title {
margin: 15px 0;
font-size: 26px;
font-weight: bold;
}
.description {
color: #999;
font-size: 14px;
line-height: 2;
}
}
}
}
.ad {
flex-direction: column;
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center; align-items: center;
.adUl { .enterprise-inner {
width: 1400px; width: 1400px;
display: flex; display: flex;
flex-wrap: wrap; align-items: center;
justify-content: center;
li { .left-box {
margin-bottom: 45px; width: 25%;
display: flex; display: flex;
justify-content: flex-start; justify-content: center;
align-items: center; align-items: flex-start;
width: 30% !important;
max-width: 30%;
padding-right: 15px;
.content { .left-title {
font-size: 30px;
font-weight: bold;
display: flex; display: flex;
flex-direction: column; justify-content: center;
justify-content: space-around;
align-items: flex-start;
padding-left: 15px;
font-size: 16px;
.description {
margin-top: 8px;
color: #666;
font-size: 14px;
line-height: 1.5;
}
} }
}
img { .right-box {
width: 50px; width: 70%;
height: 50px; display: flex;
flex-direction: column;
gap: 40px;
.item {
display: flex;
align-items: center;
border-radius: 12px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
transition: all 0.3s ease;
&:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
.item-img {
flex-shrink: 0;
margin-right: 25px;
img {
width: 70px;
height: 70px;
object-fit: contain;
}
}
.item-content {
flex: 1;
display: flex;
align-items: center;
.item-tit {
margin-bottom: 15px;
div:first-child {
font-size: 24px;
font-weight: bold;
color: #333;
margin-right: 15px;
}
div:last-child {
font-size: 16px;
color: #666;
font-style: italic;
}
}
.item-text {
margin-left: 40px;
p {
font-size: 18px;
line-height: 1.6;
color: #444;
margin: 0;
}
}
}
} }
} }
} }
} }
.zizhi { .zizhi {
height: 900px;
width: 100%; width: 100%;
background: url("./img/zizhi.png") no-repeat;
background-size: 100% 100%;
padding-bottom: 15px; padding-bottom: 15px;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
/* 新增渐变文字样式 */
.gradient-text {
background: linear-gradient(to right, #0066FF, #66CCFF);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
display: inline-block;
}
//
.advantage {
padding: 80px 0;
background:#fff;
.advantage-tit {
text-align: center;
font-size: 30px;
font-weight: bold;
margin-bottom: 60px;
}
.advantage-content {
display: flex;
justify-content: center;
.advantage-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 30px;
width: 1200px;
.advantage-item {
position: relative;
border-radius: 12px;
padding: 40px 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
transition: all 0.3s ease;
height: 140px;
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
cursor: pointer;
/* 背景图设置 */
background-size: cover !important;
background-position: center !important;
background-repeat: no-repeat !important;
/* 默认状态:白色半透明遮罩,黑色文字 */
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, 0.85);
border-radius: 12px;
z-index: 1;
transition: all 0.3s ease;
}
.content-wrapper {
position: relative;
z-index: 2;
transition: all 0.3s ease;
}
.top-tit {
font-size: 22px;
font-weight: bold;
margin-bottom: 15px;
color: #333;
transition: all 0.3s ease;
}
.btm-tit {
font-size: 16px;
line-height: 1.6;
color: #666;
transition: all 0.3s ease;
}
/* 悬停状态:蓝色半透明遮罩,白色文字 */
&:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0, 102, 255, 0.2);
&::before {
background: rgba(0, 102, 255, 0.9);
}
.top-tit {
color: #fff;
}
.btm-tit {
color: rgba(255, 255, 255, 0.9);
}
}
}
}
}
}
/* 响应式设计 - 适配不同屏幕尺寸 */
@media (max-width: 1200px) {
.mainBox .inBox,
.enterprise .enterprise-inner,
.advantage-content .advantage-grid {
width: 95% !important;
}
.advantage-content .advantage-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 768px) {
.banner {
height: 300px;
font-size: 28px !important;
p {
font-size: 16px;
}
}
.mainBox .inBox {
flex-direction: column;
.leftBox, .rightBox {
width: 100% !important;
}
.leftBox {
margin-bottom: 30px;
}
}
.enterprise .enterprise-inner {
flex-direction: column;
.left-box, .right-box {
width: 100% !important;
}
.left-box {
margin-bottom: 40px;
justify-content: flex-start;
}
}
.zizhi {
height: auto;
padding: 50px 0;
}
.advantage-item {
height: 160px !important;
}
}
</style> </style>

View File

@ -13,6 +13,7 @@
<div class="nav-list"> <div class="nav-list">
<!-- 首页 --> <!-- 首页 -->
<p :class="{ active: $route.path.includes('/index') }"> <p :class="{ active: $route.path.includes('/index') }">
<a @click="$router.push('/homePage/index')">{{ translations[language].home }}</a> <a @click="$router.push('/homePage/index')">{{ translations[language].home }}</a>
</p> </p>
<!-- 产品与服务鼠标移入显示子菜单 --> <!-- 产品与服务鼠标移入显示子菜单 -->
@ -35,10 +36,10 @@
<!-- 用户区域登录/注册按钮和用户下拉菜单 --> <!-- 用户区域登录/注册按钮和用户下拉菜单 -->
<div class="user-area"> <div class="user-area">
<!-- 中英互译 --> <!-- 中英互译 -->
<div class="language-toggle" @click="toggleLanguage"> <!-- <div class="language-toggle" @click="toggleLanguage">
<span class="iconfont icon-ditu_diqiu_o"></span> <span class="iconfont icon-ditu_diqiu_o"></span>
<span class="language-text">{{ language === 'zh' ? 'English' : '中文' }}</span> <span class="language-text">{{ language === 'zh' ? 'English' : '中文' }}</span>
</div> </div> -->
<!-- AI --> <!-- AI -->
<i class="iconfont icon-AIzhushou functions" @click="handleAIClick"></i> <i class="iconfont icon-AIzhushou functions" @click="handleAIClick"></i>
<!-- 客服 --> <!-- 客服 -->

View File

@ -796,6 +796,7 @@ export default Vue.extend({
<style scoped lang="less"> <style scoped lang="less">
// //
.slide-fade-enter-active { .slide-fade-enter-active {
transition: all 0.3s ease; transition: all 0.3s ease;
@ -811,7 +812,7 @@ export default Vue.extend({
height: 100%; height: 100%;
overflow: auto !important; overflow: auto !important;
min-width: 1500px; min-width: 1500px;
} }
.banner { .banner {

View File

@ -1,13 +1,24 @@
<template> <template>
<div class="parent"> <div class="parent">
<div class="container-wrapper"> <div class="container-wrapper">
<div class="container"> <!-- 第一排 - 前8张图片 -->
<!-- 第一组图片 --> <div class="container row1">
<div v-for="(image, index) in images" :key="index" class="child"> <div v-for="(image, index) in firstRowImages" :key="index" class="child">
<img :src="image" alt="logo"/> <img :src="image" alt="logo"/>
</div> </div>
<!-- 第二组相同的图片用于无缝衔接 --> <!-- 重复第一组图片用于无缝衔接 -->
<div v-for="(image, index) in images" :key="'dup-'+index" class="child"> <div v-for="(image, index) in firstRowImages" :key="'dup-'+index" class="child">
<img :src="image" alt="logo"/>
</div>
</div>
<!-- 第二排 - 其余图片 -->
<div class="container row2">
<div v-for="(image, index) in secondRowImages" :key="'second-'+index" class="child">
<img :src="image" alt="logo"/>
</div>
<!-- 重复第二组图片用于无缝衔接 -->
<div v-for="(image, index) in secondRowImages" :key="'second-dup-'+index" class="child">
<img :src="image" alt="logo"/> <img :src="image" alt="logo"/>
</div> </div>
</div> </div>
@ -19,27 +30,30 @@
export default { export default {
name: 'LogoCarousel', name: 'LogoCarousel',
data() { data() {
const allImages = [
require('./img/zizhi/img.png'),
require('./img/zizhi/img_1.png'),
require('./img/zizhi/img_2.png'),
require('./img/zizhi/img_3.png'),
require('./img/zizhi/img_4.png'),
require('./img/zizhi/img_5.png'),
require('./img/zizhi/img_6.png'),
require('./img/zizhi/img_7.png'),
require('./img/zizhi/img_8.png'),
require('./img/zizhi/img_9.png'),
require('./img/zizhi/img_10.png'),
require('./img/zizhi/img_11.png'),
require('./img/zizhi/img_12.png'),
require('./img/zizhi/img_13.png'),
require('./img/zizhi/img_15.png'),
require('./img/zizhi/img_16.png'),
require('./img/zizhi/img_17.png'),
require('./img/zizhi/img_18.png')
];
return { return {
images: [ firstRowImages: allImages.slice(0, 8), // 8
require('./img/zizhi/img.png'), secondRowImages: allImages.slice(8) //
require('./img/zizhi/img_1.png'),
require('./img/zizhi/img_2.png'),
require('./img/zizhi/img_3.png'),
require('./img/zizhi/img_4.png'),
require('./img/zizhi/img_5.png'),
require('./img/zizhi/img_6.png'),
require('./img/zizhi/img_7.png'),
require('./img/zizhi/img_8.png'),
require('./img/zizhi/img_9.png'),
require('./img/zizhi/img_10.png'),
require('./img/zizhi/img_11.png'),
require('./img/zizhi/img_12.png'),
require('./img/zizhi/img_13.png'),
require('./img/zizhi/img_15.png'),
require('./img/zizhi/img_16.png'),
require('./img/zizhi/img_17.png'),
require('./img/zizhi/img_18.png')
]
} }
} }
} }
@ -48,7 +62,7 @@ export default {
<style scoped> <style scoped>
.parent { .parent {
width: 100%; width: 100%;
height: 280px; height: 400px;
overflow: hidden; overflow: hidden;
position: relative; position: relative;
} }
@ -57,15 +71,23 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
display: flex;
flex-direction: column;
padding: 15px 0;
} }
.container { .container {
display: inline-flex; display: inline-flex;
height: 100%; height: 50%;
animation: scroll 45s linear infinite; animation: scroll 45s linear infinite;
white-space: nowrap; white-space: nowrap;
} }
/* 第二排反向滚动 */
.row2 {
animation: scrollReverse 40s linear infinite;
}
.child { .child {
flex: 0 0 auto; flex: 0 0 auto;
width: 300px; width: 300px;
@ -80,7 +102,7 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: contain;
padding: 10px; /* 可选内边距 */ padding: 10px;
box-sizing: border-box; box-sizing: border-box;
} }
@ -92,4 +114,13 @@ export default {
transform: translateX(-50%); transform: translateX(-50%);
} }
} }
@keyframes scrollReverse {
0% {
transform: translateX(-50%);
}
100% {
transform: translateX(0);
}
}
</style> </style>

View File

@ -2,8 +2,8 @@
<div <div
style="display: flex;align-items: center;justify-content: center;width: 100%;max-width: 1400px;"> style="display: flex;align-items: center;justify-content: center;width: 100%;max-width: 1400px;">
<img @click="goHome" class="logo-clickable" style="width: 200px;height: 60px;padding-right: 20px;" <!-- <img @click="goHome" class="logo-clickable" style="width: 200px;height: 60px;padding-right: 20px;"
src="https://www.opencomputing.cn/idfile?path=logo_ncmatch.png" alt=""> src="https://www.opencomputing.cn/idfile?path=logo_ncmatch.png" alt=""> -->
<div <div
style="min-width:800px;display: flex;align-items: center;justify-content: space-between;"> style="min-width:800px;display: flex;align-items: center;justify-content: space-between;">
@ -24,7 +24,7 @@
<!-- 实时搜索结果 --> <!-- 实时搜索结果 -->
<div v-if="showSearchResults && searchResults.length > 0" class="search-results" @click.stop> <div v-if="showSearchResults && searchResults.length > 0" class="search-results" @click.stop>
<div v-for="result in searchResults" :key="result.id" class="search-result-item" <div v-for="result in searchResults" :key="result.id" class="search-result-item"
@click.stop.prevent="handleSearch(result)" @click.stop.prevent="handleSearch(result)"
@mousedown.stop.prevent @mousedown.stop.prevent
@mouseup.stop.prevent @mouseup.stop.prevent
style="cursor: pointer; padding: 10px"> style="cursor: pointer; padding: 10px">
@ -34,7 +34,7 @@
<!-- 热搜关键词 --> <!-- 热搜关键词 -->
<div v-if="false" class="hot-search"> <div v-if="false" class="hot-search">
<a v-for="keyword in hotSearchKeywords" :key="keyword" href="#" class="hot-keyword" <a v-for="keyword in hotSearchKeywords" :key="keyword" href="#" class="hot-keyword"
@click="handleHotKeywordClick(keyword)"> @click="handleHotKeywordClick(keyword)">
{{ keyword }} {{ keyword }}
@ -330,7 +330,7 @@ export default {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
} }
console.log('=== handleSearch 开始执行 ==='); console.log('=== handleSearch 开始执行 ===');
console.log('接收到的参数:', result); console.log('接收到的参数:', result);
console.log('当前路由路径:', this.$route.path); console.log('当前路由路径:', this.$route.path);
@ -418,7 +418,7 @@ export default {
console.log('点击在搜索组件内部,不隐藏联想结果'); console.log('点击在搜索组件内部,不隐藏联想结果');
return; return;
} }
// //
if (this.showSearchResults) { if (this.showSearchResults) {
console.log('点击在搜索组件外部,隐藏联想结果'); console.log('点击在搜索组件外部,隐藏联想结果');
@ -707,4 +707,4 @@ export default {
width: 100%; width: 100%;
} }
} }
</style> </style>

View File

@ -534,7 +534,7 @@ export default {
&.active { &.active {
background-color: #e6f7ff; background-color: #e6f7ff;
border-color: #1890ff; border-color: #1890ff; /* 激活状态下的边框颜色 */
color: #1890ff; color: #1890ff;
} }
} }
@ -552,4 +552,5 @@ export default {
flex-direction: column; flex-direction: column;
} }
</style> </style>

View File

@ -68,7 +68,7 @@
</span> </span>
<el-input ref="vcode" v-model="loginForm.vcode" placeholder="请输入验证码" name="vcode" type="text" /> <el-input ref="vcode" v-model="loginForm.vcode" placeholder="请输入验证码" name="vcode" type="text" />
</el-form-item> </el-form-item>
<el-button type="primary" :disabled="isDisabled" size="mini" style="height:50px;margin-left:10px" @click="getCode">{{SendCode_text}}</el-button> <el-button type="primary" :disabled="isDisabled" size="mini" style="height: 50px; margin-left: 10px" @click="getCode">{{SendCode_text}}</el-button>
</div> </div>
<el-button type="text" @click="resetPassword()" style="margin-left: 80%;margin-top: -15px">忘记密码?</el-button> <el-button type="text" @click="resetPassword()" style="margin-left: 80%;margin-top: -15px">忘记密码?</el-button>
@ -719,11 +719,11 @@ $light_gray: #eee;
font-size: 24px; font-size: 24px;
margin-top: 100px !important; margin-top: 100px !important;
} }
.a24Style { // .a24Style {
//display: flex; // //display: flex;
//justify-content: flex-end; // //justify-content: flex-end;
//align-items: center; // //align-items: center;
} // }
.userInput .el-input__inner { .userInput .el-input__inner {
background-color: white; background-color: white;
} }

File diff suppressed because it is too large Load Diff

View File

@ -7,12 +7,14 @@
<el-form :model="form" label-width="100px"> <el-form :model="form" label-width="100px">
<el-form-item label="产品区域:"> <el-form-item label="产品区域:">
<el-radio-group v-model="form.product_area" size="small" @input="searchProduct"> <el-radio-group v-model="form.product_area" size="small" @input="searchProduct">
<el-radio-button :label="item" :value="item" v-for="(item, index) in product_area" :key="index"></el-radio-button> <el-radio-button :label="item" :value="item" v-for="(item, index) in product_area"
:key="index"></el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="产品类型:"> <el-form-item label="产品类型:">
<el-radio-group v-model="form.ptype" size="small" @input="searchProduct"> <el-radio-group v-model="form.ptype" size="small" @input="searchProduct">
<el-radio-button :label="item" :value="item" v-for="(item, index) in ptype" :key="index"></el-radio-button> <el-radio-button :label="item" :value="item" v-for="(item, index) in ptype"
:key="index"></el-radio-button>
</el-radio-group> </el-radio-group>
<el-button type="primary" size="small" style="margin-left: 10px" @click="resetSearch">重置</el-button> <el-button type="primary" size="small" style="margin-left: 10px" @click="resetSearch">重置</el-button>
</el-form-item> </el-form-item>
@ -20,12 +22,13 @@
</el-card> </el-card>
</div> </div>
<!-- v-infinite-scroll="load" --> <!-- v-infinite-scroll="load" -->
<div class="productBig" > <div class="productBig">
<el-card class="productList" v-for="(item, index) in this.discountProductList" :key="index"> <el-card class="productList" v-for="(item, index) in this.discountProductList" :key="index">
<div slot="header" class="cardHeader"> <div slot="header" class="cardHeader">
<span> <span>
{{ item.name }} {{ item.name }}
<el-button style="float: right; margin-left: 5px" type="primary" size="small" @click="payFirst(item)">购买</el-button> <el-button style="float: right; margin-left: 5px" type="primary" size="small"
@click="payFirst(item)">购买</el-button>
<!-- <el-button style="float: right" type="primary" size="small" @click="inShoppingCard(item)">加入购物车</el-button> --> <!-- <el-button style="float: right" type="primary" size="small" @click="inShoppingCard(item)">加入购物车</el-button> -->
</span> </span>
</div> </div>
@ -70,7 +73,7 @@
</el-row> </el-row>
<el-row :span="24"> <el-row :span="24">
<el-col :span="12" class="productDiscription"> <el-col :span="12" class="productDiscription">
<span >规格说明:</span> <span>规格说明:</span>
<div style="width: 80%;display: flex">{{ item.spec_note }}</div> <div style="width: 80%;display: flex">{{ item.spec_note }}</div>
</el-col> </el-col>
<el-col :span="6" class="productDiscription"> <el-col :span="6" class="productDiscription">
@ -88,7 +91,8 @@
</div> </div>
<!-- 立即购买弹窗 --> <!-- 立即购买弹窗 -->
<el-dialog :title="title + productDetail.name" :visible.sync="dialogVisible" width="30%" class="myDialog" :before-close="close"> <el-dialog :title="title + productDetail.name" :visible.sync="dialogVisible" width="30%" class="myDialog"
:before-close="close">
<el-form ref="payForm" :model="productDetail" label-width="100px" :rules="payForm"> <el-form ref="payForm" :model="productDetail" label-width="100px" :rules="payForm">
<div style="overflow-y: scroll; height: 400px"> <div style="overflow-y: scroll; height: 400px">
<el-form-item label="产品描述:"> <el-form-item label="产品描述:">
@ -106,32 +110,40 @@
<div id="renderMoban" v-if="isShow"> <div id="renderMoban" v-if="isShow">
<el-form-item label="路由数:" prop="route_num"> <el-form-item label="路由数:" prop="route_num">
<el-select v-model="productDetail.route_num" placeholder="请选择路由数" @change="searchMoney(productDetail.route_num)"> <el-select v-model="productDetail.route_num" placeholder="请选择路由数"
<el-option v-for="(item,index) in route_numList" :key="index" :label="item.route_num" :value="item.route_num"> @change="searchMoney(productDetail.route_num)">
<el-option v-for="(item, index) in route_numList" :key="index" :label="item.route_num"
:value="item.route_num">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="带宽:" prop="broadband"> <el-form-item label="带宽:" prop="broadband">
<el-select v-model="productDetail.broadband" placeholder="请选择带宽" @change="searchMoney(productDetail.broadband)"> <el-select v-model="productDetail.broadband" placeholder="请选择带宽"
<el-option v-for="(item,index) in broadbandList" :key="index" :label="item.broadband" :value="item.broadband"> @change="searchMoney(productDetail.broadband)">
<el-option v-for="(item, index) in broadbandList" :key="index" :label="item.broadband"
:value="item.broadband">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="高校:" prop="high_school"> <el-form-item label="高校:" prop="high_school">
<el-select v-model="productDetail.high_school" placeholder="请选择高校" @change="searchMoney(productDetail.high_school)"> <el-select v-model="productDetail.high_school" placeholder="请选择高校"
<el-option v-for="(item,index) in schoolList" :key="index" :label="item.name" :value="item.name"> @change="searchMoney(productDetail.high_school)">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.name">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="超算中心:" prop="chaosuan_center"> <el-form-item label="超算中心:" prop="chaosuan_center">
<el-select v-model="productDetail.chaosuan_center" placeholder="请选择超算中心" @change="searchMoney(productDetail.chaosuan_center)"> <el-select v-model="productDetail.chaosuan_center" placeholder="请选择超算中心"
<el-option v-for="(item,index) in chaosuan_centerList" :key="index" :label="item.name" :value="item.name"> @change="searchMoney(productDetail.chaosuan_center)">
<el-option v-for="(item, index) in chaosuan_centerList" :key="index" :label="item.name"
:value="item.name">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="距离:" @change="searchMoney(productDetail.distance)"> <el-form-item label="距离:" @change="searchMoney(productDetail.distance)">
<el-select v-model="productDetail.distance" placeholder="请选择距离" disabled> <el-select v-model="productDetail.distance" placeholder="请选择距离" disabled>
<el-option v-for="(item,index) in distanceList" :key="index" :label="item.distance" :value="item.distance"> <el-option v-for="(item, index) in distanceList" :key="index" :label="item.distance"
:value="item.distance">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -191,8 +203,8 @@
<el-col :span="21" class="payTypeList"> <el-col :span="21" class="payTypeList">
<div class="bigDiv"> <div class="bigDiv">
<div class="divSon" v-for="item in payTypeList" :key="item.index" @mouseenter="changeColor"> <div class="divSon" v-for="item in payTypeList" :key="item.index" @mouseenter="changeColor">
<div class="divSonItem" @click="payType(item.index)">{{item.payType}}</div> <div class="divSonItem" @click="payType(item.index)">{{ item.payType }}</div>
<div class="divSonTitle">{{item.title}}</div> <div class="divSonTitle">{{ item.title }}</div>
</div> </div>
</div> </div>
<div class="attention"> <div class="attention">
@ -216,14 +228,15 @@
<!-- <span>如何选择地域</span> --> <!-- <span>如何选择地域</span> -->
</el-col> </el-col>
<el-col :span="21" class="aereList"> <el-col :span="21" class="aereList">
<el-button size="small" :round="false" @click="DistrictShow">华东1(杭州) <i class="el-icon-caret-bottom"></i></el-button> <el-button size="small" :round="false" @click="DistrictShow">华东1(杭州) <i
class="el-icon-caret-bottom"></i></el-button>
<div class="discrption">不同地域的实例之间内网互不相通选择靠近您客户的地域可降低网络时延提高您客户的访问速度</div> <div class="discrption">不同地域的实例之间内网互不相通选择靠近您客户的地域可降低网络时延提高您客户的访问速度</div>
<div class="aereDiv" v-if="isDistrictShow"> <div class="aereDiv" v-if="isDistrictShow">
<div> <div>
<span>亚太-中国</span> <span>亚太-中国</span>
<el-row :gutter="5" v-for="item in Asia_China" :key="item.RegionId"> <el-row :gutter="5" v-for="item in Asia_China" :key="item.RegionId">
<el-col :span="8"> <el-col :span="8">
<span>{{item.LocalName}}</span> <span>{{ item.LocalName }}</span>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
@ -668,22 +681,24 @@ export default {
// background-color: rgba(240, 241, 244); // background-color: rgba(240, 241, 244);
border: 0; border: 0;
} }
.box { .box {
height: 100vh; height: 100vh;
.product { .product {
.search { .search {
// position: fixed; // position: fixed;
top: 10%; top: 10%;
} }
.productBig { .productBig {
.productList { .productList {
// height:calc(100vh-300px); // height:calc(100vh-300px);
margin-top: 5px; margin-top: 5px;
padding: 25px; padding: 25px;
.cardHeader {
} .cardBody {
.cardBody {
font-size: 14px; font-size: 14px;
// font-weight: 600; // font-weight: 600;
@ -699,16 +714,19 @@ export default {
font-size: 26px; font-size: 26px;
font-weight: 600; font-weight: 600;
} }
.discountPrice { .discountPrice {
color: #f00606; color: #f00606;
font-size: 26px; font-size: 26px;
font-weight: 600; font-weight: 600;
margin-right: 10px; margin-right: 10px;
} }
.price { .price {
text-decoration: line-through; text-decoration: line-through;
margin-right: 10px; margin-right: 10px;
} }
.discount { .discount {
height: 30px; height: 30px;
width: 70px; width: 70px;
@ -721,44 +739,54 @@ export default {
} }
} }
} }
.aLiDialog { .aLiDialog {
// background-color: rgb(99, 100, 100); // background-color: rgb(99, 100, 100);
overflow-y: scroll; overflow-y: scroll;
.buy { .buy {
font-size: 12px; font-size: 12px;
padding-left: 10%; padding-left: 10%;
padding-right: 10%; padding-right: 10%;
border: 1px solid red; border: 1px solid red;
.content { .content {
.left { .left {
.payType { .payType {
.payTypeTitle { .payTypeTitle {
padding-top: 15px; padding-top: 15px;
.payTypeItem { .payTypeItem {
font-weight: 600; font-weight: 600;
.light { .light {
font-size: 12px; font-size: 12px;
} }
} }
} }
.payTypeList { .payTypeList {
.bigDiv { .bigDiv {
display: flex; display: flex;
.divSon { .divSon {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
border: 1px solid #cbcbcb; border: 1px solid #cbcbcb;
margin-right: 30px; margin-right: 30px;
padding: 10px; padding: 10px;
.divSonItem { .divSonItem {
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
} }
.divSonTitle { .divSonTitle {
color: #787e80; color: #787e80;
} }
} }
} }
.attention { .attention {
display: flex; display: flex;
padding-top: 5px; padding-top: 5px;
@ -770,6 +798,7 @@ export default {
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
} }
.explain { .explain {
color: #787e80; color: #787e80;
height: 30px; height: 30px;
@ -779,31 +808,34 @@ export default {
} }
} }
} }
.aere { .aere {
.aereCol { .aereCol {
padding-top: 20px; padding-top: 20px;
.aereSpan { .aereSpan {
font-weight: 600; font-weight: 600;
} }
} }
.aereList { .aereList {
margin-top: 5px; margin-top: 5px;
.discrption { .discrption {
color: #787e80; color: #787e80;
padding-top: 3px; padding-top: 3px;
} }
.aereDiv { .aereDiv {
border: 1px solid #cbcbcb; border: 1px solid #cbcbcb;
} }
} }
.network {
.networkItem {
}
}
} }
} }
.right {
}
} }
} }
} }

View File

@ -5,12 +5,14 @@
<div class="bigTitle">快捷导航</div> <div class="bigTitle">快捷导航</div>
<ul class="recUl"> <ul class="recUl">
<li v-for="(item,index) in navList" :key="index" @click="goBaidu(item)"> <li v-for="(item,index) in navList" :key="index" @click="goBaidu(item)">
<i :class="item.icon || 'el-icon-link'"></i> <!-- 修改这里使用img标签替换i标签 -->
<img :src="getNavIcon(index)" class="nav-icon" alt="icon" />
{{ item.name }} {{ item.name }}
</li> </li>
</ul> </ul>
</div> </div>
<!-- 其他部分保持不变 -->
<div class="section"> <div class="section">
<div class="bigTitle">资源概览</div> <div class="bigTitle">资源概览</div>
<ul class="recUl overView"> <ul class="recUl overView">
@ -52,6 +54,7 @@
</div> </div>
</div> </div>
<!-- 右侧部分保持不变 -->
<div class="rightBox"> <div class="rightBox">
<div class="user card"> <div class="user card">
<div class="userImg"> <div class="userImg">
@ -108,7 +111,10 @@ import { reqNewHomeResource, reqNewHomeResourceWarning, reqQuickNav } from "@/ap
import { editReachargelogAPI } from "@/api/finance/customerRechargeManagement"; import { editReachargelogAPI } from "@/api/finance/customerRechargeManagement";
import { getUnreadmsgAPI } from "@/api/login"; import { getUnreadmsgAPI } from "@/api/login";
import MessageCenter from '@/components/MessageCenter/MessageCenter.vue'; import MessageCenter from '@/components/MessageCenter/MessageCenter.vue';
import icon1 from '@/assets/image/icon1.png';
import icon2 from '@/assets/image/icon2.png';
import icon3 from '@/assets/image/icon3.png';
import icon4 from '@/assets/image/icon4.png';
export default Vue.extend({ export default Vue.extend({
name: "mainPage", name: "mainPage",
components: { components: {
@ -132,7 +138,9 @@ export default Vue.extend({
{ name: '处理中', count: 7 }, { name: '处理中', count: 7 },
{ name: '站内信', count: 0 } { name: '站内信', count: 0 }
], ],
messageCenterVisible: false messageCenterVisible: false,
//
navIcons: [icon1, icon2, icon3, icon4]
} }
}, },
created() { created() {
@ -172,6 +180,12 @@ export default Vue.extend({
} }
}) })
}, },
//
getNavIcon(index) {
// 使
const iconIndex = index % this.navIcons.length;
return this.navIcons[iconIndex];
},
async initMybalance() { async initMybalance() {
const res = await editReachargelogAPI() const res = await editReachargelogAPI()
if (res.status) { if (res.status) {
@ -202,19 +216,16 @@ export default Vue.extend({
switch(todoName) { switch(todoName) {
case '待支付': case '待支付':
//
query = { query = {
filterType: 'processing' // 使 filterType: 'processing'
}; };
break; break;
case '待续费': case '待续费':
//
query = { query = {
filterType: 'pendingPayment' filterType: 'pendingPayment'
}; };
break; break;
case '处理中': case '处理中':
//
query = { query = {
filterType: 'processing' filterType: 'processing'
}; };
@ -224,7 +235,7 @@ export default Vue.extend({
console.log(`跳转到资源概览,筛选类型: ${todoName}`, query); console.log(`跳转到资源概览,筛选类型: ${todoName}`, query);
this.$router.push({ this.$router.push({
path: '/product/overview', path: '/overview',
query: query query: query
}); });
} }
@ -248,7 +259,13 @@ export default Vue.extend({
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
/* 样式保持不变,与之前相同 */ ::v-deep .table-header {
background: #409eff !important;
color: #ffffff !important;
font-weight: bold;
text-align: center;
}
.mainBox { .mainBox {
background: #f5f7fa; background: #f5f7fa;
width: 100%; width: 100%;
@ -323,12 +340,21 @@ export default Vue.extend({
justify-content: center; justify-content: center;
min-width: 0; min-width: 0;
i { //
font-size: 24px; .nav-icon {
width: 24px;
height: 24px;
margin-bottom: 10px; margin-bottom: 10px;
color: #409eff; object-fit: contain;
} }
//
// i {
// font-size: 24px;
// margin-bottom: 10px;
// color: #409eff;
// }
&:hover { &:hover {
transform: translateY(-3px); transform: translateY(-3px);
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2); box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);

File diff suppressed because it is too large Load Diff