<template>
|
<view class="content">
|
<view class="header-section">
|
<view class="currentFactory">
|
<up-text type="primary"
|
:text="userStore.currentFactoryName"
|
@click="show = true"
|
size="18"
|
class="factoryName"
|
suffixIcon="arrow-right"
|
:iconStyle="iconStyle"></up-text>
|
</view>
|
<up-picker :show="show"
|
:columns="factoryList"
|
@confirm="changeFactory"
|
@cancel="show = false"></up-picker>
|
</view>
|
<view class="hero-section">
|
<view class="bg-img">
|
<view class="hero-content">
|
<text class="hero-title">润泰生物科技</text>
|
</view>
|
<view class="hero-wave"></view>
|
</view>
|
</view>
|
<!-- <view class="notice-section">-->
|
<!-- <view class="notice">-->
|
<!-- <view class="notice-content">-->
|
<!-- <view class="notice-left">-->
|
<!-- <text class="notice-status">通知</text>-->
|
<!-- </view>-->
|
<!-- <view class="notice-separator"></view>-->
|
<!-- <view class="notice-right">-->
|
<!-- <text class="notice-label">{{currentStatus}}</text>-->
|
<!-- <text class="notice-text">当日销售设备数:<text class="notice-number">{{number}}<text class="notice-unit">个</text></text></text>-->
|
<!-- </view>-->
|
<!-- </view>-->
|
<!-- </view>-->
|
<!-- </view>-->
|
<!-- 营销管理模块 -->
|
<view class="common-module marketing-module">
|
<view class="module-header">
|
<view class="module-title-container">
|
<text class="module-title">营销管理</text>
|
</view>
|
</view>
|
<view class="module-content">
|
<up-grid :border="false"
|
col="4">
|
<up-grid-item v-for="(item, index) in marketingItems"
|
:key="index"
|
@click="handleCommonItemClick(item)">
|
<view class="icon-container"
|
:style="{ background: item.bgColor }">
|
<up-icon :name="item.icon"
|
:size="58"
|
color="#ffffff"></up-icon>
|
</view>
|
<text class="item-label">{{item.label}}</text>
|
</up-grid-item>
|
</up-grid>
|
</view>
|
</view>
|
<!-- 采购管理模块 -->
|
<view class="common-module purchase-module">
|
<view class="module-header">
|
<view class="module-title-container">
|
<text class="module-title">采购管理</text>
|
</view>
|
</view>
|
<view class="module-content">
|
<up-grid :border="false"
|
col="4">
|
<up-grid-item v-for="(item, index) in purchaseItems"
|
:key="index"
|
@click="handleCommonItemClick(item)">
|
<view class="icon-container"
|
:style="{ background: item.bgColor }">
|
<up-icon :name="item.icon"
|
:size="58"
|
color="#ffffff"></up-icon>
|
</view>
|
<text class="item-label">{{item.label}}</text>
|
</up-grid-item>
|
</up-grid>
|
</view>
|
</view>
|
<!-- 协同办公模块 -->
|
<view class="common-module collaboration-module">
|
<view class="module-header">
|
<view class="module-title-container">
|
<text class="module-title">协同办公</text>
|
</view>
|
</view>
|
<view class="module-content">
|
<up-grid :border="false"
|
col="4">
|
<up-grid-item v-for="(item, index) in collaborationItems"
|
:key="index"
|
@click="handleCommonItemClick(item)">
|
<view class="icon-container"
|
:style="{ background: item.bgColor }">
|
<up-icon :name="item.icon"
|
:size="58"
|
color="#ffffff"></up-icon>
|
</view>
|
<text class="item-label">{{item.label}}</text>
|
</up-grid-item>
|
</up-grid>
|
</view>
|
</view>
|
<!-- 生产管控模块 -->
|
<!-- <view class="common-module production-module">-->
|
<!-- <view class="module-header">-->
|
<!-- <view class="module-title-container">-->
|
<!-- <text class="module-title">生产管控</text>-->
|
<!-- </view>-->
|
<!-- </view>-->
|
<!-- <view class="module-content">-->
|
<!-- <up-grid-->
|
<!-- :border="false"-->
|
<!-- col="4"-->
|
<!-- >-->
|
<!-- <up-grid-item-->
|
<!-- v-for="(item, index) in productionItems"-->
|
<!-- :key="index"-->
|
<!-- @click="handleCommonItemClick(item)"-->
|
<!-- >-->
|
<!-- <view class="icon-container" :style="{ background: item.bgColor }">-->
|
<!-- <up-icon-->
|
<!-- :name="item.icon"-->
|
<!-- :size="58"-->
|
<!-- color="#ffffff"-->
|
<!-- ></up-icon>-->
|
<!-- </view>-->
|
<!-- <text class="item-label">{{item.label}}</text>-->
|
<!-- </up-grid-item>-->
|
<!-- </up-grid>-->
|
<!-- </view>-->
|
<!-- </view>-->
|
<!-- 生产管控模块 -->
|
<view class="common-module equipment-module">
|
<view class="module-header">
|
<view class="module-title-container">
|
<text class="module-title">生产管控</text>
|
</view>
|
</view>
|
<view class="module-content">
|
<up-grid :border="false"
|
col="4">
|
<up-grid-item v-for="(item, index) in productionItems"
|
:key="index"
|
@click="handleCommonItemClick(item)">
|
<view class="icon-container"
|
:style="{ background: item.bgColor }">
|
<up-icon :name="item.icon"
|
:size="58"
|
color="#ffffff"></up-icon>
|
</view>
|
<text class="item-label">{{item.label}}</text>
|
</up-grid-item>
|
</up-grid>
|
</view>
|
</view>
|
<!-- 设备管理模块 -->
|
<view class="common-module equipment-module">
|
<view class="module-header">
|
<view class="module-title-container">
|
<text class="module-title">设备管理</text>
|
</view>
|
</view>
|
<view class="module-content">
|
<up-grid :border="false"
|
col="4">
|
<up-grid-item v-for="(item, index) in equipmentItems"
|
:key="index"
|
@click="handleCommonItemClick(item)">
|
<view class="icon-container"
|
:style="{ background: item.bgColor }">
|
<up-icon :name="item.icon"
|
:size="58"
|
color="#ffffff"></up-icon>
|
</view>
|
<text class="item-label">{{item.label}}</text>
|
</up-grid-item>
|
</up-grid>
|
</view>
|
</view>
|
</view>
|
</template>
|
|
<script setup>
|
import { ref, onMounted, nextTick, reactive } from "vue";
|
import { userLoginFacotryList } from "@/api/login";
|
import modal from "@/plugins/modal";
|
import useUserStore from "@/store/modules/user";
|
|
const userStore = useUserStore();
|
const factoryId = ref("");
|
const show = ref(false);
|
const factoryList = ref([]);
|
const factoryListTem = ref([]);
|
const iconStyle = {
|
fontSize: "1.125rem",
|
color: "#2979ff",
|
};
|
|
// 通知状态切换
|
const statusList = ["销售", "采购"];
|
let statusIndex = 0;
|
const currentStatus = ref(statusList[0]);
|
const number = ref(7643);
|
|
// 定时器切换通知状态
|
const startStatusTimer = () => {
|
setInterval(() => {
|
statusIndex = (statusIndex + 1) % statusList.length;
|
currentStatus.value = statusList[statusIndex];
|
}, 3000);
|
};
|
|
// 营销管理功能数据
|
const marketingItems = reactive([
|
{
|
icon: "/static/images/icon/xiaoshoutaizhang@2x.png",
|
label: "销售台账",
|
},
|
{
|
icon: "/static/images/icon/kaipiaodengji@2x.png",
|
label: "开票登记",
|
},
|
{
|
icon: "/static/images/icon/kaipiaotaizhang@2x.png",
|
label: "开票台账",
|
},
|
{
|
icon: "/static/images/icon/huikuandengji@2x.png",
|
label: "回款登记",
|
},
|
{
|
icon: "/static/images/icon/huikuanliushui@2x.png",
|
label: "回款流水",
|
},
|
{
|
icon: "/static/images/icon/kehuwanglai@2x.png",
|
label: "客户往来",
|
},
|
]);
|
|
// 采购管理功能数据
|
const purchaseItems = reactive([
|
{
|
icon: "/static/images/icon/caigoutaizhang@2x.png",
|
label: "采购台账",
|
},
|
{
|
icon: "/static/images/icon/laipiaodengji@2x.png",
|
label: "来票登记",
|
},
|
{
|
icon: "/static/images/icon/laipiaotaizhang@2x.png",
|
label: "来票台账",
|
},
|
{
|
icon: "/static/images/icon/fukuanjingji@2x.png",
|
label: "付款登记",
|
},
|
{
|
icon: "/static/images/icon/fukuanliushui@2x.png",
|
label: "付款流水",
|
},
|
{
|
icon: "/static/images/icon/gongyingshangwanglai@2x.png",
|
label: "供应商往来",
|
},
|
]);
|
|
// 协同办公功能数据
|
const collaborationItems = reactive([
|
{
|
icon: "/static/images/icon/xietongshenpi@2x.png",
|
label: "协同审批",
|
},
|
{
|
icon: "/static/images/icon/kehubaifang@2x.png",
|
label: "客户拜访",
|
},
|
]);
|
|
// 生产管控功能数据
|
const productionItems = reactive([
|
// {
|
// icon: "/static/images/icon/shengchandingdan@2x.png",
|
// label: "生产订单",
|
// bgColor: "#FF9800",
|
// },
|
// {
|
// icon: "/static/images/icon/shengchanpaigong@2x.png",
|
// label: "生产派工",
|
// bgColor: "#FF6B35",
|
// },
|
// {
|
// icon: "/static/images/icon/shengchanpaichan@2x.png",
|
// label: "工序排产",
|
// bgColor: "#E91E63",
|
// },
|
{
|
icon: "/static/images/icon/shengchanbaogong@2x.png",
|
label: "生产报工",
|
bgColor: "#673AB7",
|
},
|
// {
|
// icon: "/static/images/icon/shengchanhesuan@2x.png",
|
// label: "生产核算",
|
// bgColor: "#3F51B5",
|
// },
|
]);
|
|
// 设备管理功能数据
|
const equipmentItems = reactive([
|
// {
|
// icon: '/static/images/icon/shebeitaizhang@2x.png',
|
// label: '设备台账',
|
// },
|
{
|
icon: "/static/images/icon/shbeibaoxiu@2x.png",
|
label: "设备报修",
|
},
|
{
|
icon: "/static/images/icon/shbeibaoyang@2x.png",
|
label: "设备保养",
|
},
|
{
|
icon: "/static/images/icon/xunjianshangchuan@2x.png",
|
label: "巡检上传",
|
},
|
{
|
icon: "/static/images/icon/guzhangfenxi@2x.png",
|
label: "分析追溯",
|
bgColor: "#ff9800",
|
},
|
{
|
icon: "/static/images/icon/zhinengpaidan@2x.png",
|
label: "智能派单",
|
bgColor: "#ff6b35",
|
},
|
{
|
icon: "/static/images/icon/zuoyezhidao@2x.png",
|
label: "作业指导",
|
bgColor: "#4caf50",
|
},
|
{
|
icon: "/static/images/icon/jieguoyanzheng@2x.png",
|
label: "结果验证",
|
bgColor: "#9c27b0",
|
},
|
]);
|
|
// 处理常用功能点击
|
const handleCommonItemClick = item => {
|
// 根据不同的功能项进行跳转
|
switch (item.label) {
|
case "销售台账":
|
uni.navigateTo({
|
url: "/pages/sales/salesAccount/index",
|
});
|
break;
|
case "开票登记":
|
uni.navigateTo({
|
url: "/pages/sales/invoicingRegistration/index",
|
});
|
break;
|
case "开票台账":
|
uni.navigateTo({
|
url: "/pages/sales/invoiceLedger/index",
|
});
|
break;
|
case "回款登记":
|
uni.navigateTo({
|
url: "/pages/sales/receiptPayment/index",
|
});
|
break;
|
case "回款流水":
|
uni.navigateTo({
|
url: "/pages/sales/receiptPaymentHistory/index",
|
});
|
break;
|
case "客户往来":
|
uni.navigateTo({
|
url: "/pages/sales/receiptPaymentLedger/index",
|
});
|
break;
|
case "采购台账":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/procurementLedger/index",
|
});
|
break;
|
case "来票登记":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/invoiceEntry/index",
|
});
|
break;
|
case "来票台账":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/procurementInvoiceLedger/index",
|
});
|
break;
|
case "付款登记":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/paymentEntry/index",
|
});
|
break;
|
case "付款流水":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/receiptPaymentHistory/index",
|
});
|
break;
|
case "供应商往来":
|
uni.navigateTo({
|
url: "/pages/procurementManagement/paymentLedger/index",
|
});
|
break;
|
case "协同审批":
|
uni.navigateTo({
|
url: "/pages/cooperativeOffice/collaborativeApproval/index",
|
});
|
break;
|
case "客户拜访":
|
uni.navigateTo({
|
url: "/pages/cooperativeOffice/clientVisit/index",
|
});
|
break;
|
case "生产订单":
|
uni.navigateTo({
|
url: "/pages/productionManagement/productionOrder/index",
|
});
|
break;
|
case "生产派工":
|
uni.navigateTo({
|
url: "/pages/productionManagement/productionDispatching/index",
|
});
|
break;
|
case "工序排产":
|
uni.navigateTo({
|
url: "/pages/productionManagement/processScheduling/index",
|
});
|
break;
|
case "生产报工":
|
getcode();
|
break;
|
case "生产核算":
|
uni.navigateTo({
|
url: "/pages/productionManagement/productionAccounting/index",
|
});
|
break;
|
case "设备台账":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/ledger/index",
|
});
|
break;
|
case "设备报修":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/repair/index",
|
});
|
break;
|
case "设备保养":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/upkeep/index",
|
});
|
break;
|
case "巡检上传":
|
uni.navigateTo({
|
url: "/pages/inspectionUpload/index",
|
});
|
break;
|
case "分析追溯":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/faultAnalysis/index",
|
});
|
break;
|
case "智能派单":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/smartDispatch/index",
|
});
|
break;
|
case "作业指导":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/sop/index",
|
});
|
break;
|
case "结果验证":
|
uni.navigateTo({
|
url: "/pages/equipmentManagement/verification/index",
|
});
|
break;
|
default:
|
uni.showToast({
|
title: `点击了${item.label}`,
|
icon: "none",
|
});
|
}
|
};
|
|
// 创建对子组件的引用
|
const uToastRef = ref(null);
|
|
function getUserLoginFacotryList() {
|
userLoginFacotryList({ userName: userStore.nickName })
|
.then(res => {
|
// 检查res.data是否为数组
|
factoryList.value[0] = [];
|
if (res.data && Array.isArray(res.data)) {
|
factoryListTem.value = res.data;
|
res.data.forEach(item => {
|
factoryList.value[0].push(item.deptName);
|
});
|
factoryId.value = userStore.currentDeptId;
|
} else {
|
// 如果res.data不是数组,设置为空数组
|
factoryList.value = [];
|
}
|
})
|
.catch(error => {
|
modal.msgError("获取公司列表失败:", error);
|
factoryList.value = [];
|
});
|
}
|
const getcode = () => {
|
uni.scanCode({
|
success: res => {
|
// 解析二维码内容
|
const scanResult = res.result;
|
let orderRow = "";
|
|
// 尝试从扫码结果中提取orderRow参数
|
// 假设二维码内容是JSON格式或URL参数格式
|
try {
|
// 检查是否是JSON格式
|
const parsedData = JSON.parse(scanResult);
|
if (parsedData.orderRow) {
|
orderRow = parsedData.orderRow;
|
}
|
} catch (e) {
|
// 检查是否是URL参数格式,如 orderRow=12345
|
const params = new URLSearchParams(scanResult);
|
orderRow = params.get("orderRow") || "";
|
}
|
|
// 扫码成功后跳转到生产报工页面,并传递orderRow参数
|
uni.navigateTo({
|
url: `/pages/productionManagement/productionReport/index?orderRow=${orderRow}`,
|
});
|
},
|
fail: err => {
|
uni.showToast({
|
title: "扫码失败",
|
icon: "none",
|
});
|
uni.navigateTo({
|
url: `/pages/productionManagement/productionReport/index`,
|
});
|
},
|
});
|
};
|
const changeFactory = async arr => {
|
show.value = false;
|
const factoryId = factoryListTem.value[arr.indexs[0]].deptId;
|
const loginForm = {
|
username: userStore.name,
|
password: uni.getStorageSync("remembered_password"),
|
factoryId: factoryId,
|
};
|
modal.loading("刷新中,请耐心等待...");
|
userStore
|
.loginCheckFactory(loginForm)
|
.then(() => {
|
modal.closeLoading();
|
nextTick(() => {
|
loginSuccess();
|
});
|
})
|
.catch(() => {
|
modal.closeLoading();
|
});
|
};
|
function loginSuccess(result) {
|
uni.reLaunch({
|
url: "/pages/index",
|
});
|
}
|
|
// 定义方法
|
const click = name => {
|
if (uToastRef.value) {
|
uToastRef.value.success(`点击了第${name + 1}个`); // 注意:这里加1是因为通常我们是从第1个开始计数的
|
}
|
};
|
|
onMounted(() => {
|
// 设置用户信息
|
userStore.getInfo();
|
getUserLoginFacotryList();
|
// 启动通知状态定时器
|
startStatusTimer();
|
});
|
</script>
|
|
|
<style scoped lang="scss">
|
.content {
|
background: linear-gradient(135deg, #f8f9fa 0%, #e3f2fd 100%);
|
min-height: 100vh;
|
padding: 1.25rem;
|
/* 为所有设备设置基础padding-top */
|
padding-top: 40px;
|
position: relative;
|
|
/* iOS设备使用env()函数处理安全区域 */
|
padding-top: env(safe-area-inset-top);
|
|
/* 为安卓设备设置更大的顶部内边距 */
|
/* #ifdef APP-PLUS && !MP && !H5 */
|
padding-top: 45px;
|
/* #endif */
|
|
/* H5和小程序平台的通用样式 */
|
/* #ifdef H5 || MP */
|
padding-top: 30px;
|
/* #endif */
|
|
&::before {
|
content: "";
|
position: fixed;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="dots" width="20" height="20" patternUnits="userSpaceOnUse"><circle cx="10" cy="10" r="1" fill="rgba(41, 121, 255, 0.03)"/></pattern></defs><rect width="100" height="100" fill="url(%23dots)"/></svg>');
|
pointer-events: none;
|
z-index: -1;
|
}
|
|
&::after {
|
content: "";
|
position: fixed;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
background: radial-gradient(
|
circle at 20% 80%,
|
rgba(41, 121, 255, 0.02) 0%,
|
transparent 50%
|
),
|
radial-gradient(
|
circle at 80% 20%,
|
rgba(156, 39, 176, 0.02) 0%,
|
transparent 50%
|
);
|
pointer-events: none;
|
z-index: -1;
|
}
|
}
|
|
.header-section {
|
margin-bottom: 1rem;
|
animation: fadeInDown 0.6s ease-out;
|
/* 为安卓设备额外调整头部位置 */
|
/* #ifdef APP-PLUS && !MP && !H5 */
|
margin-top: 10px;
|
/* #endif */
|
}
|
|
.currentFactory {
|
margin-top: 0.5rem;
|
margin-left: 0.25rem;
|
font-weight: 500;
|
display: flex;
|
}
|
|
.factoryName {
|
width: auto;
|
}
|
|
:deep(.u-text) {
|
align-items: center;
|
}
|
|
.hero-section {
|
margin-bottom: 1rem;
|
animation: fadeInUp 0.6s ease-out 0.1s both;
|
}
|
|
.bg-img {
|
width: 100%;
|
height: 8.75rem;
|
background-image: url("../static/images/banner/backview.png");
|
background-size: cover;
|
border-radius: 0.75rem;
|
position: relative;
|
overflow: hidden;
|
box-shadow: 0 0.25rem 1.25rem rgba(41, 121, 255, 0.15);
|
|
&::before {
|
content: "";
|
position: absolute;
|
top: -50%;
|
left: -50%;
|
width: 200%;
|
height: 200%;
|
background: conic-gradient(
|
from 0deg,
|
transparent,
|
rgba(255, 255, 255, 0.1),
|
transparent,
|
rgba(255, 255, 255, 0.05),
|
transparent
|
);
|
animation: rotate 20s linear infinite;
|
}
|
|
&::after {
|
content: "";
|
position: absolute;
|
top: 0;
|
right: 0;
|
width: 7.5rem;
|
height: 7.5rem;
|
background: radial-gradient(
|
circle,
|
rgba(255, 255, 255, 0.15) 0%,
|
transparent 70%
|
);
|
border-radius: 50%;
|
transform: translate(2.5rem, -2.5rem);
|
}
|
}
|
|
.hero-content {
|
position: relative;
|
z-index: 1;
|
padding: 1.25rem 1.25rem 1.6rem 1.25rem;
|
height: 100%;
|
display: flex;
|
flex-direction: column;
|
align-items: flex-start;
|
justify-content: flex-start;
|
}
|
|
.hero-title {
|
color: #ffffff;
|
font-size: 1.625rem;
|
font-weight: 700;
|
letter-spacing: 0.03125rem;
|
text-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.5);
|
}
|
.hero-subtitle {
|
font-size: 0.8125rem;
|
margin-top: 0.375rem;
|
}
|
.hero-wave {
|
height: 2.75rem;
|
}
|
|
.hero-subtitle {
|
color: rgba(255, 255, 255, 0.9);
|
font-size: 0.8125rem;
|
margin-top: 0.375rem;
|
font-weight: 400;
|
text-shadow: 0 0.0625rem 0.125rem rgba(0, 0, 0, 0.5);
|
}
|
|
.hero-wave {
|
position: absolute;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
height: 2.75rem;
|
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 320' preserveAspectRatio='none'><path fill='%23ffffff' fill-opacity='0.2' d='M0,224L48,218.7C96,213,192,203,288,197.3C384,192,480,192,576,176C672,160,768,128,864,122.7C960,117,1056,139,1152,144C1248,149,1344,139,1392,133.3L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z'></path></svg>")
|
no-repeat bottom center/cover;
|
pointer-events: none;
|
}
|
|
.notice-section {
|
margin-bottom: 1rem;
|
animation: fadeInUp 0.6s ease-out 0.2s both;
|
}
|
|
.notice {
|
width: 100%;
|
background: linear-gradient(135deg, #eaf2ff 0%, #bbdefb 100%);
|
border: 0.0625rem solid #e3f2fd;
|
border-radius: 0.75rem;
|
padding: 1rem;
|
box-shadow: 0 0.25rem 1.25rem rgba(41, 121, 255, 0.08);
|
position: relative;
|
overflow: hidden;
|
|
&::before {
|
content: "";
|
position: absolute;
|
top: -50%;
|
left: -50%;
|
width: 200%;
|
height: 200%;
|
background: linear-gradient(
|
45deg,
|
transparent,
|
rgba(255, 255, 255, 0.6),
|
transparent
|
);
|
animation: shine 4s infinite;
|
}
|
|
&::after {
|
content: "";
|
position: absolute;
|
top: 0;
|
right: 0;
|
width: 5rem;
|
height: 5rem;
|
background: radial-gradient(
|
circle,
|
rgba(255, 255, 255, 0.2) 0%,
|
transparent 70%
|
);
|
border-radius: 50%;
|
transform: translate(1.875rem, -1.875rem);
|
}
|
|
&:hover {
|
transform: translateY(-0.125rem);
|
box-shadow: 0 0.5rem 1.875rem rgba(0, 0, 0, 0.1);
|
}
|
}
|
|
@keyframes shine {
|
0% {
|
transform: translateX(-100%) translateY(-100%) rotate(45deg);
|
}
|
100% {
|
transform: translateX(100%) translateY(100%) rotate(45deg);
|
}
|
}
|
|
@keyframes fadeInDown {
|
from {
|
opacity: 0;
|
transform: translateY(-1.25rem);
|
}
|
to {
|
opacity: 1;
|
transform: translateY(0);
|
}
|
}
|
|
@keyframes fadeInUp {
|
from {
|
opacity: 0;
|
transform: translateY(1.25rem);
|
}
|
to {
|
opacity: 1;
|
transform: translateY(0);
|
}
|
}
|
|
@keyframes fadeInScale {
|
0% {
|
opacity: 0;
|
transform: translateY(0.5rem) scale(0.96);
|
}
|
100% {
|
opacity: 1;
|
transform: translateY(0) scale(1);
|
}
|
}
|
|
.notice-content {
|
display: flex;
|
align-items: center;
|
height: 100%;
|
position: relative;
|
z-index: 1;
|
}
|
|
.notice-left {
|
margin-right: 1rem;
|
}
|
|
.notice-status {
|
font-weight: 600;
|
font-size: 1rem;
|
color: #1976d2;
|
}
|
|
.notice-separator {
|
width: 0.0625rem;
|
height: 1.5rem;
|
background: #e0e0e0;
|
margin-right: 1rem;
|
}
|
|
.notice-right {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
flex: 1;
|
}
|
|
.notice-label {
|
color: #333;
|
font-size: 0.875rem;
|
font-weight: 500;
|
margin-right: 0.75rem;
|
}
|
|
.notice-text {
|
font-weight: 400;
|
font-size: 0.875rem;
|
color: #666666;
|
}
|
|
.notice-number {
|
font-weight: 600;
|
font-size: 1rem;
|
color: #1976d2;
|
margin-left: 0.25rem;
|
}
|
|
.notice-unit {
|
font-weight: 600;
|
font-size: 1rem;
|
color: #1976d2;
|
margin-left: 0.25rem;
|
}
|
|
/* 功能模块样式 */
|
.common-module {
|
margin-bottom: 1.5rem;
|
background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
|
border-radius: 1rem;
|
padding: 1rem;
|
box-shadow: 0 0.25rem 1.25rem rgba(0, 0, 0, 0.06);
|
border: none;
|
position: relative;
|
overflow: hidden;
|
transition: all 0.3s ease;
|
|
&::after {
|
content: "";
|
position: absolute;
|
top: 0;
|
right: 0;
|
width: 3.75rem;
|
height: 3.75rem;
|
background: radial-gradient(
|
circle,
|
rgba(0, 0, 0, 0.02) 0%,
|
transparent 70%
|
);
|
border-radius: 50%;
|
transform: translate(1.875rem, -1.875rem);
|
}
|
}
|
|
.marketing-module {
|
--module-color: #2979ff;
|
}
|
|
.purchase-module {
|
--module-color: #1976d2;
|
}
|
|
.collaboration-module {
|
--module-color: #4caf50;
|
}
|
|
.production-module {
|
--module-color: #ff9800;
|
}
|
|
.equipment-module {
|
--module-color: #9c27b0;
|
}
|
|
.module-header {
|
margin-bottom: 1.5rem;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
}
|
|
.module-title-container {
|
display: flex;
|
align-items: center;
|
}
|
|
.module-title {
|
color: #333333;
|
font-size: 1.125rem;
|
font-weight: 600;
|
position: relative;
|
}
|
|
.module-subtitle {
|
color: #666666;
|
font-size: 0.75rem;
|
font-weight: 400;
|
margin-left: 0.5rem;
|
}
|
|
.module-content {
|
width: 100%;
|
display: grid;
|
gap: 1rem;
|
}
|
|
.icon-container {
|
width: 3.25rem;
|
height: 3.25rem;
|
border-radius: 0.75rem;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
margin-bottom: 0.375rem;
|
box-shadow: 0 0.1875rem 0.75rem rgba(0, 0, 0, 0.12);
|
transition: all 0.2s ease;
|
position: relative;
|
overflow: hidden;
|
animation: fadeInScale 0.5s ease both;
|
|
&::before {
|
content: "";
|
position: absolute;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
background: linear-gradient(
|
135deg,
|
rgba(255, 255, 255, 0.1) 0%,
|
transparent 50%,
|
rgba(255, 255, 255, 0.05) 100%
|
);
|
opacity: 0;
|
transition: opacity 0.3s ease;
|
}
|
|
&::after {
|
content: "";
|
position: absolute;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
border-radius: 0.75rem;
|
background: linear-gradient(
|
45deg,
|
transparent,
|
rgba(255, 255, 255, 0.2),
|
transparent
|
);
|
opacity: 0;
|
transition: opacity 0.3s ease;
|
}
|
|
&:hover {
|
transform: translateY(-0.1875rem) scale(1.02);
|
box-shadow: 0 0.5rem 1.5625rem rgba(0, 0, 0, 0.18);
|
|
&::before,
|
&::after {
|
opacity: 1;
|
}
|
}
|
|
&:active {
|
transform: scale(0.97);
|
box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.18);
|
}
|
}
|
|
.item-label {
|
font-size: 0.8125rem;
|
color: #555555;
|
text-align: center;
|
display: block;
|
line-height: 1.4;
|
font-weight: 500;
|
margin-top: 0.25rem;
|
margin-bottom: 0.625rem;
|
}
|
|
.grid-text {
|
font-size: 0.875rem;
|
color: #909399;
|
padding: 0.625rem 0 1.25rem 0;
|
/* #ifndef APP-PLUS */
|
box-sizing: border-box;
|
/* #endif */
|
}
|
|
/* 暗色模式适配 */
|
@media (prefers-color-scheme: dark) {
|
.content {
|
background: linear-gradient(135deg, #121317 0%, #161a20 100%);
|
}
|
.content::before {
|
background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="dots" width="20" height="20" patternUnits="userSpaceOnUse"><circle cx="10" cy="10" r="1" fill="rgba(255, 255, 255, 0.05)"/></pattern></defs><rect width="100" height="100" fill="url(%23dots)"/></svg>');
|
}
|
.common-module {
|
background: linear-gradient(135deg, #1e1f24 0%, #23252b 100%);
|
box-shadow: 0 0.375rem 1.5rem rgba(0, 0, 0, 0.35);
|
}
|
.module-title {
|
color: #e9edf3;
|
}
|
.module-subtitle,
|
.item-label,
|
.notice-text,
|
.notice-unit,
|
.notice-label {
|
color: #c7cbd3;
|
}
|
.notice {
|
background: linear-gradient(135deg, #1b2330 0%, #1a2432 100%);
|
border-color: rgba(255, 255, 255, 0.06);
|
box-shadow: 0 0.375rem 1.25rem rgba(0, 0, 0, 0.4);
|
}
|
.notice-status,
|
.notice-number {
|
color: #8ab4ff;
|
}
|
.bg-img {
|
background: linear-gradient(135deg, #1f4fb9 0%, #0e3a8a 100%);
|
}
|
}
|
|
@keyframes rotate {
|
from {
|
transform: rotate(0deg);
|
}
|
to {
|
transform: rotate(360deg);
|
}
|
}
|
|
@keyframes fadeInDown {
|
from {
|
opacity: 0;
|
transform: translateY(-1.25rem);
|
}
|
to {
|
opacity: 1;
|
transform: translateY(0);
|
}
|
}
|
|
@keyframes fadeInUp {
|
from {
|
opacity: 0;
|
transform: translateY(1.25rem);
|
}
|
to {
|
opacity: 1;
|
transform: translateY(0);
|
}
|
}
|
|
@keyframes fadeInScale {
|
0% {
|
opacity: 0;
|
transform: translateY(0.5rem) scale(0.96);
|
}
|
100% {
|
opacity: 1;
|
transform: translateY(0) scale(1);
|
}
|
}
|
|
.notice-left {
|
margin-right: 1rem;
|
}
|
.notice-status {
|
font-size: 1rem;
|
}
|
.notice-separator {
|
width: 0.0625rem;
|
height: 1.5rem;
|
margin-right: 1rem;
|
}
|
.notice-label {
|
font-size: 0.875rem;
|
margin-right: 0.75rem;
|
}
|
.notice-text {
|
font-size: 0.875rem;
|
}
|
.notice-number {
|
font-size: 1rem;
|
margin-left: 0.25rem;
|
}
|
.notice-unit {
|
font-size: 0.875rem;
|
margin-left: 0.125rem;
|
}
|
|
.common-module {
|
margin-bottom: 1.5rem;
|
background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
|
border-radius: 1rem;
|
padding: 1rem;
|
box-shadow: 0 0.25rem 1.25rem rgba(0, 0, 0, 0.06);
|
border: none;
|
position: relative;
|
overflow: hidden;
|
transition: all 0.3s ease;
|
|
&::after {
|
content: "";
|
position: absolute;
|
top: 0;
|
right: 0;
|
width: 3.75rem;
|
height: 3.75rem;
|
background: radial-gradient(
|
circle,
|
rgba(0, 0, 0, 0.02) 0%,
|
transparent 70%
|
);
|
border-radius: 50%;
|
transform: translate(1.875rem, -1.875rem);
|
}
|
}
|
|
.marketing-module {
|
--module-color: #2979ff;
|
}
|
|
.purchase-module {
|
--module-color: #1976d2;
|
}
|
|
.collaboration-module {
|
--module-color: #4caf50;
|
}
|
|
.production-module {
|
--module-color: #ff9800;
|
}
|
|
.equipment-module {
|
--module-color: #9c27b0;
|
}
|
|
.module-header {
|
margin-bottom: 1.5rem;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
}
|
|
.module-title-container {
|
display: flex;
|
align-items: center;
|
}
|
|
.module-title {
|
color: #333333;
|
font-size: 1.125rem;
|
font-weight: 600;
|
position: relative;
|
}
|
|
.module-subtitle {
|
color: #666666;
|
font-size: 0.75rem;
|
font-weight: 400;
|
margin-left: 0.5rem;
|
}
|
|
.module-content {
|
width: 100%;
|
display: grid;
|
gap: 1rem;
|
}
|
|
.icon-container {
|
width: 3.25rem;
|
height: 3.25rem;
|
border-radius: 0.75rem;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
margin-bottom: 0.375rem;
|
box-shadow: 0 0.1875rem 0.75rem rgba(0, 0, 0, 0.12);
|
transition: all 0.2s ease;
|
position: relative;
|
overflow: hidden;
|
animation: fadeInScale 0.5s ease both;
|
|
&:hover {
|
transform: translateY(-0.1875rem) scale(1.02);
|
box-shadow: 0 0.5rem 1.5625rem rgba(0, 0, 0, 0.18);
|
}
|
|
&:active {
|
transform: scale(0.97);
|
box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.18);
|
}
|
}
|
|
.item-label {
|
font-size: 0.8125rem;
|
margin-top: 0.25rem;
|
margin-bottom: 0.625rem;
|
}
|
.grid-text {
|
font-size: 0.875rem;
|
}
|
|
@media (prefers-color-scheme: dark) {
|
.common-module {
|
box-shadow: 0 0.375rem 1.5rem rgba(0, 0, 0, 0.35);
|
}
|
.notice {
|
box-shadow: 0 0.375rem 1.25rem rgba(0, 0, 0, 0.4);
|
}
|
}
|
</style>
|