<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>
|
<text class="hero-subtitle">高效、便捷的业务管理入口</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="26"
|
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="26"
|
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="26"
|
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="26"
|
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: 'account',
|
label: '销售台账',
|
bgColor: '#2979ff'
|
},
|
{
|
icon: 'home',
|
label: '开票登记',
|
bgColor: '#1976d2'
|
},
|
{
|
icon: 'file-text',
|
label: '开票台账',
|
bgColor: '#42a5f5'
|
},
|
{
|
icon: 'shopping-cart',
|
label: '回款登记',
|
bgColor: '#64b5f6'
|
},
|
{
|
icon: 'chat',
|
label: '回款流水',
|
bgColor: '#90caf9'
|
},
|
{
|
icon: 'chat',
|
label: '客户往来',
|
bgColor: '#90caf9'
|
}
|
]);
|
|
// 采购管理功能数据
|
const purchaseItems = reactive([
|
{
|
icon: 'order',
|
label: '采购台账',
|
bgColor: '#bbdefb'
|
},
|
{
|
icon: 'truck',
|
label: '来票登记',
|
bgColor: '#e3f2fd'
|
},
|
{
|
icon: 'box',
|
label: '来票台账',
|
bgColor: '#f3e5f5'
|
},
|
{
|
icon: 'chart-line',
|
label: '付款登记',
|
bgColor: '#e8eaf6'
|
},
|
{
|
icon: 'settings',
|
label: '付款流水',
|
bgColor: '#f1f8e9'
|
},
|
{
|
icon: 'settings',
|
label: '供应商往来',
|
bgColor: '#f1f8e9'
|
},
|
]);
|
|
// 协同办公功能数据
|
const collaborationItems = reactive([
|
{
|
icon: 'checkmark-circle',
|
label: '协同审批',
|
bgColor: '#4caf50'
|
},
|
{
|
icon: 'map-pin',
|
label: '客户拜访',
|
bgColor: '#ff9800'
|
}
|
]);
|
|
// 设备管理功能数据
|
const equipmentItems = reactive([
|
{
|
icon: 'list',
|
label: '设备台账',
|
bgColor: '#9c27b0'
|
},
|
{
|
icon: 'wrench',
|
label: '设备报修',
|
bgColor: '#f44336'
|
},
|
{
|
icon: 'shield-check',
|
label: '设备保养',
|
bgColor: '#00bcd4'
|
}
|
]);
|
|
// 处理常用功能点击
|
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/cooperativeOffice/collaborativeApproval/index'
|
});
|
break;
|
case '客户拜访':
|
uni.navigateTo({
|
url: '/pages/cooperativeOffice/clientVisit/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 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: env(safe-area-inset-top);
|
position: relative;
|
|
&::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;
|
}
|
}
|
|
/* 本页不再定义 .safe-area-top,已移至全局样式 */
|
|
.header-section {
|
margin-bottom: 1rem;
|
animation: fadeInDown 0.6s ease-out;
|
}
|
|
.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: linear-gradient(135deg, #2979ff 0%, #1565c0 100%);
|
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;
|
height: 100%;
|
display: flex;
|
flex-direction: column;
|
align-items: flex-start;
|
justify-content: center;
|
}
|
|
.hero-title {
|
color: #ffffff;
|
font-size: 1.625rem;
|
font-weight: 700;
|
letter-spacing: 0.03125rem;
|
}
|
.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;
|
}
|
|
.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 {
|
color: #666666;
|
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;
|
}
|
|
.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;
|
}
|
|
.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>
|