|
|
@ -11,10 +11,10 @@ |
|
|
查看全部 |
|
|
查看全部 |
|
|
</el-button> |
|
|
</el-button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="notification-grid"> |
|
|
<div class="notification-grid"> |
|
|
<!-- 通知卡片 - 动态变色 --> |
|
|
<!-- 通知卡片 - 动态变色 --> |
|
|
<div class="notification-card-main" |
|
|
|
|
|
|
|
|
<div class="notification-card-main" |
|
|
@click="$router.push('/vet-info/VetNotification')" |
|
|
@click="$router.push('/vet-info/VetNotification')" |
|
|
:class="{ |
|
|
:class="{ |
|
|
'has-unread': tjzs.unreadCount > 0, |
|
|
'has-unread': tjzs.unreadCount > 0, |
|
|
@ -266,10 +266,10 @@ |
|
|
<div v-if="activeStep === 0"> |
|
|
<div v-if="activeStep === 0"> |
|
|
<el-form ref="qualificationForm" :model="qualificationForm" :rules="rules" label-width="100px"> |
|
|
<el-form ref="qualificationForm" :model="qualificationForm" :rules="rules" label-width="100px"> |
|
|
<el-form-item label="真实姓名" prop="realName"> |
|
|
<el-form-item label="真实姓名" prop="realName"> |
|
|
<el-input v-model="qualificationForm.realName" placeholder="请输入您的真实姓名" /> |
|
|
|
|
|
|
|
|
<el-input v-model="qualificationForm.realName" placeholder="请输入您的真实姓名" maxlength="10" minlength="2"/> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="身份证号" prop="idCard"> |
|
|
<el-form-item label="身份证号" prop="idCard"> |
|
|
<el-input v-model="qualificationForm.idCard" placeholder="请输入身份证号" /> |
|
|
|
|
|
|
|
|
<el-input v-model="qualificationForm.idCard" placeholder="请输入身份证号" maxlength="18"/> |
|
|
</el-form-item> |
|
|
</el-form-item> |
|
|
<el-form-item label="资质类型" prop="qualificationType"> |
|
|
<el-form-item label="资质类型" prop="qualificationType"> |
|
|
<el-select |
|
|
<el-select |
|
|
@ -573,10 +573,13 @@ export default { |
|
|
qualificationTypeOptions: [], |
|
|
qualificationTypeOptions: [], |
|
|
rules: { |
|
|
rules: { |
|
|
realName: [ |
|
|
realName: [ |
|
|
{required: true, message: "请输入真实姓名", trigger: "blur"} |
|
|
|
|
|
|
|
|
{required: true, message: "请输入真实姓名", trigger: "blur"}, |
|
|
|
|
|
{ min: 2, max: 10, message: "长度在2到10个字符", trigger: "blur" }, |
|
|
], |
|
|
], |
|
|
idCard: [ |
|
|
idCard: [ |
|
|
{required: true, message: "请输入身份证号", trigger: "blur"} |
|
|
|
|
|
|
|
|
{required: true, message: "请输入身份证号", trigger: "blur"}, |
|
|
|
|
|
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/, message: "身份证号码不合法", trigger: "blur" }, |
|
|
|
|
|
{ min: 1, max: 18, message: "长度在18个字符", trigger: "blur" }, |
|
|
], |
|
|
], |
|
|
qualificationType: [ |
|
|
qualificationType: [ |
|
|
{required: true, message: "请选择资质类型", trigger: "change"} |
|
|
{required: true, message: "请选择资质类型", trigger: "change"} |
|
|
@ -591,13 +594,13 @@ export default { |
|
|
notificationChart: null, |
|
|
notificationChart: null, |
|
|
trendChart: null, |
|
|
trendChart: null, |
|
|
qualificationChart: null, |
|
|
qualificationChart: null, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 各统计项的数值 |
|
|
// 各统计项的数值 |
|
|
platformUserValue: 12589.68, |
|
|
platformUserValue: 12589.68, |
|
|
herdsmanCount: "456/2", |
|
|
herdsmanCount: "456/2", |
|
|
vetCount: 89.50, |
|
|
vetCount: 89.50, |
|
|
shopCount: 521, |
|
|
shopCount: 521, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 资质类型分布模拟数据 |
|
|
// 资质类型分布模拟数据 |
|
|
qualificationTypeData: [ |
|
|
qualificationTypeData: [ |
|
|
{ name: '执业兽医', value: 120 }, |
|
|
{ name: '执业兽医', value: 120 }, |
|
|
@ -775,18 +778,18 @@ export default { |
|
|
initCharts() { |
|
|
initCharts() { |
|
|
// 初始化通知状态环形图 |
|
|
// 初始化通知状态环形图 |
|
|
this.notificationChart = echarts.init(document.getElementById('notificationChart')); |
|
|
this.notificationChart = echarts.init(document.getElementById('notificationChart')); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化趋势图 |
|
|
// 初始化趋势图 |
|
|
this.trendChart = echarts.init(document.getElementById('trendChart')); |
|
|
this.trendChart = echarts.init(document.getElementById('trendChart')); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化资质类型分布图 |
|
|
// 初始化资质类型分布图 |
|
|
this.qualificationChart = echarts.init(document.getElementById('qualificationChart')); |
|
|
this.qualificationChart = echarts.init(document.getElementById('qualificationChart')); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新所有图表 |
|
|
// 更新所有图表 |
|
|
this.updateNotificationChart(); |
|
|
this.updateNotificationChart(); |
|
|
this.updateTrendChart(); |
|
|
this.updateTrendChart(); |
|
|
this.updateQualificationChart(); |
|
|
this.updateQualificationChart(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 监听窗口大小变化,重新调整图表大小 |
|
|
// 监听窗口大小变化,重新调整图表大小 |
|
|
window.addEventListener('resize', this.handleResize); |
|
|
window.addEventListener('resize', this.handleResize); |
|
|
}, |
|
|
}, |
|
|
@ -796,15 +799,15 @@ export default { |
|
|
if (this.trendChart) this.trendChart.resize(); |
|
|
if (this.trendChart) this.trendChart.resize(); |
|
|
if (this.qualificationChart) this.qualificationChart.resize(); |
|
|
if (this.qualificationChart) this.qualificationChart.resize(); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 更新通知状态环形图 */ |
|
|
/** 更新通知状态环形图 */ |
|
|
updateNotificationChart() { |
|
|
updateNotificationChart() { |
|
|
if (!this.notificationChart) return; |
|
|
if (!this.notificationChart) return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const unreadCount = this.tjzs.unreadCount || 0; |
|
|
const unreadCount = this.tjzs.unreadCount || 0; |
|
|
const readCount = this.tjzs.readCount || 0; |
|
|
const readCount = this.tjzs.readCount || 0; |
|
|
const totalCount = this.tjzs.totalCount || (unreadCount + readCount); |
|
|
const totalCount = this.tjzs.totalCount || (unreadCount + readCount); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const option = { |
|
|
const option = { |
|
|
tooltip: { |
|
|
tooltip: { |
|
|
trigger: 'item', |
|
|
trigger: 'item', |
|
|
@ -839,34 +842,34 @@ export default { |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
data: [ |
|
|
data: [ |
|
|
{ |
|
|
|
|
|
value: unreadCount, |
|
|
|
|
|
name: '未读通知', |
|
|
|
|
|
itemStyle: { color: '#ff6b6b' } |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
value: unreadCount, |
|
|
|
|
|
name: '未读通知', |
|
|
|
|
|
itemStyle: { color: '#ff6b6b' } |
|
|
}, |
|
|
}, |
|
|
{ |
|
|
|
|
|
value: readCount, |
|
|
|
|
|
name: '已读通知', |
|
|
|
|
|
itemStyle: { color: '#51cf66' } |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
value: readCount, |
|
|
|
|
|
name: '已读通知', |
|
|
|
|
|
itemStyle: { color: '#51cf66' } |
|
|
} |
|
|
} |
|
|
] |
|
|
] |
|
|
} |
|
|
} |
|
|
] |
|
|
] |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.notificationChart.setOption(option); |
|
|
this.notificationChart.setOption(option); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 更新趋势图 */ |
|
|
/** 更新趋势图 */ |
|
|
updateTrendChart() { |
|
|
updateTrendChart() { |
|
|
if (!this.trendChart) return; |
|
|
if (!this.trendChart) return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 根据选择的时间范围生成数据 |
|
|
// 根据选择的时间范围生成数据 |
|
|
const days = parseInt(this.trendTimeRange); |
|
|
const days = parseInt(this.trendTimeRange); |
|
|
const dates = []; |
|
|
const dates = []; |
|
|
const applicationData = []; |
|
|
const applicationData = []; |
|
|
const approvalData = []; |
|
|
const approvalData = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = days - 1; i >= 0; i--) { |
|
|
for (let i = days - 1; i >= 0; i--) { |
|
|
const date = new Date(); |
|
|
const date = new Date(); |
|
|
date.setDate(date.getDate() - i); |
|
|
date.setDate(date.getDate() - i); |
|
|
@ -874,7 +877,7 @@ export default { |
|
|
applicationData.push(Math.floor(Math.random() * 20) + 10); |
|
|
applicationData.push(Math.floor(Math.random() * 20) + 10); |
|
|
approvalData.push(Math.floor(Math.random() * 15) + 5); |
|
|
approvalData.push(Math.floor(Math.random() * 15) + 5); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const option = { |
|
|
const option = { |
|
|
tooltip: { |
|
|
tooltip: { |
|
|
trigger: 'axis', |
|
|
trigger: 'axis', |
|
|
@ -953,14 +956,14 @@ export default { |
|
|
} |
|
|
} |
|
|
] |
|
|
] |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.trendChart.setOption(option); |
|
|
this.trendChart.setOption(option); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 更新资质类型分布图 */ |
|
|
/** 更新资质类型分布图 */ |
|
|
updateQualificationChart() { |
|
|
updateQualificationChart() { |
|
|
if (!this.qualificationChart) return; |
|
|
if (!this.qualificationChart) return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const option = { |
|
|
const option = { |
|
|
tooltip: { |
|
|
tooltip: { |
|
|
trigger: 'axis', |
|
|
trigger: 'axis', |
|
|
@ -1023,10 +1026,10 @@ export default { |
|
|
} |
|
|
} |
|
|
] |
|
|
] |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.qualificationChart.setOption(option); |
|
|
this.qualificationChart.setOption(option); |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 刷新图表数据 */ |
|
|
/** 刷新图表数据 */ |
|
|
refreshCharts() { |
|
|
refreshCharts() { |
|
|
this.$message({ |
|
|
this.$message({ |
|
|
@ -1034,19 +1037,19 @@ export default { |
|
|
type: 'info', |
|
|
type: 'info', |
|
|
duration: 1000 |
|
|
duration: 1000 |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 重新获取统计数据 |
|
|
// 重新获取统计数据 |
|
|
this.getcountSummary(); |
|
|
this.getcountSummary(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 更新趋势图 |
|
|
// 更新趋势图 |
|
|
this.updateTrendChart(); |
|
|
this.updateTrendChart(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 模拟数据更新 |
|
|
// 模拟数据更新 |
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
this.platformUserValue += Math.floor(Math.random() * 100); |
|
|
this.platformUserValue += Math.floor(Math.random() * 100); |
|
|
this.vetCount += Math.floor(Math.random() * 10); |
|
|
this.vetCount += Math.floor(Math.random() * 10); |
|
|
this.shopCount += Math.floor(Math.random() * 5); |
|
|
this.shopCount += Math.floor(Math.random() * 5); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.$message({ |
|
|
this.$message({ |
|
|
message: '数据刷新完成', |
|
|
message: '数据刷新完成', |
|
|
type: 'success', |
|
|
type: 'success', |
|
|
@ -1134,26 +1137,26 @@ export default { |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
transition: all 0.3s ease; |
|
|
transition: all 0.3s ease; |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.has-unread { |
|
|
&.has-unread { |
|
|
background: linear-gradient(145deg, #fff2f0, #ffe7e7); |
|
|
background: linear-gradient(145deg, #fff2f0, #ffe7e7); |
|
|
border-left: 6px solid #ff6b6b; |
|
|
border-left: 6px solid #ff6b6b; |
|
|
animation: softPulse 2s infinite; |
|
|
animation: softPulse 2s infinite; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification-title { |
|
|
.notification-title { |
|
|
color: #c92a2a; |
|
|
color: #c92a2a; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.no-unread { |
|
|
&.no-unread { |
|
|
background: linear-gradient(145deg, #f0f9ff, #e6f4ff); |
|
|
background: linear-gradient(145deg, #f0f9ff, #e6f4ff); |
|
|
border-left: 6px solid #339af0; |
|
|
border-left: 6px solid #339af0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification-title { |
|
|
.notification-title { |
|
|
color: #1971c2; |
|
|
color: #1971c2; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
transform: translateY(-4px); |
|
|
transform: translateY(-4px); |
|
|
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.12); |
|
|
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.12); |
|
|
@ -1174,14 +1177,14 @@ export default { |
|
|
justify-content: center; |
|
|
justify-content: center; |
|
|
background: rgba(255, 255, 255, 0.8); |
|
|
background: rgba(255, 255, 255, 0.8); |
|
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); |
|
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
font-size: 28px; |
|
|
font-size: 28px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.has-unread & { |
|
|
.has-unread & { |
|
|
color: #ff6b6b; |
|
|
color: #ff6b6b; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.no-unread & { |
|
|
.no-unread & { |
|
|
color: #339af0; |
|
|
color: #339af0; |
|
|
} |
|
|
} |
|
|
@ -1225,11 +1228,11 @@ export default { |
|
|
padding: 2px 8px; |
|
|
padding: 2px 8px; |
|
|
border-radius: 20px; |
|
|
border-radius: 20px; |
|
|
background: rgba(0, 0, 0, 0.04); |
|
|
background: rgba(0, 0, 0, 0.04); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.has-unread & { |
|
|
.has-unread & { |
|
|
background: rgba(255, 107, 107, 0.1); |
|
|
background: rgba(255, 107, 107, 0.1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.no-unread & { |
|
|
.no-unread & { |
|
|
background: rgba(51, 154, 240, 0.1); |
|
|
background: rgba(51, 154, 240, 0.1); |
|
|
} |
|
|
} |
|
|
@ -1240,24 +1243,24 @@ export default { |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
color: #5a6a7e; |
|
|
color: #5a6a7e; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.stat-dot { |
|
|
.stat-dot { |
|
|
width: 8px; |
|
|
width: 8px; |
|
|
height: 8px; |
|
|
height: 8px; |
|
|
border-radius: 50%; |
|
|
border-radius: 50%; |
|
|
margin-right: 8px; |
|
|
margin-right: 8px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.unread { |
|
|
&.unread { |
|
|
background: #ff6b6b; |
|
|
background: #ff6b6b; |
|
|
box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.2); |
|
|
box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.2); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.read { |
|
|
&.read { |
|
|
background: #51cf66; |
|
|
background: #51cf66; |
|
|
box-shadow: 0 0 0 2px rgba(81, 207, 102, 0.2); |
|
|
box-shadow: 0 0 0 2px rgba(81, 207, 102, 0.2); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.stat-divider { |
|
|
.stat-divider { |
|
|
margin: 0 10px; |
|
|
margin: 0 10px; |
|
|
color: #d0d7dd; |
|
|
color: #d0d7dd; |
|
|
@ -1270,20 +1273,20 @@ export default { |
|
|
border-radius: 16px; |
|
|
border-radius: 16px; |
|
|
transition: all 0.3s ease; |
|
|
transition: all 0.3s ease; |
|
|
border: 1px solid #f0f0f0; |
|
|
border: 1px solid #f0f0f0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
transform: translateY(-4px); |
|
|
transform: translateY(-4px); |
|
|
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.08); |
|
|
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.08); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&-total { |
|
|
&-total { |
|
|
background: linear-gradient(145deg, #fff7e6, #fff2db); |
|
|
background: linear-gradient(145deg, #fff7e6, #fff2db); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&-read { |
|
|
&-read { |
|
|
background: linear-gradient(145deg, #e8f5e9, #dff0df); |
|
|
background: linear-gradient(145deg, #e8f5e9, #dff0df); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&-unread { |
|
|
&-unread { |
|
|
background: linear-gradient(145deg, #ffebee, #ffe4e4); |
|
|
background: linear-gradient(145deg, #ffebee, #ffe4e4); |
|
|
} |
|
|
} |
|
|
@ -1306,22 +1309,22 @@ export default { |
|
|
display: flex; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
justify-content: center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
font-size: 26px; |
|
|
font-size: 26px; |
|
|
color: white; |
|
|
color: white; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.icon-total { |
|
|
&.icon-total { |
|
|
background: linear-gradient(145deg, #ff9a44, #ff6b08); |
|
|
background: linear-gradient(145deg, #ff9a44, #ff6b08); |
|
|
box-shadow: 0 6px 12px rgba(255, 107, 8, 0.2); |
|
|
box-shadow: 0 6px 12px rgba(255, 107, 8, 0.2); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.icon-read { |
|
|
&.icon-read { |
|
|
background: linear-gradient(145deg, #51cf66, #37b24d); |
|
|
background: linear-gradient(145deg, #51cf66, #37b24d); |
|
|
box-shadow: 0 6px 12px rgba(81, 207, 102, 0.2); |
|
|
box-shadow: 0 6px 12px rgba(81, 207, 102, 0.2); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.icon-unread { |
|
|
&.icon-unread { |
|
|
background: linear-gradient(145deg, #ff6b6b, #fa5252); |
|
|
background: linear-gradient(145deg, #ff6b6b, #fa5252); |
|
|
box-shadow: 0 6px 12px rgba(255, 107, 107, 0.2); |
|
|
box-shadow: 0 6px 12px rgba(255, 107, 107, 0.2); |
|
|
@ -1351,15 +1354,15 @@ export default { |
|
|
color: #7c8b9c; |
|
|
color: #7c8b9c; |
|
|
display: flex; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
margin-right: 4px; |
|
|
margin-right: 4px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.positive { |
|
|
&.positive { |
|
|
color: #51cf66; |
|
|
color: #51cf66; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.warning { |
|
|
&.warning { |
|
|
color: #ff922b; |
|
|
color: #ff922b; |
|
|
} |
|
|
} |
|
|
@ -1396,7 +1399,7 @@ export default { |
|
|
.refresh-btn { |
|
|
.refresh-btn { |
|
|
background: #f0f2f5; |
|
|
background: #f0f2f5; |
|
|
border: none; |
|
|
border: none; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
background: #e4e7ed; |
|
|
background: #e4e7ed; |
|
|
transform: rotate(180deg); |
|
|
transform: rotate(180deg); |
|
|
@ -1409,11 +1412,11 @@ export default { |
|
|
display: grid; |
|
|
display: grid; |
|
|
gap: 24px; |
|
|
gap: 24px; |
|
|
margin-bottom: 24px; |
|
|
margin-bottom: 24px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.two-cols { |
|
|
&.two-cols { |
|
|
grid-template-columns: 1fr 1fr; |
|
|
grid-template-columns: 1fr 1fr; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:last-child { |
|
|
&:last-child { |
|
|
margin-bottom: 0; |
|
|
margin-bottom: 0; |
|
|
} |
|
|
} |
|
|
@ -1427,21 +1430,21 @@ export default { |
|
|
transition: all 0.3s ease; |
|
|
transition: all 0.3s ease; |
|
|
border: 1px solid #f0f4f8; |
|
|
border: 1px solid #f0f4f8; |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03); |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
transform: translateY(-4px); |
|
|
transform: translateY(-4px); |
|
|
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.08); |
|
|
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.08); |
|
|
border-color: transparent; |
|
|
border-color: transparent; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.gradient-blue { |
|
|
&.gradient-blue { |
|
|
background: linear-gradient(145deg, #fff, #f9fcff); |
|
|
background: linear-gradient(145deg, #fff, #f9fcff); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.gradient-purple { |
|
|
&.gradient-purple { |
|
|
background: linear-gradient(145deg, #fff, #faf9ff); |
|
|
background: linear-gradient(145deg, #fff, #faf9ff); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.gradient-green { |
|
|
&.gradient-green { |
|
|
background: linear-gradient(145deg, #fff, #f9fffb); |
|
|
background: linear-gradient(145deg, #fff, #f9fffb); |
|
|
} |
|
|
} |
|
|
@ -1462,7 +1465,7 @@ export default { |
|
|
font-weight: 600; |
|
|
font-weight: 600; |
|
|
font-size: 16px; |
|
|
font-size: 16px; |
|
|
color: #2c3e50; |
|
|
color: #2c3e50; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
margin-right: 10px; |
|
|
margin-right: 10px; |
|
|
color: #409EFF; |
|
|
color: #409EFF; |
|
|
@ -1474,7 +1477,7 @@ export default { |
|
|
color: #a0b3c2; |
|
|
color: #a0b3c2; |
|
|
font-size: 16px; |
|
|
font-size: 16px; |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
color: #409EFF; |
|
|
color: #409EFF; |
|
|
} |
|
|
} |
|
|
@ -1501,13 +1504,13 @@ export default { |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
gap: 8px; |
|
|
gap: 8px; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.dot { |
|
|
.dot { |
|
|
width: 10px; |
|
|
width: 10px; |
|
|
height: 10px; |
|
|
height: 10px; |
|
|
border-radius: 50%; |
|
|
border-radius: 50%; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strong { |
|
|
strong { |
|
|
font-size: 16px; |
|
|
font-size: 16px; |
|
|
color: #1e293b; |
|
|
color: #1e293b; |
|
|
@ -1534,7 +1537,7 @@ export default { |
|
|
border-radius: 16px; |
|
|
border-radius: 16px; |
|
|
transition: all 0.2s ease; |
|
|
transition: all 0.2s ease; |
|
|
border: 1px solid #f0f4f8; |
|
|
border: 1px solid #f0f4f8; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&:hover { |
|
|
&:hover { |
|
|
background: #f9fcff; |
|
|
background: #f9fcff; |
|
|
border-color: #409EFF; |
|
|
border-color: #409EFF; |
|
|
@ -1550,7 +1553,7 @@ export default { |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
justify-content: center; |
|
|
margin-right: 14px; |
|
|
margin-right: 14px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
font-size: 22px; |
|
|
font-size: 22px; |
|
|
color: white; |
|
|
color: white; |
|
|
@ -1578,15 +1581,15 @@ export default { |
|
|
font-size: 11px; |
|
|
font-size: 11px; |
|
|
display: flex; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.positive { |
|
|
&.positive { |
|
|
color: #51cf66; |
|
|
color: #51cf66; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.negative { |
|
|
&.negative { |
|
|
color: #ff6b6b; |
|
|
color: #ff6b6b; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
i { |
|
|
i { |
|
|
margin-right: 2px; |
|
|
margin-right: 2px; |
|
|
} |
|
|
} |
|
|
@ -1735,11 +1738,11 @@ export default { |
|
|
.notification-grid { |
|
|
.notification-grid { |
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.chart-grid.two-cols { |
|
|
.chart-grid.two-cols { |
|
|
grid-template-columns: 1fr; |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.kpi-grid { |
|
|
.kpi-grid { |
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
grid-template-columns: repeat(2, 1fr); |
|
|
} |
|
|
} |
|
|
@ -1749,35 +1752,35 @@ export default { |
|
|
.box { |
|
|
.box { |
|
|
padding: 12px; |
|
|
padding: 12px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification-section, |
|
|
.notification-section, |
|
|
.dashboard-section { |
|
|
.dashboard-section { |
|
|
padding: 18px; |
|
|
padding: 18px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification-grid { |
|
|
.notification-grid { |
|
|
grid-template-columns: 1fr; |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.notification-card-main { |
|
|
.notification-card-main { |
|
|
grid-column: span 1; |
|
|
grid-column: span 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.dashboard-header { |
|
|
.dashboard-header { |
|
|
flex-direction: column; |
|
|
flex-direction: column; |
|
|
align-items: flex-start; |
|
|
align-items: flex-start; |
|
|
gap: 12px; |
|
|
gap: 12px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.header-right { |
|
|
.header-right { |
|
|
width: 100%; |
|
|
width: 100%; |
|
|
justify-content: space-between; |
|
|
justify-content: space-between; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.kpi-grid { |
|
|
.kpi-grid { |
|
|
grid-template-columns: 1fr; |
|
|
grid-template-columns: 1fr; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.chart-card-footer { |
|
|
.chart-card-footer { |
|
|
flex-wrap: wrap; |
|
|
flex-wrap: wrap; |
|
|
gap: 12px; |
|
|
gap: 12px; |
|
|
@ -1802,4 +1805,4 @@ export default { |
|
|
.certificate-upload-container::-webkit-scrollbar-thumb:hover { |
|
|
.certificate-upload-container::-webkit-scrollbar-thumb:hover { |
|
|
background: #a8a8a8; |
|
|
background: #a8a8a8; |
|
|
} |
|
|
} |
|
|
</style> |
|
|
|
|
|
|
|
|
</style> |